<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>lovejava</title>
    <link>https://lovejava.tistory.com/</link>
    <description>각종 프로그래밍 정보를 다루는 블로그입니다.</description>
    <language>ko</language>
    <pubDate>Mon, 25 May 2026 14:31:37 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>lovejava</managingEditor>
    <item>
      <title>git stash branch-specific인가요, 아니면 전체 저장소를 대상으로 하나요?</title>
      <link>https://lovejava.tistory.com/765</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;git stash branch-specific인가요, 아니면 전체 저장소를 대상으로 하나요?&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;지점에 들어가서 일을 좀 했습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 다른 지점에 들어가고 싶었지만 약속하고 싶지 않아서 그렇게 했습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;git stash&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;. 그 다음에.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;git checkout &amp;lt;otherbranch&amp;gt;&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;. 저는 그곳에서 일을 좀 했고, 첫 번째 지점과 마찬가지로 일을 시작하기 전에 전환하고 싶었습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그래서.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;git stash&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;거기도 그렇고요.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;첫번째 지점으로 다시 전환하여 언스태시를 시도했습니다(&lt;/font&gt;&lt;/font&gt;&lt;code&gt;git stash pop&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;특정 지점에서 은닉처를 얻을 수 있을 거라 생각했습니다&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;나는 그것이 그들로부터 숨겨진 것을 제거한 것에 놀랐습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&amp;lt;otherbranch&amp;gt;&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;(latest 스테이징).&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 동작은 전체 로컬 저장소에 대해 하나의 은닉처만 존재한다는 것을 의미합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이스&lt;/font&gt;&lt;/font&gt;&lt;code&gt;git stash&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;지점별로 구분할 수 있습니까? 아니면 전체 저장소에 적용할 수 있습니까?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저장소 전체를 대상으로 하는 경우 분기별로 할 수 있도록 옵션을 전달할 수 있습니까?&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아니요, 아니요. git stash는 저장소 단위입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여기 그것의 사용법에 대한 &lt;a href=&quot;https://www.devroom.io/2008/04/23/git-using-the-stash/&quot; rel=&quot;noreferrer&quot;&gt;좋은&lt;/a&gt; 페이지가 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;현재 스택을 보려면 다음을 수행합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;git stash list
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;스택에서 특정 스택을 선택하려면 해당 스택을 참조하십시오.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;stash@{&lt;em&gt;number&lt;/em&gt;}&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;위와 같이&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;동작을 분기별로 수행하려면 분기에 대해 커밋(또는 여러 커밋)만 수행할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;커밋은 나중에 언제든지 &quot;실행 취소&quot;할 수 있습니다(예:&lt;/font&gt;&lt;/font&gt;&lt;code&gt;git reset&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;,어느 하나&lt;/font&gt;&lt;/font&gt;&lt;code&gt;--soft&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아니면&lt;/font&gt;&lt;/font&gt;&lt;code&gt;--mixed&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;; &lt;a href=&quot;https://www.kernel.org/pub/software/scm/git/docs/git-reset.html&quot; rel=&quot;noreferrer&quot;&gt;git reset 설명서&lt;/a&gt;를 참조하거나 함께 사용합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;git rebase -i&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;일시적인 것을 폐기하는 동안 최종적인 &quot;진짜&quot; 커밋만 유지합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;(정말로 본받으려면)&lt;/font&gt;&lt;/font&gt;&lt;code&gt;git stash&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;인덱스 상태에 대한 커밋과 워크트리 상태에 대한 커밋이 적어도 두 개 필요합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;인덱스 상태를 저장하고 복원할 계획이 없다면 그냥&lt;/font&gt;&lt;/font&gt;&lt;code&gt;git add -A&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;전체 워크 트리 상태를 확인하고 임시 커밋에 넣었습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아니면.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;git stash&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;는 셸 스크립트이므로 기본적으로 branch 단위로 작동하도록 복사 및 수정하기가 매우 용이합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;refs/pb-stash/&lt;em&gt;branch&lt;/em&gt;&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하나의 글로벌이 아닌 그것의 작업명 공간으로서.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;refs/stash&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;레포(repo) 전체에 대하여&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;명시적으로 이름을 지정하면 한 분기에서 다른 분기로 스테이시를 가져올 수 있습니다.)&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여기 있는 모든 답변들이 왜 다음과 같은 숨겨진 것을 모방해야 하는지 확신할 수 없습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;commit&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;+&lt;/font&gt;&lt;/font&gt;&lt;code&gt;reset&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;. 스테이시는 완벽하게 사용해도 좋습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음은 스테이시 워크플로우입니다.&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;분기를 전환해야 할 때 커밋할 준비가 되지 않은 경우 변경 사항을 스택에 저장합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;git stash save &quot;Your custom stash message&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;(사용자 지정 메시지를 원하지 않을 경우, 간단히 다음을 사용합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;git stash&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;).&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;분기로 돌아가면 다음과 같은 스테이시 목록을 볼 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;git stash list
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;a href=&quot;https://i.stack.imgur.com/trpHK.png&quot; rel=&quot;noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/trpHK.png&quot; alt=&quot;enter image description here&quot;&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;지점에 있는 경우&lt;/font&gt;&lt;/font&gt;&lt;code&gt;FixIssue0203&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;당신은 사용할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;git stash pop&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;왜냐하면 이것은 위에 적용될 것이기 때문입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;stash@{0}&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;은닉처에서 제거합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하지만 당신이 지사에 있는 경우&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ImproveReadme&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;당신은 먼저 stage 1을 적용해야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;git stash apply stash@{1}&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;스택에서 스택 1을 제거합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;git stash drop stash@{1}&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그거에요!&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;파일을 개별적으로만 숨기려면 일이 좀 까다롭습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;자세한 내용은 https://stackoverflow.com/a/12305243/2311074 를 읽어보세요.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제트브레인을 사용하는 경우 셸브(shelve)라는 기능이 있어 나중에 재사용하고 싶은 파일을 체리픽할 수 있습니다. https://www.jetbrains.com/help/idea/shelving-and-unshelving-changes.html (GIT의 일부가 아닙니다.)&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;code&gt;git stash&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;branch 단위가 아닙니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;대신에&lt;/font&gt;&lt;/font&gt;&lt;code&gt;git stash&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;(스캐시와 가지가 많으면 쉽게 분실될 수 있음)&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;나는 그것을 하는 것을 제안합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;git commit&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;완료되지 않은 코드를 분기에 저장하고 코드를 완료할 준비가 되었을 때&lt;/font&gt;&lt;/font&gt;&lt;code&gt;git reset ${COMMIT_HASH_VALUE}&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;미완성 코드를 되찾다&lt;/font&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;&lt;code&gt;git commit&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;git reset&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;정확하게 &lt;em&gt;함께&lt;/em&gt; 사용될 때 a를 시뮬레이션 할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;git stash&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;특정 지점에 대하여&lt;/font&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여기 가치와 사용법을 보여주는 일반적인 실제 시나리오가 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;commit&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;reset&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;명령:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;당신은 피쳐 브랜치 X에서 작업중인데 당신의 코드는 테스트를 컴파일하거나 통과하지도 않습니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;현재 새 기능보다 우선 순위가 높은 버그가 있으므로 버그 수정 작업을 즉시 시작해야 합니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;git stash를 하는 것보다 (많은 stash와 많은 branch가 있기 때문에 stash는 mix에서 손실됩니다)&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;당신은 할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;git commit&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;피쳐 브랜치 X에&lt;/font&gt;&lt;/font&gt;&lt;ul&gt; 
   &lt;li&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;을 적어 두다&lt;/font&gt;&lt;/font&gt;&lt;code&gt;COMMIT_HASH_VALUE&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;나중을 위하여&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
  &lt;/ul&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;새로운 지점 Y에서 핫픽스를 확인합니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;분기 Y에서 핫픽스 완료(핫픽스를 기준선으로 가져오고 핫픽스 분기를 삭제하기 위해 병합 요청)&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그런 다음 피쳐 브랜치 X를 다시 확인합니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;컴파일하거나 테스트를 통과하지 못한 미완성 작업을 터뜨리기 위해 --&amp;gt; 그냥.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;git reset ${COMMIT_HASH_VALUE}&lt;/code&gt;&lt;/strong&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;(FYI 기본값:&lt;/font&gt;&lt;/font&gt;&lt;code&gt;git reset&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;가&lt;/font&gt;&lt;/font&gt;&lt;code&gt;--mixed&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;)&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것은 당신의 질문에 대한 답이 아닐 수도 있지만, 저는 트레버 보이드 스미스가 수락된 답변에서 언급한 것과 같은 사용 사례에 대한 답이라고 믿습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&quot;commit 및 reset 명령의 값과 사용량을 보여주는 일반적인 실제 시나리오는 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;기능 분기 X에서 작업 중인데 코드가 컴파일하거나 테스트를 통과하지도 않았는데 현재 새 기능보다 우선 순위가 높은 버그가 있으므로 즉시 버그 수정 작업을 시작해야 합니다&lt;strong&gt;(게다가 많은&lt;/strong&gt; 분기와 &lt;strong&gt;많은 분기가 있기 때문에 해당&lt;/strong&gt; 버그 수정 &lt;strong&gt;작업&lt;/strong&gt;을 시작해야 합니다&lt;strong&gt;).&quot;&lt;/strong&gt; h가 이를 굵게 표시했습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;많은 사람들에게 호감을 느낍니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제가 하는 일은 말 그대로 동일한 저장소의 복사본을 5개 가지고 루트 폴더의 이름을 적절하게 지정하여 사용자가 어디에 있는지 파악하지 않고 말 그대로 몇 초 만에 작동하는 지점으로 전환할 수 있도록 하는 것입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;IDE의 두 번째 인스턴스도 열 수 있으므로 멀티 태스커를 사용할 경우 폴더 2에서 20분 핫픽스를 작업하고 작업이 끝나면 폴더 1에서 더 큰 작업으로 돌아갈 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;어떤 폴더를 어떤 용도로 사용할 것인지 어느 정도 관리해야 합니다. 모든 폴더는 정기적으로 최신 상태를 유지해야 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;또한 이러한 작업 디렉토리의 루트를 어떤 버전의 파일 스토리지에 정기적으로 백업/동기화하여 항상 혼란에서 벗어날 수 있도록 하는 것이 좋습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;깃 퓨리스트들은 이 워크플로우에 동의하지 않을 수 있지만, 저는 이 워크플로우를 사용하는 다른 많은 개발자들을 봐왔습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;장단점.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;개인적으로 저는 이 방법이 창고 분실이나 어느 지점에 창고를 다시 적용해야 할지에 대한 걱정 없이 트레버가 언급한 사용 사례를 수행하는 가장 빠른 방법이라고 생각합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;즉, 실수로 범하고 싶지 않은 현재 분기의 커밋되지 않은/스캐치되지 않은/완전히 망가진 엉망인 상태에서 파일을 병합/디퍼할 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/20526355/is-git-stash-branch-specific-or-for-the-whole-repository&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>Git</category>
      <author>lovejava</author>
      <guid isPermaLink="true">https://lovejava.tistory.com/765</guid>
      <comments>https://lovejava.tistory.com/765#entry765comment</comments>
      <pubDate>Sun, 5 Nov 2023 10:48:54 +0900</pubDate>
    </item>
    <item>
      <title>이 &amp;quot;SQL 문 무시됨&amp;quot; 오류를 수정하려면 어떻게 해야 합니까?</title>
      <link>https://lovejava.tistory.com/764</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 &quot;SQL 문 무시됨&quot; 오류를 수정하려면 어떻게 해야 합니까?&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;컴파일되지 않는 작은 함수는 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;function f_query_01  Return interval Day to second is 
  start_time timestamp(3);
  end_time timestamp(3);
  time_diff interval Day to second;  
  c_query_number number;

begin

  start_time := systimestamp; 
  select count(*) into c_query_number from wg;  &amp;lt;--This is the line that errors out
  end_time := systimestamp;
  time_diff := start_time - end_time;

  return time_diff;

end f_query_01;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;컴파일러에서 다음과 같은 오류가 발생합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Error(29,3): PL/SQL: SQL Statement ignored
Error(29,44): PL/SQL: ORA-04044: procedure, function, package, or type is not allowed here
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 오류의 원인은 무엇이며 어떻게 수정할 수 있습니까?&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;wg 테이블이 존재하지 않는 것으로 보입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;올바른 테이블 이름으로 업데이트하면 컴파일이 오류 없이 작동합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;테이블의 컴파일러가 보낸 메시지가 존재하지 않는 것이 가장 도움이 될 것입니다.&lt;/font&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;CREATE OR REPLACE FUNCTION f_query_01
   RETURN NUMBER
IS
BEGIN
   DECLARE
      c_query_number   NUMBER DEFAULT NULL;
      start_time       DATE DEFAULT NULL;
      end_time         DATE DEFAULT NULL;
      time_diff        NUMBER DEFAULT NULL;
   BEGIN
      SELECT CAST (SYSTIMESTAMP AS DATE) INTO start_time FROM DUAL;

      SELECT COUNT (*) INTO c_query_number FROM ws;

      SELECT CAST (SYSTIMESTAMP AS DATE) INTO end_time FROM DUAL;

      time_diff := start_time - end_time;

      RETURN time_diff;
   END;
END f_query_01;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/3113211/how-can-i-fix-this-sql-statement-ignored-error&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>Oracle</category>
      <author>lovejava</author>
      <guid isPermaLink="true">https://lovejava.tistory.com/764</guid>
      <comments>https://lovejava.tistory.com/764#entry764comment</comments>
      <pubDate>Sun, 5 Nov 2023 10:48:47 +0900</pubDate>
    </item>
    <item>
      <title>도커 컨테이너를 중지하거나 다시 시작할 수 없습니다.</title>
      <link>https://lovejava.tistory.com/763</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;도커 컨테이너를 중지하거나 다시 시작할 수 없습니다.&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;도커 컨테이너를 중지하거나 재시작하려고 하면 다음 오류 메시지가 나타납니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$ docker restart 5ba0a86f36ea
Error response from daemon: Cannot restart container 5ba0a86f36ea: [2] Container does not exist: container destroyed
Error: failed to restart containers: [5ba0a86f36ea]
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하지만 달리다 보면&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$ docker logs -f 5ba0a86f36ea
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;로그를 볼 수 있으니 분명히 컨테이너가 존재합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;무슨 생각 있어요?&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;편집:&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;미안해요, 제가 이 얘기를 하는 걸 깜빡했네요.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;내가 뛸때&lt;/font&gt;&lt;/font&gt;&lt;code&gt;docker ps -a&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;컨테이너가 가동되고 있는 것으로 보입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하지만 그 안에 있는 애플리케이션이 작동하지 않아서 다시 시작하거나, 아니면 해당 애플리케이션의 새 버전을 온라인으로 받고 싶습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러나 컨테이너를 중지하고 제거할 수 없을 때, 동일한 포트를 수신하는 새로운 응용프로그램을 실행할 수 없습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;찾을 수가 없었습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;boot2docker&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;내 기계 안에.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그래서 제게 맞는 것을 생각해 냈습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$ sudo systemctl restart docker.socket docker.service
$ docker rm -f &amp;lt;container id&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;당신에게도 도움이 되는지 확인해 보세요.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;모든 도커:&lt;/font&gt;&lt;/font&gt;&lt;code&gt;start | restart | stop | rm --force | kill&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;컨테이너가 고착된 경우 명령이 작동하지 않을 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;도커 데몬을 언제든지 재시작할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러나 다른 컨테이너가 실행 중인 경우에는 해당 옵션이 아닐 수도 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;할 수 있는 일은 다음과 같습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;ps aux | grep &amp;lt;&amp;lt;container id&amp;gt;&amp;gt; | awk '{print $1 $2}'
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;출력 내용은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;&amp;lt;user&amp;gt;&amp;gt;&amp;lt;&amp;lt;process id&amp;gt;&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그런 다음 용기와 관련된 프로세스를 다음과 같이 죽입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;sudo kill -9 &amp;lt;&amp;lt;process id from above command&amp;gt;&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러면 컨테이너가 소멸되고 올바른 이미지로 새 컨테이너를 시작할 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;도커 1.6 또는 1.7에서 볼 수 있는 &lt;a href=&quot;https://github.com/docker/docker/issues/12738&quot; rel=&quot;noreferrer&quot;&gt;도커/도커/이슈/12738&lt;/a&gt;처럼 보입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;일부 컨테이너가 제대로 중지되지 않고 다시 시작됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사용자 호스트에서 1.5.0에서 1.6.0으로 업그레이드할 때 이러한 문제가 자주 발생합니다.&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;업그레이드 후 일부 컨테이너를 중지할 수 없습니다(제공).&lt;/font&gt;&lt;/font&gt;&lt;code&gt;500 Server Error: Internal Server Error (&quot;Cannot stop container xxxxx: [2] Container does not exist: container destroyed&quot;&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;( ) 또는 강제 파괴(증여)&lt;/font&gt;&lt;/font&gt;&lt;code&gt;500 Server Error: Internal Server Error (&quot;Could not kill running container, cannot remove - [2] Container does not exist: container destroyed&quot;&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;)). 호스트에서 프로세스가 계속 실행되고 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;때로는 도커 데몬을 다시 시작한 후에 작동하기도 합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음과 같은 해결 방법이 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그 죽일 수 없는 컨테이너에 대한 모든 원격 API 호출을 시도해 보았는데 결과는 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
 &lt;ul&gt; 
  &lt;li&gt;&lt;code&gt;json&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;stats&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;changes&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;top&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;logs&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;반환된 유효한 응답&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
  &lt;li&gt;&lt;code&gt;stop&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;pause&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;wait&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;kill&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;신고된 404(!)&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;/ul&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;리모트 API 완료 후 다시 확인하였습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;docker ps&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;(컨테이너는 여전히 그곳에 있었습니다) 하지만 도커킬을 다시 시도했는데 효과가 있었습니다!&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;컨테이너가 죽어서 제거할 수 있었습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;또는:&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;작동한 것은 다시 시작하는 것이었습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;boot2docker&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;내 주인에게.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고나서&lt;/font&gt;&lt;/font&gt;&lt;code&gt;docker rm -f&lt;/code&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;pre&gt;&lt;code&gt;$ boot2docker stop
$ boot2docker start
$ docker rm -f 1f061139ba04
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;알만한 가치:&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;ENTERPOINT 스크립트를 실행하는 경우...&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;대본은 쉐뱅과 함께 작동할 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#!/bin/bash -x
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하지만 용기가 다음과 같이 멈추는 것을 막을 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#!/bin/bash -xe
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;즐거운 시간 되세요.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;sudo aa-remove-unknown&lt;/code&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것이 저에게 효과가 있었던 것입니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Mac에서 Docker Desktop이 설치된 모든 사용자에게 적합합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;트레이 아이콘을 클릭해서 이렇게 말할 수 있었습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Restart Docker&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;. 다시 시작하자 컨테이너를 삭제할 수 있었습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&quot;top&quot; 명령을 사용하여 좀비 프로세스가 있는지 확인합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;docker ps | grep &amp;lt;&amp;lt;container name&amp;gt;&amp;gt; 
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;컨테이너 ID를 가져옵니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;ps -ef | grep &amp;lt;&amp;lt;container id&amp;gt;&amp;gt;

ps -ef|grep defunct | grep java
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고 부모 PID에 의해 컨테이너를 죽입니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Mac에서 Terminal: Use&lt;/font&gt;&lt;/font&gt;&lt;code&gt;killall Docker&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;도커를 그만두는 겁니다&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;응용프로그램 폴더에서 또는 다음을 사용하여 다시 시작&lt;/font&gt;&lt;/font&gt;&lt;code&gt;open /Applications/Docker.app&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그 다음에 실행할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;docker rm &amp;lt;id&amp;gt;&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;해당 컨테이너에 대해&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;윈도우 호스트 머신에서도 같은 문제가 발생했는데 여기 있는 다른 옵션들은 하나도 제게 효과가 없었습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여기에 있는 물리적 컨테이너 폴더를 삭제해야 했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;C:\ProgramData\Docker\containers\[container guid]
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 안전을 위해 도커 서비스를 먼저 중단했고, 다시 시작해보니 고장난 컨테이너가 사라지고 새로운 컨테이너를 만들 수 있었습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;리눅스 호스트 머신에서도 동일하게 작동할 것이라 생각하지만, 해당 OS에서 컨테이너 폴더가 어디에 보관되어 있는지 모르겠습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;em&gt;&lt;strong&gt;Ubuntu&lt;/strong&gt;&lt;/em&gt; 시스템 프로세스 ID를 사용하여 컨테이너를 중지합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음을 사용하여 기본 프로세스 ID를 가져옵니다.&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;도커 검사 -f'{{.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;상태.Pid}' 컨테이너-id&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;ID를 '&lt;em&gt;25430&lt;/em&gt;'으로 반환합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;명령으로 이 일을 처치합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;sudo kill -925430&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제 경우 노매드 작업으로 생성된 컨테이너를 삭제할 수 없습니다. 출력이 없습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;docker logs &amp;lt;ContainerID&amp;gt;&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;일반적으로 얼은 것처럼 보입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;지금까지 해결책은 다음과 같습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;sudo service docker restart&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;, 누가 더 좋은 것을 추천해 주시겠습니까?&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 제가 컨테이너를 시스템 서비스로 시작하게 했다는 것을 잊었습니다.&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;만약 내가 그 컨테이너를 멈추거나 죽였다면, 서비스는 그것을 다시 가져올 겁니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;systemctl을 사용하는 경우 실행 중인 모든 서비스를 다음과 같이 나열할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;systemctl | grep running&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;서비스 이름을 찾습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그럼 쓰시오&lt;/font&gt;&lt;/font&gt;&lt;code&gt;sudo systemctl disable &amp;lt;your_service_name&amp;gt;&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그것을 멈추기 위해서 입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Ubuntu를 사용하는 경우 도커 컴포지트가 스냅으로 설치되지 않았는지 확인합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이로 인해 위와 같은 모든 종류의 무작위 문제가 발생합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;스냅을 제거합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;sudo snap remove docker-compose
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;구성 저장소에서 수동으로 설치합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://docs.docker.com/compose/install/&quot; rel=&quot;nofollow noreferrer&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;도커구성설치지시&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;때때로 이는 도커 데몬의 문제로 인해 발생합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;도커 서비스를 다시 시작해서 문제를 해결했습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;리눅스의 경우:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;systemctl restart docker
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저 같은 경우에는.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;docker rm $(docker ps -aq)&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저한테는 통합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/31365827/cannot-stop-or-restart-a-docker-container&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>docker</category>
      <author>lovejava</author>
      <guid isPermaLink="true">https://lovejava.tistory.com/763</guid>
      <comments>https://lovejava.tistory.com/763#entry763comment</comments>
      <pubDate>Sun, 5 Nov 2023 10:48:40 +0900</pubDate>
    </item>
    <item>
      <title>하나의 열에 고유(여러 열) 및 null</title>
      <link>https://lovejava.tistory.com/762</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하나의 열에 고유(여러 열) 및 null&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;간단한 카테고리 테이블이 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;범주에는 상위 범주가 있을 수 있습니다(&lt;/font&gt;&lt;/font&gt;&lt;code&gt;par_cat&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;column) 또는 null(기본 범주이고 부모 범주가 동일한 경우에는 이름이나 URL이 같은 범주가 2개 이상 없어야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 테이블의 코드:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;CREATE TABLE IF NOT EXISTS `categories` (
`id` int(10) unsigned NOT NULL,
  `par_cat` int(10) unsigned DEFAULT NULL,
  `lang` varchar(2) COLLATE utf8_unicode_ci NOT NULL DEFAULT 'pl',
  `name` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
  `url` varchar(120) COLLATE utf8_unicode_ci NOT NULL,
  `active` tinyint(3) unsigned NOT NULL DEFAULT '1',
  `accepted` tinyint(3) unsigned NOT NULL DEFAULT '1',
  `priority` int(10) unsigned NOT NULL DEFAULT '1000',
  `entries` int(10) unsigned NOT NULL DEFAULT '0',
  `created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00'
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=3 ;



ALTER TABLE `categories`
  ADD PRIMARY KEY (`id`), 
  ADD UNIQUE KEY `categories_name_par_cat_unique` (`name`,`par_cat`), 
  ADD UNIQUE KEY `categories_url_par_cat_unique` (`url`,`par_cat`), 
  ADD KEY `categories_par_cat_foreign` (`par_cat`);


ALTER TABLE `categories`
  MODIFY `id` int(10) unsigned NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=3;

ALTER TABLE `categories`ADD CONSTRAINT `categories_par_cat_foreign` 
  FOREIGN KEY (`par_cat`) REFERENCES `categories` (`id`);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;문제는 제가 고유한 키를 가지고 있어도 작동하지 않는다는 것입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;데이터베이스에 다음을 포함하는 2개의 카테고리를 삽입하려고 하면&lt;/font&gt;&lt;/font&gt;&lt;code&gt;par_cat&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;로 설정.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;null&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고 동일한 이름과 url, 이 두 카테고리는 문제없이 데이터베이스에 삽입될 수 있습니다(그리고 그렇게 해서는 안 됩니다).&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러나 이 범주에 대해 선택하면 다른 범주에서&lt;/font&gt;&lt;/font&gt;&lt;code&gt;par_cat&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;(예를 들어, ID가 1인 카테고리가 존재한다고 가정할 경우), 첫 번째 레코드만 삽입됩니다(이는 원하는 동작입니다).&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;질문 - 이 사건을 어떻게 처리해야 합니까?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;나는 다음을 읽었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;UNIQUE 인덱스는 인덱스의 모든 값이 서로 달라야 하는 제약 조건을 만듭니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;기존 행과 일치하는 키 값으로 새 행을 추가하려고 하면 오류가 발생합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 제약 조건은 BDB 스토리지 엔진을 제외한 NULL 값에는 적용되지 않습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다른 엔진의 경우 UNICEF 인덱스는 NULL을 포함할 수 있는 열에 대해 여러 NULL 값을 허용합니다. UNICEF 인덱스의 열에 대한 접두사 값을 지정하는 경우 열 값은 접두사 내에서 고유해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러나 여러 열에 고유한 항목이 있는 경우에는 그렇지 않을 것으로 예상했습니다(단,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;par_cat&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;null일 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;name&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;url&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;null일 수 없습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;왜냐면&lt;/font&gt;&lt;/font&gt;&lt;code&gt;par_cat&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;에 대한 언급.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;id&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;같은 테이블이지만 일부 범주에는 허용해야 할 상위 범주가 없습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;null&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;가치.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;SQL 표준에서 정의한 대로 작동합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;NULL은 알 수 없음을 의미합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;par_cat = NULL 및 name = 'X'의 두 레코드가 있는 경우 두 NULL은 동일한 값을 가지는 것으로 간주되지 않습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;따라서 고유한 키 제약 조건을 위반하지 않습니다.(음, NULL은 여전히 동일한 값을 의미할 수 &lt;em&gt;있지만&lt;/em&gt; 이 규칙을 적용하면 고유한 인덱스와 NULL 필드를 사용하는 작업이 거의 불가능합니다. NULL은 1, 2 또는 다른 값을 의미할 수도 있기 때문입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그래서 그들은 제 생각처럼 잘 정의했습니다.)&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;MySQL은 인덱스를 가질 수 있는 기능 인덱스를 지원하지 않기 때문에&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ISNULL(par_cat,-1), name&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;, 제약 조건이 작동하도록 하려면 par_cat를 &quot;부모 없음&quot;에 대해 0 또는 -1 또는 그 밖에 없는 NOT NULL 열로 만드는 것이 유일한 옵션입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것은 2014년에 요청된 것으로 알고 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러나 MySQL: https://bugs.mysql.com/bug.php?id=8173 및 https://bugs.mysql.com/bug.php?id=17825 에서 요청하는 경우가 많습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사람들은 MySQL에서 관심을 끌기 위해 영향을 클릭할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;MySQL 5.7 이후로 이제 다음과 같은 해결 방법을 사용할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;ALTER TABLE categories 
ADD generated_par_cat INT UNSIGNED AS (ifNull(par_cat, 0)) NOT NULL,
ADD UNIQUE INDEX categories_name_generated_par_cat (name, generated_par_cat), 
ADD UNIQUE INDEX categories_url_generated_par_cat (url, generated_par_cat); 
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;generated_par_cat은 가상으로 생성된 열이므로 저장 공간이 없습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사용자가 삽입(또는 업데이트)하면 고유 인덱스로 인해 generated_par_cat 값이 즉시 생성됩니다. 이는 매우 빠른 작업입니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;혹시 라라벨에서 오실 때를 대비해서요&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 버전은 가상 칼럼에서 해결할 수 있는 Laravel의 마이그레이션 버전입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;UNIQUE&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;열 중 하나가 다음과 같은 경우 발행&lt;/font&gt;&lt;/font&gt;&lt;code&gt;NULL&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;값어치가 있는&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$table-&amp;gt;integer('generated_par_cat')-&amp;gt;virtualAs('ifNull(par_cat, 0)');

$table-&amp;gt;unique(['name', 'generated_par_cat'], 'name_par_cat_unique');
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/25844786/unique-multiple-columns-and-null-in-one-column&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>MySQL</category>
      <author>lovejava</author>
      <guid isPermaLink="true">https://lovejava.tistory.com/762</guid>
      <comments>https://lovejava.tistory.com/762#entry762comment</comments>
      <pubDate>Sun, 5 Nov 2023 10:48:33 +0900</pubDate>
    </item>
    <item>
      <title>앱이 설치되지 않은 것처럼 보여도 [INSTALL_FAILED_UPDATE_INCOMPATIC] 실패</title>
      <link>https://lovejava.tistory.com/761</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;앱이 설치되지 않은 것처럼 보여도 [INSTALL_FAILED_UPDATE_INCOMPATIC] 실패&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Android 장치에 앱을 배포하려고 하면 다음 오류가 발생합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Deployment failed because of an internal error: Failure [INSTALL_FAILED_UPDATE_INCOMPATIBLE]
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 &lt;a href=&quot;https://stackoverflow.com/questions/11891848/install-failed-update-incompatible-when-i-try-to-install-compiled-trebuchet-apk&quot;&gt;질문&lt;/a&gt;은 알고 있지만 앱이 설치되어 있지 않습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;배치를 시도하는 동안 Visual Studio에서 제거/부분적으로 제거했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예전에 구글 플레이 스토어에서 앱을 다운받은 후 설정에서 제거하는 방법으로 해결했습니다-&amp;gt;어플리케이션 매니저.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러나 지금 설치를 시도할 때 &quot;호환되지 않는 업데이트&quot;라는 오류가 발생합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;티타늄 백업을 사용해서 제거하려고 했는데 다른 것들은 거의 없었지만 운이 없었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;편집 1&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 (@Motz로부터) 명백한 해결책이 효과가 없다는 것을 언급하지 않았다는 것을 깨달았습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;즉, Settings-&amp;gt;Apps에 앱이 나타나지 않습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 이것을 몇 번 본 적이 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;보통 제 전화기에 서명된 릴리스 버전이 있는 다음 디버그 버전을 상단에 배치하려고 하기 때문입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;완전히 제거되지 않은 상태에서 잘못된 상태로 고착됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;명령 프롬프트를 열고 다음을 입력하는 것이 제게 효과적인 해결책을 위한 방법입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;adb uninstall my.package.id
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러면 개발을 계속하기 위해 보통 제거가 완료됩니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;할 필요가 없습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;adb uninstall&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;, 그냥 너의 것으로 가&lt;/font&gt;&lt;/font&gt;&lt;code&gt;settings-&amp;gt;apps&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그런 다음 거기서 제거합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;응용프로그램이 회색으로 표시됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 문제는 일반적으로 @Kiliman과 같은 릴리스 대 디버그 버전과 관련이 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;응용 프로그램을 제거하면 이 문제를 방지할 수 있습니다.&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;INSTALL_FAILED_UPDATE_INCOMPATIBLE
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러나 때때로 메시지를 다시 제거해도 Android OS 5.0 +에서 발생하므로 이것이 해결책입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;에 가다&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Settings&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Apps&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러면 다음 메시지와 함께 앱을 찾을 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&quot;이 사용자에 대해 설치되지 않음&quot;&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;, 다음 옵션을 사용하여 모든 사용자에 대해 수동으로 제거해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&quot;모든 사용자에 대해 제거&quot;&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;응용 프로그램이 제거되었는지 확인해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;전화기에서 다음으로 이동해 보십시오.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;settings/applications&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;설치된 모든 응용프로그램 목록을 표시한 다음 모든 사용자에게 응용프로그램이 제거되었는지 확인합니다(제 경우에는 응용프로그램을 제거했지만 다른 사용자에게는 여전히 제거됨).&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;보통 안드로이드 5.0+ 버전 기기에서 이 문제가 발생합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;동일한 장치에 다중 사용자 프로필 계정이 있기 때문입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;모든 앱은 모든 사용자를 위해 별도의 인스턴스로 설치됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;스크린샷 아래와 같이 모든 사용자를 제거해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://i.stack.imgur.com/EyOUt.png&quot; rel=&quot;noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/EyOUt.png&quot; alt=&quot;enter image description here&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;실수로 두 개의 장치를 연결했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하나의 장치를 제거한 후,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;INSTALL_FAILED_UPDATE_INCOMPATIBLE&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;오류가 사라졌습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Android 장치에서 apk(작업 중인 앱)를 제거한 다음 다시 실행합니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;실행할 매개 변수만 추가하면 됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Run --&amp;gt; Parameters
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;인필드 매개변수&lt;/font&gt;&lt;/font&gt;&lt;code&gt;add -cleaninstall&lt;/code&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이제 실행하면 설치하기 전에 항상 딥 클린을 수행합니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;만약 당신이 삼성 디바이스를 사용하고 있고 혹시 당신의 앱에 삼성 녹스를 표시했다면, 당신은 My Knox 앱에서 그것을 제거해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;일반 앱에서만 제거해도 녹스 앱에서는 제거되지 않습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그것은 명백하게 이루어져야 합니다!&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;네, 앱을 제거하지만 데이터가 손실되어서는 안 된다는 것을 인정합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;versionCode 및 versionName을(를) 업그레이드하고 &quot;Release&quot; 모드에서 애플리케이션을 사용해 보십시오.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예를 들어, 데이터베이스를 마이그레이션하려고 할 때 이 작업이 중요합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아직 출시되지 않은 실제 어플리케이션과 플레이 스토어의 어플리케이션을 비교할 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저 같은 경우에는.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;릴리스 버전 앱을 설치했습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고 내 장치에서 앱을 제거한 후.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;일이 잘 풀립니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이전 현재 APP와 새 APK의 서명이 일치하지 않음&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그래서 이전 앱을 제거하고 gradlew clean 후 다시 apk를 설치해주세요&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;반응-native 런-&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;반응 native 룬니오스&lt;/font&gt;&lt;/p&gt;&lt;ol&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;연결된 장치(에뮬레이터 또는 모바일)에서 앱 제거&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;터미널을 프로젝트 폴더에 넣었습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;cd android&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음 3회&lt;/font&gt;&lt;/font&gt;&lt;code&gt;./gradlew clean&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그것은 당신의 빌드를 청소합니다 4&lt;/font&gt;&lt;/font&gt;&lt;code&gt;cd..&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고 5이하로 뛰어갑니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;react-native run-android&lt;/code&gt;&lt;/li&gt; 
&lt;/ol&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;첫째, 당신은 에뮬레이터나 장치에서 당신의 앱을 제거해야만 합니다, 그 후에 당신은&lt;/font&gt;&lt;/font&gt;&lt;code&gt;cd ./android&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;-&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;./gradlew clean&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그런 다음 프로젝트를 다시 빌드합니다(안드로이드 or ios 실행) -&amp;gt; 해결&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;에뮬레이션이나 스마트폰에서 앱을 제거하고 다시 실행을 시도합니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;내 경우 안드로이드의 최소 대상 버전을 전환했을 때와 원래 버전으로 다시 변경했을 때(처음에 프로젝트를 만들 때) 이것을 받고 있었습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;따라서 제거 작업이 효과가 있었습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하지만 안드로이드 버전을 최신 버전으로 바꾸었을 때 다시 받고 있었습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이를 해결하기 위해 안드로이드 프로젝트의 속성으로 이동하고 안드로이드 매니페스트 섹션에서 com.dotnetdreamer.net 과 같은 &lt;strong&gt;패키지 이름&lt;/strong&gt;을 추가했습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;패키지 이름이 이미 있는 경우 패키지 이름을 다른 이름으로 바꿀 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;전화기에서 모든 앱 파일 삭제&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;전화기에서 앱 삭제를 자동화하려면 아래 단계를 사용할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;빠르고 깨끗한 방법으로 앱과 앱 데이터를 삭제하는 것은 매우 유용할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 코드로 텍스트 파일을 만들어 Uninstall.sh 로 저장합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;터미널에 있는 이 스크립트의 폴더(입력한 위치)로 이동하여 다음 작업을 수행합니다: sh Uninstall.sh YOURNAMESPACE&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이제 네임스페이스 폴더(저장된 앱 파일 및 데이터베이스 포함)가 삭제됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;  echo &quot;Going to platform tools $HOME/Library/Android/sdk/platform-tools&quot;
  cd $HOME/Library/Android/sdk/platform-tools
  echo &quot;uninstalling app with packagae name $1&quot;
  ./adb uninstall $1
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;PC에서 모든 앱 파일 삭제&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 코드로 텍스트 파일을 만들어 DeleteBinObj.sh 로 저장합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;find . -iname &quot;bin&quot; -o -iname &quot;obj&quot; | xargs rm -rf
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 스크립트를 배치한 프로젝트의 폴더로 이동하여 터미널에서 수행합니다. sh DeleteBinObj.sh&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것이 누군가에게 도움이 될 경우 구글 플레이에 앱을 배포했는데, 앱을 제거하고 장치(새 버전)에서 디버그를 실행하려고 했을 때 실패한 업데이트 메시지가 표시되었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;장치에서 앱을 &lt;/strong&gt;볼 수 &lt;strong&gt;없어서(&lt;/strong&gt;이미 제거되어 있음) 다음과 같이 말했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Google Play에서 첫번째 버전을 다시 설치했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;열린 설정/앱/앱&lt;strong&gt; 이름&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;데이터&lt;/strong&gt; 삭제&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;캐시&lt;/strong&gt; 삭제&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;앱을 제거&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이제 디버그 버전을 디바이스에 다시 배포할 수 있습니다 :)&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;명령줄을 통해 코르도바와 함께 아이오닉을 사용하는 중...&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;ionic cordova run android --prod
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;우연히 이 문제를 발견한 결과 이전 테스트 설치에서 릴리스 버전을 삭제했지만, 앱 서랍에 오래된 디버그 버전이 표시되지 않아 누락되었습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;컴퓨터에서 단말기를 뽑아 앱 서랍을 열고 &quot;앱 검색..&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&quot; 제거할 앱의 모든 인스턴스를 찾습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고 컴퓨터에 기기를 다시 꽂고 비올라를 꽂았는데, 작동이 되더군요!&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여러분 도와주셔서 감사합니다!&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;나는 이것이 미래에 누군가에게 도움이 되기를 바라지만 단지 당신에게.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;config.xml&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;, 내부에&lt;/font&gt;&lt;/font&gt;&lt;code&gt;widget&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;tag, 기본 id()를 변경합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;io.ionic.starter&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;당신의 아이디로 말입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;안드로이드 패키지 네이밍은 &lt;a href=&quot;https://docs.oracle.com/javase/tutorial/java/package/namingpkgs.html&quot; rel=&quot;nofollow noreferrer&quot;&gt;이것&lt;/a&gt;을 보세요.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;모든 사용자로부터 응용 프로그램을 제거하는 것이 올바른 해결책일 수도 있지만, 다른 장치에 &lt;strong&gt;&lt;a href=&quot;https://www.samsung.com/uk/support/mobile-devices/what-is-the-secure-folder-and-how-do-i-use-it/&quot; rel=&quot;nofollow noreferrer&quot;&gt;대해서도 보안&lt;/a&gt;&lt;/strong&gt; 폴더 등을 확인해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;문제의 원인을 파악하기 위해 평생 2시간을 보냈습니다(개인 태블릿에는 사용자가 한 명뿐입니다).&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;애플리케이션을 설치하지 못한 이유는 &quot;내부 테스트&quot;에서 현재 사용자와 보안 폴더로 직접 링크를 통해 애플리케이션을 잘못 설치했기 때문입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;보안 폴더가 활성화되어 있으면 태블릿 이름이 두 번 나타납니다. 하나 또는 둘이 보안 폴더입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;(양쪽에 accident 장착)&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://i.stack.imgur.com/5b5yT.png&quot; rel=&quot;nofollow noreferrer&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여기 예제&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;간단한 방법은 패키지 이름을 바꾸고 다시 실행하는 것입니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/26794862/failure-install-failed-update-incompatible-even-if-app-appears-to-not-be-insta&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>Android</category>
      <author>lovejava</author>
      <guid isPermaLink="true">https://lovejava.tistory.com/761</guid>
      <comments>https://lovejava.tistory.com/761#entry761comment</comments>
      <pubDate>Sun, 5 Nov 2023 10:48:26 +0900</pubDate>
    </item>
    <item>
      <title>MySQL 5.0의 int와 integer의 차이점은 무엇입니까?</title>
      <link>https://lovejava.tistory.com/760</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;MySQL 5.0의 int와 integer의 차이점은 무엇입니까?&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;MySQL 5.0에서 int와 정수 데이터 유형의 차이점은 무엇입니까?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;누가 도와줄 수 있습니까?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 정확한 차이를 이해할 수 없습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;http://dev.mysql.com/doc/refman/5.0/en/numeric-types.html&quot; rel=&quot;noreferrer&quot;&gt;MYSQL 5.0 온라인 참조&lt;/a&gt;에서 가져옴&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;키워드 INT는 INTEGER의 동의어입니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;스펠링만 다를 뿐인 것 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;따라서 INT를 사용하면 SQL 스크립트에서 바이트를 적게 사용할 수 있습니다(중요한 것은 아닙니다).&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;MySQL &lt;a href=&quot;https://dev.mysql.com/doc/refman/5.7/en/numeric-types.html&quot; rel=&quot;noreferrer&quot;&gt;문서&lt;/a&gt;에 따르면 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;키워드 INT는 INTEGER의 동의어입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러나 &lt;a href=&quot;http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt&quot; rel=&quot;noreferrer&quot;&gt;ANSI&lt;/a&gt;와 호환되는 SQL 스크립트를 작성하려면 &lt;a href=&quot;http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt&quot; rel=&quot;noreferrer&quot;&gt;SQL&lt;/a&gt;을 사용합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;INTEGER&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;. &lt;a href=&quot;http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt&quot; rel=&quot;noreferrer&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;&gt;SQL은 CHARKER, CHARKER VARYING, BIT, BIT VARYING, NUMAL, DECIAL, &lt;strong&gt;INTEGER&lt;/strong&gt;, 스몰INT, Float, Real, Double Precision, DATE, TIME, TIME, INTERVALY 키워드로 명명된 고유한 데이터 유형을 정의합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이렇게 하면 다른 DBMS에서 SQL 스크립트를 사용할 수 있는 더 좋은 기회를 얻을 수 있습니다. 예를 들어 &lt;a href=&quot;https://www.postgresql.org/docs/9.1/static/datatype-numeric.html&quot; rel=&quot;noreferrer&quot;&gt;Postgres&lt;/a&gt;&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;https://www.postgresql.org/docs/9.1/static/datatype-numeric.html&quot; rel=&quot;noreferrer&quot;&gt;SQL&lt;/a&gt; 가 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;INTEGER&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;타이프지만 아니오&lt;/font&gt;&lt;/font&gt;&lt;code&gt;INT&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;유형.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사이의 차이&lt;/font&gt;&lt;/font&gt;&lt;code&gt;int&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;정수는&lt;/font&gt;&lt;/font&gt;&lt;code&gt;int&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;는 데이터 유형이지만 정수는 데이터 유형의 그룹입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;int&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;long&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;short&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;byte&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/688582/what-is-the-difference-between-int-and-integer-in-mysql-5-0&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>MySQL</category>
      <author>lovejava</author>
      <guid isPermaLink="true">https://lovejava.tistory.com/760</guid>
      <comments>https://lovejava.tistory.com/760#entry760comment</comments>
      <pubDate>Sun, 5 Nov 2023 10:48:16 +0900</pubDate>
    </item>
    <item>
      <title>C의 동일한 디렉토리에 있는 다른 파일에서 함수 호출</title>
      <link>https://lovejava.tistory.com/759</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;C의 동일한 디렉토리에 있는 다른 파일에서 함수 호출&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 C를 배우고 있지만 자바와 같은 상위 프로그래밍 언어에 대한 오랜 경험이 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;헤더 파일에 대해 읽고 있어서 가지고 놀고 있었는데 #포함 없이 다른 파일에서 함수를 호출할 수 있다는 것을 알게 되었습니다(같은 디렉토리에 있음). 어떻게 가능합니까?!&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그런 식으로 구성된 것은 make file, linker입니까? 아니면 무엇입니까?&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;두개의 파일이 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;main.c
add.c
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;main.c는 함수를 호출합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;add(int x,int y)&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;add.c에서 왔는데, #include add.c 전에 실수로 #include add.c 전에 컴파일을 잘못해서 작동했어요! 더 헷갈리는 것은 i#include add.c를 include할 때 함수 add에서 다중 정의 오류가 발생한다는 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여기에는 몇 가지 다른 일들이 벌어지고 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;먼저 여러 파일의 기본적인 컴파일이 어떻게 작동하는지에 대해 알아보겠습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;파일이 여러 개인 경우, 중요한 것은 함수의 선언과 정의의 차이입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 정의는 아마도 함수를 정의할 때 익숙한 것일 것입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;당신은 그 기능의 내용을 적습니다, 예를 들면,&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;int square(int i) {
    return i*i;
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러나 이 선언을 통해 컴파일러에게 함수가 존재한다는 것을 알면서도 컴파일러에게 함수가 무엇인지 알려주지 않는다는 것을 선언을 통해 함수가 존재한다는 것을 선언할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예를 들어, 당신은 글을 쓸 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;int square(int i);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;컴파일러는 함수 &quot;제곱&quot;이 다른 곳에서 정의되는 것을 예상할 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이제 상호 운용할 두 개의 다른 파일이 있다면(예를 들어 함수 &quot;square&quot;가 add.c에 정의되어 있고 main.c에서 square(10)를 호출하려고 한다고 가정하자) 정의와 선언을 &lt;em&gt;모두&lt;/em&gt; 수행해야 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;먼저 add.c에서 제곱을 정의합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러면 메인 시작에 &lt;em&gt;신고&lt;/em&gt;를 하게 됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;컴파일러가 main.c를 컴파일할 때 다른 곳에 정의된 함수 &quot;square&quot;가 있다는 것을 알게 해줍니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이제 main.c와 add.c 둘 다 개체 파일로 컴파일해야 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;전화해서 할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;gcc -c main.c
gcc -c add.c
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이렇게 하면 main.o 파일과 add.o 파일이 생성됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;컴파일된 함수가 포함되어 있지만 실행이 가능하지는 않습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여기서 이해해야 할 중요한 점은 main.o가 어떤 의미에서 &quot;불완전&quot;하다는 것입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;main.o를 컴파일할 때 함수 &quot;square&quot;가 존재하지만 함수 &quot;square&quot;는 main.o 내부에 정의되지 않는다고 말했습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;따라서 main.o는 함수 &quot;square&quot;에 대해 일종의 &quot;dangling reference&quot;를 갖습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&quot;square&quot; 정의를 포함하는 다른 .o(또는 .so 또는 .a) 파일과 결합하지 않는 한 전체 프로그램으로 컴파일되지 않습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;만약 당신이 main.&lt;em&gt;o&lt;/em&gt;를 프로그램에 연결하려고 한다면, 즉.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;gcc -o executable main.o
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;컴파일러가 함수 &quot;square&quot;에 대한 dangling reference를 &lt;em&gt;해결&lt;/em&gt;하려고 하지만 이에 대한 정의를 찾지 못하므로 오류가 발생할 것입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러나 링크할 때 add.o를 포함하면 (링크는 .o 파일을 실행 파일 또는 .so 파일로 변환하는 동안 정의되지 않은 함수에 대한 이러한 모든 참조를 &lt;em&gt;해결&lt;/em&gt;하는 프로세스입니다) 문제가 발생하지 않습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;gcc -o executable main.o add.o
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것이 C 파일 전체에서 &lt;em&gt;기능적&lt;/em&gt;으로 기능을 사용하는 방법입니다. 하지만 &lt;em&gt;스타일적&lt;/em&gt;으로 방금 보여드린 것은 &quot;올바른 방법이 아닙니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제가 한 유일한 이유는 &quot;#include magic&quot;에 의존하는 것보다 상황을 이해하는 데 더 도움이 될 것이기 때문입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;메인.c 상단에서 사용하려는 모든 기능을 다시 선언해야 한다면 작업이 조금 복잡해진다는 것을 이전에 알아차렸을 수도 있습니다. 이것이 C 프로그램이 확장자가 .h인 &quot;헤더&quot;라고 불리는 도우미 파일을 자주 사용하는 이유입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;헤더의 개념은 정의 &lt;em&gt;없이&lt;/em&gt; 함수들의 &lt;em&gt;선언&lt;/em&gt;만을 포함한다는 것입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이런 식으로 add.c에 정의된 함수를 사용하여 프로그램을 컴파일하려면 사용 중인 모든 함수를 수동으로 선언할 필요가 없으며 코드에 전체 add.c 파일을 #포함할 필요도 없습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;대신 단순히 add.c의 모든 함수의 &lt;em&gt;선언&lt;/em&gt;을 포함하는 add.h를 #포함할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;#의 새로 고침 프로그램은 다음을 포함합니다. #include는 한 파일의 내용을 다른 파일에 직접 복사하기만 하면 됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예를 들어, 코드는&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;abc
#include &quot;wtf.txt&quot;
def
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;와 정확히 동치입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;abc
hello world
def
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그것을 전제로.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;txt에는 &quot;hello world&quot;라는 텍스트가 포함되어 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;따라서 add.c의 모든 선언을 add.h(즉, add.h)에 넣으면 됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;int square(int i);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고 메인.c의 맨 위에 우리는 글을 씁니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#include &quot;add.h&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이는 기능적으로 메인.c 상단의 함수 &quot;square&quot;를 수동으로 선언한 것과 동일합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;따라서 헤더를 사용하는 일반적인 생각은 #포함하기만 하면 필요한 모든 기능을 자동으로 선언하는 특수 파일을 가질 수 있다는 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러나 헤더에는 일반적인 용도도 한 가지 더 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;main.c가 50개의 다른 파일의 함수를 사용한다고 가정해 보겠습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;main.c 상단은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#include &quot;add.h&quot;
#include &quot;divide.h&quot;
#include &quot;multiply.h&quot;
#include &quot;eat-pie.h&quot;
...
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;대신, 사람들은 종종 #포함된 모든 것들을 메인으로 옮깁니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;h 헤더 파일과 main.c에서 # include main.h.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 경우 헤더 파일은 두 &lt;strong&gt;가지&lt;/strong&gt; 용도로 사용됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다른 파일에 포함되어 있을 때 main.c에서 사용할 &lt;em&gt;수&lt;/em&gt; 있도록 함수를 선언하고 main.c에서 포함되어 있을 때 main.c의 모든 종속성을 포함합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이런 식으로 사용하면 종속성의 &lt;em&gt;사슬&lt;/em&gt;도 가능합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;#include add.h를 포함하면 add.c에 정의된 함수를 얻을 수 있을 뿐만 아니라 add.cuses가 &lt;em&gt;사용&lt;/em&gt;하는 함수도 암묵적으로 얻을 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;또한, 더 미묘하게도, 자체 .c 파일의 헤더 파일을 포함한 #는 사용자가 저지르는 오류를 암묵적으로 확인합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예를 들어 제곱을 실수로 정의한 경우&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;double square(int i);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;add.h, main.o를 링크할 때까지 보통 인식하지 못할 수도 있습니다.o는 제곱의 &lt;em&gt;정의&lt;/em&gt;를 찾고 add.o는 &lt;em&gt;호환&lt;/em&gt;되지 않는 또 &lt;em&gt;다른&lt;/em&gt; 정의를 제공합니다&lt;em&gt;.&lt;/em&gt;&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러면 링크할 때 오류가 발생하므로 나중에 빌드 과정에서 오류를 인식할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러나, 만약 당신이 add.c의 add.h를 컴파일러에 #포함한다면, 당신의 파일은 다음과 같이 보입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#include &quot;add.h&quot;
int square(int i) {
    return i*i;
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;# include 문장을 처리한 후에 다음과 같이 보일 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;double square(int i);
int square(int i) {
    return i*i;
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;컴파일러가 add.c를 컴파일할 때 알아채고 알려줄 것입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이러한 방식으로 자신의 헤더를 포함하면 제공하는 기능의 유형을 다른 파일에 허위로 광고하는 것을 방지할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;함수를 선언하지 않고 사용할 수 있는 이유&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;당신이 알아차린 것처럼, 어떤 경우에 당신은 함수를 모든 것을 선언하거나 그것을 선언하는 파일을 포함하지 않고 실제로 함수를 사용할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이건 바보같은 짓이고 모두가 바보같은 짓이라는 데 동의합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러나 C 프로그래밍 언어(및 C 컴파일러)의 레거시 기능으로 함수를 먼저 선언하지 않고 사용하면 함수 반환 형식 &quot;int&quot;로 가정합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;따라서 실제로 함수를 사용하는 것은 함수가 아직 선언되지 않은 경우 &quot;int&quot;를 반환하는 함수로서 함수를 암묵적으로 선언하는 것입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;생각해보면 아주 이상한 행동이고, 그런 행동을 한다면 컴파일러가 경고를 해줘야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;헤더 가드&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;또 하나의 일반적인 관행은 &quot;헤더 가드&quot;를 사용하는 것입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;헤더 가드를 설명하기 위해 가능한 문제를 살펴보겠습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;우리가 herp.c와 derp.c라는 두 개의 파일을 가지고 있고, 둘 &lt;em&gt;다&lt;/em&gt; 서로에 포함된 기능을 사용하고 싶어한다고 가정해 보겠습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;위의 지침에 따라, 당신은 그 선에 헤르페스가 있을 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#include &quot;derp.h&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;선과 함께 더피시(derp.h).&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#include &quot;herp.h&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;자, 생각해보면 #&quot;derp&quot;를 포함합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;h&quot;는 derp.h의 내용으로 변환되며, 여기에는 행 # include &quot;herp.h&quot;가 포함되며, 이는 herp.h의 내용으로 변환되며, &lt;em&gt;이&lt;/em&gt;는 다음을 포함합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그래서 컴파일러는 영원히 포함된 것들을 확장할 것입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;마찬가지로 main.h #가 herp.h와 derp.h를 모두 포함하고 herp.h와 derp.h가 모두 add.h를 포함하면 main.h에서 add.h의 복사본이 두 &lt;em&gt;개&lt;/em&gt;가 되고, 하나는 herp.h를 포함한 결과이고, 하나는 derp.h를 포함한 결과입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그래서 해결책은?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&quot;헤더 가드&quot;, 즉 헤더가 두 번 포함되는 것을 방지하는 코드 조각입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예를 들어 add.h의 경우 일반적인 방법은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#ifndef ADD_H
#define ADD_H

int sqrt(int i);
...
#endif
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 코드 조각은 기본적으로 &quot;ADD_H&quot;가 이미 정의되어 있는지 확인하기 위해 전처리기(모든 &quot;#XXX&quot; 문을 처리하는 컴파일러 부분)에 지시하는 것입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그렇지 않은 경우(ifndef), 먼저 &quot;ADD_H&quot;를 정의합니다(이러한 맥락에서 ADD_H는 &lt;em&gt;정의&lt;/em&gt;되지 않아도 되고 정의되지 않은 부울일 뿐입니다). 그리고 헤더의 나머지 내용의 나머지 부분을 정의합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러나 ADD_H가 이미 정의되어 있는 경우 #ifndef 블록 외부에 아무것도 없기 때문에 이 파일을 포함한 #는 &lt;em&gt;아무런&lt;/em&gt; 작업도 수행하지 않습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;따라서 주어진 파일에 처음 포함될 때만 해당 파일에 텍스트를 추가할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그런 다음 #including(포함)은 파일에 추가 텍스트를 추가하지 않습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;ADD_H는 add.h가 아직 포함되었는지 여부를 추적하기 위해 선택한 임의 기호일 뿐입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;모든 헤더에 대해 다른 기호를 사용하여 아직 포함되었는지 여부를 추적합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예를 들어, herp.h는 ADD_H 대신 HERP_H를 사용할 것입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&quot;헤더 가드&quot;를 사용하면 위에 나열한 문제를 해결할 수 있습니다. 파일의 복사본이 중복되거나 #include의 무한 루프가 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;문제는 당신이 그 일에 관여해서는 안 된다는 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;#include&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;파일을 입력합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다른 파일에서 함수를 사용하려면 함수를 선언해야 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;일반적으로 모든 .c 파일(main.c 제외)에는 .c 파일에 정의된 모든 기능을 적절히 선언하는 관련 헤더(.h) 파일이 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;em&gt;원하는&lt;/em&gt; 만큼 선언할 수 있지만(모든 선언이 동일한 한), 한 &lt;em&gt;가지&lt;/em&gt; 정의만 있을 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;네가 네게 무슨 일이 생기니?&lt;/font&gt;&lt;/font&gt;&lt;code&gt;#include &quot;add.c&quot;&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;add.c의 텍스트가 main.c에 포함되어 main.c의 &lt;em&gt;정의&lt;/em&gt;(그리고 부작용으로 선언)를 제공한다는 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;add&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;. 그런 다음 add.c를 자체적으로 컴파일하면 다른 &lt;em&gt;정의&lt;/em&gt;가 생성됩니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;add&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;. 따라서 함수에 대한 정의는 두 가지가 있는데 컴파일러는 어떤 것을 사용해야 할지 몰라서 기겁을 합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;로 변경하시면&lt;/font&gt;&lt;/font&gt;&lt;code&gt;#include &quot;add.h&quot;&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;, 여기서 add.h는 다음과 같습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#ifndef ADD_H
#define ADD_H

extern int add(int x, int y);

#endif /* ADD_H - Google &quot;include guard&quot; for more info about this trickery */
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그럼 main.c는 다음과 같은 선언을 합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;add&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;함수를 사용할 수 있지만 &lt;em&gt;정의는&lt;/em&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;add&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;는 add.c 파일에만 상당히 확실하게 있으므로 한 번만 존재하므로 제대로 컴파일됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여기 다른 c 프로그램에서 함수를 호출하는 간단한 예가 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;메인 프로그램을 main.c로 하고 function.c를 function.c로 잡고 있는 프로그램을 function.h라고 하는 헤더 파일을 만들고 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;본전의&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#include&quot;function.h&quot;
int main()
{
     int a = sum(1,2);
     return a;
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;함수.c&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;int function(int a,int b)
{
    return a+b;
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;함수.h&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;int function(int,int);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;컴파일하려면 아래에 주어진 명령을 사용합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;g++ main.c function.c -o main&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;자세한 설명은 여기 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;메인 프로그램에서 나는 2개의 숫자를 합하도록 함수를 불렀습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;메인 프로그램의 값 1과 2는 액세스 포인트 또는 브리지를 함수에 고정하는 헤더 function.h를 통해 function.c의 함수에 피드되었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;자세한 내용은 아래 링크를 확인할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;http://www.cplusplus.com/forum/beginner/34691/&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;https://social.msdn.microsoft.com/Forums/en-US/4ea70f43-a0d5-43f8-8e24-78e90f208110/calling-a-function-in-a-file-from-another-file?forum=winembplatdev&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;결과를 확인하기 위해 인쇄문을 추가하거나 파일 메인 실행 후 echo $?를 사용합니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;C에서 전화를 할 때는 신고가 필요 없기 때문에 전화를 할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러나 반환 유형을 알 수 없으므로 기본값은 다음과 같습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;int&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;. 이것은 부분적으로 C의 기본 호출 규약과 적어도 다음과 같은 유형의 기본 승격 때문에 가능합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;int&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;정확.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;호출하는 함수를 정의하는 헤더를 포함하면 컴파일러는 함수에 대한 호출이 인수의 정확한 개수와 유형을 갖는지 확인할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;함수 정의를 포함하는 경우 다음과 같이 저장소를 지정하지 않으면 내보냅니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;static&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;. 당신도 편집하고 링크하고 있으니까요.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;add.c&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;, 그 이후로 둘 중 하나나 둘 다 내보내지 않고는 이것을 추가할 수 없습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;add&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;단순히 모든 기능을 포함시키려면 헤더에 정의를 담고 스토리지 지정자를 표시하는 것이 좋습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/6618921/calling-a-function-from-another-file-in-the-same-directory-in-c&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>C</category>
      <author>lovejava</author>
      <guid isPermaLink="true">https://lovejava.tistory.com/759</guid>
      <comments>https://lovejava.tistory.com/759#entry759comment</comments>
      <pubDate>Sun, 5 Nov 2023 10:48:10 +0900</pubDate>
    </item>
    <item>
      <title>jQuery를 사용하여 테이블의 tbody에 행 추가</title>
      <link>https://lovejava.tistory.com/758</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;jQuery를 사용하여 테이블의 tbody에 행 추가&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;에 행을 추가하려고 합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;tbody&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;탁자의&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하지만 저는 그것을 달성하는 데 문제가 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;먼저 모든 것이 일어나는 함수는 html 페이지에서 드롭다운을 변경할 때 호출됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제가 만든 것은.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;tr&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;모든 것을 포함하는 문자열&lt;/font&gt;&lt;/font&gt;&lt;code&gt;td&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;html 요소, 텍스트 및 기타 내용을 포함하는 내부.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러나 다음을 사용하여 생성된 행을 테이블에 추가하려고 할 때:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$(newRowContent).appendTo(&quot;#tblEntAttributes tbody&quot;);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;오류가 발생했습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;테이블의 이름은.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;tblEntAttributes&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고 나는 그것을 추가하려고 노력하고 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;tbody&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사실 지금 일어나고 있는 일은 jQuery가 그들을&lt;/font&gt;&lt;/font&gt;&lt;code&gt;tblEntAttributes&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;html 요소로서.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하지만 저는 그것을 사용해서 접근할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;documemt.getElementById(&quot;tblEntAttributes&quot;);&lt;/code&gt; &lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;행을 추가하여 이를 달성할 수 있는 방법이 있습니까?&lt;/font&gt;&lt;/font&gt;&lt;code&gt;tbody&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;테이블의&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;우회로 같은 거겠지&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;전체 코드는 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var newRowContent = &quot;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;lt;input type=\&quot;checkbox\&quot; id=\&quot;&quot; + chkboxId + &quot;\&quot; value=\&quot;&quot; + chkboxValue + &quot;\&quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&quot; + displayName + &quot;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&quot; + logicalName + &quot;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&quot; + dataType + &quot;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;input type=\&quot;checkbox\&quot; id=\&quot;chkAllPrimaryAttrs\&quot; name=\&quot;chkAllPrimaryAttrs\&quot; value=\&quot;chkAllPrimaryAttrs\&quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;input type=\&quot;checkbox\&quot; id=\&quot;chkAllPrimaryAttrs\&quot; name=\&quot;chkAllPrimaryAttrs\&quot; value=\&quot;chkAllPrimaryAttrs\&quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&quot;;

$(&quot;#tblEntAttributes tbody&quot;).append(newRowContent); 
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제가 한 가지 언급하지 않은 것은 이 코드가 적혀있는 함수는 실제로 아약스 콜의 성공 콜백 함수입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음을 사용하여 테이블에 접근할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;document.getElementById(&quot;tblEntAttributes&quot;)&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하지만 왠지&lt;/font&gt;&lt;/font&gt;&lt;code&gt;$(#tblEntAttributes)&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;효과가 없는 것 같습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;code&gt;(&quot;#tblEntAttributes tbody&quot;)&lt;/code&gt; &lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;필요한&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;$(&quot;#tblEntAttributes tbody&quot;)&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;구문이 올바른 요소를 선택하지 않았습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여기 두 가지 예가 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$(newRowContent).appendTo($(&quot;#tblEntAttributes&quot;));
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$(&quot;#tblEntAttributes tbody&quot;).append(newRowContent);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;작동중인 http://jsfiddle.net/xW4NZ/&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것을 사용합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$(&quot;#tblEntAttributes tbody&quot;).append(newRowContent);
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;나는 이런 이상한 문제를 처음 접해 봅니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;무엇이 문제였는지 아십니까?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;$ 안 돼요.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 jQuery와 같은 코드를 시도했습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;jQuery(&quot;#tblEntAttributes tbody&quot;).append(newRowContent);&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;매력적으로 느껴집니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;왜 이런 이상한 문제가 생기는지 모르겠어요!&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;말씀하신 html 드롭다운을 사용한 appendTo 버전입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&quot;변경&quot;에 다른 행을 삽입합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$('#dropdown').on( 'change', function(e) {
    $('#table').append('&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;COL1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;COL2&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;');
});
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;당신이 가지고 놀 수 있는 예와 함께.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;행운을 빌어요!&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;http://jsfiddle.net/xtHaF/12/&quot; rel=&quot;noreferrer&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;http://jsfiddle.net/xtHaF/12/&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;@wirey가 말했듯이&lt;/font&gt;&lt;/font&gt;&lt;code&gt;appendTo&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;작동해야 합니다. 작동하지 않을 경우 다음을 시도할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$(&quot;#tblEntAttributes tbody&quot;).append(newRowContent);
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Lodash를 사용하면 템플릿을 만들 수 있으며 다음과 같은 방법으로 템플릿을 만들 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;    &amp;lt;div class=&quot;container&quot;&amp;gt;
        &amp;lt;div class=&quot;row justify-content-center&quot;&amp;gt;
            &amp;lt;div class=&quot;col-12&quot;&amp;gt;
                &amp;lt;table id=&quot;tblEntAttributes&quot; class=&quot;table&quot;&amp;gt;
                    &amp;lt;tbody&amp;gt;
                        &amp;lt;tr&amp;gt;
                            &amp;lt;td&amp;gt;
                                chkboxId
                            &amp;lt;/td&amp;gt;
                            &amp;lt;td&amp;gt;
                               chkboxValue
                            &amp;lt;/td&amp;gt;
                            &amp;lt;td&amp;gt;
                                displayName
                            &amp;lt;/td&amp;gt;
                            &amp;lt;td&amp;gt;
                               logicalName
                            &amp;lt;/td&amp;gt;
                            &amp;lt;td&amp;gt;
                                dataType
                            &amp;lt;/td&amp;gt;
                        &amp;lt;/tr&amp;gt;
                    &amp;lt;/tbody&amp;gt;
                &amp;lt;/table&amp;gt;
                &amp;lt;button class=&quot;btn btn-primary&quot; id=&quot;test&quot;&amp;gt;appendTo&amp;lt;/button&amp;gt;
            &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
     &amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;자바스크립트는 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;        var count = 1;
        window.addEventListener('load', function () {
            var compiledRow = _.template(&quot;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;lt;input type=\&quot;checkbox\&quot; id=\&quot;&amp;lt;%= chkboxId %&amp;gt;\&quot; value=\&quot;&amp;lt;%= chkboxValue %&amp;gt;\&quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;%= displayName %&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;%= logicalName %&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;%= dataType %&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;input type=\&quot;checkbox\&quot; id=\&quot;chkAllPrimaryAttrs\&quot; name=\&quot;chkAllPrimaryAttrs\&quot; value=\&quot;chkAllPrimaryAttrs\&quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;input type=\&quot;checkbox\&quot; id=\&quot;chkAllPrimaryAttrs\&quot; name=\&quot;chkAllPrimaryAttrs\&quot; value=\&quot;chkAllPrimaryAttrs\&quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&quot;);
            document.getElementById('test').addEventListener('click', function (e) {
                var ajaxData = { 'chkboxId': 'chkboxId-' + count, 'chkboxValue': 'chkboxValue-' + count, 'displayName': 'displayName-' + count, 'logicalName': 'logicalName-' + count, 'dataType': 'dataType-' + count };
                var tableRowData = compiledRow(ajaxData);
                $(&quot;#tblEntAttributes tbody&quot;).append(tableRowData);
                count++;
            });
        });
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여기 &lt;a href=&quot;https://jsbin.com/xiqaloh/2/edit?js,output&quot; rel=&quot;nofollow noreferrer&quot;&gt;jsbin&lt;/a&gt;에 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/10851527/adding-rows-to-tbody-of-a-table-using-jquery&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>jQuery</category>
      <author>lovejava</author>
      <guid isPermaLink="true">https://lovejava.tistory.com/758</guid>
      <comments>https://lovejava.tistory.com/758#entry758comment</comments>
      <pubDate>Sun, 5 Nov 2023 10:48:01 +0900</pubDate>
    </item>
    <item>
      <title>파워셸의 &amp;quot;Git Log&amp;quot; 명령 - 프로세스를 종료할 수 없음</title>
      <link>https://lovejava.tistory.com/757</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;파워셸의 &quot;Git Log&quot; 명령 - 프로세스를 종료할 수 없음&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;타이핑할때&lt;/font&gt;&lt;/font&gt;&lt;code&gt;git log&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;PowerShell에서는 정상 응답처럼 보이는 것을 인쇄합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하지만 하단에는 새 명령어를 입력하라는 메시지가 표시되지 않는 정상적인 작업 디렉토리가 표시됩니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;:&lt;/code&gt;  &lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;(colon) 그리고 어떤 명령도 작동하지 않습니다. 그만두지도 않고, 멈추지도 않고, 단지 다른 colon을 인쇄할 뿐입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;호출기에 넣어줍니다. (아마도)&lt;/font&gt;&lt;/font&gt;&lt;code&gt;less&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;MSysGit 또는 Github for Windows)를 설치한 경우 요청한 출력이 하나의 스크린 페이지보다 길기 때문입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;화살표 키, &lt;kbd&gt;Page Down&lt;/kbd&gt;/ 키 및 //&lt;kbd&gt;K&lt;/kbd&gt;&lt;kbd&gt;H&lt;/kbd&gt;&lt;kbd&gt;L&lt;/kbd&gt; 키를 사용하여 위/아래/좌/우로 스크롤할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;인라인 도움말을 표시하려면 를 누르고 종료하려면 를 누릅니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;당신이 원한다면 다른 호출기를 사용하거나 끌 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;지적한 것처럼, 당신은 다음을 사용할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;core.pager&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다른 호출기로 설정하거나 값을 다음으로 설정합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;cat&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;모든 Git 명령에 대해 페이지화를 비활성화합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;호출기를 사용하여 호출기를 끊으면 호출기가 백그라운드에서 계속 실행되고 터미널의 각 새 줄에 줄이 인쇄되고&lt;/font&gt;&lt;/font&gt;&lt;code&gt;(END)&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;. 지금까지 저는 그런 단말기를 구할 방법을 찾지 못했습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;내가.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;exit&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;단말기, 호출기는 내가 창문을 죽일 때까지 그것을 계속 살려놓습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;kbd&gt;q&lt;/kbd&gt; 호출기를 꺼내는 일들 /&lt;/font&gt;&lt;/font&gt;&lt;code&gt;less&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사용하지 않은 경우 명령합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;화면을 종료하기 위해서는 타입만 입력하면 됩니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/17138301/git-log-command-in-powershell-unable-to-terminate-process&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>PowerShell</category>
      <author>lovejava</author>
      <guid isPermaLink="true">https://lovejava.tistory.com/757</guid>
      <comments>https://lovejava.tistory.com/757#entry757comment</comments>
      <pubDate>Sun, 5 Nov 2023 10:47:54 +0900</pubDate>
    </item>
    <item>
      <title>셸의 파이프로 n개의 명령어를 연결?</title>
      <link>https://lovejava.tistory.com/756</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;셸의 파이프로 n개의 명령어를 연결?&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 C에 쉘을 구현하려고 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;간단한 execvp()로도 간단한 명령을 잘 실행할 수 있지만 요구 사항 중 하나는 다음과 같은 명령을 관리하는 것입니다. &quot;ls -l | head | tail -4&quot;는 'for' 루프와 stdin 및 stdout을 리디렉션하는 하나의 'pipe()' 문만 있는 것입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;며칠이 지나니 길을 좀 잃었군요.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;N = 단순 명령의 수(예에서 3개: ls, head, tail) 명령 = 다음과 같은 명령이 포함된 구조물 목록:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;commands[0].argv[0]: ls
commands[0].argv[1]: -l
commands[1].argv[0]: head
commands[2].argv[0]: tail
commands[2].argv[1]: -4
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그래서 포루프를 만들고 모든 명령을 파이프로 연결하기 위해 stdin과 stdout을 방향 전환하기 시작했습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;왜 안 되는지 모르겠어요.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;for (i=0; i &amp;lt; n; i++){

pipe(pipe);
if(fork()==0){  // CHILD

    close(pipe[0]);
    close(1);
    dup(pipe[1]);
    close(pipe[1]);

    execvp(commands[i].argv[0], &amp;amp;commands[i].argv[0]);
    perror(&quot;ERROR: &quot;);
    exit(-1);

}else{      // FATHER

    close(pipe[1]);
    close(0);
    dup(pipe[0]);
    close(pipe[0]);

}
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제가 만들고자 하는 것은 자식 프로세스의 '라인'입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;[ls -l] -------pipe----&amp;gt; [head] ---------pipe---&amp;gt; [tail -4]&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 모든 과정에는 루트(내 셸을 실행하는 과정)가 있습니다. 첫 번째 아버지도 셸 과정의 자녀입니다. 저는 이미 조금 지쳤습니다. 누가 여기서 저를 도와줄 수 있나요?&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;명령을 실행하는 사람이 아이들이어야 하는지도 잘 모르겠습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;고마워 얘들아!!&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여기서 복잡한 것은 없습니다. 마지막 명령어는 원래 프로세스의 파일 설명자 1로 출력하고 첫 번째 명령어는 원래 프로세스 파일 설명자 0에서 읽어야 한다는 것을 명심하십시오.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이전의 입력측을 따라 순서대로 프로세스를 생성하면 됩니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;pipe&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;불러.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음과 같은 유형이 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#include &amp;lt;unistd.h&amp;gt;

struct command
{
  const char **argv;
};
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;단순하고 잘 정의된 의미론으로 도우미 기능을 만듭니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;int
spawn_proc (int in, int out, struct command *cmd)
{
  pid_t pid;

  if ((pid = fork ()) == 0)
    {
      if (in != 0)
        {
          dup2 (in, 0);
          close (in);
        }

      if (out != 1)
        {
          dup2 (out, 1);
          close (out);
        }

      return execvp (cmd-&amp;gt;argv [0], (char * const *)cmd-&amp;gt;argv);
    }

  return pid;
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고 주요 포크 루틴은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;int
fork_pipes (int n, struct command *cmd)
{
  int i;
  pid_t pid;
  int in, fd [2];

  /* The first process should get its input from the original file descriptor 0.  */
  in = 0;

  /* Note the loop bound, we spawn here all, but the last stage of the pipeline.  */
  for (i = 0; i &amp;lt; n - 1; ++i)
    {
      pipe (fd);

      /* f [1] is the write end of the pipe, we carry `in` from the prev iteration.  */
      spawn_proc (in, fd [1], cmd + i);

      /* No need for the write end of the pipe, the child will write here.  */
      close (fd [1]);

      /* Keep the read end of the pipe, the next child will read from there.  */
      in = fd [0];
    }

  /* Last stage of the pipeline - set stdin be the read end of the previous pipe
     and output to the original file descriptor 1. */  
  if (in != 0)
    dup2 (in, 0);

  /* Execute the last stage with the current process. */
  return execvp (cmd [i].argv [0], (char * const *)cmd [i].argv);
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고 작은 테스트:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;int
main ()
{
  const char *ls[] = { &quot;ls&quot;, &quot;-l&quot;, 0 };
  const char *awk[] = { &quot;awk&quot;, &quot;{print $1}&quot;, 0 };
  const char *sort[] = { &quot;sort&quot;, 0 };
  const char *uniq[] = { &quot;uniq&quot;, 0 };

  struct command cmd [] = { {ls}, {awk}, {sort}, {uniq} };

  return fork_pipes (4, cmd);
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;효과가 있는 것 같습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;:)&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;첫째, 파이프를 너무 일찍 닫고 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;현재 프로세스에서 필요 없는 끝 부분만 닫고, 자식의 stdin/stdout을 닫아야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;두 번째로 이전 명령어의 fd를 기억해야 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;따라서 두 프로세스의 경우 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;int pipe[2];
pipe(pipe);
if ( fork() == 0 ) {
     /* Redirect output of process into pipe */
     close(stdout);
     close(pipe[0]);
     dup2( pipe[1], stdout );
     execvp(commands[0].argv[0], &amp;amp;commands[0].argv[0]);
} 
if ( fork() == 0 ) {
     /* Redirect input of process out of pipe */
     close(stdin);
     close(pipe[1]);
     dup2( pipe[0], stdin );
     execvp(commands[1].argv[0], &amp;amp;commands[1].argv[0]);
}
/* Main process */
close( pipe[0] );
close( pipe[1] );
waitpid();
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여기에 오류 처리를 추가하고 n개의 프로세스를 시작할 수 있도록 n-1개의 파이프를 생성하는 것이 당신의 일입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;첫 번째 fork() 블록의 코드는 프로세스 1..n-1의 해당 파이프에 대해 실행되어야 하고, 두 번째 fork() 블록의 코드는 프로세스 2..n에 대해 실행되어야 합니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/8082932/connecting-n-commands-with-pipes-in-a-shell&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>C</category>
      <author>lovejava</author>
      <guid isPermaLink="true">https://lovejava.tistory.com/756</guid>
      <comments>https://lovejava.tistory.com/756#entry756comment</comments>
      <pubDate>Sun, 5 Nov 2023 10:47:48 +0900</pubDate>
    </item>
    <item>
      <title>작동 오류: (2002, &amp;quot;socket '/var/run/mysqld/mysqld를 통해 로컬 MySQL 서버에 연결할 수 없습니다.양말'(2))</title>
      <link>https://lovejava.tistory.com/755</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;작동 오류: (2002, &quot;socket '/var/run/mysqld/mysqld를 통해 로컬 MySQL 서버에 연결할 수 없습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;양말'(2))&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;장고의 mysql 데이터베이스에 접속할 때 오류가 발생합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;mysql 서버가 실행되고 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;/var/run/mysqld/mysqld. sock이 없습니다.&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;내가 뛸때&lt;/font&gt;&lt;/font&gt;&lt;code&gt;$ find / -name *.sock -type s&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;, 저는 /tmp/mysql.sock 및 기타 관련 없는 출력만 받습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;추가했습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;socket = /tmp/mysql.sock&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;/etc/my.cnf로 전송합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고 나서 mysql을 재설정하고, django shell을 빠져나와 mysql 데이터베이스에 연결했습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여전히 같은 오류가 발생했습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;많이 찾아봤는데 아직도 방법을 잘 모르겠어요.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;어떤 도움이라도 좋습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;미리 감사드립니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그냥 몇가지 방법을 시도했을 뿐입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고 그것은 동작한다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 다음과 같이 했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;더하다&lt;/font&gt;&lt;/font&gt;&lt;code&gt;socket = /tmp/mysql.sock&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;.mysql 서버를 다시 시작합니다.&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;ln -s /tmp/mysql.sock /var/lib/mysqld/mysqld.sock&lt;/code&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;오늘 또 문제가 생겼습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;mysql에 로그인할 수 없습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;mysql은 처음입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그래서 mysql 서버와 클라이언트는 통신할 때 같은 소켓을 사용하는 것 같습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;덧붙입니다&lt;/font&gt;&lt;/font&gt;&lt;code&gt;socket = /var/mysqld/mysqld.sock&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;[mysqld] [client] block in my.cnf로 이동하면 작동합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&quot;localhost&quot; 대신 &quot;127.0.0.1&quot;을 사용합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;DATABASES = {
   'default': {
      'ENGINE': 'django.db.backends.mysql',
      'NAME': 'django',
      'USER': 'root',
      'PASSWORD': '',
      'HOST': '127.0.0.1',
      'PORT': '3306',
   }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 read_default_file로 OPTIONS 특성을 추가하고 my.cnf 파일의 경로를 제공합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'dbname',
        'USER': 'root',
        'PASSWORD': '',
        'HOST': 'localhost',
        'PORT': '3306',
        'OPTIONS': {
            'read_default_file': '/opt/lampp/etc/my.cnf',
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;호스트를 다음에서 변경해야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;'localhost'&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;로.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;'127.0.0.1'&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;장고 앱 확인해보세요 :)&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;플라스크안에, 당신은 그것을 사용해도 좋습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;app=Flask(__name__)&lt;/code&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;app.config[&quot;MYSQL_HOST&quot;]=&quot;127.0.0.1&lt;/code&gt; &lt;br&gt; &lt;code&gt;app.config[&quot;MYSQL_USER&quot;]=&quot;root&quot;&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;...&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;저&lt;/strong&gt;는 도커를 사용할 때 MySQL을 장고와 연결할 때 이 문제에 직면했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;해라&lt;/font&gt;&lt;/font&gt;&lt;code&gt;'PORT':'0.0.0.0'&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사용하지않음&lt;/font&gt;&lt;/font&gt;&lt;code&gt;'PORT': 'db'&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;. 도커 외부에서 앱을 실행하려고 하면 작동하지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/18150858/operationalerror-2002-cant-connect-to-local-mysql-server-through-socket-v&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>MySQL</category>
      <author>lovejava</author>
      <guid isPermaLink="true">https://lovejava.tistory.com/755</guid>
      <comments>https://lovejava.tistory.com/755#entry755comment</comments>
      <pubDate>Sun, 5 Nov 2023 10:47:39 +0900</pubDate>
    </item>
    <item>
      <title>왜 '익명'이스프링 시큐리티에서 인증된 사용자?</title>
      <link>https://lovejava.tistory.com/754</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;왜 '익명'이&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;스프링 시큐리티에서 인증된 사용자?&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것은 제 메인컨트롤러입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;package org.demian.demibox.controllers;

import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
public class MainController {
    private String getUsername() {
        Authentication auth = SecurityContextHolder.getContext().getAuthentication();
        if (auth.isAuthenticated())
            return auth.getName();
        else
            return null;
    }
    @RequestMapping(value = &quot;/&quot;, method = RequestMethod.GET)
    public String showHome() {
        String username = getUsername();
        System.out.println(username);
        if (username == null || username.length() == 0)
            return &quot;welcome&quot;;
        return &quot;index&quot;;
    }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;로그인이 되어있지 않지만,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;auth.isAuthenticated()&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;항상 돌아옵니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;true&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;.왜 그런 것일까요?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고 언제쯤?&lt;/font&gt;&lt;/font&gt;&lt;code&gt;auth.isAuthenticated()&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;거짓으로 돌려주십니까?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;인증된 사용자의 이름은&lt;/font&gt;&lt;/font&gt;&lt;code&gt;anonymousUser&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;로그인하지 않은 경우에는 사용자 이름을 입력합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;편집&lt;/font&gt;&lt;/h2&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것은 나의&lt;/font&gt;&lt;/font&gt;&lt;code&gt;security-context.xml&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;파일:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot; xmlns:security=&quot;http://www.springframework.org/schema/security&quot;
    xsi:schemaLocation=&quot;http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.2.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd&quot;&amp;gt;
    &amp;lt;security:authentication-manager&amp;gt;
        &amp;lt;security:authentication-provider&amp;gt;
            &amp;lt;security:jdbc-user-service data-source-ref=&quot;dataSource&quot; id=&quot;jdbcUserService&quot; /&amp;gt;
            &amp;lt;!-- &amp;lt;security:password-encoder ref=&quot;passwordEncoder&quot; /&amp;gt; --&amp;gt;
        &amp;lt;/security:authentication-provider&amp;gt;
    &amp;lt;/security:authentication-manager&amp;gt;
    &amp;lt;security:http use-expressions=&quot;true&quot;&amp;gt;
        &amp;lt;security:intercept-url pattern=&quot;/&quot; access=&quot;permitAll&quot; /&amp;gt;
        &amp;lt;security:intercept-url pattern=&quot;/login&quot; access=&quot;permitAll&quot; /&amp;gt;
        &amp;lt;security:intercept-url pattern=&quot;/redeem&quot; access=&quot;permitAll&quot; /&amp;gt;
        &amp;lt;security:intercept-url pattern=&quot;/redeem_code&quot; access=&quot;permitAll&quot; /&amp;gt;
        &amp;lt;security:intercept-url pattern=&quot;/static/**&quot; access=&quot;permitAll&quot; /&amp;gt;
        &amp;lt;security:intercept-url pattern=&quot;/*&quot; access=&quot;isAuthenticated()&quot; /&amp;gt;
        &amp;lt;security:intercept-url pattern=&quot;/**&quot; access=&quot;isAuthenticated()&quot; /&amp;gt;
        &amp;lt;security:intercept-url pattern=&quot;/**&quot; access=&quot;denyAll&quot; /&amp;gt;
        &amp;lt;security:form-login login-page=&quot;/login&quot; authentication-failure-url=&quot;/login?error=true&quot; /&amp;gt;
        &amp;lt;security:logout logout-success-url=&quot;/&quot; /&amp;gt;
        &amp;lt;security:remember-me key=&quot;offersAppKey&quot; user-service-ref=&quot;jdbcUserService&quot; /&amp;gt;
    &amp;lt;/security:http&amp;gt;
    &amp;lt;security:global-method-security secured-annotations=&quot;enabled&quot; /&amp;gt;
    &amp;lt;!-- &amp;lt;bean id=&quot;passwordEncoder&quot; class=&quot;org.springframework.security.crypto.password.StandardPasswordEncoder&quot; /&amp;gt; --&amp;gt;
&amp;lt;/beans&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고 다음의 대사들은 다음과 같습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;web.xml&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;파일:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;filter&amp;gt;
    &amp;lt;display-name&amp;gt;springSecurityFilterChain&amp;lt;/display-name&amp;gt;
    &amp;lt;filter-name&amp;gt;springSecurityFilterChain&amp;lt;/filter-name&amp;gt;
    &amp;lt;filter-class&amp;gt;org.springframework.web.filter.DelegatingFilterProxy&amp;lt;/filter-class&amp;gt;
&amp;lt;/filter&amp;gt;
&amp;lt;filter-mapping&amp;gt;
    &amp;lt;filter-name&amp;gt;springSecurityFilterChain&amp;lt;/filter-name&amp;gt;
    &amp;lt;url-pattern&amp;gt;/*&amp;lt;/url-pattern&amp;gt;
&amp;lt;/filter-mapping&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 Tomcat 8.0과 메이븐을 통해 모든 최신 종속성을 사용하고 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;스프링 보안은 기본적으로 이렇게 작동합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;https://docs.spring.io/spring-security/site/docs/4.0.x/reference/html/anonymous.html&quot; rel=&quot;noreferrer&quot;&gt;문서&lt;/a&gt;에서:&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&quot;익명 인증&quot;된 사용자와 인증되지 않은 사용자 사이에는 실질적인 개념적 차이가 없습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Spring Security의 익명 인증 기능은 액세스 제어 속성을 보다 편리하게 구성할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음과 같은 서블릿 API 호출에 대한 호출&lt;/font&gt;&lt;/font&gt;&lt;code&gt;getCallerPrincipal&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;, 예를 들어, 은 실제로 익명 인증 개체가 있는 경우에도 여전히 null을 반환합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;SecurityContextHolder&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;익명 인증이 유용한 다른 상황이 있습니다. 예를 들어 감사 인터셉트가 다음과 같이&lt;/font&gt;&lt;/font&gt;&lt;code&gt;SecurityContextHolder&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;어떤 주체가 특정 작업에 책임이 있는지 확인합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;수업은 다음과 같은 내용을 알고 있으면 보다 강력하게 작성할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;SecurityContextHolder&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;항상 포함하고 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Authentication&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;object, null이 아닙니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;혹시 확인이 필요한 경우에는&lt;/font&gt;&lt;/font&gt;&lt;code&gt;anonymousUser&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그 다음에 당신은 확인할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Authentication&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;목적은&lt;/font&gt;&lt;/font&gt;&lt;code&gt;AnonymousAuthenticationToken&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예든 아니든&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/26101738/why-is-the-anonymoususer-authenticated-in-spring-security&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>spring</category>
      <author>lovejava</author>
      <guid isPermaLink="true">https://lovejava.tistory.com/754</guid>
      <comments>https://lovejava.tistory.com/754#entry754comment</comments>
      <pubDate>Sun, 5 Nov 2023 10:47:32 +0900</pubDate>
    </item>
    <item>
      <title>C#에서 단일 Oracle 명령어로 여러 쿼리 실행</title>
      <link>https://lovejava.tistory.com/753</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;C#에서 단일 Oracle 명령어로 여러 쿼리 실행&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 비주얼 스튜디오 2013과 오라클 데이터베이스를 사용하고 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여러 개의 생성 테이블 쿼리를 한 번에 단일 오라클 명령으로 실행하고 싶은데 가능합니까?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 팔로우를 시도하고 있지만 일을 하지 않습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;OracleCommand cmd = new OracleCommand();
cmd.Connection = con;
cmd.CommandText = &quot;create table test(name varchar2(50) not null)&quot;+&quot;create table test2(name varchar2(50) not null)&quot;; 
//+ &quot;create table test3(name varchar2(50) not null)&quot;+&quot;create table test3(name varchar2(50) not null)&quot;;
cmd.CommandType = CommandType.Text;
cmd.ExecuteNonQuery();
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;cmd에서 오류가 발생했습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;비쿼리 실행();&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;두 개 이상의 명령을 실행하려면 해당 명령을 입력합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;begin ... end;&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;블록. 그리고 DDL문에 대해서도 (예를 들어).&lt;/font&gt;&lt;/font&gt;&lt;code&gt;create table&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;)와 함께 운영합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;execute immediate&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;. 이 코드는 내게 효과가 있었습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;OracleConnection con = new OracleConnection(connectionString);
con.Open();

OracleCommand cmd = new OracleCommand();
cmd.Connection = con;
cmd.CommandText =
    &quot;begin &quot; +
    &quot;  execute immediate 'create table test1(name varchar2(50) not null)';&quot; +
    &quot;  execute immediate 'create table test2(name varchar2(50) not null)';&quot; +
    &quot;end;&quot;;
cmd.CommandType = CommandType.Text;
cmd.ExecuteNonQuery();
con.Close();
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;자세한 정보:&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;http://www.intertech.com/Blog/executing-sql-scripts-with-oracle-odp/&quot; rel=&quot;noreferrer&quot;&gt;Oracle.ODP를 사용하여 SQL 스크립트 실행&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;해보셨습니까?&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;cmd.CommandText = &quot;create table test(name varchar2(50) not null);&quot;+&quot;create table test2(name varchar2(50) not null);&quot;;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/31917301/execute-multiple-queries-in-single-oracle-command-in-c-sharp&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>Oracle</category>
      <author>lovejava</author>
      <guid isPermaLink="true">https://lovejava.tistory.com/753</guid>
      <comments>https://lovejava.tistory.com/753#entry753comment</comments>
      <pubDate>Sun, 5 Nov 2023 10:47:25 +0900</pubDate>
    </item>
    <item>
      <title>드롭다운 메뉴를 만들기 위해 Ajax와 JSON을 사용하는 방법은?</title>
      <link>https://lovejava.tistory.com/752</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;드롭다운 메뉴를 만들기 위해 Ajax와 JSON을 사용하는 방법은?&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음은 &lt;strong&gt;OpenCart&lt;/strong&gt;에서 다른 레벨의 카테고리 메뉴를 표시할 때 사용한 코드입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;작동하지만 클릭할 때마다 점점 더 많이 생성됩니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;XHR finished loading: POST&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;XHR finished loading: GET&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;s는 때때로 다음을 클릭하여 페이지를 클릭합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
 _url = '';

 $(document).ready(function(){                
    $('#mnav a').on('click', function() {
        var cat = $(this).attr('id');
        _url = '&amp;amp;category_id=' + cat;

        $.post('index.php?route=test/category/child' + _url,
            function(data) {
               if(data.length&amp;gt;10){
                    $('#mnav #sub').remove();
                    $(data).insertAfter($('#mnav #' + cat));
               }
            });
    });
 });

$.ajaxPrefilter(function( options, original_Options, jqXHR ) {
    options.async = true;
});
&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;HTML 코드:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;div id=&quot;mnav&quot; class=&quot;list-group&quot;&amp;gt;
  &amp;lt;?php foreach ($categories as $category) { ?&amp;gt;
  &amp;lt;a id=&quot;&amp;lt;?php echo $category['category_id']; ?&amp;gt;&quot; class=&quot;list-group-item active&quot;&amp;gt;&amp;lt;?php echo $category['name']; ?&amp;gt;&amp;lt;/a&amp;gt;
  &amp;lt;?php } ?&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;컨트롤러 코드:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;?php
class ControllerTestCategory extends Controller {
    public function index() {
        if (isset($this-&amp;gt;request-&amp;gt;get['path'])) {
            $parts = explode('_', (string)$this-&amp;gt;request-&amp;gt;get['path']);
        } else {
            $parts = array();
        }

        $data['category_id'] = 0;
        if (isset($parts[0])) {
            $data['category_id'] = $parts[0];
        } else {
            $data['category_id'] = 0;
        }

        if (isset($parts[1])) {
            $data['child_id'] = $parts[1];
        } else {
            $data['child_id'] = 0;
        }

        $this-&amp;gt;load-&amp;gt;model('catalog/cat');

        $data['categories'] = array();

        $categories = $this-&amp;gt;model_catalog_cat-&amp;gt;getCategories(0);

        foreach ($categories as $category) {
            $children_data = array();

            $filter_data = array(
                'filter_category_id'  =&amp;gt; $category['category_id'],
                'filter_sub_category' =&amp;gt; true
            );

            $data['categories'][] = array(
                'category_id' =&amp;gt; $category['category_id'],
                'name'        =&amp;gt; $category['name'],
                'children'    =&amp;gt; $category['children'],
                'products'    =&amp;gt; $category['products'],
                'href'        =&amp;gt; $this-&amp;gt;url-&amp;gt;link('product/category', 'path=' . $category['category_id'])
            );
        }

        $this-&amp;gt;response-&amp;gt;setOutput($this-&amp;gt;load-&amp;gt;view('test/category', $data));
    }
    public function child() {
        if (isset($this-&amp;gt;request-&amp;gt;get['category_id'])) {
            $this-&amp;gt;load-&amp;gt;model('catalog/cat');

            $data['categories'] = array();

            $categories = $this-&amp;gt;model_catalog_cat-&amp;gt;getCategories($this-&amp;gt;request-&amp;gt;get['category_id']);

            $data['x'] = '&amp;lt;div id=&quot;sub&quot;&amp;gt;';

            foreach ($categories as $category) {
                $data['x'] .= '&amp;lt;li&amp;gt;' . $category['name'] . '&amp;lt;/li&amp;gt;';
            }
            $data['x'] .= '&amp;lt;/div&amp;gt;';
        } else {
            $data['x'] = 'NA';
        }
        $this-&amp;gt;response-&amp;gt;setOutput($this-&amp;gt;load-&amp;gt;view('test/category', $data));
    }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;SQL 코드:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;public function getCategories($parent_id = 0) {
    $sql = &quot;SELECT c.category_id, c.parent_id, cd.name,
        (SELECT COUNT(DISTINCT ch.category_id) from category ch where ch.parent_id = c.category_id and cd.language_id = '&quot; . (int)$this-&amp;gt;config-&amp;gt;get('config_language_id') . &quot;') as children&quot;;

    $sql .= &quot; , (SELECT COUNT(DISTINCT p.product_id) 
FROM product p  
    LEFT JOIN product_description pd ON (p.product_id = pd.product_id) 
    LEFT JOIN product_to_category p2c ON (p2c.product_id = p.product_id) 
    LEFT JOIN category_path cp ON (cp.category_id = p2c.category_id) 
WHERE 
    pd.language_id = '&quot; . (int)$this-&amp;gt;config-&amp;gt;get('config_language_id') . &quot;' AND 
    p.status = '1' AND 
    p.date_available &amp;lt;= NOW()) AS items&quot;;

    $sql .= &quot; FROM category c LEFT JOIN category_description cd ON (c.category_id = cd.category_id) WHERE c.parent_id = '&quot; . (int)$parent_id . &quot;' AND cd.language_id = '&quot; . (int)$this-&amp;gt;config-&amp;gt;get('config_language_id') . &quot;' AND c.status = '1' ORDER BY c.sort_order, LCASE(cd.name)&quot;;

    $query = $this-&amp;gt;db-&amp;gt;query($sql);
    return $query-&amp;gt;rows;
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 이 과목들을 거의 알지 못하기 때문에 필요한 모든 자바스크립트, jQuery, JSON 코드를 제공하여 저를 도와주시면 대단히 감사하겠습니다 :-(&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;게시 요청 결과를 자바스크립트 배열에 저장하여 재사용할 수 있으므로 다음을 참조하시기 바랍니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;/p&gt;
&lt;div class=&quot;snippet&quot; data-lang=&quot;js&quot; data-hide=&quot;false&quot; data-console=&quot;true&quot; data-babel=&quot;false&quot;&gt; 
 &lt;div class=&quot;snippet-code&quot;&gt; 
  &lt;pre class=&quot;snippet-code-js lang-js prettyprint-override&quot;&gt;&lt;code&gt;var cachedObj = [];

$(document).ready(function(){                
  $('#mnav a').on('click', function() {
    var cat = $(this).attr('id');
    _url = '&amp;amp;category_id=' + cat;
    getData(cat, _url); //&amp;lt;-- Get data from ajax or cache
  });
});

//This function replaces the $.post call (just for example) 
function dummyPost(id, url){
  //url should be used to make the post call
  var data = &quot;&amp;lt;span class='sub'&amp;gt;Test &quot; + id + &quot;&amp;lt;/span&amp;gt;&quot;;
  return data;
}

function getData(id, url){
  //Try to get data from cache
  var data;
  if(cachedObj[url]) {
    data = cachedObj[url];
    console.log(&quot;Data retrived from cache&quot;);
  }
  else {
    data = dummyPost(id, url);
    cachedObj[url] = data;
    console.log(&quot;Data retrived from post&quot;);
  }
  
  $('#mnav .sub').remove();
  //$(data).insertAfter($('#mnav #' + id));
  $('#mnav #' + id).append($(data));
}&lt;/code&gt;&lt;/pre&gt; 
  &lt;pre class=&quot;snippet-code-css lang-css prettyprint-override&quot;&gt;&lt;code&gt;.sub{
  color: red;
  font-weight: bold;
}&lt;/code&gt;&lt;/pre&gt; 
  &lt;pre class=&quot;snippet-code-html lang-html prettyprint-override&quot;&gt;&lt;code&gt;&amp;lt;script src=&quot;https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;div id=&quot;mnav&quot; class=&quot;list-group&quot;&amp;gt;
  &amp;lt;a id=&quot;1&quot; class=&quot;list-group-item active&quot;&amp;gt;One&amp;lt;/a&amp;gt;
  &amp;lt;a id=&quot;2&quot; class=&quot;list-group-item active&quot;&amp;gt;Two&amp;lt;/a&amp;gt;
  &amp;lt;a id=&quot;3&quot; class=&quot;list-group-item active&quot;&amp;gt;Three&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;&lt;/code&gt;&lt;/pre&gt; 
 &lt;/div&gt; 
&lt;/div&gt; 
&lt;p&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제가 해봤습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;dummyPost&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;post request를 하기 위해 수정해야 하는 기능.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예제의 로그에서 볼 수 있듯이 링크를 처음 클릭하면 &quot;post&quot;와 함께 하위 메뉴를 검색하고, 그 다음에는 캐시된 배열에서 데이터를 가져옵니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;cachedObj&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;도움이 되길 바랍니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;안녕.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;업데이트:&lt;/strong&gt; 코드에 적용되는 내용은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;

  var cachedObj = []; //&amp;lt;-- Add an array to cache submenus

  //Add a function to retrieves data from cache or REST
  function getData(url){
    //Try to get data from cache
    if(cachedObj[url]) {
      console.log(&quot;Data retrived from cache&quot;);
    }
    else {
      $.ajax({
         type: 'GET',
         url: 'index.php?route=test%2Fcategory%2Fchild' + url,
         success: function(data) {
               cachedObj[url] = data;
               console.log(&quot;Data retrived from post&quot;);
            }),
         async:false
      });
    }
    return cachedObj[url];
 }

 $(document).ready(function(){                
    $('#mnav a').on('click', function() {
        var cat = $(this).attr('id');
        var url = '&amp;amp;category_id=' + cat;

        var data = getData(url); //&amp;lt;-- Call the new function to get data
        if(data.length&amp;gt;10){
           $('#mnav #sub').remove();
           $(data).insertAfter($('#mnav #' + cat));
        }
    });
 });
&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;테스트를 할 수가 없어서 오류가 있을 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;문제는 앵커 태그의 기본 작업을 방지하지 못하고 있다는 점일 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;추가해 보기&lt;/font&gt;&lt;/font&gt;&lt;code&gt;event.preventDefault&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;. 이렇게 하면 브라우저가 실행됩니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;POST&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;요청이 아닌&lt;/font&gt;&lt;/font&gt;&lt;code&gt;GET&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하나.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;게다가 이벤트를 새로 추가하는 경우 요소가 아닌 문서에 바인딩하는 것이 가장 좋습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;#mnav a&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아약스를 통한 요소.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-js prettyprint-override&quot;&gt;&lt;code&gt; $(document).ready( function() {                
    $(document).on('click', '#mnav a', function( event ) {
        event.preventDefault();
        // some code
    });
 });
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;코드를 작성하기 전에 클라이언트와 서버가 통신하기를 원하는 방법에 대해 전략을 세워야 할 것 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 당신의 문제에 대해 이해합니다. &quot;메뉴는 클릭할 때마다 ajax 요청을 생성하는데, 저는 그것을 원하지 않습니다.&quot;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하지만 이것이 코드를 만든 방법입니다. jQuery에 의해 설정된 메뉴의 on click handler는&lt;/font&gt;&lt;/font&gt;&lt;code&gt;$.post()&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;불러들입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다른 방법은 메뉴를 채우기 위해 필요한 모든 데이터를 클라이언트에게 전송하는 것입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그런 다음 메뉴를 클릭할 때마다 ajax 요청을 보내는 대신 이미 메모리에 있는 데이터에서 끌어옵니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제가 생각할 수 있는 몇 가지 방법이 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;어떤 전략을 선택&lt;/strong&gt;하느냐는 시스템에 &lt;strong&gt;대한 편안함 및/또는 통제력&lt;/strong&gt;, &lt;strong&gt;페이지 속도에 대한 우선순위에 따라 달라집니다&lt;/strong&gt;.&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;서버가 이 데이터를 준비하도록 하고 데이터를 즉시 사용할 수 있도록 서버측 템플릿에 기록합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&amp;lt;script&amp;gt;&amp;lt;?php echo 'var menuData = '.json_encode($my_data).'; ?&amp;gt;&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;. 이것이 가장 빠른 옵션입니다.&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;기존 ajax URL을 사용하지만 페이지가 로드되면 일련의 ajax 요청을 실행합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;옵션 1에서와 같이 모든 결과를 일부 중앙 데이터 개체로 보냅니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;모든 데이터가 반환되면 메뉴가 작동합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여기서의 장점은 서버 사이드 코드를 변경할 필요가 없다는 것이지만, 많은 통화가 시간이 걸릴 것입니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;한 번에 모든 메뉴 데이터를 반환할 수 있는 새로운 ajax URL을 만듭니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;옵션 2보다는 빠르겠지만 서버 api 작업을 해야 합니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 아약스 추진 프로젝트에서 이 문제에 직면했습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제 해결책이 도움이 되기를 바랍니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이렇게 하면 더 많은 호출이 생성되지 않을 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;// DOM ready
$(function() {

    $(document).off('click', '#mnav a').on('click', '#mnav a', function(e){

      e.preventDefault();

      // your stuff here

    });
});
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 단계를 수행하면 됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;javascript로 드롭다운 만들기:&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(){
var port_button = document.getElementById(&quot;port&quot;).value;
if(port_button == 0){
var newhref;
var newhrefid;
var name = [&quot;jquery ajax&quot;, &quot;dropdown menu&quot;, &quot;db&quot;];
var links = [&quot;api.jquery.com/jquery.ajax/&quot;, &quot;www.w3schools.com/howto/howto_js_dropdown.asp&quot;, &quot;www.w3schools.com/php/php_ajax_database.asp&quot;];
var div=document.getElementById(&quot;myDropdown&quot;); 
for(var i = 0; i&amp;lt;3; i++){
  newhref= document.createElement(&quot;a&quot;);
  newhref.href=&quot;http://&quot;+links[i];
  newhref.innerHTML= name[i];
  newhrefid = &quot;idhr_&quot;+i;
  newhref.setAttribute('id', newhrefid );
  div.appendChild(newhref);
}
document.getElementById(&quot;myDropdown&quot;).classList.toggle(&quot;show&quot;);
document.getElementById(&quot;port&quot;).value = &quot;2&quot;;
}
else if(port_button == 1){
document.getElementById(&quot;myDropdown&quot;).classList.toggle(&quot;show&quot;);
document.getElementById(&quot;port&quot;).value = &quot;2&quot;;
}
else{
document.getElementById(&quot;myDropdown&quot;).classList.toggle(&quot;hide&quot;);
document.getElementById(&quot;port&quot;).value = &quot;1&quot;;
}


}


function filterFunction() {
    var input, filter, ul, li, a, i;
    input = document.getElementById(&quot;myInput&quot;);
    filter = input.value.toUpperCase();
    div = document.getElementById(&quot;myDropdown&quot;);
    a = div.getElementsByTagName(&quot;a&quot;);
    for (i = 0; i &amp;lt; a.length; i++) {
        if (a[i].innerHTML.toUpperCase().indexOf(filter) &amp;gt; -1) {
            a[i].style.display = &quot;&quot;;
        } else {
            a[i].style.display = &quot;none&quot;;
        }
    }
}&lt;/code&gt;&lt;/pre&gt; 
  &lt;pre class=&quot;snippet-code-css lang-css prettyprint-override&quot;&gt;&lt;code&gt;.dropbtn {
    background-color: #4CAF50;
    color: white;
    padding: 16px;
    font-size: 16px;
    border: none;
    cursor: pointer;
}

.dropbtn:hover, .dropbtn:focus {
    background-color: #3e8e41;
}
#myInput {
    border-box: box-sizing;
    background-image: url('searchicon.png');
    background-position: 14px 12px;
    background-repeat: no-repeat;
    font-size: 16px;
    padding: 14px 20px 12px 45px;
    border: none;
}

.dropdown {
    position: relative;
    display: inline-block;
}

.dropdown-content {
    display: none;
    position: absolute;
    background-color: #f6f6f6;
    min-width: 230px;
    overflow: auto;
    box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2);
    z-index: 1;
}

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

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

.show {display:block;}&lt;/code&gt;&lt;/pre&gt; 
  &lt;pre class=&quot;snippet-code-html lang-html prettyprint-override&quot;&gt;&lt;code&gt;&amp;lt;script src=&quot;https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;div class=&quot;dropdown&quot;&amp;gt;
&amp;lt;button onclick=&quot;myFunction()&quot; class=&quot;dropbtn&quot;&amp;gt;Dropdown&amp;lt;/button&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;&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;input type=&quot;hidden&quot; id = &quot;port&quot; value = &quot;0&quot;&amp;gt;&lt;/code&gt;&lt;/pre&gt; 
 &lt;/div&gt; 
&lt;/div&gt; 
&lt;p&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;'입력', 'p', 'a' 등의 요소 드롭다운을 만들 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;특정 ID를 선택하려면 이 html을 코드에 추가합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;form&amp;gt;
&amp;lt;select id = &quot;name_of_user&quot; name=&quot;users&quot; onchange=&quot;showUser(this.value)&quot;&amp;gt;
  &amp;lt;option value=&quot;&quot;&amp;gt;Select a person:&amp;lt;/option&amp;gt;
  &amp;lt;option value=&quot;1&quot;&amp;gt;Peter Griffin&amp;lt;/option&amp;gt;
  &amp;lt;option value=&quot;2&quot;&amp;gt;Lois Griffin&amp;lt;/option&amp;gt;
  &amp;lt;option value=&quot;3&quot;&amp;gt;Joseph Swanson&amp;lt;/option&amp;gt;
  &amp;lt;option value=&quot;4&quot;&amp;gt;Glenn Quagmire&amp;lt;/option&amp;gt;
  &amp;lt;/select&amp;gt;
&amp;lt;/form&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;데이터베이스 데이터를 입력하려면 다음 코드에 가입하십시오.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;?php
$servername = &quot;localhost&quot;;
$username = &quot;username&quot;;
$password = &quot;password&quot;;
$dbname = &quot;myDB&quot;;

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn-&amp;gt;connect_error) {
    die(&quot;Connection failed: &quot; . $conn-&amp;gt;connect_error);
}

$sql = &quot;SELECT id, name FROM user&quot;;
$result = $conn-&amp;gt;query($sql);
if ($result-&amp;gt;num_rows &amp;gt; 0) {
    // output data of each row
    $option = &quot;&quot;;
    while($row = $result-&amp;gt;fetch_assoc()) {
       $option .= '&amp;lt;option value = &quot;'.$row[&quot;id&quot;].'&quot;&amp;gt;'.ech$row[&quot;name&quot;].'&amp;lt;/option&amp;gt;';
}
    }
$conn-&amp;gt;close();
?&amp;gt;
&amp;lt;form&amp;gt;
&amp;lt;select id = &quot;name_of_user&quot; name=&quot;users&quot; onchange=&quot;showUser(this.value)&quot;&amp;gt;
&amp;lt;?php echo $option; ?&amp;gt;     
&amp;lt;/select&amp;gt;
&amp;lt;/form&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이제 드롭 메뉴 코드에 AJAX를 생성하고 가입해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;function myFunction(){
    var port_button = document.getElementById(&quot;port&quot;).value;
    if(port_button == 0){
    var newhref;
    var newhrefid;
    var div=document.getElementById(&quot;myDropdown&quot;); 
    var val_1 = document.getElementById(&quot;name_of_user&quot;);//If you want to do a where select.
    $.ajax({
        url: 'test.php',
        type: 'POST',
        datatype: 'Json',
        data: {'q': val_1},
        success: function (response) {
           var newhref;
           var newhrefid;
           var div=document.getElementById(&quot;myDropdown&quot;); 
           for(var i = 0; i&amp;lt;response.nunber_of_rows; i++){
             newhref= document.createElement(&quot;a&quot;);
             newhref.href= response.tabel[i];
             newhref.innerHTML= response.tabel[i];
             newhrefid = &quot;idhr_&quot;+i;
             newhref.setAttribute('id', newhrefid );
             div.appendChild(newhref);
           } 
        }
    });
     document.getElementById(&quot;myDropdown&quot;).classList.toggle(&quot;show&quot;);
 else if(port_button == 1){
    document.getElementById(&quot;myDropdown&quot;).classList.toggle(&quot;show&quot;);
    document.getElementById(&quot;port&quot;).value = &quot;2&quot;;
 }
 else{
    document.getElementById(&quot;myDropdown&quot;).classList.toggle(&quot;hide&quot;);
    document.getElementById(&quot;port&quot;).value = &quot;1&quot;;
     }
  }
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;데이터베이스에 연결하려면 php가 필요합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;?php
$q = intval($_POST['q']);
$error_state = &quot;&quot;;
$con = mysqli_connect('localhost','peter','abc123','my_db');
if (!$con) {
    die('Could not connect: ' . mysqli_error($con));
}

mysqli_select_db($con,&quot;ajax_demo&quot;);
$sql=&quot;SELECT links FROM user WHERE id = '&quot;.$q.&quot;'&quot;;
$result = mysqli_query($con,$sql);
$i = 0;
while($row = mysqli_fetch_array($result)) {
 $tabel[$i] = array($row['link']);
 $i++;
}
$nunber_of_rows=$i;
mysqli_close($con);
echo json_encode (array(
                    'tabel'=&amp;gt;$tabel,
                    'nunber_of_rows'=&amp;gt;$nunber_of_rows
));
?&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제 예제의 출처는 스니펫 예제의 링크에 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;의심할 여지 없이, 그냥 제 도움을 요청하세요.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;자바스크립트 코드 쪽에 문제가 있는 것 같습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;나는 당신의 PHP와 DB 관련 코드가 제대로 결과를 던지고 있다고 가정합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;http://deluxe-menu.com/ajax-technology-menu-sample.html&quot; rel=&quot;nofollow noreferrer&quot;&gt;여기&lt;/a&gt;서 ajax 메뉴 로더 플러그인을 다운로드하는 것이 더 나은 해결책입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;당신은 파일에 결과물을 던지도록 당신의 PHP 코드를 설정할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;HTML 구조를 따라야 할 수도 있고 CSS를 새로운 클래스 이름으로 업데이트하여 스타일을 적용할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;당신의 문제를 해결하는 것이 더 빠르기를 바랍니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/43827637/how-to-use-ajax-and-json-for-making-dropdown-menu&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>ajax</category>
      <author>lovejava</author>
      <guid isPermaLink="true">https://lovejava.tistory.com/752</guid>
      <comments>https://lovejava.tistory.com/752#entry752comment</comments>
      <pubDate>Sun, 5 Nov 2023 10:47:18 +0900</pubDate>
    </item>
    <item>
      <title>Powershell Console에서 여러 줄 문자열을 할당하는 방법</title>
      <link>https://lovejava.tistory.com/751</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Powershell Console에서 여러 줄 문자열을 할당하는 방법&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이를 Powershell Console에 입력하면&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$test=@'
Test
Test'@
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고 여러번 입력하면 계속 인쇄됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그래서 나는 절대 지휘를 끝낼 수 없습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;무엇을 해야 하나?&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;code&gt;'@&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;줄에서 제일 먼저 해야 하거나 문자열의 일부로 간주해야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$test=@'
Test
Test
'@
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 접근 방식은 또한 다음과 같이 작동합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;@&quot;&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;/&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&quot;@&lt;/code&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;$test=@'
Test
Test
'@
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;유의해야 할 점은 구분 기호에 (보이지 않는) 캐리지 리턴이 포함되어 있다는 것입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;시작 태그 끝에 하나가 있어야 하고, 종료 태그 앞에 하나가 있어야 합니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;https://github.com/PoshCode/PowerShellPracticeAndStyle&quot; rel=&quot;noreferrer&quot;&gt;&lt;em&gt;PowerShell Best Practices and Style Guide&lt;/em&gt;&lt;/a&gt;의 &lt;a href=&quot;https://github.com/PoshCode/PowerShellPracticeAndStyle/blob/master/Style-Guide/Code-Layout-and-Formatting.md#maximum-line-length&quot; rel=&quot;noreferrer&quot;&gt;최대 &lt;/a&gt;줄&lt;a href=&quot;https://github.com/PoshCode/PowerShellPracticeAndStyle/blob/master/Style-Guide/Code-Layout-and-Formatting.md#maximum-line-length&quot; rel=&quot;noreferrer&quot;&gt; 길이&lt;/a&gt;에 대한 섹션에 따르면 다음과 같이 문자열을 &quot;분할&quot;하는 것이 좋습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$myStr = (&quot;The family of Dashwood had long been settled in Sussex. Their estate was &quot; +
              &quot;large, and their residence was at Norland Park, in the centre of their &quot; +
              &quot;property, where, for many generations, they had lived in so respectable &quot; +
              &quot;a manner as to engage the general good opinion of their surrounding &quot; +
              &quot;acquaintance.&quot;)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/31793449/how-to-assign-multiple-lines-string-in-powershell-console&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>PowerShell</category>
      <author>lovejava</author>
      <guid isPermaLink="true">https://lovejava.tistory.com/751</guid>
      <comments>https://lovejava.tistory.com/751#entry751comment</comments>
      <pubDate>Sun, 5 Nov 2023 10:47:04 +0900</pubDate>
    </item>
    <item>
      <title>C에서 printf() 함수의 반환 값</title>
      <link>https://lovejava.tistory.com/750</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;C에서 printf() 함수의 반환 값&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;printf()&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;그런데 아래 코드에는 왜 5를 인쇄하고 있는 것입니까?&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;int a=1000;
printf(&quot;%d&quot;,printf(&quot;\n%d&quot;,a));
&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;1000자는 한 번에 한 칸씩 인쇄하기 때문에 모두 5자입니다.&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;&quot;1000 2&quot;를 출력해야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;하지만 &quot;1000 5&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;출력되는 문자 수는 5자입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;1000&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;4자 입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;\n&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;한 캐릭터 입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;printf&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&quot;items&quot; 출력의 수를 반환하지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;scanf&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;함수 패밀리는 입력에 대해 수행합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;실제 문자 수를 반환합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;내부 호출이 먼저 발생하여 5자를 인쇄합니다(&lt;/font&gt;&lt;/font&gt;&lt;code&gt;\n&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;1&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;0&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;0&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;0&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;5&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;13&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;14&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러면 외부 호출이 발생하고, 출력합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;5&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;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;int a=10;
printf(&quot;a=%d&quot;,printf(&quot;b=%d&quot;,a));
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;20&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;산출량&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;b=10 a=4;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;code&gt;b&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;16&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;bi.e에 할당된 가치 때문에&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;b=10;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;22&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;b,=,1,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;4로 계산하고 ai에 할당합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;a=4;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;17&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;당신은 분명히 알아채야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;1000&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;18&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;네 글자인데, 당신은 가지고 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;\n&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;19&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그것 자체가 성격인 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;27&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;먼저 내부 printf의 출력을 확인합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;/n, 1, 0, 0, 0
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;28&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이제 두 가지를 고려해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;1) You have to take escape sequences like '\n','\t' etc into account.
2) You have to take 1 escape sequence as 1 character (not 2)
&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;외부 인쇄물은 내부 인쇄물의 실제 문자 수를 5로 반환합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;em papago-id=&quot;29-1&quot;&gt;그래서 외부 인쇄물은 5를 반환합니다.&lt;/em&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;strong papago-id=&quot;30-0&quot;&gt;printf ()&lt;/strong&gt;는 실제 &lt;strong papago-id=&quot;30-0&quot;&gt;문자&lt;/strong&gt; 수를 &lt;strong papago-id=&quot;30-0&quot;&gt;반환&lt;/strong&gt;합니다. &lt;strong papago-id=&quot;30-2&quot;&gt;여기&lt;/strong&gt;와 같이 4개(&quot;&lt;strong papago-id=&quot;30-4&quot;&gt;1000&quot;)&lt;/strong&gt; + 1개(&quot;\n&quot;) 문자가 있으므로 출력 1000을 제공하고 내부 printf 함수의 문자 수인 5를 제공하며 10005처럼 &lt;strong papago-id=&quot;30-6&quot;&gt;보입니다&lt;/strong&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;숫자 1000은 4자리로 구성되어 있어서 인쇄하는데 4자가 필요합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;4자에 대사 피드를 더하면 5자입니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;20&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;인에&lt;/font&gt;&lt;/font&gt;&lt;code&gt;printf(&quot;%d&quot;,printf(&quot;\n%d&quot;,a));&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;21&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그&lt;/font&gt;&lt;/font&gt;&lt;code&gt;printf(&quot;\n%d&quot;,a)&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;'\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;그리고 정수 값.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;1000&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;24&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;총 2개의&lt;/font&gt;&lt;/font&gt;&lt;code&gt;5&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 class=&quot;papago-parent&quot;&gt;첫번째 이너&lt;/font&gt;&lt;/font&gt;&lt;code&gt;printf&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;26&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;처음에 새 줄과 1000을 인쇄하고 반환되는 값을 호출합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;5&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;printf&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;41&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;함수에서 성공적으로 인쇄한 문자 수를 인쇄합니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://i.stack.imgur.com/VajUl.png&quot; rel=&quot;nofollow noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/VajUl.png&quot; alt=&quot;enter image description here&quot;&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;42&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이미지에서 볼 수 있는 것처럼, 먼저 마지막 인쇄 f는 3223433 1233을 보여줍니다. 이제 마지막 인쇄 f는 표시된 문자열/int의 문자 수를 반환합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그런 다음, 두 번째 마지막 인쇄 f는 마지막 인쇄 fi에 의해 표시된 것의 길이인 12를 표시합니다(즉, 3223433 1233).&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;세 번째 마지막 인쇄물에는 길이가 12인 2가 표시됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;12의 길이가 2이기 때문에 다음에 표시되고 2의 길이가 1이기 때문에 1이 표시되고 마지막에 1이 표시됩니다.&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&gt;&lt;code&gt;printf()&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;/p&gt; 
&lt;p papago-id=&quot;45&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;ex:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;int a= 0xff;
printf(&quot; : %i characters\n&quot; ,printf(&quot;%x&quot;,a)); //prints ff : 2 characters
printf(&quot; : %i characters\n&quot; ,printf(&quot;%d&quot;,a)); //prints 255 : 3 characters
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;int a=1000;
printf(&quot;%d&quot;,printf(&quot;\n%d&quot;,a));
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;46&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 코드 조각에는 2개의 printf() 함수가 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li papago-id=&quot;47&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;안쪽 프린트 f&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;48&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;바깥쪽 프린트 f&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&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;먼저 내부 printf()가 실행되고 인쇄됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;1000&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;32&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러면 외부 인쇄물 ()가 실행됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&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;printf()&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;strong papago-id=&quot;52-1&quot;&gt;인쇄할 문자 수&lt;/strong&gt;를 반환하고 &lt;strong papago-id=&quot;52-3&quot;&gt;탈출 시퀀스&lt;/strong&gt;가 printf의 &lt;strong papago-id=&quot;52-3&quot;&gt;문자로 계산&lt;/strong&gt;됩니다.&lt;/font&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;따라서, 내부 인쇄 f()를 실행함으로써, 우리는 5('\n', 1, 0, 0, 0이 5자이기 때문에), 이제, 외부 인쇄 f()가 실행되면, 5가 인쇄됩니다.&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;printf ()은 콘솔에 인쇄된 문자의 총 숫자를 반환합니다. 당신은 1000을 통과합니다. 따라서 첫번째 내부 printf () 기능은 작동하고 1000을 인쇄할 것이고, 여기서 문자의 숫자는 4입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;하나는 \n입니다.&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;그래서 글자의 합계가 5가 되고, 그래서 10005를 인쇄합니다.&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/7055882/return-value-of-printf-function-in-c&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>C</category>
      <author>lovejava</author>
      <guid isPermaLink="true">https://lovejava.tistory.com/750</guid>
      <comments>https://lovejava.tistory.com/750#entry750comment</comments>
      <pubDate>Tue, 31 Oct 2023 20:14:48 +0900</pubDate>
    </item>
    <item>
      <title>ASP.NET에서 페이지 캐시 지우기</title>
      <link>https://lovejava.tistory.com/749</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;ASP.NET에서 페이지 캐시 지우기&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;블로그의 경우 출력 캐시를 사용하여 특정 게시물의 캐시된 버전을 약 10분간 저장하려고 하는데 괜찮습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;%@OutputCache Duration=&quot;600&quot; VaryByParam=&quot;*&quot; %&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;하지만 누군가가 댓글을 달면 캐시를 지우고 페이지가 새로 고쳐지고 댓글이 보일 수 있도록 하고 싶습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;ASP에서 이걸 어떻게 해요?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;네트 C#?&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;HttpResponse.RemoveOutputCacheItem(&quot;/caching/CacheForever.aspx&quot;);
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;캐시를 지울 페이지를 알고 있다면 위의 내용도 괜찮습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;내 경우(ASP).&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;NET MVC) 전 세계에서 동일한 데이터를 참조했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;따라서 [저장]을 할 때 캐시 사이트를 전체적으로 지우고 싶었습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것이 제게 효과가 있었던 일입니다: http://aspalliance.com/668&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;이 작업은 OnAction의 컨텍스트에서 수행됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;필터 실행 중입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;OnAction을 재정의함으로써 이 작업을 쉽게 수행할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;Base Controller 같은 곳에서 실행 중입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;HttpContextBase httpContext = filterContext.HttpContext;
httpContext.Response.AddCacheItemDependency(&quot;Pages&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;protected void Application_Start()
{
    HttpRuntime.Cache.Insert(&quot;Pages&quot;, DateTime.Now);
}
&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;&quot;플래시 메시지&quot;(오류 메시지, 성공 메시지 - &quot;이 항목은 성공적으로 저장되었습니다&quot; 등)를 추가하는 도우미가 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이후 GET마다 플래시 메시지가 뜨지 않도록 하기 위해 플래시 메시지 작성 후 무효 처리를 해야 했습니다.&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;HttpRuntime.Cache.Insert(&quot;Pages&quot;, DateTime.Now);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;도움이 되길 바랍니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;응답을 사용합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;캐시 항목 의존성을 추가하여 모든 출력 캐시를 지웁니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;  public class Page : System.Web.UI.Page
  {
    protected override void OnLoad(EventArgs e)
    {
        try
        {
            string cacheKey = &quot;cacheKey&quot;;
            object cache = HttpContext.Current.Cache[cacheKey];
            if (cache == null)
            {
              HttpContext.Current.Cache[cacheKey] = DateTime.UtcNow.ToString();
            }

            Response.AddCacheItemDependency(cacheKey);
        }
        catch (Exception ex)
        {
            throw new SystemException(ex.Message);
        }

        base.OnLoad(e);
    }     
 }



  // Clear All OutPutCache Method    

    public void ClearAllOutPutCache()
    {
        string cacheKey = &quot;cacheKey&quot;;
        HttpContext.Cache.Remove(cacheKey);
    }
&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;이는 ASP에서도 사용할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;NET MVC의 Output Cashed 페이지입니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;13&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;마스터 페이지 로드 이벤트에 다음 사항을 적어주시기 바랍니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Response.Cache.SetExpires(DateTime.UtcNow.AddMinutes(-1));
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.SetNoStore();
&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;Session.Abandon();
Session.Clear();
&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;음. OutputCache 항목에서 VariByCustom 속성을 지정할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 값은 global.asax에서 구현할 수 있는 GetVariByCustomString 메서드에 매개 변수로 전달됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 메서드에 의해 반환되는 값은 캐시된 항목에 색인으로 사용됩니다. 예를 들어, 페이지의 주석 수를 반환하면 주석이 추가될 때마다 새 페이지가 캐시됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;16&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;여기서 주의해야 할 점은 이렇게 하면 실제로 캐시가 지워지지 않는다는 것입니다.&lt;/font&gt;&lt;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;p papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&quot;*&quot;를 단지 &quot;PostID?&quot;에 따라 캐시가 달라져야 하는 파라미터로만 변경하면 다음과 같은 작업을 수행할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;//add dependency
string key = &quot;post.aspx?id=&quot; + PostID.ToString();
Cache[key] = new object();
Response.AddCacheItemDependency(key);
&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;Cache.Remove(key);
&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;모든 요청은 동일한 캐시 종속성에 연결되기 때문에 VariByParam *의 경우에도 이 기능이 가능할 것으로 생각됩니다.&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;게시물 테이블에 sqlcache 종속성을 사용하지 않는 이유는 무엇입니까?&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;http://msdn.microsoft.com/en-us/library/ms178604.aspx&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;22&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;sqlcache 종속성 msdn&lt;/font&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;23&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이렇게 하면 맞춤형 캐시 클리어 코드를 구현하지 않고 DB에서 내용이 변경됨에 따라 캐시를 새로 고칩니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;code&gt;HttpRuntime.Close()&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;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/11585/clearing-page-cache-in-asp-net&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>ASP.NET</category>
      <author>lovejava</author>
      <guid isPermaLink="true">https://lovejava.tistory.com/749</guid>
      <comments>https://lovejava.tistory.com/749#entry749comment</comments>
      <pubDate>Tue, 31 Oct 2023 20:14:40 +0900</pubDate>
    </item>
    <item>
      <title>자바스크립트에서 주기적으로 함수를 호출하는 방법이 있습니까?</title>
      <link>https://lovejava.tistory.com/748</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;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;0&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그&lt;/font&gt;&lt;/font&gt;&lt;code&gt;setInterval()&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;간격을 고유하게 식별하는 간격 ID를 반환하므로 나중에 clear를 호출하여 제거할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;간격().&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;pre class=&quot;lang-js prettyprint-override&quot;&gt;&lt;code&gt;var intervalId = setInterval(function() {
  alert(&quot;Interval reached every 5s&quot;)
}, 5000);

// You can clear a periodic function by uncommenting:
// clearInterval(intervalId);
&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;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/setInterval&quot; papago-id=&quot;4-1&quot; rel=&quot;noreferrer&quot;&gt;setInterval()&lt;/a&gt; @ &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/setInterval&quot; papago-id=&quot;4-1&quot; rel=&quot;noreferrer&quot;&gt;MDN&lt;/a&gt; 웹 &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/setInterval&quot; papago-id=&quot;4-1&quot; rel=&quot;noreferrer&quot;&gt;문서&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;font class=&quot;papago-parent&quot;&gt;인터벌()은 주기적인 실행을 위한 최선의 해결책이 아닌 경우가 많습니다. 실제로 주기적으로 호출하는 자바스크립트에 따라 &lt;em papago-id=&quot;5-1&quot;&gt;다릅니다&lt;/em&gt;.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;em papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를 들어 1000ms 주기의 setInterval()을 사용하고 주기 함수에서 때때로 반환에 2초가 걸리는 아약스 호출을 수행하면 첫 번째 응답이 돌아오기 전에 다른 아약스 호출을 수행하게 됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 보통 바람직하지 않습니다.&lt;/font&gt;&lt;/em&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;많은 라이브러리에는 Nelson이 제공한 프로토타입 예제와 같이 setIntervaly를 사용할 때 발생하는 위험을 방지하는 주기적인 방법이 있습니다.&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;jQuery ajax 호출이 포함된 함수를 사용하여 보다 강력한 주기적 실행을 달성하려면 다음과 같은 것을 생각해 보십시오.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;function myPeriodicMethod() {
  $.ajax({
    url: ..., 
    success: function(data) {
      ...
    },
    complete: function() {
      // schedule the next request *only* when the current one is complete:
      setTimeout(myPeriodicMethod, 1000);
    }
  });
}

// schedule the first invocation:
setTimeout(myPeriodicMethod, 1000);
&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;다른 접근 방식은 setTimeout을 사용하지만 변수에서 경과된 시간을 추적한 다음 각 호출에 대한 타임아웃 지연을 동적으로 설정하여 원하는 간격에 최대한 가깝지만 응답을 다시 얻을 수 있는 것보다 빠르지 않은 기능을 실행하는 것입니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;모든 사용자에게 시간 초과/세트가 설정되어 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;인터벌 솔루션이 이미 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;문자열만이 아닌 Interval을 설정할 수 있도록 함수를 전달할 수 있다는 점에 유의할 필요가 있다고 생각합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;실제 함수에 &quot;평가&quot;될 문자열 대신 실제 함수를 전달하는 것이 실제로는 조금 더 안전할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;// example 1
function test() {
  alert('called');
}
var interval = setInterval(test, 10000);
&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;// example 2
var counter = 0;
var interval = setInterval(function() { alert(&quot;#&quot;+counter++); }, 5000);
&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;font class=&quot;papago-parent&quot;&gt;주기적인 작업 수행자가 필요했고 &lt;a href=&quot;https://github.com/onury/tasktimer&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;12-1&quot;&gt;TaskTimer&lt;/a&gt;를 작성했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;여러 태스크를 서로 다른 간격으로 실행해야 할 경우에도 유용합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-js prettyprint-override&quot;&gt;&lt;code&gt;// Timer with 1000ms (1 second) base interval resolution.
const timer = new TaskTimer(1000);

// Add task(s) based on tick intervals.
timer.add({
    id: 'job1',       // unique id of the task
    tickInterval: 5,    // run every 5 ticks (5 x interval = 5000 ms)
    totalRuns: 10,      // run 10 times only. (set to 0 for unlimited times)
    callback(task) {
        // code to be executed on each run
        console.log(task.id + ' task has run ' + task.currentRuns + ' times.');
    }
});

// Start the timer
timer.start();
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;code&gt;TaskTimer&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;13&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;브라우저와 노드에서 모두 작동합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;모든 기능은 &lt;a href=&quot;http://onury.io/tasktimer&quot; papago-id=&quot;13-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;설명서&lt;/a&gt;를 참조하십시오.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;세트를 보고 싶을 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;Interval() 및 setTimeout().&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;여기 &lt;a href=&quot;http://www.switchonthecode.com/tutorials/javascript-tutorial-using-setinterval-and-settimeout&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;15-1&quot;&gt;괜찮은 튜토리얼 기사&lt;/a&gt;가 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;16&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;yes - 특정 시간에 코드를 &lt;a href=&quot;http://www.elated.com/articles/javascript-timers-with-settimeout-and-setinterval/&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;16-1&quot;&gt;실행&lt;/a&gt;하는 방법을 살펴봅니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;setInterval은 코드를 주기적으로 실행하는 데 사용할 것입니다.&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/questions/914951/show-and-hide-divs-at-a-specific-time-interval-using-jquery/915016#915016&quot; papago-id=&quot;17-1&quot;&gt;사용 방법은 여기&lt;/a&gt;에 답하십시오.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;함수를 &lt;em papago-id=&quot;18-1&quot;&gt;주기적&lt;/em&gt;으로 실행시키려면 &lt;a href=&quot;https://developer.mozilla.org/En/Window.setInterval&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;18-3&quot;&gt;setInterval&lt;/a&gt;을 사용합니다.&lt;/font&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;function test() {
 alert('called!');
}
var id = setInterval('test();', 10000); //call test every 10 seconds.
function stop() { // call this to stop your interval.
   clearInterval(id);
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;토속적인 방법은 정말로&lt;/font&gt;&lt;/font&gt;&lt;code&gt;setInterval()&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;clearInterval()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;21&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;, &lt;a href=&quot;http://www.prototypejs.org/&quot; papago-id=&quot;21-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;Prototype&lt;/a&gt; 라이브러리를 이미 사용 중인 경우 Periodical Executor를 활용할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;new PeriodicalUpdator(myEvent, seconds);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;22&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이렇게 하면 중복되는 호출을 방지할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;http://www.prototypejs.org/api/periodicalExecuter 에서:&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p papago-id=&quot;23&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&quot;이것은 콜백 기능을 실행하는 데 주어진 간격보다 더 오래 걸릴 경우 콜백 기능의 여러 병렬 실행으로부터 사용자를 보호합니다(콜백 기능의 예외로부터 보호되는 내부 &quot;실행&quot; 플래그를 유지합니다).&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 기능은 사용자와 지정된 간격으로 상호 작용하기 위해 하나를 사용하는 경우(예: 프롬프트 사용 또는 확인 통화 사용) 특히 유용합니다. 이렇게 하면 작업 대기 중인 메시지 상자가 여러 개 발생하지 않습니다.&quot;&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;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/1224463/is-there-any-way-to-call-a-function-periodically-in-javascript&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>JavaScript</category>
      <author>lovejava</author>
      <guid isPermaLink="true">https://lovejava.tistory.com/748</guid>
      <comments>https://lovejava.tistory.com/748#entry748comment</comments>
      <pubDate>Tue, 31 Oct 2023 20:14:32 +0900</pubDate>
    </item>
    <item>
      <title>테마개발을 위한 워드프레스 오프라인 설명서</title>
      <link>https://lovejava.tistory.com/747</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;/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/closed-questions&quot; papago-id=&quot;1-3&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;/div&gt; 
     &lt;/div&gt; 
    &lt;/div&gt; 
   &lt;/div&gt; 
  &lt;/div&gt; 
  &lt;hr class=&quot;my12 outline-none baw0 bb bc-powder-400&quot;&gt; 
  &lt;div class=&quot;fw-nowrap fc-black-600&quot;&gt; 
   &lt;div class=&quot;d-flex fd-column lh-md&quot;&gt; 
    &lt;div class=&quot;mb0 d-flex&quot;&gt; 
     &lt;div class=&quot;flex--item mr8&quot;&gt; 
      &lt;svg aria-hidden=&quot;true&quot; class=&quot;svg-icon iconLightbulb&quot; width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 18 18&quot;&gt;
       &lt;path d=&quot;M15 6.38A6.48 6.48 0 0 0 7.78.04h-.02A6.49 6.49 0 0 0 2.05 5.6a6.31 6.31 0 0 0 2.39 5.75c.49.39.76.93.76 1.5v.24c0 1.07.89 1.9 1.92 1.9h2.75c1.04 0 1.92-.83 1.92-1.9v-.2c0-.6.26-1.15.7-1.48A6.32 6.32 0 0 0 15 6.37ZM4.03 5.85A4.49 4.49 0 0 1 8 2.02a4.48 4.48 0 0 1 5 4.36 4.3 4.3 0 0 1-1.72 3.44c-.98.74-1.5 1.9-1.5 3.08v.1H7.2v-.14c0-1.23-.6-2.34-1.53-3.07a4.32 4.32 0 0 1-1.64-3.94ZM10 18a1 1 0 0 0 0-2H7a1 1 0 1 0 0 2h3Z&quot;&gt;&lt;/path&gt;
      &lt;/svg&gt; 
     &lt;/div&gt; 
     &lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;b papago-id=&quot;2-0&quot;&gt;이 질문을 개선하고 싶으십니까?&lt;/b&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;/posts/2350593/edit&quot; papago-id=&quot;2-2&quot;&gt;이 게시물을 편집&lt;/a&gt;하여 한 가지 문제에만 초점을 맞추도록 질문을 업데이트합니다.&lt;/font&gt;&lt;/p&gt; 
    &lt;/div&gt; 
    &lt;div class=&quot;mb0 mt6 d-flex&quot;&gt; 
     &lt;p class=&quot;ml24 pl2&quot; papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;span class=&quot;relativetime&quot; papago-id=&quot;3-1&quot; title=&quot;2017-05-19 21:08:32Z&quot; papago-attr-id=&quot;1&quot;&gt;6년전&lt;/span&gt;에 문을 닫았습니다.&lt;/font&gt;&lt;/p&gt; 
    &lt;/div&gt; 
    &lt;div class=&quot;ml24 pl2&quot;&gt; 
    &lt;/div&gt; 
   &lt;/div&gt; 
  &lt;/div&gt; 
  &lt;div class=&quot;mt24 d-flex gsx gs8&quot;&gt; 
   &lt;a class=&quot;s-btn s-btn__outlined flex--item js-post-notice-edit-post&quot; href=&quot;/posts/2350593/edit&quot; papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 질문을 개선합니다.&lt;/font&gt;&lt;/a&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;저는 워드프레스로 막 시작했고 저만의 테마를 개발하고 싶습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 인터넷에 대한 신뢰성이 없어서 워드프레스 문서를 오프라인으로 만들고 싶습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것을 하는 가장 쉬운 방법은 무엇입니까?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;다운로드 가능한 문서를 찾을 수 없습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;웹 사이트의 많은 부분을 오프라인에서 사용할 수 있는 빠르고 쉬운 방법이 있습니까?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;고마워요 앤드류&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;워드프레스 오프라인 Codex 문서 2012년 2월 12일&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://www.filesin.com/48B6F308122/download.html&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사이트에서 아카이브에 다운로드할 수 있는 이러한 문서를 제공하지 않는 경우(흔히 제공됨), 항상 &quot;스파이더&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;예를 들어 wget이 그렇게 할 수 있다고 생각하거나 GUI &lt;a href=&quot;http://www.httrack.com/&quot; rel=&quot;nofollow noreferrer&quot; title=&quot;HT트랙 웹사이트 복사기&quot; papago-id=&quot;9-1&quot; papago-attr-id=&quot;4&quot;&gt;HTtrack&lt;/a&gt;을 사용하는 것이 좋은 도구이며 많은 매개 변수가 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;10&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;경고: 예를 들어 문서화만 원하는 경우 전체 사이트(또는 인터넷 전체)를 다운로드하지 않도록 매개 변수를 신중하게 설정해야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;br&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 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;MacOSX를 사용하는 경우 Dash를 시도합니다.&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;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/2350593/wordpress-offline-documentation-for-theme-development&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>Wordpress</category>
      <author>lovejava</author>
      <guid isPermaLink="true">https://lovejava.tistory.com/747</guid>
      <comments>https://lovejava.tistory.com/747#entry747comment</comments>
      <pubDate>Tue, 31 Oct 2023 20:14:25 +0900</pubDate>
    </item>
    <item>
      <title>'fName' 속성은 인덱스 서명에서 가져온 것이므로 ['fName']을(를) 사용하여 액세스해야 합니다.</title>
      <link>https://lovejava.tistory.com/746</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;'fName' 속성은 인덱스 서명에서 가져온 것이므로 ['fName']을(를) 사용하여 액세스해야 합니다.&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;pre class=&quot;lang-bash prettyprint-override&quot;&gt;&lt;code&gt;Error: src/app/app.component.html:5:123 - error TS4111: Property 'fName' comes from an index signature, so it must be accessed with ['fName'].
        &amp;lt;input id=&quot;name&quot; type=&quot;text&quot; formControlName=&quot;fName&quot; class=&quot;form-control&quot; [ngClass]=&quot;{'is-invalid':submitted &amp;amp;&amp;amp; f.fName.errors}&quot;/&amp;gt;

&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;성분.&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-html prettyprint-override&quot;&gt;&lt;code&gt;    &amp;lt;form [formGroup]=&quot;surveyForm&quot; (ngSubmit)=&quot;onSubmit()&quot;&amp;gt;
      &amp;lt;div&amp;gt;
        &amp;lt;label&amp;gt;Name:&amp;lt;/label&amp;gt;
        &amp;lt;input id=&quot;name&quot; type=&quot;text&quot; formControlName=&quot;fName&quot; class=&quot;form-control&quot; [ngClass]=&quot;{'is-invalid':submitted &amp;amp;&amp;amp; f.fName.errors}&quot;/&amp;gt;
        &amp;lt;div *ngIf=&quot;submitted &amp;amp;&amp;amp; f.fName.errors&quot; class=&quot;form-control&quot;&amp;gt;first name is required&amp;lt;/div&amp;gt;
      &amp;lt;/div&amp;gt;
    &amp;lt;/form&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;component.ts&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-js prettyprint-override&quot;&gt;&lt;code&gt;
    import { Component, OnInit } from '@angular/core';
    import { FormControl, FormBuilder, FormGroup, Validators} from '@angular/forms';
    @Component({
    selector: 'app-root',
      templateUrl: './app.component.html',
      styleUrls: ['./app.component.css']
      })
      export class AppComponent implements OnInit{
        surveyForm!: FormGroup;
        submitted= false;

     constructor(private  formBuilder: FormBuilder){}

     ngOnInit(){
     this.surveyForm = this.formBuilder.group({
       fName: ['',Validators.required]
      });
    }  
    //name = new FormControl('');
    get f() { return this.surveyForm.controls; }

     onSubmit() {
     this.submitted = true;

    // stop here if form is invalid
    if (this.surveyForm.invalid) {
        return;
    }

    // display form values on success
    alert('SUCCESS!! :-)\n\n' + JSON.stringify(this.surveyForm.value, null, 4));
    }

     onReset() {
    this.submitted = false;
    this.surveyForm.reset();
    }}
&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;모듈.ts&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-js prettyprint-override&quot;&gt;&lt;code&gt;
    import { NgModule } from '@angular/core';
    import { BrowserModule } from '@angular/platform-browser';
    import { ReactiveFormsModule } from '@angular/forms';
    import { AppRoutingModule } from './app-routing.module';
    import { AppComponent } from './app.component';
    import { FormsModule } from '@angular/forms';
    //import { FormBuilder } from '@angular/forms';

    @NgModule({
     declarations: [
       AppComponent
     ],
    imports: [
     BrowserModule,
     AppRoutingModule,
     FormsModule,
     ReactiveFormsModule,
     //FormBuilder
     ],
    //declarations: [AppComponent],
      providers: [
     //FormBuilder
     ],
     bootstrap: [AppComponent]
     })
     export class AppModule { }
&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;a href=&quot;https://www.typescriptlang.org/tsconfig#noPropertyAccessFromIndexSignature&quot; papago-id=&quot;0-1&quot; rel=&quot;noreferrer&quot;&gt;TypeScript에서 전혀&lt;/a&gt; 불필요한 &lt;a href=&quot;https://www.typescriptlang.org/tsconfig#noPropertyAccessFromIndexSignature&quot; papago-id=&quot;0-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;tsconfig.json&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-json prettyprint-override&quot;&gt;&lt;code&gt;&quot;compilerOptions&quot;: {
// ...
  &quot;noPropertyAccessFromIndexSignature&quot;: false,
// ...
}
&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;font class=&quot;papago-parent&quot;&gt;필드가 필요한지 확인하려면 검증해야 합니다(firstName이라고 함).&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;7-1&quot;&gt;Angular v13&lt;/strong&gt;부터는 다음과 같이 이전 코드에서 약간 &lt;strong papago-id=&quot;7-1&quot;&gt;변경&lt;/strong&gt;되었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;div *ngIf=&quot;firstName.errors?.required&quot;&amp;gt;First Name is required&amp;lt;/div&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;&amp;lt;div *ngIf=&quot;firstName.errors?.['required']&quot;&amp;gt;First Name is required&amp;lt;/div&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;'?'는 오류 개체가 null이 아님을 확인하기 위한 것입니다.&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;자세한 내용은 다음과 같습니다. https://angular.io/guide/form-validation&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;이 키 값을 tsconfig.json 파일의 false로 변경합니다.&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;noPropertyAccessFromIndexSignature&quot;: false&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;반응형 폼을 사용한 각도 13 폼 유효성 검사&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;*.component.ts 파일의 폼 필드에 쉽게 액세스할 수 있도록 폼 () getter를 추가합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;//convenience getter for easy access to form fields
get form(): { [key: string]: AbstractControl; }
{
    return this.signInForm.controls;
}
&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;form['email'].errors

form['email'].errors['required']

form['email'].errors['email']
&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;signInForm HTML 예제&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;form [formGroup]=&quot;signInForm&quot; (ngSubmit)=&quot;onSubmit()&quot;&amp;gt;

    &amp;lt;div class=&quot;form-group&quot;&amp;gt;
        &amp;lt;label for=&quot;email&quot;&amp;gt;Email&amp;lt;/label&amp;gt;
        &amp;lt;input type=&quot;email&quot; formControlName=&quot;email&quot; class=&quot;form-control&quot;
            [ngClass]=&quot;{ 'is-invalid': submitted &amp;amp;&amp;amp; form['email'].errors }&quot; /&amp;gt;
        &amp;lt;div *ngIf=&quot;submitted &amp;amp;&amp;amp; form['email'].errors&quot; class=&quot;invalid-feedback&quot;&amp;gt;
            &amp;lt;div *ngIf=&quot;form['email'].errors['required']&quot;&amp;gt;
                Field is required
            &amp;lt;/div&amp;gt;
            &amp;lt;div *ngIf=&quot;form['email'].errors['email']&quot;&amp;gt;
                Email format is invalid
            &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;

    &amp;lt;div class=&quot;form-group mt-3&quot;&amp;gt;
        &amp;lt;label for=&quot;password&quot;&amp;gt;Password&amp;lt;/label&amp;gt;
        &amp;lt;input type=&quot;password&quot; formControlName=&quot;password&quot; class=&quot;form-control&quot;
            [ngClass]=&quot;{ 'is-invalid': submitted &amp;amp;&amp;amp; form['password'].errors }&quot; /&amp;gt;
        &amp;lt;div *ngIf=&quot;submitted &amp;amp;&amp;amp; form['password'].errors&quot; class=&quot;invalid-feedback&quot;&amp;gt;
            &amp;lt;div *ngIf=&quot;form['password'].errors['required']&quot;&amp;gt;
                Password is required
            &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;

    &amp;lt;div class=&quot;mt-3 d-flex justify-content-between&quot;&amp;gt;
        &amp;lt;button type=&quot;submit&quot; [disabled]=&quot;isLoading&quot; mat-flat-button color=&quot;primary&quot;&amp;gt;
            &amp;lt;span *ngIf=&quot;isLoading&quot; class=&quot;spinner-border spinner-border-sm mr-1&quot;&amp;gt;&amp;lt;/span&amp;gt;
            Sign in
        &amp;lt;/button&amp;gt;
    &amp;lt;/div&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;각도 14.0.4에서, 그것은 단지 나에게 효과가 있었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;div *ngIf=&quot;user?.errors?.['required'] &quot;&amp;gt;First Name is required&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;답변:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;span *ngIf=&quot;username?.errors?.['required']&quot;&amp;gt;Name is required&amp;lt;/span&amp;gt;
&amp;lt;span *ngIf=&quot;username?.errors?.['minlength']&quot;&amp;gt;
    Name must be 3 
charchters&amp;lt;/span&amp;gt;
&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;다음은 Error: 질문에 대한 답변입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;src/app/reactive-signup/reactive-signup.component.html:16:52 - error TS4111: Property 'required' comes from an index signature, so it must be accessed with ['required'].&lt;/code&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;span *ngIf=&quot;username?.errors.required&quot;&amp;gt;
    Name is required
&amp;lt;/span&amp;gt;
&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;f['fName'].errors&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;21&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;대신에&lt;/font&gt;&lt;/font&gt;&lt;code&gt;f.fName.errors&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;22&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;input id=&quot;name&quot; type=&quot;text&quot; formControlName=&quot;fName&quot; class=&quot;form-control&quot; [ngClass]=&quot;{'is-invalid':submitted &amp;amp;&amp;amp; f['fName'].errors}&quot;/&amp;gt;
&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;반응형 양식과 양식 작성기를 사용한 Angular 13 Form Validation, Angular 문서에서 해결책을 찾았는데 Angular 12와 다른 점이 있습니다. 다음을 시도해 보십시오.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;div *ngIf=&quot;submitted &amp;amp;&amp;amp; surveyForm.get('fName')?.valid&quot; class=&quot;form-control&quot;&amp;gt;first name is required&amp;lt;/div&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;div *ngIf=&quot;firstName.errors?.required&quot;&amp;gt;
        &amp;lt;b&amp;gt;First Name is required&amp;lt;/b&amp;gt;
      &amp;lt;/div&amp;gt;
&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;파일.ts&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;formBuilderInit() {
        this.form = this.formBuilder.group({
            first_name: [null, Validators.required],
            middle_name: [],
            last_name: [null, Validators.required],
            email: [],
            tel: [null, [Validators.required, Validators.pattern('^[0-9]{12}$')]],
        });
    }

    // convenience getter for easy access to form fields
    get f(): { [key: string]: AbstractControl; } {
        return this.form.controls;
    }
&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;mat-label for=&quot;tel&quot;&amp;gt;Telephone&amp;lt;/mat-label&amp;gt;
    &amp;lt;mat-form-field&amp;gt;
       &amp;lt;input
          type=&quot;number&quot;
          matInput
          formControlName=&quot;tel&quot;
          class=&quot;form-control&quot;
          placeholder=&quot;Ex: 250722353933&quot;
          [ngClass]=&quot;{ 'is-invalid': submitted &amp;amp;&amp;amp; f['tel'].errors }&quot;
       /&amp;gt;
       &amp;lt;/mat-form-field&amp;gt;
       &amp;lt;div *ngIf=&quot;submitted &amp;amp;&amp;amp; f['tel'].errors&quot; class=&quot;invalid-feedback&quot;&amp;gt;
        &amp;lt;div *ngIf=&quot;f['tel'].errors['required']&quot;&amp;gt;Telephone Number is required&amp;lt;/div&amp;gt;
            &amp;lt;div *ngIf=&quot;f['tel'].errors['pattern']&quot;&amp;gt;
               Phone number must be at least 12 digit numbers
            &amp;lt;/div&amp;gt;
       &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;오류 사이에 점(.)을 삽입하는 것을 잊지 마십시오.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;및 ['required'] 아래와 같이&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;div *ngIf=&quot;firstName.errors?.['required']&quot;&amp;gt;First Name is required&amp;lt;/div&amp;gt;
&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;자세한 정보(angular 15)는 다음 링크로 이동합니다: https://angular.io/guide/form-validation&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;ngmodel의 오류 특성을 가진 angular form validation 새로운 버전의 angular include following tag에 속성 검증이 필요함 *&amp;lt;&lt;em papago-id=&quot;30-1&quot;&gt;div&lt;/em&gt; &lt;em papago-id=&quot;30-1&quot;&gt;&lt;em papago-id=&quot;30-1-1&quot;&gt;ngIf&lt;/em&gt;&lt;/em&gt;=&quot;&lt;em papago-id=&quot;30-1&quot;&gt;&lt;em papago-id=&quot;30-1-1&quot;&gt;phone.hasError('required')&quot;&amp;gt;전화번호가 필요&lt;/em&gt;&lt;/em&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;형님은 off 대신 f['fullName'].errors[required]만 사용하세요.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;fName.errors.필수&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;Q: 'fullname' 속성은 인덱스 서명에서 가져온 것이므로 ['fullname'으로 액세스해야 합니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;33&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/70106472/property-fname-comes-from-an-index-signature-so-it-must-be-accessed-with-fn&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>angular</category>
      <author>lovejava</author>
      <guid isPermaLink="true">https://lovejava.tistory.com/746</guid>
      <comments>https://lovejava.tistory.com/746#entry746comment</comments>
      <pubDate>Tue, 31 Oct 2023 20:14:19 +0900</pubDate>
    </item>
    <item>
      <title>MySQL incrementing value</title>
      <link>https://lovejava.tistory.com/745</link>
      <description>&lt;h2&gt;MySQL incrementing value&lt;/h2&gt;
&lt;p&gt;Is there a way to make a value increment with every insert if having multiple inserts? (I dont speak of the primary key that autoincrements)&lt;/p&gt; 
&lt;p&gt;Lets say I have a structure like this:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;|ID_PRODUCT|ID_CATEGORY|NAME|POSITION|
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;So I have individual product ids, each produt belongs to a category and has a different position in this category. I want to do something like this:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;INSERT INTO products
( SELECT id_product, id_category, name, MY_POSITION++
  FROM db2.products WHERE id_category = xxx )
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;So there should be a variable MY_POSITION that starts with 1 and increments every insert.&lt;/p&gt; 
&lt;p&gt;It would be really easy to do this all just with a scripting-language like php or python, but I want to get better with SQL :)&lt;/p&gt;&lt;p&gt;Yes: Use a &lt;a href=&quot;http://dev.mysql.com/doc/refman/5.0/en/user-variables.html&quot; rel=&quot;nofollow noreferrer&quot;&gt;user defined variable&lt;/a&gt;:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;SET @position := 0; -- Define a variable
INSERT INTO products
SELECT id_product, id_category, name, (@position := @position + 1)
FROM db2.products
WHERE id_category = xxx;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;The result of increment to &lt;code&gt;@position&lt;/code&gt; is the value used for the insert.&lt;/p&gt; 
&lt;hr&gt; 
&lt;h3&gt;Edit:&lt;/h3&gt; 
&lt;p&gt;You can skip the declaration of the variable by handling the initial value in-line:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;...
SELECT ..., (@position := ifnull(@position, 0) + 1)
...
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;This can be particularly handy when executing the query using a driver that does not allow multiple commands (separated by semicolons).&lt;/p&gt;&lt;p&gt;You will need to ORDER BY id_category and use two user variables so you can track the previous category id -&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;SET @position := 0;
SET @prev_cat := 0;

INSERT INTO products
SELECT id_product, id_category, name, position
FROM (
    SELECT
        id_product,
        id_category,
        name,
        IF(@prev_cat = id_category, @position := @position + 1, @position := 1) AS position,
        @prev_cat := id_category
    FROM db2.products
    ORDER BY id_category ASC, id_product ASC
) AS tmp;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;This will allow you to do all categories in one query instead of category by category.&lt;/p&gt;&lt;p&gt;Purely to add to @Bohemians answer - I wanted the counter to reset every so often and this can be done like such:&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;SELECT *,(@position := IF (@position &amp;gt;= 15,1,@position + 1))&lt;/code&gt;&lt;/p&gt; 
&lt;p&gt;Where 15 is obviously the maximum number before reset.&lt;/p&gt;&lt;p&gt;Try setting a value using a subquery like this&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt; (SELECT MAX(position) FROM products AS T2)+1
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Or &lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;(SELECT MAX(position) FROM products AS T2 WHERE id_category = 'product category')+1
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;For those who are looking for example of update query, here it is:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;SET @i := 0;
UPDATE products SET id = (@i := @i + 1);
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Hope this will work.&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;update &amp;lt;tbl_name&amp;gt; set &amp;lt;column_name&amp;gt;=&amp;lt;column_name&amp;gt;+1 where &amp;lt;unique_column/s&amp;gt;='1'&quot;;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;ReferenceURL : &lt;a href=&quot;https://stackoverflow.com/questions/9631096/mysql-incrementing-value&quot; target=&quot;_blank&quot;&gt;https://stackoverflow.com/questions/9631096/mysql-incrementing-value&lt;/a&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>MySQL</category>
      <author>lovejava</author>
      <guid isPermaLink="true">https://lovejava.tistory.com/745</guid>
      <comments>https://lovejava.tistory.com/745#entry745comment</comments>
      <pubDate>Tue, 31 Oct 2023 20:14:09 +0900</pubDate>
    </item>
    <item>
      <title>함수 포인터의 용도는 무엇입니까?</title>
      <link>https://lovejava.tistory.com/744</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 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-01-2407:36:10Z&quot; papago-attr-id=&quot;1&quot;&gt;11년 전&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;blockquote&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;br&gt; &lt;a href=&quot;https://stackoverflow.com/questions/2592137/what-is-the-point-of-function-pointers&quot; papago-id=&quot;4&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;/blockquote&gt; 
&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;나는 실제 시나리오에서 함수 포인터가 어디에 사용되는지 이해하려고 합니다.&lt;/font&gt;&lt;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;strong papago-id=&quot;6-1&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/6807376/call-back-routine&quot; papago-id=&quot;6-1-0&quot;&gt;콜백 메커니즘&lt;/a&gt;&lt;/strong&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;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;strong papago-id=&quot;9-0&quot;&gt;유한 상태 기계&lt;/strong&gt;.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이렇게 하면 FSM의 정의가 한 곳(배열)에 유지됩니다.&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;기능&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;if-else construct 테스트 변수로 코드를 채우고 어수선하게 하는 대신 함수 포인터를 사용하도록 코드화한 다음 함수 포인터를 변경/할당하여 기능을 활성화/비활성화할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;새로운 변형을 추가하는 경우 if-else 또는 switch 케이스를 모두 추적할 필요가 없으며, 새로운 기능을 사용하도록 기능 포인터를 업데이트하거나 이전 기능을 사용하지 않도록 설정하면 됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이전 예에서 이에 대해 언급한 &lt;strong papago-id=&quot;11-0&quot;&gt;코드 클러터 감소&lt;/strong&gt;.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를 들어...&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;switch (a) {
case 0:
    func0();
    break;
case 1:
    func1();
    break;
case 2:
    func2();
    break;
case 3:
    func3();
    break;
default:
    funcX();
    break;
}
&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;/* This declaration may be off a little, but I am after the essence of the idea */
void (*funcArray)(void)[] = {func0, func1, func2, func3, funcX};
... appropriate bounds checking on 'a' ...
funcArray[a]();
&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;도움이 되길 바랍니다.&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;a href=&quot;http://en.wikipedia.org/wiki/Callback_%28computer_programming%29&quot; rel=&quot;noreferrer&quot; papago-id=&quot;14-1&quot;&gt;사용되는 것&lt;/a&gt; 중 하나는 콜백 기능을 구현하는 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;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;qsort&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&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;마지막 파라미터는 사용자가 작성한 비교기 함수의 포인터입니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;아주 유용한 앱으로 가장 먼저 떠오르는 것은 버튼입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음 코드를 사용합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;int buttonID = CreateButton (&quot;Click Me!&quot;, 100, 100, 200, 100, onClick);
&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;이렇게 하면 너비 200, 높이 100의 (100,100) 버튼이 만들어집니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;클릭할 때마다 onClick이 호출됩니다.&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;저는 개인 윈도우 API 포장지에 유사한 것을 사용합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;버튼 등을 훨씬 쉽게 만들 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;20&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;함수 포인터의 용도는 크게 두 가지입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&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;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;플러그인과 확장자 - 플러그인이나 라이브러리 확장자가 제공하는 함수에 대한 포인터는 표준 함수에 의해 수집됩니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;GetProcAddress&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;dlsym&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또는 이와 유사합니다. 함수 식별자를 이름으로 사용하고 함수 포인터를 반환합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;OpenGL과 같은 API에 절대적으로 중요합니다.&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt;&lt;p papago-id=&quot;25&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;대부분의 경우, 그것은 본질적으로 &lt;a href=&quot;http://en.wikipedia.org/wiki/Dependency_inversion_principle&quot; rel=&quot;noreferrer&quot; papago-id=&quot;25-1&quot;&gt;의존성 반전&lt;/a&gt;을 하는 C 방식입니다.&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;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;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;의 전형적인 예는&lt;/font&gt;&lt;/font&gt;&lt;code&gt;qsort&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;상위 정렬 함수는 정렬할 데이터의 유형, 크기 또는 비교 방법에 따라 달라지지 않습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그래서 당신이&lt;/font&gt;&lt;/font&gt;&lt;code&gt;qsort()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;일련의 int들, 세부사항들은&lt;/font&gt;&lt;/font&gt;&lt;code&gt;sizeof(int)&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고 당신의 비교 구현.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;추상화는 임의 크기의 요소 배열이며 해당 유형의 요소를 비교하는 함수입니다.&lt;/font&gt;&lt;/font&gt;&lt;/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;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Inversion_of_control&quot; rel=&quot;noreferrer&quot; papago-id=&quot;31-1&quot;&gt;제어의 반전&lt;/a&gt;.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;아무도 언급하지 않았다니 놀랍습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;pthread_create()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;10&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를 들면&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;34&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;의존성 반전으로 일반화할 수 없는 유일한 일반적인 용도는 전환할 수 없는 데이터 유형에 스위치와 같은 흐름 제어를 구현하는 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를 들어 문자열을 전환하고 싶은 경우 정렬된 문자열 키를 함수 포인터에 매핑한 배열을 만들고 이진 검색을 수행합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;스위치와 같은 O(1)가 아니라 일치하는 것을 찾을 때까지 맹목적으로 큰 if-else에서 strcmp()'s를 하는 것보다 낫습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;하지만 문자열을 토큰화하고 실제 스위치를 사용하는 것보다 나을 수 없습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;자, 주식 1위의 답은 다음과 같습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;qsort&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;qsort&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;13&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;will use가 함수 포인터로 전달됩니다.&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;38&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;C 언어 GUI 툴킷과 애플리케이션 프레임워크(예: Gnome/Gtk+/Glib)는 타이머나 사용자 인터페이스 이벤트에 대해 함수 포인터를 &quot;콜백&quot;으로 받아들이는 경우가 많습니다. (예: &quot;이 버튼을 클릭할 때마다 이 함수를 호출&quot; 또는 &quot;…이 타이머가 만료될 때마다&quot;)&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;사실, C의 대부분의 &quot;OOP-like&quot; 코드나 &quot;Event-driven&quot; 코드는 비슷한 이유로 함수 포인터를 받아들입니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;14&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;함수에 콜백을 전달하는 데 사용할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를 들어, 다음을 사용하여 배열을 정렬할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;qsort()&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;pre&gt;&lt;code&gt;// All odd numbers are before even numbers
int cmpoddeven(const void *xp, const void *yp) {
  int x = *((int*) xp);
  int y = *((int*) yp);
  if(x == y)
    return 0;
  if(x % 2 == y % 2) {
    return (x &amp;lt; y ? -1 : 1);
  if(x % 2 == 1)
    return -1;
  return 1;
}

int main() {
   int array[] = {1, 2, 3, 4, 5};
   // calling qsort with cmpoddeven as the comparison function
   qsort(array, 5, sizeof(int), &amp;amp;cmpoddeven);
   // array == {1, 3, 5, 2, 4};
}
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;42&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/8975208/what-is-the-use-of-function-pointers&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>C</category>
      <author>lovejava</author>
      <guid isPermaLink="true">https://lovejava.tistory.com/744</guid>
      <comments>https://lovejava.tistory.com/744#entry744comment</comments>
      <pubDate>Tue, 31 Oct 2023 20:14:02 +0900</pubDate>
    </item>
    <item>
      <title>포장마차 메시지에 추가된 우커머스 제거/숨김 쿠폰 적용 메시지 유지/표시</title>
      <link>https://lovejava.tistory.com/743</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;WooCommerce 체크아웃 페이지 상단에 추가된 카트 메시지를 제거하거나 숨기려고 합니다(카트 페이지를 제거하여 이 메시지가 체크아웃 페이지에 표시됨).&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;CSS에 이것을 추가하려고 했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;.woocommerce-message {display: none;}. 
&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;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음으로 나는 의 Business Bloomer 블로그에서 이 코드 스니펫을 시도했습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;functions.php&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;// Removes Product Successfully Added to Cart

add_filter( 'wc_add_to_cart_message', 'custom_add_to_cart_message' );

function custom_add_to_cart_message() {

echo '&amp;lt;style&amp;gt;.woocommerce-message {display: none !important;}&amp;lt;/style&amp;gt;';

}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 텍스트를 숨기지만 클래스가 있는 디바에 적용되는 스타일을 숨깁니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;.woocommerce-message&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;배경색, 패딩 등 여전히 눈에 띕니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그래서 저는 페이지 상단에 텍스트가 없는 직사각형이 남아있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&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;.woocommerce-message&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;div는 카트 메시지에 추가된 것에 대한 div일 뿐, 그렇지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;.woocommerce-messag&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;쿠폰 적용 메시지 또는 기타 메시지에 대한 eviv 감사하겠습니다!&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;효과가 있었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;add_filter( 'wc_add_to_cart_message', 'remove_add_to_cart_message' );

function remove_add_to_cart_message() {
    return;
}
&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;업데이트: 18/05/2018 이를 위한 올바른 방법은 벨마운틴의 훨씬 간단한 답변을 참조하시기 바랍니다.&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;12&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;테마에 이 코드 추가&lt;/font&gt;&lt;/font&gt;&lt;code&gt;functions.php&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;13&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;파일입니다. 메시지만 제거됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;발생 가능성이 높은 페이지에서만 트리거할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;function remove_added_to_cart_notice()
{
    $notices = WC()-&amp;gt;session-&amp;gt;get('wc_notices', array());

    foreach( $notices['success'] as $key =&amp;gt; &amp;amp;$notice){
        if( strpos( $notice, 'has been added' ) !== false){
            $added_to_cart_key = $key;
            break;
        }
    }
    unset( $notices['success'][$added_to_cart_key] );

    WC()-&amp;gt;session-&amp;gt;set('wc_notices', $notices);
}
add_action('woocommerce_before_single_product','remove_added_to_cart_notice',1);
add_action('woocommerce_shortcode_before_product_cat_loop','remove_added_to_cart_notice',1);
add_action('woocommerce_before_shop_loop','remove_added_to_cart_notice',1);
&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;당신이 시도한 CSS를 사용하는 것에 대해서는 걱정하지 마세요.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용하고 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;add_filter( 'wc_add_to_cart_message_html', '__return_null' );
&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;add_filter( 'wc_add_to_cart_message', 'remove_cart_message' );

function remove_cart_message() {
    return;
}
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그냥 다음을 사용했고 잘 작동했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;div.woocommerce-message {
    display: none !important;
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;도움이 되길 바랍니다!&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;19&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/34645095/remove-hide-woocommerce-added-to-cart-message-but-keep-display-coupon-applied-me&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>Wordpress</category>
      <author>lovejava</author>
      <guid isPermaLink="true">https://lovejava.tistory.com/743</guid>
      <comments>https://lovejava.tistory.com/743#entry743comment</comments>
      <pubDate>Tue, 31 Oct 2023 20:13:55 +0900</pubDate>
    </item>
    <item>
      <title>문자열이 아닌 숫자로 CSS 최상위 값을 얻습니까?</title>
      <link>https://lovejava.tistory.com/742</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;문자열이 아닌 숫자로 CSS 최상위 값을 얻습니까?&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;jQuery에서는 부모에 대한 상위 위치를 숫자로 얻을 수 있지만 css 상위 값을 숫자로 설정하면 얻을 수 없습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;px&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;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;/p&gt; 
&lt;pre&gt;&lt;code&gt;#elem{
  position:relative;
  top:10px;
 }
&lt;/code&gt;&lt;/pre&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;div&amp;gt;
  Bla text bla this takes op vertical space....
  &amp;lt;div id='elem'&amp;gt;bla&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;pre&gt;&lt;code&gt;$('#elem').position().top; //Returns the number (10+(the vertical space took by the text))
$('#elem').css('top'); //Returns the string '10px'
&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;하지만 나는 css top 속성을 번호로 하고 싶습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;10&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;어떻게 이런 일을 해낼 수 있을까요?&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;parseInt() 함수를 사용하여 문자열을 다음과 같은 숫자로 변환할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;parseInt($('#elem').css('top'));
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;8-0&quot;&gt;업데이트:&lt;/strong&gt; (벤이 제안한 대로):&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;레딕스도 줘야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;parseInt($('#elem').css('top'), 10);
&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;강제로 십진수로 구문 분석합니다. 그렇지 않으면 '0'으로 시작하는 문자열이 팔진수로 구문 분석될 수 있습니다(사용하는 브라우저에 따라 다를 수 있습니다).&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;M4N의 답변을 기반으로 한 jQuery 플러그인&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;jQuery.fn.cssNumber = function(prop){
    var v = parseInt(this.css(prop),10);
    return isNaN(v) ? 0 : v;
};
&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;$(&quot;#logo&quot;).cssNumber(&quot;top&quot;)
&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;이반 카스텔라노스의 답변(M4N의 답변을 기반으로 함)을 기반으로 한 좀 더 실용적인/효율적인 플러그인.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;|| 0&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;13&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;테스트 단계 없이 Nan을 0으로 변환합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또한 용도에 맞게 플로트 및 인테인트 변형을 제공했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;jQuery.fn.cssInt = function (prop) {
    return parseInt(this.css(prop), 10) || 0;
};

jQuery.fn.cssFloat = function (prop) {
    return parseFloat(this.css(prop)) || 0;
};
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2 papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;용도:&lt;/font&gt;&lt;/h2&gt; 
&lt;pre&gt;&lt;code&gt;$('#elem').cssInt('top');    // e.g. returns 123 as an int
$('#elem').cssFloat('top');  // e.g. Returns 123.45 as a float
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2 papago-id=&quot;16&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;http://jsfiddle.net/TrueBlueAussie/E5LTu/ 에서 테스트 fiddle을 수행합니다.&lt;/font&gt;&lt;/h2&gt;&lt;p papago-id=&quot;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 안되고, String으로 Top을 받고 Pixel을 제거했습니다.&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;let item = document.querySelector('.myclass');

let IngTop = parseInt(getComputedStyle(item).top.replace('px',''));&lt;/code&gt;&lt;/pre&gt; 
  &lt;pre class=&quot;snippet-code-css lang-css prettyprint-override&quot;&gt;&lt;code&gt;.myclass{
top : 150px
}&lt;/code&gt;&lt;/pre&gt; 
  &lt;pre class=&quot;snippet-code-html lang-html prettyprint-override&quot;&gt;&lt;code&gt;&amp;lt;div class='myclass'&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;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/395163/get-css-top-value-as-number-not-as-string&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>jQuery</category>
      <author>lovejava</author>
      <guid isPermaLink="true">https://lovejava.tistory.com/742</guid>
      <comments>https://lovejava.tistory.com/742#entry742comment</comments>
      <pubDate>Tue, 31 Oct 2023 20:13:48 +0900</pubDate>
    </item>
    <item>
      <title>CSV로 내보낼 때 열에 선행 0을 유지하려면 어떻게 해야 합니까?</title>
      <link>https://lovejava.tistory.com/741</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;CSV로 내보낼 때 열에 선행 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;다음과 같은 선두 0이 있는 열이 있는 데이터 프레임을 내보내려고 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;df[&quot;CD_LIN_NEG&quot;]

0     001
1     001
2     004
3     001
4     001
5     001
6     003
7     006
Name: CD_LIN_NEG, dtype: object
&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;하지만 csv로 내보낼 때 엑셀에서 파일을 열면 선행 0이 모두 잘립니다.&lt;/font&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;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;df[&quot;CD_LIN_NEG&quot;] = df['T_PROD_CP.LN'].astype(str).apply(lambda x: x.zfill(3))
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또는 다음과 같은 방식으로:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;df[&quot;CD_LIN_NEG&quot;] = '00' + df['T_PROD_CP.LN'].astype(str)
&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;이것은 @EdChum이 제안한 것처럼 훌륭한 문제입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;당신은 당신의 칼럼을 다음과 같이 포장하기를 원할 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;=&quot;&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;code&gt;apply('=&quot;{}&quot;.format)&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;. 그러면 Excel이 따옴표 내에서 텍스트를 반환하는 수식으로 항목을 취급합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그 텍스트는 선행 0이 있는 당신의 값이 될 것입니다.&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;pre&gt;&lt;code&gt;df = pd.DataFrame(dict(A=['001', '002']))
df.A = df.A.apply('=&quot;{}&quot;'.format)
df.to_excel('test_leading_zeros.xlsx')
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;가장 간단한 해결책은 다음을 추가하는 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;dtype=str&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;txt&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;csv&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Pandas의 파일:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-py prettyprint-override&quot;&gt;&lt;code&gt;df = pd.read_csv(r'C:\my_folder\my_file.csv', dtype=str)
&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;pandas.read_csv()&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;pandas.read_excel()&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;converters&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;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&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를들면,&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;import pandas as pd

df = pd.read_excel(
    './myexcel.xlsx',
    converters={
        &quot;serialno&quot;: str, # Ensure serialno is read as string, maintaining leading 0's
        &quot;location&quot;: lambda x: '-' if x=='' else str(x),
    }

df1 = pd.read_excel(
    './mycsv.csv',
    converters={
        &quot;serialno&quot;: str, # Ensure serialno is read as string, maintaining leading 0's
        &quot;location&quot;: lambda x: '-' if x=='' else str(x),
    }
&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;Excel 또는 CSV 파일에 데이터를 저장하면 선행 0이 유지됩니다.&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/41240535/how-can-i-keep-leading-zeros-in-a-column-when-i-export-to-csv&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>Excel</category>
      <author>lovejava</author>
      <guid isPermaLink="true">https://lovejava.tistory.com/741</guid>
      <comments>https://lovejava.tistory.com/741#entry741comment</comments>
      <pubDate>Tue, 31 Oct 2023 20:13:41 +0900</pubDate>
    </item>
    <item>
      <title>Adding a conditional to mustache/php</title>
      <link>https://lovejava.tistory.com/740</link>
      <description>&lt;h2 papago-id=&quot;0&quot;&gt;Adding a conditional to mustache/php&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot;&gt;Consider:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;?php
/**
 * Single variation display
 *
 * This is a javascript-based template for single variations (see https://codex.wordpress.org/Javascript_Reference/wp.template).
 * The values will be dynamically replaced after selecting attributes.
 *
 * @see     https://docs.woocommerce.com/document/template-structure/
 * @author  WooThemes
 * @package WooCommerce/Templates
 * @version 2.5.0
 */
if ( ! defined( 'ABSPATH' ) ) {
    exit;
}
?&amp;gt;
&amp;lt;script type=&quot;text/template&quot; id=&quot;tmpl-variation-template&quot;&amp;gt;
    &amp;lt;div class=&quot;woocommerce-variation-description&quot;&amp;gt;{{{ data.variation.variation_description }}}&amp;lt;/div&amp;gt;

    &amp;lt;div class=&quot;woocommerce-variation-price&quot;&amp;gt;{{{ data.variation.price_html }}}&amp;lt;/div&amp;gt;

    &amp;lt;div class=&quot;woocommerce-variation-availability&quot;&amp;gt;{{{ data.variation.availability_html }}}&amp;lt;/div&amp;gt;

 &amp;lt;div class=&quot;woocommerce-variation-custom-text-field&quot;&amp;gt;
        GTIN: &amp;lt;span class=&quot;sku&quot;&amp;gt;{{{ data.variation.wccaf_gtin }}}&amp;lt;/span&amp;gt;
    &amp;lt;/div&amp;gt;

 &amp;lt;div class=&quot;woocommerce-variation-custom-text-field&quot;&amp;gt;
        MPN: &amp;lt;span class=&quot;sku&quot;&amp;gt;{{{ data.variation.wccaf_mpn }}}&amp;lt;/span&amp;gt;
    &amp;lt;/div&amp;gt;

&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/template&quot; id=&quot;tmpl-unavailable-variation-template&quot;&amp;gt;
    &amp;lt;p&amp;gt;&amp;lt;?php _e( 'Sorry, this product is unavailable. Please choose a different combination.', 'woocommerce' ); ?&amp;gt;&amp;lt;/p&amp;gt;
&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;0&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음과 같은 조건을 구현하려면 어떻게 해야 합니까?&lt;/font&gt;&lt;/font&gt;&lt;code&gt;{{{ data.variation.wccaf_gtin }}}&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;공백/공백 값을 반환한 다음 &quot;GTIN 사용 불가&quot; 에코를 선택합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;4&quot;&gt;What I have tried:&lt;/p&gt; 
&lt;p papago-id=&quot;5&quot;&gt;I have read this on &lt;a href=&quot;https://en.wikipedia.org/wiki/Mustache_(template_system)#Examples&quot; rel=&quot;noreferrer&quot; papago-id=&quot;5-1&quot;&gt;wiki&lt;/a&gt;:&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p papago-id=&quot;6&quot;&gt;Template with section tag:&lt;/p&gt; 
 &lt;p papago-id=&quot;7&quot;&gt;{{#x}} Some text {{/x}} Here, when x is a Boolean value then the section tag acts like an if conditional&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p papago-id=&quot;8&quot;&gt;So I tried&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt; &amp;lt;div class=&quot;woocommerce-variation-custom-text-field&quot;&amp;gt;
        GTIN: &amp;lt;span class=&quot;sku&quot;&amp;gt;{{#repo}}{{ data.variation.wccaf_gtin }}{{/repo}}{{^repo}}N/A{{/repo}}&amp;lt;/span&amp;gt;
    &amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;9&quot;&gt;which doesn't work.&lt;/p&gt; 
&lt;p papago-id=&quot;10&quot;&gt;But I'm completely new to mustache and I need some guidance.&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;이 템플릿은 콧수염 템플릿이 아닙니다. 설명에 따르면 WordPress 사용자 정의입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;wp.template&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;해를 보다&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;논리 태그는 없지만 평가 태그는 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&amp;lt;# #&amp;gt;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;15&quot;&gt;From quick google here is an example how would you write a check using them:&lt;/p&gt; 
&lt;pre class=&quot;lang-js prettyprint-override&quot;&gt;&lt;code&gt;  &amp;lt;# if ( data.trueValue ) { #&amp;gt;
    &amp;lt;p&amp;gt; I am only output if &amp;lt;code&amp;gt;data.trueValue&amp;lt;/code&amp;gt; is true.
  &amp;lt;# } #&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;16&quot;&gt;Via &lt;a href=&quot;https://lkwdwrd.com/wp-template-js-templates-wp&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;16-1&quot;&gt;https://lkwdwrd.com/wp-template-js-templates-wp&lt;/a&gt;&lt;/p&gt;&lt;p papago-id=&quot;17&quot;&gt;According to &lt;a href=&quot;https://mustache.github.io/mustache.5.html&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;17-1&quot;&gt;Mustache Documentation&lt;/a&gt; &lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;// if exist
{{#repo}}
  &amp;lt;b&amp;gt;{{name}}&amp;lt;/b&amp;gt;        
{{/repo}}

// if not exist
{{^repo}}
  No repos :(
{{/repo}}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;18&quot;&gt;You may try this&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;div class=&quot;woocommerce-variation-custom-text-field&quot;&amp;gt;
        GTIN: &amp;lt;span class=&quot;sku&quot;&amp;gt;{{#data.variation.wccaf_gtin}}{{ data.variation.wccaf_gtin }}{{/data.variation.wccaf_gtin}}{{^data.variation.wccaf_gtin}}N/A{{/data.variation.wccaf_gtin}}&amp;lt;/span&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;19&quot;&gt;Try the same using &lt;a href=&quot;https://github.com/Redcof/ints-jst&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;19-1&quot;&gt;ints-jst&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;20&quot;&gt;Code:&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;div id=&quot;try-jst&quot;&amp;gt;
            &amp;lt;div class=&quot;woocommerce-variation-description&quot;&amp;gt;
                &amp;lt;js-t&amp;gt; print(data.variation.variation_description);&amp;lt;/js-t&amp;gt;
            &amp;lt;/div&amp;gt;

            &amp;lt;div class=&quot;woocommerce-variation-price&quot;&amp;gt;
                &amp;lt;js-t&amp;gt; print(data.variation.price_html);&amp;lt;/js-t&amp;gt;
            &amp;lt;/div&amp;gt;

            &amp;lt;div class=&quot;woocommerce-variation-availability&quot;&amp;gt;
                &amp;lt;js-t&amp;gt; print(data.variation.availability_html);&amp;lt;/js-t&amp;gt;
            &amp;lt;/div&amp;gt;

            &amp;lt;div class=&quot;woocommerce-variation-custom-text-field&quot;&amp;gt;
                GTIN:
                &amp;lt;span class=&quot;sku&quot;&amp;gt;
            &amp;lt;js-t&amp;gt;
                if(!!data.variation.wccaf_gtin) {
                   print(data.variation.wccaf_gtin);
                } else {
                   print(&quot;unavailable&quot;);
                }
            &amp;lt;/js-t&amp;gt;
        &amp;lt;/span&amp;gt;
            &amp;lt;/div&amp;gt;
            &amp;lt;div class=&quot;woocommerce-variation-custom-text-field&quot;&amp;gt;
                MPN:
                &amp;lt;span class=&quot;sku&quot;&amp;gt;
            &amp;lt;js-t&amp;gt;
                if(!!data.variation.wccaf_mpn) {
                   print(data.variation.wccaf_mpn);
                } else {
                   print(&quot;unavailable&quot;);
                }
            &amp;lt;/js-t&amp;gt;
        &amp;lt;/span&amp;gt;
            &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;21&quot;&gt;Script:&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;script&amp;gt;
    /* var data = {
        variation: {
            variation_description: 'variation_description',
            price_html: 'price_html',
            availability_html: 'availability_html',
            wccaf_gtin: '',
            wccaf_mpn: '123',
        }
    }; */
    // jQuery version
    compile($('#try-jst')[0]);
    run();

    // Plain Javascript
    /**
     * compile(document.getElementById('try-jst'));
     * run();
     */
&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;22&quot;&gt;Output:&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;div id=&quot;try-jst&quot;&amp;gt;
                &amp;lt;div class=&quot;woocommerce-variation-description&quot;&amp;gt;variation_description&amp;lt;/div&amp;gt;
                &amp;lt;div class=&quot;woocommerce-variation-price&quot;&amp;gt;price_html&amp;lt;/div&amp;gt;
                &amp;lt;div class=&quot;woocommerce-variation-availability&quot;&amp;gt;availability_html&amp;lt;/div&amp;gt;
                &amp;lt;div class=&quot;woocommerce-variation-custom-text-field&quot;&amp;gt; GTIN: &amp;lt;span class=&quot;sku&quot;&amp;gt;unavailable&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;
                &amp;lt;div class=&quot;woocommerce-variation-custom-text-field&quot;&amp;gt; MPN: &amp;lt;span class=&quot;sku&quot;&amp;gt;123&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;
            &amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;23&quot;&gt;So you can give it a try.&lt;/p&gt;&lt;p papago-id=&quot;24&quot;&gt;ReferenceURL : &lt;a href=&quot;https://stackoverflow.com/questions/54964240/adding-a-conditional-to-mustache-php&quot; target=&quot;_blank&quot; papago-id=&quot;24-1&quot;&gt;https://stackoverflow.com/questions/54964240/adding-a-conditional-to-mustache-php&lt;/a&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>Wordpress</category>
      <author>lovejava</author>
      <guid isPermaLink="true">https://lovejava.tistory.com/740</guid>
      <comments>https://lovejava.tistory.com/740#entry740comment</comments>
      <pubDate>Tue, 31 Oct 2023 20:13:34 +0900</pubDate>
    </item>
    <item>
      <title>TensorFlow에서 tf.app.flags의 목적은 무엇입니까?</title>
      <link>https://lovejava.tistory.com/739</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;TensorFlow에서 tf.app.flags의 목적은 무엇입니까?&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;flags = tf.app.flags
FLAGS = flags.FLAGS
flags.DEFINE_float('learning_rate', 0.01, 'Initial learning rate.')
flags.DEFINE_integer('max_steps', 2000, 'Number of steps to run trainer.')
flags.DEFINE_integer('hidden1', 128, 'Number of units in hidden layer 1.')
flags.DEFINE_integer('hidden2', 32, 'Number of units in hidden layer 2.')
flags.DEFINE_integer('batch_size', 100, 'Batch size.  '
                 'Must divide evenly into the dataset sizes.')
flags.DEFINE_string('train_dir', 'data', 'Directory to put the training data.')
flags.DEFINE_boolean('fake_data', False, 'If true, uses fake data '
                 'for unit testing.')
&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;tensorflow/tensorflow/g3doc/tutorials/mnist/fully_connected_feed.py&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&gt;&lt;/font&gt;&lt;code&gt;tf.app.flags&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;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;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;당연히 이거는.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;tf.app.flags&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;네트워크를 구성하는 데 어떻게든 사용되는데 API 문서에 없는 이유는 무엇입니까?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;여기에 무슨 일이 일어나고 있는지 설명해 줄 사람?&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그&lt;/font&gt;&lt;/font&gt;&lt;code&gt;tf.app.flags&lt;/code&gt; &lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;모듈은 현재 얇은 포장지 주위에 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strike papago-id=&quot;9-1&quot;&gt;
&lt;/strike&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strike papago-id=&quot;9-1&quot;&gt;  python-gflags, 그래서.&lt;/strike&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strike papago-id=&quot;9-1&quot;&gt; &lt;a href=&quot;https://github.com/gflags/python-gflags&quot; papago-id=&quot;9-1-1&quot;&gt;해당 프로젝트에 대한 문서화&lt;/a&gt;는 해당 프로젝트를 사용하는 방법에 가장 적합한 리소스입니다.&lt;/strike&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;, &lt;strike papago-id=&quot;9-1&quot;&gt; &lt;/strike&gt;&lt;a href=&quot;https://docs.python.org/2.7/library/argparse.html&quot; papago-id=&quot;9-2&quot;&gt;&lt;code papago-id=&quot;9-2-0&quot;&gt;argparse&lt;/code&gt;&lt;/a&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;이 모듈은 현재 데모 앱을 작성하기 위한 편의로 포장되어 있으며, 기술적으로 공개 API의 일부가 아니므로 향후 변경될 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음을 사용하여 자체 플래그 구문 분석을 구현하는 것이 좋습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;argparse&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;13&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;13-0&quot;&gt;편집:&lt;/strong&gt; 더&lt;/font&gt;&lt;/font&gt;&lt;code&gt;tf.app.flags&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;python-gflags&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;, 하지만 비슷한 API를 사용합니다.&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;tf.app.flags&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;13&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;모듈은 Tensorflow 프로그램의 명령줄 플래그를 구현하기 위해 Tensorflow에서 제공하는 기능입니다.&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;flags.DEFINE_float('learning_rate', 0.01, 'Initial learning rate.')
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;첫 번째 매개변수는 플래그의 이름을 정의하고, 두 번째 매개변수는 파일을 실행하는 동안 플래그가 지정되지 않은 경우 기본값을 정의합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;19&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;따라서 다음을 실행하면 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$ python fully_connected_feed.py --learning_rate 1.00
&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;그러면 학습 속도가 1.00으로 설정되고 플래그가 지정되지 않은 경우 0.01로 유지됩니다.&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;a href=&quot;https://medium.com/@zzzuzum/command-line-flags-python-and-tensorflow-85ab217dbd5&quot; rel=&quot;noreferrer&quot; title=&quot;명령줄 플래그:&quot; papago-id=&quot;21-1&quot; papago-attr-id=&quot;2&quot;&gt;이 기사&lt;/a&gt;에서 언급한 것처럼, 구글이 개발자들이 사용하도록 내부적으로 요구하는 것일 수도 있기 때문에 문서는 아마 존재하지 않을 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;14&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또한 게시물에서 언급한 바와 같이, Tensorflow flags가 다른 Python 패키지에서 제공하는 flag functional과 비교하여 Tensorflow flags를 사용하는 것의 몇 가지 장점이 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;argparse&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;15&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;특히 Tensorflow 모델을 다룰 때 가장 중요한 것은 어떤 GPU를 사용할지에 대한 정보와 같은 Tensorflow 특정 정보를 코드에 제공할 수 있다는 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;24&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;단답형:&lt;/font&gt;&lt;/p&gt; 
&lt;p 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;argparse와 비슷합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;argparse나 sys.argv 대신 자체 플래그 시스템을 사용합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;26&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;출처 : 전에 거기서 일했었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;27&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;긴 답변:&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;28&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 예제에서 사용하는 인수의 경우 &lt;a href=&quot;https://en.wikipedia.org/wiki/Hyperparameter_(machine_learning)&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;28-1&quot;&gt;하이퍼파라미터&lt;/a&gt;라고 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;신경망에는 원하는 결과를 얻기 위해 최적화할 수 있는 여러 개의 파라미터가 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를 들어 &lt;a href=&quot;https://keras.io/api/optimizers/#optimizers&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;28-3&quot;&gt;batch_size&lt;/a&gt;의 경우 한 번의 샷으로 &lt;a href=&quot;https://keras.io/api/optimizers/#optimizers&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;28-5&quot;&gt;옵티마이저&lt;/a&gt;에 전달할 수 있는 데이터 벡터(이미지, 텍스트 또는 원시 데이터 포인트일 수 있음)의 수가 됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;29&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;당신은 논쟁의 이름을 구글에서 검색할 수 있고, 그것의 목적이 무엇인지 볼 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;딥러닝에 대해 배우고 싶다면 앤드류 응(Andrew Ng) 강좌를 듣는 것을 추천합니다.&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&gt;&lt;code&gt;tf.app.run()&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;tf.app.flags&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;a href=&quot;https://github.com/tensorflow/models/tree/master/tutorials/image/cifar10&quot; papago-id=&quot;32-1&quot; rel=&quot;noreferrer&quot;&gt;항목&lt;/a&gt;을 참조하십시오.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;tf.app.flags&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;/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;pre&gt;&lt;code&gt;for key in tf.app.flags.FLAGS.flag_values_dict():

  print(key, FLAGS[key].value)
&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;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/33932901/whats-the-purpose-of-tf-app-flags-in-tensorflow&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>Python</category>
      <author>lovejava</author>
      <guid isPermaLink="true">https://lovejava.tistory.com/739</guid>
      <comments>https://lovejava.tistory.com/739#entry739comment</comments>
      <pubDate>Tue, 31 Oct 2023 20:13:25 +0900</pubDate>
    </item>
    <item>
      <title>Android ndk/jni와 함께 C++ 사용</title>
      <link>https://lovejava.tistory.com/738</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Android ndk/jni와 함께 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;모든 ndk 샘플은 헤더에 extern으로 선언되고 cpp 파일에 정의된 기본 C 함수만 사용합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러면 jni callback이 포함된 C 파일에 헤더 파일을 포함시킨 후에는 모든 것이 정상적으로 동작합니다.&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;안드로이드 ndk로 C++ 클래스를 사용할 수 있나요?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;제 애플리케이션은 네이티브 액티비티가 아니라 여전히 중요한 자바 부분을 가지고 있지만 CPU 집약적인 계산을 위해 네이티브 C 코드를 호출할 것입니다(클래스 및 기타 C++ 항목이 있는 C++로 이미 작성됨).&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;지금은 구조물과 같은 나의 헬로 월드를 소개합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;먼저 파일을 작성합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;h&quot;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#ifndef FIRST_H
#define FIRST_H

class Test
{};

#endif /* FIRST_H */
&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;파일 &quot;second.cpp&quot;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#include &amp;lt;jni.h&amp;gt;
#include &quot;first.h&quot;

#ifdef __cplusplus
extern &quot;C&quot; {
#endif

jint Java_com_example_twolibs_TwoLibs_add( JNIEnv*  env,
                                      jobject  this,
                                      jint     x,
                                      jint     y )
{
    Test t;
    return 0;
}

#ifdef __cplusplus
}
#endif
&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;그리고 마지막으로 Android.mk .&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := libtwolib-second
LOCAL_SRC_FILES := second.cpp

include $(BUILD_SHARED_LIBRARY)
&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;.c 파일에서 second.cpp를 돌리면 헤더 파일을 포함할 때 오류가 발생하는데, 이는 C++ 파일이 아니기 때문인 것 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;error: expected '=', ',', ';', 'asm' or '__attribute__' before 'Test'
&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;.cpp로 만들면 다음 오류가 발생합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;make: *** No rule to make target `/cygdrive/c/android-ndk-r5c/samples/twolibs/jni/second.c', needed by `/cygdrive/c/android-ndk-r5c/samples/two-libs/obj/local/armeabi/objs/twolib-second/second.o'.  Stop.
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;어떻게 하면 그걸 컴파일 할 수 있을까요?&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;감사해요.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;NDK와 함께 C++를 사용할 수 있지만 C++ 코드가 있는 파일은 확장자가 .cpp여야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;12-1&quot;&gt;ANDROID-MK.html&lt;/strong&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;C++ 소스 파일의 기본 확장자는 '.cpp'입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 LOCAL_CPP_EXTENSION 변수를 정의하여 다른 변수를 지정할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;처음 점(즉, '.cxx'는 작동하지만 'cxx'는 작동하지 않음)을 잊지 마십시오.&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;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Android 전용으로 모든 네이티브 라이브러리를 다시 컴파일해야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;단순히 우리가 안드로이드 밖에서 이 라이브러리들을 컴파일하고 링크할 때 그것들이 연결되기 때문에 당신이 사용하려는 모든 서드파티 네이티브 라이브러리에 대한 소스 코드가 필요합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;glibc&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;glibc&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;라이센스 및 성능 문제로 인해.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Android는 Waterdown 버전을 사용합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;glibc&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;libc&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; 대부분의 일반적인 기능에 대해 glibc와 일치하는 기호 이름을 가지고 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;하지만 제가 알기로는 libc는 관련된 기능을 가지고 있지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;strings&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;posix&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;지지하다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;기본 라이브러리에서 더 이상 사용되지 않는 기능을 사용하는 경우 다음과 같이 지원되는 대체 기능을 사용하여 해결 방법을 찾아야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;libc&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그에 따라 입술을 코딩하는 것.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;22&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또한 지적하신 대로 NDK를 사용하여 Java(Android app/fwk)를 네이티브 월드(C++)와 인터페이스해야 합니다.&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;Android(안드로이드 포팅)에서 네이티브 라이브러리를 컴파일하는 제 경험에는 이것이 꽤 단순하게 들리지만, 전통적으로 성공에 대한 보장 없이 매우 많은 시간이 소요되었습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;24&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;컴파일 오류와 관련하여 처음에 &quot;second.c&quot;라고 불렀다가 나중에 &quot;second.cpp&quot;로 이름을 바꾼 것 같지만 개체 파일에 &quot;second.c&quot; 이름이 남아 있기 때문에 컴파일(bdk-build)하기 전에 /cygdrive/c/android-ndk-r5c/samples/two-libs/obj/local/armeabi/objs/twolib-second/d 디렉토리에서 *.o 및 *.d 파일을 제거해야 합니다.&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;오류: 'class' 앞에 '=', ',', ';', 'asm' 또는 '__ 속성__'이 필요합니다.&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;class 키워드 앞에 ';'가 빠진 전형적인 경우?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;상상하다&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt; int functionname(int p)
 class X { } ;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;27&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 당신의 컴파일러 메시지로 꽤 쉽게 이어질 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;일반적인 복잡한 요인은 실제로 다음과 같이 보이는 경우입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt; #include &quot;someheader.h&quot;
 class X { } ;
&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;오류가 someheader 내부의 마지막 선언에 있습니다.h /또는 재귀적으로 포함된 파일/ ;)&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;pre&gt;&lt;code&gt;ndk-build clean
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;30&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;네가 잘못을 고친 후에&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Android.mk&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;31&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;, 그렇지 않으면 구성을 수정했더라도 빌드가 계속 실패할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;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/questions/6423078/use-c-with-android-ndk-jni#comment7552680_6423293&quot; papago-id=&quot;32-1&quot;&gt;이것이 OP&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;Android.mk 편집&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;LOCAL_SRC_FILES의 인스턴스를 수정하고 각 행의 처음에서 ./를 제거합니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;35&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/6423078/use-c-with-android-ndk-jni&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>C</category>
      <author>lovejava</author>
      <guid isPermaLink="true">https://lovejava.tistory.com/738</guid>
      <comments>https://lovejava.tistory.com/738#entry738comment</comments>
      <pubDate>Tue, 31 Oct 2023 20:13:19 +0900</pubDate>
    </item>
    <item>
      <title>코디네이터 레이아웃의 도구 모음 아래에 보기 추가</title>
      <link>https://lovejava.tistory.com/737</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;코디네이터 레이아웃의 도구 모음 아래에 보기 추가&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 다음과 같은 레이아웃을 가지고 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;android.support.design.widget.CoordinatorLayout
    android:id=&quot;@+id/main_content&quot;
    xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;
    xmlns:app=&quot;http://schemas.android.com/apk/res-auto&quot;
    android:layout_width=&quot;match_parent&quot;
    android:layout_height=&quot;match_parent&quot;&amp;gt;

    &amp;lt;android.support.design.widget.AppBarLayout
        android:id=&quot;@+id/appBar&quot;
        android:layout_width=&quot;match_parent&quot;
        android:layout_height=&quot;wrap_content&quot;
        android:theme=&quot;@style/ThemeOverlay.AppCompat.ActionBar&quot;&amp;gt;

        &amp;lt;android.support.v7.widget.Toolbar
            android:id=&quot;@+id/toolbar&quot;
            android:layout_width=&quot;match_parent&quot;
            android:layout_height=&quot;?attr/actionBarSize&quot;
            android:background=&quot;?attr/colorPrimary&quot;
            app:layout_scrollFlags=&quot;scroll|enterAlways&quot;
            app:popupTheme=&quot;@style/ThemeOverlay.AppCompat.Light&quot;/&amp;gt;

    &amp;lt;/android.support.design.widget.AppBarLayout&amp;gt;

    &amp;lt;FrameLayout
        android:id=&quot;@+id/content&quot;
        android:layout_width=&quot;match_parent&quot;
        android:layout_height=&quot;match_parent&quot;
        /&amp;gt;
&amp;lt;/android.support.design.widget.CoordinatorLayout&amp;gt;
&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;Fragment&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;FrameLayout&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;code&gt;Fragment&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;&amp;lt;android.support.v7.widget.RecyclerView
    xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;
    xmlns:app=&quot;http://schemas.android.com/apk/res-auto&quot;
    android:id=&quot;@+id/recyclerView&quot;
    android:layout_width=&quot;match_parent&quot;
    android:layout_height=&quot;match_parent&quot;
    app:layout_behavior=&quot;@string/appbar_scrolling_view_behavior&quot;/&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;여기서 &lt;strong papago-id=&quot;6-1&quot;&gt;문제는 도구&lt;/strong&gt; 모음이 목록 &lt;strong papago-id=&quot;6-1&quot;&gt;위에 그려져&lt;/strong&gt; 있다는 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 그 내용을 포장해서 해결하려고 했습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;CoordinatorLayout&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;LinearLayout&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;, 오버드로우는 해결했지만 앱바 스크롤 동작은 더 이상 작동하지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;어떤 도움이라도 주시면 감사하겠습니다!&lt;/font&gt;&lt;/p&gt;&lt;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;app:layout_behavior=&quot;@string/appbar_scrolling_view_behavior&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;외지에서&lt;/font&gt;&lt;/font&gt;&lt;code&gt;RecyclerView&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;FrameLayout&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;Toolbar&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;10&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&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 class=&quot;papago-parent&quot;&gt;왜냐하면.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;FrameLayout&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;RecyclerView&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;CoordinatorLayout&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;Toolbar&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;hr&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 class=&quot;papago-parent&quot;&gt;그 레이아웃 동작은 다음과 같은 결과를 초래할 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;FrameLayout&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;em papago-id=&quot;21-1&quot;&gt;이미 스크롤&lt;/em&gt; 된 &lt;em papago-id=&quot;21-1&quot;&gt;것&lt;/em&gt;처럼 크기가 지정됩니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Toolbar&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;18&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;전체 보기가 완전히 표시됨으로써 보기의 아래가 아래로 내려가기만 합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;CoordinatorLayout&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;19&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&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 class=&quot;papago-parent&quot;&gt;따라서 보기 하단에 고정 구성요소가 있는 스크롤 구성요소가 있는 경우 해당 하단 구성요소를 완전히 스크롤하기 전에는 볼 수 없습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Toolbar&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;21&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;22&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그래서 UI 하단에 버튼을 고정하고 싶을 때는 하단에 버튼을 넣어서 이 부분을 해결했습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;CoordinatorLayout&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;android:layout_gravity=&quot;bottom&quot;&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;/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;blockquote&gt; 
 &lt;p papago-id=&quot;30&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Android:layout_marginTop=&quot;?android:tractor/actionBarSize&quot;&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p papago-id=&quot;31&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음과 같이 프레임 레이아웃에 적용할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt; &amp;lt;FrameLayout
        android:id=&quot;@+id/content&quot;
        android:layout_marginTop=&quot;?android:attr/actionBarSize&quot;
        android:layout_width=&quot;match_parent&quot;
        android:layout_height=&quot;match_parent&quot;
       /&amp;gt;
&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;상단 도구 모음을 접거나 원하는 대로 ScrollFlags를 사용하려면 다음과 같은 방법을 사용할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://material.io/develop/android/components/collapsing-toolbar-layout/#:~:text=To%20add%20a%20collapsing%20toolbar,a%20child%20to%20the%20CollapsingToolbarLayout%20.&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;32-1&quot;&gt;소재 디자인&lt;/a&gt;부터 프레임 배치 제거&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&amp;gt;
&amp;lt;androidx.constraintlayout.widget.ConstraintLayout
xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;
xmlns:app=&quot;http://schemas.android.com/apk/res-auto&quot;
android:layout_width=&quot;match_parent&quot;
android:layout_height=&quot;match_parent&quot;&amp;gt;

&amp;lt;androidx.coordinatorlayout.widget.CoordinatorLayout
    android:layout_width=&quot;match_parent&quot;
    android:layout_height=&quot;match_parent&quot;&amp;gt;

    &amp;lt;com.google.android.material.appbar.AppBarLayout
        android:layout_width=&quot;match_parent&quot;
        android:layout_height=&quot;wrap_content&quot;&amp;gt;

        &amp;lt;com.google.android.material.appbar.CollapsingToolbarLayout
            android:layout_width=&quot;match_parent&quot;
            android:layout_height=&quot;match_parent&quot;
            app:contentScrim=&quot;?attr/colorPrimary&quot;
            app:expandedTitleGravity=&quot;top&quot;
            app:layout_scrollFlags=&quot;scroll|enterAlways&quot;&amp;gt;


        &amp;lt;androidx.appcompat.widget.Toolbar
            android:layout_width=&quot;match_parent&quot;
            android:layout_height=&quot;?attr/actionBarSize&quot;
            app:layout_collapseMode=&quot;pin&quot;&amp;gt;

            &amp;lt;ImageView
                android:id=&quot;@+id/ic_back&quot;
                android:layout_width=&quot;wrap_content&quot;
                android:layout_height=&quot;wrap_content&quot;
                android:src=&quot;@drawable/ic_arrow_back&quot; /&amp;gt;

            &amp;lt;TextView
                android:layout_width=&quot;wrap_content&quot;
                android:layout_height=&quot;wrap_content&quot;
                android:text=&quot;back&quot;
                android:textSize=&quot;16sp&quot;
                android:textStyle=&quot;bold&quot; /&amp;gt;

        &amp;lt;/androidx.appcompat.widget.Toolbar&amp;gt;


        &amp;lt;/com.google.android.material.appbar.CollapsingToolbarLayout&amp;gt;
    &amp;lt;/com.google.android.material.appbar.AppBarLayout&amp;gt;

        &amp;lt;androidx.recyclerview.widget.RecyclerView
            android:id=&quot;@+id/post_details_recycler&quot;
            android:layout_width=&quot;match_parent&quot;
            android:layout_height=&quot;match_parent&quot;
            android:orientation=&quot;vertical&quot;
            android:padding=&quot;5dp&quot;
            app:layout_behavior=&quot;@string/appbar_scrolling_view_behavior&quot;
            /&amp;gt;

&amp;lt;/androidx.coordinatorlayout.widget.CoordinatorLayout&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;/p&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;Android studio 3.4의 경우, 당신은 이 줄을 당신의 레이아웃에 넣어야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;RecyclerView&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;pre&gt;&lt;code&gt;app:layout_behavior=&quot;android.support.design.widget.AppBarLayout$ScrollingViewBehavior&quot;
&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;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/32956071/add-views-below-toolbar-in-coordinatorlayout&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>Android</category>
      <author>lovejava</author>
      <guid isPermaLink="true">https://lovejava.tistory.com/737</guid>
      <comments>https://lovejava.tistory.com/737#entry737comment</comments>
      <pubDate>Tue, 31 Oct 2023 20:13:11 +0900</pubDate>
    </item>
    <item>
      <title>LocalStorage에서 부울 값을 설정할 수 없습니까?</title>
      <link>https://lovejava.tistory.com/736</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;LocalStorage에서 부울 값을 설정할 수 없습니까?&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;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&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;localStorage.setItem(&quot;item1&quot;, true);
alert(localStorage.getItem(&quot;item1&quot;) + &quot; | &quot; + (localStorage.getItem(&quot;item1&quot;) == true));
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;항상 알림&lt;/font&gt;&lt;/font&gt;&lt;code&gt;true | false&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;localStorage.getItem(&quot;item1&quot;) == &quot;true&quot;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그것은 진실을 알려줍니다...&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;항목을 설정하려면 어떻게 해야 합니까?&lt;/font&gt;&lt;/font&gt;&lt;code&gt;localStorage&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사실입니까?&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;끈이더라도 난 생각만 했어요.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;===&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;유형을 확인하겠습니까?&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그렇게&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;alert(&quot;true&quot; == true); // should be true? 
&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;a href=&quot;https://developer.apple.com/library/archive/documentation/iPhone/Conceptual/SafariJSDatabaseGuide/Name-ValueStorage/Name-ValueStorage.html#//apple_ref/doc/uid/TP40007256-CH6-SW1&quot; rel=&quot;noreferrer&quot; papago-id=&quot;10-1&quot;&gt;Safari&lt;/a&gt;, WebKit, Chrome, &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Web_Storage_API&quot; rel=&quot;noreferrer&quot; papago-id=&quot;10-3&quot;&gt;Firefox&lt;/a&gt; 및 &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Storage/setItem&quot; rel=&quot;noreferrer&quot; papago-id=&quot;10-5&quot;&gt;IE&lt;/a&gt;의 모든 구현이 스토리지 항목의 값이 문자열일 수밖에 없는 WebStorage 표준의 &lt;a href=&quot;https://www.w3.org/TR/2009/WD-webstorage-20090423/&quot; rel=&quot;noreferrer&quot; papago-id=&quot;10-7&quot;&gt;최신 버전&lt;/a&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;옵션은 JSON을 사용하는 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;parse&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;12&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;stringify&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;a href=&quot;https://stackoverflow.com/questions/2010892/storing-objects-in-html5-localstorage/&quot; papago-id=&quot;10-5&quot;&gt;얼마&lt;/a&gt; 전 &lt;em papago-id=&quot;10-1&quot;&gt;다른&lt;/em&gt; &lt;a href=&quot;https://stackoverflow.com/questions/2010892/storing-objects-in-html5-localstorage/&quot; papago-id=&quot;10-5&quot;&gt;질문&lt;/a&gt;에서 제안했듯이 &lt;em papago-id=&quot;10-3&quot;&gt;데이터&lt;/em&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;var value = &quot;true&quot;;
console.log(JSON.parse(value) === true); // true&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;a href=&quot;https://developer.mozilla.org/en/dom/storage#Storage&quot; rel=&quot;noreferrer&quot; papago-id=&quot;14-0&quot;&gt;Firefox의 스토리지 구현&lt;/a&gt;은 문자열만 저장할 수 있지만, &lt;a href=&quot;http://www.w3.org/TR/2009/WD-webstorage-20090910/#the-storage-interface&quot; rel=&quot;noreferrer&quot; papago-id=&quot;14-2&quot;&gt;2009년 9월&lt;/a&gt; W3C는 어떠한 데이터도 수용할 수 있도록 초안을 수정했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;del papago-id=&quot;14-4&quot;&gt;구현이 아직 완료되지 않았습니다(&lt;/del&gt;&lt;em papago-id=&quot;14-6&quot;&gt;아래 편집 참조&lt;/em&gt;).&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그래서 당신의 경우 부울은 문자열로 변환됩니다.&lt;/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;&quot;true&quot; != true&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;12&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;, &lt;a href=&quot;https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Operators/Comparison_Operators&quot; papago-id=&quot;12-1&quot; rel=&quot;noreferrer&quot;&gt;MDC*&lt;/a&gt;의&lt;a href=&quot;https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Operators/Comparison_Operators&quot; papago-id=&quot;12-1&quot; rel=&quot;noreferrer&quot;&gt; Equal()&lt;code papago-id=&quot;12-1-1&quot;&gt;==&lt;/code&gt; 설명&lt;/a&gt;에 기재된 바와 같이:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&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;strong papago-id=&quot;18-1&quot;&gt;숫자&lt;/strong&gt;로 변환되고, 가능하면 피연산자가 문자열이면 다른 피연산자는 문자열로 변환됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;13&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;문자열은 &lt;em papago-id=&quot;13-3&quot;&gt;부울&lt;/em&gt; 대신 &lt;em papago-id=&quot;13-1&quot;&gt;숫자&lt;/em&gt;로 변환됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;부터&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&quot;true&quot;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;20&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;숫자로 환산하면 다음과 같습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;NaN&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;21&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;, 그것은 어떤 것과도 동등하지 않을 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;false&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;22&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;반환됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;23&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(*: 실제 표준은 ECMA-262 §11.9.3 &quot;추상적 동등성 비교 알고리즘&quot; 참조)&lt;/font&gt;&lt;/p&gt; 
&lt;hr&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;strong papago-id=&quot;17-0&quot;&gt;편집:&lt;/strong&gt; The&lt;/font&gt;&lt;/font&gt;&lt;code&gt;setItem&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;a href=&quot;https://www.w3.org/TR/2011/WD-webstorage-20110901/&quot; rel=&quot;noreferrer&quot; papago-id=&quot;18-1&quot;&gt;2011년 9월 1일 초안&lt;/a&gt;에서 기존 구현의 동작과 일치하도록 허용 문자열로 되돌아갔습니다. 공급업체 중 아무도 문자열이 아닌 저장을 지원하는 데 관심이 없기 때문입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;자세한 내용은 https://www.w3.org/Bugs/Public/show_bug.cgi?id=12111 을 참조하십시오.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;26&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;내 솔루션:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;function tytPreGetBool(pre) {
    return localStorage.getItem(pre) === 'true';
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;27&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;객체 내부에 일반 부울 값을 랩핑한 다음 사용하는 것이 좀 더 쉬울 수 있음을 지적하고 싶습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;JSON.stringify&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;JSON.parse&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;pre&gt;&lt;code&gt;let storeMe = {
  myBool: true
}

localStorage.setItem('test', JSON.stringify(storeMe))
let result = JSON.parse(localStorage.getItem('test'))

&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;이것은 CMS의 답변과 관련이 있습니다.&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;pre&gt;&lt;code&gt;function parse(type) {
   return typeof type == 'string' ? JSON.parse(type) : type;
}
&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/marcuswestin/store.js/#user-content-api&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;32-1&quot;&gt;store.js&lt;/a&gt; 사용:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;localStorage.setItem('isUser', true)
localStorage.getItem('isUser') === &quot;true&quot; //true
npm i -D store
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;33&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;↓&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;store.get('isUser')  //true
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;22&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;제가 주로 하는 일은 LocalStore에 값을 부울(Boolean)로 저장한 다음 파싱(parsing) 방법으로 검색하여 모든 브라우저에 대해 확인하는 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;아래의 제 방법은 제 비즈니스 논리에 맞게 맞춤화 되어 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;때때로 저는 smth를 '아니오'로 저장할 수도 있지만 여전히 필요합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;false&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;/p&gt; 
&lt;pre&gt;&lt;code&gt;function toBoolean(str) {
    if (typeof str === 'undefined' || str === null) {
        return false;
    } else if (typeof str === 'string') {           
        switch (str.toLowerCase()) {
        case 'false':
        case 'no':
        case '0':
        case &quot;&quot;:
            return false;
        default:
            return true;
        }
    } else if (typeof str === 'number') {
        return str !== 0
    }
    else {return true;}
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;24&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;LocalStorage가 부울 값을 저장할 수 있는지는 모르겠지만, 당신이 저장할 때 알려줄 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;alert(&quot;true&quot; == true);&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;25&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;문자열을 부울과 암시적으로 비교하기 때문에 결코 true로 평가되지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;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;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;&quot;true&quot;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;27&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;code&gt;eval&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;40&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또한 경우에 따라 &lt;strong papago-id=&quot;40-1&quot;&gt;신중&lt;/strong&gt;하게 사용할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;console.log(eval(&quot;true&quot;) === true) //true
&lt;/code&gt;&lt;/pre&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;strong papago-id=&quot;41-1&quot;&gt;플래그&lt;/strong&gt;를 저장해야 할 때 주로 다음 작업을 수행합니다.&lt;/font&gt;&lt;/font&gt;&lt;br&gt; &lt;code&gt;localStorage.f_active = true&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;(stored 값은 'true'이며 괜찮습니다)&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;br&gt; &lt;code&gt;if localStorage.f_active&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;31&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;— 패스들&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/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 class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;플래그를 해제하는 방법&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;br&gt; &lt;code&gt;delete localStorage.f_active&lt;/code&gt;&lt;br&gt; &lt;code&gt;if localStorage.f_active&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;— 전달되지 않음(returned 값이 정의되지 않음)&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;URL : https://stackoverflow.com/questions/3263161/cannot-set-boolean-values-in-localstorage&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>JavaScript</category>
      <author>lovejava</author>
      <guid isPermaLink="true">https://lovejava.tistory.com/736</guid>
      <comments>https://lovejava.tistory.com/736#entry736comment</comments>
      <pubDate>Tue, 31 Oct 2023 20:13:02 +0900</pubDate>
    </item>
    <item>
      <title>ID에 대괄호가 포함된 경우 ID로 DOM 요소를 찾으십니까?</title>
      <link>https://lovejava.tistory.com/735</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;ID에 대괄호가 포함된 경우 ID로 DOM 요소를 찾으십니까?&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;다음과 유사한 ID를 가진 DOM 요소가 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;something[500]
&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;Ruby on Rails 애플리케이션에 의해 만들어진 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 이 요소를 jQuery를 통해 가져올 수 있어야 DOM의 상위를 이동하여 미리 접근할 수 없는 변수 ID를 가진 상위 ID를 삭제할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;내가 어떻게 이 일을 할 수 있는지 아는 사람?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음 코드가 작동하지 않는 것 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;alert($(&quot;#something[&quot;+id+&quot;]&quot;).parent().parent().attr(&quot;id&quot;));
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;추가 검사 후 다음 사항을 확인합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$(&quot;#something[&quot;+id+&quot;]&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;개체를 반환하지만 개체에서 &quot;.html()&quot; 또는 &quot;.text()&quot;를 실행하면 결과가 항상 null이거나 빈 문자열일 뿐입니다.&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;pre&gt;&lt;code&gt;alert($(&quot;#something\\[&quot;+id+&quot;\\]&quot;).parent().parent().attr(&quot;id&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;a href=&quot;http://docs.jquery.com/Selectors&quot; papago-id=&quot;7-0&quot; rel=&quot;noreferrer&quot;&gt;선택기의 특수 문자&lt;/a&gt;, 구체적으로 두 번째 단락을 &lt;a href=&quot;http://docs.jquery.com/Selectors&quot; papago-id=&quot;7-0&quot; rel=&quot;noreferrer&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;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;메타 문자(예:&lt;/font&gt;&lt;/font&gt;&lt;code&gt;!&quot;#$%&amp;amp;'()*+,./:;&amp;lt;=&amp;gt;?@[\]^``{|}~&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이름의 문자 그대로 부분으로, 두 개의 백슬래시를 사용하여 탈출해야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;\\&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;10&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;. 예를 들어, 다음과 같은 요소가 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;id=&quot;foo.bar&quot;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;, 셀렉터를 사용할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;$(&quot;#foo\\.bar&quot;)&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;. W3C CSS 규격에는 &lt;a href=&quot;https://www.w3.org/TR/CSS21/syndata.html#value-def-identifier&quot; rel=&quot;noreferrer&quot; papago-id=&quot;4-1&quot;&gt;유효한 CSS 셀렉터에 대한 전체 규칙 세트&lt;/a&gt;가 포함되어 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;식별자에 대한 CSS 문자 탈출 &lt;a href=&quot;https://mathiasbynens.be/notes/css-escapes&quot; papago-id=&quot;4-3&quot; rel=&quot;noreferrer&quot;&gt;시퀀스에 대한&lt;/a&gt; Mathias Bynens의 블로그 엔트리도 &lt;a href=&quot;https://mathiasbynens.be/notes/css-escapes&quot; papago-id=&quot;4-3&quot; rel=&quot;noreferrer&quot;&gt;유용&lt;/a&gt;합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt;&lt;p papago-id=&quot;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;$('[id=&quot;something['+id+']&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;ID는 대괄호를 포함할 수 &lt;strong papago-id=&quot;14-1&quot;&gt;없습니다&lt;/strong&gt;.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://www.w3.org/TR/html4/types.html#type-name&quot; rel=&quot;noreferrer&quot; papago-id=&quot;14-3&quot;&gt;사양상 금지&lt;/a&gt;되어 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;일부 브라우저는 오류를 수정하고 대처할 수 있지만 잘못된 데이터를 처리하기 보다는 데이터를 수정해야 합니다.&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;a href=&quot;http://docs.jquery.com/Selectors&quot; rel=&quot;noreferrer&quot; papago-id=&quot;16-1&quot;&gt;jQuery selector&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;$( &quot;#something\\[&quot; + id + &quot;\\]&quot; )
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;시도해 보기:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;alert($(&quot;#something\\[&quot;+id+&quot;\\]&quot;).parent()[0].parent()[0].attr(&quot;id&quot;));
&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;\\&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;$(document.getElementById(&quot;something[&quot; + id + &quot;]&quot;))
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;21&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&quot;메타 캐릭터라면&quot;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;!&quot;#$%&amp;amp;'()*+,./:;&amp;lt;=&amp;gt;?@[\]^`{|}~
&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;\\&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;23&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;24&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를 들어 ID가 = &quot;foo.bar &quot;인 요소는 선택기를 사용할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$(&quot;#foo\\.bar&quot;)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;25&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&quot; [source: &lt;a href=&quot;http://api.jquery.com/category/selectors/&quot; rel=&quot;nofollow&quot; papago-id=&quot;25-1&quot;&gt;jquery doc&lt;/a&gt;] 및 id= &quot;foo[bar]&quot;(W3C에는 유효하지 않지만 JQuery에서 인식됨) 요소는 선택기를 사용할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$(&quot;#foo\\[bar\\]&quot;)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;26&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(다른 많은 사람들처럼 그저 답일 뿐, 다같이 :)&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;27&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/1239095/find-dom-element-by-id-when-id-contains-square-brackets&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>jQuery</category>
      <author>lovejava</author>
      <guid isPermaLink="true">https://lovejava.tistory.com/735</guid>
      <comments>https://lovejava.tistory.com/735#entry735comment</comments>
      <pubDate>Thu, 26 Oct 2023 20:28:09 +0900</pubDate>
    </item>
    <item>
      <title>응용프로그램별 링커 스크립트에 정의된 접근 기호</title>
      <link>https://lovejava.tistory.com/734</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;응용프로그램별 링커 스크립트에 정의된 접근 기호&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;define symbol _region_RAM_start__     = 0xC0000000;
define symbol _region_RAM_end__       = 0xC00fffff; 
&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;export symbol _region_RAM_start__;
export symbol _region_RAM_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;pre&gt;&lt;code&gt;extern const unsigned int _region_RAM_start__;
extern const unsigned int _region_RAM_end__;
....
int GetRAMSize()
{
    int size = 0;
    unsigned int address_1 = _region_RAM_start__;
    unsigned int address_2 = _region_RAM_end__;
    size = address_2 - address_1 + 1U;
    return size;
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;0&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;지금은 반품 값이 0x00100000이라고 예상했는데 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;_region_RAM_start__&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;_region_RAM_end__&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; 및 의 값을,각 0xC0000000및 0xC00ffff만,&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;address_1&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;address_2&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;값이 0입니다.&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;컴파일러 최적화는 &quot;없음&quot;으로 설정됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것 때문에 한동안 신경이 쓰였습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;제가 여기서 놓치고 있는 것이 분명한가요&lt;em papago-id=&quot;9-1&quot;&gt;? &quot;애초에 이런 일을 해서&lt;/em&gt;는 안 된다&quot;는 것 &lt;em papago-id=&quot;9-1&quot;&gt;말고요?&lt;/em&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;해결책&lt;/strong&gt; 답변을 주신 n.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;  unsigned int address_1 = (unsigned int) (&amp;amp;_region_RAM_start__);
&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;address_1&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;address_2&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;둘 다 가비지 값(즉, 주소 0xC0000000 및 0xC00ffff에서 사용 가능한 값이지만 이 코드의 관점에서는 가비지)을 포함합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그건 좀 오래된 얘기지만 어쨌든 제가 답하겠습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://sourceware.org/binutils/docs/ld/Source-Code-Reference.html&quot; rel=&quot;noreferrer&quot; papago-id=&quot;15-1&quot;&gt;설명서&lt;/a&gt;에서:&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&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;font class=&quot;papago-parent&quot;&gt;예를 들어, 포트란 컴파일러는 일반적으로 밑줄을 붙이거나 붙이며, C++는 광범위한 이름 망글링을 수행합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;따라서 소스 코드에 사용되는 변수의 이름과 링커 스크립트에 정의된 동일한 변수의 이름 사이에 불일치가 있을 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를 들어, Collinker 스크립트 변수는 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
 &lt;pre&gt;&lt;code&gt;extern int foo;
&lt;/code&gt;&lt;/pre&gt; 
 &lt;p papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 링커 스크립트에서는 다음과 같이 정의될 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
 &lt;pre&gt;&lt;code&gt;_foo = 1000;
&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;p papago-id=&quot;20&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;em papago-id=&quot;20-1&quot;&gt;값&lt;/em&gt;을 저장할 수 있는 충분한 공간을 확보한다는 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;두 번째는 컴파일러가 프로그램의 심볼 테이블에 심볼의 &lt;em papago-id=&quot;20-3&quot;&gt;주소&lt;/em&gt;를 저장하는 항목을 생성하는 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;즉, 심볼 테이블은 심볼의 값을 보유하는 메모리 블록의 주소를 포함합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를 들어 파일 범위에서 다음과 같은 C 선언을 합니다.&lt;/font&gt;&lt;/p&gt; 
 &lt;pre&gt;&lt;code&gt;int foo = 1000;
&lt;/code&gt;&lt;/pre&gt; 
 &lt;p papago-id=&quot;21&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;는 기호 테이블에 &quot;foo&quot;라는 항목을 만듭니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 항목은 숫자 1000이 처음 저장된 메모리 블록의 주소를 저장합니다.&lt;/font&gt;&lt;/p&gt; 
 &lt;p papago-id=&quot;22&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;프로그램이 기호를 참조할 때 컴파일러는 먼저 기호 테이블에 액세스하여 기호의 메모리 블록의 주소를 찾은 다음 해당 메모리 블록에서 값을 읽도록 코드화하는 코드를 생성합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그래서:&lt;/font&gt;&lt;/p&gt; 
 &lt;pre&gt;&lt;code&gt;foo = 1;
&lt;/code&gt;&lt;/pre&gt; 
 &lt;p papago-id=&quot;23&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;는 기호 테이블에서 기호 foo를 찾아 이 기호와 연결된 주소를 가져온 다음 값 1을 해당 주소에 씁니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;반면:&lt;/font&gt;&lt;/p&gt; 
 &lt;pre&gt;&lt;code&gt;int * a = &amp;amp; foo;
&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;는 기호 테이블에서 기호 foo를 찾아 주소를 가져온 다음 이 주소를 변수 &quot;a&quot;와 연관된 메모리 블록에 복사합니다.&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;font class=&quot;papago-parent&quot;&gt;예를 들어 링커 스크립트 정의:&lt;/font&gt;&lt;/p&gt; 
 &lt;pre&gt;&lt;code&gt;foo = 1000;
&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;는 메모리 위치 1000의 주소를 보유한 @samp{foo}라는 항목을 기호 테이블에 생성하지만 주소 1000에는 특별한 내용이 저장되지 않습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;즉, 링커 스크립트 정의 기호의 &lt;em papago-id=&quot;26-1&quot;&gt;값&lt;/em&gt;에 액세스할 수 없습니다. 값이 없습니다. 링커 &lt;em papago-id=&quot;26-3&quot;&gt;스크립트&lt;/em&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;예를 들어, 라고 하는 메모리의 섹션의 내용을 복사하고 싶다고 가정합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;ROM은 로 불리는 섹션으로 이동합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;FLASH와 링커 스크립트는 다음과 같은 선언을 포함합니다.&lt;/font&gt;&lt;/p&gt; 
 &lt;pre&gt;&lt;code&gt;start_of_ROM   = .ROM;
end_of_ROM     = .ROM + sizeof (.ROM);
start_of_FLASH = .FLASH;
&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;그러면 복사를 수행하는 C 소스 코드는 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
 &lt;pre&gt;&lt;code&gt;extern char start_of_ROM, end_of_ROM, start_of_FLASH;

memcpy (&amp;amp; start_of_FLASH, &amp;amp; start_of_ROM, &amp;amp; end_of_ROM - &amp;amp; start_of_ROM);
&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;&quot;&amp;amp;&quot; 연산자의 사용에 유의합니다.&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;30&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;액세스하려는 일반 주소 기호이며 반드시 특정 유형을 가리키는 포인터는 아니므로 서명되지 않은 int로 선언하지 않고 다음과 같이 선언합니다.&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;font class=&quot;papago-parent&quot;&gt;RAM_START;&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;&amp;amp;_지역_&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;RAM_START에는 적절한 유형의 'void *'가 있습니다.&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;extern const volatile unsigned int _region_RAM_start__;

extern const volatile unsigned int _region_RAM_end__;

....
int GetRAMSize()

{

int size = 0;

unsigned int address_1 = &amp;amp;_region_RAM_start__;

unsigned int address_2 = &amp;amp;_region_RAM_end__;

size = address_2 - address_1 + 1U;

return size;

}
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;34&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/8398755/access-symbols-defined-in-the-linker-script-by-application&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>C</category>
      <author>lovejava</author>
      <guid isPermaLink="true">https://lovejava.tistory.com/734</guid>
      <comments>https://lovejava.tistory.com/734#entry734comment</comments>
      <pubDate>Thu, 26 Oct 2023 20:28:03 +0900</pubDate>
    </item>
    <item>
      <title>&amp;quot;중복 키 업데이트 시&amp;quot;를 사용할 때 행이 삽입 또는 업데이트되었는지 어떻게 알 수 있습니까?</title>
      <link>https://lovejava.tistory.com/733</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&quot;중복 키 업데이트 시&quot;를 사용할 때 행이 삽입 또는 업데이트되었는지 어떻게 알 수 있습니까?&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;cronjob으로 매일 자정에 업데이트되는 데이터베이스가 있습니다. 외부 XML에서 새로운 데이터를 얻습니다.&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;INSERT INTO table (id, col1, col2, col3)
values (id_value, val1, val2, val3),
(id_value, val1, val2, val3),
(id_value, val1, val2, val3),
(id_value, val1, val2, val3),
ON DUPLICATE KEY UPDATE 
col1 = VALUES (col1), 
col2 = VALUES (col2), 
col3 = VALUES (col3);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;우리가 알고 싶은 것은 실제로 어떤 행이 삽입되었는지, 즉 새로운 항목의 목록을 갖고 싶다는 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;새 삽입물을 반환할 수 있는 쿼리가 있습니까?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;기본적으로 우리는 새로운 삽입 횟수가 아니라 새로운 ID를 모두 얻어야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;감사해요.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;삽입/업데이트 시 결과 세트의 영향을 받는 행 수를 조사하여 이 정보를 얻을 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;MySQL &lt;a href=&quot;http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html&quot; papago-id=&quot;6-1&quot;&gt;문서&lt;/a&gt;에는 다음과 같은 내용이 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;ON DUFFIC KEY UPDATE를 사용하면 행이 새 행으로 삽입되면 행당 영향을 받는 행 값이 1이고 기존 행이 업데이트되면 2가 됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;ROW_COUNT와 LAST_INSERT_를 결합해야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;답변을 얻고 한 행씩 삽입하기 위한 ID입니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;추가하기&lt;/font&gt;&lt;/font&gt;&lt;code&gt;update_count INT NOT NULL DEFAULT 1&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;10&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;열을 열고 쿼리를 변경합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;INSERT
INTO    table (id, col1, col2, col3)
VALUES
(id_value, val1, val2, val3),
(id_value, val1, val2, val3,),
(id_value, val1, val2, val3),
(id_value, val1, val2, val3),
ON DUPLICATE KEY
UPDATE 
        col1 = VALUES (col1), 
        col2 = VALUES (col2), 
        col3 = VALUES (col3),
        update_count = update_count + 1;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;가 증가할 수도 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;BEFORE UPDATE&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;12&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;쿼리를 그대로 유지할 수 있는 trigger입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;13&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;How I did in PHP:&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) 단순 쿼리 SELECT MAX(id)를 선택하고 중복 삽입 전에 테이블에서 $max_id로 기억합니다.&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) 그런 다음 업데이트 프로세스 중에 영향을 받는 행의 ID를 수집합니다(신규 또는 존재하지 않음).&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;$ids[] = mysql_insert_id ();&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) 그러면 $ inserted_rows = max ($ids) -max_id;&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) 업데이트된 행 = 카운트 ($ids_srt) - inserted_rows&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$max_id = mysql_query(&quot;SELECT MAX(id) from table&quot;);
$max_id = mysql_result($max_id, 0);

// !!! prepare here 'insert on duplicate' query in a cycle

$result=mysql_query($query);
$ids[] = mysql_insert_id();

// finish inserting and collecting affected ids and close cycle

$inserted_rows = max($ids)- $max_id;
$updated_rows = count($ids)- $inserted_rows
&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/10709380/how-to-know-if-when-using-on-duplicate-key-update-a-row-was-inserted-or-update&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>MySQL</category>
      <author>lovejava</author>
      <guid isPermaLink="true">https://lovejava.tistory.com/733</guid>
      <comments>https://lovejava.tistory.com/733#entry733comment</comments>
      <pubDate>Thu, 26 Oct 2023 20:27:55 +0900</pubDate>
    </item>
    <item>
      <title>numpy/ctype을 사용하여 C-할당 메모리 버퍼를 노출하는 보다 안전한 방법은?</title>
      <link>https://lovejava.tistory.com/732</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;numpy/ctype을 사용하여 C-할당 메모리 버퍼를 노출하는 보다 안전한 방법은?&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;공유 메모리 버퍼를 사용하여 내부 상태를 저장하는 C 라이브러리의 파이썬 바인딩을 작성합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이러한 버퍼의 할당 및 해제는 라이브러리 자체에서 Python 외부에서 수행되지만, Python 내에서 wraped constructor/destructor 함수를 호출하여 간접적으로 제어할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;일부 버퍼를 Python에 노출시켜서 데이터를 읽을 수 있도록 하고, 경우에 따라서는 값을 Python에 푸시하고 싶습니다.&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;현재 접근 방식은 actype 포인터에 직접 보기를 제공하는 numpy 배열을 만드는 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;import numpy as np
import ctypes as C

libc = C.CDLL('libc.so.6')

class MyWrapper(object):

    def __init__(self, n=10):
        # buffer allocated by external library
        addr = libc.malloc(C.sizeof(C.c_int) * n)
        self._cbuf = (C.c_int * n).from_address(addr)

    def __del__(self):
        # buffer freed by external library
        libc.free(C.addressof(self._cbuf))
        self._cbuf = None

    @property
    def buffer(self):
        return np.ctypeslib.as_array(self._cbuf)
&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;복사를 방지할 뿐만 아니라 numpy의 인덱싱 및 할당 구문을 사용하여 다른 numpy 함수에 직접 전달할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;wrap = MyWrapper()
buf = wrap.buffer       # buf is now a writeable view of a C-allocated buffer

buf[:] = np.arange(10)  # this is pretty cool!
buf[::2] += 10

print(wrap.buffer)
# [10  1 12  3 14  5 16  7 18  9]
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;하지만 이는 본질적으로 위험하기도 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;del wrap                # free the pointer

print(buf)              # this is bad!
# [1852404336 1969367156  538978662  538976288  538976288  538976288
#  1752440867 1763734377 1633820787       8548]

# buf[0] = 99           # uncomment this line if you &amp;lt;3 segfaults
&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;이것을 더 안전하게 하기 위해 배열 내용을 읽기/쓰기하기 전에 기본 C 포인터가 해제되었는지 확인할 수 있어야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 작업을 수행하는 방법에 대해 몇 가지 생각이 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;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;np.ndarray&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;_cbuf&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;MyWrapper&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;None&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;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를 들어, 동일한 버퍼에 여러 뷰를 쉽게 생성할 수 있었습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;.view&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;주조 또는 슬라이싱(slicing)을 수행하므로 이들 각각은 다음에 대한 참조를 상속해야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;_cbuf&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 class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;제가 보기엔 이 문제를 해결하기 위해서는&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;__array_finalize__&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;/li&gt; 
 &lt;li 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;/li&gt; 
&lt;/ul&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;np.ndarray&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;10&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 체크를 수행할 수 있습니까?&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;더 나은 접근법을 제안해 줄 수 있는 사람?&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;hr&gt; 
&lt;p papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;18-0&quot;&gt;업데이트:&lt;/strong&gt; 이 클래스는 내가 원하는 대부분을 수행합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;class SafeBufferView(np.ndarray):

    def __new__(cls, get_buffer, shape=None, dtype=None):
        obj = np.ctypeslib.as_array(get_buffer(), shape).view(cls)
        if dtype is not None:
            obj.dtype = dtype
        obj._get_buffer = get_buffer
        return obj

    def __array_finalize__(self, obj):
        if obj is None: return
        self._get_buffer = getattr(obj, &quot;_get_buffer&quot;, None)

    def __array_prepare__(self, out_arr, context=None):
        if not self._get_buffer(): raise Exception(&quot;Dangling pointer!&quot;)
        return out_arr

    # this seems very heavy-handed - surely there must be a better way?
    def __getattribute__(self, name):
        if name not in [&quot;__new__&quot;, &quot;__array_finalize__&quot;, &quot;__array_prepare__&quot;,
                        &quot;__getattribute__&quot;, &quot;_get_buffer&quot;]:
            if not self._get_buffer(): raise Exception(&quot;Dangling pointer!&quot;)
        return super(np.ndarray, self).__getattribute__(name)
&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;wrap = MyWrapper()
sb = SafeBufferView(lambda: wrap._cbuf)
sb[:] = np.arange(10)

print(repr(sb))
# SafeBufferView([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], dtype=int32)

print(repr(sb[::2]))
# SafeBufferView([0, 2, 4, 6, 8], dtype=int32)

sbv = sb.view(np.double)
print(repr(sbv))
# SafeBufferView([  2.12199579e-314,   6.36598737e-314,   1.06099790e-313,
#          1.48539705e-313,   1.90979621e-313])

# we have to call the destructor method of `wrap` explicitly - `del wrap` won't
# do anything because `sb` and `sbv` both hold references to `wrap`
wrap.__del__()

print(sb)                # Exception: Dangling pointer!
print(sb + 1)            # Exception: Dangling pointer!
print(sbv)               # Exception: Dangling pointer!
print(np.sum(sb))        # Exception: Dangling pointer!
print(sb.dot(sb))        # Exception: Dangling pointer!

print(np.dot(sb, sb))    # oops...
# -70104698

print(np.extract(np.ones(10), sb))
# array([251019024,     32522, 498870232,     32522,         4,         5,
#               6,         7,        48,         0], dtype=int32)

# np.copyto(sb, np.ones(10, np.int32))    # don't try this at home, kids!
&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;hr&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;strong papago-id=&quot;21-0&quot;&gt;업데이트 2:&lt;/strong&gt; 나는 장난을 친 적이 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;weakref.proxy&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;12&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;, &lt;strong papago-id=&quot;12-1&quot;&gt;@ivan_pozdeev&lt;/strong&gt;가 제안한 것처럼.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;좋은 생각이지만 안타깝게도 Numpy 어레이에서 어떻게 작동할지 알 수 없습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;나는 numpy 배열에 대한 weakref를 만들 수 있었습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;.buffer&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;pre&gt;&lt;code&gt;wrap = MyWrapper()
wr = weakref.proxy(wrap.buffer)
print(wr)
# ReferenceError: weakly-referenced object no longer exists
# &amp;lt;weakproxy at 0x7f6fe715efc8 to NoneType at 0x91a870&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;14&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;여기서 문제가 되는 것은&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;np.ndarray&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;wrap.buffer&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&gt;&lt;code&gt;.buffer()&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;weakref.proxy&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;18&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;배열:&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;class MyWrapper2(object):

    def __init__(self, n=10):
        # buffer allocated by external library
        addr = libc.malloc(C.sizeof(C.c_int) * n)
        self._cbuf = (C.c_int * n).from_address(addr)
        self._buffer = np.ctypeslib.as_array(self._cbuf)

    def __del__(self):
        # buffer freed by external library
        libc.free(C.addressof(self._cbuf))
        self._cbuf = None
        self._buffer = None

    @property
    def buffer(self):
        return weakref.proxy(self._buffer)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;29&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 버퍼가 할당된 상태에서 동일한 배열에 두 번째 보기를 만들면 다음과 같이 중단됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;wrap2 = MyWrapper2()
buf = wrap2.buffer
buf[:] = np.arange(10)

buf2 = buf[:]   # create a second view onto the contents of buf

print(repr(buf))
# &amp;lt;weakproxy at 0x7fec3e709b50 to numpy.ndarray at 0x210ac80&amp;gt;
print(repr(buf2))
# array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], dtype=int32)

wrap2.__del__()

print(buf2[:])  # this is bad
# [1291716568    32748 1291716568    32748        0        0        0
#         0       48        0] 

print(buf[:])   # WTF?!
# [34525664        0        0        0        0        0        0        0
#         0        0]  
&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;em papago-id=&quot;19-1&quot;&gt;전화&lt;/em&gt; 후에 심각하게 고장이 났습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;wrap2.__del__()&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;buf2&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;wrap2._cbuf&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;buf&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;wrap2.__del__()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;24&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;놓다&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;wrap2._buffer&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;None&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;26&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;38&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Numpy 배열이 존재하는 동안 래퍼에 대한 참조를 유지해야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이를 달성하는 가장 쉬운 방법은 이 참조를 ctype-buffer의 속성에 저장하는 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;class MyWrapper(object):
    def __init__(self, n=10):
        # buffer allocated by external library
        self.size = n
        self.addr = libc.malloc(C.sizeof(C.c_int) * n)

    def __del__(self):
        # buffer freed by external library
        libc.free(self.addr)

    @property
    def buffer(self):
        buf = (C.c_int * self.size).from_address(self.addr)
        buf._wrapper = self
        return np.ctypeslib.as_array(buf)
&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;이렇게 하면 마지막 참조(예: 마지막 numpy 배열)가 가비지를 수집하면 포장지가 자동으로 해제됩니다.&lt;/font&gt;&lt;/p&gt;&lt;blockquote&gt; 
 &lt;p papago-id=&quot;40&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;파이썬이 아닌 C에서 같은 라이브러리 함수를 호출할 수는 있지만 버퍼를 실제로 할당하고 자유롭게 하는 코드에 대한 접근 권한이 아직 없기 때문에 별 도움이 되지 않을 것입니다.&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;41&quot; papago-translate=&quot;translated&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 class=&quot;papago-parent&quot;&gt;그러면 파이썬 API에서 메모리 읽기/쓰기를 무료로 수행할 수 없습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;hr&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;42&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;#include &amp;lt;python3.3/Python.h&amp;gt;

// Hardcoded values
// N.B. Most of these are only needed for defining the view in the Python
// buffer protocol
static long external_buffer_size = 32;          // Size of buffer in bytes
static long external_buffer_shape[] = { 32 };   // Number of items for each dimension
static long external_buffer_strides[] = { 1 };  // Size of item for each dimension

//----------------------------------------------------------------------------
// Code to simulate the third-party library
//----------------------------------------------------------------------------

// Allocate a new buffer
static void* external_buffer_allocate()
{
    // Allocate the memory
    void* ptr = malloc(external_buffer_size);

    // Debug
    printf(&quot;external_buffer_allocate() = 0x%lx\n&quot;, (long) ptr);

    // Fill buffer with a recognizable pattern
    int i;
    for (i = 0; i &amp;lt; external_buffer_size; ++i)
    {
        *((char*) ptr + i) = i;
    }

    // Done
    return ptr;
}

// Free an existing buffer
static void external_buffer_free(void* ptr)
{
    // Debug
    printf(&quot;external_buffer_free(0x%lx)\n&quot;, (long) ptr);

    // Release the memory
    free(ptr);
}


//----------------------------------------------------------------------------
// Define a new Python instance object for the external buffer
// See: https://docs.python.org/3/extending/newtypes.html
//----------------------------------------------------------------------------

typedef struct
{
    // Python macro to include standard members, like reference count
    PyObject_HEAD

    // Base address of allocated memory
    void* ptr;
} BufferObject;


//----------------------------------------------------------------------------
// Define the instance methods for the new object
//----------------------------------------------------------------------------

// Called when there are no more references to the object
static void BufferObject_dealloc(BufferObject* self)
{
    external_buffer_free(self-&amp;gt;ptr);
}

// Called when we want a new view of the buffer, using the buffer protocol
// See: https://docs.python.org/3/c-api/buffer.html
static int BufferObject_getbuffer(BufferObject *self, Py_buffer *view, int flags)
{
    // Set the view info
    view-&amp;gt;obj = (PyObject*) self;
    view-&amp;gt;buf = self-&amp;gt;ptr;                      // Base pointer
    view-&amp;gt;len = external_buffer_size;           // Length
    view-&amp;gt;readonly = 0;
    view-&amp;gt;itemsize = 1;
    view-&amp;gt;format = &quot;B&quot;;                         // unsigned byte
    view-&amp;gt;ndim = 1;
    view-&amp;gt;shape = external_buffer_shape;
    view-&amp;gt;strides = external_buffer_strides;
    view-&amp;gt;suboffsets = NULL;
    view-&amp;gt;internal = NULL;

    // We need to increase the reference count of our buffer object here, but
    // Python will automatically decrease it when the view goes out of scope
    Py_INCREF(self);

    // Done
    return 0;
}

//----------------------------------------------------------------------------
// Define the struct required to implement the buffer protocol
//----------------------------------------------------------------------------

static PyBufferProcs BufferObject_as_buffer =
{
    // Create new view
    (getbufferproc) BufferObject_getbuffer,

    // Release an existing view
    (releasebufferproc) 0,
};


//----------------------------------------------------------------------------
// Define a new Python type object for the external buffer
//----------------------------------------------------------------------------

static PyTypeObject BufferType =
{
    PyVarObject_HEAD_INIT(NULL, 0)
    &quot;external buffer&quot;,                  /* tp_name */
    sizeof(BufferObject),               /* tp_basicsize */
    0,                                  /* tp_itemsize */
    (destructor) BufferObject_dealloc,  /* tp_dealloc */
    0,                                  /* tp_print */
    0,                                  /* tp_getattr */
    0,                                  /* tp_setattr */
    0,                                  /* tp_reserved */
    0,                                  /* tp_repr */
    0,                                  /* tp_as_number */
    0,                                  /* tp_as_sequence */
    0,                                  /* tp_as_mapping */
    0,                                  /* tp_hash  */
    0,                                  /* tp_call */
    0,                                  /* tp_str */
    0,                                  /* tp_getattro */
    0,                                  /* tp_setattro */
    &amp;amp;BufferObject_as_buffer,            /* tp_as_buffer */
    Py_TPFLAGS_DEFAULT,                 /* tp_flags */
    &quot;External buffer&quot;,                  /* tp_doc */
    0,                                  /* tp_traverse */
    0,                                  /* tp_clear */
    0,                                  /* tp_richcompare */
    0,                                  /* tp_weaklistoffset */
    0,                                  /* tp_iter */
    0,                                  /* tp_iternext */
    0,                                  /* tp_methods */
    0,                                  /* tp_members */
    0,                                  /* tp_getset */
    0,                                  /* tp_base */
    0,                                  /* tp_dict */
    0,                                  /* tp_descr_get */
    0,                                  /* tp_descr_set */
    0,                                  /* tp_dictoffset */
    (initproc) 0,                       /* tp_init */
    0,                                  /* tp_alloc */
    0,                                  /* tp_new */
};


//----------------------------------------------------------------------------
// Define a Python function to put in the module which creates a new buffer
//----------------------------------------------------------------------------

static PyObject* mybuffer_create(PyObject *self, PyObject *args)
{
    BufferObject* buf = (BufferObject*)(&amp;amp;BufferType)-&amp;gt;tp_alloc(&amp;amp;BufferType, 0);
    buf-&amp;gt;ptr = external_buffer_allocate();
    return (PyObject*) buf;
}


//----------------------------------------------------------------------------
// Define the set of all methods which will be exposed in the module
//----------------------------------------------------------------------------

static PyMethodDef mybufferMethods[] =
{
    {&quot;create&quot;, mybuffer_create, METH_VARARGS, &quot;Create a buffer&quot;},
    {NULL, NULL, 0, NULL}        /* Sentinel */
};


//----------------------------------------------------------------------------
// Define the module
//----------------------------------------------------------------------------

static PyModuleDef mybuffermodule = {
    PyModuleDef_HEAD_INIT,
    &quot;mybuffer&quot;,
    &quot;Example module that creates an extension type.&quot;,
    -1,
    mybufferMethods
    //NULL, NULL, NULL, NULL, NULL
};


//----------------------------------------------------------------------------
// Define the module's entry point
//----------------------------------------------------------------------------

PyMODINIT_FUNC PyInit_mybuffer(void)
{
    PyObject* m;

    if (PyType_Ready(&amp;amp;BufferType) &amp;lt; 0)
        return NULL;

    m = PyModule_Create(&amp;amp;mybuffermodule);
    if (m == NULL)
        return NULL;

    return m;
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;hr&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;43&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;test.py&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#!/usr/bin/env python3

import numpy as np
import mybuffer

def test():

    print('Create buffer')
    b = mybuffer.create()

    print('Print buffer')
    print(b)

    print('Create memoryview')
    m = memoryview(b)

    print('Print memoryview shape')
    print(m.shape)

    print('Print memoryview format')
    print(m.format)

    print('Create numpy array')
    a = np.asarray(b)

    print('Print numpy array')
    print(repr(a))

    print('Change every other byte in numpy')
    a[::2] += 10

    print('Print numpy array')
    print(repr(a))

    print('Change first byte in memory view')
    m[0] = 42

    print('Print numpy array')
    print(repr(a))

    print('Delete buffer')
    del b

    print('Delete memoryview')
    del m

    print('Delete numpy array - this is the last ref, so should free memory')
    del a

    print('Memory should be free before this line')

if __name__ == '__main__':
    test()
&lt;/code&gt;&lt;/pre&gt; 
&lt;hr&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;44&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;예&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$ gcc -fPIC -shared -o mybuffer.so mybuffer.c -lpython3.3m
$ ./test.py
Create buffer
external_buffer_allocate() = 0x290fae0
Print buffer
&amp;lt;external buffer object at 0x7f7231a2cc60&amp;gt;
Create memoryview
Print memoryview shape
(32,)
Print memoryview format
B
Create numpy array
Print numpy array
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,
       17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31], dtype=uint8)
Change every other byte in numpy
Print numpy array
array([10,  1, 12,  3, 14,  5, 16,  7, 18,  9, 20, 11, 22, 13, 24, 15, 26,
       17, 28, 19, 30, 21, 32, 23, 34, 25, 36, 27, 38, 29, 40, 31], dtype=uint8)
Change first byte in memory view
Print numpy array
array([42,  1, 12,  3, 14,  5, 16,  7, 18,  9, 20, 11, 22, 13, 24, 15, 26,
       17, 28, 19, 30, 21, 32, 23, 34, 25, 36, 27, 38, 29, 40, 31], dtype=uint8)
Delete buffer
Delete memoryview
Delete numpy array - this is the last ref, so should free memory
external_buffer_free(0x290fae0)
Memory should be free before this line
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;27&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;@Vikas의 접근법이 마음에 들었는데 시도해보니 싱글의 Numpy object-array만 나옵니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;FreeOnDel&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 class=&quot;papago-parent&quot;&gt;&lt;/font&gt; 효과가 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음은 훨씬 단순하고 효과적입니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;class FreeOnDel(object):
    def __init__(self, data, shape, dtype, readonly=False):
        self.__array_interface__ = {&quot;version&quot;: 3,
                                    &quot;typestr&quot;: numpy.dtype(dtype).str,
                                    &quot;data&quot;: (data, readonly),
                                    &quot;shape&quot;: shape}
    def __del__(self):
        data = self.__array_interface__[&quot;data&quot;][0]      # integer ptr
        print(&quot;do what you want with the data at {}&quot;.format(data))

view = numpy.array(FreeOnDel(ptr, shape, dtype), copy=False)
&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 class=&quot;papago-parent&quot;&gt;어디에&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ptr&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;ctypesptr.addressof(...)&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;31&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;).&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/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;이 속성은 Numpy에게 메모리 영역을 배열로 캐스트하는 방법을 알려주기에 충분합니다. 그리고 나서&lt;/font&gt;&lt;/font&gt;&lt;code&gt;FreeOnDel&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;33&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;개체가 해당 배열의 개체가 됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;배열이 삭제되면 삭제가 에 전파됩니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;FreeOnDel&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;34&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;object, 호출할 수 있는 곳&lt;/font&gt;&lt;/font&gt;&lt;code&gt;libc.free&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;35&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/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&gt;&lt;/font&gt;&lt;code&gt;FreeOnDel&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;37&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;클래스&quot;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;BufferOwner&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;38&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&quot;, 그것이 바로 소유권을 추적하는 역할이기 때문입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;code&gt;weakref&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;39&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;는 제안하는 기능에 대해 내장된 메커니즘입니다.&lt;/font&gt;&lt;font 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;weakref.ReferenceError&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;40&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;. 당신은 필요도 없습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;numpy&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&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;In [2]: buffer=(c.c_int*100)()   #acts as an example for an externally allocated buffer
In [3]: voidp=c.addressof(buffer)

In [10]: a=(c.c_int*100).from_address(voidp) # python object accessing the buffer.
                 # Here it's created from raw address value. It's better to use function
                 # prototypes instead for some type safety.
In [14]: ra=weakref.proxy(a)

In [15]: a[1]=1
In [16]: ra[1]
Out[16]: 1

In [17]: del a
In [18]: ra[1]
ReferenceError: weakly-referenced object no longer exists

In [20]: buffer[1]
Out[20]: 1
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;42&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&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 버퍼를 통해 일반 Python 객체가 필요합니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;외부 라이브러리가 메모리를 소유하고 있는 경우 C 레벨에서 버퍼를 해제하기 전에 개체를 삭제해야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;만약 당신이 스스로 메모리를 소유하고 있다면, 당신은 그냥 당신이 만든 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ctypes&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;43&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;정상적인 방법으로 객체를 만들고, 그러면 삭제되면 자유로워집니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;62&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;따라서 외부 라이브러리가 메모리를 소유하고 있고 언제든지 사용할 수 있는 경우(사용자의 사양이 이에 대해 모호함), 어떻게든 사용자에게 해당 메모리가 곧 사용될 것임을 알려주어야 합니다. 그렇지 않으면 필요한 작업을 수행하기 위해 해당 메모리에 대해 알 수 없습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;44&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그냥 포장지에 추가가 있으면 됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;__del__&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;45&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;에 전달하기 전에 기능합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;numpy.ctypeslib.as_array&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;방법.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;class FreeOnDel(object):
    def __init__(self, ctypes_ptr):
        # This is not needed if you are dealing with ctypes.POINTER() objects
        # Start of hack for ctypes ARRAY type;
        if not hasattr(ctypes_ptr, 'contents'):
            # For static ctypes arrays, the length and type are stored
            # in the type() rather than object. numpy queries these 
            # properties to find out the shape and type, hence needs to be 
            # copied. I wish type() properties could be automated by 
            # __getattr__ too
            type(self)._length_ = type(ctypes_ptr)._length_
            type(self)._type_ = type(ctypes_ptr)._type_
        # End of hack for ctypes ARRAY type;

        # cannot call self._ctypes_ptr = ctypes_ptr because of recursion
        super(FreeOnDel, self).__setattr__('_ctypes_ptr', ctypes_ptr)

    # numpy.ctypeslib.as_array function sets the __array_interface__
    # on type(ctypes_ptr) which is not called by __getattr__ wrapper
    # Hence this additional wrapper.
    @property
    def __array_interface__(self):
        return self._ctypes_ptr.__array_interface__

    @__array_interface__.setter
    def __array_interface__(self, value):
        self._ctypes_ptr.__array_interface__ = value

    # This is the onlly additional function we need rest all is overhead
    def __del__(self):
        addr = ctypes.addressof(self._ctypes_ptr)
        print(&quot;freeing address %x&quot; % addr)
        libc.free(addr)
        # Need to be called on all object members
        # object.__del__(self) does not work
        del self._ctypes_ptr

    def __getattr__(self, attr):
        return getattr(self._ctypes_ptr, attr)

    def __setattr__(self, attr, val):
        setattr(self._ctypes_ptr, attr, val)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;66&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;테스트하기&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;In [32]: import ctypes as C

In [33]: n = 10

In [34]: libc = C.CDLL(&quot;libc.so.6&quot;)

In [35]: addr = libc.malloc(C.sizeof(C.c_int) * n)

In [36]: cbuf = (C.c_int * n).from_address(addr)

In [37]: wrap = FreeOnDel(cbuf)

In [38]: sb = np.ctypeslib.as_array(wrap, (10,))

In [39]: sb[:] = np.arange(10)

In [40]: print(repr(sb))
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], dtype=int32)

In [41]: print(repr(sb[::2]))
array([0, 2, 4, 6, 8], dtype=int32)

In [42]: sbv = sb.view(np.double)

In [43]: print(repr(sbv))
array([  2.12199579e-314,   6.36598737e-314,   1.06099790e-313,
         1.48539705e-313,   1.90979621e-313])

In [45]: buf2 = sb[:8]

In [46]: sb[::2] += 10

In [47]: del cbuf   # Memory not freed because this does not have __del__

In [48]: del wrap   # Memory not freed because sb, sbv, buf2 have references

In [49]: del sb     # Memory not freed because sbv, buf have references

In [50]: del buf2   # Memory not freed because sbv has reference

In [51]: del sbv    # Memory freed because no more references
freeing address 2bc6bc0
&lt;/code&gt;&lt;/pre&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;사실 더 쉬운 솔루션은 덮어쓰기입니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;__del__&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;/p&gt; 
&lt;pre&gt;&lt;code&gt;In [7]: olddel = getattr(cbuf, '__del__', lambda: 0)

In [8]: cbuf.__del__ = lambda self : libc.free(C.addressof(self)), olddel

In [10]: import numpy as np

In [12]: sb = np.ctypeslib.as_array(cbuf, (10,))

In [13]: sb[:] = np.arange(10)

In [14]: print(repr(sb))
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], dtype=int32)

In [15]: print(repr(sb))
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], dtype=int32)

In [16]: print(repr(sb[::2]))
array([0, 2, 4, 6, 8], dtype=int32)

In [17]: sbv = sb.view(np.double)

In [18]: print(repr(sbv))
array([  2.12199579e-314,   6.36598737e-314,   1.06099790e-313,
         1.48539705e-313,   1.90979621e-313])

In [19]: buf2 = sb[:8]

In [20]: sb[::2] += 10

In [22]: del cbuf   # Memory not freed

In [23]: del sb     # Memory not freed because sbv, buf have references

In [24]: del buf2   # Memory not freed because sbv has reference

In [25]: del sbv    # Memory freed because no more references
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;49&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Python에서 C 버퍼의 수명을 완전히 제어할 수 있다면 기본적으로 가지고 있는 것은 Python &quot;buffer&quot; 개체입니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ndarray&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 class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용해야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;71&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;따라서,&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;51&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&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;ul&gt; 
   &lt;li papago-id=&quot;72&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;버퍼 -&amp;gt; ndarray&lt;/font&gt;&lt;/li&gt; 
   &lt;li papago-id=&quot;73&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;ndarray -&amp;gt; 버퍼&lt;/font&gt;&lt;/li&gt; 
  &lt;/ul&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;75&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;버퍼 자체를 어떻게 구현할 것인지에 대해서도 의문이 있습니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2 papago-id=&quot;76&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;버퍼 -&amp;gt; ndarray&lt;/font&gt;&lt;/h2&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;52&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;안전하지 않음: 자동적으로 참조를 유지하는 것이 없습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;buffer&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;ndarray&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;code&gt;buffer&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;55&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;h2 papago-id=&quot;81&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;ndarray -&amp;gt; 버퍼&lt;/font&gt;&lt;/h2&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;56&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&quot;이제 말을 하는군요!&quot;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;바로 눈앞에 있는 일이 &quot;완충을 하는 것&quot;이기 때문에&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ndarray&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;57&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용해야 합니까?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font 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;58&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; .&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;numpy&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;메커니즘이 내장되어 있습니다: any&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ndarray&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;base&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;속성(후자가 쓰레기를 수집하는 것을 방지하는 thus).&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;보기의 경우, 속성은 자동으로 그에 따라 할당됩니다(만약 다음과 같은 경우에는 상위 개체에 할당됨).&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;base&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;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;None&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;63&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또는 부모님께&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;base&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;/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;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;65&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그래서, 만약 우리가 어떤 맞춤형 물체를 만들 수 있다면,&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;numpy.array&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;66&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;메모리 재사용 가능 여부를 승인하고 고려합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;numpy.ctypeslib.as_array&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;67&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;실제로는 의 포장지입니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;numpy.array(copy=False)&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;68&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font 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;96&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&amp;lt;...&amp;gt;&lt;/font&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;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/37988849/safer-way-to-expose-a-c-allocated-memory-buffer-using-numpy-ctypes&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>C</category>
      <author>lovejava</author>
      <guid isPermaLink="true">https://lovejava.tistory.com/732</guid>
      <comments>https://lovejava.tistory.com/732#entry732comment</comments>
      <pubDate>Thu, 26 Oct 2023 20:27:48 +0900</pubDate>
    </item>
    <item>
      <title>워드프레스:next_post_link() / previor_post_link() 매개변수에 if-else 문을 삽입하시겠습니까?</title>
      <link>https://lovejava.tistory.com/731</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;워드프레스:&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;next_post_link() / previor_post_link() 매개변수에 if-else 문을 삽입하시겠습니까?&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;em papago-id=&quot;2-1&quot;&gt;기껏해야&lt;/em&gt; PHP 해킹자이고&lt;em papago-id=&quot;2-1&quot;&gt;,&lt;/em&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;php's page).&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;pre&gt;&lt;code&gt;&amp;lt;?php next_post_link(
    '%link',
    if ( in_category( 'tweet' ) ) {
        get_the_content()
    } else {
        echo '%title'
    };,
    FALSE 
)?&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;/p&gt; 
&lt;p papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;첫 번째 질문은 &lt;strong papago-id=&quot;6-1&quot;&gt;함수의 매개&lt;/strong&gt; 변수 &lt;strong papago-id=&quot;6-1&quot;&gt;내에서 if-else 문을 사용&lt;/strong&gt;할 수 &lt;strong papago-id=&quot;6-1&quot;&gt;있는지&lt;/strong&gt; 여부입니다&lt;strong papago-id=&quot;6-1&quot;&gt;.&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;제가 완전히 잘못된 방식으로 접근하고 있다면, 다시 원점으로 돌아가는 겁니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그럼 다른 제안도 해주시면 감사하겠습니다!&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;나는 다음과 같은 일을 알고 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;next_post_link( '%link', get_the_title(), FALSE );
next_post_link( '%link', '%title', FALSE );
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;좀 더 명확히 하기 위해 링크 자체의 범주에 따라 다음/이전 링크의 출력에 영향을 미치려고 합니다. 링크가 현재 호스트 페이지에 있는 것이 아닙니다.&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;10&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;제가 가지고 있는 문제는 a) &lt;a href=&quot;http://codex.wordpress.org/Function_Reference/next_post_link&quot; papago-id=&quot;10-1&quot; rel=&quot;nofollow&quot;&gt;next_post_link&lt;/a&gt;()와 previor_post_link&lt;a href=&quot;http://codex.wordpress.org/Function_Reference/next_post_link&quot; papago-id=&quot;10-1&quot; rel=&quot;nofollow&quot;&gt;()&lt;/a&gt;가 어떤 카테고리인지 결정하고 b) 표시하는 방법입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Link&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 class=&quot;papago-parent&quot;&gt;화이트 플래그를 던져도 &lt;a href=&quot;http://codex.wordpress.org/Function_Reference/get_adjacent_post&quot; papago-id=&quot;11-1&quot; rel=&quot;nofollow&quot;&gt;get_adjacent_post()&lt;/a&gt; 및 다양한 배열을 사용하여 발견한 예는 이 시점에서 제 머리 위에 있는 것 같습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;누군가가 이를 이용한 해결책을 알려주면 정말 고맙겠습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;h3 papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;무엇을 목표로 할 것인가요?&lt;/font&gt;&lt;/h3&gt; 
&lt;p papago-id=&quot;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;/p&gt; 
&lt;p papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;달성하고자 하는 것을 공식화하기 시작합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;제가 당신을 제대로 이해한다면 당신은 현재 게시물 아래에 카테고리에 따라 다음 링크와 이전 링크를 다르게 표시하고 싶다고 적습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그런데 어떤 카테고리?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;em papago-id=&quot;15-1&quot;&gt;현재&lt;/em&gt; 표시되는 &lt;em papago-id=&quot;15-1&quot;&gt;게시물&lt;/em&gt; 중 하나?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;아니면 &lt;em papago-id=&quot;15-3&quot;&gt;이전/다음 링크된 게시물&lt;/em&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;em papago-id=&quot;16-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;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고 마지막으로:&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;비주얼 스타일링을 위해 수많은 &lt;em papago-id=&quot;17-1&quot;&gt;HTML 태그&lt;/em&gt;를 출력하고 싶으십니까?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;아니면 &lt;em papago-id=&quot;17-3&quot;&gt;CSS&lt;/em&gt;를 사용하길 원하십니까?&lt;/font&gt;&lt;/p&gt; 
&lt;h3 papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;어떻게 하죠?&lt;/font&gt;&lt;/h3&gt; 
&lt;p papago-id=&quot;19&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;여러분이 정말로 성취하고 싶은 &lt;em papago-id=&quot;19-1&quot;&gt;것&lt;/em&gt;에 대해 생각해 본 후에, 여러분은 이것이 어떻게 &lt;em papago-id=&quot;19-3&quot;&gt;이루어질&lt;/em&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;ul&gt; 
 &lt;li 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;/li&gt; 
 &lt;li papago-id=&quot;22&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;해당 링크의 CSS 클래스를 가져오는 방법을 보여줍니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;23&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이러한 CSS 클래스로 테마의 출력을 확장합니다.&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;/li&gt; 
&lt;/ul&gt; 
&lt;p papago-id=&quot;25&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그래서 이 예시는 당신의 테마의 CSS를 통해 비주얼 스타일링을 위해 링크된 게시물의 카테고리를 다루고 있으며, 이는 바람직한 방법이라고 생각합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;h3 papago-id=&quot;26&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;PHP 코드&lt;/font&gt;&lt;/h3&gt; 
&lt;p papago-id=&quot;27&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;PHP는 상당히 유연하기 때문에 결국 이 작업을 쉽게 수행할 수 있습니다. 하지만 정확히 무엇을 해야 할지 모르는 상태에서 PHP의 이러한 유연성은 문제로 드러날 수 있습니다. 왜냐하면 추적을 느슨하게 한 다음 작동하지 않는 것을 코드화하는 것도 가능하기 때문입니다.&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;/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;%link&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;함께(HTML그()&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&amp;lt;a href=...&amp;gt;Post Title&amp;lt;/a&amp;gt;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;), 그렇다면&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;'This is the next post of my blog: %link; waiting to be read!'&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;매개 변수로 링크 주변에 텍스트를 추가했습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;?php
  $format = 'This is the next post of my blog: %link; waiting to be read!';
  next_post_link($format);
?&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;33&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그 주변에 HTML 태그를 추가로 추가할 수도 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;?php
  $format = '&amp;lt;span style=&quot;font-size:2em&quot;&amp;gt;%link&amp;lt;/span&amp;gt;';
  next_post_link($format);
?&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;34&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;모든 다음 게시물 링크가 표준 글꼴 크기의 두 배가 됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;35&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그래서 이제 이것을 좀 더 쉽게 의미화하기 위해, 카테고리/ies의 CSS 클래스를 추가하는 것이 가장 좋을 것입니다. 그러면 CSS 내에서 디스플레이를 쉽게 변경할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;?php
  $inSameCategory = true; // depends on what you want, can be false as well
  $nextPost = get_adjacent_post($inSameCategory, '', false);
  $cssClasses = get_post_class('next-post-link ', $nextPost);
  $format = sprintf('&amp;lt;span class=&quot;$s&amp;gt;%link&amp;lt;/span&amp;gt;', $cssClasses);
  next_post_link($format);    
?&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음 포스트 링크를 a로 래핑합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&amp;lt;span&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 class=&quot;papago-parent&quot;&gt;링크된 게시물의 모든 CSS 클래스와 a를 포함합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;next-post-link&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;CSS-Selector가 링크를 스타일링하기 위해 이것이 필요한 경우 class.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;CSS의 몇 가지 예시는 다음과 같습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;.next-post-link.category-tweet {font-size: 2em;}
&lt;/code&gt;&lt;/pre&gt; 
&lt;h3 papago-id=&quot;39&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;재사용이 가능하도록 만들기&lt;/font&gt;&lt;/h3&gt; 
&lt;p papago-id=&quot;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;/p&gt; 
&lt;pre&gt;&lt;code&gt;  /**
   * my theme's format string for prev|next_post_link()
   *
   * @param bool $previous (optional) previous (true, default) or next (false) post
   * @param bool $inSameCategory (optional) use same category, default: true
   * @return string
   */
  function my_prev_next_link_format($previous = true, $inSameCategory = true) {
    $postId = get_adjacent_post($inSameCategory, '', $previous);
    $cssClasses = get_post_class('next-post-link ', $nextPost);
    $format = sprintf('&amp;lt;span class=&quot;$s&amp;gt;%link&amp;lt;/span&amp;gt;', $cssClasses);
    return $format;
  }
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;41&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 기능을 테마에 배치합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러면 모든 템플릿에서 사용할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이제 이를 사용하는 것은 매우 쉬워졌습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;?php prev_post_link(my_prev_next_link_format()); ?&amp;gt;
...
&amp;lt;?php next_post_link(my_prev_next_link_format(false)); ?&amp;gt;
&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;이 모든 것을 다 정리했다면 테마의 CSS 내에서 다음 링크와 예방 링크를 쉽게 스타일링 할 수 있습니다.&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;a href=&quot;http://php.net/manual/en/functions.anonymous.php&quot; rel=&quot;nofollow&quot; papago-id=&quot;43-1&quot;&gt;익명 기능&lt;/a&gt;을 사용해 보셨나요?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;함수 내에서 if-else 문을 사용할 수 있는 방식입니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;44&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;시도:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$format_string = in_category('tweet') ? 
'&amp;lt;span style=&quot;color:red;&quot;&amp;gt;%link&amp;lt;/span&amp;gt;' : '%link';

next_post_link($format_string);
&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;두 번째 및 세 번째 매개변수는 선택사항이며 제목과 false로 기본 설정됩니다.&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;/p&gt; 
&lt;p papago-id=&quot;47&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 플러그인은 모르지만..&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;if(in_category('tweet')){
$format_string = '&amp;lt;span style=&quot;color:red;&quot;&amp;gt;%link&amp;lt;/span&amp;gt;';
$link_text = get_the_content();
}else{
$format_string = '%link';
$link_text = '%title';  
}

next_post_link($format_string, $link_text);
&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;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/6395029/wordpress-inserting-if-else-statement-into-next-post-link-previous-post-lin&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>Wordpress</category>
      <author>lovejava</author>
      <guid isPermaLink="true">https://lovejava.tistory.com/731</guid>
      <comments>https://lovejava.tistory.com/731#entry731comment</comments>
      <pubDate>Thu, 26 Oct 2023 20:27:31 +0900</pubDate>
    </item>
    <item>
      <title>window.on before unload and window.on unload가 Firefox, Safari, Opera에서 작동하지 않습니까?</title>
      <link>https://lovejava.tistory.com/730</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;window.on before unload and window.on unload가 Firefox, Safari, Opera에서 작동하지 않습니까?&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;채팅 어플리케이션에서 어플리케이션이 닫히면 사용자에게 확인을 받아야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;0&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그래서 제가.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;window.onbeforeunload&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;window.onunload&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;logout()&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;ol&gt; 
 &lt;li&gt;&lt;p papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;하지만 IE와 Chrome에서 두 기능이 모두 작동합니다. (애플리케이션은 잘 작동합니다.)&lt;/font&gt;&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;code&gt;window.onbeforeunload&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;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;code&gt;window.onunload&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;/li&gt; 
&lt;/ol&gt; 
&lt;p papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;내 자바스크립트 코드는 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-js prettyprint-override&quot;&gt;&lt;code&gt;// Used for confirmation, to closing the window 
window.onbeforeunload = function () {

    return  &quot;Are you sure want to LOGOUT the session ?&quot;;
}; 

// Used to logout the session, when browser window was closed 
window.onunload = function () {

    if((sessionId != null)&amp;amp;&amp;amp;(sessionId!=&quot;null&quot;)&amp;amp;&amp;amp; (sessionId != &quot;&quot;))
        logout();
};
&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;저도 JQuery와 같은 기능을 사용해 보았습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-js prettyprint-override&quot;&gt;&lt;code&gt;&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;

    $(window).on('beforeunload', function() {
        return 'Are you sure want to LOGOUT the session ?';
    });

    $(window).unload(function() {
        if ((sessionId != null) &amp;amp;&amp;amp; (sessionId != &quot;null&quot;) &amp;amp;&amp;amp; (sessionId != &quot;&quot;)) {
            logout();
        }
    });
    
&amp;lt;/script&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;유감스럽게도 사용 중인 방법은 해당 브라우저에서 지원되지 않습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;제 답변(이를 지지하지 않는 행동)을 지지하기 위해 아래 링크를 제공했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;onbeforeunload&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;onunload&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;opera&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;blockquote&gt; 
 &lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/390260/onbeforeunload-in-opera&quot; papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;오페라에서 내려받기 전에.&lt;/font&gt;&lt;/a&gt;&lt;br&gt; &lt;a href=&quot;http://www.zachleat.com/web/dont-let-the-door-hit-you-onunload-and-onbeforeunload/&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;http://www.zachleat.com/web/dont-let-the-door-hit-you-onunload-and-onbeforeunload/&lt;/font&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;/blockquote&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;onunload&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;onunload&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;code&gt;onunload&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;safari&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;blockquote&gt; 
 &lt;p&gt;&lt;a href=&quot;https://www.webkit.org/blog/516/webkit-page-cache-ii-the-unload-event/&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;22&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;https://www.webkit.org/blog/516/webkit-page-cache-ii-the-unload-event/&lt;/font&gt;&lt;/a&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&gt;&lt;/font&gt;&lt;code&gt;pagehide&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;15&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;safari 브라우저에서 이벤트 대신&lt;/font&gt;&lt;/font&gt;&lt;code&gt;onunload&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;16&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;onunload&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;firefox&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;blockquote&gt; 
 &lt;p&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=681636&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;https://bugzilla.mozilla.org/show_bug.cgi?id=681636&lt;/font&gt;&lt;/a&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;그들은 FF에서도 아직 해결책을 제시하지 못하고 있습니다.&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;다음은 firefox 및 chrome을 위한 작동 솔루션입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var myEvent = window.attachEvent || window.addEventListener;
var chkevent = window.attachEvent ? 'onbeforeunload' : 'beforeunload'; /// make IE7, IE8 compitable

            myEvent(chkevent, function(e) { // For &amp;gt;=IE7, Chrome, Firefox
                var confirmationMessage = 'Are you sure to leave the page?';  // a space
                (e || window.event).returnValue = confirmationMessage;
                return confirmationMessage;
            });
&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;저는 jQuery's를 사용하여 IE 및 FF에서 작동할 수 있었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$(window).bind('beforeunload', function(){

});
&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;대신: unload, on unload 또는 on unload 전에&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;19&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;해결책을 찾았습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;onunload&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;20&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Ajax 비동기 요청을 동기 요청으로 변경하여 Opera를 제외한 모든 브라우저에서 사용할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;xmlhttp.open(&quot;POST&quot;,&quot;LogoutAction&quot;,false);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;35&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;35-1&quot;&gt;오페라&lt;/strong&gt;를 제외한 모든 브라우저에서 잘 작동합니다.&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;더 나쁜 것은 언로드 이벤트 전에 on의 반환 값을 확인할 수 없습니다.&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;언로드 전 이벤트에서 로그아웃을 먼저 호출합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용자에게 메시지를 표시합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용자가 로그아웃을 취소하면 Onfocus 이벤트를 사용하여 로그아웃을 자동으로 다시 로그인합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;좀 뒤로 가긴 했지만, 효과가 있을 것 같아요.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;'use strict';

var reconnect = false;

window.onfocus = function () {
  if (reconnect) {
    reconnect = false;
    alert(&quot;Perform an auto-login here!&quot;);
  }
};

window.onbeforeunload = function () {
  //logout();
  var msg = &quot;Are you sure you want to leave?&quot;;
  reconnect = true;
  return msg;
};
&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;Firefox는 메시지를 언로드하기 전에 사용자 지정을 표시하지 않습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;Mozilla는 오해의 소지가 있는 텍스트를 보여줄 수 있는 악의적인 사이트로부터 최종 사용자를 보호하고 있다고 말합니다.&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;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/14645011/window-onbeforeunload-and-window-onunload-is-not-working-in-firefox-safari-ope&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>jQuery</category>
      <author>lovejava</author>
      <guid isPermaLink="true">https://lovejava.tistory.com/730</guid>
      <comments>https://lovejava.tistory.com/730#entry730comment</comments>
      <pubDate>Thu, 26 Oct 2023 20:27:23 +0900</pubDate>
    </item>
    <item>
      <title>각도가 있는 Adobe Edge Animate 사용JS 및 각도UI 라우터</title>
      <link>https://lovejava.tistory.com/729</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;각도가 있는 Adobe Edge Animate 사용&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;JS 및 각도&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;UI 라우터&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;현재 Adobe Edge Angular로 제작된 여러 애니메이션을 하나의 Angular로 통합하는 프로젝트를 진행하고 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;JS application.&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;font class=&quot;papago-parent&quot;&gt;어떤 이유로 Adobe Edge Animate Javascript API에 문제가 발생하여 구성을 로드하지 못합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;기본적으로 저는 작곡을 한 번만 로드할 수 있지만 더 이상은 로드할 수 없습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;컴포지션을 다시 로드하려고 할 때마다 다음과 같은 자바스크립트 오류가 발생합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Uncaught TypeError: Cannot read property 'stage' of undefined    edge.5.0.1.js:4872
Uncaught TypeError: Cannot read property 'stage' of undefined    edge.5.0.1.js:4519
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 현재 다음과 같이 컨트롤러 내에서 직접 구성을 로드하고 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;.controller('GameTest', function($scope, $state) {
    AdobeEdge.loadComposition('edge-animate/GameTest', 'GameTest', {
      scaleToFit: &quot;width&quot;,
      centerStage: &quot;none&quot;,
      minW: &quot;0&quot;,
      maxW: &quot;undefined&quot;,
      width: &quot;2048px&quot;,
      height: &quot;1134px&quot;
    }, {dom: [ ]}, {dom: [ ]});
})
&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;.state('game-test', {
  cache: false,
  url: &quot;/games/test&quot;,
  controller: 'GameTest',
  templateUrl: 'templates/games/test.html'
})
&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&gt;&lt;strong papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;업데이트: 해결책을 찾았습니다!&lt;/font&gt;&lt;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;브라우저에서 해당 *_edge.js의 내용을 다시 처리하면 문제가 해결되는 것 같습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것들이 주입되기 때문에&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언제든지&lt;/font&gt;&lt;/font&gt;&lt;code&gt;AdobeEdge.loadComposition(...)&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(예프노페를 통해)라고 불리며, 예프노페에게 주입된 자바스크립트를 다시 불러오라고 요청하는 방법이 없는 것 같습니다. 표준 대신 이를 처리하기 위해 사용할 수 있는 Angular용 작은 서비스를 작성했습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;AdobeEdge.loadComposition(...)&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;기능.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;기본적으로 사전에 관련 검사를 수행하는 포장지입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;.service('$AdobeEdge', function() {
  var head = document.getElementsByTagName('head')[0],
    scripts = head.getElementsByTagName('script');

  return { 
    loadComposition: function(projectPrefix, compId, opts, preloaderDOM, downLevelStageDOM) {
      // Determine the filename for our project
      var projectFile = projectPrefix + '_edge.js';
      var newScript = null;

      // Iterate through each script tag in the header to search for our file
      angular.forEach(scripts, function(script, index, scripts) {

        // Does the script src tag end with our project filename?
        if (script.src.substr(script.src.length - projectFile.length) == projectFile) {

          // It's already loaded! Let's go about removing it and injecting a fresh script tag...
          script.remove();
          newScript = document.createElement('script');
          newScript.setAttribute('type', 'text/javascript');
          newScript.setAttribute('src', script.src);
          head.insertBefore(newScript, scripts[0]);

          // Let's also delete the composition within the Adobe Edge API so that events
          // like 'compositionReady' are fired again when we call loadComposition()
          delete AdobeEdge.compositions[compId];
        }
      });

      // Ultimately we always need to call loadComposition() no matter what
      AdobeEdge.loadComposition(projectPrefix, compId, opts, preloaderDOM, downLevelStageDOM);
    }
  }
})
&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;이 특별한 경우에는...&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;.controller('GameTest', function($scope, $state, $AdobeEdge) {
  $AdobeEdge.loadComposition('edge-animate/GameTest', 'GameTest', {
    scaleToFit: &quot;width&quot;,
    centerStage: &quot;none&quot;,
    minW: &quot;0&quot;,
    maxW: &quot;undefined&quot;,
    width: &quot;2048px&quot;,
    height: &quot;1134px&quot;
  }, {dom: [ ]}, {dom: [ ]});
});
&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 papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것이 다른 사람의 많은 마음의 고통을 덜어주기를 바랍니다!&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;16&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;16-0&quot;&gt;롭 신튼의 답변&lt;/strong&gt;:&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;브라우저에서 해당 *_edge.js의 내용을 다시 처리하면 문제가 해결되는 것 같습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것들이 주입되기 때문에&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언제든지&lt;/font&gt;&lt;/font&gt;&lt;code&gt;AdobeEdge.loadComposition(...)&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(예프노페를 통해)라고 불리며, 예프노페에게 주입된 자바스크립트를 다시 불러오라고 요청하는 방법이 없는 것 같습니다. 표준 대신 이를 처리하기 위해 사용할 수 있는 Angular용 작은 서비스를 작성했습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;AdobeEdge.loadComposition(...)&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 class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font 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;.service('$AdobeEdge', function() {
  var head = document.getElementsByTagName('head')[0],
    scripts = head.getElementsByTagName('script');

  return { 
    loadComposition: function(projectPrefix, compId, opts, preloaderDOM, downLevelStageDOM) {
      // Determine the filename for our project
      var projectFile = projectPrefix + '_edge.js';
      var newScript = null;

      // Iterate through each script tag in the header to search for our file
      angular.forEach(scripts, function(script, index, scripts) {

        // Does the script src tag end with our project filename?
        if (script.src.substr(script.src.length - projectFile.length) == projectFile) {

          // It's already loaded! Let's go about removing it and injecting a fresh script tag...
          script.remove();
          newScript = document.createElement('script');
          newScript.setAttribute('type', 'text/javascript');
          newScript.setAttribute('src', script.src);
          head.insertBefore(newScript, scripts[0]);

          // Let's also delete the composition within the Adobe Edge API so that events
          // like 'compositionReady' are fired again when we call loadComposition()
          delete AdobeEdge.compositions[compId];
        }
      });

      // Ultimately we always need to call loadComposition() no matter what
      AdobeEdge.loadComposition(projectPrefix, compId, opts, preloaderDOM, downLevelStageDOM);
    }
  }
})
&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;.controller('GameTest', function($scope, $state, $AdobeEdge) {
  $AdobeEdge.loadComposition('edge-animate/GameTest', 'GameTest', {
    scaleToFit: &quot;width&quot;,
    centerStage: &quot;none&quot;,
    minW: &quot;0&quot;,
    maxW: &quot;undefined&quot;,
    width: &quot;2048px&quot;,
    height: &quot;1134px&quot;
  }, {dom: [ ]}, {dom: [ ]});
});
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;22&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;지금까지 잘 작동하고 있습니다!&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;프로젝트의 나머지 게임을 구축하고 문제가 생기면 이를 게시하는 데 사용하겠습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;23&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것이 다른 사람의 많은 마음의 고통을 덜어주기를 바랍니다!&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;24&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/29209565/using-adobe-edge-animate-with-angularjs-and-angularui-router&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>angularJS</category>
      <author>lovejava</author>
      <guid isPermaLink="true">https://lovejava.tistory.com/729</guid>
      <comments>https://lovejava.tistory.com/729#entry729comment</comments>
      <pubDate>Thu, 26 Oct 2023 20:27:16 +0900</pubDate>
    </item>
    <item>
      <title>Oracle: 자동 증분 ID 열을 사용하여 보기 생성</title>
      <link>https://lovejava.tistory.com/728</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Oracle: 자동 증분 ID 열을 사용하여 보기 생성&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;view&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&gt;&lt;code&gt;10 select statements&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;UNION 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;.&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;primary key column&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;XML&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;view&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;primary key column&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;XML&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;건축용 응용.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;10&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;추가할 것이 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;rownum&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 class=&quot;papago-parent&quot;&gt;하지만 중복 ID를 반환했습니다. 왜냐하면.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;rownum&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;12&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;각 선택문에서 1부터 시작합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;13&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그런 다음 시퀀스를 생성하고 사용을 시도했습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;nextval&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;group by&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;order by&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;16&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그렇게 할 방법이 있습니까?&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;19&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;조합에 대해 다음과 같은 선택을 수행할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;SELECT rownum(),*
FROM (SELECT * FROM tableA UNION ALL SELECT * FROM tableB)
&lt;/code&gt;&lt;/pre&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;pre&gt;&lt;code&gt;SELECT rownum, t.*
FROM (SELECT * FROM tableA UNION ALL SELECT * FROM tableB) t
&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/14229056/oracle-create-a-view-with-auto-increment-id-column&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>Oracle</category>
      <author>lovejava</author>
      <guid isPermaLink="true">https://lovejava.tistory.com/728</guid>
      <comments>https://lovejava.tistory.com/728#entry728comment</comments>
      <pubDate>Thu, 26 Oct 2023 20:27:08 +0900</pubDate>
    </item>
    <item>
      <title>날짜가 DateTime보다 크거나 같은 라라벨 웅변</title>
      <link>https://lovejava.tistory.com/727</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;날짜가 DateTime보다 크거나 같은 라라벨 웅변&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;날짜 열 형식은 Y-m-d H:i:s입니다.&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;제가 하려는 것은 앞으로 Y-m-d H:i:s가 있는 모든 줄을 잡으려는 것입니다.&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;예: 날짜를 2017-06-01, 시간을 09:00:00로 가정하고 날짜가 있는 행과 시간이 미래인 행을 모두 받고 싶습니다.&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;public function customerCardFollowups() {
    return $this -&amp;gt; hasMany('App\CustomerCardFollowup', 'user_id') -&amp;gt; whereDate('date', '&amp;gt;', Carbon::now('Europe/Stockholm')) -&amp;gt; orderBy('date', 'asc') -&amp;gt; take(20);
}
&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;font papago-translate=&quot;translated&quot; papago-id=&quot;0&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;당신이 사용할 필요가 있는 것 같네요.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&amp;gt;=&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;, 예를 들어 다음과 같습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;-&amp;gt;whereDate('date', '&amp;gt;=', Carbon::now('Europe/Stockholm'))
&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;-&amp;gt;where('date', '&amp;gt;=', date('Y-m-d'))
&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;whereDate&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;strong papago-id=&quot;11-1&quot;&gt;날짜만 비교하고 시간은 무시&lt;/strong&gt;합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;따라서 솔루션은 최소 하루 후에 데이트하는 레코드를 제공하고 같은 날에 있지만 나중에 제공되는 레코드는 포함되지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용하는 경우&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&amp;gt;=&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다른 답변에서 제시된 바와 같이, 당신은 현재 날짜로부터 시작하는 기록과 결정된 시간 이전의 기록을 얻을 것입니다.&lt;/font&gt;&lt;/font&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;이것을 위한 한가지 해결책은 MySQL 함수를 사용하여 비교하는 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;whereRaw&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;-&amp;gt; whereRaw(&quot;date &amp;gt; STR_TO_DATE(?, '%Y-%m-%d %H:%i:%s')&quot; , Carbon::now('Europe/Stockholm')-&amp;gt;format('Y-m-d H:i'));
&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;코드에서는 원하는 포맷을 사용할 수 있는 특정 포맷에 맞게 Carbon date의 포맷을 변경하여 STR_에 동일한 포맷을 넣었습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;TO_DATE 함수.&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;Laravel의 테스트 케이스:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$this-&amp;gt;assertDatabaseHas('my_table', [
    'name' =&amp;gt; $name,
    [ 'updated_at', '&amp;gt;=', $updatedAt ] // $updatedAt is a Carbon object
]);
&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/44266337/laravel-eloquent-where-date-is-equal-or-greater-than-datetime&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>MySQL</category>
      <author>lovejava</author>
      <guid isPermaLink="true">https://lovejava.tistory.com/727</guid>
      <comments>https://lovejava.tistory.com/727#entry727comment</comments>
      <pubDate>Thu, 26 Oct 2023 20:27:02 +0900</pubDate>
    </item>
    <item>
      <title>Angular 뒤에 코드JS애니메이션이완료되었습니다.</title>
      <link>https://lovejava.tistory.com/726</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Angular 뒤에 코드&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;JS애니메이션이완료되었습니다.&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;ng-show&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;. 저는 또한 이 요소에 ng-애니메이션의 자동 애니메이션인 CSS 애니메이션을 사용하여 그것의 엔트리를 애니메이션화하고 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;요소에는 이미지 또는 비디오가 포함됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;요소에 동영상이 포함되어 있는 경우에는 재생하고 싶지만, 애니메이션이 완료되기 전까지는 동영상을 재생하고 싶지 않습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그렇기 때문에 AngularJS에서 &lt;strong papago-id=&quot;5-1&quot;&gt;CSS&lt;/strong&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;a href=&quot;http://docs.angularjs.org/api/ngAnimate.%24animate&quot; papago-id=&quot;2-1&quot;&gt;문서&lt;/a&gt;는 a를 참조합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;doneCallback&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;, 특정할 방법이 없네요&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;하나의 해결 방법(?)&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;생각해 본 것은&lt;/font&gt;&lt;/font&gt;&lt;code&gt;$watch&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;ing&lt;/font&gt;&lt;/font&gt;&lt;code&gt;element.hasClass(&quot;ng-hide-add-active&quot;)&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;(true, false)&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;, 이제 막 제거됐음을 암시하는..&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;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;@michael-charemza의 답변은 저에게 아주 효과적이었습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;Angular 1.3을 사용하는 경우 약속을 조금 변경했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 잠시 이 일에 매달렸지만, 여기에 그것이 작동하도록 한 변화가 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;if (show) {
  $animate.removeClass(element, 'ng-hide').then(scope.afterShow);
}
if (!show) {
  $animate.addClass(element, 'ng-hide').then(scope.afterHide);
}
&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://plnkr.co/edit/C8OjSs0rplrghLn1KRmd?p=preview&quot; papago-id=&quot;14-1&quot;&gt;코드 예제&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;15&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;@zeroflagL이 제안한 대로 대체할 사용자 지정 지침&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ngShow&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;&amp;amp;&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;ng-hide&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;18&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;class, 이는 일반적인 ngShow 명령에서 사용되는 것과 동일한 메서드입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;app.directive('myShow', function($animate) {
  return {
    scope: {
      'myShow': '=',
      'afterShow': '&amp;amp;',
      'afterHide': '&amp;amp;'
    },
    link: function(scope, element) {
      scope.$watch('myShow', function(show, oldShow) {
        if (show) {
          $animate.removeClass(element, 'ng-hide', scope.afterShow);
        }
        if (!show) {
          $animate.addClass(element, 'ng-hide', scope.afterHide);
        }
      });
    }
  }
})
&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;show&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;&amp;lt;div my-show=&quot;show&quot; after-hide=&quot;afterHide()&quot; after-show=&quot;afterShow()&quot;&amp;gt;...&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;14&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;ng-hide 클래스를 추가/제거하는 것이기 때문에 &lt;a href=&quot;http://docs.angularjs.org/api/ng.directive:ngShow&quot; rel=&quot;noreferrer&quot; papago-id=&quot;14-1&quot;&gt;ngShow에 대한 문서에서 애니메이션&lt;/a&gt;을 만드는 것에 대한 포인트는 여전히 유효하며, 추가해야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;display: block !important&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;22&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;CSS로.&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;a href=&quot;http://plnkr.co/edit/n2nKeoBAKXTH2RdNcV2G?p=preview&quot; rel=&quot;noreferrer&quot; papago-id=&quot;23-1&quot;&gt;이 Plunker에서 실행 중인 예&lt;/a&gt;를 볼 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;24&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;@michal-charemza 솔루션은 잘 작동하지만 명령어는 분리된 범위를 생성하므로 기본 ng-show 명령어를 직접 대체할 수 없는 경우도 있습니다.&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;새로운 스코프가 생성되지 않고 ng-show 명령어와 상호 교환하여 사용할 수 있도록 조금 수정했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-js prettyprint-override&quot;&gt;&lt;code&gt;app.directive('myShow', function($animate) {
  return {
    link: function(scope, element, attrs) {
      scope.$watch(attrs['myShow'], function(show, oldShow) {
        if (show) {
          $animate.removeClass(element, 'ng-hide').then(function(){
            scope.$apply(attrs['myAfterShow']);
          });
        } else {
          $animate.addClass(element, 'ng-hide').then(function(){
            scope.$apply(attrs['myAfterHide']);
          });
        }
      });
    }
  }
})
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;26&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;용도:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;div my-show=&quot;show&quot; my-after-hide=&quot;afterHide()&quot; my-after-show=&quot;afterShow()&quot;&amp;gt;...&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;a href=&quot;http://plnkr.co/edit/fjtWnaLNWgWphaklzzwO?p=preview&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;27&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;28&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/20921622/running-code-after-an-angularjs-animation-has-completed&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>angularJS</category>
      <author>lovejava</author>
      <guid isPermaLink="true">https://lovejava.tistory.com/726</guid>
      <comments>https://lovejava.tistory.com/726#entry726comment</comments>
      <pubDate>Thu, 26 Oct 2023 20:26:56 +0900</pubDate>
    </item>
    <item>
      <title>angularjs - 확장 재귀적</title>
      <link>https://lovejava.tistory.com/725</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;angularjs - 확장 재귀적&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;속성을 재귀적(일명 딥 카피)으로 확장하고 싶습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;jQuery가 하는 것처럼.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 단지 한가지의 b/c만 jquery를 포함하지 않습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;jQuery.extend( true, target, object1 )
&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;간단한 자바스크립트나 angularjs로 할 수 있는 우아한 방법이 있습니까?&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;3-0&quot;&gt;업데이트&lt;/strong&gt;를 보시고 동일한 결과를 얻기 위해 노력해주세요 &lt;strong papago-id=&quot;3-0&quot;&gt;http://plnkr.co/edit/GHabYbyhsqtfBPtplksO?p=preview&lt;/strong&gt; .&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.copy ()를 조사했지만 &quot;(객체의) 속성이 삭제되었습니다.&quot;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;여기 각도를 기반으로 한 extend Deep 함수가 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;기능을 확장시키다&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 내용을 $scope에 추가하면 전화를 걸 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$scope.meta = $scope.extendDeep(ajaxResponse1.myMeta, ajaxResponse2.defaultMeta);
&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;$scope.extendDeep = function extendDeep(dst) {
  angular.forEach(arguments, function(obj) {
    if (obj !== dst) {
      angular.forEach(obj, function(value, key) {
        if (dst[key] &amp;amp;&amp;amp; dst[key].constructor &amp;amp;&amp;amp; dst[key].constructor === Object) {
          extendDeep(dst[key], value);
        } else {
          dst[key] = value;
        }     
      });   
    }
  });
  return dst;
};
&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 class=&quot;papago-parent&quot;&gt;이 부작용에 대한 간단한 해결을 위해 변경할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;dst[key] = 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;code&gt;dst[key] = angular.copy(value)&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;여기 있는 모든 답변은 1&lt;strong papago-id=&quot;10-1&quot;&gt;.4 이전&lt;/strong&gt; 버전의 &lt;strong papago-id=&quot;10-1&quot;&gt;Angular&lt;/strong&gt;에 대해 유효합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Angular 1.4 기준으로 사용 가능합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;angular.merge&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;blockquote&gt; 
 &lt;p papago-id=&quot;13&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;extend()와 달리 &lt;strong papago-id=&quot;13-1&quot;&gt;merge()&lt;/strong&gt;는 소스 개체의 개체 속성으로 재귀적으로 하강하여 &lt;strong papago-id=&quot;13-3&quot;&gt;심층 복사&lt;/strong&gt;를 수행합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;&lt;a href=&quot;https://docs.angularjs.org/api/ng/function/angular.merge&quot; rel=&quot;noreferrer&quot; papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;https://docs.angularjs.org/api/ng/function/angular.merge&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;function deepExtend(destination, source) {
  for (var property in source) {
    if (source[property] &amp;amp;&amp;amp; source[property].constructor &amp;amp;&amp;amp;
     source[property].constructor === Object) {
      destination[property] = destination[property] || {};
      arguments.callee(destination[property], source[property]);
    } else {
      destination[property] = source[property];
    }
  }
  return destination;
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;a href=&quot;http://plnkr.co/edit/9qbHHP4RqtpfqyHjzyqV&quot; rel=&quot;noreferrer&quot; papago-id=&quot;15&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;16&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Src: https://gist.github.com/gregdangelo/2343158&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;var extendDeep = function extendDeep(dst) {
    angular.forEach(arguments, function(obj) {
        if (obj !== dst) {
            angular.forEach(obj, function(value, key) {
                if (dst[key] &amp;amp;&amp;amp; angular.isObject(dst[key])) {
                    extendDeep(dst[key], value);
                } else if(!angular.isFunction(dst[key])) {
                    dst[key] = value;
                }
            });
        }
    });
    return dst;
};
&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;Ryan과 동일한 솔루션이지만 어레이 병합을 지원합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;function extendDeep(dst) {
      angular.forEach(arguments, function (obj) {
          if (obj !== dst) {
            angular.forEach(obj, function (value, key) {
                if (dst[key] &amp;amp;&amp;amp; dst[key].constructor &amp;amp;&amp;amp; dst[key].constructor === Object) {
                  extendDeep(dst[key], value);
                } else if (dst[key] &amp;amp;&amp;amp; dst[key].constructor &amp;amp;&amp;amp; dst[key].constructor === Array) {
                  dst[key].concat(value);
                } else if(!angular.isFunction(dst[key])) {
                  dst[key] = value;
                }
              }
            );
          }
        }
      );
      return dst;
    }
&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;Angular에는 복사 방법이 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;http://docs.angularjs.org/api/angular.copy&quot; rel=&quot;nofollow&quot; papago-id=&quot;20&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;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/15310935/angularjs-extend-recursive&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>angularJS</category>
      <author>lovejava</author>
      <guid isPermaLink="true">https://lovejava.tistory.com/725</guid>
      <comments>https://lovejava.tistory.com/725#entry725comment</comments>
      <pubDate>Thu, 26 Oct 2023 20:26:49 +0900</pubDate>
    </item>
    <item>
      <title>stdout 및 stdin 파일 설명자를 닫은 후 다시 열기</title>
      <link>https://lovejava.tistory.com/724</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;stdout 및 stdin 파일 설명자를 닫은 후 다시 열기&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;인수가 주어지면 stdout을 파일로 리디렉션하거나 파일에서 stdin을 읽어오는 함수를 씁니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이렇게 하려면 stdout 또는 stdin과 관련된 파일 설명자를 닫아서 파일을 열 때 방금 닫았던 설명자 아래에서 열립니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 효과가 있지만 문제는 이것이 완료되면 stdout과 stdin을 실제 상태로 복원해야 한다는 것입니다.&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;stdout에 대해 내가 할 수 있는 일은 열려 있습니다(&quot;/dev/tty&quot;, O_WRONLY). 하지만 왜 이것이 작동하는지 잘 모르겠고, 더 중요한 것은 stdin에 대한 동등한 문에 대해 알지 못합니다.&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;close(1);
if (creat(filePath, O_RDWR) == -1)
{
    exit(1);
}
&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;그리고 fortdin&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;close(0);
if (open(filePath, O_RDONLY) == -1)
{
    exit(1);
}
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;dup() 및 dup2()를 사용하여 파일 설명자를 복제해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;int stdin_copy = dup(0);
int stdout_copy = dup(1);
close(0);
close(1);

int file1 = open(...);
int file2 = open(...);

&amp;lt; do your work. file1 and file2 must be 0 and 1, because open always returns lowest unused fd &amp;gt;

close(file1);
close(file2);
dup2(stdin_copy, 0);
dup2(stdout_copy, 1);
close(stdin_copy);
close(stdout_copy);
&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;blockquote&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;실행 시 근접 플래그(FD_CLOEXEC; fcntl(2))에서 중복 설명자가 꺼져 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 문제가 발생하면 실행 시 근접 플래그를 복원해야 할 수도 있습니다. 경합 조건을 피하기 위해 dup2() 대신 dup3()을 사용할 수도 있습니다.&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;또한 프로그램이 다중 스레드인 경우 다른 스레드가 실수로 재매핑된 stdin/stdout에 기록/판독할 수 있습니다.&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;strong papago-id=&quot;10-1&quot;&gt;전&lt;/strong&gt;에 설명자를 &quot;저장&quot;할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;int save_in, save_out;

save_in = dup(STDIN_FILENO);
save_out = dup(STDOUT_FILENO);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;나중에 사용할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;dup2&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;/* Time passes, STDIN_FILENO isn't what it used to be. */
dup2(save_in, STDIN_FILENO);
&lt;/code&gt;&lt;/pre&gt; 
&lt;hr&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;/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;fork()를 사용한 코드의 예를 찾아보고() 기다립니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;16&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/9084099/re-opening-stdout-and-stdin-file-descriptors-after-closing-them&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>C</category>
      <author>lovejava</author>
      <guid isPermaLink="true">https://lovejava.tistory.com/724</guid>
      <comments>https://lovejava.tistory.com/724#entry724comment</comments>
      <pubDate>Thu, 26 Oct 2023 20:26:41 +0900</pubDate>
    </item>
    <item>
      <title>$ window.open에 인증 헤더를 추가하는 방법</title>
      <link>https://lovejava.tistory.com/723</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;$ window.open에 인증 헤더를 추가하는 방법&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;사용자가 데이터베이스에 저장된 데이터를 입력한 후 서버측에서 pdf 파일로 컴파일하는 angularjs 어플리케이션이 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;모든 액세스에는 적절한 인증 헤더가 있어야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;필요한 데이터를 채운 후 사용자가 버튼을 눌러 데이터를 저장한 다음 pdf 파일을 검색합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;최적으로, 나는 전화합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;$window.open(url_generating_pdf&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;angularjs 앱에서.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;잘 작동하여 다른 창에서 열리지만 인증 헤더를 추가하는 방법&lt;/font&gt;&lt;/font&gt;&lt;code&gt;$window&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;요청?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;제가 알기로는 pdf를 다운받을 수 없고 ajax로 출력할 수 없기 때문에 이 인증을 놓쳤습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;아니면 서버에서 url을 호출하여 다른 창에서 파일을 열 수 있는 다른 방법이 있을까요?&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 이 오래된 질문을 정확하고 안전한 답변으로 업데이트해야 한다고 생각합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;5-0&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/4325968/window-open-with-headers?rq=1&quot; papago-id=&quot;5-0-1&quot;&gt;window.open&lt;/a&gt;&lt;/strong&gt;에서&lt;strong papago-id=&quot;5-0&quot;&gt; 수행하는 HTTP GET 요청에는 헤더를 추가&lt;/strong&gt;할 수 &lt;strong papago-id=&quot;5-0&quot;&gt;없습니다&lt;/strong&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;strong papago-id=&quot;6-1&quot;&gt;인증 토큰을 요청 헤더에 설정하고, 이전 답변에서 제안했듯이 URL에 노출되지 않는&lt;/strong&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;Angular를 사용하여 인증된 서버에서 PDF(또는 기타 이진 데이터)를 다운로드하려면 다음과 같이 하십시오.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;JS 당신은 다음을 수행해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li 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/45102102/angularjs-adding-a-header-to-the-http-get&quot; papago-id=&quot;8-1&quot;&gt;헤더에 있는 인증 토큰을 전송&lt;/a&gt;하는 리소스에 HTTP GET 요청을 하고 &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/responseType&quot; rel=&quot;noreferrer&quot; papago-id=&quot;8-3&quot;&gt;responseType&lt;/a&gt;을 이진 데이터 형식(예: &lt;strong papago-id=&quot;8-5&quot;&gt;blob&lt;/strong&gt; 또는 &lt;strong papago-id=&quot;8-7&quot;&gt;arraybuffer&lt;/strong&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;브라우저에서 &quot;다른 이름으로 저장&quot; 대화상자를 사용하여 &lt;a href=&quot;https://stackoverflow.com/questions/35205589/how-to-get-angularjs-blob-to-download-pdf&quot; papago-id=&quot;9-0&quot;&gt;파일&lt;/a&gt;에 있는 &lt;a href=&quot;https://stackoverflow.com/questions/35205589/how-to-get-angularjs-blob-to-download-pdf&quot; papago-id=&quot;9-0&quot;&gt;이진 데이터를 다운로드&lt;/a&gt;합니다. 일반적으로 이진 데이터에 대한 다운로드 링크를 만든 후 클릭합니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 답변이 이 질문에 대한 의구심을 해소하고 인증된 REST API에서 리소스를 안전하게 다운로드 할 수 있는 방법을 제공하기를 바랍니다.&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;이 인증 파라미터를 URL에 추가하고 서버 쪽에서 GET를 하면 될 것 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;//Add authentication headers as params
var params = {
    access_token: 'An access_token',
    other_header: 'other_header'
};

//Add authentication headers in URL
var url = [url_generating_pdf, $.param(params)].join('?');

//Open window
window.open(url);
&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;헤더와 responseType의 토큰으로 보안된 api를 호출하여 다음과 같은 방법으로 응답을 blob하고 파싱할 수 있으며 브라우저에서 크롬과 파이어폭스에 대한 pdf를 볼 수 있기를 바랍니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var ieEDGE = navigator.userAgent.match(/Edge/g);
        var ie = navigator.userAgent.match(/.NET/g); // IE 11+
        var oldIE = navigator.userAgent.match(/MSIE/g);

        var blob = new window.Blob([response], { type: 'application/pdf' });

        if (ie || oldIE || ieEDGE) {
          window.navigator.msSaveBlob(blob, fileName);
        }
        else {
          var fileURL = URL.createObjectURL(blob);
          window.open(fileURL);
        }
&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/23138671/how-to-add-authentication-header-to-window-open&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>angularJS</category>
      <author>lovejava</author>
      <guid isPermaLink="true">https://lovejava.tistory.com/723</guid>
      <comments>https://lovejava.tistory.com/723#entry723comment</comments>
      <pubDate>Thu, 26 Oct 2023 20:26:34 +0900</pubDate>
    </item>
    <item>
      <title>선택 및 하드 코딩된 값을 포함한 SQL 삽입</title>
      <link>https://lovejava.tistory.com/722</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;선택 및 하드 코딩된 값을 포함한 SQL 삽입&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;INSERT INTO Movies 
SELECT name 
  FROM Directors 
 WHERE name = 'Lucas';
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;선택 삽입이 작동하는 것을 이해하지만 선택을 사용하고 하드 코드화된 값을 전달하려면 어떻게 해야 합니까?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그래서 이론적으로 이런 것들이 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;INSERT INTO Movies 
VALUES(Star Wars,(SELECT name 
                    FROM Directors 
                   WHERE name='Lucas'), 50000, 1000000);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;가능한가요?&lt;/font&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;INSERT INTO Movies (Title, Director, Cost, Profits)
SELECT 'Star Wars', name, 50000, 1000000
FROM Directors WHERE name = 'Lucas'
&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;select&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음과 같은 문구를 사용하는 것이 더 깨끗할 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;insert into movies (title, director, cost, profits)
   select 'Star Wars', name, 50000, 1000000 from directors where name = 'Lucas';
&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;사용자 INSERT..&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://dev.mysql.com/doc/refman/5.0/en/insert-select.html&quot; rel=&quot;noreferrer&quot; papago-id=&quot;7-1&quot;&gt;참조&lt;/a&gt;.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;하드 코딩된 값은 값 내부가 아닌 SELECT 쿼리에 있어야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;INSERT INTO Movies
SELECT 'Star Wars', name, 50000, 1000000
FROM Directors 
WHERE name = 'Lucas';
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;영화(제목, 감독, 비용, 수익)로 데이터베이스가 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;각 표에 값을 입력하려면 먼저 표를 선택한 다음 해당 표에 값을 삽입합니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/4141370/sql-insert-with-select-and-hard-coded-values&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>MySQL</category>
      <author>lovejava</author>
      <guid isPermaLink="true">https://lovejava.tistory.com/722</guid>
      <comments>https://lovejava.tistory.com/722#entry722comment</comments>
      <pubDate>Thu, 26 Oct 2023 20:26:28 +0900</pubDate>
    </item>
    <item>
      <title>자바스크립트 iframe 내용만 출력</title>
      <link>https://lovejava.tistory.com/721</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;자바스크립트 iframe 내용만 출력&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이건 내 코드입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;script&amp;gt;
var body = &quot;dddddd&quot;    
var script = &quot;&amp;lt;script&amp;gt;window.print();&amp;lt;/scr'+'ipt&amp;gt;&quot;;

var newWin = $(&quot;#printf&quot;)[0].contentWindow.document; 
newWin.open();
newWin.close();

$(&quot;body&quot;,newWin).append(body+script);

&amp;lt;/script&amp;gt;
&amp;lt;iframe id=&quot;printf&quot;&amp;gt;&amp;lt;/iframe&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;작동은 되는데 상위 페이지를 출력하는데 iframe만 출력하려면 어떻게 해야 하나요?&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 그것이 효과가 있으리라고는 기대하지 않습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;대신 해 보다&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;window.frames[&quot;printf&quot;].focus();
window.frames[&quot;printf&quot;].print();
&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;&amp;lt;iframe id=&quot;printf&quot; name=&quot;printf&quot;&amp;gt;&amp;lt;/iframe&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;아니면 좋은 옛것을 시도해 보시기 바랍니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var newWin = window.frames[&quot;printf&quot;];
newWin.document.write('&amp;lt;body onload=&quot;window.print()&quot;&amp;gt;dddd&amp;lt;/body&amp;gt;');
newWin.document.close();
&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;jQuery가 해킹할 수 없는 경우&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;http://plungjan.name/SO/testprintiframe.html&quot;&gt;&lt;strong papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;라이브 데모&lt;/font&gt;&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;document.getElementById(&quot;printf&quot;).contentWindow.print();
&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;http://en.wikipedia.org/wiki/Same_origin_policy#Origin_determination_rules&quot; papago-id=&quot;9-0&quot; rel=&quot;noreferrer&quot;&gt;동일&lt;/a&gt;한 원산지 &lt;a href=&quot;http://en.wikipedia.org/wiki/Same_origin_policy#Origin_determination_rules&quot; papago-id=&quot;9-0&quot; rel=&quot;noreferrer&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;쉬운 방법(ie7+, firefox, Chrome, safari에서 테스트)은 이것일 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;//id is the  id of the iframe
function printFrame(id) {
            var frm = document.getElementById(id).contentWindow;
            frm.focus();// focus on contentWindow is needed on some ie versions
            frm.print();
            return false;
}
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;적합할 수도 있고 그렇지 않을 수도 있지만 다음과 같은 경우에는 더 깨끗합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;iframe을 항상 페이지에서 인쇄하려면 iframe 이외의 모든 것을 숨기는 별도의 &quot;@media print{}&quot; 스타일시트를 사용할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러면 그냥 정상적으로 페이지를 출력하시면 됩니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;13&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음 명령을 사용할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;document.getElementById('iframeid').contentWindow.print();
&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;이 명령어는 기본적으로 window.print()와 동일하지만 인쇄하고자 하는 창이 iframe에 있기 때문에 우선 해당 창의 인스턴스를 자바스크립트 객체로 얻어야 합니다.&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;따라서 iframe과 관련하여 먼저 iframe의 id를 사용하여 iframe을 얻은 다음 컨텐츠Window가 window(DOM) 객체를 반환합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;따라서 이 객체에 window.print() 함수를 직접 사용할 수 있습니다.&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;IE8에서 위의 모든 솔루션에 문제가 있었고 IE 8+9, Chrome, Safari 및 Firefox에서 테스트된 괜찮은 해결책을 찾았습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;상황에 맞게 동적으로 생성된 보고서를 인쇄해야 했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;// create content of iframe
var content = '&amp;lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot; lang=&quot;en&quot; xml:lang=&quot;en&quot;&amp;gt;'+
'&amp;lt;head&amp;gt;&amp;lt;link href=&quot;/css/print.css&quot; media=&quot;all&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot;&amp;gt;&amp;lt;/head&amp;gt;'+
'&amp;lt;body&amp;gt;(rest of body content)'+
'&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;function printPage() { window.focus(); window.print();return; }&amp;lt;/script&amp;gt;'+
'&amp;lt;/body&amp;gt;&amp;lt;/html&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;본문 닫기 태그 전에 printPage() javascript 방법을 메모합니다.&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;다음으로 iframe을 만들어 해당 컨텐츠의 Windows를 사용할 수 있도록 상위 본문에 추가합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var newIframe = document.createElement('iframe');
newIframe.width = '0';
newIframe.height = '0';
newIframe.src = 'about:blank';
document.body.appendChild(newIframe);
&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;newIframe.contentWindow.contents = content;
newIframe.src = 'javascript:window[&quot;contents&quot;]';
&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;여기서는 동적 컨텐츠 변수를 iframe의 window 개체로 설정한 후 javascript: scheme을 통해 호출합니다.&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;마지막으로 인쇄하려면 iframe에 포커스를 맞추고 iframe 컨텐츠 내에서 javascript printPage() 함수를 호출합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;newIframe.focus();
setTimeout(function() {
  newIframe.contentWindow.printPage();
}, 200);
return;
&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;setTimeout은 꼭 필요한 것은 아니지만, 많은 양의 컨텐츠를 로드하는 경우 Chrome이 없으면 인쇄에 실패하는 경우가 종종 있으므로 이 단계를 권장합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;또는 'newIframe.contentWindow.printPage()';를 캐치 시도에 래핑하고 setTimeout 래핑된 버전을 캐치 블록에 배치하는 방법도 있습니다.&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;a href=&quot;http://sparecycles.wordpress.com/2012/03/08/inject-content-into-a-new-iframe/&quot; rel=&quot;noreferrer&quot; papago-id=&quot;23-1&quot;&gt;싸이클&lt;/a&gt; 덕분입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;24&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;편집:&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;25&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;setTimeout을 사용하여 printPage 함수를 호출하는 대신 다음을 사용합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;newIframe.onload = function() {
    newIframe.contentWindow.printPage();
}
&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;이때 iframe 내부에 스크립트 태그가 필요 없습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;Chrome, Firefox, IE11 및 노드-웹킷 0.12에서 테스트됨:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;script&amp;gt;
window.onload = function() {
    var body = 'dddddd';
    var newWin = document.getElementById('printf').contentWindow;
    newWin.document.write(body);
    newWin.document.close(); //important!
    newWin.focus(); //IE fix
    newWin.print();
}
&amp;lt;/script&amp;gt;

&amp;lt;iframe id=&quot;printf&quot;&amp;gt;&amp;lt;/iframe&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;27&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;모든 답변에 감사드립니다.&lt;/font&gt;&lt;/p&gt;&lt;p&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;javascript를 이용하여 아이프레임의 내용을 설정하는 경우&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;document.write()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;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;newWin.document.close();&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;그렇지 않으면 다음 코드는 작동하지 않고 인쇄는 I 프레임 내용만 인쇄하는 대신 전체 페이지 내용을 인쇄합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var frm = document.getElementById(id).contentWindow;
frm.focus();// focus on contentWindow is needed on some ie versions
frm.print();
&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;pre&gt;&lt;code&gt;let iframe = document.getElementById('frameId') as HTMLIFrameElement;
iframe.contentWindow.print();
&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;IE9 이상의 경우 이 코드를 사용합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;window.frames[&quot;printf&quot;].focus();
window.frames[&quot;printf&quot;].print();
&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;IE8의 경우:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;window.frames[0].focus();
window.frames[0].print();
&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;iframe 프린트를 하는 목적이 무엇인지 궁금합니다.&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;조금 전에 비슷한 문제가 있었습니다. 크롬의 인쇄 미리보기를 사용하여 iframe의 PDF 파일을 생성하는 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;36&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;결국 나는 속임수로 문제를 해결했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;/p&gt;
&lt;div class=&quot;snippet&quot; data-lang=&quot;js&quot; data-hide=&quot;false&quot;&gt; 
 &lt;div class=&quot;snippet-code&quot;&gt; 
  &lt;pre class=&quot;snippet-code-js lang-js prettyprint-override&quot;&gt;&lt;code&gt;$('#print').click(function() {
    $('#noniframe').hide(); // hide other elements
    window.print();         // now, only the iframe left
    $('#noniframe').show(); // show other elements again.
});&lt;/code&gt;&lt;/pre&gt; 
 &lt;/div&gt; 
&lt;/div&gt; 
&lt;p&gt;&lt;/p&gt;&lt;p papago-id=&quot;37&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;document.getElementById('iframeid').contentWindow.print(); 이 코드는 테스트되고 작동하며 며칠이 지난 후에 실행됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&amp;lt;iFrame 태그만 사용할 수 있고 &amp;lt;embed&amp;gt;를 피합니다. &amp;lt;object tag for pdf include.&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/9616426/javascript-print-iframe-contents-only&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>jQuery</category>
      <author>lovejava</author>
      <guid isPermaLink="true">https://lovejava.tistory.com/721</guid>
      <comments>https://lovejava.tistory.com/721#entry721comment</comments>
      <pubDate>Thu, 26 Oct 2023 20:26:21 +0900</pubDate>
    </item>
    <item>
      <title>SQL 보기에 기본 키 추가</title>
      <link>https://lovejava.tistory.com/720</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;SQL 보기에 기본 키 추가&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/894610/how-to-do-hibernate-mapping-for-table-or-view-without-a-primary-key&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;&lt;strong papago-id=&quot;3-1&quot;&gt;기본적&lt;/strong&gt;으로 저장된 쿼리에 불과하기 때문에 기본 키를 내 보기에 추가하는 방법이 궁금합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;PS: 오라클 10g&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;em papago-id=&quot;6-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 class=&quot;papago-parent&quot;&gt;따라서 제약 조건은 문서화의 목적으로만 존재합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;SQL&amp;gt; create view emp_view as select * from emp
  2  /


View created.

SQL&amp;gt; alter view emp_view add constraint vemp_pk primary key (empno) disable
  2  /

View altered.

SQL&amp;gt; 
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;주의 사항: 저는 하이버네이트와 함께 이것을 시도해 본 적이 없어서 당신의 시나리오에서 작동할지 모르겠습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;하지만, 저는 Hibernate를 뷰 계층에 대해서만 독점적으로 사용하는 사이트를 알고 있기 때문에, 아마 알고 있을 것입니다.&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;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/2041308/adding-primary-key-to-sql-view&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>Oracle</category>
      <author>lovejava</author>
      <guid isPermaLink="true">https://lovejava.tistory.com/720</guid>
      <comments>https://lovejava.tistory.com/720#entry720comment</comments>
      <pubDate>Sat, 21 Oct 2023 09:49:44 +0900</pubDate>
    </item>
    <item>
      <title>ARM: 링크 레지스터 및 프레임 포인터</title>
      <link>https://lovejava.tistory.com/719</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;ARM: 링크 레지스터 및 프레임 포인터&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;ARM에서 링크 레지스터와 프레임 포인터가 어떻게 작동하는지 이해하려고 합니다.&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;int foo(void)
{
    // ..
    bar();
    // (A)
    // ..
}

int bar(void)
{
    // (B)
    int b1;
    // ..
    // (C)
    baz();
    // (D)
}

int baz(void)
{
    // (E)
    int a;
    int b;
    // (F)
}
&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;그리고 foo()라고 부릅니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;링크 레지스터에 (A) 지점의 코드 주소가 포함되고 프레임 포인터에 (B) 지점의 코드 주소가 포함됩니까?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고 스택 포인터는 모든 로컬이 선언된 후에 bar() 내부의 아무 곳에나 있을 수 있습니다.&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;a href=&quot;http://en.wikipedia.org/wiki/Application_binary_interface&quot; papago-id=&quot;4-1&quot; rel=&quot;noreferrer&quot;&gt;ABI&lt;/a&gt;(Application Binary Interface)에 의존합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;FP&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;strong papago-id=&quot;5-1&quot;&gt;APCS&lt;/strong&gt; 표준에는 필요하며, 최신 &lt;strong papago-id=&quot;5-3&quot;&gt;AAPCS&lt;/strong&gt;(2003)에는 필요하지 않습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;5-5&quot;&gt;AAPCS&lt;/strong&gt;(GCC 5.0+)의 경우&lt;/font&gt;&lt;/font&gt;&lt;code&gt;FP&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;a href=&quot;https://stackoverflow.com/questions/57451208/whats-the-structure-of-arm-extab-entry-in-armcc&quot; papago-id=&quot;6-3&quot;&gt;사용&lt;/a&gt;할 &lt;strong papago-id=&quot;6-1&quot;&gt;필요&lt;/strong&gt;는 없지만 당연히 &lt;strong papago-id=&quot;6-5&quot;&gt;그럴&lt;/strong&gt; 수 있습니다. &lt;a href=&quot;https://stackoverflow.com/questions/57451208/whats-the-structure-of-arm-extab-entry-in-armcc&quot; papago-id=&quot;6-3&quot;&gt;디버그&lt;/a&gt; 정보에는 AAPCS를 사용한 스택 추적 및 코드 풀기를 위한 스택 및 프레임 포인터 &lt;a href=&quot;https://stackoverflow.com/questions/57451208/whats-the-structure-of-arm-extab-entry-in-armcc&quot; papago-id=&quot;6-3&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;static&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;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;일반적으로 모든 ARM 레지스터는 &lt;em papago-id=&quot;8-1&quot;&gt;범용&lt;/em&gt;입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;lr&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;및 터,한 R14)d&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;pc&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;(프로그램 카운터 역시 R15)는 특별하며 명령어 세트에 담겨 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;당신 말이 맞습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;lr&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;strong papago-id=&quot;11-1&quot;&gt;A&lt;/strong&gt;를 가리킬 겁니다&lt;/font&gt;&lt;/font&gt;&lt;code&gt;pc&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;lr&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;13&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;관련이 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;하나는 &quot;당신이 있는 곳&quot;이고 다른 하나는 &quot;당신이 있었던 곳&quot;입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이들은 함수의 &lt;strong papago-id=&quot;13-1&quot;&gt;코드&lt;/strong&gt; 측면입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;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;sp&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;및 , R13)&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;16&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(&lt;a href=&quot;https://stackoverflow.com/questions/10928646/whats-the-equivalent-of-bp-register-frame-pointer-on-arm-processors&quot; papago-id=&quot;16-1&quot;&gt;프레임 포인터&lt;/a&gt;, R11).&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://msdn.microsoft.com/en-us/library/ms253599%28v=vs.90%29.aspx&quot; papago-id=&quot;16-3&quot; rel=&quot;noreferrer&quot;&gt;마이크로소프트 레이아웃&lt;/a&gt;은 사물을 잘 설명해 줍니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;em papago-id=&quot;16-5&quot;&gt;스택&lt;/em&gt;은 임시 데이터 또는 &lt;em papago-id=&quot;16-7&quot;&gt;로컬&lt;/em&gt;을 함수에 저장하는 데 사용됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;에 있는 변수&lt;/font&gt;&lt;/font&gt;&lt;code&gt;foo()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;13&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;bar()&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;em papago-id=&quot;18-1&quot;&gt;스택 또는 사용&lt;/em&gt; 가능한 레지스터에 저장됩니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;fp&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;em papago-id=&quot;19-1&quot;&gt;프레임&lt;/em&gt; 또는 그림 창입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;em papago-id=&quot;19-3&quot;&gt;ABI&lt;/em&gt;는 이 &lt;em papago-id=&quot;19-5&quot;&gt;프레임&lt;/em&gt;의 레이아웃을 정의합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;일반적으로&lt;/font&gt;&lt;/font&gt;&lt;code&gt;lr&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;16&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고 다른 레지스터들은 컴파일러에 의해 뒤에 저장될 뿐만 아니라 이전의 값에 의해 여기에 저장됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;fp&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;em papago-id=&quot;21-1&quot;&gt;연결된 목록&lt;/em&gt;이 생성되며, 필요한 경우 다음 위치까지 추적할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;main()&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;em papago-id=&quot;22-1&quot;&gt;뿌리&lt;/em&gt;가.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;fp&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;, 하나의 스택 프레임을 가리키는 것(예를 들어 a.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;struct&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;struct&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;fp&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;fp&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;NULL&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;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;sp&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;fp&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;27&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;스택이 있던 곳입니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 마치 그와 같은.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;pc&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;28&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;lr&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;lr&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;(link register)는 이전 버전에 저장됩니다.&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;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; 그.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;sp&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;fp&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;strong papago-id=&quot;33-1&quot;&gt;데이터&lt;/strong&gt; 측면입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;34&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;당신의 포인트 &lt;strong papago-id=&quot;34-1&quot;&gt;B&lt;/strong&gt;는 활성입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;pc&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;sp&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;strong papago-id=&quot;36-1&quot;&gt;A&lt;/strong&gt;는 사실은.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;fp&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;lr&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;fp&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;strong papago-id=&quot;39-1&quot;&gt;B&lt;/strong&gt;의 데이터를 가리킵니다.&lt;/font&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;다음은 이 모든 것이 어떻게 작동하는지 보여줄 수 있는 ARM 어셈블리입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 컴파일러가 최적화하는 방법에 따라 다르겠지만 아이디어를 제공해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;/p&gt;
&lt;pre class=&quot;lang-none prettyprint-override&quot;&gt;&lt;code&gt;; Prologue - setup
mov     ip, sp                 ; get a copy of sp.
stmdb   sp!, {fp, ip, lr, pc}  ; Save the frame on the stack. &lt;sup&gt;See Addendum&lt;/sup&gt;
sub     fp, ip, #4             ; Set the new frame pointer.
    ...
; Maybe other functions called here.&lt;br&gt;
; Older caller return &lt;code&gt;lr&lt;/code&gt; stored in stack frame.
bl      baz
    ...
; Epilogue - return
ldm     sp, {fp, sp, lr}       ; restore stack, frame pointer and old link.
    ...                        ; maybe more stuff here.
bx      lr                     ; return.
&lt;/code&gt;&lt;/pre&gt; This is what 
&lt;code&gt;foo()&lt;/code&gt; would look like. If you don't call 
&lt;code&gt;bar()&lt;/code&gt;, then the compiler does a 
&lt;em papago-id=&quot;45&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;잎 최적화&lt;/font&gt;&lt;/em&gt; and doesn't need to save the 
&lt;em papago-id=&quot;46&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;틀&lt;/font&gt;&lt;/em&gt;; only the 
&lt;code&gt;bx lr&lt;/code&gt; is needed. Most likely this maybe why you are confused by web examples. It is not always the same.
&lt;p&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;47&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;테이크아웃은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;code&gt;pc&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;40&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;lr&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;strong papago-id=&quot;41-1&quot;&gt;코드&lt;/strong&gt; 레지스터입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;하나는 &quot;Where you are&quot;이고, 다른 하나는 &quot;Where you were&quot;입니다.&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;sp&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;42&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;fp&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;strong papago-id=&quot;43-1&quot;&gt;로컬 데이터&lt;/strong&gt; 레지스터입니다.&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;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;하나는 &quot;로컬 데이터가 있는 곳&quot;이고, 다른 하나는 &quot;로컬 데이터가 있는 곳&quot;입니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li 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-3&quot;&gt;기능&lt;/em&gt; 기계를 만들기 위해 &lt;a href=&quot;https://stackoverflow.com/questions/261419/arm-to-c-calling-convention-registers-to-save&quot; papago-id=&quot;53-1&quot;&gt;매개&lt;/a&gt; 변수 &lt;a href=&quot;https://stackoverflow.com/questions/261419/arm-to-c-calling-convention-registers-to-save&quot; papago-id=&quot;53-1&quot;&gt;전달&lt;/a&gt;과 함께 작업합니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;54&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;일반적인 경우를 설명하는 것은 어렵습니다. 왜냐하면 컴파일러들이 가능한 한 &lt;strong papago-id=&quot;54-1&quot;&gt;빨리&lt;/strong&gt; 처리하기를 원하기 때문입니다. 그래서 그들은 가능한 모든 속임수를 사용하기 때문입니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p papago-id=&quot;55&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이러한 개념은 모든 CPU와 컴파일된 언어에 일반적인 개념이지만 세부 사항은 다를 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Function_prologue&quot; papago-id=&quot;55-5&quot; rel=&quot;noreferrer&quot;&gt;링크&lt;/a&gt; &lt;em papago-id=&quot;55-1&quot;&gt;레지스터&lt;/em&gt;, &lt;em papago-id=&quot;55-3&quot;&gt;프레임 포인터&lt;/em&gt;의 사용은 함수 &lt;a href=&quot;http://en.wikipedia.org/wiki/Function_prologue&quot; papago-id=&quot;55-5&quot; rel=&quot;noreferrer&quot;&gt;프롤로그&lt;/a&gt; 및 에필로그의 일부이며, 모든 것을 이해했다면 ARM에서 &lt;em papago-id=&quot;55-7&quot;&gt;스택 오버플로&lt;/em&gt;가 어떻게 작동하는지 알 수 있습니다.&lt;/font&gt;&lt;/p&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;a href=&quot;https://stackoverflow.com/questions/261419/arm-to-c-calling-convention-registers-to-save&quot; papago-id=&quot;45-1&quot;&gt;ARM 호출 규약&lt;/a&gt;.&lt;/font&gt;&lt;/font&gt;&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font papago-translate=&quot;splited&quot;&gt;&lt;a href=&quot;http://msdn.microsoft.com/en-us/library/aa448593.aspx&quot; rel=&quot;noreferrer&quot; papago-id=&quot;46&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; MSDN ARM &lt;/font&gt;&lt;/font&gt;&lt;/a&gt;&lt;/font&gt;&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font papago-translate=&quot;splited&quot;&gt;&lt;a href=&quot;http://www.cl.cam.ac.uk/~fms27/teaching/2001-02/arm-project/02-sort/apcs.txt&quot; rel=&quot;noreferrer&quot; papago-id=&quot;47&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 개요  APCS &lt;/font&gt;&lt;/font&gt;&lt;/a&gt;&lt;/font&gt;&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font papago-translate=&quot;splited&quot;&gt;&lt;a href=&quot;http://minghuasweblog.wordpress.com/2013/04/05/arm-cc-software-stack-back-trace/&quot; rel=&quot;noreferrer&quot; papago-id=&quot;48&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;ARM 스택 추적 블로그&lt;/font&gt;&lt;/font&gt;&lt;/a&gt;&lt;/font&gt;&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font papago-translate=&quot;splited&quot;&gt;&lt;a href=&quot;https://developer.apple.com/library/ios/documentation/Xcode/Conceptual/iPhoneOSABIReference/Articles/ARMv6FunctionCallingConventions.html&quot; rel=&quot;noreferrer&quot; papago-id=&quot;49&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 링크Apple ABI &lt;/font&gt;&lt;/font&gt;&lt;/a&gt;&lt;/font&gt;&lt;br&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;61&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;기본적인 프레임 배치는,&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&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;된 fp[-0] &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;pc&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;/li&gt; 
 &lt;li&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;된 fp[-1] &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;lr&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;/li&gt; 
 &lt;li&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; fp[-2]&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;sp&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;em papago-id=&quot;55-1&quot;&gt;먹기&lt;/em&gt; 전에.&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li&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; fp[-3]&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;57&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;, 맨 &lt;em papago-id=&quot;57-1&quot;&gt;끝&lt;/em&gt;에 쌓아 올린 &lt;em papago-id=&quot;57-1&quot;&gt;골조&lt;/em&gt;&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;70&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;71&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;71-1&quot;&gt;ABI&lt;/strong&gt;는 다른 값을 사용할 수도 있지만, 위의 내용은 대부분의 설정에서 일반적으로 사용됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;위의 인덱스는 모든 ARM 레지스터가 32비트이므로 32비트 값에 대한 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;바이트 중심인 경우 4를 곱합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;프레임도 최소 4바이트로 정렬됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;72&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;72-0&quot;&gt;부록:&lt;/strong&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 어셈블러의 오류가 아닙니다. 정상입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/32623597/arm-gcc-generated-functions-prolog&quot; papago-id=&quot;72-2&quot;&gt;ARM 생성 프롤로그&lt;/a&gt; 질문에 설명이 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;73&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;면책 사항:&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 말이 대충 맞는 것 같으니 필요에 따라 수정해 주시기 바랍니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;74&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 Q&amp;amp;A의 다른 부분에 나와 있듯이, 컴파일러가 프레임 포인터를 사용하는 ABI(코드 생성)를 생성할 필요가 없을 수도 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;콜 스택의 프레임은 종종 쓸모없는 정보를 저장해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;75&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;컴파일러 옵션이 '프레임 없음'(의사 옵션 플래그)을 호출하는 경우 컴파일러는 호출 스택 데이터를 더 작게 유지하는 더 작은 코드를 생성할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;호출 함수는 스택에 필요한 호출 정보만 저장하도록 컴파일되고 호출 함수는 스택에서 필요한 호출 정보만 팝하도록 컴파일됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;76&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;실행 시간과 스택 공간을 절약할 수 있지만 호출 코드의 역추적을 매우 어렵게 만듭니다. (저는 시도를 포기했습니다.)&lt;/font&gt;&lt;/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;p papago-id=&quot;78&quot; papago-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/15752188/arm-link-register-and-frame-pointer&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>C</category>
      <author>lovejava</author>
      <guid isPermaLink="true">https://lovejava.tistory.com/719</guid>
      <comments>https://lovejava.tistory.com/719#entry719comment</comments>
      <pubDate>Sat, 21 Oct 2023 09:49:37 +0900</pubDate>
    </item>
    <item>
      <title>Angular.js 매개 변수를 사용하여 리소스를 삭제</title>
      <link>https://lovejava.tistory.com/718</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Angular.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;나의 rest api는 다음 url로 DELETE 요청을 받습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;/api/users/{slug}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;따라서 지정된 사용자(슬러그)에게 삭제를 전송하면 해당 사용자는 삭제됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;서비스 코드는 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;angular.module('UserService',['ngResource']).factory('User', function($resource){
    var User = $resource('/api/users/:id1/:action/:id2', //add param to the url
    {}, 
    { 
        delete_user: {
            method: 'DELETE',
            params: {
                id1:&quot;@id&quot;
            }
        },
        update: {
            method: 'PUT',
            params: {
                id1:&quot;@id&quot;
            }
        }
    }); 

    return User;
}); 
&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;user.$delete_user({id:user.id}, function(){}, function(response){}); 
&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;하지만 잘못된 url로 요청이 전달된 것 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;/api/users?id=4
&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;그래서 실제로 파라미터가 누락되어 결과적으로 405 Method가 허용되지 않습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;혹시 제 api 스타일로 삭제 요청을 보낼 기회가 있을까요?&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;code&gt;params&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;는 작업에 있는 기본 요청 매개 변수의 개체입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL 매개변수를 원할 경우 다음과 같이 두 번째 매개변수에 매개변수를 지정해야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-js prettyprint-override&quot;&gt;&lt;code&gt;angular.module('UserService',['ngResource']).factory('User', function($resource){
    var User = $resource('/api/users/:id1/:action/:id2', //add param to the url
    {id1:'@id'},
    { 
        delete_user: {
            method: 'DELETE'
        }
    }); 

    return User;
}); 
&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 class=&quot;lang-js prettyprint-override&quot;&gt;&lt;code&gt;// user has id
user.$delete_user(function(){
  //success
},function(){
  // error
});
&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 class=&quot;lang-js prettyprint-override&quot;&gt;&lt;code&gt;var data = {id:'id_from_data'};
User.delete_user({},data);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;아니면&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-js prettyprint-override&quot;&gt;&lt;code&gt;var params = {id1:'id1_from_params'};
User.delete_user(params);
&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;strong papago-id=&quot;10-1&quot;&gt;&lt;a href=&quot;http://plnkr.co/edit/xy366u9Bm9ksXFG33E0L?p=preview&quot; papago-id=&quot;10-1-0&quot;&gt;plnkr-example&lt;/a&gt;&lt;/strong&gt;을 만들었습니다. DELETE 요청이 올바른지 확인하려면 콘솔을 열어야 합니다.&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;a href=&quot;http://docs.angularjs.org/api/ngResource.%24resource&quot; papago-id=&quot;11-3&quot;&gt;각도 리소스 설명서&lt;/a&gt;의 매개변수 &lt;em papago-id=&quot;11-1&quot;&gt;기본값&lt;/em&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;font class=&quot;papago-parent&quot;&gt;param forget을 전달하는 동안에는 잘 작동했지만 삭제할 때 api/resource/1234가 아닌 ?id=1234가 표시되었습니다.&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 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;Service.delete({categoryId:id}, function(resp){
  console.log(resp)//whatever logic you want in here 
});
&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;//SERVICE&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$resource('api/resource/:categoryId', {&quot;categoryId&quot;:&quot;@categoryId&quot;}, {
   query:{method:&quot;GET&quot;},
   delete:{method:&quot;DELETE&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;작동해야 하고 결과 url은 원래 변수 이름으로 기본 params에 categoryId가 있었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;api/resource/1234 etc
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;매개 변수에서 '@'만 생략합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;   .factory('reportFactory', ['$resource', 'baseUrl', function ($resource, baseUrl) {
        return $resource(baseUrl + '/keys/:id', {}, {
        delete: { method: 'DELETE',
            headers: {
                'Content-Type': 'application/json'
            },
            params: {id: 'id'} }
       })
}]);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이를 통해 다음을 얻을 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;  http://localhost:8080/reports/api/keys/b8a8a8e39a8f55da94fdbe6c 
&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;p papago-id=&quot;20&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;모델을 삭제하려면 매개변수를 추가할 필요가 없습니다(어차피 DELETE에는 매개변수가 작동하지 않음).&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$resource('/users/:id').delete({id: user.id}, function(res) {
  ...
})
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;21&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;아니면&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$resource('/users/:role/:id').delete({role: 'visitor', id: user.id});
&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;ngResource의 버그인지 잘 모르겠습니다.&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/16167463/angular-js-delete-resource-with-parameter&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>angularJS</category>
      <author>lovejava</author>
      <guid isPermaLink="true">https://lovejava.tistory.com/718</guid>
      <comments>https://lovejava.tistory.com/718#entry718comment</comments>
      <pubDate>Sat, 21 Oct 2023 09:49:29 +0900</pubDate>
    </item>
    <item>
      <title>mysql 셸 내의 테이블 줄 없이 쿼리 결과 표시(비표 출력)</title>
      <link>https://lovejava.tistory.com/717</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;mysql 셸 내의 테이블 줄 없이 쿼리 결과 표시(비표 출력)&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;mysql shell 내에 아래와 같은 쿼리 결과를 표시할 수 있습니까?&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;mysql&amp;gt; select code, created_at from my_records;
    code         created_at
1213307927  2013-04-26 09:52:10
8400000000  2013-04-29 23:38:48
8311000001  2013-04-29 23:38:48
3 rows in set (0.00 sec)
&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;mysql&amp;gt; select code, created_at from my_records;
+------------+---------------------+
|     code   |          created_at |
+------------+---------------------+
| 1213307927 | 2013-04-26 09:52:10 |
| 8400000000 | 2013-04-29 23:38:48 |
| 8311000001 | 2013-04-29 23:38:48 |
+------------+---------------------+
3 rows in set (0.00 sec)
&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;blockquote&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;--raw, -r&lt;/font&gt;&lt;/strong&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;표 출력의 경우 열 주변의 &quot;상자&quot;를 사용하면 하나의 열 값을 다른 열 값과 구별할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;표가 아닌 출력(예: 배치 모드에서 생성되거나 --batch 또는 --silent 옵션이 제공되는 경우)의 경우 특수 문자가 출력에서 빠져나가 쉽게 식별할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;새 줄, 탭, NUL, 백슬래시는 \n, \t, \0, \\으로 적습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;--raw 옵션은 이 문자 탈출을 사용 불가능으로 설정합니다.&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;% mysql
mysql&amp;gt; SELECT CHAR(92);
+----------+
| CHAR(92) |
+----------+
| \        |
+----------+

% mysql --silent
mysql&amp;gt; SELECT CHAR(92);
CHAR(92)
\\

% mysql --silent --raw
mysql&amp;gt; SELECT CHAR(92);
CHAR(92)
\
&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;a href=&quot;http://dev.mysql.com/doc/refman/5.1/en/mysql-command-options.html#option_mysql_raw&quot; rel=&quot;noreferrer&quot; papago-id=&quot;7-1&quot;&gt;&lt;strong papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;MySQL 문서에서&lt;/font&gt;&lt;/strong&gt;&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;정확히 필요한 것은 아니지만 유용할 수도 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;쿼리 끝에 \G 추가&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;select code, created_at from my_records\G;
&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;*************************** 1. row ***************************
 code: 1213307927
 created_at: 2013-04-26 09:52:10
*************************** 2. row ***************************
 code: 8400000000  
 created_at: 2013-04-29 23:38:48
&lt;/code&gt;&lt;/pre&gt;&lt;h1 papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;원라이너&lt;/font&gt;&lt;/h1&gt; 
&lt;pre class=&quot;lang-sh prettyprint-override&quot;&gt;&lt;code&gt;mysql -u YOURUSER -p --password=YOURPASSWORD -s -r -e &quot;show databases;&quot;        
mysql -u root -p --password=abc12345 -s -r -e &quot;show databases;&quot;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;당신은 통과해야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;-s&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;mysql -s&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;13&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;mysql --skip-열-names --silent --raw --execute &quot;select * from someone;&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;사용자의 기본 옵션으로 설정하려면 ~/.my.cnf skip_column_names silent raw에 다음을 추가합니다.&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;이 문제를 해결했지만 concat_ws를 사용하여 결과를 함께 결합한 후 공백을 추가합니다(첫 번째 인수).&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;select concat_ws (' ',ipNetFull,ipUsage,broadcast,gateway) from ipNets;
&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;주변 테이블 없이 MySQL 클라이언트 출력을 얻으려면 mysql 클라이언트 대신 linux 명령줄에서 쿼리를 실행할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$ echo &quot;SELECT CONCAT_WS(' ','DROP TABLE',TABLE_NAME,';') FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE '%';&quot; | mysql dbname
&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;bonth: sort 등을 통해 출력을 파이프링하거나, 다시 mysql에 넣을 수도 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$ echo &quot;SELECT CONCAT_WS(' ','DROP TABLE',CONCAT_WS('.',TABLE_SCHEMA,TABLE_NAME),';') FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE 'i\'m\_not\_that\_mean';&quot; | mysql | mysql;
&lt;/code&gt;&lt;/pre&gt;&lt;h3 papago-id=&quot;19&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;빠른 해결 방법:&lt;/font&gt;&lt;/h3&gt; 
&lt;p papago-id=&quot;20&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;최신 MySQL 클라이언트(어떤 버전인지 확실하지 않음)를 사용하여 PAGER 지시어를 사용하여 결과를 조작할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;데이터를 흐리지 않으려면 이러한 식을 변경해야 할 수도 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;gt; PAGER sed 's/|//g'
PAGER set to 'sed 's/|//g''
barracuda@db-ess-rw.us-east-2.ess.aws.vt2.com [ess]
&amp;gt; SELECT 'row1_col1' AS column1, 'row1_col2' AS column2
  UNION ALL SELECT 'row2_col1', 'row2_col2';
+---------+---------+
 column1  column2 
+---------+---------+
 row1_col1  row1_col2 
 row2_col1  row2_col2 
+---------+---------+
2 rows in set (0.00 sec)
&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;이 작업을 수행하기 전에 PAGE의 현재 값을 확인할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;gt; PAGER
PAGER set to 'less'
&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;'less'를 PAGER로 사용하도록 재설정하려면 다음과 같이 하십시오.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;gt; PAGER less
PAGER set to 'less'
&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;PAGER로 더 재미있는 점:&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://www.percona.com/blog/2013/01/21/fun-with-the-mysql-pager-command/&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;24&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;https://www.percona.com/blog/2013/01/21/fun-with-the-mysql-pager-command/&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;p papago-id=&quot;25&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;질문과 답변에 너무 혼란스러웠습니다. ran sql과 결과는 줄이나 비표 형식 없이 계속 표시되었습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;나중에 쿼리 공간을 마우스 오른쪽 버튼으로 클릭하고 &quot;결과 대상&quot; &amp;gt; &quot;결과 대상&quot;으로 이동할 때 옵션이 있음을 알게 되었습니다.&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;제가 경험하고 있던 형식인 &quot;문자로 결과&quot;에 대한 옵션도 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;27&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;:)!&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;28&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/18630499/display-query-results-without-table-line-within-mysql-shell-nontabular-output&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>MySQL</category>
      <author>lovejava</author>
      <guid isPermaLink="true">https://lovejava.tistory.com/717</guid>
      <comments>https://lovejava.tistory.com/717#entry717comment</comments>
      <pubDate>Sat, 21 Oct 2023 09:49:22 +0900</pubDate>
    </item>
    <item>
      <title>함수에서 비동기 대기를 사용하여 비동기 함수에서 값을 반환하는 방법은 무엇입니까?</title>
      <link>https://lovejava.tistory.com/716</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;함수에서 비동기 대기를 사용하여 비동기 함수에서 값을 반환하는 방법은 무엇입니까?&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/14220321/how-do-i-return-the-response-from-an-asynchronous-call&quot; dir=&quot;ltr&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;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;(42개 답변)&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;2020-07-15 18:24:58Z&quot; papago-attr-id=&quot;1&quot;&gt;3년 전&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;비동기 함수에서 값을 반환하려면 어떻게 해야 합니까?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이걸 좋아하려고 했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;const axios = require('axios');
async function getData() {
    const data = await axios.get('https://jsonplaceholder.typicode.com/posts');
    return data;
}
console.log(getData());
&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;Promise { &amp;lt;pending&amp;gt; }
&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;await&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;밖에 있는 것&lt;/font&gt;&lt;/font&gt;&lt;code&gt;async&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;범위. 예상 결과를 얻으려면 당신은 당신의&lt;/font&gt;&lt;/font&gt;&lt;code&gt;console.log&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;10&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;비동기적인 IIFE로 즉.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;async function getData() {
  return await axios.get('https://jsonplaceholder.typicode.com/posts');
}

(async () =&amp;gt; {
  console.log(await getData())
})()
&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;a href=&quot;https://jsfiddle.net/vfjzkerj/232/&quot; rel=&quot;noreferrer&quot; papago-id=&quot;11-0&quot;&gt;&lt;code papago-id=&quot;11-0-0&quot;&gt;Working&lt;/code&gt;&lt;/a&gt; 견본을 보다&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;에 대한 자세한 정보&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;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;axios&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;async/await&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;getData&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;16&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;기능은 다음과 같습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;function getData() {
  return axios.get('https://jsonplaceholder.typicode.com/posts');
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고 전에 했던 것과 똑같이 해요.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;(async () =&amp;gt; {
   console.log(await getData())
})()
&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;함수 getData가 약속을 반환합니다.&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;ul&gt; 
 &lt;li&gt;&lt;p&gt;&lt;code&gt;await&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;await&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;21&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;, 당신은 안에 있어야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;async&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;22&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;function, 그래서 당신은 이것을 'wrap'해야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; &lt;pre class=&quot;lang-js prettyprint-override&quot;&gt;&lt;code&gt;async function callAsync() {
   var x = await getData();
   console.log(x);
}
callAsync();
&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;(나는 명확한 이유로 함수의 이름을 지었지만, 이 시나리오에서는 익명 함수 호출을 사용할 것입니다. The Reason의 &lt;a href=&quot;https://stackoverflow.com/a/49938734/1454514&quot; papago-id=&quot;23-1&quot;&gt;답변&lt;/a&gt;을 참조하십시오.)&lt;/font&gt;&lt;/p&gt; &lt;/li&gt; 
&lt;/ul&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;ul&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;25&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;결과를 비동기 함수가 반환하는 일반 약속으로 사용합니다.&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;26&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용해야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;then&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;/p&gt; &lt;pre class=&quot;lang-js prettyprint-override&quot;&gt;&lt;code&gt;getData().then(x =&amp;gt; { 
    console.log(x); 
});
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
&lt;/ul&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;28&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다른 답변들은 이 문제를 잘 다루었습니다. 하지만 저는 이 문제를 해결하기 위해 노력하고 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;main&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;pre&gt;&lt;code&gt;async function main(){
  let result = await getData();
}

main().catch(console.log);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;30&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 당신의 코드를 읽는 누구에게나 이것이 &lt;em papago-id=&quot;30-1&quot;&gt;당신&lt;/em&gt;의 앱 &lt;em papago-id=&quot;30-1&quot;&gt;진입 지점&lt;/em&gt;이라는 것을 꽤 명확하게 보여줍니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;31&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/49938266/how-to-return-values-from-async-functions-using-async-await-from-function&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>Node.js</category>
      <author>lovejava</author>
      <guid isPermaLink="true">https://lovejava.tistory.com/716</guid>
      <comments>https://lovejava.tistory.com/716#entry716comment</comments>
      <pubDate>Sat, 21 Oct 2023 09:49:14 +0900</pubDate>
    </item>
  </channel>
</rss>