<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>lovecheck</title>
    <link>https://lovecheck.tistory.com/</link>
    <description>각종 프로그래밍 정보를 다루는 블로그입니다.</description>
    <language>ko</language>
    <pubDate>Mon, 13 Apr 2026 21:21:05 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>lovecheck</managingEditor>
    <item>
      <title>Mysql vs Oracle XE vs Postgresql. 확장성 및 성능, 어떤 것을 선택해야 합니까?</title>
      <link>https://lovecheck.tistory.com/976</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Mysql vs Oracle XE vs Postgresql. 확장성 및 성능, 어떤 것을 선택해야 합니까?&lt;/font&gt;&lt;/h2&gt;
&lt;div&gt; 
 &lt;aside class=&quot;s-notice s-notice__info post-notice js-post-notice mb16&quot; role=&quot;status&quot;&gt; 
  &lt;div class=&quot;d-flex fd-column fw-nowrap&quot;&gt; 
   &lt;div class=&quot;d-flex fw-nowrap&quot;&gt; 
    &lt;div class=&quot;flex--item mr8&quot;&gt; 
     &lt;svg aria-hidden=&quot;true&quot; class=&quot;svg-icon iconLightbulb&quot; width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 18 18&quot;&gt;
      &lt;path d=&quot;M15 6.38A6.48 6.48 0 0 0 7.78.04h-.02A6.49 6.49 0 0 0 2.05 5.6a6.31 6.31 0 0 0 2.39 5.75c.49.39.76.93.76 1.5v.24c0 1.07.89 1.9 1.92 1.9h2.75c1.04 0 1.92-.83 1.92-1.9v-.2c0-.6.26-1.15.7-1.48A6.32 6.32 0 0 0 15 6.37ZM4.03 5.85A4.49 4.49 0 0 1 8 2.02a4.48 4.48 0 0 1 5 4.36 4.3 4.3 0 0 1-1.72 3.44c-.98.74-1.5 1.9-1.5 3.08v.1H7.2v-.14c0-1.23-.6-2.34-1.53-3.07a4.32 4.32 0 0 1-1.64-3.94ZM10 18a1 1 0 0 0 0-2H7a1 1 0 1 0 0 2h3Z&quot;&gt;&lt;/path&gt;
     &lt;/svg&gt; 
    &lt;/div&gt; 
    &lt;div class=&quot;flex--item wmn0 fl1 lh-lg&quot;&gt; 
     &lt;div class=&quot;flex--item fl1 lh-lg&quot;&gt; 
      &lt;div 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;현재 상태로는 이 질문은 우리의 Q&amp;amp;A 형식에 맞지 않습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;사실, 참고 자료 또는 전문 지식에 의해 답변이 뒷받침되기를 기대하지만, 이 질문은 토론, 주장, 여론 조사 또는 토론을 요청할 가능성이 높습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;만약 이 질문이 개선되고 다시 열릴 수 있다고 생각한다면,&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;/help/reopen-questions&quot; papago-id=&quot;1-1&quot;&gt;안내&lt;/a&gt;를 받기 위해 헬프 &lt;a href=&quot;/help/reopen-questions&quot; papago-id=&quot;1-1&quot;&gt;센터를 방문&lt;/a&gt;합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;      &lt;/font&gt;&lt;/div&gt; 
     &lt;/div&gt; 
    &lt;/div&gt; 
   &lt;/div&gt; 
   &lt;div class=&quot;flex--item mb0 mt8&quot; 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;span class=&quot;relativetime&quot; papago-id=&quot;2-1&quot; title=&quot;2012-12-19 14:38:05Z&quot; papago-attr-id=&quot;1&quot;&gt;10년 전&lt;/span&gt;에.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;   &lt;/font&gt;&lt;/div&gt; 
  &lt;/div&gt; 
 &lt;/aside&gt; 
&lt;/div&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;strong papago-id=&quot;4&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;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 MYSQL을 이용하여 기존 PHP 어플리케이션으로 작업하고 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;테이블은 거의 대부분 MYISAM 엔진을 사용하며 대부분 수백만 개의 행을 포함합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;가장 큰 테이블 중 하나는 필요하지만 성능에 영향을 미치는 EAV 설계를 사용합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;애플리케이션은 MYSQL 캐시를 가장 잘 활용하기 위해 작성되었습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;페이지 로드당 상당한 양의 요청을 요청하며(이 때문에 부분적으로) 각 페이지 로드에 있는 전체 DB의 대부분의 테이블을 거쳐야 할 정도로 복잡합니다.&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;ul&gt; 
 &lt;li papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;무료예요.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;MYISAM 테이블은 응용프로그램에 중요한 전체 텍스트 색인을 지원합니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;단점:&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사물이 설정되는 방식으로, MYSQL은 전체 애플리케이션에 대해 하나의 CPU로 제한됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;매우 까다로운 쿼리 하나가 실행되거나 서버가 많은 부하를 받게 되면 다른 쿼리는 모두 대기열에 놓이게 되어 사이트가 응답하지 않게 됩니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;MYSQL 캐싱과 &quot;WITH&quot; 또는 &quot;INTERCT&quot;가 부족하면 캐시를 더 잘 사용하기 위해 쿼리를 분해해야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이렇게 해서 만들어진 쿼리의 수를 곱합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를 들어, 수백만 행의 여러 테이블에 걸쳐 서브쿼리를 사용하는 것은(적절한 인덱싱에도 불구하고) 현재/상향 부하 및 위 지점에 배치된 제약 조건에 큰 문제가 있음이 드러났습니다(CPU 사용량).&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음 연도에 확장해야 하지만 라이센스 비용을 당장 지불할 준비가 되어 있지는 않기 때문에 애플리케이션을 다시 작성하고 DB를 전환하는 것에 대해 생각해 왔습니다.&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;고려 중인 세 가지 옵션은 mysql을 계속 사용하는 것이지만, INNODB 엔진을 사용하면 더 많은 CPU 파워를 활용할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;Oracle XE에 적응하여 4Gb 데이터베이스, 1Gb RAM 또는 1개 CPU 제한(아직 달성하지 못한)까지 확장해야 할 경우 라이센스를 취득합니다.&lt;/font&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;/p&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그렇다면 질문은 다음과 같습니다.&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;세 가지 경우에 전체 텍스트 인덱싱 손실이 성능에 어떤 영향을 미칩니까(oracle 또는 postgre)?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;SQL에 동등한 것이 있습니까?)&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;Oracle 및 postgre 방법&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;SQL은 하위 쿼리, WITH 및 UNION/INECT 문에 캐쉬를 활용합니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Oracle 및 Postgre의 운영 방식&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;SQL은 멀티코어/CPU 전력 활용(오라클 라이센스를 취득한 경우/취득한 경우)&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이미 대답해야 할 것이 많은 것 같으니 여기까지만 하겠습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;칭찬할 수 있는 링크가 있다면 간단한/불완전한 답변도 상관없습니다.&lt;/font&gt;&lt;/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;/p&gt;&lt;p papago-id=&quot;21&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;PostgreSQL은 전체 텍스트 검색 및 색인을 지원합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;자세한 건 여기 &lt;a href=&quot;http://www.postgresql.org/docs/current/static/textsearch.html&quot; papago-id=&quot;21-1&quot;&gt;있습니다&lt;/a&gt;.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;22&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고 CPU 코어는 얼마든지 사용할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;세션마다 별도의 프로세스를 생성하고 일부 추가 지원 프로세스도 생성합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;자세한 건 여기 &lt;a href=&quot;http://www.postgresql.org/docs/current/static/tutorial-arch.html&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;PostgreSQL에는 쿼리 캐싱 기능이 내장되어 있지 않지만 이러한 목적을 위한 많은 오픈 소스 유틸리티가 있습니다.&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/13952182/mysql-vs-oracle-xe-vs-postgresql-scalability-and-performance-which-to-chose&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>oracle</category>
      <author>lovecheck</author>
      <guid isPermaLink="true">https://lovecheck.tistory.com/976</guid>
      <comments>https://lovecheck.tistory.com/976#entry976comment</comments>
      <pubDate>Sun, 29 Oct 2023 19:50:00 +0900</pubDate>
    </item>
    <item>
      <title>왜 strdup이 사악하다고 여겨지나요?</title>
      <link>https://lovecheck.tistory.com/975</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;왜 strdup이 사악하다고 여겨지나요?&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;0&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 몇 개의 포스터를 봤습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;strdup&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 class=&quot;papago-parent&quot;&gt;&lt;/font&gt;에 대해서&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;가 이루어집니까?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이에 대한 합의가 이루어졌나요?&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;아무런 죄책감 없이 사용했는데 사용하는 것보다 더 나쁠 이유가 없습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;malloc&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;/&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;memcpy&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;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;내가 생각할 수 있는 유일한 것은&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;strdup&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;호출자가 이를 오용할 수 있다는 것이 평판입니다(예: 반환된 메모리의 여유를 확보해야 한다는 것을 깨닫지 못합니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 스트래킷으로 문자열의 끝까지 스트래킷을 시도합니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 몰로크 끈은 오남용의 가능성으로부터 자유롭지 못합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;hr&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;질문이 도움이 되지 않는다고 생각하는 분들께 답변과 사과를 해주셔서 감사합니다(마감 투표).&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;답변 내용을 종합해보면, 일반적인 느낌은 없는 것 같습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;strdup&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그 자체로 사악하지만, C의 다른 많은 부분들처럼 부적절하거나 안전하지 않게 사용될 수 있다는 일반적인 합의입니다.&lt;/font&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;실제로 '올바른' 대답은 없지만, 그 대답을 받아들이기 위해서, 저는 @neoneo의 대답을 받아들였습니다. 마찬가지로 @R...의 대답이었을 수도 있습니다.&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;ol&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;엄격하게 ANSIC이 아니라 POSIX입니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;는 을 막습니다러예: MSVC)다(MSVC호)을 합니다).&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;_strdup&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;em papago-id=&quot;12-1&quot;&gt;기술적&lt;/em&gt;으로 C 표준은 자체적으로 정의할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;strdup&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;str&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;는 예약 접두사입니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;따라서 사용에 따른 휴대성 문제가 발생할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;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;str&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;/li&gt; 
&lt;/ol&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&gt;&lt;code&gt;strdup&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;strdup(&quot;constant string&quot;)&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;16&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;텍스트 문자열의 가변적이고 반환 가능한 복사본을 가져옵니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;17&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;나의 대답은 오히려 지지합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;strdup&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;그리고 이것은 C의 다른 어떤 기능보다 나쁘지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;22&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;POSIX는 &lt;em papago-id=&quot;22-1&quot;&gt;표준&lt;/em&gt;이고,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;strdup&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;20&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;휴대성이 문제가 될 경우 구현하는 것은 그리 어렵지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;21&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;할당된 메모리의 사용 가능 여부&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;strdup&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;22&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;만약 누군가가 남자 페이지를 읽고 어떻게 그 방법을 이해하는 데 시간을 들인다면 문제가 되지 않을 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;strdup&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;em papago-id=&quot;26-1&quot;&gt;모든&lt;/em&gt; 기능에 적용 가능합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;strdup&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;24&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;28&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;C에서 메모리와 다른 대부분의 것들은 프로그래머에 의해 관리되므로 strup은 &lt;em papago-id=&quot;28-1&quot;&gt;자유&lt;/em&gt;롭게 하는 것을 잊는 것만큼 나쁘지 않습니다.&lt;/font&gt;&lt;/font&gt; &lt;code&gt;malloc&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;29&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;'ed memory, &lt;em papago-id=&quot;29-1&quot;&gt;null termination&lt;/em&gt; 실패, 잘못된 형식 문자열 사용&lt;/font&gt;&lt;/font&gt;&lt;code&gt;scanf&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;em papago-id=&quot;30-1&quot;&gt;달링&lt;/em&gt; 포인터 등에 액세스합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p papago-id=&quot;31&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(이 글을 꼭 댓글로 올리고 싶었지만 단 한 개의 댓글도 달 수 없었습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;따라서 답변으로 올립니다).&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;28&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 잘 못 들었습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;strdup&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;ol&gt; 
 &lt;li papago-id=&quot;34&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;표준 C는 아니지만 POSIX에 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;하지만 이런 이유는 부족한 시스템에 거의 한 줄 기능을 추가하는 것이기 때문에 우습다고 생각합니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;35&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;가능한 경우 문자열을 제자리에 사용하는 대신 전체에 문자열을 맹목적으로 복제하면 시간과 메모리가 낭비되고 그렇지 않으면 오류가 발생하지 않을 수도 있는 코드에 오류 사례가 도입됩니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;30&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;문자열의 복사본이 필요한 경우, 문자열을 수정하거나 작성할 공간이 더 필요할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;strdup&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;/li&gt; 
&lt;/ol&gt;&lt;p papago-id=&quot;38&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;대부분의 strup에 대한 우려는 버퍼 오버런과 부적절하게 포맷된 문자열에 대한 보안 문제에서 비롯된다고 생각합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;null이 아닌 종료 문자열이 strup으로 전달되면 정의되지 않은 길이 문자열을 할당할 수 있습니다.&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;32&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;많은 사람들이 분명히 그렇지 않지만, 저는 개인적으로&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;strdup&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;ul&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;34&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;가장 중요한 것은 그것이 할당을 숨기고 있다는 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;른.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;str*&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;35&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;함수들과 대부분의 다른 표준 함수들은 no를 요구합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;free&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&gt;&lt;code&gt;strdup&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;충분히 무해해 보이고 그 후에 청소하는 것을 잊어버릴 수 있습니다. dmckee는 그냥 당신의 정신적인 기능 목록에 그것을 추가하자고 제안했지만, 왜죠?&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;/li&gt; 
 &lt;li&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;항상 힙에 메모리를 할당하고 C99로 메모리를 할당합니다(99입니까?).&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;VLA 여러분, 또 다른 이유가 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;strcpy&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;39&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(당신은 필요도 없습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;malloc&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 class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 항상 이렇게 할 수는 없지만, 할 수 있을 때는 그렇게 해야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p papago-id=&quot;48&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;ISO 표준의 일부는 아니지만(하지만 POSIX 표준의 일부입니다. Wiz 감사합니다.) 이는 R로서 정말 작은 점입니다.&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;/li&gt; 
&lt;/ul&gt; 
&lt;p papago-id=&quot;49&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;물론 이것들은 제 나름의 이유들입니다. 다른 사람들의 이유는 아닙니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;당신의 질문에 답을 드리자면, 제가 알고 있는 합의점이 없습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;41&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;만약 당신이 자신만을 위한 프로그램을 작성하고 있고 당신이 발견할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;strdup&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;42&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font 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;52&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;왜 strdup이 사악하다고 여겨지나요?&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;p papago-id=&quot;53&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;em papago-id=&quot;53-1&quot;&gt;미래의 언어&lt;/em&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;43&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;에 대한 의존도&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;errno&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;44&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;주.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;45&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;더 쉽게 직접 만들 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;strdup()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;46&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그것은 POISX 1이나 미래의 C2x 1과 완전히 같지는 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; &lt;/li&gt; 
&lt;/ol&gt; 
&lt;hr&gt; 
&lt;p&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;C2x와 함께, 특정한 포함이 진행 중입니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;strdup()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;48&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;,  를 합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;strdup()&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;&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;font papago-translate=&quot;translated&quot; papago-id=&quot;50&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;C2x가 &lt;a href=&quot;https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2353.htm&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;50-1&quot;&gt;제안&lt;/a&gt;했습니다.&lt;/font&gt;&lt;/font&gt; &lt;code&gt;strdup()&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;font class=&quot;papago-parent&quot;&gt;언급하지 않음&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;errno&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;a href=&quot;https://pubs.opengroup.org/onlinepubs/009604599/functions/strdup.html&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;52-1&quot;&gt;POSIX&lt;/a&gt;는 그렇지요.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;설정에 의존하는 코드&lt;/font&gt;&lt;/font&gt;&lt;code&gt;errno&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;ENOMEM&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;54&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;아니면&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;EINVAL&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;55&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font 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;56&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;C2x가 &lt;a href=&quot;https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2353.htm&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;56-1&quot;&gt;제안&lt;/a&gt;했습니다.&lt;/font&gt;&lt;/font&gt; &lt;code&gt;char *strdup(const char *s1)&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;57&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;a를 사용합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;const char *&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;58&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font 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;strdup()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;59&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;너무 자주 사용하는&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;char *s1&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;60&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;, 중요한 선택 코드를 깰 수 있는 차이를 발생시키는 것.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;char *&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;61&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;서명&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt; 즉&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt; 기능 포인터.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;기능 포인터.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;62&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;자신의 롤을 수행한 사용자 코드&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;strdup()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;63&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;C의 &lt;strong papago-id=&quot;63-1&quot;&gt;미래 언어 지시&lt;/strong&gt;를 따르지 않았습니다. &quot;str, mem 또는 wcs로 시작하는 함수 이름과 소문자를 &amp;lt;string&amp;gt;의 선언에 추가할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;h&amp;gt; &quot;header&quot;로 인해 라이브러리 충돌이 발생할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;strdup()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;64&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용자의&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;strdup()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;65&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; &lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;66&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용자 코드가 원하는 경우&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;strdup()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;67&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;C2x 이전에 코드를 사용하면 다른 이름을 짓는 것을 고려해 보세요.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;my_strdup()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;68&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;A를 사용합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;const char *&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;69&quot;&gt;&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;errno&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;70&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;전화가 온 후에&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;NULL&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;71&quot;&gt;&lt;font 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;72&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;나의&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;my_strdup()&lt;/code&gt; &lt;font papago-translate=&quot;translated&quot; papago-id=&quot;73&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/a/39694254/2410359&quot; papago-id=&quot;73-0&quot;&gt;노력&lt;/a&gt; - 사마귀 등등&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;74&quot;&gt;&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;아직 언급되지 않은 strdup을 싫어하는 이유는 자연스러운 쌍이 없는 자원 할당이기 때문입니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;바보 같은 게임을 해볼까요?&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;라고 합니다&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;malloc&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;75&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;, 당신은 말합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;free&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;76&quot;&gt;&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;open&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;77&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;당신은 말합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;close&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;78&quot;&gt;&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;create&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;79&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;당신은 말합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;destroy&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;80&quot;&gt;&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;strdup&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;81&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;당신은 ......?&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;82&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 에  답, 은.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;strdup&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;83&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;free&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;84&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;물론, 그리고 그 기능은 더 나은 이름이 지어졌을 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;malloc_and_strcpy&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;85&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그 점을 확실히 하기 위해서요.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;하지만 많은 C 프로그래머들은 그렇게 생각하지 않고 잊어버립니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;strdup&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;86&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;free&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;87&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;할당을 해제합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;88&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;내 경험상, 호출하는 코드에서 메모리 누수를 발견하는 것은 매우 흔한 일입니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;strdup&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;89&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;. 이상한 기능이 결합되어 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;strlen&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;90&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;,&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;malloc&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;91&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;strcpy&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;92&quot;&gt;&lt;font 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;104&quot; papago-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/12984948/why-is-strdup-considered-to-be-evil&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>C</category>
      <author>lovecheck</author>
      <guid isPermaLink="true">https://lovecheck.tistory.com/975</guid>
      <comments>https://lovecheck.tistory.com/975#entry975comment</comments>
      <pubDate>Sun, 29 Oct 2023 19:49:54 +0900</pubDate>
    </item>
    <item>
      <title>크롬 확장을 테스트하는 방법은?</title>
      <link>https://lovecheck.tistory.com/974</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;크롬 확장을 테스트하는 방법은?&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것을 할 수 있는 좋은 방법이 있습니까?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;웹사이트와 콘텐츠 스크립트로 상호작용하여 로컬 스토리지로 데이터를 저장하는 확장자를 작성합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 행동을 테스트하기 위해 사용할 수 있는 도구, 프레임워크 등이 있습니까?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;자바스크립트를 테스트하기 위한 일반적인 도구들이 있다는 것을 알고 있지만, 확장자를 테스트하기에 충분한 능력이 있습니까?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;유닛 테스트도 중요하지만, 다른 테스트(통합 테스트 등)에도 관심이 있습니다.&lt;/font&gt;&lt;/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;최근에 저는 모든 테스트를 응용 프로그램에 내장되어 있지만 물리적으로 입력하지 않으면 연결할 수 없는 &quot;테스트&quot; 페이지에 배치했습니다.&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;chrome-extension://asdasdasdasdad/unittests.html&lt;/code&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;테스트를 통해 다음 단계별로&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;localStorage&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;등의 방법으로 컨텐츠 스크립트에 액세스할 경우, 이론적으로는 테스트 페이지에 내장된 IFRAME을 통해 테스트할 수 있지만, 이는 더 많은 통합 수준의 테스트이므로 단위 테스트에서는 실제 페이지에서 해당 IFRAME을 추상화하여 사용자가 의존하지 않도록 해야 합니다. localStorage에 대한 액세스도 마찬가지입니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;페이지를 직접 테스트하려면 확장을 조정하여 새 탭(chrome.tab.create({&quot;url&quot; : &quot;somurl&quot;})을 열 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;각 새 탭에 대해 컨텐츠 스크립트가 실행되어야 하며 테스트 프레임워크를 사용하여 코드가 수행해야 할 작업을 수행했는지 확인할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;프레임워크에 &lt;a href=&quot;https://github.com/pivotal/jsunit&quot; rel=&quot;noreferrer&quot; papago-id=&quot;8-1&quot;&gt;관해서&lt;/a&gt;는 JsUnit이나 &lt;a href=&quot;https://github.com/jasmine/jasmine&quot; rel=&quot;noreferrer&quot; papago-id=&quot;8-3&quot;&gt;최신&lt;/a&gt; Jasmine이 잘 작동할 것입니다.&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;mocha&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;nodejs&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;phantomjs&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;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;chrome.*&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;미리 정의된 js를 응답에 넣을 수 있는 API.&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;vm.runInNewContext&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;phantomjs&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;렌더 팝업 / 옵션 페이지를 입력합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고 마지막으로 당신은 크롬 API가 필요한 인수를 가지고 호출되었다고 주장합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splited&quot;&gt;&lt;strong papago-id=&quot;12&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;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를 들어 보겠습니다.&lt;/font&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;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&gt;&lt;em papago-id=&quot;21&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;pre&gt;&lt;code&gt;chrome.tabs.query({}, function(tabs) {
  chrome.browserAction.setBadgeText({text: String(tabs.length)});
});
&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;ol&gt; 
 &lt;li&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;chrome.tabs.query&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;미리 정의된 응답(예: 탭 2개)을 반환합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;16&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;조롱당한 자들에게 주사를 놓다&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;chrome.*&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;17&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;일부 환경에 api.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;27&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 환경에서 확장 코드를 실행합니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;28&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;버튼 배지가 '2'와 같다고 주장합니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&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;const vm = require('vm');
const fs = require('fs');
const chrome = require('sinon-chrome');

// 1. mock `chrome.tabs.query` to return predefined response 
chrome.tabs.query.yields([
  {id: 1, title: 'Tab 1'}, 
  {id: 2, title: 'Tab 2'}
]);

// 2. inject our mocked chrome.* api into some environment
const context = {
  chrome: chrome
};

// 3. run our extension code in this environment
const code = fs.readFileSync('src/background.js');
vm.runInNewContext(code, context);

// 4. assert that button badge equals to '2'
sinon.assert.calledOnce(chrome.browserAction.setBadgeText);
sinon.assert.calledWithMatch(chrome.browserAction.setBadgeText, {
  text: &quot;2&quot;
});
&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 class=&quot;papago-parent&quot;&gt;이제 모카로 포장할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;describe..it&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;19&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font 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;$ mocha

background page
  ✓ should display opened tabs count in button badge

1 passing (98ms)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;32&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://github.com/acvetkov/sinon-chrome/tree/76cbfc1c64355a94eb29e2de2119449956d6c2e5/example&quot; rel=&quot;noreferrer&quot; papago-id=&quot;32-1&quot;&gt;여기&lt;/a&gt;서 전체적인 예를 찾을 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;33&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또한 사이논 크롬은 미리 정의된 응답으로 크롬 이벤트를 유발할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;chrome.tab.onCreated.trigger({url: 'http://google.com'});
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;20&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;하는 동안에&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;sinon.js&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 class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 그냥 평범한 재스민을 사용하고 필요한 크롬 콜백을 조롱할 수도 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;예:&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://github.com/serv-inc/JSGuardian/blob/master/test/src/mockExt.js&quot; rel=&quot;noreferrer&quot; papago-id=&quot;36&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;pre&gt;&lt;code&gt;chrome = {
  runtime: {
    onMessage : {
      addListener : function() {}
    }
  }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;a href=&quot;https://github.com/serv-inc/JSGuardian/blob/master/test/spec/LibSpec.js&quot; rel=&quot;noreferrer&quot; papago-id=&quot;37&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;pre&gt;&lt;code&gt;describe(&quot;JSGuardian&quot;, function() {

  describe(&quot;BlockCache&quot;, function() {

    beforeEach(function() {
      this.blockCache = new BlockCache();
    });

    it(&quot;should recognize added urls&quot;, function() {
      this.blockCache.add(&quot;http://some.url&quot;);
      expect(this.blockCache.allow(&quot;http://some.url&quot;)).toBe(false);
    });
} // ... etc
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;38&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;기본값만 수정하면 코드가 실행됩니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;39&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Chrome에 이미 존재하는 툴 정보:&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;p papago-id=&quot;40&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;크롬 개발자 도구에는 Resources For local storage 섹션이 있습니다.&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;개발자 도구 &amp;gt; 리소스 &amp;gt; 로컬 스토리지&lt;/font&gt;&lt;/p&gt; &lt;p papago-id=&quot;42&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;로컬 스토리지의 변화를 확인할 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p papago-id=&quot;43&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;console.profile을 사용하여 성능을 테스트하고 런타임 호출 스택을 확인할 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;44&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;fileSystem 이 URL을 사용하여 파일이 업로드되었는지 여부를 확인할 수 있습니다. filesystem:chrome-extension://temporary/&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p papago-id=&quot;45&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;배경 페이지/스크립트 없이, 메시지 전달 없이 컨텐츠 스크립트와 로컬 스토리지를 함께 사용하는 경우, 해당 사이트에서만 로컬 스토리지에 액세스할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;따라서 해당 페이지를 테스트하려면 해당 탭에 테스트 스크립트를 주입해야 합니다.&lt;/font&gt;&lt;/p&gt;&lt;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;End-to-End를 테스트하려면 다음을 사용할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;puppeteer&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;title&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;24&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;인코그니토 모드에서 확장이 활성화되었는지 확인합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;/p&gt;
&lt;div class=&quot;snippet&quot; data-lang=&quot;js&quot; data-hide=&quot;false&quot; data-console=&quot;true&quot; data-babel=&quot;false&quot;&gt; 
 &lt;div class=&quot;snippet-code&quot;&gt; 
  &lt;pre class=&quot;snippet-code-js lang-js prettyprint-override&quot;&gt;&lt;code&gt;const path = require(&quot;path&quot;);
const puppeteer = require(&quot;puppeteer&quot;);
const assert = require(&quot;assert&quot;);
const Constants = require(&quot;../contants&quot;);
const Utils = require(&quot;./util&quot;);

const extensionID = Constants.EXTENSION_ID;
const extensionPath = path.join(__dirname, &quot;../dist&quot;);
const extensionOptionHtml = &quot;option.html&quot;;
const extPage = `chrome-extension://${extensionID}/${extensionOptionHtml}`;
let extensionPage = null;
let browser = null;

async function boot() {
  browser = await puppeteer.launch({
    // slowMo: 250,
    headless: false, // extension are allowed only in head-full mode
    args: [
      `--disable-extensions-except=${extensionPath}`,
      `--load-extension=${extensionPath}`,
      &quot;--no-sandbox&quot;,
      &quot;--disable-setuid-sandbox&quot;
    ]
  });

  extensionPage = await browser.newPage();
  await extensionPage.goto(extPage);
}

describe(&quot;Extension UI Testing&quot;, function() {
  this.timeout(20000); // default is 2 seconds and that may not be enough to boot browsers and pages.
  before(async function() {
    await boot();
  });

  describe(&quot;option page home&quot;, async function() {
    it(&quot;check title&quot;, async function() {
      const h1 = &quot;Allow extension in Incognito Mode&quot;;
      const extH1 = await extensionPage.evaluate(() =&amp;gt;
        document.querySelector(&quot;h1&quot;).textContent.trim()
      );
      assert.equal(extH1, h1);
    });
    it(&quot;show option ui after enabling extension in incognito&quot;, async () =&amp;gt; {
      await extensionPage.goto(`chrome://extensions/?id=${extensionID}`);
      extensionPage.evaluate(() =&amp;gt;
        document
          .querySelector(&quot;body &amp;gt; extensions-manager&quot;)
          .shadowRoot.querySelector(&quot;#viewManager &amp;gt; extensions-detail-view&quot;)
          .shadowRoot.querySelector(&quot;#allow-incognito&quot;)
          .shadowRoot.querySelector(&quot;#crToggle&quot;)
          .click()
      );
      await Utils.sleep(2000);
      await extensionPage.goto(
        `chrome-extension://${extensionID}/${extensionOptionHtml}`
      );
      const h3 = &quot;Mark Incognito&quot;;
      const headingID = `#${Constants.OPTION_SCRIPT_HOST_ID} &amp;gt; div &amp;gt; div &amp;gt; header &amp;gt; div &amp;gt; h6`;
      await extensionPage.waitFor(headingID);
      console.log({ headingID });
      const extH3 = await extensionPage.evaluate(headingID =&amp;gt; {
        return document.querySelector(headingID).textContent.trim();
      }, headingID);
      console.log({ extH3 });
      assert.equal(extH3, h3);
    });
  });

  after(async function() {
    await browser.close();
  });
});&lt;/code&gt;&lt;/pre&gt; 
 &lt;/div&gt; 
&lt;/div&gt; 
&lt;p&gt;&lt;/p&gt;&lt;p papago-id=&quot;49&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;49-1&quot;&gt;저는 셀레늄&lt;/strong&gt; 웹 &lt;strong papago-id=&quot;49-1&quot;&gt;드라이버&lt;/strong&gt;를 사용하여 확장자가 미리 설치된 새 브라우저 인스턴스를 시작하고 클릭 시에는 &lt;a href=&quot;https://github.com/asweigart/pyautogui&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;49-3&quot;&gt;pyautogui&lt;/a&gt;를 사용할 수 있음을 알게 되었습니다. - 셀레늄은 확장자의 &quot;보기&quot;를 구동할 수 없기 때문입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;클릭 후 스크린샷을 만들어 '예상' 스크린샷과 비교할 수 있으며 95%의 유사성을 기대할 수 있습니다(다른 브라우저에서는 몇 픽셀로 마크업 이동이 허용되므로).&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;50&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;몇 가지 이전 답변을 확인해 드리자면, 재스민은 크롬 확장 기능과 잘 작동하는 것 같습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;버전 3.4.0을 사용하고 있습니다.&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;a href=&quot;https://jasmine.github.io/api/edge/Spy.html&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;51-1&quot;&gt;Jasmine 스파이&lt;/a&gt;를 사용하여 다양한 API에 대한 테스트 더블을 쉽게 만들 수 있습니다.&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;describe(&quot;Test suite&quot;, function() {

  it(&quot;Test case&quot;, function() {

    // Set up spies and fake data.
    spyOn(chrome.browserAction, &quot;setPopup&quot;);
    spyOn(chrome.identity, &quot;removeCachedAuthToken&quot;);
    fakeToken = &quot;faketoken-faketoken-faketoken&quot;;
    fakeWindow = jasmine.createSpyObj(&quot;window&quot;, [&quot;close&quot;]);

    // Call the function under test.
    logout(fakeWindow, fakeToken);

    // Perform assertions.
    expect(chrome.browserAction.setPopup).toHaveBeenCalledWith({popup: &quot;&quot;});
    expect(chrome.identity.removeCachedAuthToken).toHaveBeenCalledWith({token: fakeToken});
    expect(fakeWindow.close.calls.count()).toEqual(1);

  });

});
&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;p papago-id=&quot;53&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다른 답변에서 언급했듯이, 저는 테스트를 실행하는 브라우저 확장의 일부로 HTML 페이지를 만들었습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;HTML 페이지에는 재스민 라이브러리와 내 확장자의 자바스크립트 코드, 그리고 내 테스트 스위트가 포함되어 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;테스트는 자동으로 실행되고 결과는 사용자에게 맞게 포맷됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;테스트 러너나 결과를 작성할 필요가 없습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://github.com/jasmine/jasmine#installation&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;53-1&quot;&gt;설치 지침&lt;/a&gt;을 따르고, 거기에 문서화된 HTML을 사용하여 테스트 런너 페이지를 만들고, 테스트 스위트도 페이지에 포함시키기만 하면 됩니다.&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;다른 호스트에서 동적으로 Jasmine 프레임워크를 가져올 수 없을 것 같아서 제 확장에 Jasmine 릴리즈를 포함시켰습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;물론 생산을 위한 확장 공사를 할 때 그것과 테스트 케이스도 생략할 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;55&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;명령 줄에서 테스트를 실행하는 방법을 살펴보지 않았습니다.&lt;/font&gt;&lt;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;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/2869827/how-to-test-chrome-extensions&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>javascript</category>
      <author>lovecheck</author>
      <guid isPermaLink="true">https://lovecheck.tistory.com/974</guid>
      <comments>https://lovecheck.tistory.com/974#entry974comment</comments>
      <pubDate>Sun, 29 Oct 2023 19:49:47 +0900</pubDate>
    </item>
    <item>
      <title>모든 경로에서 Can Activate guard를 신청하는 방법은?</title>
      <link>https://lovecheck.tistory.com/973</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;모든 경로에서 Can Activate guard를 신청하는 방법은?&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;사용자가 로그인하지 않은 경우 로그인 페이지로 리디렉션하는 angular2 active guard가 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;import { Injectable } from  &quot;@angular/core&quot;;
import { CanActivate , ActivatedRouteSnapshot, RouterStateSnapshot, Router} from &quot;@angular/router&quot;;
import {Observable} from &quot;rxjs&quot;;
import {TokenService} from &quot;./token.service&quot;;

@Injectable()
export class AuthenticationGuard implements CanActivate {

    constructor (
        private router : Router,
        private token : TokenService
    ) { }

    /**
     * Check if the user is logged in before calling http
     *
     * @param route
     * @param state
     * @returns {boolean}
     */
    canActivate (
        route : ActivatedRouteSnapshot,
        state : RouterStateSnapshot
    ): Observable&amp;lt;boolean&amp;gt; | Promise&amp;lt;boolean&amp;gt; | boolean {
        if(this.token.isLoggedIn()){
            return true;
        }
        this.router.navigate(['/login'],{ queryParams: { returnUrl: state.url }});
        return;
    }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음과 같이 각 경로에서 실행해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;const routes: Routes = [
    { path : '', component: UsersListComponent, canActivate:[AuthenticationGuard] },
    { path : 'add', component : AddComponent, canActivate:[AuthenticationGuard]},
    { path : ':id', component: UserShowComponent },
    { path : 'delete/:id', component : DeleteComponent, canActivate:[AuthenticationGuard] },
    { path : 'ban/:id', component : BanComponent, canActivate:[AuthenticationGuard] },
    { path : 'edit/:id', component : EditComponent, canActivate:[AuthenticationGuard] }
];
&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;canActive 옵션을 각 경로에 추가하지 않고 구현할 수 있는 더 나은 방법이 있습니까?&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;제가 원하는 것은 주요 노선에 추가하는 것이고, 다른 모든 노선에 적용되어야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;많이 찾아봤지만, 유용한 해결책을 찾을 수 없었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;감사해요.&lt;/font&gt;&lt;/p&gt;&lt;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;const routes: Routes = [
    {path: '', canActivate:[AuthenticationGuard], children: [
      { path : '', component: UsersListComponent },
      { path : 'add', component : AddComponent},
      { path : ':id', component: UserShowComponent },
      { path : 'delete/:id', component : DeleteComponent },
      { path : 'ban/:id', component : BanComponent },
      { path : 'edit/:id', component : EditComponent }
    ]}
];
&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;또한 app.component의 ngOnInit 기능에서 라우터의 경로 변경을 가입하고 인증을 확인할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;    this.router.events.subscribe(event =&amp;gt; {
        if (event instanceof NavigationStart &amp;amp;&amp;amp; !this.token.isLoggedIn()) {
            this.router.navigate(['/login'],{ queryParams: { returnUrl: state.url}}); 
        }
    });
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 경로가 변경될 때 어떤 종류의 앱이든 전체적으로 확인하는 이런 방식을 선호합니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;부모(예를 들어 경로 &quot;admin&quot;을 가진)와 자녀를 둘 수 있는 &quot;자녀 라우팅&quot;을 구현해야 한다고 생각합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그런 다음 부모에게 모든 자식에 대한 액세스를 자동으로 제한하는 캔 활성화를 적용할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를 들어 &quot;admin/home&quot;에 액세스하려면 canActivate에 의해 보호되는 &quot;admin&quot;을 거쳐야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;원하는 경우 빈 경로 &quot;&quot;로 부모를 정의할 수도 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/43487827/how-to-apply-canactivate-guard-on-all-the-routes&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>Angular</category>
      <author>lovecheck</author>
      <guid isPermaLink="true">https://lovecheck.tistory.com/973</guid>
      <comments>https://lovecheck.tistory.com/973#entry973comment</comments>
      <pubDate>Sun, 29 Oct 2023 19:49:37 +0900</pubDate>
    </item>
    <item>
      <title>C와 C++ 컴파일러가 명시적으로 초기화된 글로벌 변수와 기본 초기화된 글로벌 변수를 서로 다른 세그먼트에 배치하는 이유는 무엇입니까?</title>
      <link>https://lovecheck.tistory.com/972</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;a href=&quot;http://www.tenouk.com/ModuleZ.html&quot; papago-id=&quot;1-1&quot;&gt;C 프로그램의 메모리 레이아웃&lt;/a&gt;에 대한 이 &lt;a href=&quot;http://www.tenouk.com/ModuleZ.html&quot; papago-id=&quot;1-1&quot;&gt;멋진 글&lt;/a&gt;을 읽고 있었습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;기본 초기화된 전역 변수는 &lt;a href=&quot;https://en.wikipedia.org/wiki/.bss&quot; papago-id=&quot;1-3&quot;&gt;BSS 세그먼트&lt;/a&gt;에 존재하며 전역 변수에 값을 명시적으로 제공하면 데이터 &lt;a href=&quot;https://en.wikipedia.org/wiki/Data_segment&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;저는 이 동작을 조사하기 위해 C와 C++의 다음 프로그램을 테스트했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
// Both i and s are having static storage duration
int i;     // i will be kept in the BSS segment, default initialized variable, default value=0
int s(5);  // s will be kept in the data segment, explicitly initialized variable,
int main()
{
    std::cout&amp;lt;&amp;lt;&amp;amp;i&amp;lt;&amp;lt;' '&amp;lt;&amp;lt;&amp;amp;s;
}
&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;0x488020 0x478004
&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;따라서 출력에서 보면 변수 i와 s 모두 완전히 다른 세그먼트에 있는 것처럼 보입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;하지만 변수 S에서 이니셜라이저(본 프로그램에서는 초기값 5)를 제거한 후 프로그램을 실행하면 다음과 같은 출력이 나옵니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;출력:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;0x488020 0x488024
&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;따라서 출력에서 보면 변수 i와 s가 모두 동일한(이 경우 BSS) 세그먼트에 있는 것처럼 보입니다.&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;이 동작은 C에서도 마찬가지입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
int i;      // i will be kept in the BSS segment, default initialized variable, default value=0
int s=5;    // s will be kept in the data segment, explicitly initialized variable,
int main(void)
{
    printf(&quot;%p %p\n&quot;,(void*)&amp;amp;i,(void*)&amp;amp;s);
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;출력:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;004053D0 00403004
&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;따라서 다시 출력(변수의 주소를 조사하는 것을 의미)을 보면 변수 i와 s 모두 완전히 다른 세그먼트에 존재한다고 말할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;하지만 변수 S에서 이니셜라이저(본 프로그램에서는 초기값 5)를 제거한 후 프로그램을 실행하면 다음과 같은 출력이 나옵니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;출력:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;004053D0 004053D4
&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;따라서 출력에서 보면 변수 i와 s가 모두 동일한(이 경우 BSS) 세그먼트에 있는 것처럼 보입니다.&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;C와 C++ 컴파일러가 명시적으로 초기화된 글로벌 변수와 기본 초기화된 글로벌 변수를 서로 다른 세그먼트에 배치하는 이유는 무엇입니까?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;기본 초기화된 변수와 명시적으로 초기화된 변수 사이에 전역 변수가 어디에 있는지에 대한 차이가 있는 이유는 무엇입니까?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;제가 틀리지 않았다면, C와 C++ 표준은 스택, 힙, 데이터 세그먼트, 코드 세그먼트, BSS 세그먼트 등 구현에 특화된 모든 것에 대해 절대 말하지 않습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그렇다면 C++ 구현에서 명시적으로 초기화된 변수와 기본 초기화된 변수를 서로 다른 세그먼트에 저장하는 대신 동일한 세그먼트에 저장할 수 있습니까?&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;13&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;C 언어나 C++ 언어 모두 &quot;세그먼트&quot;라는 개념을 가지고 있지 않으며, 모든 OS가 그런 것도 아니기 때문에 질문은 플랫폼과 컴파일러에 의존할 수밖에 없습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;즉, 일반적인 구현은 초기화된 변수와 초기화되지 않은 변수를 다르게 취급할 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;주요 차이점은 초기화되지 않은(또는 기본 0-초기화된) 데이터를 컴파일된 모듈로 실제로 저장할 &lt;em papago-id=&quot;14-1&quot;&gt;필요&lt;/em&gt;가 없고, 실행 시간에 나중에 사용하기 &lt;em papago-id=&quot;14-3&quot;&gt;위해&lt;/em&gt; 선언&lt;em papago-id=&quot;14-3&quot;&gt;/예약&lt;/em&gt;된 데이터만 저장할 수 있다는 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;실질적인 &quot;세그먼트&quot; 용어에서 초기화된 데이터는 바이너리의 일부로 디스크에 &lt;em papago-id=&quot;14-5&quot;&gt;저장&lt;/em&gt;되는 반면, 초기화되지 않은 데이터는 그렇지 &lt;em papago-id=&quot;14-7&quot;&gt;않으며&lt;/em&gt;, 대신 선언된 &quot;예약&quot;을 충족하기 위해 시작할 때 할당됩니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;정말 짧은 대답은 &quot;공간을 덜 차지하기 때문&quot;입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;(다른 사람들이 언급한 것처럼, 컴파일러는 이것을 할 필요가 없습니다!)&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;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;data&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;섹션에는 해당 값이 상대적인 위치에 저장된 데이터가 포함됩니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이는 초기화된 데이터의 각 바이트에 대해 해당 데이터 섹션에 1바이트가 포함됨을 의미합니다.&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;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;초기화된 전역이 0인 경우 0을 많이 저장할 이유가 없습니다.&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;그래서 4132 바이트의 0을 저장하는 대신에&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;data&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;secondon, &quot;BSS는 4132 바이트 길이이다&quot;라는 것이 있을 뿐입니다 - 그리고 그것이 0이 되도록 설정하는 것은 OS/runtime에 달려있습니다. - 경우에 따라서는 컴파일러의 런타임이&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;memset(BSSStart, 0, BSSSize)&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또는 유사한.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를 들어 리눅스의 경우 프로세스가 생성될 때 어차피 모든 &quot;사용하지 않은&quot; 메모리가 0으로 채워지므로 BSS를 0으로 설정하는 것은 애초에 메모리를 할당하는 문제일 뿐입니다.&lt;/font&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;물론 실행 파일이 짧아지면 다음과 같은 여러 이점이 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;하드 디스크에 차지하는 공간 감소, 로딩 시간 단축 [OS가 할당된 메모리를 0으로 미리 채우면 추가 보너스], 컴파일러/링커가 데이터를 디스크에 쓸 필요가 없으므로 컴파일 시간이 단축됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;22&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그래서 이것에는 완전히 현실적인 이유가 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;23&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;BSS는 정의상 다른 세그먼트가 아니라 데이터 세그먼트의 일부입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p papago-id=&quot;24&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;C 및 C++에서 명시적 초기화기 없이 정적으로 할당된 개체는 0으로 초기화됩니다. 구현은 또한 0-값 비트로만 구성된 값으로 초기화된 정적으로 할당된 변수와 상수를 &lt;a href=&quot;https://en.wikipedia.org/wiki/.bss#BSS_in_C&quot; rel=&quot;nofollow&quot; papago-id=&quot;24-1&quot;&gt;BSS 섹션&lt;/a&gt;에 할당할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p papago-id=&quot;25&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;BSS에 저장하는 이유는 초기화되지 않은 값 또는 기본값을 가진 변수 유형을 데이터 세그먼트에 배치된 변수가 아닌 이진 파일의 공간을 낭비하지 않고 런타임에 얻을 수 있기 때문입니다.&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;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/34367781/why-do-c-and-c-compilers-place-explicitly-initialized-and-default-initialized&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>C</category>
      <author>lovecheck</author>
      <guid isPermaLink="true">https://lovecheck.tistory.com/972</guid>
      <comments>https://lovecheck.tistory.com/972#entry972comment</comments>
      <pubDate>Sun, 29 Oct 2023 19:49:30 +0900</pubDate>
    </item>
    <item>
      <title>앱이 다시 시작되지 않고 다시 시작됨</title>
      <link>https://lovecheck.tistory.com/971</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;앱이 다시 시작되지 않고 다시 시작됨&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;누군가가 해결책은 아니더라도 최소한 행동에 대한 설명이라도 알아내는데 도움을 줄 수 있기를 바랍니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;문제:&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;em 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;/em&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;세부 정보:&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;0&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Launcher 아이콘을 누르면 앱이 정상적으로 시작됩니다. 즉, 첫번째 이름으로 Intent가 실행됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Activity&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;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;android.intent.action.MAIN&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고 카테고리&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;android.intent.category.LAUNCHER&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 항상 &lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 그러나 항상 그런 것은 아닙니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&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&gt;&lt;code&gt;Activity&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;10&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;OS 메뉴의 &quot;Recent Tasks&quot;에서 선택한 것과 동일한 방법으로 재개됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것이 제가 &lt;em papago-id=&quot;10-1&quot;&gt;모든&lt;/em&gt; 기기에서 원하는 행동입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 선택한 다른 장치에서는 다음과 같은 다른 동작이 발생합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;12&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;모토로라 줌에서 런처 아이콘을 누르면 &lt;em papago-id=&quot;12-1&quot;&gt;앱&lt;/em&gt;이 항상 초기 실행을 시작합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Activity&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;현재 실행 중인 것과 관계없이&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;런처 아이콘은 항상 &quot;런처&quot; 의도를 시작한다고 가정합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;삼성 탭 2에서 런처 아이콘을 누르면 앱을 설치한 지 얼마 안 된 경우 항상 초기화가 실행됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Activity&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(Xoom과 동일) - 그러나 설치 후 장치를 다시 시작하면 실행기 아이콘이 대신 앱을 다시 시작합니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이러한 장치는 장치 시작 시 검색 테이블에 &quot;설치된 앱&quot;을 추가하여 런처 아이콘이 실행 중인 작업을 올바르게 재개할 수 있다고 가정합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
&lt;/ul&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;em papago-id=&quot;16-1&quot;&gt;들리는&lt;/em&gt; 답변을 많이 읽었지만, 단순히 덧붙입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;android:alwaysRetainTaskState=&quot;true&quot;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또는 사용하기&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;launchMode=&quot;singleTop&quot;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;12&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Activity&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&gt;&lt;strong papago-id=&quot;20&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;21&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;가장 최근에 이 앱을 실행한 후에, 우리는 이 동작이 처음 다시 시작한 후에 &lt;em papago-id=&quot;21-1&quot;&gt;모든&lt;/em&gt; 기기에서 발생하기 시작했다는 것을 알게 되었습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;제가 보기에는 미친 것 같지만, 다시 시작하는 과정을 보면 실제로 무엇이 잘못되고 있는지 찾을 수가 없습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;22&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용자가 경험하고 있는 동작은 API 1 이후 일부 Android 런처에 존재하는 문제로 인해 발생합니다. 이 버그에 대한 자세한 내용은 물론 가능한 해결책도 여기 https://code.google.com/p/android/issues/detail?id=2373 에서 확인할 수 있습니다.&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;안드로이드 런처 재고에서 문제가 발생한 것을 본 적이 없습니다.&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;앱을 다시 시작하고 실행 활동이 표시되면 뒤로 버튼을 클릭하면 이러한 상황임을 확인할 수 있습니다.&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;이 문제를 해결하기 위해 구현하기로 한 해결 방법은 의도를 확인하는 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;CARECTORY_Launcher 카테고리 및 의도.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;ACTION_MAIN 동작은 초기 Activity를 시작하는 intent에 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 두 개의 플래그가 있는데 활동이 작업의 루트(앱이 이미 실행 중임을 의미)에 없으면 초기 활동에서 finish()를 호출합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그 정확한 해결책은 당신에게 효과가 없을 수도 있지만, 비슷한 것이 있어야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;26&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음은 초기/시작 활동의 Create()에서 수행하는 작업입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;    if (!isTaskRoot()
            &amp;amp;&amp;amp; getIntent().hasCategory(Intent.CATEGORY_LAUNCHER)
            &amp;amp;&amp;amp; getIntent().getAction() != null
            &amp;amp;&amp;amp; getIntent().getAction().equals(Intent.ACTION_MAIN)) {

        finish();
        return;
    }
&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;이 질문은 2016년에도 여전히 유효합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;오늘 QA 테스터가 안드로이드 M의 &lt;em papago-id=&quot;27-1&quot;&gt;스톡 런처에서 다시&lt;/em&gt; 시작하는 것이 아니라 다시 시작하는 앱을 보고했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;28&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;실제로 시스템은 시작된 작업을 현재 작업 &lt;a href=&quot;https://developer.android.com/guide/components/tasks-and-back-stack.html#ManagingTasks&quot; rel=&quot;noreferrer&quot; papago-id=&quot;28-1&quot;&gt;스택&lt;/a&gt;에 추가하고 있었지만 &lt;em papago-id=&quot;28-3&quot;&gt;사용자에게 다시&lt;/em&gt; 시작된 작업이 발생하여 작업이 중단된 &lt;em papago-id=&quot;28-3&quot;&gt;것&lt;/em&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;29&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;30&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Playstore에서 앱 실행 대화상자: A 활동이 나타납니다 &lt;em papago-id=&quot;30-1&quot;&gt;[태스크 스택:&lt;/em&gt; &lt;em papago-id=&quot;30-1&quot;&gt;A]&lt;/em&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;31&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;활동 B로 이동 &lt;em papago-id=&quot;31-1&quot;&gt;[태스크 스택: &lt;/em&gt;A -&amp;gt;&lt;em papago-id=&quot;31-1&quot;&gt; B]&lt;/em&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;32&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;홈' 버튼을 누릅니다.&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;앱 드로어에서 앱을 시작합니다: A 활동이 나타납니다!&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;em papago-id=&quot;33-1&quot;&gt;[태스크 스택: A -&amp;gt; B -&amp;gt; A] (사용자는 '뒤로' 버튼을 눌러 여기서 'B' 활동으로 이동할 수 있습니다)&lt;/em&gt;&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&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;참고: ADB를 통해 배포된 디버그 APK의 경우에는 이 문제가 나타나지 않으며, Play Store에서 다운로드하거나 사이드 로드된 APK에서만 발생합니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;후자의 경우, 5단계의 발사 의도가 깃발을 포함하고 있었습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT&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&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;런처에서 앱을 콜드 스타트하면 문제가 사라집니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;제가 의심하는 것은 작업이 완전히 삭제될 때까지 올바른 시작 동작을 방해하는 잘못된 형식(더 정확하게는 표준이 아닌) 의도로 작업이 시드된다는 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;36&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다양한 &lt;a href=&quot;https://developer.android.com/guide/topics/manifest/activity-element.html#lmode&quot; rel=&quot;noreferrer&quot; papago-id=&quot;36-1&quot;&gt;활동 시작 모드&lt;/a&gt;를 시도했지만, 이러한 설정은 사용자가 예상하는 표준 동작(활동 B에서 작업 재개)에서 너무 벗어납니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;작업 및 백스택 &lt;a href=&quot;https://developer.android.com/guide/components/tasks-and-back-stack.html&quot; papago-id=&quot;36-3&quot; rel=&quot;noreferrer&quot;&gt;안내서&lt;/a&gt;의 '&lt;a href=&quot;https://developer.android.com/guide/components/tasks-and-back-stack.html&quot; papago-id=&quot;36-3&quot; rel=&quot;noreferrer&quot;&gt;작업 시작&lt;/a&gt;' &lt;a href=&quot;https://developer.android.com/guide/components/tasks-and-back-stack.html&quot; papago-id=&quot;36-3&quot; rel=&quot;noreferrer&quot;&gt;아래&lt;/a&gt; 페이지 하단에 있는 예상 동작에 대한 다음 정의를 참조하십시오.&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p papago-id=&quot;37&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이런 종류의 의도 필터는 활동의 아이콘과 레이블을 응용프로그램 실행기에 표시하게 하여 활동을 실행하고 활동이 실행된 후 언제든지 작성한 작업으로 돌아갈 수 있도록 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p papago-id=&quot;38&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 이 &lt;a href=&quot;https://stackoverflow.com/a/10598619/623640&quot; papago-id=&quot;38-1&quot;&gt;답변&lt;/a&gt;이 적합하다는 것을 알고 사용자가 애플리케이션을 열 때 적절하게 재개되도록 제 루트 활동(A)의 'onCreate' 메서드에 다음을 삽입했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;                    /**
     * Ensure the application resumes whatever task the user was performing the last time
     * they opened the app from the launcher. It would be preferable to configure this
     * behavior in  AndroidMananifest.xml activity settings, but those settings cause drastic
     * undesirable changes to the way the app opens: singleTask closes ALL other activities
     * in the task every time and alwaysRetainTaskState doesn't cover this case, incredibly.
     *
     * The problem happens when the user first installs and opens the app from
     * the play store or sideloaded apk (not via ADB). On this first run, if the user opens
     * activity B from activity A, presses 'home' and then navigates back to the app via the
     * launcher, they'd expect to see activity B. Instead they're shown activity A.
     *
     * The best solution is to close this activity if it isn't the task root.
     *
     */

    if (!isTaskRoot()) {
        finish();
        return;
    }
&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;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;아하! (tldr; 하단 굵은 글씨로 문장 보기)&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;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;16&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;자, 그럼 일단 추정부터 해보겠습니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;런처를 누르면 기본값으로 시작됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Activity&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;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;Task&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;18&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이전 출시로 시작된 제품이 열려 있습니다. 이 제품이 전면으로 나옵니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다른 방법으로 이동 - 탐색 단계에서 새 항목을 작성하는 경우&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Task&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;19&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;finish&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;20&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이전의 런처는 이제 더 이상 당신의 앱을 재개하지 않을 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;21&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;만약 그 추측이 사실이라면, 저는 그것이 버그가 되어야 한다고 확신합니다, 각각의 사람들이&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Task&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;22&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;동일한 프로세스에 있으며 처음 작성한 이력서와 동일한 유효한 이력서 후보자입니까?&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;23&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;내 문제는 몇개의 깃발을 제거함으로써 해결되었습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Intents&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;24&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;:&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK );
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;25&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;아주 분명하지만,&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;FLAG_ACTIVITY_NEW_TASK&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;26&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;새것을 만듭니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Task&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 class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 이것을 범죄자로 간주하고 테스트하기 위해 제거했고 저는 여전히 문제가 있어서 그것을 기각했습니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;하지만 저는 여전히 다음과 같은 조건을 가지고 있었습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;28&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;내 스플래시 화면이 &quot;메인&quot;을 시작하고 있었습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Activity&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;29&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;위의 깃발을 사용하는 제 앱에서.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;결국, 내가 내 앱을 다시 시작하고,&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Activity&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;30&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;아직도 운영 중이라 상태 정보를 보존하고 싶습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;31&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://developer.android.com/reference/android/content/Intent.html#FLAG_ACTIVITY_CLEAR_TOP&quot; papago-id=&quot;31-1&quot;&gt;문서&lt;/a&gt;에 새로 시작하는 것에 대한 언급이 없다는 것을 알게 될 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Task&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;32&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;:&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p papago-id=&quot;59&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;설정되어 있고 실행 중인 활동이 현재 작업에서 이미 실행 중인 경우, 해당 활동의 새 인스턴스를 실행하는 대신 해당 활동의 다른 모든 활동이 종료되고 이 활동이 새로운 활동으로 이전 활동(현재 맨 위)에 전달됩니다.&lt;/font&gt;&lt;/p&gt; 
 &lt;p papago-id=&quot;60&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를 들어, A, B, C, D 활동으로 구성된 작업을 생각해 보겠습니다. 만약 D가 활동 B의 구성 요소로 해결하는 Intent로 Activity()를 시작하면, C와 D는 끝나고 B는 주어진 Intent를 받게 되며, 결과적으로 스택은 A, B가 됩니다.&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;위의 예에서 현재 실행 중인 활동 B 인스턴스는 여기서 시작하는 새 의도를 새 의도() 메서드에서 수신하거나 새 의도로 완료하고 다시 시작합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;실행 모드를 &quot;multiple&quot;(기본값)로 선언하고 FLAG_ACTIVE_SINGLE_TOP을 동일한 의도로 설정하지 않은 경우 실행 모드가 완료되어 다시 생성됩니다. 다른 모든 실행 모드에 대해 또는 FLAG_ACTIVE_SINGLE_TOP이 설정된 경우 이 의도가 NewIntent()의 현재 인스턴스로 전달됩니다.&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;이 실행 모드는 FLAG_ACTIVE_NEW_TASK와 함께 사용할 수도 있습니다. 작업의 루트 활동을 시작하는 데 사용되는 경우 해당 작업의 현재 실행 중인 인스턴스를 포그라운드로 가져온 다음 루트 상태로 지웁니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 기능은 예를 들어 알림 관리자에서 작업을 시작할 때 특히 유용합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p papago-id=&quot;63&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그래서 저는 다음과 같은 상황에 처했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;code&gt;A&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;code&gt;B&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;34&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;와 함께&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;FLAG_ACTIVITY_CLEAR_TOP&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;35&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;,&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;A&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;36&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;마무리를 짓습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;B&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;37&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;서비스를 재시작하기를 원하므로 사용자를 에 보냅니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;A&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;38&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;서비스 재시작 로직 및 UI(플래그 없음)가 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;A&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;39&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;발사들&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;B&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; FLAG_ACTIVE_CLEAR_와 &lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;TOP 으로,&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;A&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;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;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;42&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 단계에서 두번째.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;FLAG_ACTIVITY_CLEAR_TOP&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;43&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;플래그가 다시 시작되고 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;B&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;44&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;작업 스택에 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이번 사건은 그들을 파괴할 것이라고 생각합니다&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Task&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;45&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고 새로운 문제를 일으켜서 제 문제를 일으키고 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;font 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;77&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그렇다면, 제 추측이 모두 맞다면,&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;46&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Launcher&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;47&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;처음에 만든 작업만 다시 시작합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;&lt;code&gt;FLAG_ACTIVITY_CLEAR_TOP&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;48&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;will, 만약 그것이 유일하게 남아있는&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Activity&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;49&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;, 또한 새것을 다시 만듭니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Task&lt;/code&gt;&lt;/strong&gt;&lt;/li&gt; 
&lt;/ul&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;50&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;Android &lt;em papago-id=&quot;50-1&quot;&gt;Manifest.xml&lt;/em&gt; 파일에서,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;launchMode&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;font class=&quot;papago-parent&quot;&gt;로 설정됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;singleInstance&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;52&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;android:launchMode=&quot;singleInstance&quot;&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;launchMode&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 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;87&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Cats60에서 Developer 옵션에서 &quot;Don't keep activities&quot;(활동 유지 안 함)를 활성화하여 다시 비활성화하면 앱의 상태를 잃지 않고 앱을 전환할 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;88&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 솔루션은 제게 효과적이었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;    @Override
    public boolean onKeyUp(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            Intent startMain = new Intent(Intent.ACTION_MAIN);
            startMain.addCategory(Intent.CATEGORY_HOME);
            startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(startMain);
            return false;
        }
        else
            return super.onKeyUp(keyCode, event);
    }
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;89&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;credit : &lt;a href=&quot;https://stackoverflow.com/questions/28162815/i-need-to-minimize-the-android-application-on-back-button-click&quot; papago-id=&quot;89-1&quot;&gt;back button 클릭시 안드로이드 어플리케이션을 최소화해야 합니다&lt;/a&gt;.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;90&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;91&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;em papago-id=&quot;92&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(Kotlin 코드, 주 활동)&lt;/font&gt;&lt;/em&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;override fun onBackPressed() {
    finish()
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;93&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;로그인 활동에서 기본 활동으로 이동할 때 다음을 사용합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;    val intent = Intent(this, MainActivity::class.java)
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK)
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
    startActivity(intent)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;94&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 플래그를 사용할 때 기본 활동에서 &lt;strong papago-id=&quot;94-1&quot;&gt;onBackPressed()&lt;/strong&gt;를 사용할 필요가 없습니다. 백클릭 시 앱이 자연스럽게 종료됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고 홈 버튼을 누르고 앱으로 돌아가면 다시 시작되지 않습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;95&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;프로그래밍에 대해 전혀 모르고 안드로이드 폰에서 이 문제를 경험하는 사람들을 위한 해결책.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 대부분 안드로이드 버전의 업그레이드 때문에 발생합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;업그레이드 후에는 모든 앱이 배터리 사용량이 적도록 최적화됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 이 경우 장치 속도가 느려집니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;96&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;97&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;설정으로 이동&amp;gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&amp;gt;앱스&amp;gt;&amp;gt;앱스 설정(화면의 어느 곳에서나 설정 기호를 찾습니다-기기마다 다릅니다)&amp;gt;배터리 최적화(또는 이와 유사한 opti[여기에 이미지 설명 입력][1]on]&amp;gt;&amp;gt;&lt;strong papago-id=&quot;97-1&quot;&gt;모든 앱&lt;/strong&gt;을 '최적화되지 않음' &lt;strong papago-id=&quot;97-1&quot;&gt;상태로 이동&lt;/strong&gt;합니다(수동으로 1씩 해야 함-일부 전화에서는 허용/불허가될 수 있음).&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;런처 앱은 '최적화되지 않음'이 필요합니다(제 경우 Zen UI 런처 - 이것이 범인입니다- 시간이 있으면 다른 앱을 최적화하고 다시 시작하지 않음).&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;97-3&quot;&gt;이제 전화를 다시 시작합니다.&lt;/strong&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;(데이터/안전 모드 또는 문제를 재설정할 필요가 없음)&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;98&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;지금 멀티태스킹을 시도해보세요.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;:) 이제 Launcher 아이콘을 누르면 현재 작업이 재개됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;:) 기기가 배터리 걱정하지 마세요 어차피 방전되니까요.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;99&quot; papago-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;strong&gt;&lt;em papago-id=&quot;100&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용자에게는 이력서처럼 보이지만 실제로는 완전한 시작입니다.&lt;/font&gt;&lt;/em&gt;&lt;/strong&gt; &lt;/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;strong papago-id=&quot;55-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;OS는 원래 번들을 create에 전달하여 앱을 다시 시작하기만 하면 됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 에서 원래 번들에 추가할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;onSaveInstanceState&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 class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;따라서 OS에서 앱을 다시 시작할 때 인스턴스 상태를 복원할 수 있으며 앱을 다시 시작할지, 다시 시작할지에 대해 더 현명한 사람은 아무도 없습니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;고전적인 지도 프로그램을 예로 들겠습니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용자가 지도의 위치로 이동한 다음 홈 키를 누릅니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;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 class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;OS는 최근에 사용한 앱의 이름만 저장하는 것이 아니라 앱을 시작하는 데 사용된 원래 번들도 저장합니다.&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;onSaveInstanceState&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;57&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;method so original bundle은 앱을 구성하는 데 필요한 모든 자료와 정보를 포함하고 있어서 그것이 재개된 것처럼 보입니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;104&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;104-0&quot;&gt;예:&lt;/strong&gt; 앱이 언로드되고 몇 주 후에 최근 앱 목록에서 다시 시작해야 할 경우를 대비해 SaveInstanceState에 현재 카메라 위치를 저장합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;@Override
    public void onSaveInstanceState(Bundle savedInstanceState) {
        super.onSaveInstanceState(savedInstanceState);
        // save the current camera position;
        if (mMap != null) {
            savedInstanceState.putParcelable(CAMERA_POSITION,
                    mMap.getCameraPosition());
        }
    }



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

        // get the exact camera position if the app was unloaded.
        if (savedInstanceState != null) {
            // get the current camera position;
            currentCameraPosition = savedInstanceState
                    .getParcelable(CAMERA_POSITION);
        }
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;58&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;58-0&quot;&gt;참고:&lt;/strong&gt; 다음을 사용할 수도 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;onRestoreInstanceState&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;59&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;method 하지만 인스턴스를 복원하는 것이 더 쉽다고 생각합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;onCreate&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;60&quot;&gt;&lt;font 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;61&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 당신의 앱에서 일어나고 있는 일일 가능성이 높습니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;일부 장치에서는 앱이 언로드되어 메모리를 확보할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;네, 도움이 되는 플래그들이 있지만, 플래그들은 당신의 앱의 모든 뉘앙스를 감지하지 못할 것이고, 플래그들은 몇 주 동안 당신을 살려두지 못할 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;onSaveInstanceState&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;62&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;2주 후 이력서를 완벽하게 작성해야 합니다&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;복잡한 앱에서 쉬운 일은 아니겠지만 우리는 당신의 뒤에 있고 도움을 주기 위해 여기에 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;110&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;111&quot; papago-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/19545889/app-restarts-rather-than-resumes&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>Android</category>
      <author>lovecheck</author>
      <guid isPermaLink="true">https://lovecheck.tistory.com/971</guid>
      <comments>https://lovecheck.tistory.com/971#entry971comment</comments>
      <pubDate>Sun, 29 Oct 2023 19:49:23 +0900</pubDate>
    </item>
    <item>
      <title>컨테이너의 나머지 너비를 채우는 스타일 입력 요소</title>
      <link>https://lovecheck.tistory.com/970</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;내게 다음과 같은 html 스니펫이 있다고 가정해 보겠습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;div style=&quot;width:300px;&quot;&amp;gt;
    &amp;lt;label for=&quot;MyInput&quot;&amp;gt;label text&amp;lt;/label&amp;gt;
    &amp;lt;input type=&quot;text&quot; id=&quot;MyInput&quot; /&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;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;font class=&quot;papago-parent&quot;&gt;이것은 다음과 같은 답변과 유사합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/10244927/input-text-auto-width-filling-100-with-other-elements-floating&quot; papago-id=&quot;3-1&quot;&gt;다른 요소가 떠있는 상태에서 입력 텍스트 자동 너비 100% 채우기&lt;/a&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;display:block&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;. 다음으로 버튼이 먼저이고 입력 필드가 두 번째여야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러면 버튼을 오른쪽으로 띄우면 입력 필드가 나머지 공간을 채웁니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;/p&gt;
&lt;div class=&quot;snippet&quot; data-lang=&quot;js&quot; data-hide=&quot;false&quot; data-console=&quot;true&quot; data-babel=&quot;false&quot;&gt; 
 &lt;div class=&quot;snippet-code&quot;&gt; 
  &lt;pre class=&quot;snippet-code-css lang-css prettyprint-override&quot;&gt;&lt;code&gt;form {
    width: 500px;
    overflow: hidden;
    background-color: yellow;
}
input {
    width: 100%;
}
span {
    display: block;
    overflow: hidden;
    padding-right:10px;
}
button {
    float: right;
}&lt;/code&gt;&lt;/pre&gt; 
  &lt;pre class=&quot;snippet-code-html lang-html prettyprint-override&quot;&gt;&lt;code&gt;&amp;lt;form method=&quot;post&quot;&amp;gt;
     &amp;lt;button&amp;gt;Search&amp;lt;/button&amp;gt;
     &amp;lt;span&amp;gt;&amp;lt;input type=&quot;text&quot; title=&quot;Search&quot; /&amp;gt;&amp;lt;/span&amp;gt;
&amp;lt;/form&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;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;간단한 바이올린 연주: http://jsfiddle.net/v7YTT/90/&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;8-0&quot;&gt;업데이트 1:&lt;/strong&gt; 웹사이트가 최신 브라우저만을 대상으로 한다면 플렉서블 &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Flexible_boxes&quot; rel=&quot;noreferrer&quot; papago-id=&quot;8-2&quot;&gt;박스를 사용&lt;/a&gt;할 것을 제안합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://caniuse.com/flexbox&quot; papago-id=&quot;8-4&quot; rel=&quot;noreferrer&quot;&gt;여기&lt;/a&gt;에서 현재 &lt;a href=&quot;http://caniuse.com/flexbox&quot; papago-id=&quot;8-4&quot; rel=&quot;noreferrer&quot;&gt;지원&lt;/a&gt; 내용을 확인할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;9-0&quot;&gt;업데이트 2:&lt;/strong&gt; 입력 필드와 전체를 공유하는 여러 버튼이나 다른 요소에서도 작동합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://jsfiddle.net/v7YTT/1439/&quot; rel=&quot;noreferrer&quot; papago-id=&quot;9-2&quot;&gt;여기&lt;/a&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;모든 사람들이 레이아웃을 위해 테이블을 싫어하지만, 명시적인 테이블 태그를 사용하거나 display:table-cell을 사용하여 이러한 것을 돕습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;div style=&quot;width:300px; display:table&quot;&amp;gt;
    &amp;lt;label for=&quot;MyInput&quot; style=&quot;display:table-cell; width:1px&quot;&amp;gt;label&amp;amp;nbsp;text&amp;lt;/label&amp;gt;
    &amp;lt;input type=&quot;text&quot; id=&quot;MyInput&quot; style=&quot;display:table-cell; width:100%&quot; /&amp;gt;
&amp;lt;/div&amp;gt;
&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;Flexbox를 사용할 것을 제안합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;적절한 공급업체 접두사를 추가해야 합니다!&lt;/font&gt;&lt;/p&gt;
&lt;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-css lang-css prettyprint-override&quot;&gt;&lt;code&gt;form {
  width: 400px;
  border: 1px solid black;
  display: flex;
}

input {
  flex: 2;
}

input, label {
  margin: 5px;
}&lt;/code&gt;&lt;/pre&gt; 
  &lt;pre class=&quot;snippet-code-html lang-html prettyprint-override&quot;&gt;&lt;code&gt;&amp;lt;form method=&quot;post&quot;&amp;gt;
  &amp;lt;label for=&quot;myInput&quot;&amp;gt;Sample label&amp;lt;/label&amp;gt;
  &amp;lt;input type=&quot;text&quot; id=&quot;myInput&quot; placeholder=&quot;Sample Input&quot;/&amp;gt;
&amp;lt;/form&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;13&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Flexible_Box_Layout/Basic_Concepts_of_Flexbox&quot; rel=&quot;noreferrer&quot; papago-id=&quot;13-1&quot;&gt;플렉스박스&lt;/a&gt;로 해주세요.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;당신은 아이들을 일렬로 만들 컨테이너를 가지고 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;첫째 아이는 필요에 따라 공간을 차지합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;두 번째는 남은 공간을 모두 차지할 수 있도록 유연하게 구성됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;/p&gt;
&lt;div class=&quot;snippet&quot; data-lang=&quot;js&quot; data-hide=&quot;false&quot; data-console=&quot;false&quot; data-babel=&quot;false&quot;&gt; 
 &lt;div class=&quot;snippet-code&quot;&gt; 
  &lt;pre class=&quot;snippet-code-html lang-html prettyprint-override&quot;&gt;&lt;code&gt;&amp;lt;div style=&quot;display:flex;flex-direction:row&quot;&amp;gt;
    &amp;lt;label for=&quot;MyInput&quot;&amp;gt;label&amp;amp;nbsp;text&amp;lt;/label&amp;gt;
    &amp;lt;input type=&quot;text&quot; id=&quot;MyInput&quot; style=&quot;flex:1&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 papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이를 달성하는 가장 쉬운 방법은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;CSS:&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;label{ float: left; }

span
{
    display: block;
    overflow: hidden;
    padding-right: 5px;
    padding-left: 10px;
}

span &amp;gt; input{ width: 100%; }
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;16&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;HTML:&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;fieldset&amp;gt;
    &amp;lt;label&amp;gt;label&amp;lt;/label&amp;gt;&amp;lt;span&amp;gt;&amp;lt;input type=&quot;text&quot; /&amp;gt;&amp;lt;/span&amp;gt;
    &amp;lt;label&amp;gt;longer label&amp;lt;/label&amp;gt;&amp;lt;span&amp;gt;&amp;lt;input type=&quot;text&quot; /&amp;gt;&amp;lt;/span&amp;gt;
&amp;lt;/fieldset&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음과 같습니다.&lt;/font&gt;&lt;/strong&gt; &lt;a href=&quot;http://jsfiddle.net/JwfRX/&quot; papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;http://jsfiddle.net/JwfRX/&lt;/font&gt;&lt;/a&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;아주 쉬운 방법은 a를 사용하는 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;CSS calc&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 class=&quot;papago-parent&quot;&gt;모든 최신 브라우저, IE9, 광범위한 모바일 브라우저가 이를 지원해야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;div style='white-space:nowrap'&amp;gt;
  &amp;lt;span style='display:inline-block;width:80px;font-weight:bold'&amp;gt;
    &amp;lt;label for='field1'&amp;gt;Field1&amp;lt;/label&amp;gt;
  &amp;lt;/span&amp;gt;
  &amp;lt;input id='field1' name='field1' type='text' value='Some text' size='30' style='width:calc(100% - 80px)' /&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;21&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;시도해 볼 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;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-css lang-css prettyprint-override&quot;&gt;&lt;code&gt;div#panel {
    border:solid;
    width:500px;
    height:300px;
}
div#content {
	height:90%;
	background-color:#1ea8d1; /*light blue*/
}
div#panel input {
	width:100%;
	height:10%;
	/*make input doesnt overflow inside div*/
	-webkit-box-sizing: border-box;
       -moz-box-sizing: border-box;
            box-sizing: border-box;
	/*make input doesnt overflow inside div*/
}&lt;/code&gt;&lt;/pre&gt; 
  &lt;pre class=&quot;snippet-code-html lang-html prettyprint-override&quot;&gt;&lt;code&gt;&amp;lt;div id=&quot;panel&quot;&amp;gt;
  &amp;lt;div id=&quot;content&quot;&amp;gt;&amp;lt;/div&amp;gt;
  &amp;lt;input type=&quot;text&quot; placeholder=&quot;write here...&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 papago-id=&quot;22&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;여기에 제시된 답변은 좀 구식입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;현대적인 플렉스박스를 사용하는 가장 쉬운 솔루션을 소개합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;/p&gt;
&lt;div class=&quot;snippet&quot; data-lang=&quot;js&quot; data-hide=&quot;false&quot; data-console=&quot;true&quot; data-babel=&quot;false&quot;&gt; 
 &lt;div class=&quot;snippet-code&quot;&gt; 
  &lt;pre class=&quot;snippet-code-css lang-css prettyprint-override&quot;&gt;&lt;code&gt;.input-container{
display:flex;
}
input{
flex-grow: 1;
margin-left: 5px;
}&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 style=&quot;width:300px;&quot;&amp;gt;
    &amp;lt;div class=&quot;input-container&quot;&amp;gt;
    &amp;lt;label for=&quot;MyInput&quot;&amp;gt;label text: &amp;lt;/label&amp;gt;
    &amp;lt;input type=&quot;text&quot; id=&quot;MyInput&quot;/&amp;gt;
    &amp;lt;/div&amp;gt;
    
    &amp;lt;div class=&quot;input-container&quot;&amp;gt;
    &amp;lt;label for=&quot;MyInput2&quot;&amp;gt;Long label text: &amp;lt;/label&amp;gt;
    &amp;lt;input type=&quot;text&quot; id=&quot;MyInput2&quot; /&amp;gt;
    &amp;lt;/div&amp;gt;
    
&amp;lt;/div&amp;gt;&lt;/code&gt;&lt;/pre&gt; 
 &lt;/div&gt; 
&lt;/div&gt; 
&lt;p&gt;&lt;/p&gt;&lt;p papago-id=&quot;23&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;부트스트랩 4를 사용하는 경우:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;form class=&quot;d-flex&quot;&amp;gt;
  &amp;lt;label for=&quot;myInput&quot; class=&quot;align-items-center&quot;&amp;gt;Sample label&amp;lt;/label&amp;gt;
  &amp;lt;input type=&quot;text&quot; id=&quot;myInput&quot; placeholder=&quot;Sample Input&quot; class=&quot;flex-grow-1&quot;/&amp;gt;
&amp;lt;/form&amp;gt;
&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;  &amp;lt;form&amp;gt;
    &amp;lt;div class=&quot;input-group&quot;&amp;gt;
      &amp;lt;div class=&quot;input-group-prepend&quot;&amp;gt;
        &amp;lt;label for=&quot;myInput&quot; class=&quot;input-group-text&quot;&amp;gt;Default&amp;lt;/label&amp;gt;
      &amp;lt;/div&amp;gt;
      &amp;lt;input type=&quot;text&quot; class=&quot;form-control&quot; id=&quot;myInput&quot;&amp;gt;
    &amp;lt;/div&amp;gt;
  &amp;lt;/form&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;a href=&quot;https://jsfiddle.net/nap1ykbr/&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;25&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;https://jsfiddle.net/nap1ykbr/&lt;/font&gt;&lt;/a&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;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/773517/style-input-element-to-fill-remaining-width-of-its-container&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>CSS</category>
      <author>lovecheck</author>
      <guid isPermaLink="true">https://lovecheck.tistory.com/970</guid>
      <comments>https://lovecheck.tistory.com/970#entry970comment</comments>
      <pubDate>Sun, 29 Oct 2023 19:49:13 +0900</pubDate>
    </item>
    <item>
      <title>구조 부재를 오프셋으로 가져오거나 설정하려면 어떻게 해야 합니까?</title>
      <link>https://lovecheck.tistory.com/969</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;em papago-id=&quot;1-0&quot;&gt;패딩/정렬 문제를 무시&lt;/em&gt;하고 다음과 같은 구조를 고려할 때, 멤버 이름을 사용하지 않고 member_b 값을 얻고 설정하는 가장 좋은 방법은 무엇입니까?&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;struct mystruct {
    int member_a;
    int member_b;
}
struct mystruct *s = malloc(sizeof(struct mystruct));
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다른 말로 하자면, 다음을 포인터/오프셋으로 어떻게 표현하시겠습니까?&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;s-&amp;gt;member_b = 3;
printf(&quot;%i&quot;,s-&amp;gt;member_b);
&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;ul&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;member_a의 크기를 구하여 오프셋을 계산합니다(&lt;/font&gt;&lt;/font&gt;&lt;code&gt;int&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;/li&gt; 
 &lt;li&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;char&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;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;창조하다, 창안&lt;/font&gt;&lt;/font&gt;&lt;code&gt;int&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;포인터를 가리키고 주소를 설정합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;*charpointer + offset&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;/li&gt; 
 &lt;li&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&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;/li&gt; 
&lt;/ul&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;memset&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&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;offsetof&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;17&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;스스로 상쇄를 파악하는 대신에 말입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;왜 당신이 그 일을 언급하는지 잘 모르겠습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;memset&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;18&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;-- 블록의 내용을 지정된 값으로 설정합니다. 이 값은 당면한 질문과 전혀 관련이 없어 보입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;19&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;작동 방식을 설명하기 위한 코드는 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;
#include &amp;lt;stddef.h&amp;gt;

typedef struct x {
    int member_a;
    int member_b;
} x;

int main() { 
    x *s = malloc(sizeof(x));
    char *base;
    size_t offset;
    int *b;

    // initialize both members to known values
    s-&amp;gt;member_a = 1;
    s-&amp;gt;member_b = 2;

    // get base address
    base = (char *)s;

    // and the offset to member_b
    offset = offsetof(x, member_b);

    // Compute address of member_b
    b = (int *)(base+offset);

    // write to member_b via our pointer
    *b = 10;

    // print out via name, to show it was changed to new value.
    printf(&quot;%d\n&quot;, s-&amp;gt;member_b);
    return 0;
}
&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;ol&gt; 
 &lt;li&gt;&lt;p papago-id=&quot;21&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음의 오프셋을 사용하여 오프셋을 가져옵니다.&lt;/font&gt;&lt;/p&gt; 
  &lt;blockquote&gt; 
   &lt;p papago-id=&quot;22&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;b_offset =의 오프셋(struct my structor, member_b);&lt;/font&gt;&lt;/p&gt; 
  &lt;/blockquote&gt;&lt;/li&gt; 
 &lt;li&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;blockquote&gt; 
   &lt;p papago-id=&quot;24&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;char *sc = (char *)s;&lt;/font&gt;&lt;/p&gt; 
  &lt;/blockquote&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p papago-id=&quot;25&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;구조물 주소에 간격띄우기 추가를 추가하고, 값을 포인터에 적절한 유형으로 캐스팅한 후 참조를 해제합니다.&lt;/font&gt;&lt;/p&gt; 
  &lt;blockquote&gt; 
   &lt;p papago-id=&quot;26&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;*(int *)(sc + b_offset)&lt;/font&gt;&lt;/p&gt; 
  &lt;/blockquote&gt;&lt;/li&gt; 
&lt;/ol&gt;&lt;p papago-id=&quot;27&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;패딩과 얼라인먼트를 무시한 채로 말입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;28&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;예에서와 같이 지시하는 요소가 전체적으로 단일 유형일 경우 구조를 원하는 유형으로 캐스트한 후 배열로 처리할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;printf(&quot;%i&quot;, ((int *)(&amp;amp;s))[1]);
&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;구조와 NULL을 기준 포인터로 하여 오프셋을 계산할 수 있습니다. 예를 들어 &lt;strong papago-id=&quot;29-1&quot;&gt;&quot;&amp;amp;((타입 &lt;/strong&gt;*)&lt;strong papago-id=&quot;29-1&quot;&gt;0)-&amp;gt;&lt;/strong&gt;필드&lt;strong papago-id=&quot;29-1&quot;&gt;&quot;&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;30&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;예:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;struct my_struct {
    int x;
    int y;
    int *m;
    int *h;
};
int main()
{
    printf(&quot;offset %d\n&quot;, (int) &amp;amp;((((struct my_struct*)0)-&amp;gt;h)));
    return 0;
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;31&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 예에서는 다음을 통해 해결할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;*((int *) ((char *) s + sizeof(int)))&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;32&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;. 왜 그러시는지 잘 모르니 교훈적인 취지를 전제로 하고 있으니 설명을 따르겠습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;33&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;코드의 비트는 다음과 같이 번역됩니다: 주소에서 시작하는 메모리를 가져와 다음을 가리키는 메모리로 취급합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;char&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&gt;&lt;/font&gt;&lt;code&gt;sizeof(int)&lt;/code&gt; &lt;code&gt;char&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;35&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;- chunks - 새 주소가 표시됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;주소가 생성한 값을 사용하여 다음과 같이 취급합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;int&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;36&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;37&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;주의할 점은 다음과 같습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;*(s + sizeof(int))&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;21&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;주소는 다음과 같습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;s&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;22&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;플러스로&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;sizeof(int)&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;(mystruct) 청크 크기&lt;/font&gt;&lt;/font&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;편집: Andrey의 코멘트에 따르면, &lt;a href=&quot;http://en.wikipedia.org/wiki/Offsetof&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;41-1&quot;&gt;오프셋&lt;/a&gt;을 사용하여:&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;*((int *) ((byte *) s + offsetof(struct mystruct, member_b)))&lt;/code&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;24&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;편집 2: 모두 교체했습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;byte&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;char&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;26&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;잿더미로&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;sizeof(char)&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;1로 보장됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;46&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;여러분이 실제로 하고 있는 일은 다양한 데이터 유형을 하나의 메모리 블록으로 포장하고 압축을 푸는 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;직접 포인터 캐스트를 사용하면 이 작업에서 벗어날 수 &lt;em papago-id=&quot;46-1&quot;&gt;있지만&lt;/em&gt;, 다른 대부분의 답변에서는 다음과 같이 제시하고 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;void set_int(void *block, size_t offset, int val)
{
    char *p = block;

    *(int *)(p + offset) = val;
}

int get_int(void *block, size_t offset)
{
    char *p = block;

    return *(int *)(p + offset);
}
&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;font class=&quot;papago-parent&quot;&gt;블록 내에 올바른 정렬 상태로 유형을 저장할 수 있는 일반적인 방법은 없으며, 일부 아키텍처에서는 정렬되지 않은 주소에 로드나 저장을 수행할 수 없습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;블록의 레이아웃이 선언된 구조물로 정의되는 특수한 경우에는 구조물 레이아웃에 올바른 정렬을 보장하는 데 필요한 패딩이 포함되므로 괜찮습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;하지만 이름으로 접속할 수 없기 때문에 이것은 실제로 당신이 하는 일이 아닌 것처럼 들립니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;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;memcpy&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;pre&gt;&lt;code&gt;void set_int(void *block, size_t offset, int val)
{
    char *p = block;

    memcpy(p + offset, &amp;amp;val, sizeof val);
}

int get_int(void *block, size_t offset)
{
    char *p = block;
    int val;

    memcpy(&amp;amp;val, p + offset, sizeof val);
    return val;
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;50&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(다른 유형과 유사함).&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;51&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/2043871/how-can-i-get-set-a-struct-member-by-offset&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>C</category>
      <author>lovecheck</author>
      <guid isPermaLink="true">https://lovecheck.tistory.com/969</guid>
      <comments>https://lovecheck.tistory.com/969#entry969comment</comments>
      <pubDate>Sun, 29 Oct 2023 19:49:04 +0900</pubDate>
    </item>
    <item>
      <title>Python - 새 줄로 연결</title>
      <link>https://lovecheck.tistory.com/968</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Python - 새 줄로 연결&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;Python 콘솔에서 다음을 입력할 때:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; &quot;\n&quot;.join(['I', 'would', 'expect', 'multiple', 'lines'])
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;제공:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;'I\nwould\nexpect\nmultiple\nlines'
&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;I
would
expect
multiple
lines
&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;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;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;접두사가 다음과 같은 경우&lt;/font&gt;&lt;/font&gt;&lt;code&gt;print&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;, 당신이 기대하는 것을 얻을 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;문자열과 문자열 표현의 차이에 대한 자세한 내용은 이 &lt;a href=&quot;https://stackoverflow.com/questions/1436703/difference-between-str-and-repr-in-python&quot; papago-id=&quot;8-1&quot;&gt;질문&lt;/a&gt;을 참조하십시오.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;표현은 매우 간단합니다. 표현은 문자열을 얻기 위해 소스 코드로 입력하는 것입니다.&lt;/font&gt;&lt;/p&gt;&lt;p&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;print&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;10&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그 결과&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;당신이 얻는 것은.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;P&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;실제 출력 결과가 아닌 입력.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Py2.x에서 당신은 다음과 같은 것을 해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; print &quot;\n&quot;.join(['I', 'would', 'expect', 'multiple', 'lines'])
I
would
expect
multiple
lines
&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;그리고 Py3.X에서는 프린트가 기능이므로 당신은 해야합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;print(&quot;\n&quot;.join(['I', 'would', 'expect', 'multiple', 'lines']))
&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&gt;&lt;font class=&quot;papago-parent&quot;&gt;실제로 REPL인 Python Interpreter는 항상 실제 표시된 출력이 아닌 문자열의 표현을 표시합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;표현은 고객의 요구 사항을 만족시키는 데 도움이 될 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;repr&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;15&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;진술&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; print repr(&quot;\n&quot;.join(['I', 'would', 'expect', 'multiple', 'lines']))
'I\nwould\nexpect\nmultiple\nlines'
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;16&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;할 필요가 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;print&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;br&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;18&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;당신이 해야합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; x = &quot;\n&quot;.join(['I', 'would', 'expect', 'multiple', 'lines'])
&amp;gt;&amp;gt;&amp;gt; x                   # this is the value, returned by the join() function
'I\nwould\nexpect\nmultiple\nlines'
&amp;gt;&amp;gt;&amp;gt; print x    # this prints your string (the type of output you want)
I
would
expect
multiple
lines
&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;In [22]: &quot;\n&quot;.join(['I', 'would', 'expect', 'multiple', 'lines'])
Out[22]: 'I\nwould\nexpect\nmultiple\nlines'

In [23]: print &quot;\n&quot;.join(['I', 'would', 'expect', 'multiple', 'lines'])
I
would
expect
multiple
lines
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;20&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이거랑 같이 찍어주시면.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;print 'I\nwould\nexpect\nmultiple\nlines'&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&gt;&lt;code&gt;I
would
expect
multiple
lines
&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&gt;&lt;/font&gt;&lt;code&gt;\n&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;23&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;END-OF-TEXT를 표시하기 위해 특별히 사용되는 새로운 줄 문자입니다.&lt;/font&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;/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;repr() 함수는 지정된 개체의 인쇄 가능한 표현을 반환하며 Python의 evalStr() 또는 exec에 매우 중요합니다. 예를 들어 Python의 Zen을 가져오려는 경우:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;eng.execString('from this import *');
println('import this:'+CRLF+
  stringReplace(eng.EvalStr('repr(&quot;&quot;.join([d.get(c,c) for c in s]))'),'\n',CRLF,[rfReplaceAll]));
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;25&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/14560863/python-join-with-newline&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>Python</category>
      <author>lovecheck</author>
      <guid isPermaLink="true">https://lovecheck.tistory.com/968</guid>
      <comments>https://lovecheck.tistory.com/968#entry968comment</comments>
      <pubDate>Sun, 29 Oct 2023 19:48:56 +0900</pubDate>
    </item>
    <item>
      <title>@Service 클래스의 스프링 부트 캐싱이 작동하지 않음</title>
      <link>https://lovecheck.tistory.com/967</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;@Service 클래스의 스프링 부트 캐싱이 작동하지 않음&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;@Service 메서드에 일부 값을 저장하는 데 문제가 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;내 코드:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;@Service(value = &quot;SettingsService&quot;)
public class SettingsService {
...

    public String getGlobalSettingsValue(Settings setting) {
        getTotalEhCacheSize();
        if(!setting.getGlobal()){
            throw new IllegalStateException(setting.name() + &quot; is not global setting&quot;);
        }
        GlobalSettings globalSettings = globalSettingsRepository.findBySetting(setting);
        if(globalSettings != null)
            return globalSettings.getValue();
        else
            return getGlobalEnumValue(setting)
    }

@Cacheable(value = &quot;noTimeCache&quot;, key = &quot;#setting.name()&quot;)
    public String getGlobalEnumValue(Settings setting) {
        return Settings.valueOf(setting.name()).getDefaultValue();
    }
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;내 리포지토리 클래스:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;@Repository
public interface GlobalSettingsRepository extends CrudRepository&amp;lt;GlobalSettings, Settings&amp;gt; {

    @Cacheable(value = &quot;noTimeCache&quot;, key = &quot;#setting.name()&quot;, unless=&quot;#result == null&quot;)
    GlobalSettings findBySetting(Settings setting);
&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;ul&gt; 
 &lt;li papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;데이터가 존재하는 경우 DB에서 값을 가져옵니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;enum에서 값을 저장하지 않는 경우.&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;DB나 enum에서 어떤 데이터도 저장하지 않았습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;캐시 구성:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;@Configuration
@EnableCaching
public class CacheConfig {
    @Bean
    public EhCacheCacheManager cacheManager(CacheManager cm) {
        return new EhCacheCacheManager(cm);
    }
    @Bean
    public EhCacheManagerFactoryBean ehcache() {
        EhCacheManagerFactoryBean ehCacheManagerFactoryBean = new EhCacheManagerFactoryBean();
        ehCacheManagerFactoryBean.setConfigLocation(new ClassPathResource(&quot;ehcache.xml&quot;));

        return  ehCacheManagerFactoryBean;
    }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;캐시가 프로젝트에서 정지 방식으로 작동하는지 확인할 수 있는 몇 가지 예가 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;    @RequestMapping(value = &quot;/system/status&quot;, method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity&amp;lt;?&amp;gt; systemStatus() {
        Object[] list = userPuzzleRepository.getAverageResponseByDateBetween(startDate, endDate);
...
}

public interface UserPuzzleRepository extends CrudRepository&amp;lt;UserPuzzle, Long&amp;gt; {
    @Cacheable(value = &quot;averageTimeAnswer&quot;, key = &quot;#startDate&quot;)
    @Query(&quot;select AVG(case when up.status='SUCCESS' OR up.status='FAILURE' OR up.status='TO_CHECK' then up.solvedTime else null end) from UserPuzzle up where up.solvedDate BETWEEN ?1 AND ?2&quot;)
    Object[] getAverageResponseByDateBetween(Timestamp startDate, Timestamp endDate);
&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&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;SettingsService&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;getGlobalEnumValue(...)&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;getGlobalSettingsValue(...)&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;).&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 Spring 캐시 추상화가 작동하는 방법은 클래스를 프록시(&lt;a href=&quot;http://docs.spring.io/spring/docs/current/spring-framework-reference/html/aop.html#aop-understanding-aop-proxies&quot; rel=&quot;noreferrer&quot; papago-id=&quot;15-1&quot;&gt;Spring AOP&lt;/a&gt; 사용)하는 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 동일한 클래스 내의 메소드에 대한 호출은 프록시 논리를 호출하는 것이 아니라 아래의 직접적인 비즈니스 논리를 호출합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;즉, 동일한 빈에서 메서드를 호출하는 경우에는 캐싱이 작동하지 않습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;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;getGlobalSettingsValue()&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;getGlobalEnumValue(...)&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;hr&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;ol&gt; 
 &lt;li papago-id=&quot;20&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;프록시를 사용할 때 같은 클래스의 다른 메서드를 호출하지 않음&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;21&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다른 방법 캐싱도 가능합니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Spring AOP 대신 Aspec J를 사용하여 클래스를 프록시하는 대신 컴파일 시 바이트 코드로 직접 코드를 위빙합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;를 설정하여 모드를 전환할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;@EnableCaching(mode = AdviceMode.ASPECTJ)&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;a href=&quot;http://docs.spring.io/spring/docs/current/spring-framework-reference/html/aop.html#aop-aj-ltw-spring&quot; papago-id=&quot;23-1&quot; rel=&quot;noreferrer&quot;&gt;그러나&lt;/a&gt;, 당신은 &lt;a href=&quot;http://docs.spring.io/spring/docs/current/spring-framework-reference/html/aop.html#aop-aj-ltw-spring&quot; papago-id=&quot;23-1&quot; rel=&quot;noreferrer&quot;&gt;짐을 짜는&lt;/a&gt; 시간 &lt;a href=&quot;http://docs.spring.io/spring/docs/current/spring-framework-reference/html/aop.html#aop-aj-ltw-spring&quot; papago-id=&quot;23-1&quot; rel=&quot;noreferrer&quot;&gt;또한 설정&lt;/a&gt;해야 할 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;24&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;서비스를 자동으로 서비스에 연결하고 메소드를 직접 호출하지 않고 해당 서비스를 사용합니다.&lt;/font&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;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;문제는 캐시 가능 메서드를 호출하는 위치에 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;당신이 당신의 전화를 걸때&lt;/font&gt;&lt;/font&gt;&lt;code&gt;@Cacheable&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;this&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;봄의 대리인으로 감싸지지 않는다는 뜻입니다 그래서 봄은 당신의 요청을 받아낼 수가 없습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;12&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 문제를 해결하는 방법 중 하나는&lt;/font&gt;&lt;/font&gt;&lt;code&gt;@Autowired&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;@Service(value = &quot;SettingsService&quot;)
public class SettingsService {
//...

    @Autowired
    private SettingsService settingsService;
//...
    public String getGlobalSettingsValue(Settings setting) {
       // ...
        return settingsSerive.getGlobalEnumValue(setting)
//-----------------------^Look Here
    }

    @Cacheable(value = &quot;noTimeCache&quot;, key = &quot;#setting.name()&quot;)
    public String getGlobalEnumValue(Settings setting) {
        return Settings.valueOf(setting.name()).getDefaultValue();
    }
}
&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;하지만 그런 문제가 있다면, 그것은 여러분의 수업이 너무 많이 진행되고 &quot;단일 수업-단일 책임&quot;의 원칙을 따르지 않는다는 것을 의미합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;더 나은 해결책은 다음과 같은 방법으로 이동하는 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;@Cacheable&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&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;@Cacheable&lt;/strong&gt; 메서드는 컨트롤러/서비스에서 직접 호출해야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;만약 당신이 내부적으로 cacheable method를 호출하는 method A를 호출한다면, 그것은 작동하지 않을 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;33&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;서비스 클래스&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;@Cacheable(&quot;appToken&quot;)
public String cachedMethod(){
    return &quot;&quot;;
}
    

public void notCachedMethod(PostEventPayload requestPayload){
   getAppTokenAA();
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;34&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;컨트롤러: 작동 중:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;eventService.cachedMethod();
&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;eventService.notCachedMethod()
&lt;/code&gt;&lt;/pre&gt; 
&lt;blockquote&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;/blockquote&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/39072235/spring-boot-caching-in-service-class-does-not-work&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>spring-boot</category>
      <author>lovecheck</author>
      <guid isPermaLink="true">https://lovecheck.tistory.com/967</guid>
      <comments>https://lovecheck.tistory.com/967#entry967comment</comments>
      <pubDate>Sun, 29 Oct 2023 19:48:49 +0900</pubDate>
    </item>
    <item>
      <title>중첩 함수 구현</title>
      <link>https://lovecheck.tistory.com/966</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;최근에 gcc에서 nested function의 정의가 가능하다는 것을 알게 되었습니다.&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;컨텍스트 포인터를 숨겨진 인수로 전달함으로써 중첩 함수의 직접 호출을 구현하는 것은 확실히 어렵지 않지만, gcc는 또한 이 포인터를 중첩 함수로 전달하여 컨텍스트의 중첩 함수를 호출할 수 있는 임의의 다른 함수로 전달할 수 있습니다.&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;하스켈과 같이 좀 더 복잡한 호출 규약을 가진 다른 언어들은 부분적으로 그러한 것들을 지원하는 것을 허용하지만, C에서는 그런 것을 할 방법이 없습니다.&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;int foo(int x,int(*f)(int,int(*)(void))) {
  int counter = 0;
  int g(void) { return counter++; }

  return f(x,g);
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 함수는 컨텍스트에서 카운터를 반환하는 함수를 호출하고 동시에 증가시키는 함수를 호출합니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;GCC는 트램펄린이라고 불리는 것을 사용합니다.&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;정보 : http://gcc.gnu.org/onlinedocs/gccint/Trampolines.html&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;트램펄린은 중첩 함수에 대한 포인터가 필요할 때 사용하기 위해 GCC가 스택에 생성하는 코드입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;당신의 코드에서 트램펄린은 당신이 통과하기 때문에 필요합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;g&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;함수 호출에 대한 매개 변수로 사용됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;트램펄린은 중첩 함수가 외부 함수의 변수를 참조할 수 있도록 일부 레지스터를 초기화한 다음 중첩 함수 자체로 점프합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;트램펄린은 매우 작습니다. 트램펄린에서 떨어져 중첩된 기능의 몸체로 &quot;튀겨&quot; 들어갑니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이런 식으로 중첩 함수를 사용하려면 실행 가능한 스택이 필요하므로 요즘은 사용하지 않습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&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;/p&gt; 
&lt;p papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음은 GCC의 확장 C에 내포된 함수의 예입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;void func(int (*param)(int));

void outer(int x)
{
    int nested(int y)
    {
        // If x is not used somewhere in here,
        // then the function will be &quot;lifted&quot; into
        // a normal, non-nested function.
        return x + y;
    }
    func(nested);
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;아주 간단해서 어떻게 작동하는지 알 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음은 다음과 같은 결과로 구성하는 어셈블리입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;outer&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;, 일부 항목 제외:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;subq    $40, %rsp
movl    $nested.1594, %edx
movl    %edi, (%rsp)
leaq    4(%rsp), %rdi
movw    $-17599, 4(%rsp)
movq    %rsp, 8(%rdi)
movl    %edx, 2(%rdi)
movw    $-17847, 6(%rdi)
movw    $-183, 16(%rdi)
movb    $-29, 18(%rdi)
call    func
addq    $40, %rsp
ret
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;대부분의 작업이 레지스터와 상수를 스택에 쓰는 것임을 알 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;따라서 SP+4에서 19 바이트 객체를 다음과 같은 데이터와 함께 배치할 수 있습니다(GAS 구문에서).&lt;/font&gt;&lt;/p&gt; 
&lt;pre papago-id=&quot;16&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.word -17599&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;.int $nested.1594&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;단어 - 17847&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;.quad %rsp&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;.byte -29&lt;/font&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 분해기를 통해 실행하기에 충분히 쉽습니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를 들면&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;$nested.1594&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;0x01234567&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;%rsp&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;0x0123456789abcdef&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;. 결과적인 분해는 다음에 의해 제공됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;objdump&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;, 다음과 같습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre papago-id=&quot;23&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;0: 41 bb 67 45 2301 이동 $0x1234567, %r11d&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;6: 49 ba fc cd ab 89 67 mov $0x123456789 abc def, %r10&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;d: 45 2301&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;10:49 fe3 rex.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;WB jmpq *%r11&lt;/font&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;10&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;따라서 트램펄린은 외부 기능의 스택 포인터를 다음으로 로드합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;%r10&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;중첩 함수의 본문으로 점프합니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;중첩 함수 본문은 다음과 같습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;movl    (%r10), %eax
addl    %edi, %eax
ret
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;12&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;보다시피, 내포된 함수는 다음과 같이 사용합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;%r10&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;28&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;물론 트램펄린이 중첩 기능 자체보다 크다는 &lt;em papago-id=&quot;28-1&quot;&gt;것&lt;/em&gt;은 상당히 우스꽝스러운 일입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;당신은 쉽게 더 잘할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;하지만 이 기능을 사용하는 사람은 그리 많지 않으며, 이렇게 하면 트램펄린은 아무리 큰 중첩 함수라도 크기(19바이트)를 그대로 유지할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;29&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;마지막 노트:&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;어셈블리 하단에는 다음과 같은 최종 지침이 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre papago-id=&quot;30&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.section .note.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;GNU-스택 &quot;x&quot;, @progbits&lt;/font&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;31&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 스택을 실행 가능한 것으로 표시하도록 링커에 지시합니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;32&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/8179521/implementation-of-nested-functions&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>C</category>
      <author>lovecheck</author>
      <guid isPermaLink="true">https://lovecheck.tistory.com/966</guid>
      <comments>https://lovecheck.tistory.com/966#entry966comment</comments>
      <pubDate>Sun, 29 Oct 2023 19:48:41 +0900</pubDate>
    </item>
    <item>
      <title>대용량 스프레드시트용 Apache POI Java Excel 성능</title>
      <link>https://lovecheck.tistory.com/965</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;대용량 스프레드시트용 Apache POI Java Excel 성능&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;POI로 읽으려는 스프레드시트가 있는데(xls와 xlsx 형식이 모두 있습니다), 이 경우 xls 파일에 문제가 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;제 스프레드시트에는 약 10,000개의 행과 75개의 열이 있으며, Excel이 몇 초 안에 열리지만 이를 읽는 데는 몇 분이 걸릴 수 있습니다.&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;지금은 좀 지저분하지만, POI 예제에서 대부분 복사한 긴 스위치 설명일 뿐입니다.&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;이벤트 모델을 이용한 POI 수행이 이렇게 느리다는 것이 일반적인 일입니까?&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;    POIFSFileSystem poifs = new POIFSFileSystem(fis);
    InputStream din = poifs.createDocumentInputStream(&quot;Workbook&quot;);
    try
    {
        HSSFRequest req = new HSSFRequest();
        listener = new FormatTrackingHSSFListener(new HSSFListener() {
            @Override
            public void processRecord(Record rec)
            {
                thisString = null;
                int sid = rec.getSid();
                switch (sid)
                {
                    case SSTRecord.sid:
                        strTable = (SSTRecord) rec;
                        break;
                    case LabelSSTRecord.sid:
                        LabelSSTRecord labelSstRec = (LabelSSTRecord) rec;
                        thisString = strTable.getString(labelSstRec
                                .getSSTIndex()).getString();
                        row = labelSstRec.getRow();
                        col = labelSstRec.getColumn();
                        break;
                    case RKRecord.sid:
                        RKRecord rrk = (RKRecord) rec;
                        thisString = &quot;&quot;;
                        row = rrk.getRow();
                        col = rrk.getColumn();
                        break;
                    case LabelRecord.sid:
                        LabelRecord lrec = (LabelRecord) rec;
                        thisString = lrec.getValue();
                        row = lrec.getRow();
                        col = lrec.getColumn();
                        break;
                    case BlankRecord.sid:
                        BlankRecord blrec = (BlankRecord) rec;
                        thisString = &quot;&quot;;
                        row = blrec.getRow();
                        col = blrec.getColumn();
                        break;
                    case BoolErrRecord.sid:
                        BoolErrRecord berec = (BoolErrRecord) rec;
                        row = berec.getRow();
                        col = berec.getColumn();
                        byte errVal = berec.getErrorValue();
                        thisString = errVal == 0 ? Boolean.toString(berec
                                .getBooleanValue()) : ErrorConstants
                                .getText(errVal);
                        break;
                    case FormulaRecord.sid:
                        FormulaRecord frec = (FormulaRecord) rec;
                        switch (frec.getCachedResultType())
                        {
                            case Cell.CELL_TYPE_NUMERIC:
                                double num = frec.getValue();
                                if (Double.isNaN(num))
                                {
                                    // Formula result is a string
                                    // This is stored in the next record
                                    outputNextStringRecord = true;
                                }
                                else
                                {
                                    thisString = formatNumericValue(frec, num);
                                }
                                break;
                            case Cell.CELL_TYPE_BOOLEAN:
                                thisString = Boolean.toString(frec
                                        .getCachedBooleanValue());
                                break;
                            case Cell.CELL_TYPE_ERROR:
                                thisString = HSSFErrorConstants
                                        .getText(frec.getCachedErrorValue());
                                break;
                            case Cell.CELL_TYPE_STRING:
                                outputNextStringRecord = true;
                                break;
                        }
                        row = frec.getRow();
                        col = frec.getColumn();
                        break;
                    case StringRecord.sid:
                        if (outputNextStringRecord)
                        {
                            // String for formula
                            StringRecord srec = (StringRecord) rec;
                            thisString = srec.getString();
                            outputNextStringRecord = false;
                        }
                        break;
                    case NumberRecord.sid:
                        NumberRecord numRec = (NumberRecord) rec;
                        row = numRec.getRow();
                        col = numRec.getColumn();
                        thisString = formatNumericValue(numRec, numRec
                                .getValue());
                        break;
                    case NoteRecord.sid:
                        NoteRecord noteRec = (NoteRecord) rec;
                        row = noteRec.getRow();
                        col = noteRec.getColumn();
                        thisString = &quot;&quot;;
                        break;
                    case EOFRecord.sid:
                        inSheet = false;
                }
                if (thisString != null)
                {
                    // do something with the cell value 
                }
            }
        });
        req.addListenerForAllRecords(listener);
        HSSFEventFactory factory = new HSSFEventFactory();
        factory.processEvents(req, din);
&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;Apache POI를 사용하여 대용량 엑셀 파일을 생성하는 경우 다음 행을 참고하시기 바랍니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;sheet.autoSizeColumn((short) p);&lt;/code&gt; &lt;/p&gt; 
&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;왜냐하면 이렇게 되면 성능이 저하되기 때문입니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또한 수천개의 큰 엑셀파일로 약간의 처리를 했는데 POI가 매우 빠르다고 생각합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;엑셀 파일을 로딩하는 데도 엑셀 자체에서 1분 정도 걸렸습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그래서 문제가 POI 코드를 벗어났음을 확인하고자 합니다.&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;저는 poi-beta3에 소개된 streaming hssf를 사용하려고 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이를 통해 1000개 이상의 열이 있는 대형 스프레드시트의 메모리 문제를 해결할 수 있었습니다.&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;Apache POI를 사용하여 대용량 엑셀 파일을 생성하는 경우 시트를 참고하시기 바랍니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;autoSizeColumn((짧은) p); 이는 성능에 영향을 주기 때문입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;http://stanicblog.blogspot.sg/2013/07/generate-large-excel-report-by-using.html&quot; rel=&quot;nofollow&quot; papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;http://stanicblog.blogspot.sg/2013/07/generate-large-excel-report-by-using.html&lt;/font&gt;&lt;/a&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;좀 더 상세한 프로파일링을 해보았는데 POI 이외의 코드에 문제가 있는 것 같습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 이것이 병목현상이라고 생각했을 뿐입니다만, 이것은 잘못된 것이라고 생각합니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/5992536/apache-poi-java-excel-performance-for-large-spreadsheets&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>Excel</category>
      <author>lovecheck</author>
      <guid isPermaLink="true">https://lovecheck.tistory.com/965</guid>
      <comments>https://lovecheck.tistory.com/965#entry965comment</comments>
      <pubDate>Sun, 29 Oct 2023 19:48:34 +0900</pubDate>
    </item>
    <item>
      <title>Oracle SQL*Plus를 시작하는 동안 TNS Protocol 어댑터 오류가 발생했습니다.</title>
      <link>https://lovecheck.tistory.com/964</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Oracle SQL*Plus를 시작하는 동안 TNS Protocol 어댑터 오류가 발생했습니다.&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;SQL*Plus(11g Standard Edition Win 64)에 로그인하려고 하면 연결 오류와 관련된 오류가 나타납니다.&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;sys를 sysdba로 로그인하고 비밀번호를 제공하려고 합니다.&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;저는 윈도우 7입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;어떤 도움이라도 주시면 감사하겠습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;img src=&quot;https://i.stack.imgur.com/9byNL.png&quot; alt=&quot;enter image description here&quot;&gt;&lt;/p&gt;&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;해라&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;sqlplus sys/&amp;lt;your password&amp;gt;@&amp;lt;your SID&amp;gt; as sysdba
&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;Oracle Service가 실행 중인지 확인합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 오류가 계속 발생하지만 서비스에 들어가서 Oracle ServiceXE를 찾아서 수동으로 시작하면 문제가 해결됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;자동으로 시작하도록 설정해 놓았지만, 가끔은 저절로 멈추는 것처럼 보이기도 합니다. 적어도 &lt;em papago-id=&quot;6-1&quot;&gt;저&lt;/em&gt;는 이를 막기 위해 하고 있는 일을 찾을 수가 없습니다.&lt;/font&gt;&lt;/p&gt;&lt;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;sqlplus / as sysdba
&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;당신이 하고 있는 일은 sqlplus를 시작하고 나서 사용하는 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;sys as sysdba&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 class=&quot;papago-parent&quot;&gt;위의 명령어를 사용하여 Oracle은 시스템 로그인 자격 증명을 사용하여 db에 액세스합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;또한, 당신이 실행중인 sqlplus 실행 파일이 올바른지 확인하기 위해 당신의 경로를 확인하여 확인하고자 합니다 - 서버 설치 디렉토리의 빈에 있는지 확인합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;명령 프롬프트에서 이 명령 사용&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;sqlplus userName/password@host/serviceName&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;Oracle 데이터베이스를 시작하지 않았기 때문에 &lt;strong papago-id=&quot;12-1&quot;&gt;ORA-12560&lt;/strong&gt;: &lt;strong papago-id=&quot;12-1&quot;&gt;TNS:protocol adaptor&lt;/strong&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;이렇게 Oracle 데이터베이스를 시작할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;START-&amp;gt;에서 Oracle Database 11g Express Edition(11g 또는 데이터베이스 유형)을 선택합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;모든 프로그램)에서 확인할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그런 다음 이 폴더 안에 녹색 반점이 있는 DB 아이콘이 있습니다.&lt;a href=&quot;https://i.stack.imgur.com/epOIP.jpg&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;13-1&quot;&gt;&lt;img alt=&quot;Start Database icon&quot; papago-id=&quot;13-1-0&quot; src=&quot;https://i.stack.imgur.com/epOIP.jpg&quot;&gt;&lt;/a&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;서비스 시작 아이콘입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;클릭하세요.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러면 몇 초 후에 서비스를 시작합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;위 메시지를 받은 후 다시 사용자 이름과 비밀번호를 부여하여 SQL plus 명령줄을 통해 연결을 시도합니다.&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;SQL*Plus 입력 대상:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;sqlplus /nolog
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;16&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그 다음은:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;connect sys@&amp;lt;SID&amp;gt; AS sysdba
&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;시작으로 이동 --&amp;gt; 실행 --&amp;gt; &quot;services.msc&quot;를 입력합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Oracle Service 이름, Right Click(오른쪽 클릭), Start(시작)을 선택합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;19&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;잠시 기다리시면 서비스가 시작됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그런 다음 sql 명령줄 창으로 이동하여 사용자에게 연결을 시도합니다.&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;Oracle이 자동으로 시작되지 않도록 설정했을 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;시작으로 이동하여 서비스를 검색합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;아래로 스크롤하여 Oracle Service를 찾습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;ORCL(또는 Oracle ServiceSID).&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;두 번 클릭하시고 수동으로 설정된 경우 시작 유형을 자동으로 변경합니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;21&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또 다른 가능성(특히 여러 Oracle 홈의 경우)&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;설정 ORACLE_SID=$SID&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;sqlplus /nolog&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;conn / as sysdba;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;25&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;주된 문제는 오라클 데이터베이스 자체가 시작되지 않았다는 것일 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그래서 수동으로 다음을 통과해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p papago-id=&quot;26&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;명령 -&amp;gt; services를 실행합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p papago-id=&quot;27&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Oracle X 확인&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;서비스를 사용할 수 없습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p papago-id=&quot;28&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;오른쪽 클릭 속성으로 이동-&amp;gt; 자동으로 설정하고 확인을 누릅니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그런 다음 다시 마우스 오른쪽 버튼을 누른 후 시작합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p papago-id=&quot;29&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러면 데이터베이스에 연결할 수 있도록 데이터베이스가 시작됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;30&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;마지막으로 sqlplus 명령줄에서&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;sysdba로 연결&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;32&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;관리자로 사용자 이름 입력&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;33&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그런 다음 Enter 키를 누르면 연결됩니다.&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;Oracle 서비스가 자동으로 실행되고 있는지 확인합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;Win+R만 누르면 됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;텍스트 상자에 services.msc를 입력한 다음 O를 눌러 오라클 서비스를 찾습니다.&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;PC 이름이 Oracle serviceX와 같을 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;YZ. 강조 표시된 서비스를 마우스 오른쪽 버튼으로 클릭합니다.&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;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/8782842/tns-protocol-adapter-error-while-starting-oracle-sqlplus&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>oracle</category>
      <author>lovecheck</author>
      <guid isPermaLink="true">https://lovecheck.tistory.com/964</guid>
      <comments>https://lovecheck.tistory.com/964#entry964comment</comments>
      <pubDate>Sun, 29 Oct 2023 19:48:26 +0900</pubDate>
    </item>
    <item>
      <title>&amp;quot;중복 키 업데이트 시 [...] 삽입&amp;quot; 문에 대한 권한이 없지만 &amp;quot;삽입&amp;quot; 및 &amp;quot;업데이트&amp;quot;를 개별적으로 수행하기에 충분합니다.</title>
      <link>https://lovecheck.tistory.com/963</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&quot;중복 키 업데이트 시 [...] 삽입&quot; 문에 대한 권한이 없지만 &quot;삽입&quot; 및 &quot;업데이트&quot;를 개별적으로 수행하기에 충분합니다.&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;데이터베이스 사용자가 가지는 권한을 최소한으로 줄이려고 노력했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그렇게 함으로써 저는 다음과 같은 상황을 알아차렸습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;데이터베이스가 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;test&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;user&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음과 같은 권한을 갖습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'user'@'%';
GRANT SELECT, INSERT ON test.test TO 'user'@'%';
GRANT UPDATE (y) ON test.test TO 'user'@'%';
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그&lt;/font&gt;&lt;/font&gt;&lt;code&gt;test&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;테이블(InnoDB)은 다음과 같이 정의됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;create table test
(
    x int null,
    y int null
);

create unique index test_x_uindex on test (x);
&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;insert&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;update&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;와 같은 질문들&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;INSERT INTO test (x,y) VALUES (1,1), (2,2);
UPDATE test SET y = 3 WHERE x = 1;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;하지만 달리기&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;INSERT INTO test (x,y) VALUES (2,4) ON DUPLICATE KEY UPDATE y = VALUES(y);
&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;blockquote&gt; 
 &lt;p papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;오류 1143 (42000):&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;UPDATE 명령이 'test' 테이블의 'x' 열에 대해 사용자 'sap'@'localhost'에 거부되었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p papago-id=&quot;13&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;문장이 실제로 업데이트하지 않고 새 행을 삽입하는 경우에도 마찬가지입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이건 좀 이상해 보여요.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;직접 관련된 버그 보고서를 찾을 수 없었습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://bugs.mysql.com/bug.php?id=30915&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;14-1&quot;&gt;MySQL에 대한 오래된&lt;/a&gt; 것(닫혔지만 누군가가 실제로 수정되지 않았다고 말했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 테스트를 하지 않았습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://dev.mysql.com/doc/refman/8.0/en/insert-on-duplicate.html&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;14-3&quot;&gt;MySQL 8.0 설명서&lt;/a&gt;에서 업데이트 권한은 변경된 열에만 필요하다고 언급합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://mariadb.com/kb/en/library/insert-on-duplicate-key-update/&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;14-5&quot;&gt;MariaDB 문서&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;제가 뭘 놓쳤나요?&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;이는 모두 MariaDB 10.2.16에서 테스트되었습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/53505686/missing-privilege-for-insert-on-duplicate-key-update-statement-but-enou&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>mariaDB</category>
      <author>lovecheck</author>
      <guid isPermaLink="true">https://lovecheck.tistory.com/963</guid>
      <comments>https://lovecheck.tistory.com/963#entry963comment</comments>
      <pubDate>Sun, 29 Oct 2023 19:48:18 +0900</pubDate>
    </item>
    <item>
      <title>워드프레스의 빈 광고를 보여주는 Google AdSense</title>
      <link>https://lovecheck.tistory.com/962</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;워드프레스의 빈 광고를 보여주는 Google AdSense&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;워드프레스 사이트 http://www.spadli.com 워드프레스용 애드센스 플러그인은 사용되지 않습니다.&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;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;script async 
   src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
   &amp;lt;!-- spadli-home --&amp;gt;
   &amp;lt;ins class=&quot;adsbygoogle&quot;
       style=&quot;display:block&quot;
       data-ad-client=&quot;ca-pub-2760029831290185&quot;
       data-ad-slot=&quot;8532843753&quot;
       data-ad-format=&quot;auto&quot;&amp;gt;&amp;lt;/ins&amp;gt;
   &amp;lt;script&amp;gt;
   (adsbygoogle = window.adsbygoogle || []).push({});
&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;/p&gt; 
&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고 업그레이드 신청을 했습니다(IN MY ADS -&amp;gt; 기타 상품) 헤더태그에 코드를 입력합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;script async 
src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script&amp;gt;
  (adsbygoogle = window.adsbygoogle || []).push({
  google_ad_client: &quot;ca-pub-2760029831290185&quot;,
  enable_page_level_ads: true
  });
&amp;lt;/script&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;하지만 행운은 없습니다.&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;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;제가 뭘 잘못하고 있는지 확인해주실 수 있나요??&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;누가 어떻게 고치는지 알려줄 수 있나요??&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;??&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;Adsense 계정이 아직 완전히 승인되지 않은 것 같습니다.&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;참조: https://support.google.com/adsense/answer/76228&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;Google 승인 프로세스 옆에서 다음을 생각해 보십시오.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;브라우저에서 광고 차단기를 사용하고 계십니까?&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;광고 공간 설정은 무엇입니까?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그 중 하나가 '광고가 없을 때 빈 칸을 보여준다' 입니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Adsense 규칙도 참고하시기 바랍니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li papago-id=&quot;13&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;한 페이지에 다른 광고 프로그램 없음&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;자신의 광고 클릭 금지(클릭 링 금지)&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;15&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;클라이언트가 다음을 사용할 때&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Ad Blocker&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;16&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그들의 브라우저에..&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러면 해당하는 것만&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Ad's Div&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;17&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;공백이 될 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그냥 광고 차단기 비활성화..&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;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/44429884/google-adsense-showing-blank-ads-on-wordpress&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>Wordpress</category>
      <author>lovecheck</author>
      <guid isPermaLink="true">https://lovecheck.tistory.com/962</guid>
      <comments>https://lovecheck.tistory.com/962#entry962comment</comments>
      <pubDate>Sun, 29 Oct 2023 19:48:12 +0900</pubDate>
    </item>
    <item>
      <title>휴대용 비교 및 스왑(원자 작동) C/C++ 라이브러리?</title>
      <link>https://lovecheck.tistory.com/961</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;여러 컴파일러 간에 이동이 가능한 매크로 또는 함수로 다양한 프로세서의 CAS와 같은 작업을 랩핑하는 작은 라이브러리가 있습니까?&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;2-0&quot;&gt;PS.&lt;/strong&gt; &lt;a href=&quot;http://www.boost.org/doc/libs/1_39_0/boost/interprocess/detail/atomic.hpp&quot; rel=&quot;noreferrer&quot; papago-id=&quot;2-2&quot;&gt;atomic.hpp 라이브러리&lt;/a&gt;가 boost::interprocess::detail 네임스페이스 내부에 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;저자는 공공의, 잘 관리되는 도서관으로 만드는 것을 거부합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;질문을 다시 열고 다른 옵션이 있는지 알아보겠습니다.&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;OPA(Open Portable Atomics)는 당신의 요구에 적합할 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://trac.mcs.anl.gov/projects/openpa/&quot; rel=&quot;noreferrer&quot; papago-id=&quot;4-1&quot;&gt;https://trac.mcs.anl.gov/projects/openpa/&lt;/a&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;MIT 스타일 라이센스로 여러 플랫폼에 걸쳐 공통 원자 작업에 일관된 C API를 제공합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그 도서관은 작고 당신의 크기에 맞는 것이 확실합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;현재 플랫폼 목록은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;x86, x86_64, ia64, PPC 440 및 MIPS 5K 프로세서용 GCC 인라인 어셈블리.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;GCC 호환 프론트엔드를 갖춘 여러 컴파일러도 icc, PGI 및 IBM xlc와 같은 아키텍처에서 지원됩니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;GCC 원자 고유의 특성으로 인해 대부분의 GCC-4.1+ 설치가 지원됩니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;SUN Solaris 원자 작동 라이브러리.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Windows NT 고유의 기능(현재 Windows에 구축하려면 약간의 추가 작업을 수행해야 함).&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;두 개의 유사 플랫폼, pthread mutex 기반 에뮬레이션은 지원되지 않는 플랫폼으로의 이식성을 위해 (일부 성능을 희생시키면서), 조건부로 단일 스레드 코드로 컴파일되는 코드에 사용하기 위한 &quot;안전하지 않은&quot; 구현입니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;C++ 프로그램에서 사용해 본 적은 없지만 거의 변화 없이 작동할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;문제가 생기면 기꺼이 수정하겠습니다(메일 opa-discuss@lists.mcs.anl.gov 만 보내주세요).&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;Boost Interprocess 라이브러리는 다양한 플랫폼과 컴파일러를 위한 Atomic.hpp include file contains compare-and-swap 구현을 원하는 것일 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;13&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://threadingbuildingblocks.org&quot; papago-id=&quot;13-0&quot; rel=&quot;noreferrer&quot;&gt;Intel Threading Building Blocks&lt;/a&gt;는 멋진 휴대용을 가지고 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;atomic&amp;lt;T&amp;gt;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;원하는 작업을 수행하는 템플릿입니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;하지만 작은 도서관인지 아닌지는 당연히 논쟁이 될 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://library.gnome.org/devel/glib/unstable/glib-Atomic-Operations.html&quot; rel=&quot;noreferrer&quot; papago-id=&quot;15-1&quot;&gt;글립의 아토믹 오퍼레이션스&lt;/a&gt; 기능에 관심이 있을 겁니다&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;g_atomic_int_compare_and_exchange()
&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;다양한 아키텍처에 대한 CAS 시맨틱스를 구현합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;구현 자체는 비교적 이해하기 쉬우며 별도의 노력 없이 독립형으로 사용할 수 있습니다. glib/ trunk/ glib/gatomic의 svn.gnome.org/viewvc/ 에서 확인할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;도움이 되기를 바랍니다!&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Mac OS X와 Windows에는 사용해야 할 CompareAndSwap 기능이 내장되어 있습니다(Interlocked Compare).&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;Exchange() 및 OSAtomic Compare AndSwapPtrBarrier()를 각각 비교합니다.&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;다른 유닉스에서는 GCC 4.1 이상을 사용하는 경우 내장된 __sync_val_compare_and_swap()을 사용할 수 있으며, 리눅스에서 생성된 많은 코드가 존재한다고 가정하기 때문에 모든 유닉스 컴파일러가 합리적인 gcc 확장을 지원하는 것은 아니지만 많은 수의 유닉스 컴파일러가 합리적인 gcc 확장을 지원합니다.&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;따라서 OS X 및 Windows의 모든 프로세서를 위한 대부분의 모든 컴파일러와 다른 플랫폼의 GCC 및 일부 다른 컴파일러와 함께 작동하는 방식으로 마무리하려면 다음과 같은 작업을 수행해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;boolean CompareAndSwapPointer(volatile * void * ptr,
                                  void * new_value,
                                  void * old_value) {
#if __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ &amp;gt;= 1050
  return OSAtomicCompareAndSwapPtr (old_value, new_value, ptr);
#elif defined(_MSC_VER)
  return InterlockedCompareExchange(ptr, new_value, old_value);
#elif (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) &amp;gt; 40100
  return __sync_val_compare_and_swap(ptr, old_value, new_value);
#else
#  error No implementation
#endif
}
&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;font class=&quot;papago-parent&quot;&gt;모든 OS 라이브러리가 다른 순서로 arg를 사용하는 방법을 기록합니다 ;-)&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;21&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;물론 다른 크기에 대해 몇 가지 버전을 비교하고 원한다면 교환하여 템플릿으로 포장할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;API는 대부분 C를 기반으로 하며 템플릿을 통해 유형을 매개 변수화하는 데 익숙한 사람들에게는 다소 불쾌할 정도로 유형 정보를 함수로 인코딩합니다.&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;Boehm의 &lt;a href=&quot;http://www.hpl.hp.com/research/linux/atomic_ops/&quot; rel=&quot;noreferrer&quot; papago-id=&quot;22-1&quot;&gt;atomic_ops&lt;/a&gt; 프로젝트의 라이브러리가 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;하지만 면허증에 대해서는 모릅니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;23&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;제안된 C++0x 호환 Boost atomics 라이브러리: http://www.chaoticmind.net/ ~&lt;a href=&quot;http://www.chaoticmind.net/~hcb/projects/boost.atomic/&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;23-1&quot;&gt;hcb/ &lt;/a&gt;projects/boost. atomic/&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p papago-id=&quot;24&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 라이브러리의 목적은 C++0x 초안 표준에 의해 지정된 인터페이스에 기초하여 부스트를 위한 원자 연산의 구현을 제공하는 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;std::atomic으로 쉽게 전환할 수 있도록 하는 것을 목표로 하고 있으며, 이 C++0x 기능을 사용하여 이전 시스템에서 컴파일 가능한 코드를 만들 수 있는 수단을 제공합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p papago-id=&quot;25&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;아직 Boost의 일부는 아니지만 여기서 리뷰 스레드를 확인할 수 있습니다. http://lists.boost.org/Archives/boost/2009/12/160195.php&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&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;font class=&quot;papago-parent&quot;&gt;다음과 같은 &quot;진정한&quot; 원자 변수를 지원합니다.&lt;/font&gt;&lt;/p&gt; 
 &lt;ul&gt; 
  &lt;li papago-id=&quot;27&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;gcc/x86, 32비트(Linux, FreeB에서 테스트됨)&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;SD)&lt;/font&gt;&lt;/li&gt; 
  &lt;li papago-id=&quot;28&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;gcc/x86, 64비트(Linux에서 테스트됨)&lt;/font&gt;&lt;/li&gt; 
  &lt;li papago-id=&quot;29&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;gcc/powerpc32(Linux, Mac OS X에서 테스트됨)&lt;/font&gt;&lt;/li&gt; 
  &lt;li papago-id=&quot;30&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;gcc/powerpc64 (미테스트)&lt;/font&gt;&lt;/li&gt; 
  &lt;li papago-id=&quot;31&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;일반 Win32 (Win XP에서 Visual Studio Express와 함께 테스트됨)&lt;/font&gt;&lt;/li&gt; 
 &lt;/ul&gt; 
 &lt;p papago-id=&quot;32&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다른 모든 경우에도 잠금 작동 상태로 우아하게 돌아갑니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;희망사항을 설명하는 예제 섹션을 포함한 적절한 퀵북 문서가 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt;&lt;p papago-id=&quot;33&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(제공하신 링크에서) 작성자님께서 말씀하신 것은 &quot;부스트 공식 라이브러리가 나올 때까지 안전하게 사용하실 수 있을 것 같습니다.&quot;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;인터페이스 변경을 &quot;C++0x에 원자 함수가 존재할 때&quot;까지 연기합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;오늘날 어떤 용도로 사용하던 간에 새로운 제품으로 마이그레이션하려는 경우가 많습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;std::&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용 가능한 경우의 기능입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;36&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Boost는 일반적으로 꽤 좋으며, 출시된 Boost 라이브러리의 구현에 사용되는 것으로 보입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;저도 그 구현을 사용하고 싶다는 유혹을 몇 번 받았습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;37&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저라면 해보겠습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;38&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;http://www.ioremap.net/node/224 에서 영감을 얻기 위해 libsync를 살펴볼 수도 있습니다. 이는 상당히 새로운 것이지만(너무 새로운 것일 수도 있지만), 타원형 네트워크에서 사용되고 있기 때문에 (일부?) 테스트가 가능합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;39&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또한 스레드 간 잠금 없는 동기화를 위해 CAS: RCU(Read Copy Update) 옆에 있는 상위 레벨의 프리미티브도 제공합니다.&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;그러나 이것은 '휴대용'을 의미하는 바에 따라 다릅니다. 아키텍처 x86 및 PPC, OSes Linux, FreeBSD, OpenBSD, Solaris 및 MacOSX를 지원하지만...&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;윈도우 없음.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;41&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고 라이선스는 GPL로 여러분이 싫어하거나 사랑할 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;42&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/1158374/portable-compare-and-swap-atomic-operations-c-c-library&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>C</category>
      <author>lovecheck</author>
      <guid isPermaLink="true">https://lovecheck.tistory.com/961</guid>
      <comments>https://lovecheck.tistory.com/961#entry961comment</comments>
      <pubDate>Tue, 24 Oct 2023 21:26:24 +0900</pubDate>
    </item>
    <item>
      <title>모든 요청에 대해 세션 시간 초과가 재설정됩니까?</title>
      <link>https://lovecheck.tistory.com/960</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&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;Ajax 요청으로 인해 세션 재설정 시간 초과가 발생합니까?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;맘에 들다&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Update Panel&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;jQuery ajax&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;,...&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;감사해요.&lt;/font&gt;&lt;/p&gt; 
&lt;hr&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;편집 1)&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;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;HTTP Get&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;9&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;code&gt;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 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;session&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 class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;동일한 웹 사이트에 대한 후속 요청 시 브라우저는&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ASP.NET_SessionId Cookie&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;서버측 모듈이 세션 값(사용자 정보 등)에 액세스하는 데 사용할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;---------------------------------------------------------------------------------
                     How to detect the Session TimeOut
---------------------------------------------------------------------------------
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;img src=&quot;https://i.stack.imgur.com/RvltX.png&quot; alt=&quot;enter image description here&quot;&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;---------------------------------------------------------------------------------
&lt;/code&gt;&lt;/pre&gt; 
&lt;blockquote&gt; 
 &lt;p papago-id=&quot;13&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;13-0&quot;&gt;질문&lt;/strong&gt; -&lt;strong papago-id=&quot;13-0&quot;&gt; 2&lt;/strong&gt; - Ajax 요청으로 인해 세션이 재설정됩니까?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;업데이트 패널, jQuery ajax,...&lt;/font&gt;&lt;/p&gt; 
 &lt;p papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;14-0&quot;&gt;질문&lt;/strong&gt; -&lt;strong papago-id=&quot;14-0&quot;&gt; 3&lt;/strong&gt; - HTTP Get으로 인해 세션이 재설정됩니까?&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;&lt;code&gt;Session&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;code&gt;Session&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;server side&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;session&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;서버에 대한 각 요청에서 시간 초과가 재설정됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Web.Config

&amp;lt;sessionState mode=&quot;InProc&quot; stateConnectionString=&quot;tcpip=127.0.0.1:42424&quot; 
 sqlConnectionString=&quot;data source=127.0.0.1;Trusted_Connection=yes&quot;
    cookieless=&quot;true&quot; timeout=&quot;1&quot; /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;12&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font 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;Session&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;br&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;21&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 ajax &lt;em papago-id=&quot;21-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;22&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(비록 제가 직접 접해보지는 못했지만, &lt;a href=&quot;http://ranjitkumars.wordpress.com/2010/03/02/asp-net-ajax-prevent-session-timeout/&quot; papago-id=&quot;22-1&quot;&gt;여기&lt;/a&gt;에 설명이 있습니다.)&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;strong papago-id=&quot;23&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;세션 변수 확인 여부와 관계없이 모든 요청에 대해 세션 타임아웃이 재설정됩니까?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;아니면 적어도 하나의 세션 변수를 사용해야 합니까?&lt;/font&gt;&lt;/strong&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;세션 변수가 설정될 때까지 모든 포스트백에 대해 새 세션 ID가 생성됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;25&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Ajax 요청으로 인해 세션 재설정 시간 초과가 발생합니까?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;업데이트 패널, jQuery ajax,...&lt;/font&gt;&lt;/strong&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;기본적으로 쿠키에 저장된 세션 ID는 모든 AJAX 및 비 AJAX 요청에 대해 전송됩니다.&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;fiddler 또는 f12 tool을 ie 안에 사용합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;모든 AJAX GET/POST 요청과 함께 쿠키가 발송되는 것을 볼 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;27&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 여러 가지 요소에 따라 다르므로 아래와 같이 테스트를 진행하는 것을 권장합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용자 환경에서 정확한 상황이 작동하는지 확인하는 데는 5분도 걸리지 않습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 내가 이것을 테스트하기 위해 사용했던 내 코드입니다. 나는 아이디어를 테스트하기 위해 텔릭 컨트롤을 사용하지만 당신이 원하는 정확한 답을 얻기 위해 .get을 추가했습니다. asx 페이지가 가지고 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;telerik:RadScriptManager ID=&quot;RadScriptManager1&quot; Runat=&quot;server&quot;&amp;gt;
        &amp;lt;/telerik:RadScriptManager&amp;gt;
        &amp;lt;telerik:RadAjaxManager ID=&quot;ram&quot; runat=&quot;server&quot;&amp;gt;
            &amp;lt;AjaxSettings&amp;gt;
                &amp;lt;telerik:AjaxSetting AjaxControlID=&quot;btnFake&quot;&amp;gt;
                    &amp;lt;UpdatedControls&amp;gt;
                        &amp;lt;telerik:AjaxUpdatedControl ControlID=&quot;lblAnswer&quot; /&amp;gt;
                    &amp;lt;/UpdatedControls&amp;gt;
                &amp;lt;/telerik:AjaxSetting&amp;gt;
            &amp;lt;/AjaxSettings&amp;gt;
        &amp;lt;/telerik:RadAjaxManager&amp;gt;
        &amp;lt;script src=&quot;Scripts/jquery-1.4.1-vsdoc.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;script&amp;gt;
        $(document).ready(function () {
            setTimeout(function () { document.location.href = &quot;default.aspx?next&quot;; }, 61000);
            setInterval(function () {
                var divForTimer = $(&quot;#divTime&quot;);
                var secs = parseInt(divForTimer.html());
                secs = secs + 1;
                $(&quot;#divTime&quot;).html(secs.toString());
            }, 1000);

        });
        function getPage() {

            $.get(&quot;test.aspx&quot;, function(result) {
                $(&quot;#btnFake&quot;).val(&quot;Got it&quot;);

            });
        }
    &amp;lt;/script&amp;gt;
   &amp;lt;asp:Label ID=&quot;lblAnswer&quot; runat=&quot;server&quot;&amp;gt;&amp;lt;/asp:Label&amp;gt;
   &amp;lt;Asp:button ID=&quot;btnTest&quot; runat=&quot;server&quot; Text=&quot;Renew&quot; onclick=&quot;btnTest_Click&quot; /&amp;gt;
   &amp;lt;input type=&quot;button&quot; ID=&quot;btnAjaxget&quot;  onclick =&quot;getPage()&quot;  value=&quot;Ajax get&quot; /&amp;gt;
   &amp;lt;asp:Button ID=&quot;btnFake&quot; runat=&quot;server&quot;  Text =&quot;Fake it&quot; 
        onclick=&quot;btnFake_Click&quot;/&amp;gt;
        &amp;lt;div id=&quot;divTime&quot;&amp;gt;1&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;28&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.cs 페이지는.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;protected void Page_Load(object sender, EventArgs e)
        {
            Session.Timeout = 1;
            if (EMSG.CommonFunctions.GetSession(&quot;test&quot;).Length &amp;gt; 0)
            {
                this.lblAnswer.Text = &quot;Session=&quot; + EMSG.CommonFunctions.GetSession(&quot;test&quot;);
            }
            else
            {
                this.lblAnswer.Text = &quot;No session&quot;;
            }

        }

        protected void btnTest_Click(object sender, EventArgs e)
        {
            Session[&quot;test&quot;] = &quot;variable set&quot;;
            this.lblAnswer.Text = Session[&quot;test&quot;].ToString();
        }

        protected void btnFake_Click(object sender, EventArgs e)
        {
            lblAnswer.Text = &quot;Ajax called.&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;font class=&quot;papago-parent&quot;&gt;페이지를 로드합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&quot;Renew(갱신)&quot; 버튼을 클릭하면 세션이 설정됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;61초만 기다리면 페이지가 새로 고쳐지고 세션 변수가 사라집니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;다시 시도해 보십시오. 하지만 이번에는 몇 초 후에 다른 두 버튼 중 하나를 클릭하면 세션 변수가 ajax 호출에서 그대로 유지됨을 알 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 상황에서 ajax 호출은 세션 변수를 새로 고칩니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;30&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/10370110/does-session-timeout-reset-on-every-request&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>AJAX</category>
      <author>lovecheck</author>
      <guid isPermaLink="true">https://lovecheck.tistory.com/960</guid>
      <comments>https://lovecheck.tistory.com/960#entry960comment</comments>
      <pubDate>Tue, 24 Oct 2023 21:26:17 +0900</pubDate>
    </item>
    <item>
      <title>내 진행률 표시줄의 Excel vba 사용자 양식에서 닫기 [X] 버튼 숨기기</title>
      <link>https://lovecheck.tistory.com/959</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;내 진행률 표시줄의 Excel vba 사용자 양식에서 닫기 [X] 버튼 숨기기&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;0&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;매크로가 여전히 시트를 가져오는 중인 경우 진행 표시줄을 표시하기 위해 사용자 양식을 만들었습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;img src=&quot;https://i.stack.imgur.com/bUpnL.png&quot; alt=&quot;enter image description here&quot;&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;문제는 사용자가 빨간색 &lt;strong papago-id=&quot;2-1&quot;&gt;[X]&lt;/strong&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;em papago-id=&quot;3-1&quot;&gt;종말의 빨간 버튼&lt;/em&gt;을 숨길 수 있는 방법이 있을까요?&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;편집:&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;나 이거 먹어봤어요.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;'Find the userform's Window
Private Declare Function FindWindow Lib &quot;user32&quot; _
        Alias &quot;FindWindowA&quot; ( _
        ByVal lpClassName As String, _
        ByVal lpWindowName As String) As Long

'Get the current window style
Private Declare Function GetWindowLong Lib &quot;user32&quot; _
        Alias &quot;GetWindowLongA&quot; ( _
        ByVal hWnd As Long, _
        ByVal nIndex As Long) As Long

'Set the new window style
Private Declare Function SetWindowLong Lib &quot;user32&quot; _
        Alias &quot;SetWindowLongA&quot; ( _
        ByVal hWnd As Long, _
        ByVal nIndex As Long, _
        ByVal dwNewLong As Long) As Long

Const GWL_STYLE = -16
Const WS_SYSMENU = &amp;amp;H80000
&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;userform_initialize 에서 사용했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;   Dim hWnd As Long, lStyle As Long

   'Which type of userform
   If Val(Application.Version) &amp;gt;= 9 Then
      hWnd = FindWindow(&quot;ThunderDFrame&quot;, Me.Caption)
   Else
      hWnd = FindWindow(&quot;ThunderXFrame&quot;, Me.Caption)
   End If

   'Get the current window style and turn off the Close button
   lStyle = GetWindowLong(hWnd, GWL_STYLE)
   SetWindowLong hWnd, GWL_STYLE, (lStyle And Not WS_SYSMENU)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 오류 메시지가 나타납니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;img src=&quot;https://i.stack.imgur.com/wDVVE.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;a href=&quot;http://p2p.wrox.com/excel-vba/7312-get-rid-close-button-form.html#post106883&quot; rel=&quot;noreferrer&quot; papago-id=&quot;8-1&quot;&gt;여기&lt;/a&gt;서 가져온 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;제가 뭘 잘못하고 있는지도 모르고 댓글도 이미 지웠어요.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것이 제가 찾은 가장 간단한 코드이기 때문에 제 사용자 양식에 통합하고 싶습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;어떤 도움이든 감사히 받겠습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음은 다음과 같이 호출할 수 있는 루틴입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;subRemoveCloseButton MyForm
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또는 양식 내에서:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;subRemoveCloseButton Me 
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;필요한 코드는 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Private Const mcGWL_STYLE = (-16)
Private Const mcWS_SYSMENU = &amp;amp;H80000

'Windows API calls to handle windows
#If VBA7 Then
    Private Declare PtrSafe Function FindWindow Lib &quot;user32&quot; Alias &quot;FindWindowA&quot; (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
#Else
    Private Declare Function FindWindow Lib &quot;user32&quot; Alias &quot;FindWindowA&quot; (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
#End If

#If VBA7 Then
    Private Declare PtrSafe Function GetWindowLong Lib &quot;user32&quot; Alias &quot;GetWindowLongA&quot; (ByVal hwnd As Long, ByVal nIndex As Long) As Long
#Else
    Private Declare Function GetWindowLong Lib &quot;user32&quot; Alias &quot;GetWindowLongA&quot; (ByVal hwnd As Long, ByVal nIndex As Long) As Long
#End If

#If VBA7 Then
    Private Declare PtrSafe Function SetWindowLong Lib &quot;user32&quot; Alias &quot;SetWindowLongA&quot; (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
#Else
    Private Declare Function SetWindowLong Lib &quot;user32&quot; Alias &quot;SetWindowLongA&quot; (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
#End If


Public Sub subRemoveCloseButton(frm As Object)
    Dim lngStyle As Long
    Dim lngHWnd As Long

    lngHWnd = FindWindow(vbNullString, frm.Caption)
    lngStyle = GetWindowLong(lngHWnd, mcGWL_STYLE)

    If lngStyle And mcWS_SYSMENU &amp;gt; 0 Then
        SetWindowLong lngHWnd, mcGWL_STYLE, (lngStyle And Not mcWS_SYSMENU)
    End If

End Sub
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음 토막글에서 해결할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;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;cmdClose&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;View | Code&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;pre&gt;&lt;code&gt;Private Sub cmdClose_Click()
  Unload Me
End Sub
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;메뉴 모음에서 다음을 선택합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;View | Object&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;, 사용자 양식으로 돌아갑니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Esc 키를 눌러 양식을 닫을 수 있도록 하려면:&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 창에서 합니다 변경합니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; Properties(속성) 창에서&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Cancel&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;에의 재산.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;True&lt;/code&gt;&lt;/p&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;X 단추를 눌러 사용자가 양식을 닫지 못하도록 하려면&lt;/font&gt;&lt;/strong&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;UserForm&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;X&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;우측 상단&lt;/font&gt;에 &lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;하는 것 &lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;에도 X를&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt; 수 &lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;양식 닫기 버튼을 사용하는 것 외에도 X를 사용하여 양식을 닫을 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이를 방지하려면 다음 단계를 수행합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;12&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;User Form Choose(사용자 양식 선택)에서 빈 부분을 마우스 오른쪽 단추로 클릭합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;View | Code&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;13&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;절차 드롭다운의 오른쪽 상단에서 쿼리 닫기를 선택합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;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;Private Sub UserForm_QueryClose(Cancel As Integer, _
  CloseMode As Integer)
  If CloseMode = vbFormControlMenu Then
    Cancel = True
    MsgBox &quot;Please use the Close Form button!&quot;
  End If
End Sub
&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&gt;&lt;code&gt;View | Object&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&gt;&lt;/font&gt;&lt;code&gt;X&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;16&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용자 양식에 메시지가 표시됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;31&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;http://www.contextures.com/xlUserForm01.html 에서&lt;/font&gt;&lt;/p&gt;&lt;h2 papago-id=&quot;32&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 @Peter Albert의 위 답변을 개선한 것입니다.&lt;/font&gt;&lt;/h2&gt; 
&lt;ul&gt; 
 &lt;li papago-id=&quot;33&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Windows API 호출은 이제 Office x64로 안전합니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;FindWindow&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;17&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Excel UserForms만 찾도록 통화가 개선되었습니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;원래 답변의 함수는 모든 창 클래스(예: 탐색기 창 및 다른 프로그램의 창)를 검색합니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;따라서 다른 프로그램이나 탐색기 창의 [x] 버튼이 사용자 양식과 이름이 같을 때 제거되었을 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;hr&gt; 
&lt;pre&gt;&lt;code&gt;Private Const mcGWL_STYLE = (-16)
Private Const mcWS_SYSMENU = &amp;amp;H80000

'Windows API calls to handle windows
Private Declare PtrSafe Function FindWindow Lib &quot;user32&quot; Alias &quot;FindWindowA&quot; ( _
    ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
  
#If Win64 Then
    Private Declare PtrSafe Function GetWindowLongPtr Lib &quot;user32&quot; Alias &quot;GetWindowLongPtrA&quot; ( _
        ByVal hwnd As LongPtr, ByVal nIndex As Long) As LongPtr
    Private Declare PtrSafe Function SetWindowLongPtr Lib &quot;user32&quot; Alias &quot;SetWindowLongPtrA&quot; ( _
        ByVal hwnd As LongPtr, ByVal nIndex As Long, ByVal dwNewLong As LongPtr) As LongPtr
#Else
    Private Declare PtrSafe Function GetWindowLongPtr Lib &quot;user32&quot; Alias &quot;GetWindowLongA&quot; ( _
        ByVal hwnd As LongPtr, ByVal nIndex As Long) As LongPtr
    Private Declare PtrSafe Function SetWindowLongPtr Lib &quot;user32&quot; Alias &quot;SetWindowLongA&quot; ( _
        ByVal hwnd As LongPtr, ByVal nIndex As Long, ByVal dwNewLong As LongPtr) As LongPtr
#End If

Public Sub RemoveCloseButton(objForm As Object)
    Dim lngStyle As LongPtr
    Dim lngHWnd As LongPtr
    
    Dim lpClassName As String
    lpClassName = vbNullString
    If Val(Application.Version) &amp;gt;= 9 Then
       lpClassName = &quot;ThunderDFrame&quot;
    Else
       lpClassName = &quot;ThunderXFrame&quot;
    End If
    
    lngHWnd = FindWindow(lpClassName, objForm.Caption)
    lngStyle = GetWindowLongPtr(lngHWnd, mcGWL_STYLE)

    If lngStyle And mcWS_SYSMENU &amp;gt; 0 Then
        SetWindowLongPtr lngHWnd, mcGWL_STYLE, (lngStyle And Not mcWS_SYSMENU)
    End If
End Sub
&lt;/code&gt;&lt;/pre&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;splited&quot;&gt;&lt;strong papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;ThunderDFrame?&lt;/font&gt;&lt;/strong&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;19&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Excel의 UserForms는 실제로 Windows 클래스입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ThunderDFrame&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;20&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;, 2002년 이후 Microsoft Office 응용 프로그램의 모든 UserFroms 클래스입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그 전에는.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ThunderXFrame&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;/blockquote&gt;&lt;p papago-id=&quot;39&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;버튼을 비활성화하는 유용한 방법은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    If CloseMode = 0 Then Cancel = True
End Sub
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;40&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것이 버튼을 &lt;em papago-id=&quot;40-1&quot;&gt;제거&lt;/em&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;font class=&quot;papago-parent&quot;&gt;저스틴 &amp;amp; 피터의 아이디어를 바탕으로.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Private Sub UserForm_QueryClose(Cancel As Integer, _
                            CloseMode As Integer)
Dim ans
If CloseMode = vbFormControlMenu Then
    Cancel = True
    ans = Msgbox(&quot;Cancel edit?&quot;, vbQuestion + vbYesNo)
    If ans = vbYes Then
       Me.Hide
    End if
End If
End Sub
&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;편집: 사실 OP가 X 옵션을 제거하고 싶었기 때문에 이것이 약간 주제에서 벗어난 것임을 깨달았습니다. 하지만 여전히 대화형 양식에는 유용합니다.&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;이것이 오래된 질문이라는 것을 알고 있지만 인용한 OP의 사용자 양식의 경우 닫기 버튼을 제거하거나 숨기거나 비활성화할 필요가 없습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;훨씬 더 간단한 방법이 있습니다 ;)&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;44&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용자가 상호 작용하는 요소가 없고(버튼 등) 목적이 완료되면 자동으로 닫히는 사용자 양식의 경우 양식을 비활성화해도 좋습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;45&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용자 양식을 비활성화하려면:&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용자 양식의 속성에서 Enabled set False에 반대합니다.&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;/strong&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;46&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또한 사용자 양식이 표시되는 동안 기본 창에서 다른 작업을 수행할 수 있도록 할지 여부는 ShowModal을 설정할지 여부를 결정합니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;47&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/15153491/hide-close-x-button-on-excel-vba-userform-for-my-progress-bar&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>Excel</category>
      <author>lovecheck</author>
      <guid isPermaLink="true">https://lovecheck.tistory.com/959</guid>
      <comments>https://lovecheck.tistory.com/959#entry959comment</comments>
      <pubDate>Tue, 24 Oct 2023 21:26:08 +0900</pubDate>
    </item>
    <item>
      <title>java.sql 푸는 방법SQL 비일시적 연결예외:결과 집합을 읽을 수 없습니다.연결 재설정?</title>
      <link>https://lovecheck.tistory.com/958</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;java.sql 푸는 방법&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;SQL 비일시적 연결&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;예외:&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;결과 집합을 읽을 수 없습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;연결 재설정?&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;비활성 기간이 지난 후 데이터베이스 코드를 호출할 때 예외가 발생하는 경우&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;java.sql.SQLNonTransientConnectionException: Could not read resultset: Connection reset
        at org.mariadb.jdbc.internal.SQLExceptionMapper.get(SQLExceptionMapper.java:136)
        at org.mariadb.jdbc.internal.SQLExceptionMapper.throwException(SQLExceptionMapper.java:106)
        at org.mariadb.jdbc.MySQLStatement.executeQueryEpilog(MySQLStatement.java:264)
        at org.mariadb.jdbc.MySQLStatement.execute(MySQLStatement.java:288)
        at org.mariadb.jdbc.MySQLStatement.executeQuery(MySQLStatement.java:302)
        at org.mariadb.jdbc.MySQLStatement.executeQuery(MySQLStatement.java:361)
        at org.apache.commons.dbcp.DelegatingStatement.executeQuery(DelegatingStatement.java:208)
        at org.apache.commons.dbcp.DelegatingStatement.executeQuery(DelegatingStatement.java:208)
        at com.vimba.database.DBFactory.attemptLoginWithTempPasswordDetails(DBFactory.java:181)
        at com.vimba.database.DBFactory.authenticate(DBFactory.java:131)
        at com.vimba.service.ExposedFunctions.login(ExposedFunctions.java:88)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:483)
        at com.sun.xml.ws.api.server.InstanceResolver$1.invoke(InstanceResolver.java:210)
        at com.sun.xml.ws.server.InvokerTube$2.invoke(InvokerTube.java:132)
        at com.sun.xml.ws.server.sei.EndpointMethodHandler.invoke(EndpointMethodHandler.java:241)
        at com.sun.xml.ws.server.sei.SEIInvokerTube.processRequest(SEIInvokerTube.java:74)
        at com.sun.xml.ws.api.pipe.Fiber.__doRun(Fiber.java:559)
        at com.sun.xml.ws.api.pipe.Fiber._doRun(Fiber.java:518)
        at com.sun.xml.ws.api.pipe.Fiber.doRun(Fiber.java:503)
        at com.sun.xml.ws.api.pipe.Fiber.runSync(Fiber.java:400)
        at com.sun.xml.ws.server.WSEndpointImpl$2.process(WSEndpointImpl.java:226)
        at com.sun.xml.ws.transport.http.HttpAdapter$HttpToolkit.handle(HttpAdapter.java:375)
        at com.sun.xml.ws.transport.http.HttpAdapter.handle(HttpAdapter.java:175)
        at com.sun.xml.ws.transport.http.servlet.ServletAdapter.handle(ServletAdapter.java:134)
        at com.sun.xml.ws.transport.http.servlet.WSServletDelegate.doPost(WSServletDelegate.java:159)
        at com.sun.xml.ws.transport.http.servlet.WSServlet.doPost(WSServlet.java:49)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:754)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:847)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:295)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:149)
        at org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:169)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:145)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:97)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:102)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:336)
        at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:856)
        at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:653)
        at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:920)
        at java.lang.Thread.run(Thread.java:745)
Caused by: org.mariadb.jdbc.internal.common.QueryException: Could not read resultset: Connection reset
        at org.mariadb.jdbc.internal.mysql.MySQLProtocol.getResult(MySQLProtocol.java:926)
        at org.mariadb.jdbc.internal.mysql.MySQLProtocol.executeQuery(MySQLProtocol.java:991)
        at org.mariadb.jdbc.MySQLStatement.execute(MySQLStatement.java:281)
        ... 40 more
Caused by: java.net.SocketException: Connection reset
&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;/etc/my.cnf를 변경하여 wait_time out of week을 추가하려고 했지만 변경되지 않았습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mysqld/mariadb according to the
# instructions in http://fedoraproject.org/wiki/Systemd

# Currently, there are mariadb and community-mysql packages in Fedora.
# This particular config file is included in respective RPMs of both of them,
# so the following settings are general and will be also used by both of them.
# Otherwise the RPMs would be in conflict.
# Settings for particular implementations like MariaDB are then
# defined in appropriate sections; for MariaDB server in [mariadb] section in
# /etc/my.cnf.d/server.cnf (part of mariadb-server).
# It doesn't matter that we set these settings only for [mysqld] here,
# because they will be read and used in mysqld_safe as well.
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

[mysqld_safe]

#
# include all files from the config directory
#
!includedir /etc/my.cnf.d

#one week timeout to see if exception goes
wait_timeout=604800

event_scheduler=on
/etc/my.cnf (END)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 문제를 해결하는 방법을 아는 사람이 있습니까?&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;해당 &lt;a href=&quot;http://commons.apache.org/proper/commons-dbcp/configuration.html&quot; rel=&quot;nofollow&quot; papago-id=&quot;4-1&quot;&gt;연결&lt;/a&gt; 검사를 수행하도록 DBCP를 구성할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이와 같은 내용을 구성에 추가합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;validationQuery=&quot;/* ping */ SELECT 1&quot;
testOnBorrow=&quot;true&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;DBCP는 풀에서 연결을 얻을 때마다 연결이 활성화되어 있는지 확인하여 필요할 때 연결을 삭제하고 새 연결을 만듭니다.&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;결국 나는 포기하고 매시간마다 데이터베이스를 ping하는 방법을 썼습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;public static void pingServer(final BasicDataSource source){
    final Thread serverPing = new Thread(new Runnable() {
        @Override
        public void run() {
            Connection conn = null;
            try {
                while(!Thread.currentThread().isInterrupted()){
                    String sql = &quot;/* ping */ SELECT 1&quot;;
                    PreparedStatement st = null;
                    conn = source.getConnection();
                    st = conn.prepareStatement(sql);
                    st.executeUpdate(sql);
                    LOGGER.info(&quot;Database connection test successful&quot;);
                    DatabaseUtilities.closeConnection(conn);
                    TimeUnit.HOURS.sleep(1);
                }
            } catch (SQLException | InterruptedException e) {
                LOGGER.error(&quot;Unable to continue pinging database server&quot;, e);
                DatabaseUtilities.closeConnection(conn);
            }
            finally{
                DatabaseUtilities.closeConnection(conn);
            }
        }
    });
    serverPing.setDaemon(true);
    serverPing.start();
}
&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;문자열 변경 jdbcUrl&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;8-0&quot;&gt;보낸&lt;/strong&gt; 사람&lt;strong papago-id=&quot;8-0&quot;&gt;:&lt;/strong&gt; 문자열 jdbcUrl &lt;strong papago-id=&quot;8-0&quot;&gt;=&lt;/strong&gt; &quot;jdbc:mysql://localhost:3306/web_customer_tracker?usesSSL&lt;strong papago-id=&quot;8-0&quot;&gt;=&lt;/strong&gt; &lt;strong papago-id=&quot;8-0&quot;&gt;false&lt;/strong&gt;&quot;;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;9-0&quot;&gt;받는&lt;/strong&gt; 사람&lt;strong papago-id=&quot;9-0&quot;&gt;:&lt;/strong&gt; 문자열 jdbcUrl &lt;strong papago-id=&quot;9-0&quot;&gt;=&lt;/strong&gt; &quot;jdbc:mysql://localhost:3306/web_customer_tracker?usesSSL&lt;strong papago-id=&quot;9-0&quot;&gt;=&lt;/strong&gt; &lt;strong papago-id=&quot;9-0&quot;&gt;false&lt;/strong&gt;&amp;amp;allowPublicKeyRetrieval&lt;strong papago-id=&quot;9-0&quot;&gt;=&lt;/strong&gt; true&quot;;&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;strong papago-id=&quot;10-1&quot;&gt;메이븐&lt;/strong&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;1단계) 폴더 src/메인/리소스 열기&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;2단계) persistence-mysql.properties 열기&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;3단계) jdbc.url 변경&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;부터&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;jdbc:mysql://localhost:3306/web_customer_tracker?useSSL=false
&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;jdbc:mysql://localhost:3306/web_customer_tracker?useSSL=false&amp;amp;allowPublicKeyRetrieval=true
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;16&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/25054095/how-to-solve-java-sql-sqlnontransientconnectionexception-could-not-read-results&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>mariaDB</category>
      <author>lovecheck</author>
      <guid isPermaLink="true">https://lovecheck.tistory.com/958</guid>
      <comments>https://lovecheck.tistory.com/958#entry958comment</comments>
      <pubDate>Tue, 24 Oct 2023 21:25:59 +0900</pubDate>
    </item>
    <item>
      <title>내부 기능에서 외부 기능을 종료할 수 있는 방법이 있습니까?</title>
      <link>https://lovecheck.tistory.com/957</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;PHP 내에서 다른 기능을 호출하는 기능이 하나 있다면 전체 스크립트를 죽이지 않고 호출된 기능이 호출자 기능에서 종료되도록 할 수 있는 방법이 있습니까?&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를 들어, 제가 다음과 같은 코드를 가지고 있다고 가정해 보겠습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;?php
function funcA() {
    funcB();
    echo 'Hello, we finished funcB';
}

function funcB() {
    echo 'This is funcB';
}
?&amp;gt;
&amp;lt;p&amp;gt;This is some text. After this text, I'm going to call funcA.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;&amp;lt;?php funcA(); ?&amp;gt;&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;This is more text after funcA ran.&amp;lt;/p&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;안타깝게도 funcB 안에서 funcA가 끝나지 않게 하고 싶은 무언가를 발견하면 전체 PHP 스크립트를 종료해야 할 것 같습니다.&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;funcB()의 결과를 확인하기 위해 funcA()에 무엇인가를 쓸 수 있다는 것을 알고 있지만, 저의 경우 funcA()의 내용에 대한 통제권이 없고 funcB()의 내용에 대한 통제권만 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 예를 좀 더 구체적으로 설명하자면, 저는 이 예에서 워드프레스와 함께 일하고 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;나는 &lt;a href=&quot;http://core.trac.wordpress.org/browser/tags/3.1.1/wp-includes/general-template.php#L96&quot; rel=&quot;noreferrer&quot; papago-id=&quot;5-1&quot;&gt;get_template_part() 함수&lt;/a&gt;에 후크를 걸며, 내 후크가 실행된 후 호출되는 locate_template() 함수를 통해 워드프레스가 실제로 파일을 요구/포함하는 것을 막으려고 합니다.&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;0&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://php.net/manual/en/language.exceptions.php&quot; rel=&quot;nofollow&quot; papago-id=&quot;0-1&quot;&gt;예외&lt;/a&gt; 입력&lt;/font&gt;&lt;/font&gt;&lt;code&gt;funcB&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;funcA&lt;/code&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;&amp;lt;?php
  function funcA() {
     try
     {
        funcB();
        echo 'Hello, we finished funcB';
     }
     catch (Exception $e) 
     {
        //Do something if funcB causes an error, or just swallow the exception
     }
  }

  function funcB() {
     echo 'This is funcB';
     //if you want to leave funcB and stop funcA doing anything else, just
     //do something like:
     throw new Exception('Bang!');
  }
?&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;제가 볼 수 있는 유일한 방법은 예외를 사용하는 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;function funcA() {
    funcB();
    echo 'Hello, we finished funcB';
}

function funcB() {
   throw new Exception;
   echo 'This is funcB';
}
?&amp;gt;
&amp;lt;p&amp;gt;This is some text. After this text, I'm going to call funcA.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;&amp;lt;?php  try { funcA(); } catch (Exception $e) {} ?&amp;gt;&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;This is more text after funcA ran.&amp;lt;/p&amp;gt;
&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;못생겼지만 PHP5에서 작동합니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;어쩌면...&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;해결책은 아니지만 exit()에서 &quot;register_shutdown_function('shutdown';)&quot;을 요청할 때 호출되는 다른 함수를 후크할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고 어떻게든 이 일을 다시 계속하게 하거나 당신의 만족을 만족시킬 수 있게 하는 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;?php
function shutdown()
{
    // This is our shutdown function, in 
    // here we can do any last operations
    // before the script is complete.

    echo 'Script executed with success', PHP_EOL;
}

register_shutdown_function('shutdown');
?&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;13&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/5747411/any-way-to-exit-outer-function-from-within-inner-function&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>Wordpress</category>
      <author>lovecheck</author>
      <guid isPermaLink="true">https://lovecheck.tistory.com/957</guid>
      <comments>https://lovecheck.tistory.com/957#entry957comment</comments>
      <pubDate>Tue, 24 Oct 2023 21:25:50 +0900</pubDate>
    </item>
    <item>
      <title>Emacs에서 XML 파일을 예쁘게 인쇄</title>
      <link>https://lovecheck.tistory.com/956</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Emacs에서 XML 파일을 예쁘게 인쇄&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 파일(nxml-mode)을 편집하기 위해 이맥스를 사용하는데, 컴퓨터에서 생성된 파일은 태그의 형식이 좋지 않습니다.&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;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;직접 함수를 작성할 필요도 없습니다. sgml-mode(gnuemacs 코어 모듈)에는 영역 시작 및 끝 인수를 사용하는 (sgml-pretty-print...)라는 예쁜 인쇄 기능이 내장되어 있습니다.&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;만약 당신이 xml을 자르고 붙이는데 당신의 단말기가 임의의 장소에서 선을 자르는 것을 발견한다면 당신은 먼저 선을 &lt;a href=&quot;http://curiousprogrammer.wordpress.com/2009/02/27/pretty-printing-xml/&quot; papago-id=&quot;5-1&quot; rel=&quot;noreferrer&quot;&gt;고치는&lt;/a&gt; 이 예쁜 &lt;a href=&quot;http://curiousprogrammer.wordpress.com/2009/02/27/pretty-printing-xml/&quot; papago-id=&quot;5-1&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; papago-id=&quot;0&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;새 줄 바꿈을 도입하지 않고 꽤 들여쓰기만 필요한 경우에는 다음을 적용할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;indent-region&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;명령을 다음 키 입력과 함께 전체 버퍼에 전달합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;C-x h
C-M-\
&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;http://blog.bookworm.at/2007/03/pretty-print-xml-with-emacs.html&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;8-1&quot;&gt;벤자민 페라리&lt;/a&gt;가 쓴 다음의 아주 멋진 엘리스 기능을 사용할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그의 블로그에서 발견했는데 여기서 재현해도 괜찮길 바랍니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;(defun bf-pretty-print-xml-region (begin end)
  &quot;Pretty format XML markup in region. You need to have nxml-mode
http://www.emacswiki.org/cgi-bin/wiki/NxmlMode installed to do
this.  The function inserts linebreaks to separate tags that have
nothing but whitespace between them.  It then indents the markup
by using nxml's indentation rules.&quot;
  (interactive &quot;r&quot;)
  (save-excursion
    (nxml-mode)
    (goto-char begin)
    (while (search-forward-regexp &quot;\&amp;gt;[ \\t]*\&amp;lt;&quot; nil t) 
      (backward-char) (insert &quot;\n&quot;) (setq end (1+ end)))
    (indent-region begin end))
  (message &quot;Ah, much better!&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;이것은 Tidy와 같은 외부 도구에 의존하지 않습니다.&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;Emacs는 M-|로 임의의 명령을 실행할 수 있습니다. xmlint가 설치되어 있는 경우:&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;&quot;M-| xmlint --format -&quot;은 선택한 영역을 포맷합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&quot;C-u M-| xmlint --format -&quot;는 동일한 작업을 수행하여 지역을 출력으로 대체합니다.&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;XML이나 HTML을 포맷하고 들여쓰기를 원할 때 편집할 때 nXML &lt;a href=&quot;http://www.thaiopensource.com/nxml-mode/&quot; rel=&quot;noreferrer&quot; papago-id=&quot;13-1&quot;&gt;모드를 사용&lt;/a&gt;하고 &lt;a href=&quot;http://tidy.sourceforge.net/&quot; rel=&quot;noreferrer&quot; papago-id=&quot;13-3&quot;&gt;Tidy&lt;/a&gt;를 사용합니다. &lt;a href=&quot;http://www.emacswiki.org/emacs/tidy.el&quot; papago-id=&quot;13-5&quot; rel=&quot;noreferrer&quot;&gt;Tidy&lt;/a&gt;에 대한 &lt;a href=&quot;http://www.emacswiki.org/emacs/tidy.el&quot; papago-id=&quot;13-5&quot; rel=&quot;noreferrer&quot;&gt;Emacs 인터페이스&lt;/a&gt;도 있습니다&lt;a href=&quot;http://www.emacswiki.org/emacs/tidy.el&quot; papago-id=&quot;13-5&quot; rel=&quot;noreferrer&quot;&gt;.&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;라인브레이크 소개 후 예쁜 프린팅을 위해&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;M-x sgml-mode
M-x sgml-pretty-print
&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;(defun nxml-pretty-format ()
    (interactive)
    (save-excursion
        (shell-command-on-region (point-min) (point-max) &quot;xmllint --format -&quot; (buffer-name) t)
        (nxml-mode)
        (indent-region begin end)))
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;16&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;빠르면서도 수월한&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;대단히 고맙습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;벤저민 페라리 버전에 대한 몇 가지 수정사항은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그&lt;/font&gt;&lt;/font&gt;&lt;code&gt;search-forward-regexp&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;끝을 지정하지 않았기 때문에 영역 시작부터 버퍼 끝까지(영역 끝의 instead) 작업을 수행합니다.&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li&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;end&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;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그 사이에 단절을 삽입할 것입니다&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&amp;lt;tag&amp;gt;&amp;lt;/tag&amp;gt;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;, 그 값을 수정합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;네, 기술적으로는 여기에 있는 모든 것의 값을 수정하고 있지만, 시작/끝이 비어 있으면 훨씬 더 중요할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이제는 이를 피하기 위해 약간 더 엄격한 두 개의 개별 검색을 사용합니다.&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;여전히 &quot;외부 정리정돈에 의존하지 않음&quot; 등이 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;하지만, 그것은 필요합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;cl&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;incf&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;10&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;거시적인&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; pretty print xml region
(defun pretty-print-xml-region (begin end)
  &quot;Pretty format XML markup in region. You need to have nxml-mode
http://www.emacswiki.org/cgi-bin/wiki/NxmlMode installed to do
this.  The function inserts linebreaks to separate tags that have
nothing but whitespace between them.  It then indents the markup
by using nxml's indentation rules.&quot;
  (interactive &quot;r&quot;)
  (save-excursion
    (nxml-mode)
    (goto-char begin)
    ;; split &amp;lt;foo&amp;gt;&amp;lt;foo&amp;gt; or &amp;lt;/foo&amp;gt;&amp;lt;foo&amp;gt;, but not &amp;lt;foo&amp;gt;&amp;lt;/foo&amp;gt;
    (while (search-forward-regexp &quot;&amp;gt;[ \t]*&amp;lt;[^/]&quot; end t)
      (backward-char 2) (insert &quot;\n&quot;) (incf end))
    ;; split &amp;lt;foo/&amp;gt;&amp;lt;/foo&amp;gt; and &amp;lt;/foo&amp;gt;&amp;lt;/foo&amp;gt;
    (goto-char begin)
    (while (search-forward-regexp &quot;&amp;lt;.*?/.*?&amp;gt;[ \t]*&amp;lt;&quot; end t)
      (backward-char) (insert &quot;\n&quot;) (incf end))
    (indent-region begin end nil)
    (normal-mode))
  (message &quot;All indented!&quot;))
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;27&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;한 가지 방법은 아래 형식의 것이 있으면 하는 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;abc&amp;gt;     &amp;lt;abc&amp;gt;&amp;lt;abc&amp;gt;   &amp;lt;abc&amp;gt;&amp;lt;/abc&amp;gt; &amp;lt;/abc&amp;gt;&amp;lt;/abc&amp;gt;       &amp;lt;/abc&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;28&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Emacs에서 시도해 봅니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;M-x nxml-mode
M-x replace-regexp RET  &amp;gt; *&amp;lt; RET &amp;gt;C-q C-j&amp;lt; RET 
C-M-\ to indent
&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;위의 xml 예제를 아래로 들여씁니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;abc&amp;gt;
  &amp;lt;abc&amp;gt;
    &amp;lt;abc&amp;gt;
      &amp;lt;abc&amp;gt;
      &amp;lt;/abc&amp;gt;
    &amp;lt;/abc&amp;gt;
  &amp;lt;/abc&amp;gt;
&amp;lt;/abc&amp;gt;
&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;VIM에서는 다음과 같이 작업할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;:set ft=xml
:%s/&amp;gt;\s*&amp;lt;/&amp;gt;\r&amp;lt;/g
ggVG=
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;31&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;도움이 되길 바랍니다.&lt;/font&gt;&lt;/p&gt;&lt;p&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;2017년 현재 emacs는 이미 기본적으로 이 기능과 함께 제공되지만, 당신은 이 작은 기능을 당신의 것에 써야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;~/.emacs.d/init.el&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;12&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;:&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;(require 'sgml-mode)

(defun reformat-xml ()
  (interactive)
  (save-excursion
    (sgml-pretty-print (point-min) (point-max))
    (indent-region (point-min) (point-max))))
&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;M-x reformat-xml&lt;/code&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;출처 : https://davidcapello.com/blog/emacs/reformat-xml-on-emacs/&lt;/font&gt;&lt;/p&gt;&lt;ol&gt; 
 &lt;li papago-id=&quot;36&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Emacs nxml-mode는 제시된 형식에서 작동할 수 있지만 행을 분할해야 합니다.&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;font class=&quot;papago-parent&quot;&gt;이 스타일시트를 더 긴 파일에 대해 실행하면(IMHO가 선을 정확하게 들여놓는 이상적인 색슨) 예쁜 인쇄를 얻을 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;공백을 유지하려는 요소의 경우 'ElementName 프로그램 목록'에서와 같이 'Program listing'과 함께 해당 요소의 이름을 추가합니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p papago-id=&quot;38&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;HTH&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt; &lt;/p&gt; 
&lt;p&gt; &lt;/p&gt; 
&lt;p&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;a href=&quot;https://stackoverflow.com/a/5198243/48082&quot; papago-id=&quot;39-1&quot;&gt;Jason Viers의 버전&lt;/a&gt;을 가져다가 논리를 추가하여 xmlns 선언을 그들 자신의 라인에 넣었습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;공백이 없는 xmlns= 및 xmlns가 있다고 가정합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;(defun cheeso-pretty-print-xml-region (begin end)
  &quot;Pretty format XML markup in region. You need to have nxml-mode
http://www.emacswiki.org/cgi-bin/wiki/NxmlMode installed to do
this.  The function inserts linebreaks to separate tags that have
nothing but whitespace between them.  It then indents the markup
by using nxml's indentation rules.&quot;
  (interactive &quot;r&quot;)
  (save-excursion
    (nxml-mode)
    ;; split &amp;lt;foo&amp;gt;&amp;lt;bar&amp;gt; or &amp;lt;/foo&amp;gt;&amp;lt;bar&amp;gt;, but not &amp;lt;foo&amp;gt;&amp;lt;/foo&amp;gt;
    (goto-char begin)
    (while (search-forward-regexp &quot;&amp;gt;[ \t]*&amp;lt;[^/]&quot; end t)
      (backward-char 2) (insert &quot;\n&quot;) (incf end))
    ;; split &amp;lt;foo/&amp;gt;&amp;lt;/foo&amp;gt; and &amp;lt;/foo&amp;gt;&amp;lt;/foo&amp;gt;
    (goto-char begin)
    (while (search-forward-regexp &quot;&amp;lt;.*?/.*?&amp;gt;[ \t]*&amp;lt;&quot; end t)
      (backward-char) (insert &quot;\n&quot;) (incf end))
    ;; put xml namespace decls on newline
    (goto-char begin)
    (while (search-forward-regexp &quot;\\(&amp;lt;\\([a-zA-Z][-:A-Za-z0-9]*\\)\\|['\&quot;]\\) \\(xmlns[=:]\\)&quot; end t)
      (goto-char (match-end 0))
      (backward-char 6) (insert &quot;\n&quot;) (incf end))
    (indent-region begin end nil)
    (normal-mode))
  (message &quot;All indented!&quot;))
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;40&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;깔끔해 보이네요.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;꼭 봐야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그것이 제공하는 모든 기능이 정말로 필요하다면 그것을 사용할 것입니다.&lt;/font&gt;&lt;/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;font class=&quot;papago-parent&quot;&gt;글을 올린 후 검색을 &lt;a href=&quot;http://blog.bookworm.at/2007/03/pretty-print-xml-with-emacs.html&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;41-1&quot;&gt;시작해보니 elisp&lt;/a&gt; 기능이 있는 사이트가 꽤 잘 되어있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;또한 작가는 Tidy를 사용할 것을 제안합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;42&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;답변 감사합니다 Marcel&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strike papago-id=&quot;42-1&quot;&gt;
&lt;/strike&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strike papago-id=&quot;42-1&quot;&gt;  (점이 부족해서 당신을 업그레이드 할 수 없어 안타깝습니다.&lt;/strike&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strike papago-id=&quot;42-1&quot;&gt; &lt;/strike&gt;.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;43&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;
&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strike papago-id=&quot;43-1&quot;&gt;
&lt;/strike&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strike papago-id=&quot;43-1&quot;&gt;  조만간 블로그에 올릴 예정입니다.&lt;/strike&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strike papago-id=&quot;43-1&quot;&gt;
&lt;/strike&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strike papago-id=&quot;43-1&quot;&gt; &lt;/strike&gt; 여기 그것에 &lt;a href=&quot;http://codelog.blogial.com/2008/08/15/pretty-print-xml-files-in-emacs/&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;43-3&quot;&gt;대한 게시물&lt;/a&gt;(마르셀 사이트 링크 포함)이 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;44&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;44-3&quot;&gt;&lt;a href=&quot;http://www.emacswiki.org/emacs/xml-parse.el&quot; rel=&quot;nofollow&quot; papago-id=&quot;44-3-0&quot;&gt;xml-parse.el&lt;/a&gt;&lt;/strong&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;14&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://emacspeak.sourceforge.net/&quot; rel=&quot;nofollow&quot; papago-id=&quot;14-1&quot;&gt;이맥스피크&lt;/a&gt;에 파일이 통합된 것이 흥미롭습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;제가 이맥스피크를 일상적으로 사용할 때, 저는 생각했습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;xml-reformat-tags&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;내장된 Emacs입니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;어느 날 분실하여 인터넷 검색을 해야 했고, 위에 언급한 위키 페이지에 들어갔습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;47&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;xml-parse를 시작하기 위해 제 코드도 첨부합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것이 이맥스 코드 중 가장 좋은 것인지는 잘 모르겠지만, 저에게는 잘 맞는 것 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;(if (file-exists-p &quot;~/.emacs.d/packages/xml-parse.el&quot;)
  (let ((load-path load-path))
    (add-to-list 'load-path &quot;~/.emacs.d/packages&quot;)
    (require 'xml-parse))
)
&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;a href=&quot;http://spacemacs.org&quot; rel=&quot;nofollow&quot; papago-id=&quot;48-1&quot;&gt;spacemac&lt;/a&gt;을 사용하는 경우 'spacemacs/indent-region-or-buffer' 명령만 사용하면 됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;M-x spacemacs/indent-region-or-buffer
&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;font class=&quot;papago-parent&quot;&gt;내부 예쁜 인쇄물은 항상 끝 태그를 값 뒤에 새 줄로 배치하여 태그 값에 원하지 않는 CR을 삽입합니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;50&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/12492/pretty-printing-xml-files-on-emacs&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>XML</category>
      <author>lovecheck</author>
      <guid isPermaLink="true">https://lovecheck.tistory.com/956</guid>
      <comments>https://lovecheck.tistory.com/956#entry956comment</comments>
      <pubDate>Tue, 24 Oct 2023 21:25:43 +0900</pubDate>
    </item>
    <item>
      <title>jquery에서 이 날짜에서 1주일을 빼려면 어떻게 해야 합니까?</title>
      <link>https://lovecheck.tistory.com/955</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;jquery에서 이 날짜에서 1주일을 빼려면 어떻게 해야 합니까?&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것이 내 코드입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var myDate = new Date();
todaysDate = ((myDate.getDate()) + '/' + (myDate.getMonth()) + '/' + (myDate.getFullYear()));
$('#txtEndDate').val(todaysDate);
&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;txtEndDate의 값 = 오늘 날짜 - 1주일이 필요합니다.&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;setDate&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;. 새 월/년 등으로 전환할 경우 자동으로 수정됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var oneWeekAgo = new Date();
oneWeekAgo.setDate(oneWeekAgo.getDate() - 7);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그런 다음 원하는 대로 날짜를 문자열로 지정합니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;나는 다음과 같은 것을 할 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var myDate = new Date();
var newDate = new Date(myDate.getTime() - (60*60*24*7*1000));
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;var now = new Date();
now.setDate(now.getDate() - 7); // add -7 days to your date variable 
alert(now); 
&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;Date.js를 확인합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;정말 깔끔하네요!&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;http://www.datejs.com/&quot; rel=&quot;nofollow&quot; papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;http://www.datejs.com/&lt;/font&gt;&lt;/a&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;다음은 Date.js를 사용하는 몇 가지 방법입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;// today - 7 days
// toString() is just to print it to the console all pretty

Date.parse(&quot;t - 7 d&quot;).toString(&quot;MM-dd-yyyy&quot;);     // outputs &quot;12-06-2011&quot;
Date.today().addDays(-7).toString(&quot;MM-dd-yyyy&quot;);  // outputs &quot;12-06-2011&quot;
Date.today().addWeeks(-1).toString(&quot;MM-dd-yyyy&quot;); // outputs &quot;12-06-2011&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;관련 없는 참고 사항으로, Moment.js도 확인해보세요...&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;두 도서관이 서로 칭찬해주는 것 같아요 :)&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;http://momentjs.com/&quot; rel=&quot;nofollow&quot; papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;http://momentjs.com/&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;p papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/8489500/how-do-i-subtract-one-week-from-this-date-in-jquery&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>JQuery</category>
      <author>lovecheck</author>
      <guid isPermaLink="true">https://lovecheck.tistory.com/955</guid>
      <comments>https://lovecheck.tistory.com/955#entry955comment</comments>
      <pubDate>Tue, 24 Oct 2023 21:25:34 +0900</pubDate>
    </item>
    <item>
      <title>AngularJS 및 그 이상의 웹소켓</title>
      <link>https://lovecheck.tistory.com/954</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;a href=&quot;https://stackoverflow.com/questions/17798367/angularjs-and-websockets&quot; papago-id=&quot;1-1&quot;&gt;방금&lt;/a&gt; 이 게시물을 읽었고, 차이점이 무엇인지 이해합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;하지만 내 머릿속에는 아직도 의문이 들어요.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;동일한 앱/웹 사이트에서 사용할 수 있습니까?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;AngularJs가 콘텐츠를 가져와 REST api에 연결하고 내 페이지를 업데이트하기를 원한다고 가정합니다.&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;Angular가 그것을 지지합니까?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;아니면 Socket.io 같은 것을 사용하여 이벤트를 시작해야 합니까?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;둘 다 쓰는 게 말이 됩니까?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;만약 누군가가 저를 도와줄 수 있거나, 둘 다 함께 사용하는 목적이 있다면 그에 대한 좋은 책을 알려줄 수 있다면요.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;제가 충분히 이해했으면 좋겠네요. 어떤 도움이든 감사합니다.&lt;/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;자바스크립트는 WebSocket을 지원하기 때문에 추가적인 클라이언트 사이드 프레임워크가 필요 없습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 &lt;a href=&quot;https://github.com/vtortola/WebSocketListener/wiki/WebSocketListener-Terminal-Server&quot; papago-id=&quot;4-3&quot; rel=&quot;noreferrer&quot;&gt;웹소켓 기반의 Angular&lt;/a&gt;에서 선언된 &lt;a href=&quot;https://github.com/vtortola/WebSocketListener/blob/master/samples/TerminalServer/TerminalServer.Web/content/scripts/app.js&quot; rel=&quot;noreferrer&quot; papago-id=&quot;4-1&quot;&gt;$연결&lt;/a&gt; 서비스를 살펴보시기 바랍니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://github.com/vtortola/WebSocketListener/wiki/WebSocketListener-Terminal-Server&quot; papago-id=&quot;4-3&quot; rel=&quot;noreferrer&quot;&gt;JS application&lt;/a&gt;.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;기본적으로 메시지를 들을 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;   $connection.listen(function (msg) { return msg.type == &quot;CreatedTerminalEvent&quot;; }, 
        function (msg) {
            addTerminal(msg);
            $scope.$$phase || $scope.$apply();
   });
&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;    $connection.listenOnce(function (data) {
        return data.correlationId &amp;amp;&amp;amp; data.correlationId == crrId;
    }).then(function (data) {
        $rootScope.addAlert({ msg: &quot;Console &quot; + data.terminalType + &quot; created&quot;, type: &quot;success&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;메시지 보내기:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;    $connection.send({
        type: &quot;TerminalInputRequest&quot;,
        input: cmd,
        terminalId: $scope.terminalId,
        correlationId: $connection.nextCorrelationId()
    });
&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;일반적으로 WebSocket 연결은 양방향이며 &lt;a href=&quot;http://caniuse.com/#feat=websockets&quot; rel=&quot;noreferrer&quot; papago-id=&quot;8-1&quot;&gt;지원이 좋기&lt;/a&gt; 때문에 요청/응답 모델의 서버에서 데이터를 가져오는 데 사용할 수도 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;두 가지 모델을 사용할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;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-0&quot;&gt;게시자/구독자&lt;/strong&gt;:&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;클라이언트가 일부 항목에 대한 관심을 선언하고 해당 항목의 메시지 처리기를 설정한 후 서버가 적합하다고 판단될 때마다 메시지를 게시(또는 푸시)하는 경우.&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p papago-id=&quot;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;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;클라이언트가 요청과 함께 메시지를 보내는 위치&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;ID(또는 correlationId), 해당 requestId에 대한 단일 응답을 수신합니다.&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그래도 원하는 경우 두 가지를 모두 사용할 수 있으며 데이터를 가져올 때 REST를 사용하고 업데이트할 때는 WebSocket을 사용할 수 있습니다.&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;서버 측면에서는 웹소켓 지원 백엔드를 사용하려면 Socket.io 이나 다른 서버 측면 프레임워크를 사용해야 할 수도 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;13&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;링크된 게시물의 &lt;a href=&quot;https://stackoverflow.com/a/17798579/1387428&quot; papago-id=&quot;13-1&quot;&gt;답변&lt;/a&gt;에 나와 있듯이, Angular는 현재 웹소켓에 대한 내장된 지원 기능이 없습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;따라서 Websockets API를 직접 사용하거나 Socket.io 과 같은 추가 라이브러리를 사용해야 합니다.&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;그러나 단일 Angular 응용 프로그램에서 REST api와 Websockets를 모두 사용해야 하는지에 대한 질문에 답하려면, 응용 프로그램의 여러 부분에 포함된 특정 기능에 대해 $http 또는 BreezeJS와 같은 다른 데이터 계층 라이브러리를 사용하여 REST api와 상호 작용하는 표준 XmlHttpRequest 요청을 둘 다 가질 수 없는 이유가 없습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;ion과 Wesockets를 다른 부분(예: 실시간 채팅)에 사용합니다.&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;font class=&quot;papago-parent&quot;&gt;일반적인 해결책은 애플리케이션 기능을 처리하고 페이지를 업데이트하기 위해 하나 이상의 컨트롤러를 만든 다음 각 데이터 엔드포인트(즉, REST api 및 실시간 채팅 서버)의 데이터 관리를 캡슐화하는 별도의 서비스 또는 공장을 만든 후 컨트롤러에 주입하는 것입니다.&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;Angular 애플리케이션을 구축하는 방법과 데이터 서비스가 어디에 적합한지에 대해 안내해 줄 자료를 찾고 있다면 John Papa의 &lt;a href=&quot;https://github.com/johnpapa/angularjs-styleguide&quot; papago-id=&quot;16-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;Angular&lt;/a&gt;를 확인해 보는 것을 추천합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://github.com/johnpapa/angularjs-styleguide#data-services&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;16-3&quot;&gt;데이터 서비스&lt;/a&gt;에 대한 섹션을 포함하는 &lt;a href=&quot;https://github.com/johnpapa/angularjs-styleguide&quot; papago-id=&quot;16-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;JS&lt;/a&gt; 스타일 &lt;a href=&quot;https://github.com/johnpapa/angularjs-styleguide&quot; papago-id=&quot;16-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;가이드&lt;/a&gt;.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;공장과 서비스에 대한 자세한 정보는 &lt;a href=&quot;https://stackoverflow.com/q/18939709/1387428&quot; papago-id=&quot;17-1&quot;&gt;Angular&lt;/a&gt;에서 확인할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/q/18939709/1387428&quot; papago-id=&quot;17-1&quot;&gt;JS : 공장이 아닌 서비스를 이용할 때&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;URL : https://stackoverflow.com/questions/26299403/angularjs-and-websockets-beyond&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>AngularJS</category>
      <author>lovecheck</author>
      <guid isPermaLink="true">https://lovecheck.tistory.com/954</guid>
      <comments>https://lovecheck.tistory.com/954#entry954comment</comments>
      <pubDate>Tue, 24 Oct 2023 21:25:28 +0900</pubDate>
    </item>
    <item>
      <title>Python에서 PyObject란 무엇입니까?</title>
      <link>https://lovecheck.tistory.com/953</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Python에서 PyObject란 무엇입니까?&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;쇼트 버전&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;0&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 최근에 함수에 대한 반환 유형이 다음과 같이 지정된 파이썬 코드를 발견했습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;PyObject&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;a href=&quot;https://srinikom.github.io/pyside-docs/PySide/QtCore/QSize.html#PySide.QtCore.PySide.QtCore.QSize.__reduce__&quot; papago-id=&quot;3-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;문서&lt;/a&gt;에.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;A란 무엇입니까?&lt;/font&gt;&lt;/font&gt;&lt;code&gt;PyObject&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;?&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;상세버전&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 C/C++ 프로그래머는 아니지만 우연히 만났을 때&lt;/font&gt;&lt;/font&gt;&lt;code&gt;PyObject&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;PyObject&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;는 Python/C API를 사용하여 정의된 Python 개체입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;구체적으로 &lt;a href=&quot;https://docs.python.org/3/c-api/structures.html#c.PyObject&quot; papago-id=&quot;8-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;API 문서&lt;/a&gt;에서는 다음과 같이 PyObject를 정의합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;모든 개체 유형은 이 유형의 확장입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 Python이 개체에 대한 포인터를 개체로 취급하는 데 필요한 정보를 포함하는 유형입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;일반적인 &quot;릴리스&quot; 빌드에서는 개체의 참조 개수와 해당 유형의 개체에 대한 포인터만 포함합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;PyObject_의 확장으로 정의된 필드에 해당합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;헤드 매크로.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;솔직히, 저는 이것을 완전히 이해하지 못합니다, 혹은 이것이 제 기본적인 질문에 답을 주는지는 모르지만, 단지 그것을 생각하는 것이 명백하게 잘못되었다고 생각하지는 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;PyObject&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Python 객체로서, 완전 정지.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;다른 한편으로는, 아마도 기술적으로 볼 때&lt;/font&gt;&lt;/font&gt;&lt;code&gt;PyObject&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Python/C API를 사용하여 표준 Python에 대한 확장으로 형식을 만들어야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를 들어, 는 정수 a입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;PyObject&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;strong papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;잠재적으로 관련이 있는 링크&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://numpy.org/doc/stable/reference/c-api/types-and-structures.html&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;https://numpy.org/doc/stable/reference/c-api/types-and-structures.html&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://numpy.org/doc/stable/user/c-info.beyond-basics.html#adding-the-new-data-type&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;16&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;https://numpy.org/doc/stable/user/c-info.beyond-basics.html#adding-the-new-data-type&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&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;PyObject&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;C. 목록, 사전, 소켓, 파일, 정수, 문자열, 함수, 클래스 등이 포함됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;Python으로 만질 수 있다면, 그것은.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;PyObject&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;12&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;주식회사.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;splited&quot;&gt;A &lt;/font&gt;&lt;code&gt;PyObject&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;13&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;C 레벨의 파이썬 객체일 뿐입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고 파이썬의 정수는 물체이기 때문에, 그것들 또한&lt;/font&gt;&lt;/font&gt;&lt;code&gt;PyObject&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;14&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;s. Python으로 작성되었든 C로 작성되었든 상관없습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;PyObject&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;15&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;상관없이 C 레벨로&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;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/27683764/what-is-a-pyobject-in-python&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>C</category>
      <author>lovecheck</author>
      <guid isPermaLink="true">https://lovecheck.tistory.com/953</guid>
      <comments>https://lovecheck.tistory.com/953#entry953comment</comments>
      <pubDate>Tue, 24 Oct 2023 21:25:21 +0900</pubDate>
    </item>
    <item>
      <title>ADODB 및 Oracle로 &amp;quot;xas(...)&amp;quot;를 수행할 수 없는 이유는 무엇입니까?</title>
      <link>https://lovecheck.tistory.com/952</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;ADODB 및 Oracle로 &quot;xas(...)&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;저는 ADODB와 Oracle을 &lt;em papago-id=&quot;1-1&quot;&gt;통해 with&lt;/em&gt; 절이 있는 SQL 쿼리를 실행하지 못합니다.&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;Dim cn As ADODB.connection
Set cn = ....

Dim rs As ADODB.recordSet
Set rs = New ADODB.Recordset

rs.Open &quot;select 'foo' x from dual&quot;, cn


Do While Not rs.eof
   ...
   rs.MoveNext
Loop
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 다음이 작동하지 않습니다. &lt;strong papago-id=&quot;3-1&quot;&gt;Run-Time 오류 3704&lt;/strong&gt;가 발생합니다.&lt;strong papago-id=&quot;3-1&quot;&gt; 개체가 닫혔을 때는 작업이 허용&lt;/strong&gt;되지 않습니다&lt;strong papago-id=&quot;3-1&quot;&gt;.&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Dim cn As ADODB.connection
Set cn = ....

Dim rs As ADODB.recordSet
Set rs = New ADODB.Recordset

rs.Open &quot;with w as (select 'foo' x from dual) select x from w&quot;, cn

Do While Not rs.eof
   ...
   rs.MoveNext
Loop
&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;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;제가 보기에 ADODB는 쿼리를 오라클 인스턴스로 전달하기 전에 구문 분석을 수행하고 with &lt;em papago-id=&quot;5-1&quot;&gt;절&lt;/em&gt;을 이해하지 못하는 것 같습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;어쨌든, 이에 대한 어떤 도움이라도 대단히 감사드립니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;좋아요, 정말로 ADODB는 쿼리문이 실제로 시작되기를 기대하는 것 같습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;select&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;. 따라서 문제에 대한 해결책은 문장을 a에 포함하는 것일 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;select * from ( .... )&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;Dim sql As String
sql = &quot;with w as (select 'foo' x from dual) select x from w&quot;

' enclose the statement:
sql = &quot;select * from (&quot; &amp;amp; sql &amp;amp; &quot;)&quot;

rs.Open sql, cn
&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;WITH 키워드 앞에 &quot;;&quot;를 추가하면 문제가 해결됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Dim sql As String sql = &quot;;with(듀얼에서 'foo' x 선택) w에서 x 선택&quot;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;rs.Open sql, cn&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;13&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/2316886/why-cant-i-do-a-with-x-as-with-adodb-and-oracle&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>oracle</category>
      <author>lovecheck</author>
      <guid isPermaLink="true">https://lovecheck.tistory.com/952</guid>
      <comments>https://lovecheck.tistory.com/952#entry952comment</comments>
      <pubDate>Tue, 24 Oct 2023 21:25:15 +0900</pubDate>
    </item>
    <item>
      <title>Angular JS에서 모든 $http 요청이 완료될 때까지 기다립니다.</title>
      <link>https://lovecheck.tistory.com/951</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Angular JS에서 모든 $http 요청이 완료될 때까지 기다립니다.&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;0&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;나는 다른 숫자의 페이지를 만들 수 있는 것보다 더 많은 페이지를 가지고 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;$http&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 class=&quot;papago-parent&quot;&gt;이번 프로젝트는 jQuery를 사용하고 싶지 않으니 답변에 jQuery를 포함하지 말아주세요.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;지금은 각각의 요청이 완료되면 스코프로 데이터가 전송되는데, 제가 원하는 것은 아닙니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;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;for (var a = 0; a &amp;lt; subs.length; a++) {
  $http.get(url).success(function (data) {
    for (var i = 0; i &amp;lt; data.children.length; i++) {
      rData[data.children.name] = data.children.age;
    }
  });
}
&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;$q.all()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;, 하지만 Angular에 대한 문서에는 언급이 되어있지 않고 무엇을 의미하는지 잘 모르겠습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$q.all().then(function () {
  $scope.rData = rData;
});
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;도와주셔서 감사합니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;code&gt;$http&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;call은 항상 사용할 수 있는 약속을 반환합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;$q.all&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;pre&gt;&lt;code&gt;var one = $http.get(...);
var two = $http.get(...);

$q.all([one, two]).then(...);
&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://code.angularjs.org/1.1.5/docs/api/ng.$q&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;strong papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;all(promises)&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
 &lt;p papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;약속 - 약속의 배열 또는 해시입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/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 class=&quot;papago-parent&quot;&gt;이렇게 하면 사용할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;$q.all(…)&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;위의 예와 동일한 방법으로 배열합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var arr = [];

for (var a = 0; a &amp;lt; subs.length; ++a) {
    arr.push($http.get(url));
}

$q.all(arr).then(function (ret) {
    // ret[0] contains the response of the first call
    // ret[1] contains the second response
    // etc.
});
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/23931846/wait-for-all-http-requests-to-complete-in-angular-js&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>AngularJS</category>
      <author>lovecheck</author>
      <guid isPermaLink="true">https://lovecheck.tistory.com/951</guid>
      <comments>https://lovecheck.tistory.com/951#entry951comment</comments>
      <pubDate>Tue, 24 Oct 2023 21:25:08 +0900</pubDate>
    </item>
    <item>
      <title>javascript/jquery로 선행 0 제거/잘림</title>
      <link>https://lovecheck.tistory.com/950</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;javascript/jquery로 선행 0 제거/잘림&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;javascript,jquery에 의해 숫자(아무 문자열)에서 선행 0을 제거하거나 잘라내기 위한 해결책을 제안합니다.&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;문자열 맨 앞에 0과 일치하는 정규식을 사용할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;s = s.replace(/^0+/, '');
&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;Number() 함수를 사용합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var str = &quot;00001&quot;;
str = Number(str).toString();
&lt;/code&gt;&lt;/pre&gt; 
&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt; &quot;1&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;아니면 내 끈에 1을 곱할 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var str = &quot;00000000002346301625363&quot;;
str = (str * 1).toString();
&lt;/code&gt;&lt;/pre&gt; 
&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt; &quot;2346301625363&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;조금 늦을지도 모르지만, 2센트를 추가하고 싶습니다.&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;문자열이 항상 숫자와 가능한 선두 0을 나타내는 경우 '+' 연산자를 사용하여 문자열을 숫자에 캐스팅할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;예.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;x= &quot;00005&quot;;
alert(typeof x); //&quot;string&quot;
alert(x);// &quot;00005&quot;

x = +x ; //or x= +&quot;00005&quot;; //do NOT confuse with x+=x, which will only concatenate the value
alert(typeof x); //number , voila!
alert(x); // 5 (as number)
&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;문자열이 숫자를 나타내지 않고 0을 제거하기만 하면 되는 경우 다른 솔루션을 사용하지만 숫자로만 필요한 경우 이 방법이 가장 짧은 방법입니다.&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;FYI와 반대로, 다음과 같이 빈 문자열을 연결하면 숫자가 문자열 역할을 하도록 강제할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;x = 5;
alert(typeof x); //number
x = x+&quot;&quot;;
alert(typeof x); //string
&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;당신이 &quot;아무 문자열&quot;이라고 했으니, 당신도 처리하고 싶은 문자열일 거라고 생각합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&quot;00012  34 0000432    0035&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;따라서 regex가 선택할 수 있는 방법입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var trimmed = s.replace(/\b0+/g, &quot;&quot;);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;13&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고 이를 통해 &quot;000000&quot; 값의 손실을 방지할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var trimmed = s.replace(/\b(0(?!\b))+/g, &quot;&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;http://jsfiddle.net/SWbDe/&quot; papago-id=&quot;14-1&quot; rel=&quot;noreferrer&quot;&gt;여기&lt;/a&gt;에서 작동 &lt;a href=&quot;http://jsfiddle.net/SWbDe/&quot; papago-id=&quot;14-1&quot; rel=&quot;noreferrer&quot;&gt;예&lt;/a&gt;를 볼 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;parseInt(value) or parseFloat(value)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이거 잘 될 겁니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;16&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;자바스크립트에서 선행 0(숫자 또는 문자열)을 잘라내기 위한 솔루션을 받았습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;script language=&quot;JavaScript&quot; type=&quot;text/javascript&quot;&amp;gt;
&amp;lt;!--
function trimNumber(s) {
  while (s.substr(0,1) == '0' &amp;amp;&amp;amp; s.length&amp;gt;1) { s = s.substr(1,9999); }
  return s;
}

var s1 = '00123';
var s2 = '000assa';
var s3 = 'assa34300';
var s4 = 'ssa';
var s5 = '121212000';

alert(s1 + '=' + trimNumber(s1));
alert(s2 + '=' + trimNumber(s2));
alert(s3 + '=' + trimNumber(s3));
alert(s4 + '=' + trimNumber(s4));
alert(s5 + '=' + trimNumber(s5));
// end hiding contents --&amp;gt;
&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음과 같이 1을 곱해 보십시오.&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&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;&quot;00123&quot; * 1; // 번호 불러오기&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;19&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&quot;00123&quot; * 1 + &quot;&quot;; // 문자열로 가져오기&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt;&lt;p papago-id=&quot;20&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;20-0&quot;&gt;1.&lt;/strong&gt;parseInt()를 사용하는 것이 가장 명확합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;parseInt(number, 10)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;21&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;21-0&quot;&gt;2.&lt;/strong&gt;다른 방법은 + 단항 연산자를 사용하는 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;+number
&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;strong papago-id=&quot;22-0&quot;&gt;3.&lt;/strong&gt;다음과 같이 정규 표현 경로를 선택할 수도 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;number.replace(/^0+/, '')
&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;   function ltrim(str, chars) {
        chars = chars || &quot;\\s&quot;;
        return str.replace(new RegExp(&quot;^[&quot; + chars + &quot;]+&quot;, &quot;g&quot;), &quot;&quot;);
    }

    var str =ltrim(&quot;01545878&quot;,&quot;0&quot;);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;24&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://www.webtoolkit.info/javascript-trim.html&quot; rel=&quot;nofollow&quot; papago-id=&quot;24-1&quot;&gt;더보기&lt;/a&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;parseInt 함수의 &quot;radix&quot; 매개 변수를 사용해야 합니다. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/parseInt?redirectlocale=en-US&amp;amp;redirectslug=JavaScript%2FReference%2FGlobal_Objects%2FparseInt&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;parseInt('015', 10) =&amp;gt; 15&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;27&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;만약 당신이 그것을 사용하지 않는다면, 어떤 자바스크립트 엔진은 그것을 팔각 파싱으로 사용할지도 모릅니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;Int('015') =&amp;gt; 0&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;28&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;번호가 사용 중인 경우&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&quot;&quot; + parseInt(str)
&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;숫자가 float일 경우 사용&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&quot;&quot; + parseFloat(str)
&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;const 번호 = '0000007457841'; console.log (+번호) //7457841;&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;OR number.replace(/^0+/, '')&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;32&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/a/8276474/689893&quot; papago-id=&quot;32-1&quot;&gt;Guffa&lt;/a&gt;의 regex 솔루션이지만 적어도 하나의 캐릭터를 남깁니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&quot;123&quot;.replace(/^0*(.+)/, '$1'); // 123
&quot;012&quot;.replace(/^0*(.+)/, '$1'); // 12
&quot;000&quot;.replace(/^0*(.+)/, '$1'); // 0
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;33&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&quot;Math.abs&quot; 사용&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;예: Math.abs(003) = 3;&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;console.log(Math.abs(003))&lt;/code&gt;&lt;/pre&gt; 
 &lt;/div&gt; 
&lt;/div&gt; 
&lt;p&gt;&lt;/p&gt;&lt;p papago-id=&quot;35&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;문자열의 모든 자리 수열에 대해 선행 0을 모두 제거하고 자리 수 값이 0이면 0을 반환하고 싶었습니다.&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;str = str.replace(/(0{1,}\d+)/, &quot;removeLeadingZeros('$1')&quot;)

function removeLeadingZeros(string) {
    if (string.length == 1) return string
    if (string == 0) return 0
    string = string.replace(/^0{1,}/, '');
    return string
}
&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;/p&gt; 
&lt;pre&gt;&lt;code&gt;function trimLeadingZerosSubstr(str) {
    var xLastChr = str.length - 1, xChrIdx = 0;
    while (str[xChrIdx] === &quot;0&quot; &amp;amp;&amp;amp; xChrIdx &amp;lt; xLastChr) {
        xChrIdx++;
    }
    return xChrIdx &amp;gt; 0 ? str.substr(xChrIdx) : str;
}
&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;문자열이 짧으면 regex(&lt;a href=&quot;http://jsperf.com/trim-leading-zeros&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;38-1&quot;&gt;jsperf&lt;/a&gt;)보다 빠릅니다.&lt;/font&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;const input = '0093';
const match = input.match(/^(0+)(\d+)$/);
const result = match &amp;amp;&amp;amp; match[2] || input;
&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;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/8276451/remove-truncate-leading-zeros-by-javascript-jquery&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>JQuery</category>
      <author>lovecheck</author>
      <guid isPermaLink="true">https://lovecheck.tistory.com/950</guid>
      <comments>https://lovecheck.tistory.com/950#entry950comment</comments>
      <pubDate>Tue, 24 Oct 2023 21:25:01 +0900</pubDate>
    </item>
    <item>
      <title>텍스트 영역에서 값 가져오기</title>
      <link>https://lovecheck.tistory.com/949</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;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 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;b papago-id=&quot;1-1&quot;&gt;이 질문에는 이미 다음&lt;/b&gt;과 같은 &lt;b papago-id=&quot;1-1&quot;&gt;답변이 있습니다&lt;/b&gt;.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&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/10507294/how-to-get-the-value-of-a-textarea-in-jquery&quot; dir=&quot;ltr&quot; papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;jquery에서 텍스트 영역의 값을 얻는 방법?&lt;/font&gt;&lt;/a&gt; 
    &lt;span class=&quot;question-originals-answer-count&quot; papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(12개 답변)&lt;/font&gt;&lt;/span&gt; 
   &lt;/div&gt; 
   &lt;div class=&quot;flex--item mb0 mt8&quot; 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;&lt;span class=&quot;relativetime&quot; papago-id=&quot;4-1&quot; title=&quot;2014-10-09 22:01:00Z&quot; papago-attr-id=&quot;1&quot;&gt;8년 전&lt;/span&gt;에.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;   &lt;/font&gt;&lt;/div&gt; 
  &lt;/div&gt; 
 &lt;/aside&gt; 
&lt;/div&gt; 
&lt;p papago-id=&quot;5&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;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 코드를 사용해 보았지만 텍스트 영역에 텍스트를 입력하면 알림()이 작동하지 않습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;어떻게 고치죠?&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;textarea name=&quot;textarea&quot; placeholder=&quot;Enter the text...&quot;&amp;gt;&amp;lt;/textarea&amp;gt;

$(document).ready(function () {
    if ($(&quot;textarea&quot;).value !== &quot;&quot;) {
        alert($(&quot;textarea&quot;).value);
    }
  
});
&lt;/code&gt;&lt;/pre&gt;&lt;h2 papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;바닐라 JS&lt;/font&gt;&lt;/h2&gt; 
&lt;pre&gt;&lt;code&gt;document.getElementById(&quot;textareaID&quot;).value
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2 papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;jQuery&lt;/font&gt;&lt;/h2&gt; 
&lt;pre&gt;&lt;code&gt;$(&quot;#textareaID&quot;).val()
&lt;/code&gt;&lt;/pre&gt; 
&lt;hr&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;document.getElementById(&quot;textareaID&quot;).value() // --&amp;gt; TypeError: Property 'value' of object #&amp;lt;HTMLTextAreaElement&amp;gt; is not a function
&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;jQuery:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$(&quot;#textareaID&quot;).value // --&amp;gt; undefined
&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;.val()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;텍스트 영역과 용도의 가치를 얻다&lt;/font&gt;&lt;/font&gt;&lt;code&gt;$.trim()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;빈 공간으로.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$(document).ready(function () {
    if ($.trim($(&quot;textarea&quot;).val()) != &quot;&quot;) {
        alert($(&quot;textarea&quot;).val());
    }
});
&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;$(document).ready(function () {
    var val = $.trim($(&quot;textarea&quot;).val());
    if (val != &quot;&quot;) {
        alert(val);
    }
});
&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;데모: http://jsfiddle.net/jVUsZ/&lt;/font&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;$('textarea').val();
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;code&gt;textarea.value&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;순수한 자바스크립트가 되겠지만, 여기서는 자바스크립트를 유효하지 않은 jQuery 메서드로 사용하려고 합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;.value&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;).&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;19&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;val () 메서드를 사용합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$(document).ready(function () {
    var j = $(&quot;textarea&quot;);
    if (j.val().length &amp;gt; 0) {
        alert(j.val());
    }
});
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용해야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;.val()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;것은 아니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;.value&lt;/code&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$(document).ready(function () {
  if ($(&quot;textarea&quot;).val() != &quot;&quot;) {
    alert($(&quot;textarea&quot;).val());
  }
});
&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;val()&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; if ($(&quot;textarea&quot;).val()!== &quot;&quot;) {
        alert($(&quot;textarea&quot;).val());
    }
&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;URL : https://stackoverflow.com/questions/14939010/get-value-from-text-area&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>JQuery</category>
      <author>lovecheck</author>
      <guid isPermaLink="true">https://lovecheck.tistory.com/949</guid>
      <comments>https://lovecheck.tistory.com/949#entry949comment</comments>
      <pubDate>Tue, 24 Oct 2023 21:24:53 +0900</pubDate>
    </item>
    <item>
      <title>xlsxwriter로 쓸 때 통화 기호 설정</title>
      <link>https://lovecheck.tistory.com/948</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;xlsxwriter로 쓸 때 통화 기호 설정&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;통화 값에 원하는 통화 기호를 쓰는 데 문제가 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;xlsxwriter&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://xlsxwriter.readthedocs.org/en/latest/tutorial02.html&quot; rel=&quot;noreferrer&quot; papago-id=&quot;3-1&quot;&gt;나&lt;/a&gt;는 여기서 자습서를 따랐고 정확한 형식과 달러 기호(자습서의 기본 설정인지 엑셀의 기본 설정인지 확실하지 않음)로 통화 값을 쓸 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;작동 내용:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;money = workbook.add_format({'num_format':'$#,##0.00'})
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고 달러 표시로 통화 가치를 출력합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$1,000.00
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;하지만 만약 내가 내 통화를 넣으려고 한다면, 예를 들어.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;R&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;money = workbook.add_format({'num_format':'R#,##0.00'})
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이해합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;R1000
&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;xlsxwriter를 사용하여 통화 기호를 설정하려면 어떻게 해야 합니까?&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;시도해 보시기 바랍니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;num_format('&quot;R&quot; #,##0.00')  
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;a href=&quot;https://xlsxwriter.readthedocs.io/format.html&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;format.set_num_format&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;p papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음과 같은 방법을 시도해 보십시오.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;import xlsxwriter

workbook = xlsxwriter.Workbook('money_format.xlsx')
worksheet = workbook.add_worksheet()

money_format = workbook.add_format({'num_format': '[$R]#,##0.00'})

worksheet.write('A1', 1234.56, money_format)

workbook.close()
&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&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;[$R-431]#,##0.00&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;15&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또는 양의 값과 음의 값이 다르게 처리되는 경우에 상당히 복잡한 것.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;16&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;업데이트: XlsxWriter 형식 문서의 &lt;a href=&quot;https://xlsxwriter.readthedocs.io/format.html#number-format-categories&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;16-1&quot;&gt;숫자 형식 범주&lt;/a&gt; 섹션도 참조하십시오.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;모든 버전에서 완벽하게 작동 중&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;currency_id = fields.Many2one('res.currency', 'Currency',default=lambda self: self.env.user.company_id.currency_id)

style5 = xlwt.easyxf('font:bold True;', num_format_str=self.currency_id.symbol + '#,##0.00')
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/32627524/set-the-currency-symbol-when-writing-with-xlsxwriter&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>Excel</category>
      <author>lovecheck</author>
      <guid isPermaLink="true">https://lovecheck.tistory.com/948</guid>
      <comments>https://lovecheck.tistory.com/948#entry948comment</comments>
      <pubDate>Tue, 24 Oct 2023 21:24:46 +0900</pubDate>
    </item>
    <item>
      <title>Linux에서 가장 빠른 화면 캡처 방법</title>
      <link>https://lovecheck.tistory.com/947</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Linux에서 가장 빠른 화면 캡처 방법&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 질문은 이 질문과 비슷합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/5069104/fastest-method-of-screen-capturing&quot; papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;가장 빠른 화면 캡처 방법&lt;/font&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;리눅스/X11용입니다.&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;좀 더 구체적으로 말하자면, X11 다이플레이에서 실행되는 하나의 윈도우(윈도우의 알트 프린트 스크린에 해당하는 프로그램)의 픽셀 이미지를 캡처하는 방법이 필요합니다.&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;1) 캡처 중인 창 위에 새 창을 놓더라도 픽셀 이미지는 아무런 폐색 없이 원래 응용 프로그램 창을 가리켜야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;2) 사용자가 애플리케이션 창을 볼 필요는 없으며, 비디오 목적으로 픽셀 버퍼/images만 저장하면 됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;제가 조사한 다른 대안들은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;1) xvfb - 작동하지만 CPU 렌더링을 수행하므로 느리고 좋은 GPU를 낭비합니다.&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;2) 많은 lxc 내부의 x11 - 이론적으로는 작동할 수 있지만 설정이 복잡하며, 많은 창이 캡처되면서 잘 확장될 수 있을지 확신할 수 없습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;제안과 아이디어는 환영입니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이는 하드웨어 가속이 가능한 서버에서 &lt;a href=&quot;http://virtualgl.svn.sourceforge.net/viewvc/virtualgl/vgl/tags/2.3.2/doc/index.html#hd009001&quot; rel=&quot;noreferrer&quot; papago-id=&quot;12-1&quot;&gt;VirtualGL&lt;/a&gt;을 사용하면 가능합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;기본적으로 서버를 적절하게 구성한 다음 동일한 컴퓨터 또는 동일한 네트워크에 있는 컴퓨터에서 실행합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;export DISPLAY=&amp;lt;your xvfb display&amp;gt;
vglrun &amp;lt;your_app&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;13&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이를 통해 다음과 같은 이점을 얻을 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;1) 당신의 앱은 하드웨어를 사용할 virtualGL을 사용하여 렌더링할 것입니다.&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;2) VirtualGL은 Xfvb 디스플레이 내부에 3D 컨텍스트를 표시하며 CPU에서 2D 위젯만 렌더링합니다.&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;3) 프레임 버퍼에 렌더링하도록 Xvfb 구성&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;4) 이익!&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;이것은 순수 X11에서는 불가능합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;19&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;컴포지팅을 통해 원하는 것을 얻을 수 있지만 이를 지원하는 서버에서만 가능합니다(대부분의 최신 서버에서 가능).&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 사실 윈도우 관리자와는 아무런 관련이 없습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;WM은 특별한 능력이 있기는 하지만 다른 고객일 뿐입니다. 하지만 이런 능력들은 작곡과는 무관합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;동일한 합성 API를 사용할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;man xcomposite&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;0&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;당신을 시작하게 해줘야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;21&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;X11에서는 안 된다는 댓글을 본 적이 있어서 이해가 안 되는 부분이 있을 수도 있지만 아래 코드를 사용해서 화면을 캡처할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#include &amp;lt;X11/Xlib.h&amp;gt; //-lX11
#include &amp;lt;X11/Xutil.h&amp;gt;
#include &amp;lt;X11/Xmd.h&amp;gt; 
#include &amp;lt;X11/Xatom.h&amp;gt;
#include &amp;lt;jpeglib.h&amp;gt; //-ljpeg 

void CopyDesktopImage(std::string sFilePath_Name)
{  
    Display *dis=XOpenDisplay((char *)0);
    Screen *scr = XDefaultScreenOfDisplay(dis);
    Drawable drawable = XDefaultRootWindow(dis);

    XImage *image = XGetImage(dis, drawable, 0, 0, scr-&amp;gt;width, scr-&amp;gt;height, AllPlanes, ZPixmap);
    Save_XImage_to_JPG(image, sFilePath_Name.c_str(), 75);
    XDestroyImage(image);

    XCloseDisplay(dis); 
}

void Save_XImage_to_JPG(XImage *image, std::string FileName, int Quality)
{
    FILE* outfile = fopen(FileName.c_str(), &quot;wb&quot;);
    if(outfile == NULL) return;

    jpeg_compress_struct cinfo;
    jpeg_error_mgr       jerr;

    cinfo.err = jpeg_std_error(&amp;amp;jerr);
    jpeg_create_compress(&amp;amp;cinfo);
    jpeg_stdio_dest(&amp;amp;cinfo, outfile);

    cinfo.image_width      = image-&amp;gt;width;
    cinfo.image_height     = image-&amp;gt;height;
    cinfo.input_components = image-&amp;gt;bitmap_unit &amp;gt;&amp;gt; 3;
    cinfo.in_color_space   = JCS_EXT_BGRX;

    jpeg_set_defaults(&amp;amp;cinfo);
    /*set the quality [0..100]  */
    jpeg_set_quality(&amp;amp;cinfo, Quality, true);
    jpeg_start_compress(&amp;amp;cinfo, true);

    JSAMPROW row_pointer;          /* pointer to a single row */

    while (cinfo.next_scanline &amp;lt; cinfo.image_height) 
    {
        row_pointer = (JSAMPROW) &amp;amp;image-&amp;gt;data[cinfo.next_scanline*image-&amp;gt;bytes_per_line];
        jpeg_write_scanlines(&amp;amp;cinfo, &amp;amp;row_pointer, 1);
    }
    jpeg_finish_compress(&amp;amp;cinfo);

    fclose(outfile);
}
&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;a href=&quot;http://www.xfree86.org/current/xwd.1.html&quot; rel=&quot;nofollow&quot; title=&quot;xwd - X 창의 이미지를 덤프합니다.&quot; papago-id=&quot;22-1&quot; papago-attr-id=&quot;3&quot;&gt;xwd(1)&lt;/a&gt;를 사용하여 X11 창을 덤프할 수 있으며 &lt;a href=&quot;http://www.xfree86.org/current/xwud.1.html&quot; rel=&quot;nofollow&quot; title=&quot;X용 영상 표시기&quot; papago-id=&quot;22-3&quot; papago-attr-id=&quot;4&quot;&gt;xwd(1)&lt;/a&gt;를 표시할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://imagemagick.org&quot; rel=&quot;nofollow&quot; papago-id=&quot;22-5&quot;&gt;ImageMagick&lt;/a&gt;과 &lt;a href=&quot;http://netpbm.sourceforge.net/&quot; rel=&quot;nofollow&quot; papago-id=&quot;22-7&quot;&gt;Netpbm 도구&lt;/a&gt;는 XWD 형식을 다루는 방법을 알고 있습니다.&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;23&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 얼토당토않은 추측이지만, VNC를 통해 단일 윈도우를 스트리밍하려면 -id [ windowid](http://www.karlrunge.com/x11vnc/x11vnc_opts.html#opt-id) 옵션과 함께 x11vnc를 사용할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이렇게 하면 창 전체가 표시되며, 창이 가려져 있어도 메인 화면과 정확히 동일한 위치가 표시됩니다(팝업 메뉴가 일부 손실될 수 있음).&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;실제 X11 화면에서 창 좌표를 가져올 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그 정보를 입수하고 싶어요&lt;/font&gt;&lt;/font&gt;&lt;code&gt;gnome-screenshot&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;, 아니면 기존의 다른 오픈 소스 도구를 이용해서 그들이 어떻게 그것을 하는지 파악할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;26&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Ubuntu가 사용하는 소스는 http://packages.ubuntu.com/quantal/gnome-screenshot 에서 확인할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;27&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;하지만, 많은 부분의 코드를 자르고 붙여넣기 전에 라이센스를 확인하는 것을 잊지 마세요!&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;28&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Xpaint는 MIT Athena 위젯 세트를 사용하여 만들어진 매우 오래된 X11 유틸리티입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;파일 &amp;gt; 스냅샷 만들기 화면에서 창이나 마우스로 선택한 직사각형을 가져옵니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;29&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;오어&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;30&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;MagiCapture는 X 윈도우 시스템의 화면 캡처 및 미리보기 유틸리티입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용자는 하나의 창, 장식이 있는 하나의 창, 디스플레이의 직사각형 영역, 또는 디스플레이 자체 전체를 캡처할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용자는 캡처된 이미지를 ImageMagick 툴킷에서 지원하는 그래픽 파일에 저장할 수 있습니다. 이 툴킷은 모든 그래픽 형식이 아닌 경우 대부분의 그래픽 형식을 지원합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;MagiCapture는 사용자 인터페이스를 위해 GLIB 및 GTK+ 라이브러리를 사용하고 모든 그래픽 처리를 위해 ImageMagick 및 GdkMagick 라이브러리를 사용합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;ImageMagick이 필요합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;31&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;오어&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;32&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://code.google.com/p/zscreen/&quot; rel=&quot;nofollow&quot; papago-id=&quot;32-0&quot;&gt;Zscreen&lt;/a&gt;:- 이 Windows 전용 화면 캡처 앱에는 수많은 기능이 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;활성 창, 선택한 창 또는 전체 화면의 샷을 가져옵니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이미지가 있으면 이미지 편집기에서 자동으로 열거나 Twitpic, YFrog, Flickr 또는 지원되는 여러 서비스 중 하나에 업로드합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;ZScreen은 클립보드에 있는 이미지를 포함하여 모든 이미지를 캐시하므로 스크린샷의 기록이 항상 바로 손끝에 있습니다.&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;로컬 네트워크의 까다로운 해킹으로 할 수 있는 일은 X 원격 기능을 사용하여 X 수신 포트를 연 다음 envar를 사용하여 X 수신 포트로 내보내기를 설정한 다음 XscreenCapture를 사용하는 것입니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;34&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/13479975/fastest-method-for-screen-capturing-on-linux&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>C</category>
      <author>lovecheck</author>
      <guid isPermaLink="true">https://lovecheck.tistory.com/947</guid>
      <comments>https://lovecheck.tistory.com/947#entry947comment</comments>
      <pubDate>Tue, 24 Oct 2023 21:24:40 +0900</pubDate>
    </item>
    <item>
      <title>&amp;quot;브레이크&amp;quot;는 &amp;quot;for&amp;quot;, &amp;quot;where&amp;quot;, &amp;quot;do-here&amp;quot;, &amp;quot;switch&amp;quot;, &amp;quot;if&amp;quot;문에만 작동합니까?</title>
      <link>https://lovecheck.tistory.com/946</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&quot;브레이크&quot;는 &quot;for&quot;, &quot;where&quot;, &quot;do-here&quot;, &quot;switch&quot;, &quot;if&quot;문에만 작동합니까?&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를 들어, 제게&lt;/font&gt;&lt;/font&gt;&lt;code&gt;if&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;A 내부의 진술&lt;/font&gt;&lt;/font&gt;&lt;code&gt;for&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;루프:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;for( ; ; )
{
  if( )
    {
     printf(&quot; inside if&quot;);
     break;
    }//if         

  printf(&quot;inside for&quot;);
}//for
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;자, 이제, 윌.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;break&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;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&gt;&lt;/font&gt;&lt;code&gt;if&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;if&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;만족하게 되십니까?&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그&lt;/font&gt;&lt;/font&gt;&lt;code&gt;break&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;em papago-id=&quot;9-1&quot;&gt;가까운 엔클로저&lt;/em&gt; &lt;em papago-id=&quot;9-1&quot;&gt;&lt;strong papago-id=&quot;9-1-1&quot;&gt;루프&lt;/strong&gt;&lt;/em&gt; 또는 &lt;em papago-id=&quot;9-1&quot;&gt;&lt;strong papago-id=&quot;9-1-3&quot;&gt;스위치&lt;/strong&gt;&lt;/em&gt; &lt;em papago-id=&quot;9-1&quot;&gt;문&lt;/em&gt;에서 발생합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;break&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;if&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;loop&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;switch&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;if&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;15&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;진술.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;한 번도 헤어지지 않은 이유는&lt;/font&gt;&lt;/font&gt;&lt;code&gt;if&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;loop&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;17&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;17&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;흥미롭게도, C를 발명한 회사가 &lt;a href=&quot;http://www.mit.edu/hacker/part1.html&quot; papago-id=&quot;17-1&quot; rel=&quot;noreferrer&quot;&gt;정확히&lt;/a&gt; 이 &lt;a href=&quot;http://www.mit.edu/hacker/part1.html&quot; papago-id=&quot;17-1&quot; rel=&quot;noreferrer&quot;&gt;버그를 만들었기&lt;/a&gt; 때문에 전화기 스위치가 잘못 작동했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그들은 탈출하기를 원했습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;if&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;for&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&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;21&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그것은 탈출 할 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;for&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;22&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;고리 모양의&lt;/font&gt;&lt;/font&gt;&lt;code&gt;break&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;23&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;문은 루프에만 영향을 미칩니다(&lt;/font&gt;&lt;/font&gt;&lt;code&gt;do&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&gt;&lt;/font&gt;&lt;code&gt;for&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;25&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;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&gt;&lt;/font&gt;&lt;code&gt;switch&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;27&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(A에서 이탈하기 위한) 진술&lt;/font&gt;&lt;/font&gt;&lt;code&gt;case&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&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;29&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://www.open-std.org/JTC1/SC22/wg14/www/docs/n1124.pdf&quot; rel=&quot;noreferrer&quot; papago-id=&quot;29-1&quot;&gt;C99 표준&lt;/a&gt;, 섹션 6.8.6.3:&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;strong papago-id=&quot;30&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;31&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;32&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;의미론&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
 &lt;p papago-id=&quot;33&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;중단문은 가장 작은 엔클로저 스위치 또는 반복문의 실행을 종료합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt;&lt;p&gt;&lt;code&gt;break&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;34&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;if 절에서 벗어나지 않고 가장 가까운 루프 또는 스위치 절에서 나옵니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;또한 if 절은 그 내용을 반복하지 않기 때문에 &quot;루프&quot;라고 부르지 않습니다.&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;Break 문은 루프와 스위치 절에만 적용됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;어떤 경우에도 가장 가까운 엔클로저 루프에서 나옵니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;조건부 휴식, 즉 일부 if 문을 포함한 휴식을 사용하는 것이 좋습니다.&lt;/font&gt;&lt;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;while(true) {
     while (some_condition) {
          if (some_condition)
               goto label;
     }
}
label: // do something here
&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;if 또는 other 문은 break 문을(를) 깨지지 않습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;브레이크 문을 사용하는 경우 주로 가장 가까운 루프에서 나옵니다(루프인 경우 루프인 경우, 루프인 경우 및 스위치인 경우).&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;37&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;브레이크 문은 의사결정문을 만드는 데 아무 소용이 없습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;루프에서 강제 종료하고 루프 뒤에 있는 문에서 실행을 계속하려면 루프에서만 사용됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&quot;조건이 참이면 if 문에서 컨트롤이 나오게 할 것입니다.&quot;라는 질문에는 의문의 여지가 없습니다. 왜냐하면 조건이 참이고 본체가 실행되면 if 문에서 컨트롤이 경우에는 break 문에 관계없이 컨트롤이 나오기 때문입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;if 문은 루프가 아닙니다. 전혀 기대되지 않거나 한 번만 실행됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러니까 if의 몸 안에 브레이크를 넣는 것은 전혀 말이 안 됩니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;38&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/2565659/does-break-work-only-for-for-while-do-while-switch-and-for-if-sta&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>C</category>
      <author>lovecheck</author>
      <guid isPermaLink="true">https://lovecheck.tistory.com/946</guid>
      <comments>https://lovecheck.tistory.com/946#entry946comment</comments>
      <pubDate>Thu, 19 Oct 2023 22:26:31 +0900</pubDate>
    </item>
    <item>
      <title>Mysql을 시작하면 Xampp에서 종료됩니다.</title>
      <link>https://lovecheck.tistory.com/945</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Mysql을 시작하면 Xampp에서 종료됩니다.&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(MariaDB)에서 다른 사용자에게 루트에서 권한을 부여하려고 할 때 모든 것이 시작되었습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고 &quot;ERROR 1034 (HY000)&quot;을 받았습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;테이블 'db'에 대한 인덱스가 손상되었습니다. 복구 시도&quot;, 명령 복구 테이블 mysql.db를 시도했지만 로컬 호스트와의 연결에 실패했습니다.&lt;/font&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;font class=&quot;papago-parent&quot;&gt;일부 포트가 사용 중인지 확인하기 위해 컴퓨터 재부팅도 시도했지만 여전히 상황이 지속됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;어쩌죠?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;미리 감사드립니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;편집:&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;오류 로그:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;InnoDB: using atomic writes.
2019-11-24 13:23:05 0 [Note] InnoDB: Mutexes and rw_locks use Windows interlocked functions
2019-11-24 13:23:05 0 [Note] InnoDB: Uses event mutexes
2019-11-24 13:23:05 0 [Note] InnoDB: Compressed tables use zlib 1.2.11
2019-11-24 13:23:05 0 [Note] InnoDB: Number of pools: 1
2019-11-24 13:23:05 0 [Note] InnoDB: Using SSE2 crc32 instructions
2019-11-24 13:23:05 0 [Note] InnoDB: Initializing buffer pool, total size = 16M, instances = 1, chunk size = 16M
2019-11-24 13:23:05 0 [Note] InnoDB: Completed initialization of buffer pool
2019-11-24 13:23:05 0 [Note] InnoDB: 128 out of 128 rollback segments are active.
2019-11-24 13:23:05 0 [Note] InnoDB: Creating shared tablespace for temporary tables
2019-11-24 13:23:05 0 [Note] InnoDB: Setting file 'C:\xampp\mysql\data\ibtmp1' size to 12 MB. Physically writing the file full; Please wait ...
2019-11-24 13:23:05 0 [Note] InnoDB: File 'C:\xampp\mysql\data\ibtmp1' size is now 12 MB.
2019-11-24 13:23:05 0 [Note] InnoDB: Waiting for purge to start
2019-11-24 13:23:05 0 [Note] InnoDB: 10.4.8 started; log sequence number 1853753; transaction id 2559
2019-11-24 13:23:05 0 [Note] InnoDB: Loading buffer pool(s) from C:\xampp\mysql\data\ib_buffer_pool
2019-11-24 13:23:05 0 [Note] Plugin 'FEEDBACK' is disabled.
2019-11-24 13:23:05 0 [Note] Server socket created on IP: '::'.
&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;URL : https://stackoverflow.com/questions/59017527/mysql-shuts-down-from-xampp-when-i-start-it&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>mariaDB</category>
      <author>lovecheck</author>
      <guid isPermaLink="true">https://lovecheck.tistory.com/945</guid>
      <comments>https://lovecheck.tistory.com/945#entry945comment</comments>
      <pubDate>Thu, 19 Oct 2023 22:26:25 +0900</pubDate>
    </item>
    <item>
      <title>텍스트 영역에서 커서 위치를 얻으려면 어떻게 해야 합니까?</title>
      <link>https://lovecheck.tistory.com/944</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;텍스트 영역에서 커서 위치를 얻으려면 어떻게 해야 합니까?&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;텍스트 영역이 있는데 자바스크립트로 커서가 텍스트 영역의 마지막 줄에 있는지 텍스트 영역의 첫 줄에 있는지 알고 싶습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p 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;var firstNewline = $('#myTextarea').val().indexOf('\n');
var lastNewline = $('#myTextarea').val().lastIndexOf('\n');

var cursorPosition = ?????;

if (cursorPosition &amp;lt; firstNewline)
    // I am on first line.
else if (cursorPosition &amp;gt; lastNewline)
    // I am on last line.
&lt;/code&gt;&lt;/pre&gt; 
&lt;ul&gt; 
 &lt;li papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;텍스트 영역 내에서 커서 위치를 잡을 수 있습니까?&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;제가 텍스트 영역의 첫 줄에 있는지 마지막 줄에 있는지 알아볼 수 있는 더 좋은 제안이 있습니까?&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;jQuery 솔루션은 자바스크립트가 단순하거나 단순하지 않다면 선호합니다.&lt;/font&gt;&lt;/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;.selectionStart&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;.selectionEnd&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;var cursorPosition = $('#myTextarea').prop(&quot;selectionStart&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;이는 구형 브라우저, 특히 IE8-에서는 지원되지 않습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;거기서 당신은 텍스트 범위를 사용해야 할 것이지만, 그것은 완전히 좌절입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 입력 요소에서 선택/커서 위치를 얻고 설정하는 전용 라이브러리가 어딘가에 있다고 생각합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이름은 기억나지 않지만, 이 주제에 대한 기사는 수십 건에 달하는 것 같습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;표준 라이브러리에 있는 크로스 브라우저 기능은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;function getCursorPos(input) {
    if (&quot;selectionStart&quot; in input &amp;amp;&amp;amp; document.activeElement == input) {
        return {
            start: input.selectionStart,
            end: input.selectionEnd
        };
    }
    else if (input.createTextRange) {
        var sel = document.selection.createRange();
        if (sel.parentElement() === input) {
            var rng = input.createTextRange();
            rng.moveToBookmark(sel.getBookmark());
            for (var len = 0;
                     rng.compareEndPoints(&quot;EndToStart&quot;, rng) &amp;gt; 0;
                     rng.moveEnd(&quot;character&quot;, -1)) {
                len++;
            }
            rng.setEndPoint(&quot;StartToStart&quot;, input.createTextRange());
            for (var pos = { start: 0, end: len };
                     rng.compareEndPoints(&quot;EndToStart&quot;, rng) &amp;gt; 0;
                     rng.moveEnd(&quot;character&quot;, -1)) {
                pos.start++;
                pos.end++;
            }
            return pos;
        }
    }
    return -1;
}
&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;var cursorPosition = getCursorPos($('#myTextarea')[0])
&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;function setCursorPos(input, start, end) {
    if (arguments.length &amp;lt; 3) end = start;
    if (&quot;selectionStart&quot; in input) {
        setTimeout(function() {
            input.selectionStart = start;
            input.selectionEnd = end;
        }, 1);
    }
    else if (input.createTextRange) {
        var rng = input.createTextRange();
        rng.moveStart(&quot;character&quot;, start);
        rng.collapse();
        rng.moveEnd(&quot;character&quot;, end - start);
        rng.select();
    }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;a href=&quot;http://jsfiddle.net/gilly3/6SUN8/&quot; papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;http://jsfiddle.net/gilly3/6SUN8/&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;p papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;라인 번호와 컬럼 위치를 구하는 코드입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;function getLineNumber(tArea) {

    return tArea.value.substr(0, tArea.selectionStart).split(&quot;\n&quot;).length;
}

function getCursorPos() {
    var me = $(&quot;textarea[name='documenttext']&quot;)[0];
    var el = $(me).get(0);
    var pos = 0;
    if ('selectionStart' in el) {
        pos = el.selectionStart;
    } else if ('selection' in document) {
        el.focus();
        var Sel = document.selection.createRange();
        var SelLength = document.selection.createRange().text.length;
        Sel.moveStart('character', -el.value.length);
        pos = Sel.text.length - SelLength;
    }
    var ret = pos - prevLine(me);
    alert(ret);

    return ret; 
}

function prevLine(me) {
    var lineArr = me.value.substr(0, me.selectionStart).split(&quot;\n&quot;);

    var numChars = 0;

    for (var i = 0; i &amp;lt; lineArr.length-1; i++) {
        numChars += lineArr[i].length+1;
    }

    return numChars;
}
&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;tArea는 텍스트 영역 DOM 요소입니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/7745867/how-do-you-get-the-cursor-position-in-a-textarea&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>JQuery</category>
      <author>lovecheck</author>
      <guid isPermaLink="true">https://lovecheck.tistory.com/944</guid>
      <comments>https://lovecheck.tistory.com/944#entry944comment</comments>
      <pubDate>Thu, 19 Oct 2023 22:26:18 +0900</pubDate>
    </item>
    <item>
      <title>사용자 정의 워드프레스 테마에 메뉴 지원 추가</title>
      <link>https://lovecheck.tistory.com/943</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용자 정의 워드프레스 테마에 메뉴 지원 추가&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;첫 번째 워드프레스 테마를 만들고 있는데 메뉴 지원에 어려움을 겪고 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong 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;php와 그것을 나의 헤더에 구현했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;아래와 같은 php이지만 관리 영역의 메뉴 옵션이 나타나지 않습니다!&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;# functions.php

&amp;lt;?php

    add_theme_support( 'menus' );

    add_action( 'init', 'register_my_menus' );

    function register_my_menus() {
        register_nav_menus(
            array(
                'primary-menu' =&amp;gt; __( 'Primary Menu' ),
                'secondary-menu' =&amp;gt; __( 'Secondary Menu' )
            )
        );
    }

?&amp;gt;

# header.php
# [...]
    &amp;lt;?php wp_nav_menu( array( 'theme_location' =&amp;gt; 'primary-menu' ) ); ?&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;/p&gt; 
&lt;ul&gt; 
 &lt;li papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;워드프레스 버전 3.4.2&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;MAMP 개발환경&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;플러그인 없음&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&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;ul&gt; 
 &lt;li papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;메뉴 옵션이 다른 템플릿에 표시됩니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;페이지에서 메뉴가 올바르게 렌더링되고 있습니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&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;hr&gt; 
&lt;h2 papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;편집 #1&lt;/font&gt;&lt;/h2&gt; 
&lt;p papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;관리 메뉴의 메뉴 옵션도 보이지 않습니다(&lt;a href=&quot;https://i.stack.imgur.com/0Gb6N.jpg&quot; rel=&quot;noreferrer&quot; papago-id=&quot;12-1&quot;&gt;여기처럼!).&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;13&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;몇 가지 사항 - add_theme_support()가 필요 없습니다. add_action('init', 'register_menus')도 필요 없습니다.&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;바로 register_nav_menus 함수를 호출하면 다음과 같습니다.&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 papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;원하는 경우 기능이 존재하는지도 확인할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 자신만의 테마에만 사용할 수 있고 실제로 존재한다는 것을 알고 있다면 실제로는 필요하지 않습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;if ( function_exists( 'register_nav_menus' ) ) {
    ...
}
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;16&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/12616166/adding-menu-support-to-custom-wordpress-theme&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>Wordpress</category>
      <author>lovecheck</author>
      <guid isPermaLink="true">https://lovecheck.tistory.com/943</guid>
      <comments>https://lovecheck.tistory.com/943#entry943comment</comments>
      <pubDate>Thu, 19 Oct 2023 22:26:10 +0900</pubDate>
    </item>
    <item>
      <title>jQuery 확인란이 선택되어 있는지 없는지 확인합니다.</title>
      <link>https://lovecheck.tistory.com/942</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;개별 확인란이 선택되었는지 여부를 확인하는 방법을 알고 있습니다.&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;하지만 저는 다음과 관련하여 문제가 있습니다. 양식 ID가 주어지면 확인란 중 &lt;em papago-id=&quot;2-1&quot;&gt;하나&lt;/em&gt;가 선택되어 있는지(즉, 1개 이상) 확인하고, &lt;em papago-id=&quot;2-3&quot;&gt;선택&lt;/em&gt;되어 있지 않은지 확인해야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;기본적으로 저는 이 두 가지 질문에 답하는 두 개의 별도 기능이 필요합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;도움을 주시면 감사하겠습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;감사합니다!&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사실 아무 &lt;em papago-id=&quot;3-1&quot;&gt;것&lt;/em&gt;도 선택되지 않으면 알려주는 기능만 있으면 됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것을 알면 다른 질문에 대답할 수 있을 것입니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;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;if ($(&quot;#formID input:checkbox:checked&quot;).length &amp;gt; 0)
{
    // any one is checked
}
else
{
   // none is checked
}
&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;.is&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;지정된 모든 요소를 테스트하고 적어도 하나가 셀렉터와 일치하면 true로 반환됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;if ($(&quot;:checkbox[name='choices']&quot;, form).is(&quot;:checked&quot;))
{
    // one or more checked
}
else
{
    // nothing checked
}
&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;  if ($('#form_id :checkbox:checked').length &amp;gt; 0){
    // one or more checkboxes are checked
  }
  else{
   // no checkboxes are checked
  }
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;위치:&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://api.jquery.com/checkbox-selector/&quot; rel=&quot;noreferrer&quot; papago-id=&quot;9-0&quot;&gt;&lt;code papago-id=&quot;9-0-0&quot;&gt;:checkbox&lt;/code&gt;&lt;/a&gt; filter selector 모든 확인란을 선택합니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://api.jquery.com/checked-selector/&quot; rel=&quot;noreferrer&quot; papago-id=&quot;10-0&quot;&gt;&lt;code papago-id=&quot;10-0-0&quot;&gt;:checked&lt;/code&gt;&lt;/a&gt; 선택한 확인란을 선택합니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://api.jquery.com/length/&quot; rel=&quot;noreferrer&quot; papago-id=&quot;11-0&quot;&gt;&lt;code papago-id=&quot;11-0-0&quot;&gt;length&lt;/code&gt;&lt;/a&gt; 거기에 체크된 것들의 숫자를 알려줄 것입니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt;&lt;p papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;'length'를 사용하지 않고 다음과 같이 할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;if ($('input[type=checkbox]').is(&quot;:checked&quot;)) {
      //any one is checked
}
else {
//none is checked
}
&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;$('input[type=&quot;checkbox&quot;]').change(function(){ 

        var itemName = $('select option:selected').text();  

         //Do something.

});     
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;라훌의 대답이 당신의 질문에 가장 적합합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;어쨌든 양식의 모든 체크박스가 아닌 체크박스 그룹이 있다면 선택할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;클래스 이름과 같이 확인할 모든 확인란에 클래스 이름을 입력합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;test_check&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이제 다음을 통해 그룹에 속한 확인란을 선택할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$(&quot;#formID .test_check:checked&quot;).length &amp;gt; 0
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;만약 돌아온다면&lt;/font&gt;&lt;/font&gt;&lt;code&gt;true&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;test_check&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;반환 여부를 확인한 적이 없습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;false&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;21&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;누군가에게 도움이 되길 바랍니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;감사합니다 :)-&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;22&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;여기서 간단한 반품 작업을 수행할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;function areAnyChecked(formID) {
  return !!$('#'+formID+' input[type=checkbox]:checked').length;
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;23&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;지정된 양식의 확인란을 찾아 해당 확인란이 있는지 확인하고 반환합니다.&lt;/font&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;만약 그렇다면 (그렇지 않으면 길이가 0이 될 것이기 때문에).&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;function howManyAreChecked(formID) {
  return $('#'+formID+' input[type=checkbox]:checked').length;
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;25&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이렇게 하면 검사한 개수가 반환됩니다.&lt;/font&gt;&lt;/p&gt;&lt;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($(&quot;#checkbox&quot;).is(&quot;:checked&quot;)){

  // Do something here /////

  };
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;27&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/4086957/jquery-see-if-any-or-no-checkboxes-are-selected&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>JQuery</category>
      <author>lovecheck</author>
      <guid isPermaLink="true">https://lovecheck.tistory.com/942</guid>
      <comments>https://lovecheck.tistory.com/942#entry942comment</comments>
      <pubDate>Thu, 19 Oct 2023 22:26:03 +0900</pubDate>
    </item>
    <item>
      <title>jQuery를 사용하여 요소의 모든 특성 가져오기</title>
      <link>https://lovecheck.tistory.com/941</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;요소를 조사하여 해당 요소의 모든 속성을 출력하려고 합니다. 예를 들어 태그가 자신에게 알려지지 않은 3개 이상의 속성을 가질 수 있으며 이러한 속성의 이름과 값을 얻어야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;나는 다음과 같은 생각을 하고 있었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-js prettyprint-override&quot;&gt;&lt;code&gt;$(this).attr().each(function(index, element) {
    var name = $(this).name;
    var value = $(this).value;
    //Do something with name and value...
});
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것이 가능한지, 가능하다면 정확한 구문은 무엇인지 누가 말해줄 수 있습니까?&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;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;attributes&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;property는 모두 포함합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$(this).each(function() {
  $.each(this.attributes, function() {
    // this.attributes is not a plain object, but an array
    // of attribute nodes, which contain both the name and value
    if(this.specified) {
      console.log(this.name, this.value);
    }
  });
});
&lt;/code&gt;&lt;/pre&gt; 
&lt;hr&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;.attr&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;.attr()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;모든 속성의 일반 개체를 얻으려면 다음과 같이 하십시오.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;(function(old) {
  $.fn.attr = function() {
    if(arguments.length === 0) {
      if(this.length === 0) {
        return null;
      }

      var obj = {};
      $.each(this[0].attributes, function() {
        if(this.specified) {
          obj[this.name] = this.value;
        }
      });
      return obj;
    }

    return old.apply(this, arguments);
  };
})($.fn.attr);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;용도:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var $div = $(&quot;&amp;lt;div data-a='1' id='b'&amp;gt;&quot;);
$div.attr();  // { &quot;data-a&quot;: &quot;1&quot;, &quot;id&quot;: &quot;b&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;/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;바닐라 JS&lt;/strong&gt;:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;function getAttributes ( node ) {
    var i,
        attributeNodes = node.attributes,
        length = attributeNodes.length,
        attrs = {};

    for ( i = 0; i &amp;lt; length; i++ ) attrs[attributeNodes[i].name] = attributeNodes[i].value;
    return attrs;
}
&lt;/code&gt;&lt;/pre&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;바닐라 JS with Array.reduce&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;ES 5.1(2011)을 지원하는 브라우저에서 작동합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;IE9+가 필요하고 IE8에서는 작동하지 않습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;function getAttributes ( node ) {
    var attributeNodeArray = Array.prototype.slice.call( node.attributes );

    return attributeNodeArray.reduce( function ( attrs, attribute ) {
        attrs[attribute.name] = attribute.value;
        return attrs;
    }, {} );
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;13&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;jQuery&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 함수는 DOM 요소가 아닌 jQuery 개체를 기대합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;function getAttributes ( $node ) {
    var attrs = {};
    $.each( $node[0].attributes, function ( index, attribute ) {
        attrs[attribute.name] = attribute.value;
    } );

    return attrs;
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;밑줄&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p 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;function getAttributes ( node ) {
    return _.reduce( node.attributes, function ( attrs, attribute ) {
        attrs[attribute.name] = attribute.value;
        return attrs;
    }, {} );
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;로다시&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;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;IE9+가 필요하고 IE8에서 버그가 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;@AlJey에게 영광을 &lt;a href=&quot;https://stackoverflow.com/a/25946982/508355&quot; papago-id=&quot;18-1&quot;&gt;돌립니다&lt;/a&gt;.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;function getAttributes ( node ) {
    return _.transform( node.attributes, function ( attrs, attribute ) {
        attrs[attribute.name] = attribute.value;
    }, {} );
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;19&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;테스트페이지&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;20&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;JS Bin에는 이 모든 기능을 다루는 &lt;a href=&quot;http://jsbin.com/vefiku/7&quot; papago-id=&quot;20-1&quot; rel=&quot;noreferrer&quot;&gt;실시간 테스트&lt;/a&gt; 페이지가 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 검정에는 부울 특성이 포함됩니다(&lt;/font&gt;&lt;/font&gt;&lt;code&gt;hidden&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;) 및 열거된 속성(&lt;/font&gt;&lt;/font&gt;&lt;code&gt;contenteditable=&quot;&quot;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;).&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;23&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;디버깅 스크립트(해시체인지에 의한 위 답변에 기초한 jquery solution)&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;function getAttributes ( $node ) {
      $.each( $node[0].attributes, function ( index, attribute ) {
      console.log(attribute.name+':'+attribute.value);
   } );
}

getAttributes($(this));  // find out what attributes are available
&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;LoDash를 사용하면 간단히 다음과 같은 작업을 수행할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;_.transform(this.attributes, function (result, item) {
  item.specified &amp;amp;&amp;amp; (result[item.name] = item.value);
}, {});
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;25&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;javascript 기능을 사용하면 NamedArrayFormat에서 요소의 모든 속성을 쉽게 얻을 수 있습니다.&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;$(&quot;#myTestDiv&quot;).click(function(){
  var attrs = document.getElementById(&quot;myTestDiv&quot;).attributes;
  $.each(attrs,function(i,elem){
    $(&quot;#attrs&quot;).html(    $(&quot;#attrs&quot;).html()+&quot;&amp;lt;br&amp;gt;&amp;lt;b&amp;gt;&quot;+elem.name+&quot;&amp;lt;/b&amp;gt;:&amp;lt;i&amp;gt;&quot;+elem.value+&quot;&amp;lt;/i&amp;gt;&quot;);
  });
});&lt;/code&gt;&lt;/pre&gt; 
  &lt;pre class=&quot;snippet-code-html lang-html prettyprint-override&quot;&gt;&lt;code&gt;&amp;lt;script src=&quot;https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;div id=&quot;myTestDiv&quot; ekind=&quot;div&quot; etype=&quot;text&quot; name=&quot;stack&quot;&amp;gt;
click This
&amp;lt;/div&amp;gt;
&amp;lt;div id=&quot;attrs&quot;&amp;gt;Attributes are &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;strong papago-id=&quot;26&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언더스코어.js에 의한 간단한 솔루션&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를 들어,&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;모든 링크 텍스트 가져오기 부모님의 수업 시간이 있는 사람&lt;/font&gt;&lt;/font&gt;&lt;code&gt;someClass&lt;/code&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;_.pluck($('.someClass').find('a'), 'text');
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;a href=&quot;http://jsfiddle.net/htfL3d4g/1/&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;28&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;워킹피들&lt;/font&gt;&lt;/a&gt; &lt;/p&gt;&lt;p papago-id=&quot;29&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;나의 제안:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$.fn.attrs = function (fnc) {
    var obj = {};
    $.each(this[0].attributes, function() {
        if(this.name == 'value') return; // Avoid someone (optional)
        if(this.specified) obj[this.name] = this.value;
    });
    return obj;
}
&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;vara = $(el).attrs ();&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;31&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;여기 당신을 위한 원라이너가 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;h2 papago-id=&quot;32&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;JQuery 사용자:&lt;/font&gt;&lt;/h2&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;$jQueryObject&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;10&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;당신의 jQuery 객체를 사용합니다. 즉,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;$('div')&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;Object.values($jQueryObject.get(0).attributes).map(attr =&amp;gt; console.log(`${attr.name + ' : ' + attr.value}`));
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2 papago-id=&quot;36&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;12&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;교체하다&lt;/font&gt;&lt;/font&gt;&lt;code&gt;$domElement&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;13&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;HTML DOM 선택기를 사용합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;document.getElementById('demo')&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;14&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Object.values($domElement.attributes).map(attr =&amp;gt; console.log(`${attr.name + ' : ' + attr.value}`));
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;40&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;건배!!&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;41&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/14645806/get-all-attributes-of-an-element-using-jquery&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>JQuery</category>
      <author>lovecheck</author>
      <guid isPermaLink="true">https://lovecheck.tistory.com/941</guid>
      <comments>https://lovecheck.tistory.com/941#entry941comment</comments>
      <pubDate>Thu, 19 Oct 2023 22:25:56 +0900</pubDate>
    </item>
    <item>
      <title>mysql: /usr/local/lib/libssl.so .1.1: 'OPENSL_1_1_1' 버전을 찾을 수 없습니다(mysql로 required).</title>
      <link>https://lovecheck.tistory.com/940</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;mysql: /usr/local/lib/libssl.so .1.1: 'OPENSL_1_1_1' 버전을 찾을 수 없습니다(mysql로 required).&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;저는 최근에 Word Press 사이트를 실행하는 Ubuntu 18.04 LTS를 업데이트하고 업그레이드했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;sudo apt-get update
sudo apt-get upgrade
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;분명히 업그레이드에는 웹 서버에서 로컬로 실행되는 mysql도 포함되어 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이제 다음 오류가 발생합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;mysql: /usr/local/lib/libssl.so .1.1: 'OPENSL_1_1_1' 버전을 찾을 수 없습니다(mysql로 required).&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;어떻게 고쳐야 할지 조언해 주실 수 있으신가요?&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;저도 같은 문제를 만났고, ubuntu 18.04에서 고쳤습니다.&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;컴퓨터의 경로=&quot;/usr/lib/x86_64- linux- gnu/libssl.so .1.1&quot;에서 동일한 파일을 찾았습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;나는 파일을 백업하고 위 경로에서 동일한 파일을 복사합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-sh prettyprint-override&quot;&gt;&lt;code&gt;sudo mv /usr/local/lib/libssl.so.1.1 /usr/local/lib/libssl.so.1.1.old
sudo cp /usr/lib/x86_64-linux-gnu/libssl.so.1.1 /usr/local/lib/
&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;mysql: libcrypto.so.1.1: version `OPENSSL_1_1_1' not found (required by libssl.so.1.1)

&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고 같은 일을 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;sudo mv /usr/local/lib/libcrypto.so.1.1 /usr/local/lib/libcrypto.so.1.1.old
sudo cp /usr/lib/x86_64-linux-gnu/libcrypto.so.1.1 /usr/local/lib/

&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;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/61133615/mysql-usr-local-lib-libssl-so-1-1-version-openssl-1-1-1-not-found-required&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>Wordpress</category>
      <author>lovecheck</author>
      <guid isPermaLink="true">https://lovecheck.tistory.com/940</guid>
      <comments>https://lovecheck.tistory.com/940#entry940comment</comments>
      <pubDate>Thu, 19 Oct 2023 22:25:48 +0900</pubDate>
    </item>
    <item>
      <title>Sequelize.js 외래 키</title>
      <link>https://lovecheck.tistory.com/939</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Sequelize.js 외래 키&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;Sequelize.js를 사용할 때 다음 코드는 테이블에 외래 키를 추가하지 않습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var MainDashboard = sequelize.define('main_dashboard', {
  title: Sequelize.STRING
}, {
  freezeTableName: true
})

MainClient.hasOne(MainDashboard, { foreignKey: 'idClient' })
MainDashboard.hasOne(MainClient, { foreignKey: 'clientId' })

sequelize.sync({ force: true })
&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;Sequelize.js가 이러한 외래 키 제약 조건을 추가하도록 강제할 수 있는 방법이 있습니까?&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;동일한 문제가 발생하기 전에 Sequelize 설정의 기능을 이해했을 때 해결했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;바로 본론으로!&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;두 개의 객체가 있다고 가정합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;5-1&quot;&gt;사람&lt;/strong&gt;과 &lt;strong papago-id=&quot;5-3&quot;&gt;아버지&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var Person = sequelize.define('Person', {

        name: Sequelize.STRING
});

var Father = sequelize.define('Father', {

        age: Sequelize.STRING,
        //The magic start here
        personId: {
              type: Sequelize.INTEGER,
              references: 'persons', // &amp;lt;&amp;lt;&amp;lt; Note, its table's name, not object name
              referencesKey: 'id' // &amp;lt;&amp;lt;&amp;lt; Note, its a column name
        }
});

Person.hasMany(Father); // Set one to many relationship
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;당신을 도울 수도 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;편집:&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 글을 읽고 더 잘 이해할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;http://docs.sequelizejs.com/manual/tutorial/associations.html#foreign-keys&quot; rel=&quot;noreferrer&quot; papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;http://docs.sequelizejs.com/manual/tutorial/associations.html#foreign-keys&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;p papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Sequelize 4의 경우 다음으로 업데이트되었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-js prettyprint-override&quot;&gt;&lt;code&gt;
const Father = sequelize.define('Father', {
        name: Sequelize.STRING
});

const Child = sequelize.define('Child', {
    age: Sequelize.STRING,
    fatherId: {
       type: Sequelize.INTEGER,
       references: {
          model: 'fathers', // 'fathers' refers to table name
          key: 'id', // 'id' refers to column name in fathers table
       }
    }
});

Father.hasMany(Child); // Set one to many relationship

&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;편집: https://sequelize.org/master/manual/assocs.html 에서 연관성에 대해 더 자세히 읽을 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;12&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;추가할 필요가 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;foreignKeyConstraint: true&lt;/code&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;MainClient.hasOne(MainDashboard, { foreignKey: 'idClient', foreignKeyConstraint: true })
&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;CREATE TABLE IF NOT EXISTS `main_dashboard` (`title` VARCHAR(255), `id` INTEGER NOT NULL auto_increment , `idClient` INTEGER, PRIMARY KEY (`id`)) ENGINE=InnoDB;
CREATE TABLE IF NOT EXISTS `main_client` (`id` INTEGER NOT NULL auto_increment,  `clientId` INTEGER, PRIMARY KEY (`id`)) ENGINE=InnoDB;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;code&gt;clientId&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;main_client&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;idClient&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;17&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;에 추가됩니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;main_dashboard&lt;/code&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;18&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;당신은 약간 혼란스러워 하는 것 같습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;hasOne&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;19&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;메소드가 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;전화할 때마다&lt;/font&gt;&lt;/font&gt;&lt;code&gt;hasOne&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 class=&quot;papago-parent&quot;&gt;당신이 찾는 방법은&lt;/font&gt;&lt;/font&gt;&lt;code&gt;belongsTo&lt;/code&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;MainClient.hasOne(MainDashboard, { foreignKey: 'clientId' })
MainDashboard.belongsTo(MainClient, { foreignKey: 'clientId' })
&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&gt;&lt;/font&gt;&lt;code&gt;clientId&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;23&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;현장에.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;main_dashboard&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&gt;&lt;/font&gt;&lt;code&gt;id&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;25&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;야전의&lt;/font&gt;&lt;/font&gt;&lt;code&gt;main_client&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;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;27&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;요컨대&lt;/font&gt;&lt;/font&gt;&lt;code&gt;belongsTo&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&gt;&lt;/font&gt;&lt;code&gt;hasOne&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;29&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;인수로 주어진 테이블에 추가합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p 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;const MainDashboard = this.sequelize.define('main_dashboard', {/* attributes */}),
      MainClient    = this.sequelize.define('main_client', {/* attributes */});

MainDashboard.belongsTo(MainClient, { foreignKey: 'clientId' }); // Adds clientId to MainDashboard
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;31&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것을 외국 키로 연결할 것이고 당신은 그것을 연관으로 사용할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;제가 부족한 게 있으면 알려주세요.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;32&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/14169655/sequelize-js-foreign-key&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>mysql</category>
      <author>lovecheck</author>
      <guid isPermaLink="true">https://lovecheck.tistory.com/939</guid>
      <comments>https://lovecheck.tistory.com/939#entry939comment</comments>
      <pubDate>Thu, 19 Oct 2023 22:25:41 +0900</pubDate>
    </item>
    <item>
      <title>레거시 API를 사용하여 MySQL 쿼리가 성공했는지 확인하는 방법은?</title>
      <link>https://lovecheck.tistory.com/938</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;레거시 API를 사용하여 MySQL 쿼리가 성공했는지 확인하는 방법은?&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용하지 않고 MySQL 쿼리가 성공했는지 확인하려면 어떻게 해야 합니까?&lt;/font&gt;&lt;/font&gt;&lt;code&gt;die()&lt;/code&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 성취하려고 노력중입니다...&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;mysql_query($query);

if(success){
//move file
}
else if(fail){
//display error
}
&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;$result = mysql_query('SELECT * WHERE 1=1');
if (!$result) {
    die('Invalid query: ' . mysql_error());
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;만약 당신이 다른 것을 사용하고 싶다면&lt;/font&gt;&lt;/font&gt;&lt;code&gt;die&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;, 그럼 제안하고 싶습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;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;$result = mysql_query($query);

if(mysql_errno()){
    echo &quot;MySQL error &quot;.mysql_errno().&quot;: &quot;
         .mysql_error().&quot;\n&amp;lt;br&amp;gt;When executing &amp;lt;br&amp;gt;\n$query\n&amp;lt;br&amp;gt;&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;쿼리에 실패하면 FALSE 리턴 값을 받게 됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그렇지 않으면 리소스/TRUE를 받게 됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$result = mysql_query($query);

if(!$result){
    /* check for error, die, etc */
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;기본적으로 거짓만 아니라면 당신은 괜찮습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그런 다음 코드를 계속할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;if(!$result)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;코드의 이 부분은 실제로 쿼리를 실행합니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;code&gt;mysql_query&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;10&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;함수는 php에서 mysql 쿼리를 실행하는 데 사용됩니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;mysql_query&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;쿼리 실행이 실패하면 false를 반환합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;또는 사용해 볼 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;mysql_error()&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;$result=mysql_query($sql)
&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;die(mysql_error());
&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;위 코드 조각에서 쿼리 실행이 실패하면 실행을 종료하고 sql 쿼리 실행 중에 mysql 오류를 표시합니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음만 입력합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;or die(mysqli_error());&lt;/code&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;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;echo&lt;/code&gt; &lt;/p&gt; 
&lt;p papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;예&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;// &quot;Your Query&quot; means you can put &quot;Select/Update/Delete/Set&quot; queries here
$qfetch = mysqli_fetch_assoc(mysqli_query(&quot;your query&quot;)) or die(mysqli_error()); 



    if (mysqli_errno()) {
        echo 'error' . mysqli_error();
        die();
    }
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;19&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용하는 경우&lt;/font&gt;&lt;/font&gt;&lt;code&gt;MySQLi&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;20&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;bind_parametry 이 줄을 쿼리 위에 놓습니다.&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;21&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/11918797/how-to-check-if-a-mysql-query-using-the-legacy-api-was-successful&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>mysql</category>
      <author>lovecheck</author>
      <guid isPermaLink="true">https://lovecheck.tistory.com/938</guid>
      <comments>https://lovecheck.tistory.com/938#entry938comment</comments>
      <pubDate>Thu, 19 Oct 2023 22:25:34 +0900</pubDate>
    </item>
    <item>
      <title>조건이 null인 경우 기본값으로 행 추가</title>
      <link>https://lovecheck.tistory.com/937</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;조건이 null인 경우 기본값으로 행 추가&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;일부 필드가 null이면 기본값으로 행을 추가해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음 SELECT 조항을 상상해 보십시오.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;SELECT date, id, name, COALESCE(value1, -1), COALESCE(value2, -1), 
COALESCE(value3, -1) 
FROM (SELECT DATE(&quot;startDate&quot; + INTERVAL(seq_ref.seq - 1) MONTH) AS month_ref 
FROM (SELECT seq FROM seq_1_to_36) seq_ref, table) table
WHERE...
&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;date        id   name       value1 value2 value3
2016-01-01  1    TEST LEFT  12     14     22
2016-01-01  1    TEST RIGHT 32     11     74
2016-02-01  1    null       -1     -1     -1
2016-03-01  1    TEST LEFT  09     66     33
2016-03-01  1    TEST RIGHT 13     41     20
&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;그러나 일부 월에 데이터가 없는 경우 값에 대해 -1을 반환합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;데이터가 없으면 id와 name 기본값으로 두 행을 추가하는 방법이 있는지 알고 싶습니다.&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;예: on&lt;/font&gt;&lt;/font&gt;&lt;code&gt;2016-02-01&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;제가 한 줄을 보여드릴 수 있을 것 같습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;TEST LEFT&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;-1에서 값 및&lt;/font&gt;&lt;/font&gt;&lt;code&gt;TEST RIGHT&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;값에 -1을 적용합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;9-0&quot;&gt;편집&lt;/strong&gt;: 결과는 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;date        id   name       value1 value2 value3
2016-01-01  1    TEST LEFT  12     14     22
2016-01-01  1    TEST RIGHT 32     11     74
2016-02-01  1    TEST LEFT  -1     -1     -1
2016-02-01  1    TEST RIGHT -1     -1     -1
2016-03-01  1    TEST LEFT  09     66     33
2016-03-01  1    TEST RIGHT 13     41     20
&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;IFNULL() 기능을 사용할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;IFNULL(식, 값)은 식이 null인지 확인하고 null이면 value parameter로 대체합니다. 아마 다음과 같은 작업을 수행할 수 있을 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;    SELECT date, id, name, IFNULL(value1, -1), IFNULL(value2, -1), 
IFNULL(value3, -1) 
FROM (SELECT DATE(&quot;startDate&quot; + INTERVAL(seq_ref.seq - 1) MONTH) AS month_ref 
FROM (SELECT seq FROM seq_1_to_36) seq_ref, table) table
WHERE...
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;도움이 되길 바랍니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;13&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/50817899/adding-rows-with-default-values-if-condition-is-null&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>mariaDB</category>
      <author>lovecheck</author>
      <guid isPermaLink="true">https://lovecheck.tistory.com/937</guid>
      <comments>https://lovecheck.tistory.com/937#entry937comment</comments>
      <pubDate>Thu, 19 Oct 2023 22:25:27 +0900</pubDate>
    </item>
    <item>
      <title>일반 자바스크립트 jQuery.param()과 동등한 jQuery.param()</title>
      <link>https://lovecheck.tistory.com/936</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;일반 자바스크립트 jQuery.param()과 동등한 jQuery.param()&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;http://api.jquery.com/jquery.param/&quot; rel=&quot;noreferrer&quot; title=&quot;jQuery.param()&quot; papago-id=&quot;1-0&quot; papago-attr-id=&quot;2&quot;&gt;jQuery.param()&lt;/a&gt;은 키-값 쌍의 배열을 가져와 HTML 요청에서 쿼리 문자열로 사용할 수 있는 문자열로 바꿉니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를들면,&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;a = {
      userid:1,
      gender:male
    }
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;로 전환될 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;userid=1&amp;amp;gender=male
&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;서버측의 외부 API를 Google Apps 스크립트로 호출하려고 하는데 긴 쿼리 문자열이 필요합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;jQuery param 기능을 사용하고 싶은데 구글에서 서버 쪽에서 jQuery를 사용하는 방법이 쉽지 않은 것 같습니다.&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;동일한 기능을 달성하는 평이한 자바스크립트 코드를 주실 수 있나요?&lt;/font&gt;&lt;/strong&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;jQuery 구현이 &lt;a href=&quot;https://github.com/jquery/jquery/blob/2e10af143b7eafb7142524f6534a62aee1910bd1/src/ajax.js#L507&quot; rel=&quot;noreferrer&quot; papago-id=&quot;5-1&quot;&gt;여기&lt;/a&gt;에 있지만, 단순히 복사해서 '전통적'을 다루는 코드를 뜯어냄으로써 중요한 세부사항을 건너뛸 위험을 감수하고 싶지 않습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;순수 자바스크립트로도 가능하지만, 코드 라인을 더 많이 작성해야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;시도해 보기:&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;테스트용 HTML 코드:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;p id=&quot;test&quot;&amp;gt;&amp;lt;/p&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;로드 시 실행할 자바스크립트:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;a = {
      userid:1,
      gender: &quot;male&quot;,
    }

url = Object.keys(a).map(function(k) {
    return encodeURIComponent(k) + '=' + encodeURIComponent(a[k])
}).join('&amp;amp;')

document.getElementById(&quot;test&quot;).innerHTML=url
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;결과는 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;userid=1&amp;amp;gender=male
&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;JSFIDDLE에서 사용해보실 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;NET, 작동합니다. 링크는 다음과 같습니다. http://jsfiddle.net/ert93wbp/&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;중첩된 객체와 배열을 변환할 수 있는 ES6 버전은 다음과 같이 사용됩니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;encodeURI(getUrlString({a: 1, b: [true, 12.3, &quot;string&quot;]}))&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;getUrlString (params, keys = [], isArray = false) {
  const p = Object.keys(params).map(key =&amp;gt; {
    let val = params[key]

    if (&quot;[object Object]&quot; === Object.prototype.toString.call(val) || Array.isArray(val)) {
      if (Array.isArray(params)) {
        keys.push(&quot;&quot;)
      } else {
        keys.push(key)
      }
      return getUrlString(val, keys, Array.isArray(val))
    } else {
      let tKey = key

      if (keys.length &amp;gt; 0) {
        const tKeys = isArray ? keys : [...keys, key]
        tKey = tKeys.reduce((str, k) =&amp;gt; { return &quot;&quot; === str ? k : `${str}[${k}]` }, &quot;&quot;)
      }
      if (isArray) {
        return `${ tKey }[]=${ val }`
      } else {
        return `${ tKey }=${ val }`
      }

    }
  }).join('&amp;amp;')

  keys.pop()
  return p
}
&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;이를 통해 1차 레벨의 어레이/objects을 지원합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;const param = obj =&amp;gt; Object.entries(obj).map(
    pair =&amp;gt; Array.isArray(pair[1]) ?
        pair[1].map(x=&amp;gt;`${encodeURIComponent(pair[0])}[]=${encodeURIComponent(x)}`).join('&amp;amp;') :
        typeof pair[1] === 'object' ? 
        Object.entries(pair[1]).map(x=&amp;gt;`${encodeURIComponent(pair[0])}[${x[0]}]=${encodeURIComponent(x[1])}`).join('&amp;amp;') :
        pair.map(encodeURIComponent).join('=')).join('&amp;amp;')
&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;param({a:1,b:'b'})
&quot;a=1&amp;amp;b=b&quot;

param({a:1,b:2,c:[1,2],d:{e:'abc',f:4}});
&quot;a=1&amp;amp;b=2&amp;amp;c[]=1&amp;amp;c[]=2&amp;amp;d[e]=abc&amp;amp;d[f]=4&quot;

param({a:1,b:2,c:[1,2,'&quot;'],d:{e:'a&quot;b[c]',f:4}});
&quot;a=1&amp;amp;b=2&amp;amp;c[]=1&amp;amp;c[]=2&amp;amp;c[]=%22&amp;amp;d[e]=a%22b%5Bc%5D&amp;amp;d[f]=4&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;16&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 2단계(nesting)에서는 실패합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;param({a:1,b:{c:[1,2]}});
&quot;a=1&amp;amp;b[c]=1%2C2&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;업데이트:&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;18&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;IE11 지원이 필요하지 않다면 사용하시기 바랍니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;URLSearchParams&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;API. 이 &lt;a href=&quot;https://stackoverflow.com/a/48327251/3356679&quot; papago-id=&quot;3-1&quot;&gt;답변&lt;/a&gt; 보기&lt;/font&gt;&lt;/font&gt;&lt;code&gt;error&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;function urlString(params)
{
    if (!params)
        return '';
    const urlParams = new URLSearchParams();
    for (const [name, value] of Object.entries(params))
        urlParams.append(name, value || '');
    return urlParams.toString();
};
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;21&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;@아마인넛의 대답은 굉장합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;하지만 저는 단순화를 좀 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;const obj = {
  userid: 1,
  gender: 'male'
}

const params = Object.keys(obj).map((k) =&amp;gt; encodeURIComponent(k) + '=' + encodeURIComponent(obj[k])).join('&amp;amp;')
&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;또는 es6 모듈을 사용하여 모듈화할 수 있습니다.&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;util.js&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;export default {
  params (obj) {
    return Object.keys(obj).map((k) =&amp;gt; encodeURIComponent(k) + '=' + encodeURIComponent(obj[k])).join('&amp;amp;')
  }
}
&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;import util from './util'

const q = {
  userid: 1,
  gender: 'male'
}

const query = util.params(q)

console.log(query)
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;ES6 gives us some nice primitives:

    // Function that parses an object of string key/value params to build up
    // a string of url params
    // requires an object with no nested values
    export function parseUrlParams(urlParams) {
        const joinByEquals = (pair) =&amp;gt; pair.join('=')
        const params = Object.entries(urlParams).map(joinByEquals).join('&amp;amp;')
        if (params) {
            return `?${params}`
        } else {
        return ''
        }
    }
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;25&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;여기에서 실제로 보기: https://www.webpackbin.com/bins/-KnpOI6hb1AzTDpN3wS7&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;font class=&quot;papago-parent&quot;&gt;여기서 어떤 솔루션도 JQuery와 동등한 JSON 개체에 대한 실제 &quot;x-www-form-urlencoded&quot; 데이터를 생성하는 데 실제로 작동하지 않는 것으로 보입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;일부는 근접했지만 하위 항목에서 실패했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;JSON 개체에 대한 작업 버전을 얻기 위해 몇 가지 솔루션에서 코드를 추출했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;function formData (obj) {
  return Object.keys(obj).map((k) =&amp;gt; encodeURIComponent(k) + '=' + encodeURIComponent(JSON.stringify(obj[k]))).join('&amp;amp;')
}
&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;참고로 2020년에는 x-www-form-urlencoded 데이터만 받아들이기 때문에 FyI는 FastSpring의 API에 이를 사용해야 했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;거의 10년 만에 API가 JSON만 받아들이지 않은 것은 이번이 처음이기 때문에 하루 종일 이 문제에 몰두했습니다 :(&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;28&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;여기 최신 버전이 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;URLSearchParams&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; @oriadam / @error변,원:&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-js prettyprint-override&quot;&gt;&lt;code&gt;const urlString = (data) =&amp;gt; {
    if (data == null) { return &quot;&quot;; }
    
    const urlParams = new URLSearchParams();
    const rbracket = /\[\]$/;

    const add = (name, valueOrFunction) =&amp;gt; {
        const value = typeof valueOrFunction === &quot;function&quot; ? valueOrFunction() : valueOrFunction;
        urlParams.append(name, value == null ? &quot;&quot; : value);
    };

    const buildParams = (prefix, obj) =&amp;gt; {
        if (Array.isArray(obj)) {
            obj.forEach((value, index) =&amp;gt; {
                if (rbracket.test(prefix)) {
                    add(prefix, value);
                } else {
                    const i = typeof value === &quot;object&quot; &amp;amp;&amp;amp; value != null ? index : &quot;&quot;;
                    buildParams(`${prefix}[${i}]`, value);
                }
            });
        } else if (typeof obj === &quot;object&quot; &amp;amp;&amp;amp; obj != null) {
            for (const [name, value] of Object.entries(obj)) {
                buildParams(`${prefix}[${name}]`, value);
            }
        } else {
            add(prefix, obj);
        }
    };

    if (Array.isArray(data) || data instanceof NodeList) {
        // If an array or NodeList was passed in, 
        // assume that it is a collection of form elements:
        data.forEach(el =&amp;gt; add(el.name, el.value));
    } else {
        for (const [name, value] of Object.entries(data)) { 
            buildParams(name, value);
        }
    }

    return urlParams.toString();
};
&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;a href=&quot;https://github.com/jquery/jquery/blob/main/src/serialize.js&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;7-1&quot;&gt;jQuery 3.5.1 소스&lt;/a&gt;를 기반으로 하므로 다음과 동일한 출력을 생성해야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;$.param&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 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;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;%20&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;10&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;34&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://github.com/jquery/jquery/blob/main/test/unit/serialize.js&quot; papago-id=&quot;34-3&quot; rel=&quot;nofollow noreferrer&quot;&gt;저는 jQuery&lt;/a&gt; 테스트 &lt;a href=&quot;https://github.com/jquery/jquery/blob/main/test/unit/serialize.js&quot; papago-id=&quot;34-3&quot; rel=&quot;nofollow noreferrer&quot;&gt;케이스&lt;/a&gt;를 사용하여 &lt;a href=&quot;https://jsfiddle.net/RichardD/kx7q1y3b/&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;34-1&quot;&gt;Fiddle&lt;/a&gt;을 제공했는데, 모두 통과했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;hr&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;11-0&quot;&gt;편집:&lt;/strong&gt; 지원되지 않는 환경을 지원해야 하는 경우&lt;/font&gt;&lt;/font&gt;&lt;code&gt;URLSearchParams&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;12&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;클래스, 당신은 배열을 조합하여 사용해야 할 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;encodeURIComponent&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;다른 답변과 같이 method:&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-js prettyprint-override&quot;&gt;&lt;code&gt;const urlString = (data) =&amp;gt; {
    if (data == null) { return &quot;&quot;; }
    
    const urlParams = [];
    const rbracket = /\[\]$/;

    const add = (name, valueOrFunction) =&amp;gt; {
        let value = typeof valueOrFunction === &quot;function&quot; ? valueOrFunction() : valueOrFunction;
        if (value == null) { value = &quot;&quot;; }

        urlParams.push(`${encodeURIComponent(name)}=${encodeURIComponent(value)}`);
    };

    const buildParams = (prefix, obj) =&amp;gt; {
        if (Array.isArray(obj)) {
            obj.forEach((value, index) =&amp;gt; {
                if (rbracket.test(prefix)) {
                    add(prefix, value);
                } else {
                    const i = typeof value === &quot;object&quot; &amp;amp;&amp;amp; value != null ? index : &quot;&quot;;
                    buildParams(`${prefix}[${i}]`, value);
                }
            });
        } else if (typeof obj === &quot;object&quot; &amp;amp;&amp;amp; obj != null) {
            for (const [name, value] of Object.entries(obj)) {
                buildParams(`${prefix}[${name}]`, value);
            }
        } else {
            add(prefix, obj);
        }
    };

    if (Array.isArray(data)) {
        // If an array was passed in, 
        // assume that it is a collection of form elements:
        data.forEach(el =&amp;gt; add(el.name, el.value));
    } else {
        for (const [name, value] of Object.entries(data)) { 
            buildParams(name, value);
        }
    }

    return urlParams.join(&quot;&amp;amp;&quot;);
};
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;a href=&quot;https://jsfiddle.net/RichardD/kx7q1y3b/1/&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;38&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;업데이트된 테스트 Fiddle&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;pre class=&quot;lang-js prettyprint-override&quot;&gt;&lt;code&gt;export function param( params ) {
    const p = new URLSearchParams;
    for( const [ key, value ] of Object.entries( params ) ) {
        p.set( key, String( value ) );
    }
    return p.toString();
}
&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;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/25224887/plain-javascript-equivalent-of-jquery-param&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>AJAX</category>
      <author>lovecheck</author>
      <guid isPermaLink="true">https://lovecheck.tistory.com/936</guid>
      <comments>https://lovecheck.tistory.com/936#entry936comment</comments>
      <pubDate>Thu, 19 Oct 2023 22:25:20 +0900</pubDate>
    </item>
    <item>
      <title>BLOB Oracle 10g에 이미지 삽입</title>
      <link>https://lovecheck.tistory.com/935</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;BLOB Oracle 10g에 이미지 삽입&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;BLOB 필드에 이미지를 삽입하려고 하는데 테이블에서 선택하여 보고서에 렌더링할 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;어떻게 이미지를 테이블에 넣는지 알 수가 없습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 제가 삽입을 했는데, 제가 렌더링할 때는 이미지 자체가 아니라 이미지 경로만 보고서에 나와 있었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;테이블&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;CREATE TABLE esignatures (
  office   NUMBER(6,0)  NOT NULL,
  username VARCHAR2(10) NOT NULL,
  iblob    BLOB         NOT NULL
)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;INSERT 문(SQL)&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;INSERT INTO esignatures  
VALUES (100, 'BOB', utl_raw.cast_to_raw('C:\pictures\image1.png'));
&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;String 위치를 HEX 값 형태로 삽입하는 것을 확실히 알고 있습니다. 어떻게 하면 테이블에서 이미지 HEX 값을 얻을 수 있을까요? 그래서 렌더링할 때 이미지가 표시되는 것을 볼 수 있습니다.&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;pl/sql에서 로컬 디렉토리에 액세스할 수 없습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;bfile을 사용하면 Oracle이 실행 중인 서버에 이미지를 넣어야 하는 디렉토리(&lt;a href=&quot;http://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_5007.htm#SQLRF01207&quot; rel=&quot;noreferrer&quot; papago-id=&quot;5-1&quot;&gt;create directory&lt;/a&gt;)를 설정합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;로컬 컴퓨터에서 몇 개의 이미지를 삽입하려면 클라이언트 사이드 앱이 있어야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;당신이 직접 쓰실 수 있지만, 저는 보통 Toad를 사용합니다.&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;BLOB 열을 두 번 클릭하면 마법사가 열립니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;맨 왼쪽 아이콘이 이미지를 블롭에 로드합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;img src=&quot;https://i.stack.imgur.com/Rxsf7.png&quot; alt=&quot;enter image description here&quot;&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;SQL 개발자도 비슷한 기능을 가지고 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;아래 &quot;Load&quot; 링크 참조:&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;img src=&quot;https://i.stack.imgur.com/jMUd2.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;이미지를 선 위로 끌어내야 할 경우 pl/sql을 사용하여 수행할 수 있지만 단순하지는 않습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;먼저 사용자가 와이어를 풀오버할 수 있도록(보안상의 이유로) ACL 목록 액세스를 설정해야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;ACL 설정에 대한 자세한 내용은 이 &lt;a href=&quot;http://www.oracle-base.com/articles/11g/fine-grained-access-to-network-services-11gr1.php&quot; rel=&quot;noreferrer&quot; papago-id=&quot;8-1&quot;&gt;문서&lt;/a&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;ACL이 완료되었다고 가정하면 다음과 같이 이미지를 당깁니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;declare
    l_url varchar2(4000) := 'http://www.oracleimg.com/us/assets/12_c_navbnr.jpg';
    l_http_request   UTL_HTTP.req;
    l_http_response  UTL_HTTP.resp;
    l_raw RAW(2000);
    l_blob BLOB;
begin
   -- Important: setup ACL access list first!

    DBMS_LOB.createtemporary(l_blob, FALSE);

    l_http_request  := UTL_HTTP.begin_request(l_url);
    l_http_response := UTL_HTTP.get_response(l_http_request);

  -- Copy the response into the BLOB.
  BEGIN
    LOOP
      UTL_HTTP.read_raw(l_http_response, l_raw, 2000);
      DBMS_LOB.writeappend (l_blob, UTL_RAW.length(l_raw), l_raw);
    END LOOP;
  EXCEPTION
    WHEN UTL_HTTP.end_of_body THEN
      UTL_HTTP.end_response(l_http_response);
  END;

  insert into my_pics (pic_id, pic) values (102, l_blob);
  commit;

  DBMS_LOB.freetemporary(l_blob); 
end;
&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;/p&gt; 
&lt;p papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;1) 디렉토리 개체 만들기서버측 액세스 가능 폴더를 가리킬 대상&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;CREATE DIRECTORY image_files AS '/data/images'
/
&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;2) OS 폴더 디렉터리 개체 지점에 파일 배치&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;3) 파일에서 테이블로 데이터를 로드할 Oracle 스키마에 필요한 액세스 권한을 부여합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;GRANT READ ON DIRECTORY image_files TO scott
/
&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;4) 아래와 같이 BFILENAME, EXHIT_BLOB 기능 및 DBMS_LOB 패키지(테스트되지 않은 예 - 주의)를 사용합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;DECLARE
  l_blob BLOB; 
  v_src_loc  BFILE := BFILENAME('IMAGE_FILES', 'myimage.png');
  v_amount   INTEGER;
BEGIN
  INSERT INTO esignatures  
  VALUES (100, 'BOB', empty_blob()) RETURN iblob INTO l_blob; 
  DBMS_LOB.OPEN(v_src_loc, DBMS_LOB.LOB_READONLY);
  v_amount := DBMS_LOB.GETLENGTH(v_src_loc);
  DBMS_LOB.LOADFROMFILE(l_blob, v_src_loc, v_amount);
  DBMS_LOB.CLOSE(v_src_loc);
  COMMIT;
END;
/
&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;이 후에는 파일의 내용을 BLOB 열로 가져올 수 있으며 예를 들어 Java를 사용하여 파일을 다시 가져올 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;edit: 한 글자가 누락되었습니다. LOADFROMFILE이어야 합니다.&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/21855935/inserting-image-into-blob-oracle-10g&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>oracle</category>
      <author>lovecheck</author>
      <guid isPermaLink="true">https://lovecheck.tistory.com/935</guid>
      <comments>https://lovecheck.tistory.com/935#entry935comment</comments>
      <pubDate>Thu, 19 Oct 2023 22:25:10 +0900</pubDate>
    </item>
    <item>
      <title>Android 에뮬레이터에서 화면 방향을 변경하려면 어떻게 해야 합니까?</title>
      <link>https://lovecheck.tistory.com/934</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Android 에뮬레이터에서 화면 방향을 변경하려면 어떻게 해야 합니까?&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;kbd papago-id=&quot;2-0&quot;&gt;Ctrl&lt;/kbd&gt;+&lt;kbd papago-id=&quot;2-0&quot;&gt;Ctrl&lt;/kbd&gt;키보드&lt;kbd papago-id=&quot;2-2&quot;&gt;F12&lt;/kbd&gt; 바로가기 입니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;strong papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;안드로이드 에뮬레이터 바로가기&lt;/font&gt;&lt;/strong&gt; &lt;/p&gt; 
&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;kbd papago-id=&quot;4-0&quot;&gt;Ctrl+F11&lt;/kbd&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;kbd papago-id=&quot;5-0&quot;&gt;Ctrl+F12&lt;/kbd&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;1. 주 장치 키&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;홈 홈 버튼&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;kbd papago-id=&quot;8-0&quot;&gt;F2&lt;/kbd&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;kbd papago-id=&quot;9-0&quot;&gt;Shift+f2&lt;/kbd&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;kbd papago-id=&quot;10-0&quot;&gt;Esc&lt;/kbd&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;kbd papago-id=&quot;11-0&quot;&gt;F3&lt;/kbd&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;kbd papago-id=&quot;12-0&quot;&gt;F4&lt;/kbd&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;kbd papago-id=&quot;13-0&quot;&gt;F5&lt;/kbd&gt; 검색 버튼&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;2. 기타 장치 키&lt;/font&gt;&lt;/strong&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;kbd papago-id=&quot;15-0&quot;&gt;Ctrl+F5&lt;/kbd&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;kbd papago-id=&quot;16-0&quot;&gt;Ctrl+F11&lt;/kbd&gt; 배치 방향을 뒤로 전환합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;kbd papago-id=&quot;17-0&quot;&gt;Ctrl+F12&lt;/kbd&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;kbd papago-id=&quot;18-0&quot;&gt;F8&lt;/kbd&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;kbd papago-id=&quot;19-0&quot;&gt;F9&lt;/kbd&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;kbd papago-id=&quot;20-0&quot;&gt;Alt+Enter&lt;/kbd&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;&lt;kbd papago-id=&quot;21-0&quot;&gt;F6&lt;/kbd&gt; 트랙볼 모드 전환&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;22&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;볼륨을 조정하지 않는 성가신 Apple MacBook 키보드 레이아웃의 경우 + +를 사용합니다.&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;Num on keypad로 해주세요.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그것은 비울 때만 작동한다는 것을 기억하세요.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;24&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;kbd papago-id=&quot;24-0&quot;&gt;ctrl&lt;/kbd&gt;+&lt;kbd papago-id=&quot;24-2&quot;&gt;fn&lt;/kbd&gt;&lt;kbd papago-id=&quot;24-0&quot;&gt;ctrl&lt;/kbd&gt;풍경을&lt;kbd papago-id=&quot;24-2&quot;&gt;fn&lt;/kbd&gt;&lt;kbd papago-id=&quot;24-4&quot;&gt;F11&lt;/kbd&gt; 초상화로 바꾸거나 그 반대의 경우도 마찬가지입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;25&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;kbd papago-id=&quot;25-0&quot;&gt;left-ctrl&lt;/kbd&gt;+&lt;kbd papago-id=&quot;25-2&quot;&gt;F11&lt;/kbd&gt; Windows 7(윈도우 7)에서.&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;kbd papago-id=&quot;26-0&quot;&gt;ctrl&lt;/kbd&gt;+&lt;kbd papago-id=&quot;26-2&quot;&gt;F11&lt;/kbd&gt; Linux에서.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;27&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;+ &lt;kbd papago-id=&quot;27-2&quot;&gt;F11&lt;/kbd&gt;&lt;kbd papago-id=&quot;27-0&quot;&gt;Ctrl&lt;/kbd&gt; + 둘&lt;kbd papago-id=&quot;27-2&quot;&gt;F11&lt;/kbd&gt; 다 작동합니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;28&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또한 에뮬레이터에서 자동 회전 설정을 확인해야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 설정이 꺼져 있으면 회전 버튼을 누르는 것 외에는 방향을 변경할 수 없기 때문입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음 사진에서 당신이 어떻게 이것을 할 수 있는지 보여드리겠습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://i.stack.imgur.com/w8e2u.png&quot; rel=&quot;noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/w8e2u.png&quot; alt=&quot;Activate Autorotate Setting&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p papago-id=&quot;29&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Ubuntu에서는 (+/&lt;kbd papago-id=&quot;29-1&quot;&gt;Ctrl&lt;/kbd&gt;&lt;kbd papago-id=&quot;29-3&quot;&gt;F11&lt;/kbd&gt;&lt;kbd papago-id=&quot;29-5&quot;&gt;F12&lt;/kbd&gt; 또는 /)&lt;kbd papago-id=&quot;29-9&quot;&gt;numpad 9&lt;/kbd&gt; 키 중 어느 것도 제게 맞지 않았습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;하지만 &lt;strong papago-id=&quot;29-11&quot;&gt;나&lt;/strong&gt;는 xdotool로 키를 보내는 에뮬레이터를 회전시킬 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;30&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를 들어 &quot;Galaxy_Nexus&quot;라는 VM의 경우 다음을 통해 에뮬레이터를 회전할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;xdotool search --name &quot;Galaxy&quot; key &quot;ctrl_L+F11&quot;
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;31&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;+ &lt;kbd papago-id=&quot;31-0&quot;&gt;Ctrl&lt;/kbd&gt; &lt;a href=&quot;http://en.wikipedia.org/wiki/Ubuntu_%28operating_system%29&quot; rel=&quot;nofollow&quot; papago-id=&quot;31-8&quot;&gt;Ubuntu&lt;/a&gt; 상자에서는 작동하지 않지만 +는 작동합니다.&lt;kbd papago-id=&quot;31-2&quot;&gt;F11&lt;/kbd&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;Mac의 경우 다음을 사용합니다.&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;kbd papago-id=&quot;33-0&quot;&gt;Ctrl&lt;/kbd&gt; + &lt;kbd papago-id=&quot;33-2&quot;&gt;FN&lt;/kbd&gt; + &lt;kbd papago-id=&quot;33-4&quot;&gt;F11&lt;/kbd&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;34&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;​​​​&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;35&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;더 이상 단축키를 기억할 필요가 없습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;최신 Android AVD 인터페이스에는 다양한 기능 바로가기가 포함된 사이드바가 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;화면을 시계 반대 방향으로 회전하는 버튼을 파란색으로 동그라미 쳐놨습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://i.stack.imgur.com/W4cm3.png&quot; rel=&quot;noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/W4cm3.png&quot; alt=&quot;enter image description here&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;0&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; Ubuntu Release 12.04 () 64&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;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;DELL Latitude E6320&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;38&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;+ &lt;kbd papago-id=&quot;38-0&quot;&gt;CTRL&lt;/kbd&gt; (두 번 탭 )&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;39&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Fn + 7은 숫자 키패드가 메인 키패드와 병합되는 키보드용 솔루션입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;여기서 7(및 &amp;amp;)이 있는 키는 파란색 7이 있는 키입니다.&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;kbd papago-id=&quot;41-0&quot;&gt;Ctrl&lt;/kbd&gt;+배치 방향을 뒤로 &lt;kbd papago-id=&quot;41-0&quot;&gt;Ctrl&lt;/kbd&gt;전환합니다&lt;kbd papago-id=&quot;41-2&quot;&gt;F11&lt;/kbd&gt;.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;42&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Ctrl+F12 레이아웃 방향 전환 세로/가로 방향 전환&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li papago-id=&quot;43&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;주 장치 키&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p papago-id=&quot;44&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;kbd papago-id=&quot;44-0&quot;&gt;Home&lt;/kbd&gt; 홈 버튼&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;45&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;kbd papago-id=&quot;45-0&quot;&gt;F2&lt;/kbd&gt; 왼쪽 소프트키 / 메뉴 / 설정 버튼( 또는 )&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;46&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;kbd papago-id=&quot;46-0&quot;&gt;Shift&lt;/kbd&gt;+&lt;kbd papago-id=&quot;46-0&quot;&gt;Shift&lt;/kbd&gt;오른쪽&lt;kbd papago-id=&quot;46-2&quot;&gt;F2&lt;/kbd&gt; 소프트키 / 별 버튼( 또는 )&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;47&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;kbd papago-id=&quot;47-0&quot;&gt;Esc&lt;/kbd&gt; 뒤로 단추&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;48&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;kbd papago-id=&quot;48-0&quot;&gt;F3&lt;/kbd&gt; 통화/전화걸기&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;49&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;kbd papago-id=&quot;49-0&quot;&gt;F4&lt;/kbd&gt; 전화 끊기/통화 종료 버튼&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;50&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;kbd papago-id=&quot;50-0&quot;&gt;F5&lt;/kbd&gt; 검색 버튼&lt;/font&gt;&lt;/p&gt; 
&lt;ol start=&quot;2&quot;&gt; 
 &lt;li papago-id=&quot;51&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;기타 장치 키&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p papago-id=&quot;52&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;kbd papago-id=&quot;52-0&quot;&gt;Ctrl&lt;/kbd&gt;+&lt;kbd papago-id=&quot;52-0&quot;&gt;Ctrl&lt;/kbd&gt;볼륨&lt;kbd papago-id=&quot;52-2&quot;&gt;F5&lt;/kbd&gt; 상향(또는 숫자 키보드에서 숫자 잠금 해제) &lt;kbd papago-id=&quot;52-8&quot;&gt;F6&lt;/kbd&gt;+ 볼륨 하향(또는 숫자 키보드에서 숫자 잠금 해제) 전원 버튼 &lt;kbd papago-id=&quot;52-16&quot;&gt;F3&lt;/kbd&gt;+ 카메라 버튼&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;&lt;kbd papago-id=&quot;53-0&quot;&gt;Ctrl&lt;/kbd&gt;+배치 방향을 뒤로 &lt;kbd papago-id=&quot;53-0&quot;&gt;Ctrl&lt;/kbd&gt;전환합니다&lt;kbd papago-id=&quot;53-2&quot;&gt;F11&lt;/kbd&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;kbd papago-id=&quot;54-0&quot;&gt;Ctrl&lt;/kbd&gt;+&lt;kbd papago-id=&quot;54-0&quot;&gt;Ctrl&lt;/kbd&gt;배치&lt;kbd papago-id=&quot;54-2&quot;&gt;F12&lt;/kbd&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;kbd papago-id=&quot;55-0&quot;&gt;F8&lt;/kbd&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;&lt;kbd papago-id=&quot;56-0&quot;&gt;F9&lt;/kbd&gt; 코드 프로파일링 전환&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;57&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;kbd papago-id=&quot;57-0&quot;&gt;Alt&lt;/kbd&gt;+전체 화면 모드 &lt;kbd papago-id=&quot;57-0&quot;&gt;Alt&lt;/kbd&gt;전환&lt;kbd papago-id=&quot;57-2&quot;&gt;Enter&lt;/kbd&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;58&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;kbd papago-id=&quot;58-0&quot;&gt;F6&lt;/kbd&gt; 트랙볼 모드 전환&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;59&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;59-1&quot;&gt;Android Studio 4.0.1&lt;/strong&gt;에서는 에뮬레이터에 회전 버튼이 포함되어 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;60&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;아래 이미지에서 왼쪽으로 회전(바로가기: ) 버튼은 파란색으로 윤곽이 표시되고 오른쪽으로 회전(바로가기: ) 버튼은 빨간색으로 윤곽이 표시됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://i.stack.imgur.com/GXta8.png&quot; rel=&quot;nofollow noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/GXta8.png&quot; alt=&quot;Android Emulator&quot;&gt;&lt;/a&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;font class=&quot;papago-parent&quot;&gt;예를 들어 Rotate Left(왼쪽 회전)를 눌렀을 때 애플리케이션은 다음과 같이 나타납니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://i.stack.imgur.com/G9J5L.png&quot; rel=&quot;nofollow noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/G9J5L.png&quot; alt=&quot;Android Emulator Rotated Left&quot;&gt;&lt;/a&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;이 아이콘은 표시되는 데 몇 초가 걸릴 수 있으며 곧 사라집니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;또한 세로 방향으로 다시 회전할 때 아이콘이 나타나려면 반대쪽 회전 버튼을 눌러야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;즉, 왼쪽으로 회전을 눌렀다면 오른쪽으로 회전을 눌러 원래 방향으로 돌아가거나 그 반대의 경우도 마찬가지입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://i.stack.imgur.com/lNwKR.png&quot; rel=&quot;nofollow noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/lNwKR.png&quot; alt=&quot;Android Emulator Landscape&quot;&gt;&lt;/a&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;제 노트북인 Dell Latitude E4310에서 &lt;kbd papago-id=&quot;63-3&quot;&gt;F12&lt;/kbd&gt;+ 키가 작동합니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;64&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;가상 디바이스를 회전할 수 없습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;장치 목록으로 이동하여 설정을 클릭하고 미리 정의된 해상도를 변경합니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;65&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;HP 노트북의 경우 +를 사용합니다.&lt;/font&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;kbd papago-id=&quot;66-0&quot;&gt;Left Ctrl&lt;/kbd&gt;+= Windows 8용&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;67&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;지표면에서 이 작업을 수행하려면&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;68&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;kbd papago-id=&quot;68-0&quot;&gt;Ctrl&lt;/kbd&gt;+&lt;kbd papago-id=&quot;68-2&quot;&gt;Fn&lt;/kbd&gt;+&lt;kbd papago-id=&quot;68-4&quot;&gt;F12&lt;/kbd&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;69&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Android Studio 사용 시:&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;70&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Windows: &lt;kbd papago-id=&quot;70-3&quot;&gt;Left-Arrow&lt;/kbd&gt;+ 및 &lt;kbd papago-id=&quot;70-7&quot;&gt;Right-Arrow&lt;/kbd&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;kbd papago-id=&quot;71-0&quot;&gt;Super&lt;/kbd&gt;-&amp;gt;-&amp;gt;&lt;kbd papago-id=&quot;71-2&quot;&gt;Ctrl_L&lt;/kbd&gt;&lt;kbd papago-id=&quot;71-4&quot;&gt;F12&lt;/kbd&gt; 저는 페도라 23에서 일을 합니다.&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;a href=&quot;http://en.wikipedia.org/wiki/Linux_Mint&quot; rel=&quot;nofollow&quot; papago-id=&quot;72-7&quot;&gt;Linux Mint&lt;/a&gt; 17에서 작동했습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;73&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;업데이트된 에뮬레이터에서는 키보드 단축키를 기억할 필요가 없습니다. 창 오른쪽에 사이드 패널이 추가되어 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;해당 측면 패널에서 &quot;회전&quot; 버튼을 클릭하여 화면 방향을 변경할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://i.stack.imgur.com/Us5lT.png&quot; rel=&quot;nofollow noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/Us5lT.png&quot; alt=&quot;enter image description here&quot;&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;74&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;회전 버튼을 클릭하면 가로 세로로 또는 세로로 가로로 변경할 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Mac에서 도움말 보기:&lt;/font&gt;&lt;/font&gt;&lt;code&gt;⌘/&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러면 키보드 단축키가 나타납니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;오른쪽으로 회전:&lt;/font&gt;&lt;/font&gt;&lt;code&gt;⌘→&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;⌘←&lt;/code&gt;&lt;/p&gt;&lt;p papago-id=&quot;79&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;리눅스용:&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;79-1&quot;&gt;오른쪽_Ctrl &lt;/strong&gt;+ &lt;strong papago-id=&quot;79-1&quot;&gt;왼쪽_화살표&lt;/strong&gt; 또는 &lt;strong papago-id=&quot;79-3&quot;&gt;오른쪽_Ctrl &lt;/strong&gt;+ &lt;strong papago-id=&quot;79-3&quot;&gt;오른쪽_화살표&lt;/strong&gt;입니다.&lt;/font&gt;&lt;/p&gt;&lt;ol&gt; 
 &lt;li papago-id=&quot;80&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;자동 회전이 켜져 있는지 확인합니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p&gt;&lt;img src=&quot;https://i.stack.imgur.com/zO9KP.jpg&quot; alt=&quot;1&quot;&gt;&lt;/p&gt; 
&lt;ol start=&quot;2&quot;&gt; 
 &lt;li papago-id=&quot;81&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;img src=&quot;https://i.stack.imgur.com/Ab4XJ.jpg&quot; alt=&quot;2&quot;&gt;&lt;/p&gt;&lt;p papago-id=&quot;82&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Ctrl+Left&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;83&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음 문서를 참조하십시오. https://developer.android.com/studio/run/emulator.html#tasks&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://i.stack.imgur.com/8PFtF.png&quot; rel=&quot;nofollow noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/8PFtF.png&quot; alt=&quot;enter image description here&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p papago-id=&quot;84&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/1991318/how-do-i-change-screen-orientation-in-the-android-emulator&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>Android</category>
      <author>lovecheck</author>
      <guid isPermaLink="true">https://lovecheck.tistory.com/934</guid>
      <comments>https://lovecheck.tistory.com/934#entry934comment</comments>
      <pubDate>Thu, 19 Oct 2023 22:25:02 +0900</pubDate>
    </item>
    <item>
      <title>@ngrx/store로 상태 개체의 현재 값을 가져오는 방법은 무엇입니까?</title>
      <link>https://lovecheck.tistory.com/933</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;@ngrx/store로 상태 개체의 현재 값을 가져오는 방법은 무엇입니까?&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;웹 서비스를 호출하기 전에 서비스 클래스에서 다음 속성을 가져와야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;dataForUpdate&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;우리 주에서부터&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;지금은 이렇게 하고 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-js prettyprint-override&quot;&gt;&lt;code&gt;constructor(public _store: Store &amp;lt; AppState &amp;gt; ,
  public _APIService: APIService) {

  const store$ = this._store.select('StateReducer');

  .../...

  let update = this.actions$.filter(action =&amp;gt; action.type == UPDATE)
    .do((action) =&amp;gt; this._store.dispatch({
      type: REDUCER_UPDATING,
      payload: action.payload
    })) **
    * GET STATE ** *= =&amp;gt; .mergeMap(action =&amp;gt; store$.map((state: AppState) =&amp;gt; state.dataForUpdate).distinctUntilChanged(),
      (action, dataForUpdate) {
        return {
          type: action.type,
          payload: {
            employee: action.payload,
            dataForUpdate: dataForUpdate
          }
        };
      }) *
    AND CALL API *= =&amp;gt; .mergeMap(action =&amp;gt; this._APIService.updateEmployee(action.payload.employee, action.payload.dataForUpdate),
      (action, APIResult) =&amp;gt; {
        return {
          type: REDUCER_UPDATED
        }
      })
    .share();


  .../...

  let all = Observable.merge(update, ....);
  all.subscribe((action: Action) =&amp;gt; this._store.dispatch(action));

}
&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;팔로잉 가이드로 angular2-store- example(https://github.com/ngrx/angular2-store-example/blob/master/src/app/users/models/users.ts) 을 사용하고 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;더 좋은 (청소기) 방법이 있는지 궁금합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;라이브 예제: https://plnkr.co/edit/WRPfMzPolQsYNGzBUS1g?p=preview&lt;/font&gt;&lt;/p&gt;&lt;h3 papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;@ngrx/store v1.x에 대한 원래 답변&lt;/font&gt;&lt;/h3&gt; 
&lt;p&gt;&lt;code&gt;@ngrx/store&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;a href=&quot;https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/subjects/behaviorsubject.md&quot; rel=&quot;noreferrer&quot; papago-id=&quot;2-1&quot;&gt;BehaviorSubject&lt;/a&gt;를 확장하며,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;value&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;this._store.value
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그것은 당신의 앱의 현재 상태가 될 것이고, 거기서 당신은 속성, 필터, 맵 등을 선택할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;업데이트:&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;예제의 내용을 파악하는 데 시간이 좀 걸렸습니다(: 현재 가치를 파악하려면).&lt;/font&gt;&lt;/font&gt;&lt;code&gt;dataForUpdate&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;let x = this._store.value.StateReducer.dataForUpdate;
console.log(x); // =&amp;gt; { key: &quot;123&quot; }
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2 papago-id=&quot;13&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;@ngrx/store v2.x에 대한 업데이트&lt;/font&gt;&lt;/h2&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;버전 2로 업데이트가 되면서.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;value&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;a href=&quot;https://github.com/ngrx/store#getstate-getvalue-and-value&quot; rel=&quot;noreferrer&quot; papago-id=&quot;7-1&quot;&gt;문서&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;16&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Store에서 최신 상태 값을 동기적으로 꺼내기 위한 API가 제거되었습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;대신에, 당신은 항상 의지할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;subscribe()&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;/blockquote&gt; 
&lt;pre&gt;&lt;code&gt;function getState(store: Store&amp;lt;State&amp;gt;): State {
    let state: State;

    store.take(1).subscribe(s =&amp;gt; state = s);

    return state;
}
&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;@Sasxa의 답변에 따라 구문이 새로운 버전으로 변경되었습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;@nrgx/store&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;19&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(v5 및 v6).&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;기본 RxJS 라이브러리가 ^5.5.0으로 업데이트된 후, 이제 모든 파이프에서 사용 가능한 파이프 메소드가 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Observable&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;20&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;인스턴스(instance)를 사용하면 보다 쉽게 연결할 수 있고 구독을 달성하는 방법을 변경할 수 있습니다.&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;이제 다음과 같은 작업을 수행할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;import { take } from 'rxjs/operators';

function getState(store: Store&amp;lt;State&amp;gt;): State {
   let state: State;

   store.select('your-state').pipe(take(1)).subscribe(
      s =&amp;gt; state = s
   );

   return state;
}
&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&gt;&lt;/font&gt;&lt;code&gt;pipe()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;23&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;연산자:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;import { select } from '@ngrx/store';
import { take } from 'rxjs/operators';

function getState(store: Store&amp;lt;State&amp;gt;): State {
   let state: State;

   store.pipe(select('your-state'), take(1)).subscribe(
      s =&amp;gt; state = s
   );

   return state;
}
&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;import { select } from '@ngrx/store';
import { take } from 'rxjs/operators';

function async getStateAsync(store: Store&amp;lt;State&amp;gt;): State {
   let state = await store
             .pipe(
                select('your-state'),
                take(1)
             )
             .toPromise&amp;lt;State&amp;gt;();

   return state;
}
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;25&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;질문에 대한 직접적인 답변은 아니지만, 스토어에서 단일 값을 검색하는 방법을 찾는 이 페이지를 찾았습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;26&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이를 달성하기 위해, 당신은 다음을 주입할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;State&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;27&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이의를 제기함&lt;/font&gt;&lt;/font&gt;&lt;code&gt;@ngrx/store&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&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-js prettyprint-override&quot;&gt;&lt;code&gt;import { State } from '@ngrx/store';

constructor (private state: State&amp;lt;AppState&amp;gt;) {
    let propertyValue = state.getValue().path.to.state.property;
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;29&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그&lt;/font&gt;&lt;/font&gt;&lt;code&gt;state&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;30&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;개체는 현재 상태를 비공개로 유지합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;_value&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;31&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;속성, 에 의해 액세스됨&lt;/font&gt;&lt;/font&gt;&lt;code&gt;.getValue()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;32&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;방법.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;code&gt;withLatestFrom()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;33&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;아니면&lt;/font&gt;&lt;/font&gt;&lt;code&gt;combineLatest()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;34&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;서브스크립션 체인의 메소드는 필요한 것만 제공하며 Observables+Ngrx의 정신에 따라 조정됩니다.&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;GET STATE 대신&lt;/font&gt;&lt;/font&gt;&lt;code&gt;.mergeMap()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;36&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;위의 코드에서 사용하기&lt;/font&gt;&lt;/font&gt;&lt;code&gt;withLatestFrom()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;37&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음과 같은 모습일 것입니다&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;...
.withLatestFrom(store$, (payload, state) =&amp;gt; { 
    return {payload: payload, stateData: state.data} 
} )
...
&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;별도로, 원래 질문의 코드는 redux 작업의 비동기 효과를 관리하는 것으로 보이는데, 이것이 &lt;a href=&quot;https://github.com/ngrx/effects&quot; rel=&quot;noreferrer&quot; papago-id=&quot;38-1&quot;&gt;ngrx/effects&lt;/a&gt; 라이브러리의 정확한 목적입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;한번 확인해 보시기를 권합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;효과를 유선으로 연결하고 나면 비동기 감소 작업을 관리하기 위한 코드가 훨씬 더 깨끗해집니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;짐 린치의 이 기사는 저에게도 큰 도움이 되었습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://medium.com/@webWhizJim/the-basics-of-ngrx-effects-effect-and-async-middleware-for-ngrx-store-in-angular-2-f25587493329&quot; rel=&quot;noreferrer&quot; papago-id=&quot;38-3&quot;&gt;Angular 2의 &quot;ngrx/store&quot;를 위한 &quot;ngrx/effects&quot;, @Effects 및 비동기 미들웨어의 기초&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;&lt;h1 papago-id=&quot;39&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;마이 솔루션&lt;/font&gt;&lt;/h1&gt; 
&lt;hr&gt; 
&lt;p papago-id=&quot;40&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;state classing ngStore는 BehaviorSubject이므로 이를 주입하고 이 값 속성을 사용하여 최신 값을 얻을 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;constructor(private state:State&amp;lt;YourState&amp;gt;...) {

}

someMethod() {
    // WHAT'S MORE: you can use your selector directly on it!
    let v = yourSelector(this.state.value);
}
&lt;/code&gt;&lt;/pre&gt;&lt;h2 papago-id=&quot;41&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;@ngrx/store v4.x에 대한 업데이트&lt;/font&gt;&lt;/h2&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;27&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;v4.x 시점에서 우리는 어쩔 수 없이&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;take&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;28&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;작동기를 파이프에 연결하여 동기화할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;function getState(store: Store&amp;lt;State&amp;gt;): State {
    let state: State;

    store.pipe(take(1)).subscribe(s =&amp;gt; state = s);

    return state;
}

&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;그건 저한테 효과가 있어요.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;Store from '@ngrx/store'를 가져와야 하며 AppState가 상태입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;private state: AppState;

constructor(private store: Store&amp;lt;AppState&amp;gt;) { }

ngOnInit() {
    this.store.select(x =&amp;gt; this.state = x).subscribe();
}
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;45&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;댓글 하나 더.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이거 쓸 때.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;_store.value.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;StateReducer.currentPeriod.id&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;46&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;변환기 반환 &quot;app/state/stateService.ts(133,35): 오류 TS2339: 'StateReducer' 속성이 'AppState' 유형에 없습니다.&quot;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;constructor ( public _store: Store&amp;lt;AppState&amp;gt;) {

    const store$ =  this._store.select ('StateReducer');

    .../...


    let saveTransaction = this.actions$
                  .filter (action =&amp;gt; action.type==SAVE_TRANSACTION )
                  .map (action =&amp;gt; { return { type:SAVING_TRANSACTION, payload : action.payload };  } )
                  .mergeMap ( action =&amp;gt; this._transactionService.updateTransaction (
                                                            this._store.value.StateReducer.currentProfile.id, 
                                                            this._store.value.StateReducer.currentPeriod.id, 
                                                            action.payload),
                                (state, webServiceResponse) =&amp;gt;  { return { type:TRANSACTION_UPDATED, payload :null  }; }) ;





}
&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;문제를 해결하기 위해 rxjs\subject 폴더에서 BehaviorSubject.d.ts를 변경했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;import { Subject } from '../Subject';
import { Subscriber } from '../Subscriber';
import { Subscription } from '../Subscription';
export declare class BehaviorSubject&amp;lt;T&amp;gt; extends Subject&amp;lt;T&amp;gt; {
    private _value;
    private _hasError;
    private _err;
    constructor(_value: T);
    getValue(): T;        
    value: T;             &amp;lt;=== I have changed it to value: any;
    _subscribe(subscriber: Subscriber&amp;lt;any&amp;gt;): Subscription&amp;lt;T&amp;gt;;
    _next(value: T): void;
    _error(err: any): void;
}
&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;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;29&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;AppState 속성인 카운터 2개와 축소기 2개가 있는 상태의 미니멀리즘 애플리케이션을 만들었습니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;각 감속기는 특정 카운터에 연결되어 있고, 저는 각 카운터에 대해 다음과 같은 관측 가능한 것을 구독했습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;console.log&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 class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그 가치.&lt;/font&gt; &lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;가 오면 축소기 자체도 콘솔에 글을 씁니다&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;호출이 되면 축소기 자체도 콘솔에 글을 씁니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;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 class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또한 2개의 카운터가 2개의 레이블에 바인딩되므로 카운터의 변화는 다음과 같습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&amp;lt;p&amp;gt;Counter: {{counter1 | async}}&amp;lt;/p&amp;gt;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;32&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;33&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;각 카운터를 축소기에 매핑하는 작업은 다음과 같습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;StoreModule.forRoot({ counter1: Reducer1, counter2 : Reducer2 })&lt;/code&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;import { Component, NgModule } from '@angular/core';
import { Store, Action, StoreModule } from '@ngrx/store';
import { Observable } from 'rxjs/Observable';
import { BrowserModule } from '@angular/platform-browser';

interface AppState {
  counter1 : number;
  counter2 : number;
}

export function Reducer1(counter : number = 0, action : Action) {
  console.log(`Called Reducer1: counter=${counter}`);
  return counter + 1;
}

export function Reducer2(counter : number = 0, action : Action) {
  console.log(`Called Reducer2: counter=${counter}`);
  return counter + 2;
}

@Component({
  selector: 'app-root',
  template: `&amp;lt;p&amp;gt;Counter: {{counter1 | async}}&amp;lt;/p&amp;gt;
  &amp;lt;p&amp;gt;Counter: {{counter2 | async}}&amp;lt;/p&amp;gt;
  &amp;lt;button (click)='increment()'&amp;gt;Increment&amp;lt;/button&amp;gt;`
})
export class AppComponent {
  title = 'app';
  counter1 : Observable&amp;lt;number&amp;gt;;
  counter2 : Observable&amp;lt;number&amp;gt;;

  constructor(private store : Store&amp;lt;AppState&amp;gt;) {
    this.counter1 = this.store.select('counter1');
    this.counter2 = this.store.select('counter2');

    this.counter1.subscribe(x =&amp;gt; console.log(`Subscribe event for counter1 fired: counter=${x}`));
    this.counter2.subscribe(x =&amp;gt; console.log(`Subscribe event for counter2 fired: counter=${x}`));
  }

  increment() {
    this.store.dispatch({type:'foo'});
  }
}

@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    BrowserModule,
    StoreModule.forRoot({ counter1: Reducer1, counter2 : Reducer2 })
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;34&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 단지 이 문제에 대한 나의 경험일 뿐이지 표준은 아닙니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;code&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;35&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;56&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;github에서 답을 보시기 바랍니다: &lt;a href=&quot;https://github.com/ngrx/platform/issues/227#issuecomment-319850753&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;56-1&quot;&gt;상태 스냅샷 #227&lt;/a&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;36&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;갖고싶다&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;state&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;37&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;인에&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;constractor&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;38&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그래서 나는 항상&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;unasynchronous&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;39&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;:&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;constructor (private state: State&amp;lt;AppState&amp;gt;) {

   this.store.select(&quot;yourSelector&quot;).forEach(yourSelector =&amp;gt; { 
       this.property = yourSelector.path.to.state.property 
   });

}
&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;blockquote&gt; 
 &lt;pre&gt;&lt;code&gt;this.store.select('dataStore').subscribe(data =&amp;gt; { 
          console.log(data)
 }
&lt;/code&gt;&lt;/pre&gt; 
&lt;/blockquote&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/35633684/how-to-get-current-value-of-state-object-with-ngrx-store&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>Angular</category>
      <author>lovecheck</author>
      <guid isPermaLink="true">https://lovecheck.tistory.com/933</guid>
      <comments>https://lovecheck.tistory.com/933#entry933comment</comments>
      <pubDate>Thu, 19 Oct 2023 22:24:49 +0900</pubDate>
    </item>
    <item>
      <title>Oracle이 데이터베이스 테이블의 행에 NaN을 추가하는 시기/이유</title>
      <link>https://lovecheck.tistory.com/932</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Oracle이 데이터베이스 테이블의 행에 NaN을 추가하는 시기/이유&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;NaN이 Not a Number의 약자인 것으로 알고 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;하지만 Oracle이 언제, 왜 이 문제를 추가하는지 이해하기가 어렵습니다.&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;음수와 같이 0보다 작은 값을 만났을 때 또는 가비지 값일 때입니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://docs.oracle.com/cd/E11882_01/server.112/e41084/sql_elements001.htm#SQLRF50979&quot; papago-id=&quot;3-0&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;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Oracle Database 숫자 데이터 유형에는 정의되지 않은 작업의 결과인 양과 음의 고정 및 부동 소수점 숫자, 0, 무한대 및 값이 저장됩니다. &quot;숫자가 아님&quot; 또는&lt;/font&gt;&lt;/font&gt;&lt;code&gt;NAN&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;a href=&quot;http://docs.oracle.com/cd/E11882_01/server.112/e41084/sql_elements001.htm#SQLRF50982&quot; papago-id=&quot;6-1&quot;&gt;NaN을 binary_float&lt;/a&gt; 또는 &lt;a href=&quot;http://docs.oracle.com/cd/E11882_01/server.112/e41084/sql_elements001.htm#SQLRF50982&quot; papago-id=&quot;6-1&quot;&gt;binary_double&lt;/a&gt; 열에만 얻을 수 있습니다. 이 데이터 유형에는 &lt;a href=&quot;http://docs.oracle.com/cd/E11882_01/server.112/e41084/sql_elements003.htm#SQLRF00220&quot; papago-id=&quot;6-3&quot;&gt;NaN에 대한 자체 리터럴도 있고&lt;/a&gt;, 이들을 조작할 수 있는 &lt;a href=&quot;https://docs.oracle.com/cd/E18283_01/server.112/e17118/functions103.htm&quot; papago-id=&quot;6-7&quot;&gt;조건&lt;/a&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;이러한 값을 얻는 방법의 예는 0 플로트/더블 값을 0으로 나누는 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;select 0f/0 from dual;

0F/0
----
NaN  
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;... 따라서 NaN이 표시되는 경우 애플리케이션 로직이나 기본 데이터가 손상될 수 있습니다. (참고로 '정상' 숫자 유형에서는 이를 얻을 수 없습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ORA-01476: divisor is equal to zero&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;0이나 음수는 NaN이 나오지 않습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;문자열 열이 있고 응용 프로그램이 'NaN'이라는 단어를 입력하고 있을 수도 있지만 숫자를 문자열로 저장하는 것은 여러 수준에서 좋지 않은 생각이므로 그렇지 않기를 바랍니다.&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;아니요 &amp;lt;=0&amp;gt;은 여전히 숫자이므로 정확하지 않습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;NaN(또는 무한대)은 계산할 수 없는 숫자(+- ∞ 또는 단순히 숫자가 아닌 것)를 다룰 때 DB가 제정신을 유지하기 위해 사용하는 특수한 값입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;코드는 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;DECLARE
  l_bd_test   binary_double;
  l_int_test  INTEGER;
BEGIN
  l_bd_test   := 'NAN';
  l_int_test  := 0;
  IF l_bd_test IS NAN THEN 
    DBMS_OUTPUT.PUT_LINE(l_bd_test || ' IS NAN');
  ELSE
    DBMS_OUTPUT.PUT_LINE(l_bd_test || ' IS A #');
  END IF;
  IF l_int_test IS NAN THEN 
    DBMS_OUTPUT.PUT_LINE(l_int_test || ' IS NAN');
  ELSE
    DBMS_OUTPUT.PUT_LINE(l_int_test || ' IS A #');
  END IF;
END;
/
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;12&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;대체물&lt;/font&gt;&lt;/font&gt;&lt;code&gt;NAN&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;INFINITY&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;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/28461229/when-why-does-oracle-adds-nan-to-a-row-in-a-database-table&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>oracle</category>
      <author>lovecheck</author>
      <guid isPermaLink="true">https://lovecheck.tistory.com/932</guid>
      <comments>https://lovecheck.tistory.com/932#entry932comment</comments>
      <pubDate>Thu, 19 Oct 2023 22:24:38 +0900</pubDate>
    </item>
    <item>
      <title>문자열에서 사용하는 문자 셀의 수</title>
      <link>https://lovecheck.tistory.com/931</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;UTF-8 문자열을 사용하여 텍스트 표를 출력하는 프로그램이 있는데 문자열에서 사용하는 단좌표 문자 셀의 수를 측정해야 제대로 정렬할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;가능하다면 표준 기능으로 하고 싶습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://www.cl.cam.ac.uk/~mgk25/unicode.html#mod&quot; papago-id=&quot;2-1&quot; rel=&quot;noreferrer&quot;&gt;UTF-8&lt;/a&gt; 및 &lt;a href=&quot;http://www.cl.cam.ac.uk/~mgk25/unicode.html#mod&quot; papago-id=&quot;2-1&quot; rel=&quot;noreferrer&quot;&gt;Unix/Linux용 Unicode FAQ&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;0&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;를 사용하여 휴대용 방식으로 C로 문자 수를 셀 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;mbstowcs(NULL,s,0)&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;. 이것은 적절한 로케일이 선택되어 있는 한 다른 지원되는 인코딩과 마찬가지로 UTF-8에서도 작동합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;UTF-8 문자열의 문자 수를 세는 유선 연결된 기술은 0x80 ~ 0xBF 범위의 바이트를 제외한 모든 바이트를 세는 것입니다. 이는 고유의 문자가 아닌 연속 바이트일 뿐이기 때문입니다.&lt;/font&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;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;UTF-8 호환 strlen(3) 기능을 사용할 수도 있고 사용할 수도 없습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 작업을 빠르게 &lt;a href=&quot;http://www.daemonology.net/blog/2008-06-05-faster-utf8-strlen.html&quot; papago-id=&quot;5-1&quot; rel=&quot;noreferrer&quot;&gt;수행할 &lt;/a&gt;수&lt;a href=&quot;http://www.daemonology.net/blog/2008-06-05-faster-utf8-strlen.html&quot; papago-id=&quot;5-1&quot; rel=&quot;noreferrer&quot;&gt; 있는 간단한&lt;/a&gt; C &lt;a href=&quot;http://www.daemonology.net/blog/2008-06-05-faster-utf8-strlen.html&quot; papago-id=&quot;5-1&quot; rel=&quot;noreferrer&quot;&gt;기능들&lt;/a&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;효율적인 C 솔루션은 연속 바이트를 건너뛸 수 있도록 캐릭터의 시작을 검사합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;간단한 코드(위 링크에서 참조)는&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;int my_strlen_utf8_c(char *s) {
   int i = 0, j = 0;
   while (s[i]) {
     if ((s[i] &amp;amp; 0xc0) != 0x80) j++;
     i++;
   }
   return j;
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;더 빠른 버전은 동일한 기술을 사용하지만 데이터를 프리페치하고 멀티바이트를 비교하므로 상당한 속도가 향상됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 코드는 더 길고 더 복잡합니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;아무도 이런 얘기를 하지 않았다는 게 충격적입니다. 그래서 여기 기록을 남깁니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;단말기에서 텍스트를 정렬하려면 POSIX 기능과 를 사용해야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음은 문자열의 화면 길이를 찾는 올바른 프로그램입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#define _XOPEN_SOURCE
#include &amp;lt;wchar.h&amp;gt;
#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;locale.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;

int measure(char *string) {
    // allocate enough memory to hold the wide string
    size_t needed = mbstowcs(NULL, string, 0) + 1;
    wchar_t *wcstring = malloc(needed * sizeof *wcstring);
    if (!wcstring) return -1;

    // change encodings
    if (mbstowcs(wcstring, string, needed) == (size_t)-1) return -2;

    // measure width
    int width = wcswidth(wcstring, needed);

    free(wcstring);
    return width;
}

int main(int argc, char **argv) {
    setlocale(LC_ALL, &quot;&quot;);

    for (int i = 1; i &amp;lt; argc; i++) {
        printf(&quot;%s: %d\n&quot;, argv[i], measure(argv[i]));
    }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;실행 예는 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$ ./measure hello 莊子 cＡb
hello: 5
莊子: 4
cＡb: 4
&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;두 개의 문자 &quot;莊子&quot;와 세 개의 문자 &quot;cAb&quot;(두 배 너비 A 참조)가 모두 4열인 방법을 주목합니다.&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;utf8everywhere.org 의 &lt;a href=&quot;http://utf8everywhere.org/#myth.strlen&quot; rel=&quot;noreferrer&quot; papago-id=&quot;12-1&quot;&gt;표현&lt;/a&gt;에 따르면,&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p papago-id=&quot;13&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;화면에 나타나는 문자열의 크기는 문자열의 코드 포인트 수와 무관합니다.&lt;/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;POSIX는 이를 고려했습니다.&lt;/font&gt;&lt;/p&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;Windows에 내장된 기능이 없습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;wcwidth&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;15&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;콘솔 출력을 위한 함수. Windows 콘솔에서 다중 열 문자를 지원하려는 경우&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strike papago-id=&quot;15-1&quot;&gt;
&lt;/strike&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strike papago-id=&quot;15-1&quot;&gt;  당신은 휴대 가능한 구현을 찾아야 합니다.&lt;/strike&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strike papago-id=&quot;15-1&quot;&gt;  &lt;code papago-id=&quot;15-1-1&quot;&gt;wcwidth&lt;/code&gt;
&lt;/strike&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;윈도우 콘솔은 미친 해킹 없이는 유니코드를 지원하지 않기 때문에 포기합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;16&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;타사 라이브러리를 사용할 수 있는 경우 IBM의 &lt;a href=&quot;http://site.icu-project.org/&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;16-1&quot;&gt;ICU 라이브러리&lt;/a&gt;를 살펴보십시오.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음 코드는 잘못된 바이트 시퀀스를 고려합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;문자열 데이터의 예는 &quot;&quot;표&lt;a href=&quot;http://www.unicode.org/versions/Unicode6.3.0/ch03.pdf&quot; papago-id=&quot;17-1&quot; rel=&quot;nofollow&quot;&gt; 3-8&lt;/a&gt;&quot;에서 가져온 것입니다&lt;a href=&quot;http://www.unicode.org/versions/Unicode6.3.0/ch03.pdf&quot; papago-id=&quot;17-1&quot; rel=&quot;nofollow&quot;&gt;.&lt;/a&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://www.unicode.org/versions/Unicode6.3.0/ch03.pdf&quot; papago-id=&quot;17-1&quot; rel=&quot;nofollow&quot;&gt; &lt;/a&gt;유니코드 표준 6.3의 &lt;a href=&quot;http://www.unicode.org/versions/Unicode6.3.0/ch03.pdf&quot; papago-id=&quot;17-1&quot; rel=&quot;nofollow&quot;&gt;UTF-8 Conversion&quot;에서 U+FFFD 사용&lt;/a&gt;.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;
#include &amp;lt;string.h&amp;gt;
#include &amp;lt;stdbool.h&amp;gt;

#define is_trail(c) (c &amp;gt; 0x7F &amp;amp;&amp;amp; c &amp;lt; 0xC0)
#define SUCCESS 1
#define FAILURE -1

int utf8_get_next_char(const unsigned char*, size_t, size_t*, int*, unsigned int*);
int utf8_length(unsigned char*, size_t);
void utf8_print_each_char(unsigned char*, size_t);

int main(void)
{
    unsigned char *str;
    str = (unsigned char *) &quot;\x61\xF1\x80\x80\xE1\x80\xC2\x62\x80\x63\x80\xBF\x64&quot;;
    size_t str_size = strlen((const char*) str);

    puts(10 == utf8_length(str, str_size) ? &quot;true&quot; : &quot;false&quot;);
    utf8_print_each_char(str, str_size);

    return EXIT_SUCCESS;
}

int utf8_length(unsigned char *str, size_t str_size)
{
    int length = 0;
    size_t pos = 0;
    size_t next_pos = 0;
    int is_valid = 0;
    unsigned int code_point = 0;

    while (
        utf8_get_next_char(str, str_size, &amp;amp;next_pos, &amp;amp;is_valid, &amp;amp;code_point) == SUCCESS
    ) {
        ++length;
    }

    return length;
}

void utf8_print_each_char(unsigned char *str, size_t str_size)
{
    int length = 0;
    size_t pos = 0;
    size_t next_pos = 0;
    int is_valid = 0;
    unsigned int code_point = 0;

    while (
        utf8_get_next_char(str, str_size, &amp;amp;next_pos, &amp;amp;is_valid, &amp;amp;code_point) == SUCCESS
    ) {
        if (is_valid == true) {
            printf(&quot;%.*s\n&quot;, (int) next_pos - (int) pos, str + pos);
        } else {
            puts(&quot;\xEF\xBF\xBD&quot;);
        }

        pos = next_pos;
    }
}

int utf8_get_next_char(const unsigned char *str, size_t str_size, size_t *cursor, int *is_valid, unsigned int *code_point)
{
    size_t pos = *cursor;
    size_t rest_size = str_size - pos;
    unsigned char c;
    unsigned char min;
    unsigned char max;

    *code_point = 0;
    *is_valid = SUCCESS;

    if (*cursor &amp;gt;= str_size) {
        return FAILURE;
    }

    c = str[pos];

    if (rest_size &amp;lt; 1) {
        *is_valid = false;
        pos += 1;
    } else if (c &amp;lt; 0x80) {
        *code_point = str[pos];
        *is_valid = true;
        pos += 1;
    } else if (c &amp;lt; 0xC2) {
        *is_valid = false;
        pos += 1;
    } else if (c &amp;lt; 0xE0) {

        if (rest_size &amp;lt; 2 || !is_trail(str[pos + 1])) {
            *is_valid = false;
            pos += 1;
        } else {
            *code_point = ((str[pos] &amp;amp; 0x1F) &amp;lt;&amp;lt; 6) | (str[pos + 1] &amp;amp; 0x3F);
            *is_valid = true;
            pos += 2;
        }

    } else if (c &amp;lt; 0xF0) {

        min = (c == 0xE0) ? 0xA0 : 0x80;
        max = (c == 0xED) ? 0x9F : 0xBF;

        if (rest_size &amp;lt; 2 || str[pos + 1] &amp;lt; min || max &amp;lt; str[pos + 1]) {
            *is_valid = false;
            pos += 1;         
        } else if (rest_size &amp;lt; 3 || !is_trail(str[pos + 2])) {
            *is_valid = false;
            pos += 2;
        } else {
            *code_point = ((str[pos]     &amp;amp; 0x1F) &amp;lt;&amp;lt; 12) 
                       | ((str[pos + 1] &amp;amp; 0x3F) &amp;lt;&amp;lt;  6) 
                       |  (str[pos + 2] &amp;amp; 0x3F);
            *is_valid = true;
            pos += 3;
        }

    } else if (c &amp;lt; 0xF5) {

        min = (c == 0xF0) ? 0x90 : 0x80;
        max = (c == 0xF4) ? 0x8F : 0xBF;

        if (rest_size &amp;lt; 2 || str[pos + 1] &amp;lt; min || max &amp;lt; str[pos + 1]) {
            *is_valid = false;
            pos += 1;
        } else if (rest_size &amp;lt; 3 || !is_trail(str[pos + 2])) {
            *is_valid = false;
            pos += 2;
        } else if (rest_size &amp;lt; 4 || !is_trail(str[pos + 3])) {
            *is_valid = false;
            pos += 3;
        } else {
            *code_point = ((str[pos]     &amp;amp;  0x7) &amp;lt;&amp;lt; 18)
                       | ((str[pos + 1] &amp;amp; 0x3F) &amp;lt;&amp;lt; 12)
                       | ((str[pos + 2] &amp;amp; 0x3F) &amp;lt;&amp;lt; 6)
                       |  (str[pos + 3] &amp;amp; 0x3F);
            *is_valid = true;
            pos += 4;
        }

    } else {
        *is_valid = false;
        pos += 1;
    }

    *cursor = pos;

    return SUCCESS;
}
&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;UTF-8의 코드를 작성하면 &quot;표 3-7&quot;이 나타납니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;유니코드 표준 6.3의 &quot;잘 형성된 UTF-8 바이트 시퀀스&quot;.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;       Code Points    First Byte Second Byte Third Byte Fourth Byte
  U+0000 -   U+007F   00 - 7F
  U+0080 -   U+07FF   C2 - DF    80 - BF
  U+0800 -   U+0FFF   E0         A0 - BF     80 - BF
  U+1000 -   U+CFFF   E1 - EC    80 - BF     80 - BF
  U+D000 -   U+D7FF   ED         80 - 9F     80 - BF
  U+E000 -   U+FFFF   EE - EF    80 - BF     80 - BF
 U+10000 -  U+3FFFF   F0         90 - BF     80 - BF    80 - BF
 U+40000 -  U+FFFFF   F1 - F3    80 - BF     80 - BF    80 - BF
U+100000 - U+10FFFF   F4         80 - 8F     80 - BF    80 - BF
&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;UTF-8을 다룰 때 당신의 삶을 훨씬 더 쉽게 해주는 &lt;a href=&quot;https://docs.gtk.org/glib/&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;19-1&quot;&gt;glib&lt;/a&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/5117393/number-of-character-cells-used-by-string&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>C</category>
      <author>lovecheck</author>
      <guid isPermaLink="true">https://lovecheck.tistory.com/931</guid>
      <comments>https://lovecheck.tistory.com/931#entry931comment</comments>
      <pubDate>Sat, 14 Oct 2023 10:21:19 +0900</pubDate>
    </item>
    <item>
      <title>WooCommerce 가변상품 공지사항 이슈 - 상품 옵션을 선택해주세요</title>
      <link>https://lovecheck.tistory.com/930</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;WooCommerce 가변상품 공지사항 이슈 - 상품 옵션을 선택해주세요&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;WooCommerce &lt;strong papago-id=&quot;1-1&quot;&gt;Variable Product&lt;/strong&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;&quot;카트에 추가&quot; 버튼은 간단한 제품에서는 잘 작동하지만, 가변 제품에서는 작동하지 않습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그것이 주는 것을 줍니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&quot;Please choose product options…&quot;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;알려드립니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;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;그래서 WooCommerce 소스 파일을 찾아봤습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;기능에서:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;function add_to_cart_handler_variable( $product_id ) {
    $adding_to_cart     = wc_get_product( $product_id );
    $variation_id       = empty( $_REQUEST['variation_id'] ) ? '' : absint( $_REQUEST['variation_id'] );
    $quantity           = empty( $_REQUEST['quantity'] ) ? 1 : wc_stock_amount( $_REQUEST['quantity'] );
    $missing_attributes = array();
    $variations         = array();
    $attributes         = $adding_to_cart-&amp;gt;get_attributes();
    $variation          = wc_get_product( $variation_id );
...
if ( $missing_attributes ) {
        wc_add_notice( sprintf( _n( '%s is a required field', '%s are required fields', sizeof( $missing_attributes ), 'woocommerce' ), wc_format_list_of_items( $missing_attributes ) ), 'error' );
    } elseif ( empty( $variation_id ) ) {
        wc_add_notice( __( 'Please choose product options&amp;amp;hellip;', 'woocommerce' ), 'error' );
    } else {
        // Add to cart validation
        $passed_validation  = apply_filters( 'woocommerce_add_to_cart_validation', true, $product_id, $quantity, $variation_id, $variations );

        if ( $passed_validation &amp;amp;&amp;amp; WC()-&amp;gt;cart-&amp;gt;add_to_cart( $product_id, $quantity, $variation_id, $variations ) !== false ) {
            wc_add_to_cart_message( $product_id );
            return true;
        }
    }
    return 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;elseif 절에 오류가 잡혔습니다.&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그래서 나는 메아리치려고 했습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;$variation_id&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;$variations&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;$variation&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;. 아무도 그 안에 아무것도 들어있지 않아요 왜냐면 제가 메아리 칠 때&lt;/font&gt;&lt;/font&gt;&lt;code&gt;$variation_id&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;: 아무것도 출력되지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;오류는 어떻게 해결할 수 있습니까?&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;13&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;상점 페이지에서는 가변 제품에 대한 추가 버튼을 사용할 수 없습니다. 카트에 추가하기 전에 먼저 단일 제품 페이지에서 이 가변 제품에 대한 옵션을 선택해야 합니다.&lt;/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;가변 제품 페이지에서는 일반적으로 &quot;수레에 추가&quot; 단추를 사용하기 전에 가변 제품에 &lt;strong papago-id=&quot;14-1&quot;&gt;대해 선택&lt;/strong&gt;할 수 있는 &lt;strong papago-id=&quot;14-1&quot;&gt;옵션&lt;/strong&gt;이 표시됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그렇게 하지 않으면 오류 메시지가 나타납니다.&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그래서 이 시점에서:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;19&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;옵션이 제품 페이지에 &lt;strong papago-id=&quot;19-1&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 papago-id=&quot;16&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;제품 백엔드 설정 확인&lt;/font&gt;&lt;/li&gt; 
   &lt;li papago-id=&quot;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;기본 워드프레스 테마로 전환해 봅니다(이 문제가 여전히 있는지 확인합니다).&lt;/font&gt;&lt;/li&gt; 
   &lt;li papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;대부분의 플러그인을 사용하지 않도록 설정합니다.&lt;/font&gt;&lt;/li&gt; 
  &lt;/ul&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;20&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;옵션이 &lt;strong papago-id=&quot;20-1&quot;&gt;표시&lt;/strong&gt;됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;따라서 이 제품에 대한 옵션을 먼저 선택한 다음 카트에 추가합니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p papago-id=&quot;21&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 문제가 테마와 관련된 경우 테마 작성자에게 문의하여 지원 스레드 또는 티켓을 엽니다.&lt;/font&gt;&lt;/p&gt; 
&lt;hr&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;22&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;제품 ID에 대한 제품 변형:&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;23&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;가변 제품 ID에 대한 제품 변형을 프로그래밍 방식으로 가져오기&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$product = wc_get_product( $product_id );
$product_variations = $product-&amp;gt;get_available_variations();

echo var_dump($product_variations); // Displaying the array
&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;그런 다음 첫 번째 변형 ID를 가져오려면:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$product = wc_get_product( $product_id );
$product_variations = $product-&amp;gt;get_available_variations();

$variation_product_id = $product_variations [0]['variation_id'];
echo $variation_product_id; // Displaying the variation ID
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;25&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또는 이 제품 ID의 모든 변형 ID 배열을 가져오려면:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$product = wc_get_product( $product_id );
$product_variations = $product-&amp;gt;get_available_variations();

$arr_variations_id = array();
foreach ($product_variations as $variation) {
    $product_variation_id = $variation['variation_id'];
    array_push( $arr_variations_id, $product_variation_id );
}

echo var_dump($arr_variations_id); // Displaying the array of variations ID
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;26&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;참고 :&lt;a href=&quot;https://support.woothemes.com/hc/en-us/articles/203006565-Change-Add-to-Cart-button-to-Go-to-Product-in-the-Shop-Page&quot; rel=&quot;noreferrer&quot; papago-id=&quot;26-1&quot;&gt; 장바구니에 추가하기 버튼을 장보기 페이지에서 상품으로 이동하기&lt;/a&gt;로 변경&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;27&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다른 사용자가 사용자 지정 테마를 작성할 때 예상대로 카트에 추가되지 않는 변형이 발생할 경우를 대비하여 테마가 &lt;em papago-id=&quot;27-1&quot;&gt;/woocommerce/assets/js/frontend/add-to-cart-variation.min.js&lt;/em&gt; 스크립트를 로드하고 있는지 확인해야 할 수도 있습니다. - 스크립트를 대기열에 입력하여 수동으로 추가하는 곳마다 다음을 추가합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;wp_enqueue_script('wc-add-to-cart-variation');
&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;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;테스트하려면 2020년 테마로 전환하기만 하면 됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그렇다면 2020 스위트를 당신의 필요에 맞게 만들고 우커머스 업데이트가 시작되면 개발자들이 쉬는 테마는 그만 사용하는 것을 추천합니다!&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;30&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저도 같은 문제에 직면해 있었습니다. ..당신의 변형 스와치 플러그인을 삭제하면 문제가 해결됩니다.&lt;/font&gt;&lt;/p&gt;&lt;ol&gt; 
 &lt;li&gt;&lt;p papago-id=&quot;31&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;동일한 문제가 발생했습니다. ..&lt;strong papago-id=&quot;31-1&quot;&gt;자동 최적화&lt;/strong&gt; 플러그인을 비활성화하여 문제가 해결되었습니다.&lt;/font&gt;&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;p papago-id=&quot;32&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또한 어떤 플러그인을 비활성화할지 알기 위해서는 단순히 페이지나 웹사이트를 로드하고 요소나 개발자 모드를 검사한 다음 콘솔을 확인하여 오류의 원인을 확인하면 관련 플러그인과 연관된 다음 wp 대시보드에서 비활성화할 수 있습니다.&lt;/font&gt;&lt;/p&gt; &lt;/li&gt; 
&lt;/ol&gt;&lt;p papago-id=&quot;33&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;wishlist 플러그인을 사용하는데 카트에 가변 상품을 추가하려고 하니 '&lt;strong papago-id=&quot;33-1&quot;&gt;선택한 상품은 상품명의 변형이 아니므로 상품명을 방문하여 상품&lt;/strong&gt; 옵션을 &lt;strong papago-id=&quot;33-1&quot;&gt;선택하십시오'&lt;/strong&gt;라는 메시지가 나타납니다&lt;strong papago-id=&quot;33-1&quot;&gt;.&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;34&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;문제는 제 제품에 기본 변형이 없다는 것이었습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그래서 선택된 변형 없이 wishlist 제품에 사용자가 추가되었습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&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;여기 FIX입니다: 모든 캐리온 제품에 기본값 변경만 설정하세요! (수동 또는 코드를 통해)&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;36&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그래서 이제 위시리스트에서 우리는 다양성을 선택했고 모든 것이 정상적으로 작동합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;모든 페이지, 아카이브, 위시리스트 등에서 작동합니다.&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;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;php 파일.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;wp-content/your 테마/기능으로 이동하기만 하면 됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;당신의 아이 테마에 php.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;여기서는 전체 코드를 보여드리고 주요 부분을 설명하겠습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;따라서 프로그래밍 방식으로 WooCommerce 기본 제품 속성을 만드는 전체 PHP 스크립트는 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;add_action('woocommerce_before_single_product_summary', 'quadlayers_product_default_attributes');
function quadlayers_product_default_attributes() {
      global $product;
      if (!count($default_attributes = get_post_meta($product-&amp;gt;get_id(), '_default_attributes'))) {
        $new_defaults = array();
        $product_attributes = $product-&amp;gt;get_attributes();
        if (count($product_attributes)) {
          foreach ($product_attributes as $key =&amp;gt; $attributes) {
            $values = explode(',', $product-&amp;gt;get_attribute($key));
            if (isset($values[0]) &amp;amp;&amp;amp; !isset($default_attributes[$key])) {
              $new_defaults[$key] = sanitize_key($values[0]);
            }
          }
          update_post_meta($product-&amp;gt;get_id(), '_default_attributes', $new_defaults);
        }
      }
    }  
&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;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/38111163/woocommerce-variable-product-notice-issue-please-choose-product-options&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>Wordpress</category>
      <author>lovecheck</author>
      <guid isPermaLink="true">https://lovecheck.tistory.com/930</guid>
      <comments>https://lovecheck.tistory.com/930#entry930comment</comments>
      <pubDate>Sat, 14 Oct 2023 10:21:09 +0900</pubDate>
    </item>
    <item>
      <title>WooCommerce에서 모든 주문 상태의 민달팽이와 이름을 얻는 방법은?</title>
      <link>https://lovecheck.tistory.com/929</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;WooCommerce에서 모든 주문 상태의 민달팽이와 이름을 얻는 방법은?&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;나는 모든 민달팽이와 모든 우커머스 주문 상태의 이름을 알고 싶습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음 스레드에서 답변을 시도했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/31672074/woocommerce-get-list-of-order-statuses-list&quot; papago-id=&quot;1-1&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;/p&gt;&lt;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;WC_Order 기능에서 전용 기능을 사용하게 되며, 기본적으로 다음 배열을 제공합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$order_statuses = array(
    'wc-pending'    =&amp;gt; _x( 'Pending payment', 'Order status', 'woocommerce' ),
    'wc-processing' =&amp;gt; _x( 'Processing', 'Order status', 'woocommerce' ),
    'wc-on-hold'    =&amp;gt; _x( 'On hold', 'Order status', 'woocommerce' ),
    'wc-completed'  =&amp;gt; _x( 'Completed', 'Order status', 'woocommerce' ),
    'wc-cancelled'  =&amp;gt; _x( 'Cancelled', 'Order status', 'woocommerce' ),
    'wc-refunded'   =&amp;gt; _x( 'Refunded', 'Order status', 'woocommerce' ),
    'wc-failed'     =&amp;gt; _x( 'Failed', 'Order status', 'woocommerce' ),
);
&lt;/code&gt;&lt;/pre&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;모든 &lt;strong papago-id=&quot;4-1&quot;&gt;사용자 정의 추가&lt;/strong&gt; 주문 &lt;strong papago-id=&quot;4-1&quot;&gt;상태도 필터&lt;/strong&gt; 후크로 &lt;strong papago-id=&quot;4-1&quot;&gt;포함&lt;/strong&gt;됩니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;wc_order_statuses&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;/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;font class=&quot;papago-parent&quot;&gt;php와 woocmerce_get_order_states ()님이 사용하실 곳으로 전화하시면 됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;function woocommerce_get_order_statuses() {
      $order_statuses = get_terms( 'shop_order_status', array( 'hide_empty' =&amp;gt; false ) );
      $statuses = array();
      foreach ( $order_statuses as $status ) {
        $statuses[ $status-&amp;gt;slug ] = $status-&amp;gt;name;
      }
      return $statuses;
    }
&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;em papago-id=&quot;7-0&quot;&gt;wc_get_order_states()&lt;/em&gt;는 기본 WoCommerce 상태만 제공하지만 모든 주문 상태를 얻으려면 다음 &lt;strong papago-id=&quot;7-2&quot;&gt;wocommerce_get_all_order_states()&lt;/strong&gt; 기능을 사용할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;function woocommerce_get_all_order_statuses() {
  $order_statuses = get_posts( array('post_type'=&amp;gt;'wc_order_status', 'post_status'=&amp;gt;'publish', 'numberposts'=&amp;gt;-1) );
 
  $statuses = array();
  foreach ( $order_statuses as $status ) {
    $statuses[ $status-&amp;gt;post_name ] = $status-&amp;gt;post_title;
  }

  return $statuses;
}
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/59863954/how-to-get-slugs-and-names-of-all-order-statuses-in-woocommerce&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>Wordpress</category>
      <author>lovecheck</author>
      <guid isPermaLink="true">https://lovecheck.tistory.com/929</guid>
      <comments>https://lovecheck.tistory.com/929#entry929comment</comments>
      <pubDate>Sat, 14 Oct 2023 10:21:01 +0900</pubDate>
    </item>
    <item>
      <title>glibc의 fclose(NULL)이 오류를 반환하지 않고 세그먼트화 오류를 발생시키는 이유는 무엇입니까?</title>
      <link>https://lovecheck.tistory.com/928</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;glibc의 fclose(NULL)이 오류를 반환하지 않고 세그먼트화 오류를 발생시키는 이유는 무엇입니까?&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;0&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;fclose(3)&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;:&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p papago-id=&quot;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;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;성공적으로 완료되면 0이 반환됩니다.&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;EOF&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;errno&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;오류를 나타내도록 설정됩니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또 스(함) )&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;fclose()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;스트림에 대해 정의되지 않은 동작이 발생합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
 &lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;오류&lt;/font&gt;&lt;/p&gt; 
 &lt;p&gt;&lt;code&gt;EBADF&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;fp&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;유효하지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;fclose()&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;errno&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;close(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 class=&quot;papago-parent&quot;&gt;,&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;write(2)&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;12&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;아니면&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;fflush(3)&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;/blockquote&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&gt;&lt;code&gt;fclose(NULL)&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;errno&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;16&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;분할 결함에 의해 직접 죽는 대신 일반적으로.&lt;/font&gt;&lt;/font&gt;&lt;font 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;20&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;미리 감사드립니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;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;strerror()&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;FILE *not_exist = NULL;

not_exist = fopen(&quot;nonexist&quot;, &quot;r&quot;);
if(not_exist == NULL){
    printError(errno);
}

if(fclose(not_exist) == EOF){
    printError(errno);
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;fclose&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;19&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;FILE&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;fopen&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;21&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;인 .&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;stdin&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;22&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;,&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;stdout&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;stderr&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;24&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;즉 .&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;는 이러한  중 Null다와 .&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;fclose((FILE *)0xdeadbeef)&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;29&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;되지요.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;29-1&quot;&gt;NULL&lt;/strong&gt;은 C에서 &lt;strong papago-id=&quot;29-1&quot;&gt;특별한 것&lt;/strong&gt;이 아닙니다; 유효한 포인터와 동등하지 않은 것을 비교하는 것이 보장되는 것을 제외하고는, 다른 유효하지 않은 포인터와 마찬가지로, 이 포인터를 사용하면 계약의 일부로서 문서에 전달하는 인터페이스를 제외하고는 정의되지 않은 동작을 호출합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;NULL&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;26&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;특별한 의미가 있습니다&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;31&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;font class=&quot;papago-parent&quot;&gt;정의되지 않은 동작을 호출할 때 선호하는 결과는 항상 오류를 강조하고 수정할 수 있기 때문에 충돌입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;대부분의 사용자:&lt;/font&gt;&lt;/font&gt;&lt;code&gt;fclose&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;28&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;오를  사람들이라고 &lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 그리고 대부분의 사람들이 통과할 만큼 어리석은 사람들이라고 장담합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;NULL&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;fclose&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;fclose&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;35&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;. 사람들이 반환 값을 확인해야 &lt;em papago-id=&quot;35-1&quot;&gt;한다는&lt;/em&gt; 주장이 제기될 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;fclose&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;32&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;할 수 있기 으로,에,다,의 경우에는 이것이 .&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;fflush&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;code&gt;fclose&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;p&gt;&lt;code&gt;fclose(NULL)&lt;/code&gt; &lt;font papago-translate=&quot;translated&quot; papago-id=&quot;35&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;성공해야 &lt;em papago-id=&quot;35-0&quot;&gt;합니다&lt;/em&gt;.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;free(NULL)&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;36&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;성공합니다. 그래야 정리 코드를 더 쉽게 쓸 수 있기 때문입니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;37&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font 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;fclose(NULL)&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;38&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(예: http://pubs.opengroup.org/onlinepubs/9699919799/) 참조).&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;43&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다른 사람들이 언급한 것처럼 NULL을 잘못된 곳으로 전달하는 경우 일반적으로 오류 반환을 원하지 않습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;최소한 디버그/테스트 빌드에 대한 경고 메시지가 필요합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;참조 해제 NULL은 즉시 경고 메시지를 제공하고 프로그래밍 오류를 식별하는 역추적을 수집할 수 있는 기회를 제공합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;프로그래밍하는 동안 segfault는 당신이 얻을 수 있는 최고의 오류입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;C에는 더 많은 미묘한 오류들이 있고, 디버그하는 데 훨씬 더 오래 걸립니다...&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;44&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;오류 반환을 악용하여 프로그래밍 오류에 대한 견고성을 높일 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 소프트웨어 충돌로 데이터가 손실될 것을 우려하는 경우 하드웨어의 전원 공급이 끊길 경우에도 동일한 일이 발생할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그래서 (&lt;a href=&quot;http://docstore.mik.ua/orelly/unix/upt/ch30_24.htm&quot; papago-id=&quot;44-1&quot; rel=&quot;noreferrer&quot;&gt;ex와 vi와 같이&lt;/a&gt; 두 &lt;a href=&quot;http://docstore.mik.ua/orelly/unix/upt/ch30_24.htm&quot; papago-id=&quot;44-1&quot; rel=&quot;noreferrer&quot;&gt;글자&lt;/a&gt;로 된 &lt;a href=&quot;http://docstore.mik.ua/orelly/unix/upt/ch30_24.htm&quot; papago-id=&quot;44-1&quot; rel=&quot;noreferrer&quot;&gt;이름을 가진 유닉스&lt;/a&gt; 텍스트 &lt;a href=&quot;http://docstore.mik.ua/orelly/unix/upt/ch30_24.htm&quot; papago-id=&quot;44-1&quot; rel=&quot;noreferrer&quot;&gt;편집기 때문&lt;/a&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;39&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;맨 페이지에서 말하는 오류는 프로그래밍 오류가 아닌 런타임 오류입니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;요만 하면 안 &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;NULL&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 class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;포인터를 기대하고 해당 API가 합리적인 작업을 수행하기를 기대합니다.&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;NULL&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&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;48&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;관련 질문:&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/4390007/in-either-c-or-c-should-i-check-pointer-parameters-against-null-nullptr&quot; papago-id=&quot;48-1&quot;&gt;C 또는 C++에서 NULL/nullptr에 대해 포인터 매개 변수를 확인해야 합니까?&lt;/a&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;49&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그 질문에 대한 답 중 하나에 대한 &lt;a href=&quot;https://stackoverflow.com/a/4390811/82320&quot; papago-id=&quot;49-1&quot;&gt;R.&lt;/a&gt;의 &lt;a href=&quot;https://stackoverflow.com/a/4390811/82320&quot; papago-id=&quot;49-1&quot;&gt;의견&lt;/a&gt;을 인용하자면:&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p papago-id=&quot;50&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;... 운영 환경의 예외적인 조건(fs full, out-memory, network down 등)에서 발생하는 오류를 프로그래밍 오류와 혼동하는 것 같습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;전자의 경우, 물론 강력한 프로그램이 그것들을 우아하게 다룰 수 있어야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;후자의 경우, 강력한 프로그램은 처음부터 그것들을 경험할 수 없습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;42&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; .&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;fclose()&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;이 문제는 FreeB&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;SD의 유산으로 보이며 마이크로소프트와 리눅스 진영에서 무비판적으로 받아들여졌습니다.&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;44&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;  HP, SGI, Solaris, CYGWIN 입니다를 &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;fclose(NULL)&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;45&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이치에 맞는&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를들면,&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;man fclose&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;46&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;OP의 glibc 대신 newlib을 사용하는 CYGWIN의 경우 다음과 같이 말합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p papago-id=&quot;56&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;fclose가 성공한 경우(FP가 NULL이거나 파일이 열려 있지 않은 경우 포함) 0을 반환합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p papago-id=&quot;57&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;관련된 토론은 https://stackoverflow.com/a/8442421/318716 를 참조하십시오.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;47&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;manpage는 기본 &lt;em papago-id=&quot;47-1&quot;&gt;파일 기술자&lt;/em&gt;(내부적으로 파일 기술자를 통해 얻은 기술자)에 대해 이야기하는 것 같습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;open&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;48&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 시 &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;fopen&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;em papago-id=&quot;49-1&quot;&gt;전달&lt;/em&gt;할 파일 포인터가 아닌 유효하지 않음&lt;/font&gt;&lt;/font&gt;&lt;code&gt;fclose&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;50&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;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/16922871/why-glibcs-fclosenull-cause-segmentation-fault-instead-of-returning-error&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>C</category>
      <author>lovecheck</author>
      <guid isPermaLink="true">https://lovecheck.tistory.com/928</guid>
      <comments>https://lovecheck.tistory.com/928#entry928comment</comments>
      <pubDate>Sat, 14 Oct 2023 10:20:55 +0900</pubDate>
    </item>
    <item>
      <title>검색 옵션을 사용하여 선택 상자 만들기</title>
      <link>https://lovecheck.tistory.com/927</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;검색 옵션을 사용하여 선택 상자 만들기&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 이 이미지에서 볼 수 있는 것을 복제하려고 합니다.&lt;/font&gt;&lt;/font&gt;&lt;img src=&quot;https://i.stack.imgur.com/9NB1w.png&quot; alt=&quot;enter image description here&quot;&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;font class=&quot;papago-parent&quot;&gt;이미 존재하는 부트스트랩과 관련된 것이 있습니까?&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 간단한 코드가 나에게 효과가 있었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;/p&gt;
&lt;div class=&quot;snippet&quot; data-lang=&quot;js&quot; data-hide=&quot;false&quot; data-console=&quot;true&quot; data-babel=&quot;false&quot;&gt; 
 &lt;div class=&quot;snippet-code&quot;&gt; 
  &lt;pre class=&quot;snippet-code-html lang-html prettyprint-override&quot;&gt;&lt;code&gt;&amp;lt;input list=&quot;brow&quot;&amp;gt;
&amp;lt;datalist id=&quot;brow&quot;&amp;gt;
  &amp;lt;option value=&quot;Internet Explorer&quot;&amp;gt;
  &amp;lt;option value=&quot;Firefox&quot;&amp;gt;
  &amp;lt;option value=&quot;Chrome&quot;&amp;gt;
  &amp;lt;option value=&quot;Opera&quot;&amp;gt;
  &amp;lt;option value=&quot;Safari&quot;&amp;gt;
&amp;lt;/datalist&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;선택 태그만 사용해야 하는 경우에는 Selectize Js를 사용합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;우리가 필요로 하는 모든 옵션이 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/a/57809086/10445069&quot; papago-id=&quot;5-1&quot;&gt;Selectize Js를 사용하여 시도&lt;/a&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;Selectize Js는 우리가 필요로 하는 모든 옵션을 가지고 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;한번 써 보세요.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;/p&gt;
&lt;div class=&quot;snippet&quot; data-lang=&quot;js&quot; data-hide=&quot;false&quot; data-console=&quot;true&quot; data-babel=&quot;false&quot;&gt; 
 &lt;div class=&quot;snippet-code&quot;&gt; 
  &lt;pre class=&quot;snippet-code-js lang-js prettyprint-override&quot;&gt;&lt;code&gt;  $(document).ready(function () {
      $('select').selectize({
          sortField: 'text'
      });
  });&lt;/code&gt;&lt;/pre&gt; 
  &lt;pre class=&quot;snippet-code-html lang-html prettyprint-override&quot;&gt;&lt;code&gt;&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;script src=&quot;https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script src=&quot;https://cdnjs.cloudflare.com/ajax/libs/selectize.js/0.12.6/js/standalone/selectize.min.js&quot; integrity=&quot;sha256-+C0A5Ilqmu4QcSPxrlGpaZxJ04VjsRjKu+G82kl5UJk=&quot; crossorigin=&quot;anonymous&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;link rel=&quot;stylesheet&quot; href=&quot;https://cdnjs.cloudflare.com/ajax/libs/selectize.js/0.12.6/css/selectize.bootstrap3.min.css&quot; integrity=&quot;sha256-ze/OEYGcFbPRmvCnrSeKbRTtjG4vGLHXgOqsyLFTRjg=&quot; crossorigin=&quot;anonymous&quot; /&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
  &amp;lt;select id=&quot;select-state&quot; placeholder=&quot;Pick a state...&quot;&amp;gt;
    &amp;lt;option value=&quot;&quot;&amp;gt;Select a state...&amp;lt;/option&amp;gt;
    &amp;lt;option value=&quot;AL&quot;&amp;gt;Alabama&amp;lt;/option&amp;gt;
    &amp;lt;option value=&quot;AK&quot;&amp;gt;Alaska&amp;lt;/option&amp;gt;
    &amp;lt;option value=&quot;AZ&quot;&amp;gt;Arizona&amp;lt;/option&amp;gt;
    &amp;lt;option value=&quot;AR&quot;&amp;gt;Arkansas&amp;lt;/option&amp;gt;
    &amp;lt;option value=&quot;CA&quot;&amp;gt;California&amp;lt;/option&amp;gt;
    &amp;lt;option value=&quot;CO&quot;&amp;gt;Colorado&amp;lt;/option&amp;gt;
    &amp;lt;option value=&quot;CT&quot;&amp;gt;Connecticut&amp;lt;/option&amp;gt;
    &amp;lt;option value=&quot;DE&quot;&amp;gt;Delaware&amp;lt;/option&amp;gt;
    &amp;lt;option value=&quot;DC&quot;&amp;gt;District of Columbia&amp;lt;/option&amp;gt;
    &amp;lt;option value=&quot;FL&quot;&amp;gt;Florida&amp;lt;/option&amp;gt;
    &amp;lt;option value=&quot;GA&quot;&amp;gt;Georgia&amp;lt;/option&amp;gt;
    &amp;lt;option value=&quot;HI&quot;&amp;gt;Hawaii&amp;lt;/option&amp;gt;
    &amp;lt;option value=&quot;ID&quot;&amp;gt;Idaho&amp;lt;/option&amp;gt;
    &amp;lt;option value=&quot;IL&quot;&amp;gt;Illinois&amp;lt;/option&amp;gt;
    &amp;lt;option value=&quot;IN&quot;&amp;gt;Indiana&amp;lt;/option&amp;gt;
  &amp;lt;/select&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&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;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Select2 http://select2.github.io 은 Choosen보다 훨씬 더 좋고 활동적일 수 있습니다.&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;비교 보기: http://sitepoint.com/jquery-select-box-components-chosen-vs-select2&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;IME http://github.com/harvesthq/chosen/issues/2663 을 통해 Choosen이 한자를 사용할 때 문제가 발생하여 Select2(수개월 전)를 선택했습니다. 잘 작동합니다.&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;select2를 사용하시면 됩니다. 이 직업에 가장 적합한 js입니다.&lt;/font&gt;&lt;/font&gt;&lt;br&gt; &lt;font papago-translate=&quot;splited&quot;&gt;&lt;a href=&quot;https://select2.org/dropdown&quot; rel=&quot;noreferrer&quot; papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;https://select2.org/dropdown&lt;/font&gt;&lt;/a&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;$(document).ready(function () {
//change selectboxes to selectize mode to be searchable
   $(&quot;select&quot;).select2();
});&lt;/code&gt;&lt;/pre&gt; 
  &lt;pre class=&quot;snippet-code-html lang-html prettyprint-override&quot;&gt;&lt;code&gt;&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;script src=&quot;https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;link href=&quot;https://cdn.jsdelivr.net/npm/select2@4.0.13/dist/css/select2.min.css&quot; rel=&quot;stylesheet&quot; /&amp;gt;
&amp;lt;script src=&quot;https://cdn.jsdelivr.net/npm/select2@4.0.13/dist/js/select2.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;

&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
  &amp;lt;select id=&quot;select_page&quot; style=&quot;width:200px;&quot; class=&quot;operator&quot;&amp;gt; 
         &amp;lt;option value=&quot;&quot;&amp;gt;Select a Page...&amp;lt;/option&amp;gt;
         &amp;lt;option value=&quot;alpha&quot;&amp;gt;alpha&amp;lt;/option&amp;gt; 
         &amp;lt;option value=&quot;beta&quot;&amp;gt;beta&amp;lt;/option&amp;gt;
         &amp;lt;option value=&quot;theta&quot;&amp;gt;theta&amp;lt;/option&amp;gt;
         &amp;lt;option value=&quot;omega&quot;&amp;gt;omega&amp;lt;/option&amp;gt;
  &amp;lt;/select&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&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;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;전체 옵션 검색 가능 선택 상자&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;13&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 또한 다음과 같은 제어 버튼 키보드를 지원합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ArrowDown&lt;/code&gt; &lt;code&gt;ArrowUp&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;Enter&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;15&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;열쇠들.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;/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 filterFunction(that, event) {
    let container, input, filter, li, input_val;
    container = $(that).closest(&quot;.searchable&quot;);
    input_val = container.find(&quot;input&quot;).val().toUpperCase();

    if ([&quot;ArrowDown&quot;, &quot;ArrowUp&quot;, &quot;Enter&quot;].indexOf(event.key) != -1) {
        keyControl(event, container)
    } else {
        li = container.find(&quot;ul li&quot;);
        li.each(function (i, obj) {
            if ($(this).text().toUpperCase().indexOf(input_val) &amp;gt; -1) {
                $(this).show();
            } else {
                $(this).hide();
            }
        });

        container.find(&quot;ul li&quot;).removeClass(&quot;selected&quot;);
        setTimeout(function () {
            container.find(&quot;ul li:visible&quot;).first().addClass(&quot;selected&quot;);
        }, 100)
    }
}

function keyControl(e, container) {
    if (e.key == &quot;ArrowDown&quot;) {

        if (container.find(&quot;ul li&quot;).hasClass(&quot;selected&quot;)) {
            if (container.find(&quot;ul li:visible&quot;).index(container.find(&quot;ul li.selected&quot;)) + 1 &amp;lt; container.find(&quot;ul li:visible&quot;).length) {
                container.find(&quot;ul li.selected&quot;).removeClass(&quot;selected&quot;).nextAll().not('[style*=&quot;display: none&quot;]').first().addClass(&quot;selected&quot;);
            }

        } else {
            container.find(&quot;ul li:first-child&quot;).addClass(&quot;selected&quot;);
        }

    } else if (e.key == &quot;ArrowUp&quot;) {

        if (container.find(&quot;ul li:visible&quot;).index(container.find(&quot;ul li.selected&quot;)) &amp;gt; 0) {
            container.find(&quot;ul li.selected&quot;).removeClass(&quot;selected&quot;).prevAll().not('[style*=&quot;display: none&quot;]').first().addClass(&quot;selected&quot;);
        }
    } else if (e.key == &quot;Enter&quot;) {
        container.find(&quot;input&quot;).val(container.find(&quot;ul li.selected&quot;).text()).blur();
        onSelect(container.find(&quot;ul li.selected&quot;).text())
    }

    container.find(&quot;ul li.selected&quot;)[0].scrollIntoView({
        behavior: &quot;smooth&quot;,
    });
}

function onSelect(val) {
    alert(val)
}

$(&quot;.searchable input&quot;).focus(function () {
    $(this).closest(&quot;.searchable&quot;).find(&quot;ul&quot;).show();
    $(this).closest(&quot;.searchable&quot;).find(&quot;ul li&quot;).show();
});
$(&quot;.searchable input&quot;).blur(function () {
    let that = this;
    setTimeout(function () {
        $(that).closest(&quot;.searchable&quot;).find(&quot;ul&quot;).hide();
    }, 300);
});

$(document).on('click', '.searchable ul li', function () {
    $(this).closest(&quot;.searchable&quot;).find(&quot;input&quot;).val($(this).text()).blur();
    onSelect($(this).text())
});

$(&quot;.searchable ul li&quot;).hover(function () {
    $(this).closest(&quot;.searchable&quot;).find(&quot;ul li.selected&quot;).removeClass(&quot;selected&quot;);
    $(this).addClass(&quot;selected&quot;);
});&lt;/code&gt;&lt;/pre&gt; 
  &lt;pre class=&quot;snippet-code-css lang-css prettyprint-override&quot;&gt;&lt;code&gt;div.searchable {
    width: 300px;
    float: left;
    margin: 0 15px;
}

.searchable input {
    width: 100%;
    height: 50px;
    font-size: 18px;
    padding: 10px;
    -webkit-box-sizing: border-box; /* Safari/Chrome, other WebKit */
    -moz-box-sizing: border-box; /* Firefox, other Gecko */
    box-sizing: border-box; /* Opera/IE 8+ */
    display: block;
    font-weight: 400;
    line-height: 1.6;
    color: #495057;
    background-color: #fff;
    background-clip: padding-box;
    border: 1px solid #ced4da;
    border-radius: .25rem;
    transition: border-color .15s ease-in-out, box-shadow .15s ease-in-out;
    background: url(&quot;data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E&quot;) no-repeat right .75rem center/8px 10px;
}

.searchable ul {
    display: none;
    list-style-type: none;
    background-color: #fff;
    border-radius: 0 0 5px 5px;
    border: 1px solid #add8e6;
    border-top: none;
    max-height: 180px;
    margin: 0;
    overflow-y: scroll;
    overflow-x: hidden;
    padding: 0;
}

.searchable ul li {
    padding: 7px 9px;
    border-bottom: 1px solid #e1e1e1;
    cursor: pointer;
    color: #6e6e6e;
}

.searchable ul li.selected {
    background-color: #e8e8e8;
    color: #333;
}&lt;/code&gt;&lt;/pre&gt; 
  &lt;pre class=&quot;snippet-code-html lang-html prettyprint-override&quot;&gt;&lt;code&gt;&amp;lt;script src=&quot;https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;div class=&quot;searchable&quot;&amp;gt;
    &amp;lt;input type=&quot;text&quot; placeholder=&quot;search countries&quot; onkeyup=&quot;filterFunction(this,event)&quot;&amp;gt;
    &amp;lt;ul&amp;gt;
        &amp;lt;li&amp;gt;Algeria&amp;lt;/li&amp;gt;
        &amp;lt;li&amp;gt;Bulgaria&amp;lt;/li&amp;gt;
        &amp;lt;li&amp;gt;Canada&amp;lt;/li&amp;gt;
        &amp;lt;li&amp;gt;Egypt&amp;lt;/li&amp;gt;
        &amp;lt;li&amp;gt;Fiji&amp;lt;/li&amp;gt;
        &amp;lt;li&amp;gt;India&amp;lt;/li&amp;gt;
        &amp;lt;li&amp;gt;Japan&amp;lt;/li&amp;gt;
        &amp;lt;li&amp;gt;Iran (Islamic Republic of)&amp;lt;/li&amp;gt;
        &amp;lt;li&amp;gt;Lao People's Democratic Republic&amp;lt;/li&amp;gt;
        &amp;lt;li&amp;gt;Micronesia (Federated States of)&amp;lt;/li&amp;gt;
        &amp;lt;li&amp;gt;Nicaragua&amp;lt;/li&amp;gt;
        &amp;lt;li&amp;gt;Senegal&amp;lt;/li&amp;gt;
        &amp;lt;li&amp;gt;Tajikistan&amp;lt;/li&amp;gt;
        &amp;lt;li&amp;gt;Yemen&amp;lt;/li&amp;gt;
    &amp;lt;/ul&amp;gt;
&amp;lt;/div&amp;gt;&lt;/code&gt;&lt;/pre&gt; 
 &lt;/div&gt; 
&lt;/div&gt; 
&lt;p&gt;&lt;/p&gt;&lt;p papago-id=&quot;16&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;순수 HTML Datalist 요소를 사용하여 JavaScript 없이 이를 달성할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-html prettyprint-override&quot;&gt;&lt;code&gt;&amp;lt;form action=&quot;/action_page.php&quot; method=&quot;get&quot;&amp;gt;
  &amp;lt;input list=&quot;browsers&quot; name=&quot;browser&quot;&amp;gt;
  &amp;lt;datalist id=&quot;browsers&quot;&amp;gt;
    &amp;lt;option value=&quot;Internet Explorer&quot;&amp;gt;
    &amp;lt;option value=&quot;Firefox&quot;&amp;gt;
    &amp;lt;option value=&quot;Chrome&quot;&amp;gt;
    &amp;lt;option value=&quot;Opera&quot;&amp;gt;
    &amp;lt;option value=&quot;Safari&quot;&amp;gt;
  &amp;lt;/datalist&amp;gt;
  &amp;lt;input type=&quot;submit&quot;&amp;gt;
&amp;lt;/form&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;참조:&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://caniuse.com/datalist&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용 가능한가요? - Datalist 요소 상세 브라우저 지원&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/HTML/Element/datalist&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;19&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;MDN - : HTML Data List 요소&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://www.w3schools.com/tags/tag_datalist.asp&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;20&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;w3schools - HTML 태그&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt;&lt;p papago-id=&quot;21&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 우리 대부분에게 효과가 있을 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;가장 &lt;strong papago-id=&quot;21-1&quot;&gt;&lt;em papago-id=&quot;21-1-0&quot;&gt;쉬운&lt;/em&gt;&lt;/strong&gt; 방법은 헤만스 &lt;strong papago-id=&quot;21-1&quot;&gt;&lt;em papago-id=&quot;21-1-0&quot;&gt;팔레&lt;/em&gt;&lt;/strong&gt;가 제시한 답입니다, 저에게는 효과가 있었고 JS 코드는 필요 없었습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;제가 찾은 유일한 문제는 W3Schools에 따르면 &lt;a href=&quot;https://www.w3schools.com/tags/tag_datalist.asp&quot; papago-id=&quot;21-3&quot; rel=&quot;noreferrer&quot;&gt;데이터&lt;/a&gt; 목록 &lt;a href=&quot;https://www.w3schools.com/tags/tag_datalist.asp&quot; papago-id=&quot;21-3&quot; rel=&quot;noreferrer&quot;&gt;태그&lt;/a&gt;가 Internet Explorer 9 이전 버전이나 Safari에서 지원되지 않는다는 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;script src=&quot;https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;input list=&quot;browsers&quot;&amp;gt;
&amp;lt;datalist id=&quot;browsers&quot;&amp;gt;
  &amp;lt;option value=&quot;Internet Explorer&quot;&amp;gt;
  &amp;lt;option value=&quot;Firefox&quot;&amp;gt;
  &amp;lt;option value=&quot;Chrome&quot;&amp;gt;
  &amp;lt;option value=&quot;Opera&quot;&amp;gt;
  &amp;lt;option value=&quot;Safari&quot;&amp;gt;
&amp;lt;/datalist&amp;gt;  
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&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;바닐라 js만으로 목표에 도달하고 싶다면 Selectize.js에서 포크된 후 jQuery에서 분리된 &lt;a href=&quot;https://tom-select.js.org/&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;22-1&quot;&gt;Tom Select 라이브러리&lt;/a&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;    new TomSelect(&quot;#select-state&quot;,{
        create: false,
        sortField: {
            field: &quot;text&quot;,
            direction: &quot;asc&quot;
        }
    });&lt;/code&gt;&lt;/pre&gt; 
  &lt;pre class=&quot;snippet-code-html lang-html prettyprint-override&quot;&gt;&lt;code&gt;&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;link href=&quot;https://cdn.jsdelivr.net/npm/tom-select@2.0.0-rc.4/dist/css/tom-select.css&quot; rel=&quot;stylesheet&quot;&amp;gt;
    &amp;lt;script src=&quot;https://cdn.jsdelivr.net/npm/tom-select@2.0.0-rc.4/dist/js/tom-select.complete.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
  &amp;lt;select id=&quot;select-state&quot; placeholder=&quot;Pick a state...&quot;&amp;gt;
    &amp;lt;option value=&quot;&quot;&amp;gt;Select a state...&amp;lt;/option&amp;gt;
    &amp;lt;option value=&quot;AL&quot;&amp;gt;Alabama&amp;lt;/option&amp;gt;
    &amp;lt;option value=&quot;AK&quot;&amp;gt;Alaska&amp;lt;/option&amp;gt;
    &amp;lt;option value=&quot;AZ&quot;&amp;gt;Arizona&amp;lt;/option&amp;gt;
    &amp;lt;option value=&quot;AR&quot;&amp;gt;Arkansas&amp;lt;/option&amp;gt;
    &amp;lt;option value=&quot;CA&quot;&amp;gt;California&amp;lt;/option&amp;gt;
    &amp;lt;option value=&quot;CO&quot;&amp;gt;Colorado&amp;lt;/option&amp;gt;
    &amp;lt;option value=&quot;CT&quot;&amp;gt;Connecticut&amp;lt;/option&amp;gt;
    &amp;lt;option value=&quot;DE&quot;&amp;gt;Delaware&amp;lt;/option&amp;gt;
    &amp;lt;option value=&quot;DC&quot;&amp;gt;District of Columbia&amp;lt;/option&amp;gt;
    &amp;lt;option value=&quot;FL&quot;&amp;gt;Florida&amp;lt;/option&amp;gt;
    &amp;lt;option value=&quot;GA&quot;&amp;gt;Georgia&amp;lt;/option&amp;gt;
    &amp;lt;option value=&quot;HI&quot;&amp;gt;Hawaii&amp;lt;/option&amp;gt;
    &amp;lt;option value=&quot;ID&quot;&amp;gt;Idaho&amp;lt;/option&amp;gt;
    &amp;lt;option value=&quot;IL&quot;&amp;gt;Illinois&amp;lt;/option&amp;gt;
    &amp;lt;option value=&quot;IN&quot;&amp;gt;Indiana&amp;lt;/option&amp;gt;
  &amp;lt;/select&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt; 
 &lt;/div&gt; 
&lt;/div&gt; 
&lt;p&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;$(document).ready(function () {
//change selectboxes to selectize mode to be searchable
   $(&quot;select&quot;).select2();
});&lt;/code&gt;&lt;/pre&gt; 
  &lt;pre class=&quot;snippet-code-html lang-html prettyprint-override&quot;&gt;&lt;code&gt;&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;script src=&quot;https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;link href=&quot;https://cdn.jsdelivr.net/npm/select2@4.0.13/dist/css/select2.min.css&quot; rel=&quot;stylesheet&quot; /&amp;gt;
&amp;lt;script src=&quot;https://cdn.jsdelivr.net/npm/select2@4.0.13/dist/js/select2.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;

&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
  &amp;lt;select id=&quot;select_page&quot; style=&quot;width:200px;&quot; class=&quot;operator&quot;&amp;gt; 
         &amp;lt;option value=&quot;&quot;&amp;gt;Select a Page...&amp;lt;/option&amp;gt;
         &amp;lt;option value=&quot;alpha&quot;&amp;gt;alpha&amp;lt;/option&amp;gt; 
         &amp;lt;option value=&quot;beta&quot;&amp;gt;beta&amp;lt;/option&amp;gt;
         &amp;lt;option value=&quot;theta&quot;&amp;gt;theta&amp;lt;/option&amp;gt;
         &amp;lt;option value=&quot;omega&quot;&amp;gt;omega&amp;lt;/option&amp;gt;
  &amp;lt;/select&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt; 
 &lt;/div&gt; 
&lt;/div&gt; 
&lt;p&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;23&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 좋은 해결책이었지만, 문제는 대용량 데이터에는 비효율적이라는 것입니다.&lt;/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;여기에 앞서 만든 jQuery&lt;a href=&quot;https://bitbucket.org/warwick/searchablelist/src/master/&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;24-1&quot;&gt;:&lt;/a&gt; https://bitbucket.org/warwick/searchablelist/src/master/ 을 사용하는 편리한 오픈 소스 라이브러리가 있습니다. 그리고 여기에 제 VPS에 대한 작업 복사본이 있습니다.&lt;a href=&quot;http://developersfound.com/SearchableList/&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;24-3&quot;&gt; &lt;/a&gt;http://developersfound.com/SearchableList/ 라이브러리는 오버라이드 가능한 동작으로 사용자 지정이 가능하고 동일한 웹 페이지에서 별도의 디자인을 가질 수 있습니다. 이것이 도움이 되기를 바랍니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;25&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;코드의 몇 가지 업데이트를 통해 목표에 도달하고 싶다면 다음을 수행하십시오.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;     &amp;lt;link rel=&quot;stylesheet&quot; href=&quot;https://cdnjs.cloudflare.com/ajax/libs/selectize.js/0.12.6/css/selectize.bootstrap3.min.css&quot; integrity=&quot;sha256-ze/OEYGcFbPRmvCnrSeKbRTtjG4vGLHXgOqsyLFTRjg=&quot; crossorigin=&quot;anonymous&quot; /&amp;gt;
    &amp;lt;!-- Be sure to put the links in the right position to avoid dependency issue.--&amp;gt;
    &amp;lt;script src=&quot;https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;script src=&quot;https://cdnjs.cloudflare.com/ajax/libs/selectize.js/0.12.6/js/standalone/selectize.min.js&quot; integrity=&quot;sha256-+C0A5Ilqmu4QcSPxrlGpaZxJ04VjsRjKu+G82kl5UJk=&quot; crossorigin=&quot;anonymous&quot;&amp;gt;&amp;lt;/script&amp;gt;

&amp;lt;script&amp;gt;
    $(document).ready(function () {
        $('select').selectize({
            sortField: 'text'
        });
    });

  // to clear the selected value.
   $('form').find('.selectized').each(function(index, element) { element.selectize &amp;amp;&amp;amp; element.selectize.clear() })

 &amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;26&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 기능을 계속 사용하는 모든 사용자는 이 모든 작업을 쉽게 수행할 수 있는 Select2도 고려해 볼 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://select2.org/getting-started/installation&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;26-1&quot;&gt;https://select2.org/getting-started/installation&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;27&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;플러그인이 없는 간단한 솔루션이 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;html과 약간의 jquery만.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;아래 코드 샘플을 html 파일로 저장하여 테스트할 수 있습니다.&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 myFunction() {
  $(&quot;#dropdown-values&quot;).addClass(&quot;show&quot;);
}

$(document).click(function(e) {
  if( e.target.id != 'myInput') {
    $(&quot;#dropdown-values&quot;).removeClass(&quot;show&quot;);
  }
});

function filterFunction() {
  var input, filter, a, i;
  filter = $(&quot;#myInput&quot;).val().toUpperCase();
  div = document.getElementById(&quot;myDropdown&quot;);
  a = div.getElementsByTagName(&quot;a&quot;);
  for (i = 0; i &amp;lt; a.length; i++) {
    txtValue = a[i].textContent || a[i].innerText;
    if (txtValue.toUpperCase().indexOf(filter) &amp;gt; -1) {
      a[i].style.display = &quot;&quot;;
    } else {
      a[i].style.display = &quot;none&quot;;
    }
  }
}

function setValueOfInput(e) {
    $(&quot;#myInput&quot;).val(e.innerHTML);
}&lt;/code&gt;&lt;/pre&gt; 
  &lt;pre class=&quot;snippet-code-css lang-css prettyprint-override&quot;&gt;&lt;code&gt;.dropdown-content {
  position: absolute;
  background-color: #f6f6f6;
  overflow: auto;
}

.dropdown-content a {
  color: black;
  padding: 10px 16px;
  text-decoration: none;
  display: block;
}

.dropdown a:hover {background-color: #ddd;}

.show {display: block !important;}

.dropdown-values{
    display: none;
}&lt;/code&gt;&lt;/pre&gt; 
  &lt;pre class=&quot;snippet-code-html lang-html prettyprint-override&quot;&gt;&lt;code&gt;&amp;lt;script src=&quot;https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;

&amp;lt;h2&amp;gt;Dropdown with search&amp;lt;/h2&amp;gt;

&amp;lt;div class=&quot;dropdown&quot;&amp;gt;
  &amp;lt;div id=&quot;myDropdown&quot; class=&quot;dropdown-content&quot;&amp;gt;
    &amp;lt;input type=&quot;text&quot; placeholder=&quot;Search..&quot; id=&quot;myInput&quot; onkeyup=&quot;filterFunction()&quot; onclick=&quot;myFunction()&quot;&amp;gt;
    &amp;lt;div id=&quot;dropdown-values&quot; class=&quot;dropdown-values&quot;&amp;gt;
        &amp;lt;a onclick=&quot;setValueOfInput(this)&quot;&amp;gt;option 1&amp;lt;/a&amp;gt;
        &amp;lt;a onclick=&quot;setValueOfInput(this)&quot;&amp;gt;option 2&amp;lt;/a&amp;gt;
        &amp;lt;a onclick=&quot;setValueOfInput(this)&quot;&amp;gt;option 3&amp;lt;/a&amp;gt;
        &amp;lt;a onclick=&quot;setValueOfInput(this)&quot;&amp;gt;option 4&amp;lt;/a&amp;gt;
        &amp;lt;a onclick=&quot;setValueOfInput(this)&quot;&amp;gt;option 5&amp;lt;/a&amp;gt;
    &amp;lt;/div&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/code&gt;&lt;/pre&gt; 
 &lt;/div&gt; 
&lt;/div&gt; 
&lt;p&gt;&lt;/p&gt;&lt;p papago-id=&quot;28&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 부트스트랩 4를 위해 제 버전을 했습니다.&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://github.com/AmagiTech/amagibootstrapsearchmodalforselect&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;28-1&quot;&gt;https://github.com/AmagiTech/amagibootstrapsearchmodalforselect&lt;/a&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;amagiDropdown(
    {
        elementId: 'commonWords',
        searchButtonInnerHtml: 'Search',
        closeButtonInnerHtml: 'Close',
        title: 'Search and Choose',
        bodyMessage: 'Please firstly search with textbox below later double click the option you choosed.'
    });&lt;/code&gt;&lt;/pre&gt; 
  &lt;pre class=&quot;snippet-code-html lang-html prettyprint-override&quot;&gt;&lt;code&gt;&amp;lt;link href=&quot;https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css&quot; rel=&quot;stylesheet&quot;/&amp;gt;
&amp;lt;div class=&quot;form-group&quot;&amp;gt;
                &amp;lt;label for=&quot;commonWords&quot;&amp;gt;Favorite Word&amp;lt;/label&amp;gt;
                &amp;lt;select id=&quot;commonWords&quot;&amp;gt;
                    &amp;lt;option value=&quot;1&quot;&amp;gt;claim – I claim to be a fast reader, but actually I am average.&amp;lt;/option&amp;gt;
                    &amp;lt;option value=&quot;2&quot; selected&amp;gt;be – Will you be my friend?&amp;lt;/option&amp;gt;
                    &amp;lt;option value=&quot;3&quot;&amp;gt;and – You and I will always be friends.&amp;lt;/option&amp;gt;
                &amp;lt;/select&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;script src=&quot;https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script src=&quot;https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script src=&quot;https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;

&amp;lt;script src=&quot;https://rawcdn.githack.com/AmagiTech/amagibootstrapsearchmodalforselect/9c7fdf8903b3529ba54b2db46d8f15989abd1bd1/amagidropdown.js&quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt; 
 &lt;/div&gt; 
&lt;/div&gt; 
&lt;p&gt;&lt;/p&gt;&lt;p papago-id=&quot;29&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;코드는 여기 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;select class=&quot;chosen&quot; style=&quot;width:500px;&quot;&amp;gt;
&amp;lt;option&amp;gt;Html&amp;lt;/option&amp;gt;
&amp;lt;option&amp;gt;Css&amp;lt;/option&amp;gt;
&amp;lt;option&amp;gt;Css3&amp;lt;/option&amp;gt;
&amp;lt;option&amp;gt;Php&amp;lt;/option&amp;gt;
&amp;lt;option&amp;gt;MySql&amp;lt;/option&amp;gt;
&amp;lt;option&amp;gt;Javascript&amp;lt;/option&amp;gt;
&amp;lt;option&amp;gt;Jquery&amp;lt;/option&amp;gt;
&amp;lt;option&amp;gt;Html5&amp;lt;/option&amp;gt;
&amp;lt;option&amp;gt;Wordpress&amp;lt;/option&amp;gt;
&amp;lt;option&amp;gt;Joomla&amp;lt;/option&amp;gt;
&amp;lt;option&amp;gt;Druple&amp;lt;/option&amp;gt;
&amp;lt;option&amp;gt;Json&amp;lt;/option&amp;gt;
&amp;lt;option&amp;gt;Angular Js&amp;lt;/option&amp;gt;
&amp;lt;/select&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
$(&quot;.chosen&quot;).chosen();
&amp;lt;/script&amp;gt;
&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;URL : https://stackoverflow.com/questions/18796221/creating-a-select-box-with-a-search-option&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>JQuery</category>
      <author>lovecheck</author>
      <guid isPermaLink="true">https://lovecheck.tistory.com/927</guid>
      <comments>https://lovecheck.tistory.com/927#entry927comment</comments>
      <pubDate>Sat, 14 Oct 2023 10:20:48 +0900</pubDate>
    </item>
  </channel>
</rss>