<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>telecom</title>
    <link>https://telecom.tistory.com/</link>
    <description>각종 프로그래밍 정보를 다루는 블로그입니다.</description>
    <language>ko</language>
    <pubDate>Wed, 20 May 2026 23:03:48 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>telecom</managingEditor>
    <item>
      <title>NoSQL 데이터 저장소를 사용하는 데 어떤 확장성 문제가 발생했습니까?</title>
      <link>https://telecom.tistory.com/720</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;NoSQL 데이터 저장소를 사용하는 데 어떤 확장성 문제가 발생했습니까?&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/2285045/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;2019-02-04 13:12:31Z&quot; papago-attr-id=&quot;1&quot;&gt;4년전&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/2285045/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;NoSQL은 관계형 데이터베이스 및 ACID 보증의 이력과 단절되는 비관계형 데이터 저장소를 말합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;인기 있는 오픈 소스 NoSQL 데이터 저장소는 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;http://incubator.apache.org/cassandra/&quot; rel=&quot;noreferrer&quot;&gt;Cassandra&lt;/a&gt;(표로 작성, Java로 작성, Cisco, WebEx, Digg, Facebook, IBM, Mahalo, Rackspace, Reddit 및 Twitter에서 사용)&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;http://couchdb.apache.org/&quot; rel=&quot;noreferrer&quot;&gt;CouchDB&lt;/a&gt; (문서, 얼랑어로 작성, BBC 및 Engine Yard에서 사용)&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;http://github.com/cliffmoon/dynomite&quot; rel=&quot;noreferrer&quot;&gt;다이노마이트&lt;/a&gt;(키 값, 얼랑으로 작성, Powerset에서 사용)&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;http://hadoop.apache.org/hbase/&quot; rel=&quot;noreferrer&quot;&gt;HBase&lt;/a&gt; (key-value, Java로 작성, Bing에서 사용)&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;http://www.hypertable.org/&quot; rel=&quot;noreferrer&quot;&gt;하이퍼테이블&lt;/a&gt;(표, Baidu에서 사용하는 C++로 작성)&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;http://sourceforge.net/projects/kai/&quot; rel=&quot;noreferrer&quot;&gt;Kai&lt;/a&gt; (키 값, 얼랑어 표기)&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;http://memcachedb.org/&quot; rel=&quot;noreferrer&quot;&gt;Memcache&lt;/a&gt; DB(키 값, C로 작성, Reddit에서 사용)&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;http://www.mongodb.org/&quot; rel=&quot;noreferrer&quot;&gt;MongoDB&lt;/a&gt; (문서, Electronic Arts, Github, NY Times 및 Sourceforge에서 사용하는 C++로 작성됨)&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;http://neo4j.org/&quot; rel=&quot;noreferrer&quot;&gt;Neo4j&lt;/a&gt; (그래프, 자바로 작성, 일부 스웨덴 대학에서 사용)&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;http://project-voldemort.com/&quot; rel=&quot;noreferrer&quot;&gt;Project Voldemort&lt;/a&gt;(키-값, Java로 작성, LinkedIn에서 사용)&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;http://code.google.com/p/redis/&quot; rel=&quot;noreferrer&quot;&gt;Redis&lt;/a&gt;(키 값, C로 작성, Craigslist, Engine Yard 및 Github에서 사용)&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;http://riak.basho.com/&quot; rel=&quot;noreferrer&quot;&gt;Riak&lt;/a&gt; (키 값, 얼랑어로 작성, Comcast와 Mochi Media에서 사용)&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;http://github.com/tuulos/ringo&quot; rel=&quot;noreferrer&quot;&gt;Ringo&lt;/a&gt;(키 값, Erlang으로 작성, Nokia에서 사용)&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;http://code.google.com/p/scalaris/&quot; rel=&quot;noreferrer&quot;&gt;스칼라&lt;/a&gt;(키 값, Erlang으로 작성, OnScale에서 사용)&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;http://code.google.com/p/terrastore/&quot; rel=&quot;noreferrer&quot;&gt;테라스토어&lt;/a&gt;(문서, Java로 작성됨)&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;http://code.google.com/p/thrudb/&quot; rel=&quot;noreferrer&quot;&gt;ThroughDB&lt;/a&gt; (&lt;a href=&quot;http://code.google.com/p/thrudb/&quot; rel=&quot;noreferrer&quot;&gt;document&lt;/a&gt;, C++로 작성, &lt;a href=&quot;http://code.google.com/p/thrudb/&quot; rel=&quot;noreferrer&quot;&gt;JunkDepot.com&lt;/a&gt; 에서 사용)&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;http://1978th.net/tokyocabinet/&quot; rel=&quot;noreferrer&quot;&gt;도쿄 내각/도쿄 폭군&lt;/a&gt; (키 값, C로 작성, &lt;a href=&quot;http://1978th.net/tokyocabinet/&quot; rel=&quot;noreferrer&quot;&gt;Mixi.jp&lt;/a&gt; (일본 사회관계망 사이트)에서 사용)&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;나는 당신이 데이터스토어를 사용하여 해결한 구체적인 문제들, 즉 SO 리더가 어떤 NoSQL 데이터스토어를 사용했는지 알고 싶습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;질문:&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;NoSQL 데이터 저장소를 사용하여 해결한 확장성 문제는 무엇입니까?&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;어떤 NoSQL 데이터 저장소를 사용했습니까?&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;NoSQL 데이터 저장소로 전환하기 전에 사용한 데이터베이스는 무엇입니까?&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;b&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제가 직접 경험을 찾고 있으니, 그런 경험이 없는 한 대답하지 말아주세요.&lt;/font&gt;&lt;/b&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;18,000개의 객체를 정규화된 구조로 저장: 8개의 다른 테이블에 걸쳐 90,000개의 행을 저장합니다.&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;경량 텍스트 표현을 사용하여 키/값 쌍으로 저장: 테이블 1개, 행 18,000개, 3초로 모두 검색하고 Java 객체를 재구성합니다.&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;기술상세: SQL과 NoSQL 모두 MySQL에서 실행!&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;MySQL의 데이터 모델은 이제 핵심 필드(정수)와 큰 &quot;가치&quot; 필드(기본적으로 큰 TEXT 필드)에 불과합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;신규 플레이어(CouchDB, Cassandra, MongoDB 등)는 모두 자체적으로 우수한 기능/성능을 제공하지만, 상황에 따라 항상 단점(예: Java 지원 누락/미숙)이 존재하기 때문에 사용하지 않았습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;MySQL을 사용할 경우의 추가적인 이점 - 관련적으로 &lt;em&gt;작동&lt;/em&gt;하는 모델의 비트를 키/밸류 스토어 데이터에 쉽게 연결할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&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;pre&gt;&lt;code&gt;Name=An Example Product
Type=CategoryAProduct
Colour=Blue
Size=Large
Flavours={nice,lovely,unpleasant,foul}
Contains=[
Name=Product2
Type=CategoryBProduct
Size=medium
Flavours={yuck}
------
Name=Product3
Type=CategoryCProduct
Size=Small
Flavours={sublime}
]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;부하를 처리할 수 있도록 MySQL에서 CouchDB로 소규모 서브 프로젝트를 전환했습니다.&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;약 2년 전, 우리는 http://www.ubuntuusers.de/ 에 직접 작성한 소프트웨어를 공개했습니다. (아마도 독일 Linux 커뮤니티 웹사이트 중 가장 큰 사이트일 것입니다.)&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 사이트는 Python으로 작성되어 있으며 WSGI 미들웨어를 추가하여 모든 예외를 파악하고 이를 다른 소규모 MySQL 기반 웹사이트로 전송할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 작은 웹사이트는 해시를 사용하여 다양한 버그를 파악하고 발생 횟수와 마지막 발생 횟수도 저장했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;불행하게도 출시 직후 추적 기록기 웹사이트는 더 이상 반응을 보이지 않았습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;테스트 단계에서 탐색하지 못한 몇 가지 버그뿐만 아니라 거의 모든 요청에 예외를 두는 메인 사이트의 생산 db에 몇 가지 잠금 문제가 있었습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;당사 메인 사이트의 서버 클러스터는 초당 몇 k번씩 트레이스백로거 제출 페이지를 호출합니다.&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;이 시기에 카우치DB가 인기가 있었기 때문에, 저는 그것을 사용해보고 그것으로 작은 트레이스백로거를 쓰기로 결정했습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;새 로거는 정렬 및 필터 옵션이 포함된 버그 목록과 제출 페이지를 제공하는 단일 파이썬 파일로만 구성되었습니다.&lt;/font&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;한 가지 흥미로운 점은 이전의 솔루션이 오래된 전용 서버에서 실행되고 있다는 것입니다. 반면에 새로운 CouchDB 기반 사이트는 매우 제한된 리소스를 사용하는 공유 xen 인스턴스에서만 실행된다는 것입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;키 값 저장소의 강점을 수평적으로 확장하는 데 사용해 본 적도 없습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;CouchDB/Erlang OTP가 아무것도 잠그지 않고 동시 요청을 처리할 수 있는 능력은 이미 필요에 충분히 부합했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;현재 빠르게 작성된 카우치DB 추적 로거는 여전히 실행 중이며 메인 웹사이트에서 버그를 탐색하는 데 도움이 되는 방법입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;어쨌든 한 달에 한 번 정도 데이터베이스가 너무 커져서 카우치DB 프로세스가 중단됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러나 CouchDB의 compact-db 명령어는 크기를 수 GB에서 일부 KB로 다시 줄이고 데이터베이스가 다시 실행됩니다(아마도 여기에 cronjob을 추가하는 것을 고려해야 할 것입니다... 0o).&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;요약하자면, 카우치DB는 분명 이 서브 프로젝트를 위한 최선의 선택(또는 적어도 MySQL보다 더 나은 선택)이었고 그 역할을 잘 수행합니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Todd Hoff의 highscalability.com 에는 몇 가지 사례 연구를 비롯하여 NoSQL에 대한 많은 정보가 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;상용 &lt;a href=&quot;http://www.vertica.com&quot; rel=&quot;noreferrer&quot;&gt;Vertica&lt;/a&gt; columnal DBMS는 SQL을 지원하더라도 사용자의 목적에 적합할 수 있습니다. 분석 쿼리를 위한 기존 관계형 DBMS에 비해 매우 빠릅니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;지도 축소와 Vertica를 비교한 Stonebraker 등의 &lt;a href=&quot;http://database.cs.brown.edu/papers/stonebraker-cacm2010.pdf&quot; rel=&quot;noreferrer&quot;&gt;최근 CACM 논문&lt;/a&gt;을 참조하십시오.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;업데이트: 그리고 &lt;a href=&quot;http://developers.slashdot.org/story/10/02/23/1826226/How-Twitter-Is-Moving-To-the-Cassandra-Database&quot; rel=&quot;noreferrer&quot;&gt;트위터는 &lt;/a&gt;HBase, 볼드모트, 몽고DB, MemcacheDB, Redis, 그리고 HyperTable을 포함한 여러 다른 것들보다 &lt;a href=&quot;http://developers.slashdot.org/story/10/02/23/1826226/How-Twitter-Is-Moving-To-the-Cassandra-Database&quot; rel=&quot;noreferrer&quot;&gt;카산드라를 선택&lt;/a&gt;했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;업데이트 2: Rick Cattell은 &lt;a href=&quot;http://cattell.net/datastores/Datastores.pdf&quot; rel=&quot;noreferrer&quot;&gt;고성능 데이터 저장소&lt;/a&gt;의 여러 NoSQL 시스템을 비교하여 발표했습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고 릭의 논문에 대한 highscalability.com 의 의견은 &lt;a href=&quot;http://highscalability.com/blog/2010/2/25/paper-high-performance-scalable-data-stores.html&quot; rel=&quot;noreferrer&quot;&gt;여기&lt;/a&gt;에 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;데이터의 일부를 mysql에서 mongodb로 옮겼습니다. 확장성을 위해서가 아니라 파일 및 비표형 데이터에 더 적합하기 때문입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;현재 생산 중인 제품은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;파일 25,000개(60GB)&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;1억 3천만 개의 기타 &quot;문서&quot;(350GB)&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하루 매출이 약 10GB에 이릅니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;데이터베이스는 mongodb python api(pymongo)를 사용하여 apache/wsgi/python 클라이언트가 있는 2개의 노드(6x450GB sas raid10)에 &quot;페어된&quot; 구성으로 배포됩니다.&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;pymongo 스레드 풀과 mongodb 서버의 차단 특성과 관련된 몇 가지 문제를 제외하고는 좋은 경험이 되었습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 직접적인 경험이 없기 때문에 대담한 글을 반대하게 되어 죄송합니다만, 이 블로그 게시물들은 카우치DB의 문제를 해결하는 좋은 예입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;http://johnpwood.net/2009/06/15/couchdb-a-case-study/&quot; rel=&quot;nofollow noreferrer&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;CouchDB: 사례연구&lt;/font&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;기본적으로 &lt;a href=&quot;http://textme.net/&quot; rel=&quot;nofollow noreferrer&quot;&gt;텍스트미&lt;/a&gt; 애플리케이션은 폭발적으로 증가하는 데이터 문제를 해결하기 위해 카우치DB를 사용했습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이들은 SQL이 너무 느려서 대량의 아카이브 데이터를 처리할 수 없다는 사실을 발견하고 이를 CouchDB로 옮겼습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이는 훌륭한 읽기이며, 그는 카우치DB가 어떤 문제를 해결할 수 있는지 그리고 그것들이 어떻게 해결하게 되었는지를 알아내는 전 과정에 대해 이야기합니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Postgresql에 저장하던 데이터 중 일부를 &lt;a href=&quot;http://code.google.com/p/redis/&quot; rel=&quot;noreferrer&quot;&gt;Redis&lt;/a&gt;로 옮겼습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;키 값 저장소는 계층적 개체 데이터를 저장하는 데 훨씬 적합합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;ORM을 사용하여 blob을 RDBMS에 매핑하는 것보다 blob 데이터를 훨씬 더 빠르고 개발 시간과 노력을 덜 들일 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;POCO 개체를 한 줄로 저장하고 검색할 수 있는 &lt;a href=&quot;http://code.google.com/p/servicestack/wiki/ServiceStackRedis&quot; rel=&quot;noreferrer&quot;&gt;오픈 소스 c# redis 클라이언트&lt;/a&gt;가 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var customers = redis.Lists[&quot;customers&quot;]; //Implements IList&amp;lt;Customer&amp;gt;
customers.Add(new Customer { Name = &quot;Mr Customer&quot; });
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;키 값 저장소도 새 서버를 추가한 다음 로드를 균등하게 분할하여 새 서버를 포함할 수 있으므로 '스케일 아웃'하기가 훨씬 쉽습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;중요한 것은 확장성을 제한하는 중앙 서버가 없다는 것입니다.&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;저는 Redis를 여러 클라이언트에 대해 빠르고 동시적이며 원자적인 액세스를 제공하는 스테로이드상의 '관리되는 텍스트 파일'이라고 생각합니다. 그래서 텍스트 파일이나 내장된 데이터베이스를 사용하던 모든 것이 Redis를 사용하게 됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;모든 서비스에 대해 실시간으로 결합된 롤링 오류 로그를 얻으려면 Redis 서버 사이드 리스트에 오류를 미리 저장한 다음 마지막 1000개만 유지하도록 목록을 트리밍하면 됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var errors = redis.List[&quot;combined:errors&quot;];
errors.Insert(0, new Error { Name = ex.GetType().Name, Message = ex.Message, StackTrace = ex.StackTrace});
redis.TrimList(errors, 1000);
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 직접 경험은 없지만, 이 &lt;a href=&quot;http://blog.boxedice.com/2009/07/25/choosing-a-non-relational-database-why-we-migrated-from-mysql-to-mongodb/&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;소프트웨어 도메인 개체(예: SalesOrder, customer...)를 2차원 관계형 데이터베이스(행 및 열)에 매핑하려면 저장/업데이트하는 코드가 많이 필요하고 여러 테이블에서 도메인 개체 인스턴스를 인스턴스화하는 작업이 필요합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 모든 디스크 판독기를 사용하면 성능이 향상되는 것은 말할 것도 없습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;판매 주문서 또는 고객 레코드와 같은 도메인 개체를 보거나 manip화하는 데만 사용됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;ODBMS(Object Database Management Systems)로 전환했습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이러한 기능은 나열된 noSQL 시스템의 기능을 뛰어 넘습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;GemStone/S(Smalltalk용)가 그러한 예입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여러 언어에 대한 드라이버가 있는 다른 ODBMS 솔루션도 있습니다.&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;ODBMS 시스템은 ACID 수준의 트랜잭션 무결성을 제공하므로 금융 시스템에서도 작동합니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;기본적으로 각 장치별로 시계열 센서를 저장하는 M2M 시스템을 위해 MySQL(InnoDB)에서 카산드라로 전환했습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;각 데이터는 (device_id, date) 및 (device_id, type_of_sensor, date)로 인덱싱됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;MySQL 버전은 2천만 행을 포함하고 있었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;MySQL:&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;마스터-마스터 동기화로 설정합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;동기화 손실&lt;/strong&gt;과 관련하여 거의 문제가 발생하지 않았습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그것은 스트레스였고 특히 처음에는 고치는 데 몇 시간이 걸릴 수 있었습니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;삽입 시간은 문제가 되지 않았지만 쿼리를 수행하는 데는 &lt;strong&gt;데이터&lt;/strong&gt;가 증가함에 따라 &lt;strong&gt;점점&lt;/strong&gt; 더 &lt;strong&gt;많은 메모리가 필요&lt;/strong&gt;했습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;문제는 지수가 전체적으로 고려된다는 것입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제 경우에는 메모리에 로드하는 데 필요한 인덱스 중 매우 얇은 부분만 사용하고 있었습니다(몇 퍼센트의 장치만 자주 모니터링되고 최신 데이터에 저장되어 있었습니다).&lt;/font&gt;&lt;/li&gt; 
 &lt;li&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;Rsync는 큰 InnoDB 테이블 파일에서 빠른 백업을 할 수 없습니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;시간&lt;/strong&gt;(시간)이 너무 많이 &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;li&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;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;strong&gt;이동&lt;/strong&gt;하는 &lt;strong&gt;것은 정말 큰&lt;/strong&gt; 일이었습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;복제는 매우 신중하게 처리해야 했습니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;카산드라:&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;MySQL보다 설치가 더 쉽습니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;RAM이 많이 필요합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;2GB 인스턴스는 처음 버전에서는 실행할 수 없었으므로 이제 1GB 인스턴스에서 작동할 수 있지만 (데이터 플러시가 너무 많음) 이는 아닙니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;우리의 경우에는 8GB를 주는 것으로 충분했습니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;데이터를 구성하는 방법을 이해하고 나면 저장이 쉽습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;요청이 좀 더 복잡합니다.&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;이전 단계가 제대로 이루어졌더라면 지금과 마찬가지로 매우 빠른 속도로 유지됩니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;데이터가 백업되도록 구성되어 있는 것 같습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;모든 새 데이터는 새 파일로 추가됩니다.&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;/li&gt; 
 &lt;li&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;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;스키마가 없는 것은 매우 흥미로운 일입니다. 왜냐하면 데이터가 필요에 따라 진화하도록 만들 수 있기 때문입니다.&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;호스트를 추가하는 것은 쉽지만(빠른 것은 아니지만) 다중 데이터 센터 설정에서는 해보지 못했습니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;참고: 엘라스틱 &lt;a href=&quot;http://www.elasticsearch.org/&quot; rel=&quot;nofollow&quot;&gt;검색&lt;/a&gt;(루신을 기반으로 한 문서)도 사용한 적이 있는데 NoSQL 데이터베이스로 봐야 한다고 생각합니다.&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;지금은 Sqlite를 사용하지만 도쿄 캐비닛 같은 것을 사용하고 싶습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;버클리&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;DB에 &quot;이슈&quot; 라이센스가 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러나 Windows OS를 사용하려면 NoSQL 데이터베이스를 선택할 수 없습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고 항상 C# 프로바이더가 있는 것은 아닙니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;MongoDB를 해봤는데 Sqlite보다 40배나 빨라서 사용해야 할 것 같습니다.&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;redis를 사용하여 기계 전체에 로깅 메시지를 저장했습니다.&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;고정 스키마가 없다는 것이 우리에게 큰 장점이었기 때문에 포스트그레스 데이터베이스를 카우치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;저는 과거에 Couchbase를 사용한 적이 있으며, 리밸런싱 문제와 기타 여러 문제에 직면했습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;현재 저는 여러 제작 프로젝트에서 Redis를 사용하고 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Redis 클러스터의 확장을 담당하는 Redis 관리 서비스인 redislabs.com 을 사용하고 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;공급자 모델에서 Redis를 사용하는 방법과 C# 개체를 Redis에 저장하는 방법을 보여주는 객체 지속성에 대한 비디오를 http://thomasjaeger.wordpress.com 블로그에 게시했습니다.&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;3.0이 출시된 지금 이 글을 읽는 사람에게 카우치베이스를 한 번 더 시도해보라고 권하고 싶습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;200개 이상의 새로운 기능이 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Couchbase Server의 성능, 가용성, 확장성 및 쉬운 관리 기능은 매우 유연하고 가용성이 높은 데이터베이스를 제공합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;관리 UI가 내장되어 있고 API가 클러스터 노드를 자동으로 검색하므로 애플리케이션에서 DB로 로드 밸런서가 필요 없습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;현재 관리형 서비스는 없지만 AWS, Red Hat Gears, Cloudera, Rackspace, CloudSoft와 같은 Docker Containers 등을 기반으로 카우치베이스를 실행할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;재조정과 관련하여 구체적으로 무엇을 언급하느냐에 따라 다르지만 카우치베이스는 설계된 대로 노드 장애 후 자동으로 재조정되지 않습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러나 관리자는 첫 번째 노드 장애에 대해 자동 페일오버를 설정할 수 있으며, API를 사용하여 활성화하거나 나머지를 사용하기 전에 읽기 위해 복제본 vbucket에 액세스할 수도 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;API를 사용하면 모니터링 도구를 통해 페일오버를 수행할 수 있습니다.&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;가장 성능이 뛰어난 NoSQL 데이터베이스가 무엇인지 알고 싶은 모든 사용자에게 도움이 되는 몇 가지 가이드가 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;a href=&quot;http://docs.couchbase.com/admin/admin/Whats-new-3.0.html&quot; rel=&quot;nofollow&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;카우치베이스 서버 3.0&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;http://docs.couchbase.com/admin/admin/admin-intro.html&quot; rel=&quot;nofollow&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;관리 가이드&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;http://docs.couchbase.com/admin/admin/rest-intro.html&quot; rel=&quot;nofollow&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;REST API&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;http://docs.couchbase.com/developer/dev-guide-3.0/intro.html&quot; rel=&quot;nofollow&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;개발자 가이드&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;마지막으로 분산 쿼리를 위해 N1QL을 확인하는 것도 권장합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;a href=&quot;http://query.pub.couchbase.com/tutorial/#1&quot; rel=&quot;nofollow&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;N1QL 자습서&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;http://docs.couchbase.com/developer/n1ql-dp3/n1ql-intro.html&quot; rel=&quot;nofollow&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;N1QL 가이드&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;읽어주셔서 감사하고 도움이 더 필요하면 저나 다른 사람들에게 알려주세요!&lt;/font&gt;&lt;/p&gt; 
&lt;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;저는 예전에 Vertica를 사용한 적이 있습니다.&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;이전에는 수십억 개의 레코드를 보유한 Oracle 데이터베이스에 대해 쿼리를 수행했는데 성능이 매우 최적화되지 않았습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;SSD로 최적화한 후에도 쿼리를 실행하는 데 8~12초가 걸렸습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;따라서 읽기에 최적화된 분석 지향 데이터베이스를 보다 빠르게 사용해야 할 필요성을 느꼈습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;희박한 서비스 계층 뒤에 Vertica Cluster를 설치하면 1초 미만의 성능으로 API를 실행할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Vertica는 질의 실행을 최적화하는 형식으로 프로젝션에 데이터를 저장합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;구체화된 보기와 유사하게 프로젝션은 쿼리에 사용될 때마다 결과 집합을 계산하는 것이 아니라 디스크 또는 SSD에 저장합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;프로젝션은 다음과 같은 이점을 제공합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;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;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Vertica는 세그멘테이션(Segmentation)을 사용하여 데이터를 클러스터에 분산시켜 데이터베이스를 최적화합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;분할은 데이터의 일부를 노드에 배치합니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;모든 노드에 데이터를 균등하게 분배합니다.&lt;/font&gt;&lt;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;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;자세한 내용은 Vertica 설명서 @ https://www.vertica.com/knowledgebase/ 를 참조하십시오.&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/2285045/what-scalability-problems-have-you-encountered-using-a-nosql-data-store&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>Database</category>
      <author>telecom</author>
      <guid isPermaLink="true">https://telecom.tistory.com/720</guid>
      <comments>https://telecom.tistory.com/720#entry720comment</comments>
      <pubDate>Mon, 6 Nov 2023 21:40:16 +0900</pubDate>
    </item>
    <item>
      <title>반복기에서 맵() 사용</title>
      <link>https://telecom.tistory.com/719</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;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;지도가 있다고 가정합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;let m = new Map();&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;m.values()&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;forEach()&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;map()&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;ES6가 다음과 같은 기능을 제공하기 때문에 해당 반복기에 잠시 루프를 구현하는 것은 안티패턴처럼 보입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;map()&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;map()&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;pre class=&quot;lang-js prettyprint-override&quot;&gt;&lt;code&gt;Array.from(m).map(([key,value]) =&amp;gt; /* whatever */)
&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 class=&quot;lang-js prettyprint-override&quot;&gt;&lt;code&gt;Array.from(m, ([key, value]) =&amp;gt; /* whatever */))
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/from&quot; rel=&quot;noreferrer&quot;&gt;&lt;code&gt;Array.from&lt;/code&gt;&lt;/a&gt; 반복 가능하거나 배열과 같은 모든 것을 가져와 배열로 변환합니다!&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Daniel이 코멘트에서 지적한 것처럼, 우리는 변환에 매핑 함수를 추가하여 반복을 제거하고 그 후에 중간 배열을 제거할 수 있습니다.&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;Array.from&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;@hraban님이 댓글로 지적해주신 것처럼 에서 로 공연을 옮겨드립니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;부터&lt;/font&gt;&lt;/font&gt;&lt;code&gt;m&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;Map&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;, 그들이 무한할 수는 없고, 우리는 무한한 서열에 대해 걱정할 필요가 없습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;대부분의 경우 이 정도면 충분합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;지도를 우회하는 몇 가지 다른 방법이 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사용.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;forEach&lt;/code&gt;&lt;/h2&gt; 
&lt;pre class=&quot;lang-js prettyprint-override&quot;&gt;&lt;code&gt;m.forEach((value,key) =&amp;gt; /* stuff */ )
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사용.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;for..of&lt;/code&gt;&lt;/h2&gt; 
&lt;pre class=&quot;lang-js prettyprint-override&quot;&gt;&lt;code&gt;var myMap = new Map();
myMap.set(0, 'zero');
myMap.set(1, 'one');
for (var [key, value] of myMap) {
  console.log(key + ' = ' + value);
}
// 0 = zero
// 1 = one
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여기 다른 대답은...&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이상하다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;반복 프로토콜의 일부를 다시 구현하는 것 같습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그냥 이렇게 하면 됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-js prettyprint-override&quot;&gt;&lt;code&gt;function* mapIter(iterable, callback) {
  for (let x of iterable) {
    yield callback(x);
  }
}
&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;...&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 class=&quot;lang-js prettyprint-override&quot;&gt;&lt;code&gt;[...mapIter([1, 2, 3], x =&amp;gt; x**2)]
&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;/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;function* generator() {
    for (let i = 0; i &amp;lt; 10; i++) {
        console.log(i);
        yield i;
    }
}

function* mapIterator(iterator, mapping) {
    for (let i of iterator) {
        yield mapping(i);
    }
}

let values = generator();
let mapped = mapIterator(values, (i) =&amp;gt; {
    let result = i*2;
    console.log(`x2 = ${result}`);
    return result;
});

console.log('The values will be generated right now.');
console.log(Array.from(mapped).join(','));&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;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이제 여러분은 다음과 같이 물을 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Array.from&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;em&gt;다음&lt;/em&gt; 매핑을 수행합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;목록이 방대한 경우(또는 잠재적으로 무한대인 경우) 불필요한 메모리 사용으로 이어집니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;물론 품목 리스트가 상당히 작다면, 다음과 같이&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Array.from&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 class=&quot;lang-js prettyprint-override&quot;&gt;&lt;code&gt;const map = new Map()
map.set('a', 1)
map.set('b', 2)

Array.from(map, ([key, value]) =&amp;gt; `${key}:${value}`)
// ['a:1', 'b:2']
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 접근 방식은 &lt;strong&gt;무한&lt;/strong&gt; 반복이 불가능한 모든 것에 효과가 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이를 통해 별도의 전화를 사용하지 않아도 됩니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Array.from(map).map(...)&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;Iterator&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;: https://github.com/tc39/proposal-iterator-helpers&lt;a href=&quot;https://github.com/tc39/proposal-iterator-helpers&quot; rel=&quot;nofollow noreferrer&quot;&gt; &lt;/a&gt;(rendered)&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 class=&quot;lang-js prettyprint-override&quot;&gt;&lt;code&gt;import { from as iterFrom } from &quot;core-js-pure/features/iterator&quot;;

// or if it's working for you (it should work according to the docs,
// but hasn't for me for some reason):
// import iterFrom from &quot;core-js-pure/features/iterator/from&quot;;

let m = new Map();

m.set(&quot;13&quot;, 37);
m.set(&quot;42&quot;, 42);

const arr = iterFrom(m.values())
  .map((val) =&amp;gt; val * 2)
  .toArray();

// prints &quot;[74, 84]&quot;
console.log(arr);
&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;const map = (iterable, callback) =&amp;gt; {
  return {
    [Symbol.iterator]() {
      const iterator = iterable[Symbol.iterator]();
      return {
        next() {
          const r = iterator.next();
          if (r.done)
            return r;
          else {
            return {
              value: callback(r.value),
              done: false,
            };
          }
        }
      }
    }
  }
};

// Arrays are iterable
console.log(...map([0, 1, 2, 3, 4], (num) =&amp;gt; 2 * num)); // 0 2 4 6 8
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;https://www.npmjs.com/package/fluent-iterable 에서 만나보세요.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;모든 반복 변수(Map, generator function, array) 및 비동기 변수와 함께 작동합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;const map = new Map();
...
console.log(fluent(map).filter(..).map(..));
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;배열과 유사한 메소드를 구현하는 &lt;a href=&quot;https://www.npmjs.com/package/itiriri&quot; rel=&quot;nofollow noreferrer&quot;&gt;itiri&lt;/a&gt;를 사용할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;import { query } from 'itiriri';

let m = new Map();
// set map ...

query(m).filter([k, v] =&amp;gt; k &amp;lt; 10).forEach([k, v] =&amp;gt; console.log(v));
let arr = query(m.values()).map(v =&amp;gt; v * 10).toArray();
&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 class=&quot;lang-js prettyprint-override&quot;&gt;&lt;code&gt;function* mapIter&amp;lt;T1, T2&amp;gt;(iterable: IterableIterator&amp;lt;T1&amp;gt;, callback: (value: T1) =&amp;gt; T2) {
  for (let x of iterable) {
    yield callback(x);
  }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/users/6843335/martyo256&quot;&gt;MartyO256&lt;/a&gt;(https://stackoverflow.com/a/53159921/7895659), 의 답변을 바탕으로 리팩토레이티드 타이프스크립트 접근 방식은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;function mapIterator&amp;lt;TIn, TOut&amp;gt;(
  iterator: Iterator&amp;lt;TIn&amp;gt;,
  callback: (input: TIn) =&amp;gt; TOut,
): Iterator&amp;lt;TOut&amp;gt; {
  return {
    next() {
      const result: IteratorResult&amp;lt;TIn&amp;gt; = iterator.next();

      if (result.done === true) {
        return result;
      } else {
        return {
          done: false,
          value: callback(result.value),
        };
      }
    },
  };
}

export function mapIterable&amp;lt;TIn, TOut&amp;gt;(
  iterable: Iterable&amp;lt;TIn&amp;gt;,
  callback: (input: TIn) =&amp;gt; TOut,
): Iterable&amp;lt;TOut&amp;gt; {
  const iterator: Iterator&amp;lt;TIn&amp;gt; = iterable[Symbol.iterator]();
  const mappedIterator: Iterator&amp;lt;TOut&amp;gt; = mapIterator(iterator, callback);

  return {
    [Symbol.iterator]: () =&amp;gt; mappedIterator,
  };
}
&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/43885365/using-map-on-an-iterator&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>JavaScript</category>
      <author>telecom</author>
      <guid isPermaLink="true">https://telecom.tistory.com/719</guid>
      <comments>https://telecom.tistory.com/719#entry719comment</comments>
      <pubDate>Mon, 6 Nov 2023 21:40:06 +0900</pubDate>
    </item>
    <item>
      <title>Python 3에서 문자열 리터럴 앞에 있는 'b' 문자 do 제거</title>
      <link>https://telecom.tistory.com/718</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Python 3에서 문자열 리터럴 앞에 있는 'b' 문자 do 제거&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/16748083/print-without-b-prefix-for-bytes-in-python-3&quot; dir=&quot;ltr&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Python 3에서 바이트의 b' 접두사 없이 인쇄&lt;/font&gt;&lt;/a&gt; 
    &lt;span class=&quot;question-originals-answer-count&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;(8개 답변)&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-12-11 11:37:33Z&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;저는 파이썬 프로그래밍을 처음 해보는데 조금 혼란스럽습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;문자열에서 해시 및 암호화할 바이트를 가져오려고 하지만 수신됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;b'...'
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아래 예와 같이 문자열 앞에 b자를 입력합니다.&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;pre&gt;&lt;code&gt;import hashlib

text = &quot;my secret data&quot;
pw_bytes = text.encode('utf-8')
print('print',pw_bytes)
m = hashlib.md5()
m.update(pw_bytes)
&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; print b'my secret data'
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이렇게 하면 효과가 있을 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;pw_bytes.decode(&quot;utf-8&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;f = open('test.txt','rb+')
ch=f.read(1)
ch=str(ch,'utf-8')
print(ch)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;디코딩이 중복됨&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;당신은 처음부터 이런 &quot;오류&quot;를 겪었을 뿐입니다. 왜냐하면 무슨 일이 일어나고 있는지에 대한 오해 때문입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&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;b&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;utf-8&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;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt; &amp;gt;&amp;gt; type(&quot;text&quot;.encode(&quot;utf-8&quot;))
 &amp;gt;&amp;gt; &amp;lt;class 'bytes'&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;수정사항:&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;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;/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/37016946/remove-b-character-do-in-front-of-a-string-literal-in-python-3&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>Python</category>
      <author>telecom</author>
      <guid isPermaLink="true">https://telecom.tistory.com/718</guid>
      <comments>https://telecom.tistory.com/718#entry718comment</comments>
      <pubDate>Mon, 6 Nov 2023 21:39:57 +0900</pubDate>
    </item>
    <item>
      <title>구글은 URL에서 검색 대신 #를 사용합니다. 왜죠?</title>
      <link>https://telecom.tistory.com/717</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;구글은 URL에서 검색 대신 #를 사용합니다. 왜죠?&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그들이 얼마나 오래 해왔는지는 모르겠지만, 구글이 &lt;strong&gt;검색&lt;/strong&gt; 대신 검색 URL에 &lt;strong&gt;#&lt;/strong&gt;를 사용하는 것을 발견했습니다&lt;strong&gt;.&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;뉴웨이&lt;/font&gt;&lt;/strong&gt;&lt;br&gt; &lt;a href=&quot;http://www.google.com/#q=stackoverflow&quot; rel=&quot;noreferrer&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;http://www.google.com/ #q=스택 오버플로&lt;/font&gt;&lt;/a&gt;&lt;br&gt; &lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;옛날 방식&lt;/font&gt;&lt;/strong&gt;&lt;br&gt; &lt;a href=&quot;http://www.google.com/search?q=stackoverflow&quot; rel=&quot;noreferrer&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;http://www.google.com/search?q=stackoverflow&lt;/font&gt;&lt;/a&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;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;더 짧은 URL 외에 구글에 어떤 이점이 있을까요?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;검색 엔진 관례에 어긋나는 것 같지만, 구글이 다시 관례를 정했습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 접근 방식에 대해 볼 수 있는 문제점이 있습니까?&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;갱신하다&lt;/font&gt;&lt;/strong&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;직접 테스트하려면 www.google.com 의 일반 검색창을 사용합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;url에는 다른 정크가 있지만 q= 앞에 있는 부분이 이 질문을 위해 참고하고 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;업데이트 2&lt;/font&gt;&lt;/strong&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;em&gt;#&lt;/em&gt; 결과로 이동하려고 할 때 일부 사람들이 &lt;em&gt;검색 &lt;/em&gt;결과로 다시 이동하기 때문에 이것이 임의 사용자에게 테스트 중인 실험적인 기능일 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;업데이트 3&lt;/font&gt;&lt;/strong&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;http://www.google.com/support/forum/p/Google%20Analytics/thread?tid=4c33bb4266ffe770&quot; rel=&quot;noreferrer&quot;&gt;여기&lt;/a&gt; 대화를 보면, 검색을 위해 주 google.com 사이트를 사용하는 모든 파이어폭스 사용자에게 롤아웃된 것으로 보입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;&lt;em&gt;&lt;font papago-translate=&quot;translated&quot;&gt;발췌문&lt;/font&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;2009년 4월 27일 # in query parameters는 검색 팀이 하던 별도의 실험(AJAX 기반 검색 결과 페이지)으로 얼마 전에 시작되었습니다.&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;2009년 4월 28일 www.google.com SERP에서 # in 쿼리 파라미터가 모든 Firefox 사용자에게 롤아웃된 것으로 보이므로 테스트 단계를 통과한 것이 틀림없습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;파이어폭스가 IE보다 AJAX를 더 잘 처리할 수 있기 때문에 IE 사용자에게 롤아웃되지 않았다고 추측하고 있습니다.&lt;/font&gt;&lt;/p&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;2009년 5월 1일 SERP의 페이지를 들여다보니 처음에는 구글이 링크에 웹사이트 &quot;진정한&quot; URL을 넣는 것처럼 보이지만 링크를 클릭하면 URL이 www.google.com/url?q=flowers&amp;amp;blahblahblah 형식의 구글 리디렉션 URL로 대체됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 리디렉션 URL은 HTTP 레퍼러 필드에 표시되고 웹 브라우저(따라서 Analytics 도구)에서 보고되는 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;나의 구글은 아직도 사용합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;search?&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;prefix. 그러나 해시(#)를 사용할 경우 페이지를 다시 로드할 필요가 없다는 장점이 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;쿼리 문자열(?)을 추가하면 모든 브라우저에서 페이지를 다시 로드할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;해시를 사용함으로써 그들은 브라우저 요소에서 항목을 유지할 수 있게 함으로써 항목을 '메모리'에 유지할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;해시를 추가하면 페이지에 대한 기록 개체도 생성됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이렇게 하면 순방향 및 역방향 기능을 유지하면서 AJAX를 사용하여 검색을 처리할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;기본적으로 전체 페이지를 로드하는 데 필요한 HTTP 헤더의 하위 집합만 가져오면 전체 로드의 기능을 잃지 않고 검색을 더 빠르게 처리할 수 있습니다.&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;빠른 구글 검색 (good old 사용)&lt;/font&gt;&lt;/font&gt;&lt;code&gt;?q=&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;method...) 다음을 표시합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;http://www.google.com/support/forum/p/Google%20Analytics/thread?tid=4c33bb4266ffe770&quot; rel=&quot;nofollow noreferrer&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Google.com 이 FireFox 사용자를 위한 google.com/ #q=flowers로 변경되었습니까?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;(google.com/url?q=flowers) 을 기대하고 있었습니다.&lt;/font&gt;&lt;/a&gt; &lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;몇 달 전 Google은 URL에 #를 추가한 검색 결과를 테스트했습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이로 인해 어떤 키워드가 자신의 사이트로 트래픽을 몰고 가는지 확인하는 데 관심이 있는 사람들에게 큰 문제가 발생했습니다(레퍼러에서 #가 전달되지 않은 후 URL에 있는 모든 것이...).&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;특히 웹 분석 제품의 경우 문제가 됩니다. 그래서 검색 팀과 협력하여 더 나은 솔루션을 찾을 수 있을 때까지 테스트를 중단했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그래서 한때 이 URL 형식이 &lt;em&gt;사용자의 일부&lt;/em&gt; 하위 집합에 사용되었는데, 이는 Google이 사용자의 의심할 수 없는 하위 집합에 대해 실행하는 많은 테스트 중 하나입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이로 인해 분석 소프트웨어에 문제가 발생하여 향후 테스트를 위해 다른 형식으로 전환했지만 여전히 이전 해시 쿼리 URL을 지원합니다(일반 해시 쿼리 URL로 자동 리디렉션).&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;그러면 검색 쿼리를 변경하면 페이지를 다시 로드하지 않고 주소 표시줄의 URL을 업데이트할 수 있습니다(# 뒤의 내용을 수정할 때 브라우저에서 새로운 GET 요청이 실행되지 않아야 함).&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;#q=stackoverflow&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;search?q=stackoverflow&amp;amp;cad=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;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;font papago-translate=&quot;translated&quot;&gt;이제 Google은 # 문자를 포함하는 모든 검색에 대한 리디렉션 페이지를 보여줍니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;한 번 해보세요. 정말 짜증나요.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 개발자로서 C#을 많이 찾고 있습니다. 그리고 이 문제로 인해 빙을 더 나은 경험으로 생각하게 되었습니다.&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/1122523/google-using-instead-of-search-in-url-why&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>Ajax</category>
      <author>telecom</author>
      <guid isPermaLink="true">https://telecom.tistory.com/717</guid>
      <comments>https://telecom.tistory.com/717#entry717comment</comments>
      <pubDate>Mon, 6 Nov 2023 21:39:51 +0900</pubDate>
    </item>
    <item>
      <title>각도 자재 테이블에서 행 인덱스 가져오기 v5</title>
      <link>https://telecom.tistory.com/716</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;각도 자재 테이블에서 행 인덱스 가져오기 v5&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;각재 v5.2를 사용하여 구현된 html의 테이블 행 인덱스를 구하려고 합니다.&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;&amp;lt;div class=&quot;example-container mat-elevation-z8&quot;&amp;gt;
  &amp;lt;div class=&quot;example-header&quot;&amp;gt;
    &amp;lt;mat-form-field&amp;gt;
      &amp;lt;input matInput (keyup)=&quot;applyFilter($event.target.value)&quot; placeholder=&quot;Filter&quot;&amp;gt;
    &amp;lt;/mat-form-field&amp;gt;
  &amp;lt;/div&amp;gt;

  &amp;lt;mat-table #table [dataSource]=&quot;dataSource&quot;&amp;gt;

    &amp;lt;!-- Position Column --&amp;gt;
    &amp;lt;ng-container matColumnDef=&quot;position&quot;&amp;gt;
      &amp;lt;mat-header-cell *matHeaderCellDef&amp;gt; No. &amp;lt;/mat-header-cell&amp;gt;
      &amp;lt;mat-cell *matCellDef=&quot;let element&quot;&amp;gt; {{element.position}} &amp;lt;/mat-cell&amp;gt;
    &amp;lt;/ng-container&amp;gt;

    &amp;lt;!-- Name Column --&amp;gt;
    &amp;lt;ng-container matColumnDef=&quot;name&quot;&amp;gt;
     &amp;lt;button (click)=&quot;doSomething()&quot;&amp;gt; Do something&amp;lt;/button&amp;gt;
    &amp;lt;/ng-container&amp;gt;

    &amp;lt;mat-header-row *matHeaderRowDef=&quot;displayedColumns&quot;&amp;gt;&amp;lt;/mat-header-row&amp;gt;
    &amp;lt;mat-row *matRowDef=&quot;let row; columns: displayedColumns;&quot;&amp;gt;&amp;lt;/mat-row&amp;gt;
  &amp;lt;/mat-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;doSomething 메서드는 인덱스가 필요한 것입니다.&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;indexOf를 사용하는 것은 엄청난 리소스 낭비입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;올바른 방법은 다음과 같이 인덱스 값으로 변수를 초기화하는 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;ng-container matColumnDef=&quot;position&quot;&amp;gt;
  &amp;lt;th mat-header-cell *matHeaderCellDef mat-sort-header&amp;gt; Num. &amp;lt;/th&amp;gt;
  &amp;lt;td mat-cell *matCellDef=&quot;let element; let i = index&quot;&amp;gt;{{i + 1}}&amp;lt;/td&amp;gt;
&amp;lt;/ng-container&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;a href=&quot;https://material.angular.io/components/table/examples&quot; rel=&quot;noreferrer&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;https://material.angular.io/components/table/examples&lt;/font&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;업데이트&lt;/strong&gt;:&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;페이지&lt;/strong&gt; 표시를 사용하는 경우 인덱스는 다음과 같은 방식으로 계산할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;ng-container matColumnDef=&quot;position&quot;&amp;gt;
  &amp;lt;th mat-header-cell *matHeaderCellDef mat-sort-header&amp;gt; Num. &amp;lt;/th&amp;gt;
  &amp;lt;td mat-cell *matCellDef=&quot;let i = index&quot;&amp;gt;
  {{this.paginator.pageIndex == 0 ? i + 1 : 1 + i + this.paginator.pageIndex * this.paginator.pageSize}}
  &amp;lt;/td&amp;gt;
&amp;lt;/ng-container&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;Angular6+를 사용하는 사람은 누구나 사용해야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;let i = dataIndex&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;let i = index&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이번 &lt;a href=&quot;https://github.com/angular/components/issues/12793#issuecomment-415356860&quot; rel=&quot;noreferrer&quot;&gt;Github 호&lt;/a&gt;에서 설명한 바와 같이.&lt;/font&gt;&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;ng-container matColumnDef=&quot;position&quot;&amp;gt;
  &amp;lt;th mat-header-cell *matHeaderCellDef mat-sort-header&amp;gt; Num. &amp;lt;/th&amp;gt;
  &amp;lt;td mat-cell *matCellDef=&quot;let element; let i = dataIndex&quot;&amp;gt;{{i + 1}}&amp;lt;/td&amp;gt;
&amp;lt;/ng-container&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;filteredData&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;dataSource&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;, 다음과 같이:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;ng-container matColumnDef=&quot;weight&quot;&amp;gt;
  &amp;lt;th mat-header-cell *matHeaderCellDef&amp;gt; Header&amp;lt;/th&amp;gt;
  &amp;lt;td mat-cell *matCellDef=&quot;let element&quot;&amp;gt; {{dataSource.filteredData.indexOf(element)}} &amp;lt;/td&amp;gt;
&amp;lt;/ng-container&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;hr&gt; 
&lt;p&gt;&lt;a href=&quot;https://stackblitz.com/edit/angular-8vfhb2&quot; rel=&quot;noreferrer&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;데모&lt;/font&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;@user3891850 솔루션 사용(&lt;/font&gt;&lt;/font&gt;&lt;code&gt;let i = index;&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;), 페이지 구성 시 인덱스는 글로벌 개체가 아닌 이 페이지의 인덱스가 되므로 페이지 구성 시 주의해야 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;https://stackblitz.com/edit/angular-bnt6sh&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;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 문제가 발생하여 사용 중인 경우&lt;/font&gt;&lt;/font&gt;&lt;code&gt;paginator&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여기서 얻을 수 있는 지수:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;  &amp;lt;td mat-cell *matCellDef=&quot;let element; let i = index&quot;&amp;gt;{{i}}&amp;lt;/td&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;예를 들어, 페이지가 2페이지이고 페이지 크기가 5인 경우, 테이블의 첫 번째 인덱스는 5(또는 6번째 항목)가 아니라 0이 됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;따라서 실제 인덱스를 얻기 위해 할 수 있는 작업은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;index =
      this.paginator.pageIndex &amp;gt; 0
        ? index + this.paginator.pageIndex * this.paginator.pageSize
        : index;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;페이지 표시기가 1페이지에 있으면 색인이 변경되지 않습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그렇지 않으면 pageIndex에 pageSize를 곱하여 인덱스에 추가합니다.&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;ng-container matColumnDef=&quot;index&quot;&amp;gt;
  &amp;lt;th mat-header-cell *matHeaderCellDef&amp;gt; Sr.No &amp;lt;/th&amp;gt;
  &amp;lt;td mat-cell *matCellDef=&quot;let i=index&quot;&amp;gt; {{i+1}} &amp;lt;/td&amp;gt;
&amp;lt;/ng-container&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;let i = index;&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;해라&lt;/font&gt;&lt;/font&gt;&lt;code&gt;let i = dataIndex&lt;/code&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/53530994/in-angular-how-do-i-get-the-row-index-on-a-mat-table-with-expandable-content&quot;&gt;대해서&lt;/a&gt;는 이 &lt;a href=&quot;https://stackoverflow.com/questions/53530994/in-angular-how-do-i-get-the-row-index-on-a-mat-table-with-expandable-content&quot;&gt;솔루션&lt;/a&gt;을 확인합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;확장 가능한 테이블용인지는 모르겠지만,&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;각도재 표를 사용할 때 2가지 케이스를 발견했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사용.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;*matCellDef=&quot;let row = index&quot;&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;테이블에 한 행 템플릿이 있는 경우&lt;/font&gt;&lt;/font&gt;&lt;/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;*matCellDef=&quot;let row = dataIndex&quot;&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;테이블에 여러 행 템플릿이 있는 경우&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;많이 검색했지만, 제 경우 &quot;indexOf&quot; 시나리오가 제대로 작동하지 않아 이 &lt;a href=&quot;https://stackoverflow.com/a/56821027/11257333&quot;&gt;답변&lt;/a&gt;을 찾았고, 제가 필요로 하는 것을 정확하게 수행합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;let i = index;
i + (paginator.pageIndex * paginator.pageSize);
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;*matRowDef에 'leti = index' 포함&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;  rindex:any;
  Cindex:any;

  show(){
    console.log(&quot;Column&quot;,this.Cindex,&quot;&quot;+&quot;Cell&quot;,this.rindex)

  }
  logIndex(j:any):void{
 this.Cindex=j

  }
  logIndex1(i:any):void{
    this.rindex=i

  }&lt;/code&gt;&lt;/pre&gt; 
  &lt;pre class=&quot;snippet-code-html lang-html prettyprint-override&quot;&gt;&lt;code&gt;  &amp;lt;ng-container *ngFor=&quot;let col of displayedColumns; index as i;&quot; matColumnDef={{col}}&amp;gt;
                      &amp;lt;th mat-header-cell *matHeaderCellDef=&quot;&quot;&amp;gt;{{displayedColumnsNames[i]}}&amp;lt;/th&amp;gt;
                      &amp;lt;td mat-cell *matCellDef=&quot;let element  ; &quot;(click)=&quot;logIndex1(i) &quot;&amp;gt; {{element[col]}} &amp;lt;/td&amp;gt;
                  &amp;lt;/ng-container&amp;gt;

                  &amp;lt;tr mat-header-row *matHeaderRowDef=&quot;displayedColumns;sticky :true   &quot; &amp;gt;&amp;lt;/tr&amp;gt;
                  &amp;lt;tr  mat-row *matRowDef=&quot;let row; columns: displayedColumns;  let j=index; &quot;(click)=&quot;[logIndex(j),show()] &quot; &amp;gt;&amp;lt;/tr&amp;gt;&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;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/50292349/get-index-of-row-in-angular-material-table-v5&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>angular</category>
      <author>telecom</author>
      <guid isPermaLink="true">https://telecom.tistory.com/716</guid>
      <comments>https://telecom.tistory.com/716#entry716comment</comments>
      <pubDate>Mon, 6 Nov 2023 21:39:44 +0900</pubDate>
    </item>
    <item>
      <title>한 컨트롤러에서 언로드하기 전에 AngularJS window.on이 다른 컨트롤러에서 트리거됨</title>
      <link>https://telecom.tistory.com/715</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;한 컨트롤러에서 언로드하기 전에 AngularJS window.on이 다른 컨트롤러에서 트리거됨&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여기 내 문제가 있습니다. 두 개의 뷰(View1 및 View2)와 각 뷰에 대한 컨트롤러(Ctrl1 및 Ctrl2)가 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;View1에서 사용자가 변경 사항을 저장하지 않고 실수로 페이지를 떠나기 전에 경고하려고 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;window.on before unload를 사용하고 있는데, window.on before unload는 잘 작동하지만, 문제는 한 개의 컨트롤러에서만 on before unload를 사용하고 있는데, 두 번째 컨트롤러에서도 이벤트가 트리거되는 것 같습니다.&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;font papago-translate=&quot;translated&quot;&gt;왜 이런 일이 생기는 건가요?&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;$locationChangeStart도 사용하고 있는데, 이는 정상적으로 작동하지만 사용자가 경로를 변경할 때만 사용할 수 있고 브라우저를 새로 고치거나 '뒤로'를 누르거나 닫으려고 할 때만 사용할 수 있기 때문입니다(더 나은 접근 방법이 있으면 알려주세요).&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;어떤 도움이나 더 나은 접근법이라도 대단히 감사하겠습니다!&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;//In this controller I check for window.onbeforeunload
app.controller(&quot;Ctrl1&quot;, function ($scope, ...)){
  window.onbeforeunload = function (event) {        

    //Check if there was any change, if no changes, then simply let the user leave
    if(!$scope.form.$dirty){
      return;
    }

    var message = 'If you leave this page you are going to lose all unsaved changes, are you sure you want to leave?';
    if (typeof event == 'undefined') {
      event = window.event;
    }
    if (event) {
      event.returnValue = message;
    }
    return message;
  }

  //This works only when user changes routes, not when user refreshes the browsers, goes to previous page or try to close the browser
  $scope.$on('$locationChangeStart', function( event ) {    
    if (!$scope.form.$dirty) return;
    var answer = confirm('If you leave this page you are going to lose all unsaved changes, are you sure you want to leave?')
    if (!answer) {
      event.preventDefault();
    }
  });
}

//This other controller has no window.onbeforeunload, yet the event is triggered here too!
app.controller(&quot;Ctrl2&quot;, function ($scope, ...)){
  //Other cool stuff ...
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언로드 전에 켜기 전에 트리거하기를 원하는 보기에 사용자에게 경고하기 위해 $location.path()로 현재 경로를 확인하려고 했지만, 이는 다른 컨트롤러에서 언로드하기 전에 실행되지 않는 것이 해결책인 것 같습니다.&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;$location.path ()&lt;/strong&gt; &lt;strong&gt;!=&lt;/strong&gt; '/view1'을 추가했는데, 이는 작동하는 것처럼 보이지만, 보기가 두 개일 뿐만 아니라 여러 개일 뿐만 아니라, 컨트롤러가 더 포함되면 까다로워질 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;app.controller(&quot;Ctrl1&quot;, function ($scope, ...)){
  window.onbeforeunload = function (event) {        

    //Check if there was any change, if no changes, then simply let the user leave
    if($location.path() != '/view1' || !$scope.form.$dirty){
      return;
    }

    var message = 'If you leave this page you are going to lose all unsaved changes, are you sure you want to leave?';
    if (typeof event == 'undefined') {
      event = window.event;
    }
    if (event) {
      event.returnValue = message;
    }
    return message;
  }

  //This works only when user changes routes, not when user refreshes the browsers, goes to previous page or try to close the browser
  $scope.$on('$locationChangeStart', function( event ) {    
    if (!$scope.form.$dirty) return;
    var answer = confirm('If you leave this page you are going to lose all unsaved changes, are you sure you want to leave?')
    if (!answer) {
      event.preventDefault();
    }
  });
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;on before unload 이벤트를 정의한 컨트롤러가 범위를 벗어날 경우 등록 취소:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$scope.$on('$destroy', function() {
    delete window.onbeforeunload;
});
&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;delete window.onbeforeunload&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;콘솔에서 기능이 제거되지 않습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;대신 속성을 정의되지 않은 상태로 설정해야 했습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$scope.$on('$destroy', function(e){
  $window.onbeforeunload = undefined;
});
&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://github.com/angular-ui/ui-router&quot; rel=&quot;nofollow noreferrer&quot;&gt;angular-ui-router&lt;/a&gt;를 사용하시는 분들은.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;$stateChangeStart&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;$locationChangeStart&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;$scope.$on('$stateChangeStart', function (event){
  if (forbit){
    event.preventDefault()
  }
  else{  
    return
  }
})
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이에 대한 업데이트로, angular-ui-router를 사용하는 모든 사람들에게, 저는 이제 $transition을 당신의 컨트롤러에 전달하고 사용합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$transitions.onStart({}, function ($transition)
{
    $transition.abort();
    //return 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;URL : https://stackoverflow.com/questions/25533513/angularjs-window-onbeforeunload-in-one-controller-is-being-triggered-on-another&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>angularJs</category>
      <author>telecom</author>
      <guid isPermaLink="true">https://telecom.tistory.com/715</guid>
      <comments>https://telecom.tistory.com/715#entry715comment</comments>
      <pubDate>Mon, 6 Nov 2023 21:39:37 +0900</pubDate>
    </item>
    <item>
      <title>마지막 로그온을 DateTime 형식으로 변환</title>
      <link>https://telecom.tistory.com/714</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;마지막 로그온을 DateTime 형식으로 변환&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;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;시간을 &quot;129948127853609000&quot;과 같은 난수 묶음으로 출력합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것을 DateTime 형식으로 변환하려면 어떻게 해야 합니까?&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Search-ADAccount -UsersOnly -SearchBase &quot;OU=International,DC=mycompany,DC=com&quot; -AccountDisabled:$false | Get-ADUser -Properties Name, manager, LastLogon | Select Name, manager, LastLogon | export-csv C:\Australia.csv -NoTypeInformation
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;DateTime.FromFileTime&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;PS C:\&amp;gt; [datetime]::FromFileTime(129948127853609000)

Monday, October 15, 2012 3:13:05 PM
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그런 다음 포맷 방법에 따라 &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/az4se3k1.aspx&quot; rel=&quot;noreferrer&quot;&gt;표준&lt;/a&gt; 및 &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/8kb3ddd4.aspx&quot; rel=&quot;noreferrer&quot;&gt;사용자&lt;/a&gt; 지정 날짜 시간 형식 문자열을 확인합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;PS C:\&amp;gt; [datetime]::FromFileTime(129948127853609000).ToString('d MMMM')
15 October
PS C:\&amp;gt; [datetime]::FromFileTime(129948127853609000).ToString('g')
10/15/2012 3:13 PM
&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;select&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이에 대한 설명:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;... | Select Name, manager, @{N='LastLogon'; E={[DateTime]::FromFileTime($_.LastLogon)}} | ...
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;Get-ADUser -Filter {Enabled -eq $true} -Properties Name,Manager,LastLogon | 
Select-Object Name,Manager,@{n='LastLogon';e={[DateTime]::FromFileTime($_.LastLogon)}}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;마지막 로그온은 GET-ADUser cmdlet을 실행한 순간 로드 밸런싱이 수행된 도메인 컨트롤러에 사용자가 마지막으로 로그인한 시간이며 &lt;strong&gt;도메인 전체에 복제되지 않습니다&lt;/strong&gt;.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;마지막 사용자가 도메인의 도메인 컨트롤러에 로그인한 시간을 원하는 경우 LastLogonTimestamp를 사용해야 합니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Last &lt;strong&gt;LogonDate&lt;/strong&gt; 속성을 사용하면 날짜/시간을 변환할 필요가 없습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;변환할 때 &lt;strong&gt;lastLogonTimestamp&lt;/strong&gt;는 &lt;strong&gt;lastLogonDate&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;translated&quot;&gt;LastLogonDate는 복제되지 않습니다.&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;last logontimstamp가 인간이 읽을 수 없음(window epoch 이후 밀리초)&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;get-adcomputer -filter 'operating system - like &quot;&lt;em&gt;server&lt;/em&gt;&quot; - and enabled - eq &quot;true&quot; - prop lastlogon timestamp|선택 이름, lastlogon timestamp, @{N='LastLogon'; E={[DateTime]:&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;:FromFileTime($_).&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/13091719/converting-lastlogon-to-datetime-format&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>PowerShell</category>
      <author>telecom</author>
      <guid isPermaLink="true">https://telecom.tistory.com/714</guid>
      <comments>https://telecom.tistory.com/714#entry714comment</comments>
      <pubDate>Mon, 6 Nov 2023 21:39:29 +0900</pubDate>
    </item>
    <item>
      <title>mariadb 및 SqlResultSetMapping을 사용한 JPA 네이티브 쿼리가 이상한 오류를 던짐</title>
      <link>https://telecom.tistory.com/713</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;mariadb 및 SqlResultSetMapping을 사용한 JPA 네이티브 쿼리가 이상한 오류를 던짐&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;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;이것은 SqlResultSetMappings가 있는 주소 엔티티입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;@Entity
@Table(name=&quot;addresses&quot;)
@SqlResultSetMappings({
       @SqlResultSetMapping(name = &quot;addresses.simpleQuery&quot;, entities = {
               @EntityResult(entityClass = Company.class,
                       fields = {
                            @FieldResult(name = &quot;id&quot;, column = &quot;company_id&quot;)
                       }
               ),
               @EntityResult(entityClass = Address.class)
       })
})
public class Address {
     @Id
     @GeneratedValue(strategy = GenerationType.AUTO)
     private Integer id;

      @Version
      private Integer version;
      private Long createdAt;
      private Long updatedAt;
      @ManyToOne(fetch = FetchType.LAZY)
      @JoinColumn(name=&quot;company_id&quot;)
      private Company company;

      //some other fields like city, state etc

      //getters and setters
}
&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;@Entity
@Table(name=&quot;companies&quot;)
public class Company {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;

    @Version
    private Integer version;
    private Long createdAt;
    private Long updatedAt;

    @OneToMany(mappedBy = &quot;company&quot;, fetch = FetchType.LAZY)
    private Set&amp;lt;Address&amp;gt; addressSet;    

    //some other fields like name

    //getters and setters
}
&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;List queryResult = entityManager.createNativeQuery(&quot;
select c.id as company_id, name, a.id as id 
from companies c, addresses a 
where c.id=a.company_id limit 3&quot;, &quot;addresses.simpleQuery&quot;).getResultList();
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;보고 또 보고...&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;내가 쿼리를 실행하면 폭발합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Caused by: org.hibernate.exception.GenericJDBCException: could not execute query
    at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:54)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:126)
    at org.hibernate.loader.Loader.doList(Loader.java:2556)
    at org.hibernate.loader.Loader.doList(Loader.java:2539)
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2369)
    at org.hibernate.loader.Loader.list(Loader.java:2364)
    at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:353)
    at org.hibernate.internal.SessionImpl.listCustomQuery(SessionImpl.java:1873)
    at org.hibernate.internal.AbstractSessionImpl.list(AbstractSessionImpl.java:311)
    at org.hibernate.internal.SQLQueryImpl.list(SQLQueryImpl.java:141)
    at org.hibernate.jpa.internal.QueryImpl.list(QueryImpl.java:573)
    at org.hibernate.jpa.internal.QueryImpl.getResultList(QueryImpl.java:449)
    ... 65 more
Caused by: java.sql.SQLException: No such column :created_2_2_0_
    at org.mariadb.jdbc.internal.common.queryresults.ColumnNameMap.getLabelIndex(ColumnNameMap.java:78)
    at org.mariadb.jdbc.internal.common.queryresults.ColumnNameMap.getIndex(ColumnNameMap.java:26)
    at org.mariadb.jdbc.MySQLResultSet.findColumn(MySQLResultSet.java:479)
    at org.mariadb.jdbc.MySQLResultSet.getLong(MySQLResultSet.java:170)
    at org.hibernate.type.descriptor.sql.BigIntTypeDescriptor$2.doExtract(BigIntTypeDescriptor.java:74)
    at org.hibernate.type.descriptor.sql.BasicExtractor.extract(BasicExtractor.java:64)
    at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:267)
    at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:263)
    at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:253)
    at org.hibernate.type.AbstractStandardBasicType.hydrate(AbstractStandardBasicType.java:338)
    at org.hibernate.persister.entity.AbstractEntityPersister.hydrate(AbstractEntityPersister.java:2969)
    at org.hibernate.loader.Loader.loadFromResultSet(Loader.java:1695)
    at org.hibernate.loader.Loader.instanceNotYetLoaded(Loader.java:1627)
    at org.hibernate.loader.Loader.getRow(Loader.java:1514)
    at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:725)
    at org.hibernate.loader.Loader.processResultSet(Loader.java:952)
    at org.hibernate.loader.Loader.doQuery(Loader.java:920)
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:354)
    at org.hibernate.loader.Loader.doList(Loader.java:2553)
    ... 74 more
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이제 누가 제가 왜 네이티브 쿼리를 사용하는지 묻기 전에, 비슷한 방식으로 폭발하는 더 복잡한 사용 사례(훨씬 더 복잡한 쿼리)가 있다는 것을 덧붙이고 싶습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그래서 문제를 재현하고 포인터를 얻을 수 있는지 확인하기 위해 위의 테스트를 만들었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;내가 뭘 잘못하고 있나요?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;생성된_2_2_0이(가) 선택된 이유는 무엇입니까?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제가 선택한 진술서에는 그것이 없습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것이 mariadb 드라이버 버그일 수 있습니까?&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/25877869/jpa-native-query-with-mariadb-and-sqlresultsetmapping-throwing-a-weird-error&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>mariadb</category>
      <author>telecom</author>
      <guid isPermaLink="true">https://telecom.tistory.com/713</guid>
      <comments>https://telecom.tistory.com/713#entry713comment</comments>
      <pubDate>Mon, 6 Nov 2023 21:39:23 +0900</pubDate>
    </item>
    <item>
      <title>Swift에서 스레드 안전 배열 만들기</title>
      <link>https://telecom.tistory.com/712</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Swift에서 스레드 안전 배열 만들기&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;스위프트에 스레딩 문제가 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;몇 개의 객체가 들어 있는 배열이 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;딜러를 통해 클래스는 매초마다 새 개체를 가져옵니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그 다음에는 객체가 이미 배열되어 있는지 확인해야 하므로 객체를 업데이트해야 합니다. 그렇지 않으면 새 객체를 삭제/추가해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;새 개체를 추가하면 먼저 네트워크를 통해 데이터를 가져와야 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것은 블록을 통해 핸드헬드됩니다.&lt;/font&gt;&lt;/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;dispatch_semaphore를 시도해 보았지만, 이것은 블록이 끝날 때까지 UI를 차단합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;블록이 현재 실행 중인지 확인하고 비교 방법을 건너뛰는 간단한 boole 변수도 시도해 보았습니다.&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;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;스위프트용 업데이트&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;스레드 안전 액세스를 위해 권장되는 패턴은 디스패치를 사용하는 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;barrier&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;let queue = DispatchQueue(label: &quot;thread-safe-obj&quot;, attributes: .concurrent)

// write
queue.async(flags: .barrier) {
    // perform writes on data
}

// read
var value: ValueType!
queue.sync {
    // perform read and assign value
}
return value
&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;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;DispatchQueues&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;잠글 때의&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사용.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;queue.sync&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;DispatchGroup&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;) 기다립니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;불필요할 뿐만 아니라 잠금 상태에 따라 부작용이 발생할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;https://github.com/apple/swift-corelibs-libdispatch/blob/master/src/queue.c&quot; rel=&quot;noreferrer&quot;&gt;GCD 소스&lt;/a&gt;에서 직접 찾아보실 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;em&gt;&lt;font papago-translate=&quot;translated&quot;&gt;또한 GCD는 새로운 구조화된 동시성 API와 잘 섞이지 않습니다!&lt;/font&gt;&lt;/em&gt;&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사용하지않습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;objc_sync_enter/exit&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;, 그것들은 ObjCs에 의해 사용됩니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;@synchronized&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것은 또한 불필요한 ObjC 대응물에 Swift 컬렉션을 암시적으로 연결할 것입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고 레거시 API입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; &lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;자물쇠를 정의하고 수집 접근을 보호하면 됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var lock = NSLock()
var a = [1, 2, 3]

lock.lock()
a.append(4)
lock.unlock()
&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;extension NSLock {

    @discardableResult
    func with&amp;lt;T&amp;gt;(_ block: () throws -&amp;gt; T) rethrows -&amp;gt; T {
        lock()
        defer { unlock() }
        return try block()
    }
}

let lock = NSLock()
var a = [1, 2, 3]

lock.with { a.append(4) }
&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;A를 정의할 수도 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;@propertyWrapper&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;var&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;@propertyWrapper
struct Atomic&amp;lt;Value&amp;gt; {

    private let lock = NSLock()
    private var value: Value

    init(default: Value) {
        self.value = `default`
    }

    var wrappedValue: Value {
        get {
            lock.lock()
            defer { lock.unlock() }
            return value
        }
        set {
            lock.lock()
            defer { lock.unlock() }
            value = newValue
        }
    }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;마지막으로 원시 원자형의 경우 &lt;a href=&quot;https://github.com/apple/swift-atomics&quot; rel=&quot;noreferrer&quot;&gt;&lt;strong&gt;스위프트 아토믹스도&lt;/strong&gt;&lt;/a&gt; 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Kirsteins의 답변은 맞지만, 편의상, 저는 동시 읽기는 허용하지만 쓰기는 차단하기 위해 비동기 장벽이 있는 동시 대기열을 사용하는 Amol Chaudhari와 Rob의 제안으로 답변을 업데이트했습니다.&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;public class SynchronizedArray&amp;lt;T&amp;gt; {
private var array: [T] = []
private let accessQueue = dispatch_queue_create(&quot;SynchronizedArrayAccess&quot;, DISPATCH_QUEUE_CONCURRENT)

public func append(newElement: T) {
    dispatch_barrier_async(self.accessQueue) {
        self.array.append(newElement)
    }
}

public func removeAtIndex(index: Int) {
    dispatch_barrier_async(self.accessQueue) {
        self.array.removeAtIndex(index)
    }
}

public var count: Int {
    var count = 0

    dispatch_sync(self.accessQueue) {
        count = self.array.count
    }

    return count
}

public func first() -&amp;gt; T? {
    var element: T?

    dispatch_sync(self.accessQueue) {
        if !self.array.isEmpty {
            element = self.array[0]
        }
    }

    return element
}

public subscript(index: Int) -&amp;gt; T {
    set {
        dispatch_barrier_async(self.accessQueue) {
            self.array[index] = newValue
        }
    }
    get {
        var element: T!

        dispatch_sync(self.accessQueue) {
            element = self.array[index]
        }

        return element
    }
}
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;업데이트&lt;/strong&gt; 이것은 스위프트3용으로 업데이트된 것과 동일한 코드입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;public class SynchronizedArray&amp;lt;T&amp;gt; {
private var array: [T] = []
private let accessQueue = DispatchQueue(label: &quot;SynchronizedArrayAccess&quot;, attributes: .concurrent)

public func append(newElement: T) {

    self.accessQueue.async(flags:.barrier) {
        self.array.append(newElement)
    }
}

public func removeAtIndex(index: Int) {

    self.accessQueue.async(flags:.barrier) {
        self.array.remove(at: index)
    }
}

public var count: Int {
    var count = 0

    self.accessQueue.sync {
        count = self.array.count
    }

    return count
}

public func first() -&amp;gt; T? {
    var element: T?

    self.accessQueue.sync {
        if !self.array.isEmpty {
            element = self.array[0]
        }
    }

    return element
}

public subscript(index: Int) -&amp;gt; T {
    set {
        self.accessQueue.async(flags:.barrier) {
            self.array[index] = newValue
        }
    }
    get {
        var element: T!
        self.accessQueue.sync {
            element = self.array[index]
        }

        return element
    }
}
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 문제에 대한 제 접근 방식은 직렬 디스패치 큐를 사용하여 박스 배열에 대한 액세스를 동기화하는 것이었습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;인덱스에서 값을 가져오려고 할 때 스레드가 차단되고 대기열이 매우 바쁘지만 잠금의 문제이기도 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;public class SynchronizedArray&amp;lt;T&amp;gt; {
    private var array: [T] = []
    private let accessQueue = dispatch_queue_create(&quot;SynchronizedArrayAccess&quot;, DISPATCH_QUEUE_SERIAL)

    public func append(newElement: T) {
        dispatch_async(self.accessQueue) {
            self.array.append(newElement)
        }
    }

    public subscript(index: Int) -&amp;gt; T {
        set {
            dispatch_async(self.accessQueue) {
                self.array[index] = newValue
            }
        }
        get {
            var element: T!

            dispatch_sync(self.accessQueue) {
                element = self.array[index]
            }

            return element
        }
    }
}

var a = SynchronizedArray&amp;lt;Int&amp;gt;()
a.append(1)
a.append(2)
a.append(3)

// can be empty as this is non-thread safe access
println(a.array)

// thread-safe synchonized access
println(a[0])
println(a[1])
println(a[2])
&lt;/code&gt;&lt;/pre&gt;&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;세부 사항&lt;/font&gt;&lt;/h2&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Xcode 10.1 (10B61), Swift 4.2&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Xcode 10.2.1 (10E1001), Swift 5&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;해결책&lt;/font&gt;&lt;/h2&gt; 
&lt;pre&gt;&lt;code&gt;import Foundation

// https://developer.apple.com/documentation/swift/rangereplaceablecollection
struct AtomicArray&amp;lt;T&amp;gt;: RangeReplaceableCollection {

    typealias Element = T
    typealias Index = Int
    typealias SubSequence = AtomicArray&amp;lt;T&amp;gt;
    typealias Indices = Range&amp;lt;Int&amp;gt;
    fileprivate var array: Array&amp;lt;T&amp;gt;
    var startIndex: Int { return array.startIndex }
    var endIndex: Int { return array.endIndex }
    var indices: Range&amp;lt;Int&amp;gt; { return array.indices }

    func index(after i: Int) -&amp;gt; Int { return array.index(after: i) }

    private var semaphore = DispatchSemaphore(value: 1)
    fileprivate func _wait() { semaphore.wait() }
    fileprivate func _signal() { semaphore.signal() }
}

// MARK: - Instance Methods

extension AtomicArray {

    init&amp;lt;S&amp;gt;(_ elements: S) where S : Sequence, AtomicArray.Element == S.Element {
        array = Array&amp;lt;S.Element&amp;gt;(elements)
    }

    init() { self.init([]) }

    init(repeating repeatedValue: AtomicArray.Element, count: Int) {
        let array = Array(repeating: repeatedValue, count: count)
        self.init(array)
    }
}

// MARK: - Instance Methods

extension AtomicArray {

    public mutating func append(_ newElement: AtomicArray.Element) {
        _wait(); defer { _signal() }
        array.append(newElement)
    }

    public mutating func append&amp;lt;S&amp;gt;(contentsOf newElements: S) where S : Sequence, AtomicArray.Element == S.Element {
        _wait(); defer { _signal() }
        array.append(contentsOf: newElements)
    }

    func filter(_ isIncluded: (AtomicArray.Element) throws -&amp;gt; Bool) rethrows -&amp;gt; AtomicArray {
        _wait(); defer { _signal() }
        let subArray = try array.filter(isIncluded)
        return AtomicArray(subArray)
    }

    public mutating func insert(_ newElement: AtomicArray.Element, at i: AtomicArray.Index) {
        _wait(); defer { _signal() }
        array.insert(newElement, at: i)
    }

    mutating func insert&amp;lt;S&amp;gt;(contentsOf newElements: S, at i: AtomicArray.Index) where S : Collection, AtomicArray.Element == S.Element {
        _wait(); defer { _signal() }
        array.insert(contentsOf: newElements, at: i)
    }

    mutating func popLast() -&amp;gt; AtomicArray.Element? {
        _wait(); defer { _signal() }
        return array.popLast()
    }

    @discardableResult mutating func remove(at i: AtomicArray.Index) -&amp;gt; AtomicArray.Element {
        _wait(); defer { _signal() }
        return array.remove(at: i)
    }

    mutating func removeAll() {
        _wait(); defer { _signal() }
        array.removeAll()
    }

    mutating func removeAll(keepingCapacity keepCapacity: Bool) {
        _wait(); defer { _signal() }
        array.removeAll()
    }

    mutating func removeAll(where shouldBeRemoved: (AtomicArray.Element) throws -&amp;gt; Bool) rethrows {
        _wait(); defer { _signal() }
        try array.removeAll(where: shouldBeRemoved)
    }

    @discardableResult mutating func removeFirst() -&amp;gt; AtomicArray.Element {
        _wait(); defer { _signal() }
        return array.removeFirst()
    }

    mutating func removeFirst(_ k: Int) {
        _wait(); defer { _signal() }
        array.removeFirst(k)
    }

    @discardableResult mutating func removeLast() -&amp;gt; AtomicArray.Element {
        _wait(); defer { _signal() }
        return array.removeLast()
    }

    mutating func removeLast(_ k: Int) {
        _wait(); defer { _signal() }
        array.removeLast(k)
    }

    @inlinable public func forEach(_ body: (Element) throws -&amp;gt; Void) rethrows {
        _wait(); defer { _signal() }
        try array.forEach(body)
    }

    mutating func removeFirstIfExist(where shouldBeRemoved: (AtomicArray.Element) throws -&amp;gt; Bool) {
        _wait(); defer { _signal() }
        guard let index = try? array.firstIndex(where: shouldBeRemoved) else { return }
        array.remove(at: index)
    }

    mutating func removeSubrange(_ bounds: Range&amp;lt;Int&amp;gt;) {
        _wait(); defer { _signal() }
        array.removeSubrange(bounds)
    }

    mutating func replaceSubrange&amp;lt;C, R&amp;gt;(_ subrange: R, with newElements: C) where C : Collection, R : RangeExpression, T == C.Element, AtomicArray&amp;lt;Element&amp;gt;.Index == R.Bound {
        _wait(); defer { _signal() }
        array.replaceSubrange(subrange, with: newElements)
    }

    mutating func reserveCapacity(_ n: Int) {
        _wait(); defer { _signal() }
        array.reserveCapacity(n)
    }

    public var count: Int {
        _wait(); defer { _signal() }
        return array.count
    }

    public var isEmpty: Bool {
        _wait(); defer { _signal() }
        return array.isEmpty
    }
}

// MARK: - Get/Set

extension AtomicArray {

    // Single  action

    func get() -&amp;gt; [T] {
        _wait(); defer { _signal() }
        return array
    }

    mutating func set(array: [T]) {
        _wait(); defer { _signal() }
        self.array = array
    }

    // Multy actions

    mutating func get(closure: ([T])-&amp;gt;()) {
        _wait(); defer { _signal() }
        closure(array)
    }

    mutating func set(closure: ([T]) -&amp;gt; ([T])) {
        _wait(); defer { _signal() }
        array = closure(array)
    }
}

// MARK: - Subscripts

extension AtomicArray {

    subscript(bounds: Range&amp;lt;AtomicArray.Index&amp;gt;) -&amp;gt; AtomicArray.SubSequence {
        get {
            _wait(); defer { _signal() }
            return AtomicArray(array[bounds])
        }
    }

    subscript(bounds: AtomicArray.Index) -&amp;gt; AtomicArray.Element {
        get {
            _wait(); defer { _signal() }
            return array[bounds]
        }
        set(value) {
            _wait(); defer { _signal() }
            array[bounds] = value
        }
    }
}

// MARK: - Operator Functions

extension AtomicArray {

    static func + &amp;lt;Other&amp;gt;(lhs: Other, rhs: AtomicArray) -&amp;gt; AtomicArray where Other : Sequence, AtomicArray.Element == Other.Element {
        return AtomicArray(lhs + rhs.get())
    }

    static func + &amp;lt;Other&amp;gt;(lhs: AtomicArray, rhs: Other) -&amp;gt; AtomicArray where Other : Sequence, AtomicArray.Element == Other.Element {
        return AtomicArray(lhs.get() + rhs)
    }

    static func + &amp;lt;Other&amp;gt;(lhs: AtomicArray, rhs: Other) -&amp;gt; AtomicArray where Other : RangeReplaceableCollection, AtomicArray.Element == Other.Element {
        return AtomicArray(lhs.get() + rhs)
    }

    static func + (lhs: AtomicArray&amp;lt;Element&amp;gt;, rhs: AtomicArray&amp;lt;Element&amp;gt;) -&amp;gt; AtomicArray {
        return AtomicArray(lhs.get() + rhs.get())
    }

    static func += &amp;lt;Other&amp;gt;(lhs: inout AtomicArray, rhs: Other) where Other : Sequence, AtomicArray.Element == Other.Element {
        lhs._wait(); defer { lhs._signal() }
        lhs.array += rhs
    }
}

// MARK: - CustomStringConvertible

extension AtomicArray: CustomStringConvertible {
    var description: String {
        _wait(); defer { _signal() }
        return &quot;\(array)&quot;
    }
}

// MARK: - Equatable

extension AtomicArray where Element : Equatable {

    func split(separator: Element, maxSplits: Int, omittingEmptySubsequences: Bool) -&amp;gt; [ArraySlice&amp;lt;Element&amp;gt;] {
        _wait(); defer { _signal() }
        return array.split(separator: separator, maxSplits: maxSplits, omittingEmptySubsequences: omittingEmptySubsequences)
    }

    func firstIndex(of element: Element) -&amp;gt; Int? {
        _wait(); defer { _signal() }
        return array.firstIndex(of: element)
    }

    func lastIndex(of element: Element) -&amp;gt; Int? {
        _wait(); defer { _signal() }
        return array.lastIndex(of: element)
    }

    func starts&amp;lt;PossiblePrefix&amp;gt;(with possiblePrefix: PossiblePrefix) -&amp;gt; Bool where PossiblePrefix : Sequence, Element == PossiblePrefix.Element {
        _wait(); defer { _signal() }
        return array.starts(with: possiblePrefix)
    }

    func elementsEqual&amp;lt;OtherSequence&amp;gt;(_ other: OtherSequence) -&amp;gt; Bool where OtherSequence : Sequence, Element == OtherSequence.Element {
        _wait(); defer { _signal() }
        return array.elementsEqual(other)
    }

    func contains(_ element: Element) -&amp;gt; Bool {
        _wait(); defer { _signal() }
        return array.contains(element)
    }

    static func != (lhs: AtomicArray&amp;lt;Element&amp;gt;, rhs: AtomicArray&amp;lt;Element&amp;gt;) -&amp;gt; Bool {
        lhs._wait(); defer { lhs._signal() }
        rhs._wait(); defer { rhs._signal() }
        return lhs.array != rhs.array
    }

    static func == (lhs: AtomicArray&amp;lt;Element&amp;gt;, rhs: AtomicArray&amp;lt;Element&amp;gt;) -&amp;gt; Bool {
        lhs._wait(); defer { lhs._signal() }
        rhs._wait(); defer { rhs._signal() }
        return lhs.array == rhs.array
    }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사용샘플1&lt;/font&gt;&lt;/h2&gt; 
&lt;pre&gt;&lt;code&gt;import Foundation

// init
var array = AtomicArray&amp;lt;Int&amp;gt;()
print(array)
array = AtomicArray(repeating: 0, count: 5)
print(array)
array = AtomicArray([1,2,3,4,5,6,7,8,9])
print(array)

// add
array.append(0)
print(array)
array.append(contentsOf: [5,5,5])
print(array)

// filter
array = array.filter { $0 &amp;lt; 7 }
print(array)

// map
let strings = array.map { &quot;\($0)&quot; }
print(strings)

// insert
array.insert(99, at: 5)
print(array)
array.insert(contentsOf: [2, 2, 2], at: 0)
print(array)

// pop
_ = array.popLast()
print(array)
_ = array.popFirst()
print(array)

// remove
array.removeFirst()
print(array)
array.removeFirst(3)
print(array)
array.remove(at: 2)
print(array)
array.removeLast()
print(array)
array.removeLast(5)
print(array)
array.removeAll { $0%2 == 0 }
print(array)
array = AtomicArray([1,2,3,4,5,6,7,8,9,0])
array.removeSubrange(0...2)
print(array)
array.replaceSubrange(0...2, with: [0,0,0])
print(array)
array.removeAll()
print(array)

array.set(array: [1,2,3,4,5,6,7,8,9,0])
print(array)

// subscript
print(array[0])
array[0] = 100
print(array)
print(array[1...4])

// operator functions
array = [1,2,3] + AtomicArray([4,5,6])
print(array)
array = AtomicArray([4,5,6]) + [1,2,3]
print(array)
array = AtomicArray([1,2,3]) + AtomicArray([4,5,6])
print(array)
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사용샘플2&lt;/font&gt;&lt;/h2&gt; 
&lt;pre&gt;&lt;code&gt;import Foundation

var arr = AtomicArray([0,1,2,3,4,5])
for i in 0...1000 {
    // Single actions
    DispatchQueue.global(qos: .background).async {
        usleep(useconds_t(Int.random(in: 100...10000)))
        let num = i*i
        arr.append(num)
        print(&quot;arr.append(\(num)), background queue&quot;)
    }
    DispatchQueue.global(qos: .default).async {
        usleep(useconds_t(Int.random(in: 100...10000)))
        arr.append(arr.count)
        print(&quot;arr.append(\(arr.count)), default queue&quot;)
    }

    // multy actions
    DispatchQueue.global(qos: .utility).async {
        arr.set { array -&amp;gt; [Int] in
            var newArray = array
            newArray.sort()
            print(&quot;sort(), .utility queue&quot;)
            return newArray
        }
    }
}
&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;Swift 3에서 (적어도 Xcode 8 Beta 6에서는) 큐에 대한 구문이 크게 변경되었습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;@Kirsteins 답변의 중요한 변경 사항은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;private let accessQueue = DispatchQueue(label: &quot;SynchronizedArrayAccess&quot;)

txAccessQueue.async() {
  // Your async code goes here...
}

txAccessQueue.sync() {
  // Your sync code goes here...
}
&lt;/code&gt;&lt;/pre&gt;&lt;h1&gt;&lt;font papago-translate=&quot;translated&quot;&gt;행위자가 포함된 스레드 세이프 데이터 구조&lt;/font&gt;&lt;/h1&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Swift 5.5를 기준으로 배우를 통해 이를 표현할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-swift prettyprint-override&quot;&gt;&lt;code&gt;actor SyncArray&amp;lt;T&amp;gt; {
    private var buffer: [T]
    
    init&amp;lt;S: Sequence&amp;gt;(_ elements: S) where S.Element == T {
        buffer = Array(elements)
    }
    
    var count: Int {
        buffer.count
    }
    
    func append(_ element: T) {
        buffer.append(element)
    }
    
    @discardableResult
    func remove(at index: Int) -&amp;gt; T {
        buffer.remove(at: index)
    }
}
&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 class=&quot;lang-swift prettyprint-override&quot;&gt;&lt;code&gt;Task {
    let array = SyncArray([1])

    if await array.count == 1 { 
        await array.remove(at: 0)
    }
}
&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;.remove(at:)&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;count&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 class=&quot;lang-swift prettyprint-override&quot;&gt;&lt;code&gt;extension SyncArray {
    func removeLastIfSizeOfOne() {
        if buffer.count == 1 {
            buffer.remove(at: 0)
        }
    }
}
&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;isolated&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 class=&quot;lang-swift prettyprint-override&quot;&gt;&lt;code&gt;func removeLastIfSizeOfOne&amp;lt;T&amp;gt;(_ array: isolated SyncArray&amp;lt;T&amp;gt;) {
    if array == 1 {
        array(at: 0)
    }
}
&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;h1&gt;&lt;font papago-translate=&quot;translated&quot;&gt;스위프트-니오 &amp;amp; 베이퍼 스위프트&lt;/font&gt;&lt;/h1&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Swift-Nio(또는 Swift-Nio를 기반으로 하는 Vapor Swift)를 사용하는 분들을 위해 이 문제에 대한 내장 솔루션이 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;class MyClass {
    let lock = Lock()
    var myArray: Array&amp;lt;Int&amp;gt; = []

    func networkRequestWhatEver() {
        lock.withLock {
            array.append(someValue)
        }
    }
}
&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;Lock&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;Array&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;Dictionary&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;, 등).&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://github.com/apple/swift-nio/blob/5e728b57862ce9e13877ff1edc9249adc933070a/Sources/NIOConcurrencyHelpers/lock.swift#L15&quot; rel=&quot;noreferrer&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;https://github.com/apple/swift-nio/blob/5e728b57862ce9e13877ff1edc9249adc933070a/Sources/NIOConcurrencyHelpers/lock.swift#L15&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;스위프트 4의 정답은 이렇습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;let queue = DispatchQueue(label: &quot;com.readerWriter&quot;, qos: .background, attributes: .concurrent)
var safeArray: [String] = []

subscript(index: Int) -&amp;gt; String {

    get {
        queue.sync {
            return safeArray[index]
        }
    }

    set(newValue) {
        queue.async(flags: .barrier) { [weak self] in
            self?.safeArray[index] = newValue
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;dispatch_barrier는 조사할 가치가 있다고 생각합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여러 스레드에서 상태가 변형되지 않도록 동기화 키워드를 사용하는 것보다 동기화에 gcd를 사용하는 것이 더 직관적입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://mikeash.com/pyblog/friday-qa-2011-10-14-whats-new-in-gcd.html&quot; rel=&quot;nofollow&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;https://mikeash.com/pyblog/friday-qa-2011-10-14-whats-new-in-gcd.html&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;h1&gt;&lt;font papago-translate=&quot;translated&quot;&gt;접근 방법:&lt;/font&gt;&lt;/h1&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;DispatchQueue&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;h1&gt;&lt;font papago-translate=&quot;translated&quot;&gt;참조:&lt;/font&gt;&lt;/h1&gt; 
&lt;p&gt;&lt;a href=&quot;http://basememara.com/creating-thread-safe-arrays-in-swift/&quot; rel=&quot;nofollow noreferrer&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;http://basememara.com/creating-thread-safe-arrays-in-swift/&lt;/font&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;h1&gt;&lt;font papago-translate=&quot;translated&quot;&gt;코드:&lt;/font&gt;&lt;/h1&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아래는 스레드 세이프 어레이의 대략적인 구현입니다. 이를 미세 조정할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;public class ThreadSafeArray&amp;lt;Element&amp;gt; {
    
    private var elements    : [Element]
    private let syncQueue   = DispatchQueue(label: &quot;Sync Queue&quot;,
                                            qos: .default,
                                            attributes: .concurrent,
                                            autoreleaseFrequency: .inherit,
                                            target: nil)
    
    public init() {
        elements = []
    }
    
    public init(_ newElements: [Element]) {
        elements = newElements
    }
    
    //MARK: Non-mutating
    
    public var first : Element? {
        return syncQueue.sync {
            elements.first
        }
    }
    
    public var last : Element? {
        return syncQueue.sync {
            elements.last
        }
    }
    
    public var count : Int {
        
        return syncQueue.sync {
            elements.count
        }
    }
    
    public subscript(index: Int) -&amp;gt; Element {
        
        get {
            return syncQueue.sync {
                elements[index]
            }
        }
        
        set {
            syncQueue.sync(flags: .barrier) {
                elements[index] = newValue
            }
        }
    }
    
    public func reversed() -&amp;gt; [Element] {
        
        return syncQueue.sync {
        
            elements.reversed()
        }
    }
    
    public func flatMap&amp;lt;T&amp;gt;(_ transform: (Element) throws -&amp;gt; T?) rethrows -&amp;gt; [T]  {
        
        return try syncQueue.sync {
        
           try elements.flatMap(transform)
        }
    }
    
    public func filter(_ isIncluded: (Element) -&amp;gt; Bool) -&amp;gt; [Element] {
        
        return syncQueue.sync {
         
            elements.filter(isIncluded)
        }
    }
    
    //MARK: Mutating
    
    public func append(_ element: Element) {
    
        syncQueue.sync(flags: .barrier) {
            
            elements.append(element)
        }
    }
    
    public func append&amp;lt;S&amp;gt;(contentsOf newElements: S) where Element == S.Element, S : Sequence {
        
        syncQueue.sync(flags: .barrier) {
            
            elements.append(contentsOf: newElements)
        }
    }
    
    public func remove(at index: Int) -&amp;gt; Element? {

        var element : Element?

        syncQueue.sync(flags: .barrier) {
            
            if elements.startIndex ..&amp;lt; elements.endIndex ~= index {
                element = elements.remove(at: index)
            }
            else {
                element = nil
            }
        }
        
        return element
    }
}

extension ThreadSafeArray where Element : Equatable {
    
    public func index(of element: Element) -&amp;gt; Int? {
        
        return syncQueue.sync {
            elements.index(of: element)
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;먼저 objc_sync_enter가 작동하지 않습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;objc_sync_enter(array)
defer {
   objc_sync_exit(array)
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;reason &lt;a href=&quot;https://stackoverflow.com/questions/35084754/objc-sync-enter-objc-sync-exit-not-working-with-dispatch-queue-priority-low&quot;&gt;objc_sync_enter&lt;/a&gt; /&lt;a href=&quot;https://stackoverflow.com/questions/35084754/objc-sync-enter-objc-sync-exit-not-working-with-dispatch-queue-priority-low&quot;&gt; objc_sync_exit이 DISPATISPATION_QUE_PRIORITE_LOW에서 작동&lt;/a&gt;하지 않습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;objc_sync_enter는 극도로 낮은 수준의 프리미티브이므로 직접 사용하지 않습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;ObjC의 구 @synchronized 시스템 구현 세부 사항입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;@Kirsteins가 말한 것처럼, swift는 다음과 같이 사용해야 합니다. 그리고 저는 비동기 대신 sync를 제안합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;private let syncQueue = DispatchQueue(label:&quot;com.test.LockQueue&quot;) 
func test(){
    self.syncQueue.sync{
        // thread safe code here
    }
}
&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;ol&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;시리얼 디스패치 대기열:&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;간단하면서도 직관적인 GCD 패턴입니다.&lt;/font&gt;&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;동시 대기열이 있는 판독기 작성기 패턴:&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이는 직렬 디스패치 대기열 패턴을 우아하게 개선한 것으로, 비동기 &quot;쓰기&quot;가 있는 동시 대기열을 사용하여(발신자가 쓰기가 끝날 때까지 기다리지 않도록) 장벽이 있지만(&quot;쓰기&quot;와 동시에 상호작용을 방지하기 위해), 동시 &quot;읽기&quot;를 제공합니다(&quot;읽기&quot; 중에 더 큰 동시성을 허용합니다).&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이는 정교하고 매력적인 패턴이지만 실제로는 동시 &quot;읽기&quot;와 비동기 &quot;쓰기&quot;의 이점이 GCD 오버헤드보다 클 경우에만 유용합니다.&lt;/font&gt;&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;잠금 장치:&lt;/font&gt;&lt;/p&gt; 
  &lt;ul&gt; 
   &lt;li&gt;&lt;p&gt;&lt;code&gt;NSLock&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;는 빠르고 간단한 잠금 메커니즘으로 대부분의 시나리오에서 GCD 대체품보다 성능이 뛰어납니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; &lt;pre class=&quot;lang-swift prettyprint-override&quot;&gt;&lt;code&gt;extension NSLocking {
    func synchronized&amp;lt;T&amp;gt;(_ block: () throws -&amp;gt; T) rethrows -&amp;gt; T {
        lock()
        defer { unlock() }
        return try block()
    }
}
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
   &lt;li&gt;&lt;p&gt;&lt;code&gt;os_unfair_lock&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;NSLock&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;https://stackoverflow.com/a/66525671/1271826 를 참조하십시오.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러나 성능이 무엇보다 중요한 드문 경우에는 불공정한 잠금 장치가 설득력 있는 해결책이 됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; &lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;목표-C&lt;/font&gt;&lt;/font&gt;&lt;code&gt;objc_sync_enter&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;objc_sync_exit&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;API: 이것은 스위프트 세계에서는 실질적인 관심사가 아닙니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;세마포어:&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;개념적으로는 잠금 기반 접근법과 유사하지만 일반적으로 잠금 기반 접근법보다 느리기 때문에 이 대화에서는 무시할 수 있습니다.&lt;/font&gt;&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;액터스: Swift 5.5 동시성 시스템에서 제공하는 동기화 메커니즘&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;https://developer.apple.com/videos/play/wwdc2021/10133/&quot; rel=&quot;nofollow noreferrer&quot;&gt;Swift 배우와 함께 가변 상태 보호&lt;/a&gt;를 참조하십시오.&lt;/font&gt;&lt;/p&gt; &lt;/li&gt; 
&lt;/ol&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;간단히 말해서, 만약 사용한다면.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;async&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;-&lt;/font&gt;&lt;/font&gt;&lt;code&gt;await&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;, 배우가 논리적인 대안입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아직 스위프트 동시성 시스템을 채택하지 않았다면 잠금 기반 접근법(간단하고 빠른)이나 드물게는 GCD 리더-라이터 접근법에 끌릴 것입니다.&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 papago-translate=&quot;translated&quot;&gt;그렇다 치더라도, 오래된 동기화 메커니즘(세마포어,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;objc_sync_enter&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;hr&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;가능한 동기화 메커니즘의 개요를 설명한 다음 다음 질문은 동기화를 수행하는 수준입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;구체적으로, 전체 어레이에 대한 속성 래퍼(property wraper)가 두 번 이상 제안되었습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여기는 항상 동기화하기에 잘못된 위치입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;속성 래퍼 접근 방식은 배열에 대한 원자적 액세스(thread-safety와는 전혀 동일하지 않음)를 제공하지만 일반적으로 더 높은 수준의 추상화가 필요합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예를 들어, 한 스레드가 요소를 추가하고 다른 스레드가 읽기 또는 제거하는 경우 배열의 개별 액세스뿐만 아니라 이러한 고급 작업을 각각 동기화하기를 원하는 경우가 많습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/a/28976644/1979882&quot;&gt;수락된 답변을 개선하기 위해&lt;/a&gt; 다음과 같이 연기를 사용할 것을 제안합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;objc_sync_enter(array)
defer {
   objc_sync_exit(array)
}
// manipulate the array
&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;func sync(lock: NSObject, closure: () -&amp;gt; Void) {
    objc_sync_enter(lock)
    defer {
        objc_sync_exit(lock)
    }
    closure()
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;스위프트 스레드 세이프 컬렉션&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Swift에서 무언가(예: Collection) 스레드를 안전하게 만드는 가장 일반적인 아이디어는 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사용자 지정(로컬) &lt;strong&gt;동시 대기열&lt;/strong&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;동기 판독&lt;/strong&gt;.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음을 통해 중요 섹션(공유 리소스) 읽기&lt;/font&gt;&lt;/font&gt;&lt;code&gt;sync&lt;/code&gt;&lt;/li&gt; 
 &lt;li&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;/li&gt; 
&lt;/ol&gt; 
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/a/66233444/4770877&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;[스위프트 스레드 세이프 싱글톤]&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;스레드 세이프(thread safe)와 동시 읽기를 차단하지 않는 훌륭한 답변이 있습니다. https://stackoverflow.com/a/15936959/2050665&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Objective C에 기재되어 있지만 스위프트로 포팅하는 것은 사소한 일입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;@property (nonatomic, readwrite, strong) dispatch_queue_t thingQueue;
@property (nonatomic, strong) NSObject *thing;

- (id)init {
  ...
    _thingQueue = dispatch_queue_create(&quot;...&quot;, DISPATCH_QUEUE_CONCURRENT);
  ...
}

- (NSObject *)thing {
  __block NSObject *thing;
  dispatch_sync(self.thingQueue, ^{
    thing = _thing;
  });
  return thing;
}

- (void)setThing:(NSObject *)thing {
  dispatch_barrier_async(self.thingQueue, ^{
    _thing = thing;
  });
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;https://stackoverflow.com/users/97337/rob-napier 에 대한 크레딧 제공&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/28191079/create-thread-safe-array-in-swift&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>swift</category>
      <author>telecom</author>
      <guid isPermaLink="true">https://telecom.tistory.com/712</guid>
      <comments>https://telecom.tistory.com/712#entry712comment</comments>
      <pubDate>Mon, 6 Nov 2023 21:39:16 +0900</pubDate>
    </item>
    <item>
      <title>삽입 문으로 MySQL 내보내기 쿼리</title>
      <link>https://telecom.tistory.com/711</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;삽입 문으로 MySQL 내보내기 쿼리&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;나는 두개의 mysql 테이블을 가지고 있는데 둘다 타입이 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;공통 신분증.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;같은 타입의 이 두 테이블에서 모두 선택하고 싶습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;ID, 아래 쿼리:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;SELECT ta.requiredTypeID, ta.typeID, ta.quantity 
  FROM `invtypes` as t, `typeactivitymaterials` as ta 
  WHERE volume &amp;gt; 0 AND t.typeID = ta.typeID;
&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;OUTFILE &quot;/path/&quot;에 추가를 시도했지만 데이터를 탭/콤마 구분 데이터로만 내보냅니다. 이 데이터를 삽입 문으로 내보낼 수 있습니까?&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;건배.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이프&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;mysqldump&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;대신.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;매개변수를 확인합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;--tables&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;--where=&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://dev.mysql.com/doc/refman/5.1/en/mysqldump.html&quot; rel=&quot;noreferrer&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;MySQL Workbench가 있으면 삽입문을 생성할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;SQL 편집기에서 쿼리를 실행한 다음 결과 집합에서 내보내기 버튼을 클릭할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그런 다음 &quot;유형으로 저장&quot;에서 &quot;SQL INSERT 문(*.sql)&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;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 이것을 테이블에서 간단한 선택 *에서만 테스트했습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여러 테이블로 테스트해 본 적이 없습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;도움이 되었으면 좋겠습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;편집: Windows, OSX 및 Linux용으로 워크벤치를 사용할 수 있는 것 같습니다(고마운 vcardillo).&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;INSERT와 SELECT를 결합하여 SELECT 문의 결과에서 직접 레코드를 삽입할 수 있습니다.&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;INSERT INTO newtable (requiredTypeID, typeID, quantity)
     SELECT ta.requiredTypeID, ta.typeID, ta.quantity 
         FROM `invtypes` as t, `typeactivitymaterials` as ta 
         WHERE volume &amp;gt; 0 AND t.typeID = ta.typeID;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음은 관련 &lt;a href=&quot;http://dev.mysql.com/doc/refman/5.1/en/insert-select.html&quot; rel=&quot;noreferrer&quot;&gt;MySQL 매뉴얼 페이지&lt;/a&gt; 링크입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이렇게 하면 실제로 바로 삽입이 가능합니다. 나중에 사용할 삽입문을 생성하기 위해 요청한 작업을 제대로 수행할 수 없습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그냥 여기 놔두는 거야, 만약 누군가가 그들을 만들기 위한 정확한 쿼리를 찾으러 온다면,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;MySQL&lt;/code&gt; &lt;code&gt;export&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;insert&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;진술들.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 답변은 다음을 사용합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;mysqldump&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;@a'의 제안으로&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-sql prettyprint-override&quot;&gt;&lt;code&gt;mysqldump -u&amp;lt;user-name&amp;gt; -p&amp;lt;password&amp;gt; mydb t1 t2 t3 &amp;gt; mydb_tables.sql
&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 
       concat(
         concat(
           concat(
             concat(
               concat(
                 concat('insert into &amp;lt;table&amp;gt; (requiredTypeID, typeID, quantity) values (&quot;'
                        ,ta.requiredTypeID)
               ,'&quot;, &quot;')
             ,ta.typeID)
           ,'&quot;, &quot;')
         ,ta.quantity)
       ,'&quot;)')
FROM 
       `invtypes` as t, `typeactivitymaterials` as ta 
WHERE 
       volume &amp;gt; 0 AND t.typeID = ta.typeID;
INTO OUTFILE 'file_name'  
&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/3786820/mysql-export-query-as-insert-statements&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>MySQL</category>
      <author>telecom</author>
      <guid isPermaLink="true">https://telecom.tistory.com/711</guid>
      <comments>https://telecom.tistory.com/711#entry711comment</comments>
      <pubDate>Mon, 6 Nov 2023 21:38:53 +0900</pubDate>
    </item>
    <item>
      <title>javascript에서 배열의 요소를 설정 해제하려면 어떻게 해야 합니까?</title>
      <link>https://telecom.tistory.com/710</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;javascript에서 배열의 요소를 설정 해제하려면 어떻게 해야 합니까?&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;배열 정보에서 키 'bar'를 제거하여 'bar'가 표시되지 않도록 하는 방법&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;for(key in foo){alert(key);}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;배열에서 요소를 제거하지 않으므로 &lt;strong&gt;삭제&lt;/strong&gt;를 사용하지 마십시오. 배열의 길이에 올바르게 반영되지 않습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;키를 알고 있다면 &lt;strong&gt;스플라이스&lt;/strong&gt;를 사용해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;myArray.splice(key, 1);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Steven의 입장에 있는 누군가에게 당신은 다음과 같은 것을 시도할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;for (var key in myArray) {
    if (key == 'bar') {
        myArray.splice(key, 1);
    }
}
&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;for (var key in myArray) {
    if (myArray[key] == 'bar') {
        myArray.splice(key, 1);
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;delete foo[key];
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&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;/p&gt; 
&lt;pre&gt;&lt;code&gt;delete array['key_name']
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;참고 사항: 자바스크립트 어레이는 PHP에서 익숙할 수 있는 것과 같은 연관 배열이 아닙니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;배열 키가 문자열이면 배열의 내용에 대해 더 이상 작동하지 않습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;배열은 개체이며 괄호 표기를 사용하여 &amp;lt;key name&amp;gt;이라는 멤버에 액세스하고 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;따라서:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;font papago-translate=&quot;translated&quot;&gt;varmyArray = [];&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;myArray[&quot;bar&quot;] = true;&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;myArray[&quot;foo&quot;] = true;&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;alert(myArray.length); // 0을 반환합니다.&lt;/font&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;배열에 요소를 추가하지 않았기 때문에 myArray의 바 및 foo 멤버만 수정했습니다.&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; myArray.splice( myArray.indexOf('bar') , 1) 
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;a href=&quot;http://www.internetdoc.info/javascript-function/remove-key-from-array.htm&quot; rel=&quot;nofollow&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;http://www.internetdoc.info/javascript-function/remove-key-from-array.htm&lt;/font&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;removeKey(arrayName,key);

function removeKey(arrayName,key)
{
 var x;
 var tmpArray = new Array();
 for(x in arrayName)
 {
  if(x!=key) { tmpArray[x] = arrayName[x]; }
 }
 return tmpArray;
}
&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;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;[&amp;lt;빈항목 1개&amp;gt;, '1개', &amp;lt;빈항목 3개&amp;gt;, '5개', &amp;lt;빈항목 3개&amp;gt;, '9개']&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;스플라이스 후(array.splice(1,1)):&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;[ &amp;lt;4개의 빈 항목&amp;gt;, &amp;lt;5개의 빈 항목&amp;gt;, &amp;lt;3개의 빈 항목&amp;gt;, &amp;lt;9개의 빈 항목&amp;gt;]&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;AFTER DELETE(배열 삭제[1]):&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;[ &amp;lt;5개의 빈 항목&amp;gt;, &amp;lt;5개의 빈 항목&amp;gt;, &amp;lt;3개의 빈 항목&amp;gt;, &amp;lt;9개의 빈 항목&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;URL : https://stackoverflow.com/questions/206988/how-do-i-unset-an-element-in-an-array-in-javascript&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>JavaScript</category>
      <author>telecom</author>
      <guid isPermaLink="true">https://telecom.tistory.com/710</guid>
      <comments>https://telecom.tistory.com/710#entry710comment</comments>
      <pubDate>Mon, 6 Nov 2023 21:38:46 +0900</pubDate>
    </item>
    <item>
      <title>무한대 = 0x3f3f3f인 이유는 무엇입니까?</title>
      <link>https://telecom.tistory.com/709</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;무한대 = 0x3f3f3f인 이유는 무엇입니까?&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;어떤 상황에서는 일반적으로 무한대를 나타낼 수 있을 만큼 충분히 큰 정수 값을 사용합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 보통 가장 큰 양/음의 정수를 사용합니다.&lt;/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;font papago-translate=&quot;translated&quot;&gt;흥미를 끄는 것은 (특히 프로그래밍 대회에서) 매우 흔히 볼 수 있다는 사실입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;const int INF = 0x3f3f3f3f;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;왜 그 번호가 특별합니까?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이항 표현은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;00111111001111110011111100111111
&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;타이핑하기 쉽다는 것을 알고 있지만, 만약 그것이 이유라면 거의 모든 것이 가능할 것입니다(0x3e3e3e, 0x2f2f2f2f 등).&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;오버플로 없이 한 번 추가할 수 있으며 다음과 같은 이점이 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;a = min(INF, b + c);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하지만 다른 상수들은 모두 가능합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;구글링은 그 상수를 사용하는 많은 코드 조각만 보여줄 뿐 설명이나 코멘트는 보여주지 않습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;누가 알아챌 수 있습니까?&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;http://translate.google.com/translate?sl=auto&amp;amp;tl=en&amp;amp;js=n&amp;amp;prev=_t&amp;amp;hl=it&amp;amp;ie=UTF-8&amp;amp;u=http://blog.csdn.net/hzh_0000/article/details/9468377&quot; rel=&quot;noreferrer&quot;&gt;여기&lt;/a&gt;서 이에 대한 몇 가지 증거를 발견했습니다(중국어 &lt;a href=&quot;http://blog.csdn.net/hzh_0000/article/details/9468377&quot; rel=&quot;noreferrer&quot;&gt;원본 컨텐츠&lt;/a&gt;). 기본 아이디어는 0x7ffff가 이미 4바이트 서명된 int 범위의 &quot;최상위&quot;이기 때문에 문제가 있다는 것입니다. 따라서 여기에 무엇이든 추가하면 음수가 됩니다. 대신 0x3f3f3f:&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여전히 꽤 큽니다(크기 0x7ffff의 동일한 순서).&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;정수의 유효한 범위가 그 아래의 숫자로 제한된다고 하면, 그 위에 &quot;valid 양수&quot;를 추가할 수 있고, 여전히 무한대(즉, 어떤 것).&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&amp;gt;=INF&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;INF+INF&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;이를 통해 항상 &quot;통제&quot; 상태를 유지할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; &lt;pre&gt;&lt;code&gt;a+=b;
if(a&amp;gt;INF)
    a=INF;
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;동일한 바이트의 반복입니다. 이는 당신이 쉽게&lt;/font&gt;&lt;/font&gt;&lt;code&gt;memset&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;INF&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;또한 @Jörg W Mitag가 위에서 알아차린 것처럼, 이것은 멋진 ASCII 표현을 가지고 있어서 메모리 덤프를 보면서 즉시 발견하고 메모리에 직접 쓸 수 있습니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 0x3f3f3f의 최초 발견자 중 한 명일 수도 있고 아닐 수도 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;2004년 루마니아 기사(http://www.infoarena.ro/12-ponturi-pentru-programatorii-cc #9)를 냈지만 2002년부터 이 값을 최소한 프로그래밍 대회에 사용하고 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;두 가지 이유가 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;0x3f3f3f3f + 0x3f3f3f가 int32에서 오버플로되지 않습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이를 위해 일부는 100000000(10억)을 사용합니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하는 것으로 int의 배열을 무한대로 설정할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;memset(array, 0x3f, sizeof(array))&lt;/code&gt;&lt;/li&gt; 
&lt;/ul&gt;&lt;p&gt;&lt;code&gt;0x3f3f3f3f&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;는 문자열의 ASCII 표현입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;????&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;크루글은 전체 데이터베이스에서 해당 상수의 48개 인스턴스를 찾습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 중 46개의 인스턴스는 자바 프로젝트에서 그래픽 조작을 위한 비트마스크로 사용됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;1 프로젝트는 알 수 없는 ACPI 장치를 나타내는 데 사용되는 운영 체제입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&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;따라서, 크루글이 색인화한 모든 프로젝트에서 비트 패턴 때문에 47번, ASCII 해석 때문에 한 번, 무한을 나타내는 표현으로 단 한 번도 사용되지 않습니다.&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/18429021/why-is-infinity-0x3f3f3f3f&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>C</category>
      <author>telecom</author>
      <guid isPermaLink="true">https://telecom.tistory.com/709</guid>
      <comments>https://telecom.tistory.com/709#entry709comment</comments>
      <pubDate>Mon, 6 Nov 2023 21:38:40 +0900</pubDate>
    </item>
    <item>
      <title>SQL Server 2008에서 Service Broker 사용</title>
      <link>https://telecom.tistory.com/708</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;SQL Server 2008에서 Service Broker 사용&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 제 LinqToSQL 데이터 컨텍스트에서 사용하기 위해 SqlCacheDependency를 통합하고 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여기에 있는 Linq 쿼리에 대해 확장 클래스를 사용하고 있습니다 - http://code.msdn.microsoft.com/linqtosqlcache&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;&quot;현재 데이터베이스에 대해 SQL Server Service Broker를 사용할 수 없으므로 쿼리 알림이 지원되지 않습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;알림을 사용하려면 이 데이터베이스에 대해 Service Broker를 활성화하십시오.&quot;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그것은 전세계적으로 이 사건에서 나온 것입니다. axax.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;        protected void Application_Start()
    {
        RegisterRoutes(RouteTable.Routes);
        //In Application Start Event
        System.Data.SqlClient.SqlDependency.Start(new dataContextDataContext().Connection.ConnectionString);

    }
&lt;/code&gt;&lt;/pre&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;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;SQL Server 2008 데이터베이스에서 Service Broker를 활성화하려면 어떻게 해야 합니까?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 쿼리를 실행하려고 했습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;ALTER DATABATE tablename SET ENABLE_BROKER 하지만 영원히 끝나지 않고 실행되므로 수동으로 중지해야 합니다.&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;SQL Server 2008에 이 설정이 있으면 DataContext로 필터링이 되나요, 아니면 거기서도 구성해야 하나요?&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;도와주셔서 감사합니다&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;트루길리&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다른 사람이 이 문제에 대한 해결책을 찾고 있는 경우, 다음 명령어가 저에게 아주 효과적이었습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;대기하는 대신 데이터베이스에 대한 다른 모든 연결을 해제합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;ALTER DATABASE [DBNAME] SET ENABLE_BROKER WITH ROLLBACK IMMEDIATE
&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;Sql Server 2012에서 다음으로 이동할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Properties-&amp;gt; Options -&amp;gt; Service Broker&lt;/code&gt;&lt;/p&gt; 
&lt;p&gt;&lt;img src=&quot;https://i.stack.imgur.com/bX3xG.png&quot; alt=&quot;Enable Service Broker&quot;&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;OK 여기서는 백업을 사용하지 않도록 설정하거나 백업을 복원해야 할 경우 이를 수행하는 방법을 보여 줍니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 스크립트를 실행하면 데이터베이스에서 사용하는 모든 프로세스가 삭제됩니다(2005년과 달리 2008년에 수동으로 프로세스를 삭제하는 이유는 저를 넘어선 것입니다). 그리고 브로커를 설정합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;USE master
go

DECLARE @dbname sysname

SET @dbname = 'YourDBName'

DECLARE @spid int
SELECT @spid = min(spid) from master.dbo.sysprocesses where dbid = db_id(@dbname)
WHILE @spid IS NOT NULL
BEGIN
EXECUTE ('KILL ' + @spid)
SELECT @spid = min(spid) from master.dbo.sysprocesses where dbid = db_id(@dbname) AND spid &amp;gt; @spid
END


ALTER DATABASE @dbname SET ENABLE_BROKER
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;DB에 대한 모든 연결을 삭제하고 브로커 서비스를 활성화하는 데 사용할 수 있는 권한을 가진 사용자 계정을 삭제해야 합니다.&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;databasename&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;     IF ((SELECT is_broker_enabled FROM sys.databases WHERE name = '%DATABASE_NAME%') = 1)
      BEGIN
        ALTER DATABASE %DATABASE_NAME% SET NEW_BROKER WITH ROLLBACK IMMEDIATE;
     END

    ALTER DATABASE %DATABASE_NAME% SET ENABLE_BROKER WITH ROLLBACK IMMEDIATE;
&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;  --DBA creates a new role 
   if not exists (select 1 from sys.database_principals where name='sql_dependency_subscriber' and Type = 'R')
  begin
   EXEC sp_addrole 'sql_dependency_subscriber' 
  end

  --Minimum Required  Permissions needed for SQLDependancy Notification to work
   GRANT CREATE PROCEDURE to sql_dependency_subscriber;
   GRANT CREATE QUEUE to sql_dependency_subscriber; 
   GRANT CREATE SERVICE to sql_dependency_subscriber;
   GRANT REFERENCES on CONTRACT::[http://schemas.microsoft.com/SQL/Notifications/PostQueryNotification] to sql_dependency_subscriber ;
   GRANT VIEW DEFINITION TO sql_dependency_subscriber;

  --Minimum Required  Permissions  needed for SQLDependaney Notification to work
   GRANT SELECT to sql_dependency_subscriber;
   GRANT SUBSCRIBE QUERY NOTIFICATIONS TO sql_dependency_subscriber;
   GRANT RECEIVE ON QueryNotificationErrorsQueue TO sql_dependency_subscriber;
   GRANT REFERENCES on CONTRACT::[http://schemas.microsoft.com/SQL/Notifications/PostQueryNotification] to sql_dependency_subscriber ;
   EXEC sp_addrolemember 'sql_dependency_subscriber', '%DATABASE_LOGIN%';
   EXEC sp_addrolemember 'sql_dependency_subscriber', 'sqldp';
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;ALTER DATABATE 문을 사용하여 Broker 서비스를 활성화할 수 있으며, Database 속성 &amp;gt; Options &amp;gt; Service Broker Enable에서도 Broker 서비스를 활성화:&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;strong&gt;@JGilmartin&lt;/strong&gt;에 의해 답변이 완벽하게 작동하지만 데이터베이스의 진행 중인 모든 프로세스가 중단되는지 확인하십시오. 프로덕션에 이 스크립트를 사용하기 전에 트래픽이나 프로세스의 심각도를 확인하십시오.&lt;/font&gt;&lt;/p&gt;&lt;ol&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Service Broker에서 출력한 오류입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이미지1&lt;/font&gt;&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;수정하려면 SSMS, 이미지 2를 사용하여 서비스 브로커를 활성화합니다.&lt;/font&gt;&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;True Service Broker로 설정 오류가 사라지면 이미지 3을 참조&lt;/font&gt;&lt;/p&gt; &lt;/li&gt; 
&lt;/ol&gt; 
&lt;p&gt;&lt;a href=&quot;https://i.stack.imgur.com/XHfkj.png&quot; rel=&quot;nofollow noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/XHfkj.png&quot; alt=&quot;enter image description here&quot;&gt;&lt;/a&gt; &lt;a href=&quot;https://i.stack.imgur.com/ugIbt.png&quot; rel=&quot;nofollow noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/ugIbt.png&quot; alt=&quot;enter image description here&quot;&gt;&lt;/a&gt; &lt;a href=&quot;https://i.stack.imgur.com/ruhGi.png&quot; rel=&quot;nofollow noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/ruhGi.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;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/2758976/enabling-service-broker-in-sql-server-2008&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>ASP.NET</category>
      <author>telecom</author>
      <guid isPermaLink="true">https://telecom.tistory.com/708</guid>
      <comments>https://telecom.tistory.com/708#entry708comment</comments>
      <pubDate>Mon, 6 Nov 2023 21:38:33 +0900</pubDate>
    </item>
    <item>
      <title>ASP에서 버튼에 대한 유효성 검사를 무시하는 방법.NET?</title>
      <link>https://telecom.tistory.com/707</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;ASP에서 버튼에 대한 유효성 검사를 무시하는 방법.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;NET?&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;ASP 있어요.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사용자로부터 입력을 받는 NET 폼.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;뭐가 있어요.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Submit&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;Calc&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;텍스트 필드를 채우기 위한 계산을 수행합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;지금 문제는 제가 한 세트씩 가지고 있다는 거예요&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&amp;lt;ASP:REQUIREDFIELDVALIDATOR&amp;gt;&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;유효성 검사기와.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Calc&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;버튼을 누르면 양식의 유효성이 확인됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;필요한 필드를 검증하는 것을 원하지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Calc&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;Submit&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;단추.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 문제를 해결할 방법은 없습니까?&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;셋 더&lt;/font&gt;&lt;/font&gt;&lt;code&gt;CausesValidation&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;재산을 허위로 바꾸다&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;&amp;lt;asp:Button runat=&quot;Server&quot; ... CausesValidation=&quot;False&quot; /&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.button.causesvalidation.aspx&quot; rel=&quot;noreferrer&quot;&gt;Button.&lt;/a&gt;Validation(확인)을 유발합니다(제 기억이 정확한 경우).&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;CausesValidation=&quot;false&quot;&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;버튼 속성으로.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;일부 샘플 코드:&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;http://weblogs.asp.net/scottgu/archive/2005/08/04/421647.aspx&quot; rel=&quot;nofollow&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;http://weblogs.asp.net/scottgu/archive/2005/08/04/421647.aspx&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;blockquote&gt; 
 &lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;ASPX 페이지:&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;asp:Button ID=&quot;buttonNew&quot; runat=&quot;server&quot; Text=&quot;New&quot; CausesValidation=&quot;False&quot; /&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;오어&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;코드 비하인드 페이지: (.cs)&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;pre&gt;&lt;code&gt;buttonNew.CausesValidation = false;
&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://msdn.microsoft.com/en-us/library/system.windows.forms.control.validating(v=vs.100).aspx&quot; rel=&quot;nofollow&quot;&gt;여기&lt;/a&gt;에서 확인하십시오.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Validated&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;Validating&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;단추를 설정합니다.Validation을 false로 설정합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.button.causesvalidation.aspx&quot; rel=&quot;nofollow&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 링크&lt;/font&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러나 사용자 입력을 기반으로 계산하는 것이 전부라면 다시 게시하도록 해서는 안 됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;HTML 버튼을 사용하고 자바스크립트를 첨부하여 당신의 작업을 도와주면 이런 문제는 없을 것입니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;버튼을 설계하는 동안 버튼 클릭 이벤트에서 검증을 회피하도록 해당 속성 CauseValidation=&quot;false&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;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;UseSubmitBehavior=&quot;False&quot;&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;특정 컨트롤에서 유효성 검사를 비활성화하려면 다음과 같이 하십시오.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;컨트롤의 CauseValidation 속성을 false로 설정합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;asp:Button id=&quot;Button3&quot; runat=&quot;server&quot;
  Text=&quot;Cancel&quot; CausesValidation=&quot;False&quot;&amp;gt;
&amp;lt;/asp:Button&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;Set the validation controls Enabled property to false.
&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;Set the validation controls EnableClientScript property to false.
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/bt244wbb.aspx?cs-save-lang=1&amp;amp;cs-lang=vb#code-snippet-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;자세한 내용&lt;/font&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/6387745/how-to-bypass-validation-for-a-button-in-asp-net&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>ASP.NET</category>
      <author>telecom</author>
      <guid isPermaLink="true">https://telecom.tistory.com/707</guid>
      <comments>https://telecom.tistory.com/707#entry707comment</comments>
      <pubDate>Mon, 6 Nov 2023 21:38:24 +0900</pubDate>
    </item>
    <item>
      <title>데이터베이스 기반 애플리케이션을 유닛 테스트하는 가장 좋은 전략은 무엇입니까?</title>
      <link>https://telecom.tistory.com/706</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;저는 백엔드의 다양한 복잡성을 가진 데이터베이스에 의해 구동되는 많은 웹 애플리케이션을 사용합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;일반적으로 비즈니스 및 프레젠테이션 로직과는 별개의 &lt;a href=&quot;http://en.wikipedia.org/wiki/Object-relational_mapping&quot; rel=&quot;noreferrer&quot;&gt;ORM&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;그러나 ORM과 데이터베이스 자체를 테스트하는 것은 항상 문제와 타협으로 가득 차 있었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;지난 몇 년간 몇 가지 전략을 시도해 보았지만, 그 어느 것도 저를 완전히 만족시키지 못했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;테스트 데이터베이스에 알려진 데이터를 로드합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;ORM에 대한 테스트를 실행하고 올바른 데이터가 돌아오는지 확인합니다.&lt;/font&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;font papago-translate=&quot;translated&quot;&gt;마지막으로, 테스트 데이터베이스가 작으면 누락된 인덱스와 같은 비효율이 나타나지 않습니다. (좋아요, 마지막 테스트는 실제로 단위 테스트에 사용해야 하는 것은 아니지만, 아무런 문제가 되지 않습니다.)&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;생산 데이터베이스의 복사본을 로드하고 이에 대해 테스트합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여기서 문제가 되는 것은 언제라도 운영 DB에 무엇이 있는지 모를 수 있다는 것입니다. 시간이 지남에 따라 데이터가 변경되면 테스트를 다시 작성해야 할 수도 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;어떤 사람들은 이 두 가지 전략이 모두 특정 데이터에 의존하며 단위 테스트는 기능성만 테스트해야 한다고 지적했습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이를 위해 다음과 같이 제안했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;모의 데이터베이스 서버를 사용하고 ORM이 지정된 메서드 호출에 대한 응답으로 올바른 쿼리를 보내고 있는지만 확인합니다.&lt;/font&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;무엇이 당신에게 가장 효과적이었습니까?&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;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;체크아웃 후 누구나 현재 데이터베이스 스키마를 작성할 수 있도록 전체 스키마와 작성 스크립트를 소스 제어에 보관합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;또한 빌드 프로세스의 일부로 로드되는 데이터 파일에 샘플 데이터를 보관합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;오류를 유발하는 데이터를 발견하면 샘플 데이터에 추가하여 오류가 다시 나타나지 않는지 확인합니다.&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;연속 통합 서버를 사용하여 데이터베이스 스키마를 구축하고 샘플 데이터를 로드하며 테스트를 실행합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이렇게 하면 테스트 데이터베이스를 동기화할 수 있습니다(테스트 실행 시마다 재구축).&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이를 위해서는 CI 서버가 자체 전용 데이터베이스 인스턴스에 대한 액세스 및 소유권을 가져야 하지만, db 스키마를 하루에 3번 구축하는 것이 전달 직전까지 발견되지 않았을 수도 있는 오류를 찾는 데 큰 도움이 되었다고 생각합니다(나중에 발견되지 않았다면).&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;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제 그룹의 경우, 사용자 입력은 (db가 아닌) 어플리케이션 레벨에서 이루어지므로 표준 단위 테스트를 통해 테스트됩니다.&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;프로덕션 데이터베이스 복사본 로드 중:&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것이 제 지난 직장에서 사용된 방법이었습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이는 몇 가지 문제로 인한 엄청난 고통의 원인이었습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;복사본이 프로덕션 버전에서 오래되었습니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;복사본의 스키마가 변경되고 프로덕션 시스템에 전파되지 않습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 시점에서 우리는 서로 다른 도식을 갖게 될 것입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;재미없어요.&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;모킹 데이터베이스 서버:&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;우리는 지금 직장에서도 이 일을 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;매 커밋 후에 모의 DB 접근자가 주입된 응용 프로그램 코드에 대한 단위 테스트를 실행합니다.&lt;/font&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;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이러한 이유로 항상 인메모리 DB(HSQLDB 또는 Derby)에 대한 테스트를 실행하고 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;테스트 DB에 어떤 데이터를 보관하고 그 이유를 생각하게 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;프로덕션 DB를 테스트 시스템으로 끌어오기만 해도 &quot;내가 무엇을 하고 있는지, 왜 그런지, 그리고 무언가가 고장나면, 그건 내가 아니었다!&quot;로 해석됩니다. ;)&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;DDL 파일의 품질에 큰 도움이 됩니다.&lt;/font&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;항상 테스트 DB의 &lt;strong&gt;데이터&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;translated&quot;&gt;데이터는 SQL, 템플릿 DB 또는 덤프/백업에서 로드됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 덤프를 VCS에 넣을 수 있기 때문에 읽을 수 있는 형식이면 더 좋습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;안 되면 CSV 파일이나 XML을 사용합니다. 엄청난 양의 데이터를 로드해야 한다면...&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;없어.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;절대로 엄청난 양의 데이터를 로드할 필요가 없습니다 :) 단위 테스트용이 아닙니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;성능 테스트는 또 다른 문제이며 다양한 규칙이 적용됩니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;어떤 식으로든 데이터베이스를 조롱할 수 있는 도구(예: &lt;a href=&quot;http://www.jooq.org&quot; rel=&quot;noreferrer&quot;&gt;jOOQ&lt;/a&gt;'s, 이 &lt;a href=&quot;https://stackoverflow.com/a/18004400/521799&quot;&gt;답변&lt;/a&gt;에서 볼 수 있는 면책 사항, jOOQ의 공급업체에서 근무)가 있더라도 복잡한 질의가 있는 더 큰 데이터베이스를 &lt;em&gt;조롱&lt;/em&gt;하지 말 것을 조언합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;ORM을 통합 테스트하고 싶더라도 ORM은 데이터베이스에 매우 복잡한 일련의 쿼리를 발행하며, 이는 다음과 같이 달라질 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;통사론&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;복잡성&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;주문(!)&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;전송된 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;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;현재 제가 하는 일은 DAO 객체를 조롱하고 데이터베이스에 살 수 있는 흥미로운 데이터 사례를 나타내는 좋은 객체 모음을 메모리에 저장하는 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 접근 방식의 가장 큰 문제는 DAO 계층과 상호 작용하는 코드만 다루고 DAO 자체는 테스트하지 않는다는 것입니다. 제 경험으로는 해당 계층에서도 오류가 많이 발생한다는 것을 알 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;또한 TDD를 사용하거나 로컬에서 빠른 테스트를 수행하기 위해 데이터베이스에 대해 실행되는 몇 가지 단위 테스트를 유지하고 있지만, 이러한 테스트는 지속적인 통합 서버에서 실행되지 않습니다. 이러한 목적을 위해 데이터베이스를 유지하지 않으며 CI 서버에서 실행되는 테스트는 자체적으로 포함되어야 한다고 생각하기 때문입니다.&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;이러한 접근 방식이 적용 범위를 개선하는 데는 의심의 여지가 없지만, 현재 DBMS와 내장형 대체 기능을 모두 사용하기 위해서는 ANSI SQL에 최대한 가까이 접근해야 하므로 몇 가지 단점이 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;코드에 더 적합하다고 생각하는 프로젝트가 무엇이든 간에, &lt;a href=&quot;http://dbunit.sourceforge.net/&quot; rel=&quot;noreferrer&quot;&gt;DbUnit&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;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;또한 테스트 환경에 대한 모든 변경(데이터베이스 스키마 포함)을 먼저 수행하기 때문에 그 반대가 됩니다. 모든 테스트가 통과되면 운영 호스트에 스키마 업데이트를 적용합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;또한 실제 프로덕션 박스를 터치하기 전에 DB 업그레이드가 제대로 작동하는지 확인할 수 있도록 별도의 테스트 대 애플리케이션 데이터베이스 쌍을 개발 시스템에 보관합니다.&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;DAO에 대한 테스트를 실행하는 데 필요한 모든 것은 소스 제어에 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;DB를 만들기 위한 스키마와 스크립트가 포함되어 있습니다(도커는 이에 매우 적합합니다).&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;내장된 DB를 사용할 수 있다면 - 저는 속도를 위해 사용합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;설명된 다른 접근 방식과 중요한 차이점은 테스트에 필요한 데이터가 SQL 스크립트나 XML 파일에서 로드되지 않는다는 것입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;모든 것(일부 효과적으로 일정한 사전 데이터 제외)은 유틸리티 함수/클래스를 사용하여 응용 프로그램에서 생성됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;주된 목적은 테스트에서 사용하는 데이터를 만드는 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;시험에 아주 근접한&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;명시적(데이터에 SQL 파일을 사용하면 어떤 데이터가 어떤 테스트에 사용되는지 확인하는 것이 매우 문제가 됩니다.)&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;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;실제로 어떤 의미를 갖는지 이해하기 위해, 어떤 DAO 테스트를 고려해 보십시오.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Comment&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;Post&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;Authors&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;. 이러한 DAO에 대한 CRUD 작업을 테스트하기 위해서는 DB에 일부 데이터를 생성해야 합니다.&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;@Test
public void savedCommentCanBeRead() {
    // Builder is needed to declaratively specify the entity with all attributes relevant
    // for this specific test
    // Missing attributes are generated with reasonable values
    // factory's responsibility is to create entity (and all entities required by it
    //  in our example Author) in the DB
    Post post = factory.create(PostBuilder.post());

    Comment comment = CommentBuilder.comment().forPost(post).build();

    sut.save(comment);

    Comment savedComment = sut.get(comment.getId());

    // this checks fields that are directly stored
    assertThat(saveComment, fieldwiseEqualTo(comment));
    // if there are some fields that are generated during save check them separately
    assertThat(saveComment.getGeneratedField(), equalTo(expectedValue));        
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;테스트 데이터가 있는 SQL 스크립트나 XML 파일에 비해 몇 가지 이점이 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;코드를 유지하는 것이 훨씬 더 쉽습니다(예를 들어 Author와 같이 많은 테스트에서 참조되는 일부 엔티티에서 필수 열을 추가하는 것은 많은 파일/레코드를 변경할 필요가 없으며 빌드 및/또는 공장에서만 변경할 수 있습니다).&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;특정 테스트에서 필요한 데이터는 다른 파일이 아닌 테스트 자체에 설명되어 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이러한 근접성은 시험 이해성에 매우 중요합니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;롤백 대 커밋&lt;/font&gt;&lt;/h2&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 테스트가 실행될 때 커밋하는 것이 더 편리하다고 생각합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;첫째, 몇 가지 효과(예:&lt;/font&gt;&lt;/font&gt;&lt;code&gt;DEFERRED CONSTRAINTS&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;둘째, 테스트 실패 시 롤백에 의해 데이터가 반환되지 않으므로 DB에서 데이터를 검사할 수 있습니다.&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 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;Author&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;잠재적으로 깨질 수 있지만 DB 수준 제약 조건으로 표현할 수 없는 나머지 불변량을 처리하기 위해 저는 매 테스트 후 실행될 수 있는 잘못된 조건에 대해 몇 가지 프로그래밍 검사를 사용합니다(CI에서 실행되지만 성능상의 이유로 대개 로컬에서 꺼짐).&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;JDBC 기반 프로젝트(예: 직접 또는 간접적으로 JPA, EJB, ...)의 경우 전체 데이터베이스(실제 RDBMS에서 테스트 db를 사용하는 것이 더 좋습니다)가 아니라 JDBC 수준에서만 mockup할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;JDBC 데이터(결과 집합, 업데이트 횟수, 경고, ...)는 백엔드가 무엇이든 동일하므로, 추상화는 이러한 방식으로 제공됩니다. 즉, prod db, test db 또는 각 테스트 사례에 대해 제공되는 일부 mockup 데이터입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;각 경우마다 JDBC 연결을 모의평가하므로 테스트 DB를 관리할 필요가 없습니다(정리, 한 번에 하나의 테스트만 가능, 고정 장치 다시 로드 등).&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;모든 목업 연결부는 분리되어 있으므로 정리할 필요가 없습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;JDBC 교환을 모의평가하기 위해 각 테스트 케이스에 필요한 최소한의 고정 장치만 제공되므로 전체 테스트 DB를 관리하는 복잡함을 방지할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이런 종류의 목업을 위한 JDBC 드라이버와 유틸리티를 포함한 나의 프레임워크는 다음과 같습니다. http://acolyte.eu.org .&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/145131/whats-the-best-strategy-for-unit-testing-database-driven-applications&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>Database</category>
      <author>telecom</author>
      <guid isPermaLink="true">https://telecom.tistory.com/706</guid>
      <comments>https://telecom.tistory.com/706#entry706comment</comments>
      <pubDate>Mon, 6 Nov 2023 21:38:17 +0900</pubDate>
    </item>
    <item>
      <title>동시에 여러 CSS 애니메이션 재생</title>
      <link>https://telecom.tistory.com/705</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;동시에 여러 CSS 애니메이션 재생&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;두 개의 CSS 애니메이션을 서로 다른 &lt;strong&gt;속도&lt;/strong&gt;로 재생하려면 어떻게 해야 합니까?&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이미지는 회전과 성장이 동시에 이루어져야 합니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;회전은 2초마다 한 번씩 반복됩니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;성장은 4초마다 주기적으로 이루어집니다.&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;pre&gt;&lt;code&gt;.image {
    position: absolute;
    top: 50%;
    left: 50%;
    width: 120px;
    height: 120px;
    margin:-60px 0 0 -60px;
    -webkit-animation:spin 2s linear infinite;
    -webkit-animation:scale 4s linear infinite;
}

@-webkit-keyframes spin { 
    100% { 
        transform: rotate(180deg);
    } 
}

@-webkit-keyframes scale {
    100% {
         transform: scaleX(2) scaleY(2);
    }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;http://jsfiddle.net/Ugc5g/3388/&quot; rel=&quot;noreferrer&quot;&gt;http://jsfiddle.net/Ugc5g/3388/&lt;/a&gt; - 단 하나의 애니메이션(마지막으로 선언된 애니메이션)만 재생됩니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;각각 고유한 속성을 가진 여러 애니메이션을 쉼표로 지정할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예:&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;animation: rotate 1s, spin 3s;
&lt;/code&gt;&lt;/pre&gt;&lt;h1&gt;&lt;font papago-translate=&quot;translated&quot;&gt;TL;DR&lt;/font&gt;&lt;/h1&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;쉼표를 사용하면 아래 CriticalError 답변에 명시된 대로 각각의 속성을 가진 여러 애니메이션을 지정할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예:&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;animation: rotate 1s, spin 3s;
&lt;/code&gt;&lt;/pre&gt; 
&lt;h1&gt;&lt;font papago-translate=&quot;translated&quot;&gt;원답&lt;/font&gt;&lt;/h1&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;#1&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;-webkit-animation:spin 2s linear infinite;
-webkit-animation:scale 4s linear infinite;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;두 번째 줄이 첫 번째 줄을 대체합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그래서 효과가 없습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;#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;transform&lt;/code&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다른 대안으로 이미지를 a로 포장할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&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;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;http://jsfiddle.net/rnrlabs/x9cu53hp/&quot; rel=&quot;noreferrer&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;http://jsfiddle.net/rnrlabs/x9cu53hp/&lt;/font&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;/p&gt;
&lt;div class=&quot;snippet&quot; data-lang=&quot;js&quot; data-hide=&quot;false&quot; data-console=&quot;false&quot; data-babel=&quot;false&quot;&gt; 
 &lt;div class=&quot;snippet-code&quot;&gt; 
  &lt;pre class=&quot;snippet-code-css lang-css prettyprint-override&quot;&gt;&lt;code&gt;.scaler {
    position: absolute;
    top: 100%;
    left: 50%;
    width: 120px;
    height: 120px;
    margin:-60px 0 0 -60px;
    animation: scale 4s infinite linear;    
}

.spinner {
    position: relative;
    top: 150px;
    animation: spin 2s infinite linear;
}


@keyframes spin { 
    100% { 
        transform: rotate(180deg);
    } 
}

@keyframes scale {
    100% {
         transform: scaleX(2) scaleY(2);
    }
}&lt;/code&gt;&lt;/pre&gt; 
  &lt;pre class=&quot;snippet-code-html lang-html prettyprint-override&quot;&gt;&lt;code&gt;&amp;lt;div class=&quot;spinner&quot;&amp;gt;
&amp;lt;img class=&quot;scaler&quot; src=&quot;http://makeameme.org/media/templates/120/grumpy_cat.jpg&quot; alt=&quot;&quot; width=&quot;120&quot; height=&quot;120&quot;&amp;gt;
&amp;lt;div&amp;gt;&lt;/code&gt;&lt;/pre&gt; 
 &lt;/div&gt; 
&lt;/div&gt; 
&lt;p&gt;&lt;/p&gt;&lt;p&gt;&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;pre&gt;&lt;code&gt;-webkit-animation-name: spin, scale
-webkit-animation-duration: 2s, 4s
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;(아래 설명된 다른 문제로 인해 &quot;스케일&quot;을 &quot;페이드&quot;로 대체했습니다.) 이 fiddle에서와 같이...&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;참아주세요.) http://jsfiddle.net/rwaldin/fwk5bqt6/&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;둘째, 두 애니메이션 모두 동일한 DOM 요소의 동일한 CSS 속성(변환)을 변경합니다.&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;이 fiddle에서처럼 애니메이션 중 하나를 컨테이너에 적용합니다. http://jsfiddle.net/rwaldin/fwk5bqt6/2/&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;/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-css lang-css prettyprint-override&quot;&gt;&lt;code&gt;.image {
    position: absolute;
    top: 50%;
    left: 50%;
    width: 120px;
    height: 120px;
    margin:-60px 0 0 -60px;
    -webkit-animation:spin-scale 4s linear infinite;
}

@-webkit-keyframes spin-scale { 
    50%{
        transform: rotate(360deg) scale(2);
    }
    100% { 
        transform: rotate(720deg) scale(1);
    } 
}&lt;/code&gt;&lt;/pre&gt; 
  &lt;pre class=&quot;snippet-code-html lang-html prettyprint-override&quot;&gt;&lt;code&gt;&amp;lt;img class=&quot;image&quot; src=&quot;http://makeameme.org/media/templates/120/grumpy_cat.jpg&quot; alt=&quot;&quot; width=&quot;120&quot; height=&quot;120&quot;&amp;gt;&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;&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;rotate&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;scale&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;rotate&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;scale&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;/p&gt;
&lt;div class=&quot;snippet&quot; data-lang=&quot;js&quot; data-hide=&quot;true&quot;&gt; 
 &lt;div class=&quot;snippet-code snippet-currently-hidden&quot;&gt; 
  &lt;pre class=&quot;snippet-code-css lang-css prettyprint-override&quot;&gt;&lt;code&gt;div {
  position: absolute;
  top: 50%;
  left: 50%;
  width: 120px;
  height: 120px;
  margin: -60px 0 0 -60px;
  -webkit-animation: spin 2s linear infinite;
}
.image {
  position: absolute;
  top: 50%;
  left: 50%;
  width: 120px;
  height: 120px;
  margin: -60px 0 0 -60px;
  -webkit-animation: scale 4s linear infinite;
}
@-webkit-keyframes spin {
  100% {
    transform: rotate(180deg);
  }
}
@-webkit-keyframes scale {
  100% {
    transform: scale(2);
  }
}&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&amp;gt;
  &amp;lt;img class=&quot;image&quot; src=&quot;http://makeameme.org/media/templates/120/grumpy_cat.jpg&quot; alt=&quot;&quot; width=&quot;120&quot; height=&quot;120&quot; /&amp;gt;
&amp;lt;/div&amp;gt;&lt;/code&gt;&lt;/pre&gt; 
 &lt;/div&gt; 
&lt;/div&gt; 
&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음 두 줄을 돌립니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;-webkit-animation:spin 2s linear infinite;
-webkit-animation:scale 4s linear infinite;
&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; -webkit-animation: spin 2s linear infinite, scale 4s linear infinite;
&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/26986129/play-multiple-css-animations-at-the-same-time&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>CSS</category>
      <author>telecom</author>
      <guid isPermaLink="true">https://telecom.tistory.com/705</guid>
      <comments>https://telecom.tistory.com/705#entry705comment</comments>
      <pubDate>Wed, 1 Nov 2023 22:09:16 +0900</pubDate>
    </item>
    <item>
      <title>멀티프로세싱은 왜 numpy를 가져온 후에 하나의 코어만 사용합니까?</title>
      <link>https://telecom.tistory.com/704</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;멀티프로세싱은 왜 numpy를 가져온 후에 하나의 코어만 사용합니까?&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것이 OS 문제로 더 중요한지는 잘 모르겠지만, 파이썬 엔드에서 통찰력을 가진 사람이 있다면 여기에 물어봐야겠다고 생각했습니다.&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;중앙처리장치(CPU)가 무거운 것을&lt;/font&gt;&lt;/font&gt;&lt;code&gt;for&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;joblib&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;from joblib import Parallel,delayed
import numpy as np

def testfunc(data):
    # some very boneheaded CPU work
    for nn in xrange(1000):
        for ii in data[0,:]:
            for jj in data[1,:]:
                ii*jj

def run(niter=10):
    data = (np.random.randn(2,100) for ii in xrange(niter))
    pool = Parallel(n_jobs=-1,verbose=1,pre_dispatch='all')
    results = pool(delayed(testfunc)(dd) for dd in data)

if __name__ == '__main__':
    run()
&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;htop&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;img src=&quot;https://i.stack.imgur.com/thg0Y.png&quot; alt=&quot;htop&quot;&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 우분투 12.10 (3.5.0-26)을 4개의 코어가 있는 노트북에서 실행하고 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;확실히.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;joblib.Parallel&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;산란은 작업자별로 별도의 프로세스가 적용되나, 이러한 프로세스를 다른 코어에서 실행할 수 있는 방법은 없습니까?&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;구글 검색을 좀 더 한 후에 &lt;a href=&quot;http://bugs.python.org/issue17038&quot; rel=&quot;noreferrer&quot;&gt;저&lt;/a&gt;는 여기서 답을 찾았습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;특정 파이썬 모듈(&lt;/font&gt;&lt;/font&gt;&lt;code&gt;numpy&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;scipy&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;tables&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;pandas&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;skimage&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;제가 아는 한, 이 문제는 특히 멀티 스레드 OpenB에 대한 링크로 인해 발생한 것으로 보입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;LAS 라이브러리.&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;os.system(&quot;taskset -p 0xff %d&quot; % os.getpid())
&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;img src=&quot;https://i.stack.imgur.com/k7eNf.png&quot; alt=&quot;htop_workaround&quot;&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;numpy&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;성능은 기계와 작업에 따라 다를 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;업데이트:&lt;/font&gt;&lt;/h2&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;OpenB의 CPU 선호도 재설정 동작을 사용하지 않도록 설정하는 두 가지 방법도 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;LAS 자체.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;런타임에 환경 변수를 사용할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;OPENBLAS_MAIN_FREE&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;GOTOBLAS_MAIN_FREE&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;OPENBLAS_MAIN_FREE=1 python myscript.py
&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;아니면 OpenB를 컴파일하는 경우에는&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;소스의 LAS를 편집하여 빌드 시간에 영구적으로 사용하지 않도록 설정할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Makefile.rule&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;NO_AFFINITY=1
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이제 파이썬 3에서 친화도를 직접 설정하는 &lt;a href=&quot;https://docs.python.org/dev/library/os.html#os.sched_setaffinity&quot;&gt;방법&lt;/a&gt;이 공개됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; import os
&amp;gt;&amp;gt;&amp;gt; os.sched_getaffinity(0)
{0, 1, 2, 3}
&amp;gt;&amp;gt;&amp;gt; os.sched_setaffinity(0, {1, 3})
&amp;gt;&amp;gt;&amp;gt; os.sched_getaffinity(0)
{1, 3}
&amp;gt;&amp;gt;&amp;gt; x = {i for i in range(10)}
&amp;gt;&amp;gt;&amp;gt; x
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
&amp;gt;&amp;gt;&amp;gt; os.sched_setaffinity(0, x)
&amp;gt;&amp;gt;&amp;gt; os.sched_getaffinity(0)
{0, 1, 2, 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;Ubuntu의 Python에서 흔히 볼 수 있는 문제로, 특정한 것은 아닙니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;joblib&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://stackoverflow.com/questions/15168014/both-multiprocessing-map-and-joblib-use-only-1-cpu-after-upgrade-from-ubuntu-10&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Ubuntu 10.10에서 12.04로 업그레이드한 후 multiprocessing.map과 joblib 모두 1개의 cpu만 사용합니다.&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://stackoverflow.com/questions/6905264/python-multiprocessing-utilizes-only-one-core&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Python 멀티프로세싱은 하나의 코어만 사용합니다.&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://stackoverflow.com/questions/12592018/multiprocessing-pool-processes-locked-to-a-single-core&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;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;CPU 친화도()&lt;a href=&quot;http://manpages.ubuntu.com/manpages/precise/en/man1/taskset.1.html&quot; rel=&quot;noreferrer&quot;&gt;&lt;code&gt;taskset&lt;/code&gt;&lt;/a&gt;를 실험해 볼 것을 제안합니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/15639779/why-does-multiprocessing-use-only-a-single-core-after-i-import-numpy&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>Python</category>
      <author>telecom</author>
      <guid isPermaLink="true">https://telecom.tistory.com/704</guid>
      <comments>https://telecom.tistory.com/704#entry704comment</comments>
      <pubDate>Wed, 1 Nov 2023 22:09:08 +0900</pubDate>
    </item>
    <item>
      <title>EXISTS 하위 쿼리를 포함하는 모든 MySQL SELECT 쿼리에 문제가 있으며 ON에서 외부 SELECT를 참조하는 왼쪽 조인</title>
      <link>https://telecom.tistory.com/703</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;EXISTS 하위 쿼리를 포함하는 모든 MySQL SELECT 쿼리에 문제가 있으며 ON에서 외부 SELECT를 참조하는 왼쪽 조인&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것이 문제입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;해당 유형의 &lt;strong&gt;쿼리&lt;/strong&gt;를 실행할 때&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;SELECT field1
FROM table1
WHERE EXISTS (SELECT table2.field2, table3.field3, table3.field4
              FROM table2 LEFT JOIN table3 ON table3.field3 = table2.field2 
                                           AND table3.field4 = table1.field1
              WHERE &quot;some condition&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;Unknown column 'table1.field1' in 'on clause'
&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 field1
FROM table1
WHERE EXISTS (SELECT table2.field2, table3.field3, table3.field4
              FROM table2 LEFT JOIN table3 ON table3.field3 = table2.field2 
              WHERE &quot;some condition&quot;
                AND table3.field4 = table1.field1);
&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;중요한 부분은 EXIST 하위 쿼리와 표 1 참조뿐입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;필드1은 JOIN의 ON 조건에 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;같은 결과로 여러 MySQL과 MariaDB 서버에서 사용해 보았습니다!&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;또한 온라인과 여기 SO에서 &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;pre&gt;&lt;code&gt;CREATE TABLE `sessions` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `user_id` int(11) DEFAULT NULL,
    `browser` varchar(255) DEFAULT NULL,
    PRIMARY KEY (`id`)
)

CREATE TABLE `browsers` (               
    `id` int(11) NOT NULL DEFAULT '0',
    `browser` varchar(255) DEFAULT NULL
)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;모든 브라우저를 사용한 모든 사용자를 확보하기 위해 이 쿼리를 실행합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;select distinct user_id
from sessions as t1
where not exists (select t2.id, browsers.id
                  from sessions as t2 LEFT JOIN browsers ON t2.browser = browsers.browser 
                                                         AND t2.user_id = t1.user_id
                  where browsers.id IS NULL);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;오류 메시지가 표시됨:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Error Code : 1054
Unknown column 't1.user_id' in 'on clause'
&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;문제는 매우 논리적이고 좋은 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;bug#96946을 충족했다고 생각합니다. MySQL은 JOIN ON 절에서 외부 참조를 허용하지 않습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제가 잘못 알고 있는 것이 아니라면, 이는 이중 네스팅된 NOT EXISTENT 쿼리를 다시 쓴 것이며, 제 생각에는 이 문장이 MySQL에서 실제로 받아들여질 것 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;SELECT DISTINCT user_id
FROM sessions AS s1
WHERE NOT EXISTS (SELECT *
                  FROM browsers AS b
                  WHERE NOT EXISTS (SELECT *
                                    FROM sessions s2
                                    WHERE s1.user_id = s2.user_id AND
                                          s2.browser = b.browser
                                   )
                 );
&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/58777342/issue-with-all-mysql-select-queries-containing-exists-subquery-and-left-join-wit&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>mariadb</category>
      <author>telecom</author>
      <guid isPermaLink="true">https://telecom.tistory.com/703</guid>
      <comments>https://telecom.tistory.com/703#entry703comment</comments>
      <pubDate>Wed, 1 Nov 2023 22:09:00 +0900</pubDate>
    </item>
    <item>
      <title>XML에서 '독립 실행형' 지시는 무엇을 의미합니까?</title>
      <link>https://telecom.tistory.com/702</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;XML에서 '독립 실행형' 지시는 무엇을 의미합니까?&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;뭐하는 거지?&lt;/font&gt;&lt;/font&gt;&lt;code&gt;standalone&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;' XML 문서의 지시 평균?&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그&lt;/font&gt;&lt;/font&gt;&lt;code&gt;standalone&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;선언은 파서에게 &lt;a href=&quot;http://en.wikipedia.org/wiki/Document_type_definition&quot; rel=&quot;noreferrer&quot;&gt;DTD&lt;/a&gt;의 마크업 선언을 무시하라고 말하는 방법입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이후 DTD는 유효성 검사에만 사용됩니다.&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;&amp;lt;img&amp;gt;&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;tag. 만약 &lt;a href=&quot;http://www.w3.org/TR/xhtml1/dtds.html&quot; rel=&quot;noreferrer&quot;&gt;당신이 XHTML 1&lt;/a&gt;.0 DTD를 본다면, 당신은 파서에게 다음을 알려주는 마크업 선언을 볼 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;태그는 비어 있어야 하며 소유해야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;src&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;alt&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;브라우저가 XHTML 1.0 문서를 통과하고 있을 때,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;태그, DTD가 다음을 요구한다는 것을 알아야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;src&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;alt&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;속성이 없는 경우 추가합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;또한 자체적으로 폐쇄됩니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;태그는 비어 있어야 하기 때문입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;http://www.w3.org/TR/xml/#sec-rmd&quot; rel=&quot;noreferrer&quot;&gt;XML 명세&lt;/a&gt;가 의미하는 &quot;마크업 선언이 문서의 내용에 영향을 미칠 수 있다&quot;는 것입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러면 사용할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;standalone&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;DTD를 지정하지 않으면 독립 실행형 선언은 &quot;의미가 없으므로&quot; DTD도 지정하지 않는 한 사용할 이유가 없습니다.&lt;/font&gt;&lt;/p&gt;&lt;ul&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;독립 실행형 지시어는 XML 선언의 선택적 특성입니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;유효한 값은&lt;/font&gt;&lt;/font&gt;&lt;code&gt;yes&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;no&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;no&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;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;속성은 &lt;a href=&quot;https://en.wikipedia.org/wiki/Document_type_definition&quot; rel=&quot;noreferrer&quot;&gt;DTD&lt;/a&gt;가 사용될 때만 관련이 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;(DTD 대신 &lt;a href=&quot;https://en.wikipedia.org/wiki/XML_Schema_(W3C)&quot; rel=&quot;noreferrer&quot;&gt;스키마&lt;/a&gt;를 사용하는 경우에는 속성과 무관함)&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;&lt;code&gt;standalone=&quot;yes&quot;&lt;/code&gt; XML 프로세서는 유효성 검사에만 DTD를 사용해야 함을 의미합니다.&lt;/strong&gt;&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 경우 다음 용도로 &lt;em&gt;사용&lt;/em&gt;되지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;ul&gt; 
   &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;특성에 대한 기본값&lt;/font&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;독립체 선언들&lt;/font&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;정상화&lt;/font&gt;&lt;/li&gt; 
  &lt;/ul&gt;&lt;/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;standalone=&quot;yes&quot;&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;문서가 외부 DTD를 사용하는 경우 유효성 제약 조건을 추가할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;문서에 XML 수정이 필요한 것들이 포함되어 있는 경우(예: 속성의 기본값과&lt;/font&gt;&lt;/font&gt;&lt;code&gt;standalone=&quot;yes&quot;&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;를 사용하면 &lt;a href=&quot;https://www.w3.org/TR/xml/#vc-check-rmd&quot; rel=&quot;noreferrer&quot;&gt;문서가 유효&lt;/a&gt;하지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;standalone=&quot;yes&quot;&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;문서 처리 성능을 최적화하는 데 도움이 될 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;출처: &lt;a href=&quot;http://www.xmlplease.com/xml/standalone/&quot; rel=&quot;noreferrer&quot;&gt;독립 실행형 의사&lt;/a&gt; 속성은 &lt;a href=&quot;http://www.xmlplease.com/xml/standalone/&quot; rel=&quot;noreferrer&quot;&gt;DTD가 사용되는 경우에만 해당&lt;/a&gt;됩니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;code&gt;standalone&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;현재 XML 문서가 외부 마크업 선언에 의존하는지 설명합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;W3C는 &quot;XML(Extensible Markup Language) 1.0(Fifth Edition)&quot;에서 그 목적을 설명합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;http://www.w3.org/TR/xml/#sec-rmd&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;2.9 독립 실행형 문서 선언&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;의 의도는.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;standalone=yes&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;선언은 문서 내부의 정보가 내부 DTD에만 기반하여 충실하게 검색될 수 있도록 보장하는 것입니다. 즉, 문서가 외부 참조 없이 &quot;독자로 서 있을&quot; 수 있습니다.&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;문서에 외부 DTD가 없고 내부 DTD에 매개 변수 엔티티 참조가 없는 경우 독립 실행형 선언은 아무런 목적이 없습니다. 이 문서들은 이미 암묵적으로 독립 실행형이기 때문입니다.&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;standalone=yes&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;문서에 내부 DTD에 선언되지 않은 엔티티에 대한 참조가 포함되어 있는 경우, 외부 DTD 또는 매개 변수 엔티티 참조를 사용하여 문서를 구문 분석할 때 프로세서에 오류가 발생하도록 강제합니다(이를 구문 분석하는 데 매개 변수 엔티티의 대체 텍스트는 제외).&lt;/font&gt;&lt;/font&gt;&lt;code&gt;amp&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;lt&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;gt&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;apos&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;,그리고.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;quot&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;유일한 예외입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;독립 실행형으로 선언되지 않은 문서를 파싱할 때, 검증되지 않은 프로세서는 매개 변수 엔티티 참조를 발견하는 즉시 내부 DTD 파싱을 자유롭게 중지할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;문서를 독립 실행형으로 선언하면 검증되지 않은 프로세서는 하나 이상의 매개 변수 엔티티 참조를 무시한 후에도 내부 DTD에서 마크업 선언을 구문 분석합니다.&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;문서에서 다음 중 하나가 발견되고 해당 선언이 외부 DTD 또는 매개 변수 엔티티 대체 텍스트에 있는 경우 유효성 검사 프로세서가 오류를 던지도록 합니다.&lt;/font&gt;&lt;/p&gt; 
  &lt;ul&gt; 
   &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;값이 명시적으로 제공되지 않은 경우 기본값을 가진 속성&lt;/font&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;도면요소 참조(기타)&lt;/font&gt;&lt;/font&gt;&lt;code&gt;amp&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;lt&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;gt&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;apos&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;,그리고.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;quot&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;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;토큰화된 유형의 속성, 정규화에 의해 속성의 값이 수정되는 경우&lt;/font&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;요소 내용이 있는 요소, 해당 내용에 공백이 발생하는 경우&lt;/font&gt;&lt;/li&gt; 
  &lt;/ul&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;유효성을 검사하지 않는 프로세서는 외부 DTD를 검색하고 독립 실행형이 아닌 문서에 대한 모든 매개 변수 엔티티 참조를 확장하는 것을 고려할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;standalone=yes&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이론적으로 valid가 아닌 프로세서의 성능을 향상시킬 수 있습니다(spoiler 경고: 아마도 아무런 차이가 없을 것입니다).&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;hr&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여기에 있는 다른 답변들은 불완전하거나 부정확하며, 주요 오해는&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;독립 실행형 선언은 파서에게 DTD의 마크업 선언을 무시하도록 지시하는 방법입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이후 DTD는 유효성 검사에만 사용됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;standalone=&quot;yes&quot;는 XML 프로세서가 유효성 검사에만 DTD를 사용해야 함을 의미합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이와는 정반대로, 문서를 독립 실행형으로 선언하면 실제로 검증되지 않은 프로세서가 일반적으로 무시해야 하는 내부 선언(즉, 무시된 매개 변수 엔티티 참조 후의 선언)을 구문 분석해야 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;유효성을 검사하지 않는 프로세서는 내부 DTD의 정보를 사용하여 기본 특성 값을 제공하고 토큰화된 특성을 정규화해야 합니다. 이것은 유효성 검사와는 독립적이기 때문입니다.&lt;/font&gt;&lt;/p&gt;&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;마크업 선언은 XML 프로세서에서 응용프로그램으로 전달될 때 문서의 내용에 영향을 미칠 수 있습니다. 예를 들어 속성 기본값과 엔티티 선언이 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;XML 선언의 구성 요소로 나타날 수 있는 독립 실행형 문서 선언은 문서 엔티티 외부에 또는 매개 변수 엔티티에 이러한 선언이 있는지 여부를 나타냅니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;[정의:&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;외부 마크업 선언(external markup declaration)은 외부 서브셋(subset) 또는 파라미터 엔티티(외부 또는 내부)에서 발생하는 마크업 선언(markup declaration)을 의미합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;&lt;a href=&quot;http://www.w3.org/TR/xml/#sec-rmd&quot; rel=&quot;noreferrer&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;http://www.w3.org/TR/xml/ #sec-rmd&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/5578645/what-does-the-standalone-directive-mean-in-xml&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>XML</category>
      <author>telecom</author>
      <guid isPermaLink="true">https://telecom.tistory.com/702</guid>
      <comments>https://telecom.tistory.com/702#entry702comment</comments>
      <pubDate>Wed, 1 Nov 2023 22:08:53 +0900</pubDate>
    </item>
    <item>
      <title>파일의 MySQL 로드 데이터 - 가속?</title>
      <link>https://telecom.tistory.com/701</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;파일의 MySQL 로드 데이터 - 가속?&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;때때로 프로젝트를 위해 데이터를 다시 가져와야 하기 때문에 약 360만 개의 행을 MySQL 테이블(현재 InnoDB이지만 실제로는 이 엔진에 국한되지 않습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&quot;파일에 데이터 로드...&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;.&quot; 가장 빠른 해결책으로 입증되었지만 키 없이 가져올 경우 가져오기 자체가 약 45초가 걸리지만 키 생성에 시간이 걸리는 단점이 있습니다(already 실행 시간은 20분...). - 테이블 위에 있는 키를 사용하여 가져오기를 하면 가져오기 속도가 훨씬 느려집니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;숫자 필드를 참조하여 테이블의 3개 필드 위에 키가 있습니다.&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;mysqld를 다시 시작하지 않고 쿼리를 종료할 수 있는 방법이 있습니까?&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;고마워요 DBa&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;innodb 및 bulk loading을 사용하는 경우 다음과 같은 몇 가지 팁이 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;csv 파일을 대상 테이블의 기본 키 순서로 정렬합니다. 노드에서 클러스터된 기본 키를 사용하여 정렬하면 더 빨리 로드됩니다.&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;truncate &amp;lt;table&amp;gt;;

set autocommit = 0;

load data infile &amp;lt;path&amp;gt; into table &amp;lt;table&amp;gt;...

commit;
&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;set unique_checks = 0;
set foreign_key_checks = 0;
set sql_log_bin=0;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;csv 파일을 더 작은 청크로 분할합니다.&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;3.5 - 6.5 million rows imported per min
210 - 400 million rows per hour
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 블로그 게시물은 3년이 다 되어가지만 여전히 관련성이 있으며 &quot;LOAD DATA INFILE&quot;의 성능을 최적화하기 위한 몇 가지 좋은 제안이 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;http://www.mysqlperformanceblog.com/2007/05/24/predicting-how-long-data-load-would-take/&quot; rel=&quot;noreferrer&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;http://www.mysqlperformanceblog.com/2007/05/24/predicting-how-long-data-load-would-take/&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;InnoDB는 꽤 좋은 엔진입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러나 이는 '조정'되는 것에 크게 의존합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;한 가지는 삽입이 기본 키를 늘리는 순서가 아니라면 innoDB는 MyISAM보다 시간이 조금 더 걸릴 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이는 innodb_buffer_pool_size를 높게 설정하면 쉽게 극복할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제 제안은 전용 MySQL 머신에서 전체 RAM의 60-70%로 설정하는 것입니다.&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/2463602/mysql-load-data-infile-acceleration&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>MySQL</category>
      <author>telecom</author>
      <guid isPermaLink="true">https://telecom.tistory.com/701</guid>
      <comments>https://telecom.tistory.com/701#entry701comment</comments>
      <pubDate>Wed, 1 Nov 2023 22:08:47 +0900</pubDate>
    </item>
    <item>
      <title>삭제된 경우 다른 테이블에 행을 삽입하는 트리거</title>
      <link>https://telecom.tistory.com/700</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;삭제된 ONE 행을 다른 테이블에 복제하는 트리거를 생성하려고 합니다.&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;Table1은 comment_id, file_id, user_id, comment_text, comment_datetime 및 parent가 있는 comment입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Table 2는 comment_log로 delleted_comment_id, file_id, user_id, comment_text, comment_datetime 및 comment_delete_datetime입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그래서 저는 사용자, 진행자 또는 관리자에 의해 삭제된 코멘트를 comment_log에 저장하고 싶습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;INSERT INTO comment_log(deleted_comment_id, file_id, user_id, comment_text,comment_datetime, comment_deletion_datetime)
SELECT comment.comment_id, file_id, user_id, comment_text, comment_datetime, CURRENT_TIMESTAMP
FROM comment
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여기까지 왔는데, WHERE 뒤에 와 같은 것을 시도했지만 무엇을 넣어야 할지 모르겠습니다. old.comment_id는 이전 ID를 줘야 하는데, 댓글 테이블에서 해당 ID로 댓글만 얻을 수 있는 방법을 모르겠습니다.&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;OLD.*&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;INSERT INTO comment_log
SET deleted_comment_id = OLD.comment_id, 
    file_id = OLD.file_id, 
    user_id = OLD.user_id,
    comment_text = OLD.comment_text,
    comment_datetime = OLD.comment_datetime, 
    comment_deletion_datetime = CURRENT_TIMESTAMP;
&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/72208332/trigger-to-insert-row-into-another-table-if-deleted&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>mariadb</category>
      <author>telecom</author>
      <guid isPermaLink="true">https://telecom.tistory.com/700</guid>
      <comments>https://telecom.tistory.com/700#entry700comment</comments>
      <pubDate>Wed, 1 Nov 2023 22:08:40 +0900</pubDate>
    </item>
    <item>
      <title>목표 C UIC 색상 상수 정의</title>
      <link>https://telecom.tistory.com/699</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;목표 C UIC 색상 상수 정의&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제 테마에 맞는 사용자 정의 색상이 몇 가지 있는 아이폰 애플리케이션이 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이러한 색상은 제 UI에 맞게 고정되므로 포함할 클래스의 색상을 정의하고자 합니다(Constants.h 및 Constants.m).&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;어떻게 해야 합니까? (UIC 색상은 가변적이며 오류를 발생시킬 수 있기 때문에 단순하게 정의하는 것은 작동하지 않습니다 - 이니셜라이저는 일정하지 않습니다.)&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;/* Constants.h */
extern UIColor *test;

/* Constants.m */
UIColor *test = [UIColor colorWithRed:1.0 green:1.0 blue:1.0 alpha:1.0];
&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;UI 색상은 변경할 수 없습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 주로 컬러, 폰트, 이미지로 작업을 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;싱글턴을 사용하거나 정적 이니셜라이저를 사용하도록 쉽게 수정할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;@interface UIColor (MyProject)

+(UIColor *) colorForSomePurpose;

@end

@implementation UIColor (MyProject)

+(UIColor *) colorForSomePurpose { return [UIColor colorWithRed:0.6 green:0.8 blue:1.0 alpha:1.0]; }

@end
&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;/* Constants.h */
#define myColor [UIColor colorWithRed:255.0/255.0 green:255.0/255.0 blue:255.0/255.0 alpha:1.0]
&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;이 접근 방식에 기술적으로 문제가 있는 것은 아닌지 확신할 수 없지만, 잘 작동하며 컴파일 시간 상수 이니셜라이저 오류를 방지합니다. 이 코드는 'myColor'를 입력하는 모든 곳에 효과적으로 고정되므로 실제로 사용하기 전에는 컴파일되지 않습니다.&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;당신의 .h에서 당신은 할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;extern UIColor *  const COLOR_LIGHT_BLUE;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;당신의 .mm에서 당신은 할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;UIColor* const COLOR_LIGHT_BLUE = [[UIColor alloc] initWithRed:21.0f/255 green:180.0f/255  blue:1 alpha:1];//;#15B4FF
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;확장 기능이 없는 빠르고 더러운 것을 찾고 있다면 &lt;a href=&quot;http://clang.llvm.org/&quot; rel=&quot;nofollow&quot;&gt;clang&lt;/a&gt;과 함께 사용하십시오.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#define kGreenColor colorWithRed:(0/255.0) green:(213/255.0) blue:(90/255.0) alpha:1.0

- (void)doSomething
{
   _label.textColor = [UIColor kGreenColor];

}
&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;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;머리글:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#if !defined(COLORS_EXTERN)
    #define COLORS_EXTERN extern
#endif

COLORS_EXTERN UIColor *aGlobalColor;
&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;#define COLORS_EXTERN
#import &quot;GlobalColors.h&quot;


@interface GlobalColors : NSObject
@end

@implementation GlobalColors

+ (void)load
{
    aGlobalColor = [UIColor colorWithRed:0.2 green:0.3 blue:0.4 alpha:1];
}

@end
&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;AppController를 사용하여 색상을 정적 변수가 아닌 전역적으로 액세스할 수 있도록 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이렇게 하면 아키텍처의 관점에서 합리적이며, 실행 중에도 가상으로 색상 체계를 변경하고자 한다면 AppController에서 한 두 가지 방법에 불과할 것입니다.&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/2824187/objective-c-defining-uicolor-constants&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>C</category>
      <author>telecom</author>
      <guid isPermaLink="true">https://telecom.tistory.com/699</guid>
      <comments>https://telecom.tistory.com/699#entry699comment</comments>
      <pubDate>Wed, 1 Nov 2023 22:08:34 +0900</pubDate>
    </item>
    <item>
      <title>WP REST API V2를 통해 사용자 정의 필드로 Custom Post Type을 올바르게 작성하는 방법</title>
      <link>https://telecom.tistory.com/698</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;WP REST API V2를 통해 사용자 정의 필드로 Custom Post Type을 올바르게 작성하는 방법&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사용자 지정 필드가 있는 wprest api v2를 통해 사용자 지정 게시 유형 레코드를 올바르게 만드는 방법은 무엇입니까?&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;이 테마는 Custom Post Type에 대한 Custom Tecosomies를 사용하여 카테고리, 위치, 비즈니스라고 불리는 Custom Post Type 및 Custom Meta의 Custom 필드를 사용합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 rest api v2를 사용하여 사이트로 데이터를 가져오려고 노력하고 있으며 사용자 정의 카테고리와 위치를 성공적으로 만들었습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;REST API Enabler 플러그인을 사용하여 사용자 지정 엔드포인트와 사용자 지정 필드를 등록했습니다.&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;http://mysite/wp-json/wp/v2/businesses&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;api를 통해 새로운 비즈니스를 업로드 할 수 있지만 생성된 레코드는 모든 메타 키를 무시합니다.&lt;/font&gt;&lt;/font&gt;&lt;/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;      body = {
        title: company_name,
        listing_address: [address], 
        listing_map_location_latitude: [c.lat],
        listing_map_location_longitude: [c.lon],
        content: c.description,
        email: c.email,
        facebook: [c.facebook],
        image_url: c.image_url,
        locations: [c.city.server_id],
        listing_categories: c.categories.pluck(:server_id),
        listing_street_view: [&quot;on&quot;]
        status:&quot;publish&quot;
      }
      request = HTTParty.post(POSTS_END_POINT, body: body, headers: headers)
&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;REST api를 통해 이전에 생성된 올바른 위치 및 사용자 지정 범주(listing_categories)에 비즈니스를 올바르게 연결하지만 사용자 지정 필드(wp_postmeta table)가 채워지지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;listing_locations&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;listing_address&lt;/code&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;나머지 api를 통해 업로드된 레코드를 조회할 수 있는데 이렇게 답변이 옵니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$ rake upload:test
Result: {&quot;id&quot;=&amp;gt;1749, &quot;date&quot;=&amp;gt;&quot;2016-02-20T05:06:01&quot;, &quot;date_gmt&quot;=&amp;gt;nil, &quot;guid&quot;=&amp;gt;{&quot;rendered&quot;=&amp;gt;&quot;http://highstreetbeacons.com/?post_type=business&amp;amp;p=1749&quot;}, &quot;modified&quot;=&amp;gt;&quot;2016-02-20T05:06:01&quot;, &quot;modified_gmt&quot;=&amp;gt;nil, &quot;slug&quot;=&amp;gt;&quot;&quot;, &quot;type&quot;=&amp;gt;&quot;business&quot;, &quot;link&quot;=&amp;gt;&quot;http://highstreetbeacons.com/?post_type=business&amp;amp;p=1749&quot;, &quot;title&quot;=&amp;gt;{&quot;rendered&quot;=&amp;gt;&quot;Birmingham Museum and Art Gallery, Chamberlain Square, Birmingham, B3 3DH&quot;}, &quot;content&quot;=&amp;gt;{&quot;rendered&quot;=&amp;gt;&quot;&amp;lt;p&amp;gt;A description&amp;lt;/p&amp;gt;\n&quot;}, &quot;author&quot;=&amp;gt;1, &quot;featured_media&quot;=&amp;gt;0, &quot;comment_status&quot;=&amp;gt;&quot;open&quot;, &quot;ping_status&quot;=&amp;gt;&quot;closed&quot;, &quot;listing_categories&quot;=&amp;gt;[3779, 4095, 4061], &quot;locations&quot;=&amp;gt;[330], &quot;_links&quot;=&amp;gt;{&quot;self&quot;=&amp;gt;[{&quot;href&quot;=&amp;gt;&quot;http://highstreetbeacons.com/wp-json/wp/v2/businesses/1749&quot;}], &quot;collection&quot;=&amp;gt;[{&quot;href&quot;=&amp;gt;&quot;http://highstreetbeacons.com/wp-json/wp/v2/businesses&quot;}], &quot;about&quot;=&amp;gt;[{&quot;href&quot;=&amp;gt;&quot;http://highstreetbeacons.com/wp-json/wp/v2/types/business&quot;}], &quot;author&quot;=&amp;gt;[{&quot;embeddable&quot;=&amp;gt;true, &quot;href&quot;=&amp;gt;&quot;http://highstreetbeacons.com/wp-json/wp/v2/users/1&quot;}], &quot;replies&quot;=&amp;gt;[{&quot;embeddable&quot;=&amp;gt;true, &quot;href&quot;=&amp;gt;&quot;http://highstreetbeacons.com/wp-json/wp/v2/comments?post=1749&quot;}], &quot;https://api.w.org/attachment&quot;=&amp;gt;[{&quot;href&quot;=&amp;gt;&quot;http://highstreetbeacons.com/wp-json/wp/v2/media?parent=1749&quot;}], &quot;https://api.w.org/term&quot;=&amp;gt;[{&quot;taxonomy&quot;=&amp;gt;&quot;listing_categories&quot;, &quot;embeddable&quot;=&amp;gt;true, &quot;href&quot;=&amp;gt;&quot;http://highstreetbeacons.com/wp-json/wp/v2/listing_categories?post=1749&quot;}, {&quot;taxonomy&quot;=&amp;gt;&quot;locations&quot;, &quot;embeddable&quot;=&amp;gt;true, &quot;href&quot;=&amp;gt;&quot;http://highstreetbeacons.com/wp-json/wp/v2/locations?post=1749&quot;}]}}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것은 메타 키를 완전히 무시하는 것입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;관리 영역에서 수동으로 생성된 비즈니스에 대한 업데이트 버튼을 누른 경우 API를 통해 다시 쿼리하고 올바른 필드를 모두 반환할 수 있지만 업데이트할 POST 요청(반드시 PUT이어야 함)은 레코드에서 여전히 사용자 지정 필드를 설정하지 않습니다.&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;rake upload:test
Result: {&quot;id&quot;=&amp;gt;1745, &quot;date&quot;=&amp;gt;&quot;2016-02-20T04:53:17&quot;, &quot;date_gmt&quot;=&amp;gt;nil, &quot;guid&quot;=&amp;gt;{&quot;rendered&quot;=&amp;gt;&quot;http://highstreetbeacons.com/?post_type=business&amp;amp;#038;p=1745&quot;}, &quot;modified&quot;=&amp;gt;&quot;2016-02-20T04:53:17&quot;, &quot;modified_gmt&quot;=&amp;gt;&quot;2016-02-20T04:53:17&quot;, &quot;slug&quot;=&amp;gt;&quot;&quot;, &quot;type&quot;=&amp;gt;&quot;business&quot;, &quot;link&quot;=&amp;gt;&quot;http://highstreetbeacons.com/?post_type=business&amp;amp;p=1745&quot;, &quot;title&quot;=&amp;gt;{&quot;rendered&quot;=&amp;gt;&quot;Birmingham Museum and Art Gallery, Chamberlain Square, Birmingham, B3 3DH&quot;}, &quot;content&quot;=&amp;gt;{&quot;rendered&quot;=&amp;gt;&quot;&amp;lt;p&amp;gt;A description&amp;lt;/p&amp;gt;\n&quot;}, &quot;author&quot;=&amp;gt;1, &quot;featured_media&quot;=&amp;gt;0, &quot;comment_status&quot;=&amp;gt;&quot;open&quot;, &quot;ping_status&quot;=&amp;gt;&quot;closed&quot;, &quot;listing_categories&quot;=&amp;gt;[3779, 4095, 4061], &quot;locations&quot;=&amp;gt;[330], &quot;listing_featured_image&quot;=&amp;gt;[&quot;&quot;], &quot;listing_banner&quot;=&amp;gt;[&quot;banner_featured_image&quot;], &quot;listing_opening_hours&quot;=&amp;gt;[&quot;a:7:{i:0;a:4:{s:11:\&quot;listing_day\&quot;;s:6:\&quot;MONDAY\&quot;;s:17:\&quot;listing_time_from\&quot;;s:0:\&quot;\&quot;;s:15:\&quot;listing_time_to\&quot;;s:0:\&quot;\&quot;;s:14:\&quot;listing_custom\&quot;;s:0:\&quot;\&quot;;}i:1;a:4:{s:11:\&quot;listing_day\&quot;;s:7:\&quot;TUESDAY\&quot;;s:17:\&quot;listing_time_from\&quot;;s:0:\&quot;\&quot;;s:15:\&quot;listing_time_to\&quot;;s:0:\&quot;\&quot;;s:14:\&quot;listing_custom\&quot;;s:0:\&quot;\&quot;;}i:2;a:4:{s:11:\&quot;listing_day\&quot;;s:9:\&quot;WEDNESDAY\&quot;;s:17:\&quot;listing_time_from\&quot;;s:0:\&quot;\&quot;;s:15:\&quot;listing_time_to\&quot;;s:0:\&quot;\&quot;;s:14:\&quot;listing_custom\&quot;;s:0:\&quot;\&quot;;}i:3;a:4:{s:11:\&quot;listing_day\&quot;;s:8:\&quot;THURSDAY\&quot;;s:17:\&quot;listing_time_from\&quot;;s:0:\&quot;\&quot;;s:15:\&quot;listing_time_to\&quot;;s:0:\&quot;\&quot;;s:14:\&quot;listing_custom\&quot;;s:0:\&quot;\&quot;;}i:4;a:4:{s:11:\&quot;listing_day\&quot;;s:6:\&quot;FRIDAY\&quot;;s:17:\&quot;listing_time_from\&quot;;s:0:\&quot;\&quot;;s:15:\&quot;listing_time_to\&quot;;s:0:\&quot;\&quot;;s:14:\&quot;listing_custom\&quot;;s:0:\&quot;\&quot;;}i:5;a:4:{s:11:\&quot;listing_day\&quot;;s:8:\&quot;SATURDAY\&quot;;s:17:\&quot;listing_time_from\&quot;;s:0:\&quot;\&quot;;s:15:\&quot;listing_time_to\&quot;;s:0:\&quot;\&quot;;s:14:\&quot;listing_custom\&quot;;s:0:\&quot;\&quot;;}i:6;a:4:{s:11:\&quot;listing_day\&quot;;s:6:\&quot;SUNDAY\&quot;;s:17:\&quot;listing_time_from\&quot;;s:0:\&quot;\&quot;;s:15:\&quot;listing_time_to\&quot;;s:0:\&quot;\&quot;;s:14:\&quot;listing_custom\&quot;;s:0:\&quot;\&quot;;}}&quot;], &quot;listing_map_location&quot;=&amp;gt;[&quot;a:2:{s:8:\&quot;latitude\&quot;;s:0:\&quot;\&quot;;s:9:\&quot;longitude\&quot;;s:0:\&quot;\&quot;;}&quot;], &quot;listing_street_view_location_latitude&quot;=&amp;gt;[&quot;37.812405&quot;], &quot;listing_street_view_location_longitude&quot;=&amp;gt;[&quot;-122.47607800000003&quot;], &quot;listing_street_view_location_heading&quot;=&amp;gt;[&quot;-18&quot;], &quot;listing_street_view_location&quot;=&amp;gt;[&quot;a:5:{s:8:\&quot;latitude\&quot;;s:9:\&quot;37.812405\&quot;;s:9:\&quot;longitude\&quot;;s:19:\&quot;-122.47607800000003\&quot;;s:4:\&quot;zoom\&quot;;s:1:\&quot;1\&quot;;s:7:\&quot;heading\&quot;;s:3:\&quot;-18\&quot;;s:5:\&quot;pitch\&quot;;s:2:\&quot;25\&quot;;}&quot;], &quot;listing_locations&quot;=&amp;gt;[&quot;a:1:{i:0;s:10:\&quot;birmingham\&quot;;}&quot;], &quot;listing_listing_category&quot;=&amp;gt;[&quot;a:3:{i:0;s:7:\&quot;museums\&quot;;i:1;s:10:\&quot;coffee-tea\&quot;;i:2;s:13:\&quot;art-galleries\&quot;;}&quot;], &quot;_links&quot;=&amp;gt;{&quot;self&quot;=&amp;gt;[{&quot;href&quot;=&amp;gt;&quot;http://highstreetbeacons.com/wp-json/wp/v2/businesses/1745&quot;}], &quot;collection&quot;=&amp;gt;[{&quot;href&quot;=&amp;gt;&quot;http://highstreetbeacons.com/wp-json/wp/v2/businesses&quot;}], &quot;about&quot;=&amp;gt;[{&quot;href&quot;=&amp;gt;&quot;http://highstreetbeacons.com/wp-json/wp/v2/types/business&quot;}], &quot;author&quot;=&amp;gt;[{&quot;embeddable&quot;=&amp;gt;true, &quot;href&quot;=&amp;gt;&quot;http://highstreetbeacons.com/wp-json/wp/v2/users/1&quot;}], &quot;replies&quot;=&amp;gt;[{&quot;embeddable&quot;=&amp;gt;true, &quot;href&quot;=&amp;gt;&quot;http://highstreetbeacons.com/wp-json/wp/v2/comments?post=1745&quot;}], &quot;https://api.w.org/attachment&quot;=&amp;gt;[{&quot;href&quot;=&amp;gt;&quot;http://highstreetbeacons.com/wp-json/wp/v2/media?parent=1745&quot;}], &quot;https://api.w.org/term&quot;=&amp;gt;[{&quot;taxonomy&quot;=&amp;gt;&quot;listing_categories&quot;, &quot;embeddable&quot;=&amp;gt;true, &quot;href&quot;=&amp;gt;&quot;http://highstreetbeacons.com/wp-json/wp/v2/listing_categories?post=1745&quot;}, {&quot;taxonomy&quot;=&amp;gt;&quot;locations&quot;, &quot;embeddable&quot;=&amp;gt;true, &quot;href&quot;=&amp;gt;&quot;http://highstreetbeacons.com/wp-json/wp/v2/locations?post=1745&quot;}]}}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;REST API Enabler 플러그인에 의존하지 않고 사용자 지정 필드를 등록하기 위해 플러그인을 방금 만들었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;?php
/**
 * Plugin Name: Jamesc Register API Fields
 * Plugin URI: http://danielpataki.com
 * Description: This plugin exposes business meta data mfields to REST API.
 * Version: 1.0.0
 * Author: Smiler
 */


/**
 * Use arbitrary functions to add a field
 */
add_action( 'rest_api_init', 'register_something_random' );
function slug_register_something_random() {
    register_rest_field( 'business',
        'listing_address',
        array(
            'get_callback'    =&amp;gt; 'get_meta_field',
            'update_callback' =&amp;gt; 'update_meta_field',
            'schema'          =&amp;gt; null,
        )
    );
}

/**
 * Handler for getting custom field data.
 *
 * @since 0.1.0
 *
 * @param array $object The object from the response
 * @param string $field_name Name of field
 * @param WP_REST_Request $request Current request
 *
 * @return mixed
 */
function get_meta_field( $object, $field_name, $request ) {
    return get_post_meta( $object[ 'id' ], $field_name );
}

/**
 * Handler for updating custom field data.
 *
 * @since 0.1.0
 *
 * @param mixed $value The value of the field
 * @param object $object The object from the response
 * @param string $field_name Name of field
 *
 * @return bool|int
 */
function update_meta_field( $value, $object, $field_name ) {
    if ( ! $value || ! is_string( $value ) ) {
        return;
    }

    return update_post_meta( $object-&amp;gt;ID, $field_name, strip_tags( $value ) );

}
&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;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;register_something_random&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;slug_register_something_random()&lt;/code&gt; &lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;add_action( 'rest_api_init', 'register_something_random' );
function slug_register_something_random() {
&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;add_action( 'rest_api_init', 'register_something_random' );
function register_something_random() {
&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/35519680/how-to-correctly-create-custom-post-type-with-custom-fields-through-wp-rest-api&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>Wordpress</category>
      <author>telecom</author>
      <guid isPermaLink="true">https://telecom.tistory.com/698</guid>
      <comments>https://telecom.tistory.com/698#entry698comment</comments>
      <pubDate>Wed, 1 Nov 2023 22:08:27 +0900</pubDate>
    </item>
    <item>
      <title>wp_nav_메뉴에서 li 요소에 클래스 추가</title>
      <link>https://telecom.tistory.com/697</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;wp_nav_메뉴에서 li 요소에 클래스 추가&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;워드프레스의 wp_nav_메뉴에 문제가 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 Li 원소들의 구조를 만들고 싶습니다. 여기서 모든 원소들은 &quot;menu-li&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;php 파일:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;register_nav_menus(
array(
'primary-menu' =&amp;gt; __( 'Primary Menu' ),
'secondary-menu' =&amp;gt; __( 'Secondary Menu' )
));
&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;?php

                $defaults = array(
                    'theme_location'  =&amp;gt; 'primary-menu',
                    'menu'            =&amp;gt; '',
                    'container'       =&amp;gt; '',
                    'container_class' =&amp;gt; '',
                    'container_id'    =&amp;gt; '',
                    'menu_class'      =&amp;gt; 'menu-li',
                    'menu_id'         =&amp;gt; '',
                    'echo'            =&amp;gt; true,
                    'fallback_cb'     =&amp;gt; 'wp_page_menu',
                    'before'          =&amp;gt; '',
                    'after'           =&amp;gt; '',
                    'link_before'     =&amp;gt; '',
                    'link_after'      =&amp;gt; '',
                    'items_wrap'      =&amp;gt; '&amp;lt;ul&amp;gt;%3$s&amp;lt;/ul&amp;gt;',
                    'depth'           =&amp;gt; 0,
                    'walker'          =&amp;gt; ''
                );
                wp_nav_menu( $defaults );
                ?&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;모든 요소를 선형으로 표시하지만 &quot;menu-li&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;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그&lt;/font&gt;&lt;/font&gt;&lt;code&gt;menu_class&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;ul&amp;gt;&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;개별 요소가 아닌 래퍼 요소&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&amp;lt;li&amp;gt;&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;s. 메뉴 항목에 클래스를 추가하려면 &lt;a href=&quot;https://developer.wordpress.org/reference/hooks/nav_menu_css_class/&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;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이렇게 작동합니다(테마에 추가).&lt;/font&gt;&lt;/font&gt;&lt;code&gt;functions.php&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;add_filter ( 'nav_menu_css_class', 'so_37823371_menu_item_class', 10, 4 );

function so_37823371_menu_item_class ( $classes, $item, $args, $depth ){
  $classes[] = 'menu-li';
  return $classes;
}
&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;menu-li&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;$item&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;$args&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;add_filter('nav_menu_css_class','arg_menu_classes',110,3);

function arg_menu_classes($classes, $item, $args) {
    if($args-&amp;gt;menu == 'FooterMenu') { // name need menu
        $classes[] = 'col-6 col-sm-6'; // add classes
    }
    return $classes;
}
&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/37823371/adding-class-to-li-elements-in-wp-nav-menu&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>Wordpress</category>
      <author>telecom</author>
      <guid isPermaLink="true">https://telecom.tistory.com/697</guid>
      <comments>https://telecom.tistory.com/697#entry697comment</comments>
      <pubDate>Wed, 1 Nov 2023 22:08:20 +0900</pubDate>
    </item>
    <item>
      <title>장고 ORM, 요일별 그룹</title>
      <link>https://telecom.tistory.com/696</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;장고 ORM, 요일별 그룹&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;DAY별로 제품을 그룹화하려고 하는데 date_created는 datetime 필드입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Product.objects.values('date_created') \
               .annotate(available=Count('available_quantity'))
&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;[
    {'date_created': datetime.datetime(2012, 4, 14, 13, 3, 6), 'available': 1},
    {'date_created': datetime.datetime(2012, 4, 14, 17, 12, 9), 'available': 1},
    ...
]
&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;[
    {'date_created': datetime.datetime(2012, 4, 14), 'available': 2}, ...
]
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;편집:&lt;/strong&gt; 데이터베이스 백엔드 MYSQL&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/3543379/django-annotate-groupings-by-month&quot;&gt;이 질문&lt;/a&gt;에서 영감을 얻어 MySQL에서 사용해 보십시오.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;from django.db.models import Count

Product.objects.extra(select={'day': 'date( date_created )'}).values('day') \
               .annotate(available=Count('date_created'))
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/a/10154412/1476885&quot;&gt;San4ez&lt;/a&gt;의 답변과 유사한 접근 방식이지만, 반환 날짜는 'datetime.datetime(YYY, MM, DD)' 대신 'YYYY-MM-DD'로 변경됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Product.objects.extra(select={'day': &quot;TO_CHAR(date_created, 'YYYY-MM-DD')&quot;})
               .values('day') \
               .order_by('day') \
               .annotate(available=Count('date_created'))
&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;장고 1.4에서는.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;.dates('date_created', 'day')&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;.values()&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;Product.objects.annotate(available=Count('available_quantity')) \
  .dates('date_created', 'day')
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음을 반환해야 &lt;em&gt;합니다&lt;/em&gt;.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;[
    {'date_created': datetime.datetime(2012, 4, 14), 'available': 2}, ...
]
&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;Product.objects.extra(select={'day': &quot;TO_CHAR(date_created, 'YYYY-MM-DD')&quot;})\
                .values('day')\
                .order_by('day')\
                .annotate(bets=Count('date_created'))
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/users/455833/san4ez&quot;&gt;San4ez&lt;/a&gt;의 답변과 &lt;a href=&quot;https://stackoverflow.com/users/1476885/zanon&quot;&gt;Zanon&lt;/a&gt;의 변화를 따름으로써&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 Postgres 또는 Sqlite로 작업하기 위해 우회 방법을 만들어야 했습니다. Count() 함수는 datetime 필드를 고려하기 때문에 date_created가 시간 정보를 여전히 보유하고 있으므로 date_created가 시간 정보를 보유하고 있으므로 date와 함께 &quot;day&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;장고 2.2&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;from django.db.models import Count

# Change date() to to_char(created_at, 'YYYY-MM-DD') if using Postgres
Product.objects.extra(select={'day': 'date( date_created )'})\
    .values('day') \
    .order_by('date_created__date')\
    .annotate(available=Count('date_created__date'))
&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/10154227/django-orm-group-by-day&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>MySQL</category>
      <author>telecom</author>
      <guid isPermaLink="true">https://telecom.tistory.com/696</guid>
      <comments>https://telecom.tistory.com/696#entry696comment</comments>
      <pubDate>Wed, 1 Nov 2023 22:08:13 +0900</pubDate>
    </item>
    <item>
      <title>PowerShell Out-File 명령에서 줄 바꿈 방지</title>
      <link>https://telecom.tistory.com/695</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;PowerShell Out-File 명령에서 줄 바꿈 방지&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;PowerShell의 &lt;a href=&quot;https://msdn.microsoft.com/powershell/reference/5.1/microsoft.powershell.utility/Out-File&quot; rel=&quot;noreferrer&quot;&gt;Out-File&lt;/a&gt; 명령이 출력되는 텍스트 뒤에 새 줄을 추가하지 못하게 하려면 어떻게 해야 합니까?&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예를 들어, 다음 명령을 실행하면 &quot;TestTest&quot;가 아닌 &quot;TestTestTest\r\n&quot; 내용의 파일이 생성됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&quot;TestTest&quot; | Out-File -encoding ascii test.txt
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;PowerShell 5.0+에서는 다음과 같은 기능을 사용합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&quot;TestTest&quot; | Out-File -encoding ascii test.txt -NoNewline
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하지만 이전 버전에서는 그 cmdlet을 사용할 수 없습니다.&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;[System.IO.File]::WriteAllText($FilePath,&quot;TestTest&quot;,[System.Text.Encoding]::ASCII)
&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;em&gt;뇌물수수자&lt;/em&gt;의&lt;a href=&quot;https://stackoverflow.com/a/35279910/45375&quot;&gt; 도움이 되는&lt;/a&gt; 답변을 보완하기 위해 다시&lt;/font&gt;&lt;/font&gt;&lt;code&gt;-NoNewline&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;Out-File&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;Set-Content&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;Add-Content&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;-NoNewline&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;PSv5+가 필요합니다.&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;em&gt;객체&lt;/em&gt;&lt;/strong&gt;가 &lt;strong&gt;여러&lt;/strong&gt; 개일 경우 &lt;em&gt;후행&lt;/em&gt; 새 선(줄 바꿈)만 억제되는 것이 아니라 새 &lt;em&gt;선만&lt;/em&gt; 억제된다는 것을 의미합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;즉,&lt;/font&gt;&lt;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;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;따라서 다음 명령어는 동일한 파일 내용을 생성합니다 (&lt;/font&gt;&lt;/font&gt;&lt;code&gt;TestTest&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 class=&quot;lang-bash prettyprint-override&quot;&gt;&lt;code&gt;# Single input string
&quot;TestTest&quot; | Out-File -encoding ascii test.txt -NoNewline

# Equivalent command: 2-element array of strings that are directly concatenated.
&quot;Test&quot;, &quot;Test&quot; | Out-File -encoding ascii test.txt -NoNewline
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;출력 개체 &lt;strong&gt;&lt;em&gt;뒤&lt;/em&gt;&lt;/strong&gt;에 새 &lt;strong&gt;선&lt;/strong&gt;을 배치하지 &lt;strong&gt;않고 &lt;/strong&gt;두 줄 &lt;strong&gt;&lt;em&gt;사이&lt;/em&gt;&lt;/strong&gt;에만 새 선을 &lt;strong&gt;배치&lt;/strong&gt;하려면 &lt;strong&gt;개체&lt;/strong&gt;를 새 &lt;strong&gt;선과 명시적으로 결합&lt;/strong&gt;해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-bash prettyprint-override&quot;&gt;&lt;code&gt;&quot;Test&quot;, &quot;Test&quot; -join [Environment]::NewLine |
  Out-File -encoding ascii test.txt -NoNewline
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;sup&gt;&lt;code&gt;[Environment]::NewLine&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;는 플랫폼에 적합한 새로운 라인 시퀀스(Windows의 경우 CRLF, 유닉스 계열 플랫폼의 경우 LF)입니다. 필요한 경우 다음과 같이 명시적으로 둘 중 하나의 시퀀스를 생성할 수도 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&quot;`r`n&quot;&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&quot;`n&quot;&lt;/code&gt;&lt;/sup&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;주의&lt;/strong&gt; 사항:&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;위에&lt;/font&gt;&lt;/font&gt;&lt;code&gt;-join&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;솔루션은 입력 개체가 아직 입력되지 않은 경우 암묵적으로 문자열로 변환합니다. 만약 .NET을 호출하여 이를 수행합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;.ToString()&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;각 개체에 대한 메서드입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것은 종종 다른 표현을 산출합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Out-File&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;Out-File&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;PowerShell의 &lt;em&gt;기본 출력 형식&lt;/em&gt;을 사용합니다. 예를 들어, 출력을 비교합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;(Get-Date).ToString()&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고 그냥&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Get-Date&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;strong&gt;입력이 표현이 만족스러운 문자열 및/또는 문자열이 아닌 경우&lt;/strong&gt;에는 위의 솔루션이 효과적이지만, &lt;strong&gt;일반적&lt;/strong&gt;으로 동일한 문자열을 암시적으로 &lt;strong&gt;적용하는 cmdlet을 사용&lt;/strong&gt;하는 것이 &lt;strong&gt;좋습니다&lt;/strong&gt;.&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음과 같은 차이점에 대한 완전한 논의를 위해&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Out-File&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;Set-Content&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;, &lt;a href=&quot;https://stackoverflow.com/a/44246434/45375&quot;&gt;이 대답&lt;/a&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;Out-String&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;Out-String&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;-NoNewline&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;(v5.1 기준으로, 이&lt;a href=&quot;https://github.com/PowerShell/PowerShell/issues/3684&quot; rel=&quot;nofollow noreferrer&quot;&gt; GitHub 문제&lt;/a&gt;는 이를 도입할 것을 제안합니다.) 항상 새로운 줄이 뒤따를 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Briantist와 mklement0의 도움이 되는 답변을 보완하려면 &lt;em&gt;re-NoNewline&lt;/em&gt;:&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이전 버전의 파워셸에서 &lt;em&gt;Out-File&lt;/em&gt;의 &lt;em&gt;-NoNewLine&lt;/em&gt; 매개변수를 대체하기 위해 이 작은 함수를 만들었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;참고: 제 경우에는 7줄(Days of the week)의 .csv 파일용이었습니다.&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;## Receive the value we want to add and &quot;yes&quot; or &quot;no&quot; depending on whether we want to 
put the value on a new line or not.
function AddValueToLogFile ($value, $NewLine) {
    ## If the log file exists:
    if (Test-path $Config.LogPath) {
        ## And we don't want to add a new line, the value is concatenated at the end.
        if ($NewLine -eq &quot;no&quot;) {
            $file = Get-Content -Path $Config.LogPath 
            ## If the file has more than one line
            if ($file -is [array]) {
                $file[-1]+= &quot;;&quot; + $value
            }
            ## if the file only has one line
            else {
                $file +=  &quot;;&quot; + $value
            }
            $file | Out-File -FilePath $Config.LogPath
        }
        ## If we want to insert a new line the append parameter is used.
        elseif ($NewLine -eq &quot;yes&quot;) {
            $value | Out-File -Append -FilePath $Config.LogPath
        }
    }
    ## If the log file does not exist it is passed as a value
    elseif (!(Test-path $Config.LogPath)) {
        $value | Out-File -FilePath $Config.LogPath
    }
}
&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/35279848/prevent-trailing-newline-in-powershell-out-file-command&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>PowerShell</category>
      <author>telecom</author>
      <guid isPermaLink="true">https://telecom.tistory.com/695</guid>
      <comments>https://telecom.tistory.com/695#entry695comment</comments>
      <pubDate>Wed, 1 Nov 2023 22:08:06 +0900</pubDate>
    </item>
    <item>
      <title>&amp;quot;소시지 만드는 법&amp;quot; apache/php/mysql 상호 작용 견학</title>
      <link>https://telecom.tistory.com/694</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&quot;소시지 만드는 법&quot; apache/php/mysql 상호 작용 견학&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;apache/php/mysql 스택이 낮은 수준(브라우저와의 상호 작용 포함)에서 어떻게 작동하는지 이해하는 데 어려움을 겪고 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;어디선가 (책, 웹사이트 등) 나에게 전체 경로를 안내하고 URL을 요청하는 브라우저로 시작하여 http 요청이 전송되는 방법, 아파치가 php와 대화하는 방법, php가 mysq와 대화하는 방법(영구적 및 비영구적 연결) 등을 설명하는 좋은 설명이 있습니까?&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;각 구성 요소에 대한 문서가 많이 있지만 &quot;워크스루&quot;를 찾을 수 없습니다.&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;a href=&quot;http://books.google.com/books?id=mPzUH1EPEJkC&amp;amp;pg=PA14&amp;amp;lpg=PA14&amp;amp;dq=web+request+lifecycle+php+mysql&amp;amp;source=bl&amp;amp;ots=RUoPUfvaQI&amp;amp;sig=1j6IypFRdrQlFuRQR8_Q2oUmkBI&amp;amp;hl=en&amp;amp;ei=4QAvSub7HpCNtgfdvqX_Cw&amp;amp;sa=X&amp;amp;oi=book_result&amp;amp;ct=result&amp;amp;resnum=1#PPA13,M1&quot; rel=&quot;nofollow noreferrer&quot;&gt;예를 들어&lt;/a&gt; PHP와 &lt;a href=&quot;http://books.google.com/books?id=mPzUH1EPEJkC&amp;amp;pg=PA14&amp;amp;lpg=PA14&amp;amp;dq=web+request+lifecycle+php+mysql&amp;amp;source=bl&amp;amp;ots=RUoPUfvaQI&amp;amp;sig=1j6IypFRdrQlFuRQR8_Q2oUmkBI&amp;amp;hl=en&amp;amp;ei=4QAvSub7HpCNtgfdvqX_Cw&amp;amp;sa=X&amp;amp;oi=book_result&amp;amp;ct=result&amp;amp;resnum=1#PPA13,M1&quot; rel=&quot;nofollow noreferrer&quot;&gt;MySQL&lt;/a&gt;은 공정에 대한 아주 기본적인 그림을 가지고 있는데, 아마 당신이 이미 이해하고 있을 것이라고 생각합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저 사진보다 더 깊이 있게 이야기하는 것은 꽤 긴 토론입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아이러니하게도, 제가 방금 링크한 책을 읽어보면 꽤 좋은 설명이 나옵니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;좀 더 구체적인 질문이 있다면 질문을 새로 열어보는 것을 추천합니다.&lt;/font&gt;&lt;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;em&gt;고급&lt;/em&gt; PHP &lt;em&gt;프로그래밍&lt;/em&gt;이라는 책에서 적어도 부분적으로 내용이 있는 사이트를 찾았습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 사이트의 위치는 http://php.find-info.ru/php/016/toc.html 입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;특히 &lt;a href=&quot;http://php.find-info.ru/php/016/ch20lev1sec5.html&quot; rel=&quot;nofollow noreferrer&quot; title=&quot;PHP Request Life Cycle&quot; papago-attr-id=&quot;2&quot;&gt;PHP 요청 수명 주기&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;strong&gt;:&lt;/strong&gt; IANAL, 그러나 이 책이 여전히 &lt;a href=&quot;https://rads.stackoverflow.com/amzn/click/com/0672325616&quot; rel=&quot;nofollow noreferrer&quot;&gt;Amazon에 등재&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;여기에 이 모든 것이 어떻게 맞물려 돌아가는지에 대해 쓰여진 책 전체가 주요 부분을 다루는 &quot;걷기&quot;의 연결고리라는 사실이 맞습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;http://computer.howstuffworks.com/web-server.htm&quot; rel=&quot;nofollow noreferrer&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;http://computer.howstuffworks.com/web-server.htm&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;가장 좋은 조치는 LAMP 스택에 대한 좋은 책을 얻는 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;빠른 응답(필요한 경우 더 요청) HTTP 프로토콜 서버가 HTML 결과를 생성하여 다시 게시하는 동안 브라우저는 웹 서버에 연락합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;각 브라우저는 http protocol만 이해합니다(이 분석을 위해).&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이제 아이콘, 이미지, 자바스크립트 등의 항목은 아파치 서버에서 읽고 브라우저로 &quot;복사&quot;됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;일반 html 파일에서도 동일합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;차이는 php 파일에 있습니다(여기서는 지나치게 단순화하고 있습니다).&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것들은 php 모듈로 전달되고 (모듈의) 응답은 브라우저로 다시 전송됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;php 모듈은 php를 이해하는 것입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;우리 여기 같이 있는 거예요?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;만약 그렇다면: PHP 스크립트는 MySQL 서버에서 데이터를 필요로 할 수도 있고 그렇지 않을 수도 있으며, 데이터를 가져오거나 조작해야 합니다.&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;그게 바로 &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;apache는 요청을 받고 .htaccess 또는 config 옵션을 기반으로 요청을 처리하는 것으로 알고 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그런 다음 필요한 경우 PHP에 파싱 요청을 전달합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;PHP는 코드를 두 번 스캔하는데, 첫 번째는 사전 구문 분석이고, 이것은 페이지를 실제 구문 분석하기 전에 명백한 결함을 발견하고 최상위 레벨에서 함수를 실행합니다(문, 루프, 포함된 함수, evals 또는 lamda 기반 함수의 경우에는 무시).&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;에코를 사용한 모든 작업은 표준 아웃스트림으로 반환되고 아파치로 반환됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아파치가 페이지를 종료하면 PHP에 킬 신호를 전송하고 PHP는 오브젝트를 닫고 필요한 경우 오류 메시지를 인쇄한 후 종료합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;페이지가 종료되면 apache는 헤더를 작성하고 페이지를 반환합니다.&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;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/971279/how-the-sausage-is-made-tour-of-apache-php-mysql-interaction&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>MySQL</category>
      <author>telecom</author>
      <guid isPermaLink="true">https://telecom.tistory.com/694</guid>
      <comments>https://telecom.tistory.com/694#entry694comment</comments>
      <pubDate>Wed, 1 Nov 2023 22:07:59 +0900</pubDate>
    </item>
    <item>
      <title>관리자 편집 순서로 표시되는 값을 WooCommerce 체크아웃에 사용자 지정 확인란 추가</title>
      <link>https://telecom.tistory.com/693</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;관리자 편집 순서로 표시되는 값을 WooCommerce 체크아웃에 사용자 지정 확인란 추가&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;&amp;lt;input type=&quot;checkbox&quot;&amp;gt;&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;어떤 값이 우커머스 백엔드에도 나타나는지, 그래서 나는 마지막에 고객이 박스를 체크했는지 아닌지 알 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/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;3단계로 수행할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;결제 방법 아래에 사용자 지정 확인란 필드 추가&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;주문 메타에서 선택한 사용자 지정 확인란 필드 저장&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&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;/p&gt; 
&lt;pre&gt;&lt;code&gt;// Add custom checkout field: woocommerce_review_order_before_submit
add_action( 'woocommerce_review_order_before_submit', 'my_custom_checkout_field' );
function my_custom_checkout_field() {
    echo '&amp;lt;div id=&quot;my_custom_checkout_field&quot;&amp;gt;';

    woocommerce_form_field( 'my_field_name', array(
        'type'      =&amp;gt; 'checkbox',
        'class'     =&amp;gt; array('input-checkbox'),
        'label'     =&amp;gt; __('My custom checkbox'),
    ),  WC()-&amp;gt;checkout-&amp;gt;get_value( 'my_field_name' ) );
    echo '&amp;lt;/div&amp;gt;';
}

// Save the custom checkout field in the order meta, when checkbox has been checked
add_action( 'woocommerce_checkout_update_order_meta', 'custom_checkout_field_update_order_meta', 10, 1 );
function custom_checkout_field_update_order_meta( $order_id ) {

    if ( ! empty( $_POST['my_field_name'] ) )
        update_post_meta( $order_id, 'my_field_name', $_POST['my_field_name'] );
}

// Display the custom field result on the order edit page (backend) when checkbox has been checked
add_action( 'woocommerce_admin_order_data_after_billing_address', 'display_custom_field_on_order_edit_pages', 10, 1 );
function display_custom_field_on_order_edit_pages( $order ){
    $my_field_name = get_post_meta( $order-&amp;gt;get_id(), 'my_field_name', true );
    if( $my_field_name == 1 )
        echo '&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;My custom field: &amp;lt;/strong&amp;gt; &amp;lt;span style=&quot;color:red;&quot;&amp;gt;Is enabled&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;';
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;em&gt;&lt;font papago-translate=&quot;translated&quot;&gt;코드가 작동합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;활성 하위 테마(또는 테마)의 php 파일 또는 플러그인 파일에 있습니다.&lt;/font&gt;&lt;/em&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;WooCommerce 3+에서 테스트되었으며 작동합니다.&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/45905237/add-a-custom-checkbox-in-woocommerce-checkout-which-value-shows-in-admin-edit-or&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>Wordpress</category>
      <author>telecom</author>
      <guid isPermaLink="true">https://telecom.tistory.com/693</guid>
      <comments>https://telecom.tistory.com/693#entry693comment</comments>
      <pubDate>Wed, 1 Nov 2023 22:07:53 +0900</pubDate>
    </item>
    <item>
      <title>MySQL 구분 기호를 사용하여 저장 프로시저 구문 생성</title>
      <link>https://telecom.tistory.com/692</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;MySQL 구분 기호를 사용하여 저장 프로시저 구문 생성&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;MySQL에서 다음과 같은 구분 기호를 사용하여 저장 프로시저를 만들려고 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;use am;

DELIMITER $$

CREATE PROCEDURE addfields()
BEGIN
  DECLARE done INT DEFAULT FALSE;
  DECLARE acc INT(16);
  DECLARE validId INT DEFAULT 0;

END $$

DELIMITER ;
&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;#1304 - PROCEDURE addfields already exists
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;구분 기호를 사용하여 저장 프로시저를 만들고 먼저 존재할 경우 삭제하기 위한 적절한 구문은 무엇입니까?&lt;/font&gt;&lt;/p&gt;&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;MySQL에 저장된 프로시저 구문으로 시작하기(단말 사용):&lt;/font&gt;&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;1. 다음과 같이 단말기를 열고 mysql에 로그인합니다.&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;el@apollo:~$ mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
mysql&amp;gt; 
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;2. 절차가 있는지 확인해 보십시오.&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;mysql&amp;gt; show procedure status;
+-----------+---------------+-----------+---------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+
| Db        | Name          | Type      | Definer | Modified            | Created             | Security_type | Comment | character_set_client | collation_connection | Database Collation |
+-----------+---------------+-----------+---------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+
|   yourdb  | sp_user_login | PROCEDURE | root@%  | 2013-12-06 14:10:25 | 2013-12-06 14:10:25 | DEFINER       |         | utf8                 | utf8_general_ci      | latin1_swedish_ci  |
+-----------+---------------+-----------+---------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+
1 row in set (0.01 sec)
&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;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;3. 데이터베이스를 변경하고 삭제합니다.&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;mysql&amp;gt; use yourdb;
Database changed

mysql&amp;gt; drop procedure if exists sp_user_login;
Query OK, 0 rows affected (0.01 sec)
    
mysql&amp;gt; show procedure status;
Empty set (0.00 sec)
    
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;4. 네, 이제 저장 프로시저가 정의되지 않았습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;가장 간단한 것을 만듭니다.&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;mysql&amp;gt; delimiter //
mysql&amp;gt; create procedure foobar()
    -&amp;gt; begin select 'hello'; end//
Query OK, 0 rows affected (0.00 sec)
&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;저장 프로시저 이름은 foobar 입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;매개 변수를 사용하지 않으므로 &quot;hello&quot;를 반환해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;5. 거기 있는지 확인하고 구분 기호를 다시 설정하는 것을 기억하세요!:&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt; mysql&amp;gt; show procedure status;
 -&amp;gt; 
 -&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 papago-translate=&quot;translated&quot;&gt;구분 기호를 다음과 같이 설정합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;//&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;기억 나?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다시 설정 위치&lt;/font&gt;&lt;/font&gt;&lt;code&gt;;&lt;/code&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;6. 구분 기호를 다시 설정하고 절차를 살펴봅니다.&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;mysql&amp;gt; delimiter ;
mysql&amp;gt; show procedure status;
+-----------+--------+-----------+----------------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+
| Db        | Name   | Type      | Definer        | Modified            | Created             | Security_type | Comment | character_set_client | collation_connection | Database Collation |
+-----------+--------+-----------+----------------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+
| yourdb    | foobar | PROCEDURE | root@localhost | 2013-12-06 14:27:23 | 2013-12-06 14:27:23 | DEFINER       |         | utf8                 | utf8_general_ci      | latin1_swedish_ci  |
+-----------+--------+-----------+----------------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+
1 row in set (0.00 sec)

   
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;7. 실행:&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;mysql&amp;gt; call foobar();
+-------+
| hello |
+-------+
| hello |
+-------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
&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;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;8. 푸바를 떨어뜨린 후 매개변수를 사용하도록 다시 정의한 후 다시 실행합니다.&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;mysql&amp;gt; drop procedure foobar;
Query OK, 0 rows affected (0.00 sec)

mysql&amp;gt; show procedure status;
Empty set (0.00 sec)

mysql&amp;gt; delimiter //
mysql&amp;gt; create procedure foobar (in var1 int)
    -&amp;gt; begin select var1 + 2 as result;
    -&amp;gt; end//
Query OK, 0 rows affected (0.00 sec)

mysql&amp;gt; delimiter ;
mysql&amp;gt; call foobar(5);
+--------+
| result |
+--------+
|      7 |
+--------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
&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;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;9. 푸바 제거, 아웃 변수 만들기, 실행:&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;mysql&amp;gt; delimiter ;
mysql&amp;gt; drop procedure foobar;
Query OK, 0 rows affected (0.00 sec)

mysql&amp;gt; delimiter //
mysql&amp;gt; create procedure foobar(out var1 varchar(100))
    -&amp;gt; begin set var1=&quot;kowalski, what's the status of the nuclear reactor?&quot;;
    -&amp;gt; end//
Query OK, 0 rows affected (0.00 sec)


mysql&amp;gt; delimiter ;
mysql&amp;gt; call foobar(@kowalski_status);
Query OK, 0 rows affected (0.00 sec)

mysql&amp;gt; select @kowalski_status;
+-----------------------------------------------------+
| @kowalski_status                                    |
+-----------------------------------------------------+
| kowalski, what's the status of the nuclear reactor? |
+-----------------------------------------------------+
1 row in set (0.00 sec)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;10. MySQL에서의 INOUT 사용 예:&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;mysql&amp;gt; select 'ricksays' into @msg;
Query OK, 1 row affected (0.00 sec)


mysql&amp;gt; delimiter //
mysql&amp;gt; create procedure foobar (inout msg varchar(100))
-&amp;gt; begin
-&amp;gt; set msg = concat(@msg, &quot; never gonna let you down&quot;);
-&amp;gt; end//


mysql&amp;gt; delimiter ;


mysql&amp;gt; call foobar(@msg);
Query OK, 0 rows affected (0.00 sec)


mysql&amp;gt; select @msg;
+-----------------------------------+
| @msg                              |
+-----------------------------------+
| ricksays never gonna let you down |
+-----------------------------------+
1 row in set (0.00 sec)
&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;변수 msg를 정의하고 해당 변수를 foobar라고 하는 저장 프로시저에 전달한 다음 @msg를 foobar에 기록했습니다.&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://net.tutsplus.com/tutorials/an-introduction-to-stored-procedures/&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음은 구분 기호가 있는 &lt;strong&gt;MYSQL 저장 프로시저&lt;/strong&gt; 샘플 및 호출 방법입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;DELIMITER $$

DROP PROCEDURE IF EXISTS `sp_user_login` $$
CREATE DEFINER=`root`@`%` PROCEDURE `sp_user_login`(
  IN loc_username VARCHAR(255),
  IN loc_password VARCHAR(255)
)
BEGIN

  SELECT user_id,
         user_name,
         user_emailid,
         user_profileimage,
         last_update
    FROM tbl_user
   WHERE user_name = loc_username
     AND password = loc_password
     AND status = 1;

END $$

DELIMITER ;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;호출, mysql_connection specification 및&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$loginCheck=&quot;call sp_user_login('&quot;.$username.&quot;','&quot;.$password.&quot;');&quot;;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;절차 결과를 반환합니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;MySQL에서 프로시저를 만드는 코드는 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `procedureName`(IN comId int)
BEGIN
select * from tableName 
         (add joins OR sub query as per your requirement)
         Where (where condition here)
END $$
DELIMITER ;
&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;call procedureName(); // without parameter
call procedureName(id,pid); // with parameter
&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;1) 정의: root은 사용자 이름이며, mysql localhost의 사용자 이름이 호스트이므로 호스트 서버에서 이 쿼리를 실행하면 서버의 IP 주소로 변경할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;자세한 내용은 &lt;a href=&quot;http://dev.mysql.com/doc/connector-net/en/connector-net-tutorials-stored-procedures.html&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;다음과 같은 간단한 MySQL 프로시저를 만들었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;DELIMITER //
CREATE PROCEDURE GetAllListings()
 BEGIN
 SELECT nid, type, title  FROM node where type = 'lms_listing' order by nid desc;
END //
DELIMITER;
&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;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;SQL 저장 프로시저 생성&lt;/font&gt;&lt;/h2&gt; 
&lt;pre&gt;&lt;code&gt;DELIMiTER $$
create procedure GetUserRolesEnabled(in UserId int)
Begin

select * from users
where id=UserId ;
END $$
DELIMITER ;
&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/15786240/mysql-create-stored-procedure-syntax-with-delimiter&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>MySQL</category>
      <author>telecom</author>
      <guid isPermaLink="true">https://telecom.tistory.com/692</guid>
      <comments>https://telecom.tistory.com/692#entry692comment</comments>
      <pubDate>Wed, 1 Nov 2023 22:07:47 +0900</pubDate>
    </item>
    <item>
      <title>팬더 읽기 _excel: 'utf-8' 코덱이 위치 14에서 바이트 0xa8을 디코딩할 수 없음: 잘못된 시작 바이트</title>
      <link>https://telecom.tistory.com/691</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;팬더 읽기 _excel: 'utf-8' 코덱이 위치 14에서 바이트 0xa8을 디코딩할 수 없음: 잘못된 시작 바이트&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;MS Excel 파일, 버전 2016을 읽으려고 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;파일에는 데이터가 있는 여러 목록이 들어 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;DataBase에서 다운로드 받은 파일로 MS Office에서 올바르게 열 수 있습니다.&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;strong&gt;EDIT:&lt;/strong&gt; 파일에 러시아어와 영어 단어가 포함되어 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;대부분 라틴어-1 인코딩을 사용했을 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;encoding='latin-1'&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;도움이 되지 않는&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;import pandas as pd
with open('1.xlsx', 'r', encoding='utf8') as f:
        data = pd.read_excel(f)
&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;UnicodeDecodeError: 'utf-8' codec can't decode byte 0xa8 in position 14: invalid start byte
&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;encoding ='utf8'&lt;/code&gt; &lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;'charmap' codec can't decode byte 0x9d in position 622: character maps to &amp;lt;undefined&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;추신: 52개의 파일을 처리하고, 모든 시트의 데이터와 52개의 파일의 대응되는 시트를 병합하는 것이 과제입니다.&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;Python3를 사용하고 있을 것입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Python2에서는 이런 일이 일어나지 않습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;xlsx 파일은 바이너리(xml이지만 압축되어 있음)이므로 바이너리 모드에서 열어야 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음 통화를 사용하여 엽니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;open('1.xlsx', 'rb')
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;전체 추적은 없지만 유니코드 디코딩 오류는 read_excel()이 아닌 파일 개체에서 발생한 것으로 생각됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이러한 현상은 바이트 스트림에 무엇이든 포함될 수 있지만 디코딩이 너무 빨리 발생하는 것을 원하지 않기 때문에 발생합니다. read_excel()은 원시 바이트를 수신하고 해당 바이트를 처리할 수 있어야 합니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;문제는 원래 요청자가 첫 번째 인수로 파일 핸들을 사용하여 read_excel을 호출한다는 것입니다.&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;code&gt;df = pd.read_excel(open(&quot;file.xlsx&quot;,'r'))&lt;/code&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러나 정확한 것은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;df = pd.read_excel(&quot;file.xlsx&quot;)&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아마도 문제는 러시아 상징에 있을 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Charmap은 인코딩이 감지되지 않을 경우 사용되는 기본 디코딩 방법입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;utf-8과 latin-1이 도움이 되지 않는 것을 알기에 이 파일을 다음과 같이 읽지 않도록 시도해 봅니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;pd.read_excel(f)
&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;pd.read_table(f)
&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;f.readline()
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;기호가 무엇인지 확인하려면 예외를 제기하고 이 기호/symbols를 삭제합니다.&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;df=pd.read_excel('your_file.xlsx',encoding='utf-8')
&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;df=pd.read_excel('your_file.xlsx',encoding='sys.getfilesystemencoding()')
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;음, 때때로, 만약 우리가 Excel 시트에 빈 셀이 있다면, 이 오류는 발생할 수 밖에 없는데, 그것은 Pandas 데이터 프레임의 관점에서 null 값이고, 우리는 그 목적을 위해, 나에게 효과가 있었던 다음과 같은 접근법을 가질 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;import pandas as pd
import openpyxl

# Load Excel file using openpyxl
wb = openpyxl.load_workbook('excel_sheet_name.xlsx')
sheet = wb.active

# Create an empty DataFrame
data = []

# Iterate over the rows in the sheet
for row in sheet.iter_rows(values_only=True):
    data.append(row)

# Convert to DataFrame
excel_file = pd.DataFrame(data)
&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/48647122/pandas-read-excel-utf-8-codec-cant-decode-byte-0xa8-in-position-14-invalid&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>Excel</category>
      <author>telecom</author>
      <guid isPermaLink="true">https://telecom.tistory.com/691</guid>
      <comments>https://telecom.tistory.com/691#entry691comment</comments>
      <pubDate>Wed, 1 Nov 2023 22:07:37 +0900</pubDate>
    </item>
    <item>
      <title>Oracle 정점에서 한 페이지를 다른 페이지에 연결</title>
      <link>https://telecom.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;Oracle 정점에서 한 페이지를 다른 페이지에 연결&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;A페이지와 B페이지 두개가 있는데 클릭하면 B페이지로 이동하는 버튼(하이퍼링크나 이미지가 할 것)을 A페이지에 추가하는 것은 A페이지에 (하이퍼링크나 이미지는 클릭하면 B페이지로 이동합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;내가 어떻게 그럴 수 있을까?&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;감사해요.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;단추를 원하지 않으시려면 html href를 사용하여 다음 작업을 수행합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;f?p=&amp;amp;APP_ID.:&amp;lt;your page number to link to&amp;gt;:&amp;amp;SESSION&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;&amp;lt;a href=&quot;f?p=&amp;amp;APP_ID.:2:&amp;amp;SESSION.&quot;&amp;gt;Go to page 2!&amp;lt;/a&amp;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;2번 페이지로 안내해 드립니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;여러 가지 방법이 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;가장 간단한 방법은 Create Button 마법사를 사용하여 Apex 버튼을 만드는 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;지시에 따라 &quot;클릭 시 수행&quot; 페이지로 이동하면, &quot;이 응용프로그램의 페이지로 리디렉션&quot;을 수행으로 선택한 후 단추를 클릭하면 이동할 페이지 번호를 입력합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;Request(요청), Clear Cache(캐시 지우기), Set These Items(항목 설정) 등의 다른 세부 정보도 입력할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;img src=&quot;https://i.stack.imgur.com/dwcgV.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;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/5678856/link-one-page-to-another-in-oracle-apex&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>oracle</category>
      <author>telecom</author>
      <guid isPermaLink="true">https://telecom.tistory.com/690</guid>
      <comments>https://telecom.tistory.com/690#entry690comment</comments>
      <pubDate>Fri, 27 Oct 2023 21:45:08 +0900</pubDate>
    </item>
    <item>
      <title>MySQL 저장 프로시저 권한</title>
      <link>https://telecom.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;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 데이터베이스에 저장된 프로시저 수준에서 저장 프로시저를 실행할 수 있는 권한을 사용자에게 부여하려고 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음 코드를 실행하려고 했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;GRANT EXECUTE ON myDB.spName TO 'TestUser'@'localhost';
&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;br&gt;&lt;br&gt;&lt;code&gt;Illegal GRANT/REVOKE command, please consult the manual to see which privileges can be used.&lt;/code&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;GRANT EXECUTE ON PROCEDURE myDB.spName TO 'TestUser'@'localhost';
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고 다음과 같은 다른 오류가 발생합니다.&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;br&gt; &lt;code&gt;Cant find any matching rows in the user table.&lt;/code&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;제가 어디가 잘못되었는지 헷갈리네요?&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또한 MySQL Workbench에서는 GUI를 통해 저장 프로시저 레벨에서 권한을 부여할 수 있는 방법이 없는 것 같습니다.&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;/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;GRANT EXECUTE ON PROCEDURE myDB.spName TO 'TestUser'@'localhost';
&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;a) 사용자(이 모든 명령을 실행 중인 사용자)는 [WITH GRANT Option] 권한을 가집니다.&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;b) 실행 권한을 부여하는 사용자가 존재합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt; select user from mysql.user where user  like  'test%';
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그렇지 않은 경우 사용자를 만듭니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;CREATE USER 'TestUser'@'localhost' IDENTIFIED BY 'passwordxxxx';
#depending on your needs
GRANT SELECT,DELETE,UPDATE PRIVILEGES ON myDb.* TO 'TestUser'@'localhost'; 
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;13&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;도움이 되길 바라요 :)&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;MySQL Workbench 관련 질문의 다른 부분에 대한 답변을 드리자면, 저도 같은 문제가 있었습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 실험 결과 역할을 생성하고 하단의 권한 탭을 열면 루틴을 모델 개요에서 개체 상자로 끌 수 있음을 알게 되었습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;여기서 새로 추가된 개체를 클릭하고 해당 역할에 대해 원하는 권한을 추가하기만 하면 됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;도움이 되길 바라요 :)&lt;/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;strong papago-id=&quot;16-1&quot;&gt;저장 프로시저에 대한 권한&lt;/strong&gt;을 부여하는 코드를 찾았습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;USE [Database];   

GRANT EXECUTE ON OBJECT::[dbo].[your stored procedure]
    TO databaseUser; 
&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;이 페이지에서: learn.microsoft.com&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/10089308/mysql-stored-procedure-permissions&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>MySQL</category>
      <author>telecom</author>
      <guid isPermaLink="true">https://telecom.tistory.com/689</guid>
      <comments>https://telecom.tistory.com/689#entry689comment</comments>
      <pubDate>Fri, 27 Oct 2023 21:45:02 +0900</pubDate>
    </item>
    <item>
      <title>JQuery 클래스 이름별로 모든 요소 가져오기</title>
      <link>https://telecom.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;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;javscript와 jquery를 배우는 과정에서, 구글의 페이지들을 살펴보았지만 이것을 작동시킬 수 없는 것 같습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;기본적으로 저는 수업의 내부 html을 수집하려고 하는데, jquery는 일반 자바스크립트보다 제안된 것 같습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;글을 쓰다&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;지금까지의 암호는 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;div class=&quot;mbox&quot;&amp;gt;Block One&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;mbox&quot;&amp;gt;Block Two&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;mbox&quot;&amp;gt;Block Three&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;mbox&quot;&amp;gt;Block Four&amp;lt;/div&amp;gt;

&amp;lt;script&amp;gt;
var mvar = $('.mbox').html();
document.write(mvar);
&amp;lt;/script&amp;gt;
&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;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;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;한 가지 가능한 방법은 방법을 사용하는 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var all = $(&quot;.mbox&quot;).map(function() {
    return this.innerHTML;
}).get();

console.log(all.join());
&lt;/code&gt;&lt;/pre&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;a href=&quot;http://jsfiddle.net/Y4bHh/&quot; papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;http://jsfiddle.net/Y4bHh/&lt;/font&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;&lt;strong papago-id=&quot;0-0&quot;&gt;N.B.&lt;/strong&gt; 사용하지 마십시오.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;document.write&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;console.log&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;최선의 방법입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이미 게시된 솔루션만큼 깨끗하지 않거나 효율적이지 않을 수도 있지만 .ach() 함수는 어떻습니까? 예:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var mvar = &quot;&quot;;
$(&quot;.mbox&quot;).each(function() {
    console.log($(this).html());
    mvar += $(this).html();
});
console.log(mvar);
&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;em papago-id=&quot;11-3&quot;&gt;개&lt;/em&gt;의 항목 중 첫 &lt;strong papago-id=&quot;11-1&quot;&gt;&lt;em papago-id=&quot;11-1-1&quot;&gt;번째&lt;/em&gt; 항목과 직접적인 상호&lt;/strong&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;아래의 fiddle 코드: https://jsfiddle.net/c4nhpqgb/&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;3-1&quot;&gt;해당 셀렉터와 일치하는 항목이 4개&lt;/strong&gt;이므로 각각 명시적으로 처리해야 한다는 점을 분명히 말씀드리고 싶습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;eq()&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;map&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;map&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;each&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;당신이 &quot;실생활에서&quot; 사용할 수 있는 것(여기에 &lt;a href=&quot;http://api.jquery.com/eq/&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;7-1&quot;&gt;대한 jquery documents&lt;/a&gt;)입니다.&lt;/font&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;script src=&quot;//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js&quot; &amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;/head&amp;gt;

    &amp;lt;body&amp;gt;
        &amp;lt;div class=&quot;mbox&quot;&amp;gt;Block One&amp;lt;/div&amp;gt;
        &amp;lt;div class=&quot;mbox&quot;&amp;gt;Block Two&amp;lt;/div&amp;gt;
        &amp;lt;div class=&quot;mbox&quot;&amp;gt;Block Three&amp;lt;/div&amp;gt;
        &amp;lt;div class=&quot;mbox&quot;&amp;gt;Block Four&amp;lt;/div&amp;gt;

        &amp;lt;div id=&quot;outige&quot;&amp;gt;&amp;lt;/div&amp;gt;
        &amp;lt;script&amp;gt;
            // using the $ prefix to use the &quot;jQuery wrapped var&quot; convention
            var i, $mvar = $('.mbox');

            // convenience method to display unprocessed html on the same page
            function logit( string )
            {
                var text = document.createTextNode( string );
                $('#outige').append(text);
                $('#outige').append(&quot;&amp;lt;br&amp;gt;&quot;);
            }

            logit($mvar.length);

            for (i=0; i&amp;lt;$mvar.length; i++)    {
                logit($mvar.eq(i).html());
            }
        &amp;lt;/script&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; papago-id=&quot;18&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;출력처&lt;/font&gt;&lt;/font&gt;&lt;code&gt;logit&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;19&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;호출(초기 4 이후)&lt;/font&gt;&lt;/font&gt;&lt;code&gt;div&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;4
Block One
Block Two
Block Three
Block Four
&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;대체 솔루션(createElement를 고유한 요소로 대체할 수 있음)&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var mvar = $('.mbox').wrapAll(document.createElement('div')).closest('div').text();
console.log(mvar);
&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; var allvendorsList = $('.vendors').map(function () {
            return this.value;
        }).get();
&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;URL : https://stackoverflow.com/questions/16630211/jquery-get-all-elements-by-class-name&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>jQuery</category>
      <author>telecom</author>
      <guid isPermaLink="true">https://telecom.tistory.com/688</guid>
      <comments>https://telecom.tistory.com/688#entry688comment</comments>
      <pubDate>Fri, 27 Oct 2023 21:44:55 +0900</pubDate>
    </item>
    <item>
      <title>ASP.NET 코어, 권한 없는 경우 기본 리디렉션 변경</title>
      <link>https://telecom.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;ASP.NET 코어, 권한 없는 경우 기본 리디렉션 변경&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;ASP의 다른 로그인 URL로 리디렉션을 시도하는 중입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;NET MVC6&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;Route&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;url을 변경하기 위해 attribute를 지정합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;[HttpGet]
[AllowAnonymous]
[Route(&quot;login&quot;)]
public IActionResult Login(string returnUrl = null)
{
    this.ViewData[&quot;ReturnUrl&quot;] = returnUrl;
    return this.View();
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;blockquote&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;인증되지 않은 페이지에 액세스하려고 하면 잘못된 URL로 리디렉션됩니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;/login&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;하지만 대신에 나는&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&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;services.Configure&amp;lt;CookieAuthenticationOptions&amp;gt;(opt =&amp;gt;
{
    opt.LoginPath = new PathString(&quot;/login&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;모든 URL이 기본적으로 인증을 요구하도록 기본 필터를 추가했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;services.AddMvc(
    options =&amp;gt;
    {
        options.Filters.Add(new AuthorizeFilter(new AuthorizationPolicyBuilder().RequireAuthenticatedUser().Build()));
    });
&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;url을 확인했습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;/login&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;/account/login&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;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;11-0&quot;&gt;edit: &lt;/strong&gt;경로를 그대로 두었습니다. (기본 컨트롤러 및 작업 변경과 별도로)&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;app.UseMvc(routes =&amp;gt;
{
    routes.MapRoute(
      name: &quot;default&quot;,
      template: &quot;{controller=Site}/{action=Site}/{id?}&quot;);
});
&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;asp.net core 2.0&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;pre&gt;&lt;code&gt;services.ConfigureApplicationCookie(options =&amp;gt; options.LoginPath = &quot;/Account/LogIn&quot;);
&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;a href=&quot;https://learn.microsoft.com/en-us/aspnet/core/migration/1x-to-2x/identity-2x&quot; papago-id=&quot;14-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;2.0으로의 마이그레이션&lt;/a&gt;에 대한 자세한 내용은 &lt;a href=&quot;https://learn.microsoft.com/en-us/aspnet/core/migration/1x-to-2x/identity-2x&quot; papago-id=&quot;14-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;여기&lt;/a&gt;에서 확인하십시오.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;또한 2.0에서 2.1로 마이그레이션하는 &lt;a href=&quot;https://learn.microsoft.com/en-us/aspnet/core/migration/20_21?view=aspnetcore-2.1#changes-to-authentication-code&quot; papago-id=&quot;14-3&quot; rel=&quot;nofollow noreferrer&quot;&gt;방법&lt;/a&gt;에 대한 &lt;a href=&quot;https://learn.microsoft.com/en-us/aspnet/core/migration/20_21?view=aspnetcore-2.1#changes-to-authentication-code&quot; papago-id=&quot;14-3&quot; rel=&quot;nofollow noreferrer&quot;&gt;자세한 정보&lt;/a&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;최신 Asp에 대한 업데이트입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;NET 7.0, 감사 @Checkkan:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;services.AddAuthentication().AddCookie(options =&amp;gt; options.LoginPath = &quot;/Login&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;UseIdentity&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;a href=&quot;https://github.com/aspnet/Identity/blob/release/src/Microsoft.AspNetCore.Identity/BuilderExtensions.cs&quot; papago-id=&quot;17-1&quot; rel=&quot;noreferrer&quot;&gt;여기&lt;/a&gt;서 확장 방법을 사용하는 것을 알게 될 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;IdentityOptions&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;CookieAuthenticationOptions&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;12&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;, 대신에 당신은 구성해야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;IdentityOptions&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;services.Configure&amp;lt;IdentityOptions&amp;gt;(opt =&amp;gt;
{
    opt.Cookies.ApplicationCookie.LoginPath = new PathString(&quot;/login&quot;);
});
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;21&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;22&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;asp.net core 2.0의 경우: Identity cookie 옵션은 Identity 옵션에 더 이상 포함되지 않습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;mxmissile의 &lt;a href=&quot;https://stackoverflow.com/questions/42105434/asp-net-core-change-default-redirect-for-unauthorized/45922216#45922216&quot; papago-id=&quot;22-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;14&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;부터&lt;/font&gt;&lt;/font&gt;&lt;code&gt;asp.net core 2.0&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;15&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;ID가 없는 쿠키를 사용하는 경우:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;app.UseAuthentication();

// If you don't want the cookie to be automatically authenticated and assigned HttpContext.User, 
// remove the CookieAuthenticationDefaults.AuthenticationScheme parameter passed to AddAuthentication.
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
    .AddCookie(options =&amp;gt; 
    {
        options.LoginPath = &quot;/Account/LogIn&quot;;
        options.LogoutPath = &quot;/Account/LogOff&quot;;
    });
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;a href=&quot;https://learn.microsoft.com/en-us/aspnet/core/migration/1x-to-2x/identity-2x&quot; rel=&quot;noreferrer&quot; papago-id=&quot;25&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&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;StatusCodePages&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;app.UseStatusCodePages(async contextAccessor =&amp;gt; 
{
    var response = contextAccessor.HttpContext.Response;

    if (response.StatusCode == (int)HttpStatusCode.Unauthorized || 
        response.StatusCode == (int)HttpStatusCode.Forbidden)
    {
        response.Redirect(&quot;/Error/Unauthorized&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;특히 쿠키 인증 방식을 사용하는 경우에는 인증 서비스를 추가할 때 startup.cs 에서 이를 구성해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
        .AddCookie(options =&amp;gt; 
        {
            options.LoginPath = new PathString(&quot;/login&quot;);
        }); 
&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;/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.1.x 기준으로 아이덴티티는 SDK에서 스캐폴드됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;@mxmissile 답변에 공동 서명하려면 경로를 지정할 수 있습니다.&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://learn.microsoft.com/en-us/aspnet/core/security/authentication/scaffold-identity?view=aspnetcore-2.1&amp;amp;tabs=visual-studio#create-full-identity-ui-source&quot; rel=&quot;noreferrer&quot; papago-id=&quot;30-1&quot;&gt;스캐폴드 아이덴티티&lt;/a&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;실제 사례에서 Serj Sagan 솔루션을 추천하지는 않습니다.&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;ol&gt; 
 &lt;li papago-id=&quot;32&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;33&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;특정 페이지의 URL을 알고 있습니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;34&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;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;mxmissile 솔루션을 더 많이 사용하고 싶습니다.&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;개인적으로 AddMvcCore를 사용하고 있지만 면도기 보기를 사용하는 경우 AddRazorViewEngine을 추가하고 면도기 페이지를 사용하는 경우 AddRazorPages를 추가해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;        services.AddMvcCore(options =&amp;gt;
        {
            var policy = new AuthorizationPolicyBuilder()
                .RequireAuthenticatedUser()
                .Build();
            options.Filters.Add(new AuthorizeFilter(policy));
        })
        .AddRazorViewEngine()
        .AddAuthorization()
        .AddJsonFormatters();
&lt;/code&gt;&lt;/pre&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;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/42105434/asp-net-core-change-default-redirect-for-unauthorized&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>ASP.NET</category>
      <author>telecom</author>
      <guid isPermaLink="true">https://telecom.tistory.com/687</guid>
      <comments>https://telecom.tistory.com/687#entry687comment</comments>
      <pubDate>Fri, 27 Oct 2023 21:44:48 +0900</pubDate>
    </item>
    <item>
      <title>git gui'를 실행할 때 &amp;quot;Loose Object&amp;quot; 팝업을 건너뛰는 방법</title>
      <link>https://telecom.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;git gui'를 실행할 때 &quot;Loose Object&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;git gui'를 실행하면 다음과 같은 팝업이 나타납니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 리포지토리에는 현재 약 1500개의 느슨한 개체가 있습니다.&lt;/font&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;이것을 해본 적이 있는데, 느슨한 물체를 250개 정도로 줄여주지만, 그렇다고 팝업이 억제되는 것은 아닙니다.&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;현재의 워크플로우는 Perforce에서 전환할 때 'rebase'를 상당히 사용해야 하며 Perforce는 여전히 표준 SCM입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;Git가 표준 SCM이 되면 정기적인 병합을 할 것이며 느슨한 객체 문제는 크게 완화되어야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그동안 이 '도움이 되는' 팝업은 정말 사라지게 하고 싶습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;0&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;아직 아무도 답이 없었기 때문에, 저는 그 대화 상자에 나타나는 코드를 제거하는 방법을 알아보기 위해 코드를 조사했습니다.&lt;/font&gt;&lt;/font&gt;&lt;font 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;hint_gc&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;이와 동시에 2011년 말에 &lt;a href=&quot;https://github.com/gitster/git/commit/af867683345838f1adc606618e873ae4387a3c81&quot; papago-id=&quot;7-1&quot; rel=&quot;noreferrer&quot;&gt;대화&lt;/a&gt; 상자를 &lt;a href=&quot;https://github.com/gitster/git/commit/af867683345838f1adc606618e873ae4387a3c81&quot; papago-id=&quot;7-1&quot; rel=&quot;noreferrer&quot;&gt;비활성화하기 위한&lt;/a&gt; 구성 옵션이 추가되었다는 것을 알게 되었습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 변경 사항(git-gui 0.16.0의 일부)은 &lt;a href=&quot;https://github.com/gitster/git/commit/73c6b3575bc638b7096ec913bd91193707e2265d&quot; papago-id=&quot;7-3&quot; rel=&quot;noreferrer&quot;&gt;2011-12-14&lt;/a&gt;에 Git의 메인 라인에 병합되었습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&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;따라서 Git v1.7.9 이상을 사용하는 경우 다음 명령으로 경고 대화 상자를 비활성화할 수 있습니다.&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;git config --global gui.gcwarning false
&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&gt;&lt;code&gt;/lib/git-core/git-gui&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;제거합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;after 1000 hint_gc&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;선 또는 편집&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;/usr/share/git-gui/lib/database.tcl&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;hint_gc&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;프로시저(procedure).&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; (이러한 파일 경로는 Cygwin에 있습니다. - 다른 환경에서는 파일이 다른 파일 경로는 Cygwin에 있습니다.&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;c:\Program Files\Git\mingw64\libexec\git-core\git-gui.tcl&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&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;15&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;업데이트: 문제를 &quot;해결&quot;하여 느슨한 물체를 제거합니다.&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;16&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(&lt;a href=&quot;http://linux.die.net/man/1/git-gc&quot; papago-id=&quot;16-1&quot; rel=&quot;noreferrer&quot;&gt;&lt;code papago-id=&quot;16-1-0&quot;&gt;git gc&lt;/code&gt;&lt;/a&gt;호출)&lt;/font&gt;&lt;/font&gt;&lt;code&gt;git prune&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;, 기본적으로 2주 이상 된 느슨한 개체에 대해서만 해당됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;18&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 &lt;a href=&quot;https://stackoverflow.com/users/75204/michael-donohue&quot; papago-id=&quot;18-1&quot;&gt;OP Michael Donohue&lt;/a&gt;가 논평에서 언급한 바와 같이:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&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;저는 2주 동안 느슨한 물체를 주변에 유지하는 안전 측면이 마음에 듭니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 다시 돌아가서 오래된 개정판을 살펴봐야 해서 이 해결책이 마음에 들지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;br&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;git의 크기나 성능에 문제가 있는 것은 아니며, 데이터베이스를 압축해도 효과가 없을 것이라고 주장하는 것은 'git gui'일 뿐입니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;hr&gt; 
&lt;p papago-id=&quot;21&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;원래 답변:&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;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;&quot;&quot;의 .&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;git gc&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;23&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&quot; 모든 &lt;em papago-id=&quot;23-1&quot;&gt;느슨한&lt;/em&gt; 물체를 제거하지 않는 것은 이전에 보고된 적이 있습니다. (2008년 말, &lt;a href=&quot;http://kerneltrap.org/mailarchive/git/2008/12/15/4419874&quot; papago-id=&quot;23-3&quot; rel=&quot;noreferrer&quot;&gt;&quot;&quot;&quot;&lt;code papago-id=&quot;23-3-1&quot;&gt;git gc&lt;/code&gt;&lt;/a&gt;는 더 &lt;a href=&quot;http://kerneltrap.org/mailarchive/git/2008/12/15/4419874&quot; papago-id=&quot;23-3&quot; rel=&quot;noreferrer&quot;&gt;이상 느슨한&lt;/a&gt; 물체를 &lt;a href=&quot;http://kerneltrap.org/mailarchive/git/2008/12/15/4419874&quot; papago-id=&quot;23-3&quot; rel=&quot;noreferrer&quot;&gt;제거&lt;/a&gt;하지 않는 것 &lt;a href=&quot;http://kerneltrap.org/mailarchive/git/2008/12/15/4419874&quot; papago-id=&quot;23-3&quot; rel=&quot;noreferrer&quot;&gt;같습니다&lt;/a&gt;.&quot;)&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;code&gt;git gc&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;2주 이상 된 느슨한 개체만 제거합니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 지금 제거하려면 git prune을 실행합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;17&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font 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;그러나 실행할 때 다른 git 프로세스가 활성화되지 않거나 무언가를 밟을 수 있는지 확인합니다.&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;18&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&quot;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;git gc&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;27&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&quot; 에 도달할 수 없게 되어 현재 팩 중인 개체의 &lt;strong papago-id=&quot;27-1&quot;&gt;포장&lt;/strong&gt;을 해제합니다.&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;28&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;결과적으로 git 저장소에서 사용하는 디스크 공간의 양은 실제로 다음과 같이 크게 &lt;strong papago-id=&quot;28-1&quot;&gt;증가&lt;/strong&gt;할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;git gc&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;&quot; 작업은 파일 시스템에서 거의 완전한 상태로 실행되는 사람에게는 놀랄 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 추적 저장소에서 여러 분기를 삭제한 다음 &quot;를 수행합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;git gc&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;22&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&quot; 매우 불쾌한 놀라움을 느낄지도 모릅니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
 &lt;p&gt;&lt;code&gt;[&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;23&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font 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;]&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;next-20081204&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;br&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;26&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;의 로컬 복사본을 업데이트하는 경우&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;linux-next&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;br&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;28&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그런 다음 전체 시리즈를 삭제하고 실행하면&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;git-gc&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;29&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;, 작업에 상당한 시간이 소요될 것이며, 사용되는 블록과 아이노드의 수가 크게 증가할 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;30&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그들은 a 후에 사라질 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;git prune&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;&quot;, 하지만 제가 이 가사 작업을 할 때, 저는 종종 그들에게&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;--yes-I-know-what-I-am-doing-and-it's-unsafe-but-just-drop-the-unreachable-objects-cause-this-is-just-a-tracking-repository&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;gitgc 옵션을 선택합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&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;그래서 당신의 경우에는, &quot;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;git prune&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;&quot; 도움이 됩니까?&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;35&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(possibly에서 &quot;now&quot;를 사용하는 경우)&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;gc.pruneexpire&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;config variable, 위 동작을 수행하는 데 필요합니다).&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;hr&gt; 
&lt;p papago-id=&quot;45&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(동일한 스레드에서) 다음도 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;repack -a -d -l
&lt;/code&gt;&lt;/pre&gt; 
&lt;blockquote&gt; 
 &lt;p papago-id=&quot;46&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;소문자 'a'에 주목합니다.&lt;/font&gt;&lt;/p&gt; 
 &lt;p&gt;&lt;code&gt;git-gc&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 class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;호출은 도달할 수 없는 개체의 압축을 푸는 원인이 되는 대문자 'A'로 리팩합니다.&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;작은 'a'는 자신이 무엇을 하고 있는지 알고 도달할 수 없는 물체를 떨어뜨리기를 원하는 사람들을 위한 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt;&lt;p papago-id=&quot;48&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&quot;Loose Object&quot; 팝업이 뜨면 git의 가비지 컬렉터를 실행할 시간임을 알 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;git gc
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;38&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font 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;br&gt; &lt;font papago-translate=&quot;translated&quot; papago-id=&quot;50&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;50-0&quot;&gt;업데이트:&lt;/strong&gt; (T.E.D.의 제안으로 인해)&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;br&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;git/share/git-gui/lib/database.tcl&lt;/code&gt; &lt;br&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 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;proc hint_gc {} {
    set object_limit 8
    if {[is_Windows]} {
        set object_limit 1
    }

    set objects_current [llength [glob \
        -directory [gitdir objects 42] \
        -nocomplain \
        -tails \
        -- \
        *]]

    if {$objects_current &amp;gt;= $object_limit} {
        set objects_current [expr {$objects_current * 256}]
        set object_limit    [expr {$object_limit    * 256}]
        if {[ask_popup \
            [mc &quot;This repository currently has approximately %i loose objects.

To maintain optimal performance it is strongly recommended that you compress the database when more than %i loose objects exist.

Compress the database now?&quot; $objects_current $object_limit]] eq yes} {
            do_gc
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;53&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;음..&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://www.kernel.org/pub/software/scm/git/docs/git-gui.html&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;53-1&quot;&gt;문서&lt;/a&gt;에는 그런 것에 대한 명령 줄 논쟁이 보이지 않습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;54&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;당신은 언제든지 소스를 풀 수 있고, 대화를 위한 코드를 꺼내서 리빌드 할 수 있다고 생각합니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;55&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;답변 및 설명에 추가하기&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;56&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;느슨한 개체를 계속 모니터링하되 팝업이 완전히 사라지지 않도록 하려면(큰 프로젝트의 경우 항상 팝업이 표시됨) 다음 폴더에 있는 database.tcl을 수정할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;57&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;C:\Program Files\Git\mingw64\share\git-gui\lib\&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;함수 procint_gc {}에서&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;proc hint_gc {} {

set ndirs 1
set limit 8
if {[is_Windows]} {
    set ndirs 8
    set limit 1
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;59&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;변경할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;set ndirs 8
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;60&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;로.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;set ndirs 32
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;61&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를들면.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;62&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/1106529/how-to-skip-loose-object-popup-when-running-git-gui&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>git</category>
      <author>telecom</author>
      <guid isPermaLink="true">https://telecom.tistory.com/686</guid>
      <comments>https://telecom.tistory.com/686#entry686comment</comments>
      <pubDate>Fri, 27 Oct 2023 21:44:40 +0900</pubDate>
    </item>
    <item>
      <title>배열에서 사전 증분 대 사후 증분</title>
      <link>https://telecom.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;배열에서 사전 증분 대 사후 증분&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 프로그래밍을 배우고 있고 C언어부터 시작했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;Let's C book을 읽고 있었습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 그 책에서 이 프로그램을 경험하고 있었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;main( ) 
{ 
 int a[5] = { 5, 1, 15, 20, 25 } ; 
 int i, j, k = 1, m ; 
 i = ++a[1] ; 
 j = a[1]++ ; 
 m = a[i++] ; 
 printf ( &quot;\n%d %d %d&quot;, i, j, m ) ; 
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;0&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;제가 알기로는 인쇄가 될 겁니다&lt;/font&gt;&lt;/font&gt;&lt;code&gt;i as 2&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;j as 1&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;m as 15&lt;/code&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;i as 3&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;j as 2&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;m as 15&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;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;b = x++;
In this example suppose the value of variable ‘x’ is 5 then value of variable ‘b’ will be 5 because old value of ‘x’ is used.

b = ++y;
In this example suppose the value of variable ‘y’ is 5 then value of variable ‘b’ will be 6 because the value of ‘y’ gets modified before using it in a expression.
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;제가 이해하는 데 잘못된 점이 있습니까?&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;당신은 정곡을 찌르고 말았습니다.&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;pre&gt;&lt;code&gt;b = x++;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;는 정말로:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;b = x;
x++;
&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;b = ++x;
&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;x++;
b = x;
&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;i = ++a[1];
&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;즉, a[1]에 저장된 값을 증가시킨 다음 변수 i로 설정합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;m = a[i++];
&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;이 값은 m을 a[i] 값으로 설정한 다음 i를 증분합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그 둘 사이의 차이는 꽤 큰 차이이고 처음에는 혼동될 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;두 번째 EDIT : 코드의 파괴&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;{ 
 int a[5] = { 5, 1, 15, 20, 25 } ; 
 int i, j, k = 1, m ; 
 i = ++a[1] ; 
 j = a[1]++ ; 
 m = a[i++] ; 
 printf ( &quot;\n%d %d %d&quot;, i, j, m ) ; 
}
&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;i = ++a[1];
&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;이 시점에서 우리는 a[1] = 1(remember 배열은 색인화되지 않음)을 알고 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;하지만 우리는 그것을 먼저 늘립니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;따라서 i = 2.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;j = a[1]++;
&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;이전에 a[1]을 증가시켰기 때문에 현재는 2입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;j = 2로 설정한 다음 3으로 증가시켰습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그래서 j = 2이고 이제 a[1] = 3입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;m = a[i++];
&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;우리는 i = 2를 알고 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;따라서 m = a[2]를 설정한 다음 i를 증분해야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 식의 끝에서 m = 15, i = 3.&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;i = 3, j = 2, m = 15.
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;24&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;당신의 이해는 정확하지 않습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;사전 증가 연산자와 사후 증가 연산자는 단항 연산자입니다.&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;따라서 처음에 b = 5이면 ++b 또는 b++는 b의 값을 6으로 증가시킵니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 사전과 사후의 차이는 할당 연산자 &quot;=&quot;를 사용할 때 나타납니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;26&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그렇게,&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;if b=5
a=b++ // after this statement a=5 and b=6 as it is post increment
c=++b // after this statement c=7 and b=7
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;27&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이해를 돕기 위해 위 문장을 다음과 같이 나눌 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;a=b;  
b=b+1; //post increment  
b=b+1; //pre increment  
c=b;`  
&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;main( )    
{      
 int a[5] = { 5, 1, 15, 20, 25 } ;     
 int i, j, k = 1, m ;  
 i = ++a[1] ; // a[1] = 2 and i = 2  
 j = a[1]++ ; // j = 2 and a[1] = 3  
 m = a[i++] ; // m = a[2++] = 15, i now becomes 3  
 printf ( &quot;\n%d %d %d&quot;, i, j, m ) ; // so i =3, j= 2 and m =15  
}
&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;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;main( )    
{      
 int a[5] = { 5, 1, 15, 20, 25 } ;     
 int i, j, k = 1, m ;
 a[1] = a[1] + 1;  
 i = a[1];  
 j = a[1];  
 a[1] = a[1] + 1;  
 m = a[i]; // m = a[2] = 15  
 i = i + 1;  
 printf ( &quot;\n%d %d %d&quot;, i, j, m ) ; // so i =3, j= 2 and m =15  
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;30&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;위의 설명을 통해 당신의 의심과 당신이 실행하고 있는 프로그램의 출력이 해소되기를 바랍니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;strong papago-id=&quot;31&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;설명:&lt;/font&gt;&lt;/strong&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;strong papago-id=&quot;32-0&quot;&gt;1단계:&lt;/strong&gt; inta[5] &lt;strong papago-id=&quot;32-0&quot;&gt;=&lt;/strong&gt; {5, 1, 15, 20, 25}; 변수 배열은 크기가 5인 정수 배열로 선언되고 a[0] &lt;strong papago-id=&quot;32-0&quot;&gt;=&lt;/strong&gt; 5, a[1] &lt;strong papago-id=&quot;32-0&quot;&gt;=&lt;/strong&gt; 1, a[2] &lt;strong papago-id=&quot;32-0&quot;&gt;=&lt;/strong&gt; 15, a[3] &lt;strong papago-id=&quot;32-0&quot;&gt;=&lt;/strong&gt; 20, a[4] &lt;strong papago-id=&quot;32-0&quot;&gt;=&lt;/strong&gt; 25로 초기화됩니다.&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;strong papago-id=&quot;33-0&quot;&gt;2단계:&lt;/strong&gt; inti, j, m; 변수 i,j,m을 정수형으로 선언합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;34&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;34-0&quot;&gt;단계&lt;/strong&gt; 3&lt;strong papago-id=&quot;34-0&quot;&gt;:&lt;/strong&gt; i &lt;strong papago-id=&quot;34-0&quot;&gt;=&lt;/strong&gt; ++a[1]; i &lt;strong papago-id=&quot;34-0&quot;&gt;=&lt;/strong&gt; ++1이 되고, 따라서 i &lt;strong papago-id=&quot;34-0&quot;&gt;=&lt;/strong&gt; 2 및 a[1] &lt;strong papago-id=&quot;34-0&quot;&gt;=&lt;/strong&gt; 2&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;strong papago-id=&quot;35-0&quot;&gt;4단계:&lt;/strong&gt; j &lt;strong papago-id=&quot;35-0&quot;&gt;=&lt;/strong&gt; a[1]++; j &lt;strong papago-id=&quot;35-0&quot;&gt;=&lt;/strong&gt; 2++가 되고; 따라서 j &lt;strong papago-id=&quot;35-0&quot;&gt;=&lt;/strong&gt; 2, a[1] &lt;strong papago-id=&quot;35-0&quot;&gt;=&lt;/strong&gt; 3이 됩니다.&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;strong papago-id=&quot;36-0&quot;&gt;단계&lt;/strong&gt; 5&lt;strong papago-id=&quot;36-0&quot;&gt;:&lt;/strong&gt; m &lt;strong papago-id=&quot;36-0&quot;&gt;=&lt;/strong&gt; a[i++]; m &lt;strong papago-id=&quot;36-0&quot;&gt;=&lt;/strong&gt; a[2];&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;따라서 m = 15이고 i는 1만큼 증가합니다(i++는 2++를 의미하므로 i=3).&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;37&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;37-0&quot;&gt;6단계:&lt;/strong&gt; printf(&quot;%d, %d, %d&quot;, i, j, m); 변수 i, j, m의 값을 인쇄합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;38&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;따라서 프로그램의 출력은 3,2,15 입니다.&lt;/font&gt;&lt;/strong&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/16869020/pre-increment-vs-post-increment-in-array&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>C</category>
      <author>telecom</author>
      <guid isPermaLink="true">https://telecom.tistory.com/685</guid>
      <comments>https://telecom.tistory.com/685#entry685comment</comments>
      <pubDate>Fri, 27 Oct 2023 21:44:32 +0900</pubDate>
    </item>
    <item>
      <title>첫째 아이로 요소를 삽입하는 방법은?</title>
      <link>https://telecom.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;첫째 아이로 요소를 삽입하는 방법은?&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를 사용하여 div를 첫 번째 요소로 추가합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;div id='parent-div'&amp;gt;
    &amp;lt;!--insert element as a first child here ...--&amp;gt;

    &amp;lt;div class='child-div'&amp;gt;some text&amp;lt;/div&amp;gt;
    &amp;lt;div class='child-div'&amp;gt;some text&amp;lt;/div&amp;gt;
    &amp;lt;div class='child-div'&amp;gt;some text&amp;lt;/div&amp;gt;

&amp;lt;/div&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;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;$(&quot;#parent-div&quot;).prepend(&quot;&amp;lt;div class='child-div'&amp;gt;some text&amp;lt;/div&amp;gt;&quot;);
&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;/p&gt;
&lt;div class=&quot;snippet&quot; data-lang=&quot;js&quot; data-hide=&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 i = 0;
$(document).ready(function () {
    $('.add').on('click', function (event) {
        var html = &quot;&amp;lt;div class='child-div'&amp;gt;some text &quot; + i++ + &quot;&amp;lt;/div&amp;gt;&quot;;
        $(&quot;#parent-div&quot;).prepend(html);
    });
});&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/1.11.1/jquery.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;

&amp;lt;div id=&quot;parent-div&quot;&amp;gt;
    &amp;lt;div&amp;gt;Hello World&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;input type=&quot;button&quot; value=&quot;add&quot; class=&quot;add&quot; /&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;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;@vabhatia가 말한 것을 확장하면, 이것이 (JQuery 없이) 네이티브 자바스크립트로 원하는 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;ParentNode.insertBefore(&amp;lt;your element&amp;gt;, ParentNode.firstChild);&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;$(&quot;&amp;lt;p&amp;gt;Test&amp;lt;/p&amp;gt;&quot;).prependTo(&quot;.inner&quot;);&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;jquery.com 에서 .&lt;a href=&quot;https://api.jquery.com/prependTo/&quot; papago-id=&quot;1-1&quot; rel=&quot;noreferrer&quot;&gt; &lt;/a&gt;prep&lt;a href=&quot;https://api.jquery.com/prependTo/&quot; papago-id=&quot;1-1&quot; rel=&quot;noreferrer&quot;&gt;end&lt;/a&gt; 설명서를 확인하십시오.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;parentNode.insertBefore(newChild, refChild)
&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;기존 자식 노드 refChild 이전에 newChild 노드를 parentNode의 자식으로 삽입합니다. (NewChild를 반환합니다.)&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;refChild가 null이면 child 목록 끝에 newChild가 추가됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;parentNode.appendChild(newChild)와 동일하게 보다 쉽게 사용할 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;parentElement.prepend(newFirstChild);
&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;ES7에 새로 추가된 기능입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;지금은 jQuery에서 인기가 많아서인지 바닐라 JS입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;현재 크롬, FF, 오페라에서 이용 가능합니다.&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;P.S. 당신은 직접 문자열을 붙일 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;parentElement.prepend('This text!');
&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;링크: developer.mozilla.org - 폴리필&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;p&gt;&lt;code&gt;&amp;lt;div class=&quot;outer&quot;&amp;gt;Outer Text &amp;lt;div class=&quot;inner&quot;&amp;gt; Inner Text&amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt;&lt;/code&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;code&gt;$(document).ready(function(){ $('.inner').prepend('&amp;lt;div class=&quot;middle&quot;&amp;gt;New Text Middle&amp;lt;/div&amp;gt;'); });&lt;/code&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;$('.parent-div').children(':first').before(&quot;&amp;lt;div class='child-div'&amp;gt;some text&amp;lt;/div&amp;gt;&quot;);
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;$(&quot;.child-div div:first&quot;).before(&quot;Your div code or some text&quot;);&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;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/4527911/how-to-insert-element-as-a-first-child&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>jQuery</category>
      <author>telecom</author>
      <guid isPermaLink="true">https://telecom.tistory.com/684</guid>
      <comments>https://telecom.tistory.com/684#entry684comment</comments>
      <pubDate>Fri, 27 Oct 2023 21:44:24 +0900</pubDate>
    </item>
    <item>
      <title>PowerShell에서 &amp;quot;배치 작업 종료(Y/N)&amp;quot; 확인을 억제하려면 어떻게 해야 합니까?</title>
      <link>https://telecom.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;PowerShell에서 &quot;배치 작업 종료(Y/N)&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;PowerShell에서 +&lt;kbd papago-id=&quot;1-3&quot;&gt;C&lt;/kbd&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;배치 작업 종료(Y/N)?&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;Windows PowerShell을 제외하고는 https://superuser.com/questions/35698/how-to-supress-terminate-batch-job-y-n-confirmation, 과 유사합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;PowerShell은 배치 작업에 대해 CMD가 수행하는 것보다 더 많은 제어 기능을 제공합니까?&lt;/font&gt;&lt;/strong&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;tl;dr&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;p papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;문제의 &lt;strong papago-id=&quot;6-1&quot;&gt;원인&lt;/strong&gt;은 (및 이 메시지를 보여주는 다른 명령어) 실제로 &lt;strong papago-id=&quot;6-5&quot;&gt;&lt;em papago-id=&quot;6-5-0&quot;&gt;배치 파일&lt;/em&gt;&lt;/strong&gt;(,&lt;strong papago-id=&quot;6-5&quot;&gt; )&lt;code papago-id=&quot;6-5-2&quot;&gt;*.cmd&lt;/code&gt;&lt;/strong&gt;이며 &lt;strong papago-id=&quot;6-7&quot;&gt;동작&lt;/strong&gt;은 배치 파일의 인터프리터인 에 &lt;strong papago-id=&quot;6-7&quot;&gt;&lt;em papago-id=&quot;6-7-1&quot;&gt;내장&lt;/em&gt;&lt;/strong&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;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;패키지 관리자는 &lt;em papago-id=&quot;7-1&quot;&gt;PowerShell&lt;/em&gt; 스크립트를 점점 더 많이 제공하고 있습니다(&lt;/font&gt;&lt;/font&gt;&lt;code&gt;*.ps1&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; PowerShell에서 실행할 때 문제를 우회합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; &lt;/li&gt; 
&lt;/ul&gt; 
&lt;hr&gt; 
&lt;p papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 &lt;strong papago-id=&quot;9-1&quot;&gt;동작은 PowerShell에 의해 발생하지도 않고 PowerShell이 이를 변경할 수&lt;/strong&gt;도 없습니다(&lt;a href=&quot;https://github.com/PowerShell/PowerShell/search?q=Terminate+batch+job&amp;amp;unscoped_q=Terminate+batch+job&amp;amp;type=Code&quot; papago-id=&quot;9-3&quot; rel=&quot;nofollow noreferrer&quot;&gt;PowerShell&lt;/a&gt; 소스 &lt;a href=&quot;https://github.com/PowerShell/PowerShell/search?q=Terminate+batch+job&amp;amp;unscoped_q=Terminate+batch+job&amp;amp;type=Code&quot; papago-id=&quot;9-3&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; papago-id=&quot;10&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;10-1&quot;&gt;이&lt;/strong&gt; &lt;strong papago-id=&quot;10-1&quot;&gt;&lt;em papago-id=&quot;10-1-1&quot;&gt;동작은 기본적&lt;/em&gt;&lt;/strong&gt;으로 내장되어 있습니다. 이 경우 파워셸은 다음과 같이 부릅니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;.cmd&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;파일(batch 파일), 이는 다음과 같습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;cmd.exe&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;ul&gt; 
 &lt;li&gt;&lt;p papago-id=&quot;13&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;13-0&quot;&gt;대상 실행&lt;/strong&gt; 파일의 &lt;strong papago-id=&quot;13-0&quot;&gt;호출을 명시적으로 제어하는 경우 Powershell로 이동&lt;/strong&gt;하여 이 &lt;strong papago-id=&quot;13-0&quot;&gt;문제를 해결&lt;/strong&gt;할 수 &lt;strong papago-id=&quot;13-0&quot;&gt;있습니다.&lt;/strong&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;14&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;14-0&quot;&gt;대상 실행&lt;/strong&gt; 파일의 &lt;strong papago-id=&quot;14-0&quot;&gt;호출을 명시적으로 제어하지 않으면 운이 없습니다(&lt;/strong&gt;제3자를 설치할 의향이 없는 한).&lt;/font&gt;&lt;/font&gt;&lt;code&gt;cmd.exe&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;15&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;replacements)를 두 번 &lt;strong papago-id=&quot;15-1&quot;&gt;&lt;em papago-id=&quot;15-1-3&quot;&gt;눌러야&lt;/em&gt;&lt;/strong&gt; 실행이 종료됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;p papago-id=&quot;16&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;16-0&quot;&gt;[잘못된]&lt;/strong&gt; &lt;strong papago-id=&quot;16-0&quot;&gt;&lt;em papago-id=&quot;16-0-1&quot;&gt;해결&lt;/em&gt;&lt;/strong&gt; &lt;strong papago-id=&quot;16-0&quot;&gt;방법&lt;/strong&gt;은 &lt;strong papago-id=&quot;16-0&quot;&gt;&lt;em papago-id=&quot;16-0-3&quot;&gt;바이너리&lt;/em&gt;&lt;/strong&gt;를 &lt;strong papago-id=&quot;16-0&quot;&gt;&lt;em papago-id=&quot;16-0-3&quot;&gt;수정&lt;/em&gt;&lt;/strong&gt;하는 &lt;strong papago-id=&quot;16-0&quot;&gt;것&lt;/strong&gt;입니다. &lt;a href=&quot;https://itsme.home.xs4all.nl/projects/misc/patching-cmdexe.html&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;16-2&quot;&gt;프롬프트를 억제하기 위해 실행 파일을 패치하는 방법에 대한 지침이 있는 문서&lt;/a&gt;를 참조하십시오.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;또한 &lt;a href=&quot;https://github.com/Microsoft/console&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;16-4&quot;&gt;GitHub&lt;/a&gt;에 기능 요청을 게시하여 소스에서 이 동작을 수정할 것을 요청할 수 있지만 하위 호환성 때문에 발생할 가능성은 없습니다.&lt;/font&gt;&lt;/p&gt; &lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2 papago-id=&quot;17&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;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;예제에서는 Node.js가 설치되어 있고&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;node.exe&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;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;먼저 호출합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;node.exe&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;21&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;프로세스를 종료하려면 를 눌러야 하는 엄격한 루프와 함께 직접적으로.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-bash prettyprint-override&quot;&gt;&lt;code&gt;PS&amp;gt; node -e &quot;while (true);&quot;
&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;em papago-id=&quot;22-3&quot;&gt;즉시&lt;/em&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 class=&quot;lang-bash prettyprint-override&quot;&gt;&lt;code&gt;PS&amp;gt; &quot;@echo off`nnode -e `&quot;while (true);`&quot;&quot; | Set-Content test.cmd
PS&amp;gt; ./test.cmd
&lt;/code&gt;&lt;/pre&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;Terminate batch job (Y/N)?&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 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;cmd.exe&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;h2&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;14&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그것을 증명하기 위해서는&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;gulp&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;15&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;ㅇ&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;.cmd&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; 파일:h)일:&lt;/font&gt;&lt;/font&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;의 CLI를 통해 명령을 실행하고 있다고 말합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;31&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;31-0&quot;&gt;Windows에서 CLI의 시작 지점은 [&lt;em papago-id=&quot;31-0-5&quot;&gt;아래 섹션의 업데이트 참조&lt;/em&gt;]입니다. 즉, &lt;em papago-id=&quot;31-0-7&quot;&gt;배치 파일&lt;/em&gt;입니다.&lt;/strong&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그것이 일반적으로 작동하는 방식입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;npm&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;JS 파일 또는 셸 스크립트로 구현된 패키지 &quot;binary&quot; (실행 파일).&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;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;gulp&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;gulp.cmd&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;pre class=&quot;lang-bash prettyprint-override&quot;&gt;&lt;code&gt;# Execute from a project folder that has `gulp` installed as a dependency.
# If `gulp` is installed *globally* 
# Note: CLI `npx` requires npm version 5.2.0+
PS C:\some\NodeJs\project&amp;gt; npx where gulp
&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;pre class=&quot;lang-bash prettyprint-override&quot;&gt;&lt;code&gt;C:\some\NodeJs\project\node_modules\.bin\gulp
C:\some\NodeJs\project\node_modules\.bin\gulp.cmd
&lt;/code&gt;&lt;/pre&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&gt;&lt;code&gt;where.exe&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;em papago-id=&quot;38-1&quot;&gt;Unix-shell&lt;/em&gt;&lt;em papago-id=&quot;38-2&quot;&gt;&lt;/em&gt; 스크립트도 나와 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;...\gulp&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;cmd.exe&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;...\gulp.cmd&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;41&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;- 실행되는 &lt;em papago-id=&quot;41-1&quot;&gt;배치 파일&lt;/em&gt;입니다.&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;27&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(의심스러운 경우 다음과 같은 명령을 내립니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;@set /p dummy=&quot;Press a key&quot;&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;gulp.cmd&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;gulp&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;.cmd&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;br&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;47&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;em papago-id=&quot;47-1&quot;&gt;또한&lt;/em&gt; 없음을 유의하십시오.&lt;/font&gt;&lt;/font&gt; &lt;code&gt;gulp.exe&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;33&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.)&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;34&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;일반적으로 Windows(윈도우)에서는 프로젝트의&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;node_modules\.bin&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;50&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;하위 폴더에는 프로젝트가 로컬로 종속되는 패키지와 함께 제공되는 CLI의 CLI 진입점 &lt;em papago-id=&quot;50-1&quot;&gt;쌍&lt;/em&gt;이 들어 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;code&gt;node_modules\.bin\&amp;lt;some-cli&amp;gt;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;51&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;는 유닉스 셸 스크립트입니다(인터프리터 실행은 해당 &lt;a href=&quot;https://stackoverflow.com/a/33510581/45375&quot; papago-id=&quot;51-1&quot;&gt;shebang 라인&lt;/a&gt;을 통해 제어됨).&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;node_modules\.bin\&amp;lt;some-cli&amp;gt;.cmd&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;em papago-id=&quot;52-1&quot;&gt;Windows용&lt;/em&gt; 도우미 배치 파일입니다.&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;hr&gt; 
&lt;h3 papago-id=&quot;53&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;54&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;npm 모듈의 경우 &lt;em papago-id=&quot;54-1&quot;&gt;PowerShell&lt;/em&gt; 스크립트를 사용하면 문제가 사라집니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;*.ps1&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;)는 Windows에서 도우미 스크립트로 사용되었습니다.&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;npm&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;40&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;,&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;yarn&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;41&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font 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;ul&gt; 
 &lt;li&gt;&lt;p&gt;&lt;code&gt;*.ps1&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;PowerShell 외부에서 파일을 직접 실행할 수 없습니다. 특히,&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;cmd.exe&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 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;44&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;PowerShell이 아직 완전히 교체되지 않았습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;cmd.exe&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;윈도우 10 기준으로 기본 셸로 사용할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; &lt;/li&gt; 
&lt;/ul&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;strong papago-id=&quot;62-1&quot;&gt;&lt;em papago-id=&quot;62-1-0&quot;&gt;PowerShell에서 호출&lt;/em&gt;&lt;/strong&gt;하면&lt;strong papago-id=&quot;62-1&quot;&gt; 파일이 발견되어 프로세스&lt;/strong&gt; 중에 &lt;strong papago-id=&quot;62-1&quot;&gt;실행&lt;/strong&gt;되므로 &lt;strong papago-id=&quot;62-3&quot;&gt;프로젝트에서 헬퍼 스크립트를 제공하는 것이 가능&lt;/strong&gt;하며, 이는 다음보다 우선합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;*.cmd&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;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;51&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;51-0&quot;&gt;업데이트&lt;/strong&gt;:&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;  &lt;/font&gt;&lt;/font&gt;&lt;ul&gt; 
   &lt;li&gt;&lt;strong&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;npm&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;font class=&quot;papago-parent&quot;&gt;(6.14.10에서 확인) 실제로 다음을 설치해야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;*.ps1&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;/strong&gt;&lt;/li&gt; 
   &lt;li papago-id=&quot;67&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;대체 패키지 관리자는&lt;strong papago-id=&quot;67-1&quot;&gt; &lt;em papago-id=&quot;67-1-2&quot;&gt;v2가&lt;/em&gt;&lt;/strong&gt; &lt;strong papago-id=&quot;67-1&quot;&gt;배치 파일&lt;/strong&gt;을 더 &lt;strong papago-id=&quot;67-1&quot;&gt;이상 사용하지 않는&lt;/strong&gt; 것 &lt;strong papago-id=&quot;67-1&quot;&gt;같기 때문에 원래 문제는 여기&lt;/strong&gt;서 &lt;strong papago-id=&quot;67-1&quot;&gt;&lt;em papago-id=&quot;67-1-4&quot;&gt;무시&lt;/em&gt;&lt;/strong&gt;됩니다.(반면 &lt;em papago-id=&quot;67-3&quot;&gt;v1&lt;/em&gt;은 배치 파일만 사용합니다. v1에서 업그레이드하려면 &lt;em papago-id=&quot;67-5&quot;&gt;프로젝트별&lt;/em&gt;로 업그레이드해야 합니다. &lt;a href=&quot;https://yarnpkg.com/getting-started/migration&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;67-7&quot;&gt;마이그레이션 지침&lt;/a&gt; 참조).&lt;/font&gt;&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
&lt;/ul&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;52&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다른 답변에서도 알 수 있듯이, 올바른 &lt;strong papago-id=&quot;52-1&quot;&gt;수정&lt;/strong&gt;은 다음을 대체하는 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;cmd&lt;/code&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;ps1&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;/p&gt; 
&lt;p papago-id=&quot;72&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 하이퍼 셸 사용자가 해결할 수 있는 또 다른 &lt;strong papago-id=&quot;72-1&quot;&gt;방법&lt;/strong&gt;은 '&lt;a href=&quot;https://hyper.is/store/hyper-yes&quot; papago-id=&quot;72-3&quot; rel=&quot;nofollow noreferrer&quot;&gt;Hyperyes'인데,&lt;/a&gt; 이 플러그인은 &lt;a href=&quot;https://hyper.is/store/hyper-yes&quot; papago-id=&quot;72-3&quot; rel=&quot;nofollow noreferrer&quot;&gt;프롬프트&lt;/a&gt;가 뜨면 &lt;a href=&quot;https://hyper.is/store/hyper-yes&quot; papago-id=&quot;72-3&quot; rel=&quot;nofollow noreferrer&quot;&gt;자동으로 해당 플러그인&lt;/a&gt;이 표시됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://i.stack.imgur.com/amxA5.gif&quot; rel=&quot;nofollow noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/amxA5.gif&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;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;code&gt;npm run devStart&lt;/code&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;nodemon ./server.js localhost 3000&lt;/code&gt; &lt;font papago-translate=&quot;splited&quot;&gt;&lt;a href=&quot;https://i.stack.imgur.com/bwXgF.png&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;57&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이렇게 보이는군요.&lt;/font&gt;&lt;/font&gt;&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;76&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;배치 작업 종료(Y/N) 후 &lt;strong papago-id=&quot;76-1&quot;&gt;Ctr-c를 다시&lt;/strong&gt; 누릅니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;77&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;13년 전까지만 해도 이것은 https://superuser.com/questions/35698/how-to-supress-terminate-batch-job-y-n-confirmation 에서 세 번째로 좋은 답변이었습니다. (왜 세 번째입니까?)&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;78&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(이 짜증나는 메세지를 없애려다 다시 찾은것 뿐입니다)&lt;/font&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;@echo off
start /w &quot;&quot; &quot;C:\myfile.bat&quot; 2&amp;gt;nul|findstr /i &quot;termin&quot;

if errorlevel 1 goto bypass


:bypass

echo hello

timeout /t 5 &amp;gt;nul
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;79&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/39085380/how-can-i-suppress-terminate-batch-job-y-n-confirmation-in-powershell&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>PowerShell</category>
      <author>telecom</author>
      <guid isPermaLink="true">https://telecom.tistory.com/683</guid>
      <comments>https://telecom.tistory.com/683#entry683comment</comments>
      <pubDate>Fri, 27 Oct 2023 21:44:18 +0900</pubDate>
    </item>
    <item>
      <title>Python+를 사용하여 MySQL 데이터베이스를 연결하는 방법원격으로 SQL Lchemy?</title>
      <link>https://telecom.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;Python+를 사용하여 MySQL 데이터베이스를 연결하는 방법&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;원격으로 SQL Lchemy?&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;원격으로 MySQL에 접속하는 데 어려움을 겪고 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;SSH 터널을 사용하며 Python+SQ를 사용하여 데이터베이스 MySQL을 연결하고자 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;LA케미.&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;콘솔에서 MySQL-client를 사용하고 &quot;를 지정할 때&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ptotocol=TCP&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&quot;, 그럼 다 괜찮아요!&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;명령어 사용:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;mysql -h localhost —protocol=TCP -u USER -p
&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;SSH 터널을 통해 원격 데이터베이스에 접근할 수 있습니다.&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;그러나 Python+를 사용하여 데이터베이스에 연결하고자 할 때&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;SQLAchemy 다음과 같은 옵션을 찾을 수 없습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;—protocol=TCP&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그렇지 않으면 로컬 MySQL 데이터베이스에만 연결할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;말씀해주세요, SQLA lchemy를 이용한 방법이 있을까요?&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;127.0.0.1&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또는 &quot;특수 이름&quot; 대신 &lt;em papago-id=&quot;8-1&quot;&gt;호스트의 IP&lt;/em&gt; 또는 &lt;em papago-id=&quot;8-3&quot;&gt;호스트 이름&lt;/em&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;localhost&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;a href=&quot;https://dev.mysql.com/doc/refman/5.0/en/connecting.html#idm140235558252992&quot; papago-id=&quot;9-1&quot;&gt;설명서&lt;/a&gt;에서:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;[...] 로컬 호스트에 대한 &lt;em papago-id=&quot;10-1&quot;&gt;유닉스&lt;/em&gt;의 연결은 기본적으로 유닉스 소켓 파일을 사용하여 이루어집니다.&lt;/font&gt;&lt;/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;/p&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;strong papago-id=&quot;12-0&quot;&gt;유닉스에서 MySQL 프로그램은 &lt;/strong&gt;다른 네트워크 기반 프로그램과 비교할 때 기대하는 것과 다른 방식으로 &lt;strong papago-id=&quot;12-0&quot;&gt;호스트 이름&lt;/strong&gt; &lt;strong papago-id=&quot;12-0&quot;&gt;&lt;em papago-id=&quot;12-0-1&quot;&gt;localhost&lt;/em&gt;&lt;/strong&gt;를 &lt;strong papago-id=&quot;12-0&quot;&gt;특별&lt;/strong&gt;하게 처리합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;로컬 호스트에 대한 연결의 경우 MySQL 프로그램은 유닉스 소켓 파일을 사용하여 로컬 서버에 연결을 시도합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;포트 번호를 지정하기 위해 --port 또는 -P 옵션이 지정된 경우에도 발생합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;클라이언트가 로컬 서버에 TCP/IP를 연결하도록 하려면 --host 또는 -h를 사용하여 호스트 이름 값 127.0.0.1 또는 로컬 서버의 IP 주소 또는 이름을 지정합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;hr&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;em papago-id=&quot;13-1&quot;&gt;TCP&lt;/em&gt; 소켓을 사용하도록 강요해야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;당신이 직접 설명한 것처럼, 호출할 때.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;mysql&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;--protocol tcp&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;선택.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;16&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://docs.sqlalchemy.org/en/latest/core/engines.html#custom-dbapi-args&quot; papago-id=&quot;16-1&quot;&gt;여기&lt;/a&gt;서 설명한 바와 같이, SQLLchemy에서 URL 옵션으로 또는 &lt;em papago-id=&quot;16-3&quot;&gt;사용&lt;/em&gt;하여 관련 옵션을 드라이버에 전달할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;connect_args&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;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;PyMySQL&lt;/em&gt;을 사용하는 경우, 테스트 시스템에서 이를 위해 설정한 경우(MariaDB 10.0.12, SQLChemy 0.9.8 및 PyMy&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;SQL 0.6.2) 다음과 같은 결과를 얻었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; engine = create_engine(
      &quot;mysql+pymysql://sylvain:passwd@localhost/db?host=localhost?port=3306&quot;)
#                                                 ^^^^^^^^^^^^^^^^^^^^^^^^^^
#                               Force TCP socket. Notice the two uses of `?`
#                               Normally URL options should use `?` and `&amp;amp;`  
#                               after that. But that doesn't work here (bug?)
&amp;gt;&amp;gt;&amp;gt; conn = engine.connect()
&amp;gt;&amp;gt;&amp;gt; conn.execute(&quot;SELECT host FROM INFORMATION_SCHEMA.PROCESSLIST WHERE ID = CONNECTION_ID()&quot;).fetchall()
[('localhost:54164',)]

# Same result by using 127.0.0.1 instead of localhost: 
&amp;gt;&amp;gt;&amp;gt; engine = create_engine(
      &quot;mysql+pymysql://sylvain:passwd@127.0.0.1/db?host=localhost?port=3306&quot;)
&amp;gt;&amp;gt;&amp;gt; conn = engine.connect()
&amp;gt;&amp;gt;&amp;gt; conn.execute(&quot;SELECT host FROM INFORMATION_SCHEMA.PROCESSLIST WHERE ID = CONNECTION_ID()&quot;).fetchall()
[('localhost:54164',)]

# Alternatively, using connect_args:
&amp;gt;&amp;gt;&amp;gt; engine = create_engine(&quot;mysql+pymysql://sylvain:passwd@localhost/db&quot;,
                       connect_args= dict(host='localhost', port=3306))
&amp;gt;&amp;gt;&amp;gt; conn = engine.connect()
&amp;gt;&amp;gt;&amp;gt; conn.execute(&quot;SELECT host FROM INFORMATION_SCHEMA.PROCESSLIST WHERE ID = CONNECTION_ID()&quot;).fetchall()
[('localhost:54353',)]
&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;두 개 모두 TCP 연결을 사용합니다(호스트 이름 뒤의 포트 번호 때문에 알고 있습니다).&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;반면에:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; engine = create_engine(
      &quot;mysql+pymysql://sylvain:passwd@localhost/db?unix_socket=/path/to/mysql.sock&quot;)
#                                                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
#                               Specify the path to mysql.sock in
#                               the `unix_socket` option will force
#                               usage of a UNIX socket

&amp;gt;&amp;gt;&amp;gt; conn = engine.connect()
&amp;gt;&amp;gt;&amp;gt; conn.execute(&quot;SELECT host FROM INFORMATION_SCHEMA.PROCESSLIST WHERE ID = CONNECTION_ID()&quot;).fetchall()
[('localhost',)]

# Same result by using 127.0.0.1 instead of localhost: 
&amp;gt;&amp;gt;&amp;gt; engine = create_engine(
      &quot;mysql+pymysql://sylvain:passwd@127.0.0.1/db?unix_socket=/path/to/mysql.sock&quot;)
&amp;gt;&amp;gt;&amp;gt; conn = engine.connect()
&amp;gt;&amp;gt;&amp;gt; conn.execute(&quot;SELECT host FROM INFORMATION_SCHEMA.PROCESSLIST WHERE ID = CONNECTION_ID()&quot;).fetchall()
[('localhost',)]

# Alternatively, using connect_args:
&amp;gt;&amp;gt;&amp;gt; engine = create_engine(&quot;mysql+pymysql://sylvain:passwd@localhost/db&quot;,
                       connect_args= dict(unix_socket=&quot;/path/to/mysql.sock&quot;))
&amp;gt;&amp;gt;&amp;gt; conn = engine.connect()
&amp;gt;&amp;gt;&amp;gt; conn.execute(&quot;SELECT host FROM INFORMATION_SCHEMA.PROCESSLIST WHERE ID = CONNECTION_ID()&quot;).fetchall()
[('localhost',)]
&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;em papago-id=&quot;20-1&quot;&gt;이름&lt;/em&gt; 뒤에 포트가 없습니다. UNIX 소켓입니다.&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;pre&gt;&lt;code&gt;import pandas as pd
import pymysql
from sqlalchemy import create_engine

cnx = create_engine('mysql+pymysql://&amp;lt;username&amp;gt;:&amp;lt;password&amp;gt;@&amp;lt;host&amp;gt;/&amp;lt;dbname&amp;gt;')    
df = pd.read_sql('SELECT * FROM &amp;lt;table_name&amp;gt;', cnx) #read the entire table
&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;자격 증명이 다음과 같이 mysql 데이터베이스에 추가됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;CREATE USER '&amp;lt;username&amp;gt;' IDENTIFIED BY '&amp;lt;password&amp;gt;';
GRANT ALL PRIVILEGES ON *.* TO '&amp;lt;username&amp;gt;' WITH GRANT OPTION;
FLUSH PRIVILEGES;
&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;MySQL SQLchemy url에서 localhost 대신 127.0.0.1을 사용하는 설정(mysql-python 사용 중)에서 MySQL SQLchemy url이 작동합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 시나리오(로컬 포트 3307이 있는 터널)에 정확하게 사용하고 있는 전체 URL은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;mysql:/user:passwd@127.0.0.1:3307/
&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;SQLAlchemy 1.0.5를 사용하고 있지만 크게 문제가 되지는 않는 것 같습니다.&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;xampp 서버의 mysql db와 연결하기 위해 시도했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;from sqlalchemy import create_engine

engine = create_engine(&quot;mysql+pymysql://usrnme:passwd@hstnme/dbname&quot;)
&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;Python 3.x를 사용하는 경우 다음을 사용할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;pip install mysql-connector-python
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;27&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러면:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;import sqlalchemy as db
engine = db.create_engine(&quot;mysql+mysqlconnector://username:password@hostname:port/dbname&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;URL : https://stackoverflow.com/questions/29355674/how-to-connect-mysql-database-using-pythonsqlalchemy-remotely&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>MySQL</category>
      <author>telecom</author>
      <guid isPermaLink="true">https://telecom.tistory.com/682</guid>
      <comments>https://telecom.tistory.com/682#entry682comment</comments>
      <pubDate>Fri, 27 Oct 2023 21:44:09 +0900</pubDate>
    </item>
    <item>
      <title>내가 파워셸인지 cmd인지 어떻게 판단합니까?</title>
      <link>https://telecom.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;내가 파워셸인지 cmd인지 어떻게 판단합니까?&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://github.com/PowerShell/Win32-OpenSSH&quot; rel=&quot;noreferrer&quot; papago-id=&quot;1-1&quot;&gt;Windows에서 OpenSSH&lt;/a&gt;를 사용하고 있는데 일반적인 Unix 별칭이 없어진 것 같습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;SSH를 통해 Windows 컴퓨터에 로그인할 때 powershell이 시작되는지 cmd가 시작되는지 확신할 수 없습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;Windows에서 현재 실행 중인 셸을 확인하는 올바른 방법은 무엇입니까?&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://stackoverflow.com/users/4003407/petseral&quot; papago-id=&quot;2-1&quot;&gt;PetSerAl&lt;/a&gt;에게 제공되며, 이는 답변으로 게시되어야 했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;(dir 2&amp;gt;&amp;amp;1 *`|echo CMD);&amp;amp;&amp;lt;# rem #&amp;gt;echo PowerShell
&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;Win32-OpenSSH&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 명령은 또한 작동하고 출력합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;CMD&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&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;NB:&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Win32-OpenSSH&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;cd&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;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;powershell(powershell.&lt;strong papago-id=&quot;6-3&quot;&gt;exe)&lt;/strong&gt;을 사용하는 것도 구별하기 위해 @sodawillow의 답변을 확장하고자 합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Desktop&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;em papago-id=&quot;7-1&quot;&gt;PWSH&lt;/em&gt;(&lt;strong papago-id=&quot;7-3&quot;&gt;pwsh.exe&lt;/strong&gt;)로 알려진&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Core&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;(dir 2&amp;gt;&amp;amp;1 *`|echo CMD);&amp;amp;&amp;lt;# rem #&amp;gt;echo ($PSVersionTable).PSEdition
# Returns one of: CMD, Core, Desktop
&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;strong papago-id=&quot;9-1&quot;&gt;않은&lt;/strong&gt; 모든 경우에 적용됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 Python에서 기본 하위 프로세스를 여는 것으로부터 &lt;strong papago-id=&quot;9-3&quot;&gt;작동하지 않는다는&lt;/strong&gt; 것을 의미합니다. 창과 상호 작용할 때 항상 &lt;strong papago-id=&quot;9-5&quot;&gt;CMD&lt;/strong&gt;를 사용하기 때문입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;Windows 환경 변수에 의해 실제로 설정됩니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ComSpec&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;C:\Windows\system32\cmd.exe&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;p papago-id=&quot;16&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(pwsh 셸에서 python 인터프리터 시작)&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-py prettyprint-override&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; import os, subprocess
&amp;gt;&amp;gt;&amp;gt; c=&quot;(dir 2&amp;gt;&amp;amp;1 *`|echo CMD);&amp;amp;&amp;lt;# rem #&amp;gt;echo($PSVersionTable).PSEdition&quot;
&amp;gt;&amp;gt;&amp;gt; subprocess.call(c,shell=True)
CMD
&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;다른 Python shell detection scheme에 대해서는 이 &lt;a href=&quot;https://stackoverflow.com/a/55598796/1147688&quot; papago-id=&quot;17-1&quot;&gt;좋은 게시물&lt;/a&gt;을 참고하시기 바랍니다.&lt;/font&gt;&lt;/p&gt; 
&lt;hr&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;업데이트 : 2020-05-01&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;12&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 그럭저럭 위의 작업을 할 수 있었지만, 실행하기 전에 &lt;strong papago-id=&quot;12-1&quot;&gt;항상&lt;/strong&gt; 파워셸 &lt;em papago-id=&quot;12-3&quot;&gt;프로파일&lt;/em&gt;을 로드하는 불쾌한 부작용이 있었습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그 비결은 다음과 같이 명시하는 것이었습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;execute=&amp;lt;path-to-powershell-exe&amp;gt;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;20&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음과 같이:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;21&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(Python CLI를 시작합니다.)&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-py prettyprint-override&quot;&gt;&lt;code&gt;import os, subprocess
c=&quot;(dir 2&amp;gt;&amp;amp;1 *`|echo CMD);&amp;amp;&amp;lt;# rem #&amp;gt;echo($PSVersionTable).PSEdition&quot;
e=&quot;C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe&quot;
subprocess.call(c, shell=True, executable=e)

# output:
# &amp;lt;blah blah from profile&amp;gt;
# Desktop
# 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;font class=&quot;papago-parent&quot;&gt;하지만 &lt;a href=&quot;https://stackoverflow.com/a/45090774/1147688&quot; papago-id=&quot;22-1&quot;&gt;분명히&lt;/a&gt; 그것은 작업중인 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://github.com/PowerShell/PowerShell/issues/3743&quot; rel=&quot;noreferrer&quot; papago-id=&quot;22-3&quot;&gt;여기&lt;/a&gt;서 &lt;a href=&quot;https://github.com/PowerShell/PowerShell/pull/3558&quot; rel=&quot;noreferrer&quot; papago-id=&quot;22-5&quot;&gt;여기&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/34471956/how-to-determine-if-im-in-powershell-or-cmd&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>PowerShell</category>
      <author>telecom</author>
      <guid isPermaLink="true">https://telecom.tistory.com/681</guid>
      <comments>https://telecom.tistory.com/681#entry681comment</comments>
      <pubDate>Fri, 27 Oct 2023 21:44:02 +0900</pubDate>
    </item>
    <item>
      <title>트래비스가 도커 컨테이너를 구축하는 동안 phpunit 테스트를 실행하려면 어떻게 해야 합니까?</title>
      <link>https://telecom.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;트래비스가 도커 컨테이너를 구축하는 동안 phpunit 테스트를 실행하려면 어떻게 해야 합니까?&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;저는 php8의 symphony5 프로젝트를 도커 컨테이너에서 개발하는데, 이 프로젝트는 mariadb를 프로젝트 db로 사용하고 다른 하나는 테스트 db로 사용합니다.&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;내가 찾은 모든 튜토리얼은 이 것과 같은 도커 컨테이너를 사용하지 않는 것 같습니다. https://blog.travis-ci.com/2021-07-01-tests-laravel . 그리고 트래비스에서 테스트 DB를 실행하기 위해 운동할 수 없습니다.&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;php Codesniffer나 phpstan 같은 체크는 문제가 없고 나는 그것들을 작동시켰습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;    - docker run $IMAGE:$TRAVIS_COMMIT /bin/sh -c &quot;bin/phpcs&quot;
    - docker run $IMAGE:$TRAVIS_COMMIT /bin/sh -c &quot;bin/phpstan analyze -c phpstan.neon.dist --memory-limit=1G&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;물론 데이터베이스는 필요 없습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;    - docker run $IMAGE:$TRAVIS_COMMIT /bin/sh -c &quot;bin/console do:mi:mi -n&quot;
    - docker run $IMAGE:$TRAVIS_COMMIT /bin/sh -c &quot;bin/console do:fi:lo -n&quot;
    - docker run $IMAGE:$TRAVIS_COMMIT /bin/sh -c &quot;bin/phpunit --configuration=phpunit.xml.dist&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;당연히 데이터베이스를 찾지 못한다고 불평합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;테스트를 실행하기 위해 mysql 또는 mariadb(sqlite 없음!)를 사용하여 테스트 db를 설정하려면 어떻게 해야 합니까?&lt;/font&gt;&lt;/strong&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;지금까지 분석한 바로는 php와 데이터베이스가 같은 컨테이너에서 실행되지 않기 때문에 외부에서 &quot;docker run...&quot;을 통해 테스트를 트리거하면 phpunit이 데이터베이스에 연결할 수 없다는 문제가 있습니다.&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;다음과 같이 컨테이너 외부에서 bash로부터 테스트를 시작하려고 하면 동작을 로컬에서 재현할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;docker run my-local-php-container /bin/sh -c &quot;bin/phpunit --configuration=phpunit.xml.dist&quot;
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/68986629/how-can-i-run-my-phpunit-tests-while-travis-builds-my-docker-containers&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>mariadb</category>
      <author>telecom</author>
      <guid isPermaLink="true">https://telecom.tistory.com/680</guid>
      <comments>https://telecom.tistory.com/680#entry680comment</comments>
      <pubDate>Fri, 27 Oct 2023 21:43:55 +0900</pubDate>
    </item>
    <item>
      <title>Apache2를 통해 연결하는 동안에만 원격 MySqli Connection 시간 초과</title>
      <link>https://telecom.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;Apache2를 통해 연결하는 동안에만 원격 MySqli Connection 시간 초과&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;Ubuntu 18&lt;/strong&gt;.04 &lt;strong papago-id=&quot;1-1&quot;&gt;Apache EC2 Machine/Server &lt;/strong&gt;-&lt;strong papago-id=&quot;1-1&quot;&gt; 172&lt;/strong&gt;.2&lt;strong papago-id=&quot;1-1&quot;&gt;.27&lt;/strong&gt;.1에서 &lt;strong papago-id=&quot;1-3&quot;&gt;mysqli가 MariaDB Server &lt;/strong&gt;- &lt;strong papago-id=&quot;1-3&quot;&gt;172.2.27&lt;/strong&gt;.2(원격 mysqli 서버)에 연결되지 않지만 로컬 호스트(현재 172.2.27.1 Machine에도 MariaDB가 설치되어 있으므로 172.2.27에 대한 원격 연결)를 통해 연결됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;1-5&quot;&gt;2가&lt;/strong&gt; 터미널을 통해 구축 중입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;mysql -h 172.2.27.2 -u test -p&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(172.2.27.1 기계의 경우)&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;정확한 문제가 무엇인지 알 수 없습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;가능한 모든 위치를 디버깅해 보았지만 찾을 수 없었습니다.&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;Apache에 연결하는 동안 다음 오류가 발생합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Object
(
    [affected_rows] =&amp;gt; 
    [client_info] =&amp;gt; 
    [client_version] =&amp;gt; 50012
    [connect_errno] =&amp;gt; 2002
    [connect_error] =&amp;gt; Connection timed out
    [errno] =&amp;gt; 
    [error] =&amp;gt; 
    [error_list] =&amp;gt; 
    [field_count] =&amp;gt; 
    [host_info] =&amp;gt; 
    [info] =&amp;gt; 
    [insert_id] =&amp;gt; 
    [server_info] =&amp;gt; 
    [server_version] =&amp;gt; 
    [stat] =&amp;gt; 
    [sqlstate] =&amp;gt; 
    [protocol_version] =&amp;gt; 
    [thread_id] =&amp;gt; 
    [warning_count] =&amp;gt; 
)
&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;PS: 컴퓨터나 EC2 인스턴스에서 방화벽 규칙 문제가 발생하지 않습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 그것을 이미 확인했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;인터넷 상의 원격 MariaDB 서버에 연결하기 위해 사용 가능한 모든 코드는 동일한 결과를 제공합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;코드 문제가 아니라 아파치 확장 문제나 PHP 문제일 수도 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;서버 172.2.27.1은 인터넷 상의 다른 MariaDB 서버에 연결할 수 없습니다.&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;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;Security groups&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Mysql/MariaDB 인스턴스에 할당되어 있는지 확인합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Mysql port (3306)&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;MariaDB 설정에 적절하게 허용되어 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;inbound&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;172.2.27.2&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;원격 주소에 대한 DB를 구성하지 않은 것 같습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;set my.cnf&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;[mysqld]
skip-networking=0
skip-bind-address
&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;그런 다음 mysql.user를 설정합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;GRANT ALL PRIVILEGES ON *.* TO 'root'@'172.2.27.%' 
  IDENTIFIED BY 'password' WITH GRANT OPTION;
&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;이후 모든 프로세스 다시 시작참조를 위해 이 내용을 살펴봅니다. https://mariadb.com/kb/en/configuring-mariadb-for-remote-client-access/&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;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/63975567/remote-mysqli-connection-timeout-only-while-connecting-via-apache2&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>mariadb</category>
      <author>telecom</author>
      <guid isPermaLink="true">https://telecom.tistory.com/679</guid>
      <comments>https://telecom.tistory.com/679#entry679comment</comments>
      <pubDate>Fri, 27 Oct 2023 21:43:49 +0900</pubDate>
    </item>
    <item>
      <title>&amp;quot;pre_option_upload_url_path&amp;quot; WordPress 4.7에서 필터가 더 이상 점화되지 않습니다.</title>
      <link>https://telecom.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;&quot;pre_option_upload_url_path&quot; WordPress 4.7에서 필터가 더 이상 점화되지 않습니다.&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;제 테마의 기능에 아래 필터가 추가되어 있습니다.&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 cdn_upload_url() {
    if ( ! is_admin() ) {
            return 'http://d24fxnpb2c5viy.cloudfront.net';
    }
}
add_filter( 'pre_option_upload_url_path', 'cdn_upload_url' , 10);
&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;WordPress 4.7로 업그레이드한 후 이 필터는 더 이상 실행되지 않습니다.&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;pre_option_{option}&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;4.7에서는 필터가 더 이상 작동하지 않습니까?&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;어떤 도움이라도 주신다면 대단히 감사하겠습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;숨겨진 관리 페이지가 있으며 이 페이지에서는 다음과 같은 모든 옵션을 찾을 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;http://localhost/wp-admin/options.php
&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;upload_url_path&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;option and set 값을 설정합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://i.stack.imgur.com/zNyG6.png&quot; rel=&quot;nofollow noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/zNyG6.png&quot; alt=&quot;enter image description here&quot;&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;hr&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;값을 지정한 후 &quot;Store uppload in this folder&quot;(이 폴더에 업로드 저장), 즉&lt;/font&gt;&lt;/font&gt;&lt;code&gt;upload_path&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;, 그리고 &quot;파일에 대한 전체 URL 경로&quot;를 의미합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;upload_url_path&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;12&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;미디어 설정 페이지에도 옵션이 나타납니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;http://localhost/wp-admin/options-media.php
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;a href=&quot;https://i.stack.imgur.com/XOi9i.png&quot; rel=&quot;nofollow noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/XOi9i.png&quot; alt=&quot;enter image description here&quot;&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;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/41596801/pre-option-upload-url-path-filter-no-longer-firing-in-wordpress-4-7&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>Wordpress</category>
      <author>telecom</author>
      <guid isPermaLink="true">https://telecom.tistory.com/678</guid>
      <comments>https://telecom.tistory.com/678#entry678comment</comments>
      <pubDate>Fri, 27 Oct 2023 21:43:42 +0900</pubDate>
    </item>
    <item>
      <title>AngularJs 유닛 테스트 메모리 누수</title>
      <link>https://telecom.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;AngularJs 유닛 테스트 메모리 누수&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;당신이 이미 알고 있듯이, 대량의 필기 단위 시험을 가지고 있는 우리들 중 많은 사람들이 사소한 문제를 해결할 수 없는 문제에 직면했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 AngularJs &lt;a href=&quot;https://docs.angularjs.org/guide/unit-testing&quot; papago-id=&quot;1-3&quot;&gt;단위 테스트&lt;/a&gt; 가이드에 따라 &lt;a href=&quot;http://jasmine.github.io/&quot; papago-id=&quot;1-1&quot;&gt;재스민&lt;/a&gt; 구문으로 작성된 약 3500개 이상의 단위 테스트를 가지고 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://karma-runner.github.io&quot; papago-id=&quot;1-5&quot;&gt;카르마&lt;/a&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;font class=&quot;papago-parent&quot;&gt;실행하는 동안 어떤 브라우저에서 실행되든 메모리가 쌓이고 어느 시점에서 브라우저가 충돌하고 연결이 끊어집니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;지금까지 제가 알고 있는 가장 좋은 해결책은 이 문제를 가진 커뮤니티에서 사용되는 테스트를 여러 번에 나눠서 한 번의 실행에서 나온 결과를 병합해서 정확한 범위를 얻는 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 문제를 처음 만났을 때 1000번 정도의 테스트를 받았습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;실행할 수 있는 모든 브라우저를 사용해 본 후 테스트를 여러 번에 나누어 실행해 보았지만, 이것은 오랫동안 좋은 해결책이 아니라는 것이 밝혀졌습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이제 테스트는 완료 시간을 줄이기 위해 병렬로 실행되는 14개 이상의 단일 실행 방식으로 실행되지만, 여전히 IMO는 문제를 영구적으로 해결할 수는 없지만 리소스 제한(RAM, CPU)과 성가신 시간 소모로 인해 문제를 약간 지연시킵니다.&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;이 문제를 재현하기 위해 저는 다음과 같이 메모리 소모량이 많은 Angular &lt;a href=&quot;https://github.com/saskodh/ng-unit-testing-leak/blob/master/src/services/heavyLoad-service.js&quot; papago-id=&quot;5-1&quot;&gt;서비스&lt;/a&gt;를 만들고 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;app.factory('heavyLoad', function () {
  // init
  var heavyList = [];
  var heavyObject = {};
  var heavyString = '';

  // populate..

  return {
    getHeavyList: function () { return heavyList; },
    getHeavyObject: function () { return heavyObject; },
    getHeavyString: function () { return heavyString; }
  };
});
&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;그 후 이 서비스를 사용하여 많은 DOM 요소를 초기화하는 간단한 &lt;a href=&quot;https://github.com/saskodh/ng-unit-testing-leak/blob/master/src/directives/heavyLoad-directive.js&quot; papago-id=&quot;6-1&quot;&gt;지침&lt;/a&gt;이 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;app.directive('heavyLoad', function (heavyLoad) {
  return {
    scope: {},
    template: '' +
    '&amp;lt;div&amp;gt;' +
    ' &amp;lt;h1&amp;gt;{{title}}&amp;lt;/h1&amp;gt;' +
    ' &amp;lt;div ng-repeat=&quot;item in items&quot;&amp;gt;' +
    '   &amp;lt;div ng-repeat=&quot;propData in item&quot;&amp;gt;' +
    '     &amp;lt;p&amp;gt;{{propData}}&amp;lt;/p&amp;gt;' +
    '   &amp;lt;/div&amp;gt;' +
    ' &amp;lt;/div&amp;gt;' +
    '&amp;lt;/div&amp;gt;',
    link: function (scope, element) {
      scope.items = heavyLoad.getHeavyList();
      scope.title = heavyLoad.getHeavyString();

      // add data to the element
      element.data(heavyLoad.getHeavyList());
    }
  };
});
&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;그리고 마지막으로 나는 Angular &lt;a href=&quot;https://docs.angularjs.org/guide/unit-testing&quot; papago-id=&quot;7-3&quot;&gt;unit testing&lt;/a&gt; guide에 제시된 대로 지시문에 대한 &lt;a href=&quot;https://github.com/saskodh/ng-unit-testing-leak/blob/master/test/directives/heavyLoad-directive.spec.js&quot; papago-id=&quot;7-1&quot;&gt;test definition&lt;/a&gt;과 함께 1000개의 test suit을 동적으로 등록하고 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;// define multiple suits with the same definition just for showcase
for (var i = 0; i &amp;lt; 1000; i += 1) {
  describe('heavyLoad directive #' + i, testDefinition);
}
&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;a href=&quot;https://github.com/saskodh/ng-unit-testing-leak&quot; papago-id=&quot;8-1&quot;&gt;GitHub&lt;/a&gt;에서 프로젝트를 확인하고 &lt;em papago-id=&quot;8-3&quot;&gt;카르마를 실행&lt;/em&gt;하기 전에 실행하십시오.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$ npm install
$ bower install
&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;건배.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;문제는 매번 시험이 끝난 후에 해야 하는 잊혀진 청소에 있었습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;추가하면 메모리 소모량이 안정적이고 어느 브라우저에서나 테스트를 실행할 수 있기 때문에 테스트 횟수는 더 이상 중요하지 않습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;3000개의 동적으로 등록된 테스트를 성공적으로 실행한 솔루션을 보여주는 &lt;a href=&quot;https://github.com/saskodh/ng-unit-testing-leak/blob/master/test/directives/heavyLoad-directive.effective.spec.js&quot; papago-id=&quot;12-1&quot;&gt;이전&lt;/a&gt; 테스트 정의의 수정을 여기에 추가했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;13&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;테스트는 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;describe('testSuite', function () {
    var suite = {};

    beforeEach(module('app'));

    beforeEach(inject(function ($rootScope, $compile, heavyLoad) {
      suite.$rootScope = $rootScope;
      suite.$compile = $compile;
      suite.heavyLoad = heavyLoad;
      suite.$scope = $rootScope.$new();

      spyOn(suite.heavyLoad, 'getHeavyString').and.callThrough();
      spyOn(suite.heavyLoad, 'getHeavyObject').and.callThrough();
      spyOn(suite.heavyLoad, 'getHeavyList').and.callThrough();
    }));

    // NOTE: cleanup
    afterEach(function () {
      // NOTE: prevents DOM elements leak
      suite.element.remove();
    });
    afterAll(function () {
      // NOTE: prevents memory leaks because of JavaScript closures created for 
      // jasmine syntax (beforeEach, afterEach, beforeAll, afterAll, it..).
      suite = null;
    });

    suite.compileDirective = function (template) {
      suite.element = suite.$compile(template)(suite.$scope);
      suite.directiveScope = suite.element.isolateScope();
      suite.directiveController = suite.element.controller('heavyLoad');
    };

    it('should compile correctly', function () {
      // given
      var givenTemplate = '&amp;lt;div heavy-load&amp;gt;&amp;lt;/div&amp;gt;';

      // when
      suite.compileDirective(givenTemplate);

      // then
      expect(suite.directiveScope.title).toBeDefined();
      expect(suite.directiveScope.items).toBeDefined();
      expect(suite.heavyLoad.getHeavyString).toHaveBeenCalled();
      expect(suite.heavyLoad.getHeavyList).toHaveBeenCalled();
    });

});
&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;ul&gt; 
 &lt;li papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;$compile를 테스트 지침에 사용할 때 컴파일된 요소&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;16&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;기술 함수 범위의 모든 변수&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p papago-id=&quot;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그 두 가지는 까다롭고 알아내고 고려하기 어렵습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;첫 번째 것은 이미 알고 있었지만 재스민이 내부에서 작동하는 방식과 관련된 두 번째 것을 발견하기 전까지는 큰 도움이 되지 않았습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;나는 그들의 GitHub 저장소에 더 나은 해결책을 찾거나 최소한 개발자들 사이에 이 정보를 더 빨리 퍼뜨리는 데 도움이 되는 &lt;a href=&quot;https://github.com/jasmine/jasmine/issues/941&quot; papago-id=&quot;17-1&quot;&gt;문제&lt;/a&gt;를 만들었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 답변이 이런 문제를 겪고 있는 많은 사람들에게 도움이 되길 바랍니다.&lt;/font&gt;&lt;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;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/32998442/angularjs-unit-testing-memory-leaks&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>angularJs</category>
      <author>telecom</author>
      <guid isPermaLink="true">https://telecom.tistory.com/677</guid>
      <comments>https://telecom.tistory.com/677#entry677comment</comments>
      <pubDate>Fri, 27 Oct 2023 21:43:34 +0900</pubDate>
    </item>
    <item>
      <title>이벤트가 사람에 의해 트리거되었는지 확인합니다.</title>
      <link>https://telecom.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;이벤트가 사람에 의해 트리거되었는지 확인합니다.&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이벤트에 핸들러가 연결되어 있는데 트리거() 방식이 아닌 사람에 의해 트리거된 경우에만 실행했으면 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;어떻게 차이를 구분할 수 있습니까?&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를들면,&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$('.checkbox').change(function(e){
  if (e.isHuman())
  {
    alert ('human');
  }
});

$('.checkbox').trigger('change'); //doesn't alert
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;0&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;확인 가능합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;e.originalEvent&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;: 정의된 경우 클릭은 인간입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;fiddle http://jsfiddle.net/Uf8Wv/ 을 보세요.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$('.checkbox').change(function(e){
  if (e.originalEvent !== undefined)
  {
    alert ('human');
  }
});
&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;&amp;lt;input type='checkbox' id='try' &amp;gt;try
&amp;lt;button id='click'&amp;gt;Click&amp;lt;/button&amp;gt;

$(&quot;#try&quot;).click(function(event) {
    if (event.originalEvent === undefined) {
        alert('not human')
    } else {
        alert(' human');
    }


});

$('#click').click(function(event) {
    $(&quot;#try&quot;).click();
});
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;위보다 더 간단한 것은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$('.checkbox').change(function(e){
  if (e.isTrigger)
  {
    alert ('not a human');
  }
});

$('.checkbox').trigger('change'); //doesn't alert
&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;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Event/isTrusted&quot; rel=&quot;noreferrer&quot; papago-id=&quot;8-1&quot;&gt;event.istrusted&lt;/a&gt;를 지원합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;if (e.isTrusted) {
  /* The event is trusted: event was generated by a user action */
} else {
  /* The event is not trusted */
}
&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;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Event/isTrusted&quot; rel=&quot;noreferrer&quot; papago-id=&quot;9-1&quot;&gt;문서&lt;/a&gt;에서:&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&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;strong papago-id=&quot;10-1&quot;&gt;Trusted&lt;/strong&gt; Read-Only 속성입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Event&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;인터페이스는 a.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Boolean&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;strong papago-id=&quot;12-1&quot;&gt;true&lt;/strong&gt;이고, 이벤트가 스크립트에 의해 생성되거나 수정되거나 &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/dispatchEvent&quot; papago-id=&quot;12-5&quot; rel=&quot;noreferrer&quot;&gt;EventTarget.dispatchEvent()&lt;/a&gt;를 통해 dispatch된 경우 &lt;strong papago-id=&quot;12-3&quot;&gt;false&lt;/strong&gt;입니다.&lt;/font&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;/font&gt;&lt;/font&gt;&lt;code&gt;trigger&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;a href=&quot;http://api.jquery.com/trigger&quot; papago-id=&quot;14-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;$('.checkbox').change(function(e, isTriggered){
  if (!isTriggered)
  {
    alert ('human');
  }
});

$('.checkbox').trigger('change', [true]); //doesn't alert
&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;예: http://jsfiddle.net/wG2KY/&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;16&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 인정받은 대답이 통하지 않았습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;6년이 지났는데 그때부터 jQuery가 많이 달라졌습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를들면&lt;/font&gt;&lt;/font&gt;&lt;code&gt;event.originalEvent&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;true&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;jQuery 1.9.x를 사용하면 객체는 항상 존재하지만 내용은 다릅니다.&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;새로운 버전의 jQuery를 사용하시는 분들은 이것을 사용해보실 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;Chrome, Edge, IE, Opera, FF 작품&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;if ((event.originalEvent.isTrusted === true &amp;amp;&amp;amp; event.originalEvent.isPrimary === undefined) || event.originalEvent.isPrimary === true) {
    //Hey hooman it is you
}
&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;$(input).focus()&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;setFocus()&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;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;var globalIsHuman = true;

$('input').on('focus', function (){
    if(globalIsHuman){
        console.log('hello human, come and give me a hug');
    }else{
        console.log('alien, get away, i hate you..');
    }
    globalIsHuman = true;
});

// alien set focus
function setFocus(){
    globalIsHuman = false;
    $('input').focus();
}
// human use mouse, finger, foot... whatever to touch the input
&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;$(input).focus()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;14&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다른 행성에서 왔습니다&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;행운을 빌거나 다른 대답을 확인합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;15&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;전화가 오는지 알고 싶어요&lt;/font&gt;&lt;/font&gt;&lt;code&gt;oninput&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;16&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;입력 값이 복원될 때 실행 취소/redo가 입력 이벤트로 이어지므로 핸들러가 사용자로부터 오거나 실행 취소/redo에서 오거나 합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-js prettyprint-override&quot;&gt;&lt;code&gt;  valueInput.oninput = (e) =&amp;gt; {
    const value = +valueInput.value
    update(value)
    if (!e.inputType.startsWith(&quot;history&quot;)) {
      console.log('came from human')
      save(value)
    }
    else {
      console.log('came from history stacks')
    }
  }
&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;e.inputType&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;&quot;historyUndo&quot;&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;&quot;historyRedo&quot;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;32&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;redo(&lt;a href=&quot;https://rawgit.com/w3c/input-events/v1/index.html#interface-InputEvent-Attributes&quot; papago-id=&quot;32-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;가능한 inputType 목록&lt;/a&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;온 마우스 다운을 사용하여 마우스 클릭 vs trigger() 호출을 감지할 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;34&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;마우스 위치를 확인할 수 있는 가능성을 생각해 보겠습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li papago-id=&quot;35&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;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;/ul&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/6692031/check-if-event-is-triggered-by-a-human&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>jQuery</category>
      <author>telecom</author>
      <guid isPermaLink="true">https://telecom.tistory.com/676</guid>
      <comments>https://telecom.tistory.com/676#entry676comment</comments>
      <pubDate>Fri, 27 Oct 2023 21:43:26 +0900</pubDate>
    </item>
    <item>
      <title>C/C++에서 (식이) 진행되는 동안 세미콜론이 필요한 이유는 무엇입니까?</title>
      <link>https://telecom.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;C/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;pre&gt;&lt;code&gt;do
{
  some stuff
}
while(test);

more stuff
&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;do
{
  some stuff
}
while(test)

more stuff
&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;font class=&quot;papago-parent&quot;&gt;&quot;do this while this&quot;는 하나의 문장으로, 블록으로 끝날 수 없기 때문에 다른 문장과 마찬가지로 세미콜론이 필요합니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;C++ 문법을 보면 반복문은 다음과 같이 정의됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;strong papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;하는 동안에&lt;/font&gt;&lt;/strong&gt; &lt;em papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;조건.&lt;/font&gt;&lt;/em&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;em papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;진술&lt;/font&gt;&lt;/em&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;strong papago-id=&quot;10-0&quot;&gt;(-&lt;/strong&gt;&lt;em papago-id=&quot;10-2&quot;&gt;init-statement condition-opt&lt;/em&gt;&lt;strong papago-id=&quot;10-4&quot;&gt;;&lt;/strong&gt; &lt;em papago-id=&quot;10-6&quot;&gt;expression-opt&lt;/em&gt;)&lt;strong papago-id=&quot;10-8&quot;&gt; &lt;/strong&gt;&lt;em papago-id=&quot;10-10&quot;&gt;문&lt;/em&gt;에 &lt;strong papago-id=&quot;10-0&quot;&gt;대해&lt;/strong&gt;&lt;/font&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;하다&lt;/font&gt;&lt;/strong&gt; &lt;em papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;진술&lt;/font&gt;&lt;/em&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;em papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;표현&lt;/font&gt;&lt;/em&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;/blockquote&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;do-while&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;;&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 class=&quot;papago-parent&quot;&gt;그래서, 문제는 왜 그가&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;do-while&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다른 것들과 너무 달라서 추가로 필요합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;;&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;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;for&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;while&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;em papago-id=&quot;23-1&quot;&gt;성명서&lt;/em&gt;로 끝납니다. 하지만.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;do-while&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;em papago-id=&quot;24-1&quot;&gt;표현&lt;/em&gt;으로 끝을 맺습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font 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;code&gt;)&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;do-while&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 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;;&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&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;30&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 실제로 그것은 예를 들어 다음과 같은 코드를 의미합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;do
{
  /* whatever */
} while (i + 2) * j &amp;gt; 0;
&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;하지만, 정말로 다음과 같이 해석될 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;do
{
  /* whatever */
} while (i + 2)

*j &amp;gt; 0;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;14&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font 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;do-while&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;15&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font 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;물론 @Joe White의 대답에 따라, 단순하고 단순한 일관성에 대한 고려도 있습니다: C의 모든 일반적인 (복잡하지 않은) 문장은 a로 끝납니다.&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;16&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;35&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그 이유는 진술이 실행 중 루프 내에서 유효하기 때문입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;36&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;세미콜론이 필요 없는 경우 다음과 같은 다양한 동작을 고려합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;int x = 10;
int y = 10;

do 
  while(x &amp;gt; 0)
    x--;
while(x = y--);
&lt;/code&gt;&lt;/pre&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;font class=&quot;papago-parent&quot;&gt;C/C++의 모든 문 그룹은 다음과 같이 종료됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ol&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;/ol&gt; 
&lt;p papago-id=&quot;40&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;왜 아무 것도 하지 않는 컨스트럭트를 만들까요?&lt;/font&gt;&lt;/p&gt;&lt;h2 papago-id=&quot;41&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;유량제어문 일관성&lt;/font&gt;&lt;/h2&gt; 
&lt;p papago-id=&quot;42&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;일관성을 고려할 때...&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;if (expr) statement;
do statement; while (expr);
for (expr; expr; expr) statement;
while (expr) statement;
&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;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;17&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 블록 진술 양식에 주목할 수 있다는 것에 대항하여,&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;do while&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;18&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&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;if (expr) { ... }
do { ... } while (expr);
for (expr; expr; expr) { }
while (expr) { }
&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;h2 papago-id=&quot;47&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;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;;&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;}&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;/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;/p&gt; 
&lt;pre&gt;&lt;code&gt;do statement1; while (expr1) statement2; do ; while (expr2) statement3; while (expr3) statement4;
&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;이를 시각적으로 해결하기란 매우 어려운 일입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;do statement1; while (expr1)
statement2;
do ; while (expr2)
statement3;
while (expr3) statement4;
&lt;/code&gt;&lt;/pre&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&gt;&lt;code&gt;;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;23&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그 직후에&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;while&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;do&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;while&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;26&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;:&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;do statement1; while (expr1); statement2; do ; while (expr2); statement3; while (expr3) statement4;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;58&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사람들이 흐름을 이해할 수 있도록 코드를 입력하는 것을 고려하면 문제가 됩니까?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;예, 이유:&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li papago-id=&quot;59&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;60&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;매크로 대체는 한 줄에 여러 개의 문장을 함께 묶을 수 있으며, 문제를 해결하거나 QA를 수행하는 동안 전처리기 출력을 시각적으로 확인해야 하는 경우도 있습니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2 papago-id=&quot;61&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;62&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;#define F(X) do { fn(X); } while (false)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;63&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이는 다음과 같이 대체할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;if (expr)
    F(x);
else
    x = 10;
&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;...yields...&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;if (expr)
    do ( fn(x); } while (false);
else
    x = 10;
&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;em papago-id=&quot;27-1&quot;&gt;아닌 경우에는&lt;/em&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;do while&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;if&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;29&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;문은 다음과 같이 해석됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;if (expr)
    do-while-statement
; // empty statement
else
    x = 10;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;30&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font 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;if&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 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;else&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 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;71&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;C는 세미콜론으로 종결됩니다(Pascal은 세미콜론으로 분리됨).&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;거기에 세미콜론을 떨어뜨리는 것은 일관성이 없을 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;72&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;솔직히 말해서, 나는 그 동안 두루프를 재사용하는 것이 싫어요.&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;73&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;C/C++에서 공백은 구조에 기여하지 않습니다(예: 파이썬).&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;C/C++에서 문장은 세미콜론으로 종료해야 &lt;strong papago-id=&quot;73-1&quot;&gt;합니다&lt;/strong&gt;.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;허용되는 항목:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;do
{
  some stuff; more stuff; even more stuff;
}
while(test);
&lt;/code&gt;&lt;/pre&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&gt;&lt;code&gt;do.....while();&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 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;ol&gt; 
 &lt;li papago-id=&quot;76&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;77&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&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;35&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그렇기 때문에 세미콜론을 마지막에 포함하는 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;do......while&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;36&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;loop, 조건이 false인 경우 여기서 루프가 종료됨을 나타냅니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;80&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/942251/in-c-c-why-does-the-do-whileexpression-need-a-semi-colon&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>C</category>
      <author>telecom</author>
      <guid isPermaLink="true">https://telecom.tistory.com/675</guid>
      <comments>https://telecom.tistory.com/675#entry675comment</comments>
      <pubDate>Sun, 22 Oct 2023 19:25:57 +0900</pubDate>
    </item>
    <item>
      <title>Chrome 브라우저로 재생되지 않는 MP4 HEVC 비디오</title>
      <link>https://telecom.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;Chrome 브라우저로 재생되지 않는 MP4 HEVC 비디오&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;저는 워드프레스 웹사이트에서 동영상을 호스팅하고 있고 사용자들은 mp4 동영상 파일을 업로드할 수 있습니다.&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;일부 mp4 파일은 검은색 화면으로 소리만 재생하는 등 제대로 작동하지 않습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고 저는 그 비디오들이 HEVC로 코딩되어 있다는 것을 알았습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;사파리와 IE(Edge)는 잘 하고 있지만 내 사용자들의 브라우저를 주로 사용하는 Chrome은 잘 하고 있지 않습니다.&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;어떤 브라우저 사용자가 사용하든 간에 HEVC 비디오를 재생할 수 있는 워드프레스 웹사이트를 만들 수 있는 방법이 있습니까?&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;a href=&quot;https://caniuse.com/#search=hevc&quot; rel=&quot;noreferrer&quot; papago-id=&quot;4-1&quot;&gt;카니우스&lt;/a&gt;에 따르면 H.265는 사파리와 IE에서만 작동할 것이라고 합니다.&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;동영상이 h.264로 업로드된 경우 모든 브라우저에서 지원되지만 해당 코덱에 다시 인코딩해야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;워드프레스에 업로드하기 전에 모든 동영상을 다시 인코딩하기 위해 FFMPEG를 실행하는 서버를 사용할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;만약 당신이 사파리에 h265를 유지하고 싶다면, 당신은 모든 주요 현대 브라우저에 도달하는 것을 결합한 비디오의 WEBM 버전을 만들 수도 있습니다.&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;동영상을 CDN으로 다시 인코딩하고 호스팅할 수 있는 여러 서비스가 있습니다.&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/61204279/mp4-hevc-video-not-playing-with-chrome-browser&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>Wordpress</category>
      <author>telecom</author>
      <guid isPermaLink="true">https://telecom.tistory.com/674</guid>
      <comments>https://telecom.tistory.com/674#entry674comment</comments>
      <pubDate>Sun, 22 Oct 2023 19:25:49 +0900</pubDate>
    </item>
    <item>
      <title>XPath를 사용하여 특성 가져오기</title>
      <link>https://telecom.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;XPath를 사용하여 특성 가져오기&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;주어진 XML 구조는 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;ISO-8859-1&quot;?&amp;gt;

&amp;lt;bookstore&amp;gt;

&amp;lt;book&amp;gt;
  &amp;lt;title lang=&quot;eng&quot;&amp;gt;Harry Potter&amp;lt;/title&amp;gt;
  &amp;lt;price&amp;gt;29.99&amp;lt;/price&amp;gt;
&amp;lt;/book&amp;gt;

&amp;lt;book&amp;gt;
  &amp;lt;title lang=&quot;eng&quot;&amp;gt;Learning XML&amp;lt;/title&amp;gt;
  &amp;lt;price&amp;gt;39.95&amp;lt;/price&amp;gt;
&amp;lt;/book&amp;gt;

&amp;lt;/bookstore&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;lang&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;lang&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;가&lt;/font&gt;&lt;/font&gt;&lt;code&gt;eng&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;책 제목에서), 첫 번째 요소에 대해?&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;blockquote&gt; 
 &lt;p papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;첫 번째 요소에 대한 lang(책 제목에서 lang=eng)의 값을 얻으려면 어떻게 해야 합니까?&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;&lt;strong papago-id=&quot;7-0&quot;&gt;용도&lt;/strong&gt;:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;/*/book[1]/title/@lang
&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;strong papago-id=&quot;8-0&quot;&gt;이것&lt;/strong&gt;은 다음을 &lt;strong papago-id=&quot;8-0&quot;&gt;의미&lt;/strong&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;lang&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;book&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;XML 문서의 최상위 요소의 자식입니다.&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;strong papago-id=&quot;12-0&quot;&gt;이 특성의 문자열 값만 가져오려면 표준 XPath 함수를 사용&lt;/strong&gt;합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;string(/*/book[1]/title/@lang)
&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;&amp;lt;div id=&quot;prop_sample&quot; data-want=&quot;data I want&quot;&amp;gt;data I do not want&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;14&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음 xpath 사용:&lt;/font&gt;&lt;/font&gt;&lt;code&gt;//*[@id=&quot;prop_sample&quot;]/@data-want&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;/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;xPath 패턴 아래에서 시도할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;  XPathExpression expr = xPath.compile(&quot;/bookstore/book/title[@lang='eng']&quot;)
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;XPath를 이용하여 속성 값을 추출하는 표준 공식은&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;elementXPath/@attributeName
&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;여기 첫번째 속성의 lang 값을 가져오는 xpath가 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;//title[text()='Harry Potter']/@lang
&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;PS: 제목 태그가 하나 더 들어오면 변경될 수 있기 때문에 XPath에서 인덱스를 사용하는 것은 절대 권장되지 않습니다.&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;(//@lang)[1]
&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;이는 이름이 &quot;lang&quot;인 모든 속성 노드를 얻고 첫 번째 속성 노드를 얻는다는 것을 의미합니다.&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;Postgre를 사용하는 경우&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;SQL, 이게 맞는 방법입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이는 &lt;strong papago-id=&quot;22-1&quot;&gt;북테이블&lt;/strong&gt; &lt;strong papago-id=&quot;22-3&quot;&gt;제목&lt;/strong&gt; 및 &lt;strong papago-id=&quot;22-5&quot;&gt;가격&lt;/strong&gt; 열에 데이터가 입력되어 있는 경우를 가정한 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;질문은 이렇습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;SELECT xpath('/bookstore/book/title/@lang', xmlforest(book.title AS title, book.price AS price), ARRAY[ARRAY[]::TEXT[]]) FROM book LIMIT 1;
&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;string(//bookstore/book[1]/title/@lang)    
string(//bookstore/book[2]/title/@lang)
&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;비록 당신이 자바스크립트와 함께 XMLDOM을 사용한다면 당신은 다음과 같은 것을 코딩할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var n1 = uXmlDoc.selectSingleNode(&quot;//bookstore/book[1]/title/@lang&quot;);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;25&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;n1.text&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;&quot;eng&quot;&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;XPath와 VTD-XML을 사용하여 &quot;lang&quot; 속성 값을 가져오는 것에 대한 토막글입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;import com.ximpleware.*;
public class getAttrVal {
    public static void main(String s[]) throws VTDException{
        VTDGen vg = new VTDGen();
        if (!vg.parseFile(&quot;input.xml&quot;, false)){
            return ;
        }
        VTDNav vn = vg.getNav();
        AutoPilot ap = new AutoPilot(vn);
        ap.selectXPath(&quot;/bookstore/book/title/@lang&quot;);
        System.out.println(&quot; lang's value is ===&amp;gt;&quot;+ap.evalXPathToString());
    }
}
&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;URL : https://stackoverflow.com/questions/4531995/getting-attribute-using-xpath&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>XML</category>
      <author>telecom</author>
      <guid isPermaLink="true">https://telecom.tistory.com/673</guid>
      <comments>https://telecom.tistory.com/673#entry673comment</comments>
      <pubDate>Sun, 22 Oct 2023 19:25:43 +0900</pubDate>
    </item>
    <item>
      <title>unix:/var/run/docker.sock에서 도커 데몬에 연결할 수 없습니다.도커 데몬이 실행 중입니까?</title>
      <link>https://telecom.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;unix:/var/run/docker.sock에서 도커 데몬에 연결할 수 없습니다.&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;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;서버에서 Scrapy Spash를 사용하고 싶습니다.&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;history&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;pre&gt;&lt;code&gt;docker run -p 8050:8050 scrapinghub/splash
sudo docker run -p 8050:8050 scrapinghub/splash
sudo usermod -aG docker $(whoami)
sudo docker run -p 8050:8050 scrapinghub/splash
newgrp docker
sudo docker run -p 8050:8050 scrapinghub/splash
reboot
sudo docker run -p 8050:8050 scrapinghub/splash
docker run -p 8050:8050 scrapinghub/splash
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저도 서버를 다시 시작하려고 했지만 도움이 되지 않았습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&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;ps -aux | grep docker&lt;/code&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;root@mani:/var/www/html# ps aux | grep docker
root      8524  0.0  0.8 127904 13964 ?        Ssl  17:21   0:00 /usr/bin/dockerd --raw-logs
root      8534  0.0  0.3  90588  5012 ?        Ssl  17:21   0:00 docker-containerd -l unix:///var/run/docker/libcontainerd/docker-containerd.sock --metrics-interval=0 --start-timeout 2m --state-dir /var/run/docker/libcontainerd/containerd --shim docker-containerd-shim --runtime docker-runc
root      8543  0.0  0.0   8812   764 pts/1    S+   17:21   0:00 grep --color=auto docker
root     16356  0.0  0.0  17200   964 pts/1    S    17:14   0:00 newgrp docker
root     20080  0.0  0.0  17200   964 pts/1    S    17:06   0:00 newgrp docker
root     30221  0.0  0.0  17200   964 pts/1    S    17:09   0:00 newgrp docker
&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;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 class=&quot;papago-parent&quot;&gt;다음 위치에서 도커 데몬에 연결할 수 없습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;unix:///var/run/docker.sock&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&gt;&lt;/p&gt; 
&lt;/blockquote&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;systemctl start docker
&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;추신: sudo 없이는 할 수 없는 명령이 있을 경우 다음을 시도해 보십시오.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;gpasswd -a $USER docker
&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;sudo dockerd
&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;p papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;메인 문서에서 DOCKER를 새로 설치한 후에 이것을 눌렀습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 설치 직후 서비스가 실행되지 않는 것이 문제였습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;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;$ sudo service --status-all 
$ sudo service docker start
&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;도커 스냅 패키지에 대한 답변은 다음과 같습니다.&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;snap logs docker&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음 항목을 찾습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Error starting daemon: pid file found, ensure docker is not running or delete /var/snap/docker/179/run/docker.pid
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;20&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 그 파일을 삭제하고 도커를 다시 시작하는 것이 효과적이었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;rm /var/snap/docker/&amp;lt;your-version-number&amp;gt;/run/docker.pid
snap stop docker
snap start docker
&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;&amp;lt;your-version-number&amp;gt;‍&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font 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;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;sudo su
systemctl start docker
systemctl enable docker
systemctl restart docker
&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;sudo systemctl start docker
sudo systemctl enable docker
sudo systemctl restart docker
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;a href=&quot;https://i.stack.imgur.com/Os7UG.png&quot; rel=&quot;noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/Os7UG.png&quot; alt=&quot;enter image description here&quot;&gt;&lt;/a&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;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;sudo&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&gt;&lt;code&gt;/var/run/docker.sock&lt;/code&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;pre&gt;&lt;code&gt;sudo service docker stop
&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;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;sudo nohup docker daemon -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
&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;font class=&quot;papago-parent&quot;&gt;그룹에 사용자를 추가하는 작업은 아래 명령으로 수행할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;sudo usermod -aG docker $USER
&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;a href=&quot;https://docs.docker.com/engine/installation/linux/linux-postinstall&quot; rel=&quot;noreferrer&quot; papago-id=&quot;31-1&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;strong papago-id=&quot;32-0&quot;&gt;Ubuntu 16.04&lt;/strong&gt; 사용자는 다음 단계를 수행할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;파일내부&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;/lib/systemd/system/docker.service&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 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;ExecStart=/usr/bin/dockerd fd://
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;35&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;로.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375
&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 class=&quot;papago-parent&quot;&gt;파일내부&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;/etc/init.d/docker&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;pre&gt;&lt;code&gt;DOCKER_OPTS=
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;38&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;로.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;DOCKER_OPTS=&quot;-H tcp://0.0.0.0:2375&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;39&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그런 다음 컴퓨터를 다시 시작하고 도커를 가지고 게임을 시작합니다.&lt;/font&gt;&lt;/p&gt;&lt;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;p papago-id=&quot;41&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;해결하려면&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;service docker stop
cd /var/run/docker/libcontainerd
rm -rf containerd/*
rm -f docker-containerd.pid
service docker start
&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;이미지를 다운로드하고 컨테이너를 평소와 같이 시작하는 &quot; docker run...&quot;.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;43&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;제게 효과가 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;sudo systemctl unmask docker
sudo systemctl start docker
&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;우분투 22.04가 제 운영체제입니다.&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;docker context ls 
&lt;/code&gt;&lt;/pre&gt; 
&lt;pre&gt;&lt;code&gt;docker context use default 
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;45&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 정도면 잘 먹히는데요..!&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;service docker restart
&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;GUI로 WSL을 사용하고 있다면 그냥 시도해 볼 수 있을 것 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;sudo /etc/init.d/docker start
&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;컨테이너를 끄는 동안 도커를 닫은 후 이 문제가 발생했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;docker pull mongo
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;48&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;처음에는 이상한 오류가 발생해서 도커를 제거했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;sudo apt-get purge docker.io
&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;sudo apt-get install docker.io
&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;이 모든 것이 아무 효과가 없었습니다. 저는 &quot;헬로월드&quot; 컨테이너를 실행할 수도 없었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;51&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 class=&quot;lang-sh prettyprint-override&quot;&gt;&lt;code&gt;systemctl unmask docker.service
systemctl unmask docker.socket
systemctl start docker.service
&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;이 후 몽고를 뽑고 &quot;헬로 월드&quot;를 실행할 수 있었습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;53&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;우분투 22에서는 &lt;strong papago-id=&quot;53-1&quot;&gt;sudo service docker&lt;/strong&gt; start가 잘 &lt;strong papago-id=&quot;53-1&quot;&gt;되었습니다&lt;/strong&gt;.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;vikaspiprade@AUMEL-P7750-VP:~$ sudo docker run hello-world
docker: Cannot connect to the Docker daemon at 
unix:///var/run/docker.sock. Is the docker daemon running?.
See 'docker run --help'.
vikaspiprade@AUMEL-P7750-VP:~$ sudo /var/run/docker.sock
sudo: /var/run/docker.sock: command not found
vikaspiprade@AUMEL-P7750-VP:~$ /var/run/docker.sock
-bash: /var/run/docker.sock: Permission denied
vikaspiprade@AUMEL-P7750-VP:~$ sudo service docker stop
* Docker already stopped - file /var/run/docker-ssd.pid not found.
vikaspiprade@AUMEL-P7750-VP:~$ sudo service docker start
* Starting Docker: docker                                                                                       
[ OK ]
vikaspiprade@AUMEL-P7750-VP:~$
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;a href=&quot;https://i.stack.imgur.com/waF6X.png&quot; rel=&quot;nofollow noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/waF6X.png&quot; alt=&quot;enter image description here&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p papago-id=&quot;54&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Ubuntu 20.04 및 Docker 버전 20.10.11에서 루트가 아닌 사용자로서 Running:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;sudo service docker start
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;55&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그런 다음 상태를 확인합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;sudo service docker status
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;56&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;드라마들.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;* Docker is running
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;57&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;하지만 다음과 같은 도커 명령을 시도해 봅니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;docker images
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;58&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;동일한 오류를 표시합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;59&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;아래를 실행하면 해결됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;sudo service docker restart
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;60&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;재시작은 해결했지만 시작은 해결되지 않았습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;61&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;뿌리를 내리고 있는데 밑에서 시도해보니 효과가 있었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;service docker start

export DOCKER_HOST=&quot;tcp://0.0.0.0:2375&quot;
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;62&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;당신이 MAC를 사용하고 있다면 finder에 docker를 입력하기만 하면 자동으로 해결됩니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;63&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;리눅스에서 제게 적합한 솔루션은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;systemctl start docker&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;15&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/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;p papago-id=&quot;66&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;도커상태를확인해주시기바랍니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;$ sudo systemctl status docker&lt;/code&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;67&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그런 다음 도커를 시작하고 활성화한 후 상태를 다시 확인합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$ sudo systemctl start docker &amp;amp;&amp;amp; sudo systemctl enable docker &amp;amp;&amp;amp; sudo systemctl status docker
&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;이제 도커를 확인하는 마지막 단계는 잘 작동합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$ sudo docker run hello-world
&lt;/code&gt;&lt;/pre&gt;&lt;h1 papago-id=&quot;69&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;2022년 솔루션&lt;/font&gt;&lt;/h1&gt; 
&lt;p papago-id=&quot;70&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;내 곁에 있는 이 작품:&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;71&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;볼륨에 다음을 추가합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;volumes:
 - &quot;/var/run/docker.sock:/var/run/docker.sock&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;72&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그 후 아래 명령을 실행합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt; sudo  chown 1000:1000 /var/run/docker.sock
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;73&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;1000은 사용자의 아이디임을 유의하시기 바랍니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음 명령을 실행합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;id
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;74&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또는 $USER에 사용자 이름이 포함된 경우:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt; sudo  chown $USER:$USER /var/run/docker.sock
&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;도커를 설치하고 실행한 후 아래 오류 메시지도 받았습니다: 도커 실행 hello-world #유닉스에서 도커 데몬에 연결할 수 없습니다: /var/run/docker.sock.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;도커 데몬이 실행 중입니까?&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;76&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;여기 해결책이 있습니다. 저한테 효과가 있었던 거죠.&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;77&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Windows 10(윈도우에서 활성화하는 것을 잊지 마십시오:&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;Settings &amp;gt; Update and Security &amp;gt; Developer mode)&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;78&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;우분투 18.04 LTS&lt;/font&gt;&lt;/li&gt; 
 &lt;li&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;도커 데스크톱 버전 2.3.0.2 (45183)&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt; &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;ul&gt; 
   &lt;li papago-id=&quot;79&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;도커 데스크톱에서 활성화:&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;TLS가 없는 tcp: // localhost: 2375에서 데몬 노출&lt;/font&gt;&lt;/li&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;font class=&quot;papago-parent&quot;&gt;로그인만 하면 됩니다)&lt;/font&gt;&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
&lt;/ul&gt; 
&lt;h1 papago-id=&quot;82&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;우분투를 설치한 후 저장소를 업데이트합니다.&lt;/font&gt;&lt;/h1&gt; 
&lt;pre&gt;&lt;code&gt;sudo apt-get update
&lt;/code&gt;&lt;/pre&gt; 
&lt;h1 papago-id=&quot;83&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;HTTPS를 통해 저장소를 사용하려면 다음과 같이 하십시오.&lt;/font&gt;&lt;/h1&gt; 
&lt;pre&gt;&lt;code&gt;sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
&lt;/code&gt;&lt;/pre&gt; 
&lt;h1 papago-id=&quot;84&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;공식 Docker GPG 키를 추가합니다.&lt;/font&gt;&lt;/h1&gt; 
&lt;pre&gt;&lt;code&gt;curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
&lt;/code&gt;&lt;/pre&gt; 
&lt;h1 papago-id=&quot;85&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;지문이 있는 키를 지금 가지고 있는지 확인합니다.&lt;/font&gt;&lt;/h1&gt; 
&lt;pre&gt;&lt;code&gt;sudo apt-key fingerprint 0EBFCD88
&lt;/code&gt;&lt;/pre&gt; 
&lt;h1 papago-id=&quot;86&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;리포지토리 업데이트&lt;/font&gt;&lt;/h1&gt; 
&lt;pre&gt;&lt;code&gt;sudo apt-get update
&lt;/code&gt;&lt;/pre&gt; 
&lt;h1 papago-id=&quot;87&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;도커 저장소 업데이트&lt;/font&gt;&lt;/h1&gt; 
&lt;pre&gt;&lt;code&gt;sudo add-apt-repository &quot;deb [arch = amd64] https://download.docker.com/linux/ubuntu $ (lsb_release -cs) stable &quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;h1 papago-id=&quot;88&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;리포지토리를 다시 업데이트합니다.&lt;/font&gt;&lt;/h1&gt; 
&lt;pre&gt;&lt;code&gt;sudo apt-get update
&lt;/code&gt;&lt;/pre&gt; 
&lt;h1 papago-id=&quot;89&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;도커 버전 설치 명령: 5:18.09.9 ~ 3-0 ~ ubuntu-bionic&lt;/font&gt;&lt;/h1&gt; 
&lt;pre&gt;&lt;code&gt;sudo apt-get install docker-ce = 5: 18.09.9 ~ 3-0 ~ ubuntu-bionic docker-ce-cli = 5: 18.09.9 ~ 3-0 ~ ubuntu-bionic containerd.io
&lt;/code&gt;&lt;/pre&gt; 
&lt;h1 papago-id=&quot;90&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;DOCKER_HOST 설정 명령&lt;/font&gt;&lt;/h1&gt; 
&lt;pre&gt;&lt;code&gt;export DOCKER_HOST=&quot;tcp://0.0.0.0:2375&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;91&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;참고: ubbunto ex로 시작하기 위해 위의 명령을 프로필에 입력하세요: echo &quot;export DOCKER_HOST=&quot;tcp://0.0.0:2375&quot; &amp;gt; ~/. bashrc&lt;/font&gt;&lt;/p&gt; 
&lt;h1 papago-id=&quot;92&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;도커 그룹에 사용자 추가&lt;/font&gt;&lt;/h1&gt; 
&lt;pre&gt;&lt;code&gt;sudo usermod -aG docker $USER
&lt;/code&gt;&lt;/pre&gt; 
&lt;h1 papago-id=&quot;93&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;94&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(Ubuntu 창을 닫았다가 다시 엽니다.) 또는 다음을 실행합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;source ~/.bashrc
&lt;/code&gt;&lt;/pre&gt; 
&lt;h1 papago-id=&quot;95&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;설치를 테스트하는 중(도커 명령 전에 더 많은 sudo를 사용하지 마십시오(오류가 발생합니다), 사용자 &quot;root&quot;이 이미 도커 그룹에 포함되어 있습니다.&lt;/font&gt;&lt;/h1&gt; 
&lt;pre&gt;&lt;code&gt;docker run hello-world
&lt;/code&gt;&lt;/pre&gt; 
&lt;h1 papago-id=&quot;96&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;97&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;98&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 DOCKER_HOST=&quot;tcp://0.0.0.0:2375&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;99&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;참조 : https://docs.docker.com/engine/install/ubuntu/ 세션 : 도커 엔진 설치&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;100&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;#ubuntu와 함께 설치할 수 있는 다른 버전의 도커는 아래 명령을 사용하여 저장소를 참조하십시오: apt-cache madison docker-ce&lt;/font&gt;&lt;/p&gt; 
&lt;h1 papago-id=&quot;101&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그런 다음 원하는 버전의 도커를 설치합니다.&lt;/font&gt;&lt;/h1&gt; 
&lt;pre&gt;&lt;code&gt;sudo apt-get install docker-ce = &amp;lt;VERSION_STRING&amp;gt; docker-ce-cli = &amp;lt;VERSION_STRING&amp;gt; containerd.io
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;102&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;sudo dockerd&lt;/code&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;103&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;$socat TCP-LISTEN:2376,reuseaddr,fork UNIX-CLIENT:/var/run/docker.sock&lt;/code&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://forums.docker.com/t/using-pycharm-docker-plugin-with-docker-beta/8617/9&quot; rel=&quot;noreferrer&quot; papago-id=&quot;104&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;https://forums.docker.com/t/using-pycharm-docker-plugin-with-docker-beta/8617/9&lt;/font&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;105&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그 해결책은 포트 2376을 전세계에 개방합니다 TLS가 활성화되지 않았기 때문에 같은 네트워크에 있는 모든 사람이 당신의 도커 데몬을 납치할 수 있기 때문에 이것은 나쁜 생각입니다&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;106&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;하드 드라이브에 디스크 공간이 남아 있지 않은 것과 관련이 있을 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;장치에 공간이 남아 있는지 확인하십시오. 공간이 남아 있지 않으면 도커를 시작할 수 없습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;17&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 경로에서 정보를 확인&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;/etc/docker/daemon.json&lt;/code&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;{
  &quot;registry-mirror&quot;: [
    &quot;https://registry.docker-cn.com&quot;
  ],
  &quot;insecure-registries&quot;: [
    &quot;192.168.199.100:5000&quot;
  ]
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;108&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;insecure-registries&quot;: [
    &quot;192.168.199.100:5000&quot;
]
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;109&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;잘 실행됩니다. &lt;a href=&quot;https://i.stack.imgur.com/CC1gR.png&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;109-1&quot;&gt;여기에 이미지 설명을 입력&lt;/a&gt;하세요.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;110&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;그래서 스냅(Ubuntu 실행)부터 시작해야 했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;sudo snap start docker&lt;/code&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;111&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그렇지 않으면 &lt;a href=&quot;https://docs.docker.com/engine/install/ubuntu/#install-using-the-repository&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;111-1&quot;&gt;저장소&lt;/a&gt;에서 설치할 수도 있습니다.&lt;/font&gt;&lt;/p&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;font class=&quot;papago-parent&quot;&gt;터미널을 다시 시작하거나 터미널을 호스팅하는 프로세스(예: vScode)를 통해 문제가 해결되었습니다.&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;sudo service docker start
&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;WSL에서 실행 중&lt;/font&gt;&lt;/font&gt;&lt;code&gt;dockerd&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;19&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;문제를 해결합니다&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$ sudo dockerd
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;116&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;node:lts image를 실행하는 gitlab CI에 대해서도 동일한 문제가 발생했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li papago-id=&quot;117&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;방금 도커 데몬을 다시 시작하고 컨테이너를 다시 시작했는데, 저한테 효과가 있었어요.&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;20&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;메시지가 나타나면 AWS 인스턴스에서 도커(설치된 지 얼마 안 됨)를 실행하려고 했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;나는 그냥 글을 씁니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;sudo service docker start&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;21&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고 저는 잘 작동합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;120&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://docs.aws.amazon.com/AmazonECS/latest/developerguide/docker-basics.html&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;120-1&quot;&gt;AWS with Docker&lt;/a&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/44678725/cannot-connect-to-the-docker-daemon-at-unix-var-run-docker-sock-is-the-docker&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>docker</category>
      <author>telecom</author>
      <guid isPermaLink="true">https://telecom.tistory.com/672</guid>
      <comments>https://telecom.tistory.com/672#entry672comment</comments>
      <pubDate>Sun, 22 Oct 2023 19:25:37 +0900</pubDate>
    </item>
    <item>
      <title>재정의는 C에서는 허용되지만 C++에서는 허용되지 않습니까?</title>
      <link>https://telecom.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;재정의는 C에서는 허용되지만 C++에서는 허용되지 않습니까?&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 코드는 C에서는 작동하지만 C++에서는 작동하지 않는 이유는 무엇입니까?&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;int i = 5;
int i; // but if I write int i = 5; again I get error in C also

int main(){

  // using i
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;a href=&quot;http://publib.boulder.ibm.com/infocenter/comphelp/v7v91/index.jsp?topic=/com.ibm.vacpp7a.doc/language/ref/clrc03tentative_defn.htm&quot; rel=&quot;noreferrer&quot;&gt;&lt;strong papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;잠정적 정의는 C에서는 허용되지만 C++에서는 허용되지 않습니다.&lt;/font&gt;&lt;/strong&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;/p&gt; 
&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;C99 6.9.2/2&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;strong papago-id=&quot;5-3&quot;&gt;이니셜라이저&lt;/strong&gt; 없이 ﬁ&lt;strong papago-id=&quot;5-3&quot;&gt;틀&lt;/strong&gt; 범위를 가지며, &lt;strong papago-id=&quot;5-3&quot;&gt;스토리지 클래스 지정자가 없거나&lt;/strong&gt; 스토리지 클래스 &lt;strong papago-id=&quot;5-3&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;0과 같은 이니셜라이저를 사용합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&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;int i&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;C 컴파일러는 모든 잠정적인 정의를 하나의 정의로 결합할 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;i&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 papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;C++에서 코드가 하나의 &lt;a href=&quot;http://en.wikipedia.org/wiki/One_Definition_Rule&quot; rel=&quot;noreferrer&quot; papago-id=&quot;9-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;으로 인해 잘못된 형식입니다(섹션 3.2/1 ISO C++).&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;변환 단위는 &lt;strong papago-id=&quot;10-1&quot;&gt;변수&lt;/strong&gt;, 함수, 클래스 유형, 열거형 또는 템플릿에 &lt;strong papago-id=&quot;10-1&quot;&gt;대한 정의&lt;/strong&gt;를 두 개&lt;strong papago-id=&quot;10-1&quot;&gt; 이상 포함&lt;/strong&gt;할 수 &lt;strong papago-id=&quot;10-1&quot;&gt;없습니다&lt;/strong&gt;.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;hr&gt; 
&lt;blockquote&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;int i = 5;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;12&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또 C에서도 오류가 납니다.&lt;/font&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;왜냐하면 이 경우 초기화자 (5) 때문에 더 이상 잠정적인 정의로 남아있지 않기 때문입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;hr&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;blockquote&gt; 
 &lt;p papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;J.5.11 다중 외부 정의&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;키워드 외부를 명시적으로 사용하든 사용하지 않든 개체의 식별자에 대한 외부 정의가 둘 이상 있을 수 있습니다. 정의가 일치하지 않거나 둘 이상이 초기화되면 동작이 정의되지 않습니다(6.9.2).&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&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://stackoverflow.com/questions/1433204/what-are-extern-variables-in-c/1433387#1433387&quot; papago-id=&quot;17-1&quot;&gt;외부 변수에 대한&lt;/a&gt; 이 &lt;a href=&quot;https://stackoverflow.com/questions/1433204/what-are-extern-variables-in-c/1433387#1433387&quot; papago-id=&quot;17-1&quot;&gt;우수한 게시물&lt;/a&gt;도 확인해보세요.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그것은 잠정적인 정의라고 불립니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;C에서만 가능합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p papago-id=&quot;19&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;19-0&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;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;/blockquote&gt; 
&lt;pre&gt;&lt;code&gt;int i1 = 10;         /* definition, external linkage */
static int i2 = 20;  /* definition, internal linkage */
extern int i3 = 30;  /* definition, external linkage */
int i4;              /* tentative definition, external linkage */
static int i5;       /* tentative definition, internal linkage */

int i1;              /* valid tentative definition */
int i2;              /* not legal, linkage disagreement with previous */
int i3;              /* valid tentative definition */
int i4;              /* valid tentative definition */
int i5;              /* not legal, linkage disagreement with previous */
&lt;/code&gt;&lt;/pre&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;strong papago-id=&quot;21&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;C++는 임시 정의의 개념을 지원하지 않습니다. 스토리지 클래스 지정자가 없는 외부 데이터 선언은 항상 정의입니다.&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p papago-id=&quot;22&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;여기서부터:&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://publib.boulder.ibm.com/infocenter/comphelp/v7v91/index.jsp?topic=/com.ibm.vacpp7a.doc/language/ref/clrc03tentative_defn.htm&quot; rel=&quot;noreferrer&quot; papago-id=&quot;22-1&quot;&gt;잠정적 정의&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;a href=&quot;https://stackoverflow.com/questions/3095861/about-tentative-definition&quot; papago-id=&quot;23-1&quot;&gt;다음&lt;/a&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/5337370/redefinition-allowed-in-c-but-not-in-c&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>C</category>
      <author>telecom</author>
      <guid isPermaLink="true">https://telecom.tistory.com/671</guid>
      <comments>https://telecom.tistory.com/671#entry671comment</comments>
      <pubDate>Sun, 22 Oct 2023 19:25:26 +0900</pubDate>
    </item>
  </channel>
</rss>