<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>oldcodes</title>
    <link>https://oldcodes.tistory.com/</link>
    <description>각종 프로그래밍 정보를 다루는 블로그입니다.</description>
    <language>ko</language>
    <pubDate>Tue, 7 Apr 2026 15:24:54 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>oldcodes</managingEditor>
    <item>
      <title>오라클에서 DBMS_STATS를 사용하는 이유는 무엇입니까?GOLDER_TABLE_STATS?</title>
      <link>https://oldcodes.tistory.com/720</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;오라클에서 DBMS_STATS를 사용하는 이유는 무엇입니까?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;GOLDER_TABLE_STATS?&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 mr8&quot;&gt; 
     &lt;svg aria-hidden=&quot;true&quot; class=&quot;svg-icon iconLightbulb&quot; width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 18 18&quot;&gt;
      &lt;path d=&quot;M15 6.38A6.48 6.48 0 0 0 7.78.04h-.02A6.49 6.49 0 0 0 2.05 5.6a6.31 6.31 0 0 0 2.39 5.75c.49.39.76.93.76 1.5v.24c0 1.07.89 1.9 1.92 1.9h2.75c1.04 0 1.92-.83 1.92-1.9v-.2c0-.6.26-1.15.7-1.48A6.32 6.32 0 0 0 15 6.37ZM4.03 5.85A4.49 4.49 0 0 1 8 2.02a4.48 4.48 0 0 1 5 4.36 4.3 4.3 0 0 1-1.72 3.44c-.98.74-1.5 1.9-1.5 3.08v.1H7.2v-.14c0-1.23-.6-2.34-1.53-3.07a4.32 4.32 0 0 1-1.64-3.94ZM10 18a1 1 0 0 0 0-2H7a1 1 0 1 0 0 2h3Z&quot;&gt;&lt;/path&gt;
     &lt;/svg&gt; 
    &lt;/div&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;/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;&lt;a href=&quot;/help/reopen-questions&quot;&gt;헬프 센터&lt;/a&gt;를 방문합니다.&lt;/font&gt;&lt;/div&gt; 
     &lt;/div&gt; 
    &lt;/div&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-03-23 22:46:44Z&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;Oracle이 성능 튜닝 등에 사용한다는 것을 설명하는 문서를 찾았지만 실제로 어떤 기능을 하는지는 잘 이해하지 못했습니다.&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;Oracle을 포함한 대부분의 엔터프라이즈 데이터베이스는 비용 기반의 최적화 도구를 사용하여 특정 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;예를 들어, 간단한 버그 추적 응용 프로그램에 대한 표를 상상해 보십시오.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;CREATE TABLE issues (
  issue_id number primary key,
  issue_text clob,
  issue_status varchar2(10)
);

CREATE INDEX idx_issue_status
    ON issues( issue_status );
&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;제가 대기업이라면 이 테이블에 100만 줄이 있을 겁니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그 중에서 100개는&lt;/font&gt;&lt;/font&gt;&lt;code&gt;issue_status&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;ACTIVE의 10,000명은&lt;/font&gt;&lt;/font&gt;&lt;code&gt;issue_status&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;대기 중이며, 989,900의 상태는 COMPLETE입니다.&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;SELECT *
  FROM issues
 WHERE issue_status = 'ACTIVE'
&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;issue_status&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;issues&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;Oracle이 쿼리가 테이블에 있는 데이터의 일부를 반환할 것으로 예상한다면 인덱스를 사용하는 것이 더 효율적일 것입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Oracle이 쿼리가 테이블에 있는 데이터의 상당 부분을 반환할 것으로 예상하는 경우 테이블 검색이 더 효율적일 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;DBMS_STATS.GATHER_TABLE_STATS&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;는 Oracle이 이러한 결정을 내릴 수 있는 통계를 수집합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것은 Oracle에게 테이블에 약 백만 개의 행이 있고, 3개의 다른 값이 있다고 말합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;issue_status&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;따라서 Oracle은 쿼리에 인덱스를 사용하여 모든 활성 문제를 찾을 수 있습니다.&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;SELECT *
  FROM issues
 WHERE issue_status = 'CLOSED'
&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;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;URL : https://stackoverflow.com/questions/15575422/why-does-oracle-use-dbms-stats-gather-table-stats&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>oracle</category>
      <author>oldcodes</author>
      <guid isPermaLink="true">https://oldcodes.tistory.com/720</guid>
      <comments>https://oldcodes.tistory.com/720#entry720comment</comments>
      <pubDate>Sun, 5 Nov 2023 14:59:09 +0900</pubDate>
    </item>
    <item>
      <title>mysql.h 파일을 찾을 수 없습니다.</title>
      <link>https://oldcodes.tistory.com/719</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;mysql.h 파일을 찾을 수 없습니다.&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;우분투 12.04에 c++와 mysql 사이의 연결을 설치하려고 합니다. mysql-client, mysql-server, libmysqlclient15-dev, libmysql+-dev를 설치했는데 코드를 컴파일하려고 하면 오류가 발생했습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;mysql.h there is no such file&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;. 폴더를 찾아보니 mysql.h 파일이 있는데 왜 찾을 수 없는지 이해할 수 없습니다.&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; /* Simple C program that connects to MySQL Database server*/
    #include &amp;lt;mysql.h&amp;gt;
    #include &amp;lt;stdio.h&amp;gt;

    main() {
      MYSQL *conn;
      MYSQL_RES *res;
      MYSQL_ROW row;

      char *server = &quot;localhost&quot;;
      char *user = &quot;root&quot;;
      //set the password for mysql server here
      char *password = &quot;*********&quot;; /* set me first */
      char *database = &quot;Real_flights&quot;;

      conn = mysql_init(NULL);

      /* Connect to database */
      if (!mysql_real_connect(conn, server,
            user, password, database, 0, NULL, 0)) {
          fprintf(stderr, &quot;%s\n&quot;, mysql_error(conn));
          exit(1);
      }

      /* send SQL query */
      if (mysql_query(conn, &quot;show tables&quot;)) {
          fprintf(stderr, &quot;%s\n&quot;, mysql_error(conn));
          exit(1);
      }

      res = mysql_use_result(conn);

      /* output table name */
      printf(&quot;MySQL Tables in mysql database:\n&quot;);
      while ((row = mysql_fetch_row(res)) != NULL)
          printf(&quot;%s \n&quot;, row[0]);

      /* close connection */
      mysql_free_result(res);
      mysql_close(conn);
    }
&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;mysql.c: In function ‘main’:
mysql.c:21: warning: incompatible implicit declaration of built-in function ‘exit’
mysql.c:27: warning: incompatible implicit declaration of built-in function ‘exit’
/tmp/ccinQBp8.o: In function `main':
mysql.c:(.text+0x3e): undefined reference to `mysql_init'
mysql.c:(.text+0x5e): undefined reference to `mysql_real_connect'
mysql.c:(.text+0x70): undefined reference to `mysql_error'
mysql.c:(.text+0xa5): undefined reference to `mysql_query'
mysql.c:(.text+0xb7): undefined reference to `mysql_error'
mysql.c:(.text+0xe7): undefined reference to `mysql_use_result'
mysql.c:(.text+0x11c): undefined reference to `mysql_fetch_row'
mysql.c:(.text+0x133): undefined reference to `mysql_free_result'
mysql.c:(.text+0x141): undefined reference to `mysql_close'
collect2: ld returned 1 exit status
&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;mysql.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;libmysqlclient-dev&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Ubuntu 패키지 위치:&lt;/font&gt;&lt;/font&gt;&lt;code&gt;/usr/include/mysql/mysql.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;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것은 컴파일러의 표준 검색 경로가 아닙니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;/usr/include&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.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;pre&gt;&lt;code&gt;#include &amp;lt;mysql/mysql.h&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;-I&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;추가 포함 검색 디렉토리를 지정하기 위해 gcc(사용 중인 경우)로 플래그를 지정하면 기존 코드를 변경할 필요가 없습니다.&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;gcc -I/usr/include/mysql ...
&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;$ apt-get install libmysqlclient-dev 
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;최신 libmysqlclient18-dev를 자동으로 꺼냅니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이전 버전의 libmysqlclient-dev(15개 정도)는 mysql.h를 /usr/local/include 등과 같은 이상한 위치에 두는 것을 보았습니다.&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;$ find /usr/ -name 'mysql.h' 
&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;mysql.h&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;당신의 make file에 -I flag를 넣었습니다.&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;CentOS/RHEL의 경우:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;yum install mysql-devel -y
&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;$ gcc dbconnect.c -o dbconnect -lmysqlclient
$ ./dbconnect
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;- lmysqlclient는 필수입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고 저는 -I 컴파일 플래그를 사용하는 대신 다음과 같은 표기법을 사용하는 것을 추천합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#include &amp;lt;mysql/mysql.h&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아마 여러 유닉스 시스템에서 /usr/include/mysql에서 찾을 수 있는 mysql 헤더에 대한 경로를 포함하지 않았을 것입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/20909685/fatal-error-mysql-hno-such-file-or-directory-during-compilation&quot;&gt;이 게시물&lt;/a&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/users/1687452/mtpain&quot;&gt;사람&lt;/a&gt;의 질문과 관련해서, 통사적 구성에 관한 것입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;~/.vimrc에 다음을 추가할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;let b:syntastic_c_cflags = '-I/usr/include/mysql'
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;github에서 개발자들의 &lt;a href=&quot;https://github.com/scrooloose/syntastic/wiki&quot; rel=&quot;nofollow noreferrer&quot;&gt;wiki 페이지&lt;/a&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;mysql.h 파일이 어디에 있는지 컴파일러에게 알려주어야 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;컴파일하기 전에 헤더에 대한 경로를 제공하여 이 작업을(를) 수행할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;IDE에는 이러한 경로를 제공할 수 있는 설정이 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 &lt;a href=&quot;http://gcc.gnu.org/onlinedocs/gcc-3.2/gcc/Directory-Options.html#Directory%20Options&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;&gt;&lt;strong&gt;두번째 문제 라이브러리&lt;/strong&gt;를 연결해야 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;링커는 당신이 사용하는 mysql 함수에 대한 구현이 있는 라이브러리 파일이 어디에 있는지 알아야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 &lt;a href=&quot;http://gcc.gnu.org/onlinedocs/gcc-3.2/gcc/Link-Options.html#Link%20Options&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;&gt;이 gcc -I/usr/include/mysql &lt;strong&gt;*.&lt;em&gt;c -L/usr/lib/mysql&lt;/em&gt;&lt;/strong&gt; -lmysql &lt;strong&gt;&lt;em&gt;클라이언트 -o&lt;/em&gt;&lt;/strong&gt; *를 사용해 보십시오&lt;strong&gt;&lt;em&gt;.&lt;/em&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;Eclipse IDE&lt;/strong&gt;를 사용하시는 분들께&lt;strong&gt;.&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;mysql client&lt;/strong&gt;와 &lt;strong&gt;mysql server&lt;/strong&gt; 그리고 어떤 &lt;strong&gt;mysql dev&lt;/strong&gt; libraries와 함께 전체 MySql을 설치한 후,&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;Eclipse IDE&lt;/strong&gt;에 다음 사항을 알려야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;mysql.h&lt;/strong&gt;를 찾을 위치&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;libmysql &lt;strong&gt;클라이언트&lt;/strong&gt; 라이브러리를 찾을 위치&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;libmysql &lt;strong&gt;클라이언트&lt;/strong&gt; 라이브러리를 &lt;strong&gt;검색&lt;/strong&gt;하는 &lt;strong&gt;경로&lt;/strong&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;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;mysql.h&lt;/strong&gt;를 추가하는 방법&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;1&lt;/strong&gt;.GCC C 컴파일러 -&amp;gt; 포함 -&amp;gt; 경로(-l) 포함 후 +를 클릭하여 &lt;strong&gt;mysql&lt;/strong&gt;에 경로를 추가합니다&lt;strong&gt;.&lt;/strong&gt;&lt;strong&gt;h&lt;/strong&gt; 제 경우 /&lt;strong&gt;usr/include/mysql&lt;/strong&gt; 이었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://i.stack.imgur.com/HI28D.png&quot; rel=&quot;nofollow noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/HI28D.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;strong&gt;mysqlclient&lt;/strong&gt; 라이브러리 및 &lt;strong&gt;검색 경로&lt;/strong&gt;를 where &lt;strong&gt;mysqlclient&lt;/strong&gt; 라이브러리에 추가하려면 &lt;strong&gt;3단계&lt;/strong&gt; 및 &lt;strong&gt;4단계&lt;/strong&gt;를 참조하십시오.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;2&lt;/strong&gt;.GCC C Linker -&amp;gt; Libraries -&amp;gt; Libraries(-l)를 클릭한 다음 &lt;strong&gt;+&lt;/strong&gt;를 클릭하고 &lt;strong&gt;mysqlcient&lt;/strong&gt;를 추가합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://i.stack.imgur.com/633TI.png&quot; rel=&quot;nofollow noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/633TI.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;strong&gt;3&lt;/strong&gt;.GCC C Linker -&amp;gt; Librarys -&amp;gt; Library search path (-L)를 클릭한 다음 &lt;strong&gt;검색&lt;/strong&gt;&lt;strong&gt; &lt;/strong&gt;&lt;strong&gt;경로&lt;/strong&gt;를 &lt;strong&gt;mysqlcient&lt;/strong&gt;에 추가합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;제&lt;/strong&gt; 경우에는 &lt;strong&gt;64비트&lt;/strong&gt; Linux OS와 64비트 &lt;strong&gt;MySQL Database&lt;/strong&gt;를 사용하기 때문에 &lt;strong&gt;/usr/lib64/mysql&lt;/strong&gt;이었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그렇지 않으면 &lt;strong&gt;32비트 Linux OS&lt;/strong&gt;를 사용하는 경우 &lt;strong&gt;/usr/lib/mysql&lt;/strong&gt;에서 찾을 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://i.stack.imgur.com/brxrq.png&quot; rel=&quot;nofollow noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/brxrq.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;yum install mysql
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;mysql client를 설치한 후&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;pip install mysqlclient
&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/14604228/mysql-h-file-cant-be-found&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>mysql</category>
      <author>oldcodes</author>
      <guid isPermaLink="true">https://oldcodes.tistory.com/719</guid>
      <comments>https://oldcodes.tistory.com/719#entry719comment</comments>
      <pubDate>Sun, 5 Nov 2023 14:59:03 +0900</pubDate>
    </item>
    <item>
      <title>jQuery를 사용하여 AJAX 응답에서 ID별 요소 찾기</title>
      <link>https://oldcodes.tistory.com/718</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;jQuery를 사용하여 AJAX 응답에서 ID별 요소 찾기&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;php 페이지에 데이터를 올리고 나서 응답에 있는 특정 div의 텍스트를 받고 싶은데 올바르게 설정할 수 없는 것 같습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제가 jQuery를 잘하진 못하지만 보통은 금방 알아낼 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여기서 1분동안 내가 찾은 모든걸 시도해봤어요&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 단지 적절한 조합의 물건을 놓치고 있다고 생각합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$.post(&quot;process.php&quot;, data , function (response) {  

       var w = window.open();    

       $(w.document.body).html(response); 

       console.log(typeof response); //  yeilds string 
       //create jquery object from the response html
       // var $data = $(response);   // yeilds Uncaught Error: Syntax error, unrecognized expression: + whole html text


       var success =  $($.parseHTML(response)).find(&quot;#success&quot;); 
       console.log('success'); 
       console.log(success);        // see screenshot
       console.log(success.text()); // yields nothing 
       console.log(success.val());  // yields undefined 
       // if (window.focus) {w.focus()}; 

 },'html');  
&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;console.log(success);&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;font papago-translate=&quot;translated&quot;&gt;제가 만들 때는 그렇게 작지 않았어요.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여전히 읽을 수 있으면 좋겠습니다[1].&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;var success =  $(response).find(&quot;#success&quot;); 
console.log('success'); 
console.log(success);        // yeilds Uncaught Error: Syntax error, unrecognized expression: + whole html text in red
&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;html&amp;gt;&amp;lt;head&amp;gt;
   &amp;lt;style&amp;gt;

      div.totals {
          font-family:calibri; font-size:.9em;  display:inline-block; 
          border-width: 2px;  border-style: solid; border-color: #FFD324; 
          background-color: #FAF5D7; color: #514721; 
          width: 500px; 
          }

      div.error_invalid {
         font-family:calibri; font-size:.9em;  display:inline-block; 
         border-width: 2px; border-style: solid; border-color: #9999CC; 
         background-color: #EEEEFF; color: #7979B8; 
     }

    &amp;lt;/style&amp;gt;
    &amp;lt;/head&amp;gt;
    &amp;lt;body&amp;gt;
    &amp;lt;div class=&quot;totals&quot;&amp;gt;Total new rows added: 0 out of 0&amp;lt;br/&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;
    &amp;lt;div class=&quot;totals&quot;&amp;gt;Total updated rows: 0 out of 0 &amp;lt;br/&amp;gt;&amp;lt;/div&amp;gt;

    &amp;lt;div id=&quot;success&quot;&amp;gt;true&amp;lt;/div&amp;gt;
    &amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt; 
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고 나는 스타일 부분을 제거하려고 시도했고 그것이 도움이 되기를 바라며 html, 헤드, 바디 태그에 추가했습니다. 즉, 응답이 3개의 디브로만 구성된다면 동일한 문제가 발생합니다.&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;/em&gt;에 있는 것을 주목하십시오.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사용하셔야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;.filter()&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;.find()&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 success =  $($.parseHTML(response)).filter(&quot;#success&quot;); 
console.log(success); // div#success
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;ajax에서 전체 'html' 페이지를 반환받았지만, div로 래핑된 내용의 일부만 필요하고, 'html' 페이지 내에서 스크립트를 실행해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt; $.ajax ({
  type: &quot;POST&quot;,
  url : &quot;contact.php&quot;,
  data: $(&quot;#formContactUs&quot;).serialize(),
  success: function(msg){
    console.log($(msg)); // this would returned as an array
    console.log(msg);    // return whole html page as string '&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;...&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;'
    $('#id').html($(content).closest('.target-class'));
    $('#id').append($(content).closest('script')[0]);  // append and execute first script found, when there is more than one script.
  }
});
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;@kevin 응답에서는 find ()가 하위 요소만 선택하고 첫 번째 요소는 선택하지 않기 때문에 예상대로 작동하지 않는 이유에 대해 힌트를 주었습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;필터를 사용하는 것 외에도 현재 요소가 원하는 경우 $.close()도 작동합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;음, 아마도 이 게시물은 @Kevin의 답변과 상당히 유사할 것입니다. 그것은 단지 다른 대안적인 답변을 제안하고 더 많은 세부사항을 제공하여 상황을 더 명확하게 만들기를 바랍니다.&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;var successHtml = $($.parseHTML(response)).find(&quot;#success&quot;).html();
&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/16240436/finding-an-element-by-id-in-an-ajax-response-with-jquery&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>Ajax</category>
      <author>oldcodes</author>
      <guid isPermaLink="true">https://oldcodes.tistory.com/718</guid>
      <comments>https://oldcodes.tistory.com/718#entry718comment</comments>
      <pubDate>Sun, 5 Nov 2023 14:58:53 +0900</pubDate>
    </item>
    <item>
      <title>AJAX를 사용하여 SQL 데이터베이스의 변경 사항 확인</title>
      <link>https://oldcodes.tistory.com/717</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;AJAX를 사용하여 SQL 데이터베이스의 변경 사항 확인&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;/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;/help/closed-questions&quot;&gt;집중력&lt;/a&gt;이 있는&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;현재 답변을 받지 않고 있습니다.&lt;/font&gt;&lt;/div&gt; 
     &lt;/div&gt; 
    &lt;/div&gt; 
   &lt;/div&gt; 
  &lt;/div&gt; 
  &lt;hr class=&quot;my12 outline-none baw0 bb bc-powder-400&quot;&gt; 
  &lt;div class=&quot;fw-nowrap fc-black-600&quot;&gt; 
   &lt;div class=&quot;d-flex fd-column lh-md&quot;&gt; 
    &lt;div class=&quot;mb0 d-flex&quot;&gt; 
     &lt;div class=&quot;flex--item mr8&quot;&gt; 
      &lt;svg aria-hidden=&quot;true&quot; class=&quot;svg-icon iconLightbulb&quot; width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 18 18&quot;&gt;
       &lt;path d=&quot;M15 6.38A6.48 6.48 0 0 0 7.78.04h-.02A6.49 6.49 0 0 0 2.05 5.6a6.31 6.31 0 0 0 2.39 5.75c.49.39.76.93.76 1.5v.24c0 1.07.89 1.9 1.92 1.9h2.75c1.04 0 1.92-.83 1.92-1.9v-.2c0-.6.26-1.15.7-1.48A6.32 6.32 0 0 0 15 6.37ZM4.03 5.85A4.49 4.49 0 0 1 8 2.02a4.48 4.48 0 0 1 5 4.36 4.3 4.3 0 0 1-1.72 3.44c-.98.74-1.5 1.9-1.5 3.08v.1H7.2v-.14c0-1.23-.6-2.34-1.53-3.07a4.32 4.32 0 0 1-1.64-3.94ZM10 18a1 1 0 0 0 0-2H7a1 1 0 1 0 0 2h3Z&quot;&gt;&lt;/path&gt;
      &lt;/svg&gt; 
     &lt;/div&gt; 
     &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;b&gt;이 질문을 개선하고 싶으십니까?&lt;/b&gt;&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;/posts/2813353/edit&quot;&gt;이 게시물을 편집&lt;/a&gt;하여 한 가지 문제에만 초점을 맞추도록 질문을 업데이트합니다.&lt;/font&gt;&lt;/p&gt; 
    &lt;/div&gt; 
    &lt;div class=&quot;mb0 mt6 d-flex&quot;&gt; 
     &lt;p class=&quot;ml24 pl2&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;span class=&quot;relativetime&quot; title=&quot;2016-07-07 14:11:27Z&quot; papago-attr-id=&quot;1&quot;&gt;7년전&lt;/span&gt;에 문을 닫았습니다.&lt;/font&gt;&lt;/p&gt; 
    &lt;/div&gt; 
    &lt;div class=&quot;ml24 pl2&quot;&gt; 
    &lt;/div&gt; 
   &lt;/div&gt; 
  &lt;/div&gt; 
  &lt;div class=&quot;mt24 d-flex gsx gs8&quot;&gt; 
   &lt;a class=&quot;s-btn s-btn__outlined flex--item js-post-notice-edit-post&quot; href=&quot;/posts/2813353/edit&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 질문을 개선합니다.&lt;/font&gt;&lt;/a&gt; 
  &lt;/div&gt; 
 &lt;/aside&gt; 
&lt;/div&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;어떻게 하면 AJAX + jQuery를 사용하여 DB 변경에 대해서만 작업을 수행할 수 있습니까?&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;당신이 설명하고 있는 것은 구어적으로 &lt;a href=&quot;http://www.webreference.com/programming/javascript/rg28/&quot; rel=&quot;noreferrer&quot;&gt;혜성&lt;/a&gt; 프로그래밍이라고 불립니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Comet은 영구 HTTP 연결로 웹 페이지에 콘텐츠를 푸시하는 기술 그룹을 설명합니다.&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;/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;/p&gt; 
&lt;p&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;서버가 데이터를 &quot;푸시&quot;할 때까지 AJAX 연결을 계속 열어둘 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;참조: http://en.wikipedia.org/wiki/Reverse_Ajax&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고 분명히 그것은 정말로 여론조사입니다: http://en.wikipedia.org/wiki/Push_technology#Long_polling .&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;서버에 아직 전송할 데이터가 없는 경우, 서버가 전송할 때까지 연결을 열어 둡니다.&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;&lt;strong&gt;편집 2:&lt;/strong&gt; 그럼 다시 질문에 대한 답을 드리겠습니다.&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;font papago-translate=&quot;translated&quot;&gt;데이터베이스에서 업데이트를 확인하는 것이 가장 까다로울 수 있으며 요구 사항에 따라 다릅니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;SQL 쿼리를 실행하여 변경된 사항이 있는지 확인할 수 있지만 어떻게 알 수 있습니까?&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;Autocracy가 말한 것은 업데이트를 알리는 좋은 방법이 될 것입니다.&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;polling 및 업데이트된 dababase field 값 확인을 위해 javascript의 setinterval 함수를 사용합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;자세한 내용은 다음 링크를 확인하십시오. http://www.elated.com/articles/javascript-timers-with-settimeout-and-setinterval/&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;나는 채팅으로 거의 같은 일을 하고 있고, 매 xx초마다 php 스크립트를 다시 로드합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음과 같습니다. jquery.nconflict를 사용하지 않는 경우 j를 $로 대체합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;j(&quot;.chatref&quot;).everyTime(3000,function(i){
    j.ajax({
       url: &quot;chatx.php&quot;,
       cache: false,
       success: function(updated){
           j(&quot;.chatref&quot;).html(updated);
           ...do stuff..
       }
   });
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것은 매우 좋은 방법이라고 생각합니다 :) 만약 당신이 chatx에 vars를 보내고 싶다면 php는 그냥 ?php &amp;amp;x=1&amp;amp;y=2?&amp;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;/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;setIntreval()을 사용하여 데이터베이스를 쿼리하는 PHP 스크립트에 AJAX 호출을 반복적으로 수행하는 HTML 페이지를 만드는 것을 제안합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;JSON과 PEAR을 사용하면 작업을 좀 더 쉽게 할 수 있습니다.&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;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;http://www.w3schools.com/jsref/met_win_setinterval.asp&quot; rel=&quot;nofollow noreferrer&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;http://www.w3schools.com/jsref/met_win_setinterval.asp&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;http://api.jquery.com/category/ajax/&quot; rel=&quot;nofollow noreferrer&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;http://api.jquery.com/category/ajax/&lt;/font&gt;&lt;/a&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;http://api.jquery.com/jQuery.getJSON/&quot; rel=&quot;nofollow noreferrer&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;http://api.jquery.com/jQuery.getJSON/&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;http://php.net/manual/en/function.json-encode.php&quot; rel=&quot;nofollow noreferrer&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;http://php.net/manual/en/function.json-encode.php&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;http://pear.php.net/manual/en/package.database.db-dataobject.php&quot; rel=&quot;nofollow noreferrer&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;http://pear.php.net/manual/en/package.database.db-dataobject.php&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;기본적으로 DB에 대한 변경사항에 대해 서버를 지속적으로 폴링해야 합니다.&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;URL : https://stackoverflow.com/questions/2813353/use-ajax-to-watch-sql-database-for-changes&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>Ajax</category>
      <author>oldcodes</author>
      <guid isPermaLink="true">https://oldcodes.tistory.com/717</guid>
      <comments>https://oldcodes.tistory.com/717#entry717comment</comments>
      <pubDate>Sun, 5 Nov 2023 14:58:46 +0900</pubDate>
    </item>
    <item>
      <title>WordPress - 메타 값이 존재하는 경우 메타 값에 따라 순서를 지정하고, 존재하지 않는 경우 날짜를 지정합니다.</title>
      <link>https://oldcodes.tistory.com/716</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;WordPress - 메타 값이 존재하는 경우 메타 값에 따라 순서를 지정하고, 존재하지 않는 경우 날짜를 지정합니다.&lt;/font&gt;&lt;/h2&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;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사용하고 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;pre_get_posts&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;strong&gt;사용자&lt;/strong&gt; 지정 &lt;strong&gt;필드가 설정된 게시물만 검색에 표시&lt;/strong&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;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
add_filter('pre_get_posts', 'h5b_search_pre_get_posts');

function h5b_search_pre_get_posts ($qry) {
    $validOrders    = array('price', 'date', 'popularity');
    $orderBy        = (isset($_GET['myorder']) and in_array($_GET['myorder'], $validOrders)) ? $_GET['myorder'] : 'price';

    if ($qry-&amp;gt;is_main_query() and $qry-&amp;gt;query_vars['s'] != '') {
        # This only includes the posts that have &quot;item_price&quot; set
        if ($orderBy == 'price') {
            $qry-&amp;gt;set('orderby', 'meta_value_num date');
            $qry-&amp;gt;set('order', 'ASC DESC');
            $qry-&amp;gt;set('meta_key', 'item_price');
        }
        # This works fine and includes all posts (obviously)
        elseif ($orderBy == 'date') {
            $qry-&amp;gt;set('orderby', 'date');
            $qry-&amp;gt;set('order', 'DESC');
        }
    }
}
&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;편집: 실제 MySQL 쿼리 모습은 다음과 같습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;어떻게 하면 이것을 변경할 수 있을까요?&lt;/font&gt;&lt;/font&gt;&lt;code&gt;wp_postmeta.meta_value&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 
    SQL_CALC_FOUND_ROWS wp_posts.ID 
FROM 
    wp_posts 
INNER JOIN 
    wp_postmeta 
ON 
    (wp_posts.ID = wp_postmeta.post_id) 
WHERE 
    1=1 AND 
    ((
        (wp_posts.post_title LIKE '%lorem%') OR 
        (wp_posts.post_content LIKE '%lorem%')
    )) AND 
    wp_posts.post_type IN ('post', 'page', 'attachment', 'items', 'locations') AND 
    (wp_posts.post_status = 'publish' OR wp_posts.post_author = 1 AND wp_posts.post_status = 'private') AND 
    (wp_postmeta.meta_key = 'item_price' ) 
GROUP BY 
    wp_posts.ID 
ORDER BY 
    wp_postmeta.meta_value+0,wp_posts.post_date DESC LIMIT 0, 6
&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;WP_Query&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;methods 하지만 필요하다면 나만의 SQL을 실행하는 것을 고려해 볼 수 있습니다.&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;IF NOT 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;code&gt;WP_Query&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;font papago-translate=&quot;translated&quot;&gt;같은 질문이 있습니다. (제 생각에는 :P): https://wordpress.stackexchange.com/questions/28409/way-to-include-posts-both-with-without-certain-meta-key-in-args-for-wp-query&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;IF&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;CASE&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;ORDER BY 
CASE wp_postmeta.meta_value WHEN IS NOT NULL THEN wp_postmeta.meta_value END ASC,
CASE wp_postmeta.meta_value WHEN IS NULL THEN wp_posts.post_date END DESC
&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;더 읽기: If &lt;a href=&quot;https://stackoverflow.com/questions/3550942/can-you-add-if-statement-in-php-mysql-order-by&quot;&gt;문을 ORDER BY에 추가&lt;/a&gt;할 수 &lt;a href=&quot;https://stackoverflow.com/questions/3550942/can-you-add-if-statement-in-php-mysql-order-by&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;/font&gt;&lt;/font&gt;&lt;code&gt;meta_value&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;INNER JOIN&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;wp_postmeta.post_id is 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;code&gt;LEFT OUTER JOIN&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 
    SQL_CALC_FOUND_ROWS wp_posts.ID 
FROM 
    wp_posts 


LEFT OUTER JOIN

    wp_postmeta 
ON 
    (wp_posts.ID = wp_postmeta.post_id) 
WHERE 
    1=1 AND 
    ((
        (wp_posts.post_title LIKE '%lorem%') OR 
        (wp_posts.post_content LIKE '%lorem%')
    )) AND 
    wp_posts.post_type IN ('post', 'page', 'attachment', 'items', 'locations') AND 
    (wp_posts.post_status = 'publish' OR wp_posts.post_author = 1 AND wp_posts.post_status = 'private') AND 
    (wp_postmeta.meta_key = 'item_price'  OR wp_postmeta.meta_key is NULL ) 
GROUP BY 
    wp_posts.ID 
ORDER BY 
    wp_postmeta.meta_value+0,wp_posts.post_date DESC LIMIT 0, 6
&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;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;조인 유형을 변경하려면 다음과 같이 하십시오.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;WP_Query&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;$join&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;posts_join&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;http://codex.wordpress.org/Plugin_API/Filter_Reference/posts_join&quot; rel=&quot;nofollow&quot;&gt;Plugin API/Filter Reference/posts join&lt;/a&gt;에 설명된 대로 filter&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;http://codex.wordpress.org/Class_Reference/WP_Query&quot; rel=&quot;nofollow&quot;&gt;WP_Query Class 참조&lt;/a&gt;도 참조하십시오.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;알아요, 이 스레드는 이미 6개월 정도 되었는데도 충분한 답이 없었던 것 같아요.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 그 문제의 원작자와 정확히 같은 문제에 부딪치고 있었습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것이 제가 작업하고 원하는 결과를 반환하기 위해 찾은 마지막 SQL 쿼리입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;SELECT SQL_CALC_FOUND_ROWS * 
FROM wp_posts 
INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id) 
LEFT JOIN wp_postmeta AS mt1 ON (wp_posts.ID = mt1.post_id AND mt1.meta_key = 'showPostInBanner' AND mt1.meta_value='1') 
LEFT JOIN wp_postmeta AS mt2 ON (wp_posts.ID = mt2.post_id) 
WHERE 1=1 AND ( wp_term_relationships.term_taxonomy_id IN (34,47,51,50,68,78,82,90,97,155,227,253,285,294,314,373,425,436,452,456,521,627,667,680,694,710,730,741,751) ) 
AND wp_posts.post_type = 'post' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private')
GROUP BY wp_posts.ID 
ORDER BY mt1.meta_value+0 DESC, wp_posts.post_date DESC LIMIT 0, 4
&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 SQL_CALC_FOUND_ROWS * 
FROM wp_posts 
LEFT JOIN wp_postmeta AS mt1 ON (wp_posts.ID = mt1.post_id AND mt1.meta_key = 'showPostInBanner' AND mt1.meta_value='1') 
LEFT JOIN wp_postmeta AS mt2 ON (wp_posts.ID = mt2.post_id) 
WHERE 1=1 AND ((
        (wp_posts.post_title LIKE '%lorem%') OR 
        (wp_posts.post_content LIKE '%lorem%')
    )) AND 
AND wp_posts.post_type IN ('post', 'page', 'attachment', 'items', 'locations') AND 
    (wp_posts.post_status = 'publish' OR wp_posts.post_author = 1 AND wp_posts.post_status = 'private')
GROUP BY wp_posts.ID 
ORDER BY mt1.meta_value+0 DESC, wp_posts.post_date DESC LIMIT 0, 6
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;편집2의 경우:&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;네, meta_query를 사용하여 가능합니다. 시도해보세요.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;'meta_query' =&amp;gt; array(
    array(
                        'key' =&amp;gt; 'meta_key',
                        'value' =&amp;gt; 'some value', //try to put null here 
                        'compare' =&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;두 개의 meta_key를 사용합니다. 하나는 모든 게시물이 가지고 있는 (예: &quot;_thumbnail_id&quot;) meta_key를 사용합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그래서 당신의 args:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$qry-&amp;gt;set( 
'meta_query',
 array(
 'relation' =&amp;gt; 'OR',
 array( 'key' =&amp;gt; 'item_price', 'value' =&amp;gt; '', 'compare' =&amp;gt; 'EXISTS' ),
 array( 'key' =&amp;gt; '_thumbnail_id', 'value' =&amp;gt; '', 'compare' =&amp;gt; 'EXISTS' )
 ));

$qry-&amp;gt;set('orderby', 'meta_value date'); 
$qry-&amp;gt;set('order', 'ASC DESC'); 
$qry-&amp;gt;set('meta_key', 'item_price');
&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/17016770/wordpress-order-by-meta-value-if-it-exists-else-date&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>Wordpress</category>
      <author>oldcodes</author>
      <guid isPermaLink="true">https://oldcodes.tistory.com/716</guid>
      <comments>https://oldcodes.tistory.com/716#entry716comment</comments>
      <pubDate>Sun, 5 Nov 2023 14:58:39 +0900</pubDate>
    </item>
    <item>
      <title>jQuery.ready에 정의된 함수를 전 세계에서 사용할 수 있도록 하려면 어떻게 해야 합니까?</title>
      <link>https://oldcodes.tistory.com/715</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;jQuery.ready에 정의된 함수를 전 세계에서 사용할 수 있도록 하려면 어떻게 해야 합니까?&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;유튜브 아이디를 url에서 떼어내는 기능이 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러면 이 기능을 (워드 프레스 루프에서) 페이지당 10회 사용하고 싶습니다.&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;/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;script type=&quot;text/javascript&quot;&amp;gt; 
$(document).ready(function() {
var getList = function(url, gkey){
        var returned = null;
        if (url.indexOf(&quot;?&quot;) != -1){
          var list = url.split(&quot;?&quot;)[1].split(&quot;&amp;amp;&quot;),
                  gets = [];

          for (var ind in list){
            var kv = list[ind].split(&quot;=&quot;);
            if (kv.length&amp;gt;0)
                gets[kv[0]] = kv[1];
        }

        returned = gets;

        if (typeof gkey != &quot;undefined&quot;)
            if (typeof gets[gkey] != &quot;undefined&quot;)
                returned = gets[gkey];

        }

            return returned;

    };


        // THIS WORKS

    alert(getList('http://www.youtube.com/watch?v=dm4J5dAUnR4', &quot;v&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; &amp;lt;script type=&quot;text/javascript&quot;&amp;gt; 

      $(document).ready(function() {
              alert(getList('http://www.youtube.com/watch?v=dm4J5dAUnR4', &quot;v&quot;));
      };
      &amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;파이어버그는 &lt;strong&gt;getList가 정의되어 있지&lt;/strong&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;window&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.getList = function(url, gkey){ 
    // etc...
}
&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;$(document).ready(function() {  
    alert(getList('http://www.youtube.com/watch?v=dm4J5dAUnR4', &quot;v&quot;));
});  
var getList = function(url, gkey){  

    var returned = null;  
    if (url.indexOf(&quot;?&quot;) != -1){  
      var list = url.split(&quot;?&quot;)[1].split(&quot;&amp;amp;&quot;),  
              gets = [];  

      for (var ind in list){  
        var kv = list[ind].split(&quot;=&quot;);  
        if (kv.length&amp;gt;0)  
            gets[kv[0]] = kv[1];  
    }  

    returned = gets;  

    if (typeof gkey != &quot;undefined&quot;)  
        if (typeof gets[gkey] != &quot;undefined&quot;)  
            returned = gets[gkey];  

    }  

        return returned;  

};  
&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;a href=&quot;https://stackoverflow.com/questions/336859/javascript-var-functionname-function-vs-function-functionname&quot;&gt;질문&lt;/a&gt;을 읽어 보는 것도 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;var functionName = function () {}&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;function functionName() {}&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;, 그리고 가변 범위에 관한 이 &lt;a href=&quot;http://javascript.about.com/library/bltut07.htm&quot; rel=&quot;noreferrer&quot;&gt;기사&lt;/a&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러나 또 다른 옵션은 jQuery 객체 자체에 함수를 거는 것입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이렇게 하면 글로벌 네임스페이스가 더 이상 오염되지 않도록 할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;jQuery.getlist = function getlist(url, gkey) {
  // ...
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러면 &quot;$getlist(url, key)&quot;를 통해 얻을 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;getList()를 ready() 함수 밖에 선언합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var getList = function(url, gkey){
        var returned = null;
        if (url.indexOf(&quot;?&quot;) != 
....
....
...
};
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이제 getList는 코드의 어느 곳에서나 작동합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$(document).ready( function() {
alert(getList('http://www.youtube.com/watch?v=dm4J5dAUnR4', &quot;v&quot;));
});
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;문제는 getList(.) 함수의 범위였습니다.&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;$.fn&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 ($) {

   $.fn.getList = function() {
       // ...
   };

}(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;$().getList();
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것은 일반적으로 &lt;a href=&quot;https://learn.jquery.com/plugins/basic-plugin-creation/&quot; rel=&quot;nofollow noreferrer&quot;&gt;jQuery용&lt;/a&gt; 기본 &lt;a href=&quot;https://learn.jquery.com/plugins/basic-plugin-creation/&quot; rel=&quot;nofollow 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;pre&gt;&lt;code&gt;&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
    function getlist(url, gkey){  
        ...
    }
&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;글로벌 함수로 선언하려면 jQuery 특정 비트를 모두 제거하면 됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이와 같은 것:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;function getList(url, gkey) {
    var returned = null;
    if (url.indexOf(&quot;?&quot;) != -1){
    var list = url.split(&quot;?&quot;)[1].split(&quot;&amp;amp;&quot;), gets = [];
    for (var ind in list){
        var kv = list[ind].split(&quot;=&quot;);
        if (kv.length&amp;gt;0) {
            gets[kv[0]] = kv[1];
        }
    }

    returned = gets;

    if (typeof gkey != &quot;undefined&quot;) {
        if (typeof gets[gkey] != &quot;undefined&quot;) {
            returned = gets[gkey];
        }
    }

    return returned;
}
&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/2223305/how-can-i-make-a-function-defined-in-jquery-ready-available-globally&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>JQuery</category>
      <author>oldcodes</author>
      <guid isPermaLink="true">https://oldcodes.tistory.com/715</guid>
      <comments>https://oldcodes.tistory.com/715#entry715comment</comments>
      <pubDate>Sun, 5 Nov 2023 14:58:31 +0900</pubDate>
    </item>
    <item>
      <title>Visual Studio 2013 ADO.net 엔티티 모델에 Oracle 데이터 소스가 없습니다.</title>
      <link>https://oldcodes.tistory.com/714</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Visual Studio 2013 ADO.net 엔티티 모델에 Oracle 데이터 소스가 없습니다.&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;방금 visual studio 2013을 설치하고 오라클 데이터베이스에 액세스하기 위해 엔티티 프레임워크를 설정하려고 했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;새 ADO를 클릭합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;NET 엔티티 모델을 선택한 다음 데이터베이스에서 생성하지만 &quot;새 연결&quot;을 클릭하면 데이터 소스 목록이 오라클로 표시되지 않습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;SQL 서버 옵션은 두 가지뿐입니다.&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;Oracle 데이터 소스는 동일한 시스템에 설치된 2012년 버전의 Visual Studio에 나타나는데, 2013년에는 작동하지 않는 이유를 잘 모르겠습니다.&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://forums.oracle.com/message/11239147#11239147&quot; rel=&quot;nofollow&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;https://forums.oracle.com/message/11239147#11239147&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;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Entity Framework 6을 사용하고 있으며, 첫 번째 릴리스에서는 SqlServer 항목에 대한 공급자만 있습니다. 외부 도구(DevArt)에서 지원하는 기능이 있습니다. 다음 페이지를 참조하십시오.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/17684025/entity-framework-6-free-oracle-data-provider&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;엔티티 프레임워크 6 무료 오라클 데이터 프로바이더&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;버전 12.1 릴리즈 2 Visual Studio 2013이 지원됩니다. http://www.oracle.com/technetwork/database/windows/newfeatures-084113.html&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Oracle Provider는 현재 EF6을 기반으로 구축되어 있지 않으므로 MVC5에서 Entity Framework를 사용하려는 경우 Package Manager Console에서 &quot;Install-Package EntityFramework -Version 5.0.0&quot;을 실행하여 EF5를 설치해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;부트스트래핑된 MVC5 WebApp을 시작하는 경우 EF6에 의존하므로 개별 사용자 계정 구성원 자격 제공자를 사용하지 마십시오.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여러 대체 멤버십 제공업체 중 하나(http://nugetmusthaves.com/Tag/membership) 를 선택할 수 있습니다.&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;여기: http://www.oracle.com/technetwork/topics/dotnet/downloads/index.html 에서 적절한 설치 파일을 다운로드합니다. (Oracle 계정을 만들어야 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Visual Studio의 특정 버전을 선택할 수 있습니다. 그렇지 않으면 300MB 이상의 다운로드를 통해 여러 버전을 처리할 수 있습니다.)&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;zip 파일의 압축을 풀고 setup.exe를 실행합니다.&lt;/font&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;Install 버튼을 클릭합니다. (그런데 비주얼 스튜디오 닫기) 몇 분 후 설치가 완료됩니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;비주얼 스튜디오를 열고 새 ADO를 만듭니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;NET 엔티티 모델, Generate from database, New Connection.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이번에는 데이터 소스로서의 역할을 수행해 주시기 바랍니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;em&gt;오라클 데이터베이스(ODP).&lt;/em&gt;&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;em&gt;NET,&lt;/em&gt; 관리 &lt;em&gt;드라이버).&lt;/em&gt;&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&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/19706195/visual-studio-2013-ado-net-entity-model-does-not-have-oracle-data-source&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>oracle</category>
      <author>oldcodes</author>
      <guid isPermaLink="true">https://oldcodes.tistory.com/714</guid>
      <comments>https://oldcodes.tistory.com/714#entry714comment</comments>
      <pubDate>Sun, 5 Nov 2023 14:58:23 +0900</pubDate>
    </item>
    <item>
      <title>Angular.js:기존 스코프 데이터를 기반으로 ng-re-relending이 가능합니까?</title>
      <link>https://oldcodes.tistory.com/713</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Angular.js:&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;기존 스코프 데이터를 기반으로 ng-re-relending이 가능합니까?&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;ul&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;jQuery UI를 사용하는 내 보기의 목록: 목록 항목의 드래그 앤 드롭 및 순서 변경을 용이하게 하는 정렬 가능한 지시문입니다.&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;jQuery UI의 드래그 앤 드롭을 통해 변경한 내용을 적용합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;$scope&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;$apply&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;ol&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;$apply&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;$scope&lt;/code&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;$apply&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;정보를 저장하려면 마지막 드래그/드롭 상호 작용을 효과적으로 '다시 rendering' 내 목록을 되돌려서 아직 남아 있는 데이터를 반영해야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;$scope&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;/ol&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&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;'새로 고침' 또는 '재렌더'를 강제로 수행하려면 어떻게 해야 합니까?&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;s 시각적으로 새로고침하여 전류를 보여주도록 합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;$scope&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;code&gt;$scope.oldData = angular.copy($scope.data);&lt;/code&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그런 다음 사용자가 원하는 대로 양식을 사용하여 $scope.data를 편집하도록 합니다.&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;$scope.data = $scope.oldData&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;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/12595656/angular-js-is-it-possible-to-re-render-ng-repeats-based-on-existing-scope-data&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>AngularJS</category>
      <author>oldcodes</author>
      <guid isPermaLink="true">https://oldcodes.tistory.com/713</guid>
      <comments>https://oldcodes.tistory.com/713#entry713comment</comments>
      <pubDate>Sun, 5 Nov 2023 14:58:17 +0900</pubDate>
    </item>
    <item>
      <title>테이블 행에 ng-반복 사용</title>
      <link>https://oldcodes.tistory.com/712</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;테이블 행에 ng-반복 사용&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;모델의 데이터를 템플릿에 삽입하려고 하는데 7번 반복할 때마다 새로운 테이블 행을 추가하고 싶습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;strig 기반 템플릿을 사용하면 반복 인덱스와 모듈로를 사용하여 꽤 쉽게 수행할 수 있지만 angular의 DOM 템플릿을 사용하여 이 작업을 수행하는 방법을 잘 알 수 없습니다.&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;div ng-controller=&quot;MyCtrl&quot;&amp;gt;
  &amp;lt;table cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&amp;gt;
   &amp;lt;colgroup span=&quot;7&quot;&amp;gt;&amp;lt;/colgroup&amp;gt;

   &amp;lt;tbody&amp;gt;
     &amp;lt;tr class=&quot;days&quot;&amp;gt;
       &amp;lt;th scope=&quot;col&quot; title=&quot;Monday&quot;&amp;gt;Mon&amp;lt;/th&amp;gt;
       &amp;lt;th scope=&quot;col&quot; title=&quot;Tuesday&quot;&amp;gt;Tue&amp;lt;/th&amp;gt;
       &amp;lt;th scope=&quot;col&quot; title=&quot;Wednesday&quot;&amp;gt;Wed&amp;lt;/th&amp;gt;
       &amp;lt;th scope=&quot;col&quot; title=&quot;Thursday&quot;&amp;gt;Thu&amp;lt;/th&amp;gt;
       &amp;lt;th scope=&quot;col&quot; title=&quot;Friday&quot;&amp;gt;Fri&amp;lt;/th&amp;gt;
       &amp;lt;th scope=&quot;col&quot; title=&quot;Saturday&quot;&amp;gt;Sat&amp;lt;/th&amp;gt;
       &amp;lt;th scope=&quot;col&quot; title=&quot;Sunday&quot;&amp;gt;Sun&amp;lt;/th&amp;gt;
     &amp;lt;/tr&amp;gt;
     &amp;lt;tr&amp;gt;
         &amp;lt;td ng-repeat=&quot;date in dates&quot;&amp;gt;
             {{ date }}
             &amp;lt;!-- After seven iterations a new `&amp;lt;tr&amp;gt;` should be aded --&amp;gt;
        &amp;lt;/td&amp;gt;
     &amp;lt;/tr&amp;gt;
 &amp;lt;/tbody&amp;gt;
 &amp;lt;/table&amp;gt;
&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;myApp = this.angular.module('myApp', []);

var monthDays = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 1516, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31];

myApp.controller('MyCtrl', function($scope) {
  return $scope.dates = monthDays;
});​
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;JSFiddle에서 코드를 볼 수 있습니다. http://jsfiddle.net/3zhbB/2/&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;$scope.dates&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;이 업데이트된 JSFiddle http://jsfiddle.net/6aqtj/1/ 참조&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;div ng-controller=&quot;MyCtrl&quot;&amp;gt;
    &amp;lt;calendar&amp;gt;&amp;lt;/calendar&amp;gt;
&amp;lt;/div&amp;gt;

myApp.directive('calendar', function() {
// Requires that scope contains a 'monthDays' array.
// Adds 'weeks' to scope.
return {
    restrict: 'E',
    replace: true,
    template: '&amp;lt;table cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&amp;gt;'
    + ...
    + '&amp;lt;th scope=&quot;col&quot; title=&quot;Sunday&quot;&amp;gt;Sun&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;'
    + '&amp;lt;tr ng-repeat=&quot;week in weeks&quot;&amp;gt;'
    + '&amp;lt;td ng-repeat=&quot;day in week&quot;&amp;gt;{{day}}&amp;lt;/td&amp;gt;'
    + '&amp;lt;/tr&amp;gt;&amp;lt;/tbody&amp;gt;&amp;lt;/table&amp;gt;',
    link: function(scope) {
        scope.weeks = [];
        for (var i = 0; i &amp;lt; scope.monthDays.length; i++) {
            if (i % 7 == 0) {
                scope.weeks.push([]);
            }
            scope.weeks[scope.weeks.length-1].push(scope.monthDays[i]);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Fiddle: http://jsfiddle.net/mrajcok/dGpsr/&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;방금 간단한 필터를 추가했습니다. http://jsfiddle.net/3zhbB/6/&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;그래도 시원하네요 :-D&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;테이블 셀을 빈 상태로 만들고 월을 올바른 요일(0-6)에 시작한다고 가정합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음 기능을 살펴봅니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;function generateWeeks(startDay, numDays){
  var weeks = [];
  var numWeeks = (numDays + startDay) / 7;
  for(var i=0; i&amp;lt;numWeeks; i++){
    weeks[i] = [];
    for(var j=0; j&amp;lt;7; j++){
      if(i==0 &amp;amp;&amp;amp; j&amp;lt;startDay){
        weeks[i].push('');
      }else{
        var day = (j-startDay+1)+(i*7);
        weeks[i].push(day&amp;lt;=numDays ? day : '');
      }
    }
  }
  return weeks;
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이번 한 달간은 generate로 전화를 걸겠습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;몇 주(5,30).&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;9월은 30일로 토요일에 시작합니다(달력 주간은 월요일 - 일요일).&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;tr ng-repeat=&quot;week in weeks&quot;&amp;gt;
  &amp;lt;td ng-repeat=&quot;day in week&quot;&amp;gt;{{day}}
&amp;lt;/tr&amp;gt;
&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;html 테이블 대신에, 저는 한 번의 &quot;days&quot; 컬렉션에 걸쳐 순서 없는 목록을 사용하고 css를 사용하여 테이블처럼 보이게 할 것입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;따라서 각 요소의 너비가 14%인 경우 자동으로 7에 감깁니다.&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/3474737/creating-three-column-table-with-css-only-no-table-element&quot;&gt;CSS로만 3열 테이블을 만드는&lt;/a&gt; 것&lt;a href=&quot;https://stackoverflow.com/questions/3474737/creating-three-column-table-with-css-only-no-table-element&quot;&gt;? (Notable element)&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;/font&gt;&lt;/font&gt;&lt;code&gt;$index % 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;code&gt;&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&lt;/code&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;style type=&quot;text/css&quot;&amp;gt;
    .selectable.year {
        display:inline-block; 
        width:25%;
        border-right-width:0px;
        text-align: center;
    }
    .selectable.year.first {
        margin-left:0;
    }
    .selectable.year.lastcol, .selectable.year:last-child {
        border-right-width:1px;
    }
&amp;lt;/style&amp;gt;
&amp;lt;div class=&quot;calendar&quot;&amp;gt;
    &amp;lt;div class=&quot;selectable year&quot; 
        ng-class=&quot;{ 'firstcol' : $index % 4 == 0 , 'lastcol' : $index % 4 == 3 }&quot;
        ng-repeat=&quot;year in search.yearList&quot;
        &amp;lt;span class=&quot;caption&quot;&amp;gt;{{ year }}&amp;lt;/span&amp;gt;
    &amp;lt;/div&amp;gt;
&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;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-repeat-start&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-end&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://www.undefinednull.com/2015/04/10/repeating-multiple-elements-using-ng-repeat-start-and-ng-repeat-end-in-angularjs/&quot; rel=&quot;nofollow&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;http://www.undefinednull.com/2015/04/10/repeating-multiple-elements-using-ng-repeat-start-and-ng-repeat-end-in-angularjs/&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;각도 5+의 경우 ng-반복 대신 ngFor를 사용합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt; &amp;lt;tr *ngFor=&quot;let mi of mileages; let i = index&quot;&amp;gt;
                            &amp;lt;td&amp;gt;{{mi.fromAddress}}&amp;lt;/td&amp;gt;
&amp;lt;/tr&amp;gt;
&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/12518259/using-ng-repeat-with-table-rows&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>AngularJS</category>
      <author>oldcodes</author>
      <guid isPermaLink="true">https://oldcodes.tistory.com/712</guid>
      <comments>https://oldcodes.tistory.com/712#entry712comment</comments>
      <pubDate>Sun, 5 Nov 2023 14:58:11 +0900</pubDate>
    </item>
    <item>
      <title>사용.사용.</title>
      <link>https://oldcodes.tistory.com/711</link>
      <description>&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;style&gt; tags in the &lt;body&gt; with other HTML&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;html&amp;gt;
  &amp;lt;body&amp;gt;
    &amp;lt;style type=&quot;text/css&quot;&amp;gt;
      p.first {color:blue}
      p.second {color:green}
    &amp;lt;/style&amp;gt;

    &amp;lt;p class=&quot;first&quot;&amp;gt;Hello World&amp;lt;/p&amp;gt;
    &amp;lt;p class=&quot;second&quot;&amp;gt;Hello World&amp;lt;/p&amp;gt;

    &amp;lt;style type=&quot;text/css&quot;&amp;gt;
      p.first {color:green}
      p.second {color:blue}
    &amp;lt;/style&amp;gt;

    &amp;lt;p class=&quot;first&quot;&amp;gt;Hello World&amp;lt;/p&amp;gt;
    &amp;lt;p class=&quot;second&quot;&amp;gt;Hello World&amp;lt;/p&amp;gt;
  &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;How is a browser supposed to render css which is non contiguous? Is it supposed to generate some data structure using all the css styles on a page and use that for rendering?&lt;/p&gt; 
&lt;p&gt;Or does it render using style information in the order it sees?&lt;/p&gt;&lt;blockquote&gt; 
 &lt;p&gt;&lt;strong&gt;WARNING&lt;/strong&gt;: This answer refers the &lt;code&gt;scoped&lt;/code&gt; attribute on &lt;code&gt;style&lt;/code&gt; tag which should not be used anymore!&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;As others have already mentioned, HTML 4 requires the &lt;code&gt;&amp;lt;style&amp;gt;&lt;/code&gt; tag to be placed in the &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; section (even though most browsers allow &lt;code&gt;&amp;lt;style&amp;gt;&lt;/code&gt; tags within the &lt;code&gt;body&lt;/code&gt;).&lt;/p&gt; 
&lt;p&gt;However, HTML 5 includes the &lt;a href=&quot;http://www.w3.org/TR/html-markup/style.html#style.attrs.scoped&quot; rel=&quot;noreferrer&quot;&gt;&lt;strong&gt;&lt;code&gt;scoped&lt;/code&gt; attribute&lt;/strong&gt;&lt;/a&gt; (see update below), which allows you to create style sheets that are scoped within the parent element of the &lt;code&gt;&amp;lt;style&amp;gt;&lt;/code&gt; tag. This also enables you to place &lt;code&gt;&amp;lt;style&amp;gt;&lt;/code&gt; tags within the &lt;code&gt;&amp;lt;body&amp;gt;&lt;/code&gt; element:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;

&amp;lt;div id=&quot;scoped-content&quot;&amp;gt;
    &amp;lt;style type=&quot;text/css&quot; scoped&amp;gt;
        h1 { color: red; } 
    &amp;lt;/style&amp;gt;

    &amp;lt;h1&amp;gt;Hello&amp;lt;/h1&amp;gt;
&amp;lt;/div&amp;gt;

    &amp;lt;h1&amp;gt;
      World
    &amp;lt;/h1&amp;gt;

&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;If you render the above code in an HTML-5 enabled browser that supports &lt;code&gt;scoped&lt;/code&gt;, you will see the limited scope of the style sheet. &lt;br&gt; &lt;br&gt;&lt;/p&gt; 
&lt;p&gt;There's just one &lt;em&gt;&lt;strong&gt;major&lt;/strong&gt;&lt;/em&gt; caveat...&lt;/p&gt; 
&lt;p&gt;At the time I'm writing this answer (May, 2013) almost no mainstream browser currently supports the &lt;code&gt;scoped&lt;/code&gt; attribute. (Although apparently &lt;a href=&quot;http://www.webmonkey.com/2012/04/html5-offers-scoped-css-for-precision-styling/&quot; rel=&quot;noreferrer&quot;&gt;developer builds of Chromium&lt;/a&gt; support it.)&lt;/p&gt; 
&lt;p&gt;HOWEVER, there is an interesting implication of the &lt;code&gt;scoped&lt;/code&gt; attribute that pertains to this question. It means that future browsers are mandated via the standard to allow &lt;code&gt;&amp;lt;style&amp;gt;&lt;/code&gt; elements within the &lt;code&gt;&amp;lt;body&amp;gt;&lt;/code&gt; (as long as the &lt;code&gt;&amp;lt;style&amp;gt;&lt;/code&gt; elements are scoped.)&lt;/p&gt; 
&lt;p&gt;So, given that:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Almost every existing browser currently ignores the &lt;code&gt;scoped&lt;/code&gt; attribute&lt;/li&gt; 
 &lt;li&gt;Almost every existing browser currently allows &lt;code&gt;&amp;lt;style&amp;gt;&lt;/code&gt; tags within the &lt;code&gt;&amp;lt;body&amp;gt;&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;Future implementations will be required to allow (scoped) &lt;code&gt;&amp;lt;style&amp;gt;&lt;/code&gt; tags within the &lt;code&gt;&amp;lt;body&amp;gt;&lt;/code&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;...then there is literally &lt;em&gt;&lt;strong&gt;no harm&lt;/strong&gt;&lt;/em&gt; * in placing &lt;code&gt;&amp;lt;style&amp;gt;&lt;/code&gt; tags within the body, as long as you future proof them with a &lt;code&gt;scoped&lt;/code&gt; attribute. The only problem is that current browsers won't actually &lt;em&gt;limit the scope&lt;/em&gt; of the stylesheet - they'll apply it to the whole document. But the point is that, for all practical purposes, you &lt;em&gt;can&lt;/em&gt; include &lt;code&gt;&amp;lt;style&amp;gt;&lt;/code&gt; tags within the &lt;code&gt;&amp;lt;body&amp;gt;&lt;/code&gt; provided that you:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Future-proof your HTML by including the &lt;code&gt;scoped&lt;/code&gt; attribute&lt;/li&gt; 
 &lt;li&gt;Understand that as of now, the stylesheet within the &lt;code&gt;&amp;lt;body&amp;gt;&lt;/code&gt; will not actually be scoped (because no mainstream browser support exists yet)&lt;/li&gt; 
&lt;/ul&gt; 
&lt;br&gt; * except of course, for pissing off HTML validators... 
&lt;br&gt; 
&lt;hr&gt; 
&lt;p&gt;Finally, regarding the common (but subjective) claim that embedding CSS within HTML is poor practice, it should be noted that the &lt;em&gt;whole point&lt;/em&gt; of the &lt;code&gt;scoped&lt;/code&gt; attribute is to accommodate typical modern development frameworks that allow developers to import chunks of HTML as modules or syndicated content. It is very convenient to have embedded CSS that &lt;em&gt;only&lt;/em&gt; applies to a particular chunk of HTML, in order to develop encapsulated, modular components with specific stylings.&lt;/p&gt; 
&lt;hr&gt; 
&lt;p&gt;Update as of Feb 2019, according to the &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/HTML/Element/style#Deprecated_attributes&quot; rel=&quot;noreferrer&quot;&gt;Mozilla documentation&lt;/a&gt;, the &lt;code&gt;scoped&lt;/code&gt; attribute is deprecated. Chrome stopped supporting it in version 36 (2014) and Firefox in version 62 (2018). In both cases, the feature had to be explicitly enabled by the user in the browsers' settings. No other major browser ever supported it.&lt;/p&gt; 
&lt;p&gt;The website &lt;a href=&quot;https://caniuse.com&quot; rel=&quot;noreferrer&quot;&gt;Can I Use&lt;/a&gt; reports that the &lt;a href=&quot;https://caniuse.com/style-scoped&quot; rel=&quot;noreferrer&quot;&gt;&quot;attribute has been removed from the current specification.&quot;&lt;/a&gt; since 2016.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;BREAKING BAD NEWS&lt;/strong&gt; for &quot;style in body&quot; lovers: W3C has recently &lt;a href=&quot;https://techxplore.com/news/2019-06-w3c-whatwg-agreement-version-html.html&quot; rel=&quot;nofollow noreferrer&quot;&gt;lost the HTML war&lt;/a&gt; against WHATWG, whose versionless HTML &quot;Living Standard&quot; &lt;a href=&quot;https://www.w3.org/2019/04/WHATWG-W3C-MOU.html&quot; rel=&quot;nofollow noreferrer&quot;&gt;has now become&lt;/a&gt; the official one, which, alas, &lt;a href=&quot;https://html.spec.whatwg.org/#the-style-element&quot; rel=&quot;nofollow noreferrer&quot;&gt;does &lt;em&gt;not&lt;/em&gt; allow&lt;/a&gt; &lt;code&gt;STYLE&lt;/code&gt; in the &lt;code&gt;BODY&lt;/code&gt;. The short-lived happy days are over. ;) The &lt;a href=&quot;https://validator.w3.org/nu/about.html&quot; rel=&quot;nofollow noreferrer&quot;&gt;W3C validator&lt;/a&gt; also works by the WHATWG specs now. &lt;em&gt;(Thanks @FrankConijn for the heads-up!)&lt;/em&gt;&lt;/p&gt; 
&lt;p&gt;&lt;em&gt;(Note: this is the case &quot;as of today&quot;, but since there's no versioning, links can become invalid at any moment without notice or control. Unless you're willing to link to its individual source commits at GitHub, you basically can no longer make stable references to the new official &lt;a href=&quot;https://html.spec.whatwg.org/&quot; rel=&quot;nofollow noreferrer&quot;&gt;HTML standard&lt;/a&gt;, AFAIK. Please correct me if there's a canonical way of doing this properly.)&lt;/em&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;OBSOLETED GOOD NEWS:&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;Yay, &lt;strong&gt;&lt;code&gt;STYLE&lt;/code&gt; is finally valid in &lt;code&gt;BODY&lt;/code&gt;, as of HTML5.2!&lt;/strong&gt; (And &lt;code&gt;scoped&lt;/code&gt; is gone, too.)&lt;/p&gt; 
&lt;p&gt;From &lt;a href=&quot;https://www.w3.org/TR/html52/document-metadata.html#the-style-element&quot; rel=&quot;nofollow noreferrer&quot;&gt;the W3C specs&lt;/a&gt; (&lt;em&gt;relish the last line!&lt;/em&gt;):&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;strong&gt;4.2.6. The style element&lt;/strong&gt;&lt;/p&gt; 
 &lt;p&gt;...&lt;/p&gt; 
 &lt;p&gt;Contexts in which this element can be used:&lt;/p&gt; 
 &lt;p&gt;Where metadata content is expected.&lt;/p&gt; 
 &lt;p&gt;In a noscript element that is a child of a head element.&lt;/p&gt; 
 &lt;p&gt;&lt;em&gt;In the body, where flow content is expected.&lt;/em&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;hr&gt; 
&lt;p&gt;&lt;strong&gt;META SIDE-NOTE:&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;The mere fact that despite the damages of the &quot;browser war&quot; we still had to keep developing against two &lt;a href=&quot;https://www.reddit.com/r/javascript/comments/5swe9b/what_is_the_difference_between_the_w3c_and_the/&quot; rel=&quot;nofollow noreferrer&quot;&gt;ridiculously competing&lt;/a&gt; &quot;official&quot; HTML &quot;standards&quot; (quotes for the plural, as &lt;code&gt;1 standard + 1 standard &amp;lt; 1 standard&lt;/code&gt;) means that the &quot;fallback to in-the-trenches common sense&quot; approach to web development has never really ceased to apply.&lt;/p&gt; 
&lt;p&gt;This may finally change now, but citing the conventional wisdom: web authors/developers and thus, in turn, browsers should ultimately decide what should (and shouldn't) be in the specifications, when there's no good reason against what's already been done in reality. And most browsers have long supported &lt;code&gt;STYLE&lt;/code&gt; in &lt;code&gt;BODY&lt;/code&gt; (in one way or another; see e.g. the &lt;code&gt;scoped&lt;/code&gt; attr.), despite its inherent performance (and possibly other) penalties (which &lt;em&gt;we&lt;/em&gt; should decide to pay or not, not the specs.). So, for one, I'll keep betting on them, and not going to give up hope. ;) If WHATWG has the same respect for reality/authors as they claim, they may just end up doing here what the W3C did.&lt;/p&gt;&lt;p&gt;When I see that the big-site Content Management Systems routinely put some &amp;lt;style&amp;gt; elements (some, not all) close to the content that relies on those classes, I conclude that the horse is out of the barn.&lt;/p&gt; 
&lt;p&gt;Go look at page sources from cnn.com, nytimes.com, huffingtonpost.com, your nearest big-city newspaper, etc. All of them do this.&lt;/p&gt; 
&lt;p&gt;If there's a good reason to put an extra &amp;lt;style&amp;gt; section somewhere in the body -- for instance if you're include()ing diverse and independent page elements in real time and each has an embedded &amp;lt;style&amp;gt; of its own, and the organization will be cleaner, more modular, more understandable, and more maintainable -- I say just bite the bullet. Sure it would be better if we could have &quot;local&quot; style with restricted scope, like local variables, but you go to work with the HTML you have, not the HTML you might want or wish to have at a later time.&lt;/p&gt; 
&lt;p&gt;Of course there are potential drawbacks and good (if not always compelling) reasons to follow the orthodoxy, as others have elaborated. But to me it looks more and more like thoughtful use of &amp;lt;style&amp;gt; in &amp;lt;body&amp;gt; has already gone mainstream.&lt;/p&gt;&lt;p&gt;I guess this may be an issue about limited contexts, e.g. WYIWYG editors on a web system used by &lt;em&gt;not-programmers users&lt;/em&gt;, that limits the possibilities of follow the standards. Sometimes (like TinyMCE), it's a lib that puts your content/code inside a &lt;code&gt;textarea&lt;/code&gt; tag, that is rendered by the editor as a big &lt;code&gt;div&lt;/code&gt; tag. And sometimes, it may be an old version of these editors.&lt;/p&gt; 
&lt;p&gt;I'm supposing that:&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;these &lt;em&gt;not-programmers users&lt;/em&gt; don't have an open channel with the system admins (or institution's webdevs), to ask for including some CSS rules at the system's &lt;code&gt;stylesheets&lt;/code&gt;. Actually, it would be impractical for the admins (or webdevs), considering the number of requests in that sense that they would have.&lt;/li&gt; 
 &lt;li&gt;this system is legacy and still doesn't support newer versions of HTML.&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p&gt;In some cases, without use &lt;code&gt;style&lt;/code&gt; rules, it may be a very poor design experience. So, yes, these users need customization. Okay, but what would be the solutions, in this scenario? Considering the different ways to insert CSS in a &lt;code&gt;html&lt;/code&gt; page, I suppose these solutions:&lt;/p&gt; 
&lt;hr&gt; 
&lt;h1&gt;1st option: ask your sysadm&lt;/h1&gt; 
&lt;p&gt;Ask to your system adm for including some CSS rules at the system's &lt;code&gt;stylesheets&lt;/code&gt;. This will be an &lt;strong&gt;external or internal CSS&lt;/strong&gt; solution. As already said, it might be not possible.&lt;/p&gt; 
&lt;hr&gt; 
&lt;h1&gt;2nd option: &lt;code&gt;&amp;lt;link&amp;gt;&lt;/code&gt; on &lt;code&gt;&amp;lt;body&amp;gt;&lt;/code&gt;&lt;/h1&gt; 
&lt;p&gt;Use &lt;strong&gt;external style sheet&lt;/strong&gt; on the &lt;code&gt;body&lt;/code&gt; tag, i.e., use of the &lt;code&gt;link&lt;/code&gt; tag &lt;em&gt;inside&lt;/em&gt; the area you have access (that will be, on the site, inside the &lt;code&gt;body&lt;/code&gt; tag and not in the &lt;code&gt;head&lt;/code&gt; tag). Some sources says this is okay, but &quot;not a good practice&quot;, like &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/HTML/Element/link&quot; rel=&quot;noreferrer&quot;&gt;MDN&lt;/a&gt;:&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;A &lt;code&gt;&amp;lt;link&amp;gt;&lt;/code&gt; element can occur either in the &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; or &lt;code&gt;&amp;lt;body&amp;gt;&lt;/code&gt; element, depending on whether it has a link type that is &lt;strong&gt;body-ok&lt;/strong&gt;. For example, the &lt;code&gt;stylesheet&lt;/code&gt; link type is body-ok, and therefore &lt;code&gt;&amp;lt;link rel=&quot;stylesheet&quot;&amp;gt;&lt;/code&gt; is permitted in the body. However, this isn't a good practice to follow; it makes more sense to separate your &lt;code&gt;&amp;lt;link&amp;gt;&lt;/code&gt; elements from your body content, putting them in the &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt;.&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;Some others, restrict it to the &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; section, like &lt;a href=&quot;https://www.w3schools.com/tags/tag_link.asp&quot; rel=&quot;noreferrer&quot;&gt;w3schools&lt;/a&gt;:&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; This element goes only in the head section, but it can appear any number of times.&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;h2&gt;Testing&lt;/h2&gt; 
&lt;p&gt;I tested it here (desktop environment, on a browser) and it works for me. Create a file &lt;code&gt;foo.html&lt;/code&gt;:&lt;/p&gt; 
&lt;pre class=&quot;lang-html prettyprint-override&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;link href=&quot;bar.css&quot; type=&quot;text/css&quot; rel=&quot;stylesheet&quot;&amp;gt;
    &amp;lt;h1 class=&quot;test1&quot;&amp;gt;Hello&amp;lt;/h1&amp;gt;
    &amp;lt;h1 class=&quot;test2&quot;&amp;gt;World&amp;lt;/h1&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;And then a CSS file, at the same directory, called &lt;code&gt;bar.css&lt;/code&gt;:&lt;/p&gt; 
&lt;pre class=&quot;lang-css prettyprint-override&quot;&gt;&lt;code&gt;.test1 { 
    color: green;
};
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Well, this will just looks possible if you have how upload an CSS file somewhere at the institution system. Maybe this would be the case.&lt;/p&gt; 
&lt;hr&gt; 
&lt;h1&gt;3rd option: &lt;code&gt;&amp;lt;style&amp;gt;&lt;/code&gt; on &lt;code&gt;&amp;lt;body&amp;gt;&lt;/code&gt;&lt;/h1&gt; 
&lt;p&gt;Use &lt;strong&gt;internet style sheet&lt;/strong&gt; on the &lt;code&gt;body&lt;/code&gt; tag, i.e., use of the &lt;code&gt;style&lt;/code&gt; tag inside the area you have access (that will be, on the site, inside the &lt;code&gt;body&lt;/code&gt; tag and not in the &lt;code&gt;head&lt;/code&gt; tag). This is what &lt;strong&gt;Charles Salvia&lt;/strong&gt;'s and &lt;strong&gt;Sz&lt;/strong&gt;'s answers here are about. Choosing this option, consider their concerns.&lt;/p&gt; 
&lt;hr&gt; 
&lt;h1&gt;4th, 5th and 6th options: JS ways&lt;/h1&gt; 
&lt;p&gt;Alert These ones are related to modifying the &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; element of the page. Maybe this &lt;strong&gt;will not&lt;/strong&gt; be allowed by the institution's system administrators. So, it's recommended to ask them permission first.&lt;/p&gt; 
&lt;p&gt;Okay, supposing permission granted, the strategy is access the &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt;. How? JavaScript methods.&lt;/p&gt; 
&lt;h2&gt;4th option: new &lt;code&gt;&amp;lt;link&amp;gt;&lt;/code&gt; on &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt;&lt;/h2&gt; 
&lt;p&gt;This is another version of the 2nd option. Use &lt;strong&gt;external style sheet&lt;/strong&gt; on the &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; tag, i.e., use of the &lt;code&gt;&amp;lt;link&amp;gt;&lt;/code&gt; element &lt;em&gt;outside&lt;/em&gt; the area you have access (that will be, on the site, not inside the &lt;code&gt;body&lt;/code&gt; tag and yes inside the &lt;code&gt;head&lt;/code&gt; tag). This solution complies with the recommendations of &lt;strong&gt;MDN&lt;/strong&gt; and &lt;strong&gt;w3schools&lt;/strong&gt;, as cited above, on 2nd option solution. A new &lt;a href=&quot;https://www.w3schools.com/jsreF/dom_obj_link.asp&quot; rel=&quot;noreferrer&quot;&gt;&lt;code&gt;Link&lt;/code&gt; object&lt;/a&gt; will be created.&lt;/p&gt; 
&lt;p&gt;To solve the matter through JS, there are many ways but at the following codelines I demonstrate one simple.&lt;/p&gt; 
&lt;h3&gt;Testing&lt;/h3&gt; 
&lt;p&gt;I tested it here (desktop environment, on a browser) and it works for me. Create a file &lt;code&gt;f.html&lt;/code&gt;:&lt;/p&gt; 
&lt;pre class=&quot;lang-html prettyprint-override&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;h1 class=&quot;test1&quot;&amp;gt;Hello&amp;lt;/h1&amp;gt;
    &amp;lt;h1 class=&quot;test2&quot;&amp;gt;World&amp;lt;/h1&amp;gt;
    &amp;lt;script&amp;gt;
        // JS code here
    &amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Inside the &lt;code&gt;script&lt;/code&gt; tag:&lt;/p&gt; 
&lt;pre class=&quot;lang-js prettyprint-override&quot;&gt;&lt;code&gt;var newLink = document.createElement(&quot;link&quot;);
newLink.href = &quot;bar.css&quot;;
newLink.rel = &quot;stylesheet&quot;;
newLink.type = &quot;text/css&quot;;
document.getElementsByTagName(&quot;head&quot;)[0].appendChild(newLink);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;And then at the CSS file, at the same directory, called &lt;code&gt;bar.css&lt;/code&gt; (as at the 2nd option):&lt;/p&gt; 
&lt;pre class=&quot;lang-css prettyprint-override&quot;&gt;&lt;code&gt;.test1 { 
    color: green;
};
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;As I already said: this will just looks possible if you have how upload an CSS file somewhere at the institution system.&lt;/p&gt; 
&lt;h2&gt;5th option: new &lt;code&gt;&amp;lt;style&amp;gt;&lt;/code&gt; on &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt;&lt;/h2&gt; 
&lt;p&gt;Use new &lt;strong&gt;internal style sheet&lt;/strong&gt; on the &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; tag, i.e., use of a new &lt;code&gt;&amp;lt;style&amp;gt;&lt;/code&gt; element &lt;em&gt;outside&lt;/em&gt; the area you have access (that will be, on the site, not inside the &lt;code&gt;body&lt;/code&gt; tag and yes inside the &lt;code&gt;head&lt;/code&gt; tag). A new &lt;a href=&quot;https://www.w3schools.com/jsreF/dom_obj_style.asp&quot; rel=&quot;noreferrer&quot;&gt;&lt;code&gt;Style&lt;/code&gt; object&lt;/a&gt; will be created.&lt;/p&gt; 
&lt;p&gt;This is solved through JS. One simple way is demonstrated following.&lt;/p&gt; 
&lt;h3&gt;Testing&lt;/h3&gt; 
&lt;p&gt;I tested it here (desktop environment, on a browser) and it works for me. Create a file &lt;code&gt;foobar.html&lt;/code&gt;:&lt;/p&gt; 
&lt;pre class=&quot;lang-html prettyprint-override&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;h1 class=&quot;test1&quot;&amp;gt;Hello&amp;lt;/h1&amp;gt;
    &amp;lt;h1 class=&quot;test2&quot;&amp;gt;World&amp;lt;/h1&amp;gt;
    &amp;lt;script&amp;gt;
        // JS code here
    &amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Inside the &lt;code&gt;script&lt;/code&gt; tag:&lt;/p&gt; 
&lt;pre class=&quot;lang-js prettyprint-override&quot;&gt;&lt;code&gt;var newStyle = document.createElement(&quot;style&quot;);
newStyle.innerHTML = 
    &quot;h1.test1 {&quot;+
        &quot;color: green;&quot;+
    &quot;}&quot;;
document.getElementsByTagName(&quot;head&quot;)[0].appendChild(newStyle);
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2&gt;6th option: using an existing &lt;code&gt;&amp;lt;style&amp;gt;&lt;/code&gt; on &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt;&lt;/h2&gt; 
&lt;p&gt;Use an existing &lt;strong&gt;internal style sheet&lt;/strong&gt; on the &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; tag, i.e., use of a &lt;code&gt;&amp;lt;style&amp;gt;&lt;/code&gt; element &lt;em&gt;outside&lt;/em&gt; the area you have access (that will be, on the site, not inside the &lt;code&gt;body&lt;/code&gt; tag and yes inside the &lt;code&gt;head&lt;/code&gt; tag), if some exists. A new &lt;code&gt;Style&lt;/code&gt; object will be created or a &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/CSSStyleSheet&quot; rel=&quot;noreferrer&quot;&gt;&lt;code&gt;CSSStyleSheet&lt;/code&gt; object&lt;/a&gt; will be used (in the code of the solution adopted here).&lt;/p&gt; 
&lt;p&gt;This is at some point of view risky. &lt;strong&gt;First&lt;/strong&gt;, because it may not exists some &lt;code&gt;&amp;lt;style&amp;gt; &lt;/code&gt; object. Depending of the way you implement this solution, you may get &lt;code&gt;undefined&lt;/code&gt; return (the system may use &lt;em&gt;external style sheet&lt;/em&gt;). &lt;strong&gt;Second&lt;/strong&gt;, because you will be editing the system design author's work (authorship issues). &lt;strong&gt;Third&lt;/strong&gt;, because it may not be allowed at your institution's IT politics of safety. So, do ask permission to do this &lt;em&gt;(as at in other JS solutions)&lt;/em&gt;.&lt;/p&gt; 
&lt;p&gt;Supposing, again, permission was granted:&lt;/p&gt; 
&lt;p&gt;You will need to consider some restrictions of the method available to this way: &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/CSSStyleSheet/insertRule&quot; rel=&quot;noreferrer&quot;&gt;&lt;code&gt;insertRule()&lt;/code&gt;&lt;/a&gt;. The solution proposed uses the default scenario, and a operation at the first &lt;code&gt;stylesheet&lt;/code&gt;, if some exists.&lt;/p&gt; 
&lt;h3&gt;Testing&lt;/h3&gt; 
&lt;p&gt;I tested it here (desktop environment, on a browser) and it works for me. Create a file &lt;code&gt;foo_bar.html&lt;/code&gt;:&lt;/p&gt; 
&lt;pre class=&quot;lang-html prettyprint-override&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
  &amp;lt;head&amp;gt;&amp;lt;/head&amp;gt;
  &amp;lt;body&amp;gt;
    &amp;lt;h1 class=&quot;test1&quot;&amp;gt;Hello&amp;lt;/h1&amp;gt;
    &amp;lt;h1 class=&quot;test2&quot;&amp;gt;World&amp;lt;/h1&amp;gt;
    &amp;lt;script&amp;gt;
      // JS code here
    &amp;lt;/script&amp;gt;
  &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Inside the &lt;code&gt;script&lt;/code&gt; tag:&lt;/p&gt; 
&lt;pre class=&quot;lang-js prettyprint-override&quot;&gt;&lt;code&gt;function demoLoop(){ // remove this line
    var elmnt = document.getElementsByTagName(&quot;style&quot;);
    if (elmnt.length === 0) {
        // there isn't style objects, so it's more interesting create one
        var newStyle = document.createElement(&quot;style&quot;);
        newStyle.innerHTML =
            &quot;h1.test1 {&quot; +
                &quot;color: green;&quot; +
            &quot;}&quot;;
        document.getElementsByTagName(&quot;head&quot;)[0].appendChild(newStyle);
    } else {
        // Using CSSStyleSheet interface
        var firstCSS = document.styleSheets[0];
        firstCSS.insertRule(&quot;h1.test2{color:blue;}&quot;); // at this way (without index specified), will be like an Array unshift() method
    }
} // remove this too
demoLoop(); // remove this too
demoLoop(); // remove this too
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Another approach to this solution it's using &lt;code&gt;CSSStyleDeclaration&lt;/code&gt; object (docs at &lt;a href=&quot;https://www.w3schools.com/jsreF/obj_cssstyledeclaration.asp&quot; rel=&quot;noreferrer&quot;&gt;w3schools&lt;/a&gt; and &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/CSSStyleDeclaration&quot; rel=&quot;noreferrer&quot;&gt;MDN&lt;/a&gt;). But it may not be interesting, considering the risk to override existing rules on the system's CSS.&lt;/p&gt; 
&lt;hr&gt; 
&lt;h1&gt;7th option: inline CSS&lt;/h1&gt; 
&lt;p&gt;Use &lt;strong&gt;inline CSS&lt;/strong&gt;. This solve the problem, although depending of the page size (in code lines), the maintenance (by the author itself or other assigned person) of code can be very difficult.&lt;/p&gt; 
&lt;p&gt;But depending of the context of your role at the institution, or its web system security policies, this might be the unique available solution to you.&lt;/p&gt; 
&lt;h2&gt;Testing&lt;/h2&gt; 
&lt;p&gt;Create a file &lt;code&gt;_foobar.html&lt;/code&gt;:&lt;/p&gt; 
&lt;pre class=&quot;lang-html prettyprint-override&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
  &amp;lt;head&amp;gt;&amp;lt;/head&amp;gt;
  &amp;lt;body&amp;gt;
    &amp;lt;h1 style=&quot;color: green;&quot;&amp;gt;Hello&amp;lt;/h1&amp;gt;
    &amp;lt;h1 style=&quot;color: blue;&quot;&amp;gt;World&amp;lt;/h1&amp;gt;    
  &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;hr&gt; 
&lt;h1&gt;Answering strictly the question asked by Gagan&lt;/h1&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;How is a browser supposed to render css which is non contiguous?&lt;/p&gt; 
 &lt;ol&gt; 
  &lt;li&gt;Is it supposed to generate some data structure using all the css styles on a page and use that for rendering?&lt;/li&gt; 
  &lt;li&gt;Or does it render using style information in the order it sees?&lt;/li&gt; 
 &lt;/ol&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;&lt;em&gt;(quote adapted)&lt;/em&gt;&lt;/p&gt; 
&lt;p&gt;For a more accurate answer, I suggest Google these articles:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;How Browsers Work: Behind the scenes of modern web browsers&lt;/li&gt; 
 &lt;li&gt;Render-tree Construction, Layout, and Paint&lt;/li&gt; 
 &lt;li&gt;What Does It Mean To “Render” a Webpage?&lt;/li&gt; 
 &lt;li&gt;How browser rendering works — behind the scenes&lt;/li&gt; 
 &lt;li&gt;Rendering - HTML Standard&lt;/li&gt; 
 &lt;li&gt;10 Rendering — HTML5&lt;/li&gt; 
&lt;/ul&gt;&lt;p&gt;Not valid HTML, anyway pretty much every browser seems to consider just the second instance.&lt;/p&gt; 
&lt;p&gt;Tested under the last versions of FF and Google Chrome under Fedora, and FF, Opera, IE, and Chrome under XP.&lt;/p&gt;&lt;p&gt;As others have said, this isn't valid html as the style tags belong in the head.&lt;/p&gt; 
&lt;p&gt;However, most browsers dont' really enforce that validation. Instead, once the document is loaded then the styles are merged and applied. In this case the second set of styles will always override the first because they were the last definitions encountered.&lt;/p&gt;&lt;p&gt;I guess this will vary from browser to browser: The global display rules will probably be updated as the browser goes along through the code.&lt;/p&gt; 
&lt;p&gt;You can see such changes in the global display rules sometimes when an external style sheet is loaded with a delay. Something similar might happen here but in such short succession that it doesn't actually get rendered.&lt;/p&gt; 
&lt;p&gt;It's not valid HTML anyway, so I'd say that it is a futile thing to think about. &lt;code&gt;&amp;lt;style&amp;gt;&lt;/code&gt; tags belong in the &lt;code&gt;head&lt;/code&gt; section of the page.&lt;/p&gt;&lt;h2&gt;What browsers really do...&lt;/h2&gt; 
&lt;p&gt;Again, this is a theory vs practice debate. No real winners.&lt;br&gt; First of all let me show you a CodePen:&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://codepen.io/dkellner/pen/gOzXGjz?editors=1100&quot; rel=&quot;noreferrer&quot;&gt;https://codepen.io/dkellner/pen/gOzXGjz?editors=1100&lt;/a&gt; &lt;/p&gt;
&lt;ul&gt;
 &lt;p&gt;&lt;/p&gt; 
 &lt;p&gt;&lt;strong&gt;CSS:&lt;/strong&gt;&lt;/p&gt; 
 &lt;pre class=&quot;lang-css prettyprint-override&quot;&gt;&lt;code&gt;.jeff { background:red; transform:rotate(2deg); color:white; }
&lt;/code&gt;&lt;/pre&gt; 
 &lt;p&gt;&lt;strong&gt;HTML:&lt;/strong&gt;&lt;/p&gt; 
 &lt;pre class=&quot;lang-html prettyprint-override&quot;&gt;&lt;code&gt;&amp;lt;style&amp;gt; .jeff { margin:20% 0 0 20%; width:400px; } &amp;lt;/style&amp;gt;
&amp;lt;div class=&quot;jeff&quot;&amp;gt;
  
    This is Jeff.

    &amp;lt;style&amp;gt; .jeff {background:blue; padding:40px;} &amp;lt;/style&amp;gt;
&amp;lt;/div&amp;gt;

&amp;lt;style&amp;gt; .jeff {background:green} &amp;lt;/style&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Explanation&lt;/h3&gt; 
&lt;p&gt;In this example, I used 4 different style blocks. One directly in the CSS box of CodePen, they'll put it somewhere nice, probably in the head, whatever. The next one is right &lt;em&gt;before&lt;/em&gt; the div, then one &lt;em&gt;inside&lt;/em&gt; the div, and the last one is &lt;em&gt;after&lt;/em&gt; it. Jeff is going through a lot right now. He's green, because that's what the last rule told him, but he's also rotated and positioned and the text inside is white, so we can safely say he's read &lt;em&gt;everything&lt;/em&gt; the style tags told him, and:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;All &lt;code&gt;style&lt;/code&gt; blocks were applied;&lt;/li&gt; 
 &lt;li&gt;They were applied in the correct order;&lt;/li&gt; 
 &lt;li&gt;They properly override each other;&lt;/li&gt; 
 &lt;li&gt;The whole thing acts like one big stylesheet.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;That's what happens.&lt;/p&gt; 
&lt;p&gt;Again, browsers are patient beasts. They want you to enjoy the internet, and people creating websites are not very well disciplined so browsers evolved to tolerate their insane behaviour.&lt;/p&gt; 
&lt;h3&gt;Bottom line&lt;/h3&gt; 
&lt;ol&gt; 
 &lt;li&gt;Yes you can put style tags in the body&lt;/li&gt; 
 &lt;li&gt;Yes it works as you'd expect&lt;/li&gt; 
 &lt;li&gt;Avoid if possible, it's an &lt;a href=&quot;https://github.com/whatwg/html/issues/1605&quot; rel=&quot;noreferrer&quot;&gt;ongoing debate&lt;/a&gt;, who knows where we end up.&lt;/li&gt; 
&lt;/ol&gt;&lt;p&gt;The &lt;code&gt;&amp;lt;style&amp;gt;&lt;/code&gt; tag belongs in the &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; section, separate from all the content.&lt;/p&gt; 
&lt;p&gt;References: &lt;a href=&quot;http://www.w3.org/TR/REC-html40/present/styles.html#edef-STYLE&quot; rel=&quot;nofollow noreferrer&quot;&gt;W3C Specs&lt;/a&gt; and &lt;a href=&quot;http://www.w3schools.com/TAGS/tag_style.asp&quot; rel=&quot;nofollow noreferrer&quot;&gt;W3Schools&lt;/a&gt;&lt;/p&gt;&lt;p&gt;In your example, a browser isn't &quot;supposed&quot; to do anything. The HTML is invalid. Either error recovery is triggered, or the parser makes of it as it will.&lt;/p&gt; 
&lt;p&gt;In a valid instance, multiple stylesheets are just treated as appearing one after the other, the &lt;a href=&quot;http://www.w3.org/TR/CSS21/cascade.html#cascade&quot; rel=&quot;nofollow noreferrer&quot;&gt;cascade&lt;/a&gt; is calculated as normal.&lt;/p&gt;&lt;p&gt;Because this is HTML is not valid does not have any affect on the outcome ... it just means that the HTML does adhere to the standard (merely for organizational purposes). For the sake of being valid it could have been written this way:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;style type=&quot;text/css&quot;&amp;gt;
  p.first {color:blue}
  p.second {color:green}
&amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;p class=&quot;first&quot; style=&quot;color:green;&quot;&amp;gt;Hello World&amp;lt;/p&amp;gt;
&amp;lt;p class=&quot;second&quot; style=&quot;color:blue;&quot;&amp;gt;Hello World&amp;lt;/p&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt; &lt;/p&gt; 
&lt;p&gt;My guess is that the browser applies the last style it comes across.&lt;/p&gt;&lt;p&gt;Yes it can. I checked on Mozilla's page. &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/HTML/Element/style&quot; rel=&quot;nofollow noreferrer&quot;&gt;https://developer.mozilla.org/en-US/docs/Web/HTML/Element/style&lt;/a&gt;&lt;/p&gt;&lt;p&gt;I think you can get completely legal &quot;scoped styles&quot; in modern browsers with a small amount of effort. Consider this HTML document:&lt;/p&gt; 
&lt;pre class=&quot;lang-html prettyprint-override&quot;&gt;&lt;code&gt;&amp;lt;!doctype html&amp;gt;
&amp;lt;html&amp;gt;
    &amp;lt;head&amp;gt;
    &amp;lt;/head&amp;gt;
    &amp;lt;style&amp;gt;p{background:red}&amp;lt;/style&amp;gt;
    &amp;lt;body&amp;gt;
        &amp;lt;template&amp;gt;
            &amp;lt;style&amp;gt;p{background:green}&amp;lt;/style&amp;gt;
            &amp;lt;p&amp;gt;I am green&amp;lt;/p&amp;gt;
        &amp;lt;/template&amp;gt;
        &amp;lt;p&amp;gt;I am red!&amp;lt;/p&amp;gt;
        &amp;lt;script&amp;gt;
         document.querySelectorAll('template').forEach((template)=&amp;gt;{
             const div = document.createElement('div');
             div.remove(); // detach div from document
             let shadow = div.attachShadow({mode:'open'});
             shadow.replaceChildren(template.content);
             template.replaceWith(div);
         });
        &amp;lt;/script&amp;gt;
    &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;I used a &lt;code&gt;template&lt;/code&gt; to enclose HTML that I wanted to contain its own &lt;code&gt;style&lt;/code&gt; element that doesn't affect any HTML outside that &lt;code&gt;template&lt;/code&gt;. Of course, by default, a &lt;code&gt;template&lt;/code&gt; is ignored during rendering. So the JavaScript code&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;locates each template in the document&lt;/li&gt; 
 &lt;li&gt;creates a detached empty &lt;code&gt;div&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;gives the &lt;code&gt;div&lt;/code&gt; a &quot;shadow root&quot; (the key to localizing a &lt;code&gt;style&lt;/code&gt;)&lt;/li&gt; 
 &lt;li&gt;copies the &lt;code&gt;template&lt;/code&gt; contents to the shadow root&lt;/li&gt; 
 &lt;li&gt;replaces the original &lt;code&gt;template&lt;/code&gt; with the &lt;code&gt;div&lt;/code&gt; that contains the same stuff (except in a shadow root)&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p&gt;Almost any HTML content--including &lt;code&gt;style&lt;/code&gt;-- is legal inside a &lt;code&gt;template&lt;/code&gt;.&lt;/p&gt; 
&lt;p&gt;Tested with the latest Chrome/Firefox/Edge. Send me a free MacBook Pro and I'll test it with Safari! :-)&lt;/p&gt;&lt;p&gt;ReferenceURL : &lt;a href='https://stackoverflow.com/questions/2830296/using-style-tags-in-the-body-with-other-html' target='_blank'&gt;https://stackoverflow.com/questions/2830296/using-style-tags-in-the-body-with-other-html&lt;/a&gt;&lt;/p&gt;&lt;/style&gt;&lt;/h2&gt;</description>
      <category>programing</category>
      <category>CSS</category>
      <author>oldcodes</author>
      <guid isPermaLink="true">https://oldcodes.tistory.com/711</guid>
      <comments>https://oldcodes.tistory.com/711#entry711comment</comments>
      <pubDate>Sun, 5 Nov 2023 14:58:03 +0900</pubDate>
    </item>
    <item>
      <title>Powershell의 Invoke-Command로 호출된 스크립트 블록의 반환 값을 캡처하는 방법</title>
      <link>https://oldcodes.tistory.com/710</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Powershell의 Invoke-Command로 호출된 스크립트 블록의 반환 값을 캡처하는 방법&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Invoke-Command를 사용하여 ScriptBlock의 반환 코드를 캡처하려는 것을 제외하고는 이 &lt;a href=&quot;https://stackoverflow.com/questions/1210942/catching-return-code-of-a-command-with-invoke-command-powershell-2&quot;&gt;질문&lt;/a&gt;과 매우 유사합니다(따라서 -FilePath 옵션을 사용할 수 없습니다).&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제 암호는 이렇습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Invoke-Command -computername $server {\\fileserver\script.cmd $args} -ArgumentList $args
exit $LASTEXITCODE
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;문제는 Invoke-Command가 script.cmd의 return code를 캡처하지 않아 실패 여부를 알 방법이 없다는 것입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;script.cmd가 실패했는지 알 수 있어야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;(원격 서버에서 script.cmd의 반환 코드를 볼 수 있게 해주는) New-PS 세션도 사용하려고 했지만 실제로 실패에 대해 아무것도 할 수 있는 방법을 파워셸 스크립트에 다시 전달할 수 없습니다.&lt;/font&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;$remotesession = new-pssession -computername localhost
invoke-command -ScriptBlock { cmd /c exit 2} -Session $remotesession
$remotelastexitcode = invoke-command -ScriptBlock { $lastexitcode} -Session $remotesession
$remotelastexitcode # will return 2 in this example
&lt;/code&gt;&lt;/pre&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;translated&quot;&gt;이 세션에서 마지막 종료 코드 가져오기&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt;&lt;pre&gt;&lt;code&gt;$script = {
    # Call exe and combine all output streams so nothing is missed
    $output = ping badhostname *&amp;gt;&amp;amp;1

    # Save lastexitcode right after call to exe completes
    $exitCode = $LASTEXITCODE

    # Return the output and the exitcode using a hashtable
    New-Object -TypeName PSCustomObject -Property @{Host=$env:computername; Output=$output; ExitCode=$exitCode}
}

# Capture the results from the remote computers
$results = Invoke-Command -ComputerName host1, host2 -ScriptBlock $script

$results | select Host, Output, ExitCode | Format-List
&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;호스트 : HOST1&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;출력: ping 요청에서 호스트의 잘못된 호스트 이름을 찾을 수 없습니다.&lt;/font&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;종료 코드 : 1&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;호스트 : HOST2&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;출력: ping 요청에서 호스트의 잘못된 호스트 이름을 찾을 수 없습니다.&lt;/font&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;종료 코드 : 1&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;원격 컴퓨터에서 실행되는 스크립트에서 나오는 다양한 출력은 배열입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$result = Invoke-Command -ComputerName SERVER01 -ScriptBlock {
   ping BADHOSTNAME
   $lastexitcode
}

exit $result | Select-Object -Last 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;$result&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;변수에는 ping 출력 메시지의 배열과&lt;/font&gt;&lt;/font&gt;&lt;code&gt;$lastexitcode&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;br&gt; &lt;code&gt;$result | Select-Object -First $(result.Count-1)&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;@jon Z의 대답은 좋지만, 이것은 더 간단합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$remotelastexitcode = invoke-command -computername localhost -ScriptBlock {
    cmd /c exit 2; $lastexitcode}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;물론 명령어가 출력을 생성하면 이를 억제하거나 구문 분석하여 종료 코드를 얻어야 하며, 이 경우 @jon Z의 대답이 더 나을 수 있습니다.&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;return&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;exit&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;$result = Invoke-Command -ComputerName SERVER01 -ScriptBlock {
   return &quot;SERVER01&quot;
}

$result
&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/8549184/how-to-capture-the-return-value-of-a-scriptblock-invoked-with-powershells-invok&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>PowerShell</category>
      <author>oldcodes</author>
      <guid isPermaLink="true">https://oldcodes.tistory.com/710</guid>
      <comments>https://oldcodes.tistory.com/710#entry710comment</comments>
      <pubDate>Sun, 5 Nov 2023 14:57:57 +0900</pubDate>
    </item>
    <item>
      <title>페이지의 사용자 지정 포스트 루프에 페이지 추가</title>
      <link>https://oldcodes.tistory.com/709</link>
      <description>&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;translated&quot;&gt;사용자 지정 페이지 템플릿(testimonals-page.php)을 작성했으며 해당 템플릿에서 다음 루프를 사용하여 사용자 지정 게시 유형 'testimonals'를 로드하고 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;?php query_posts(array(
'posts_per_page' =&amp;gt; 5,
'post_type' =&amp;gt; 'testimonials',
    'orderby' =&amp;gt; 'post_date',
    'paged' =&amp;gt; $paged
 )
 ); ?&amp;gt;

  &amp;lt;?php if ( have_posts() ) while ( have_posts() ) : the_post(); ?&amp;gt;

    &amp;lt;div id=&quot;post-&amp;lt;?php the_ID(); ?&amp;gt;&quot; class=&quot;quote&quot;&amp;gt;
    &amp;lt;?php echo get_the_post_thumbnail($id, array($image_width,$image_height)); ?&amp;gt;
    &amp;lt;?php the_content(); ?&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;?php endwhile; ?&amp;gt;
    &amp;lt;?php wp_reset_query(); ?&amp;gt;
&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;WP 페이징 플러그인을 설치했는데, 이 플러그인은 다음을 사용하여 페이지를 category.php로 호출하면 잘 작동합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;p&amp;gt;&amp;lt;?php wp_paging(); ?&amp;gt;&amp;lt;/p&amp;gt;
&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는 포맷이 깨지고 나에게 404를 링크합니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;첫째, 기본 Wordpress Loop을 수정하려는 경우가 아니라면 query_posts를 절대 사용하지 마십시오.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;대신 &lt;a href=&quot;http://codex.wordpress.org/Class_Reference/WP_Query&quot; rel=&quot;noreferrer&quot;&gt;WP 쿼리&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;/p&gt; 
&lt;pre&gt;&lt;code&gt;global $paged;
$curpage = $paged ? $paged : 1;
$args = array(
    'post_type' =&amp;gt; 'testimonials',
    'orderby' =&amp;gt; 'post_date',
    'posts_per_page' =&amp;gt; 5,
    'paged' =&amp;gt; $paged
);
$query = new WP_Query($args);
if($query-&amp;gt;have_posts()) : while ($query-&amp;gt;have_posts()) : $query-&amp;gt;the_post();
?&amp;gt;
&amp;lt;div id=&quot;post-&amp;lt;?php the_ID(); ?&amp;gt;&quot; class=&quot;quote&quot;&amp;gt;
&amp;lt;?php
echo get_the_post_thumbnail($post-&amp;gt;ID, array($image_width,$image_height));
the_content();
?&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;?php
endwhile;
    echo '
    &amp;lt;div id=&quot;wp_pagination&quot;&amp;gt;
        &amp;lt;a class=&quot;first page button&quot; href=&quot;'.get_pagenum_link(1).'&quot;&amp;gt;&amp;amp;laquo;&amp;lt;/a&amp;gt;
        &amp;lt;a class=&quot;previous page button&quot; href=&quot;'.get_pagenum_link(($curpage-1 &amp;gt; 0 ? $curpage-1 : 1)).'&quot;&amp;gt;&amp;amp;lsaquo;&amp;lt;/a&amp;gt;';
        for($i=1;$i&amp;lt;=$query-&amp;gt;max_num_pages;$i++)
            echo '&amp;lt;a class=&quot;'.($i == $curpage ? 'active ' : '').'page button&quot; href=&quot;'.get_pagenum_link($i).'&quot;&amp;gt;'.$i.'&amp;lt;/a&amp;gt;';
        echo '
        &amp;lt;a class=&quot;next page button&quot; href=&quot;'.get_pagenum_link(($curpage+1 &amp;lt;= $query-&amp;gt;max_num_pages ? $curpage+1 : $query-&amp;gt;max_num_pages)).'&quot;&amp;gt;&amp;amp;rsaquo;&amp;lt;/a&amp;gt;
        &amp;lt;a class=&quot;last page button&quot; href=&quot;'.get_pagenum_link($query-&amp;gt;max_num_pages).'&quot;&amp;gt;&amp;amp;raquo;&amp;lt;/a&amp;gt;
    &amp;lt;/div&amp;gt;
    ';
    wp_reset_postdata();
endif;
?&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;2018년 1월 편집:&lt;/font&gt;&lt;/h2&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;또한 Wordpress에 내장되어 있고 보다 강력한 옵션과 기능을 갖추고 있으므로 &lt;a href=&quot;https://codex.wordpress.org/Function_Reference/paginate_links&quot; rel=&quot;noreferrer&quot;&gt;paginate_links&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;pre&gt;&lt;code&gt;&amp;lt;?php
if ( get_query_var('paged') ) {
    $paged = get_query_var('paged');
} elseif ( get_query_var('page') ) { // 'page' is used instead of 'paged' on Static Front Page
    $paged = get_query_var('page');
} else {
    $paged = 1;
}

$custom_query_args = array(
    'post_type' =&amp;gt; 'post', 
    'posts_per_page' =&amp;gt; get_option('posts_per_page'),
    'paged' =&amp;gt; $paged,
    'post_status' =&amp;gt; 'publish',
    'ignore_sticky_posts' =&amp;gt; true,
    //'category_name' =&amp;gt; 'custom-cat',
    'order' =&amp;gt; 'DESC', // 'ASC'
    'orderby' =&amp;gt; 'date' // modified | title | name | ID | rand
);
$custom_query = new WP_Query( $custom_query_args );

if ( $custom_query-&amp;gt;have_posts() ) :
    while( $custom_query-&amp;gt;have_posts() ) : $custom_query-&amp;gt;the_post(); ?&amp;gt;

        &amp;lt;article &amp;lt;?php post_class(); ?&amp;gt;&amp;gt;
            &amp;lt;h3&amp;gt;&amp;lt;a href=&quot;&amp;lt;?php the_permalink(); ?&amp;gt;&quot;&amp;gt;&amp;lt;?php the_title(); ?&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/h3&amp;gt;
            &amp;lt;small&amp;gt;&amp;lt;?php the_time('F jS, Y') ?&amp;gt; by &amp;lt;?php the_author_posts_link() ?&amp;gt;&amp;lt;/small&amp;gt;
            &amp;lt;div&amp;gt;&amp;lt;?php the_excerpt(); ?&amp;gt;&amp;lt;/div&amp;gt;
        &amp;lt;/article&amp;gt;

    &amp;lt;?php
    endwhile;
    ?&amp;gt;

    &amp;lt;?php if ($custom_query-&amp;gt;max_num_pages &amp;gt; 1) : // custom pagination  ?&amp;gt;
        &amp;lt;?php
        $orig_query = $wp_query; // fix for pagination to work
        $wp_query = $custom_query;
        ?&amp;gt;
        &amp;lt;nav class=&quot;prev-next-posts&quot;&amp;gt;
            &amp;lt;div class=&quot;prev-posts-link&quot;&amp;gt;
                &amp;lt;?php echo get_next_posts_link( 'Older Entries', $custom_query-&amp;gt;max_num_pages ); ?&amp;gt;
            &amp;lt;/div&amp;gt;
            &amp;lt;div class=&quot;next-posts-link&quot;&amp;gt;
                &amp;lt;?php echo get_previous_posts_link( 'Newer Entries' ); ?&amp;gt;
            &amp;lt;/div&amp;gt;
        &amp;lt;/nav&amp;gt;
        &amp;lt;?php
        $wp_query = $orig_query; // fix for pagination to work
        ?&amp;gt;
    &amp;lt;?php endif; ?&amp;gt;

&amp;lt;?php
    wp_reset_postdata(); // reset the query 
else:
    echo '&amp;lt;p&amp;gt;'.__('Sorry, no posts matched your criteria.').'&amp;lt;/p&amp;gt;';
endif;
?&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;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;http://web-profile.com.ua/wordpress/themes/wordpress-custom-loop/&quot; rel=&quot;nofollow&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;페이지 표시가 있는 WordPress 사용자 지정 루프&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/11638909/adding-pagination-to-custom-post-loop-in-page&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>Wordpress</category>
      <author>oldcodes</author>
      <guid isPermaLink="true">https://oldcodes.tistory.com/709</guid>
      <comments>https://oldcodes.tistory.com/709#entry709comment</comments>
      <pubDate>Sun, 5 Nov 2023 14:57:50 +0900</pubDate>
    </item>
    <item>
      <title>MySQL 커넥터 및 서버 호환성(VERSION.server 파일)</title>
      <link>https://oldcodes.tistory.com/708</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;MySQL 커넥터 및 서버 호환성(VERSION.server 파일)&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 &lt;a href=&quot;http://dev.mysql.com/get/Downloads/Connector-C/mysql-connector-c-6.1.3-src.tar.gz'&quot; rel=&quot;nofollow&quot;&gt;mysql-connector-c-1.3&lt;/a&gt;을 기반으로 한 간단한 mysql 클라이언트 작업을 하고 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;모든 것이 잘 작동하지만 다음과 같은 경고가 표시됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Warning: MySQL client build with 5.7.4-m14 but loading MySQL 6.1.3
&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;출처를 조사해보니 mysql-connector-c가 모두&lt;/font&gt;&lt;/font&gt;&lt;code&gt;VERSION&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;VERSION.server&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;VERSION.server&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;또한 mysql은 네트워크를 통해서만 연결되므로 클라이언트와 서버 버전이 정확히 일치할 필요가 없다는 인상을 받았습니다.&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_version.cmake&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;GET_MYSQL_VERSION(VERSION.server)
SET(SERVER_VERSION ${VERSION})
SET(SERVER_VERSION_ID ${MYSQL_VERSION_ID})

# Get Connector/C version and other interesting variables
GET_MYSQL_VERSION()

MESSAGE(STATUS &quot;LibMySQL ${VERSION}&quot;)
MESSAGE(STATUS &quot;Built from MySQL ${SERVER_VERSION} sources&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;VERSION.server&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;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/27584360/mysql-connector-and-server-compatibility-version-server-file&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>MariaDB</category>
      <author>oldcodes</author>
      <guid isPermaLink="true">https://oldcodes.tistory.com/708</guid>
      <comments>https://oldcodes.tistory.com/708#entry708comment</comments>
      <pubDate>Sun, 5 Nov 2023 14:57:42 +0900</pubDate>
    </item>
    <item>
      <title>지정한 열 하나를 제외한 모든 열의 DataFrame 검색</title>
      <link>https://oldcodes.tistory.com/707</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;지정한 열 하나를 제외한 모든 열의 DataFrame 검색&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/29763620/how-to-select-all-columns-except-one-in-pandas&quot; dir=&quot;ltr&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;팬더에서 하나를 제외한 모든 열을 선택하는 방법은?&lt;/font&gt;&lt;/a&gt; 
    &lt;span class=&quot;question-originals-answer-count&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;(14개 답변)&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;2018-11-17 19:24:49Z&quot; papago-attr-id=&quot;1&quot;&gt;4년 전&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;팬더 DataFrame 개체에서 하나의 열을 제외한 모든 열을 선택할 수 있는 방법이 있습니까?&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;drop&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;df.drop(column_name, axis=1)
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;df.loc[:, df.columns != col]
&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;col&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;collist = ['col1', 'col2', 'col3']
df1 = df[collist]
&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;collist = df.columns.tolist()
# you can now select from this list any arbritrary range
df1 = df[collist[0:1]]
# or remove a column
collist.remove('col2')
# now select
df1 = df[collist]
# df1 will now only have 'col1' and 'col3'
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;df[ df.columns[df.columns!='not_this_column'] ]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;numpy를 사용하여 마스크를 만들 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;import numpy as np
columns = df.columns
mask = np.ones(columns.shape, dtype=bool)
i = 4 #The specified column that you don't want to show
mask[i] = 0
df[columns[mask]]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;옵션처럼 목록 이해 및 df.loc 메서드를 사용하여 하나(또는 다수)를 제외한 모든 열을 선택할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;select = [x for x in df.columns if x != &quot;column_you_don't_want&quot;]
df.loc[:, select]
&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;columns_dont_want = [&quot;col1&quot;, &quot;col2&quot;]
select = [x for x in df.columns if x not in columns_dont_want]
df.loc[:, select]
&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/20230326/retrieve-dataframe-of-all-but-one-specified-column&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>dataframe</category>
      <author>oldcodes</author>
      <guid isPermaLink="true">https://oldcodes.tistory.com/707</guid>
      <comments>https://oldcodes.tistory.com/707#entry707comment</comments>
      <pubDate>Sun, 5 Nov 2023 14:57:36 +0900</pubDate>
    </item>
    <item>
      <title>openshift는 wp-admin을 https로 리디렉션합니다.</title>
      <link>https://oldcodes.tistory.com/706</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;openshift는 wp-admin을 https로 리디렉션합니다.&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;워드프레스의 일반 옵션에서 워드프레스 디렉토리를 on으로 변경하였습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;http://mywebsite.com&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;wordpress dashboard가 여전히 httpps에 있기 때문에 혼합 콘텐츠 경고가 발생하고 파이어폭스에서 혼합 콘텐츠 필터를 사용하지 않도록 설정한 후에도 대시보드의 이미지가 표시되지 않습니다.&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;.htaccess&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;Options +FollowSymlinks

&amp;lt;IfModule mod_rewrite.c&amp;gt;
    RewriteEngine On

    RewriteCond %{SERVER_PORT} ^443$
    RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1 [R=301,L]

    # BEGIN WordPress
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.php [L]
    # END WordPress
&amp;lt;/IfModule&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;wp-config.php 파일에는 https를 통해 모든 관리 트래픽을 지시하는 설정이 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;관리자 패널이 올바르게 작동하려면 해당 옵션을 비활성화해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;FORCE_SSL_ADMIN&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;define('FORCE_SSL_ADMIN', false);
&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;관련 WordPress Codex 페이지 참조:&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;http://codex.wordpress.org/Administration_Over_SSL&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;http://codex.wordpress.org/Administration_Over_SSL&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;http://codex.wordpress.org/Function_Reference/force_ssl_admin&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;http://codex.wordpress.org/Function_Reference/force_ssl_admin&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/22685369/openshift-redirects-wp-admin-to-https&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>Wordpress</category>
      <author>oldcodes</author>
      <guid isPermaLink="true">https://oldcodes.tistory.com/706</guid>
      <comments>https://oldcodes.tistory.com/706#entry706comment</comments>
      <pubDate>Sun, 5 Nov 2023 14:57:30 +0900</pubDate>
    </item>
    <item>
      <title>디브 풀스크린은 어떻게 만드나요?</title>
      <link>https://oldcodes.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;디브 풀스크린은 어떻게 만드나요?&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://people.iola.dk/olau/flot/examples/&quot; papago-id=&quot;1-1&quot; rel=&quot;noreferrer&quot;&gt;Flot&lt;/a&gt;을 사용하여 데이터의 일부를 그래프로 표시하고 있는데 버튼을 클릭하면 이 그래프가 전체 화면(모니터의 공간을 모두 차지함)으로 표시되면 좋을 것 같습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;지금 제가.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;div&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;&amp;lt;div id=&quot;placeholder&quot; style=&quot;width:800px;height:600px&quot;&amp;gt;&amp;lt;/div&amp;gt;
&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 class=&quot;papago-parent&quot;&gt;제가 이거를 옮겨보겠습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;CSS&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;이 디브를 전체 화면으로 만들고 모든 이벤트 처리를 여전히 보존할 수 있는 방법이 있습니까?&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;HTML5 Fullscreen API를 사용하시면 됩니다. (제가 생각하는 가장 적합한 방법입니다.)&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;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&gt;&lt;/p&gt;
&lt;div class=&quot;snippet&quot; data-lang=&quot;js&quot; data-hide=&quot;false&quot; data-console=&quot;false&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;$('#toggle_fullscreen').on('click', function(){
  // if already full screen; exit
  // else go fullscreen
  if (document.fullscreenElement) {
    document.exitFullscreen();
  } else {
    $('#container').get(0).requestFullscreen();
  }
});&lt;/code&gt;&lt;/pre&gt; 
  &lt;pre class=&quot;snippet-code-css lang-css prettyprint-override&quot;&gt;&lt;code&gt;#container{
  border:1px solid red;
  border-radius: .5em;
  padding:10px;
}&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://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;div id=&quot;container&quot;&amp;gt;
  &amp;lt;p&amp;gt;
    &amp;lt;a href=&quot;#&quot; id=&quot;toggle_fullscreen&quot;&amp;gt;Toggle Fullscreen&amp;lt;/a&amp;gt;
  &amp;lt;/p&amp;gt;
  I will be fullscreen, yay!
&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 papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Chrome용 Fullscreen API는 안전하지 않은 페이지에서는 작동하지 않습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;자세한 내용은 https://sites.google.com/a/chromium.org/dev/Home/chromium-security/deprecating-powerful-features-on-insecure-origins 을 참조하십시오.&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;또 하나 주목할 점은 :fullscreen CSS 셀렉터입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;모든 CSS 셀렉터에 이를 추가하여 해당 요소가 전체 화면일 때 규칙이 적용되도록 할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#container:fullscreen {
    width: 100vw;
    height: 100vh;
    }
&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;&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;사용자를 전체 화면으로 강제 입력할 수 없습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;F11&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;; 하지만, 당신은 다음 CSS를 사용하여 당신의 div 전체화면을 만들 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;div {width: 100%; height: 100%;}
&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;&amp;lt;body&amp;gt;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;tag. 그렇지 않으면 위 코드 외에 아래 코드를 추가해야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;div {position: absolute; top: 0; left: 0;}
&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;CSS 방식:&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-css prettyprint-override&quot;&gt;&lt;code&gt;#foo {
   position: absolute;
   top: 0;
   right: 0;
   bottom: 0;
   left: 0;
}
&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;JS 방식:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$(function() {
    function abso() {
        $('#foo').css({
            position: 'absolute',
            width: $(window).width(),
            height: $(window).height()
        });
    }

    $(window).resize(function() {
        abso();         
    });

    abso();
});
&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;div#placeholder {
    height: 100vh;
}
&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;주목할 만한 유일한 예외는 4.3 이하의 Android이지만, 종종 시스템 브라우저/웹뷰 요소에서만 가능합니다(Chrome은 정상 작동합니다).&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;브라우저 지원 차트: http://caniuse.com/viewport-units&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;모니터 전체화면은 HTML5 전체화면 API를 이용하시기 바랍니다.&lt;/font&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;.widget-HomePageSlider .slider-loader-hide {
    position: fixed;
    top: 0px;
    left: 0px;
    width: 100%;
    height: 100%;
    z-index: 10000;
    background: white;
}
&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;FullScreen API를 이렇게 사용할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;function toggleFullscreen() {
  let elem = document.querySelector('#demo-video');

  if (!document.fullscreenElement) {
    elem.requestFullscreen().catch(err =&amp;gt; {
      alert(`Error attempting to enable full-screen mode: ${err.message} (${err.name})`);
    });
  } else {
    document.exitFullscreen();
  }
}
&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;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;const elem = document.querySelector('#park-pic');

elem.addEventListener(&quot;click&quot;, function(e) {
  toggleFullScreen();
}, false);

function toggleFullScreen() {

  if (!document.fullscreenElement) {
    elem.requestFullscreen().catch(err =&amp;gt; {
      alert(`Error attempting to enable full-screen mode: ${err.message} (${err.name})`);
    });
  } else {
    document.exitFullscreen();
  }
}&lt;/code&gt;&lt;/pre&gt; 
  &lt;pre class=&quot;snippet-code-css lang-css prettyprint-override&quot;&gt;&lt;code&gt;#container{
  border:1px solid #aaa;
  padding:10px;
}
#park-pic {
  width: 100%;
  max-height: 70vh;
}&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 id=&quot;container&quot;&amp;gt;
  &amp;lt;p&amp;gt;
    &amp;lt;a href=&quot;#&quot; id=&quot;toggle-fullscreen&quot;&amp;gt;Toggle Fullscreen&amp;lt;/a&amp;gt;
  &amp;lt;/p&amp;gt;
  &amp;lt;img id=&quot;park-pic&quot;
      src=&quot;https://storage.coverr.co/posters/Skate-park&quot;&amp;gt;&amp;lt;/video&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 papago-id=&quot;23&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;추신: 요즘 &lt;a href=&quot;https://github.com/sindresorhus/screenfull.js&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;23-1&quot;&gt;screenfull.js&lt;/a&gt;를 사용하고 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;자바스크립트 전체화면 API의 크로스 브라우저 사용을 위한 간단한 래퍼입니다.&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;/p&gt; 
&lt;pre class=&quot;lang-css prettyprint-override&quot;&gt;&lt;code&gt;#divid {
   position: fixed;
   top: 0;
   right: 0;
   bottom: 0;
   left: 0;
}
&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;&amp;lt;div id=&quot;placeholder&quot; style=&quot;width:auto;height:auto&quot;&amp;gt;&amp;lt;/div&amp;gt;
&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;/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;/p&gt; 
&lt;p papago-id=&quot;29&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;클릭하면 jquery로 사용할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$(&quot;#placeholder&quot;).css(&quot;width&quot;, $(window).width());
$(&quot;#placeholder&quot;).css(&quot;height&quot;, $(window).height());
&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 papago-id=&quot;31&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;CSS 부분&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#foo {
    position:absolute;
    top:0;
    left:0;
}
&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;J쿼리 부분&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$(document).ready(function() {
   $('#foo').css({
       width: $(document).width(),
       height: $(document).height()
   });
});
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;&amp;lt;div id=&quot;placeholder&quot; style=&quot;position:absolute; top:0; right:0; bottom:0; left:0;&quot;&amp;gt;&amp;lt;/div&amp;gt;
&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;부트스트랩 5.0을 사용하면 이제 이 작업이 엄청나게 쉽습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 클래스를 전체 화면 요소로 설정하거나 해제하기만 하면 됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;w-100 h-100 position-absolute top-0 start-0 bg-white
&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;URL : https://stackoverflow.com/questions/7130397/how-do-i-make-a-div-full-screen&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>JQuery</category>
      <author>oldcodes</author>
      <guid isPermaLink="true">https://oldcodes.tistory.com/705</guid>
      <comments>https://oldcodes.tistory.com/705#entry705comment</comments>
      <pubDate>Tue, 31 Oct 2023 22:41:32 +0900</pubDate>
    </item>
    <item>
      <title>jQuery 셀렉터에 의해 주문 개체가 반환됩니까?</title>
      <link>https://oldcodes.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;jQuery 셀렉터에 의해 주문 개체가 반환됩니까?&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;모든 jQuery 선택기는 개체 배열을 반환합니다.&lt;/font&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;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;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://blog.jquery.com/2009/02/20/jquery-1-3-2-released/&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;1-1&quot;&gt;jQuery 1.3.2 릴리스 노트&lt;/a&gt;에는 다음과 같이 나와 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;h3 papago-id=&quot;4&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;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이는 반환된 결과를 셀렉터가 전달된 순서가 아닌 문서 순서로 재정렬하는 jQuery의 셀렉터 엔진에 대한 변경 사항입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 변경은 Selectors API 규격(내부적으로 jQuery가 이를 지원하는 브라우저에서 사용)을 준수하기 위해 수행되었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&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;https://blog.jquery.com/2009/01/14/jquery-1-3-released/&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;6-1&quot;&gt;jQuery 1.3&lt;/a&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;&quot;a, b, c&quot; 스타일 셀렉터의 순서가 변경될 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;querySelectorAll을 지원하는 브라우저(Safari, Firefox 3.5+, Opera 10+, IE 8+)는 문서 순서대로 요소를 반환하고, 다른 브라우저는 지정된 순서대로 요소를 반환합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;1.3.2 이상 릴리스에서는 쉼표로 구분된 모든 선택기가 문서 순서로 반환됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt;&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;prevAll() 설명서와 같은 몇 가지 예외가 있을 수 있습니다.&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;DOM 요소 집합을 나타내는 jQuery 객체가 주어지면 .prevAll() 메서드는 DOM 트리에서 이러한 요소의 이전 버전을 검색하고 일치하는 요소에서 새로운 jQuery 객체를 구성합니다. 가장 &lt;strong papago-id=&quot;9-1&quot;&gt;가까운 형제로 시작하는 순서대로 요소가 반환&lt;/strong&gt;됩니다.&quot;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;http://api.jquery.com/prevAll/&quot; papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;http://api.jquery.com/prevAll/&lt;/font&gt;&lt;/a&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;네, 항상 DOM에 있기 때문에 순서대로 진행됩니다.&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;아마도 셀렉터가 DOM을 찾는 순서대로 선택기가 DOM을 통과하고 일치하는 요소를 찾으면 배열에 넣을 것입니다.&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;n은 숫자인 &quot;textbox_n&quot;의 ID로 텍스트 상자를 5개 입력하면 테스트를 수행할 수 있습니다. 그런 다음 목록에 알림을 보내고 무엇을 얻는지 확인할 수 있습니까?&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/1636201/is-the-order-objects-are-return-by-a-jquery-selector-specified&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>JQuery</category>
      <author>oldcodes</author>
      <guid isPermaLink="true">https://oldcodes.tistory.com/704</guid>
      <comments>https://oldcodes.tistory.com/704#entry704comment</comments>
      <pubDate>Tue, 31 Oct 2023 22:41:23 +0900</pubDate>
    </item>
    <item>
      <title>웹사이트에서 워드프레스 쿠키를 읽는 방법은?</title>
      <link>https://oldcodes.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;웹사이트에서 워드프레스 쿠키를 읽는 방법은?&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;사용자 레벨 등 쿠키의 추가 파라미터를 설정할 수 있습니까?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;제 웹사이트는 php로 되어있습니다.&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;&amp;lt;?php 
define('WP_USE_THEMES', false);
require('./blog/wp-blog-header.php');
?&amp;gt;
&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;...블로그를 assuming합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;./blog/&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;/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;코드에 있는 모든 워드 프레스 기능에 액세스할 수 있습니다.&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;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;if (is_user_logged_in()) { ... } 
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;a href=&quot;http://codex.wordpress.org/Function_Reference/is_user_logged_in&quot; rel=&quot;nofollow&quot; papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;코덱스 : is_user_logged_in()&lt;/font&gt;&lt;/a&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&gt;&lt;code&gt;&amp;lt;a href=&quot;&amp;lt;?php bloginfo(&quot;url&quot;); ?&amp;gt;/wp-login.php?action=logout/&quot;&amp;gt;Logout&amp;lt;/a&amp;gt;
&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;wp-config.php&lt;/code&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;define('COOKIE_DOMAIN', '.domain.com'); // Share cookie on all subdomains
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2&gt;&lt;strong papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;편집&lt;/font&gt;&lt;/strong&gt;&lt;/h2&gt; 
&lt;p papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;꼭 쿠키라는 단어만 읽고 싶다면 (성능에 좋은 선택) : 쿠키 이름은 일정한 AUTH_COOKIE에 저장됩니다.&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;AUTH_COOKIE 정의:&lt;/font&gt;&lt;/font&gt;&lt;code&gt;/wp-includes/default-constants.php -&amp;gt; line 171&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;pre&gt;&lt;code&gt;&quot;wordpress_&quot; + md5( get_site_option(siteurl) )
&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;AUTH_COOKIE를 검색하거나 다시 계산한 다음 $_COOK을 읽어야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;IE[AUTH_COOKIE].&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;wp_parse_auth_cookie()&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;wp-includes/pluggable.php @line 585&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;17&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(indeed 형식은 간단합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;user|expiration|hmac&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;|&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;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;php&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;function set_newuser_cookie() {
    if (!isset($_COOKIE['sitename_newvisitor'])) {
        setcookie('sitename_newvisitor', 1, time()+1209600, COOKIEPATH, COOKIE_DOMAIN, false);
    }
}
add_action( 'init', 'set_newuser_cookie');
&lt;/code&gt;&lt;/pre&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&gt;&lt;/font&gt;&lt;code&gt;setcookie('sitename_newvisitor', 1, time()+1209600, COOKIEPATH, COOKIE_DOMAIN, false);&lt;/code&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;pre&gt;&lt;code&gt;if (isset($_COOKIE['sitename_newvisitor'])) {
     echo 'Welcome back!';
}
else {
     echo 'Hello new visitor!';
}
&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;strong papago-id=&quot;23-0&quot;&gt;참고&lt;/strong&gt;: 쿠키명 'sitname_newvisitor', 값, 타임아웃, COOKIETPATH, COOKIET_DOMAIN을 필요에 맞게 변경할 수 있습니다.&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/9350265/how-to-read-wordpress-cookies-in-my-website&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>Wordpress</category>
      <author>oldcodes</author>
      <guid isPermaLink="true">https://oldcodes.tistory.com/703</guid>
      <comments>https://oldcodes.tistory.com/703#entry703comment</comments>
      <pubDate>Tue, 31 Oct 2023 22:41:17 +0900</pubDate>
    </item>
    <item>
      <title>ReferenceError: 주입이 정의되지 않았습니다.</title>
      <link>https://oldcodes.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;ReferenceError: 주입이 정의되지 않았습니다.&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;SpecRunner HTML 파일을 실행하면 이 오류가 발생합니다.&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;angular-mocks.js&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;제 경우에는 그것이 참조되고 있습니다.&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;SpecRunner.html:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;  &amp;lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;lib/jasmine-1.3.1/jasmine.css&quot;&amp;gt;
  &amp;lt;script type=&quot;text/javascript&quot; src=&quot;lib/jasmine-1.3.1/jasmine.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
  &amp;lt;script type=&quot;text/javascript&quot; src=&quot;lib/jasmine-1.3.1/jasmine-html.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
  &amp;lt;script type=&quot;text/javascript&quot; src=&quot;lib/angular-mocks.js&quot;&amp;gt;&amp;lt;/script&amp;gt;

  &amp;lt;!-- include source files here... --&amp;gt;
  &amp;lt;script type=&quot;text/javascript&quot; src=&quot;../main/static/js/controllers/norm-definitions-controller.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&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;/font&gt;&lt;/font&gt;&lt;code&gt;ReferenceError: inject is not defined&lt;/code&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;angular-mocks.js&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;참조되었으며 Firebug를 사용하는 것으로 볼 수 있기 때문에 캐싱 문제가 아닙니다.&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;들여다보기&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;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;전체적인 참조가 보입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;angular.mock.inject = function() { ... }&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;ReferenceError: angular is not defined&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&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;angular.js&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;13&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;lib. 대본 중에 못 봤어요.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그것은 전에 있어야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;angular-mock.js&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;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;ul&gt; 
 &lt;li papago-id=&quot;16&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;당신의 angular.js 파일과 angular-mocks js 파일은 모두 같은 버전입니다.&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;재스민 버전은 angularjs 버전과 호환됩니다. 구문 오류가 없는지 확인하려면 재스민 공식 사이트를 참조하십시오.&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;단위 시험 방법론을 따르려면 각 js 공식 사이트의 시험 형성을 참조하십시오.&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;위의 단계는 대부분의 일반적인 오류를 방지하는 데 도움이 됩니다.&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/15671770/referenceerror-inject-is-not-defined&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>AngularJS</category>
      <author>oldcodes</author>
      <guid isPermaLink="true">https://oldcodes.tistory.com/702</guid>
      <comments>https://oldcodes.tistory.com/702#entry702comment</comments>
      <pubDate>Tue, 31 Oct 2023 22:41:10 +0900</pubDate>
    </item>
    <item>
      <title>각도에서 ng-bind 대 한 번 바인딩의 차이점은 무엇입니까?</title>
      <link>https://oldcodes.tistory.com/701</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;각도에서 ng-bind 대 한 번 바인딩의 차이점은 무엇입니까?&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;각도 js에서 &quot;ng-bind&quot;와 &quot;one time binding&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&gt;&lt;strong papago-id=&quot;3&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;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Angular에서 이원 데이터 바인딩&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;JS는 모델에서 뷰로 데이터를 바인딩하는 것을 의미하며, 그 반대의 경우도 마찬가지입니다(데이터는 스코프/컨트롤러에서 뷰로, 뷰에서 스코프/컨트롤러로 흐릅니다).&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;'&lt;strong papago-id=&quot;4-1&quot;&gt;ng-model&lt;/strong&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;5&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;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Angular에서 단방향 데이터 바인딩&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;JS는 모델에서 뷰로 데이터를 바인딩(범위/컨트롤러에서 뷰로 데이터 흐름)하는 것을 의미합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;'&lt;strong papago-id=&quot;6-1&quot;&gt;ng-&lt;/strong&gt;bind'는 단방향 데이터 바인딩을 달성하기 위해 사용되는 각 지시어입니다.&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;7&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;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;번&lt;/strong&gt;만 발생합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;일회성 바인딩을 사용하면 첫 번째 다이제스트 사이클에서 컨트롤러가 설정한 값에서 모델이나 뷰를 한 번 업데이트할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;AngularJS 1.3부터는 &quot;:&quot; 토큰을 사용하여 일회성 데이터 바인딩을 만들 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;값이 안정화되면 자체 $watch() 함수의 등록을 취소하는 바인딩입니다(기본적으로 값이 정의됨).&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;1회 바인딩은 페이지가 안정된 후에도 변경되지 않는 값에 사용됩니다.&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;font class=&quot;papago-parent&quot;&gt;구문은 {{::expression}}입니다.&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;/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-html lang-html prettyprint-override&quot;&gt;&lt;code&gt;&amp;lt;script src=&quot;https://ajax.googleapis.com/ajax/libs/angularjs/1.3.0/angular.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;

&amp;lt;div ng-app=&quot;myApp&quot; ng-controller=&quot;myCtrl&quot;&amp;gt;
    &amp;lt;div ng-repeat=&quot;customer in ::customers&quot; &amp;gt;
    {{::customer.name}}
    ({{customer.address}})
      &amp;lt;button ng-click=&quot;change(customer)&quot;&amp;gt;Change&amp;lt;/button&amp;gt;
     &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;

&amp;lt;script&amp;gt;
var app = angular.module('myApp', []);
app.controller('myCtrl', function($scope) {
    $scope.customers = [{
        name: 'Gloria Jane',
        address: 'Silo Park, 9300 East Orchard Road,    Greenwood Village, CO, 80114'},{
        name: 'Nicholas Michael',
        address: 'Village Park,  East Lake Avenue, Aurora, CO, 80016'
    }];
  
    $scope.change = function(customer) {
        customer.address = 'Cherry Creek State Park, 4201 S Parker Rd, Aurora, CO 80014, USA';
        customer.name ='Tessy Thomas';
    };
});
&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;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;ng-bind로 한 번 바인딩할 수도 있습니다.&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;&amp;lt;divg-bind=&quot;::상품명&quot;&amp;gt;/div&amp;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;&quot;ng-bind&quot;는 단순히 Angular의 html 속성 버전입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;JS의 정규 {{expression} 구문입니다.&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;&amp;lt;div ng-bind=&quot;productName&quot;&amp;gt;&amp;lt;/div&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 class=&quot;papago-parent&quot;&gt;와 동치입니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&amp;lt;div&amp;gt;{{productName}}&amp;lt;/div&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;&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;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;1회 바인딩은 페이지가 안정된 후에도 변경되지 않는 값에 사용됩니다.&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;/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&gt;&lt;code&gt;{{::expression}}&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;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;div&amp;gt;{{::productName}}&amp;lt;/div&amp;gt;
&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://docs.angularjs.org/guide/expression&quot; rel=&quot;noreferrer&quot; papago-id=&quot;21&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;https://docs.angularjs.org/guide/expression&lt;/font&gt;&lt;/a&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;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;일회용 데이터 바인딩&lt;/font&gt;&lt;/strong&gt;&lt;/p&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;그러한 것은 Angular가 제공하는 관례로서 실제로 존재하는 것이 아닙니다.&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;/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;strong papago-id=&quot;27-0&quot;&gt;이원 데이터 바인딩&lt;/strong&gt; - &lt;strong papago-id=&quot;27-2&quot;&gt;ng-model&lt;/strong&gt;&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 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;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;및 (HTML 에서)&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;$scope&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 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;strong papago-id=&quot;31-0&quot;&gt;단방향&lt;/strong&gt; 데이터 &lt;strong papago-id=&quot;31-0&quot;&gt;바인딩&lt;/strong&gt; - &lt;strong papago-id=&quot;31-2&quot;&gt;ng-bind&lt;/strong&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;링크만 위치&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;$scope&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;code&gt;{{}}&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;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;URL : https://stackoverflow.com/questions/33480548/what-is-the-difference-between-ng-bind-vs-one-time-binding-in-angular&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>AngularJS</category>
      <author>oldcodes</author>
      <guid isPermaLink="true">https://oldcodes.tistory.com/701</guid>
      <comments>https://oldcodes.tistory.com/701#entry701comment</comments>
      <pubDate>Tue, 31 Oct 2023 22:41:04 +0900</pubDate>
    </item>
    <item>
      <title>Angular 2 구성 요소 및 서비스에서 상수에 액세스하는 방법은 무엇입니까?</title>
      <link>https://oldcodes.tistory.com/700</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Angular 2 구성 요소 및 서비스에서 상수에 액세스하는 방법은 무엇입니까?&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;strong papago-id=&quot;1-1&quot;&gt;상수.ts&lt;/strong&gt;:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;export const C0NST = &quot;constant&quot;;
&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;strong papago-id=&quot;2-1&quot;&gt;서비스&lt;/strong&gt;로 접속합니다&lt;strong papago-id=&quot;2-1&quot;&gt;.&lt;/strong&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;2-1&quot;&gt;다음&lt;/strong&gt;과 같은 service&lt;strong papago-id=&quot;2-1&quot;&gt;.ts&lt;/strong&gt;:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;import { C0NST } from './constants';

console.log(C0NST); // &quot;constant&quot;
&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;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;some.component.ts&lt;/strong&gt;:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;import { C0NST } from './constants';
&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;strong papago-id=&quot;5-0&quot;&gt;some.component.html&lt;/strong&gt;:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;{{ C0NST }} &amp;lt;!-- Outputs nothing --&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;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;some.component.ts&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;public const constant = C0NST;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;8&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;{{ constant }} &amp;lt;!-- constant --&amp;gt;
&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 papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Angular2에서 템플릿은 구성 요소 클래스의 필드와 메서드에만 액세스할 수 있습니다.&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;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것을 우회하는 방법은 단지 상수를 참조하는 필드를 컴포넌트 내부에 두고 대신 그것을 사용하는 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;hr&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;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;Component의 템플릿에서는 Component 클래스의 속성만 사용할 수 있으므로 외부 상수(또는 외부 변수)를 직접 사용할 수 없습니다.&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;import { MY_CONSTANT } from '../constants';

@Component({
  // ...
})
export class MyTestComponent implements OnInit {

  readonly MY_CONSTANT = MY_CONSTANT;

  // ...
}
&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;MY_CONSTANT&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 class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://www.typescriptlang.org/docs/handbook/classes.html#readonly-modifier&quot; papago-id=&quot;16-1&quot; rel=&quot;noreferrer&quot;&gt;읽기&lt;/a&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;이렇게 하면 템플릿에서 다음을 사용할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;{{ MY_CONSTANT }}
&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;Angular2 템플릿 바인딩의 범위는 구성 요소 인스턴스입니다.&lt;/font&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;/p&gt; 
&lt;pre&gt;&lt;code&gt;class MyComponent {
  myConst = CONST;
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;pre&gt;&lt;code&gt;{{myConst}}
&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;h2 papago-id=&quot;21&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;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;export enum stateEnum {
  'DOING' = 0,
  'DONE',
  'FAILED'
}
&lt;/code&gt;&lt;/pre&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;component.ts&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;import { stateEnum  } from './enum'
export class EnumUserClass {
  readonly stateEnum : typeof stateEnum = stateEnum ;    
}
&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;예제에서는 enum을 사용하지만 이는 정의된 상수의 모든 유형일 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;typeof&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;연산자는 TypeScript 타이핑 기능의 모든 이점을 제공합니다.&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;strong papago-id=&quot;26&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;&amp;lt;p&amp;gt;{{stateEnum.DOING}}&amp;lt;p&amp;gt;
&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;이 솔루션은 사용하려는 각 구성 요소에서 기본적으로 데이터(또는 상수 참조)를 복제하기 때문에 메모리 사용 상황에서 효율성이 떨어집니다.&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;br&gt; &lt;code&gt;readonly constData: typeof constData = constData&lt;/code&gt;&lt;br&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;h2 papago-id=&quot;29&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;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;열거하다&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;export enum stateEnum {
  'DOING' = 0,
  'DONE',
  'FAILED'
}
&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;component.ts&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;import { stateEnum  } from './enum'
export class EnumUserClass {
  getEnumString(idx) {
    return stateEnum[stateEnum[idx]];
  }   
}
&lt;/code&gt;&lt;/pre&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;성분.&lt;/font&gt;&lt;/strong&gt; &lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;p&amp;gt;{{getEnumString(1)}}&amp;lt;/p&amp;gt;  
&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 class=&quot;papago-parent&quot;&gt;Angular team에 따르면 변경 탐지 메커니즘으로 인해 템플릿에 함수를 사용하는 것이 권장되지 않으며, 이는 함수가 값을 템플릿으로 반환할 경우 훨씬 효율적으로 작동하지 않습니다. 변경 탐지는 함수가 값을 반환한다는 것을 전혀 모르기 때문에 필요 이상으로 자주 호출됩니다(그리고 반환한다고 가정할 경우).&lt;/font&gt;&lt;/font&gt;&lt;code&gt;const&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 class=&quot;papago-parent&quot;&gt;이는 애플리케이션에 약간의 효율성 저하일 수도 있고(운이 좋으면) 기능이 다음과 같이 해결되면 완전히 고장날 수도 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Observable&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;async&lt;/code&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 class=&quot;papago-parent&quot;&gt;그것에 대한 나의 짧은 기사를 &lt;a href=&quot;https://www.linkedin.com/pulse/how-change-your-angular-app-ram-eating-beast-tomasz-budzi%C5%84ski/?lipi=urn%3Ali%3Apage%3Ad_flagship3_profile_view_base_post_details%3B0YIDka6LQ2GorUCOSW3OVA%3D%3D&quot; papago-id=&quot;37-1&quot; rel=&quot;noreferrer&quot;&gt;여기&lt;/a&gt;서 참조할 수 있습니다.&lt;/font&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;BaseComponent를 생성할 수 있으며, 이 위치에서 상수 인스턴스를 생성한 다음 FooComponent 확장 BaseComponent를 생성하고 상수를 사용할 수 있습니다.&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;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/40237561/how-to-access-a-constant-in-an-angular-2-component-and-service&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>angular</category>
      <author>oldcodes</author>
      <guid isPermaLink="true">https://oldcodes.tistory.com/700</guid>
      <comments>https://oldcodes.tistory.com/700#entry700comment</comments>
      <pubDate>Tue, 31 Oct 2023 22:40:57 +0900</pubDate>
    </item>
    <item>
      <title>WP 테마를 오차드로 변환</title>
      <link>https://oldcodes.tistory.com/699</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;WP 테마를 오차드로 변환&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;WordPress 테마를 Orchard로 변환하기 위한 지침 또는 도구는 어디서 찾을 수 있습니까?&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;워드프레스는 PHP 기반의 CMS이고 오차드는 ASP입니다.&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;/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;하지만, 저는 당신이 주로 문제의 WP 테마의 외관과 느낌에 관심이 있고, 포트 기능에 대해서는 별로 묻지 않는다는 내기를 헤지하려고 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;index.php와 single을 봅니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;기본 HTML 마크업을 찾기 위해 당신의 WP 테마에서 php.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;styles.css 또는 다른 주요 CSS 파일을 보고 기본 스타일을 찾습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그럼 &lt;a href=&quot;http://www.orchardproject.net/gallery/List/Modules/Orchard.Module.Szmyd.Frooth&quot; rel=&quot;noreferrer&quot; papago-id=&quot;4-1&quot;&gt;Frooth&lt;/a&gt;를 사용합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;GUI를 통해 레이아웃과 스타일을 쉽게 수정할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;HTML과 CSS의 기본사항을 알고 있다면 어느 정도 잘라넣기 작업이 되어야 합니다.&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;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/5694974/convert-wp-theme-to-orchard&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>Wordpress</category>
      <author>oldcodes</author>
      <guid isPermaLink="true">https://oldcodes.tistory.com/699</guid>
      <comments>https://oldcodes.tistory.com/699#entry699comment</comments>
      <pubDate>Tue, 31 Oct 2023 22:40:49 +0900</pubDate>
    </item>
    <item>
      <title>GCC가 C99에서 건설 구조물의 필드를 수정하는 것에 대해 경고할 수 있습니까?</title>
      <link>https://oldcodes.tistory.com/698</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;GCC가 C99에서 건설 구조물의 필드를 수정하는 것에 대해 경고할 수 있습니까?&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 papago-id=&quot;2&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 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;struct A
{
    char *ptrChar;
};

void f(const struct A *ptrA)
{
    ptrA-&amp;gt;ptrChar[0] = 'A'; // NOT DESIRED!!
}
&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;p papago-id=&quot;5&quot; papago-translate=&quot;translated&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 class=&quot;papago-parent&quot;&gt;나의 명령행은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;gcc -std=c99 -Wall -Wextra -pedantic test.c
&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;/p&gt; 
&lt;pre&gt;&lt;code&gt;typedef struct
{
  char *ptrChar;
} A_rw;

typedef struct
{
  const char* ptrChar;
} A_ro;


typedef union
{
  A_rw rw;
  A_ro ro;  
} A;
&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;void modify (A_rw* a)
{
  a-&amp;gt;ptrChar[0] = 'A';
}

void print (const A_ro* a)
{
  puts(a-&amp;gt;ptrChar);
}
&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;호출자 인터페이스를 예쁘게 하고 일관성을 유지하기 위해 ADT의 공용 인터페이스로 래퍼 기능을 사용할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;inline void A_modify (A* a)
{
  modify(&amp;amp;a-&amp;gt;rw);
}

inline void A_print (const A* a)
{
  print(&amp;amp;a-&amp;gt;ro);
}
&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;A&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&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;이것은 구현 대 인터페이스, 또는 &quot;정보 숨기기&quot;, 또는 오히려 숨김이 없는 ;-) 문제의 예입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;C++에서는 단순히 포인터를 비공개로 하고 적합한 퍼블릭 콘스탄트 액세스자를 정의합니다.&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;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;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;C에서 구조에 대한 포인터를 매개 변수로 사용하고 포인터를 constchar로 반환하는 함수를 정의함으로써 에뮬레이션할 수 있습니다.&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 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;this&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&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;C11을 사용하기로 결정한 경우 동일한 멤버의 상수 또는 변수 버전을 참조하는 Generic 매크로를 구현할 수 있습니다(구조에 유니언도 포함해야 함).&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이와 같은 것:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;struct A
{
    union {
        char *m_ptrChar;

        const char *m_cptrChar;
    } ;
};

#define ptrChar_m(a) _Generic(a, struct A *: a-&amp;gt;m_ptrChar,        \
                                 const struct A *: a-&amp;gt;m_cptrChar)//,  \
                                 //struct A: a.m_ptrChar,        \
                                 //const struct A: a.m_cptrChar)

void f(const struct A *ptrA)
{
    ptrChar_m(ptrA) = 'A'; // NOT DESIRED!!
}
&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;조합은 단일 구성원에 대해 2가지 해석을 생성합니다. 더&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;m_cptrChar&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;는 상수 char를 가리키는 포인터이고 그리고&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;m_ptrChar&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 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&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;ptrChar_m&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;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;이것은 C 언어의 알려진 문제이므로 피할 수 없습니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;결국 구조를 수정하는 것이 아니라 non을 통해 다른 개체를 수정하는 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;const&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;code&gt;const&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&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;일부 &quot;액세스자&quot; 기능 뒤에 정보를 숨길 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;// header
struct A;           // incomplete type
char *getPtr(struct A *);
const char *getCPtr(const struct A *);

// implementation
struct A { char *ptr };
char *getPtr(struct A *a) { return a-&amp;gt;ptr; }
const char *getCPtr(const struct A *a) { return a-&amp;gt;ptr; }
&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;struct A
{
    const char *ptrChar;
};
&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;이전 구조 정의를 그대로 유지하는 또 다른 복잡한 해결책은 동일한 멤버를 가진 새로운 구조를 정의하는 것이며, 이 구조의 관련 포인터 멤버는 다음과 같이 설정됩니다: points to const type.&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;blockquote&gt; 
 &lt;p papago-id=&quot;27&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;GCC가 C99에서 건설 구조물의 필드를 수정하는 것에 대해 경고할 수 있습니까?&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&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;p papago-id=&quot;29&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;구조 A의 값에는 비구분 문자에 대한 포인터가 포함되어 있습니다. ptrA는 구조 A에 대한 포인터입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;따라서 *ptrA에서는 구조 A 값을 변경할 수 없습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;따라서 포인터를 문자(*ptrA)로 변경할 수 없습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;Characa ptrA-&amp;gt; ptrChar.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 ptrA-&amp;gt;ptrChar가 가리키는 곳의 값, 즉 *(ptrA-&amp;gt;Char)의 값을 ptrA-&amp;gt;Char[0]로 변경하는 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;여기서 유일한 상수는 구조 A뿐이고 구조 A를 변경하지 않을 것인데 정확히 &quot;원하지 않는&quot; 것은 무엇입니까?&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;구조 A의 Char 필드가 가리키는 값(구조 A를 통해)에 변경을 허용하지 않으려면 다음을 사용합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;struct A
{
    const char *ptrChar; // or char const *ptrChar;
};
&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;em papago-id=&quot;31-1&quot;&gt;생각&lt;/em&gt;하는 당신이 inf에서 하고 있는 것은&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;void f(const struct A *ptrA)
{
    const char c = 'A';
    ptrA-&amp;gt;ptrChar = &amp;amp;c;
}
&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;p papago-id=&quot;33&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/35646493/can-gcc-warn-me-about-modifying-the-fields-of-a-const-struct-in-c99&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>c</category>
      <author>oldcodes</author>
      <guid isPermaLink="true">https://oldcodes.tistory.com/698</guid>
      <comments>https://oldcodes.tistory.com/698#entry698comment</comments>
      <pubDate>Tue, 31 Oct 2023 22:40:43 +0900</pubDate>
    </item>
    <item>
      <title>헤드리스 워드프레스(headless wordPress) - 후방 및 전방의 Gutenberg 스타일</title>
      <link>https://oldcodes.tistory.com/697</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;헤드리스 워드프레스(headless wordPress) - 후방 및 전방의 Gutenberg 스타일&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 papago-id=&quot;2&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 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;저는 jSON에서 html 스타일을 받을 수 있습니다.&lt;/font&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;하지만 구텐베르크를 위한 CSS를 어디에 두어야 백엔드와 프론트엔드의 구텐베르크 편집기에서도 작동할 수 있을까요?&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;나의 json 예:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&quot;content&quot;: {
&quot;rendered&quot;: &quot;\n&amp;lt;p class=\&quot;has-text-color has-accent-color\&quot;&amp;gt;Some Random lorem ipsum in a paragraph&amp;lt;/p&amp;gt;\n\n\n\n&amp;lt;figure class=\&quot;wp-block-image size-large\&quot;&amp;gt;&amp;lt;img src=\&quot;http://bw.dev.local/wp-content/uploads/2020/05/Toronto.jpg\&quot; alt=\&quot;\&quot; class=\&quot;wp-image-13\&quot; srcset=\&quot;http://bw.dev.local/wp-content/uploads/2020/05/Toronto-1024x288.jpg 1024w, http://bw.dev.local/wp-content/uploads/2020/05/Toronto-300x84.jpg 300w, http://bw.dev.local/wp-content/uploads/2020/05/Toronto-768x216.jpg 768w, http://bw.dev.local/wp-content/uploads/2020/05/Toronto-1536x432.jpg 1536w, http://bw.dev.local/wp-content/uploads/2020/05/Toronto-1200x338.jpg 1200w, http://bw.dev.local/wp-content/uploads/2020/05/Toronto.jpg 1920w\&quot; sizes=\&quot;(max-width: 1024px) 100vw, 1024px\&quot; /&amp;gt;&amp;lt;/figure&amp;gt;\n&quot;,
&quot;protected&quot;: false
},
&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;has-text-color&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;has-accent-color&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;등 JSON과 수업을 하는데 앞과 뒤로 CSS를 두번 쓰고 싶지 않습니다.&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;하나의 CSS가 둘 다에게 효과가 있는 해결책이 있습니까?&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;/p&gt; 
&lt;ol&gt; 
 &lt;li papago-id=&quot;11&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;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;내 React 앱에서 해당 스타일시트 끌어오기*&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;리액트 앱에서 REST API를 통해 WP 콘텐츠를 가져옵니다(단, 먼저 구텐베르크 블록을 노출하십시오, https://gist.github.com/brisa-pedronetto/15aa9c7a855eccf78c717a2491372074) 참조).&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;Gutenberg 블록을 React Components(반응 구성 요소)로 다시 만듭니다(이미 이 작업을 잘 수행하는 패키지가 있을 수도 있음).&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;Gutenberg 블록 이름을 classNames in React로 사용합니다(이 이름들은 애초에 Gutenberg에서 클래스로 사용되므로).&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&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 class=&quot;lang-html prettyprint-override&quot;&gt;&lt;code&gt;&amp;lt;div class=&quot;wp-block-myblocks-foo&quot;&amp;gt;Foo&amp;lt;/div&amp;gt;
&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;React 측면에서는 다음과 유사합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-js prettyprint-override&quot;&gt;&lt;code&gt;export default function Foo({ fooContent }) =&amp;gt; (
  &amp;lt;div 
    className=&quot;wp-block-myblocks-foo&quot;
    dangerouslySetInnerHTML={{__html: fooContent}}&amp;gt;
  &amp;lt;/div&amp;gt;
)
&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 class=&quot;lang-css prettyprint-override&quot;&gt;&lt;code&gt;.wp-block-myblocks-foo {
  color: tomato;
}
&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;* WP와 더 분리하기 위해 생성(또는 구축) 과정에서 프론트엔드 스타일시트를 CDN에 업로드할 수도 있습니까?&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;외부 스타일시트를 당겨야 하므로 SSR 앱에 이 솔루션이 더 적합할 수 있습니다.&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 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/61887968/headless-wordpress-with-react-styles-in-back-and-front-end-gutenberg&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>Wordpress</category>
      <author>oldcodes</author>
      <guid isPermaLink="true">https://oldcodes.tistory.com/697</guid>
      <comments>https://oldcodes.tistory.com/697#entry697comment</comments>
      <pubDate>Tue, 31 Oct 2023 22:40:35 +0900</pubDate>
    </item>
    <item>
      <title>Flyway로 다중 데이터베이스 설정</title>
      <link>https://oldcodes.tistory.com/696</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Flyway로 다중 데이터베이스 설정&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;Flyway 5.0.7, 개발용 MySQL, 테스트용 H2로 두 가지 다른 데이터베이스를 설정하려고 합니다.&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;strong papago-id=&quot;2-1&quot;&gt;개발&lt;/strong&gt;의 경우 &lt;em papago-id=&quot;2-3&quot;&gt;src/메인/리소스/응용프로그램.properties&lt;/em&gt;.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;spring.datasource.url=jdbc:mysql://localhost:3306/moment
spring.datasource.username=root
spring.datasource.password=root

flyway.locations=db/migration,db/specific/mysql
&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;strong papago-id=&quot;3-1&quot;&gt;테스트&lt;/strong&gt;의 경우, &lt;em papago-id=&quot;3-3&quot;&gt;src/test/resource/application.properties&lt;/em&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.url=jdbc:h2:mem:db;DB_CLOSE_DELAY=-1
spring.datasource.username=sa
spring.datasource.password=sa

flyway.locations=db/migration,db/specific/h2
&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;아래는 Flyway 마이그레이션 파일의 폴더 구조입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://i.stack.imgur.com/wI1SA.png&quot; rel=&quot;noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/wI1SA.png&quot; alt=&quot;Flyway migration file structure&quot;&gt;&lt;/a&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;이 경우 Flyway는 아래에서 마이그레이션 파일을 찾을 수 없습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;specific&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;V1.1__Insert_Records.sql&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;table not found&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;specific&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;db/migration&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 papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Flyway와 함께 작동하려면 여러 데이터베이스의 마이그레이션 파일을 어떻게 구성해야 합니까?&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;여기서 스프링부트 2.x를 사용하고 계신 것 같은데요?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그렇다면,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;flyway.locations&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;/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;그러면 Flyway가 기본 위치를 사용합니다(&lt;/font&gt;&lt;/font&gt;&lt;code&gt;db/migration&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;V1.1__Insert_Records.sql&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;code&gt;V1__Create_table.sql&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 papago-id=&quot;19&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Spring Boot 2.x에서는 &lt;a href=&quot;https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.0-Migration-Guide#flyway&quot; papago-id=&quot;19-1&quot; rel=&quot;noreferrer&quot; title=&quot;Spring Boot 2.0 마이그레이션 가이드&quot; papago-attr-id=&quot;2&quot;&gt;다음&lt;/a&gt;과 같이 &lt;a href=&quot;https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.0-Migration-Guide#flyway&quot; papago-id=&quot;19-1&quot; rel=&quot;noreferrer&quot; title=&quot;Spring Boot 2.0 마이그레이션 가이드&quot; papago-attr-id=&quot;3&quot;&gt;접두사&lt;/a&gt;를 붙여야 &lt;a href=&quot;https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.0-Migration-Guide#flyway&quot; papago-id=&quot;19-1&quot; rel=&quot;noreferrer&quot; title=&quot;Spring Boot 2.0 마이그레이션 가이드&quot; papago-attr-id=&quot;4&quot;&gt;합니다&lt;/a&gt;.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;spring.flyway.locations=db/migration,db/specific/h2
&lt;/code&gt;&lt;/pre&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;{vendor}&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;a href=&quot;https://docs.spring.io/spring-boot/docs/current/reference/html/howto-database-initialization.html#howto-execute-flyway-database-migrations-on-startup&quot; papago-id=&quot;21-1&quot; rel=&quot;noreferrer&quot;&gt;Spring Boot는 데이터베이스&lt;/a&gt; 드라이버 ID(h2, mysql, oracle 등)의 소문자에서 &lt;a href=&quot;https://docs.spring.io/spring-boot/docs/current/reference/html/howto-database-initialization.html#howto-execute-flyway-database-migrations-on-startup&quot; papago-id=&quot;21-1&quot; rel=&quot;noreferrer&quot;&gt;디렉토리를 계산&lt;/a&gt;합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;spring.flyway.locations=db/migration,db/specific/{vendor}
&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/51346712/setting-up-multiple-database-with-flyway&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>spring-boot</category>
      <author>oldcodes</author>
      <guid isPermaLink="true">https://oldcodes.tistory.com/696</guid>
      <comments>https://oldcodes.tistory.com/696#entry696comment</comments>
      <pubDate>Tue, 31 Oct 2023 22:40:29 +0900</pubDate>
    </item>
    <item>
      <title>Chrome을 사용하여 요소에 바인딩된 이벤트를 찾는 방법</title>
      <link>https://oldcodes.tistory.com/695</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Chrome을 사용하여 요소에 바인딩된 이벤트를 찾는 방법&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 href=&quot;#&quot; id=&quot;foo&quot;&amp;gt;Click Here&amp;lt;/a&amp;gt;
&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;alert(&quot;bar&quot;)&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;그래서 어딘가에서 어떤 코드가&lt;/font&gt;&lt;/font&gt;&lt;code&gt;#foo&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;/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;alert(&quot;bar&quot;)&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&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;Ps.: 이 예는 허구이므로 &quot;XXXXXXX를 사용하고 전체 프로젝트에서 &quot;경보(\&quot;bar\&quot;)&quot;를 검색하십시오.&quot;와 같은 솔루션을 찾고 있지 않습니다.&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;strong papago-id=&quot;8-1&quot;&gt;Chrome 15.0.865.0 dev&lt;/strong&gt; 사용.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;Elements 패널에 &quot;Event Listener&quot; 섹션이 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;img src=&quot;https://i.stack.imgur.com/ATeg8.png&quot; alt=&quot;enter image description here&quot;&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;그리고 Scripts 패널에 &quot;Event Listener Breakpoints&quot;가 표시됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;마우스 -&amp;gt; 중단점을 클릭한 다음 &quot;다음 함수 호출로 이동&quot;하면서 콜 스택을 주시하면 이벤트를 처리하는 사용자 및 기능이 무엇인지 확인할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;jQuery의 미니화된 버전을 미니화되지 않은 버전으로 교체하여 &lt;em papago-id=&quot;9-1&quot;&gt;항상&lt;/em&gt; 개입할 필요가 없도록 하고, 가능한 경우 &lt;em papago-id=&quot;9-3&quot;&gt;단계&lt;/em&gt;를 다시 사용하는 것이 이상적입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;img src=&quot;https://i.stack.imgur.com/FxqpX.png&quot; alt=&quot;enter image description here&quot;&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;Chrome의 검사기를 사용하여 다음과 같은 다른 방법으로 첨부된 이벤트를 찾을 수도 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;검사할 요소를 마우스 오른쪽 단추로 클릭하거나 'Elements' 창에서 찾습니다.&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;그런 다음 '이벤트 청취자' 탭/창에서 이벤트를 확장합니다(예: '클릭').&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;다양한 하위 노드를 확장하여 원하는 하위 노드를 찾은 다음 '핸들러' 하위 노드가 있는 위치를 찾습니다.&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;/ol&gt; 
&lt;p papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;https://groups.google.com/forum/ #!&lt;a href=&quot;https://groups.google.com/forum/#!topic/google-chrome-developer-tools/NTcIS15uigA&quot; papago-id=&quot;15-1&quot;&gt;topic/google-chrome-developer-tools/NTCIS15uigA&lt;/a&gt;에 의해 설명된 대로 핸들러가 정의된 위치로 이동합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;img src=&quot;https://i.stack.imgur.com/nda3f.png&quot; alt=&quot;'Show Function definition'&quot;&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;설치 후 jQuery Audit 확장(https://chrome.google.com/webstore/detail/jquery-audit/dhhnpbajdcgdmbbcoakfhmfgmemlncjg), 을 시도해 보십시오.&lt;/font&gt;&lt;/p&gt; 
&lt;ol&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;em papago-id=&quot;18-1&quot;&gt;jQuery Audit&lt;/em&gt;' 탭에서 Events 속성 확장&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;필요한 이벤트를 선택합니다.&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;em papago-id=&quot;20-1&quot;&gt;기능 정의 표시&lt;/em&gt;'를 선택합니다.&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;이제 이벤트 바인딩 코드가 표시됩니다.&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;&lt;em papago-id=&quot;22-1&quot;&gt;코드&lt;/em&gt;를 보다 쉽게 &lt;em papago-id=&quot;22-1&quot;&gt;읽을&lt;/em&gt; 수 있도록 하려면 '예쁜 인쇄' 버튼을 클릭합니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt;&lt;p papago-id=&quot;23&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;23-0&quot;&gt;(2022년 최신 기준) Chrome Version 99 버전의 경우&lt;/strong&gt;:&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://i.stack.imgur.com/S1eOT.jpg&quot; rel=&quot;nofollow noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/S1eOT.jpg&quot; alt=&quot;Chrome Developer Tools - Event Listener&quot;&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&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;/li&gt; 
 &lt;li&gt;&lt;p papago-id=&quot;25&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Event Listener(Event Listener 탭&lt;/font&gt;&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;p papago-id=&quot;26&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;jquery 기능 대신 실제 javascript 파일을 보여주기 위해 Framework 청취자를 확인해야 합니다.&lt;/font&gt;&lt;/p&gt; &lt;/li&gt; 
&lt;/ol&gt;&lt;p&gt;&lt;strong papago-id=&quot;27&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;2018 업데이트 - 향후 독자에게 도움이 될 수 있습니다.&lt;/font&gt;&lt;/strong&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;그러나 Chrome에서 이 작업을 수행할 수 있는 또 다른 (쉬운) 방법은 콘솔 명령을 사용하는 것입니다.&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;em papago-id=&quot;29-2&quot;&gt;크롬&lt;/em&gt; 콘솔 &lt;em papago-id=&quot;29-2&quot;&gt;유형의 경우&lt;/em&gt;)&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;getEventListeners($0)
&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;em papago-id=&quot;30-1&quot;&gt;0&lt;/em&gt;은 DOM에서 선택된 요소입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://developers.google.com/web/tools/chrome-devtools/console/command-line-reference#0_-_4&quot; rel=&quot;noreferrer&quot; papago-id=&quot;31&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;https://developers.google.com/web/tools/chrome-devtools/console/command-line-reference#0_-_4&lt;/font&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://i.stack.imgur.com/RtNxZ.png&quot; rel=&quot;noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/RtNxZ.png&quot; alt=&quot;enter image description here&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;em papago-id=&quot;32&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;편집&lt;/font&gt;&lt;/em&gt;&lt;/strong&gt;&lt;em papago-id=&quot;33&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/570960/how-to-debug-javascript-jquery-event-bindings-with-firebug-or-similar-tool&quot; papago-id=&quot;33-1&quot;&gt;Firebug(또는 유사한 도구)를 사용하여 JavaScript/jQuery 이벤트 바인딩을 디버깅하는 방법&lt;/a&gt;&lt;/font&gt;&lt;/em&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;Google Chromes 개발자 도구는 스크립트 섹션에 검색 기능이 내장되어 있습니다.&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;이 도구가 익숙하지 않은 경우: (혹시 모르니)&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li papago-id=&quot;36&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;37&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;38&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;39&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;40&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;#ID를 빠르게 검색하면 바인딩 기능으로 이동할 수 있습니다.&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 class=&quot;papago-parent&quot;&gt;: Ex : &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;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;/p&gt; 
&lt;pre&gt;&lt;code&gt;$('#foo').click(function(){ alert('bar'); })
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;img src=&quot;https://i.stack.imgur.com/NFeLt.jpg&quot; alt=&quot;enter image description here&quot;&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;findEventHandlers는 jquery 플러그인이며 원시 코드는 여기에 있습니다: https://raw.githubusercontent.com/ruidfigueiredo/findHandlersJS/master/findEventHandlers.js&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;44&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;ol&gt; 
 &lt;li&gt;&lt;p papago-id=&quot;45&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;원시 코드를 Chrome의 콘솔에 직접 붙여 넣습니다(참고: jquery가 이미 로드되어 있어야 함)&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;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;findEventHandlers(eventType, selector);&lt;/code&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;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;해당 선택기 지정 요소의 eventType 처리기를 찾습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p papago-id=&quot;48&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;48-0&quot;&gt;예&lt;/strong&gt;:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;findEventHandlers(&quot;click&quot;, &quot;#clickThis&quot;);
&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 class=&quot;papago-parent&quot;&gt;그런 다음 사용 가능한 이벤트 핸들러가 아래에 표시되며 핸들러를 찾기 위해 확장해야 합니다. 이 기능을 마우스 오른쪽 버튼으로 클릭하고 선택합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;show function definition&lt;/code&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;참조: https://blinkingcaret.wordpress.com/2014/01/17/quickly-finding-and-debugging-jquery-event-handlers/&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;51&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Chrome 버전 52.0.2743.116의 경우:&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&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;Chrome의 Developer Tools(개발자 도구)에서 'Search(검색)' 패널을 클릭합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Ctrl&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;Shift&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;F&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;/li&gt; 
 &lt;li&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;/li&gt; 
&lt;/ol&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;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;URL : https://stackoverflow.com/questions/7338193/using-chrome-how-to-find-to-which-events-are-bound-to-an-element&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>Javascript</category>
      <author>oldcodes</author>
      <guid isPermaLink="true">https://oldcodes.tistory.com/695</guid>
      <comments>https://oldcodes.tistory.com/695#entry695comment</comments>
      <pubDate>Tue, 31 Oct 2023 22:40:22 +0900</pubDate>
    </item>
    <item>
      <title>디렉토리 대 디렉토리정보</title>
      <link>https://oldcodes.tistory.com/694</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 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;ASP에서 사용하는 것이 권장되는 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;NET 웹 애플리케이션?&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;a href=&quot;https://learn.microsoft.com/en-us/dotnet/api/system.io.directory&quot; rel=&quot;noreferrer&quot; papago-id=&quot;2-0&quot;&gt;디렉토리&lt;/a&gt;는 디렉토리와 함께 작업하기 위한 정적 메서드를 제공하는 정적 클래스입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://learn.microsoft.com/en-us/dotnet/api/system.io.directoryinfo&quot; papago-id=&quot;2-2&quot; rel=&quot;noreferrer&quot;&gt;디렉토리&lt;/a&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://learn.microsoft.com/en-us/dotnet/api/system.io.directoryinfo&quot; papago-id=&quot;2-2&quot; rel=&quot;noreferrer&quot;&gt;정보&lt;/a&gt;는 특정 디렉토리에 대한 정보를 제공하는 클래스의 인스턴스입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를 들어, C에 대한 정보를 원하는 경우:&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;\Temp:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var dirInfo = new DirectoryInfo(&quot;C:\\Temp&quot;);
if (dirInfo.Exists) {
    FileInfo[] files = dirInfo.GetFiles(&quot;*.*&quot;, SearchOption.AllDirectories);
    ...
}
&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;font class=&quot;papago-parent&quot;&gt;디렉토리의 정적 메서드를 사용하여 정보를 제공합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;if (Directory.Exists(&quot;C:\\Temp&quot;)) {
    string[] files = Directory.GetFiles(&quot;C:\\Temp&quot;, &quot;*.*&quot;, SearchOption.AllDirectories);
    ...
}
&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;blockquote&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://msdn.microsoft.com/en-us/library/system.io.directory.aspx&quot; papago-id=&quot;5-0&quot; rel=&quot;noreferrer&quot;&gt;&lt;code papago-id=&quot;5-0-0&quot;&gt;Directory&lt;/code&gt;&lt;/a&gt; class는 디렉터리 및 하위 디렉터리를 만들고 이동하고 열거하는 데 사용할 수 있는 정적 클래스입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;수업 또한 같은 목적으로 제공됩니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Directory&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;Directory&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;code&gt;Directory&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&gt;&lt;code&gt;DirectoryInfo&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;class는 폴더와 연관되어 있고 폴더에서 할 수 있는 모든 작업을 제공합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;DirectoryInfo&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;10&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;class는 인스턴스화할 때 경로를 매개변수로 수락하고 폴더의 모든 것을 제공합니다.&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://www.codedigest.com/CodeDigest/18-Directory-Class-Vs-DirectoryInfo-Class.aspx&quot; papago-id=&quot;10-1&quot; rel=&quot;noreferrer&quot;&gt;코드 다이제스트&lt;/a&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&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;디렉토리&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li papago-id=&quot;13&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;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;/ol&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;ol&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;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;font class=&quot;papago-parent&quot;&gt;정보 클래스를 사용해야 합니다.&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;모든 디렉터리 관련 작업을 수행하기 위해 별도의 개체가 생성됩니다.&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;/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;/ol&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;정보는 (기본적으로) 디렉토리 클래스이지만 정적이지 않은 컨텍스트에서 사용됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;특히 파일 시스템이 동일한 폴더이거나 해당 폴더의 하위 디렉토리에 있을 때 파일 시스템에 많은 호출을 할 경우 MSDN은 DirectoryInfo를 사용할 것을 제안합니다.&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;a href=&quot;https://learn.microsoft.com/en-us/dotnet/api/system.io.directoryinfo.getfiles#overloads&quot; papago-id=&quot;22-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;디렉토리&lt;/a&gt; 정보가 있습니다&lt;a href=&quot;https://learn.microsoft.com/en-us/dotnet/api/system.io.directoryinfo.getfiles#overloads&quot; papago-id=&quot;22-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;.&lt;/a&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;요구 사항에 부합할 수 &lt;a href=&quot;https://learn.microsoft.com/en-us/dotnet/api/system.io.directoryinfo.getfiles#overloads&quot; papago-id=&quot;22-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;있는 GetFiles&lt;/a&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;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/3146586/directory-vs-directoryinfo&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>ASP.NET</category>
      <author>oldcodes</author>
      <guid isPermaLink="true">https://oldcodes.tistory.com/694</guid>
      <comments>https://oldcodes.tistory.com/694#entry694comment</comments>
      <pubDate>Tue, 31 Oct 2023 22:40:12 +0900</pubDate>
    </item>
    <item>
      <title>그룹 내부 그룹_MySQL의 CONCAT @ MariaDB</title>
      <link>https://oldcodes.tistory.com/693</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그룹 내부 그룹_MySQL의 CONCAT @ 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;GROUP_CONCAT를 사용하여 질문을 받았습니다(그 안에 있는 테이블 2개는 조금 복잡하기 때문에 설명하고 싶지 않습니다. 아래에서 가장 간단한 방법으로 설명하겠습니다). 하지만 출력 행에 원하지 않는 반복 값이 있습니다.&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;SELECT
    GROUP_CONCAT(mr.nazwa SEPARATOR ', ')
FROM
    mp06_logos.milkruny AS mr
JOIN
    mp06_logos.milkruny_firmy AS mrf
    ON mrf.id_milkrun = mr.id
WHERE
    mr.status = 1
    AND mrf.id_firmy_zaladunku = 5445
    AND mrf.adres_firmy_zaladunku = 5188
&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;Milkrun XVI, Milkrun XVI, Milkrun XVI, Milkrun XVI, Milkrun XVII, Milkrun XVII, Milkrun XVII, Milkrun XVIII, Milkrun XIX, Milkrun XIX, Milkrun XIX, Milkrun XX, Milkrun XX, Milkrun XX, Milkrun XXI, Milkrun XXII, Milkrun XXII, Milkrun XXII, Milkrun XXII, Milkrun XXIII, Milkrun XXIII, Milkrun XXIII, Milkrun XXIII, Milkrun XXIII, Milkrun XXIII, Milkrun XXIII, Milkrun XXIII, Milkrun XXI
&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;예를 들어 출력물에서 볼 수 있듯이 밀크런 16세는 4번 반복했습니다.&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;GROUP BY&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;어떤 id는 쿼리를 가지고 있지만 그것은 더 많은 문제를 일으켰고 이 쿼리 업은 내가 원하는 것과 가장 유사합니다.&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;/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&gt;&lt;/font&gt;&lt;code&gt;milkruny&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;UNIQUE&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;id&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&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;milkruny_firmy&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;UNIQUE&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;id&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;id_milkrun&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;UNIQUE&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;code&gt;key&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;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&gt;&lt;/font&gt;&lt;code&gt;DISTINCT&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;GROUP_CONCAT()&lt;/code&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt; GROUP_CONCAT(DISTINCT mr.nazwa SEPARATOR ', ')
&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;blockquote&gt; 
 &lt;p&gt;&lt;a href=&quot;http://sqlfiddle.com/#!9/867089/1&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;22&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;http://sqlfiddle.com/ #!9/867089/1&lt;/font&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;/blockquote&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;URL : https://stackoverflow.com/questions/49527368/group-by-inside-group-concat-in-mysql-mariadb&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>MariaDB</category>
      <author>oldcodes</author>
      <guid isPermaLink="true">https://oldcodes.tistory.com/693</guid>
      <comments>https://oldcodes.tistory.com/693#entry693comment</comments>
      <pubDate>Tue, 31 Oct 2023 22:40:06 +0900</pubDate>
    </item>
    <item>
      <title>경고:이 비동기 작업 클래스는 정적이어야 합니다. 그렇지 않으면 누출이 발생할 수 있습니다.</title>
      <link>https://oldcodes.tistory.com/692</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 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;blockquote&gt; 
 &lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 AsyncTask 클래스는 정적이어야 합니다. 그렇지 않으면 누출이 발생할 수 있습니다(익명의 Android.&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;완전한 경고는 다음과 같습니다.&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;이 AsyncTask 클래스는 정적이어야 합니다. 그렇지 않으면 누출이 발생할 수 있습니다(익명의 Android.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;AsyncTask) 정적 필드에서 컨텍스트가 누출됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;정적이지 않은 내부 클래스는 외부 클래스를 암시적으로 참조합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;해당 외부 클래스가 예를 들어 Fragment(절편) 또는 Activity(액티비티)인 경우, 이 참조는 장기간 실행 중인 핸들러/로더/태스크가 가비지 수집을 방지하는 액티비티에 대한 참조를 보유함을 의미합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;마찬가지로 활동에 대한 직접적인 필드 참조와 이처럼 더 오래 실행되는 인스턴스의 조각이 누출의 원인이 될 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;ViewModel 클래스는 Views 또는 non-application Context를 가리켜서는 안 됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&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; new AsyncTask&amp;lt;Void,Void,Void&amp;gt;(){

        @Override
        protected Void doInBackground(Void... params) {
            runOnUiThread(new Runnable() {

                @Override
                public void run() {
                    mAdapter.notifyDataSetChanged();
                }
            });

            return null;
        }
    }.execute();
&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;h1 papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;정적 내부 AsyncTask 클래스 사용 방법&lt;/font&gt;&lt;/h1&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 class=&quot;papago-parent&quot;&gt;그러나 이 경우의 문제점은 활동의 UI 보기 또는 구성원 변수에 더 이상 액세스할 수 없다는 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;에 대한 참고 자료를 전달할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Context&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 메모리 누수의 위험이 동일하게 발생합니다. (AsyncTask 클래스에 액티비티에 대한 강력한 참조가 있는 경우 Android는 액티비티가 닫힌 후 가비지 컬렉션을 할 수 없습니다.)&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;해결책은 활동(또는 무엇이든)에 대해 약하게 언급하는 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Context&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;pre&gt;&lt;code&gt;public class MyActivity extends AppCompatActivity {

    int mSomeMemberVariable = 123;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // start the AsyncTask, passing the Activity context
        // in to a custom constructor 
        new MyTask(this).execute();
    }

    private static class MyTask extends AsyncTask&amp;lt;Void, Void, String&amp;gt; {

        private WeakReference&amp;lt;MyActivity&amp;gt; activityReference;

        // only retain a weak reference to the activity 
        MyTask(MyActivity context) {
            activityReference = new WeakReference&amp;lt;&amp;gt;(context);
        }

        @Override
        protected String doInBackground(Void... params) {

            // do some long running task...

            return &quot;task finished&quot;;
        }

        @Override
        protected void onPostExecute(String result) {

            // get a reference to the activity if it is still there
            MyActivity activity = activityReference.get();
            if (activity == null || activity.isFinishing()) return;

            // modify the activity's UI
            TextView textView = activity.findViewById(R.id.textview);
            textView.setText(result);

            // access Activity member variables
            activity.mSomeMemberVariable = 321;
        }
    }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;h1 papago-id=&quot;11&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;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;제가 알기로는 이런 종류의 메모리 유출 위험은 항상 있었지만 안드로이드 스튜디오 3.0에서 비로소 경고를 보기 시작했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;많은 메인들이&lt;/font&gt;&lt;/font&gt;&lt;code&gt;AsyncTask&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;a href=&quot;http://www.vogella.com/tutorials/AndroidBackgroundProcessing/article.html#asynctask&quot; papago-id=&quot;13-1&quot; rel=&quot;noreferrer&quot;&gt;여기&lt;/a&gt;, &lt;a href=&quot;http://www.journaldev.com/9708/android-asynctask-example-tutorial&quot; papago-id=&quot;13-3&quot; rel=&quot;noreferrer&quot;&gt;여기&lt;/a&gt;, &lt;a href=&quot;https://guides.codepath.com/android/Creating-and-Executing-Async-Tasks&quot; papago-id=&quot;13-5&quot; rel=&quot;noreferrer&quot;&gt;여기&lt;/a&gt;, 여기, 여기 &lt;a href=&quot;https://androidresearch.wordpress.com/2012/03/17/understanding-asynctask-once-and-forever/&quot; papago-id=&quot;13-7&quot; rel=&quot;noreferrer&quot;&gt;참조&lt;/a&gt;).&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li&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;AsyncTask&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;정적 내부 클래스는 기본적으로 Java의 최상위 클래스와 동일합니다.&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li&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;Toast&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;/font&gt;&lt;/font&gt;&lt;code&gt;AsyncTask&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;private WeakReference&amp;lt;Application&amp;gt; appReference;

MyTask(Application context) {
    appReference = new WeakReference&amp;lt;&amp;gt;(context);
}
&lt;/code&gt;&lt;/pre&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;이 경고를 무시하고 비정규 클래스만 사용하는 것에 대한 주장이 있습니다.&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/14374682/whats-the-correct-way-to-implement-asynctask-static-or-non-static-nested-class&quot; papago-id=&quot;19-1&quot;&gt;이거&lt;/a&gt;랑 &lt;a href=&quot;https://stackoverflow.com/questions/39642438/android-anonymous-asynctask-will-it-cause-memory-leak&quot; papago-id=&quot;19-3&quot;&gt;이거&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;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://www.androiddesignpatterns.com/2013/01/inner-class-handler-memory-leak.html&quot; papago-id=&quot;20-1&quot; rel=&quot;noreferrer&quot;&gt;컨텍스트 유출 방법:&lt;/a&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://www.androiddesignpatterns.com/2013/01/inner-class-handler-memory-leak.html&quot; papago-id=&quot;20-1&quot; rel=&quot;noreferrer&quot;&gt; 핸들러 &amp;amp; 내부 클래스&lt;/a&gt;&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h1 papago-id=&quot;21&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;22&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Kotlin에서는 내부 클래스의 &lt;a href=&quot;https://stackoverflow.com/a/49365796/3681880&quot; papago-id=&quot;22-1&quot;&gt;키워드를 포함하지 않습니다.&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;class MyActivity : AppCompatActivity() {

    internal var mSomeMemberVariable = 123

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // start the AsyncTask, passing the Activity context
        // in to a custom constructor
        MyTask(this).execute()
    }

    private class MyTask
    internal constructor(context: MyActivity) : AsyncTask&amp;lt;Void, Void, String&amp;gt;() {

        private val activityReference: WeakReference&amp;lt;MyActivity&amp;gt; = WeakReference(context)

        override fun doInBackground(vararg params: Void): String {

            // do some long running task...

            return &quot;task finished&quot;
        }

        override fun onPostExecute(result: String) {

            // get a reference to the activity if it is still there
            val activity = activityReference.get()
            if (activity == null || activity.isFinishing) return

            // modify the activity's UI
            val textView = activity.findViewById(R.id.textview)
            textView.setText(result)

            // access Activity member variables
            activity.mSomeMemberVariable = 321
        }
    }
}
&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 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;AsyncTask&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;Activity&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;class에 입니다.&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;이렇게 하면 작업이 가비지(garbage) 수집되어 메모리가 누출되는 것을 방지할 수 있습니다.&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&gt;&lt;strong&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;AsyncTask&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 class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 그렇지 않으면 누출이 발생할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&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;Activity&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;code&gt;AsyncTask&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 class=&quot;papago-parent&quot;&gt; 다다))&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;static&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&gt;&lt;code&gt;non-static&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;) 아직 실행 중입니다.&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;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;non-static&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;AsyncTask&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;Activity&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;/li&gt; 
 &lt;li&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;Garbage Collected&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 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;Garbage Collected&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;strong papago-id=&quot;40-0&quot;&gt;해제&lt;/strong&gt;할 수 없음 &lt;strong papago-id=&quot;40-0&quot;&gt;=&lt;/strong&gt;&amp;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;27&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;=&amp;gt; 만약&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;AsyncTask&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;non-static&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;code&gt;Activity&lt;/code&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;이벤트가 해제되지 않습니다 파괴됩니다 =&amp;gt; 누출&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;45&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;AsyncTask를 누출 없이 정적 클래스로 만든 후 업데이트 UI를 위한 솔루션&lt;/font&gt;&lt;/strong&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&gt;&lt;code&gt;WeakReference&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 class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;br&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;2) 보내기 및 제거&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Activity&lt;/code&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;AsyncTask&lt;/code&gt; &lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;public class NoLeakAsyncTaskActivity extends AppCompatActivity {
    private ExampleAsyncTask asyncTask;

    @Override 
    protected void onCreate(Bundle savedInstanceState) {
        ...

        // START AsyncTask
        asyncTask = new ExampleAsyncTask();
        asyncTask.setListener(new ExampleAsyncTask.ExampleAsyncTaskListener() {
            @Override
            public void onExampleAsyncTaskFinished(Integer value) {
                // update UI in Activity here
            }
        });
        asyncTask.execute();
    }

    @Override
    protected void onDestroy() {
        asyncTask.setListener(null); // PREVENT LEAK AFTER ACTIVITY DESTROYED
        super.onDestroy();
    }

    static class ExampleAsyncTask extends AsyncTask&amp;lt;Void, Void, Integer&amp;gt; {
        private ExampleAsyncTaskListener listener;

        @Override
        protected Integer doInBackground(Void... voids) {
            ...
            return null;
        }

        @Override
        protected void onPostExecute(Integer value) {
            super.onPostExecute(value);
            if (listener != null) {
                listener.onExampleAsyncTaskFinished(value);
            }
        }

        public void setListener(ExampleAsyncTaskListener listener) {
            this.listener = listener;
        }

        public interface ExampleAsyncTaskListener {
            void onExampleAsyncTaskFinished(Integer value);
        }
    }
}
&lt;/code&gt;&lt;/pre&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;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/44309241/warning-this-asynctask-class-should-be-static-or-leaks-might-occur&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>Android</category>
      <author>oldcodes</author>
      <guid isPermaLink="true">https://oldcodes.tistory.com/692</guid>
      <comments>https://oldcodes.tistory.com/692#entry692comment</comments>
      <pubDate>Tue, 31 Oct 2023 22:39:59 +0900</pubDate>
    </item>
    <item>
      <title>jQuery UI Datepicker에서 향후 날짜 사용 안 함</title>
      <link>https://oldcodes.tistory.com/691</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;jQuery UI Datepicker에서 향후 날짜 사용 안 함&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 papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;오늘이 23/10/2010이므로 24/10/2010 이후는 사용할 수 없습니다.&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;미안합니다. 저는 jQuery와 자바스크립트를 처음 접합니다.&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;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;pre&gt;&lt;code&gt;$(&quot;#datepicker&quot;).datepicker({ maxDate: new Date, minDate: new Date(2007, 6, 12) });
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;$(function() { $(&quot;#datepicker&quot;).datepicker({  maxDate: '0'}); });
&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;$('#datepicker').datepicker({
    endDate: new Date()
});
&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;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;#selector&quot;).datepicker({
    maxDate: 0
});
&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; var d = new Date();
         $(&quot;#delivdate&quot;).datepicker({
         showOn: &quot;button&quot;,
         buttonImage: base_url+&quot;images/cal.png&quot;,
         minDate:new Date(d.setDate(d.getDate() + 1)),
         buttonImageOnly: true
        });
         $('.ui-datepicker-trigger').attr('title',''); 
&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;미래 날짜는 1년까지 가능합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$('.date').datepicker({dateFormat: 'yy-mm-dd', minDate:(0), maxDate:(365)});
&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&gt;&lt;/font&gt;&lt;code&gt;dateFormat&lt;/code&gt; &lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://stefangabos.ro/jquery/zebra-datepicker&quot; rel=&quot;nofollow&quot; papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;http://stefangabos.ro/jquery/zebra-datepicker&lt;/font&gt;&lt;/a&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;$('#select_month1').Zebra_DatePicker({
  direction: false,
  format: 'Y-m-d',
  pair: $('#select_month2')
});

$('#select_month2').Zebra_DatePicker({
  direction: 1, format: 'Y-m-d',
});
&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;예, datepicker는 최대 날짜 속성을 지원합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt; $(&quot;#datepickeraddcustomer&quot;).datepicker({  
             dateFormat: &quot;yy-mm-dd&quot;,  
             maxDate: new Date()  
        });
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;$('#thedate,#dateid').datepicker({
     changeMonth:true,
         changeYear:true,
         yearRange:&quot;-100:+0&quot;,
         dateFormat:&quot;dd/mm/yy&quot; ,
         maxDate: '0',
     });
});
&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;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/4002781/disable-future-dates-in-jquery-ui-datepicker&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>JQuery</category>
      <author>oldcodes</author>
      <guid isPermaLink="true">https://oldcodes.tistory.com/691</guid>
      <comments>https://oldcodes.tistory.com/691#entry691comment</comments>
      <pubDate>Tue, 31 Oct 2023 22:39:50 +0900</pubDate>
    </item>
    <item>
      <title>각 행을 다른 열에 SUM()하는 방법</title>
      <link>https://oldcodes.tistory.com/690</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;각 행을 다른 열에 SUM()하는 방법&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; | ID_prim    | ID (FKey)   | Date         | Moved Items  |
 |:-----------|:------------|-------------:|:------------:|
 | 1003       | 12_1        |    nov 2013  |    2         |
 | 1003       | 12_2        |    okt 2013  |    3         |
 | 1003       | 12_3        |    dec 2014  |    5         |
 | 1003       | 12_4        |    feb 2015  |    10        |
 | 1003       | 12_5        |    apr 2012  |    1         |
 | 1003       | 12_11       |    jan 2011  |    5         |
&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;ol&gt; 
 &lt;li papago-id=&quot;3&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;4&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;5&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;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;내가 원하는 금액은 MAX '합계'부터 시작해서 내가 원하는 금액을 뺀 금액(16)&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&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;| ID_prim    | ID (FKey)   | Date         | Moved Items  | Summed Total |
|:-----------|:------------|-------------:|:------------:|:------------:|
| 1003       | 12_4        |    feb 2015  |     10       |     26
| 1003       | 12_3        |    dec 2014  |     5        |     16
| 1003       | 12_3        |    nov 2013  |     2        |     11 &amp;lt;
| 1003       | 12_4        |    okt 2013  |     3        |     9 
| 1003       | 12_5        |    apr 2012  |     1        |     6
| 1003       | 12_11       |    jan 2011  |     5        |     5
&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;&quot;Summed Total&quot; (26) - 16 = 10에 도달하면 쿼리를 중지하고 싶습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그래서 10부터 모두 보여주세요 &amp;gt; 데이터베이스에 이 값들만 있을 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;| ID_prim    | ID (FKey)   | Date         | Moved Items  | Summed Total |
|:-----------|:------------|-------------:|:------------:|:------------:|
| 1003       | 12_4        |    feb 2015  |     10       |     26
| 1003       | 12_3        |    dec 2014  |     5        |     16
| 1003       | 12_3        |    nov 2013  |     2        |     11
&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;  SELECT
  T1.ID_prim, T1.ID as ID (FKey), T1.Moved_Items as Moved Items, t1.Date, SUM(T2.MOVEMENTQTY) AS Summed Total
  FROM Table1 T1
  INNER JOIN Table1 T2 ON T2.ID &amp;lt;= T1.ID
    inner join table2 inout on T1.ID_prim = inout.ID_prim
    AND T2.ID_prim = inout.ID_prim
    AND T2.ID_prim = T1.ID_prim
  where t1.ID_prim = 1003
  and t2.ID_prim = 1003
  and inout.ISSOTRX = 'N'
  GROUP BY T1.ID_prim, T1.Moved Items, t1.Date
  HAVING SUM(T2.Moved Items) &amp;lt;= 16
  order by  t1.UPDATED desc
&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;원하는 테이블을 인쇄할 Oracle DB용 SQL 문을 만드는 것을 도와줄 수 있는 사람?&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;질문에 대한 의견을 통해 OP의 설명을 바탕으로 &lt;strong papago-id=&quot;11-1&quot;&gt;SUM()&lt;/strong&gt; 분석 함수를 사용하여 &lt;strong papago-id=&quot;11-3&quot;&gt;실행 합계&lt;/strong&gt;를 구한 후 조건에 따라 필터링할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;12&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;SQL&amp;gt; SELECT * FROM t;

   ID_PRIM ID    DT             MOVED
---------- ----- --------- ----------
      1003 12_1  01-NOV-13          2
      1003 12_2  01-OCT-13          3
      1003 12_3  01-DEC-14          5
      1003 12_4  01-FEB-15         10
      1003 12_5  01-APR-12          1
      1003 12_11 01-JAN-11          5

6 rows selected.

SQL&amp;gt;
&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;/p&gt; 
&lt;pre&gt;&lt;code&gt;SQL&amp;gt; SELECT t.*, SUM(moved) OVER(ORDER BY dt) sm FROM t ORDER BY dt DESC;

   ID_PRIM ID    DT             MOVED         SM
---------- ----- --------- ---------- ----------
      1003 12_4  01-FEB-15         10         26
      1003 12_3  01-DEC-14          5         16
      1003 12_1  01-NOV-13          2         11
      1003 12_2  01-OCT-13          3          9
      1003 12_5  01-APR-12          1          6
      1003 12_11 01-JAN-11          5          5

6 rows selected.

SQL&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;14&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;SQL&amp;gt; WITH DATA AS
  2    ( SELECT t.*, SUM(moved) OVER(ORDER BY dt) sm FROM t ORDER BY dt DESC
  3    )
  4  SELECT * FROM data WHERE sm &amp;gt;= 16;

   ID_PRIM ID    DT             MOVED         SM
---------- ----- --------- ---------- ----------
      1003 12_4  01-FEB-15         10         26
      1003 12_3  01-DEC-14          5         16

SQL&amp;gt;
&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;nov 2013&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;strong papago-id=&quot;1-1&quot;&gt;문자열&lt;/strong&gt;입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;날짜를 기준으로 정렬하려면 항상 &lt;strong papago-id=&quot;1-3&quot;&gt;TO_DATE&lt;/strong&gt;를 사용하여 명시적으로 &lt;strong papago-id=&quot;1-5&quot;&gt;날짜&lt;/strong&gt;로 변환해야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;어쨌든 저는 TO_DATE를 이용하여 샘플 데이터를 만들었습니다.&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;&lt;strong papago-id=&quot;17-0&quot;&gt;Update&lt;/strong&gt; OP는 런타임에 합산된 값의 &lt;strong papago-id=&quot;17-2&quot;&gt;MAX&lt;/strong&gt; 값에서 원하는 값을 빼려고 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;SQL&amp;gt; WITH DATA AS
  2    ( SELECT t.*, SUM(moved) OVER(ORDER BY dt) sm FROM t ORDER BY dt DESC
  3    )
  4  SELECT * FROM DATA t WHERE sm &amp;gt;
  5    (SELECT MAX(sm) FROM data
  6    ) - 16 ;

   ID_PRIM ID    DT             MOVED         SM
---------- ----- --------- ---------- ----------
      1003 12_4  01-FEB-15         10         26
      1003 12_3  01-DEC-14          5         16
      1003 12_1  01-NOV-13          2         11

SQL&amp;gt;
&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;strong papago-id=&quot;2-1&quot;&gt;MAX(sm)&lt;/strong&gt;가 반환됩니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;26&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;WHERE sm &amp;gt; MAX(sm) -16&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;20&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;즉, 'sm' 값이 다음보다 큰 모든 행을 반환합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;26 -16&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;10&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;strong papago-id=&quot;6-1&quot;&gt;대체 변수&lt;/strong&gt;를 사용하여 값을 입력할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;16&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;/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/30705878/how-to-sum-each-row-into-another-column&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>oracle</category>
      <author>oldcodes</author>
      <guid isPermaLink="true">https://oldcodes.tistory.com/690</guid>
      <comments>https://oldcodes.tistory.com/690#entry690comment</comments>
      <pubDate>Thu, 26 Oct 2023 21:41:25 +0900</pubDate>
    </item>
    <item>
      <title>블레이드의 조건부 확장</title>
      <link>https://oldcodes.tistory.com/689</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;조건부로 할 수 있는 방법은 없을까요?&lt;/font&gt;&lt;/font&gt;&lt;code&gt;@extends&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;h2 papago-id=&quot;3&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;@if(!Request::ajax())
    @extends('dashboard.master')
    @section('content')
@endif

&amp;lt;div class=&quot;jumbotron&quot;&amp;gt;
    Hey!
&amp;lt;/div&amp;gt;

@if(!Request::ajax())
    @stop
@endif
&lt;/code&gt;&lt;/pre&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;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;요청이 AJAX가 아닐 때 출력되었습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;@extends('dashboard.master')&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;, 하지만 AJAX 요청은 잘 되었습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;h2 papago-id=&quot;7&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;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;마스터 템플릿 포함 중지(포함)&lt;/font&gt;&lt;/font&gt;&lt;code&gt;header&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;footer&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;10&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;AJAX의 경우 요청한 내용을 쉽게 표시할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;@extends((( Request::ajax()) ? 'layouts.ajax' : 'layouts.default' ))
&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;   @if(!Request::ajax())

       //the master layout with @yield('content'). i.e. your current layout

   @else

       @yield('content')

   @endif
&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&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;$layout&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;14&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;dashboard.master가 될 속성입니다. 그런 다음 보기 또는 응답을 반환하는 전화 대신 다음으로 종료합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;$this-&amp;gt;layout-&amp;gt;content = View::make('dashboard.template')&lt;/code&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://laravel.com/docs/templates#controller-layouts&quot; papago-id=&quot;15-1&quot; rel=&quot;nofollow&quot;&gt;관한&lt;/a&gt; 라라벨 &lt;a href=&quot;http://laravel.com/docs/templates#controller-layouts&quot; papago-id=&quot;15-1&quot; rel=&quot;nofollow&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;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;?php

class Something extends BaseController {

    $layout = 'dashboard.master';

    public function getIndex()
    {
        $template = View::make('dashboard.template');

        if(Request::ajax()) {
            return $template;
        }

        $this-&amp;gt;layout-&amp;gt;content = $template;
    }
}
&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/18524365/conditional-extends-in-blade&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>Ajax</category>
      <author>oldcodes</author>
      <guid isPermaLink="true">https://oldcodes.tistory.com/689</guid>
      <comments>https://oldcodes.tistory.com/689#entry689comment</comments>
      <pubDate>Thu, 26 Oct 2023 21:41:17 +0900</pubDate>
    </item>
    <item>
      <title>Spring @SubscribeMapping이 정말로 어떤 주제에 대해 고객을 구독합니까?</title>
      <link>https://oldcodes.tistory.com/688</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Spring @SubscribeMapping이 정말로 어떤 주제에 대해 고객을 구독합니까?&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;STOMP, Simple Message Broker와 함께 Spring Websocket을 사용하고 있습니다.&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;@Controller&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;@SubscribeMapping&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;예를 들어, 클라이언트가 &lt;strong papago-id=&quot;3-1&quot;&gt;&quot;채팅&lt;/strong&gt;&quot;이라는 항목을 구독한다고 가정해 보겠습니다&lt;strong papago-id=&quot;3-1&quot;&gt;.&lt;/strong&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;stompClient.subscribe('/app/chat', ...);&lt;/code&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-3&quot;&gt;&quot;/topic/chat&lt;/strong&gt;&quot; 대신 &lt;strong papago-id=&quot;4-1&quot;&gt;&quot;/app/chat&lt;/strong&gt;&quot;을 구독하면 이 구독은 다음을 사용하여 매핑된 메서드로 이동합니다&lt;strong papago-id=&quot;4-3&quot;&gt;.&lt;/strong&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;@SubscribeMapping&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;/p&gt; 
&lt;pre&gt;&lt;code&gt;@SubscribeMapping(&quot;/chat&quot;)
public List getChatInit() {
    return Chat.getUsers();
}
&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;Spring ref는 이렇습니다.&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;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;기본적으로 @SubscribeMapping 메서드의 반환 값은 연결된 클라이언트에 직접 메시지로 전송되며 브로커를 통과하지 않습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 기능은 응용프로그램 UI를 초기화할 때 응용프로그램 데이터를 가져오는 등 요청-응답 메시지 상호 작용을 구현하는 데 유용합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&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;부분적&lt;/strong&gt;으로만!!&lt;/font&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;8-3&quot;&gt;하지만&lt;/strong&gt; 구독하는 건 어떨까요?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;제가 보기에는 여기서 일어난 일은 서비스와 같은 &lt;strong papago-id=&quot;8-5&quot;&gt;요청-응답&lt;/strong&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;9&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;10&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;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;font class=&quot;papago-parent&quot;&gt;아니면 다른 사람?&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p papago-id=&quot;12&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;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;p&gt;&lt;strong papago-id=&quot;15&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;16&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;@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {

    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        config.enableSimpleBroker(&quot;/topic&quot;);
        config.setApplicationDestinationPrefixes(&quot;/app&quot;);
    }

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint(&quot;/hello&quot;).withSockJS();
    }
}
&lt;/code&gt;&lt;/pre&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;pre&gt;&lt;code&gt;@Controller
public class GreetingController {

    @MessageMapping(&quot;/hello&quot;)
    @SendTo(&quot;/topic/greetings&quot;)
    public Greeting greeting(HelloMessage message) throws Exception {
        System.out.println(&quot;inside greeting&quot;);
        return new Greeting(&quot;Hello, &quot; + message.getName() + &quot;!&quot;);
    }

    @SubscribeMapping(&quot;/topic/greetings&quot;)
    public Greeting try1() {
        System.out.println(&quot;inside TRY 1&quot;);
        return new Greeting(&quot;Hello, &quot; + &quot;TRY 1&quot; + &quot;!&quot;);
    }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;18&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;...
    stompClient.subscribe('/topic/greetings', function(greeting){
                        console.log('RECEIVED !!!');
                    });
    stompClient.send(&quot;/app/hello&quot;, {}, JSON.stringify({ 'name': name }));
...
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;19&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;ol&gt; 
 &lt;li&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;/topic/greetings&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;try1&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 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;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;클라이언트가 msg를 '로 보낼 때&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;/app/hello&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;', 그것은 인사말 msg를 받아야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;@SendTo&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;code&gt;/topic/greetings&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;/li&gt; 
&lt;/ol&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;27&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;ol&gt; 
 &lt;li&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&gt;&lt;code&gt;/topic/greetings&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;try1&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 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;/li&gt; 
 &lt;li&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;클라이언트가 msg를 '로 보낼 때&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;/app/hello&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;code&gt;greeting&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 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;/topic/greetings&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&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&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 class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;하지만 1.이 실패했다는 것을 기억하세요.&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;'/app/topic/greetings'&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;/app&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&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;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;지금은 1.이 작동하지만 이번에는 2.가 작동하지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;클라이언트가 msg를 '로 보낼 때&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;/app/hello&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;greeting&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 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;/app&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;/p&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p papago-id=&quot;42&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그래서 제가 받고 싶은 것은 1개나 2개인데 이 2개는 같이 있지 않습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li papago-id=&quot;43&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;blockquote&gt; 
 &lt;p papago-id=&quot;44&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;기본적으로 @SubscribeMapping 메서드의 &lt;strong papago-id=&quot;44-1&quot;&gt;반환 값&lt;/strong&gt;은 연결된 클라이언트에 직접 메시지로 전송되며 &lt;strong papago-id=&quot;44-3&quot;&gt;브로커를 통과하지 않습니다&lt;/strong&gt;.&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;(emphasis 광산)&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;46&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;/font&gt;&lt;code&gt;SUBSCRIBE&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;48&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;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;h2 papago-id=&quot;52&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;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;SimpleMessageBroker&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;code&gt;DefaultSubscriptionRegistry&lt;/code&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&gt;&lt;code&gt;SimpleBrokerMessageHandler&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 class=&quot;papago-parent&quot;&gt;손잡이들&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;SUBSCRIPTION&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;57&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;메시지 및 가입 등록(&lt;a href=&quot;https://github.com/spring-projects/spring-framework/blob/v4.1.5.RELEASE/spring-messaging/src/main/java/org/springframework/messaging/simp/broker/SimpleBrokerMessageHandler.java#L171-L174&quot; papago-id=&quot;57-1&quot; rel=&quot;noreferrer&quot;&gt;여기 구현 참조&lt;/a&gt;).&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&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;RabbitMQ와 같은 &quot;진짜&quot; 메시지 브로커를 사용하면 브로커에게 메시지를 전달하는 Stomp 브로커 릴레이를 구성할 수 있습니다.&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;SUBSCRIBE&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;59&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;메시지는 구독 관리를 담당하는 브로커에게 전달됩니다(&lt;a href=&quot;https://github.com/spring-projects/spring-framework/blob/v4.1.5.RELEASE/spring-messaging/src/main/java/org/springframework/messaging/simp/stomp/StompBrokerRelayMessageHandler.java#L486&quot; papago-id=&quot;59-1&quot; rel=&quot;noreferrer&quot;&gt;여기 구현 참조&lt;/a&gt;).&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;h2 papago-id=&quot;60&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;업데이트 - STOMP 메시지 흐름에 대한 자세한 내용&lt;/font&gt;&lt;/h2&gt; 
&lt;p papago-id=&quot;61&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://docs.spring.io/spring-framework/docs/4.1.5.RELEASE/spring-framework-reference/html/websocket.html#websocket-stomp-message-flow&quot; rel=&quot;noreferrer&quot; papago-id=&quot;61-1&quot;&gt;STOMP 메시지 흐름에 대한 참조 문서&lt;/a&gt;를 보면 다음을 알 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;ul&gt; 
  &lt;li papago-id=&quot;62&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&quot;/topic/greeting&quot; 구독은 &quot;clientInbound Channel&quot;을 거쳐 브로커에게 전달됩니다.&lt;/font&gt;&lt;/li&gt; 
  &lt;li papago-id=&quot;63&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&quot;/app/greeting&quot;으로 전송된 인사말은 &quot;client Inbound Channel&quot;을 거쳐 Greeting Controller로 전달됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;컨트롤러는 현재 시간을 추가하고 반환 값은 &quot;/topic/greeting&quot;(/topic/greeting)에 대한 메시지로 &quot;brokerChannel&quot;을 통해 전달됩니다(목적지는 규약에 따라 선택되지만 @SendTo를 통해 재정의될 수 있음)&lt;/font&gt;&lt;/li&gt; 
 &lt;/ul&gt; 
&lt;/blockquote&gt; 
&lt;p&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&gt;&lt;code&gt;/topic/hello&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 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;/app/hello&lt;/code&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;/topic/hello&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;,~하지 않는 한&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;@SendTo&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 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;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;ul&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 class=&quot;papago-parent&quot;&gt;어떤 일이 발생할 때마다 클라이언트가 인식하기를 원하는 경우, 비동기식으로: 특정 주제를 구독합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;/topic/hello&lt;/code&gt;&lt;/li&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;&lt;font class=&quot;papago-parent&quot;&gt;메시지를 브로드캐스트하려면: 특정 주제에 메시지를 보냅니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;/topic/hello&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;42&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;응용 프로그램의 상태를 초기화하기 위해 즉시 피드백을 받으려는 경우: 응용 프로그램 대상에 SUBSCUBLE(가입)&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;/app/hello&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 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;44&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;/app/hello&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;45&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;@MessageMapping&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;46&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;@SendTo&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;47&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;/li&gt; 
&lt;/ul&gt; 
&lt;p papago-id=&quot;78&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;좋은 예를 원한다면 실제 &lt;a href=&quot;https://github.com/salmar/spring-websocket-chat&quot; papago-id=&quot;78-1&quot; rel=&quot;noreferrer&quot;&gt;사용 사례와 함께 Spring 웹소켓 기능의 로그를 보여주는&lt;/a&gt; 이 &lt;a href=&quot;https://github.com/salmar/spring-websocket-chat&quot; papago-id=&quot;78-1&quot; rel=&quot;noreferrer&quot;&gt;채팅 어플리케이션&lt;/a&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;따라서 두 가지를 모두 가질 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li papago-id=&quot;80&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;81&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;해당 항목에 대해 @SubscribeMapping을 사용하여 연결 응답 제공&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;당신이 경험한 것처럼 (나뿐만 아니라) 작동하지 않습니다.&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;당신의 상황을 해결하는 방법은 (내가 한 것처럼) 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li papago-id=&quot;84&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;@SubscribeMapping 제거 - /app 접두사에서만 작동합니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;85&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;자연스럽게 (w/o/app 접두사 포함) /topic을 구독합니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p papago-id=&quot;86&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;p papago-id=&quot;87&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;단일 클라이언트에 직접 응답하려면 사용자 대상(&lt;a href=&quot;http://docs.spring.io/spring/docs/current/spring-framework-reference/html/websocket.html#websocket-stomp-user-destination&quot; rel=&quot;noreferrer&quot; papago-id=&quot;87-1&quot;&gt;websocket-stamp-user-destination&lt;/a&gt; 참조)을 사용하거나 하위 경로(예: /topic/my-id-42)에 가입할 수도 있습니다(정확한 사용 사례는 모르겠습니다).&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 전용 구독이 있고 &lt;em papago-id=&quot;87-3&quot;&gt;방송&lt;/em&gt;을 하고 싶을 때 반복해서 구독합니다.)&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;p papago-id=&quot;88&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Stomp 명령을 받는 즉시 Application Listener의 onApplicationEvent 메서드로 메시지를 보냅니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;SUBSUBLE&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
  &lt;/ol&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;89&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;@Override
  public void onApplicationEvent(SessionSubscribeEvent event) {
      Message&amp;lt;byte[]&amp;gt; message = event.getMessage();
      StompHeaderAccessor accessor = StompHeaderAccessor.wrap(message);
      StompCommand command = accessor.getCommand();
      if (command.equals(StompCommand.SUBSCRIBE)) {
          String sessionId = accessor.getSessionId();
          String stompSubscriptionId = accessor.getSubscriptionId();
          String destination = accessor.getDestination();
          // Handle subscription event here
          // e.g. send welcome message to *destination*
       }
  }
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;90&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;안녕하세요 Mert씨, 당신의 질문은 4년이 넘었지만, 최근에 같은 문제로 머리를 긁어서 결국 해결한 것이기 때문에 아직 답변을 시도해보겠습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;48&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;@SubscribeMapping&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;49&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;는 &lt;strong papago-id=&quot;49-1&quot;&gt;일회성&lt;/strong&gt; 요청-응답 교환이므로&lt;/font&gt;&lt;/font&gt;&lt;code&gt;try1()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;50&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;stompClient.subscribe('/topic/greetings', callback)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;51&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;try1()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;52&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;stompClient.send(...)&lt;/code&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;53&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;/app&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;54&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;@SubscribeMapping(&quot;/topic/greetings&quot;)&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;55&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;stompClient.subscribe('/app/topic/greetings', callback)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;56&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;topic&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;57&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;@SubscribeMapping(&quot;/greetings&quot;)

stompClient.subscribe('/app/greetings', callback)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;58&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;console.log('RECEIVED !!!')&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;59&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;60&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://docs.spring.io/spring/docs/current/spring-framework-reference/web.html#websocket-stomp-subscribe-mapping&quot; rel=&quot;noreferrer&quot; papago-id=&quot;60-1&quot;&gt;공식 문서&lt;/a&gt;는 또한 다음의 사용 사례 시나리오를 권장합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;@SubscribeMapping&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;61&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;초기 UI 렌더링 시.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p papago-id=&quot;105&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;브로커는 /topic 및 /queue에 매핑되고 애플리케이션 컨트롤러는 /app에 매핑된다고 가정합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 설정에서 브로커는 반복 방송을 위한 /topic 및 /queue에 대한 모든 구독을 저장하며, 응용 프로그램이 관여할 필요가 없습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;클라이언트는 또한 일부 /app 대상을 구독할 수 있으며 컨트롤러는 구독을 저장하거나 다시 사용하지 않고 브로커를 참여시키지 않고 구독에 대한 응답으로 값을 반환할 수 있습니다(실질적으로 일회성 요청-응답 교환).&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이를 위한 하나의 사용 사례는 시작 시 초기 데이터로 UI를 채우는 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;62&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;/topic&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;63&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;/app&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;64&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;/topic&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;65&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;/app&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;66&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;-bound one은 모든 채팅 기록을 다운로드 할 것이고, 그것이 바로 그것입니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;@SubscribeMapping&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;67&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;/topic&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;68&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;113&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;registry.enableSimpleBroker(&quot;/app&quot;, &quot;/topic&quot;);
registry.setApplicationDestinationPrefixes(&quot;/app&quot;, &quot;/topic&quot;);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;114&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;115&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;116&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;117&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;    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        config.setApplicationDestinationPrefixes(&quot;/app&quot;);
        config.enableSimpleBroker(&quot;/topic&quot;);
    }
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;118&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;    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        config.setApplicationDestinationPrefixes(&quot;/app&quot;);
        // problem line deleted
    }
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;119&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;    template.convertAndSend(&quot;/app/test&quot;, stringSample);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;120&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;121&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/29085791/does-spring-subscribemapping-really-subscribe-the-client-to-some-topic&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>spring</category>
      <author>oldcodes</author>
      <guid isPermaLink="true">https://oldcodes.tistory.com/688</guid>
      <comments>https://oldcodes.tistory.com/688#entry688comment</comments>
      <pubDate>Thu, 26 Oct 2023 21:41:10 +0900</pubDate>
    </item>
    <item>
      <title>MYSQL 문 최적화</title>
      <link>https://oldcodes.tistory.com/687</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;나는 MYSQL 시스템의 Shell에 optimize 문을 사용하려고 하고 있고 사용하려고 시도했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;mysqlcheck -o --all-databases;
mysqlcheck -o &amp;lt;databasename&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;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://i.stack.imgur.com/nWPBd.png&quot; rel=&quot;nofollow noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/nWPBd.png&quot; alt=&quot;Error Here&quot;&gt;&lt;/a&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;mysql용 xampp shell에서 스크립트를 실행하고 있으며 테이블에 대한 최적화만 확인하고 싶습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;오류가 있을 것으로 알고 있지만 보고 싶습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;code&gt;mysqlcheck&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;0&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;는 &quot;쉘&quot;을 통해 OS에 주는 명령입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;명령줄 도구 내부에서 사용할 명령이 &lt;em papago-id=&quot;0-1&quot;&gt;아닙니다&lt;/em&gt;.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;mysql&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;OPTIMIZE TABLE&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 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;&quot;최적화&quot;라는 이름은 유혹적이지만, 신경 쓸 만한 가치는 거의 없습니다.&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;URL : https://stackoverflow.com/questions/69400082/mysql-optimize-statement&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>MariaDB</category>
      <author>oldcodes</author>
      <guid isPermaLink="true">https://oldcodes.tistory.com/687</guid>
      <comments>https://oldcodes.tistory.com/687#entry687comment</comments>
      <pubDate>Thu, 26 Oct 2023 21:41:01 +0900</pubDate>
    </item>
    <item>
      <title>동일한 TextView에서 문자열의 글꼴 크기가 다름</title>
      <link>https://oldcodes.tistory.com/686</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;동일한 TextView에서 문자열의 글꼴 크기가 다름&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;/font&gt;&lt;/font&gt;&lt;code&gt;textView&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;안에 숫자(variable)와 a가 있는&lt;/font&gt;&lt;/font&gt;&lt;code&gt;string&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;string&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;/p&gt; 
&lt;pre&gt;&lt;code&gt;TextView size = (TextView)convertView.findViewById(R.id.privarea_list_size);
if (ls.numProducts != null) {
    size.setText(ls.numProducts + &quot; &quot; + mContext.getString(R.string.products));
}
&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;저는 ls.num 제품이 나머지 텍스트와 크기가 다르길 원합니다.&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;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Spannable String&lt;/code&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt; String s= &quot;Hello Everyone&quot;;
 SpannableString ss1=  new SpannableString(s);
 ss1.setSpan(new RelativeSizeSpan(2f), 0,5, 0); // set size
 ss1.setSpan(new ForegroundColorSpan(Color.RED), 0, 5, 0);// set color
 TextView tv= (TextView) findViewById(R.id.textview);
 tv.setText(ss1); 
&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;p&gt;&lt;img src=&quot;https://i.stack.imgur.com/3DmAD.png&quot; alt=&quot;enter image description here&quot;&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&gt;&lt;code&gt; String s= &quot;Hello Everyone&quot;;  
 String[] each = s.split(&quot; &quot;);
&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;span&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;string&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;code&gt;textview&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;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;동일한 텍스트 뷰에서 여러 개의 다른 크기를 설정할 수 있는 방법이 궁금할 경우 상대적인 크기가 아닌 절대 크기를 사용하면 다음 대신 사용할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;RelativeSizeSpan&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;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;int textSize1 = getResources().getDimensionPixelSize(R.dimen.text_size_1);
int textSize2 = getResources().getDimensionPixelSize(R.dimen.text_size_2);
&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;그리고 나서 새로운 것을 만듭니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;AbsoluteSpan&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;String text1 = &quot;Hi&quot;;
String text2 = &quot;there&quot;;

SpannableString span1 = new SpannableString(text1);
span1.setSpan(new AbsoluteSizeSpan(textSize1), 0, text1.length(), SPAN_INCLUSIVE_INCLUSIVE);

SpannableString span2 = new SpannableString(text2);
span2.setSpan(new AbsoluteSizeSpan(textSize2), 0, text2.length(), SPAN_INCLUSIVE_INCLUSIVE);

// let's put both spans together with a separator and all
CharSequence finalText = TextUtils.concat(span1, &quot; &quot;, span2);
&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;html 문자열을 사용하여 html을 Textview로 설정하고 다음을 사용하여 이 작업을 수행할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;br&gt; &lt;code&gt;txtView.setText(Html.fromHtml(&quot;Your html string here&quot;));&lt;/code&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;txtView.setText(Html.fromHtml(&quot;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;lt;font size=5 color=red&amp;gt;Hello &amp;lt;/font&amp;gt; World &amp;lt;/body&amp;gt;&amp;lt;html&amp;gt;&quot;));`
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;private SpannableStringBuilder SpannableStringBuilder(final String text, final char afterChar, final float reduceBy) {
        RelativeSizeSpan smallSizeText = new RelativeSizeSpan(reduceBy);
        SpannableStringBuilder ssBuilder = new SpannableStringBuilder(text);
        ssBuilder.setSpan(
                smallSizeText,
                text.indexOf(afterChar),
                text.length(),
                Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
        );

        return ssBuilder;
    }
------------------------
TextView textView =view.findViewById(R.id.textview);
String s= &quot;123456.24&quot;;
textView.setText(SpannableStringBuilder(s, '.', 0.7f));
&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;h2&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 papago-id=&quot;21&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;12345.&lt;sub papago-id=&quot;21-1&quot;&gt;24&lt;/sub&gt;&lt;/font&gt;&lt;/p&gt;&lt;/h2&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;방법1&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;public static void increaseFontSizeForPath(Spannable spannable, String path, float increaseTime) {
    int startIndexOfPath = spannable.toString().indexOf(path);
    spannable.setSpan(new RelativeSizeSpan(increaseTime), startIndexOfPath,
            startIndexOfPath + path.length(), 0);
}
&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;/p&gt; 
&lt;pre&gt;&lt;code&gt;Utils.increaseFontSizeForPath(spannable, &quot;big&quot;, 3); // make &quot;big&quot; text bigger 3 time than normal text
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;a href=&quot;https://i.stack.imgur.com/obcib.png&quot; rel=&quot;noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/obcib.png&quot; alt=&quot;enter image description here&quot;&gt;&lt;/a&gt;&lt;/p&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;방법2&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;public static void setFontSizeForPath(Spannable spannable, String path, int fontSizeInPixel) {
    int startIndexOfPath = spannable.toString().indexOf(path);
    spannable.setSpan(new AbsoluteSizeSpan(fontSizeInPixel), startIndexOfPath,
            startIndexOfPath + path.length(), 0);
}
&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;pre&gt;&lt;code&gt;Utils.setFontSizeForPath(spannable, &quot;big&quot;, (int) textView.getTextSize() + 20); // make &quot;big&quot; text bigger 20px than normal text
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;a href=&quot;https://i.stack.imgur.com/sbs9j.png&quot; rel=&quot;noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/sbs9j.png&quot; alt=&quot;enter image description here&quot;&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;이를 위한 가장 좋은 방법은 텍스트와 완전한 동적을 포함하지 않는 html입니다. 예를 들어:&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-java prettyprint-override&quot;&gt;&lt;code&gt;  public static String getTextSize(String text,int size) {
         return &quot;&amp;lt;span style=\&quot;size:&quot;+size+&quot;\&quot; &amp;gt;&quot;+text+&quot;&amp;lt;/span&amp;gt;&quot;;

    }
&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;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;size.setText(Html.fromHtml(getTextSize(ls.numProducts,100) + &quot; &quot; + mContext.getString(R.string.products));  
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;29&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://developer.android.com/reference/android/text/SpannableStringBuilder.html&quot; rel=&quot;nofollow&quot; papago-id=&quot;29-1&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;30&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;문자열 2개와 int(텍스트 크기) 1개가 필요한 함수를 직접 작성하였습니다.&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;텍스트 보기에서 사용할 수 있는 SpannableStringBuilder를 반환합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;  public static SpannableStringBuilder setSectionOfTextSize(String text, String textToChangeSize, int size){

        SpannableStringBuilder builder=new SpannableStringBuilder();

        if(textToChangeSize.length() &amp;gt; 0 &amp;amp;&amp;amp; !textToChangeSize.trim().equals(&quot;&quot;)){

            //for counting start/end indexes
            String testText = text.toLowerCase(Locale.US);
            String testTextToBold = textToChangeSize.toLowerCase(Locale.US);
            int startingIndex = testText.indexOf(testTextToBold);
            int endingIndex = startingIndex + testTextToBold.length();
            //for counting start/end indexes

            if(startingIndex &amp;lt; 0 || endingIndex &amp;lt;0){
                return builder.append(text);
            }
            else if(startingIndex &amp;gt;= 0 &amp;amp;&amp;amp; endingIndex &amp;gt;=0){

                builder.append(text);
                builder.setSpan(new AbsoluteSizeSpan(size, true), startingIndex, endingIndex, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            }
        }else{
            return builder.append(text);
        }

        return builder;
    }
&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;fun String.setFontSizeForPath(path: String, fontSizeInPixel: Int, colorCode: String = &quot;#FF0000&quot;): SpannableString {
    val spannable = SpannableString(this)
    val startIndexOfPath = spannable.toString().indexOf(path)
    spannable.setSpan(
        AbsoluteSizeSpan(fontSizeInPixel),
        startIndexOfPath,
        startIndexOfPath + path.length,
        0
    )
    spannable.setSpan(
        ForegroundColorSpan(Color.parseColor(colorCode)),
        startIndexOfPath,
        startIndexOfPath + path.length,
        0
    )

    return spannable
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;blockquote&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;/blockquote&gt; 
&lt;pre&gt;&lt;code&gt;text_view.text = &quot;A B C D&quot;.setFontSizeForPath(&quot;B&quot;,30)
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;private SpannableString getFormattedText(String textToBold, String normalText, boolean boldTextFirst) {
    String result = boldTextFirst ? textToBold + normalText : normalText + textToBold;
    SpannableString str = new SpannableString(result);

    Typeface typeface = ResourcesCompat.getFont(requireContext(), R.font.product_sans_bold);
    int style = typeface != null ? typeface.getStyle() : Typeface.BOLD;

    int textToBoldStartIndex = str.toString().indexOf(textToBold);
    str.setSpan(new StyleSpan(style), textToBoldStartIndex, textToBoldStartIndex + textToBold.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

    int normalTextStartIndex = str.toString().indexOf(normalText);
    str.setSpan(new AbsoluteSizeSpan(13, true), normalTextStartIndex, normalTextStartIndex + normalText.length(), 0);
    return str;
}
&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;@Anandharaj R 답변에 대한 &lt;strong papago-id=&quot;35-0&quot;&gt;Kotlin&lt;/strong&gt; 버전.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;class SpannableStringBuilderHelper {

companion object {

    fun reduceTextSizeAfterChar(text: String, afterChar: Char, reduceBy: Float): SpannableStringBuilder? {
        val smallSizeText = RelativeSizeSpan(reduceBy)
        val ssBuilder = SpannableStringBuilder(text)
        ssBuilder.setSpan(
            smallSizeText,
            text.indexOf(afterChar),
            text.length,
            Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
        )
        return ssBuilder
    }
}
&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;/p&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;pre&gt;&lt;code&gt;SpannableStringBuilderHelper.reduceTextSizeAfterChar(&quot;70/100&quot;, '/', 0.7f)
&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;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;    &amp;lt;string name=&quot;test&quot;&amp;gt;
        &amp;lt;![CDATA[
        We found %1$s items]]&amp;gt;
    &amp;lt;/string&amp;gt;
&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;        val textToPutAsPlaceHolder = &quot;123&quot;
        val formattedStr = getString(R.string.test, &quot;$textToPutAsPlaceHolder&amp;lt;bc/&amp;gt;&quot;)
        val placeHolderTextSize = resources.getDimensionPixelSize(R.dimen.some_text_size)
        val placeHolderTextColor = ContextCompat.getColor(this, R.color.design_default_color_primary_dark)
        val textToShow = HtmlCompat.fromHtml(formattedStr, HtmlCompat.FROM_HTML_MODE_LEGACY, null, object : Html.TagHandler {
            var start = 0
            override fun handleTag(opening: Boolean, tag: String, output: Editable, xmlReader: XMLReader) {
                when (tag) {
                    &quot;bc&quot; -&amp;gt; if (!opening) start = output.length - textToPutAsPlaceHolder.length
                    &quot;html&quot; -&amp;gt; if (!opening) {
                        output.setSpan(AbsoluteSizeSpan(placeHolderTextSize), start, start + textToPutAsPlaceHolder.length, 0)
                        output.setSpan(ForegroundColorSpan(placeHolderTextColor), start, start + textToPutAsPlaceHolder.length, 0)
                    }
                }
            }
        })
        textView.text = textToShow
&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;p&gt;&lt;a href=&quot;https://i.stack.imgur.com/VaW51.png&quot; rel=&quot;nofollow noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/VaW51.png&quot; alt=&quot;enter image description here&quot;&gt;&lt;/a&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;kotlin에서 html을 사용하여 아래와 같이 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;HtmlCompat.fromHtml(&quot;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;lt;h1&amp;gt;This is Large Heading :-&amp;lt;/h1&amp;gt;&amp;lt;br&amp;gt;This is normal size&amp;lt;body&amp;gt;&amp;lt;/html&amp;gt;&quot;,HtmlCompat.FROM_HTML_MODE_LEGACY)
&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;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/16335178/different-font-size-of-strings-in-the-same-textview&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>string</category>
      <author>oldcodes</author>
      <guid isPermaLink="true">https://oldcodes.tistory.com/686</guid>
      <comments>https://oldcodes.tistory.com/686#entry686comment</comments>
      <pubDate>Thu, 26 Oct 2023 21:40:55 +0900</pubDate>
    </item>
    <item>
      <title>헤더가 없는 파워셸 내보내기-csv?</title>
      <link>https://oldcodes.tistory.com/685</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;헤더가 없는 파워셸 내보내기-csv?&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;기본적으로 1행 &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;pre&gt;&lt;code&gt;Get-Mailbox -RecipientTypeDetails RoomMailbox,EquipmentMailbox | Select-Object Name | Export-Csv -Path &quot;$(get-date -f MM-dd-yyyy)_Resources.csv&quot; -NoTypeInformation
&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;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;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;Get-Mailbox -RecipientTypeDetails RoomMailbox,EquipmentMailbox |
 Select-Object -ExpandProperty Name | 
 Set-Content -Path &quot;$(get-date -f MM-dd-yyyy)_Resources.txt&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;편집: 헤더 행이 없는 export-csv를 원하는 경우:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;(Get-Mailbox -RecipientTypeDetails RoomMailbox,EquipmentMailbox |
Select-Object Name |
ConvertTo-Csv -NoTypeInformation) |
Select-Object -Skip 1 |
Set-Content -Path &quot;$(get-date -f MM-dd-yyyy)_Resources.csv&quot;
&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;파워쉘 7이 나왔습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;헤더 없이는 여전히 csv를 내보낼 방법이 없습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;난 알았어요.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;기술적으로는 헤더 행이 없으면 CSV가 되지 않습니다.&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&gt;&lt;code&gt;$obj | convertto-csv | select-object -skip 1 |out-file 'output.csv'
&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;$obj | where-object {$_.&amp;lt;whatever property&amp;gt; -eq 'X' } | convertto-csv -usequotes never | select-object -skip 1 |out-file 'output.csv'
&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;URL : https://stackoverflow.com/questions/26389952/powershell-export-csv-with-no-headers&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>PowerShell</category>
      <author>oldcodes</author>
      <guid isPermaLink="true">https://oldcodes.tistory.com/685</guid>
      <comments>https://oldcodes.tistory.com/685#entry685comment</comments>
      <pubDate>Thu, 26 Oct 2023 21:40:45 +0900</pubDate>
    </item>
    <item>
      <title>Youtube api v3 오류 &amp;quot;이 작업을 수행하려면 SSL이 필요합니다.&amp;quot;</title>
      <link>https://oldcodes.tistory.com/684</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Youtube api v3 오류 &quot;이 작업을 수행하려면 SSL이 필요합니다.&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;유튜브의 v3 api를 사용하여 비디오 정보를 얻는 방법에 대한 통찰력을 찾고 있습니다.&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;url을 전달할 때 json의 응답은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;{&quot;error&quot;:{&quot;errors&quot;:[{&quot;domain&quot;:&quot;global&quot;,&quot;reason&quot;:&quot;sslRequired&quot;,&quot;message&quot;:&quot;SSL is required to perform this operation.&quot;}],&quot;code&quot;:403,&quot;message&quot;:&quot;SSL is required to perform this operation.&quot;}}
&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;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용 중인 url 샘플은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;http://www.googleapis.com/youtube/v3/videos?id=Ho4XgLj40Ss&amp;amp;part=snippet
&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;API Key를 만들어 추가해 보았습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&amp;amp;key={my_api_key}&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그 url 끝까지.&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;환경이 중요하다면 jquery getJ를 사용하고 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용자 지정 워드프레스 테마의 SON 요청.&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;try it now&quot; 섹션에서 OAuth가 꺼진 상태에서 멋진 json 개체를 반환한다는 점을 언급해야 합니다.&lt;/font&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;다른 API에 대해서도 같은 문제가 있었습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;SLaks가 댓글로 지적한 것처럼 그냥.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;https://&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;http://&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;사용자의 경우 다음을 시도합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;https://www.googleapis.com/youtube/v3/videos?id=Ho4XgLj40Ss&amp;amp;part=snippet
&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;@Xavier의 답변에 덧붙여서, 만약 당신이 이 API를 a에서 사용하고 있다면,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Flutter environment&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;pre&gt;&lt;code&gt;Uri.http(baseUrl, endPointUrl, parameters);
&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;Uri.https(baseUrl, endPointUrl, parameters);
&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;https&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;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/23959987/youtube-api-v3-error-ssl-is-required-to-perform-this-operation&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>Wordpress</category>
      <author>oldcodes</author>
      <guid isPermaLink="true">https://oldcodes.tistory.com/684</guid>
      <comments>https://oldcodes.tistory.com/684#entry684comment</comments>
      <pubDate>Thu, 26 Oct 2023 21:40:39 +0900</pubDate>
    </item>
    <item>
      <title>워드프레스 위젯에서 자동 문단 제거</title>
      <link>https://oldcodes.tistory.com/683</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;방금 제 첫 번째 워드프레스 주제를 끝냈습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;문제는 새 텍스트 위젯을 만들 때 출력이 자동으로 문단에 추가되고 다음과 같이 표시된다는 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&amp;lt;br /&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;모든 행 뒤에 태그를 삽입합니다.&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;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;추가했습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;remove_filter('the_content', 'wpautop');&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;php 하지만 작동이 되지 않습니다.&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;pre&gt;&lt;code&gt;// remove &amp;lt;br&amp;gt; tags from text widget content, from 4.8 version WP adds these tags
remove_filter('widget_text_content', 'wpautop');
&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;WordPress 4.8부터는 텍스트 위젯의 &quot;문단 자동 추가&quot; 확인란이 제거되었습니다.&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;p&gt;&lt;a href=&quot;https://wordpress.org/plugins/add-paragraphs-option-to-text-widget/&quot; rel=&quot;noreferrer&quot; papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;https://wordpress.org/plugins/add-paragraphs-option-to-text-widget/&lt;/font&gt;&lt;/a&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;옵션 #1:&lt;/font&gt;&lt;/strong&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&gt;&lt;/font&gt;&lt;img src=&quot;https://i.stack.imgur.com/Nk9Yu.png&quot; alt=&quot;how to remove paragraphs from text widget content&quot;&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;옵션 #2:&lt;/font&gt;&lt;/strong&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;pre&gt;&lt;code&gt;add_filter( 'widget_display_callback', 'wpse8170_widget_display_callback', 10, 3 );
function wpse8170_widget_display_callback( $instance, $widget, $args ) {
    $instance['filter'] = false;
    return $instance;
}
&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;기본적으로 WordPress에는 텍스트 위젯에 문단을 해제할 수 있는 &quot;문단 자동 추가&quot; 확인란이 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;img src=&quot;https://i.stack.imgur.com/RwlnL.png&quot; alt=&quot;enter image description here&quot;&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;php&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;remove_filter( 'the_content', 'wpautop' );&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;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/14653101/remove-automatic-paragraph-from-wordpress-widget&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>Wordpress</category>
      <author>oldcodes</author>
      <guid isPermaLink="true">https://oldcodes.tistory.com/683</guid>
      <comments>https://oldcodes.tistory.com/683#entry683comment</comments>
      <pubDate>Thu, 26 Oct 2023 21:40:33 +0900</pubDate>
    </item>
    <item>
      <title>JWToauth2 새로 고침 토큰 취소</title>
      <link>https://oldcodes.tistory.com/682</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;JWToauth2 새로 고침 토큰 취소&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;바닐라 스프링 구현으로 Oauth2 JWT Refresh Token을 취소하고 JwtToken Store를 취소할 방법을 찾고 있습니다.&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;먼저, 새로 고침 토큰을 취소할 수 있는 /oauth/token과 유사한 API가 없다는 것을 확인해 줄 수 있습니까?&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;리프레시 토큰을 다음 행에 따라 삭제하는 사용자 지정 API를 추가하고자 했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;OAuth2RefreshToken oauth2RefreshToken=tokenStore.readRefreshToken(refreshToken);
tokenStore.removeRefreshToken(oauth2RefreshToken);
&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;지금 JwtToken Store를 보니 Approval Store를 사용하고 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그래서 저는 JwtToken Store에 InMemory Approval Store를 제공했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;나의 JwtTokenStore 인스턴스화는 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;@Bean
protected JwtAccessTokenConverter jwtTokenEnhancer() {
    JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
    converter.setSigningKey(&quot;123456&quot;);
    return converter;
}

@Bean
public JwtTokenStore getTokenStore(){
    tokenStore= new JwtTokenStore(jwtTokenEnhancer());
    tokenStore.setApprovalStore(new InMemoryApprovalStore());
    tokenStore.setTokenEnhancer(jwtTokenEnhancer());
    return tokenStore;
};
&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;결과: InMemory ApprovalStore가 없어도 문제없이 사용자를 인증하고 토큰을 새로 고칠 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 InMemory ApprovalStore를 토큰 저장소에 추가하는 즉시 다음 오류 메시지가 표시됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;{&quot;error&quot;:&quot;invalid_grant&quot;,&quot;error_description&quot;:&quot;Invalid refresh token: eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE0NDUwMjQ2MTcsInVzZXJfbmFtZSI6IjYzZjIyYjZlLWU5MGUtNDFjYS1iYzJlLTBmZTgzNmY3MTQ2NyIsImF1dGhvcml0aWVzIjpbIlJPTEVfQURNSU4iLCJST0xFX1VTRVIiXSwianRpIjoiMjgwMDgwNWQtMjk1Zi00ZDQzLWI2NTYtMDNlZWYwMWFkMjg0IiwiY2xpZW50X2lkIjoid2ViLWNsaWVudCIsInNjb3BlIjpbInJlYWQiLCJ3cml0ZSIsInRydXN0Il19.BPC0HqLYjWGM0IFjvsUGGKQ9dyIXSXwMhraCVFIxD0U&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;/p&gt; 
&lt;p papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;편집: ApprovalStore가 실제로 JWT 토큰을 취소하는 방법임을 시사하는 &lt;a href=&quot;https://github.com/spring-projects/spring-security-oauth/issues/409&quot; rel=&quot;noreferrer&quot; papago-id=&quot;7-1&quot;&gt;다음 스레드&lt;/a&gt;를 찾았습니다.&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;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;먼저, 새로 고침 토큰을 취소할 수 있는 /oauth/token과 유사한 API가 없다는 것을 확인해 줄 수 있습니까?&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;a href=&quot;https://github.com/spring-projects/spring-security-oauth/blob/master/spring-security-oauth2/src/main/java/org/springframework/security/oauth2/provider/endpoint/TokenEndpoint.java&quot; rel=&quot;nofollow&quot; papago-id=&quot;9-0&quot;&gt;확인&lt;/a&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&gt;&lt;/font&gt;&lt;code&gt;JwtTokenStore&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;bin, spring이 &lt;a href=&quot;https://github.com/spring-projects/spring-security-oauth/blob/master/spring-security-oauth2/src/main/java/org/springframework/security/oauth2/config/annotation/web/configurers/AuthorizationServerEndpointsConfigurer.java&quot; rel=&quot;nofollow&quot; papago-id=&quot;1-1&quot;&gt;AuthorizationServerEndpointsConfigurer&lt;/a&gt;를 사용하여 생성합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;private TokenStore tokenStore() {
    if (tokenStore == null) {
        if (accessTokenConverter() instanceof JwtAccessTokenConverter) {
            this.tokenStore = new JwtTokenStore((JwtAccessTokenConverter) accessTokenConverter());
        }
        else {
            this.tokenStore = new InMemoryTokenStore();
        }
    }
    return this.tokenStore;
}

private ApprovalStore approvalStore() {
    if (approvalStore == null &amp;amp;&amp;amp; tokenStore() != null &amp;amp;&amp;amp; !isApprovalStoreDisabled()) {
        TokenApprovalStore tokenApprovalStore = new TokenApprovalStore();
        tokenApprovalStore.setTokenStore(tokenStore());
        this.approvalStore = tokenApprovalStore;
    }
    return this.approvalStore;
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;blockquote&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;/blockquote&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://github.com/spring-projects/spring-security-oauth/blob/master/spring-security-oauth2/src/main/java/org/springframework/security/oauth2/provider/token/store/JwtTokenStore.java&quot; rel=&quot;nofollow&quot; papago-id=&quot;13-1&quot;&gt;JwtTokenStore&lt;/a&gt;에서 사용되었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;private void remove(String token) {
    if (approvalStore != null) {
        OAuth2Authentication auth = readAuthentication(token);
        String clientId = auth.getOAuth2Request().getClientId();
        Authentication user = auth.getUserAuthentication();
        if (user != null) {
            Collection&amp;lt;Approval&amp;gt; approvals = new ArrayList&amp;lt;Approval&amp;gt;();
            for (String scope : auth.getOAuth2Request().getScope()) {
                approvals.add(new Approval(user.getName(), clientId, scope, new Date(), ApprovalStatus.APPROVED));
            }
            approvalStore.revokeApprovals(approvals);
        }
    }
}
&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;URL : https://stackoverflow.com/questions/32617645/revoke-jwt-oauth2-refresh-token&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>spring-boot</category>
      <author>oldcodes</author>
      <guid isPermaLink="true">https://oldcodes.tistory.com/682</guid>
      <comments>https://oldcodes.tistory.com/682#entry682comment</comments>
      <pubDate>Thu, 26 Oct 2023 21:40:25 +0900</pubDate>
    </item>
    <item>
      <title>PowerShell에서 문자열(grep)을 선택할 때 일치하는 정규식만 반환하려면 어떻게 해야 합니까?</title>
      <link>https://oldcodes.tistory.com/681</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;PowerShell에서 문자열(grep)을 선택할 때 일치하는 정규식만 반환하려면 어떻게 해야 합니까?&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;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음을 사용하여 매치가 발생하면&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Select-String&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 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;/p&gt; 
&lt;pre&gt;&lt;code&gt;select-string .-.-.
&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;abc 1-2-3 abc
&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;strong papago-id=&quot;7-1&quot;&gt;1-2-3만&lt;/strong&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&gt;&lt;/font&gt;&lt;code&gt;grep -o&lt;/code&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-String .-.-. .\test.txt -All | Select Matches
&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;[regex]는 시스템용 유형 가속기입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;텍스트.정규식.Regex&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;[regex]$regex = '.-.-.'
$regex.Matches('abc 1-2-3 abc') | foreach-object {$_.Value}
$regex.Matches('abc 1-2-3 abc 4-5-6') | foreach-object {$_.Value}
&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;p papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Select-String은 사용할 수 있는 속성 일치를 반환합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;모든 일치 항목을 가져오려면 -AllMatchs를 지정해야 합니다.&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;test test1 alk atest2 asdflkj alj test3 test
test test3 test4
test2
&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;select-string -Path c:\temp\select-string1.txt -Pattern 'test\d' -AllMatches | % { $_.Matches } | % { $_.Value }
&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;test1 #from line 1
test2 #from line 1
test3 #from line 1
test3 #from line 2
test4 #from line 2
test2 #from line 3
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;a href=&quot;http://technet.microsoft.com/en-us/library/dd315403.aspx&quot; rel=&quot;noreferrer&quot; papago-id=&quot;16&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;technet.microsoft.com 에서 문자열 선택&lt;/font&gt;&lt;/a&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://en.wikiquote.org/wiki/Chinese_proverbs#Sh&quot; rel=&quot;noreferrer&quot; papago-id=&quot;17-1&quot;&gt;사람에게 낚시를 가르친다는&lt;/a&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;select-string 명령의 출력을 &lt;strong papago-id=&quot;3-1&quot;&gt;Get-member&lt;/strong&gt;로 파이프링하여 개체에 어떤 속성이 있는지 확인할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이렇게 하면 &quot;Matches(일치)&quot;가 표시되고 출력을 다음으로 파이핑하여 선택할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;| **Select-Object** Matches&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;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;예를 들어, stej의 샘플에서:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;sls .\test.txt -patt 'test\d' -All |select lineNumber,fileName,matches |ft -auto

LineNumber Filename Matches
---------- -------- -------
         1 test.txt {test1, test2, test3}
         2 test.txt {test3, test4}
         3 test.txt {test2}
&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;아래가 그랬습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Get-Content -Path $pathToFile | Select-String -Pattern &quot;'test\d'&quot; | foreach {$_.Matches.Value}

Get-Content -Path $pathToFile | # Get-Content will divide into single lines for us

Select-String -Pattern &quot;'test\d'&quot; | # Define the Regex
&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;Value} # 개체의 일치 필드 값만 반환합니다. 여러 결과 일치를 허용합니다.&lt;/font&gt;&lt;/p&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;%&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&gt;&lt;/font&gt;&lt;code&gt;select&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;.prop&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;a href=&quot;https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_arrays#member-enumeration&quot; rel=&quot;noreferrer&quot; papago-id=&quot;8-0&quot;&gt;Member Enumeration&lt;/a&gt; 구문 - 여러 요소에서 마법처럼 작동합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;(Select-String .-.-. .\test.txt -All).Matches.Value
&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;$m = Select-String .-.-. .\test.txt -All
$m.Matches.Value
&lt;/code&gt;&lt;/pre&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;ForEach operator를 사용하지 않으려면 파이프와&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Select -Expand&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&gt;&lt;/font&gt;&lt;code&gt;C:\&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&gt;&lt;code&gt;Get-ChildItem | Select-String -Pattern &quot;(C:\\)(.*)&quot; | Select -Expand Matches | Select -Expand Groups | Where Name -eq 2 | Select -Expand Value
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;code&gt;Where Name -eq 2&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&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;font class=&quot;papago-parent&quot;&gt;Text.Regular Expressions 네임스페이스:&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;http://msdn.microsoft.com/en-us/library/system.text.regularexpressions.regex.aspx&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;34&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;http://msdn.microsoft.com/en-us/library/system.text.regularexpressions.regex.aspx&lt;/font&gt;&lt;/a&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;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/804754/how-do-i-return-only-the-matching-regular-expression-when-i-select-stringgrep&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>PowerShell</category>
      <author>oldcodes</author>
      <guid isPermaLink="true">https://oldcodes.tistory.com/681</guid>
      <comments>https://oldcodes.tistory.com/681#entry681comment</comments>
      <pubDate>Thu, 26 Oct 2023 21:40:18 +0900</pubDate>
    </item>
    <item>
      <title>ES6 클래스 다중 상속</title>
      <link>https://oldcodes.tistory.com/680</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;ES6 클래스 다중 상속&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;a href=&quot;https://babeljs.io/&quot; papago-id=&quot;1-1&quot;&gt;바벨&lt;/a&gt;에 대한 조사는 거의 다 했어요&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://babeljs.io/&quot; papago-id=&quot;1-1&quot;&gt;JS&lt;/a&gt;와 &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes#Sub_classing_with_extends&quot; papago-id=&quot;1-3&quot;&gt;MDN&lt;/a&gt;(전혀 정보가 없음)에 관한 것입니다만, ES6 Spec에 관한 자세한 정보를 찾기 위해 충분히 주의하지 않았다면 언제든지 말씀해 주십시오.&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;ES6가 다른 오리형 언어와 같은 방식으로 다중 상속을 지원하는지 궁금합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를 들어 다음과 같은 작업을 수행할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;class Example extends ClassOne, ClassTwo {
    constructor() {
    }
}
&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;font class=&quot;papago-parent&quot;&gt;그렇다면 통역사는 클래스 1보다 클래스 2의 메서드/속성을 선호합니까?&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;super&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&gt;&lt;code&gt;instanceof&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;// base class
class A {  
  foo() {
    console.log(`from A -&amp;gt; inside instance of A: ${this instanceof A}`);
  }
}

// B mixin, will need a wrapper over it to be used
const B = (B) =&amp;gt; class extends B {
  foo() {
    if (super.foo) super.foo(); // mixins don't know who is super, guard against not having the method
    console.log(`from B -&amp;gt; inside instance of B: ${this instanceof B}`);
  }
};

// C mixin, will need a wrapper over it to be used
const C = (C) =&amp;gt; class extends C {
  foo() {
    if (super.foo) super.foo(); // mixins don't know who is super, guard against not having the method
    console.log(`from C -&amp;gt; inside instance of C: ${this instanceof C}`);
  }
};

// D class, extends A, B and C, preserving composition and super method
class D extends C(B(A)) {  
  foo() {
    super.foo();
    console.log(`from D -&amp;gt; inside instance of D: ${this instanceof D}`);
  }
}

// E class, extends A and C
class E extends C(A) {
  foo() {
    super.foo();
    console.log(`from E -&amp;gt; inside instance of E: ${this instanceof E}`);
  }
}

// F class, extends B only
class F extends B(Object) {
  foo() {
    super.foo();
    console.log(`from F -&amp;gt; inside instance of F: ${this instanceof F}`);
  }
}

// G class, C wrap to be used with new decorator, pretty format
class G extends C(Object) {}

const inst1 = new D(),
      inst2 = new E(),
      inst3 = new F(),
      inst4 = new G(),
      inst5 = new (B(Object)); // instance only B, ugly format

console.log(`Test D: extends A, B, C -&amp;gt; outside instance of D: ${inst1 instanceof D}`);
inst1.foo();
console.log('-');
console.log(`Test E: extends A, C -&amp;gt; outside instance of E: ${inst2 instanceof E}`);
inst2.foo();
console.log('-');
console.log(`Test F: extends B -&amp;gt; outside instance of F: ${inst3 instanceof F}`);
inst3.foo();
console.log('-');
console.log(`Test G: wraper to use C alone with &quot;new&quot; decorator, pretty format -&amp;gt; outside instance of G: ${inst4 instanceof G}`);
inst4.foo();
console.log('-');
console.log(`Test B alone, ugly format &quot;new (B(Object))&quot; -&amp;gt; outside instance of B: ${inst5 instanceof B}, this one fails`);
inst5.foo();
&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 papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;테스트 D: D의 인스턴스 외부에서 A, B, C -&amp;gt; 확장: true&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;A -&amp;gt; A의 내부 인스턴스에서: true&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;B -&amp;gt; B의 내부 인스턴스: true&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;from C -&amp;gt; 내부 C 인스턴스: true&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;D -&amp;gt; 내부 D 인스턴스에서: true&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;-&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;테스트 E: E: true의 외부 인스턴스 A, C -&amp;gt; 확장&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;A -&amp;gt; A의 내부 인스턴스에서: true&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;from C -&amp;gt; 내부 C 인스턴스: true&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;E -&amp;gt; 안에서&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;E의 스탠스: true&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;-&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;테스트 F: F의 인스턴스 바깥쪽에서 B -&amp;gt; 확장: true&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;B -&amp;gt; B의 내부 인스턴스: true&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;from F -&amp;gt; 내부 F 인스턴스: true&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;-&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;검정 G: &quot;새로운&quot; 데코레이터와 함께 C를 단독으로 사용하는 래퍼, 예쁜 포맷 -&amp;gt; G: true의 외부 인스턴스&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;from C -&amp;gt; 내부 C 인스턴스: true&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;-&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;테스트 B 단독, 추한 형식 &quot;새(B(Object))&quot; -&amp;gt; B의 외부 인스턴스:&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;false, 이건 실패합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;B -&amp;gt; B의 내부 인스턴스: true&lt;/font&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;a href=&quot;http://www.es6fiddle.net/ilmn1c4w/&quot; rel=&quot;noreferrer&quot; papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;빈둥빈둥 놀 수 있는 링크&lt;/font&gt;&lt;/a&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;/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&gt;&lt;code&gt;extends&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 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;13&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://es6-features.org/#ClassInheritanceFromExpressions&quot; rel=&quot;noreferrer&quot; papago-id=&quot;13-0&quot;&gt;Sergio Carneiro와 Jon의 구현&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;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var aggregation = (baseClass, ...mixins) =&amp;gt; {
    class base extends baseClass {
        constructor (...args) {
            super(...args);
            mixins.forEach((mixin) =&amp;gt; {
                copyProps(this,(new mixin));
            });
        }
    }
    let copyProps = (target, source) =&amp;gt; {  // this function copies all properties and symbols, filtering out some special ones
        Object.getOwnPropertyNames(source)
              .concat(Object.getOwnPropertySymbols(source))
              .forEach((prop) =&amp;gt; {
                 if (!prop.match(/^(?:constructor|prototype|arguments|caller|name|bind|call|apply|toString|length)$/))
                    Object.defineProperty(target, prop, Object.getOwnPropertyDescriptor(source, prop));
               })
    }
    mixins.forEach((mixin) =&amp;gt; { // outside contructor() to allow aggregation(A,B,C).staticFunction() to be called etc.
        copyProps(base.prototype, mixin.prototype);
        copyProps(base, mixin);
    });
    return base;
}
&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;class Person{
   constructor(n){
      this.name=n;
   }
}
class Male{
   constructor(s='male'){
      this.sex=s;
   }
}
class Child{
   constructor(a=12){
      this.age=a;
   }
   tellAge(){console.log(this.name+' is '+this.age+' years old.');}
}
class Boy extends aggregation(Person,Male,Child){}
var m = new Boy('Mike');
m.tellAge(); // Mike is 12 years old.
&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;p papago-id=&quot;16&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Justin Fagnani는 ES2015에서 클래스 &lt;em papago-id=&quot;16-3&quot;&gt;표현&lt;/em&gt;으로 클래스를 만들 수 있다는 사실을 이용하여 여러 클래스를 하나로 구성하는 매우 깨끗한(imho) 방법을 &lt;a href=&quot;http://justinfagnani.com/2015/12/21/real-mixins-with-javascript-classes/&quot; rel=&quot;noreferrer&quot; papago-id=&quot;16-1&quot;&gt;설명&lt;/a&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;식 vs 선언&lt;/font&gt;&lt;/h1&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;function myFunction() {}      // function declaration
var myFunction = function(){} // function expression
&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;class MyClass {}             // class declaration
var MyClass = class {}       // class expression
&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;h1 papago-id=&quot;21&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;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;function createClassExtending(superclass) {
  return class AwesomeClass extends superclass {
    // you class body here as usual
  }
}
&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;class A {}
class B {}
var ExtendingA = createClassExtending(A)
var ExtendingB = createClassExtending(B)
&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;ES6 클래스는 단일 상속만 지원하므로 여러 클래스를 함께 혼합하려면 혼합할 모든 클래스를 포함하는 클래스 체인을 만들어야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;따라서 A와 B 둘 다 확장되는 클래스 C를 생성하고자 한다면 다음과 같은 작업을 수행할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;class A {}
class B extends A {}
class C extends B {}  // C extends both A and B
&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;font class=&quot;papago-parent&quot;&gt;나중에 B는 확장하고 A는 확장하지 않는 클래스 D를 만들기로 결정하면 문제가 발생합니다.&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;그러나 클래스가 표현이 될 수 있다는 사실을 이용한 약간의 똑똑한 속임수를 사용하면 A와 B를 클래스로 직접 만드는 것이 아니라 클래스 팩토리(간단함을 위해 화살표 함수를 사용)로 만들어 이 문제를 해결할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;class Base {} // some base class to keep the arrow functions simple
var A = (superclass) =&amp;gt; class A extends superclass
var B = (superclass) =&amp;gt; class B extends superclass
var C = B(A(Base))
var D = B(Base)
&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;나는 당신이 볼 수 있는 이 원칙들을 바탕으로 도서관을 만들었습니다: &lt;a href=&quot;https://github.com/download/mics&quot; rel=&quot;noreferrer&quot; papago-id=&quot;28-1&quot;&gt;mics&lt;/a&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&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;    class Nose {
      constructor() {
        this.booger = 'ready'; 
      }
      
      pick() {
        console.log('pick your nose')
      } 
    }
    
    class Ear {
      constructor() {
        this.wax = 'ready'; 
      }
      
      dig() {
        console.log('dig in your ear')
      } 
    }

    //class Butt { // left as an exercise for the reader
    
    class Gross extends Classes([Nose,Ear]) {
      constructor() {
        super();
        this.gross = true;
      }
    }
    
    function Classes(bases) {
      class Bases {
        constructor() {
          bases.forEach(base =&amp;gt; Object.assign(this, new base()));
        }
      }
      bases.forEach(base =&amp;gt; {
        Object.getOwnPropertyNames(base.prototype)
        .filter(prop =&amp;gt; prop != 'constructor')
        .forEach(prop =&amp;gt; Bases.prototype[prop] = base.prototype[prop])
      })
      return Bases;
    }

    
    // test it
    
    var grossMan = new Gross();
    console.log(`booger is ${grossMan.booger}!`);
    console.log(`was is ${grossMan.wax}!`);
    grossMan.pick(); // eww!
    grossMan.dig();  // yuck!&lt;/code&gt;&lt;/pre&gt; 
 &lt;/div&gt; 
&lt;/div&gt; 
&lt;p&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;js에서 상속받은 소품들이 어떻게 작동하는지 살펴보겠습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var parent = {a: function() { console.log('ay'); }};
var child = Object.create(parent);
child.a() // first look in child instance, nope let's go to it's prototype
          // then look in parent, found! return the method
&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;child.b; // first look in child instance, nope let's go to it's prototype
         // then look in parent, nope let's go to it's prototype
         // then look in Object.prototype, nope let's go to it's prototype
         // then look at null, give up and return undefined
&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;a href=&quot;http://addyosmani.com/resources/essentialjsdesignpatterns/book/#mixinpatternjavascript&quot; rel=&quot;noreferrer&quot; papago-id=&quot;32-1&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&gt;&lt;/strong&gt;&lt;/a&gt;를 사용하면 해당 기능을 일부 얻을 수 있지만 바인딩이 늦어지는 일은 없습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var a = {x: '1'};
var b = {y: '2'};
var c = createWithMixin([a, b]);
c.x; // 1
c.y; // 2
b.z = 3;
c.z; // undefined
&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;var a = {x: 1}
var o = Object.create(a);
o.x; // 1
a.y = 2;
o.y; // 2
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;a href=&quot;https://www.npmjs.com/package/ts-mixer&quot; rel=&quot;noreferrer&quot; papago-id=&quot;34&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;https://www.npmjs.com/package/ts-mixer&lt;/font&gt;&lt;/a&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;최고의 TS 지원 및 기타 여러 가지 유용한 기능으로!&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;es6-features.org/ #&lt;a href=&quot;http://es6-features.org/#ClassInheritanceFromExpressions&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;36-1&quot;&gt;ClassInheritanceFromExpressions&lt;/a&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;클래스 Rectangle은 집합(Shape, Colored, ZCord) {}을(를) 확장합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;pre&gt;&lt;code&gt;var aggregation = (baseClass, ...mixins) =&amp;gt; {
    let base = class _Combined extends baseClass {
        constructor (...args) {
            super(...args)
            mixins.forEach((mixin) =&amp;gt; {
                mixin.prototype.initializer.call(this)
            })
        }
    }
    let copyProps = (target, source) =&amp;gt; {
        Object.getOwnPropertyNames(source)
            .concat(Object.getOwnPropertySymbols(source))
            .forEach((prop) =&amp;gt; {
            if (prop.match(/^(?:constructor|prototype|arguments|caller|name|bind|call|apply|toString|length)$/))
                return
            Object.defineProperty(target, prop, Object.getOwnPropertyDescriptor(source, prop))
        })
    }
    mixins.forEach((mixin) =&amp;gt; {
        copyProps(base.prototype, mixin.prototype)
        copyProps(base, mixin)
    })
    return base
}
&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;strong papago-id=&quot;38-0&quot;&gt;그러나 그것&lt;/strong&gt;은 &lt;a href=&quot;https://github.com/rse/aggregation&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;38-2&quot;&gt;집적&lt;/a&gt;과 같은 &lt;strong papago-id=&quot;38-0&quot;&gt;라이브러리에서 이미 제공&lt;/strong&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;'use strict';

const _         = require( 'lodash' );

module.exports  = function( ParentClass ) {

    if( ! ParentClass ) ParentClass = class {};

    class AbstractClass extends ParentClass {
        /**
         * Constructor
        **/
        constructor( configs, ...args ) {
            if ( new.target === AbstractClass )
                throw new TypeError( &quot;Cannot construct Abstract instances directly&quot; );

            super( args );

            if( this.defaults === undefined )
                throw new TypeError( new.target.name + &quot; must contain 'defaults' getter&quot; );

            this.configs = configs;
        }
        /**
         * Getters / Setters
        **/
        // Getting module configs
        get configs() {
            return this._configs;
        }
        // Setting module configs
        set configs( configs ) {
            if( ! this._configs ) this._configs = _.defaultsDeep( configs, this.defaults );
        }
    }

    return AbstractClass;
}
&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;const EventEmitter  = require( 'events' );
const AbstractClass = require( './abstracts/class' )( EventEmitter );

class MyClass extends AbstractClass {
    get defaults() {
        return {
            works: true,
            minuses: [
                'u can have only 1 class as parent wich was\'t made by u',
                'every othere classes should be your\'s'
            ]
        };
    }
}
&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;font class=&quot;papago-parent&quot;&gt;그러나 그렇게 작성되지 않은 함수/클래스를 확장하고자 하는 즉시 루프를 계속할 기회가 없습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;const EventEmitter  = require( 'events' );
const A = require( './abstracts/a' )(EventEmitter);
const B = require( './abstracts/b' )(A);
const C = require( './abstracts/b' )(B);
&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;노드 v5.4.1에서 --harmony 플래그와 함께 작동합니다.&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;이 ES6 솔루션은 다음과 같이 효과적이었습니다.&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;다중 inheritance.js&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;export function allOf(BaseClass, ...Mixins) {

  function copyProperties(target, source) {
    const allPropertyNames = Object.getOwnPropertyNames(source).concat(Object.getOwnPropertySymbols(source))

    allPropertyNames.forEach((propertyName) =&amp;gt; {
      if (propertyName.match(/^(?:constructor|prototype|arguments|caller|name|bind|call|apply|toString|length)$/))
        return
      Object.defineProperty(target, propertyName, Object.getOwnPropertyDescriptor(source, propertyName))
    })
  }

  class Base extends BaseClass
  {
    constructor (...args) {
      super(...args)

      Mixins.forEach((Mixin) =&amp;gt; {
        copyProperties(this, new Mixin(...args))
      })
    }
  }

  Mixins.forEach((mixin) =&amp;gt; {
    copyProperties(Base.prototype, Mixin.prototype)
  })

  return Base
}
&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;main.js&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;import { allOf } from &quot;./multiple-inheritance.js&quot;

class A
{
    constructor(name) {
        this.name = name
    }
    sayA() {
        return this.name
    }
}

class B
{
    constructor(name) {
        this.name = name
    }
    sayB() {
        return this.name
    }
}

class AB extends allOf(A, B)
{
    sayAB() {
        return this.name
    }
}

const ab = new AB(&quot;ab&quot;)
console.log(&quot;ab.sayA() = &quot;+ab.sayA()+&quot;, ab.sayB() = &quot;+ab.sayB()+&quot;, ab.sayAB() = &quot;+ab.sayAB())
&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;pre&gt;&lt;code&gt;ab.sayA() = ab, ab.sayB() = ab, ab.sayAB() = ab
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;47&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 이 문제를 스스로 해결하기 위해 반 주를 보냈고, https://github.com/latitov/OOP_MI_Ct_oPlus_in_JS, 이라는 글을 전체적으로 썼습니다. 그리고 그것이 여러분 중 일부에게 도움이 되기를 바랍니다.&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;간단히 말해서, MI가 자바스크립트로 구현되는 방법은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;    class Car {
        constructor(brand) {
            this.carname = brand;
        }
        show() {
            return 'I have a ' + this.carname;
        }
    }

    class Asset {
        constructor(price) {
            this.price = price;
        }
        show() {
            return 'its estimated price is ' + this.price;
        }
    }

    class Model_i1 {        // extends Car and Asset (just a comment for ourselves)
        //
        constructor(brand, price, usefulness) {
            specialize_with(this, new Car(brand));
            specialize_with(this, new Asset(price));
            this.usefulness = usefulness;
        }
        show() {
            return Car.prototype.show.call(this) + &quot;, &quot; + Asset.prototype.show.call(this) + &quot;, Model_i1&quot;;
        }
    }

    mycar = new Model_i1(&quot;Ford Mustang&quot;, &quot;$100K&quot;, 16);
    document.getElementById(&quot;demo&quot;).innerHTML = mycar.show();
&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;pre&gt;&lt;code&gt;function specialize_with(o, S) { for (var prop in S) { o[prop] = S[prop]; } }
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;50&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다시 한번 https://github.com/latitov/OOP_MI_Ct_oPlus_in_JS 을 봐주시기 바랍니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;51&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;ES6 다중 상속에 Mixins를 사용합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;let classTwo = Base =&amp;gt; class extends Base{
    // ClassTwo Code
};

class Example extends classTwo(ClassOne) {
    constructor() {
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;52&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Well &lt;a href=&quot;https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/assign&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;52-1&quot;&gt;Object.assign&lt;/a&gt;은 ES6 클래스의 구성과 약간 비슷하지만 근접한 작업을 할 수 있는 가능성을 제공합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;class Animal {
    constructor(){ 
     Object.assign(this, new Shark()) 
     Object.assign(this, new Clock()) 
  }
}

class Shark {
  // only what's in constructor will be on the object, ence the weird this.bite = this.bite.
  constructor(){ this.color = &quot;black&quot;; this.bite = this.bite }
  bite(){ console.log(&quot;bite&quot;) }
  eat(){ console.log('eat') }
}

class Clock{
  constructor(){ this.tick = this.tick; }
  tick(){ console.log(&quot;tick&quot;); }
}

let animal = new Animal();
animal.bite();
console.log(animal.color);
animal.tick();
&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;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;function shark(){}&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;extend&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;prototype&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 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;new Shark()&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;shark&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;bite&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;method, 그것의 프로토타입만이 a를 가지고 있는 반면.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;eat&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;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;저는 이런 행동을 하기 위해 연상과 상속의 결합을 따르고 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;    class Person {
        constructor(firstname, lastname, age){
            this.firstname = firstname,
            this.lastname = lastname
            this.Age = age
        }

        fullname(){
                return this.firstname +&quot; &quot; + this.lastname;
            } 
    }

    class Organization {
        constructor(orgname){
            this.orgname = orgname;
        }
    }

    class Employee extends Person{
        constructor(firstname, lastname, age,id) {
            super(firstname, lastname, age);
            this.id = id;
        }

    }
    var emp = new Employee(&quot;John&quot;, &quot;Doe&quot;, 33,12345);
    Object.assign(emp, new Organization(&quot;Innovate&quot;));
    console.log(emp.id);
    console.log(emp.orgname);
    console.log(emp.fullname());
&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;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;export const aggregate = (...mixins) =&amp;gt; (Base) =&amp;gt; {
  const copyProps = (target, source) =&amp;gt; {
    Object.getOwnPropertyNames(source)
      .concat(Object.getOwnPropertySymbols(source))
      .forEach((prop) =&amp;gt; {
        if (prop.match(/^(?:constructor|prototype|arguments|caller|name|bind|call|apply|toString|length)$/)) {
          return;
        }
        Object.defineProperty(target, prop, Object.getOwnPropertyDescriptor(source, prop));
      });
  };
  mixins.forEach((mixin) =&amp;gt; {
    copyProps(Base, mixin);
    copyProps(Base.prototype, mixin.prototype);
  });
  return Base;
};
&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;pre&gt;&lt;code&gt;class _MyBaseClass {}
const MyBaseClass = aggregate(ExtensionOne, ExtensionTwo)(_MyBaseClass);
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;67&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;javascript에서 당신은 클래스(컨스트럭터 함수) 2개의 다른 프로토타입 객체를 줄 수 없고 just in the main protective는 프로토타입과 함께 작동하기 때문에 당신은 하나의 클래스에 대해 1개 이상의 상속을 사용할 수 &lt;strong papago-id=&quot;67-1&quot;&gt;없지만&lt;/strong&gt;, 당신은 그 상위 클래스를 리팩토링하여 수동으로 Protective 객체의 속성과 클래스 내부의 주요 속성을 집계하고 가입할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음은 새로운 버전과 가입 클래스를 목표 클래스로 &lt;strong papago-id=&quot;67-3&quot;&gt;확장&lt;/strong&gt;하여 질문에 대한 코드를 갖습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;let Join = (...classList) =&amp;gt; {

    class AggregatorClass {

        constructor() {
            classList.forEach((classItem, index) =&amp;gt; {

                let propNames = Object.getOwnPropertyNames(classItem.prototype);

                propNames.forEach(name =&amp;gt; {
                    if (name !== 'constructor') {
                        AggregatorClass.prototype[name] = classItem.prototype[name];
                    }
                });
            });

            classList.forEach(constructor =&amp;gt; {
                Object.assign(AggregatorClass.prototype, new constructor())
            });
        }
    }


    return AggregatorClass

};

&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;68&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;저는 컴파일 타임 유형 검사를 위해 JsDoc 주석과 VSCode가 있는 일반 JS(즉, Typescript가 아닌)를 사용하고 있습니다.&lt;/font&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;/p&gt; 
&lt;pre&gt;&lt;code&gt;class DerivedBase extends cloneClass(Derived, Base) {}

//To add another superclass:
//class Der1Der2Base extends cloneClass(Derived2, DerivedBase)

let o = new DerivedBase()  
&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;관련 클래스는 일반 ES6 클래스와 마찬가지로 생성할 수 있습니다.&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;/p&gt; 
&lt;ul&gt; 
 &lt;li papago-id=&quot;72&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;의 기본 제공 연산자 인스턴스 대신 InstanceOf()를 사용합니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;73&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;기본 클래스의 구성원이 아닌 구성원을 호출할 때 'super'를 사용하는 대신 super2() 함수를 사용합니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;74&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;생성자에 코드를 쓰지 말고, 생성자가 호출하는 'init()'라는 클래스 메소드로 작성합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;아래의 예를 참조하십시오.&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;pre&gt;&lt;code&gt;/* Paste the entire following text into the browser's dev console */
/* Tested on latest version of Chrome, Microsoft Edge and FireFox (Win OS)*/
/* Works with JSDoc in VSCode */
/* Not tested on minified/obfuscated code */

//#region library

const log = console.log

/**
 * abbreviation for Object.getPrototypeOf()
 * @param {any} o
 */
function proto(o) { return Object.getPrototypeOf(o) }

/** @param {function} fn */
function callIfNonNull(fn) { if (fn != null) { return fn() } }

/**
 * @param {boolean} b
 * @param {()=&amp;gt;string} [msgFn]
 */
function assert(b, msgFn) {
    if (b) { return }
    throw new Error('assert failed: ' + ((msgFn == null) ? '' : msgFn()))
}

/** @param {any} o */
function asAny(o) { return o }

/**
 * Use this function instead of super.&amp;lt;functionName&amp;gt;
 * @param {any} obj
 * @param {string} attr the name of the function/getter/setter
 * @param {any} cls the class for the current method
 * @param {any[]} args arguments to the function/getter/setter
 */
function super2(obj, attr, cls, ...args) {
    let nms = clsNms(obj)
    assert(nms[0] == nms[1])
    const objCls = proto(obj)
    const superObj = proto(ancestorNamed(objCls, cls.name))
    assert(superObj != obj)
    const attrDscr = getOwnOrBasePropDscr(superObj, attr)
    if (attrDscr == null) { return null }
    let attrVal = attrDscr['value']
    const attrGet = attrDscr['get']
    const attrSet = attrDscr['set']
    if (attrVal == null) {
        if (attrGet != null) {
            if (attrSet != null) {
                assert([0, 1].includes(args.length))
                attrVal = ((args.length == 0) ? attrGet : attrSet)
            } else {
                assert(args.length == 0,
                    () =&amp;gt; 'attr=' + attr + ', args=' + args)
                attrVal = attrGet
            }
        } else if (attrSet != null) {
            assert(args.length == 1)
            attrVal = attrSet
        } else {
            assert(false)//no get or set or value!!!!
        }
        assert(typeof attrVal == 'function')
    }
    if (typeof attrVal != 'function') { return attrVal }
    const boundFn = attrVal.bind(obj)
    return boundFn(...args)
}

/**
 * Use this function to call own prop instead of overriden prop
 * @param {any} obj
 * @param {string} attr the name of the function/getter/setter
 * @param {any} cls the class for the current method
 * @param {any[]} args arguments to the function/getter/setter
 */
function ownProp(obj, attr, cls, ...args) {
    let protoObj = ancestorNamed(proto(obj), cls.name)
    const attrDscr = Object.getOwnPropertyDescriptor(protoObj, attr)
    if (attrDscr == null) {
        log(`ownProp(): own property '${attr}' does not exist...`)
        return null
    }
    let attrVal = attrDscr['value']
    const attrGet = attrDscr['get']
    const attrSet = attrDscr['set']
    if (attrVal == null) {
        if (attrGet != null) {
            if (attrSet != null) {
                assert([0, 1].includes(args.length))
                attrVal = ((args.length == 0) ? attrGet : attrSet)
            } else {
                assert(args.length == 0,
                    () =&amp;gt; 'attr=' + attr + ', args=' + args)
                attrVal = attrGet
            }
        } else if (attrSet != null) {
            assert(args.length == 1)
            attrVal = attrSet
        } else {
            assert(false)//no get or set or value!!!!
        }
        assert(typeof attrVal == 'function')
    }
    if (typeof attrVal != 'function') {
        log(`ownProp(): own property '${attr}' not a fn...`)
        return attrVal
    }
    const boundFn = attrVal.bind(obj)
    return boundFn(...args)
}

/**
 * @param {any} obj
 * @param {string} nm
 */
function getOwnOrBasePropDscr(obj, nm) {
    let rv = Object.getOwnPropertyDescriptor(obj, nm)
    if (rv != null) { return rv }
    let protObj = proto(obj)
    if (protObj == null) { return null }
    return getOwnOrBasePropDscr(protObj, nm)
}

/**
 * @param {any} obj
 * @param {string} nm
 */
function ancestorNamed(obj, nm) {
    const ancs = ancestors(obj)
    for (const e of ancs) {
        if ((e.name || e.constructor.name) == nm) { return e }
    }
}

/**
 * @template typeOfDerivedCls
 * @template typeOfBaseCls
 * @param {typeOfDerivedCls} derivedCls
 * @param {typeOfBaseCls} baseCls
 * @returns {typeOfDerivedCls &amp;amp; typeOfBaseCls}
 */
function cloneClass(derivedCls, baseCls) {
    const derClsNm = derivedCls['name'], baseClsNm = baseCls['name']
    const gbl = globalThis

    //prevent unwanted cloning and circular inheritance:
    if (isInstanceOf(baseCls, asAny(derivedCls))) { return asAny(baseCls) }
    if (isInstanceOf(derivedCls, asAny(baseCls))) { return asAny(derivedCls) }

    //Object does not derive from anything; it is the other way round:
    if (derClsNm == 'Object') { return cloneClass(baseCls, derivedCls) }

    //use cached cloned classes if available
    if (gbl.clonedClasses == null) { gbl.clonedClasses = {} }
    const k = derClsNm + '_' + baseClsNm, kVal = gbl.clonedClasses[k]
    if (kVal != null) { return kVal }

    //clone the base class of the derived class (cloning occurs only if needed)
    let derBase = cloneClass(proto(derivedCls), baseCls)

    //clone the derived class

    const Clone = class Clone extends derBase {

        /**  @param {any[]} args */
        constructor(...args) {
            super(...args)
            ownProp(this, 'init', Clone, ...args)
        }
    }

    //clone the properties of the derived class
    Object.getOwnPropertyNames(derivedCls['prototype'])
        .filter(prop =&amp;gt; prop != 'constructor')
        .forEach(prop =&amp;gt; {
            const valToSet =
                Object.getOwnPropertyDescriptor(derivedCls['prototype'], prop)
            if (typeof valToSet == 'undefined') { return }
            Object.defineProperty(Clone.prototype, prop, valToSet)
        })

    //set the name of the cloned class to the same name as its source class:
    Object.defineProperty(Clone, 'name', { value: derClsNm, writable: true })

    //cache the cloned class created
    gbl.clonedClasses[k] = Clone
    log('Created a cloned class with id ' + k + '...')
    return asAny(Clone)
}

/**
 * don't use instanceof throughout your application, use this fn instead
 * @param {any} obj
 * @param {Function} cls
 */
function isInstanceOf(obj, cls) {
    if (obj instanceof cls) { return true }
    return clsNms(obj).includes(cls.name)
}

/** @param {any} obj */
function clsNms(obj) {
    return ancestors(obj).map(/** @param {any} e */ e =&amp;gt;
        e.name || e.constructor.name)
}

/**
 * From: https://gist.github.com/ceving/2fa45caa47858ff7c639147542d71f9f
 * Returns the list of ancestor classes.
 *
 * Example:
 *   ancestors(HTMLElement).map(e =&amp;gt; e.name || e.constructor.name)
 *   =&amp;gt; [&quot;HTMLElement&quot;, &quot;Element&quot;, &quot;Node&quot;, &quot;EventTarget&quot;, &quot;Function&quot;, &quot;Object&quot;]
 * @param {any} anyclass
 */
function ancestors(anyclass) {
    if (anyclass == null) { return [] }
    return [anyclass, ...(ancestors(proto(anyclass)))]
}

//#endregion library

//#region testData
class Base extends Object {

    /** @param {any[]} args */
    constructor(...args) {//preferably accept any input
        super(...args)
        ownProp(this, 'init', Base, ...args)
    }

    /** @param {any[]} _args */
    init(..._args) {
        log('Executing init() of class Base...')
        //TODO: add code here to get the args as a named dictionary

        //OR, follow a practice of parameterless constructors and
        //initial-value-getting methods for class field intialization

        /** example data field of the base class */
        this.baseClsFld = 'baseClsFldVal'
    }

    m1() { log('Executed base class method m1') }

    b1() { log('Executed base class method b1') }

    get baseProp() { return 'basePropVal' }
}

class Derived extends Object {//extend Object to allow use of 'super'

    /** @param {any[]} args */
    constructor(...args) {//convention: accept any input
        super(...args)
        ownProp(this, 'init', Derived, ...args)
    }

    /** @param {any[]} _args */
    init(..._args) {
        log('Executing init() of class Derived...')
        this.derClsFld = 'derclsFldVal'
    }

    m1() {
        const log = /** @param {any[]} args */(...args) =&amp;gt;
            console.log('Derived::m1(): ', ...args)
        log(`super['m1']: `, super['m1'])
        super2(this, 'm1', Derived)

        log(`super['baseProp']`, super['baseProp'])

        log(`super2(this, 'baseProp', Derived)`,
            super2(this, 'baseProp', Derived))

        log(`super2(this, 'nonExistentBaseProp', Derived)`,
            super2(this, 'nonExistentBaseProp', Derived))
    }

    m2() {
        log('Executed derived class method 2')
    }
}

class DerivedBase extends cloneClass(Derived, Base) {

    /** @param {any[]} args */
    constructor(...args) {
        super(...args)
        ownProp(this, 'init', DerivedBase, ...args)
    }

    /** @param {any[]} _args */
    init(..._args) {
        log('Executing init() of class DerivedBase...')
    }
}

log('Before defining o (object of DerivedBase)...')
let o = new DerivedBase()
log('After defining o (object of DerivedBase)...')

class Derived2 extends Base {

    /** @param {any} args */
    constructor(...args) {
        //convention/best practice: use passthrough constructors for the classes
        //you write
        super(...args)
        ownProp(this, 'init', Derived2, ...args)
    }

    /**
     * @param {any[]} _args
     */
    init(..._args) {
        log('Executing init() of class Derived2...')
    }

    derived2func() { log('Executed Derived2::derived2func()') }
}

class Der1Der2Base extends cloneClass(Derived2, DerivedBase) {

    /** @param {any} args */
    constructor(...args) {
        //convention/best practice: use passthrough constructors for the classes
        //you write
        super(...args)
        ownProp(this, 'init', Der1Der2Base, ...args)
    }

    /** @param {any[]} _args */
    init(..._args) {
        log('Executing original ctor of class Der1Der2Base...')
    }

}

log('Before defining o2...')
const o2 = new Der1Der2Base()
log('After defining o2...')

class NotInInheritanceChain { }
//#endregion testData

log('Testing fields...')
log('o.derClsFld:', o.derClsFld)
log('o.baseClsFld:', o.baseClsFld)
//o.f3  JSDoc gives error in VSCode

log('Test method calls')
o.b1()
o.m1()
o.m2()
//o.m3() //JSDoc gives error in VSCode
log('Test object o2')
o2.b1()
o2.m1()
o2.derived2func()

//don't use instanceof throughout your application, use this fn instead
log('isInstanceOf(o,DerivedBase)', isInstanceOf(o, DerivedBase))
log('isInstanceOf(o,Derived)', isInstanceOf(o, Derived))
log('isInstanceOf(o,Base)', isInstanceOf(o, Base))

log('isInstanceOf(o,NotInInheritanceChain)',
    isInstanceOf(o, NotInInheritanceChain))
&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;주의 사항: JSDoc 교차점 연산자 &amp;amp; 가 항상 작동하지 않을 수 있습니다.&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;이 인터페이스 클래스는 클래스 중 하나에서 확장할 수 있으며 다른 클래스의 인터페이스는 VsCode 빠른 수정 옵션을 사용하여 자동으로 구현할 수 있습니다.&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;js 프로그래밍을 이해하고 유연성을 더하기 위해 글을 씁니다.&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;class A{
    constructor(name)
    {
        this.name=name;
    }
    getname=function(){return this.name};
    }
    B=(x)=&amp;gt;(class B extends (()=&amp;gt;x||Object)(){
    constructor(surname,name)
    {   super(name);
        this.surname=surname;
    }
    getsurname(){return this.surname};
    })
    class C extends B(A){
    constructor(name,surname)
    {
        super(surname,name);
    }
    getfullname(){return this.name+&quot; &quot;+this.surname};
    };

    let person=new C(&quot;Ed&quot;,&quot;Boon&quot;);
    console.log(person.getname());//output Ed
    console.log(person.getsurname());//output Boon
    console.log(person.getfullname());//output Ed Boon
    console.log(person);
  console.log(person.__proto__.constructor); //person.__proto__  properties inherit from C class
   console.log(person.__proto__.__proto__.constructor); //person.__proto__.__proto__  properties inherit from B class
   console.log(person.__proto__.__proto__.__proto__.constructor); //person.__proto__.__proto__ .__proto__  properties inherit from A class&lt;/code&gt;&lt;/pre&gt; 
 &lt;/div&gt; 
&lt;/div&gt; note: person instanceof A true but person instanceof B false, because B seem as function. B only appears as a class, inside run a code defined in class B.
&lt;p&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;/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;   

 //extendsClass function using for create temporary extendedfirst argument baseClass ,other arguments is classes using for inherit
      function extendsClass(...cls)
{
  let str=&quot;&quot;;

   for (let i=arguments.length-1;i&amp;gt;0;i--)
    {
       str+=(i==1?&quot;(&quot;:&quot;&quot;)+(arguments[i-1]+&quot;&quot;).replace(RegExp(arguments[i-1].name+&quot;({|\\s.*{)?&quot;),arguments[i-1].name+&quot; extends &quot;+arguments[i].name+&quot; {&quot;).replaceAll(&quot;//super&quot;,&quot;super&quot;)+(i==1?&quot;)&quot;:&quot;&quot;);
       
    }
    return eval(str);
}
        class A{
        constructor(name)
        {
            this.name=name;
        }
        getname=function(){return this.name};
        run(){console.log(`instance of A ${this instanceof A}`)};
        }
        class B {
        constructor(surname,name)
        {   
            //super(name);
            this.surname=surname;
        }
        getsurname(){return this.surname};
        run(){
            //super.run();
        console.log(`instance of B ${this instanceof B}`)};
        }
        class C {
        constructor(name,surname)
        {
          //super(surname,name);
        }

        getfullname(){return this.name+&quot; &quot;+this.surname};
        };
         class D extends extendsClass(C,B,A) {
        constructor(name,surname,address)
        {
          super(name,surname);
          this.address=address;
        }
        }   
//extendsClass function create temprory, class C extends from B,B extends from A, A class dont create temporary stay as global class.
        var person=new (extendsClass(C,B,A))(&quot;Ed&quot;,&quot;Boon&quot;);
        console.log(person.getname());//output Ed
        console.log(person.getsurname());//output Boon
        console.log(person.getfullname());//output Ed Boon
        person.run();
        var person2=new D(&quot;Cem&quot;,&quot;Firat&quot;,&quot;A place in the world&quot;);
        console.log(person2.getname());//output Cem
        console.log(person2.getsurname());//output Firat
        console.log(person.getfullname());//output Cem Firat
        person2.run();&lt;/code&gt;&lt;/pre&gt; 
 &lt;/div&gt; 
&lt;/div&gt; 
&lt;p&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;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;import Controller from 'your-favorite-framework';

class Example extends ClassTwoMixin(ClassOneMixin(Controller)) {
  constructor() {
  }
}

const ClassOneMixin = (superclass) =&amp;gt; class extends superclass {}

const ClassTwoMixin = (superclass) =&amp;gt; class extends superclass {}
&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;자세한 내용을 보려면 &quot;상속보다 구성&quot;을 검색하십시오.&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;사용자 지정 함수와 함께 익스텐트를 사용하여 es6을 사용하여 다중 상속을 처리&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-js lang-js prettyprint-override&quot;&gt;&lt;code&gt;var aggregation = (baseClass, ...mixins) =&amp;gt; {
    let base = class _Combined extends baseClass {
        constructor (...args) {
            super(...args)
            mixins.forEach((mixin) =&amp;gt; {
                mixin.prototype.initializer.call(this)
            })
        }
    }
    let copyProps = (target, source) =&amp;gt; {
        Object.getOwnPropertyNames(source)
            .concat(Object.getOwnPropertySymbols(source))
            .forEach((prop) =&amp;gt; {
            if (prop.match(/^(?:constructor|prototype|arguments|caller|name|bind|call|apply|toString|length)$/))
                return
            Object.defineProperty(target, prop, Object.getOwnPropertyDescriptor(source, prop))
        })
    }
    mixins.forEach((mixin) =&amp;gt; {
        copyProps(base.prototype, mixin.prototype)
        copyProps(base, mixin)
    })
    return base
}

class Colored {
    initializer ()     { this._color = &quot;white&quot; }
    get color ()       { return this._color }
    set color (v)      { this._color = v }
}

class ZCoord {
    initializer ()     { this._z = 0 }
    get z ()           { return this._z }
    set z (v)          { this._z = v }
}

class Shape {
    constructor (x, y) { this._x = x; this._y = y }
    get x ()           { return this._x }
    set x (v)          { this._x = v }
    get y ()           { return this._y }
    set y (v)          { this._y = v }
}

class Rectangle extends aggregation(Shape, Colored, ZCoord) {}

var rect = new Rectangle(7, 42)
rect.z     = 1000
rect.color = &quot;red&quot;
console.log(rect.x, rect.y, rect.z, rect.color)&lt;/code&gt;&lt;/pre&gt; 
 &lt;/div&gt; 
&lt;/div&gt; 
&lt;p&gt;&lt;/p&gt;&lt;p papago-id=&quot;81&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;em papago-id=&quot;81-1&quot;&gt;sic!]&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;방법을 프로토타입에 복사하는 것은 문제가 아니라 새로 구성된 객체의 논리가 무엇인지가 문제입니다.&lt;/font&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;81-3&quot;&gt;일치&lt;/em&gt;하는 컨스트럭터를 찾지만, JS의 함수들은 더 수용적이기 때문에, 모든 것에 대해 함수를 전달할 수 있고, 서명에서는 명확하지 않을 것입니다.&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 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;instanceof&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 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;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;/*
    (c) Jon Krazov 2019

    Below is an experiment searching boundaries of JavaScript.
    It allows to compute one class out of many classes.

    Usage 1: Without own constructor

    If no constructor is passed then constructor of each class will be called
    with params passed in object. In case of missing params, constructor
    will be called without params.

    Example:

    const MyClass1 = computeClass([Class1, Class2, Class3]);
    const myClass1Instance = new MyClass1({
        'Class1': [1, 2],
        'Class2': ['test'],
        'Class3': [(value) =&amp;gt; value],
    });

    Usage 2: With own constructor

    If constructor is passed in options object (second param) then it will
    be called in place of constructors of all classes.

    Example:

    const MyClass2 = computeClass([Class1, Class2, Class3], {
        ownConstructor(param1) {
            this.name = param1;
        }
    });
    const myClass2Instance = new MyClass2('Geoffrey');
*/

// actual function

var computeClass = (classes = [], { ownConstructor = null } = {}) =&amp;gt; {
    const noConstructor = (value) =&amp;gt; value != 'constructor';

    const ComputedClass = ownConstructor === null
        ? class ComputedClass {
            constructor(args) {
                classes.forEach((Current) =&amp;gt; {
                    const params = args[Current.name];

                    if (params) {
                        Object.assign(this, new Current(...params));
                    } else {
                        Object.assign(this, new Current());
                    }
                })
            }
        }
        : class ComputedClass {
            constructor(...args) {
                if (typeof ownConstructor != 'function') {
                    throw Error('ownConstructor has to be a function!');
                }
                ownConstructor.call(this, ...args);
            } 
        };

    const prototype = classes.reduce(
        (composedPrototype, currentClass) =&amp;gt; {
            const partialPrototype = Object.getOwnPropertyNames(currentClass.prototype)
                .reduce(
                    (result, propName) =&amp;gt;
                        noConstructor(propName)
                            ? Object.assign(
                                    result,
                                    { [propName]: currentClass.prototype[propName] }
                                )
                            : result,
                    {}
                );

            return Object.assign(composedPrototype, partialPrototype);
        },
        {}
    );

    Object.entries(prototype).forEach(([prop, value]) =&amp;gt; {
	Object.defineProperty(ComputedClass.prototype, prop, { value });
    });
    
    return ComputedClass;
}

// demo part

var A = class A {
    constructor(a) {
        this.a = a;
    }
    sayA() { console.log('I am saying A'); }
}

var B = class B {
    constructor(b) {
        this.b = b;
    }
    sayB() { console.log('I am saying B'); }
}

console.log('class A', A);
console.log('class B', B);

var C = computeClass([A, B]);

console.log('Composed class');
console.log('var C = computeClass([A, B]);', C);
console.log('C.prototype', C.prototype);

var c = new C({ A: [2], B: [32] });

console.log('var c = new C({ A: [2], B: [32] })', c);
console.log('c instanceof A', c instanceof A);
console.log('c instanceof B', c instanceof B);

console.log('Now c will say:')
c.sayA();
c.sayB();

console.log('---');

var D = computeClass([A, B], {
    ownConstructor(c) {
        this.c = c;
    }
});

console.log(`var D = computeClass([A, B], {
    ownConstructor(c) {
        this.c = c;
    }
});`);

var d = new D(42);

console.log('var d = new D(42)', d);

console.log('Now d will say:')
d.sayA();
d.sayB();

console.log('---');

var E = computeClass();

console.log('var E = computeClass();', E);

var e = new E();

console.log('var e = new E()', e);&lt;/code&gt;&lt;/pre&gt; 
 &lt;/div&gt; 
&lt;/div&gt; 
&lt;p&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;85&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;원래 &lt;a href=&quot;https://gist.github.com/krazov/9f2b050c86d572336c42e4062afe1d35&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;85-1&quot;&gt;여기&lt;/a&gt;(gist.github.com )에 게시되었습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;86&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-js prettyprint-override&quot;&gt;&lt;code&gt;var mammal = {
    lungCapacity: 200,
    breath() {return 'Breathing with ' + this.lungCapacity + ' capacity.'}
}

var dog = {
    catchTime: 2,
    bark() {return 'woof'},
    playCatch() {return 'Catched the ball in ' + this.catchTime + ' seconds!'}
}

var robot = {
    beep() {return 'Boop'}
}


var robotDogProto = Object.assign({}, robot, dog, {catchTime: 0.1})
var robotDog = Object.create(robotDogProto)


var livingDogProto = Object.assign({}, mammal, dog)
var livingDog = Object.create(livingDogProto)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;87&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 메서드는 코드를 거의 사용하지 않으며 robotDogProto의 사용자 지정 catchTime과 같은 기본 속성 덮어쓰기와 같은 작업을 허용합니다.&lt;/font&gt;&lt;/p&gt;&lt;h3 papago-id=&quot;88&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;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 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;prototype&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&gt;&lt;/p&gt; 
&lt;h3 papago-id=&quot;91&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;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;Object.assign&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;작동하지만 안전하지 않으며 자동 완성이나 어떤 유형의 안전도 제공하지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;class Example {
  constructor (props) {
    Object.assign(this, new Class1(props))
    Object.assign(this, new Class2(props))
  }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;h3 papago-id=&quot;94&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;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;Example&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;클래스를 한 줄로 묶은 다음 모든 extended 클래스의 메서드에 액세스할 수 있습니다.&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;23&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;23-0&quot;&gt;옵션:&lt;/strong&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;만약 메소드가 슈퍼클래스의 메소드에 의존한다면 다른 메소드를 생성하는 것을 제안합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;BaseClass&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;class Class1 extends BaseClass {}&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;Example&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;다시 쓰이지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-js prettyprint-override&quot;&gt;&lt;code&gt;class Class1 extends BaseClass {}
class Class2 extends BaseClass {}

class Example {
  class1: Class1 // Sorry for the Typescript
  class2: Class2

  constructor (props) {
    this.class1 = new Class1(props)
    this.class2 = new Class2(props)
  }
}

&lt;/code&gt;&lt;/pre&gt; 
&lt;pre class=&quot;lang-js prettyprint-override&quot;&gt;&lt;code&gt;const example = new Example(props)
example.class1.someMethod()
&lt;/code&gt;&lt;/pre&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 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;HasGuid&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;HasName&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; JS 클래스가 다중 상속을 지원하지 않는다는 것을 알게 되었습니다.&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 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;104&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;pre&gt;&lt;code&gt;export default class JsExtend
{
    static extend(target, owner)
    {
        const METHOD_BLACKLIST = ['constructor'];

        /**
         * Methods
         */
        Object.getOwnPropertyNames(Object.getPrototypeOf(owner)).forEach(key =&amp;gt; {
            
            if (METHOD_BLACKLIST.includes(key) == false)
                target[key] = owner[key];
        });

        /**
         * Properties - keys
         */
        Object.keys(owner).forEach(key =&amp;gt; {
            target[key] = owner[key];
        });
    }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;105&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;export default class VideoModel
{

    constructor()
    {
        JsExtend.extend(this, new HasGuid());
        JsExtend.extend(this, new CanCreate());
    }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;106&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;106-0&quot;&gt;EDIT:&lt;/strong&gt; 정적 속성/메소드가 일반 메소드로 복사됩니다!&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;107&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;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&gt;&lt;code&gt;class&lt;/code&gt;&lt;/li&gt; 
 &lt;li&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&gt;&lt;code&gt;class&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 class=&quot;papago-parent&quot;&gt;혼합물로서&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;function&lt;/code&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&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&gt;&lt;code&gt;class&lt;/code&gt;&lt;/h3&gt; 
&lt;p papago-id=&quot;112&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-js prettyprint-override&quot;&gt;&lt;code&gt;const aggregator = (base, ...mixins) =&amp;gt; {
  const blackList = /^(?:constructor|prototype|arguments|caller|name|bind|call|apply|toString|length)$/
  const copyAttributes = (target, source) =&amp;gt; {
    Object.getOwnPropertyNames(source)
      .concat(Object.getOwnPropertySymbols(source))
      .forEach(prop =&amp;gt; {
        if (prop.match(blackList)) return
        Object.defineProperty(target, prop, Object.getOwnPropertyDescriptor(source, prop))
      })
  }

  return class extends base {
    constructor(...args) {
      super(...args)
      for (const mixin of mixins) {
        const target = this.constructor
        copyAttributes(target.prototype, mixin.prototype)
        copyAttributes(target, mixin)
      }
    }
  }
}
&lt;/code&gt;&lt;/pre&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; 그것은 다시 돌아옵니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;extended&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&gt;&lt;code&gt;base&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;code&gt;extended&lt;/code&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;mixin&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;.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;118&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;/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;const aggregator = (base, ...mixins) =&amp;gt; {
  const blackList = /^(?:constructor|prototype|arguments|caller|name|bind|call|apply|toString|length)$/
  const copyAttributes = (target, source) =&amp;gt; {
    Object.getOwnPropertyNames(source)
      .concat(Object.getOwnPropertySymbols(source))
      .forEach(prop =&amp;gt; {
        if (prop.match(blackList)) return
        Object.defineProperty(target, prop, Object.getOwnPropertyDescriptor(source, prop))
      })
  }

  return class extends base {
    constructor(...args) {
      super(...args)
      for (const mixin of mixins) {
        const target = this.constructor
        copyAttributes(target.prototype, mixin.prototype)
        copyAttributes(target, mixin)
      }
    }
  }
}


class A {
  foo() {
    console.log(`from A -&amp;gt; inside instance of A: ${this instanceof A}`)
  }
}

class B {
  foo() {
    if (super.foo) super.foo()
    console.log(`from B -&amp;gt; inside instance of B: ${this instanceof B}`)
  }
}

class C {
  foo() {
    if (super.foo) super.foo()
    console.log(`from C -&amp;gt; inside instance of C: ${this instanceof C}`)
  }
}

// D class, extends A and aggregates B and C
const CBA = aggregator(A, B, C)
class D extends CBA {
  foo() {
    if (super.foo) super.foo()
    console.log(`from D -&amp;gt; inside instance of D: ${this instanceof D}`)
  }
}

// E class, extends A and aggregates C
const CA = aggregator(A, C)
class E extends CA {
  foo() {
    if (super.foo) super.foo()
    console.log(`from E -&amp;gt; inside instance of E: ${this instanceof E}`)
  }
}

// F class, extends B
class F extends B {
  foo() {
    if (super.foo) super.foo()
    console.log(`from F -&amp;gt; inside instance of F: ${this instanceof F}`)
  }
}

// G class, C wrap to be used with new decorator, pretty format
class G extends aggregator(C) {}

// H class, extends B
const H = aggregator(B)

// J class, extends Object and aggregates B
const J = aggregator(Object, B)

const d = new D()
const e = new E()
const f = new F()
const g = new G()
const h = new H()
const j = new J()

console.log(`Test D:
Class: D extends A, and aggregates B and C
Instance of D: ${d instanceof D}`)
d.foo()
console.log('-')

console.log(`Test E:
Class: E extends A, and aggregates C
Instance of E: ${e instanceof E}`)
e.foo()
console.log('-')
console.log(`Test F: 
Class: F extends B
Instance of F: ${f instanceof F}`)
f.foo()
console.log('-')
console.log(`Test G:
Class: G wrapped to use C alone with &quot;new&quot; decorator
Instance of G: ${g instanceof G}`)
g.foo()
console.log('-')
console.log(`Test H:
Class: H extend B,
Instanceof B: ${h instanceof B}`)
h.foo()
console.log('-')
console.log(`Test J:
Class: H extend Object,
Instance of B: ${j instanceof B}, this one fails`)
h.foo()&lt;/code&gt;&lt;/pre&gt; 
 &lt;/div&gt; 
&lt;/div&gt; 
&lt;p&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 class=&quot;papago-parent&quot;&gt;이 구현의 문제는 확장만 하고 있다는 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;base&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;40&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;클래스. 이 경우는 테스트 J에서 보다 &lt;strong papago-id=&quot;40-1&quot;&gt;명확&lt;/strong&gt;하게 나타납니다&lt;strong papago-id=&quot;40-1&quot;&gt;.&lt;/strong&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;h3&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;41&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;class&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 class=&quot;papago-parent&quot;&gt;혼합물로서&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;function&lt;/code&gt;&lt;/h3&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;43&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;직접적인 해결책은 mixin을 사용하는 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;function&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 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 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;이 접근 방식의 비용은 일부 클래스를 mixin으로 수정해야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;function&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;45&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;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;46&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;B&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;47&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&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;48&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 class=&quot;lang-js prettyprint-override&quot;&gt;&lt;code&gt;// B mixin
const B = c =&amp;gt; class extends c {
  foo() {
    if (super.foo) super.foo()
    console.log(`[from B] is instance of B: ${this instanceof c}`)
  }
}

// C mixin
const C = c =&amp;gt; class extends c {
  foo() {
    if (super.foo) super.foo()
    console.log(`[from C] is instance of C: ${this instanceof c}`)
  }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;129&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-js prettyprint-override&quot;&gt;&lt;code&gt;

// D class, extends A class and B and C mixins
class D extends C(B(A)) {
  foo() {
    if (super.foo) super.foo()
    console.log(`[from D] is instance of D: ${this instanceof D}`)
  }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;130&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;/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;class A {
  foo() {
    console.log(`[from A] is instance of A: ${this instanceof A}`)
  }
}

// B mixin
const B = c =&amp;gt; class extends c {
  foo() {
    if (super.foo) super.foo()
    console.log(`[from B] is instance of B: ${this instanceof c}`)
  }
}

// C mixin
const C = c =&amp;gt; class extends c {
  foo() {
    if (super.foo) super.foo()
    console.log(`[from C] is instance of C: ${this instanceof c}`)
  }
}

// D class, extends A class and B and C mixins
class D extends C(B(A)) {
  foo() {
    if (super.foo) super.foo()
    console.log(`[from D] is instance of D: ${this instanceof D}`)
  }
}

// E class, extends A class and C mixin
class E extends C(A) {
  foo() {
    if (super.foo) super.foo()
    console.log(`[from E] is instance of E: ${this instanceof E}`)
  }
}

// F class, extends B mixin
class F extends B(Object) {
  foo() {
    if (super.foo) super.foo()
    console.log(`[from F] is instance of F: ${this instanceof F}`)
  }
}

// G class, wraps C mixin. Will use new decorator for instantiation, pretty format
class G extends C(Object) {}

const d = new D()
const e = new E()
const f = new F()
const g = new G()
const h = new (B(Object))

console.log(`Test D:
Class: D extends A, B and C
Instance of D: ${d instanceof D}`)
d.foo()
console.log('-')

console.log(`Test E:
Class: E extends A and C
Instance of E: ${e instanceof E}`)
e.foo()
console.log('-')
console.log(`Test F: 
Class: F extends B
Instance of F: ${f instanceof F}`)
f.foo()
console.log('-')
console.log(`Test G:
Class: G wrapped to use C alone with &quot;new&quot; decorator
Instance of G: ${g instanceof G}`)
g.foo()
console.log('-')

const isInstanceOfB = i =&amp;gt; {
  try {
    return i instanceof B
  } catch (e) {
    return false
  }
}
console.log(`Test H:
Class: Anonymous class extends Object 
Instance of B: ${isInstanceOfB(h)}
Instance of Object: ${h instanceof Object}`)
h.foo()&lt;/code&gt;&lt;/pre&gt; 
 &lt;/div&gt; 
&lt;/div&gt; 
&lt;p&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;131&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;131-0&quot;&gt;테스트 D&lt;/strong&gt;는 D 클래스가 A, B, C를 확장하고 있음을 명확하게 보여줍니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-bash prettyprint-override&quot;&gt;&lt;code&gt;Test D:
Class: D extends A, B and C
Instance of D: true
[from A] is instance of A: true
[from B] is instance of B: true
[from C] is instance of C: true
[from D] is instance of D: true
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;132&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또한, &lt;strong papago-id=&quot;132-1&quot;&gt;테스트 H&lt;/strong&gt;는 B를 확장하지 않는다는 것을 알 수 있습니다. 왜냐하면 Mixin은 확장하기 때문입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-bash prettyprint-override&quot;&gt;&lt;code&gt;Test H:
Class: Anonymous class does has a prototype 'undefined' 
Instance of B: false
Instance of Object: true
[from B] is instance of B: true
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;133&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또한 다음과 같은 더 나은 구문을 위해 Builder를 추가할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-js prettyprint-override&quot;&gt;&lt;code&gt;const extender = base =&amp;gt; new MixinBuilder(base)

// Our helper class that will make things look better
class MixinBuilder {
  constructor(base) {
    this.base = base;
  }
  with(...mixins) {
    return mixins.reduce((c, mixin) =&amp;gt; mixin(c), this.base);
  }
}
&lt;/code&gt;&lt;/pre&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;const extender = base =&amp;gt; new MixinBuilder(base)

class MixinBuilder {
  constructor(base) {
    this.base = base
  }
  
  with(...mixins) {
    return mixins.reduce((c, mixin) =&amp;gt; mixin(c), this.base)
  }
}

class A {
  foo() {
    console.log(`[from A] is instance of A: ${this instanceof A}`)
  }
}

// B mixin
const B = c =&amp;gt; class extends c {
  foo() {
    if (super.foo) super.foo()
    console.log(`[from B] is instance of B: ${this instanceof c}`)
  }
}

// C mixin
const C = c =&amp;gt; class extends c {
  foo() {
    if (super.foo) super.foo()
    console.log(`[from C] is instance of C: ${this instanceof c}`)
  }
}

// D class, extends A class and B and C mixins
const ABC = extender(A).with(B,C)
class D extends ABC {
  foo() {
    if (super.foo) super.foo()
    console.log(`[from D] is instance of D: ${this instanceof D}`)
  }
}

// E class, extends A class and C mixin
const AC = extender(A).with(C)
class E extends AC {
  foo() {
    if (super.foo) super.foo()
    console.log(`[from E] is instance of E: ${this instanceof E}`)
  }
}

// F class, extends Object and B mixin
class F extends extender(Object).with(B) {
  foo() {
    if (super.foo) super.foo()
    console.log(`[from F] is instance of F: ${this instanceof F}`)
  }
}

// G class, wraps C mixin. Will use new decorator for instantiation, pretty format
class G extends extender(Object).with(C) {}

const d = new D()
const e = new E()
const f = new F()
const g = new G()
const h = new (extender(Object).with(B))

console.log(`Test D:
Class: D extends A, B and C
Instance of D: ${d instanceof D}`)
d.foo()
console.log('-')

console.log(`Test E:
Class: E extends A and C
Instance of E: ${e instanceof E}`)
e.foo()
console.log('-')
console.log(`Test F: 
Class: F extends B
Instance of F: ${f instanceof F}`)
f.foo()
console.log('-')
console.log(`Test G:
Class: G wrapped to use C alone with &quot;new&quot; decorator
Instance of G: ${g instanceof G}`)
g.foo()
console.log('-')

const isInstanceOfB = i =&amp;gt; {
  try {
    return i instanceof B
  } catch (e) {
    return false
  }
}
console.log(`Test H:
Class: Anonymous class extends Object 
Instance of B: ${isInstanceOfB(h)}
Instance of Object: ${h instanceof Object}`)
h.foo()&lt;/code&gt;&lt;/pre&gt; 
 &lt;/div&gt; 
&lt;/div&gt; 
&lt;p&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;49&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;with&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;50&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;136&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;함수는 class1을 상속하는 새 클래스를 생성하고 class1은 class2를 상속하는 등의 작업을 수행합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;문제가 있지만 재미있는 아이디어입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var _typeof = typeof Symbol === 'function' &amp;amp;&amp;amp; typeof Symbol.iterator === 'symbol' ? function (obj) {
  return typeof obj
} : function (obj) {
  return obj &amp;amp;&amp;amp; typeof Symbol === 'function' &amp;amp;&amp;amp; obj.constructor === Symbol ? 'symbol' : typeof obj
}

function _inherits (subClass, superClass) {
  if (typeof superClass !== 'function' &amp;amp;&amp;amp; superClass !== null) {
    throw new TypeError('Super expression must either be null or a function, not ' + (
      typeof superClass === 'undefined' ? 'undefined' : _typeof(superClass)))
  }
  subClass.prototype = Object.create(
    superClass &amp;amp;&amp;amp; superClass.prototype,
    {
      constructor: {
        value: subClass,
        enumerable: false,
        writable: true,
        configurable: true
      }
    })
  if (superClass) {
    Object.setPrototypeOf
    ? Object.setPrototypeOf(subClass, superClass)
    : subClass.__proto__ = superClass.__proto__  // eslint-disable-line no-proto
  }
}

function _m (...classes) {
  let NewSuperClass = function () {}
  let c1 = NewSuperClass
  for (let c of classes) {
    _inherits(c1, c)
    c1 = c
  }
  return NewSuperClass
}

import React from 'react'

/**
 * Adds `this.log()` to your component.
 * Log message will be prefixed with the name of the component and the time of the message.
 */
export default class LoggingComponent extends React.Component {
  log (...msgs) {
    if (__DEBUG__) {
      console.log(`[${(new Date()).toLocaleTimeString()}] [${this.constructor.name}]`, ...msgs)
    }
  }
}

export class MyBaseComponent extends _m(LoggingComponent, StupidComponent) {}
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;137&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/29879267/es6-class-multiple-inheritance&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>Javascript</category>
      <author>oldcodes</author>
      <guid isPermaLink="true">https://oldcodes.tistory.com/680</guid>
      <comments>https://oldcodes.tistory.com/680#entry680comment</comments>
      <pubDate>Thu, 26 Oct 2023 21:40:11 +0900</pubDate>
    </item>
    <item>
      <title>C에서 자체 수정 코드를 작성하는 방법은?</title>
      <link>https://oldcodes.tistory.com/679</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 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 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&gt;&lt;code&gt;&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
for i in 1 to  100, do 
begin
   x := 200
   for j in 200 downto 1, do
    begin
       do something
    end
end
&lt;/code&gt;&lt;/pre&gt;
&lt;code&gt; &lt;/code&gt;
&lt;p&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;x := 200&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;x := 199&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;x := 198&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&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;그것을 위해서 인라인 어셈블리를 사용해야 합니까?&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;편집 : C에서 하고 싶은 이유는 다음과 같습니다.&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;하이퍼바이저는 코드 덩어리를 변환하는 이진 변환기입니다.&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;코드가 즉시 수정되면 번역자는 이를 알아차리고 이전 번역이 오래된 것으로 표시합니다.&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;나는 단지 코드를 스스로 수정하는 것이 이것을 달성하는 환상적인 방법이 될 것이라고 생각합니다.&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;C에서 자체 수정 코드를 구축할 수 있는 가상 시스템을 작성하는 것을 고려해 볼 수 있습니다.&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;font class=&quot;papago-parent&quot;&gt;그렇게 하려면 프로그램의 코드 바이트의 메모리 내 주소를 구해야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러면 이 메모리 범위에서 운영 체제 보호를 조작하여 Access Violation(액세스 위반)이나 ''을 겪지 않고 바이트를 수정할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;SIG_SEGV&quot;'.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;마지막으로, 컴파일된 프로그램의 opcode를 수정하기 위해 포인터(&quot;부호 문자 *&quot; 포인터, RISC 기계에서와 같이 &quot;부호 긴 *&quot; 포인터)를 사용합니다.&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;font class=&quot;papago-parent&quot;&gt;실행 중인 C 코드에 대한 표준 형식이 없습니다. C는 컴파일러에 대한 텍스트 입력 파일의 사양입니다.&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;죄송합니다. 답변이 조금 늦었습니다만, 찾으시는 물건을 정확히 찾은 것 같습니다. https://shanetully.com/2013/12/writing-a-self-mutating-x86_64-c-program/&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 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;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;unistd.h&amp;gt;
#include &amp;lt;errno.h&amp;gt;
#include &amp;lt;string.h&amp;gt;
#include &amp;lt;sys/mman.h&amp;gt;

void foo(void);
int change_page_permissions_of_address(void *addr);

int main(void) {
    void *foo_addr = (void*)foo;

    // Change the permissions of the page that contains foo() to read, write, and execute
    // This assumes that foo() is fully contained by a single page
    if(change_page_permissions_of_address(foo_addr) == -1) {
        fprintf(stderr, &quot;Error while changing page permissions of foo(): %s\n&quot;, strerror(errno));
        return 1;
    }

    // Call the unmodified foo()
    puts(&quot;Calling foo...&quot;);
    foo();

    // Change the immediate value in the addl instruction in foo() to 42
    unsigned char *instruction = (unsigned char*)foo_addr + 18;
    *instruction = 0x2A;

    // Call the modified foo()
    puts(&quot;Calling foo...&quot;);
    foo();

    return 0;
}

void foo(void) {
    int i=0;
    i++;
    printf(&quot;i: %d\n&quot;, i);
}

int change_page_permissions_of_address(void *addr) {
    // Move the pointer to the page boundary
    int page_size = getpagesize();
    addr -= (unsigned long)addr % page_size;

    if(mprotect(addr, page_size, PROT_READ | PROT_WRITE | PROT_EXEC) == -1) {
        return -1;
    }

    return 0;
}
&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;가능하지만 대부분은 불가능할 수 있으며 실행 중인 코드에 대한 읽기 전용 메모리 세그먼트 및 OS에서 설치한 기타 장애물과 씨름해야 할 수도 있습니다.&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;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;C의 본질적인 Lisp 기능:&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;http://nakkaya.com/2010/08/24/a-micro-manual-for-lisp-implemented-in-c/&quot; rel=&quot;noreferrer&quot; papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;http://nakkaya.com/2010/08/24/a-micro-manual-for-lisp-implemented-in-c/&lt;/font&gt;&lt;/a&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 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;x&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;i&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 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;#include &amp;lt;stdio.h&amp;gt;

void multiply_x (int * x, int multiplier)
{
    *x *= multiplier;
}

void add_to_x (int * x, int increment)
{
    *x += increment;
}

int main (void)
{
    int x = 0;
    int i;

    void (*fp)(int *, int);

    for (i = 1; i &amp;lt; 6; ++i) {
            fp = (i % 2) ? add_to_x : multiply_x;

            fp(&amp;amp;x, i);

            printf(&quot;%d\n&quot;, x);
    }

    return 0;
}
&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;1
2
5
20
25
&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&gt;&lt;code&gt;x&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;마다 &quot;&lt;font class=&quot;papago-parent&quot;&gt;자체&lt;/font&gt; 수정&quot;에서 원하는 부분의 일부인 변경 사항을 지속적으로 &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;&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;이런 방법을 추천할 수 있을지 모르겠습니다.&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;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;이를 위해서는 (C처럼 딱딱하게 컴파일되고 연결되지 않은) 자기 해석 언어가 더 나을 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;펄,자바스크립트,PHP는악을가지고있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;eval()&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&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;eval()&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;/p&gt;&lt;p papago-id=&quot;28&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;LISP를 C에 구현한 후 사용하자는 의견은 휴대성 문제 때문에 확고합니다.&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;다른 하나는 mprotect()를 사용하여 코드 섹션을 쓰기 가능하게 만든 다음 컴파일러가 만든 함수를 수정하는 것입니다.&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;이와 같은 기술은 프로그래밍 문제와 난독화된 경쟁에 재미가 있지만 C가 정의되지 않은 동작을 이용한다는 사실과 코드를 읽을 수 없는 수준으로 결합하는 것을 고려할 때 프로덕션 환경에서는 이러한 기술을 사용하는 것이 가장 좋습니다.&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;표준 C11(읽기 &lt;a href=&quot;http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;31-1&quot;&gt;n1570&lt;/a&gt;)에서는 자체 &lt;strong papago-id=&quot;31-3&quot;&gt;수정 코드를 작성&lt;/strong&gt;할 수 &lt;strong papago-id=&quot;31-3&quot;&gt;없습니다&lt;/strong&gt;(적어도 &lt;a href=&quot;https://en.wikipedia.org/wiki/Undefined_behavior&quot; papago-id=&quot;31-5&quot; rel=&quot;nofollow noreferrer&quot;&gt;정의&lt;/a&gt;되지 않은 &lt;a href=&quot;https://en.wikipedia.org/wiki/Undefined_behavior&quot; papago-id=&quot;31-5&quot; rel=&quot;nofollow noreferrer&quot;&gt;동작&lt;/a&gt; 없이).&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;적어도 개념적으로는 &lt;a href=&quot;https://en.wikipedia.org/wiki/Code_segment&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;31-7&quot;&gt;코드 세그먼트&lt;/a&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;a href=&quot;https://en.wikipedia.org/wiki/Dynamic_linker&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;32-3&quot;&gt;동적 연결기&lt;/a&gt;를 사용하여 &lt;a href=&quot;https://en.wikipedia.org/wiki/Plug-in_(computing)&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;32-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;POSIX에서는 &lt;a href=&quot;http://pubs.opengroup.org/onlinepubs/009695399/functions/dlopen.html&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;32-5&quot;&gt;dlopen&lt;/a&gt;(그리고 새로 로드된 함수 포인터를 가져오려면 &lt;a href=&quot;http://pubs.opengroup.org/onlinepubs/009695399/functions/dlsym.html&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;32-7&quot;&gt;dlsym&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;33&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;목표를 달성하기 위해 일부 JIT &lt;a href=&quot;https://en.wikipedia.org/wiki/Just-in-time_compilation&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;33-1&quot;&gt;컴파일&lt;/a&gt; 라이브러리(예: &lt;a href=&quot;https://gcc.gnu.org/onlinedocs/jit/&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;33-3&quot;&gt;libgccjit&lt;/a&gt; &lt;a href=&quot;https://github.com/asmjit/asmjit&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;33-5&quot;&gt;또는&lt;/a&gt; asmjit)를 사용할 수도 있습니다.&lt;/font&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;C 컴파일러는 주어진 함수 호출이나 점프에 대해 다양한 크기의 코드를 생성할 수 있으므로, 기계 특정한 방식으로 덮어쓰기도 부서지기 쉽다는 것을 기억하세요.&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;친구와 저는 코드를 스스로 수정하는 게임을 하다가 이 문제를 겪었습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용자가 x86 어셈블리에서 코드 스니펫을 다시 쓸 수 있게 해줍니다.&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;/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;FASM 어셈블러: https://github.com/ZenLulz/Fasm.NET&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;Udis86 분해기: https://github.com/vmt/udis86&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;쓰기-백(write-back)은 다음을 사용해야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;VirtualProtect&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;code&gt;mprotect&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 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://github.com/Squalr/SelfHackingApp&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;42-3&quot;&gt;샘플 코드&lt;/a&gt;뿐만 아니라 어떻게 했는지에 &lt;a href=&quot;https://medium.com/squallygame/how-we-wrote-a-self-hacking-game-in-c-d8b9f97bfa99&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;42-1&quot;&gt;대해서&lt;/a&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;이러한 예는 C++를 사용하는 Windows에 있지만 크로스 플랫폼과 C만 만드는 것은 매우 쉬울 것입니다.&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;이것은 c++로 윈도우에서 하는 방법입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;읽기/쓰기 방지 기능이 있는 바이트 배열을 VirtualAllocate하고, 거기에 코드를 복사하고, 읽기/실행 방지 기능이 있는 VirtualProtect를 실행해야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;아무것도 하지 않고 돌아오는 함수를 동적으로 만드는 방법은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-cpp prettyprint-override&quot;&gt;&lt;code&gt;#include &amp;lt;cstdio&amp;gt;
#include &amp;lt;Memoryapi.h&amp;gt;
#include &amp;lt;windows.h&amp;gt;
using namespace std;
typedef unsigned char byte;

int main(int argc, char** argv){
    byte bytes [] = { 0x48, 0x31, 0xC0, 0x48, 0x83, 0xC0, 0x0F, 0xC3 }; //put code here
    //xor %rax, %rax
    //add %rax, 15
    //ret
    int size = sizeof(bytes);
    DWORD protect = PAGE_READWRITE;
    void* meth = VirtualAlloc(NULL, size, MEM_COMMIT, protect);
    byte* write = (byte*) meth;
    for(int i = 0; i &amp;lt; size; i++){
        write[i] = bytes[i];
    }
    if(VirtualProtect(meth, size, PAGE_EXECUTE_READ, &amp;amp;protect)){
        typedef int (*fptr)();
        fptr my_fptr = reinterpret_cast&amp;lt;fptr&amp;gt;(reinterpret_cast&amp;lt;long&amp;gt;(meth));
        int number = my_fptr();
        for(int i = 0; i &amp;lt; number; i++){
            printf(&quot;I will say this 15 times!\n&quot;);
        }
        return 0;
    } else{
        printf(&quot;Unable to VirtualProtect code with execute protection!\n&quot;);
        return 1;
    }
}

&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;a href=&quot;https://defuse.ca/online-x86-assembler.htm#disassembly&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;45-1&quot;&gt;이 도구&lt;/a&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;C에서 &quot;진정한&quot; 자체 수정 코드는 불가능하지만(조립 방식이 약간 속임수처럼 느껴지기 때문에, 이 시점에서 우리는 원래 질문이었던 C에서가 아니라 조립에서 자체 수정 코드를 쓰고 있기 때문에), 역설적으로 문장이 당신이 해야 할 일을 하지 않는 유사한 효과를 만드는 순수한 C 방법이 있을 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 역설적으로 ASM 자체 수정 코드와 다음의 C 스니펫 모두 표면적으로/직관적으로 말이 안 될 수도 있지만, 직관을 제쳐두고 논리적 분석을 하면 논리적이기 때문에 역설을 만드는 불일치를 말합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;string.h&amp;gt;

int main()
{
    struct Foo
    {
        char a;
        char b[4];
    } foo;

    foo.a = 42;
    strncpy(foo.b, &quot;foo&quot;, 3);
    printf(&quot;foo.a=%i, foo.b=\&quot;%s\&quot;\n&quot;, foo.a, foo.b);

    *(int*)&amp;amp;foo.a = 1918984746;
    printf(&quot;foo.a=%i, foo.b=\&quot;%s\&quot;\n&quot;, foo.a, foo.b);

    return 0;
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;pre&gt;&lt;code&gt;$ gcc -o foo foo.c &amp;amp;&amp;amp; ./foo
foo.a=42, foo.b=&quot;foo&quot;
foo.a=42, foo.b=&quot;bar&quot;
&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;foo.a&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;foo.b&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 class=&quot;papago-parent&quot;&gt;그러면 우리는 오직 값만 바꿉니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;foo.a&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;p papago-id=&quot;51&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/7447013/how-to-write-self-modifying-code-in-c&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>c</category>
      <author>oldcodes</author>
      <guid isPermaLink="true">https://oldcodes.tistory.com/679</guid>
      <comments>https://oldcodes.tistory.com/679#entry679comment</comments>
      <pubDate>Thu, 26 Oct 2023 21:39:32 +0900</pubDate>
    </item>
    <item>
      <title>data.frame 행을 N번 반복합니다.</title>
      <link>https://oldcodes.tistory.com/678</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;data.frame 행을 N번 반복합니다.&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;data.frame(a = c(1,2,3),b = c(1,2,3))
  a b
1 1 1
2 2 2
3 3 3
&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;em papago-id=&quot;2-1&quot;&gt;n번&lt;/em&gt; 반복하고 싶습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를 들어, 여기서 행은 3번 반복됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;  a b
1 1 1
2 2 2
3 3 3
4 1 1
5 2 2
6 3 3
7 1 1
8 2 2
9 3 3
&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;이것을 R에서 쉽게 할 수 있는 기능이 있습니까?&lt;/font&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;EDIT: 더 나은 현대적인 R 답변으로 업데이트.&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&gt;&lt;/font&gt;&lt;code&gt;replicate()&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;rbind&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 class=&quot;papago-parent&quot;&gt;행 이름이 1:nrows부터 실행되도록 자동으로 변경됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;d &amp;lt;- data.frame(a = c(1,2,3),b = c(1,2,3))
n &amp;lt;- 3
do.call(&quot;rbind&quot;, replicate(n, d, simplify = FALSE))
&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; d[rep(seq_len(nrow(d)), n), ]
&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;purrr&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;기능적 프로그래밍, 관용적 purrr:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;purrr::map_dfr(seq_len(3), ~d)
&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;그리고 관용적인 purrr(identical 결과는 더 어색하지만)을 덜합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;purrr::map_dfr(seq_len(3), function(x) d)
&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;/font&gt;&lt;/font&gt;&lt;code&gt;dplyr&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;pre&gt;&lt;code&gt;d %&amp;gt;% slice(rep(row_number(), 3))
&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;data.frame&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;objects, 이 솔루션은 @mdsummer's 및 @wojciech-sobala보다 몇 배 빠릅니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;d[rep(seq_len(nrow(d)), n), ]
&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;data.table&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;10&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;objects, @mdsummer's는 변환 후 위를 적용하는 것보다 조금 빠릅니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;data.frame&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;img src=&quot;https://i.stack.imgur.com/hyrhD.png&quot; alt=&quot;microbenchmark&quot;&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 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;packages &amp;lt;- c(&quot;data.table&quot;, &quot;ggplot2&quot;, &quot;RUnit&quot;, &quot;microbenchmark&quot;)
lapply(packages, require, character.only=T)

Repeat1 &amp;lt;- function(d, n) {
  return(do.call(&quot;rbind&quot;, replicate(n, d, simplify = FALSE)))
}

Repeat2 &amp;lt;- function(d, n) {
  return(Reduce(rbind, list(d)[rep(1L, times=n)]))
}

Repeat3 &amp;lt;- function(d, n) {
  if (&quot;data.table&quot; %in% class(d)) return(d[rep(seq_len(nrow(d)), n)])
  return(d[rep(seq_len(nrow(d)), n), ])
}

Repeat3.dt.convert &amp;lt;- function(d, n) {
  if (&quot;data.table&quot; %in% class(d)) d &amp;lt;- as.data.frame(d)
  return(d[rep(seq_len(nrow(d)), n), ])
}

# Try with data.frames
mtcars1 &amp;lt;- Repeat1(mtcars, 3)
mtcars2 &amp;lt;- Repeat2(mtcars, 3)
mtcars3 &amp;lt;- Repeat3(mtcars, 3)

checkEquals(mtcars1, mtcars2)
#  Only difference is row.names having &quot;.k&quot; suffix instead of &quot;k&quot; from 1 &amp;amp; 2
checkEquals(mtcars1, mtcars3)

# Works with data.tables too
mtcars.dt &amp;lt;- data.table(mtcars)
mtcars.dt1 &amp;lt;- Repeat1(mtcars.dt, 3)
mtcars.dt2 &amp;lt;- Repeat2(mtcars.dt, 3)
mtcars.dt3 &amp;lt;- Repeat3(mtcars.dt, 3)

# No row.names mismatch since data.tables don't have row.names
checkEquals(mtcars.dt1, mtcars.dt2)
checkEquals(mtcars.dt1, mtcars.dt3)

# Time test
res &amp;lt;- microbenchmark(Repeat1(mtcars, 10),
                      Repeat2(mtcars, 10),
                      Repeat3(mtcars, 10),
                      Repeat1(mtcars.dt, 10),
                      Repeat2(mtcars.dt, 10),
                      Repeat3(mtcars.dt, 10),
                      Repeat3.dt.convert(mtcars.dt, 10))
print(res)
ggsave(&quot;repeat_microbenchmark.png&quot;, autoplot(res))
&lt;/code&gt;&lt;/pre&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;dplyr&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;bind_rows()&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;do.call()&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;rbind()&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;df &amp;lt;- data.frame(a = c(1, 2, 3), b = c(1, 2, 3))
library(dplyr)
bind_rows(replicate(3, df, simplify = FALSE))
&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;bind_rows()&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;rbind()&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;pre&gt;&lt;code&gt;library(microbenchmark)
microbenchmark(rbind = do.call(&quot;rbind&quot;, replicate(1000, df, simplify = FALSE)),
               bind_rows = bind_rows(replicate(1000, df, simplify = FALSE)),
               times = 20)
## Unit: milliseconds
##       expr       min        lq      mean   median        uq       max neval cld
##      rbind 31.796100 33.017077 35.436753 34.32861 36.773017 43.556112    20   b
##  bind_rows  1.765956  1.818087  1.881697  1.86207  1.898839  2.321621    20  a 
&lt;/code&gt;&lt;/pre&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;a class=&quot;post-tag&quot; href=&quot;/questions/tagged/data.table&quot; papago-id=&quot;29-1&quot; rel=&quot;tag&quot; title=&quot;'data.table' 태그가 지정된 질문을 합니다.&quot; papago-attr-id=&quot;1&quot;&gt;data.&lt;/a&gt;table-package를 사용하면 특별한 기호를 사용할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;.I&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;rep&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;/p&gt; 
&lt;pre&gt;&lt;code&gt;df &amp;lt;- data.frame(a = c(1,2,3), b = c(1,2,3))
dt &amp;lt;- as.data.table(df)

n &amp;lt;- 3

dt[rep(dt[, .I], n)]
&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;blockquote&gt; 
 &lt;pre&gt;&lt;code&gt;   a b
1: 1 1
2: 2 2
3: 3 3
4: 1 1
5: 2 2
6: 3 3
7: 1 1
8: 2 2
9: 3 3
&lt;/code&gt;&lt;/pre&gt; 
&lt;/blockquote&gt;&lt;pre&gt;&lt;code&gt;d &amp;lt;- data.frame(a = c(1,2,3),b = c(1,2,3))
r &amp;lt;- Reduce(rbind, list(d)[rep(1L, times=3L)])
&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;library(data.table)
my_data &amp;lt;- data.frame(a = c(1,2,3),b = c(1,2,3))
rbindlist(replicate(n = 3, expr = my_data, simplify = FALSE)
&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;pre&gt;&lt;code&gt;mydata&amp;lt;-data.frame(a = c(1,2,3),b = c(1,2,3)) #creating your data frame  
n&amp;lt;-10           #defining no. of time you want repetition of the rows of your dataframe

mydata&amp;lt;-mydata[rep(rownames(mydata),n),] #use rep function while doing indexing 
rownames(mydata)&amp;lt;-1:NROW(mydata)    #rename rows just to get cleaner look of data
&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;strong papago-id=&quot;35-1&quot;&gt;저&lt;/strong&gt;는 다른 방식의 rbind를 비교하는 것을 제안하고자 합니다.&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-html lang-html prettyprint-override&quot;&gt;&lt;code&gt;&amp;gt; mydata &amp;lt;- data.frame(a=1:200,b=201:400,c=301:500)
&amp;gt; microbenchmark(rbind = do.call(&quot;rbind&quot;,replicate(n=100,mydata,simplify = FALSE)),
+                bind_rows = bind_rows(replicate(n=100,mydata,simplify = FALSE)),
+                rbindlist = rbindlist(replicate(n=100,exp= mydata,simplify = FALSE)),
+                times= 2000)
Unit: microseconds
      expr    min      lq      mean  median      uq      max neval
     rbind 5760.7 6723.10 8642.6930 7132.30 7761.05 240720.3  2000
 bind_rows  976.4 1186.90 1430.7741 1308.85 1469.80  15817.9  2000
 rbindlist  263.6  347.85  465.5894  392.90  459.95  10974.2  2000&lt;/code&gt;&lt;/pre&gt; 
 &lt;/div&gt; 
&lt;/div&gt; 
&lt;p&gt;&lt;/p&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;dplyr&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&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;gt; exdf &amp;lt;- data.frame(id = LETTERS[1:6],
+                    blue1 = c(T,T,T,T,T,T),
+                    blue2 = c(T,T,F,F,T,T),
+                    red1 = c(T,F,T,F,T,F),
+                    red2 = c(F,F,T,F,F,F),
+                    n_times = 1:6)
&amp;gt; 
&amp;gt; exdf
  id blue1 blue2  red1  red2 n_times
1  A  TRUE  TRUE  TRUE FALSE       1
2  B  TRUE  TRUE FALSE FALSE       2
3  C  TRUE FALSE  TRUE  TRUE       3
4  D  TRUE FALSE FALSE FALSE       4
5  E  TRUE  TRUE  TRUE FALSE       5
6  F  TRUE  TRUE FALSE FALSE       6
&amp;gt; 
&amp;gt; exdf %&amp;gt;% slice(rep(seq(n()), n_times))
   id blue1 blue2  red1  red2 n_times
1   A  TRUE  TRUE  TRUE FALSE       1
2   B  TRUE  TRUE FALSE FALSE       2
3   B  TRUE  TRUE FALSE FALSE       2
4   C  TRUE FALSE  TRUE  TRUE       3
5   C  TRUE FALSE  TRUE  TRUE       3
6   C  TRUE FALSE  TRUE  TRUE       3
7   D  TRUE FALSE FALSE FALSE       4
8   D  TRUE FALSE FALSE FALSE       4
9   D  TRUE FALSE FALSE FALSE       4
10  D  TRUE FALSE FALSE FALSE       4
11  E  TRUE  TRUE  TRUE FALSE       5
12  E  TRUE  TRUE  TRUE FALSE       5
13  E  TRUE  TRUE  TRUE FALSE       5
14  E  TRUE  TRUE  TRUE FALSE       5
15  E  TRUE  TRUE  TRUE FALSE       5
16  F  TRUE  TRUE FALSE FALSE       6
17  F  TRUE  TRUE FALSE FALSE       6
18  F  TRUE  TRUE FALSE FALSE       6
19  F  TRUE  TRUE FALSE FALSE       6
20  F  TRUE  TRUE FALSE FALSE       6
21  F  TRUE  TRUE FALSE FALSE       6
&lt;/code&gt;&lt;/pre&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&gt;&lt;/font&gt;&lt;code&gt;&quot;n_times&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 class=&quot;papago-parent&quot;&gt;다른 사람이 이미...&lt;/font&gt;&lt;/font&gt;&lt;code&gt;exdf %&amp;gt;% slice(rep(seq(n()), 4))&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;28&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;모든 행을 4번 복제합니다.&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&gt;&lt;/font&gt;&lt;code&gt;tidyr::uncount&lt;/code&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;/p&gt; 
&lt;pre class=&quot;lang-r prettyprint-override&quot;&gt;&lt;code&gt;data.frame(a = c(1,2,3),b = c(1,2,3)) %&amp;gt;% 
  tidyr::uncount(3)
&lt;/code&gt;&lt;/pre&gt; 
&lt;pre class=&quot;lang-r prettyprint-override&quot;&gt;&lt;code&gt;  a b
1 1 1
2 1 1
3 1 1
4 2 2
5 2 2
6 2 2
7 3 3
8 3 3
9 3 3
&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;    dt[,.SD[rep(.I,n)]]
    dt[,.SD[rep(.I,each=n)]]
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;44&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;data.frame의 경우(로우네임과 관련된 일부 문제)&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;    df[rep(1:nrow(df),n),]
    df[rep(1:nrow(df),each=n),]
&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;n반복 횟수&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;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/8753531/repeat-rows-of-a-data-frame-n-times&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>dataframe</category>
      <author>oldcodes</author>
      <guid isPermaLink="true">https://oldcodes.tistory.com/678</guid>
      <comments>https://oldcodes.tistory.com/678#entry678comment</comments>
      <pubDate>Thu, 26 Oct 2023 21:39:22 +0900</pubDate>
    </item>
    <item>
      <title>.xlsx에서 셀 색상 가져오기</title>
      <link>https://oldcodes.tistory.com/677</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.xlsx에서 셀 색상 가져오기&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;저는 openpyxl을 사용하여 엑셀 파일을 읽고 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 &quot;xlsx&quot; 파일에서 셀 색상을 받고 싶습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;색상을 구하려고 했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;wb = load_workbook('Test.xlsx', data_only=True)
sh = wb[Sheet1]
sh['A1'].fill.start_color.index #Green Color
&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;&quot;11L&quot;을 받는데 RGB 색상을 구해야 하는데 어떻게 해야 하나요?&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;이들에 대한 매핑은 다음의 출처에 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;COLOR_INDEX = (
    '00000000', '00FFFFFF', '00FF0000', '0000FF00', '000000FF', #0-4
    '00FFFF00', '00FF00FF', '0000FFFF', '00000000', '00FFFFFF', #5-9
    '00FF0000', '0000FF00', '000000FF', '00FFFF00', '00FF00FF', #10-14
    '0000FFFF', '00800000', '00008000', '00000080', '00808000', #15-19
    '00800080', '00008080', '00C0C0C0', '00808080', '009999FF', #20-24
    '00993366', '00FFFFCC', '00CCFFFF', '00660066', '00FF8080', #25-29
    '000066CC', '00CCCCFF', '00000080', '00FF00FF', '00FFFF00', #30-34
    '0000FFFF', '00800080', '00800000', '00008080', '000000FF', #35-39
    '0000CCFF', '00CCFFFF', '00CCFFCC', '00FFFF99', '0099CCFF', #40-44
    '00FF99CC', '00CC99FF', '00FFCC99', '003366FF', '0033CCCC', #45-49
    '0099CC00', '00FFCC00', '00FF9900', '00FF6600', '00666699', #50-54
    '00969696', '00003366', '00339966', '00003300', '00333300', #55-59
    '00993300', '00993366', '00333399', '00333333', 'System Foreground', 'System Background' #60-64
)
&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;11L는 0000에 해당합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;RGB 튜플이 녹색(0,255,0)일 FF00(16진수).&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;pre&gt;&lt;code&gt;wb = load_workbook('Test.xlsx', data_only=True)
sh = wb[Sheet1]
i=sh['A1'].fill.start_color.index #Green Color
Colors=styles.colors.COLOR_INDEX
result = str(Coloros[i])
result= &quot;#&quot;+result[2:]
&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;xlsx&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;openpyxl&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;A2&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;import openpyxl
from openpyxl import load_workbook
excel_file = 'color_codes.xlsx' 
wb = load_workbook(excel_file, data_only = True)
sh = wb['Sheet1']
color_in_hex = sh['A2'].fill.start_color.index # this gives you Hexadecimal value of the color
print ('HEX =',color_in_hex) 
print('RGB =', tuple(int(color_in_hex[i:i+2], 16) for i in (0, 2, 4))) # Color in RGB
&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;openpyxl==3.0.7&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;val = int(_cell.fill.start_color.index, 16)
hex_color = &quot;%06x&quot; % (val &amp;amp;&amp;amp; 0xFFFFFF)
&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;Summit Pokhrel의 해결책이 저에게 &lt;em papago-id=&quot;12-1&quot;&gt;거의&lt;/em&gt; 효과가 있었습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;마지막 줄을 다음 줄로 바꿔야 했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;print('RGB =', tuple(int(color_in_hex[i:i+2], 16) for i in (2, 4, 6))) # Color in RGB  
&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;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/32736419/get-cell-color-from-xlsx&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>excel</category>
      <author>oldcodes</author>
      <guid isPermaLink="true">https://oldcodes.tistory.com/677</guid>
      <comments>https://oldcodes.tistory.com/677#entry677comment</comments>
      <pubDate>Thu, 26 Oct 2023 21:39:11 +0900</pubDate>
    </item>
    <item>
      <title>MariaDB 데이터베이스에서 mediumblob 값 업데이트 실패</title>
      <link>https://oldcodes.tistory.com/676</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;MariaDB 데이터베이스에서 mediumblob 값 업데이트 실패&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;저는 MS Access Frontend로 서버측 MariaDB 데이터베이스를 사용하고 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;nomapp 데이터 테이블의 데이터베이스에 다음 구조로 이진 파일을 업로드하려고 합니다.&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;IDint(11)&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;appCode 미디엄블롭&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;업로드에 사용되는 기능은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Function saveFileToDB(ID As Long, fName As String)

Dim myConn As New ADODB.connection
Dim rsADO As New ADODB.Recordset
Dim st As New ADODB.Stream

On Error Resume Next

strSQL = &quot;SELECT nomappdata.* FROM nomappdata WHERE ID = &quot; &amp;amp; ID

With myConn
    .ConnectionString = getConnStrMySQL(&quot;N&quot;)
    .Open
End With

If myConn.Errors.Count = 0 Then

    With rsADO
        .CursorType = adOpenStatic
        .LockType = adLockOptimistic
        .ActiveConnection = myConn
        .Open strSQL

    End With
    
    With st
        .Type = adTypeBinary
        .Open
        .LoadFromFile fName
    End With
    
    With rsADO
        .Fields(&quot;appCode&quot;).Value = st.Read
        .Update
    End With

End If

st.Close
Set st = Nothing
rsADO.Close
Set rsADO = Nothing
myConn.Close
Set myConn = Nothing
End Function
&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;제가 업로드 하려고 하는 테스트 파일 크기는 약 73kByte입니다.&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;연결이 작동했습니다(상태 = 1 ).&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;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;크기가 64kBytes 미만인 파일의 경우 스크립트는 정상적으로 작동하지만 그렇지 않으면 업데이트가 작동하지 않기 때문에 업데이트 전에 이전 값을 삭제해야 합니다.&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;문제는 디버그 프롬프트가 &quot;에 도달하는 경우입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&quot;Update&quot; 라인, 액세스가 잠시 대기하다가 예기치 않게 충돌합니다.&lt;/font&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;저는 다음 소프트웨어를 사용하고 있습니다.&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;Microsoft Access for Microsoft 365 MSO(16.0.13001.20338) 64비트 MariaDB 10.1.40-MariaDB mariadb-connector-odbc-3.1.9-win64&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;# The MySQL server
[mysqld]
port= 3306
socket = &quot;D:/xampp/mysql/mysql.sock&quot;
basedir = &quot;D:/xampp/mysql&quot; 
tmpdir = &quot;D:/xampp/tmp&quot; 
datadir = &quot;D:/xampp/mysql/data&quot;
pid_file = &quot;mysql.pid&quot;
# enable-named-pipe
key_buffer = 16M
max_allowed_packet = 16M
sort_buffer_size = 512K
net_buffer_length = 8K
read_buffer_size = 256K
read_rnd_buffer_size = 512K
myisam_sort_buffer_size = 8M
log_error = &quot;mysql_error.log&quot;
&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;Dim fileData() As Byte

With st
    .Type = adTypeBinary
    .Open
    .LoadFromFile fName
End With


With rsADO
    .CursorLocation = adUseClient
    .CursorType = adOpenStatic
    .LockType = adLockOptimistic
    .ActiveConnection = myConn
    .Open strSQL
    .Fields(&quot;appCode&quot;).Value = st.Read
    .Update
    .Close
End With
&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;&quot;MariaDB ODBC 3.1 드라이버&quot;의 버그(ODBC-251)인 것 같습니다.&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;MySQL/ODBC Connector 8.0.19&quot;(또는 최신 버전)를 사용합니다!&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;ol&gt; 
 &lt;li papago-id=&quot;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://mariadb.com/kb/en/load_file/&quot; papago-id=&quot;17-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;LOAD_&lt;/a&gt; 사용&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://mariadb.com/kb/en/load_file/&quot; papago-id=&quot;17-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;FILE&lt;/a&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;데이터를 파일 시스템에 저장하고 DB에 대한 경로만 저장합니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&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;URL : https://stackoverflow.com/questions/63068681/fail-on-update-a-mediumblob-value-in-mariadb-database&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>MariaDB</category>
      <author>oldcodes</author>
      <guid isPermaLink="true">https://oldcodes.tistory.com/676</guid>
      <comments>https://oldcodes.tistory.com/676#entry676comment</comments>
      <pubDate>Thu, 26 Oct 2023 21:39:04 +0900</pubDate>
    </item>
    <item>
      <title>MySQL: 자동 증가 열이 있는 테이블에 삽입 후 예기치 않은 SELECT 결과</title>
      <link>https://oldcodes.tistory.com/675</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;MySQL: 자동 증가 열이 있는 테이블에 삽입 후 예기치 않은 SELECT 결과&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;일부 데이터를 테이블에 삽입한 다음 동일한 테이블에서 SELECT 쿼리를 실행하면 이상한 동작이 나타납니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 테이블에는 자동 증분 기본 키(uid)가 있으며, 이 문제는 'uid IS NULL'에서 결과를 선택하려고 할 때 발생합니다.&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;이 내용을 다음 SQL 명령으로 요약했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;DROP TABLE IF EXISTS test_users;
CREATE TABLE test_users (uid INTEGER PRIMARY KEY AUTO_INCREMENT, name varchar(20) NOT NULL);
INSERT INTO test_users(name) values('foo');
SELECT uid FROM test_users WHERE uid IS NULL;
SELECT uid FROM test_users WHERE uid IS NULL; -- no output from this query
&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;SELECT uid FROM test_users WHERE uid IS NULL&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;/p&gt; 
&lt;ul&gt; 
 &lt;li papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;MySQL/MariaDB 버전이 중요해 보입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 문제가 발생한 시스템은 MySQL 5.1.73(CentOS 6.5, 32비트 및 64비트)을 실행하고 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;5.5.37-MariaDB(페도라 19, 64비트)를 실행하는 내 다른 기계.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;MyISAM 테이블을 사용하도록 구성된 것 외에도 실행 중인 기본 구성.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;INSERT 후 첫 번째 SELECT 쿼리만 영향을 받습니다.&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;자동 증가가 아닌 uid 값을 지정하면 됩니다.&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;INSERT와 SELECT 사이에 연결을 끊었다가 다시 연결하면 예상되는 아무런 결과가 나타나지 않습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이는 Perl과 같이 연결 개체를 관리하는 곳에서 가장 쉽게 볼 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;https://gist.github.com/avuserow/1c20cc03c007eda43c82 에서 이를 보여주는 테스트 스크립트가 있습니다.&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;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;SELECT * FROM t1 WHERE id = LAST_INSERT_ID();&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;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;em papago-id=&quot;13-3&quot;&gt;마지막&lt;/em&gt; 삽입문에 의해 삽입된 첫 &lt;em papago-id=&quot;13-1&quot;&gt;번째&lt;/em&gt; 행에 할당된 auto_increment 값입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;하나의 행만 삽입했을 때는 동일하지만, 하나의 삽입문으로 여러 행을 삽입했을 때는 동일하지 않습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;http://dev.mysql.com/doc/connector-odbc/en/connector-odbc-usagenotes-functionality-last-insert-id.html&quot; rel=&quot;nofollow&quot; papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;http://dev.mysql.com/doc/connector-odbc/en/connector-odbc-usagenotes-functionality-last-insert-id.html&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;URL : https://stackoverflow.com/questions/23685742/mysql-unexpected-select-result-after-insert-into-table-with-autoincrement-colum&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>MariaDB</category>
      <author>oldcodes</author>
      <guid isPermaLink="true">https://oldcodes.tistory.com/675</guid>
      <comments>https://oldcodes.tistory.com/675#entry675comment</comments>
      <pubDate>Sat, 21 Oct 2023 10:50:57 +0900</pubDate>
    </item>
    <item>
      <title>Node.js에서 Powershell 스크립트 실행</title>
      <link>https://oldcodes.tistory.com/674</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Node.js에서 Powershell 스크립트 실행&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;Node.js에서 파워셸 스크립트를 어떻게 실행하시겠습니까?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;스크립트가 Node.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;하위 프로세스 &quot;powershell.exe&quot;를 생성하고 명령 출력에 대해서는 stdout을 듣고 오류에 대해서는 stderr을 들을 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var spawn = require(&quot;child_process&quot;).spawn,child;
child = spawn(&quot;powershell.exe&quot;,[&quot;c:\\temp\\helloworld.ps1&quot;]);
child.stdout.on(&quot;data&quot;,function(data){
    console.log(&quot;Powershell Data: &quot; + data);
});
child.stderr.on(&quot;data&quot;,function(data){
    console.log(&quot;Powershell Errors: &quot; + data);
});
child.on(&quot;exit&quot;,function(){
    console.log(&quot;Powershell Script finished&quot;);
});
child.stdin.end(); //end input
&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;const { exec } = require('child_process');
exec('command here', {'shell':'powershell.exe'}, (error, stdout, stderr)=&amp;gt; {
    // do whatever with stdout
})
&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 class=&quot;lang-js prettyprint-override&quot;&gt;&lt;code&gt;var PSRunner = {
    send: function(commands) {
        var self = this;
        var results = [];
        var spawn = require(&quot;child_process&quot;).spawn;
        var child = spawn(&quot;powershell.exe&quot;, [&quot;-Command&quot;, &quot;-&quot;]);

        child.stdout.on(&quot;data&quot;, function(data) {
            self.out.push(data.toString());
        });
        child.stderr.on(&quot;data&quot;, function(data) {
            self.err.push(data.toString());
        });

        commands.forEach(function(cmd){
            self.out = [];
            self.err = [];
            child.stdin.write(cmd+ '\n');
            results.push({command: cmd, output: self.out, errors: self.err});
        });
        child.stdin.end();
        return results;
    },
};

module.exports = PSRunner;
&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;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/10179114/execute-powershell-script-from-node-js&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>PowerShell</category>
      <author>oldcodes</author>
      <guid isPermaLink="true">https://oldcodes.tistory.com/674</guid>
      <comments>https://oldcodes.tistory.com/674#entry674comment</comments>
      <pubDate>Sat, 21 Oct 2023 10:50:51 +0900</pubDate>
    </item>
    <item>
      <title>C#에서 (마지막 부분의) 현재 디렉터리 이름 가져오기</title>
      <link>https://oldcodes.tistory.com/673</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;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;현재 디렉토리의 마지막 부분을 가져와야 합니다. 예를 들어,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;/Users/smcho/filegen_from_directory/AIRPassthrough&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;AIRPassthrough&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;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;import os.path

path = &quot;/Users/smcho/filegen_from_directory/AIRPassthrough&quot;
print os.path.split(path)[-1]
&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;print os.path.basename(path)
&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;C#로 같은 작업을 하려면 어떻게 해야 합니까?&lt;/font&gt;&lt;/p&gt; 
&lt;h2 papago-id=&quot;7&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;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;using System.Linq;
string fullPath = Path.GetFullPath(fullPath).TrimEnd(Path.DirectorySeparatorChar);
string projectName  = fullPath.Split(Path.DirectorySeparatorChar).Last();
&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;string fullPath = Path.GetFullPath(fullPath).TrimEnd(Path.DirectorySeparatorChar);
string projectName = Path.GetFileName(fullPath);
&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 path = @&quot;/Users/smcho/filegen_from_directory/AIRPassthrough/&quot;;
var dirName = new DirectoryInfo(path).Name;
&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;br&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;\&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;pre&gt;&lt;code&gt;string path = &quot;/attachments/1828_clientid/2938_parentid/somefiles.docx&quot;;
string result = new DirectoryInfo(path).Parent.Name;
&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;그러면 &quot;2938_parentid&quot;가 반환됩니다.&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;em papago-id=&quot;16-1&quot;&gt;정확&lt;/em&gt;하게 답하자면 :-)&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var lastPartOfCurrentDirectoryName = 
   Path.GetFileName(Environment.CurrentDirectory);
&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;Path.DirectorySeparatorChar&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;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;path.split(Path.DirectorySeparatorChar).Last() 
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;var lastFolderName = Path.GetFileName(
    path.TrimEnd(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar));
&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;URI 클래스를 사용할 수도 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;new Uri(&quot;file:///Users/smcho/filegen_from_directory/AIRPassthrough&quot;).Segments.Last()
&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;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;String newString = &quot;&quot;;
String oldString = &quot;/Users/smcho/filegen_from_directory/AIRPassthrough&quot;;

int indexOfLastSlash = oldString.LastIndexOf('/');

newString = oldString.Substring(indexOfLastSlash, oldString.Length);
&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;/p&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;Path.GetFileName(path.TrimEnd('\\')
&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&gt;&lt;code&gt;Path.GetFileName(userpath)&lt;/code&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/6018293/get-the-last-part-of-current-directory-name-in-c-sharp&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>string</category>
      <author>oldcodes</author>
      <guid isPermaLink="true">https://oldcodes.tistory.com/673</guid>
      <comments>https://oldcodes.tistory.com/673#entry673comment</comments>
      <pubDate>Sat, 21 Oct 2023 10:50:44 +0900</pubDate>
    </item>
    <item>
      <title>디렉토리를 재배치한 후 MariaDB가 시작되지 않습니다.</title>
      <link>https://oldcodes.tistory.com/672</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;디렉토리를 재배치한 후 MariaDB가 시작되지 않습니다.&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;저는 Linux CentOS 7.0에 MariaDB 10.1을 설치하고 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;기본 datadir는 /var/lib/mysql에 있으며 공간은 2GB뿐입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그래서 200GB 용량이 있는 홈디렉토리로 옮겨야 합니다.&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 디렉토리를 /home에 복사했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;나는 구성 파일에 필요한 변경을 했고, 디렉토리 권한을 비교해 보면 모든 것이 동일합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 SELinux를 비활성화했기 때문에 문제가 되지 않습니다.&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;MariaDB가 시작되지 않습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;/var/log/messages 체크인 시 /usr/sbin/mysql: cant dir를 '/home/mysql'(Errcode: 13 Permission Denied&quot;)로 변경할 수 없습니다.&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;저의 방법론을 확인하기 위해 위의 과정을 반복하여 /var/mysql로 data dir를 이동했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;config 파일에 필요한 변경을 한 후 MariaDB를 시작하게 되었습니다.&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;그래서 data dir를 /var/mysql로 옮길 수 있고 작동합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;datadir를 /home/mysql로 이동하면 MariaDB에서 오류가 발생하여 시작되지 않습니다.&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;/home에 있는 디렉토리에 대한 권한을 확인해보니 /var와 같습니다. 홈 디렉토리에 대한 특별한 사항이 있나요?&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;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/39661134/mariadb-does-not-start-after-relocating-directory&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>MariaDB</category>
      <author>oldcodes</author>
      <guid isPermaLink="true">https://oldcodes.tistory.com/672</guid>
      <comments>https://oldcodes.tistory.com/672#entry672comment</comments>
      <pubDate>Sat, 21 Oct 2023 10:50:37 +0900</pubDate>
    </item>
    <item>
      <title>NS Invalid Archive Operation으로 인한 iOS11 WK Webview 충돌예외.</title>
      <link>https://oldcodes.tistory.com/671</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;NS Invalid Archive Operation으로 인한 iOS11 WK Webview 충돌&lt;/font&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;저는 Objective C를 통해 하나의 뷰 컨트롤러/뷰를 가진 iOS 11을 대상으로 하는 SingleView 앱을 개발하고 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;뷰 맨 위에 있는 메인.스토리보드에서 WebKit View(WK웹뷰)를 삭제했습니다.&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;Simulator와 iOS 11.0.1을 실행하는 iPhone 6에서 충돌이 발생했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;탐지되지 않은 예외 'NS 잘못된 아카이브 해제 작업으로 인해 앱 종료&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;예외', 이유: 'WKebView라는 클래스를 인스턴스화할 수 없습니다.'&lt;/font&gt;&lt;/strong&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;다른 작업이 필요합니까? 스토리보드에서 깨면 WK웹뷰를 인스턴스화할 수 없는 것 같습니다.&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;ul&gt; 
 &lt;li papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Xcode 버전 9.09A235&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;스토리보드에서 WK웹뷰를 제거하면 충돌이 사라집니다.&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;App Base SDK - 최신 iOS (iOS 11); 배포 대상 11.0&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;WebView(사용하지 않음) -- UI WebView를 사용하면 작동합니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;10&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;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;2017-11-06 18:38:27.765519+0200 XYZZMap[15689:1093338] *** Terminating app due to uncaught exception 'NSInvalidUnarchiveOperationException', reason: 'Could not instantiate class named WKWebView'
*** First throw call stack:
(
    0   CoreFoundation                      0x00000001056d01cb __exceptionPreprocess + 171
    1   libobjc.A.dylib                     0x0000000105032f41 objc_exception_throw + 48
    2   CoreFoundation                      0x0000000105744b95 +[NSException raise:format:] + 197
    3   UIKit                               0x000000010692d2c0 UINibDecoderDecodeObjectForValue + 323
    4   UIKit                               0x000000010692d5db UINibDecoderDecodeObjectForValue + 1118
    5   UIKit                               0x000000010692d172 -[UINibDecoder decodeObjectForKey:] + 89
    6   UIKit                               0x00000001062f866b -[UIView initWithCoder:] + 969
    7   UIKit                               0x000000010692d43d UINibDecoderDecodeObjectForValue + 704
    8   UIKit                               0x000000010692d172 -[UINibDecoder decodeObjectForKey:] + 89
    9   UIKit                               0x00000001066dd1a7 -[UIRuntimeConnection initWithCoder:] + 178
    10  UIKit                               0x000000010692d43d UINibDecoderDecodeObjectForValue + 704
    11  UIKit                               0x000000010692d5db UINibDecoderDecodeObjectForValue + 1118
    12  UIKit                               0x000000010692d172 -[UINibDecoder decodeObjectForKey:] + 89
    13  UIKit                               0x00000001066dc3a4 -[UINib instantiateWithOwner:options:] + 1262
    14  UIKit                               0x00000001063f8d07 -[UIViewController _loadViewFromNibNamed:bundle:] + 383
    15  UIKit                               0x00000001063f9610 -[UIViewController loadView] + 177
    16  UIKit                               0x00000001063f9941 -[UIViewController loadViewIfRequired] + 195
    17  UIKit                               0x00000001063fa19e -[UIViewController view] + 27
    18  UIKit                               0x00000001062cdd17 -[UIWindow addRootViewControllerViewIfPossible] + 122
    19  UIKit                               0x00000001062ce41f -[UIWindow _setHidden:forced:] + 294
    20  UIKit                               0x00000001062e12bf -[UIWindow makeKeyAndVisible] + 42
    21  UIKit                               0x0000000106255015 -[UIApplication _callInitializationDelegatesForMainScene:transitionContext:] + 4711
    22  UIKit                               0x000000010625a245 -[UIApplication _runWithMainScene:transitionContext:completion:] + 1720
    23  UIKit                               0x0000000106615c6c __111-[__UICanvasLifecycleMonitor_Compatability _scheduleFirstCommitForScene:transition:firstActivation:completion:]_block_invoke + 924
    24  UIKit                               0x00000001069e33ef +[_UICanvas _enqueuePostSettingUpdateTransactionBlock:] + 153
    25  UIKit                               0x0000000106615865 -[__UICanvasLifecycleMonitor_Compatability _scheduleFirstCommitForScene:transition:firstActivation:completion:] + 249
    26  UIKit                               0x00000001066160c3 -[__UICanvasLifecycleMonitor_Compatability activateEventsOnly:withContext:completion:] + 668
    27  UIKit                               0x0000000106f73c11 __82-[_UIApplicationCanvas _transitionLifecycleStateWithTransitionContext:completion:]_block_invoke + 262
    28  UIKit                               0x0000000106f73aca -[_UIApplicationCanvas _transitionLifecycleStateWithTransitionContext:completion:] + 444
    29  UIKit                               0x0000000106c61b9c __125-[_UICanvasLifecycleSettingsDiffAction performActionsForCanvas:withUpdatedScene:settingsDiff:fromSettings:transitionContext:]_block_invoke + 420
    30  UIKit                               0x0000000106e5cc3e _performActionsWithDelayForTransitionContext + 100
    31  UIKit                               0x0000000106c61998 -[_UICanvasLifecycleSettingsDiffAction performActionsForCanvas:withUpdatedScene:settingsDiff:fromSettings:transitionContext:] + 231
    32  UIKit                               0x00000001069e2a4c -[_UICanvas scene:didUpdateWithDiff:transitionContext:completion:] + 392
    33  UIKit                               0x0000000106258ac6 -[UIApplication workspace:didCreateScene:withTransitionContext:completion:] + 523
    34  UIKit                               0x0000000106821523 -[UIApplicationSceneClientAgent scene:didInitializeWithEvent:completion:] + 369
    35  FrontBoardServices                  0x000000010b539158 -[FBSSceneImpl _didCreateWithTransitionContext:completion:] + 338
    36  FrontBoardServices                  0x000000010b541c4d __56-[FBSWorkspace client:handleCreateScene:withCompletion:]_block_invoke_2 + 235
    37  libdispatch.dylib                   0x00000001096b643c _dispatch_client_callout + 8
    38  libdispatch.dylib                   0x00000001096bbaf4 _dispatch_block_invoke_direct + 592
    39  FrontBoardServices                  0x000000010b56d672 __FBSSERIALQUEUE_IS_CALLING_OUT_TO_A_BLOCK__ + 24
    40  FrontBoardServices                  0x000000010b56d328 -[FBSSerialQueue _performNext] + 464
    41  FrontBoardServices                  0x000000010b56d897 -[FBSSerialQueue _performNextFromRunLoopSource] + 45
    42  CoreFoundation                      0x00000001056732b1 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17
    43  CoreFoundation                      0x0000000105712d31 __CFRunLoopDoSource0 + 81
    44  CoreFoundation                      0x0000000105657c19 __CFRunLoopDoSources0 + 185
    45  CoreFoundation                      0x00000001056571ff __CFRunLoopRun + 1279
    46  CoreFoundation                      0x0000000105656a89 CFRunLoopRunSpecific + 409
    47  GraphicsServices                    0x000000010be609c6 GSEventRunModal + 62
    48  UIKit                               0x000000010625bd30 UIApplicationMain + 159
    49  XYZZMap                             0x00000001047274bf main + 111
    50  libdyld.dylib                       0x0000000109732d81 start + 1
    51  ???                                 0x0000000000000001 0x0 + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
&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;NS 잘못된 아카이브 해제 작업&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;nib/스토리보드를 로드할 때 예외는 nib/스토리보드에 런타임이 이해할 수 없는 개체가 있음을 의미합니다.&lt;/font&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;따라서 이 경우에는 웹킷 프레임워크와 앱 대상을 연결하여 WKebView가 스토리보드에서 디코딩될 때 앱이 WKebView가 무엇인지 파악할 수 있어야 합니다.&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&gt;&lt;a href=&quot;https://i.stack.imgur.com/3E11P.png&quot; rel=&quot;noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/3E11P.png&quot; alt=&quot;enter image description here&quot;&gt;&lt;/a&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;Target -&amp;gt; General -&amp;gt; Linked Framework and Libraries -&amp;gt; 아래 + 기호 클릭 -&amp;gt; webKit 검색을 선택합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;프레임워크 -&amp;gt; 추가합니다.&lt;/font&gt;&lt;/p&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;swift 5.0 + + + 및 Xcode 업데이트 - 11.5 +&lt;/font&gt;&lt;/strong&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&gt;&lt;/font&gt;&lt;code&gt;WKWebView&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;storyboard&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;blockquote&gt; 
 &lt;p papago-id=&quot;21&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;NS 잘못된 아카이브 해제 작업&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;예외', 이유: 'WKwebView라는 클래스를 찾을 수 없으므로 WKwebView라는 클래스를 인스턴스화할 수 없습니다. 클래스를 소스 코드로 정의하거나 라이브러리에서 링크해야 합니다(클래스가 올바른 대상의 일부인지 확인하십시오).&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&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;Xcode&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;/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;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://i.stack.imgur.com/pmPAj.png&quot; rel=&quot;noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/pmPAj.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;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;스토리보드에 다음과 같은 정보가 있는지 확인합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;WKWebView&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;코드에 있는 동안 당신은 a를 가질 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;UIWebView&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;28&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Project Target(프로젝트 대상)을 클릭한 다음 webKit(웹킷)을 추가합니다.&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;일반 -&amp;gt; 연결된 프레임워크 및 라이브러리 -&amp;gt; 아래 + 기호 클릭 -&amp;gt; webKit 검색&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;프레임워크 -&amp;gt; 추가합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://i.stack.imgur.com/buPil.png&quot; rel=&quot;nofollow noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/buPil.png&quot; alt=&quot;enter image description here&quot;&gt;&lt;/a&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;p&gt;&lt;strong papago-id=&quot;31&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;WK웹뷰를 아웃렛으로 선언하지 않음&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://i.stack.imgur.com/BcaPl.png&quot; rel=&quot;nofollow noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/BcaPl.png&quot; alt=&quot;Without declaring as Outlet&quot;&gt;&lt;/a&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;시뮬레이터에서 실행하는 동안 이 오류가 발생했습니다.&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://i.stack.imgur.com/v1tuV.jpg&quot; rel=&quot;nofollow noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/v1tuV.jpg&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/FH9cu.png&quot; rel=&quot;nofollow noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/FH9cu.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/Kftpy.png&quot; rel=&quot;nofollow noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/Kftpy.png&quot; alt=&quot;enter image description here&quot;&gt;&lt;/a&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;p&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;font class=&quot;papago-parent&quot;&gt;도움이 되길 바라요 :)&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;br&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;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/47142434/ios11-wkwebview-crash-due-to-nsinvalidunarchiveoperationexception&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>iPhone</category>
      <author>oldcodes</author>
      <guid isPermaLink="true">https://oldcodes.tistory.com/671</guid>
      <comments>https://oldcodes.tistory.com/671#entry671comment</comments>
      <pubDate>Sat, 21 Oct 2023 10:50:31 +0900</pubDate>
    </item>
  </channel>
</rss>