<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>powerit</title>
    <link>https://powerit.tistory.com/</link>
    <description>각종 프로그래밍 정보를 다루는 블로그입니다.</description>
    <language>ko</language>
    <pubDate>Sat, 4 Jul 2026 23:43:11 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>powerit</managingEditor>
    <item>
      <title>워드프레스의 공개/직접 진입 지점은 모두 무엇입니까?</title>
      <link>https://powerit.tistory.com/1438</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;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것이 작동하기 위해서는 다음과 같은 웹 브라우저에서 (사용자에 의해 또는 AJAX를 통해) 직접 로드되는 모든 워드프레스 파일의 목록이 있어야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;index.php&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;wp-login.php&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;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;직접 로드되지 &lt;em&gt;않은&lt;/em&gt; 파일의 예:&lt;/font&gt;&lt;/font&gt;&lt;code&gt;wp-load.php&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;wp-config.php&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;wp-blog-header.php&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;...&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;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;strong&gt;편집:&lt;/strong&gt; 이것의 요점이 무엇인지 궁금할 것입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것은 서버에 있는 여분의 파일을 줄일 수 있도록 하기 위한 것입니다. 각 워드프레스 웹사이트에서 수천 개의 동일한 파일을 가지고 있어도 소용이 없습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;wp-content&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;디렉토리는 웹사이트들 간에 바뀌는 것이기 때문에 거기에 남겨졌습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 그런 설정이 어떤 결과를 초래하는지 알고 있습니까?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 그렇게 생각합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;편집 2:&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;http://codex.wordpress.org/WordPress_Files&quot; rel=&quot;nofollow&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;http://codex.wordpress.org/WordPress_Files&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음은 다음을 기준으로 한 진입 지점 목록입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;require( 'wp-load.php' );&lt;/code&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://github.com/szepeviktor/WPHW/blob/master/wp-entry-points.md&quot; rel=&quot;nofollow&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;https://github.com/szepeviktor/WPHW/blob/master/wp-entry-points.md&lt;/font&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고 그들의 부족한 점에 대한 트랙 티켓 https://core.trac.wordpress.org/ticket/28364 .&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;ln -s /var/www/vhosts/mainsite/httpdocs/index.php /var/www/vhosts/subsite/httpdocs/index.php
ln -s /var/www/vhosts/mainsite/httpdocs/wp-login.php /var/www/vhosts/subsite/httpdocs/wp-login.php
ln -s /var/www/vhosts/mainsite/httpdocs/wp-admin /var/www/vhosts/subsite/httpdocs/wp-admin
ln -s /var/www/vhosts/mainsite/httpdocs/wp-includes /var/www/vhosts/subsite/httpdocs/wp-includes
&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/14388946/what-are-all-of-wordpress-public-direct-entry-points&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>Wordpress</category>
      <author>powerit</author>
      <guid isPermaLink="true">https://powerit.tistory.com/1438</guid>
      <comments>https://powerit.tistory.com/1438#entry1438comment</comments>
      <pubDate>Sat, 4 Nov 2023 13:24:24 +0900</pubDate>
    </item>
    <item>
      <title>특정 문자열로 시작하는 클래스를 모두 제거합니다.</title>
      <link>https://powerit.tistory.com/1437</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;특정 문자열로 시작하는 클래스를 모두 제거합니다.&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저랑 디브가 있어요.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;id=&quot;a&quot;&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;몇 개의 그룹에서 임의의 수의 클래스가 연결되어 있을 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;각 그룹에는 특정 접두사가 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;자바스크립트에서는 그룹의 어떤 클래스가 디브에 있는지 모릅니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;주어진 접두사로 모든 클래스를 지우고 새로운 클래스를 추가할 수 있으면 좋겠습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&quot;bg&quot;로 시작하는 수업을 모두 없애려면 어떻게 해야 하나요?&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;$(&quot;#a&quot;).removeClass(&quot;bg*&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;\b&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이를 위한 최선의 해결책은 아닙니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var prefix = &quot;prefix&quot;;
var classes = el.className.split(&quot; &quot;).filter(function(c) {
    return c.lastIndexOf(prefix, 0) !== 0;
});
el.className = classes.join(&quot; &quot;).trim();
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;또는 jQuery mixin으로서:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$.fn.removeClassPrefix = function(prefix) {
    this.each(function(i, el) {
        var classes = el.className.split(&quot; &quot;).filter(function(c) {
            return c.lastIndexOf(prefix, 0) !== 0;
        });
        el.className = $.trim(classes.join(&quot; &quot;));
    });
    return this;
};
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;2018 ES6 업데이트:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;const prefix = &quot;prefix&quot;;
const classes = el.className.split(&quot; &quot;).filter(c =&amp;gt; !c.startsWith(prefix));
el.className = classes.join(&quot; &quot;).trim();
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;jQuery를 사용하면 실제 DOM 요소가 인덱스 0에 있으므로 작동합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$('#a')[0].className = $('#a')[0].className.replace(/\bbg.*?\b/g, '');
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;단순한 &lt;a href=&quot;https://gist.github.com/1517285&quot; rel=&quot;nofollow noreferrer&quot;&gt;jQuery 플러그인 alterClass&lt;/a&gt;를 작성했는데 와일드카드 클래스를 제거합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;선택적으로 클래스도 추가합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$( '#foo' ).alterClass( 'foo-* bar-*', 'foobar' ) 
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이를 처리하기 위해 특정 jQuery 코드가 필요하지 않습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;RegExp를 사용하여 교체하기만 하면 됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$(&quot;#a&quot;).className = $(&quot;#a&quot;).className.replace(/\bbg.*?\b/g, '');
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이를 수정하여 접두사를 지원할 수 있지만 RegExp는 한 번만 컴파일되므로 더 빠른 메서드를 사용할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;function removeClassByPrefix(el, prefix) {
    var regx = new RegExp('\\b' + prefix + '.*?\\b', 'g');
    el.className = el.className.replace(regx, '');
    return el;
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;의 &lt;a href=&quot;http://api.jquery.com/removeClass/#removeClass-functionindex--class&quot; rel=&quot;noreferrer&quot;&gt;두번째 서명&lt;/a&gt;을 사용합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;$.fn.removeClass&lt;/code&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;// Considering:
var $el = $('&amp;lt;div class=&quot;  foo-1 a b foo-2 c foo&quot;/&amp;gt;');

function makeRemoveClassHandler(regex) {
  return function (index, classes) {
    return classes.split(/\s+/).filter(function (el) {return regex.test(el);}).join(' ');
  }
}

$el.removeClass(makeRemoveClassHandler(/^foo-/));
//&amp;gt; [&amp;lt;div class=​&quot;a b c foo&quot;&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;let element = $('#a')[0];
let cls = 'bg';

element.classList.remove.apply(element.classList, Array.from(element.classList).filter(v=&amp;gt;v.startsWith(cls)));
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;간단한 jQuery construct와 배열 핸들링 함수를 사용하는 접근법은 클래스의 컨트롤과 접두사를 id로 하고 classed를 모두 삭제하는 함수를 선언하는 것입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;코드가 첨부되어 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;function removeclasses(controlIndex,classPrefix){
    var classes = $(&quot;#&quot;+controlIndex).attr(&quot;class&quot;).split(&quot; &quot;);
    $.each(classes,function(index) {
        if(classes[index].indexOf(classPrefix)==0) {
            $(&quot;#&quot;+controlIndex).removeClass(classes[index]);
        }
    });
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이제 이 기능은 버튼 클릭 또는 코드에서 어디서나 호출할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;removeclasses(&quot;a&quot;,&quot;bg&quot;);
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;http://www.mail-archive.com/jquery-en@googlegroups.com/msg03998.html&quot; rel=&quot;nofollow noreferrer&quot;&gt;http://www.mail-archive.com/jquery-en&lt;/a&gt; @&lt;a href=&quot;http://www.mail-archive.com/jquery-en@googlegroups.com/msg03998.html&quot; rel=&quot;nofollow noreferrer&quot;&gt;googlegroups&lt;/a&gt;.com/msg03998. &lt;a href=&quot;http://www.mail-archive.com/jquery-en@googlegroups.com/msg03998.html&quot; rel=&quot;nofollow noreferrer&quot;&gt;html&lt;/a&gt;는 다음과 같이 말합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;...및 .removeClass()는 모든 클래스를 제거합니다...&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저한테 효과가 있네요 ;)&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;건배.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 똑같은 문제에 대한 해결책을 찾고 있었습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;접두사 &quot;fontid_&quot;로 시작하는 모든 클래스를 제거하기 위해 이 글을 읽고 지금 사용하고 있는 작은 플러그인을 작성했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;(function ($) {
        $.fn.removePrefixedClasses = function (prefix) {
            var classNames = $(this).attr('class').split(' '),
                className,
                newClassNames = [],
                i;
            //loop class names
            for(i = 0; i &amp;lt; classNames.length; i++) {
                className = classNames[i];
                // if prefix not found at the beggining of class name
                if(className.indexOf(prefix) !== 0) {
                    newClassNames.push(className);
                    continue;
                }
            }
            // write new list excluding filtered classNames
            $(this).attr('class', newClassNames.join(' '));
        };
    }(fQuery));
&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;$('#elementId').removePrefixedClasses('prefix-of-classes_');
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;한 줄에...&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;정규식 &lt;em&gt;일부&lt;/em&gt; RegExp와 일치하는 클래스를 모두 제거합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$('#my_element_id').removeClass( function() { return (this.className.match(/someRegExp/g) || []).join(' ').replace(prog.status.toLowerCase(),'');});
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;오래된 질문인 것은 알지만, 새로운 해결책을 찾았는데 단점이 있는지 알고 싶습니다.&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$('#a')[0].className = $('#a')[0].className
                              .replace(/(^|\s)bg.*?(\s|$)/g, ' ')
                              .replace(/\s\s+/g, ' ')
                              .replace(/(^\s|\s$)/g, '');
&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;id로 개체를 선택하는 jQuery 방법이 작동하지 않았습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;나는 사용해야만 했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;document.getElementById(&quot;a&quot;).className
&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;#a&quot;).className
&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;그래서 제 버전은 '\d-'를 포함합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$('#a')[0].className = $('#a')[0].className.replace(/\bbg.\d-*?\b/g, '');
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;(function($)
{
    return this.each(function()
    {
        var classes = $(this).attr('class');

        if(!classes || !regex) return false;

        var classArray = [];

        classes = classes.split(' ');

        for(var i=0, len=classes.length; i&amp;lt;len; i++) if(!classes[i].match(regex)) classArray.push(classes[i]);

        $(this).attr('class', classArray.join(' '));
    });
})(jQuery);
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;jQuery 전용 솔루션을 원하는 사용자를 위해 jQuery로 변환된 상위 답변:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;const prefix = 'prefix'
const classes = el.attr('class').split(' ').filter(c =&amp;gt; !c.startsWith(prefix))
el.attr('class', classes.join(' ').trim())
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;$(&quot;#element&quot;).removeAttr(&quot;class&quot;).addClass(&quot;yourClass&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/57812/remove-all-classes-that-begin-with-a-certain-string&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>jquery</category>
      <author>powerit</author>
      <guid isPermaLink="true">https://powerit.tistory.com/1437</guid>
      <comments>https://powerit.tistory.com/1437#entry1437comment</comments>
      <pubDate>Sat, 4 Nov 2023 13:24:18 +0900</pubDate>
    </item>
    <item>
      <title>키캐시로 수리를 피하는 방법?</title>
      <link>https://powerit.tistory.com/1436</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;my.cnf 파일을 최적화한 경험이 있지만 데이터베이스에는 약 400만 개의 레코드(MyISAM)가 있습니다. mysq 덤프에서 복원하려고 하지만 그럴 때마다 결국 며칠이 걸릴 수 있는 무서운 &quot;키캐시를 사용한 복구&quot;를 얻습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 문제를 극복하고 &quot;Repair By Sorting&quot;(리페어 바이 소팅)으로 처리할 수 있는 방법이 있습니까?&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;2GB RAM, 듀얼 코어, 추가 하드 드라이브 공간이 많습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;내 .cnf에서 잘라냅니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;set-variable = max_connections=650
set-variable = key_buffer=256M
set-variable = myisam_sort_buffer_size=64M
set-variable = join_buffer=1M
set-variable = record_buffer=1M
set-variable = sort_buffer_size=2M
set-variable = read_buffer_size=2M
set-variable = query_cache_size=32M
set-variable = table_cache=1024
set-variable = thread_cache_size=256
set-variable = wait_timeout=7200
set-variable = connect_timeout=10
set-variable = max_allowed_packet=16M
set-variable = max_connect_errors=10
set-variable = thread_concurrency=8
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;정렬에 의한 복구는 파일 정렬 루틴을 사용하여 tmpdir에 여러 임시 파일(보통)을 만듭니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;tmpdir에 공간이 충분하지 않으면 &quot;키 캐시로 복구&quot;로 돌아갑니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이는 훨씬 느리고 최적의 인덱스를 덜 생성하기 때문에 매우 좋지 않습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다른 조건들도 있지만 저는 그것들을 확인하지 못했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;파일 sort()에 필요한 tmpdir의 크기를 구하는 것은 간단한 일이 아닙니다. 포맷 데이터가 파일 sort에 저장되는 것은 MYD 파일과 동일하지 않기 때문에 일반적으로 훨씬 더 많은 공간을 사용합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;따라서 tmpdir가 작은 /tmp(또는 tmpfs)를 가리키면 더 큰 /var/tmp로 변경할 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;MySQL은 테이블 인덱스의 가능한 최대 크기가 변수 myisam_max_sort_file_size의 값보다 클 때마다 MyISAM 테이블에 대해 키 캐시별 복구를 사용합니다.&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;myisam_max_sort_file_size를 늘리면 slow keycache 메서드 대신 디스크 정렬을 사용하여 인덱스가 재구성됩니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;fast reg.mysam_max_sort_file_size로 설정하지 않은 새 데이터베이스에서 실수로 수리 테이블을 빠르게 실행했는데, 이는 에 비해 너무 작았습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;MID 파일(88279393280 바이트 크기, 약 88GB)&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;데이터 파일은 85GB입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 표는 12억 개의 기록으로 ID, 날짜 두 개, 작은 텍스트, 몇 개의 빅인트와 더블로 구성되어 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제 서버(윈도우 7 아래 박스에서 실행되는 2GB 가상 리눅스)는 윈도우 서버에 4개의 코어 중 하나만 있지만 3+GHZ를 실행하고 있습니다.&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;다행히 수리대 빠른 작동을 완료하는 데는 1일 10시간 20.72초가 걸렸습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제가 가장 그리워하는 것은 그 mysql이 어디까지 작동하고 얼마나 빨리 끝날 수 있는지를 아는 방법입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것은 아직 나에게는 알려지지 않았습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;나는 지금 내.ini 파일을 변경하고 df에 그 큰 임시 파일들을 위한 충분한 디스크 공간이 있는지 다시 한번 확인했습니다.&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;당황하지 마세요! 느릴 수도 있지만, 10억 개 이상의 기록을 하루나 이틀 안에 정리할 수 있는 수준 이하의 하드웨어라면 가능합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하나는 날짜 필드, 하나는 비긴트 필드, 하나는 ID 필드에 있는 기본 인덱스 세 개가 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것을 솔루션 중 하나에 대한 의견으로 게시하고 싶지만, 여기 사용자 인터페이스를 사용하면 어떻게 해야 할지 모르겠어서 솔루션으로 게시하겠습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저를 지지하지 마세요. 단지 제가 여기에 가지고 싶어했을 메모입니다. 일주일 이상 걸릴 수 있다고 생각했기 때문에 &quot;키캐시별&quot; 스레드를 거의 죽일 뻔했습니다. 10억 개당 2일은 관리할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;편집: 그리고 지금은 같은 데이터베이스에 복구 테이블이 있지만 충분히 큰 mysiam_max_sort_file_size 설정으로 정렬하여 복구하는 데 10시간 20분이 걸렸습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;가장 많이 사용된 디스크 공간은 약 250GB였지만 서버에서 실제로 사용 가능한 디스크 공간이 얼마나 되는지를 반영하여 myisam_max_sort_file_size를 훨씬 더 높게 설정했습니다.&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;개별 인덱스를 작성하는 동안 디스크 공간이 오르락내리락했지만, 디스크 공간 사용량과 같은 변경 사항이 없는 몇 시간 동안의 일시 중지가 있었습니다(df에서 보고한 바와 같이).&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;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것은 제가 해결책을 마련하기 위해 한 일입니다. 왜냐하면 그것이 가리키는 사실을 겪지 않을 것이기 때문입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;/tmp/mysqltmp/&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;, 최대 2MB 밖에 없었습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그래서 저는 이렇게 했습니다.&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;mkdir /home/mysqltmp

chown mysql:mysql /home/mysqltmp
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;내.conf의 tmp dir를 다음으로 변경했습니다.&lt;/font&gt;&lt;/strong&gt; &lt;code&gt;tmpdir=/home/mysqltmp/&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;df -h /home/mysqltmp&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;, 제가 보기에 dir는 285GB를 사용할 수 있습니다. 그래서 그것은 정말 보기 좋은 광경이었고, 충분한 여유 공간이 있었고, 또한 mysql이 20GB를 쉽게 원하는 것을 볼 수 있었습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그래서 지금까지 12시간이 걸렸던 것은 20분 안에 완료되었습니다. 인덱스에 삽입되는 300만개가 넘는 레코드입니다.&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;myisam_sort_buffer_size&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;변수 또는 내가 어디서 만들었는지.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;tmpdir&lt;/code&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;myisamchk&lt;/code&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;myisamchk --sort-recover --sort_buffer_size=14G /path/to/table
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여기서:&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;p&gt;&lt;code&gt;/path/to/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;.MYI&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;/var/lib/mysql/your_database&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;버퍼 크기를 다음에서 변경합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;14G&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;빈 공간이 어디든 상관없어요&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;추가 보너스로 데이터를 전환할 때 진행 중인 진행 상황도 표시합니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;MySQL 참조 매뉴얼에 따르면 디스크 공간은 &quot;&lt;em&gt;원래 인덱스 파일이 있는 디렉터리를 포함하는 파일 시스템&lt;/em&gt;에서&quot; 사용 가능해야 합니다(http://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html#sysvar_myisam_max_sort_file_size) -- 이는 (적어도) v5.0 이상에 적용됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것은 tmp 디렉토리에 대한 디스크 공간을 늘리는 것이 도움이 된다는 위의 답변들 중 일부와 모순됩니다.&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;*.MYD&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;) &amp;amp; 인덱스 파일(&lt;/font&gt;&lt;/font&gt;&lt;code&gt;*.MYI&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;)에 저장되지만 에 저장되지는 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;tmpdir&lt;/code&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/1067367/how-to-avoid-repair-with-keycache&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>MYSQL</category>
      <author>powerit</author>
      <guid isPermaLink="true">https://powerit.tistory.com/1436</guid>
      <comments>https://powerit.tistory.com/1436#entry1436comment</comments>
      <pubDate>Sat, 4 Nov 2023 13:24:10 +0900</pubDate>
    </item>
    <item>
      <title>행을 반환하지 않는 쿼리의 기본 행을 설정하는 방법은 무엇입니까?</title>
      <link>https://powerit.tistory.com/1435</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;행을 반환하지 않는 쿼리의 기본 행을 설정하는 방법은 무엇입니까?&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;테이블에 행이 없는 경우 기본 행을 반환하는 방법을 알아야 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것을 하는 가장 좋은 방법은 무엇입니까?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 가치를 얻기 위해 이 특정 테이블에서 한 열만 반환할 뿐입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;편집: SQL Server 입니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Oracle을 위한 한 가지 접근 방식:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;SELECT val
FROM myTable
UNION ALL
SELECT 'DEFAULT'
FROM dual
WHERE NOT EXISTS (SELECT * FROM myTable)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;또는 Oracle의 경우:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;SELECT NVL(MIN(val), 'DEFAULT')
FROM myTable
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;또는 SqlServer에서:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;SELECT ISNULL(MIN(val), 'DEFAULT')
FROM myTable
&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;MIN()&lt;/code&gt;&lt;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;기본 쿼리가 한 행만 반환할 것으로 예상되는 경우 다음과 같은 방법을 사용할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;select NVL( MIN(rate), 0 ) AS rate 
from d_payment_index
where fy = 2007
  and payment_year = 2008
  and program_id = 18
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;(Oracle 코드, NVL이 SQL Server에 적합한 기능인지 확실하지 않음)&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;Declare @rate int

select 
    @rate = rate 
from 
    d_payment_index
where 
    fy = 2007
    and payment_year = 2008
    and program_id = 18

IF @@rowcount = 0
    Set @rate = 0

Select @rate 'rate'
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이거 어때:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;SELECT DEF.Rate, ACTUAL.Rate, COALESCE(ACTUAL.Rate, DEF.Rate) AS UseThisRate
FROM 
  (SELECT 0) DEF (Rate) -- This is your default rate
LEFT JOIN (
  select rate 
  from d_payment_index
  --WHERE 1=2   -- Uncomment this line to simulate a missing value

  --...HERE IF YOUR ACTUAL WHERE CLAUSE. Removed for testing purposes...
  --where fy = 2007
  -- and payment_year = 2008
  --  and program_id = 18
) ACTUAL (Rate) ON 1=1
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;결과.&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;em&gt;&lt;font papago-translate=&quot;translated&quot;&gt;유효한 요금이 존재&lt;/font&gt;&lt;/em&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Rate        Rate        UseThisRate
----------- ----------- -----------
0           1           1
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;em&gt;&lt;font papago-translate=&quot;translated&quot;&gt;기본 사용률&lt;/font&gt;&lt;/em&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Rate        Rate        UseThisRate
----------- ----------- -----------
0           NULL        0
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;테스트 DDL&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;CREATE TABLE d_payment_index (rate int NOT NULL)
INSERT INTO d_payment_index VALUES (1)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 토막글에서는 공통 테이블 표현식을 사용하여 중복 코드를 줄이고 가독성을 높입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것은 존 보먼의 대답을 변형한 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;구문은 SQL Server에 대한 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;WITH products AS (
            SELECT prod_name,
                   price
              FROM Products_Table
             WHERE prod_name LIKE '%foo%'
     ),
     defaults AS (
            SELECT '-' AS prod_name,
                   0   AS price
     )

SELECT * FROM products
UNION ALL
SELECT * FROM defaults
 WHERE NOT EXISTS ( SELECT * FROM products );
&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;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;기본 키가 &quot;id&quot;인 리뷰 테이블이 있다고 가정합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;SELECT * FROM review WHERE id = 1555
UNION ALL
SELECT * FROM review WHERE NOT EXISTS ( SELECT * FROM review where id = 1555 ) AND id = 1
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;테이블에 1555 id의 리뷰가 없다면 이 쿼리는 id 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;WW의 답변을 변형한 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;select rate 
from d_payment_index
where fy = 2007
  and payment_year = 2008
  and program_id = 18
union
select 0 as rate 
from d_payment_index 
where not exists( select rate 
                  from d_payment_index
                  where fy = 2007
                    and payment_year = 2008
                    and program_id = 18 )
&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;CREATE TABLE [stackoverflow-285666] (k int, val varchar(255))

INSERT  INTO [stackoverflow-285666]
VALUES  (1, '1-1')
INSERT  INTO [stackoverflow-285666]
VALUES  (1, '1-2')
INSERT  INTO [stackoverflow-285666]
VALUES  (1, '1-3')
INSERT  INTO [stackoverflow-285666]
VALUES  (2, '2-1')
INSERT  INTO [stackoverflow-285666]
VALUES  (2, '2-2')

DECLARE @k AS int
SET @k = 0

WHILE @k &amp;lt; 3
    BEGIN
        SELECT  @k AS k
               ,COALESCE(ActualValue, DefaultValue) AS [Value]
        FROM    (
                 SELECT 'DefaultValue' AS DefaultValue
                ) AS Defaults
        LEFT JOIN (
                   SELECT   val AS ActualValue
                   FROM     [stackoverflow-285666]
                   WHERE    k = @k
                  ) AS [Values]
                ON 1 = 1

        SET @k = @k + 1
    END

DROP TABLE [stackoverflow-285666]
&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;k           Value
----------- ------------
0           DefaultValue

k           Value
----------- ------------
1           1-1
1           1-2
1           1-3

k           Value
----------- ------------
2           2-1
2           2-2
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;테이블이 있다고 가정할 때&lt;/font&gt;&lt;/font&gt;&lt;code&gt;config&lt;/code&gt;&lt;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_code&lt;/code&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;CONFIG_CODE     PARAM1   PARAM2
--------------- -------- --------
default_config  def      000
config1         abc      123
config2         def      456
&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;config1&lt;/code&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-sql prettyprint-override&quot;&gt;&lt;code&gt;SELECT *
  FROM (SELECT *
          FROM config
         WHERE config_code = 'config1'
            OR config_code = 'default_config'
         ORDER BY CASE config_code WHEN 'default_config' THEN 999 ELSE 1 END)
 WHERE rownum = 1;
&lt;/code&gt;&lt;/pre&gt; 
&lt;pre&gt;&lt;code&gt;CONFIG_CODE     PARAM1   PARAM2
--------------- -------- --------
config1         abc      123
&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;config3&lt;/code&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-sql prettyprint-override&quot;&gt;&lt;code&gt;SELECT *
  FROM (SELECT *
          FROM config
         WHERE config_code = 'config3'
            OR config_code = 'default_config'
         ORDER BY CASE config_code WHEN 'default_config' THEN 999 ELSE 1 END)
 WHERE rownum = 1;
&lt;/code&gt;&lt;/pre&gt; 
&lt;pre&gt;&lt;code&gt;CONFIG_CODE     PARAM1   PARAM2
--------------- -------- --------
default_config  def      000
&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;config&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;단 한 번&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;전체 행을 반환하시겠습니까?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;기본 행에 기본값이 있어야 합니까 아니면 빈 행이 될 수 있습니까?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;기본 행의 열 구조가 문제의 테이블과 같도록 하시겠습니까?&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;1) 쿼리를 실행하고 결과를 임시 테이블(또는 테이블 변수)에 넣습니다. 2) 임시 테이블에 결과가 있는지 확인합니다. 3) 그렇지 않은 경우 이와 유사한 선택 문을 수행하여 빈 행을 반환합니다(SQL Server에서).&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;select '' as columnA, '' as columnB, '' as columnC from #tempTable
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여기서 열 A, 열 B 및 열 C는 실제 열 이름입니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;테이블 변수에 기본값을 삽입한 다음 이 tableVar의 단일 행을 실제 테이블과 일치시키는 것으로 업데이트합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;행이 발견되면 tableVar가 업데이트되고, 발견되지 않으면 기본값이 유지됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;테이블 변수를 반환합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;    ---=== The table &amp;amp; its data
    CREATE TABLE dbo.Rates (
        PkId int,
        name varchar(10),
        rate decimal(10,2)
    )
    INSERT INTO dbo.Rates(PkId, name, rate) VALUES (1, 'Schedule 1', 0.1)
    INSERT INTO dbo.Rates(PkId, name, rate) VALUES (2, 'Schedule 2', 0.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;---=== The solution 
CREATE PROCEDURE dbo.GetRate 
  @PkId int
AS
BEGIN
  DECLARE @tempTable TABLE (
    PkId int, 
    name varchar(10), 
    rate decimal(10,2)
 )

 --- [1] Insert default values into @tempTable. PkId=0 is dummy value  
 INSERT INTO @tempTable(PkId, name, rate) VALUES (0, 'DEFAULT', 0.00)

 --- [2] Update the single row in @tempTable with the actual value.
 ---     This only happens if a match is found
 UPDATE @tempTable
    SET t.PkId=x.PkId, t.name=x.name, t.rate = x.rate
    FROM @tempTable t INNER JOIN dbo.Rates x
    ON t.PkId = 0
    WHERE x.PkId = @PkId

 SELECT * FROM @tempTable
END
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;코드 테스트:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;EXEC dbo.GetRate @PkId=1     --- returns values for PkId=1
EXEC dbo.GetRate @PkId=12314 --- returns default values
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;값이 없는 경우 기본값을 얻을 때 사용한 값입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;
    SELECT IF (
        (SELECT COUNT(*) FROM tbs.replication_status) &amp;gt; 0, 
        (SELECT rs.last_replication_end_date FROM tbs.replication_status AS rs 
            WHERE rs.last_replication_start_date IS NOT NULL 
                AND rs.last_replication_end_date IS NOT NULL 
                AND rs.table = '%s' ORDER BY id DESC LIMIT 1), 
        (SELECT CAST(UNIX_TIMESTAMP (CURRENT_TIMESTAMP(6)) AS UNSIGNED))
    ) AS ts;
&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/285666/how-to-set-a-default-row-for-a-query-that-returns-no-rows&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>sql-server</category>
      <author>powerit</author>
      <guid isPermaLink="true">https://powerit.tistory.com/1435</guid>
      <comments>https://powerit.tistory.com/1435#entry1435comment</comments>
      <pubDate>Sat, 4 Nov 2023 13:24:03 +0900</pubDate>
    </item>
    <item>
      <title>Android Gradle 플러그인 0.7.0: &amp;quot;APK 패키징 중 파일 중복&amp;quot;</title>
      <link>https://powerit.tistory.com/1434</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Android Gradle 플러그인 0.7.0: &quot;APK 패키징 중 파일 중복&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;다음과 함께 Android Gradle 플러그인 0.7.0 사용&lt;/font&gt;&lt;/font&gt;&lt;code&gt;build.gradle&lt;/code&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;buildscript {
    repositories {
        mavenCentral()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:0.7.0'
    }
}

apply plugin: 'android'

repositories {
    maven { url &quot;https://android-rome-feed-reader.googlecode.com/svn/maven2/releases&quot; }
    maven { url &quot;http://dl.bintray.com/populov/maven&quot; }
    mavenCentral()
}

android {
    compileSdkVersion 19
    buildToolsVersion '18.1.1'

    defaultConfig {
        minSdkVersion 9
        targetSdkVersion 19
    }
    buildTypes {
        release {
            runProguard true
            proguardFile getDefaultProguardFile('proguard-android-optimize.txt')
        }
    }
    productFlavors {
        defaultFlavor {
            proguardFile 'proguard-rules.txt'
        }
    }
    sourceSets {
        instrumentTest.setRoot('src/instrumentTest')
    }
}

configurations {
    apt
}

ext.androidAnnotationsVersion = '2.7.1';

dependencies {
    compile 'com.android.support:support-v4:18.0.0'

    compile 'com.viewpagerindicator:library:2.4.1@aar'

    compile 'com.google.code.android-rome-feed-reader:android-rome-feed-reader:1.0.0-r2'
    compile 'org.jdom:jdom:1.1.1-android-fork'

    apt &quot;com.googlecode.androidannotations:androidannotations:${androidAnnotationsVersion}&quot;
    compile &quot;com.googlecode.androidannotations:androidannotations-api:${androidAnnotationsVersion}&quot;

    compile 'com.google.code.gson:gson:2.2.4'
    compile 'com.j256.ormlite:ormlite-android:4.47'
    compile 'com.j256.ormlite:ormlite-core:4.47'
    compile 'org.springframework.android:spring-android-core:1.0.1.RELEASE'
    compile 'org.springframework.android:spring-android-rest-template:1.0.1.RELEASE'
    compile 'com.prolificinteractive:actionbarsherlock:4.3.1@aar'

    compile 'com.google.code.geocoder-java:geocoder-java:0.15'

    compile files('libs/CWAC-Pager.jar')
}

android.applicationVariants.all { variant -&amp;gt;
    aptOutput = file(&quot;${project.buildDir}/source/apt_generated/${variant.dirName}&quot;)
    println &quot;****************************&quot;
    println &quot;variant: ${variant.name}&quot;
    println &quot;manifest:  ${variant.processResources.manifestFile}&quot;
    println &quot;aptOutput:  ${aptOutput}&quot;
    println &quot;****************************&quot;

    variant.javaCompile.doFirst {
        println &quot;*** compile doFirst ${variant.name}&quot;
        aptOutput.mkdirs()
        variant.javaCompile.options.compilerArgs += [
                '-processorpath', configurations.apt.getAsPath(),
                '-AandroidManifestFile=' + variant.processResources.manifestFile,
                '-s', aptOutput
        ]
    }
}
&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;Duplicate files copied in APK META-INF/LICENSE.txt&lt;/code&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;WARNING: Dependency commons-logging:commons-logging:1.0.4 is ignored for defaultFlavorDebug as it may be conflicting with the internal version provided by Android.
         In case of problem, please repackage it with jarjar to change the class packages
WARNING: Dependency commons-logging:commons-logging:1.0.4 is ignored for defaultFlavorRelease as it may be conflicting with the internal version provided by Android.
         In case of problem, please repackage it with jarjar to change the class packages
Creating properties on demand (a.k.a. dynamic properties) has been deprecated and is scheduled to be removed in Gradle 2.0. Please read http://gradle.org/docs/current/dsl/org.gradle.api.plugins.ExtraPropertiesExtension.html for information on the replacement for dynamic properties.
Deprecated dynamic property: &quot;aptOutput&quot; on &quot;com.android.build.gradle.internal.api.ApplicationVariantImpl_Decorated@5705013c&quot;, value: &quot;/Users/david/Developer...&quot;.
****************************
variant: defaultFlavorDebug
manifest:  /Users/david/Developer/.../build/manifests/defaultFlavor/debug/AndroidManifest.xml
aptOutput:  /Users/david/Developer/.../build/source/apt_generated/defaultFlavor/debug
****************************
Deprecated dynamic property &quot;aptOutput&quot; created in multiple locations.
****************************
variant: defaultFlavorRelease
manifest:  /Users/david/Developer/.../build/manifests/defaultFlavor/release/AndroidManifest.xml
aptOutput:  /Users/david/Developer/.../build/source/apt_generated/defaultFlavor/release
****************************
:TravelGuard:compileDefaultFlavorDebugNdk UP-TO-DATE
:TravelGuard:preBuild UP-TO-DATE
:TravelGuard:preDefaultFlavorDebugBuild UP-TO-DATE
:TravelGuard:preDefaultFlavorReleaseBuild UP-TO-DATE
:TravelGuard:prepareComProlificinteractiveActionbarsherlock431Library UP-TO-DATE
:TravelGuard:prepareComViewpagerindicatorLibrary241Library UP-TO-DATE
:TravelGuard:prepareDefaultFlavorDebugDependencies
:TravelGuard:compileDefaultFlavorDebugAidl UP-TO-DATE
:TravelGuard:compileDefaultFlavorDebugRenderscript UP-TO-DATE
:TravelGuard:generateDefaultFlavorDebugBuildConfig UP-TO-DATE
:TravelGuard:mergeDefaultFlavorDebugAssets UP-TO-DATE
:TravelGuard:mergeDefaultFlavorDebugResources UP-TO-DATE
:TravelGuard:processDefaultFlavorDebugManifest UP-TO-DATE
:TravelGuard:processDefaultFlavorDebugResources UP-TO-DATE
:TravelGuard:generateDefaultFlavorDebugSources UP-TO-DATE
:TravelGuard:compileDefaultFlavorDebugJava
*** compile doFirst defaultFlavorDebug
/Users/david/Developer/.../src/main/java/com/travelguard/service/TravelGuardService.java:53: cannot find symbol
symbol  : class TravelGuardPrefs_
location: class com.travelguard.service.TravelGuardService
    TravelGuardPrefs_ travelGuardPrefs;
    ^
/Users/david/Developer/.../src/main/java/com/travelguard/ui/CategoriesActivity.java:14: cannot find symbol
symbol  : class AssistanceFragment_
location: package com.travelguard.ui.fragments
import com.travelguard.ui.fragments.AssistanceFragment_;
                                   ^
/Users/david/Developer/.../src/main/java/com/travelguard/ui/CategoriesActivity.java:16: cannot find symbol
symbol  : class CategoryFragment_
location: package com.travelguard.ui.fragments
import com.travelguard.ui.fragments.CategoryFragment_;
                                   ^
/Users/david/Developer/.../src/main/java/com/travelguard/ui/CategoriesActivity.java:17: cannot find symbol
symbol  : class ContactFragment_
location: package com.travelguard.ui.fragments
import com.travelguard.ui.fragments.ContactFragment_;
                                   ^
/Users/david/Developer/.../src/main/java/com/travelguard/ui/CountriesActivity.java:25: cannot find symbol
symbol  : class TravelGuardPrefs_
location: package com.travelguard.service
import com.travelguard.service.TravelGuardPrefs_;
                              ^
/Users/david/Developer/.../src/main/java/com/travelguard/ui/CountriesActivity.java:44: cannot find symbol
symbol  : class TravelGuardPrefs_
location: class com.travelguard.ui.CountriesActivity
    TravelGuardPrefs_ travelGuardPrefs;
    ^
/Users/david/Developer/.../src/main/java/com/travelguard/ui/InstructionsActivity.java:18: cannot find symbol
symbol  : class AssistanceFragment_
location: package com.travelguard.ui.fragments
import com.travelguard.ui.fragments.AssistanceFragment_;
                                   ^
/Users/david/Developer/.../src/main/java/com/travelguard/ui/InstructionsActivity.java:19: cannot find symbol
symbol  : class ContactFragment_
location: package com.travelguard.ui.fragments
import com.travelguard.ui.fragments.ContactFragment_;
                                   ^
/Users/david/Developer/.../src/main/java/com/travelguard/ui/InstructionsActivity.java:21: cannot find symbol
symbol  : class InstructionsFragment_
location: package com.travelguard.ui.fragments
import com.travelguard.ui.fragments.InstructionsFragment_;
                                   ^
/Users/david/Developer/.../src/main/java/com/travelguard/ui/MainActivity.java:36: cannot find symbol
symbol  : class TravelGuardPrefs_
location: package com.travelguard.service
import com.travelguard.service.TravelGuardPrefs_;
                              ^
/Users/david/Developer/.../src/main/java/com/travelguard/ui/MainActivity.java:40: cannot find symbol
symbol  : class AssistanceFragment_
location: package com.travelguard.ui.fragments
import com.travelguard.ui.fragments.AssistanceFragment_;
                                   ^
/Users/david/Developer/.../src/main/java/com/travelguard/ui/MainActivity.java:41: cannot find symbol
symbol  : class ContactFragment_
location: package com.travelguard.ui.fragments
import com.travelguard.ui.fragments.ContactFragment_;
                                   ^
/Users/david/Developer/.../src/main/java/com/travelguard/ui/MainActivity.java:55: cannot find symbol
symbol  : class TravelGuardPrefs_
location: class com.travelguard.ui.MainActivity
    TravelGuardPrefs_ travelGuardPrefs;
    ^
/Users/david/Developer/.../src/main/java/com/travelguard/ui/TermsActivity.java:17: cannot find symbol
symbol  : class TravelGuardPrefs_
location: package com.travelguard.service
import com.travelguard.service.TravelGuardPrefs_;
                              ^
/Users/david/Developer/.../src/main/java/com/travelguard/ui/TermsActivity.java:23: cannot find symbol
symbol  : class TravelGuardPrefs_
location: class com.travelguard.ui.TermsActivity
    TravelGuardPrefs_ travelGuardPrefs;
    ^
Note: Starting AndroidAnnotations annotation processing
Note: AndroidManifest.xml file found: /Users/david/Developer/.../build/manifests/defaultFlavor/debug/AndroidManifest.xml
Note: Number of files generated by AndroidAnnotations: 22
Note: Generating source file: com.travelguard.service.SmartTravellerService_
Note: Generating source file: com.travelguard.service.SmartTravellerWebservice_
Note: Generating source file: com.travelguard.service.TravelGuardPrefs_
Note: Generating source file: com.travelguard.service.TravelGuardService_
Note: Generating source file: com.travelguard.service.TravelGuardWebservice_
Note: Generating source file: com.travelguard.ui.AdviceActivity_
Note: Generating source file: com.travelguard.ui.CategoriesActivity_
Note: Generating source file: com.travelguard.ui.ContactDetailActivity_
Note: Generating source file: com.travelguard.ui.ContactListActivity_
Note: Generating source file: com.travelguard.ui.ContactTravelGuardActivity_
Note: Generating source file: com.travelguard.ui.CountriesActivity_
Note: Generating source file: com.travelguard.ui.InformationActivity_
Note: Generating source file: com.travelguard.ui.InstructionsActivity_
Note: Generating source file: com.travelguard.ui.MainActivity_
Note: Generating source file: com.travelguard.ui.TermsActivity_
Note: Generating source file: com.travelguard.ui.TravelGuardActivity_
Note: Generating source file: com.travelguard.ui.fragments.AdviceDetailFragment_
Note: Generating source file: com.travelguard.ui.fragments.AdviceFragment_
Note: Generating source file: com.travelguard.ui.fragments.AssistanceFragment_
Note: Generating source file: com.travelguard.ui.fragments.CategoryFragment_
Note: Generating source file: com.travelguard.ui.fragments.ContactFragment_
Note: Generating source file: com.travelguard.ui.fragments.InstructionsFragment_
Note: Time measurements: [Whole Processing = 913 ms], [Generate Sources = 358 ms], [Extract Manifest = 163 ms], [Process Annotations = 158 ms], [Extract Annotations = 120 ms], [Validate Annotations = 82 ms], [Find R Classes = 28 ms],
Note: Time measurements: [Whole Processing = 0 ms],
Note: Time measurements: [Whole Processing = 0 ms],
warning: The following options were not recognized by any processor: '[androidManifestFile]'
Note: /Users/david/Developer/.../src/main/java/com/travelguard/ui/ContactDetailActivity.java uses or overrides a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
Note: /Users/david/Developer/.../src/main/java/com/travelguard/service/SmartTravellerService.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
:TravelGuard:preDexDefaultFlavorDebug UP-TO-DATE
:TravelGuard:dexDefaultFlavorDebug
:TravelGuard:processDefaultFlavorDebugJavaRes UP-TO-DATE
:TravelGuard:validateDebugSigning
:TravelGuard:packageDefaultFlavorDebug
Error: duplicate files during packaging of APK /Users/david/Developer/.../build/apk/TravelGuard-defaultFlavor-debug-unaligned.apk
    Path in archive: META-INF/LICENSE.txt
    Origin 1: /Users/david/.gradle/caches/modules-2/files-2.1/commons-httpclient/commons-httpclient/3.1/964cd74171f427720480efdec40a7c7f6e58426a/commons-httpclient-3.1.jar
    Origin 2: /Users/david/.gradle/caches/modules-2/files-2.1/commons-codec/commons-codec/1.2/397f4731a9f9b6eb1907e224911c77ea3aa27a8b/commons-codec-1.2.jar
:TravelGuard:packageDefaultFlavorDebug FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':TravelGuard:packageDefaultFlavorDebug'.
&amp;gt; Duplicate files copied in APK META-INF/LICENSE.txt
    File 1: /Users/david/.gradle/caches/modules-2/files-2.1/commons-httpclient/commons-httpclient/3.1/964cd74171f427720480efdec40a7c7f6e58426a/commons-httpclient-3.1.jar
    File 2: /Users/david/.gradle/caches/modules-2/files-2.1/commons-httpclient/commons-httpclient/3.1/964cd74171f427720480efdec40a7c7f6e58426a/commons-httpclient-3.1.jar


* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

BUILD FAILED

Total time: 21.957 secs
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;안드로이드 스튜디오를 업데이트하기 전에 오늘 아침은 잘 작동했습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;무슨 생각 있어요?&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;편집: 다음과 같은 명령을 실행하여 일시적으로 수정할 수 있었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;zip -d spring-android-core-1.0.1.RELEASE.jar META-INF/notice.txt
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;모든 중복된 오류가 사라질 때까지요&lt;/font&gt;&lt;/p&gt;&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Android Studio 버전 0.8.14 기준&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; android {
     packagingOptions { 
         exclude 'META-INF/LICENSE.txt'
         exclude 'META-INF/NOTICE.txt'
         exclude '...'
     }
 }  
&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;build.gradle&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;파일.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;h3&gt;&lt;font papago-translate=&quot;translated&quot;&gt;기록:&lt;/font&gt;&lt;/h3&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 버그의 코멘트 14에 따르면 https://issuetracker.google.com/issues/36982149#comment14 이 버그는 Android Gradle 플러그인 v0.7.0의 버그이며 0.7.1에서 곧 수정될 예정입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;0.7.1의 추가에 대한 버그의 메모는 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;0.7.1은 이것에 대한 수정을 하지 않았습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;파일을 제외할 DSL은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;android {
    packagingOptions {
        exclude 'META-INF/LICENSE.txt'
    }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제외 문을 원하는 만큼 추가할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;값은 아카이브 경로입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;와일드카드나 글로벌 지원이 아직 없습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;파일 이름 &quot;LICENCE.txt&quot; 및 &quot;NOTICE.txt&quot;는 대소문자를 구분합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&quot;라이선스&quot;로 시험해보세요.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;txt&quot; 및 &quot;notice&quot;.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;txt&quot;도 포함됩니다.&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;pre class=&quot;lang-html prettyprint-override&quot;&gt;&lt;code&gt;android {
    packagingOptions {
        exclude 'META-INF/DEPENDENCIES.txt'
        exclude 'META-INF/DEPENDENCIES'
        exclude 'META-INF/dependencies.txt'
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/license.txt'
        exclude 'META-INF/LGPL2.1'
        exclude 'META-INF/NOTICE.txt'
        exclude 'META-INF/NOTICE'
        exclude 'META-INF/notice.txt'
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;packagingOptions {
        exclude 'META-INF/DEPENDENCIES.txt'
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/NOTICE.txt'
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/a/47828425/2371425&quot;&gt;사키보이 님&lt;/a&gt;의 댓글을 보세요!&lt;/font&gt;&lt;/p&gt; 
&lt;hr&gt; 
&lt;h1&gt;&lt;font papago-translate=&quot;translated&quot;&gt;시대에 뒤떨어진 대답&lt;/font&gt;&lt;/h1&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Gradle 0.9.1부터 다음을 지원합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-groovy prettyprint-override&quot;&gt;&lt;code&gt;android.packagingOptions {
    pickFirst 'META-INF/LICENSE.txt'
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그래들 &lt;a href=&quot;http://tools.android.com/tech-docs/new-build-system&quot; rel=&quot;nofollow noreferrer&quot;&gt;릴리스 노트&lt;/a&gt;에서 자세한 내용을 확인할 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Android Studio 0.8.6에서 라이브러리 httclient-4.3.5를 내보낼 때 필요한 동일한 문제는 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;packagingOptions{
    exclude 'META-INF/DEPENDENCIES'
    exclude 'META-INF/NOTICE'
    exclude 'META-INF/NOTICE.txt'
    exclude 'META-INF/LICENSE'
    exclude 'META-INF/LICENSE.txt'
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;라이브러리 zip에는 다음 병이 들어 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;commons-codec-1.6.jar
commons-logging-1.1.3.jar
fluent-hc-4.3.5.jar
httpclient-4.3.5.jar
httpclient-cache-4.3.5.jar
httpcore-4.3.2.jar
httpmime-4.3.5.jar
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 버그는 여전히 0.8+/1.10에 있습니다.&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;compile 'com.fasterxml.jackson.dataformat:jackson-dataformat-csv:2.2.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;exclude 'META-INF/services/com.fasterxml.jackson.core.JsonFactory'
&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;apply plugin: 'android-library'&lt;/code&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;추가::&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;android {
    packagingOptions {
        exclude 'META-INF/ASL2.0'
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/NOTICE'
    }
}
&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;JAR&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아래에&lt;/font&gt;&lt;/font&gt;&lt;code&gt;META-INF&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;오류의 원인이 무엇인지 확인해 보세요.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다중일 수도 있습니다.&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;안드로이드 스튜디오 1.0.1에서 'org.springframework.android:spring-android-rest-template:2.0.0.M1'을 사용했을 때도 같은 문제가 발생했습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것을 포함시켜야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;build.gradle&lt;/code&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;android{
...
    packagingOptions{
        exclude 'META-INF/notice.txt'
        exclude 'META-INF/license.txt'
    }
...
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것은 저에게 효과가 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;android {
   packagingOptions {
       exclude 'LICENSE.txt'
   }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;build.gradle&lt;/strong&gt;에 다음 옵션만 포함하면 될 것 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;packagingOptions {
        exclude 'META-INF/DEPENDENCIES'
        exclude 'META-INF/NOTICE'
        exclude 'META-INF/LICENSE'
    }
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;p.s 에 있는 나의 게시물에서 같은 답변 : Error &lt;a href=&quot;https://stackoverflow.com/questions/22467127/error-duplicate-files-during-packaging-of-apk/30911236#30911236&quot;&gt;:: APK의 패키징&lt;/a&gt; 중 &lt;a href=&quot;https://stackoverflow.com/questions/22467127/error-duplicate-files-during-packaging-of-apk/30911236#30911236&quot;&gt;중복파일&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;오픈 소스 라이브러리를 활용하여 개발자로서 역할을 수행하려면 오픈 소스 라이센스를 모두 포함하여 사용해야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;apk&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;. &lt;a href=&quot;https://google.github.io/android-gradle-dsl/current/com.android.build.gradle.internal.dsl.PackagingOptions.html#N13103&quot; rel=&quot;nofollow noreferrer&quot;&gt;이렇게&lt;/a&gt; 하려면 의 병합 방법을 사용할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;packagingOptions&lt;/code&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;pre&gt;&lt;code&gt;packagingOptions {
        // This will get include every license and notice regardless of what dir it’s in.
        merge '**/LICENSE.txt'
        merge '**/NOTICE.txt'
        merge '**/notice.txt'
        merge '**/license.txt'
        merge '**/NOTICE'
        merge '**/LICENSE'
        merge '**/notice'
        merge '**/license'
        merge '**/LGPL2.1'
        // This will exclude any README files, regardless of the dir or the file type.
        exclude '**/README.*'
}
&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;pickFirst&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;왜냐하면 이 방법은 처음에 찾은 &lt;strong&gt;라이선스&lt;/strong&gt;만 선택하고 나머지는 무시하기 때문에 이 경우에는 쓸모가 없어지기 때문입니다.&lt;/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;merge&lt;/code&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;Gradle&lt;/code&gt; &lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;포장 &lt;a href=&quot;https://google.github.io/android-gradle-dsl/current/com.android.build.gradle.internal.dsl.PackagingOptions.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;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;문제는 META-INF 폴더가 필터링되지 않아 여러 항목의&lt;/font&gt;&lt;/font&gt;&lt;code&gt;NOTICE&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아니면&lt;/font&gt;&lt;/font&gt;&lt;code&gt;LICENSE&lt;/code&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;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;열기&lt;/font&gt;&lt;/font&gt;&lt;code&gt;.jar&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;당신의 파일에.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;.gradle/caches/...&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;폴더(zip compatible tool 포함) 및 파일을 제거하거나 이름을 바꿉니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;META-INF&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;오류를 발생시키는 폴더(보통)&lt;/font&gt;&lt;/font&gt;&lt;code&gt;NOTICE&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아니면&lt;/font&gt;&lt;/font&gt;&lt;code&gt;LICENSE&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;). &lt;em&gt;(OP에서도 그것을 알고 있지만, 저에게는 구글 포럼&lt;/em&gt;을 읽기 &lt;em&gt;전까지는 확실히&lt;/em&gt; 알 수 &lt;em&gt;없었습니다.)&lt;/em&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;편집:&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이는 0.7.1에서 수정되었습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제외할 상충 파일만 추가하면 됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;android {
    packagingOptions {
        exclude 'META-INF/LICENSE'
    }
}
&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;dependencies {
    compile 'org.apache.oltu.oauth2:org.apache.oltu.oauth2.client:1.0.0'
}

packagingOptions {
    exclude 'META-INF/DEPENDENCIES'
    exclude 'META-INF/LICENSE'
    exclude 'META-INF/NOTICE'
}
&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;gradle 1.0.0에서 왜 아직도 이런 일이 일어나나요? 그것은 초보자들에게는 매우 불안한 일입니다.&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;어떤 파일에서 이 오류가 발생하는지 아는 것이 중요합니다(예: META-INF/LICENCE.txt입니다). 제 경우에는 [.txt&quot;가 없는] META-INF/LICENCE에 있었고, 그 다음에는 META-INF/ASL2.0 파일에 있어서 build.grade에 다음 행을 추가했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;android {
    packagingOptions {
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/ASL2.0'
    }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;매우 중요한 (!) -&amp;gt; 파일 이름을 같은 스타일로 추가합니다. 텍스트는 대소문자를 구분하고 *.txt와 *(&quot;txt&quot;가 없는) 차이가 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;나는 AOSP에서 이 커밋 코멘트를 알아챘습니다. 해결책은 DSL을 사용하는 일부 파일을 제외하는 것입니다. 아마도 0.7.1이 출시되면 가능할 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;commit e7669b24c1f23ba457fdee614ef7161b33feee69
Author: Xavier Ducrohet &amp;lt;---&amp;gt;
Date:   Thu Dec 19 10:21:04 2013 -0800

    Add DSL to exclude some files from packaging.

    This only applies to files coming from jar dependencies.
    The DSL is:

    android {
      packagingOptions {
        exclude 'META-INF/LICENSE.txt'
      }
    }
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제 경우에는 프로젝트의 build.gradle 파일에만 추가하면 됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;android {
  packagingOptions {
    exclude 'META-INF/notice.txt'
    exclude 'META-INF/license.txt'
  }

   ...
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;안드로이드 스튜디오 1.1.0에서는 소문자 이름이 필요했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;packagingOptions{
      exclude 'META-INF/license.txt'
      exclude 'META-INF/notice.txt'
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&quot;LICENCE.txt&quot; 및 &quot;NOTICE.txt&quot; 파일은 대소문자를 구분합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그래서 나는 SPRING 안드로이드 라이브러리를 추가해야 했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;android {
    packagingOptions {
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/NOTICE.txt'
        exclude 'META-INF/license.txt'
        exclude 'META-INF/notice.txt'
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;LICENCE에서 오류를 제거한 후 .txt를 제거하는 중:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;packagingOptions {
    exclude 'META-INF/LICENSE'
}
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;  packagingOptions {
    exclude 'META-INF/DEPENDENCIES.txt'
    exclude 'META-INF/DEPENDENCIES'
    exclude 'META-INF/dependencies.txt'
    exclude 'META-INF/LICENSE.txt'
    exclude 'META-INF/LICENSE'
    exclude 'META-INF/license.txt'
    exclude 'META-INF/LGPL2.1'
    exclude 'META-INF/NOTICE.txt'
    exclude 'META-INF/NOTICE'
    exclude 'META-INF/notice.txt'
}
&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/20673625/android-gradle-plugin-0-7-0-duplicate-files-during-packaging-of-apk&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>Android</category>
      <author>powerit</author>
      <guid isPermaLink="true">https://powerit.tistory.com/1434</guid>
      <comments>https://powerit.tistory.com/1434#entry1434comment</comments>
      <pubDate>Sat, 4 Nov 2023 13:23:53 +0900</pubDate>
    </item>
    <item>
      <title>활성 셀 옆에 사용자 양식을 정렬하려면 어떻게 해야 합니까?</title>
      <link>https://powerit.tistory.com/1433</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;활성 셀 옆에 사용자 양식을 정렬하려면 어떻게 해야 합니까?&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;지정된 범위의 셀을 클릭하면 열리는 월 단위 보기의 사용자 양식이 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 &lt;a href=&quot;https://stackoverflow.com/questions/24700052/position-userform-differently-for-each-activecell-clicked&quot;&gt;SO 스레드&lt;/a&gt;는 저에게 기본적인 대본을 주었습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사용자 양식을 제가 기대하는 곳에 두지 않습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;범위에 있는 셀을 클릭할 때 사용자 양식을 여는 스크립트(특정 워크시트에 배치)는 다음과 같습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;B3:C2000&lt;/code&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;Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Set oRange = Range(&quot;B3:C2000&quot;)
    If Not Intersect(Target, oRange) Is Nothing Then
        frmCalendar.Show
        frmCalendar.Top = ActiveCell.Offset(0, 0).Top
        frmCalendar.Left = ActiveCell.Offset(0, 1).Left
    End If
End Sub
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;질문 1: UserForm StartUpPosition 속성을 다음과 같이 설정했습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;0 - Manual&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;- 이것이 맞습니까?&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;질문 2: 지정된 범위의 셀을 클릭하면 워크북을 연 후 처음으로 화면의 왼쪽 맨 위에 항상 사용자 양식이 열립니다. 그 이유는 무엇입니까?&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;질문 3: 지정된 범위의 셀을 클릭하면 첫 번째 셀 이후의 클릭에 대해 방금 클릭한 셀 대신 이전에 활성화된 셀에 대한 사용자 양식이 열립니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이전 활성 셀이 아닌 방금 클릭한 셀에 대해 열리게 하려면 어떻게 해야 합니까?&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;질문 4: 상단 대신 사용자 양식 하단을 정렬하는 것처럼 보이는 이유는 무엇입니까?&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;1 - 셀 C15 클릭&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;2 - 사용자 양식 열기&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;3 - 사용자 양식 닫기&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;4 - 셀 16 클릭&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;5 - 사용자 양식 열기&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것이 제 눈에 보이는 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://i.stack.imgur.com/Qs5sI.png&quot; rel=&quot;nofollow noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/Qs5sI.png&quot; alt=&quot;Original result&quot;&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;편집: J. Garth의 솔루션을 구현한 후(Offset 속성을 (0, 2)로 변경한 후의 결과는 다음과 같습니다.&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://i.stack.imgur.com/KwRlM.png&quot; rel=&quot;nofollow noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/KwRlM.png&quot; alt=&quot;Correct result&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;질문 1: UserForm StartUpPosition 속성이 0 - Manual로 설정되어 있습니다. 이게 맞나요?&lt;/strong&gt;&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;네, 맞습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아래 코드에서 이 속성을 코드에 설정합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;질문 2: 지정된 범위의 셀을 클릭하면 워크북을 연 후 처음으로 화면의 왼쪽 맨 위에 항상 사용자 양식이 열립니다. 그 이유는 무엇입니까?&lt;/strong&gt;&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이에 대한 답은 3번 문제와 어느 정도 관련이 있다고 생각합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;양식을 열기 위한 기본 위치인 것 같습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;지금 코드를 가지고 있는 방법은 양식 상단과 왼쪽 좌표를 설정하려고 시도하는 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Worksheet_SelectionChange&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;strong&gt;질문 3: 지정된 범위의 셀을 클릭하면 첫 번째 셀 이후의 클릭에 대해 방금 클릭한 셀 대신 이전에 활성화된 셀에 대한 사용자 양식이 열립니다.&lt;/strong&gt;&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt; 이전 활성 셀이 아닌 방금 클릭한 셀에 대해 열리게 하려면 어떻게 해야 합니까?&lt;/strong&gt;&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 문제는 코드가 잘못된 위치에 있는 것과도 관련이 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;위에 언급한 바와 같이, 조정 설정은 사용자 양식 초기화 이벤트에서 이루어져야 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이전 활성 셀을 참조하는 이유에 관해서는 워크시트 선택 변경 이벤트가 완료될 때까지 활성 셀이 실제로 변경되지 않는 것으로 추측됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;따라서 이벤트 내에서 좌표를 설정하려는 경우(즉, 이벤트가 완료되기 전), 이전에 활성화된 셀을 얻는 것입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;코드를 올바른 위치로 이동하면 이 문제가 해결됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;질문 4: 상단 대신 사용자 양식 하단을 정렬하는 것처럼 보이는 이유는 무엇입니까?&lt;/strong&gt;&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;셀(범위)과 사용자 양식에 관한 &quot;위&quot;의 정의는 차이가 있는 것으로 보입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;셀 상단은 첫 번째 행에서 측정되는 반면 사용자 양식 상단은 엑셀 어플리케이션 상단에서 측정되는 것 같습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;즉, activecell.top과 userform.top이 모두 144인 경우, 화면에서 서로 다른 위치가 됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이는 엑셀 스프레드시트의 첫번째 행에서 활성 셀의 상단이 144포인트 내려간 반면, 사용자 양식의 상단은 엑셀 어플리케이션의 상단(즉, 엑셀 윈도우의 상단)에서 144포인트 내려간 상태이기 때문인데, 이는 시작점(엑셀 윈도우의 상단)이 A의 시작점보다 높기 때문에 화면에서 더 높은 것입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;ctivcell.top(스프레드시트의 첫번째 행).&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;상단 좌표에 사용자 폼의 높이와 활성 셀의 높이를 추가하여 조정할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;시트모듈코드&lt;/font&gt;&lt;/h2&gt; 
&lt;pre&gt;&lt;code&gt;Private Sub Worksheet_SelectionChange(ByVal target As Range)

    Dim oRange As Range

    Set oRange = Range(&quot;B3:C2000&quot;)
    If Not Intersect(target, oRange) Is Nothing Then
        frmCalendar.Show
    End If

End Sub
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;유저폼코드&lt;/font&gt;&lt;/h2&gt; 
&lt;pre&gt;&lt;code&gt;Private Sub UserForm_Initialize()

    With Me
        .StartUpPosition = 0
        .Top = ActiveCell.Top + ActiveCell.Height + .Height
        .Left = ActiveCell.Offset(0, 1).Left
    End With

End Sub
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;J. Garth가 제공한 답변은 &lt;em&gt;설명&lt;/em&gt;을 잘했지만, 제가 코멘트에서 언급했듯이, 이 특정한 상황에서는 효과가 있지만, 다양한 다른 시나리오(예: 줌 레벨 변경, 시트의 초기 가시 범위 밖의 대상 범위에서 분할/동결 창)에서는 실패합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;위치를 설정할 때 (줌 레벨이 변경될 수도 있는) 헤더 행/열과 폼 주변의 3D &quot;프레임/경계&quot;를 고려하지 않는 것은 말할 것도 없습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 며칠 동안 모든 가능성을 포괄할 수 있는 완전한 답변을 찾았는데, 거의 모든 시나리오에서 양식의 위치를 정확한 위치에 매우 가깝게 설정한 &lt;strong&gt;유일&lt;/strong&gt;한 사람은 MSDN 포럼에 대한 &lt;a href=&quot;https://social.msdn.microsoft.com/Forums/office/en-US/645bc25d-1fbe-4324-839a-9f4f2b58f697/activewindowpointstoscreenpixelsx-pointstoscreenpixelsy-requires-pixels-not-points-and-requires?forum=exceldev&quot; rel=&quot;noreferrer&quot; title=&quot;Points ToScreenPixels 함수 정보&quot; papago-attr-id=&quot;3&quot;&gt;논의&lt;/a&gt;의 결과로 작성된 신경질적인 &lt;a href=&quot;https://github.com/nervgh/vba/blob/master/GetRectForExcel2007Plus/test.xlsm_VBProject/mod_GetRectForExcel2007Plus.bas&quot; rel=&quot;noreferrer&quot; title=&quot;Excel 2007 Plus용 GetRect&quot; papago-attr-id=&quot;4&quot;&gt;답변&lt;/a&gt;이었습니다. 대부분의 공로는 분명히 그에게 돌아갔습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 하드코딩된 변수를 방지하고 코드 32비트와 64비트를 호환하며 폼 문제를 둘러싼 의문의 3D 프레임을 다루기 위해 다른 소스의 정보 및 코드를 다른 비트와 &quot;병합&quot;했습니다.&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;Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    UserForm1.Show
End Sub
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;유저폼코드&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Private Sub UserForm_Initialize()
  Dim pointcoordinates As pointcoordinatestype, horizontaloffsetinpoints As Double, verticaloffsetinpoints As Double
    With Me
        horizontaloffsetinpoints = (.Width - .InsideWidth) / 2
        verticaloffsetinpoints = 1 
        Call GetPointCoordinates(ActiveCell, pointcoordinates)
        .StartUpPosition = 0
        .Top = pointcoordinates.Top - verticaloffsetinpoints
        .Left = pointcoordinates.Left - horizontaloffsetinpoints
    End With
End Sub
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;모듈코드&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Private Const LOGPIXELSX = 88
Private Const LOGPIXELSY = 90
Public Type pointcoordinatestype
    Left As Double
    Top As Double
    Right As Double
    Bottom As Double
End Type
Private pixelsperinchx As Long, pixelsperinchy As Long, pointsperinch As Long, zoomratio As Double
#If VBA7 And Win64 Then
    Private Declare PtrSafe Function GetDeviceCaps Lib &quot;gdi32&quot; (ByVal hdc As LongPtr, ByVal nIndex As Long) As Long
    Private Declare PtrSafe Function GetDC Lib &quot;user32&quot; (ByVal hwnd As LongPtr) As LongPtr
    Private Declare PtrSafe Function ReleaseDC Lib &quot;user32&quot; (ByVal hwnd As LongPtr, ByVal hdc As LongPtr) As Long
#Else
    Private Declare Function GetDeviceCaps Lib &quot;gdi32&quot; (ByVal hdc As Long, ByVal nIndex As Long) As Long
    Private Declare Function GetDC Lib &quot;user32&quot; (ByVal hwnd As Long) As Long
    Private Declare Function ReleaseDC Lib &quot;user32&quot; (ByVal hwnd As Long, ByVal hdc As Long) As Long
#End If

Private Sub ConvertUnits()
  Dim hdc As LongPtr
    hdc = GetDC(0)
    pixelsperinchx = GetDeviceCaps(hdc, LOGPIXELSX) ' Usually 96
    pixelsperinchy = GetDeviceCaps(hdc, LOGPIXELSY) ' Usually 96
    ReleaseDC 0, hdc
    pointsperinch = Application.InchesToPoints(1)   ' Usually 72
    zoomratio = ActiveWindow.Zoom / 100
End Sub

Private Function PixelsToPointsX(ByVal pixels As Long) As Double
    PixelsToPointsX = pixels / pixelsperinchx * pointsperinch
End Function

Private Function PixelsToPointsY(ByVal pixels As Long) As Double
    PixelsToPointsY = pixels / pixelsperinchy * pointsperinch
End Function

Private Function PointsToPixelsX(ByVal points As Double) As Long
    PointsToPixelsX = points / pointsperinch * pixelsperinchx
End Function

Private Function PointsToPixelsY(ByVal points As Double) As Long
    PointsToPixelsY = points / pointsperinch * pixelsperinchy
End Function

Public Sub GetPointCoordinates(ByVal cellrange As Range, ByRef pointcoordinates As pointcoordinatestype)
  Dim i As Long
    ConvertUnits
    Set cellrange = cellrange.MergeArea
    For i = 1 To ActiveWindow.Panes.Count
        If Not Intersect(cellrange, ActiveWindow.Panes(i).VisibleRange) Is Nothing Then
            pointcoordinates.Left = PixelsToPointsX(ActiveWindow.Panes(i).PointsToScreenPixelsX(cellrange.Left))
            pointcoordinates.Top = PixelsToPointsY(ActiveWindow.Panes(i).PointsToScreenPixelsY(cellrange.Top))
            pointcoordinates.Right = pointcoordinates.Left + cellrange.Width * zoomratio
            pointcoordinates.Bottom = pointcoordinates.Top + cellrange.Height * zoomratio
            Exit Sub
        End If
    Next
End Sub
&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;strong&gt;&lt;em&gt;정확히&lt;/em&gt;&lt;/strong&gt; 있지 않다는 것입니다(즉, 1px 더 낮음). (짝수 번호 행의 경우 모든 것이 매끄럽습니다).).&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;em&gt;편집&lt;/em&gt;: 오늘 Timers와 함께 일하면서 위에서 나타난 홀수 행과 짝수 행의 차이를 피하는 방법을 알아냈습니다. 포인트 값과 출력(줌 비율뿐만 아니라)을 선언하는 문제였습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;As Double&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;(즉, 부동 소수점 숫자) 대신&lt;/font&gt;&lt;/font&gt;&lt;code&gt;As 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 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;verticaloffsetinpoints&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;(아직) 설명을 찾을 수 없었던 호기심 많은 (그러나 이번에는 일관된) &quot;예상보다 1px 낮은&quot; 수직 결함을 조정하는 변수.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;GetDeviceCaps, GetDC, Release를 선언하여&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Module 1의 DC기능, 클릭된 active cell 옆에 사용자 폼 정렬하였습니다. (32비트, 64비트 버전의 Excel에서 코드를 확인하였습니다.)&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://i.stack.imgur.com/636pp.gif&quot; rel=&quot;nofollow noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/636pp.gif&quot; alt=&quot;enter image description here&quot;&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Type POINTAPI
    X As Long
    Y As Long
End Type

#If VBA7 Then
    Declare PtrSafe Function GetDeviceCaps Lib &quot;gdi32&quot; (ByVal hDc As LongPtr, ByVal nIndex As Long) As Long
    Declare PtrSafe Function GetDC Lib &quot;user32&quot; (ByVal hwnd As LongPtr) As LongPtr
    Declare PtrSafe Function ReleaseDC Lib &quot;user32&quot; (ByVal hwnd As LongPtr, ByVal hDc As LongPtr) As Long
    Dim hDc As LongPtr
#Else
    Declare Function GetDeviceCaps Lib &quot;gdi32&quot; (ByVal hDc As Long, ByVal nIndex As Long) As Long
    Declare Function GetDC Lib &quot;user32&quot; (ByVal hwnd As Long) As Long
    Declare Function ReleaseDC Lib &quot;user32&quot; (ByVal hwnd As Long, ByVal hDc As Long) As Long
    Dim hDc As Long
#End If
...
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;a href=&quot;https://eksi30.com/add-date-to-cell-easily-with-excel-userform/#excel_place_userform_next_to_activecell&quot; rel=&quot;nofollow noreferrer&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;코드 소스 및 샘플 파일&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/41884148/how-do-i-align-a-userform-next-to-the-active-cell&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>Excel</category>
      <author>powerit</author>
      <guid isPermaLink="true">https://powerit.tistory.com/1433</guid>
      <comments>https://powerit.tistory.com/1433#entry1433comment</comments>
      <pubDate>Sat, 4 Nov 2023 13:23:38 +0900</pubDate>
    </item>
    <item>
      <title>gzip 파일이 압축되어 있는지 확인하는 방법은 무엇입니까?</title>
      <link>https://powerit.tistory.com/1432</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;gzip 파일이 압축되어 있는지 확인하는 방법은 무엇입니까?&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;압축되거나 압축되지 않을 수 있는 파일로 읽어야 하는 C/C++ 프로그램이 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;zlib의 gzread()를 사용하여 압축 파일과 압축되지 않은 파일 모두에서 읽을 수 있다는 것을 알고 있습니다. 그러나 zlib 기능은 (성능상의 이유로) gzip 압축된 경우에만 사용하고 싶습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그렇다면 C/C++에서 특정 파일이 gzip되어 있는지를 프로그램적으로 감지하거나 확인할 수 있는 방법은 없습니까?&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;0x1f8b&lt;/code&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;a href=&quot;http://www.ietf.org/rfc/rfc1952.txt&quot; rel=&quot;noreferrer&quot;&gt;RFC 1952: GZIP 파일 포맷 사양 버전 4.3&lt;/a&gt;은 파일의 처음 2바이트는 다음과 같다고 기술합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;'\x1F'&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;'\x8B'&lt;/code&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;gzread()를 사용하여 압축 파일과 압축되지 않은 파일을 읽는 것의 성능 차이는 무엇입니까?&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;a href=&quot;http://www.astro.keele.ac.uk/oldusers/rno/Computing/File_magic.html&quot; rel=&quot;nofollow&quot;&gt;있는 매직넘버&lt;/a&gt;를 읽을 수 있는데, 이것은&lt;/font&gt;&lt;/font&gt;&lt;code&gt;1f 8b&lt;/code&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;RFC 1951 및 &lt;a href=&quot;https://www.rfc-editor.org/rfc/rfc1952&quot; rel=&quot;nofollow noreferrer&quot;&gt;1952&lt;/a&gt;에 설명된 서명을 테스트하여 아이디어를 얻을 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;GZIP 파일의 경우 두 번째 파일이 해당되며 최종 파일입니다.&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;그냥 zlib 스트림의 경우에는 그것이 다소 더 어렵습니다. 왜냐하면 그것들은 훨씬 더 거짓 긍정의 경향이 있기 때문입니다.&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/6059302/how-to-check-if-a-file-is-gzip-compressed&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>c</category>
      <author>powerit</author>
      <guid isPermaLink="true">https://powerit.tistory.com/1432</guid>
      <comments>https://powerit.tistory.com/1432#entry1432comment</comments>
      <pubDate>Sat, 4 Nov 2023 13:23:28 +0900</pubDate>
    </item>
    <item>
      <title>범위가 분리된 지시어에 ng-show를 사용하는 방법</title>
      <link>https://powerit.tistory.com/1431</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;범위가 분리된 지시어에 ng-show를 사용하는 방법&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;&amp;lt;dir model=&quot;data&quot;&amp;gt;&amp;lt;/dir&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;scope :{
  model:'='
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이제 저는 사용하려고 합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ng-show&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;내 페이지의 $scope의 다른 속성을 사용하는 지시에 대해 다음과 같이 설명합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;dir ng-show=&quot;show&quot; model=&quot;data&quot;&amp;gt;&amp;lt;/dir&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;show&lt;/code&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;제가 찾은 해결책은 지시문을 a로 포장하는 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;적용합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ng-show&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그 요소에 관해서는, 하지만 나는 이것이 나에게 사용하도록 강요하는 추가적인 요소가 마음에 들지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;div ng-show=&quot;show&quot; &amp;gt;
  &amp;lt;dir model=&quot;data&quot;&amp;gt;&amp;lt;/dir&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;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음 플렁커 보기: http://plnkr.co/edit/Q3MkWfl5mHssUeh3zXiR?p=preview&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;업데이트:&lt;/strong&gt; 이 답변은 1.2 이전의 Angular 릴리스에 적용됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Angular 1.2에 대한 @lex82의 답변을 참조하십시오.&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;dir&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;지시문은 동일한 요소에 정의된 모든 지시문인 분리 범위를 만듭니다(&lt;/font&gt;&lt;/font&gt;&lt;code&gt;dir&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;ng-show&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;재산을 찾습니다&lt;/font&gt;&lt;/font&gt;&lt;code&gt;show&lt;/code&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;dir&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;지침은 진정한 &lt;a href=&quot;https://stackoverflow.com/questions/14914213/when-writing-a-directive-how-do-i-decide-if-a-need-no-new-scope-a-new-child-sc&quot;&gt;독립&lt;/a&gt; 실행형/자체&lt;a href=&quot;https://stackoverflow.com/questions/14914213/when-writing-a-directive-how-do-i-decide-if-a-need-no-new-scope-a-new-child-sc&quot;&gt; &lt;/a&gt;reusable/contained&lt;a href=&quot;https://stackoverflow.com/questions/14914213/when-writing-a-directive-how-do-i-decide-if-a-need-no-new-scope-a-new-child-sc&quot;&gt; &lt;/a&gt;구성 요소이므로 분리 범위를 사용해야 합니다. 따라서 포장 솔루션이 가장 좋습니다(사용하는 것보다 낫습니다).&lt;/font&gt;&lt;/font&gt;&lt;code&gt;$parent&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;, IMO) 그러한 지시문은 일반적으로 동일한 요소에 대해 다른 지시문과 함께 사용되어서는 안 되기 때문입니다(또는 정확히 이런 종류의 문제가 발생합니다).&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;Angular 1.2 이상으로 마이그레이션하는 것을 고려해 볼 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;http://docs.angularjs.org/guide/migration#isolate-scope-only-exposed-to-directives-with-property&quot;&gt;격리 범위&lt;/a&gt;는 이제 &lt;a href=&quot;http://docs.angularjs.org/guide/migration#isolate-scope-only-exposed-to-directives-with-property&quot;&gt;범위 속성이 있는 명령에만 노출&lt;/a&gt;됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것은 ng-show가 더 이상 지시에 영향을 받지 않는다는 것을 의미하며, 처음부터 하려고 했던 것과 똑같이 작성할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;dir ng-show=&quot;show&quot; model=&quot;data&quot;&amp;gt;&amp;lt;/dir&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;font papago-translate=&quot;translated&quot;&gt;구성요소 제작자에게는 추가적인 단계이지만 구성요소를 보다 직관적으로 사용할 수 있게 해줍니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;function link($scope, $element, attr, ctrl) {

    if (attr.hasOwnProperty(&quot;ngShow&quot;)) {
        function ngShow() {
            if ($scope.ngShow === true) {
                $element.show();
            }
            else if($scope.ngShow === false) {
                $element.hide();
            }
        }
        $scope.$watch(&quot;ngShow&quot;, ngShow);
        setTimeout(ngShow, 0);
    }
    //... more in the link function
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;ngShow에 대한 스코프 바인딩도 설정해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;scope: {
    ngShow: &quot;=&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;$parent&lt;/code&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;dir ng-show=&quot;$parent.show&quot; model=&quot;data&quot;&amp;gt;&amp;lt;/dir&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;부인&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;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;&amp;lt;div&amp;gt;&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;별로 좋은 것도 아닙니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다른 매개 변수가 격리 범위로 전달된 것을 보면 지시가 실제로 격리 범위를 가지고 있음을 알 수 있기 때문에 정당화할 수 있다고 생각합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;한편, 저는 제가 애당초 $parent를 정기적으로 잊어버린다는 것을 인정하고 왜 그것이 작동하지 않는지 의문을 품어야 합니다.&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;is-visible=&quot;expression&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;ng-show&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;em&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;업데이트:&lt;/font&gt;&lt;/strong&gt;&lt;/em&gt; &lt;em&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Angular 1.2 이상에서는 작동하지 않습니다.&lt;/font&gt;&lt;/em&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/16747225/how-to-use-ng-show-on-a-directive-that-has-an-isolated-scope&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>angularJS</category>
      <author>powerit</author>
      <guid isPermaLink="true">https://powerit.tistory.com/1431</guid>
      <comments>https://powerit.tistory.com/1431#entry1431comment</comments>
      <pubDate>Sat, 4 Nov 2023 13:23:22 +0900</pubDate>
    </item>
    <item>
      <title>사용자 지정 게시물 유형 및 범주</title>
      <link>https://powerit.tistory.com/1430</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사용자 지정 게시물 유형 및 범주&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;카테고리가 있는 사용자 지정 게시물 유형을 만들기 위해 며칠 동안 노력했습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;지금까지는 이 작업을 수행하고 있으며, 쉽게 콘텐츠를 추가하여 카테고리에 할당할 수 있습니다.&lt;/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;br&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예를 들어,&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저의 게시물 유형은 &lt;strong&gt;광고&lt;/strong&gt;라고 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저의 카테고리는 &lt;strong&gt;사진작가&lt;/strong&gt;입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;페이지에서 자신이 어떤 카테고리에 있는지 동적으로 파악하고 해당 카테고리에 속한 모든 사용자 지정 게시물을 표시할 수 있습니까?&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;function my_custom_post_advert() {
    $labels = array(
        'name'               =&amp;gt; _x( 'Adverts', 'post type general name' ),
        'singular_name'      =&amp;gt; _x( 'Advert', 'post type singular name' ),
        'add_new'            =&amp;gt; _x( 'Add New', 'advert' ),
        'add_new_item'       =&amp;gt; __( 'Add New Advert' ),
        'edit_item'          =&amp;gt; __( 'Edit Advert' ),
        'new_item'           =&amp;gt; __( 'New Advert' ),
        'all_items'          =&amp;gt; __( 'All Adverts' ),
        'view_item'          =&amp;gt; __( 'View Advert' ),
        'search_items'       =&amp;gt; __( 'Search Adverts' ),
        'not_found'          =&amp;gt; __( 'No adverts found' ),
        'not_found_in_trash' =&amp;gt; __( 'No adverts found in the Trash' ), 
        'parent_item_colon'  =&amp;gt; '',
        'menu_name'          =&amp;gt; 'Adverts'
    );
    $args = array(
        'labels'        =&amp;gt; $labels,
        'description'   =&amp;gt; 'Holds our adverts and advert specific data',
        'public'        =&amp;gt; true,
        'menu_position' =&amp;gt; 5,
        'supports'      =&amp;gt; array( 'title', 'editor', 'thumbnail', 'excerpt', 'category' ),
        'has_archive'   =&amp;gt; true,
    );
    register_post_type( 'advert', $args );  
}
add_action( 'init', 'my_custom_post_advert' );

function my_taxonomies_advert() {
    $labels = array(
        'name'              =&amp;gt; _x( 'Advert Categories', 'taxonomy general name' ),
        'singular_name'     =&amp;gt; _x( 'Advert Category', 'taxonomy singular name' ),
        'search_items'      =&amp;gt; __( 'Search Advert Categories' ),
        'all_items'         =&amp;gt; __( 'All Advert Categories' ),
        'parent_item'       =&amp;gt; __( 'Parent Advert Category' ),
        'parent_item_colon' =&amp;gt; __( 'Parent Advert Category:' ),
        'edit_item'         =&amp;gt; __( 'Edit Advert Category' ), 
        'update_item'       =&amp;gt; __( 'Update Advert Category' ),
        'add_new_item'      =&amp;gt; __( 'Add New Advert Category' ),
        'new_item_name'     =&amp;gt; __( 'New Advert Category' ),
        'menu_name'         =&amp;gt; __( 'Advert Categories' ),
    );
    $args = array(
        'labels' =&amp;gt; $labels,
        'hierarchical' =&amp;gt; true,
    );
    register_taxonomy( 'advert_category', 'advert', $args );
}
add_action( 'init', 'my_taxonomies_advert', 0 );
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;기본적으로 WP_query가 사용자 정의된 &lt;strong&gt;&lt;em&gt;페이지 템플릿&lt;/em&gt;&lt;/strong&gt;을 만들어야 WordPress에서 사용자 정의된 카테고리를 확인할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;페이지 템플릿을 만들고 나면 워드프레스 관리...에서 새 페이지 템플릿을 템플릿으로 선택하여 페이지를 만들 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고 카테고리를 동적으로 설정하려면 항상 $_GET 파라미터를 사용하여 광고를 표시할 카테고리를 결정하도록 페이지 템플릿을 설정할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이와 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;http://example.com/adverts-listing/?mycat=photographers
&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;http://example.com/adverts-listing/?mycat=programmers
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;기타.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음은 페이지 템플릿의 모양 예입니다(물론 이는 사용 중인 테마에 따라 달라집니다).&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 예제는 2414 테마를 사용하기 위해 만들어졌습니다.)&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;?php
/**
 * Template Name: Advert Listing
 *
 */

get_header(); ?&amp;gt;

  &amp;lt;section id=&quot;primary&quot; class=&quot;content-area&quot;&amp;gt;
    &amp;lt;div id=&quot;content&quot; class=&quot;site-content&quot; role=&quot;main&quot;&amp;gt;

    &amp;lt;?php
      // Set the args array for the query to happen
      $args = array(
        'post_type' =&amp;gt; 'adverts',
        'post_status' =&amp;gt; 'publish',
        'posts_per_page' =&amp;gt; 10
      );

      // Dynamically set the mycat argument from a $_GET parameter
      if( isset($_GET['mycat']) ) {
        $args['tax_query'] =&amp;gt; array(
          array(
            'taxonomy' =&amp;gt; 'advert_category',
            'field' =&amp;gt; 'slug',
            'terms' =&amp;gt; $_GET['mycat']
          )
        );
      }

      // Issue the query
      $q = null;
      $q = new WP_Query($args);

      // Start the loop
      if( $q-&amp;gt;have_posts() ) : ?&amp;gt;
        &amp;lt;header class=&quot;page-header&quot;&amp;gt;
          &amp;lt;h1 class=&quot;page-title&quot;&amp;gt;&amp;lt;?php _e( 'Advert Listing:', 'twentyfourteen' ); ?&amp;gt;&amp;lt;/h1&amp;gt;
        &amp;lt;/header&amp;gt;

        &amp;lt;?php

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

          &amp;lt;article id=&quot;post-&amp;lt;?php the_ID(); ?&amp;gt;&quot; class=&quot;post-&amp;lt;?php the_ID(); ?&amp;gt; adverts type-adverts status-publish hentry&quot;&amp;gt;

            &amp;lt;header class=&quot;entry-header&quot;&amp;gt;
              &amp;lt;a href=&quot;&amp;lt;?php echo get_permalink(get_the_ID()); ?&amp;gt;&quot;&amp;gt;&amp;lt;h3 class=&quot;entry-title&quot;&amp;gt;&amp;lt;?php the_title(); ?&amp;gt;&amp;lt;/h3&amp;gt;&amp;lt;/a&amp;gt;
            &amp;lt;/header&amp;gt;&amp;lt;!-- .entry-header --&amp;gt;

            &amp;lt;div class=&quot;entry-content&quot;&amp;gt;
              &amp;lt;?php the_excerpt(); ?&amp;gt;
            &amp;lt;/div&amp;gt;

          &amp;lt;/article&amp;gt;

          &amp;lt;?php

        endwhile;

        // Previous/next post navigation.
        twentyfourteen_paging_nav();

      else :
        // If no content, include the &quot;No posts found&quot; template.
        get_template_part( 'content', 'none' );

      endif;

      wp_reset_query();  // Restore global post data stomped by the_post().
      ?&amp;gt;

    &amp;lt;/div&amp;gt;&amp;lt;!-- #content --&amp;gt;
  &amp;lt;/section&amp;gt;&amp;lt;!-- #primary --&amp;gt;

&amp;lt;?php

get_sidebar( 'content' );
get_sidebar();
get_footer();
&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;has_archive&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;보관 페이지를 만들어야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;많은 번거로움을 덜기 위해, 그리고 내가 과거에 사용했던 것은 이 &lt;a href=&quot;http://wordpress.org/extend/plugins/types/&quot; rel=&quot;nofollow&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;유형 내용 유형, 사용자 정의 필드 및 분류법을 추가하여 워드프레스 관리자를 사용자 정의할 수 있습니다.&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;그래서 이 &lt;a href=&quot;http://wordpress.org/extend/plugins/custom-post-type-archives/&quot; rel=&quot;nofollow&quot;&gt;Custom post type 아카이브 플러그인&lt;/a&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;이 솔루션은 기본적으로 스택 오버플로에 대한 &lt;a href=&quot;https://stackoverflow.com/questions/18492797/exclude-category-from-custom-post-type-loop-archive&quot;&gt;다른&lt;/a&gt; 곳의 이 &lt;a href=&quot;https://stackoverflow.com/questions/18492797/exclude-category-from-custom-post-type-loop-archive&quot;&gt;질문&lt;/a&gt;에 대한 답변에 포함되어 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;요약하자면, 사용자 지정 쿼리를 만들되 $args 배열에서는 다음을 대체합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;code&gt;'cat_name' =&amp;gt; 'Photographers'&lt;/code&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;code&gt;'tax_query' =&amp;gt; array( array( 'taxonomy' =&amp;gt; 'advert_category', 'field' =&amp;gt; 'slug', 'terms' =&amp;gt; 'photographers' ) )&lt;/code&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;'post-type' =&amp;gt; 'advert'&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;또한 $args로 제공됩니다.&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;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아래 코드는 정말 간단하고 깨끗합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;말&lt;/strong&gt; 그대로 복사해서 &lt;strong&gt;붙여넣기&lt;/strong&gt;.&lt;/font&gt;&lt;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;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;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;strong&gt;기능&lt;/strong&gt;에 코드를 복사해야 합니다&lt;strong&gt;.&lt;/strong&gt;&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;php&lt;/strong&gt; 파일&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;add_action( 'init', 'create_post_types' );
    function create_post_types() {
// Custom Post 1
        register_post_type( 'companies',
            array(
                'labels' =&amp;gt; array(
                    'name' =&amp;gt; __( 'Companies' ),
                    'singular_name' =&amp;gt; __( 'Company' )
                ),
            'public' =&amp;gt; true,
            'has_archive' =&amp;gt; true,
            )
        );
        // Default Wordpress Category Taxonomy
        register_taxonomy_for_object_type( 'category', 'companies' );
        // Post Specific Taxonomy
        register_taxonomy( 'company_category', 'companies' );
// Custom Post 2
        register_post_type( 'events',
            array(
                'labels' =&amp;gt; array(
                    'name' =&amp;gt; __( 'Events' ),
                    'singular_name' =&amp;gt; __( 'Event' )
                ),
            'public' =&amp;gt; true,
            'has_archive' =&amp;gt; true,
            )
        );
        // Default Wordpress Category Taxonomy
        register_taxonomy_for_object_type( 'category', 'events' );
        // Post Specific Taxonomy
        register_taxonomy( 'events_category', 'events' );
// Custom Post 3
        register_post_type( 'deals',
            array(
                'labels' =&amp;gt; array(
                    'name' =&amp;gt; __( 'Deals' ),
                    'singular_name' =&amp;gt; __( 'Deal' )
                ),
            'public' =&amp;gt; true,
            'has_archive' =&amp;gt; true,
            )
        );
        // Default Wordpress Category Taxonomy
        register_taxonomy_for_object_type( 'category', 'deals' );
        // Post Specific Taxonomy
        register_taxonomy( 'deals_category', 'deals' );
// Custom Post 4
        register_post_type( 'banners',
            array(
                'labels' =&amp;gt; array(
                    'name' =&amp;gt; __( 'Banners' ),
                    'singular_name' =&amp;gt; __( 'Banner' )
                ),
            'public' =&amp;gt; true,
            'has_archive' =&amp;gt; true,
            )
        );
        // Default Wordpress Category Taxonomy
        register_taxonomy_for_object_type( 'category', 'banners' );
        // Post Specific Taxonomy
        register_taxonomy( 'banners_category', 'banners' );
    }
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;커스텀 포스트 타입은 4가지가 있어서 코드가 꽤 설명적이라고 말씀드렸습니다.&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/16612411/custom-post-types-and-categories&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>Wordpress</category>
      <author>powerit</author>
      <guid isPermaLink="true">https://powerit.tistory.com/1430</guid>
      <comments>https://powerit.tistory.com/1430#entry1430comment</comments>
      <pubDate>Sat, 4 Nov 2023 13:23:15 +0900</pubDate>
    </item>
    <item>
      <title>SQL 로더 오류: &amp;quot;변수 길이 필드가 최대 길이를 초과합니다.&amp;quot;</title>
      <link>https://powerit.tistory.com/1429</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;SQL 로더 오류: &quot;변수 길이 필드가 최대 길이를 초과합니다.&quot;&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;SQL Loader Control 파일이 있는데,&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;LOAD DATA  
INFILE 'test.txt'  
INTO TABLE TEST replace  
fields terminated &quot;|&quot; optionally enclosed by '&quot;' TRAILING NULLCOLS  
( DOCUMENTID INTEGER(10),  
  CUSTID INTEGER(10),  
  USERID INTEGER(10),  
  FILENAME VARCHAR(255),  
  LABEL VARCHAR(50),  
  DESCRIPTION VARCHAR(2000),  
  POSTDATE DATE &quot;YYYY-MM-DD HH24:MI:SS&quot; NULLIF POSTDATE=&quot;&quot;,  
  USERFILENAME VARCHAR(50),  
  STORAGEPATH VARCHAR(255)
)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;SQL Loader를 실행하면 오류가 발생합니다.&lt;/font&gt;&lt;/font&gt;&lt;br&gt; &lt;code&gt;Record 1: Rejected - Error on table TEST, column FILENAME. Variable length field exceeds maximum length.&lt;/code&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;그 기둥의 길이는 255도 훨씬 안 됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;1|5001572|2|/Storage/Test/5001572/test.pdf|test.pdf||2005-01-13 11:47:49||&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;Column Name | Position | Len | Term | Encl | Datatype&lt;/code&gt;&lt;br&gt; &lt;code&gt;FILENAME | NEXT | 257 | | | VARCHAR&lt;/code&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 제 테이블과 컨트롤 파일 모두에 길이를 255로 정의합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하지만 기록에는 257이라고 적혀있던데요?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;컨트롤 파일의 길이를 253으로 다운을 시도하여 로그 파일에 255로 나타나지만 동일한 문제입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;도와줄 사람?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것 때문에 이틀째 짜증이 납니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;감사해요.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;데이터 필드를 VARCHAR2 및 INTEGER로 정의하지 마십시오.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;CHAR를 사용합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;대부분 텍스트 파일에서 데이터를 로드할 때 텍스트 양식에서 변환되지만 CHAR 또는 DATE를 사용할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;대부분의 경우 길이 지정자가 필요하지 않습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;CHAR 필드의 기본 길이는 255입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제어 파일의 모양은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;LOAD DATA
INFILE &quot;test.txt&quot;
INTO TABLE TEST replace
fields terminated &quot;|&quot; optionally enclosed by '&quot;' TRAILING NULLCOLS
(
  DOCUMENTID,
  CUSTID,
  USERID ,
  FILENAME,
  LABEL,
  DESCRIPTION CHAR(2000),
  POSTDATE DATE &quot;YYYY-MM-DD HH24:MI:SS&quot; NULLIF POSTDATE=BLANKS,
  USERFILENAME,
  STORAGEPATH
)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;DCookie의 경우 +1이지만, 이를 확장하려면 표에 지정된 데이터 유형과 SQL*loader 제어 파일의 데이터 유형을 구분하는 것이 중요합니다. 이는 다소 다른 의미이므로 혼란스럽기 때문입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;http://docs.oracle.com/cd/B19306_01/server.102/b14215/ldr_field_list.htm#i1006714&quot; rel=&quot;noreferrer&quot;&gt;먼저&lt;/a&gt; 설명서를 살펴보고 일반 텍스트 파일을 로드할 때 &quot;휴대용&quot; 데이터 유형을 사용해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Varchar는 &quot;non-portable&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;DCookie의 말에 따르면 CHAR는 매우 일반적으로 사용되는 SQL*Loader 데이터 유형이며, INTEGER EXTER는 DOCUKID 등에 지정할 수 있습니다.&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/10386020/sql-loader-error-variable-length-field-exceeds-maximum-length&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>Oracle</category>
      <author>powerit</author>
      <guid isPermaLink="true">https://powerit.tistory.com/1429</guid>
      <comments>https://powerit.tistory.com/1429#entry1429comment</comments>
      <pubDate>Sat, 4 Nov 2023 13:23:06 +0900</pubDate>
    </item>
    <item>
      <title>{&amp;quot;readyState&amp;quot;:4&amp;quot;, status&amp;quot;:200&amp;quot;, statusText&amp;quot;:&amp;quot;성공&amp;quot;}을(를) 사용한 오류 콜백</title>
      <link>https://powerit.tistory.com/1428</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;{&quot;readyState&quot;:4&quot;, status&quot;:200&quot;, statusText&quot;:&quot;성공&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;url&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;call. url은 json 객체를 예상대로 반환합니다(직접 브라우저 호출). 그러나 내가 그것을 ajax를 통해 follow line을 사용하여 할 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$.ajax({
       url: url, 
       type: &quot;GET&quot;,
       dataType:&quot;jsonp&quot;,   
       success: function(data) {
          alert(data);
       },
       error : function(error) {
          alert(&quot;no good &quot;+JSON.stringify(error));
       }
});
&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;no good {&quot;readyState&quot;:4,&quot;status&quot;:200,&quot;statusText&quot;:&quot;success&quot;}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;스택 오버플로우에 대한 비슷한 질문들이 있다는 것을 알지만 아무도 그것을 해결해주지 않는 것 같습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이는 HTTP 요청은 성공했지만 데이터 구문 분석 시도는 성공하지 못했음을 의미합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;즉, 데이터가 JSONP로 포맷되지 않았습니다.&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;echo $_GET['callback'] . '('.json_encode($data_to_encode).')';
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;//js&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$.ajax({
       url: url+&quot;?callback=?&quot;, 
       type: &quot;GET&quot;,
       dataType:&quot;jsonp&quot;,   
       success: function(data) {
          alert(data);
       },
       error : function(error) {
          alert(&quot;no good &quot;+JSON.stringify(error));
       }
});
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;{&quot;readyState&quot;:4&quot;, status&quot;:200&quot;, statusText&quot;:&quot;성공&quot;}과(와) 똑같은 문제가 있었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;내 php 스크립트에서 에코 &quot;안녕&quot;을 제거하는 것을 잊어버렸기 때문입니다. 이전에 테스트 이유로 만든 문장입니다. 그래서 내 php 스크립트가 JSON과 함께 문자열을 보내고 있었습니다. 그것은 나의 어리석은 실수였습니다. 아마도 당신도 같은 것을 가지고 있을 것입니다.&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/14713489/error-callback-with-readystate4-status200-statustextsuccess&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>ajax</category>
      <author>powerit</author>
      <guid isPermaLink="true">https://powerit.tistory.com/1428</guid>
      <comments>https://powerit.tistory.com/1428#entry1428comment</comments>
      <pubDate>Sat, 4 Nov 2023 13:22:59 +0900</pubDate>
    </item>
    <item>
      <title>SQL 쿼리에서 기본값을 반환하는 방법</title>
      <link>https://powerit.tistory.com/1427</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;SQL 쿼리에서 기본값을 반환하는 방법&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;쿼리가 어떤 행도 반환하지 않는다면 단일 스칼라 또는 기본값을 반환할 수 있는 쉬운 방법이 있습니까?&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;지금은 다음과 같은 코드 예제가 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;IF (EXISTS (SELECT * FROM Users WHERE Id = @UserId))  
    SELECT Name FROM Users WHERE Id = @UserId  
ELSE
    --default value
    SELECT 'John Doe'
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;IF-ELSE를 사용하지 않고 어떻게 하면 더 나은 방법으로 할 수 있을까요?&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;Id&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;고유하므로 최대 한 행까지 일치시킬 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt; SELECT 
    ISNULL(MAX(Name),'John Doe')
 FROM 
    Users 
 WHERE 
    Id = @UserId  
&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;ISNULL&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아니면&lt;/font&gt;&lt;/font&gt;&lt;code&gt;COALESCE&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;SELECT ISNULL((SELECT TOP 1 Name FROM Users WHERE Id = @UserId), 'John Doe')
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 ID를 가진 사용자가 없는 경우 내부 선택은 아무것도 반환하지 않습니다. null은 이 경우를 해결합니다.&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;SELECT IFNULL(Name,'John Doe')
FROM   Users
WHERE  Id = @UserId) 
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음 컨스트럭트를 사용하여 if 문을 삭제할 수 있지만 그렇다고 해서 더 좋은 것은 아닙니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;SELECT Name FROM Users WHERE Id = @UserId UNION ALL 
SELECT 'John Doe' WHERE NOT EXISTS (SELECT Name FROM Users WHERE  Id = @UserId)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;시도는 null입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;SELECT IsNULL(Name, 'John Doe')  FROM Users WHERE Id = @UserId
&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;drop table users
go
create table users
(id int,name varchar(20))
go
insert into users select 1,'1'
 go
declare @userid int
set @userid = 1
select isnull(username.username, 'John Doe')
from (select @userid as userid) userid
outer apply (SELECT  name as username FROM Users WHERE Id = userid.userid ) username
--outer apply (SELECT  name as username FROM Users WHERE Id = @userid ) username
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;@@ROWCOUNT를 사용하여 반품 여부를 확인할 수 있을 것 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;SELECT Name FROM Users WHERE Id = @UserId  
if(@@ROWCOUNT = 0)
  SELECT 'John Doe'
&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;declare @name varchar(100)
set @name = (select top 1 name from users where id = @userId)
if(@name is null) set @name = 'John Doe'
select @name
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;가장 좋은 방법은 @name을 처음 선언하는 것입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그런 다음 사용자 ID를 기준으로 이 값을 설정한 다음 @name이 null이면 기본 이름 표시, 그렇지 않으면 이름 표시...&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;declare @userid int
set @userid = 1
select isnull(
               (select name from users where id = @userid),
               'John Doe'
               )
 go
--My preffered would be this one..
declare @name varchar(20),@userid int
set @userid = 1
select  @name =  name from users where id = @userid
select isnull(@name,'John Doe') 
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;쿼리가 최대 한 행을 반환해야 하는 경우 기본값을 사용한 다음 제한을 사용합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;SELECT * FROM 
 (
  SELECT Name FROM Users WHERE Id = @UserId`
  UNION
  SELECT 'John Doe' AS Name --Default value
 ) AS subquery
LIMIT 1
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;쿼리와 기본값 모두 원하는 만큼의 열을 가질 수 있으며 null이 아니라고 보장할 필요는 없습니다.&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/11503463/how-to-return-default-value-from-sql-query&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>sql-server</category>
      <author>powerit</author>
      <guid isPermaLink="true">https://powerit.tistory.com/1427</guid>
      <comments>https://powerit.tistory.com/1427#entry1427comment</comments>
      <pubDate>Sat, 4 Nov 2023 13:22:53 +0900</pubDate>
    </item>
    <item>
      <title>jQuery를 사용하여 JavaScript 개체에서 항목 추가/제거</title>
      <link>https://powerit.tistory.com/1426</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;jQuery를 사용하여 JavaScript 개체에서 항목 추가/제거&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;var data = {items: [
    {id: &quot;1&quot;, name: &quot;Snatch&quot;, type: &quot;crime&quot;},
    {id: &quot;2&quot;, name: &quot;Witches of Eastwick&quot;, type: &quot;comedy&quot;},
    {id: &quot;3&quot;, name: &quot;X-Men&quot;, type: &quot;action&quot;},
    {id: &quot;4&quot;, name: &quot;Ordinary People&quot;, type: &quot;drama&quot;},
    {id: &quot;5&quot;, name: &quot;Billy Elliot&quot;, type: &quot;drama&quot;},
    {id: &quot;6&quot;, name: &quot;Toy Story&quot;, type: &quot;children&quot;}
]};
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 목록에 항목을 추가/제거하려면 jQuery를 사용하여 어떻게 해야 합니까?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;클라이언트는 이 목록을 동적으로 수정할 수 있기를 원합니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;우선 당신의 견적 코드는 JSON이 &lt;strong&gt;아닙니다&lt;/strong&gt;.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;코드는 자바스크립트 객체 문자 표기입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;http://json.org&quot; rel=&quot;nofollow noreferrer&quot;&gt;JSON&lt;/a&gt;은 구문 분석을 더 쉽게 하기 위해 설계된 부분 집합입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;코드가 개체를 정의합니다(&lt;/font&gt;&lt;/font&gt;&lt;code&gt;data&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;배열 포함()&lt;/font&gt;&lt;/font&gt;&lt;code&gt;items&lt;/code&gt;&lt;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;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;type&lt;/code&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;jQuery가 필요하거나 필요하지 않고 자바스크립트만 있으면 됩니다.&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;data.items.push(
    {id: &quot;7&quot;, name: &quot;Douglas Adams&quot;, type: &quot;comedy&quot;}
);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그것이 끝을 더하는군요.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;중간에 추가하는 방법은 아래를 참고하세요.&lt;/font&gt;&lt;/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;pre&gt;&lt;code&gt;data.items.splice(1, 3); // Removes three items starting with the 2nd,
                         // (&quot;Witches of Eastwick&quot;, &quot;X-Men&quot;, &quot;Ordinary People&quot;)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;code&gt;splice&lt;/code&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;code&gt;splice&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;splice&lt;/code&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;removed_items = arrayObject.splice(index, num_to_remove[, add1[, add2[, ...]]]);
&lt;/code&gt;&lt;/pre&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;code&gt;index&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;- 변화를 시작할 때의 지수&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;num_to_remove&lt;/code&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;addN&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;- ...그리고 이 요소를 삽입합니다.&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이렇게 세번째 위치에 아이템을 추가할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;data.items.splice(2, 0,
    {id: &quot;7&quot;, name: &quot;Douglas Adams&quot;, type: &quot;comedy&quot;}
);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;즉, 인덱스 2에서 시작하여 제로 아이템을 제거하고 다음 아이템을 삽입합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;결과는 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var data = {items: [
    {id: &quot;1&quot;, name: &quot;Snatch&quot;, type: &quot;crime&quot;},
    {id: &quot;2&quot;, name: &quot;Witches of Eastwick&quot;, type: &quot;comedy&quot;},
    {id: &quot;7&quot;, name: &quot;Douglas Adams&quot;, type: &quot;comedy&quot;},     // &amp;lt;== The new item
    {id: &quot;3&quot;, name: &quot;X-Men&quot;, type: &quot;action&quot;},
    {id: &quot;4&quot;, name: &quot;Ordinary People&quot;, type: &quot;drama&quot;},
    {id: &quot;5&quot;, name: &quot;Billy Elliot&quot;, type: &quot;drama&quot;},
    {id: &quot;6&quot;, name: &quot;Toy Story&quot;, type: &quot;children&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;data.items.splice(1, 3,
    {id: &quot;7&quot;, name: &quot;Douglas Adams&quot;, type: &quot;comedy&quot;},
    {id: &quot;8&quot;, name: &quot;Dick Francis&quot;, type: &quot;mystery&quot;}
);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;...즉, 인덱스 1에서 시작하여 세 개의 엔트리를 제거한 다음 이 두 개의 엔트리를 추가합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;결과는 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var data = {items: [
    {id: &quot;1&quot;, name: &quot;Snatch&quot;, type: &quot;crime&quot;},
    {id: &quot;7&quot;, name: &quot;Douglas Adams&quot;, type: &quot;comedy&quot;},
    {id: &quot;8&quot;, name: &quot;Dick Francis&quot;, type: &quot;mystery&quot;},
    {id: &quot;4&quot;, name: &quot;Ordinary People&quot;, type: &quot;drama&quot;},
    {id: &quot;5&quot;, name: &quot;Billy Elliot&quot;, type: &quot;drama&quot;},
    {id: &quot;6&quot;, name: &quot;Toy Story&quot;, type: &quot;children&quot;}
]};
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;http://www.w3schools.com/jsref/jsref_splice.asp&quot; rel=&quot;noreferrer&quot;&gt;스플라이스&lt;/a&gt;는 맛있습니다, 다들 스플라이스에 대해 설명을 해주시니까 제가 설명을 안 해드렸어요.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;자바스크립트에서도 &lt;strong&gt;delete&lt;/strong&gt; 키워드를 사용할 수 있는데 좋습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;http://api.jquery.com/jQuery.grep/&quot; rel=&quot;noreferrer&quot;&gt;$.grep&lt;/a&gt;을 사용하여 jQuery를 사용하여 이를 조작할 수도 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;jQuery Way:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;data.items = jQuery.grep(
                data.items, 
                function (item,index) { 
                  return item.id !=  &quot;1&quot;; 
                });
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;DELETE 방법:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;delete data.items[0]
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;스플라이스는 중량이 큰 함수이므로 PUSH를 추가하는 것이 스플라이스가 더 좋습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;스플라이스가 새 배열을 생성합니다. 배열 크기가 크면 문제가 생길 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;delete는 때때로 유용합니다. 삭제 후 배열의 길이를 찾는다면 거기서 길이에 변화가 없습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러니 현명하게 사용하세요.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;jQuery를 사용하는 경우 확장 기능을 사용하여 새 항목을 추가할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var olddata = {&quot;fruit&quot;:{&quot;apples&quot;:10,&quot;pears&quot;:21}};

var newdata = {};
newdata['vegetables'] = {&quot;carrots&quot;: 2, &quot;potatoes&quot; : 5};

$.extend(true, olddata, newdata);
&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;fruit&quot;:{&quot;apples&quot;:10,&quot;pears&quot;:21}, &quot;vegetables&quot;:{&quot;carrots&quot;:2,&quot;potatoes&quot;:5}};
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그건 JSON이 아니라 자바스크립트 객체일 뿐입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;http://www.json.org/&quot; rel=&quot;noreferrer&quot;&gt;JSON&lt;/a&gt;은 자바스크립트 구문의 부분 집합을 사용하는 데이터의 텍스트 표현입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;jQuery를 사용하여 JSON을 조작하는 것에 대한 정보를 찾을 수 없는 이유는 jQuery가 그렇게 할 수 있는 것이 없고, 일반적으로 전혀 이루어지지 않기 때문입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;자바스크립트 객체 형태로 데이터를 조작한 후 필요한 경우 JSON 문자열로 변환합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;(그러나 jQuery에는 변환 방법이 있습니다.)&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;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;data.items&lt;/code&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;// The values to put in the item
var id = 7;
var name = &quot;The usual suspects&quot;;
var type = &quot;crime&quot;;
// Create the item using the values
var item = { id: id, name: name, type: type };
// Add the item to the array
data.items.push(item);
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;json 배열에 개체 추가&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var arrList = [];
var arr = {};   
arr['worker_id'] = worker_id;
arr['worker_nm'] = worker_nm;
arrList.push(arr);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;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;pre&gt;&lt;code&gt;  arrList = $.grep(arrList, function (e) { 

        if(e.worker_id == worker_id) {
            return false;
        } else {
            return true;
        }
    });
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;해당 개체가 없는 배열을 반환합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;도움이 되길 바랍니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그냥 자바스크립트로 된 객체니까 당신이 조작할 수 있는거죠&lt;/font&gt;&lt;/font&gt;&lt;code&gt;data.items&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;data.items.pop();
&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;items&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;/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 my_form_obj = {};
my_form_obj.name = &quot;Captain America&quot;;
my_form_obj.weapon = &quot;Shield&quot;;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;도움이 되길 바랍니다!&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;해라&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;data.items.pop();
data.items.push({id: &quot;7&quot;, name: &quot;Matrix&quot;, type: &quot;adult&quot;});
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;/p&gt;
&lt;div class=&quot;snippet&quot; data-lang=&quot;js&quot; data-hide=&quot;true&quot; data-console=&quot;true&quot; data-babel=&quot;false&quot;&gt; 
 &lt;div class=&quot;snippet-code snippet-currently-hidden&quot;&gt; 
  &lt;pre class=&quot;snippet-code-js lang-js prettyprint-override&quot;&gt;&lt;code&gt;var data = {items: [
    {id: &quot;1&quot;, name: &quot;Snatch&quot;, type: &quot;crime&quot;},
    {id: &quot;2&quot;, name: &quot;Witches of Eastwick&quot;, type: &quot;comedy&quot;},
    {id: &quot;3&quot;, name: &quot;X-Men&quot;, type: &quot;action&quot;},
    {id: &quot;4&quot;, name: &quot;Ordinary People&quot;, type: &quot;drama&quot;},
    {id: &quot;5&quot;, name: &quot;Billy Elliot&quot;, type: &quot;drama&quot;},
    {id: &quot;6&quot;, name: &quot;Toy Story&quot;, type: &quot;children&quot;}
]};

data.items.pop();
data.items.push({id: &quot;7&quot;, name: &quot;Matrix&quot;, type: &quot;adult&quot;});

console.log(data);&lt;/code&gt;&lt;/pre&gt; 
 &lt;/div&gt; 
&lt;/div&gt; 
&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/4538269/adding-removing-items-from-a-javascript-object-with-jquery&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>jquery</category>
      <author>powerit</author>
      <guid isPermaLink="true">https://powerit.tistory.com/1426</guid>
      <comments>https://powerit.tistory.com/1426#entry1426comment</comments>
      <pubDate>Sat, 4 Nov 2023 13:22:46 +0900</pubDate>
    </item>
    <item>
      <title>매 n번째 줄 팬더</title>
      <link>https://powerit.tistory.com/1425</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;매 n번째 줄 팬더&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;Dataframe.resample()&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;시계열이 아닌 데이터에서 n번째 행을 모두 얻을 수 있는 방법을 찾을 수 없습니다.&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;iloc&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;5번째 행마다 원하는 경우:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;df.iloc[::5, :]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;@chrisb의 수락된 답변이 질문에 답을 주지만, 저는 여기에 다음과 같이 덧붙이고 싶습니다.&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;nth&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;data 또는 drop the&lt;/font&gt;&lt;/font&gt;&lt;code&gt;nth&lt;/code&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;df1 = df[df.index % 3 != 0]  # Excludes every 3rd row starting from 0
df2 = df[df.index % 3 == 0]  # Selects every 3rd raw starting from 0
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 산술 기반 샘플링은 훨씬 더 복잡한 행 선택을 가능하게 할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;이&lt;/strong&gt;는 물론, 당신이 그들과&lt;/font&gt;&lt;/font&gt;&lt;code&gt;index&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;0에서 시작하는 &lt;em&gt;순서&lt;/em&gt;가 매겨진,&lt;em&gt; 연속된, 정수&lt;/em&gt;의 열.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;직접 호출하는 것을 포함하는 수락된 답변에 대한 훨씬 더 간단한 해결책이 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;df.__getitem__&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;df = pd.DataFrame('x', index=range(5), columns=list('abc'))
df

   a  b  c
0  x  x  x
1  x  x  x
2  x  x  x
3  x  x  x
4  x  x  x
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예를 들어, 2개의 행을 얻을 때마다 다음을 수행할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;df[::2]

   a  b  c
0  x  x  x
2  x  x  x
4  x  x  x
&lt;/code&gt;&lt;/pre&gt; 
&lt;hr&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;인덱스에 / &lt;a href=&quot;https://www.google.com/search?client=safari&amp;amp;rls=en&amp;amp;q=Groupby.head&amp;amp;ie=UTF-8&amp;amp;oe=UTF-8&quot; rel=&quot;noreferrer&quot;&gt;&lt;code&gt;GroupBy.head&lt;/code&gt;&lt;/a&gt;그룹을 지정하는 경우도 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;df.index // 2
# Int64Index([0, 0, 1, 1, 2], dtype='int64')

df.groupby(df.index // 2).first()
# Alternatively,
# df.groupby(df.index // 2).head(1)

   a  b  c
0  x  x  x
1  x  x  x
2  x  x  x
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;인덱스는 스트라이드(이 경우 2)에 의해 바닥 분할됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;인덱스가 숫자가 아닌 경우 대신 다음 작업을 수행합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;# df.groupby(np.arange(len(df)) // 2).first()
df.groupby(pd.RangeIndex(len(df)) // 2).first()

   a  b  c
0  x  x  x
1  x  x  x
2  x  x  x
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;추가하기&lt;/font&gt;&lt;/font&gt;&lt;code&gt;reset_index()&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;에서 &lt;a href=&quot;https://stackoverflow.com/a/46141173/11816073&quot;&gt;준안정&lt;/a&gt; B의&lt;a href=&quot;https://stackoverflow.com/a/46141173/11816073&quot;&gt; 답&lt;/a&gt;을 사용하면 행이 &lt;em&gt;순서&lt;/em&gt;대로 연속되어 &lt;em&gt;있다고&lt;/em&gt; 가정할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;df1 = df[df.reset_index().index % 3 != 0]  # Excludes every 3rd row starting from 0
df2 = df[df.reset_index().index % 3 == 0]  # Selects every 3rd row starting from 0
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;code&gt;df.reset_index().index&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;는 0에서 시작하여 1씩 증가하는 인덱스를 생성하므로 모듈로를 쉽게 사용할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저도 비슷한 요구사항이 있었는데, 특정 그룹의 물건이 아니길 원했습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이렇게 풀었어요.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;groups = data.groupby(['group_key'])
selection = groups['index_col'].apply(lambda x: x % 3 == 0)
subset = data[selection]
&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;인덱스를 사용할 때 생각해낸 솔루션이 실행 가능하지 않았습니다(multi-Gig.csv가 너무 크거나 충돌 없이 재인덱스할 수 있는 기술을 놓쳤을 수 있습니다).&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;한 번에 하나의 행을 걷고 n번째 행을 새 데이터 프레임에 추가합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;import pandas as pd
from csv import DictReader

def make_downsampled_df(filename, interval):    
    with open(filename, 'r') as read_obj:
        csv_dict_reader = DictReader(read_obj)
        column_names = csv_dict_reader.fieldnames
        df = pd.DataFrame(columns=column_names)
    
        for index, row in enumerate(csv_dict_reader):
            if index % interval == 0:
               print(str(row))
               df = df.append(row, ignore_index=True)

    return df
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;df.drop(labels=df[df.index % 3 != 0].index, axis=0) #  every 3rd row (mod 3)
&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/25055712/pandas-every-nth-row&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>pandas</category>
      <author>powerit</author>
      <guid isPermaLink="true">https://powerit.tistory.com/1425</guid>
      <comments>https://powerit.tistory.com/1425#entry1425comment</comments>
      <pubDate>Sat, 4 Nov 2023 13:22:37 +0900</pubDate>
    </item>
    <item>
      <title>C 프로그래머의 관점에서 ARM 아키텍처 간의 차이?</title>
      <link>https://powerit.tistory.com/1424</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;C 프로그래머의 관점에서 ARM 아키텍처 간의 차이?&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 ARM을 위한 프로그래밍을 꽤 처음 해 봅니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;ARMv4, ARMv5, ARMv6 등과 같은 여러 아키텍처가 있다는 것을 알게 되었습니다.&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;가장 중요한 것은 제가 ARMv6용 C 코드를 컴파일하면 ARMv5에서 실행이 되나요?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;ARMv6에서 실행되는 ARMv5 코드는 어떻습니까? 아니면 커널 어셈블리 코드를 작성하는 경우에만 차이를 걱정해야 합니까?&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;ARM 세계가 좀 지저분합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;C 프로그래머들에게 있어 모든 ARM 아키텍처는 플랫 어드레싱 프로그래밍 모델과 함께 일반 32비트를 제공합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;C 소스 코드를 사용하는 한 엔디안성과 성능에 대한 차이만 보일 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;대부분의 ARM 프로세서(심지어 오래된 모델)는 빅 엔디안과 리틀 엔디안을 모두 사용할 수 있습니다. 선택은 로직 보드와 운영 체제에 의해 이루어집니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Good C 코드는 엔디안 뉴트럴(&lt;em&gt;endian neutral&lt;/em&gt;): 플랫폼 엔디안 뉴트럴(endian neutrality)에 관계없이 정확하게 컴파일되고 작동합니다(엔디안 뉴트럴은 신뢰성과 유지보수성뿐만 아니라 성능에도 좋습니다: non-neutral 코드는 서로 다른 크기의 포인터를 통해 동일한 데이터에 접근하는 코드입니다.&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;hr&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;ol&gt; 
   &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;26비트 프로그램 카운터가 있는 원래의 ARM 명령어 세트(매우 오래된, 요즘에는 접할 가능성이 거의 없음)&lt;/font&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;32비트 프로그램 카운터가 있는 ARM 명령어 세트(흔히 &quot;ARM 코드&quot;라고 함)&lt;/font&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Thumb 명령어 세트(16비트 단순화 opcode)&lt;/font&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Thumb-2 명령 세트(확장 기능이 있는 Thumb)&lt;/font&gt;&lt;/li&gt; 
  &lt;/ol&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;주어진 프로세서는 여러 개의 명령어 세트를 구현할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;ARM 코드만 아는 최신 프로세서는 ARMv4 대표 제품인 StrongARM으로 이미 상당히 오래된 제품(15년)입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;ARM7&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;TDMI(ARMv4T 아키텍처)는 Cortex-M을 제외한 거의 모든 후속 ARM 시스템과 마찬가지로 ARM과 Thumb을 모두 알고 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;ARM과 썸 코드는 규약이 바뀌는 곳에 적절한 접착제를 삽입하는 한 동일한 응용 프로그램 내에서 함께 혼합될 수 있습니다. 이를 썸&lt;em&gt; 연동&lt;/em&gt;이라고 하며 C 컴파일러가 자동으로 처리할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Cortex-M0는 Thumb 명령만 알고 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&quot;정상적인&quot; ARM 프로세서에서 운영 체제는 (인터럽트를 처리하기 위해) ARM 코드를 사용해야 하기 때문에, Cortex-M0는 OS에 대한 몇 가지 사항을 알고 있습니다.&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;다른 Cortex-M은 Thumb-2만 알고 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Thumb-2는 &lt;em&gt;적어도&lt;/em&gt; 조립 수준 이상으로 대부분 이전 버전과 호환됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;hr&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;일부 아키텍처는 추가적인 명령을 추가합니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;따라서, 만약 이것이 ARMv6를 위한 것임을 알려주는 컴파일러 스위치와 함께 일부 코드가 컴파일된다면, 컴파일러는 ARMv6에는 있지만 ARMv5에는 없는 몇 안 되는 명령어 중 하나를 사용할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것은 거의 모든 플랫폼에서 직면하는 일반적인 상황입니다. 예를 들어 PC에서 C 코드를 컴파일할 경우, GCC를 사용하여&lt;/font&gt;&lt;/font&gt;&lt;code&gt;-march=core2&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;플래그를 지정하면 결과적인 바이너리가 이전의 펜티엄 프로세서에서 실행되지 않을 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;hr&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;몇 가지 통화 규칙이 있습니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;호출 규약은 함수가 매개변수와 반환 값을 교환하는 방법을 지정하는 규칙 집합입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;프로세서는 레지스터만 알고 스택에 대한 개념은 없습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;호출 규약은 어떤 레지스터 파라미터가 이동하는지, 그리고 그것들이 어떻게 인코딩되는지를 알려줍니다(예를 들어, 가 있는 경우).&lt;/font&gt;&lt;/font&gt;&lt;code&gt;char&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;매개 변수, 레지스터의 하위 8비트에 들어가지만 호출자가 상위 24비트를 삭제/서명해야 합니까, 아니면 그렇지 않습니까?)&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;적층 구조 및 정렬에 대해 설명합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;구조물 필드에 대한 정렬 조건 및 패딩을 정규화합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;ARM에는 ATPCS(구)와 AAPCS(신)라는 두 가지 주요 협약이 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;부동 소수점 값의 주제에 대해서는 상당히 다릅니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;정수 매개변수의 경우 대부분 동일하지만 AAPCS는 더 엄격한 스택 정렬이 필요합니다.&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;경우에 따라서는 ATPCS와 AAPCS 모두를 준수하는 일부 바이너리 코드를 가질 수 있지만 이는 신뢰할 수 없으며 불일치에 대한 경고도 없습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;결론은 서로 다른 호출 규약을 사용하는 시스템 간에 진정한 이진 호환성을 가질 수 없다는 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;hr&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;보조 프로세서(옵션)가 있습니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;ARM 아키텍처는 핵심 명령어 세트에 자체적인 명령어를 추가하는 옵션 요소로 확장할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;FPU는 그러한 선택적인 보조 프로세서입니다(실제로는 매우 드물게 볼 수 있습니다).&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;또 다른 보조 프로세서는 NEON으로, 일부 최신 ARM 프로세서에서 볼 수 있는 SIMD 명령어 세트입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;보조 프로세서를 사용하는 코드는 운영 체제가 해당 opcode를 트랩하고 보조 프로세서를 소프트웨어로 에뮬레이트하지 않는 한 해당 보조 프로세서를 포함하지 않는 프로세서에서 실행되지 않습니다(이것은 ATPCS 호출 규약을 사용할 때 부동 소수점 인수에서 일어나는 일이며 &lt;em&gt;속도&lt;/em&gt;가 느림).&lt;/font&gt;&lt;/p&gt; 
&lt;hr&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;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;윈텔 컴퓨터 대 인텔 맥 같은 ARM 대 ARM을 생각해 보세요.&lt;/font&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;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;ARM 대 ARM의 경우 대부분의 차이점은 코어가 아니라 코어를 둘러싸고 있는 벤더 고유의 논리입니다. 따라서 로드된 질문입니다. C 코드가 표준 API 호출을 호출하는 일부 애플리케이션이라면 암 또는 인텔 또는 powerpc 등에서 컴파일해야 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;애플리케이션이 온 칩이나 온보드 주변기기와 대화를 시작하게 되면 프로세서 유형이 무엇이든 간에 하나의 보드, 하나의 칩이 달라지므로 결과적으로 해당 칩이나 마더보드에 대해 C 코드를 작성해야 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;ARMv6용 이진 파일을 컴파일하면 ARMv4에서 정의되지 않은 것으로 간주되는 명령이 있을 수 있으며, 예외가 발생합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;ARMv4용으로 컴파일하면 ARMv6가 잘 실행됩니다.&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;font papago-translate=&quot;translated&quot;&gt;나는 곱셈을 좋아하지 않지만, 밀어내면 나눗셈 대신 곱셈을 할 것입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;x86은 정렬되지 않은 액세스로 인해 손상되었습니다. 지금 정렬된 I/O로 시작하면 정렬된 액세스를 선호하는 다른 칩으로 이동하는 것을 방지할 수 있고, 다양한 운영 체제와 부트로더가 ARM을 반응하도록 구성하는 것을 방지할 수 있습니다. x86에서 익숙했던 것은 그 어느 것도 아닙니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;마찬가지로 이 습관을 유지하면 x86 코드가 훨씬 더 빨리 실행됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;ARM ARM 사본을 받으세요(구글: ARM Architectural Reference Manual, 여러 곳에서 무료로 다운로드할 수 있습니다. 현재 리비전이 무엇인지 모르겠습니다. revI나 다른 것이 있을지도 모릅니다.).&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;ARM 명령어 세트를 찾아보면 대부분의 명령어가 모든 코어에서 지원되며, 일부 명령어는 분할 및 바이트 스왑 등 시간이 지남에 따라 추가되었습니다.&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;ARM은 칩을 만드는 것이 아니라 코어를 만들고 라이센스를 부여합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;칩에 ARM을 사용하는 대부분의 공급업체들은 그들만의 특별한 소스를 가지고 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;따라서 같은 프로세서가 중간에 있는 윈텔 대 맥과 같지만 프로세서가 만지고 사용해야 하는 모든 것에 있어서는 완전히 다릅니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;ARM 코어로 멈추지 않고, ARM은 주변기기, 부동 소수점 유닛, 캐시 등을 판매합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예를 들어 ARMv4가 동일한 경우에는 거의 없습니다.&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;ARM ARM 외에 칩의 암 부분에 대해서도 TRM(Technical Reference Manuals)이 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하지만 사용중인 부품에 대해 잘못된 TRM을 갖게 되면 두통을 유발할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;TRM에는 ARM ARM에 없는 레지스터 설명 등이 있을 수 있지만, 애플리케이션 공간에 거주하는 경우에는 ARM ARM이나 ARM이 필요하지 않을 가능성이 높습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;ARM ARM은 교육적인 목적으로 사용할 수 있습니다.&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;사용자 코드를 고수한다면 ARM 자체는 상당히 호환됩니다(물론 커널 코드는 다릅니다).&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;호스트 OS 환경에서는 ARMv5(ARM926 프로세서)를 사용할 가능성이 높습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;큰 차이는 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;캐시 동작은 크게 다릅니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;일부 ARM에 대한 캐시는 가상으로 처리되기도 하므로 프로세스 전환이 어려워질 수 있습니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;FPU는 여러 가지 맛(VFP, NEON 등)이 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;많은 소규모 프로세서에는 FPU조차 없습니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;엄지손가락 모드가 확 바뀌었습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;ARMv5 간의 썸 모드는 썸2(ARMv6+)로 휴대할 수 없거나 역호환이 가능하지 않습니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;만약 그 차이가 정말로 당신에게 중요하다면, 당신은 ARM의 공개 문서에서 그것을 알아낼 수 있을 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하지만 (C만큼 &quot;높은&quot; 정도만이라도) 상위 언어로 쓰는 것의 핵심은 &lt;strong&gt;그것에 대해 걱정하지 않는&lt;/strong&gt; 것입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;당신이 하는 일은 &lt;strong&gt;재컴파일&lt;/strong&gt; 뿐입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;커널 내에서도 어셈블리에 쓸 필요는 별로 없습니다. 어셈블리에 쓸 &lt;em&gt;필요&lt;/em&gt;가 없는 경우(예: 최대 성능을 얻기 위해서가 아니라), 일반적으로 CPU의 선택권 이상(예: 메모리 매핑된 위치에 직접적으로 저장된 것)에 기인합니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;일반적으로 아키텍처 간에 포팅할 때 확인해야 할 영역의 매우 빠르고 더러운 목록:&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;Endianness&lt;/strong&gt;: 조합 사용, 데이터 유형 캐스팅, 비트 필드, 데이터 공유&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;정렬&lt;/strong&gt;: 정렬 요구사항 뿐만 아니라 가능한 비 정렬 액세스의 성능 특성&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;기억 모델&lt;/strong&gt;: 약한 것 vs 강한 것?&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;멀티 &lt;strong&gt;코어&lt;/strong&gt;: 코히런시는 어떻게 작동합니까?&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;기타&lt;/strong&gt;: 서명된 데이터 형식 vs 서명되지 않은 데이터 형식, 데이터 구조 패킹, 스택 사용량, 열거 데이터 형식...&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/4381102/differences-between-arm-architectures-from-a-c-programmers-perspective&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>c</category>
      <author>powerit</author>
      <guid isPermaLink="true">https://powerit.tistory.com/1424</guid>
      <comments>https://powerit.tistory.com/1424#entry1424comment</comments>
      <pubDate>Sat, 4 Nov 2023 13:22:30 +0900</pubDate>
    </item>
    <item>
      <title>_REENTRANT 플래그란 무엇입니까?</title>
      <link>https://powerit.tistory.com/1423</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;_REENTRANT 플래그란 무엇입니까?&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;gcc -lpthread -D_REENTRANT -o someprogram someprogram.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;깃발이 정확히 무엇입니까?&lt;/font&gt;&lt;/font&gt;&lt;code&gt;-D_REENTRANT&lt;/code&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;_REENTRANT를 정의하면 컴파일러가 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;&lt;a href=&quot;https://www.gnu.org/software/libc/manual/html_node/Feature-Test-Macros.html#Feature-Test-Macros&quot; rel=&quot;noreferrer&quot;&gt;libc 8.2 설명서&lt;/a&gt;에서 발췌:&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;매크로: _REENTRANT&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;매크로: _THREAD_SAFE&lt;/font&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;값 199506L로 _POSIX_C_SOURES를 정의하는 것과 동일한 효과가 있습니다.&lt;/font&gt;&lt;/p&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;매우 오래된 일부 C 라이브러리는 기본 기능(예: getchar)에 대해 스레드 세이프(thread-safe)를 위해 이러한 매크로 중 하나를 정의할 것을 요구했습니다.&lt;/font&gt;&lt;/p&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;새 프로그램에서는 _GNU_SOURE를 사용하는 것이 좋습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;GCC에 '-ansi' 옵션이나 -std=c99와 같은 다른 적합성 옵션을 지정하지 않고 이러한 매크로를 명시적으로 정의하지 않으면 _DEFAULT_SOURES를 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;예를 들어 _POSIX_C_SOURNECT를 정의하는 경우 _POSIX_SOURNECT도 정의하지 않습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;마찬가지로 _GNU_SOURNECT를 정의하면 _POSIX_SOURNECT 또는 _POSIX_C_SOURNECT 중 하나를 정의해도 효과가 없습니다.&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;_REENTRANT를 정의하면 컴파일러가 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;/blockquote&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;OP와 저는 둘다 질문에 관심이 많아서 실제로 답을 올리기로 했습니다. :) 다음과 같은 일들이 발생합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;_REENTRANT&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Mac OS X 10.11.6의 경우:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;code&gt;&amp;lt;math.h&amp;gt;&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;에 대한 신고를 득함&lt;/font&gt;&lt;/font&gt;&lt;code&gt;lgammaf_r&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;lgamma_r&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;,그리고.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;lgammal_r&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;리눅스(Red Hat Enterprise Server 5.10)에서 다음과 같은 변경 사항이 표시됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;code&gt;&amp;lt;unistd.h&amp;gt;&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;POSIX 1995 함수에 대한 선언을 얻습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;getlogin_r&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/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;_REENTRANT&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;요즘은 대부분 노옵(No opp.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그것은 한때 다음과 같은 많은 새로운 기능을 선언했을지도 모릅니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;strtok_r&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;; 하지만 요즘은 그러한 기능들이 대부분 수십 년 된 다양한 표준(C99, POSIX 95, &lt;a href=&quot;http://www.unix.org/whitepapers/reentrant.html&quot; rel=&quot;noreferrer&quot;&gt;POSIX.1-2001&lt;/a&gt; 등)에 의해 의무화되어 있기 때문에 항상 활성화되어 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제가 확인한 두 시스템이 왜 선언을 &lt;em&gt;피하는지&lt;/em&gt; 모르겠습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;lgamma_r&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;반응을 보다&lt;/font&gt;&lt;/font&gt;&lt;code&gt;getlogin_r&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언제&lt;/font&gt;&lt;/font&gt;&lt;code&gt;_REENTRANT&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 papago-translate=&quot;translated&quot;&gt;제 추측으로는 이것은 아무도 겪지 않고 치우려고 하지 않았던 역사적인 공예품일 뿐입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;물론 이 두 시스템에 대한 제 관찰이 코드가 마주칠 수 있는 &lt;em&gt;모든&lt;/em&gt; 시스템에 일반화되지는 않을 것입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;당신은 분명히 여전히 통과해야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;-pthread&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;컴파일러에게(또는 덜 좋지만 괜찮음)&lt;/font&gt;&lt;/font&gt;&lt;code&gt;-lpthread -D_REENTRANT&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;프로그램에 pthread가 필요할 때마다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다중 스레드 프로그램에서 컴파일러에게 #가 프로그램에 줄을 포함하기 전에 _REENTRANT 매크로를 정의하여 이 기능이 필요하다고 알립니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것은 세 가지 일을 수행하며, 매우 우아하게 수행하기 때문에 일반적으로 무엇이 이루어졌는지 알 필요가 없습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;일부 기능은 재진입 안전 등가물에 대한 프로토타입을 제공합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이들은 일반적으로 동일한 함수 이름이지만 _radded가 있으면 gethostbyname이(가) gethostbyname_r로 변경됩니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;일반적으로 매크로로 구현되는 일부 stdio.h 함수는 적절한 재진입 안전 함수가 됩니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;errno.h의 변수 errno는 다중 스레드 안전한 방법으로 실제 errno 값을 결정할 수 있는 함수를 호출하도록 변경됩니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;리눅스 프로그래밍을 시작할 때 가져옴&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;간단히 _REENTRANT를 전처리기용으로 정의했습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;연관된 코드 어딘가에서 아마&lt;/font&gt;&lt;/font&gt;&lt;code&gt;#ifdef _REENTRANT&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아니면&lt;/font&gt;&lt;/font&gt;&lt;code&gt;#if defined(_REENTRANT)&lt;/code&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;_REENTRANT:&quot;라는 이름은 구현자의 이름 공간에 있습니다(밑줄로 시작하여 다른 밑줄이나 대문자로 시작하는 이름은 모두 해당). 따라서 이 이름을 정의하면 표준이 정의하는 범위를 벗어났다는 것을 의미합니다(적어도 C 또는 C++ 표준).&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/2601753/what-is-the-reentrant-flag&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>c</category>
      <author>powerit</author>
      <guid isPermaLink="true">https://powerit.tistory.com/1423</guid>
      <comments>https://powerit.tistory.com/1423#entry1423comment</comments>
      <pubDate>Sat, 4 Nov 2023 13:22:23 +0900</pubDate>
    </item>
    <item>
      <title>ui-grid 행의 높이를 변경하는 방법은?</title>
      <link>https://powerit.tistory.com/1422</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;ui-grid 행의 높이를 변경하는 방법은?&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 &lt;a href=&quot;http://ui-grid.info&quot;&gt;ui-grid&lt;/a&gt;를 사용하고 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 줄이 많아서 스크롤을 사용합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제가 줄의 높이를 바꾸려고 할 때까지 모든 것이 완벽하게 작동합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러면 스크롤이 엉망이 됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여기에 예를 추가했습니다. http://plnkr.co/edit/S6ylwOVgcQp7CSsZZxpR?p=preview 이것은 ui-grid 웹사이트의 튜토리얼 중 하나입니다 - 제가 변경한 것은 CSS뿐입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 규칙들을 추가했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;.ui-grid-cell-contents {
  padding: 1px 1px;
}

.ui-grid-render-container-body .ui-grid-header-cell,
.ui-grid-render-container-left .ui-grid-header-cell,
.grid .ui-grid-row,
.grid .ui-grid-cell,
.grid .ui-grid-cell .ui-grid-vertical-bar {
  height: 22px !important;
  font-size: 12px;
  line-height: 20px;
}
.ui-grid-render-container-body .ui-grid-header-cell,
.ui-grid-render-container-left .ui-grid-header-cell,
ui-grid-header-cell {
  height: 55px !important;
}
.ui-grid-filter-container {
  padding: 1px 3px;
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;위의 CSS 규칙을 제거하면 스크롤이 완벽하게 작동합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;따라서 CSS 규칙을 더 추가하거나 줄 높이를 제대로 설정하기 위해 그리드의 API를 사용해야 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;어떤 도움이라도 주시면 감사하겠습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;행 높이를 변경하고 부드럽게 스크롤하려면 어떻게 해야 합니까?&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;업데이트&lt;/strong&gt;: 다음은 기본 그리드와 수정된 CSS를 비교한 것입니다. &lt;strong&gt;http://plnkr.co/edit/x1nQGvpkY4bRMs9D09Ws?p=preview&lt;/strong&gt; 은 각 그리드에 대해 행을 위아래로 스크롤합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그 차이는 꽤 분명할 것입니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음 항목을 제거합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;height: 22px !important;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;CSS에서 다음을 추가합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;rowHeight:22
&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;a href=&quot;http://plnkr.co/edit/KyeJqGYL3kRFNgXc9rEZ?p=preview&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;scope.gridOptions = {rowHeight: 33 } 행 높이를 변경하는 가장 좋은 방법은 그리드 옵션입니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 내용을 CSS에 추가해 보십시오.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;.ui-grid-viewport .ui-grid-cell-contents {
  word-wrap: break-word;
  white-space: normal !important;
}

.ui-grid-row, .ui-grid-cell {
  height: auto !important;
}

.ui-grid-row div[role=row] {
  display: flex ;
  align-content: stretch;
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;그리드&lt;/strong&gt; 클래스를 그에 맞게 변경하면 됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;.grid{
    height: 70vh;
}
&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/27200875/how-to-change-height-of-ui-grid-row&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>angularJS</category>
      <author>powerit</author>
      <guid isPermaLink="true">https://powerit.tistory.com/1422</guid>
      <comments>https://powerit.tistory.com/1422#entry1422comment</comments>
      <pubDate>Sat, 4 Nov 2023 13:22:17 +0900</pubDate>
    </item>
    <item>
      <title>pip을 사용할 수 없기 때문에 pyvenv가 작동하지 않습니다.</title>
      <link>https://powerit.tistory.com/1421</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;pip을 사용할 수 없기 때문에 pyvenv가 작동하지 않습니다.&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;며칠 전 ubuntu 14.04에서 ubuntu 16.04로 업그레이드 했습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;을(를) 사용하여 가상 환경을 만들 때&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;pyvenv .venv
&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;python3 -m venv .venv
&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;The virtual environment was not created successfully because ensurepip is not
available.  On Debian/Ubuntu systems, you need to install the python3-venv
package using the following command.

    apt-get install python3-venv

You may need to use sudo with that command.  After installing the python3-venv
package, recreate your virtual environment.

Failing command: ['/home/user/.venv/bin/python3.5', '-Im', 'ensurepip', '--upgrade', '--default-pip']
&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 apt-get install python3-venv
&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 apt-get install python3.5-venv
&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;python 3.6-venv 설치 시도:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;sudo apt-get install python3.6-venv
&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;export LC_ALL=&quot;en_US.UTF-8&quot;
export LC_CTYPE=&quot;en_US.UTF-8&quot;
sudo dpkg-reconfigure locales
&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/14547631/python-locale-error-unsupported-locale-setting&quot;&gt;발견&lt;/a&gt;된 파이썬 &lt;a href=&quot;https://stackoverflow.com/questions/14547631/python-locale-error-unsupported-locale-setting&quot;&gt;로케일 오류: 지원&lt;/a&gt;되지 않는 &lt;a href=&quot;https://stackoverflow.com/questions/14547631/python-locale-error-unsupported-locale-setting&quot;&gt;로케일 설정&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;윈도우 리눅스 서브시스템과 우분투 18.04에서는 최근에 업그레이드를 하지 않았기 때문에 발생했습니다.&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 apt update
sudo apt upgrade
&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;sudo apt install python3-venv&lt;/code&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;a href=&quot;https://stackoverflow.com/a/39539571/309334&quot;&gt;UTF-8 솔루션&lt;/a&gt;을 미리 사용해 본 적이 있음을 유의하십시오(저는 이 솔루션을 제 일부로 만들었습니다).&lt;/font&gt;&lt;/font&gt;&lt;code&gt;.bashrc&lt;/code&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;다른 답변 중 하나가 저번에 고쳐줬지만 Python 3.7에서는 다음과 같이 해야 했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;apt install python3-pip python3-setuptools python3.7-venv
&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;python3.7 -m venv /path/to/venv
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Ubuntu18에서 이 &lt;a href=&quot;https://stackoverflow.com/a/53071893/3398492&quot;&gt;답변&lt;/a&gt;이 나왔을 때 비슷한 문제를 해결했습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;@Niko Rikken에서 작동했던 것과 유사하지만, 새로운 PPA와 &quot;python 3.8-distutils&quot; 패키지가 필요하지 않습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;venv로 새로운 python3.8 환경을 설치하고 있었는데 이미 &quot;python3-venv&quot;가 설치되어 있고 최신 상태이므로 해결책은 &quot;python3.8-venv&quot;만 설치하는 것이었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;% sudo apt-get install python3.8-venv
&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;% python3.8 -m venv ~/envs/new_env
% source ~/envs/new_env/bin/activate
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제 경우에는 다음 단계가 효과가 있었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;우분투 18.04.4 LTS&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;pre class=&quot;lang-sh prettyprint-override&quot;&gt;&lt;code&gt; $ sudo apt-get install python3-venv python3.7-venv
 $ python3.7 -m venv [your_path_to_virtual_env_here]
&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;이것이 누군가에게 도움이 된다면 우분투 18.04에서도 같은 오류가 발생했습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;로케일을 설정하고 설치를 시도하지 않았습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;python3-venv&lt;/code&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;$ sudo apt-get install python3-venv
Reading package lists... Done
Building dependency tree
Reading state information... Done
Some packages could not be installed. This may mean that you have
requested an impossible situation or if you are using the unstable
distribution that some required packages have not yet been created
or been moved out of Incoming.
The following information may help to resolve the situation:

The following packages have unmet dependencies:
 python3-venv : Depends: python3.6-venv (&amp;gt;= 3.6.5-2~) but it is not going to be installed
                Depends: python3 (= 3.6.5-3) but 3.6.7-1~18.04 is to be installed
E: Unable to correct problems, you have held broken packages.
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고 적절한 저장소에는 파이썬의 두 가지 버전이 있었던 것 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$ apt list python3 -a
python3/bionic-updates,now 3.6.7-1~18.04 amd64 [installed]
python3/bionic 3.6.5-3 amd64
&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;Python3.6.5-3&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;Python 3.7을 설치하고 다음과 같이 venv를 만들어 문제를 해결할 수 있었습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$ sudo apt-get install python3.7 python3.7-venv
$ python3.7 -m venv my_venv
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;최근에 출시된 &lt;strong&gt;파이썬-3.8&lt;/strong&gt;의 &lt;strong&gt;우분투 18.04&lt;/strong&gt;에서 이 문제가 발생했습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;내 해결책은 필요한 &lt;a href=&quot;https://launchpad.net/%7Edeadsnakes/+archive/ubuntu/ppa&quot; rel=&quot;noreferrer&quot;&gt;것&lt;/a&gt;을 공급하는 Deadsnakes &lt;a href=&quot;https://launchpad.net/%7Edeadsnakes/+archive/ubuntu/ppa&quot; rel=&quot;noreferrer&quot;&gt;PPA&lt;/a&gt;를 추가하는 것이었습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;python3.8-distutils&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;패키지. 더&lt;/font&gt;&lt;/font&gt;&lt;code&gt;python3.8-venv&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://dev.to/mortoray/how-to-install-python-3-8-on-ubuntu-1bp4&quot; rel=&quot;noreferrer&quot;&gt;블로그 포스트&lt;/a&gt; 덕분에:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-sh prettyprint-override&quot;&gt;&lt;code&gt;sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt update
sudo apt install python3.8
sudo apt install python3.8-distutils
sudo apt install python3.8-venv
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;참고:&lt;/strong&gt; 이는 일시적인 해결책일 뿐입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;가까운 장래에 필요한 것은&lt;/font&gt;&lt;/font&gt;&lt;code&gt;python3.8-distutils&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;패키지는 기본 Ubuntu 저장소에서 사용할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/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;Ubuntu 20.04 LTS의 경우 &lt;a href=&quot;https://packages.ubuntu.com/focal/python3-distutils&quot; rel=&quot;noreferrer&quot;&gt;Python3-distutils&lt;/a&gt; 패키지는 Python 3.8을 기반으로 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아직 Ubuntu 18.04 LTS에서 사용할 수 있는 Python 3.8 패키지 배포 패키지가 없습니다.&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;distutils&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;제 사용 사례를 위한 것이었지만, PPA를 추가하기 전에 그 해결책을 고려해 주시기 바랍니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;ol&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;먼저 디렉토리를 만듭니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;pre&gt;&lt;code&gt;mkdir testing
&lt;/code&gt;&lt;/pre&gt; 
&lt;ol start=&quot;2&quot;&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그런 다음 testing이라는 디렉토리로 이동했습니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;pre&gt;&lt;code&gt;cd testing
&lt;/code&gt;&lt;/pre&gt; 
&lt;ol start=&quot;3&quot;&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 디렉토리에서 다음 명령을 입력하는 경우:&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;pre&gt;&lt;code&gt;python3 -m venv env
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음과 같은 오류가 발생했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;파이프를 사용할 수 없으므로 가상 환경을 만들지 못했습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Debian/Ubuntu 시스템에서는 다음 명령을 사용하여 python3-venv 패키지를 설치해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;apt install python3.8-venv
&lt;/code&gt;&lt;/pre&gt; 
&lt;ol start=&quot;4&quot;&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음 명령을 입력하되 그 전에 기계에 설치한 python의 버전을 확인하십시오. 제 경우에는 python 3.8입니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;pre&gt;&lt;code&gt;sudo apt install python3.8-venv
&lt;/code&gt;&lt;/pre&gt; 
&lt;ol start=&quot;5&quot;&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이제 가상 환경을 만들고 도구를 &quot;반다리&quot; 폴더에 저장할 수 있습니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;pre&gt;&lt;code&gt;python3 -m venv bhandari   
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;참고: 이 &quot;bhandari&quot; 폴더의 이름을 지정할 수 있습니다. 원하는 이름은 무엇이든 지정할 수 있습니다(표준 관행은 &quot;env&quot;...).&lt;/font&gt;&lt;/p&gt; 
&lt;ol start=&quot;6&quot;&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이제 가상 환경을 활성화하려면 폴더의 디렉토리에서 다음 명령을 입력하면 &quot;bhandari&quot; 폴더에서 가상 환경을 활성화합니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;pre&gt;&lt;code&gt;source bhandari/bin/activate
&lt;/code&gt;&lt;/pre&gt; 
&lt;ol start=&quot;7&quot;&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;가상 환경을 성공적으로 활성화했으면 가상 환경에서 작업 중임을 나타내는 (bandari) 단어가 표시됩니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 후에 시스템의 나머지 부분에서 분리되는 것은 무엇이든 설치할 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;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;시스템 파이썬에 대해 Debian/Ubuntu에서 pip이 비활성화되어 있는지 확인합니다.&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;pre class=&quot;lang-sh prettyprint-override&quot;&gt;&lt;code&gt;python3 -m venv myvenv --without-pip --system-site-packages
&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 apt install python-virtualenv
virtualenv --python=python3.6 myenv
&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;E: Unable to locate package python3-venv&lt;/code&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;sudo apt install python3.6-venv
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Python이 업데이트되었거나 Default python이 변경되었으며 venv가 이미 설치되어 있음&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;시스템에 설치된 venv는 &lt;strong&gt;이전 파이썬 버전&lt;/strong&gt;(파이썬 3.6이라고 하자)에 &lt;strong&gt;의해&lt;/strong&gt; 설치됩니다. 이것이 venv가 &lt;strong&gt;현재&lt;/strong&gt; 파이썬 &lt;strong&gt;버전&lt;/strong&gt;(파이썬 3.8이라고 하자)에서&lt;strong&gt; 작동하지 않는&lt;/strong&gt; 이유입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;따라서 먼저 기본 python 또는 python3 버전을 확인합니다(현재 버전이 python3.8이라고 가정합니다).&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음과 같이 &lt;strong&gt;&lt;em&gt;현재 python 버전&lt;/em&gt;&lt;/strong&gt;(3.8)을&lt;strong&gt; 언급하여 가상 환경을 재설치&lt;/strong&gt;합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;sudo apt-get install python3.xx-venv        &amp;gt;&amp;gt; replace xx with your current/default python version
&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;strong&gt;버전&lt;/strong&gt;을 언급해야만 했습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;python&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고 python 3&lt;strong&gt;.10&lt;/strong&gt;을 당신 버전으로 대체합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt; $ sudo apt-get update -y &amp;amp;&amp;amp; sudo apt-get upgrade -y
 $ sudo apt-get install python3.10-venv
&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;$ python3.10 -m venv --system-site-packages Project_Name
&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;python3.* -m venv myvenv -&lt;/code&gt; &lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;*를 특정 버전의 python으로 교체하는 것을 잊지 마십시오.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Ubuntu 18.04에서 pip과 venv를 포함하여 python3.8을 얻을 의도였다면:&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;code&gt;sudo apt install python3.8 python3.8-venv python3-pip&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;# python 3.8-pip 패키지가 없습니다.&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;python3.8 -m venv venv&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;source venv/bin/activate&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;python --version&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;# -&amp;gt; python 3.8.0&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;pip --version&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;# -&amp;gt; /home/user/venv/lib/python 3.8/site-packages에서 9.0.1 pip (python 3.8)&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;설치 시도&lt;/font&gt;&lt;/font&gt;&lt;code&gt;python3-distutils&lt;/code&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;파이썬 3.8의 경우 다음과 같은 것이 효과가 있었습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-sh prettyprint-override&quot;&gt;&lt;code&gt;$ apt-get install python3.8 python3.8-venv python3.8-distutils python3.8-dev

&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;방금 데비안/우분투 시스템 몇 개에서 이 문제를 발견했습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;위와 같은 오류입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;소견&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;python -m venv venvdir
&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;em&gt;만들어냈습니다&lt;/em&gt;.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;그래서&lt;/strong&gt; 저는 보장 파이프를 실행해 보았습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;venvdir/bin/python -m ensurepip

Traceback (most recent call last):
    File &quot;/usr/lib/python3.9/runpy.py&quot;, line 197, in _run_module_as_main                       
        return _run_code(code, main_globals, None,                                             
    File &quot;/usr/lib/python3.9/runpy.py&quot;, line 87, in _run_code                                  
        exec(code, run_globals)                                                                
    File &quot;/usr/lib/python3.9/ensurepip/__main__.py&quot;, line 5, in &amp;lt;module&amp;gt;                       
        sys.exit(ensurepip._main())                                                            
    File &quot;/usr/lib/python3.9/ensurepip/__init__.py&quot;, line 266, in _main                        
        return _bootstrap(                                                                     
    File &quot;/usr/lib/python3.9/ensurepip/__init__.py&quot;, line 166, in _bootstrap                  
         copy_wheels(dependencies, venv_wheel_dir, sys.path)                                    
    File &quot;/usr/lib/python3.9/ensurepip/__init__.py&quot;, line 144, in copy_wheels                  
        assert len(wheel_names) == 1, wheel_names                                            

AssertionError: ['/usr/share/python-wheels/pyparsing-2.2.0-py2.py3-none-any.whl', '/usr/s
hare/python-wheels/pyparsing-2.4.7-py2.py3-none-any.whl']
&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;/usr/share/python-wheels/&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;나는 왜 securepip이 오직 하나의 휠 파일만 찾는지 이해할 수 &lt;em&gt;없습니다&lt;/em&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;dpkg -S /usr/share/python-wheels&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;는 것을 나타냈습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;python-pip-whl&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;package가 그 파일들의 근원입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것은 Ubuntu와 Debian 모두에게 해당되는 것으로 보입니다.&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;cd /usr/share
sudo mv python-wheels python-wheels.old
sudo apt reinstall python-pip-whl
&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;/usr/share/python-wheels&lt;/code&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;저도 같은 문제가 있었습니다. python env는 2.7 버전과 3.6 버전 2개가 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;당신이 해야 할 일은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;https://github.com/pyenv/pyenv-installer&quot; rel=&quot;nofollow noreferrer&quot;&gt;pyenv 설치&lt;/a&gt; 관리자를 설치하여 최신 버전의 pip 설치&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;https://github.com/pyenv/pyenv/wiki&quot; rel=&quot;nofollow noreferrer&quot;&gt;여기&lt;/a&gt;에 나와 있는 pyenv 설치 절차를 반드시 따라야 합니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;행운을 빕니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;실행할 때 기존 프로젝트에 대해 동일한 문제가 발생했습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;python3 -m venv venv&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;venv&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://stackoverflow.com/a/39539571/4565299&quot;&gt;UTF-8 솔루션&lt;/a&gt;도 사용해 보았습니다.)&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저의 문제는 허가와 소유권에 관한 것이었습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;현재 디렉터리의 소유자로 다른 사용자와 로그인하여 이 오류가 발생했습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;모든 권한을 검토하고 수정한 후 venv 레귤러를 설치할 수 있었습니다.&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;code&gt;sudo apt-get update&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; sudo apt-get install -y python3-venv zip&lt;/code&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;저는 결국 pip3를 설치해서 작동하게 됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-sh prettyprint-override&quot;&gt;&lt;code&gt;apt-get install python3-pip

# then run
python3.8 -m venv env
&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;python -m build&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;파이썬 패키지를 만들기 위해서, 이것은 아마도 당신의 신택스 문제가 있을 것이라는 것을 의미합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;setup.cfg&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아니면&lt;/font&gt;&lt;/font&gt;&lt;code&gt;setup.py&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;종속성 설치에 필요한 임시 venv를 생성하는 오류를 발생시키는 파일입니다.&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;pip wheels .&lt;/code&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;Linux의 경우 기본적으로 venv를 설치해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;// at first check python version
python --version

// install 
sudo apt update
sudo apt install python3.8-venv
sudo apt install python3.8-distutils

// create new env
python3 -m venv project-name
source project-name/bin/activate
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;python3-venv 설치 솔루션은 debian/ubuntu가 여러 패키지에 걸쳐 python 배포판을 분할했기 때문에 실제로 전체 python 설치가 없습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 appt 패키지를 설치하지 않으려는 경우 여기 대안이 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;python3 -m pip install virtualenv
virtualenv .venv
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이렇게 하면 완전히 작동하는 벤브가 생성됩니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 모든 제안들은 저에게 도움이 되지 않았습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$ apt list python3 -a
python3/now 3.6.7-1~18.04 amd64 [installed,local]
python3/bionic 3.6.5-3 amd64
&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;sudo apt-get install python3/bionic&lt;/code&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이제 python 3.6.5를 가지고 있고 apt-list는 $apt list python3 - a python3/bioonic 3.6.5-3 amd64로 더 나은 목록을 보여주었습니다.&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 apt-get install python3-venv/bionic&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 pythno3-venv를 설치할 수 있었고 모든 것이 작동했습니다.&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 apt-get install python3.8-venv&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;성공했지만 실행할 때 동일한 오류가 나타납니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;python3 -m venv .venv&lt;/code&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;python3.8 -c 'import venv; venv.create(&quot;.venv&quot;, with_pip=True)'&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;우분투 14.04에 대한 나의 대답은 다음과 같습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 다양한 파이썬 버전으로 venv와 pip 작업을 할 수 있었습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;세부사항:&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;3.4: 우분투 14.04에는 파이썬 3.4(패키지 파이썬 3.4 등)가 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;작동:&lt;/font&gt;&lt;/p&gt; &lt;pre class=&quot;lang-sh prettyprint-override&quot;&gt;&lt;code&gt;$ sudo apt-get install python3.4 python3.4-dev python3.4-venv gcc libc6-dev
$ mkdir /tmp/try3.4
$ python3.4 -m venv /tmp/try3.4
$ . /tmp/try/bin/activate
(try3.4) $ pip install print-hello-world
...
(try3.4) $ print-hello-world
Hello World!
&lt;/code&gt;&lt;/pre&gt; &lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;한다면&lt;/font&gt;&lt;/font&gt;&lt;code&gt;python3.4-venv&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;에서 제거됩니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;apt-get install&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;위의 명령을 실행한 다음&lt;/font&gt;&lt;/font&gt;&lt;code&gt;python3.4 -m venv&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;apt-get install python3-venv&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;python3.4-venv&lt;/code&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;Python 3.4는 상당히 오래된 것이며 PyPI에서 사용 가능한 일부 Python 패키지(pip을 통해)는 작동하지 않습니다.&lt;/font&gt;&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;3.5: 죽은 뱀 저장소에서 설치할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;작동:&lt;/font&gt;&lt;/p&gt; &lt;pre class=&quot;lang-sh prettyprint-override&quot;&gt;&lt;code&gt;$ sudo add-apt-repository ppa:deadsnakes/ppa
$ sudo apt-get update
$ sudo apt-get install python3.5 python3.5-dev python3.5-venv gcc libc6-dev
$ mkdir /tmp/try3.5
$ python3.5 -m venv /tmp/try
$ . /tmp/try/bin/activate
(try3.5) $ pip install print-hello-world
...
(try3.5) $ print-hello-world
Hello World!
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;3.6: Ditto, 죽은 뱀 저장소에서 설치할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;작동:&lt;/font&gt;&lt;/p&gt; &lt;pre class=&quot;lang-sh prettyprint-override&quot;&gt;&lt;code&gt;$ sudo add-apt-repository ppa:deadsnakes/ppa
$ sudo apt-get update
$ sudo apt-get install python3.6 python3.6-dev python3.6-venv gcc libc6-dev
$ mkdir /tmp/try3.6
$ python3.6 -m venv /tmp/try3.6
$ . /tmp/try3.6/bin/activate
(try3.6) $ pip install print-hello-world
...
(try3.6) $ print-hello-world
Hello World!
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;3.7: 작동이 안 돼요.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;pip install&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;실패로 돌아가다&lt;/font&gt;&lt;/font&gt;&lt;code&gt;import _ssl&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;, 그리고 데드 스네이크 레포의 python3.7에는 해당 모듈이 없습니다. 우분투 14.04는 Python 3.7이 지원하지 않는 OpenSSL의 이전 버전과 함께 제공되기 때문입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;https://github.com/deadsnakes/issues/issues/63&quot; rel=&quot;nofollow noreferrer&quot;&gt;자세한&lt;/a&gt; 내용은 이 &lt;a href=&quot;https://github.com/deadsnakes/issues/issues/63&quot; rel=&quot;nofollow noreferrer&quot;&gt;버그&lt;/a&gt;를 참조하십시오.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;3.8--: Ubuntu 또는 deadsnakes 저장소에 이러한 Python 버전을 위한 Ubuntu 14.04 패키지가 없습니다.&lt;/font&gt;&lt;/p&gt; &lt;/li&gt; 
&lt;/ul&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저의 경우 아직 가상 환경에 있지만 이를 빠르게 인지하지 못했기 때문에 명령이 실패했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;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;deactivate&lt;/code&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;저는 sudo 권한이 없고 python3를 사용해야 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;5:&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;virtualenv 설치: pip3 virtualenv&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;pip이 없는 virtualenv 생성: python3 -mv --without-pip &amp;lt;path&amp;gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;올바른 pip 부트스트랩 다운로드: https://bootstrap.pypa.io/pip/3.5/get-pip.py&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;실행: &amp;lt;path&amp;gt;/bin/ python3 get-pip.py&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;source &amp;lt;path&amp;gt;/bin/activate'를 수행하여 작업 환경을 얻었습니다.&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/39539110/pyvenv-not-working-because-ensurepip-is-not-available&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>python</category>
      <author>powerit</author>
      <guid isPermaLink="true">https://powerit.tistory.com/1421</guid>
      <comments>https://powerit.tistory.com/1421#entry1421comment</comments>
      <pubDate>Sat, 4 Nov 2023 13:22:10 +0900</pubDate>
    </item>
    <item>
      <title>사용자 지정 파이썬 목록 정렬</title>
      <link>https://powerit.tistory.com/1420</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;alist.sort(cmp_items)

def cmp_items(a, b):
    if a.foo &amp;gt; b.foo:
        return 1
    elif a.foo == b.foo:
        return 0
    else:
        return -1
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;코드는 작동합니다(그리고 저는 약 3년 전에 작성했습니다!). 하지만 파이썬 문서 어디에서도 이 문서를 찾을 수 없고 모두가 사용합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;sorted()&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;alist.sort(key=lambda x: x.foo)
&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;import operator
alist.sort(key=operator.attrgetter('foo'))
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;http://wiki.python.org/moin/HowTo/Sorting/&quot;&gt;방법 정렬&lt;/a&gt;을 확인해 보십시오. 매우 유용합니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;http://docs.python.org/library/stdtypes.html#mutable-sequence-types&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;sort() 메서드는 비교를 제어하기 위해 선택적 인수를 사용합니다.&lt;/font&gt;&lt;/p&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;cmp는 첫 번째 인수가 두 번째 인수보다 작거나 같거나 큰 것으로 간주되는지 여부에 따라 음수, 0 또는 양수를 반환해야 하는 두 인수(목록 항목)의 사용자 지정 비교 함수(cmp=lambda x,y:cmp(x.lower (), y.lower ())를 지정합니다.&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;이 예처럼.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 목록을 정렬하고 싶으십니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;[('c', 2), ('b', 2), ('a', 3)]
&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;[('a', 3), ('b', 2), ('c', 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;def letter_cmp(a, b):
    if a[1] &amp;gt; b[1]:
        return -1
    elif a[1] == b[1]:
        if a[0] &amp;gt; b[0]:
            return 1
        else:
            return -1
    else:
        return 1
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그런 다음 키 기능으로 변환합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;from functools import cmp_to_key
letter_cmp_key = cmp_to_key(letter_cmp))
&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;[('c', 2), ('b', 2), ('a', 3)].sort(key=letter_cmp_key)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것은 파이썬 3에서는 작동하지 않습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;함수 도구 cmp_to_key를 사용하여 이전 스타일의 비교 함수를 작동시킬 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;from functools import cmp_to_key

def cmp_items(a, b):
    if a.foo &amp;gt; b.foo:
        return 1
    elif a.foo == b.foo:
        return 0
    else:
        return -1

cmp_items_py3 = cmp_to_key(cmp_items)

alist.sort(key = cmp_items_py3)
&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;l = [(2, 3), (3, 4), (2, 4)]
l.sort(key = lambda x: (-x[0], -x[1]) )
print(l)
l.sort(key = lambda x: (x[0], -x[1]) )
print(l)
&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;[(3, 4), (2, 4), (2, 3)]
[(2, 4), (2, 3), (3, 4)]
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;출력은 우리가 튜플 형식으로 제공한 매개변수의 순서에 따라 정렬됩니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;더 좋은 점:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;student_tuples = [
    ('john', 'A', 15),
    ('jane', 'B', 12),
    ('dave', 'B', 10),
]

sorted(student_tuples, key=lambda student: student[2])   # sort by age
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;출처: https://docs.python.org/3/howto/sorting.html&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/11850425/custom-python-list-sorting&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>python</category>
      <author>powerit</author>
      <guid isPermaLink="true">https://powerit.tistory.com/1420</guid>
      <comments>https://powerit.tistory.com/1420#entry1420comment</comments>
      <pubDate>Sat, 4 Nov 2023 13:21:59 +0900</pubDate>
    </item>
    <item>
      <title>php_network_getaddresses: 도커의 관리자에서 getaddrinfo 오류가 발생했습니다.</title>
      <link>https://powerit.tistory.com/1419</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;php_network_getaddresses: 도커의 관리자에서 getaddrinfo 오류가 발생했습니다.&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;laravel 5/mysql 앱으로 도커 컨테이너의 관리자 접근에 문제가 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;오류가 발생했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: Name does not resolve
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;내 도커 작곡.yml:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;version: '3'

services:

    votes_app:
        build:
            context: ./web
            dockerfile: Dockerfile.yml

        container_name: votes_app_container
        environment:
            - APACHE_RUN_USER=#1000
        volumes:
            - ${APP_PATH_HOST}:${APP_PTH_CONTAINER}
        ports:
            - 8081:80
        working_dir: ${APP_PTH_CONTAINER}


    votes_db:
        image: mysql:5.6.41
        container_name: votes_db_container

        restart: always
        environment: 
            MYSQL_ROOT_PASSWORD: 1
        volumes:
            - ${DB_PATH_HOST}:/var/lib/mysql


    votes_adminer:
        image: adminer
        container_name: votes_adminer_container
        restart: always
        ports:
            - 8082:8080
        links:
            - votes_db


    votes_composer:
        image: composer:1.6
        container_name: votes_composer_container
        volumes:
            - ${APP_PATH_HOST}:${APP_PTH_CONTAINER}
        working_dir: ${APP_PTH_CONTAINER}
        command: composer install --ignore-platform-reqs
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;앱과 db 컨테이너의 포트가 다릅니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여기 https://hub.docker.com/_/adminer/ 에서 발견한 내용:&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;외부 서버와의 사용 ADMINER_DEFAULT_SERVER 환경 변수를 사용하여 기본 호스트를 지정할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;외부 서버 또는 기본 db가 아닌 다른 이름의 도커 컨테이너에 연결하는 경우 유용합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;pre&gt;&lt;code&gt;docker run -p 8080:8080 -e ADMINER_DEFAULT_SERVER=mysql adminer
&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 run -p 8089:8080 -e ADMINER_DEFAULT_SERVER=votes_db adminer 
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;https://i.stack.imgur.com/4yPTe.jpg 관리자에게 로그인을 시도하는 동일한 오류가 발생했기 때문에 apps port에서 사용되지 않았고 이 명령은 어쨌든 성공적이지 않았습니다.&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;수정된 블록 #2:&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;내 docker-compose.yml에서:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;version: '3'

services:

    votes_app:
        build:
            context: ./web
            dockerfile: Dockerfile.yml

        container_name: votes_app_container
        environment:
            - APACHE_RUN_USER=#1000
        volumes:
            - ${APP_PATH_HOST}:${APP_PTH_CONTAINER}
        ports:
            - 8081:80
        working_dir: ${APP_PTH_CONTAINER}


    db:
        image: mysql:5.6.41
        restart: always
        environment: 
            MYSQL_ROOT_PASSWORD: 1
        volumes:
            - ${DB_PATH_HOST}:/var/lib/mysql


    adminer:
        image: adminer
        restart: always
        ports:
            - 8082:8080
        links:
            - db


    votes_composer:
        image: composer:1.6
        container_name: votes_composer_container
        volumes:
            - ${APP_PATH_HOST}:${APP_PTH_CONTAINER}
        working_dir: ${APP_PTH_CONTAINER}
        command: composer install --ignore-platform-reqs
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;앱을 다시 만들었지만 관리자 https://i.stack.imgur.com/PdQqE.jpg 에 로그인하지 못했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사용되지 않는 다른 8089 포트를 가리키며 OS 콘솔에서 실행합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$ docker run -p 8089:8080 -e ADMINER_DEFAULT_SERVER=db adminer
PHP 7.2.11 Development Server started at Thu Nov  1 07:00:46 2018
[Thu Nov  1 07:01:11 2018] ::ffff:172.17.0.1:34048 [200]: /
[Thu Nov  1 07:01:20 2018] ::ffff:172.17.0.1:34052 [302]: /
[Thu Nov  1 07:01:21 2018] ::ffff:172.17.0.1:34060 [403]: /?server=db&amp;amp;username=root
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러나 다시 8089 포트에 admin으로 로그인하는 동안 오류가 발생했습니다. 그러나 오류 메시지가 다릅니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://i.stack.imgur.com/pEuHx.jpg&quot; rel=&quot;noreferrer&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;https://i.stack.imgur.com/pEuHx.jpg&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;수정된 블록 #3:&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;컨테이너를 재구축한 후 상자에 입력하면 콘솔 출력에 &quot;root&quot;이 표시되므로 그렇다고 생각합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$ docker-compose exec votes_app bash
root@a4aa907373f5:/var/www/html# ls -la
total 1063
drwxrwxrwx 1 root root   4096 Oct 27 12:01 .
drwxr-xr-x 1 root root   4096 Oct 16 00:11 ..
-rwxrwxrwx 1 root root    234 Oct 13 07:15 .editorconfig
-rwxrwxrwx 1 root root   1029 Oct 31 06:10 .env
-rwxrwxrwx 1 root root    651 Oct 13 07:15 .env.example
drwxrwxrwx 1 root root   4096 Nov  1 11:10 .git
-rwxrwxrwx 1 root root    111 Oct 13 07:15 .gitattributes
-rwxrwxrwx 1 root root    294 Oct 13 07:15 .gitignore
-rwxrwxrwx 1 root root   4356 Oct 13 07:15 1.txt
drwxrwxrwx 1 root root      0 Oct 13 07:15 __DOCS
drwxrwxrwx 1 root root      0 Oct 13 07:15 __SQL
drwxrwxrwx 1 root root   4096 Oct 13 07:15 app
-rwxrwxrwx 1 root root   1686 Oct 13 07:15 artisan                                                                                                                                                                     
drwxrwxrwx 1 root root      0 Oct 13 07:15 bootstrap                                                                                                                                                                   
-rwxrwxrwx 1 root root   2408 Oct 13 07:15 composer.json                                                                                                                                                               
-rwxrwxrwx 1 root root 200799 Oct 13 07:15 composer.lock                                                                                                                                                               
drwxrwxrwx 1 root root   4096 Oct 13 07:15 config                                                                                                                                                                      
drwxrwxrwx 1 root root   4096 Oct 13 07:15 database                                                                                                                                                                    
-rwxrwxrwx 1 root root  52218 Oct 17 05:25 db_1_err.txt                                                                                                                                                                
-rwxrwxrwx 1 root root 482562 Oct 13 07:15 package-lock.json                                                                                                                                                           
-rwxrwxrwx 1 root root   1168 Oct 13 07:15 package.json                                                                                                                                                                
-rwxrwxrwx 1 root root   1246 Oct 13 07:15 phpunit.xml                                                                                                                                                                 
drwxrwxrwx 1 root root   4096 Oct 13 07:15 public
-rwxrwxrwx 1 root root     66 Oct 13 07:15 readme.txt
drwxrwxrwx 1 root root      0 Oct 13 07:15 resources
drwxrwxrwx 1 root root   4096 Oct 13 07:15 routes
-rwxrwxrwx 1 root root    563 Oct 13 07:15 server.php
drwxrwxrwx 1 root root   4096 Oct 13 07:15 storage
drwxrwxrwx 1 root root      0 Oct 13 07:15 tests
drwxrwxrwx 1 root root   8192 Nov  1 13:05 vendor
-rwxrwxrwx 1 root root   1439 Oct 13 07:15 webpack.mix.js
-rwxrwxrwx 1 root root 261143 Oct 13 07:15 yarn.lock
root@a4aa907373f5:/var/www/html# echo $USER

root@a4aa907373f5:/var/www/html#  uname -a
Linux a4aa907373f5 4.15.0-36-generic #39-Ubuntu SMP Mon Sep 24 16:19:09 UTC 2018 x86_64 GNU/Linux
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;어쨌든 문제가 될 수 있습니까?&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;수정된 블록 #4&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;나는 이 도커를 다시 만들었고, 컨테이너의 기본 이름을 설정했고(나는 그것이 약간의 혼란을 야기한다고 생각한다), 이미지를 설정했습니다: composer:1.8 최신 버전 So in my docker-compose.yml :&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;version: '3.1'

services:

    web:

        build:
            context: ./web
            dockerfile: Dockerfile.yml

        environment:
            - APACHE_RUN_USER=#1000
        volumes:
            - ${APP_PATH_HOST}:${APP_PTH_CONTAINER}
        ports:
            - 8081:80
        working_dir: ${APP_PTH_CONTAINER}

    db:
        image: mysql:5.6.41
        restart: always
        environment: 
            MYSQL_ROOT_PASSWORD: 1
        volumes:
            - ${DB_PATH_HOST}:/var/lib/mysql

    adminer:
        image: adminer
        restart: always
        ports:
            - 8082:8080
        links:
            - db

    composer:
        image: composer:1.8
        volumes:
            - ${APP_PATH_HOST}:${APP_PTH_CONTAINER}
        working_dir: ${APP_PTH_CONTAINER}
        command: composer install --ignore-platform-reqs
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;웹/Dockerfile.yml:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;FROM php:7.2-apache

RUN apt-get update -y &amp;amp;&amp;amp; apt-get install -y libpng-dev nano

RUN docker-php-ext-install \
    pdo_mysql \
    &amp;amp;&amp;amp; a2enmod \
    rewrite
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하지만 어쨌든 프로젝트를 재구성하고 &lt;a href=&quot;http://127.0.0.1:8082&quot; rel=&quot;noreferrer&quot;&gt;http://127.0.0.1:8082&lt;/a&gt; url로 관리자에게 연결한 후 오류가 발생했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: Try again
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;추신: 다른 laravel 5.0/php:5.6 / 이미지: composer:1.6 / mcrypt installed docker project가 제 노트북의 동일한 로컬 서버에 있는데, 이 프로젝트는 저에게 잘 작동하고 관리자를 입력하고 이 앱에서 db에 로그인할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 도커 프로젝트의 파일은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;도커- compose.yml:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;version: '3.1'

services:

    web:
        build:
            context: ./web
            dockerfile: Dockerfile.yml

        environment:
            - APACHE_RUN_USER=#1000
        volumes:
            - ${APP_PATH_HOST}:${APP_PTH_CONTAINER}
        ports:
            - 8085:80
        working_dir: ${APP_PTH_CONTAINER}


    db:
        image: mysql:5.5.62
        restart: always
        environment: 
            MYSQL_ROOT_PASSWORD: 1
        volumes:
            - ${DB_PATH_HOST}:/var/lib/mysql


    adminer:
        image: adminer
        restart: always
        ports:
            - 8086:8080
        links:
            - db


    composer:
        image: composer:1.6
        volumes:
            - ${APP_PATH_HOST}:${APP_PTH_CONTAINER}
        working_dir: ${APP_PTH_CONTAINER}
        command: composer install --ignore-platform-reqs
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고 Dockerfile.yml:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;FROM php:5.6-apache

RUN apt-get update -y &amp;amp;&amp;amp; apt-get install -y libpng-dev   nano  libmcrypt-dev

RUN docker-php-ext-install \
    pdo_mysql \
    mcrypt \
    &amp;amp;&amp;amp; a2enmod \
    rewrite
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 문제는 일부 php 7.2 특정 기능입니까(일부 패키지가 누락된 것과 같이)?&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;수정된 블록 #5:&lt;/strong&gt; 정의된 경우:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;phpmyadmin:
    depends_on:
      - db
    image: phpmyadmin/phpmyadmin
    restart: always
    ports:
      - 8082:8080
    environment:
      PMA_HOST: db
      MYSQL_ROOT_PASSWORD: 1
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;http://127.0.0.1:8082/&quot; rel=&quot;noreferrer&quot;&gt;http://127.0.0.1:8082&lt;/a&gt; 실행 중&lt;a href=&quot;http://127.0.0.1:8082/&quot; rel=&quot;noreferrer&quot;&gt;/&lt;/a&gt; 브라우저에서 오류가 발생했습니다:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;This site can’t be reached The webpage at http://127.0.0.1:8082/ might be temporarily down or it may have moved permanently to a new web address.
ERR_SOCKET_NOT_CONNECTED
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;appurl &lt;a href=&quot;http://127.0.0.1:8081/public/&quot; rel=&quot;noreferrer&quot;&gt;http://&lt;/a&gt;127.&lt;a href=&quot;http://127.0.0.1:8081/public/&quot; rel=&quot;noreferrer&quot;&gt;0.0.1:8081/public/ &lt;/a&gt;오류가 발생했습니다:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: Temporary failure in name resolution 
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;MODIED BLOCK #6:&lt;/strong&gt; 나는 docker-compose.yml에서 phpmyadmin으로 리메이크했습니다:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;version: '3.1'

services:

#  docker run -p 8089:8080 -e ADMINER_DEFAULT_SERVER=db adminer
    web:

        # env_file:
        #     - ./mysql.env

        build:
            context: ./web
            dockerfile: Dockerfile.yml

        environment:
            - APACHE_RUN_USER=#1000
        volumes:
            - ${APP_PATH_HOST}:${APP_PTH_CONTAINER}
        ports:
            - 8081:80
        working_dir: ${APP_PTH_CONTAINER}


    db:
        image: mysql:5.6.41
        restart: always
        environment: 
            MYSQL_ROOT_PASSWORD: 1
        volumes:
            - ${DB_PATH_HOST}:/var/lib/mysql


    phpmyadmin:
        depends_on:
          - db
        image: phpmyadmin/phpmyadmin
        restart: always
        ports:
          - 8082:80
        environment:
          PMA_HOST: db
          MYSQL_ROOT_PASSWORD: 1

    composer:
        image: composer:1.8
        volumes:
            - ${APP_PATH_HOST}:${APP_PTH_CONTAINER}
        working_dir: ${APP_PTH_CONTAINER}
        command: composer install --ignore-platform-reqs
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;phpMyAdmin 에 로그인하려고 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;http://127.0.0.1:8082
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;같은 오류가 발생했습니다. https://i.stack.imgur.com/YCYUt.jpg&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;$ docker ps
CONTAINER ID        IMAGE                    COMMAND                  CREATED             STATUS                          PORTS                            NAMES
471de34926b9        phpmyadmin/phpmyadmin    &quot;/run.sh supervisord…&quot;   41 minutes ago      Up 41 minutes                   9000/tcp, 0.0.0.0:8082-&amp;gt;80/tcp   votes_docker_phpmyadmin_1
226fcdbeeb25        mysql:5.6.41             &quot;docker-entrypoint.s…&quot;   41 minutes ago      Restarting (1) 49 seconds ago                                    votes_docker_db_1
1cb1efb10561        votes_docker_web         &quot;docker-php-entrypoi…&quot;   41 minutes ago      Up 41 minutes                   0.0.0.0:8081-&amp;gt;80/tcp             votes_docker_web_1
d6718cd16256        adminer                  &quot;entrypoint.sh docke…&quot;   13 hours ago        Up About an hour                0.0.0.0:8088-&amp;gt;8080/tcp           ads_docker_adminer_1
1928a54e1d66        mysql:5.5.62             &quot;docker-entrypoint.s…&quot;   13 hours ago        Up About an hour                3306/tcp                         ads_docker_db_1
e43b2a1e9cc7        adminer                  &quot;entrypoint.sh docke…&quot;   6 days ago          Up About an hour                0.0.0.0:8086-&amp;gt;8080/tcp           youtubeapi_demo_adminer_1
47a034fca5a2        mysql:5.5.62             &quot;docker-entrypoint.s…&quot;   6 days ago          Up About an hour                3306/tcp                         youtubeapi_demo_db_1
3dcc1a4ce8f0        adminer                  &quot;entrypoint.sh docke…&quot;   6 weeks ago         Up About an hour                0.0.0.0:8083-&amp;gt;8080/tcp           lprods_adminer_container
933d9fffaf76        postgres:9.6.10-alpine   &quot;docker-entrypoint.s…&quot;   6 weeks ago         Up About an hour                0.0.0.0:5433-&amp;gt;5432/tcp           lprods_db_container
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;MODIED BLOCK &lt;/strong&gt;# 7 &lt;strong&gt;어떤&lt;/strong&gt; 디버깅 정보를 제공할 수 있을지 모르겠지만, 로깅에 약간의 경고가 있는 것 같습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그들이 비판적입니까?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;어떤 추가 디버깅 정보를 제공할 수 있습니까?&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;serge@serge:/mnt/_work_sdb8/wwwroot/lar/DockerApps/votes_docker$ docker-compose up -d --build              
Creating network &quot;votes_docker_default&quot; with the default driver 
Building web 
Step 1/3 : FROM php:7.2-apache 
 ---&amp;gt; cf1a377ba77f 
Step 2/3 : RUN apt-get update -y &amp;amp;&amp;amp; apt-get install -y libpng-dev nano 
 ---&amp;gt; Using cache 
 ---&amp;gt; 2c4bce73e8cc 
Step 3/3 : RUN docker-php-ext-install     pdo_mysql     &amp;amp;&amp;amp; a2enmod     rewrite 
 ---&amp;gt; Using cache 
 ---&amp;gt; 241c9bf59ac0 
Successfully built 241c9bf59ac0 
Successfully tagged votes_docker_web:latest 
Creating votes_docker_composer_1   ... done 
Creating votes_docker_web_1        ... done 
Creating votes_docker_db_1       ... done 
Creating votes_docker_phpmyadmin_1 ... done 
serge@serge:/mnt/_work_sdb8/wwwroot/lar/DockerApps/votes_docker$ clear 
serge@serge:/mnt/_work_sdb8/wwwroot/lar/DockerApps/votes_docker$ docker logs --tail=20  votes_docker_web_1 
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.20.0.4. Set the 'ServerName' directive globally to suppress this message 
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.20.0.4. Set the 'ServerName' directive globally to suppress this message 
[Wed Dec 26 12:26:34.113194 2018] [mpm_prefork:notice] [pid 1] AH00163: Apache/2.4.25 (Debian) PHP/7.2.11 configured -- resuming normal operations 
[Wed Dec 26 12:26:34.113247 2018] [core:notice] [pid 1] AH00094: Command line: 'apache2 -D FOREGROUND' 
serge@serge:/mnt/_work_sdb8/wwwroot/lar/DockerApps/votes_docker$ docker logs --tail=20  votes_docker_db_1 
2018-12-26 12:26:43 1 [Note] Shutting down plugin 'INNODB_CMP_PER_INDEX' 
2018-12-26 12:26:43 1 [Note] Shutting down plugin 'INNODB_CMPMEM_RESET' 
2018-12-26 12:26:43 1 [Note] Shutting down plugin 'INNODB_CMPMEM' 
2018-12-26 12:26:43 1 [Note] Shutting down plugin 'INNODB_CMP_RESET' 
2018-12-26 12:26:43 1 [Note] Shutting down plugin 'INNODB_CMP' 
2018-12-26 12:26:43 1 [Note] Shutting down plugin 'INNODB_LOCK_WAITS' 
2018-12-26 12:26:43 1 [Note] Shutting down plugin 'INNODB_LOCKS' 
2018-12-26 12:26:43 1 [Note] Shutting down plugin 'INNODB_TRX' 
2018-12-26 12:26:43 1 [Note] Shutting down plugin 'BLACKHOLE' 
2018-12-26 12:26:43 1 [Note] Shutting down plugin 'ARCHIVE' 
2018-12-26 12:26:43 1 [Note] Shutting down plugin 'MRG_MYISAM' 
2018-12-26 12:26:43 1 [Note] Shutting down plugin 'MyISAM' 
2018-12-26 12:26:43 1 [Note] Shutting down plugin 'MEMORY' 
2018-12-26 12:26:43 1 [Note] Shutting down plugin 'CSV' 
2018-12-26 12:26:43 1 [Note] Shutting down plugin 'sha256_password' 
2018-12-26 12:26:43 1 [Note] Shutting down plugin 'mysql_old_password' 
2018-12-26 12:26:43 1 [Note] Shutting down plugin 'mysql_native_password' 
2018-12-26 12:26:43 1 [Note] Shutting down plugin 'binlog' 
2018-12-26 12:26:43 1 [Note] mysqld: Shutdown complete 

serge@serge:/mnt/_work_sdb8/wwwroot/lar/DockerApps/votes_docker$ docker logs --tail=20  votes_docker_composer_1    
&amp;gt; @php artisan package:discover 
Discovered Package: aloha/twilio 
Discovered Package: barryvdh/laravel-debugbar 
Discovered Package: beyondcode/laravel-dump-server 
Discovered Package: cviebrock/eloquent-sluggable 
Discovered Package: davejamesmiller/laravel-breadcrumbs 
Discovered Package: fideloper/proxy 
Discovered Package: intervention/image 
Discovered Package: itsgoingd/clockwork 
Discovered Package: jrean/laravel-user-verification 
Discovered Package: laravel/tinker 
Discovered Package: laravelcollective/html 
Discovered Package: mews/captcha 
Discovered Package: nesbot/carbon 
Discovered Package: nunomaduro/collision 
Discovered Package: proengsoft/laravel-jsvalidation 
Discovered Package: rap2hpoutre/laravel-log-viewer 
Discovered Package: themsaid/laravel-mail-preview 
Discovered Package: yajra/laravel-datatables-oracle 
Package manifest generated successfully. 
serge@serge:/mnt/_work_sdb8/wwwroot/lar/DockerApps/votes_docker$ docker logs --tail=20  votes_docker_phpmyadmin_1 
phpMyAdmin not found in /var/www/html - copying now... 
Complete! phpMyAdmin has been successfully copied to /var/www/html 
/usr/lib/python2.7/site-packages/supervisor/options.py:461: UserWarning: Supervisord is running as root and it is searching for its configuration file in default locations (including its current working directory); 
you probably want to specify a &quot;-c&quot; argument specifying an absolute path to a configuration file for improved security. 
  'Supervisord is running as root and it is searching ' 
2018-12-26 12:26:35,973 CRIT Supervisor is running as root.  Privileges were not dropped because no user is specified in the config file.  If you intend to run as root, you can set user=root in the config file to av
oid this message. 
2018-12-26 12:26:35,973 INFO Included extra file &quot;/etc/supervisor.d/nginx.ini&quot; during parsing 
2018-12-26 12:26:35,973 INFO Included extra file &quot;/etc/supervisor.d/php.ini&quot; during parsing 
2018-12-26 12:26:35,984 INFO RPC interface 'supervisor' initialized 
2018-12-26 12:26:35,984 CRIT Server 'unix_http_server' running without any HTTP authentication checking 
2018-12-26 12:26:35,984 INFO supervisord started with pid 1 
2018-12-26 12:26:36,986 INFO spawned: 'php-fpm' with pid 23 
2018-12-26 12:26:36,988 INFO spawned: 'nginx' with pid 24 
[26-Dec-2018 12:26:37] NOTICE: fpm is running, pid 23 
[26-Dec-2018 12:26:37] NOTICE: ready to handle connections 
2018-12-26 12:26:38,094 INFO success: php-fpm entered RUNNING state, process has stayed up for &amp;gt; than 1 seconds (startsecs) 
2018-12-26 12:26:38,095 INFO success: nginx entered RUNNING state, process has stayed up for &amp;gt; than 1 seconds (startsecs)
&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;같은 문제가 있었는데 서버 주소에 대한 관리자 응용 프로그램의 기본값이 'db'이며 MySQL 컨테이너의 서비스 이름과 일치하지 않습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://i.stack.imgur.com/vHBWO.png&quot; rel=&quot;noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/vHBWO.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;phpMyAdmin으로 시도해보세요 :)&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;version: '3.2'
services:
    db:
        image: mysql:5.7

        restart: always
        environment:
          MYSQL_ROOT_PASSWORD: myUserPass
          MYSQL_DATABASE: mydb
          MYSQL_USER: myUser
          MYSQL_PASSWORD: myUser

    phpmyadmin:
        depends_on:
          - db
        image: phpmyadmin/phpmyadmin
        restart: always
        ports:
          - 8088:80
        environment:
          PMA_HOST: db
          MYSQL_ROOT_PASSWORD: myUserPass
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;https://hub.docker.com/_/adminer/ 에서 확인하실 수 있습니다.&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;version: '3.1'

services:

  adminer:
    image: adminer
    restart: always
    ports:
      - 8080:8080

  db:
    image: mysql:5.6
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: example
&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;DB_PATH_HOST&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;. composite 파일에 모든 것을 잘 설정했습니다. 그러나 docker-composite를 실행하기 전에 환경 변수를 정의해야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;DB_PATH_HOST&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.docker.com/compose/environment-variables/&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;따라서 도커 컨테이너를 시작하기 전에 환경 변수를 composite 파일로 정의하거나 셸 변수로 셸로 내보냄으로써 환경 변수를 정의하거나 환경 변수를 사용해야 합니다. 또는 도커 파일에서 ENV 명령을 사용해야 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;환경 변수를 정의하는 데 가능한 모든 방법을 사용하며, 우선 순위를 매기는 방법을 모두 나열했습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;&lt;a href=&quot;https://docs.docker.com/compose/environment-variables/&quot; rel=&quot;nofollow noreferrer&quot;&gt;자세한 내용&lt;/a&gt;&lt;/strong&gt;은 &lt;strong&gt;&lt;a href=&quot;https://docs.docker.com/compose/environment-variables/&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;따라서 적절한 &lt;strong&gt;docker-compose.yml&lt;/strong&gt; 파일은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;version: '3.2'
services:
   db:
        image: mysql:5.6.41
        restart: always
        environment: 
            MYSQL_ROOT_PASSWORD: 1
            DB_PATH_HOST: /tmp/mysql #this is the host location where mysql data will be stored.
        volumes:
            - ${DB_PATH_HOST}:/var/lib/mysql

    phpmyadmin:
        depends_on:
          - db
        image: phpmyadmin/phpmyadmin
        restart: always
        ports:
          - 8082:80
        environment:
          PMA_HOST: db
          MYSQL_ROOT_PASSWORD: 1
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이제 다음 사항으로 넘어가면, 귀하의 논의를 통해 DB 컨테이너에서 볼륨을 제거하는 것이 문제를 해결했다는 결론을 내렸다는 것을 알 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하지만 사실은 아니에요 어떻게요?&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;먼저 볼륨이 여기서 사용되는 이유를 설명하겠습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;내 mysql을 생성한 데이터는 어딘가에 저장되어야 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;도커는 기본적으로 컨테이너를 비영구 모드로 실행합니다. 즉, 실행 중인 도커 컨테이너를 다운/킬할 때 실행 중인 도커 컨테이너에서 생성된 모든 데이터가 지워집니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;따라서 데이터를 지속적으로 저장(저장/저장)하기 위해 볼륨을 사용합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;도커에 사용되는 볼륨에는 여러 가지 유형이 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;https://docs.docker.com/storage/&quot; rel=&quot;nofollow noreferrer&quot;&gt;자세한 내용은 스토리지 도커 설명서를 읽어보시기 바랍니다&lt;/a&gt;.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여기서 사용되는 볼륨의 유형은 바인딩 마운트로, 즉 호스트 디렉토리를 도커 디렉토리에 바인딩하고 도커는 모든 데이터를 호스트 시스템에 직접 저장하여 도커 컨테이너를 다운받은 경우에도 데이터가 보존됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;따라서 mysql에서 볼륨을 사용하지 않으면 컨테이너가 정지될 때마다 작업에 관계없이 모든 db 변경 사항이 손실됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;h3&gt;&lt;font papago-translate=&quot;translated&quot;&gt;보너스 점수:&lt;/font&gt;&lt;/h3&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;기본적으로 MySQL 컨테이너는 원격 연결을 허용하지 않습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그래서 만약 당신이 phpmyadmin이 아닌 다른 곳에서 mysql에 접속하고 싶다면요.&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;여기서 데이터를 보존하기 때문에 루트 암호는 mysqll 컨테이너를 시작할 때마다 처음으로 설정됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음부터는 root password 환경 변수가 무시됩니다.&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 papago-translate=&quot;translated&quot;&gt;왜냐하면 도커 파일로 도커 컨테이너를 만들 때마다 다음 중 하나를 사용하기 때문입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;docker build&lt;/code&gt;&lt;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-compose build&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;에 대한 지시를 명시하지 않는 한&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Dockerfile&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;새 사용자&lt;/strong&gt; 도커를 &lt;strong&gt;생성하고 사용&lt;/strong&gt;하면 루트 사용자로 모든 것이 실행됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li&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;호스트 디렉토리를 도커에 마운트할 때마다 해당 컨테이너의 도커릴 정의에 따라 사용자 및 그룹에 따라 파일 권한이 변경되기 때문입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여기서 &lt;a href=&quot;https://github.com/docker-library/mysql/blob/696fc899126ae00771b5d87bdadae836e704ae7d/5.6/Dockerfile&quot; rel=&quot;nofollow noreferrer&quot;&gt;mysql은 사용자와 그룹을 정의&lt;/a&gt;했으며 &lt;strong&gt;uid와 gid는 999&lt;/strong&gt;입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;따라서 /tmp/mysql는 999:999를 소유권으로 가지게 됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이러한 ID가 시스템의 다른 사용자 계정과 매핑되어 있으면 호스트 시스템에서 ds-al을 수행할 때마다 ID 대신 해당 이름이 표시됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;ID가 매핑되지 않은 경우 ID를 직접 볼 수 있습니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예를 들어 &lt;strong&gt;/tmp/mysql&lt;/strong&gt;을 mysql 데이터 디렉토리로 사용한 적이 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;시스템을 다시 시작할 때마다 /tmp의 데이터가 제거되므로 동일하게 사용하지 마십시오.&lt;/strong&gt;&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;질문에 대해서는 이미 답변을 마쳤지만, 참고를 위해 여기 비슷한 문제에 제 해결책을 추가했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;나의 도커 구성 phpmyadmin/adminer 서비스 블록에 'links' 파라미터를 추가하면 위의 예시에서도 사용된 것처럼 데이터베이스 블록의 서비스 이름이 실제로 db라는 가정 하에 해결되었습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 링크를 사용하면 phpmyadmin 로그인 인터페이스에서 'db'를 호스트로 사용할 수 있고 연결됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;links:
  - db:db
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;컨테이너&lt;/strong&gt; 이름을 db for &lt;strong&gt;mysql&lt;/strong&gt; image로 변경하여 나를 변화시켰습니다. https://hub.docker.com/_/adminer/ 에서 확인하실 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;서비스: db: 이미지: mysql: 5.6&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/53078135/php-network-getaddresses-getaddrinfo-failed-error-in-dockers-adminer&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>MYSQL</category>
      <author>powerit</author>
      <guid isPermaLink="true">https://powerit.tistory.com/1419</guid>
      <comments>https://powerit.tistory.com/1419#entry1419comment</comments>
      <pubDate>Sat, 4 Nov 2023 13:21:52 +0900</pubDate>
    </item>
    <item>
      <title>숫자가 아닌 텍스트를 보여주기 위해 집계 없이 엑셀로 피벗?</title>
      <link>https://powerit.tistory.com/1418</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;Country Region  Mytext
USA     North   a
USA     South   b
Brasil  North   c
Brasil  South   d
&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;Country  North         South
USA      a             b
Brasil   c             d
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;'mytext'가 숫자라면 피벗 테이블을 수행할 수 있습니다. 국가와 지역의 조합당 하나의 행만 있기 때문에 min = max = sum = avg 및 이들 집계 함수 중 어떤 것이라도 실제로 제가 원하는 결과를 보여줄 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하지만 제가 원하는 필드가 숫자가 아닌 경우에는 어떻게 해야 합니까?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;파이썬의 팬더 라이브러리를 이용하면 데이터 프레임을 사용할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;숫자가 아닌 필드에서도 피벗() 메소드를 사용할 수 있지만 엑셀에서 동일한 방법을 찾을 수 없습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;각 행에 숫자를 연결하고, 엑셀에서 피벗을 하여 그 숫자를 보여주고, 검색을 하여 연관된 텍스트를 얻을 수 있지만, 정말로 더 쉬운 것을 위한 다소 복잡한 과정인 것 같습니다!&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;https://www.microsoft.com/en-US/download/details.aspx?id=39379&quot; rel=&quot;nofollow noreferrer&quot;&gt;MS Power Query Add-in&lt;/a&gt;*을 사용할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;피벗 테이블은 vba 없이 쉽게 사용할 수 있습니다.&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; let
    Source = Excel.CurrentWorkbook(){[Name=&quot;table1&quot;]}[Content],
    #&quot;Pivot column&quot; = Table.Pivot(Source, List.Distinct(Source[Region]), &quot;Region&quot;, &quot;Mytext&quot;)
in
    #&quot;Pivot column&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;유어 아웃풋&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;´* MS Office 2016부터는 &lt;a href=&quot;https://support.office.com/en-us/article/Get-Transform-in-Excel-2016-881c63c6-37c5-4ca2-b616-59e18d75b4de&quot; rel=&quot;nofollow noreferrer&quot;&gt;Get &lt;/a&gt;&amp;amp; &lt;a href=&quot;https://support.office.com/en-us/article/Get-Transform-in-Excel-2016-881c63c6-37c5-4ca2-b616-59e18d75b4de&quot; rel=&quot;nofollow noreferrer&quot;&gt;Transform&lt;/a&gt; 기능으로 엑셀에 완전히 통합되어 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;국가 레이블 아래에 내 텍스트를 행 레이블로 추가한 다음 피벗 테이블 디자인 탭 아래에 피벗 테이블을 표 형식으로 표시합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;국가 행 레이블 필드에 대해 항목 레이블을 반복합니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이후 독자를 위해 - 두 가지 기능을 함께 사용합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;리본 &amp;gt; 피벗테이블 도구 &amp;gt; 보고서 레이아웃 &amp;gt; 표 형태로 표시&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;리본 &amp;gt; 피벗테이블 도구 &amp;gt; 보고서 레이아웃 &amp;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;이 작업을 수행하려면 VBA가 PivotTable의 숫자 'placeholder' 값을 일부 텍스트로 일시적으로 덮어써야 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이를 활성화하려면 피벗 테이블에 대해 EnableDataValueEditing = True를 설정해야 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;새로 고침 시 숫자 자리 표시자 값을 조회한 후 텍스트로 대체합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;복잡하네요, 그렇죠.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;해결책, 네.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하지만 효과는 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;피벗 테이블이 다음 번 새로 고쳐질 때까지 이 코드만 'stick'되므로, 이 코드는 새로 고쳐질 때마다 트리거해야 합니다.&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;Function Pivots_TextInValuesArea(pt As PivotTable, rngNumeric As Range, rngText As Range, Optional varNoMatch As Variant)

Dim cell As Range
Dim varNumeric As Variant
Dim varText As Variant
Dim varResult As Variant
Dim bScreenUpdating As Boolean
Dim bEnableEvents As Boolean
Dim lngCalculation As Long


On Error GoTo errHandler
With Application
    bScreenUpdating = .ScreenUpdating
    bEnableEvents = .EnableEvents
    lngCalculation = .Calculation
    .ScreenUpdating = False
    .EnableEvents = False
    .Calculation = xlCalculationManual
End With


varNumeric = rngNumeric
varText = rngText

pt.EnableDataValueEditing = True
'Setting this to TRUE allow users or this code to temporarily overwrite PivotTable cells in the VALUES area.
'Note that this only 'sticks' until the next time the PivotTable is refreshed, so this code needs to be
' triggerred on every refresh

For Each cell In pt.DataBodyRange.Cells
    With cell
        varResult = Application.Index(varText, Application.Match(.Value2, varNumeric, 0))
        If Not IsError(varResult) Then
            cell.Value2 = varResult
        Else:
            If Not IsMissing(varNoMatch) Then cell.Value2 = varNoMatch
        End If
    End With
Next cell

errHandler:
 If Err.Number &amp;gt; 0 Then
    If gbDebug Then
        Stop: Resume
    Else:
        MsgBox &quot;Whoops, there was an error: Error#&quot; &amp;amp; Err.Number &amp;amp; vbCrLf &amp;amp; Err.Description _
         , vbCritical, &quot;Error&quot;, Err.HelpFile, Err.HelpContext
    End If
End If

With Application
    .ScreenUpdating = bScreenUpdating
    .EnableEvents = bEnableEvents
    .Calculation = lngCalculation
End With


End Function
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;결과는 다음과 같습니다. VALUES 영역에 텍스트가 있는 피벗 테이블:&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://i.stack.imgur.com/6743L.gif&quot; rel=&quot;nofollow noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/6743L.gif&quot; alt=&quot;enter image description here&quot;&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;각 번호에 대해 코드에 표시할 내용을 알려주는 '변환' 표는 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://i.stack.imgur.com/NzPre.jpg&quot; rel=&quot;nofollow noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/NzPre.jpg&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;ul&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;tbl_PivotValues입니다.&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;tbl_PivotValues입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;숫자 값&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;...Function을 트리거하고 필요한 인수를 전달하는 방법은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Option Explicit

Private Sub Worksheet_PivotTableUpdate(ByVal Target As PivotTable)

If Target.Name = &quot;GroupView&quot; Then Pivots_TextInValuesArea Target, [tbl_PivotValues.NumericValue], [tbl_PivotValues.TextValue]

End Sub
&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://i.stack.imgur.com/xLt1E.jpg&quot; rel=&quot;nofollow noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/xLt1E.jpg&quot; alt=&quot;enter image description here&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/32767117/pivot-in-excel-without-aggregation-to-show-text-not-numbers&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>Excel</category>
      <author>powerit</author>
      <guid isPermaLink="true">https://powerit.tistory.com/1418</guid>
      <comments>https://powerit.tistory.com/1418#entry1418comment</comments>
      <pubDate>Sat, 4 Nov 2023 13:21:36 +0900</pubDate>
    </item>
    <item>
      <title>JavaScript clearTimeout이 작동하지 않습니다.</title>
      <link>https://powerit.tistory.com/1417</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;JavaScript clearTimeout이 작동하지 않습니다.&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;(유사한 질문/답변을 모두 살펴보았지만 어느 것도 제 문제를 해결하지 못합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;코드:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var timeoutHandle;

function showLoader(show) {
    if (show) {
        $('.loader').html('Loading...');
        $('.loader').show();

        timeoutHandle = setTimeout(function () {
            if ($('.loader').is(':visible')) {
                $('.loader').html('Still loading...');
            }
        }, 15000);
    }
    else {
        $('.loader').hide();
        clearTimeout(timeoutHandle);
    }
}
&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;AJAX 함수는 단순히 다음을 호출합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;showLoader(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&gt;&lt;code&gt;showLoader(false)&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;결과적으로&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아직도 가끔 &quot;로딩 중..&quot;에서 텍스트가 변경되는 경우가 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;.&quot; &quot;아직 로딩중입니다..&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;.&quot; 15초 훨씬 전에 타이머 스레드가 아직 실행 중인 것 같습니다.&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;strong&gt;edit: &lt;/strong&gt;추가해야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;showLoader(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&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;timeoutHandle&lt;/code&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;if(timeoutHandle){
    clearTimeout(timeoutHandle);
    timeoutHandle = null;
}
timeoutHandle = setTimeout(function () {
    if ($('.loader').is(':visible')) {
        $('.loader').html('Still loading...');
    }
}, 15000);
&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;timeoutHandle&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;/p&gt; 
&lt;pre&gt;&lt;code&gt;clearTimeout(timeoutHandle);
timeoutHandle = null;
&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;showLoader(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&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;showLoader&lt;/code&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;em&gt;모나드&lt;/em&gt; 구현으로 변경하는 것을 고려해 보겠습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;function create_loader(elem) {
    var handle = null;

    function show() {
        elem.html('Loading...');
        elem.show();

        if (handle !== null) {
            clearTimeout(handle); // clear the previous one
        }
        handle = setTimeout(function () {
            elem.html('Still loading...');
        }, 15000);
    }

    return {
        show: show,
        clear: function () {
            elem.hide();
            clearTimeout(handle);
            handle = null;
        }
    };
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;용도:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var loader = create_loader($(&quot;.loader&quot;));
loader.clear();
loader.show();
loader.show(); // each new call to show will reset the 15s timer
loader.show();
loader.show();
loader.clear();
// and you can make another one that operates independently of other one
var another_loader = create_loader($(&quot;.anotherLoader&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;loader&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;자신의 상태를 알고 있는 물체입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;당신의 게시물에서 쇼로더는 첫 번째 반환 전에 여러 번 호출될 수 있다고 언급합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것은 당신의 문제입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;기존의 핸들을 파괴하지 않고 새 핸들로 기존의 timeoutHandle을 덮어씁니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;새로 생성하기 전에 timeoutHandle이 설정되어 있는지 확인해야 합니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;clearTimeout(timeoutHandle)&lt;/strong&gt;을 호출하지 않은 다음 timeoutHandle이 있는 경우 새 요청을 시작합니다.&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/17368453/javascript-cleartimeout-not-working&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>ajax</category>
      <author>powerit</author>
      <guid isPermaLink="true">https://powerit.tistory.com/1417</guid>
      <comments>https://powerit.tistory.com/1417#entry1417comment</comments>
      <pubDate>Sat, 4 Nov 2023 13:21:28 +0900</pubDate>
    </item>
    <item>
      <title>각도를 분할하는 방법JS를 작은 모듈에 적용하고 라우팅을 올바르게 처리합니까?</title>
      <link>https://powerit.tistory.com/1416</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;각도를 분할하는 방법&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;JS를 작은 모듈에 적용하고 라우팅을 올바르게 처리합니까?&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;Angular를 분할하는 가장 좋은 방법은 무엇일까요?&lt;/strong&gt;&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;JS를 더 작은 조각/모듈에 적용하시겠습니까?&lt;/strong&gt;&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예를 들어 블로그에 게시물과 댓글을 활성화하면 &quot;게시물&quot;과 &quot;댓글&quot;(?)과 같은 모듈로 분해할 수 있을 것 같습니다(가장 좋은 예는 아닐 수 있지만, 애플리케이션 로직을 하나의 거대한 모듈-앱을 구축하는 것보다 별도의 모듈로 분리하는 것이 좋습니다).&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 별도의 DOM 노드에서 두 모듈을 부트스트랩하고 그에 따라 두 모듈 모두에서 라우팅을 사용하려고 했습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;몇 가지 문제가 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 '단일 페이지' 애플리케이션으로, 앞 페이지에서도 사용하지 않는 댓글 모듈을 부트스트래핑하고 있습니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;ng-app에서 여러 ng-view를 사용할 수 없기 때문에 index.html 보기에 모듈의 모든 래퍼를 작성하고 부트스트랩을 해야 합니까?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그렇게 해야 되나요?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;좀 잘못된 것 같네요.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그것들을 어떻게/어디서 부트스트랩해야 합니까?&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;라우팅에 대한 팁이 있습니까?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;모듈에 그것들을 펼쳐야 하나요 아니면 어떻게 해서든 모두 합쳐야 하나요?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;(&quot;blog&quot; 모듈&quot;과 &quot;comments&quot; 모듈을 종속성으로 포함하도록 &quot;posts&quot; 모듈을 하나 생성하면 예를 들어 &quot;/post/:id&quot; 라우팅을 정의하기가 여전히 어렵습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;?)&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;색인을 보다&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-html prettyprint-override&quot;&gt;&lt;code&gt;&amp;lt;div class=&quot;post&quot;&amp;gt;&amp;lt;ng-view&amp;gt;&amp;lt;/ng-view&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;comments&quot;&amp;gt;&amp;lt;ng-view&amp;gt;&amp;lt;/ng-view&amp;gt;&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;javascript.js&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-js prettyprint-override&quot;&gt;&lt;code&gt;angular.module('posts', []).config(['$routeProvider', function ($routeProvider) {
    $routeProvider
    .when('/', {
        'template': 'Showing all the posts',
        'controller': 'postCtrl
    })
    .when('/post/:id', {
        'template': 'Showing post :id',
        'controller': 'postCtrl
    });
}]);

angular.module('comments', []).config(['$routeProvider', function ($routeProvider) {
    $routeProvider.when('/post/:id', {
        'template': 'Showing post :id comments',
        'controller': 'CommentsCtrl'
    });
}]);

angular.bootstrap($('.post'), ['posts']);
angular.bootstrap($('.comments'), ['comments']);
&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;그런 다음 $routeProvider를 사용하여 뷰 간을 전환합니다.&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;추가적인 서브모듈이 필요하면 ng-include로 로드합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;/* App Module */

angular.module('MyApp', ['MyApp.home', 'MyApp.blog'])
.config( function myAppConfig ( $routeProvider ) {
    'use strict';
    $routeProvider.otherwise({ redirectTo: '/home' });
});


/* home Module */

angular.module('MyApp.home', [])
.config(['$routeProvider', function config( $routeProvider ) {
  $routeProvider.when('/home', {
    controller: 'HomeController',
    template: '&amp;lt;p&amp;gt;This is my Home&amp;lt;/p&amp;gt;'
  });
}]);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것을 설명하기 위해 &lt;a href=&quot;https://github.com/sgebhardt/ng-module-boilerplate&quot; rel=&quot;noreferrer&quot;&gt;github&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;angular.module('app', ['ngRoute', 'app.moduleX'])
.config(function($routeProvider, $locationProvider) {
  $routeProvider.when('/home', {
    templateUrl: 'partials/home.html',
    controller: 'HomeCtrl'
  });

  //Handle all exceptions
  $routeProvider.otherwise({
    redirectTo: '/home'
  });
})

angular.module('app.moduleX', []).config(function($routeProvider) {
  $routeProvider.when('/settings', {
    templateUrl: 'partials/settings.html',
    controller: 'SettingsCtrl'
  });
})
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 주제에 대해서도 &lt;a href=&quot;http://blog.fragaria.cz/2014/08/modular-menu-with-angularjs.html&quot;&gt;블로그에 글&lt;/a&gt;을 올렸습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;포털 앱과 서브 앱으로 비슷한 작업을 하고 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;우리가 발견한 몇 가지 사항:&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;오직 하나의 &quot;앱&quot;만이 경로와 경로 Params를 가질 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 때문에 &quot;서브앱&quot;이 $routeParams에 접근해야 한다면 URL 파싱을 위해 &quot;올드스쿨&quot;에 가거나 이벤트 서비스를 이용해야 합니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이벤트 얘기가 나와서 말인데, 앱들이 소통할 수 있는 앵글 서비스가 없기 때문에 두 앱 모두에 루트 스코프로 대화하는 자체 이벤트 서비스를 롤업해서 두 앱 모두에 주입해야 할 것 같습니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;나는 우리가 &quot;서브 앱&quot;에 ng-view를 어디서 사용했는지 보이지 않습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;요소에 직접 부트스트래핑하는 것도 비슷하게 작동합니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;오직 하나의 앱만이 경로를 가질 수 있기 때문에, 그 앱들은 순서대로 부트스트랩되어야 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그래서 이런 거죠.&lt;/font&gt;&lt;/p&gt; &lt;pre&gt;&lt;code&gt;$( function () {

    $.when(angular.bootstrap($('.post'), ['posts'])).done( function() {
        console.log('POSTS: bootstrapped');

        //Manually add the controller to the comments element. (May or may not be  
        //necessary, but we were doing something that required it to work.)
        $('.comments').attr('ng-controller', 'CommentsCtrl');

        $.when(angular.bootstrap($('.comments'), ['comments'])).done( function() {
            console.log('COMMENTS: bootstrapped');
        });

    });
});
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt; 
&lt;/ol&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는&lt;strong&gt; 당신&lt;/strong&gt;이 ui-router 라우팅 모듈을 사용할 수 있기를 바랍니다&lt;strong&gt;.&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음은 이 http://www.ng-newsletter.com/posts/angular-ui-router.html 에 대한 좋은 튜토리얼입니다.&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/15294321/how-to-split-angularjs-application-into-smaller-modules-and-handle-routing-corre&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>angularJS</category>
      <author>powerit</author>
      <guid isPermaLink="true">https://powerit.tistory.com/1416</guid>
      <comments>https://powerit.tistory.com/1416#entry1416comment</comments>
      <pubDate>Sat, 4 Nov 2023 13:21:20 +0900</pubDate>
    </item>
    <item>
      <title>저장 프로시저에서 파라미터를 검색하시겠습니까?</title>
      <link>https://powerit.tistory.com/1415</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;b&gt;저장 프로시저&lt;/b&gt; 하나를 만들었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;PROCEDURE string_opp(input_string IN varchar2,output_string OUT varchar2)
&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;sql 개발자를 팔로우했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;SET SERVEROUTPUT ON
DECLARE
  outputString VARCHAR;
BEGIN
  EXEC string_opp('input String',:outputString);
END;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;내가 이것을 시도했을 때 아무것도 얻지 못했는데, 누가 나를 도와줄 수 있습니까?&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;몇 가지 문제가 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;SET SERVEROUTPUT ON
DECLARE
   outputString VARCHAR(20);
BEGIN
  string_opp('input String', outputString);
  dbms_output.put_line(outputString);
END;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;동일한 변수로 사용할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;SET SERVEROUTPUT ON
DECLARE
   outputString VARCHAR(20);
BEGIN
  outputString := 'input String';
  string_opp(outputString);
  dbms_output.put_line(outputString);
END;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;절차 파라미터를 그냥 OUT 대신 IN OUT으로 정의합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 리소스를 확인합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;http://psoug.org/snippet/FUNCTIONS-IN-OUT-parameter_873.htm&quot; rel=&quot;noreferrer&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;http://psoug.org/snippet/FUNCTIONS-IN-OUT-parameter_873.htm&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예를 들어 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;출력 파라미터와 함께 저장 프로시저가 있는 경우:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Create procedure test(name out varchar2(50))
as
begin
name:='testing output parameter';
-- dbms_output.put_line('Output parameter value ' || name );
end;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이제 위의 절차를 실행합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;declare
l_name varchar2(50);
begin
test(l_name);
dbms_output.put_line( 'name = ' || l_ename );
end;
&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/14649657/retrieve-out-parameter-from-stored-procedure&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>Oracle</category>
      <author>powerit</author>
      <guid isPermaLink="true">https://powerit.tistory.com/1415</guid>
      <comments>https://powerit.tistory.com/1415#entry1415comment</comments>
      <pubDate>Sat, 4 Nov 2023 13:21:13 +0900</pubDate>
    </item>
    <item>
      <title>셸 스크립트를 사용하여 여러 MySQL 명령을 실행하는 더 나은 방법</title>
      <link>https://powerit.tistory.com/1414</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;셸 스크립트를 사용하여 여러 MySQL 명령을 실행하는 더 나은 방법&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여러 MySQL 명령을 실행하기 위해 *.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;pre&gt;&lt;code&gt;mysql -h$host -u$user -p$password -e &quot;drop database $dbname;&quot;
mysql -h$host -u$user -p$password -e &quot;create database $dbname;&quot;
mysql -h$host -u$user -p$password -e &quot;another MySQL command&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;mysql -h$host -u$user -p$password -e&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;/p&gt;&lt;p&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;여기 cmds 입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;MySQL 명령을 포함하는 txt 파일:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;select colA from TableA;
select colB from TableB;
select colC from TableC;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;셸 스크립트를 사용하여 실행하려면 다음을 입력합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;mysql -h$host -u$user -p$password db_dbname &amp;lt; cmds.txt
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이렇게 하면 셸 스크립트에서 MySQL 명령을 분리할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;스크립트에 진행 상황 정보가 표시되도록 할 수도 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 경우 &quot;--verbose&quot; 옵션을 사용하여 mysql을 호출할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;자세한 정보는 https://dev.mysql.com/doc/refman/5.6/en/mysql-batch-commands.html 을 참조하십시오.&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;mysql -h$host -u$user -p$password -e &quot;drop database $dbname;create database $dbname;another MySQL command;&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;;&lt;/code&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;또한 HERE 문서를 사용하여 동일한 스크립트 내의 쿼리를 가질 수도 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-sh prettyprint-override&quot;&gt;&lt;code&gt;mysql -h$host -u$user -p$password db_dbname &amp;lt;&amp;lt;'EOF'
select colA from TableA;
select colB from TableB;
select colC from TableC;
EOF
&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;'EOF'&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;보다는&lt;/font&gt;&lt;/font&gt;&lt;code&gt;EOF&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;매개 변수 대체를 비활성화하는 스크립트의 내용을 방지하기 위해 첫번째 줄에 있습니다(특히,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;`&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;문제가 있을 수 있음)&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;또한 결승전 전에는 공백이 없어야&lt;/strong&gt; 합니다(단, 다음을 사용하는 경우는 제외)&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&amp;lt;&amp;lt;-&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;보다는&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&amp;lt;&amp;lt;&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;-- 선두 탭 문자가 제거되는 경우):&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-sh prettyprint-override&quot;&gt;&lt;code&gt;mysql -h$host -u$user -p$password db_dbname &amp;lt;&amp;lt;- 'EOF'
↠select colA from TableA;
↠select colB from TableB;
↠select colC from TableC;
↠EOF
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;em&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;(교체)&lt;/font&gt;&lt;/font&gt;&lt;code&gt;↠&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;탭 문자로 표시).&lt;/font&gt;&lt;/font&gt;&lt;/em&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;HERE doc 구문에 대한 자세한 내용은 &lt;a href=&quot;http://tldp.org/LDP/abs/html/here-docs.html&quot; rel=&quot;noreferrer&quot;&gt;bash 설명서&lt;/a&gt;를 참조하십시오.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;리눅스에는 여러 가지 방법이 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;mysql cli에서:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;mysql&amp;gt; source mycmds.sql
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;파이프 사용:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;echo &quot;SELECT ..; INSERT ..;&quot; | mysql ...
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;파이프 또는 리디렉션을 사용하여 파일에서 명령 실행:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;cat file.sql | mysql ... OR mysql .. &amp;lt; file.sql
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;반복을 줄이는 다른 답변과는 다르지만,&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;옵션&lt;/strong&gt;(사용자, 호스트...)을 &lt;strong&gt;줄이는&lt;/strong&gt; 방법이 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;-u&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;-p&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;-h&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;...) 각 줄 명령에서&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;내가 아는 2가지 방법.&lt;/font&gt;&lt;/p&gt; 
&lt;hr&gt; 
&lt;h3&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;my.cnf&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;파일&lt;/font&gt;&lt;/font&gt;&lt;/h3&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사용자 정보를 옵션 파일(예: ~/.my.cnf 등)에 저장할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;[client] 
user=your_username
password=your_password
# database=database_name
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그럼 그냥 달리면 됩니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;mysql&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하나의 옵션으로 명령&lt;/font&gt;&lt;/font&gt;&lt;code&gt;-e&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;조회합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-bash prettyprint-override&quot;&gt;&lt;code&gt;mysql -e &quot;drop database $dbname;&quot;
mysql -e &quot;create database $dbname;&quot;
mysql -e &quot;another MySQL command&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;hr&gt; 
&lt;h3&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;2. 쓰임새&lt;/font&gt;&lt;/font&gt;&lt;code&gt;mysql_config_editor&lt;/code&gt;&lt;/h3&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;로그인 정보를 저장할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;mysql_config_editor&lt;/code&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-bash prettyprint-override&quot;&gt;&lt;code&gt;mysql_config_editor set --login-path=mypath1 --host=localhost --user=root --password
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;login-path 옵션을 사용하여 명령 실행&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-bash prettyprint-override&quot;&gt;&lt;code&gt;mysql --login-path=mypath1 -e &quot;drop database $dbname;&quot;
mysql --login-path=mypath1 -e &quot;create database $dbname;&quot;
mysql --login-path=mypath1 -e &quot;another MySQL command&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/32869275/a-better-way-to-execute-multiple-mysql-commands-using-shell-script&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>MYSQL</category>
      <author>powerit</author>
      <guid isPermaLink="true">https://powerit.tistory.com/1414</guid>
      <comments>https://powerit.tistory.com/1414#entry1414comment</comments>
      <pubDate>Sat, 4 Nov 2023 13:21:06 +0900</pubDate>
    </item>
    <item>
      <title>로그인 재연결 후 wocommerce</title>
      <link>https://powerit.tistory.com/1413</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;로그인 재연결 후 wocommerce&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;나의 우커머스 로그인 양식 성공적인 로그인은 내가 했던 쇼핑 페이지로의 리다이렉션입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고 로그인 오류 후에는 동일한 페이지가 되어야 하지만 /wp-login.php가 됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;코드를 몇 개 받았는데 사용자 이름이나 비밀번호를 잘못 입력하면 작동이 되는데 사용자 이름이나 비밀번호를 입력하면 /wp-login이 됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;php.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;코드는 여기 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;function my_front_end_login_fail( $username,$password ){
    $referrer = $_SERVER['HTTP_REFERER'];
    if ( !empty($referrer) &amp;amp;&amp;amp; !strstr($referrer,'wp-login') &amp;amp;&amp;amp; !strstr($referrer,'wp-admin') ){
      wp_redirect( $referrer . '?login_failed=failed' );
      exit;
    }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;도와주실 수 있나요?&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;로그인 후 리디렉션하려는 경우:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;?php
/**
* Redirect users to custom URL based on their role after login
*
* @param string $redirect
* @param object $user
* @return string
*/
function wc_custom_user_redirect( $redirect, $user ) {
  // Get the first of all the roles assigned to the user
  $role = $user-&amp;gt;roles[0];
  $dashboard = admin_url();
  $myaccount = get_permalink( wc_get_page_id( 'shop' ) );
  if( $role == 'administrator' ) {
    //Redirect administrators to the dashboard
    $redirect = $dashboard;
  } elseif ( $role == 'shop-manager' ) {
    //Redirect shop managers to the dashboard
    $redirect = $dashboard;
  } elseif ( $role == 'editor' ) {
    //Redirect editors to the dashboard
    $redirect = $dashboard;
  } elseif ( $role == 'author' ) {
    //Redirect authors to the dashboard
    $redirect = $dashboard;
  } elseif ( $role == 'customer' || $role == 'subscriber' ) {
    //Redirect customers and subscribers to the &quot;My Account&quot; page
    $redirect = $myaccount;
  } else {
    //Redirect any other role to the previous visited page or, if not available, to the home
    $redirect = wp_get_referer() ? wp_get_referer() : home_url();
  }
  return $redirect;
}
add_filter( 'woocommerce_login_redirect', 'wc_custom_user_redirect', 10, 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;add_filter('woocommerce_login_redirect', 'login_redirect');

function login_redirect($redirect_to) {
    return home_url();
}

add_action('wp_logout','logout_redirect');

function logout_redirect(){
    wp_redirect( home_url() );
    exit;
}
&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/29342186/woocommerce-after-login-redirect&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>Wordpress</category>
      <author>powerit</author>
      <guid isPermaLink="true">https://powerit.tistory.com/1413</guid>
      <comments>https://powerit.tistory.com/1413#entry1413comment</comments>
      <pubDate>Sat, 4 Nov 2023 13:20:59 +0900</pubDate>
    </item>
    <item>
      <title>기본 게시물의 영구 링크를 변경하는 방법?</title>
      <link>https://powerit.tistory.com/1412</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;기본 게시물의 영구 링크를 변경하는 방법?&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;기본 게시물의 영구 링크를 다음으로 변경합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;\blog\post-name&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하지만 동시에 다른 사용자 지정 게시물 유형의 permalink를 변경하고 싶지는 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Dashboard &amp;gt; Settings &amp;gt; Permalinks에서 &quot;posts&quot;의 Permalink 구조를 변경할 수 있습니다.&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;'rewrite' =&amp;gt; array('slug' =&amp;gt; 'your-cpt-permalink-slug')&lt;/code&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;사용자 지정 게시물 유형을 만듭니다. 텍스트 도메인 'booksinfo'를 변경하는 것을 잊지 마십시오.&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&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;function blog_post_type() {
// Set UI labels for Custom Post Type
    $labels = array(
        'name'                =&amp;gt; esc_html__( 'Blogs', 'booksinfo' ),
        'singular_name'       =&amp;gt; esc_html__( 'Blog', 'booksinfo' ),
        'menu_name'           =&amp;gt; esc_html__( 'Blogs', 'booksinfo' ),
        'parent_item_colon'   =&amp;gt; esc_html__( 'Parent Blog', 'booksinfo' ),
        'all_items'           =&amp;gt; esc_html__( 'All Blogs', 'booksinfo' ),
        'view_item'           =&amp;gt; esc_html__( 'View Blog', 'booksinfo' ),
        'add_new_item'        =&amp;gt; esc_html__( 'Add new Blog', 'booksinfo' ),
        'add_new'             =&amp;gt; esc_html__( 'Add New', 'booksinfo' ),
        'edit_item'           =&amp;gt; esc_html__( 'Edit Blog', 'booksinfo' ),
        'update_item'         =&amp;gt; esc_html__( 'Update Blog', 'booksinfo' ),
        'search_items'        =&amp;gt; esc_html__( 'Search Blog', 'booksinfo' ),
        'not_found'           =&amp;gt; esc_html__( 'Not Found', 'booksinfo' ),
        'not_found_in_trash'  =&amp;gt; esc_html__( 'Not found in Trash', 'booksinfo' ),
    );
     
// Set other options for Custom Post Type
     
    $args = array(
        'label'               =&amp;gt; esc_html__( 'blog', 'booksinfo' ),
        'description'         =&amp;gt; esc_html__( 'blogs news', 'booksinfo' ),
        'labels'              =&amp;gt; $labels,
        'supports'            =&amp;gt; array( 'title', 'editor', 'author', 'thumbnail', 'comments', 'revisions', ),
        'hierarchical'        =&amp;gt; false,
        'public'              =&amp;gt; true,
        'show_ui'             =&amp;gt; true,
        'show_in_menu'        =&amp;gt; true,
        'show_in_nav_menus'   =&amp;gt; true,
        'show_in_admin_bar'   =&amp;gt; true,
        'menu_position'       =&amp;gt; 5,
        'can_export'          =&amp;gt; true,
        'has_archive'         =&amp;gt; true,
        'exclude_from_search' =&amp;gt; false,
        'publicly_queryable'  =&amp;gt; true,
        'capability_type'     =&amp;gt; 'page',
        'menu_icon'            =&amp;gt; 'dashicons-star-empty',
        'taxonomies'          =&amp;gt; array( 'post_tag','category'),

);
     
    // Registering your Custom Post Type
    register_post_type( 'blog', $args );
 
}
add_action( 'init', 'blog_post_type', 0 );
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/29787775/how-to-change-permalink-of-default-post&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>Wordpress</category>
      <author>powerit</author>
      <guid isPermaLink="true">https://powerit.tistory.com/1412</guid>
      <comments>https://powerit.tistory.com/1412#entry1412comment</comments>
      <pubDate>Sat, 4 Nov 2023 13:20:53 +0900</pubDate>
    </item>
    <item>
      <title>C Macro - 정수 값을 문자열 리터럴로 가져오는 방법</title>
      <link>https://powerit.tistory.com/1411</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;C Macro - 정수 값을 문자열 리터럴로 가져오는 방법&lt;/font&gt;&lt;/h2&gt;
&lt;div&gt; 
 &lt;aside class=&quot;s-notice s-notice__info post-notice js-post-notice mb16&quot; role=&quot;status&quot;&gt; 
  &lt;div class=&quot;d-flex fd-column fw-nowrap&quot;&gt; 
   &lt;div class=&quot;d-flex fw-nowrap&quot;&gt; 
    &lt;div class=&quot;flex--item wmn0 fl1 lh-lg&quot;&gt; 
     &lt;div class=&quot;flex--item fl1 lh-lg&quot;&gt; 
      &lt;div&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;b&gt;이 질문에는 이미 다음&lt;/b&gt;과 같은 &lt;b&gt;답변이 있습니다&lt;/b&gt;.&lt;/font&gt;&lt;/div&gt; 
     &lt;/div&gt; 
    &lt;/div&gt; 
   &lt;/div&gt; 
   &lt;div class=&quot;flex--item mb0 mt4&quot;&gt; 
    &lt;a href=&quot;/questions/2653214/stringification-of-a-macro-value&quot; dir=&quot;ltr&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;매크로 값 문자열화&lt;/font&gt;&lt;/a&gt; 
    &lt;span class=&quot;question-originals-answer-count&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;(3개 답변)&lt;/font&gt;&lt;/span&gt; 
   &lt;/div&gt; 
   &lt;div class=&quot;flex--item mb0 mt8&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;닫힘&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;span class=&quot;relativetime&quot; title=&quot;2016-11-15 13:35:18Z&quot; papago-attr-id=&quot;1&quot;&gt;6년 전&lt;/span&gt;에.&lt;/font&gt;&lt;/div&gt; 
  &lt;/div&gt; 
 &lt;/aside&gt; 
&lt;/div&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;GCC(AVR Studio)의 어셈블리 섹션의 일부인 문자열 리터럴에 #정의 &lt;em&gt;정수&lt;/em&gt; 기호를 삽입할 값을 얻을 수 있습니까?&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아래 asm() 블록 안에 있는 문자열 리터럴 안에 있는 &quot;LED&quot;를 48개로 교체했으면 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#define LEDS 48 //I only want ONE mention of this number in the source
int x = LEDS;   //I'm using the value directly too

void DrawFrame()
{
    asm(
    &quot;ldi        R27, 0x00       \n\t&quot;
    &quot;ldi        R26, 0x00       \n\t&quot;
    &quot;ldi        R18, LEDS       \n\t&quot; //&amp;lt;-- substitution needed 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;pre&gt;&lt;code&gt;#define LEDS 48 //I only want ONE mention of this number in the source
int x = LEDS;   //I'm using the value directly too

void DrawFrame()
{
    asm(
    &quot;ldi        R27, 0x00       \n\t&quot;
    &quot;ldi        R26, 0x00       \n\t&quot;
    &quot;ldi        R18, 48         \n\t&quot; //&amp;lt;-- substitution needed here
...
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;지금까지 제가 생각할 수 있는 모든 매크로 트릭(#스트링, arg 치환, 심지어 #값과 큰따옴표의 다양한 조합을 가진 파일 포함)을 시도했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 AVR 스튜디오의 GCC 컴파일러에 AVR 어셈블리 코드를 입력하는 마법에 전혀 익숙하지 않습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 제 소스에 &quot;48&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;Utils 헤더에 문자열화 매크로가 있는 것이 좋다고 생각합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#define STR_IMPL_(x) #x      //stringify argument
#define STR(x) STR_IMPL_(x)  //indirection to expand argument macros
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그런 다음 매크로를 숫자로 유지하고 그 자리에서 문자열화할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#define LEDS 48 
int x = LEDS;   

void DrawFrame()
{
    asm(
    &quot;ldi        R27, 0x00       \n\t&quot;
    &quot;ldi        R26, 0x00       \n\t&quot;
    &quot;ldi        R18, &quot;STR(LEDS)&quot;       \n\t&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;int x = 48;

void DrawFrame()
{
    asm(
    &quot;ldi        R27, 0x00       \n\t&quot;
    &quot;ldi        R26, 0x00       \n\t&quot;
    &quot;ldi        R18, &quot;&quot;48&quot;&quot;       \n\t&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;hr&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;STR&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;쉼표에 관대한 매크로:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#define STR_IMPL_(...) #__VA_ARGS__      //stringify argument
#define STR(...) STR_IMPL_(__VA_ARGS__)  //indirection to expand argument macros
&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;asm&lt;/code&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;asm( STR(
    ldi        R27, 0x00;
    ldi        R26, 0x00;
    ldi        R18, LEDS; //LEDS gets expanded
)); //renders: &quot;ldi R27, 0x00; ldi R26, 0x00; ldi R18, 48;&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;(개인적으로 명시적인 문자열 리터럴보다 편리하다고 생각하여 clang/gcc/tinycc에 이렇게 글을 씁니다.)&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 접근 방식은 조립품이 단지 하나의 라인일 뿐이며 조립자가 또한 수용하는 한 조립될 것이라는 잠재적인 단점을 가지고 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;;&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;새로운 라인과 더불어 명령어 구분자로서(적어도 clang/gcc/ tinycc의 x86-64 어셈블리에 대해 작동).&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;#define LEDS 48

void DrawFrame()
{
    asm volatile(
    &quot;ldi R18, %[leds]&quot;
    : : [leds] &quot;M&quot; (LEDS) : &quot;r18&quot;);
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것이 작동하려면 보조 매크로가 두 개 필요합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러면 자동 문자열 연결을 이용할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#define STR(x) #x
#define EXPAND(x) STR(x)

#define LEDS 48
int x = LEDS;

void DrawFrame()
{
    asm(
    &quot;ldi        R27, 0x00       \n\t&quot;
    &quot;ldi        R26, 0x00       \n\t&quot;
    &quot;ldi        R18, &quot; EXPAND(LEDS) &quot;       \n\t&quot;
...
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;매크로를 두 개 사용하는 이유는 첫 번째 것만으로는 전달된 파라미터가 확장되지 않기 때문입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;만약 당신이 이렇게 했다면:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;printf(&quot;LEDS = &quot; STR(LEDS) &quot;\n&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;printf(&quot;LEDS = &quot; &quot;LEDS&quot; &quot;\n&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;EXPAND&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;macro를 사용하면 전달된 매개 변수도 대체할 수 있습니다.&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;printf(&quot;LEDS = &quot; EXPAND(LEDS) &quot;\n&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;printf(&quot;LEDS = &quot; &quot;48&quot; &quot;\n&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/40591312/c-macro-how-to-get-an-integer-value-into-a-string-literal&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>c</category>
      <author>powerit</author>
      <guid isPermaLink="true">https://powerit.tistory.com/1411</guid>
      <comments>https://powerit.tistory.com/1411#entry1411comment</comments>
      <pubDate>Sat, 4 Nov 2023 13:20:45 +0900</pubDate>
    </item>
    <item>
      <title>MySQL에서 JOIN 쿼리의 반환 결과를 제한하는 방법</title>
      <link>https://powerit.tistory.com/1410</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;MySQL에서 JOIN 쿼리의 반환 결과를 제한하는 방법&lt;/font&gt;&lt;/h2&gt;
&lt;div&gt; 
 &lt;aside class=&quot;s-notice s-notice__info post-notice js-post-notice mb16&quot; role=&quot;status&quot;&gt; 
  &lt;div class=&quot;d-flex fd-column fw-nowrap&quot;&gt; 
   &lt;div class=&quot;d-flex fw-nowrap&quot;&gt; 
    &lt;div class=&quot;flex--item wmn0 fl1 lh-lg&quot;&gt; 
     &lt;div class=&quot;flex--item fl1 lh-lg&quot;&gt; 
      &lt;div&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;b&gt;이 질문에는 이미 다음&lt;/b&gt;과 같은 &lt;b&gt;답변이 있습니다&lt;/b&gt;.&lt;/font&gt;&lt;/div&gt; 
     &lt;/div&gt; 
    &lt;/div&gt; 
   &lt;/div&gt; 
   &lt;div class=&quot;flex--item mb0 mt4&quot;&gt; 
    &lt;a href=&quot;/questions/6879391/mysql-join-with-limit-1-on-joined-table&quot; dir=&quot;ltr&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;조인된 테이블에 LIMIT 1이 있는 MySQL JOIN&lt;/font&gt;&lt;/a&gt; 
    &lt;span class=&quot;question-originals-answer-count&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;(12개 답변)&lt;/font&gt;&lt;/span&gt; 
   &lt;/div&gt; 
   &lt;div class=&quot;flex--item mb0 mt8&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;닫힘&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;span class=&quot;relativetime&quot; title=&quot;2023-03-09 17:44:58Z&quot; papago-attr-id=&quot;1&quot;&gt;6개월 전&lt;/span&gt;에.&lt;/font&gt;&lt;/div&gt; 
  &lt;/div&gt; 
 &lt;/aside&gt; 
&lt;/div&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 다음 SQL 문을 제한하려고 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;SELECT expense.*, transaction.* FROM expense
INNER JOIN transaction ON expense_id = transaction_expense_id
&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;즉, LIMIT 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;MySQL 5.0을 사용하고 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 단계에서 LIMIT 1을 하면 비용은 1개, 거래는 1개가 됩니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;따라서 사용자 테이블을 제외할 수 있다고 가정하면 다음과 같이 다시 쓸 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;select * from expense, transaction where expense_id = transaction_expense_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;pre&gt;&lt;code&gt;select * from expense, transaction where expense_id = transaction_expense_id and 
  expense_id in (select expense_id from expense limit 1)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그게 당신이 원하는 대로 될까요?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;분명 당신은 당신의 경비 ID가 어떤 순서로 다시 들어올 것인지에 대해 조심해야 할 필요가 있기 때문에, 당신은 아마 ORDER를 어떻게든 사용하고 싶을 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;편집: 아래 주석에 설명된 MySQL 제한을 고려하면 다음과 같이 작동할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;select * from (select id from expense order by WHATEVER limit 1) as t1, transaction where expense_id=transaction_expense_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;translated&quot;&gt;&lt;strong&gt;당신&lt;/strong&gt;이 원하는 경비 항목을 지정해야 할 것입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제일 비싸요?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;최신형?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음 항목만 반환하는 하위 쿼리에 대해 가입합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;SELECT
    expense.*, transaction.*, user.*
FROM
    (SELECT * FROM expense WHERE ...) AS expense
INNER JOIN
    transaction ON expense_id = transaction_expense_id
&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;expenses = SELECT * FROM expense ... LIMIT x
foreach expenses as expense
    expense.transactions = SELECT * FROM transacion WHERE transaction_expense_id = expense.expense_id
&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;select e.expense_id, transaction.* 
from (select max(expense_id) from expense) e 
    inner join transaction t ON e.expense_id = t.transaction_expense_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&gt;&lt;code&gt;expense&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;뿐만 아니라&lt;/font&gt;&lt;/font&gt;&lt;code&gt;expense_id&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;서브쿼리를 둥지를 틀 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;select e.*, t.*
from (
     select e1.*
     from expense e1 inner join (select max(expense_id) from expense) e2
        on e1.expense_id = e2.expense_id
     ) e  inner join transaction t on e.expense_id = t.transaction_expense_id
&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/494974/how-to-limit-returned-results-of-a-join-query-in-mysql&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>MYSQL</category>
      <author>powerit</author>
      <guid isPermaLink="true">https://powerit.tistory.com/1410</guid>
      <comments>https://powerit.tistory.com/1410#entry1410comment</comments>
      <pubDate>Sat, 4 Nov 2023 13:20:37 +0900</pubDate>
    </item>
    <item>
      <title>Oracle LOB를 삭제하는 방법</title>
      <link>https://powerit.tistory.com/1409</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Oracle LOB를 삭제하는 방법&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;select object_name, object_type from user_objects;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;object_type이 LOB인 항목이 몇 개 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Oracle에서는 이러한 LOB 개체를 어떻게 삭제할 수 있습니까?&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;LOB를 확인할 수 있는 시나리오 하나 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;user_objects&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러나 에의 가입.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;user_lobs&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;테이블이 이미 떨어졌지만 &lt;a href=&quot;http://docs.oracle.com/cd/E11882_01/server.112/e17120/tables011.htm#i1011340&quot;&gt;휴지통에 있는&lt;/a&gt; 경우에는 아무것도 찾을 수 없습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;create table t42 (my_clob clob);

table T42 created.
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예상대로 저스틴의 질문에 다음과 같은 열이 나타납니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;select l.table_name,
       l.column_name,
       l.segment_name lob_name
  from user_lobs l
       join user_objects o
         on( o.object_name = l.segment_name );

TABLE_NAME  COLUMN_NAME LOB_NAME                     
----------- ----------- ------------------------------
T42         MY_CLOB     SYS_LOB0000133310C00001$$      

drop table t42;

table T42 dropped.
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저스틴의 질문에는 아무것도 찾을 수 없습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;select l.table_name,
       l.column_name,
       l.segment_name lob_name
  from user_lobs l
       join user_objects o
         on( o.object_name = l.segment_name );

no rows selected
&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;user_objects&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;select object_name, object_type, status from user_objects
where object_type like 'LOB%';

OBJECT_NAME                    OBJECT_TYPE         STATUS
------------------------------ ------------------- -------
SYS_LOB0000133328C00001$$      LOB                 VALID   
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;재활용품 보관함에서 볼 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;select * from user_recyclebin;

OBJECT_NAME                    ORIGINAL_NAME                    OPERATION TYPE                      TS_NAME                        CREATETIME          DROPTIME               DROPSCN PARTITION_NAME                   CAN_UNDROP CAN_PURGE    RELATED BASE_OBJECT PURGE_OBJECT      SPACE
------------------------------ -------------------------------- --------- ------------------------- ------------------------------ ------------------- ------------------- ---------- -------------------------------- ---------- --------- ---------- ----------- ------------ ----------
SYS_IL0000133310C00001$$       SYS_IL0000133310C00001$$         DROP      LOB INDEX                 USERS                          2013-08-22:08:33:21 2013-08-22:08:33:21    1.0E+13                                  NO         NO            133310      133310       133310          0 
SYS_LOB0000133310C00001$$      SYS_LOB0000133310C00001$$        DROP      LOB                       USERS                          2013-08-22:08:33:21 2013-08-22:08:33:21    1.0E+13                                  NO         NO            133310      133310       133310          0 
BIN$5IUNXtWkUXLgQwEAAH9TlQ==$0 T42                              DROP      TABLE                     USERS                          2013-08-22:08:33:21 2013-08-22:08:33:21    1.0E+13                                  YES        YES           133310      133310       133310          0 
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;LOB는 여전히 디스크에 존재하며 스토리지를 사용하고 있으며, 이 때문에 고민하시는 것 같습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;따라서 LOB를 삭제하고 스토리지를 해제하려면 전체 테이블을 삭제해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;purge table t42;

table purged.

select object_name, object_type, status from user_objects
where object_type like 'LOB%';

no rows selected
&lt;/code&gt;&lt;/pre&gt; 
&lt;hr&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;흥미롭게도 LOB 세그먼트의 이름을 지정하면 이 효과가 나타나지 않습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;create table t42 (my_clob clob)
lob (my_clob) store as my_clob_segment;
&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;user_objects&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;후에&lt;/font&gt;&lt;/font&gt;&lt;code&gt;drop&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;drop table t42;

table T42 dropped.

select object_name, object_type, status from user_objects
where object_type like 'LOB%';

no rows selected

select * from user_recyclebin;

OBJECT_NAME                    ORIGINAL_NAME                    OPERATION TYPE                      TS_NAME                        CREATETIME          DROPTIME               DROPSCN PARTITION_NAME                   CAN_UNDROP CAN_PURGE    RELATED BASE_OBJECT PURGE_OBJECT      SPACE
------------------------------ -------------------------------- --------- ------------------------- ------------------------------ ------------------- ------------------- ---------- -------------------------------- ---------- --------- ---------- ----------- ------------ ----------
BIN$5IUNXtWnUXLgQwEAAH9TlQ==$0 MY_CLOB_SEGMENT                  DROP      LOB                       USERS                          2013-08-22:08:36:41 2013-08-22:08:36:41    1.0E+13                                  NO         NO            133316      133316       133316          0 
BIN$5IUNXtWoUXLgQwEAAH9TlQ==$0 T42                              DROP      TABLE                     USERS                          2013-08-22:08:36:41 2013-08-22:08:36:41    1.0E+13                                  YES        YES           133316      133316       133316          0 
SYS_IL0000133316C00001$$       SYS_IL0000133316C00001$$         DROP      LOB INDEX                 USERS                          2013-08-22:08:36:41 2013-08-22:08:36:41    1.0E+13                                  NO         NO            133316      133316       133316          0 
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;물론 스토리지는 여전히 사용 중이며, 데이터 사전에서 좀 더 일관성 있게 보일 뿐입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그래서 이것은 기껏해야 (아주 사소한) 버그로 보입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이는 지원 노트 394442.1에 언급된 동작과 관련이 있을 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;관련 LOB 열이 포함된 테이블을 삭제하거나 해당 테이블에서 LOB 열을 삭제하면 LOB 개체가 삭제됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;쿼리를 통해 특정 LOB 개체가 지원하는 열을 확인할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;DBA_LOBS&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ALL_LOBS&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;, 아니면&lt;/font&gt;&lt;/font&gt;&lt;code&gt;USER_LOBS&lt;/code&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;SELECT l.table_name,
       l.column_name,
       l.segment_name lob_name
  FROM user_lobs l
       JOIN user_objects o
         ON( o.object_name = l.segment_name )
&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;LOB&lt;/code&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/18367444/how-to-drop-oracle-lob&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>Oracle</category>
      <author>powerit</author>
      <guid isPermaLink="true">https://powerit.tistory.com/1409</guid>
      <comments>https://powerit.tistory.com/1409#entry1409comment</comments>
      <pubDate>Sat, 4 Nov 2023 13:20:31 +0900</pubDate>
    </item>
    <item>
      <title>오류 ORA-01804 텍스트를 검색하는 중 오류 발생</title>
      <link>https://powerit.tistory.com/1408</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;오류 ORA-01804 텍스트를 검색하는 중 오류 발생&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++ 응용 프로그램을 Oracle DB에 연결하는 데 문제가 있습니다. 오류가 발생합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;code&gt;&quot;[OracleException] errcode: 1804, desc: Error while trying to retrieve text for error ORA-01804&quot;.&lt;/code&gt;&lt;/p&gt; 
&lt;/blockquote&gt;&lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(파이썬을 통해) cx_oracle에 대해 동일한 오류가 발생했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 경우 환경 변수에 ORACLE_HOME이 누락되었습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;Windows Cli에서 Oracle_home을 설정합니다(오라클 폴더 사용).&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;setx ORACLE_HOME  &quot;C:\oracle\oc121\&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;일부 DB 연결에서 TNS_ADM&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;IN도 다음과 같이 설정해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;setx TNS_ADMIN &quot;%ORACLE HOME%\network\admin&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;OCCI in Cent를 사용합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;OS 7, 그리고 같은 문제가 발생하면 libocius만 추가하면 됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;LD_LIBRARY_PATH로 전송하여 문제를 해결합니다.&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;ORA-01804&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;ORA-01804&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;failure to initialize timezone information
Cause:   The timezone information file was not properly read.
&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;C++ OCCI 어플리케이션에서 문제가 발생하여 문제가 생겼습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;oracle::occi::SQLException&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;오라클 DB에 연결하려고 했을 때.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;ORA-01804:
failure to initialize timezone information
Cause:  The timezone information file was not properly read.
&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;$ORACLE_HOME&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;디렉토리 입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;솔루션은 오라클 클라이언트의 다른 인스턴스에서 해당 파일을 간단히 복사하는 것이었습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또 다른 가능한 이유: 이진 파일에 OCCI 라이브러리에 액세스할 수 있는 권한이 없습니다...&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;OCCI 라이브러리가 있는 폴더 모드를 잘못 설정하여 그런 상황이 발생합니다.&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;libociicus.so&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;14&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(&lt;a href=&quot;http://www.oracle.com/technetwork/database/database-technologies/instant-client/overview/index.html&quot; papago-id=&quot;14-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;Oracle Instant Client&lt;/a&gt;에서 찾을 수 있음)이 없습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사소한 것이지만 원인을 파악하기 어려운 또 다른 이유는 Oracle 설치 폴더가 불완전하기 때문일 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그 이유는 일부 프로세스가 Oracle 클라이언트를(성공적으로) 제거하지 못했기 때문입니다.&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;PATH env. var contained oci.dll(그리고 많은 다른 DLL-s)의 bin 폴더로서 정말 까다로웠지만 다른 곳에서는 아래에 있었습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;C:\oracle\11\&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;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;나는 이것이 오래된 질문이라는 것을 알고 있지만, 내 사례(또는 nodejs, macOS의 &lt;strong papago-id=&quot;19-1&quot;&gt;acledb&lt;/strong&gt; 패키지)를 고칠 수 있는 답이 없습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;20&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;하지만, 다시 제 자신을 위한 해결책을 찾았습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;해결책은 그 움직임입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;libociei.dylib&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;/usr/locale/lib&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;p papago-id=&quot;24&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 인스턴트 클라이언트 버전과 데이터베이스 서버 버전이 다른 버전을 사용하고 있기 때문입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그래서 저는 이 오류를 해결하기 위해 그들의 버전을 맞춰야 했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;오라클은 버전이 다르면 DB 시간대를 읽을 수 없다고 합니다.&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;ul&gt; 
 &lt;li papago-id=&quot;26&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;내 PC에서 다른 모든 Oracle 클라이언트 삭제&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;27&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;삭제된 클라이언트 경로에서 ORACLE_HOME 및 PATH 삭제&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;28&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;PC를 재시작합니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p papago-id=&quot;29&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그 후 오류가 사라졌습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;30&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/12837811/error-while-trying-to-retrieve-text-for-error-ora-01804&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>Oracle</category>
      <author>powerit</author>
      <guid isPermaLink="true">https://powerit.tistory.com/1408</guid>
      <comments>https://powerit.tistory.com/1408#entry1408comment</comments>
      <pubDate>Mon, 30 Oct 2023 21:22:20 +0900</pubDate>
    </item>
    <item>
      <title>도커 컨테이너에 여러 볼륨을 탑재하시겠습니까?</title>
      <link>https://powerit.tistory.com/1407</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;docker run -t -i -v '/on/my/host:/on/the/container' ubuntu /bin/bash
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;두 개 이상의 호스트-컨테이너 쌍을 만드는 방법(예: 쉼표로 구분된 목록) 또는 배열로 전달하는 방법이 있습니까?&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;-v&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;논쟁들.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를 들어 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;docker -v /on/my/host/1:/on/the/container/1 \
       -v /on/my/host/2:/on/the/container/2 \
       ...
&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;이제 Docker는 다음을 사용하는 방향으로 마이그레이션할 것을 권장합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;--mount&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;여러 볼륨 마운트에 대해서도 현재 도커 설명서에서 자세히 설명하고 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;보낸이: https://docs.docker.com/storage/bind-mounts/&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$ docker run -d \
  -it \
  --name devtest \
  --mount type=bind,source=&quot;$(pwd)&quot;/target,target=/app \
  --mount type=bind,source=&quot;$(pwd)&quot;/target,target=/app2,readonly,bind-propagation=rslave \
  nginx:latest
&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&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;-v&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;docker run&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;docker run -t -i \
  -v '/on/my/host/test1:/on/the/container/test1' \
  -v '/on/my/host/test2:/on/the/container/test2' \
  ubuntu /bin/bash
&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;docker -v /on/my/host/1:/on/the/container/1:ro \

docker -v /on/my/host/2:/on/the/container/2:rw \
&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;윈도우즈의 경우: 두 개의 디렉터리 E:\data\dev &amp;amp; E:\data\dev2를 마운트해야 하는 경우&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;16&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;용도:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;docker run -v E:\data\dev:c:/downloads -v E:\data\dev2 c:/downloads2 -i --publish 1111:80 -P SomeBuiltContainerName:SomeLabel
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;읽기-쓰기 또는 읽기 전용이 기본 옵션인지 묻는 댓글을 보았습니다. 읽기-쓰기는 기본 옵션입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;(댓글을 달기에 부족해서 글을 남깁니다)&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://docs.docker.com/storage/volumes/#start-a-container-with-a-volume&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;18-1&quot;&gt;도커 설명서&lt;/a&gt;에 따라 다음을 실행합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;docker run -d \
--name devtest \
--mount source=myvol2,target=/app \
nginx:latest
&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;docker inspect devtest&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;출력의 &quot;마운트&quot; 섹션에서 &quot;RW&quot; 옵션을 찾습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&quot;Mounts&quot;: [
    {
        &quot;Type&quot;: &quot;volume&quot;,
        &quot;Source&quot;: &quot;/var/lib/docker/volumes/myvol2/_data&quot;,
        &quot;Destination&quot;: &quot;/app&quot;,
        &quot;Driver&quot;: &quot;local&quot;,
        &quot;Mode&quot;: &quot;&quot;,
        &quot;RW&quot;: true,
        &quot;Propagation&quot;: &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;에서는 기본 옵션을 통해 볼륨을 읽기 및 쓰기 모두 사용할 수 있음을 확인할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;hr&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;22&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;볼륨을 읽기 전용으로 설정하려면(&lt;a href=&quot;https://docs.docker.com/storage/volumes/#use-a-read-only-volume&quot; papago-id=&quot;22-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;공식 문서&lt;/a&gt;마다 다시) 추가합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;readonly&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;source&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;destination&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;docker run -d \
--name=nginxtest \
--mount source=nginx-vol,destination=/usr/share/nginx/html,readonly \
nginx:latest
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;13&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;달려.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;docker inspect nginxtest&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;14&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고 &quot;마운트&quot;를 찾습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&quot;Mounts&quot;: [
    {
        &quot;Type&quot;: &quot;volume&quot;,
        &quot;Source&quot;: &quot;/var/lib/docker/volumes/nginx-vol/_data&quot;,
        &quot;Destination&quot;: &quot;/usr/share/nginx/html&quot;,
        &quot;Driver&quot;: &quot;local&quot;,
        &quot;Mode&quot;: &quot;&quot;,
        &quot;RW&quot;: false,
        &quot;Propagation&quot;: &quot;&quot;
    }
],
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;15&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(참고: 공식 문서가 왜 다음과 같이 바뀌는지 모르겠습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;target&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;16&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;destination&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;17&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;tags, 하지만 저는 그것들이 서로 교환적으로 사용될 수 있다는 가정하에 작업하고 있습니다.)&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;31&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;실행 가능한 예:&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-bash prettyprint-override&quot;&gt;&lt;code&gt;docker run -v /Users/brandomiranda/iit-term-synthesis:/home/bot/iit-term-synthesis \
           -v /Users/brandomiranda/pycoq:/home/bot/pycoq \
           -v /Users/brandomiranda/ultimate-utils:/home/bot/ultimate-utils \
           -ti brandojazz/iit-term-synthesis:test bash
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;32&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 먼저 다음을 수행합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;docker pull brandojazz/iit-term-synthesis:test
&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;docker run -v /var/volume1 -v /var/volume2 DATA busybox true
&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/18861834/mounting-multiple-volumes-on-a-docker-container&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>docker</category>
      <author>powerit</author>
      <guid isPermaLink="true">https://powerit.tistory.com/1407</guid>
      <comments>https://powerit.tistory.com/1407#entry1407comment</comments>
      <pubDate>Mon, 30 Oct 2023 21:22:14 +0900</pubDate>
    </item>
    <item>
      <title>CSS에서 @media screen 및 (max-width: 1024px)는 무엇을 의미합니까?</title>
      <link>https://powerit.tistory.com/1406</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;CSS에서 @media screen 및 (max-width: 1024px)는 무엇을 의미합니까?&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;물려받은 CSS 파일에서 이 코드 조각을 찾았지만 이해가 되지 않습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;@media screen and (max-width: 1024px){
    img.bg {
        left: 50%;
        margin-left: -512px; }
}
&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;그건 언론의 질문입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;브라우저에 포함된 테스트를 통과하지 않는 한 내부의 CSS가 실행되지 않도록 합니다.&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;ol&gt; 
 &lt;li&gt;&lt;p&gt;&lt;code&gt;@media screen&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;화면&quot; 카테고리에 있는 것으로 식별합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이는 브라우저가 데스크톱 클래스로 간주된다는 것을 의미합니다. 예를 들어, 구형 &lt;em papago-id=&quot;5-1&quot;&gt;휴대폰&lt;/em&gt; 브라우저(아이폰 및 기타 스마트폰 브라우저는 화면 범주에 포함되어 &lt;em papago-id=&quot;5-3&quot;&gt;있음&lt;/em&gt;) 또는 화면 판독기와 달리, 페이지를 인쇄하는 것이 아니라 화면에 표시한다는 것을 의미합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;code&gt;max-width: 1024px&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;— 브라우저 창의 너비(스크롤 바 포함)가 1024픽셀 이하입니다(&lt;a href=&quot;http://www.quirksmode.org/mobile/viewports.html&quot; papago-id=&quot;6-1&quot; rel=&quot;noreferrer&quot;&gt;장치 픽셀&lt;/a&gt;이 아닌 &lt;a href=&quot;http://www.quirksmode.org/mobile/viewports.html&quot; papago-id=&quot;6-1&quot; rel=&quot;noreferrer&quot;&gt;CSS&lt;/a&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; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;두 번째 테스트는 CSS를 iPad, iPhone 및 유사한 장치로 제한하기 위한 것임을 시사합니다(일부 구형 브라우저는 지원하지 않기 때문에).&lt;/font&gt;&lt;/font&gt;&lt;code&gt;max-width&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;미디어 쿼리에서 많은 데스크톱 브라우저가 1024픽셀보다 더 넓게 실행됩니다.&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;그러나, 그것은 또한 1024 픽셀 폭 이하의 데스크톱 브라우저 창들에도 적용될 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;max-width&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;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;미디어 쿼리 사양은 다음과 같습니다. 꽤 읽기 쉽습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;http://www.w3.org/TR/css3-mediaqueries/&quot; rel=&quot;noreferrer&quot; papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;http://www.w3.org/TR/css3-mediaqueries/&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt;&lt;p papago-id=&quot;13&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;여기서 정의된 스타일을 화면(예: 인쇄 또는 일부 다른 매체)으로 제한하고 너비가 1024px 이하인 포트를 보기 위해 범위를 추가로 제한합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;http://www.css3.info/preview/media-queries/&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;http://www.css3.info/preview/media-queries/&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;p papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음과 같이 적혀있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;최대 너비 1024픽셀의 해상도로 페이지를 화면에 렌더링하면 다음 규칙을 적용합니다.&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;이미 알고 있듯이 휴대용, 스크린, 프린터 등이 될 수 있는 미디어 유형에 CSS를 적용할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;자세한 사항은 &lt;a href=&quot;http://www.w3.org/TR/CSS2/media.html&quot; rel=&quot;noreferrer&quot; papago-id=&quot;17-1&quot;&gt;여기&lt;/a&gt;에서 확인해 보시기 바랍니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;제 경우에는 브라우저가 다음과 같이 설정되어 있을 때 제 로고를 웹 사이트에 중심을 두려고 했습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;800px&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;@media&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;태그:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;@media screen and (max-width: 800px) {
  #logo {
    float: none;
    margin: 0;
    text-align: center;
    display: block;
    width: auto;
  }
}
&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;a href=&quot;http://www.w3schools.com/css/css_mediatypes.asp&quot; rel=&quot;nofollow&quot; papago-id=&quot;21-1&quot;&gt;참고&lt;/a&gt;하시기 바랍니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;22&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://www.w3.org/TR/css3-mediaqueries/#media0&quot; rel=&quot;noreferrer&quot; papago-id=&quot;22-1&quot;&gt;미디어 쿼리&lt;/a&gt;입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;CSS 규칙의 일부를 특정 구성의 특정 장치에만 적용할 수 있습니다.&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;화면 크기가 1024인 경우 아래 CSS 규칙만 적용한다는 의미입니다.&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;미디어 쿼리 조건이 참이면 해당 조건을 가진 CSS가 작동합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;즉, 미디어 쿼리의 조건 픽셀 크기 내의 CSS가 영향을 미치거나, 그렇지 않으면 장치의 너비가 CSS보다 1024px 이상 클 경우 조건이 실패할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;미디어 쿼리 조건이 거짓이기 때문입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;max-width&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그 너비까지 최대 CSS 제한입니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;26&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다른 코드를 실행하기 위해 특정 기능을 대상으로 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;27&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를 들어,&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;@media all and (max-width: 600px) {
  .navigation {
    -webkit-flex-flow: column wrap;
    flex-flow: column wrap;
    padding: 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;위의 토막글은 만약 이 프로그램을 실행하는 장치가 600 px 또는 600 px 폭 미만의 화면을 가지고 있다면, 이 경우 우리의 프로그램은 이 부분을 실행해야만 합니다.&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;또한 'px'뿐만 아니라 'em'도 사용할 수 있다는 점에 유의할 필요가 있습니다. 블로그와 텍스트 기반 사이트는 브라우저가 텍스트 내용과 더 관련된 레이아웃 결정을 내리기 때문입니다.&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;워드프레스 26에서 저는 제 태그라인이 데스크톱 뿐만 아니라 모바일에도 표시되기를 원했기 때문에 이것을 제 아이 테마 스타일에 넣었습니다.css&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;@media screen and (max-width:59em){
    p.site-description {
        display:    block;
    }
}
&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;URL : https://stackoverflow.com/questions/4189868/what-does-media-screen-and-max-width-1024px-mean-in-css&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>css</category>
      <author>powerit</author>
      <guid isPermaLink="true">https://powerit.tistory.com/1406</guid>
      <comments>https://powerit.tistory.com/1406#entry1406comment</comments>
      <pubDate>Mon, 30 Oct 2023 21:22:06 +0900</pubDate>
    </item>
    <item>
      <title>wpdb 업데이트 쿼리가 작동하지 않음</title>
      <link>https://powerit.tistory.com/1405</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;wpdb 업데이트 쿼리가 작동하지 않음&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;wp_mail 결과가 나오면 바로 업데이트 할 이메일 스크립트를 만들었습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;어떤 이유에서인지 내 값이 업데이트되지 않습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;제가 뭘 놓쳤나요?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 메일을 받고 있어서 wp_mail이 작동합니다.&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;$email_result = wp_mail( $to, $subject, $message, $headers );

if( $email_result ){//wp_mail() processed the request successfully
    global $wpdb;
    $table_name = $wpdb-&amp;gt;prefix . &quot;wpsc_coupon_codes&quot;;
    $coupon_id = $ereminder-&amp;gt;ID;

$ereminders = $wpdb-&amp;gt;query( $wpdb-&amp;gt;prepare(&quot;
    UPDATE *
    FROM $table_name
    SET reminder = 1
    WHERE ID = $coupon_id
&quot;) );

}
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;시도해 보기:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$wpdb-&amp;gt;update( $table_name, array( 'reminder' =&amp;gt; 1),array('ID'=&amp;gt;$coupon_id));
&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;UPDATE  $table_name
SET reminer = 1
WHERE ID = $coupon_id
&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;$wpdb-&amp;gt;update&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; global $wpdb;
 $table_name = $wpdb-&amp;gt;prefix.'your_table_name';
 $data_update = array('row_name_1' =&amp;gt; $row_data_1 ,'row_name_2' =&amp;gt; $row_data_2);
 $data_where = array('row_name' =&amp;gt; $row_data);
 $wpdb-&amp;gt;update($table_name , $data_update, $data_where);
&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;(UPDATE * FROM) 대신 변경할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$ereminders = $wpdb-&amp;gt;query($wpdb-&amp;gt;prepare(&quot;UPDATE $table_name SET reminer='1' WHERE ID=$coupon_id&quot;));
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;쉴 틈도 없이 말입니다.&lt;/font&gt;&lt;/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;$result = $wpdb-&amp;gt;update(
    $wpdb-&amp;gt;prefix .'sae_calendar', 
    array( 
        'year' =&amp;gt; $year,
        'quarter' =&amp;gt; $quarter,
        'start_date' =&amp;gt; $start_date,
        'end_date' =&amp;gt; $end_date,
        'reservation_start_date' =&amp;gt; $reservation_start_date,
        'reservation_end_date' =&amp;gt; $reservation_end_date 
    ), 
    array(
        &quot;id&quot; =&amp;gt; $id
    ) 
);
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;&amp;lt;?php 
  global $wpdb;
    if(isset($_POST['progress'])){
    $table=t_test;
    $data=array('client_development'=&amp;gt;$_POST['Progress']);
    $where=array('p_id'=&amp;gt;$_SESSION['id']);
    $format=(&quot;%d&quot;);
    $whereFormat=(&quot;%d&quot;);
    $result4=$wpdb-&amp;gt;UPDATE($table,$data,$where,$format,$whereFormat);
  }
?&amp;gt;
&amp;lt;form method=&quot;post&quot;&amp;gt;
  &amp;lt;input type=&quot;text&quot; name=&quot;Progress&quot;&amp;gt;
  &amp;lt;input type=&quot;submit&quot; name=&quot;progress&quot; value=&quot;Prog%&quot;&amp;gt;
&amp;lt;/form&amp;gt;
&amp;lt;?php 
if(isset($_POST['progress'])){
$table=t_test;
    $data=array('client_development'=&amp;gt;$_POST['Progress']);
    $where=array('p_id'=&amp;gt;$_SESSION['id']);
    $format=(&quot;%d&quot;);
    $whereFormat=(&quot;%d&quot;);
    $result4=$wpdb-&amp;gt;UPDATE($table,$data,$where,$format,$whereFormat);
}
?&amp;gt;
&amp;lt;form method=&quot;post&quot;&amp;gt;
  &amp;lt;input type=&quot;text&quot; name=&quot;Progress&quot;&amp;gt;
  &amp;lt;input type=&quot;submit&quot; name=&quot;progress&quot; value=&quot;Prog%&quot;&amp;gt;
&amp;lt;/form&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;URL : https://stackoverflow.com/questions/15185425/wpdb-update-query-not-working&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>Wordpress</category>
      <author>powerit</author>
      <guid isPermaLink="true">https://powerit.tistory.com/1405</guid>
      <comments>https://powerit.tistory.com/1405#entry1405comment</comments>
      <pubDate>Mon, 30 Oct 2023 21:21:59 +0900</pubDate>
    </item>
    <item>
      <title>데이터베이스 백업을 위한 리눅스 셸 스크립트</title>
      <link>https://powerit.tistory.com/1404</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;데이터베이스 백업을 위한 리눅스 셸 스크립트&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;0&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;데이터베이스 백업을 위해 많은 스크립트를 시도했지만 성공하지 못했습니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;매시간 데이터베이스를 백업하고 싶습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&quot;/etc/cron에 파일을 추가했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;harly/&quot; 폴더에서 chmod를 755로 변경했지만 실행되지 않았습니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font 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;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;/etc/cron.hourly/&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;폴더.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;현재 날짜를 가져오고 변수를 만듭니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;date=date(d_m_y_H_M_S)&lt;/code&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;filename=&quot;$date&quot;.gz&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;내 데이터베이스를 이렇게 덤프합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;mysqldump --user=my_user --password=my_pass --default-character-set=utf8 my_database | gzip &amp;gt; &quot;/var/www/vhosts/system/example.com/httpdocs/backups/$(&quot;filename&quot;)&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;폴더의 모든 파일 삭제&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;/var/www/vhosts/system/example.com/httpdocs/backups/&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;된 8일 입니다.&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;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;&quot;/var/www/vhosts/system/example.com/httpdocs/backup_log.txt&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 class=&quot;papago-parent&quot;&gt;, 이 텍스트는 다음과 같이 작성됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Backup is created at $(&quot;date&quot;)&lt;/code&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;파일 소유자(chown)를 root에서 &quot;my_user&quot;로 변경합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&quot;my_user&quot; FTP 계정에서 백업 및 로그 파일을 열고 싶기 때문입니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;나는 매번 cron 뒤에 이메일을 보내고 싶지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&amp;gt;/dev/null 2&amp;gt;&amp;amp;1&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;12&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;추가됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt;&lt;p papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;몇 시간씩 작업한 후 아래와 같은 해결책을 만들었습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;다른 사람들에게 도움이 될 수 있도록 붙여넣기를 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;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;# cd /etc/cron.daily/
# touch /etc/cron.daily/dbbackup-daily.sh
# chmod 755 /etc/cron.daily/dbbackup-daily.sh
# vi /etc/cron.daily/dbbackup-daily.sh
&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;그런 다음 Shift+Ins로 다음 행을 파일로 복사합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#!/bin/sh
now=&quot;$(date +'%d_%m_%Y_%H_%M_%S')&quot;
filename=&quot;db_backup_$now&quot;.gz
backupfolder=&quot;/var/www/vhosts/example.com/httpdocs/backups&quot;
fullpathbackupfile=&quot;$backupfolder/$filename&quot;
logfile=&quot;$backupfolder/&quot;backup_log_&quot;$(date +'%Y_%m')&quot;.txt
echo &quot;mysqldump started at $(date +'%d-%m-%Y %H:%M:%S')&quot; &amp;gt;&amp;gt; &quot;$logfile&quot;
mysqldump --user=mydbuser --password=mypass --default-character-set=utf8 mydatabase | gzip &amp;gt; &quot;$fullpathbackupfile&quot;
echo &quot;mysqldump finished at $(date +'%d-%m-%Y %H:%M:%S')&quot; &amp;gt;&amp;gt; &quot;$logfile&quot;
chown myuser &quot;$fullpathbackupfile&quot;
chown myuser &quot;$logfile&quot;
echo &quot;file permission changed&quot; &amp;gt;&amp;gt; &quot;$logfile&quot;
find &quot;$backupfolder&quot; -name db_backup_* -mtime +8 -exec rm {} \;
echo &quot;old files deleted&quot; &amp;gt;&amp;gt; &quot;$logfile&quot;
echo &quot;operation finished at $(date +'%d-%m-%Y %H:%M:%S')&quot; &amp;gt;&amp;gt; &quot;$logfile&quot;
echo &quot;*****************&quot; &amp;gt;&amp;gt; &quot;$logfile&quot;
exit 0
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;13&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; :&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;19&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;InnoDB를 사용하는데 백업에 시간이 너무 많이 걸리는 경우 &quot;단일 &lt;a href=&quot;http://dev.mysql.com/doc/refman/5.5/en/mysqldump.html#option_mysqldump_single-transaction&quot; papago-id=&quot;19-1&quot; rel=&quot;noreferrer&quot;&gt;트랜잭션&lt;/a&gt;&quot; 인수를 추가하여 잠금을 방지할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;따라서 내 sq 덤프 라인은 다음과 같습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;mysqldump --user=mydbuser --password=mypass --default-character-set=utf8
          --single-transaction mydatabase | gzip &amp;gt; &quot;$fullpathbackupfile&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;다음과 유사한 스크립트를 만듭니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#!/bin/sh -e

location=~/`date +%Y%m%d_%H%M%S`.db

mysqldump -u root --password=&amp;lt;your password&amp;gt; database_name &amp;gt; $location

gzip $location
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;15&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그런 다음 편집할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;crontab&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;16&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;스크립트를 실행할 사용자:&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$&amp;gt; crontab -e
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;23&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고 항목을 추가합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;01 * * * * ~/script_path.sh
&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;이것은 매일 매시간 1분마다 실행하게 될 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;25&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러면 롤과 다른 기능만 추가하면 되고, 가도 좋습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;26&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저도 똑같은 문제가 생겼어요.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;하지만 저는 대본을 쓸 줄 압니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것이 도움이 되기를 바랍니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#!/bin/bash
# Database credentials
user=&quot;username&quot;
password=&quot;password&quot;
host=&quot;localhost&quot;
db_name=&quot;dbname&quot;
# Other options
backup_path=&quot;/DB/DB_Backup&quot;
date=$(date +&quot;%d-%b-%Y&quot;)
# Set default file permissions
umask 177
# Dump database into SQL file
mysqldump --user=$user --password=$password --host=$host $db_name &amp;gt;$backup_path/$db_name-$date.sql

# Delete files older than 30 days
find $backup_path/* -mtime +30 -exec rm {} \;


#DB backup log
echo -e &quot;$(date +'%d-%b-%y  %r '):ALERT:Database has been Backuped&quot;    &amp;gt;&amp;gt;/var/log/DB_Backup.log
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;#!/bin/sh
#Procedures = For DB Backup
#Scheduled at : Every Day 22:00

v_path=/etc/database_jobs/db_backup
logfile_path=/etc/database_jobs
v_file_name=DB_Production
v_cnt=0

MAILTO=&quot;abc@as.in&quot;
touch &quot;$logfile_path/kaka_db_log.log&quot;

#DB Backup
mysqldump -uusername -ppassword -h111.111.111.111 ddbname &amp;gt; $v_path/$v_file_name`date +%Y-%m-%d`.sql 
if [ &quot;$?&quot; -eq 0 ]
  then
   v_cnt=`expr $v_cnt + 1`
  mail -s &quot;DB Backup has been done successfully&quot; $MAILTO &amp;lt; $logfile_path/db_log.log
 else
   mail -s &quot;Alert : kaka DB Backup has been failed&quot; $MAILTO &amp;lt; $logfile_path/db_log.log
   exit
fi
&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;여기 누군가에게 도움이 될 경우를 대비해 우분투를 위한 mysql 백업 스크립트가 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#Mysql back up script

start_time=&quot;$(date -u +%s)&quot;

now(){
date +%d-%B-%Y_%H-%M-%S
}

ip(){
/sbin/ifconfig eth0 2&amp;gt;/dev/null|awk '/inet addr:/ {print $2}'|sed 's/addr://'
}

filename=&quot;`now`&quot;.zip
backupfolder=/path/to/any/folder
fullpathbackupfile=$backupfolder/$filename
db_user=xxx
db_password=xxx
db_name=xxx

printf &quot;\n\n&quot;
printf &quot;******************************\n&quot;
printf &quot;Started Automatic Mysql Backup\n&quot;
printf &quot;******************************\n&quot;
printf &quot;TIME: `now`\n&quot;
printf &quot;IP_ADDRESS: `ip` \n&quot;
printf &quot;DB_SERVER_NAME: DB-SERVER-1\n&quot;

printf &quot;%sBACKUP_FILE_PATH $fullpathbackupfile\n&quot;

printf &quot;Starting Mysql Dump \n&quot;

mysqldump -u $db_user -p$db_password $db_name| pv | zip &amp;gt; $fullpathbackupfile

end_time=&quot;$(date -u +%s)&quot;

elapsed=$(($end_time-$start_time))

printf &quot;%sMysql Dump Completed In $elapsed seconds\n&quot;

printf &quot;******************************\n&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;28&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;추신: 우분투에 pv와 zip을 설치하는 것을 기억하세요.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;sudo apt install pv
sudo apt install zip
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;17&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음은 다음과 같이 사용하여 크론탭을 설정하는 방법입니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;crontab -e&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;ubuntu에서 6시간마다 실행됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;0 */6 * * * sh /path/to/shfile/backup-mysql.sh &amp;gt;&amp;gt; /path/to/logs/backup-mysql.log 2&amp;gt;&amp;amp;1
&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;멋진 점은 어디에서나 압축을 풀기 쉬운 zip 파일을 만들 수 있다는 것입니다.&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;이제 스크립트 파일(예: /backup/mysql-backup)에 다음 내용을 복사합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;sh) Linux 시스템에 저장합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;    #!/bin/bash

    export PATH=/bin:/usr/bin:/usr/local/bin
    TODAY=`date +&quot;%d%b%Y&quot;`

    DB_BACKUP_PATH='/backup/dbbackup'
    MYSQL_HOST='localhost'
    MYSQL_PORT='3306'
    MYSQL_USER='root'
    MYSQL_PASSWORD='mysecret'
    DATABASE_NAME='mydb'
    BACKUP_RETAIN_DAYS=30   

    mkdir -p ${DB_BACKUP_PATH}/${TODAY}
    echo &quot;Backup started for database - ${DATABASE_NAME}&quot;

    mysqldump -h ${MYSQL_HOST} \
   -P ${MYSQL_PORT} \
   -u ${MYSQL_USER} \
   -p${MYSQL_PASSWORD} \
   ${DATABASE_NAME} | gzip &amp;gt; ${DB_BACKUP_PATH}/${TODAY}/${DATABASE_NAME}-${TODAY}.sql.gz

if [ $? -eq 0 ]; then
  echo &quot;Database backup successfully completed&quot;
else
  echo &quot;Error found during backup&quot;
  exit 1
fi


##### Remove backups older than {BACKUP_RETAIN_DAYS} days  #####

DBDELDATE=`date +&quot;%d%b%Y&quot; --date=&quot;${BACKUP_RETAIN_DAYS} days ago&quot;`

if [ ! -z ${DB_BACKUP_PATH} ]; then
      cd ${DB_BACKUP_PATH}
      if [ ! -z ${DBDELDATE} ] &amp;amp;&amp;amp; [ -d ${DBDELDATE} ]; then
            rm -rf ${DBDELDATE}
      fi
fi
&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;$ chmod +x /backup/mysql-backup.sh
&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;crontab -e 명령을 사용하여 시스템의 crontab을 편집합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음 설정을 추가하여 아침 3시에 백업을 활성화합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;0 3 * * * root /backup/mysql-backup.sh
&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;dbname, dbuser, dbpass를 각각 데이터베이스 이름, 사용자 이름, 비밀번호로 바꿉니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#!/bin/sh

echo &quot;starting db backup&quot;
day=&quot;$(date +&quot;%m-%d-%y&quot;)&quot;
db_backup=&quot;mydb_${day}.sql&quot;
sudo mysqldump  -udbuser -pdbpass --no-tablespaces dbname  &amp;gt;/home/${db_backup}
echo &quot; backup complete&quot; 
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;36&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;위 백업 데이터를 압축하려면 다음 코드로 바꾸기만 하면 됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;db_backup=&quot;mydb_${day}.gz&quot;
sudo mysqldump  -udbuser -pdbpass --no-tablespaces dbname | gzip -c &amp;gt;/home/${db_backup}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;37&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;폴더에서 14일 이상 된 파일을 삭제하려면 다음 코드를 사용합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#!/bin/bash

fpath1=/home/ubuntu/mysql/*
fpath2=/home/ubuntu/postgsql/*


file_path=($fpath1 $fpath2)


for i in ${file_path[@]};
do
    find $i -type d -mtime +13 -exec rm -Rf {} +
done 
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;#!/bin/bash

# Add your backup dir location, password, mysql location and mysqldump        location
DATE=$(date +%d-%m-%Y)
BACKUP_DIR=&quot;/var/www/back&quot;
MYSQL_USER=&quot;root&quot;
MYSQL_PASSWORD=&quot;&quot;
MYSQL='/usr/bin/mysql'
MYSQLDUMP='/usr/bin/mysqldump'
DB='demo'

#to empty the backup directory and delete all previous backups
rm -r $BACKUP_DIR/*  

mysqldump -u root -p'' demo | gzip -9 &amp;gt; $BACKUP_DIR/demo$date_format.sql.$DATE.gz

#changing permissions of directory 
chmod -R 777 $BACKUP_DIR
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;38&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Sqlite3에 메타데이터가 있는 동시 mysql 백업 스크립트인 이 오픈 소스 도구 matiri https://github.com/AAFC-MBB/matiri 를 고려해 볼 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;특징:&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li papago-id=&quot;39&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다중 서버:&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;여러 MySQL 서버가 동일한 물리적 서버 또는 별도의 물리적 서버에 동시에 위치한 경우에도 지원됩니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li 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;백업할 서버의 각 데이터베이스는 별도로 병렬로 수행됩니다(동시 설정 가능: 기본값: 3).&lt;/font&gt;&lt;/li&gt; 
 &lt;li 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;/li&gt; 
 &lt;li papago-id=&quot;42&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Checksummed: 저장된 각 압축 백업 파일의 SHA256 및 모든 파일의 아카이브&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;43&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;보관됨:&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;모든 데이터베이스 백업을 하나의 파일로 통합&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;44&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;녹음:&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;Sqlite3 데이터베이스에 저장된 백업 정보&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p papago-id=&quot;45&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;전체공개 : 마티리 원작자&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;46&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;DBA로서 MySQL 데이터베이스의 백업을 예약해야 데이터베이스를 현재 백업에서 복구할 수 있습니다.&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;여기서는 mysqldump를 사용하여 mysql 데이터베이스의 백업을 수행하고 있으며 스크립트에 입력할 수 있는 것과 동일합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;48&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;[orahow@oradbdb DB_Backup]$ cat.backup_script.sh&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#!/bin/bash
# Database credentials
user=&quot;root&quot;
password=&quot;1Loginxx&quot;
db_name=&quot;orahowdb&quot;
v_cnt=0
logfile_path=/DB_Backup
touch &quot;$logfile_path/orahowdb_backup.log&quot;
# Other options
backup_path=&quot;/DB_Backup&quot;
date=$(date +&quot;%d-%b-%Y-%H-%M-%p&quot;)
# Set default file permissions
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;49&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;읽기를 계속합니다...&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://orahow.com/linux-shell-script-for-mysql-database-backup/&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;49-1&quot;&gt;MySQL 백업&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;50&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;나는 MYSQL 데이터베이스의 백업을 만들기 위해 Shell Script를 준비했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;데이터베이스를 백업할 수 있도록 사용할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;    #!/bin/bash
    export PATH=/bin:/usr/bin:/usr/local/bin
    TODAY=`date +&quot;%d%b%Y_%I:%M:%S%p&quot;`

    ################################################################
    ################## Update below values  ########################
    DB_BACKUP_PATH='/backup/dbbackup'
    MYSQL_HOST='localhost'
    MYSQL_PORT='3306'
    MYSQL_USER='auriga'
    MYSQL_PASSWORD='auriga@123'
    DATABASE_NAME=( Project_O2 o2)
    BACKUP_RETAIN_DAYS=30   ## Number of days to keep local backup copy; Enable script code in end of th script

    #################################################################
    { mkdir -p ${DB_BACKUP_PATH}/${TODAY}
        echo &quot;
                                ${TODAY}&quot; &amp;gt;&amp;gt; ${DB_BACKUP_PATH}/Backup-Report.txt
    } || {
        echo &quot;Can not make Directry&quot;
        echo &quot;Possibly Path is wrong&quot;
    }
    { if ! mysql -u ${MYSQL_USER} -p${MYSQL_PASSWORD} -e 'exit'; then
        echo 'Failed! You may have Incorrect PASSWORD/USER ' &amp;gt;&amp;gt; ${DB_BACKUP_PATH}/Backup-Report.txt
        exit 1
    fi

        for DB in &quot;${DATABASE_NAME[@]}&quot;; do
            if ! mysql -u ${MYSQL_USER} -p${MYSQL_PASSWORD} -e &quot;use &quot;${DB}; then
                echo &quot;Failed! Database ${DB} Not Found on ${TODAY}&quot; &amp;gt;&amp;gt; ${DB_BACKUP_PATH}/Backup-Report.txt

            else
                # echo &quot;Backup started for database - ${DB}&quot;            
                # mysqldump -h localhost -P 3306 -u auriga -pauriga@123 Project_O2      # use gzip..

                mysqldump -h ${MYSQL_HOST} -P ${MYSQL_PORT} -u ${MYSQL_USER} -p${MYSQL_PASSWORD} \
                          --databases ${DB} | gzip &amp;gt; ${DB_BACKUP_PATH}/${TODAY}/${DB}-${TODAY}.sql.gz

                if [ $? -eq 0 ]; then
                    touch ${DB_BACKUP_PATH}/Backup-Report.txt
                    echo &quot;successfully backed-up of ${DB} on ${TODAY}&quot; &amp;gt;&amp;gt; ${DB_BACKUP_PATH}/Backup-Report.txt
                    # echo &quot;Database backup successfully completed&quot;

                else
                    touch ${DB_BACKUP_PATH}/Backup-Report.txt
                    echo &quot;Failed to backup of ${DB} on ${TODAY}&quot; &amp;gt;&amp;gt; ${DB_BACKUP_PATH}/Backup-Report.txt
                    # echo &quot;Error found during backup&quot;
                    exit 1
                fi
            fi
        done
    } || {
        echo &quot;Failed during backup&quot;
        echo &quot;Failed to backup on ${TODAY}&quot; &amp;gt;&amp;gt; ${DB_BACKUP_PATH}/Backup-Report.txt
        # ./myshellsc.sh 2&amp;gt; ${DB_BACKUP_PATH}/Backup-Report.txt
    }

    ##### Remove backups older than {BACKUP_RETAIN_DAYS} days  #####

    # DBDELDATE=`date +&quot;%d%b%Y&quot; --date=&quot;${BACKUP_RETAIN_DAYS} days ago&quot;`

    # if [ ! -z ${DB_BACKUP_PATH} ]; then
    #       cd ${DB_BACKUP_PATH}
    #       if [ ! -z ${DBDELDATE} ] &amp;amp;&amp;amp; [ -d ${DBDELDATE} ]; then
    #             rm -rf ${DBDELDATE}
    #       fi
    # fi

    ### End of script ####
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;51&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;스크립트에서 사용자 &lt;strong papago-id=&quot;51-1&quot;&gt;이름, 암호, 데이터베이스 이름(또는 데이터베이스&lt;/strong&gt;가 둘 &lt;strong papago-id=&quot;51-1&quot;&gt;이상&lt;/strong&gt;인 경우&lt;strong papago-id=&quot;51-1&quot;&gt;)&lt;/strong&gt; 또한 포트 번호(다른 경우)를 지정하면 됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;52&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;스크립트를 실행하려면 다음과 같이 명령을 사용합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;sudo ./script.sc
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;53&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;파일의 결과(예: 실패 발생 또는 백업 성공)를 보려면 다음과 같이 명령을 사용할 것을 제안합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;sudo ./myshellsc.sh 2&amp;gt;&amp;gt; Backup-Report.log
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;54&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;감사해요.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;55&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/19664893/linux-shell-script-for-database-backup&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>MYSQL</category>
      <author>powerit</author>
      <guid isPermaLink="true">https://powerit.tistory.com/1404</guid>
      <comments>https://powerit.tistory.com/1404#entry1404comment</comments>
      <pubDate>Mon, 30 Oct 2023 21:21:52 +0900</pubDate>
    </item>
    <item>
      <title>MySQL에서 테이블 이름을 저장 프로시저 및/또는 함수 인수로 전달하는 방법은 무엇입니까?</title>
      <link>https://powerit.tistory.com/1403</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;예를 들어, 다음과 같이 작동하지 않습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;DELIMITER //
CREATE PROCEDURE countRows(tbl_name VARCHAR(40))
  BEGIN
    SELECT COUNT(*) as ct FROM tbl_name;
  END //

DELIMITER ;
CALL countRows('my_table_name');
&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;ERROR 1146 (42S02): Table 'test.tbl_name' doesn't exist
&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;SELECT COUNT(*) as ct FROM my_table_name;
&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;select 문에서 인수를 테이블 이름으로 사용하려면 어떤 구문이 필요합니까?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이게 가능하긴 해요?&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://dev.mysql.com/doc/refman/5.1/en/sql-syntax-prepared-statements.html&quot; rel=&quot;noreferrer&quot; papago-id=&quot;5-0&quot;&gt;준비된 진술&lt;/a&gt;이 당신에게 필요한 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;CREATE  PROCEDURE `test1`(IN tab_name VARCHAR(40) )
BEGIN
 SET @t1 =CONCAT('SELECT * FROM ',tab_name );
 PREPARE stmt3 FROM @t1;
 EXECUTE stmt3;
 DEALLOCATE PREPARE stmt3;
END $$
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이렇게 할 수 있습니다.&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt; DROP PROCEDURE IF EXISTS `getDataUsingSiteCode`;
    DELIMITER $$
    CREATE PROCEDURE `getDataUsingSiteCode`(
          IN tab_name VARCHAR(40), 
          IN site_ VARCHAR(255)
       )
        BEGIN
          SET @site_code = site_;
          SET @sql_ =CONCAT('SELECT * FROM ',tab_name,' WHERE site=?');
          PREPARE statement_ FROM @sql_;
          EXECUTE statement_ using @site_code;
        END$$
    DELIMITER ;
&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;URL : https://stackoverflow.com/questions/2977356/in-mysql-how-to-pass-a-table-name-as-stored-procedure-and-or-function-argument&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>MYSQL</category>
      <author>powerit</author>
      <guid isPermaLink="true">https://powerit.tistory.com/1403</guid>
      <comments>https://powerit.tistory.com/1403#entry1403comment</comments>
      <pubDate>Mon, 30 Oct 2023 21:21:40 +0900</pubDate>
    </item>
    <item>
      <title>자바스크립트 문자열에서 순방향 슬래시를 글로벌하게 대체하는 방법은?</title>
      <link>https://powerit.tistory.com/1402</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;자바스크립트 문자열에서 순방향 슬래시를 글로벌하게 대체하는 방법은?&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;자바스크립트 문자열에서 순방향 슬래시를 글로벌하게 대체하는 방법은?&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음과 같은 경우만 해당되지만 한 가지 경우만 대체됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&quot;string&quot;.replace('/', 'ForwardSlash');
&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;&quot;string&quot;.replace(/\//g, 'ForwardSlash');
&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;다음과 함께 regex 리터럴 사용&lt;/font&gt;&lt;/font&gt;&lt;code&gt;g&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;modifier, 그리고 구분 기호와 충돌하지 않도록 백슬래시를 사용하여 앞으로 슬래시를 탈출합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var str = 'some // slashes', replacement = '';
var replaced = str.replace(/\//g, replacement);
&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;str = 'this/that and/if';

var newstr = str.replace(/[/]/g, 'ForwardSlash');
&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;regex를 사용하지 않고(검색 문자열이 사용자 입력인 경우에만 이 작업을 수행함):&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var str = 'Hello/ world/ this has two slashes!';
alert(str.split('/').join(',')); // alerts 'Hello, world, this has two slashes!' 
&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;'string with / in it'.replace(/\//g, '\\');
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 나에게 효과가 있었습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&quot;//&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;&quot;/&quot;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;str.replace(/\/\//g, '/');
&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;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;function stripSlashes(x)
{
var y = &quot;&quot;;
for(i = 0; i &amp;lt; x.length; i++)
{
    if(x.charAt(i) == &quot;/&quot;)
    {
        y += &quot;&quot;;
    }
    else
    {
        y+= x.charAt(i);
    }
}
return y;   
}
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;13&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 크리스토퍼 링컨의 생각이지만 코드는 정확합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;function replace(str,find,replace){
    if (find){
        str = str.toString();
        var aStr = str.split(find);
        for(var i = 0; i &amp;lt; aStr.length; i++) {
            if (i &amp;gt; 0){
                str = str + replace + aStr[i];
            }else{
                str = aStr[i];
            }
        }
    }
    return str;
}
&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;var somevariable = replace('//\\\/\/sdfas/\/\/\\\////','\/sdf','replacethis\');
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;자바스크립트 글로벌 문자열 교체는 불필요하게 복잡합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 기능은 그 문제를 해결해 줍니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;성능에 미치는 영향은 적겠지만 무시해도 될 것 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;16&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;16-1&quot;&gt;여기&lt;/strong&gt;에 대체 기능이 있습니다. 훨씬 더 깨끗해 보이지만 위 기능보다 평균적으로 약 25~20% 느립니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;function replace(str,find,replace){
    if (find){
        str = str.toString().split(find).join(replace);
    }
    return str;
}
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;var str = '/questions'; // input: &quot;/questions&quot;
while(str.indexOf('/') != -1){
   str = str.replace('/', 'http://stackoverflow.com/');
}
alert(str); // output: &quot;http://stackoverflow.com/questions&quot;
&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;/\//g&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;//g, replacement);&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&gt;&lt;code&gt;RegExp&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;21&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;좀 더 가독성 있게 하기 위한 목적.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;str.replace(new RegExp('/'), 'foobar');
&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;&quot;g&quot;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;23&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;깃발을 올리다&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;str.replace(new RegExp('/', 'g'), 'foobar');
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;24&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;의 대안.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;'/'.replace(/\//g, 'Replaced')&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;25&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그럴 수도 있겠지요&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-js prettyprint-override&quot;&gt;&lt;code&gt;'/'.split('/').join('Replaced')
&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;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/4566771/how-to-globally-replace-a-forward-slash-in-a-javascript-string&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>JavaScript</category>
      <author>powerit</author>
      <guid isPermaLink="true">https://powerit.tistory.com/1402</guid>
      <comments>https://powerit.tistory.com/1402#entry1402comment</comments>
      <pubDate>Mon, 30 Oct 2023 21:21:33 +0900</pubDate>
    </item>
    <item>
      <title>0과 1사이의 신속한 무작위 유동</title>
      <link>https://powerit.tistory.com/1401</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;0과 1사이의 신속한 무작위 유동&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Swift에서 0과 1 사이의 임의 플로트를 시도하고 있지만 유형 변환이 작동하지 않는 것 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;func randomCGFloat() -&amp;gt; CGFloat {
    return CGFloat(arc4random()) / UINT32_MAX
}
&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;'CGFloat'을 '로 전환할 수 없습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;UInt8' 오류&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;Xcode 6 실행 중.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;4-3&quot;&gt;Int, Double, Float, CGFloat&lt;/strong&gt;의 &lt;strong papago-id=&quot;4-1&quot;&gt;난수&lt;/strong&gt;에 대한 확장입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;스위프트 3 &amp;amp; 4 &amp;amp; 5 구문&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;import Foundation
import CoreGraphics

// MARK: Int Extension

public extension Int {

    /// Returns a random Int point number between 0 and Int.max.
    static var random: Int {
        return Int.random(n: Int.max)
    }

    /// Random integer between 0 and n-1.
    ///
    /// - Parameter n:  Interval max
    /// - Returns:      Returns a random Int point number between 0 and n max
    static func random(n: Int) -&amp;gt; Int {
        return Int(arc4random_uniform(UInt32(n)))
    }

    ///  Random integer between min and max
    ///
    /// - Parameters:
    ///   - min:    Interval minimun
    ///   - max:    Interval max
    /// - Returns:  Returns a random Int point number between 0 and n max
    static func random(min: Int, max: Int) -&amp;gt; Int {
        return Int.random(n: max - min + 1) + min

    }
}

// MARK: Double Extension

public extension Double {

    /// Returns a random floating point number between 0.0 and 1.0, inclusive.
    static var random: Double {
        return Double(arc4random()) / 0xFFFFFFFF
    }

    /// Random double between 0 and n-1.
    ///
    /// - Parameter n:  Interval max
    /// - Returns:      Returns a random double point number between 0 and n max
    static func random(min: Double, max: Double) -&amp;gt; Double {
        return Double.random * (max - min) + min
    }
}

// MARK: Float Extension

public extension Float {

    /// Returns a random floating point number between 0.0 and 1.0, inclusive.
    static var random: Float {
        return Float(arc4random()) / 0xFFFFFFFF
    }

    /// Random float between 0 and n-1.
    ///
    /// - Parameter n:  Interval max
    /// - Returns:      Returns a random float point number between 0 and n max
    static func random(min: Float, max: Float) -&amp;gt; Float {
        return Float.random * (max - min) + min
    }
}

// MARK: CGFloat Extension

public extension CGFloat {

    /// Randomly returns either 1.0 or -1.0.
    static var randomSign: CGFloat {
        return (arc4random_uniform(2) == 0) ? 1.0 : -1.0
    }

    /// Returns a random floating point number between 0.0 and 1.0, inclusive.
    static var random: CGFloat {
        return CGFloat(Float.random)
    }

    /// Random CGFloat between 0 and n-1.
    ///
    /// - Parameter n:  Interval max
    /// - Returns:      Returns a random CGFloat point number between 0 and n max
    static func random(min: CGFloat, max: CGFloat) -&amp;gt; CGFloat {
        return CGFloat.random * (max - min) + min
    }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;용도:&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;let randomNumDouble  = Double.random(min: 0.00, max: 23.50)
let randomNumInt     = Int.random(min: 56, max: 992)
let randomNumFloat   = Float.random(min: 6.98, max: 923.09)
let randomNumCGFloat = CGFloat.random(min: 6.98, max: 923.09)
&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;divist를 float(플로트)로 초기화해 보십시오.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;CGFloat(Float(arc4random()) / Float(UINT32_MAX))
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;신속한 4.2:&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;let randomFloat = Float.random(in: 0..&amp;lt;1)
&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;Swift 3에 대한 &lt;a href=&quot;https://stackoverflow.com/a/32866619/5501940&quot; papago-id=&quot;9-1&quot;&gt;Sandy Champman의 답변&lt;/a&gt; 업데이트:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;extension ClosedRange where Bound : FloatingPoint {
    public func random() -&amp;gt; Bound {
        let range = self.upperBound - self.lowerBound
        let randomValue = (Bound(arc4random_uniform(UINT32_MAX)) / Bound(UINT32_MAX)) * range + self.lowerBound
        return randomValue
    }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;10&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이제 당신은 다음과 같은 말을 할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;(-1.0...1.0).random()&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;strong papago-id=&quot;12-0&quot;&gt;편집&lt;/strong&gt; 오늘(Swift 4) 다음과 같은 글을 쓸 것 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;extension ClosedRange where Bound : FloatingPoint {
    public func random() -&amp;gt; Bound {
        let max = UInt32.max
        return
            Bound(arc4random_uniform(max)) /
            Bound(max) *
            (upperBound - lowerBound) +
            lowerBound
    }
}
&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;strong papago-id=&quot;13-0&quot;&gt;참고&lt;/strong&gt; 스위프트 4.2는 네이티브 난수 생성을 도입하여 이 모든 것이 무트가 됩니다.&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;여기 프레임워크는 Swift: https://github.com/thellimist/SwiftRandom/blob/master/SwiftRandom/Randoms.swift 에서 난수 데이터를 생성하는 데 유용합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;public extension Int {
    /// SwiftRandom extension
    public static func random(lower: Int = 0, _ upper: Int = 100) -&amp;gt; Int {
        return lower + Int(arc4random_uniform(UInt32(upper - lower + 1)))
    }
}

public extension Double {
    /// SwiftRandom extension
    public static func random(lower: Double = 0, _ upper: Double = 100) -&amp;gt; Double {
        return (Double(arc4random()) / 0xFFFFFFFF) * (upper - lower) + lower
    }
}

public extension Float {
    /// SwiftRandom extension
    public static func random(lower: Float = 0, _ upper: Float = 100) -&amp;gt; Float {
        return (Float(arc4random()) / 0xFFFFFFFF) * (upper - lower) + lower
    }
}

public extension CGFloat {
    /// SwiftRandom extension
    public static func random(lower: CGFloat = 0, _ upper: CGFloat = 1) -&amp;gt; CGFloat {
        return CGFloat(Float(arc4random()) / Float(UINT32_MAX)) * (upper - lower) + lower
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;15&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;아래는 의 확장입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;IntervalType&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;extension IntervalType {
    public func random() -&amp;gt; Bound {
        let range = (self.end as! Double) - (self.start as! Double)
        let randomValue = (Double(arc4random_uniform(UINT32_MAX)) / Double(UINT32_MAX)) * range + (self.start as! Double)
        return randomValue as! Bound
    }
}
&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;(0.0...1.0).random()
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;추가&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;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;Int&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;20&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;s, 그러면 당신은 다음 확장자를 사용할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;CollectionType&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;21&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;프로토콜:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;extension CollectionType {
    public func random() -&amp;gt; Self._Element {
        if let startIndex = self.startIndex as? Int {
            let start = UInt32(startIndex)
            let end = UInt32(self.endIndex as! Int)
            return self[Int(arc4random_uniform(end - start) + start) as! Self.Index]
        }
        var generator = self.generate()
        var count = arc4random_uniform(UInt32(self.count as! Int))
        while count &amp;gt; 0 {
            generator.next()
            count = count - 1
        }
        return generator.next() as! Self._Element
    }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;code&gt;Int&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;IntervalType&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;Range&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 class=&quot;papago-parent&quot;&gt;이 작업을 통해 얻을 수 있는 이점&lt;/font&gt;&lt;/font&gt;&lt;code&gt;CollectionType&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;25&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;유형은 자동적으로 다음과 같이 전달되는 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Dictionary&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;26&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Array&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;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;(0...10).random()               // Ex: 6
[&quot;A&quot;, &quot;B&quot;, &quot;C&quot;].random()        // Ex: &quot;B&quot;
[&quot;X&quot;:1, &quot;Y&quot;:2, &quot;Z&quot;:3].random()  // Ex: (.0: &quot;Y&quot;, .1: 2)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong papago-id=&quot;29&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;스위프트 5&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;let randomFloat = CGFloat.random(in: 0...1)
&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;jmduke가 제안한 것은 Playground에서 기능을 약간만 변경하면 작동하는 것 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;func randomCGFloat() -&amp;gt; Float {
    return Float(arc4random()) /  Float(UInt32.max)
}
&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;그리고 drewag에서 언급한 것처럼 swift document에서 형식 변환이 명시적이어야 하는 이유는 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;let three = 3
let pointOneFourOneFiveNine = 0.14159
let pi = Double(three) + pointOneFourOneFiveNine
// pi equals 3.14159, and is inferred to be of type Double
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;drand48()
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;32&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;[더블]이 필요한 경우.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;0과 1사이.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그게 전부입니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;em papago-id=&quot;33&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;야닉 스테프의 대답에 근거해서.&lt;/font&gt;&lt;/em&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;34&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;부동 소수점 유형에 적합하도록 하려면 다음과 같이 하십시오.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Double&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;35&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Float&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;36&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;CGFloat&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;37&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;, 그 외에, 당신은 확장을 할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;BinaryFloatingPoint&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;38&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;유형:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;extension BinaryFloatingPoint {

    /// Returns a random floating point number between 0.0 and 1.0, inclusive.
    public static var random: Self {
        return Self(arc4random()) / 0xFFFFFFFF
    }

    /// Random double between 0 and n-1.
    ///
    /// - Parameter n:  Interval max
    /// - Returns:      Returns a random double point number between 0 and n max
    public static func random(min: Self, max: Self) -&amp;gt; Self {
        return Self.random * (max - min) + min
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;h2 papago-id=&quot;39&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;40&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Xcode: 9.2, 스위프트 4&lt;/font&gt;&lt;/p&gt; 
&lt;h2 papago-id=&quot;41&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;해결책&lt;/font&gt;&lt;/h2&gt; 
&lt;pre&gt;&lt;code&gt;extension BinaryInteger {

    static func rand(_ min: Self, _ max: Self) -&amp;gt; Self {
        let _min = min
        let difference = max+1 - _min
        return Self(arc4random_uniform(UInt32(difference))) + _min
    }
}

extension BinaryFloatingPoint {

    private func toInt() -&amp;gt; Int {
        // https://stackoverflow.com/q/49325962/4488252
        if let value = self as? CGFloat {
            return Int(value)
        }
        return Int(self)
    }

    static func rand(_ min: Self, _ max: Self, precision: Int) -&amp;gt; Self {

        if precision == 0 {
            let min = min.rounded(.down).toInt()
            let max = max.rounded(.down).toInt()
            return Self(Int.rand(min, max))
        }

        let delta = max - min
        let maxFloatPart = Self(pow(10.0, Double(precision)))
        let maxIntegerPart = (delta * maxFloatPart).rounded(.down).toInt()
        let randomValue = Int.rand(0, maxIntegerPart)
        let result = min + Self(randomValue)/maxFloatPart
        return Self((result*maxFloatPart).toInt())/maxFloatPart
    }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2 papago-id=&quot;42&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;print(&quot;\(Int.rand(1, 20))&quot;)
print(&quot;\(Float.rand(5.231233, 44.5, precision: 3))&quot;)
print(&quot;\(Double.rand(5.231233, 44.5, precision: 4))&quot;)
print(&quot;\(CGFloat.rand(5.231233, 44.5, precision: 6))&quot;)
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2 papago-id=&quot;43&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;import Foundation
import CoreGraphics

func run() {
    let min = 2.38945
    let max = 2.39865
    for _ in 0...100 {
        let precision = Int.rand(0, 5)
        print(&quot;Precision: \(precision)&quot;)
        floatSample(min: Float(min), max: Float(max), precision: precision)
        floatSample(min: Double(min), max: Double(max), precision: precision)
        floatSample(min: CGFloat(min), max: CGFloat(max), precision: precision)
        intSample(min: Int(1), max: Int(10000))
        print(&quot;&quot;)
    }
}

private func printResult&amp;lt;T: Comparable&amp;gt;(min: T, max: T, random: T) {
    let result = &quot;\(T.self) rand[\(min), \(max)] = \(random)&quot;
    print(result)
}

func floatSample&amp;lt;T: BinaryFloatingPoint&amp;gt;(min: T, max: T, precision: Int) {
    printResult(min: min, max: max, random: T.rand(min, max, precision: precision))
}

func intSample&amp;lt;T: BinaryInteger&amp;gt;(min: T, max: T) {
    printResult(min: min, max: max, random: T.rand(min, max))
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2 papago-id=&quot;44&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;결과.&lt;/font&gt;&lt;/h2&gt; 
&lt;p&gt;&lt;a href=&quot;https://i.stack.imgur.com/9zyUR.png&quot; rel=&quot;nofollow noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/9zyUR.png&quot; alt=&quot;enter image description here&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p papago-id=&quot;45&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/25050309/swift-random-float-between-0-and-1&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>SWIFT</category>
      <author>powerit</author>
      <guid isPermaLink="true">https://powerit.tistory.com/1401</guid>
      <comments>https://powerit.tistory.com/1401#entry1401comment</comments>
      <pubDate>Mon, 30 Oct 2023 21:21:26 +0900</pubDate>
    </item>
    <item>
      <title>도커 디버깅은 mariadb 상태 점검을 구성합니다.</title>
      <link>https://powerit.tistory.com/1400</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;도커 디버깅은 mariadb 상태 점검을 구성합니다.&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;mariadb 서비스에서 상태 검사를 추가하려고 하는데 서버에 대한 클라이언트 연결이 차단되어 다음 메시지가 표시됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;ERROR 2005 (HY000): Unknown MySQL server host 'mysql' (0)
&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;healthcheck:
  test: /usr/bin/learnintouch/db-health-check.sh
  interval: 30s
  timeout: 10s
  retries: 3
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;... 상태 점검이 예상대로 작동할 경우:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;root@428b1e6c7c1a:/usr/bin/learnintouch/www/folkuniversitet# /usr/bin/learnintouch/db-health-check.sh
+ /usr/bin/mysql/install/bin/mysql --protocol=tcp -h mysql -u root -pxxxxxx -e 'show databases;'
Warning: Using a password on the command line interface can be insecure.
+--------------------+
| Database           |
+--------------------+
| db_engine          |
| db_learnintouch    |
| information_schema |
| mysql              |
| performance_schema |
| test               |
+--------------------+
&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;  mysql:
    image: localhost:5000/mariadb:10.1.24
    environment:
      - MYSQL_ROOT_PASSWORD=xxxxxx
    networks:
      - learnintouch
    volumes:
      - &quot;~/dev/docker/projects/learnintouch/volumes/database/data:/usr/bin/mariadb/install/data&quot;
      - &quot;~/dev/docker/projects/learnintouch/volumes/logs:/usr/bin/mariadb/install/logs&quot;
    deploy:
      replicas: 1
      restart_policy:
        condition: any
        delay: 5s
        max_attempts: 3
        window: 10s
&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;  mysql:
    image: localhost:5000/mariadb:10.1.24
    environment:
      - MYSQL_ROOT_PASSWORD=xxxxxx
    networks:
      - learnintouch
    volumes:
      - &quot;~/dev/docker/projects/learnintouch/volumes/database/data:/usr/bin/mariadb/install/data&quot;
      - &quot;~/dev/docker/projects/learnintouch/volumes/logs:/usr/bin/mariadb/install/logs&quot;
    deploy:
      replicas: 1
      restart_policy:
        condition: any
        delay: 5s
        max_attempts: 3
        window: 10s
    healthcheck:
      test: /usr/bin/learnintouch/db-health-check.sh
      interval: 30s
      timeout: 10s
      retries: 3
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;서버 시작 시,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;mariadb&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;2017-12-29 10:27:48 139873749194560 [Note] /usr/bin/mariadb/install/bin/mysqld: ready for connections.
Version: '10.1.24-MariaDB'  socket: '/usr/bin/mariadb/install/tmp/mariadb.sock'  port: 3306  Source distribution
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;여기 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;db-health-check.sh&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;bash 스크립트:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#!/bin/bash -x

/usr/bin/mysql/install/bin/mysql --protocol=tcp -h mysql -u root -pxxxxxx -e &quot;show databases;&quot; || exit 1
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;도커 버전입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Client:
 Version:      17.05.0-ce
 API version:  1.29
 Go version:   go1.7.5
 Git commit:   89658be
 Built:        Thu May  4 22:10:54 2017
 OS/Arch:      linux/amd64

Server:
 Version:      17.05.0-ce
 API version:  1.29 (minimum version 1.12)
 Go version:   go1.7.5
 Git commit:   89658be
 Built:        Thu May  4 22:10:54 2017
 OS/Arch:      linux/amd64
 Experimental: 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;사실 몇 가지 문제들이 있었는데, 그것은 함께 모든 것을 혼란스럽게 만들었습니다.&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;db-health-check.sh&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;14&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;파일이 클라이언트 응용프로그램 컨테이너에 있으므로 서비스 데이터베이스 컨테이너가 상태 확인을 수행해야 할 때 파일을 찾을 수 없습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;15&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;두 번째는.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;db-health-check.sh&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;16&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;파일이 잘못된 경로를 사용했습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;mysql&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;/usr/bin/mariadb/install/bin/mysql&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;18&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;19&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;세 번째는.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;db-health-check.sh&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;mysql&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;localhost&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&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;root&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;24&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용자가 에 연결할 수 없습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;1045 (28000): Access denied for user 'root'@'localhost'&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;25&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;비밀번호가 없어야 하기 때문에&lt;/font&gt;&lt;/font&gt;&lt;code&gt;/usr/bin/mariadb/install/bin/mysql --protocol=tcp -h localhost -u root -e &quot;show databases;&quot; || exit 1&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;26&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;27&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이러한 점을 수정한 후에는 상태 점검을 실시해도 응용 프로그램이 정상적으로 시작되고 실행될 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;28&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;선을 더욱 흐리게 만든 한 가지는 첫 번째 건강검진이 성공적으로 통과될 때까지 서비스를 이용할 수 없다는 것이었습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;실제로 나는 다음과 같이 히텔 체크를 구성했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;healthcheck:
      test: exit 0
      interval: 60s
      timeout: 10s
      retries: 3
&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;&quot;Health&quot;: {
    &quot;Status&quot;: &quot;starting&quot;,
    &quot;FailingStreak&quot;: 0,
    &quot;Log&quot;: []
}
&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;60년대의 첫 번째 간격이 만료되고 상태 점검이 성공할 때까지 애플리케이션이 서비스에 연결할 수 없었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;31&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러므로 나는 애플리케이션을 사용할 수 있도록 너무 오래 기다리지 않도록 짧은 간격을 가져야 합니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;32&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/48007020/debugging-a-docker-compose-mariadb-healthcheck&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>mariadb</category>
      <author>powerit</author>
      <guid isPermaLink="true">https://powerit.tistory.com/1400</guid>
      <comments>https://powerit.tistory.com/1400#entry1400comment</comments>
      <pubDate>Mon, 30 Oct 2023 21:21:13 +0900</pubDate>
    </item>
    <item>
      <title>필수 범주의 제품이 카트에 있는 경우에만 체크아웃 허용</title>
      <link>https://powerit.tistory.com/1399</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;필수 범주의 제품이 카트에 있는 경우에만 체크아웃 허용&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 어떤 고객이라도 바구니에 특별한 상품 카테고리가 없다면 체크아웃을 진행하는 것을 중단하고 싶습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그들에게 특정 제품을 추가해야 한다는 오류 메시지도 전달하고 싶습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;코드를 찾았는데 작동이 안 됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;워드프레스 설치에 코드 스니펫으로 추가했지만 디버깅 스위치를 켰는데도 작동하지 않고 오류 메시지도 없습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것이 작동하기 위해 수정이 필요할 수 있는 Github에서 찾은 코드는 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;function sv_wc_prevent_checkout_for_category() {

    // set the slug of the category for which we disallow checkout
    $category = 'sibling';

    // get the product category
    $product_cat = get_term_by( 'slug', $category, 'product_cat' );

    // sanity check to prevent fatals if the term doesn't exist
    if ( is_wp_error( $product_cat ) ) {
        return;
    }

    $category_name = '&amp;lt;a href=&quot;' . get_term_link( $category, 'product_cat' ) . '&quot;&amp;gt;' . $product_cat-&amp;gt;name . '&amp;lt;/a&amp;gt;';

    // check if this category is the only thing in the cart
    if ( sv_wc_is_category_alone_in_cart( $category ) ) {

        // render a notice to explain why checkout is blocked
        wc_add_notice( sprintf( 'Hi there! Looks like your cart only contains products from the %1$s category &amp;amp;ndash; you must purchase a product from another category to check out.', $category_name ), 'error' );
    }
}
add_action( 'woocommerce_check_cart_items', 'sv_wc_prevent_checkout_for_category' );

/**
 * Checks if a cart contains exclusively products in a given category
 * 
 * @param string $category the slug of the product category
 * @return bool - true if the cart only contains the given category
 */
function sv_wc_is_category_alone_in_cart( $category ) {

    // check each cart item for our category
    foreach ( WC()-&amp;gt;cart-&amp;gt;get_cart() as $cart_item_key =&amp;gt; $cart_item ) {

        // if a product is not in our category, bail out since we know the category is not alone
        if ( ! has_term( $category, 'product_cat', $cart_item['data']-&amp;gt;id ) ) {
            return false;
        }
    }

    // if we're here, all items in the cart are in our category
    return true;
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그래서 카트에 'sibling' 카테고리만 있으면 체크아웃(오류 메시지와 함께)을 중지하려고 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;고객이 체크아웃하기 전에 바구니에 담아야 하는 '표준' 카테고리가 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이게 말이 되기를 바랍니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;여기에 요령을 터득할 수 있는 해결책이 방법이 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;특히 두 가지 주요 기능&lt;em papago-id=&quot;3-1&quot;&gt;(마지막 기능&lt;/em&gt;)이 있습니다&lt;em papago-id=&quot;3-1&quot;&gt;.&lt;/em&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;첫 번째 기능(&lt;em papago-id=&quot;4-1&quot;&gt;N°3)&lt;/em&gt;은 카트에 필수 제품 범주가 아닌 무언가가 있을 때 카트 페이지에 메시지를 표시합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;필수 제품 보관 페이지에 메시지도 표시합니다&lt;em papago-id=&quot;4-3&quot;&gt;(고객이 체크아웃에서 리디렉션될&lt;/em&gt; 때 &lt;em papago-id=&quot;4-3&quot;&gt;유용함,&lt;/em&gt; 아래 &lt;em papago-id=&quot;4-3&quot;&gt;참조).&lt;/em&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;두 번째 기능&lt;em papago-id=&quot;5-1&quot;&gt;(N°4)&lt;/em&gt;은 고객이 체크아웃을 시도할 때 제품 필수 카테고리 보관 페이지로 리디렉션하며 카트에 필수 제품 카테고리가 누락되어 있지 않습니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;blockquote&gt; 
 &lt;p papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;필수 범주 슬러그가 기능하기 전에 정의합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/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;/p&gt; 
&lt;pre&gt;&lt;code&gt;// Function that define the mandatory product category
 function your_mandatory_category_slug(){

     // DEFINE HERE the SLUG of the needed product category
    $category = 'clothing';
    return $category;
 }


// Conditional function that returns true if the mandatory product category is in cart
function has_mandatory_category(){
    $category_needed = your_mandatory_category_slug();
    $has_cat = false;

    // Iterrating each item in cart and detecting…
    foreach ( WC()-&amp;gt;cart-&amp;gt;get_cart() as $item ) {

        // Detects if the needed product category is in cart items
        if ( has_term($category_needed, 'product_cat', $item['product_id'] ) ) {
            $has_cat = true;
            break;
        }
    }
    return $has_cat;
 }


// Function that display a message if there is not in cart a mandatory product category
function mandatory_category_display_message() {
        $category_needed = your_mandatory_category_slug();

    // check that cart is not empty (for cart and product category archives)
    if( !WC()-&amp;gt;cart-&amp;gt;is_empty() &amp;amp;&amp;amp; ( is_cart() || is_product_category( $category_needed ) ) ){
        $category_obj = get_term_by( 'slug', $category_needed, 'product_cat' );
        if ( is_wp_error( $category_obj ) ) return;

        // Display message when product category is not in cart items
        if ( !has_mandatory_category() ) {
            $category_name = $category_obj-&amp;gt;name;
            $category_url = get_term_link( $category_needed, 'product_cat' );

            // render a notice to explain why checkout is blocked
            wc_add_notice( sprintf( __( '&amp;lt;strong&amp;gt;Reminder:&amp;lt;/strong&amp;gt; You have to add in your cart, a product from &quot;%1$s&quot; category, to be allowed to check out. Please return &amp;lt;a href=&quot;%2$s&quot;&amp;gt; here to &quot;%1$s&quot; product page&amp;lt;/a&amp;gt;', 'your_theme_domain'), $category_name, $category_url ), 'error' );
        }
    }
}
add_action( 'woocommerce_before_main_content', 'mandatory_category_display_message', 30 ); // for product mandatory category archives pages
add_action( 'woocommerce_check_cart_items', 'mandatory_category_display_message' ); // for cat page


// Function that redirect from checkout to mandatory product category archives pages
function mandatory_category_checkout_redirect() {

    // If cart is not empty on checkout page
    if( !WC()-&amp;gt;cart-&amp;gt;is_empty() &amp;amp;&amp;amp; is_checkout() ){
        $category_needed = your_mandatory_category_slug();

        // If missing product category =&amp;gt; redirect to the products category page
        if ( !has_mandatory_category() )
            wp_redirect( get_term_link( $category_needed, 'product_cat' ) );
    }
}
add_action('template_redirect', 'mandatory_category_checkout_redirect');
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;em 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;활성 하위 테마(또는 테마)의 php 파일 또는 플러그인 파일에 있습니다.&lt;/font&gt;&lt;/em&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&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;0&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Loic The Aztec의 답변을 두 가지 카테고리로 작업하도록 각색했습니다.&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;has_mandatory_categorytext&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;function, . 만약 당신이 코드를 따를 수 있다면 당신은 diy를 할 수 있지만, 나는 단지 기능에 집중하고 있었습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/40431544/checking-that-one-of-multiple-mandatory-products-categories-are-in-cart/40434064#40434064&quot; papago-id=&quot;11-1&quot;&gt;여기&lt;/a&gt; 또 다른 답변이 있는데 저는 이 답변이 더 마음에 들고 다른 답변은 제게 맞지 않았습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;// Function that define the 2 mandatory product categories cat1 &amp;amp; cat2
 function your_mandatory_category_slug(){ $category = 'cat1';    return $category; }
 function your_mandatory_category_slug2(){ $category = 'cat2';    return $category; }
// Conditional function that returns true if the mandatory product category is in cart
function has_mandatory_category1(){
    $category_needed = your_mandatory_category_slug();
    $has_cat = false;
    foreach ( WC()-&amp;gt;cart-&amp;gt;get_cart() as $item ) {
        if ( has_term($category_needed, 'product_cat', $item['product_id'] ) ) {
            $has_cat = true;
            break;
        }
    }
    return $has_cat;
 }
// Conditional function that returns true if the mandatory product category is in cart
function has_mandatory_category2(){
    $category_needed = your_mandatory_category_slug2();
    $has_cat = false;
    foreach ( WC()-&amp;gt;cart-&amp;gt;get_cart() as $item ) {
        if ( has_term($category_needed, 'product_cat', $item['product_id'] ) ) {
            $has_cat = true;
            break;
        }
    }
    return $has_cat;
 }





// Function that redirect from checkout to mandatory product category archives pages
function mandatory_category_checkout_redirect() {
    // If cart is not empty on checkout page
    if( !WC()-&amp;gt;cart-&amp;gt;is_empty() &amp;amp;&amp;amp; is_checkout() ){
        $category_needed = your_mandatory_category_slug();
        $category_needed2 = your_mandatory_category_slug2();
        if ( !has_mandatory_category1() )
            wp_redirect( get_term_link( $category_needed, 'product_cat' ) );
        if ( !has_mandatory_category2() )
            wp_redirect( get_term_link( $category_needed2, 'product_cat' ) );
    }
}
add_action('template_redirect', 'mandatory_category_checkout_redirect');
&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;Woocommerce v2.6.12로 Wordpress 설치에 매력적으로 작용합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;13&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;앞으로 3개나 4개 정도의 필수 제품 카테고리를 두 개 추가하고 싶습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;변경을 시도했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$category = 'slug1';
&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;$category = 'slug1', 'slug2';
&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;$category = array('slug1','slug2');
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;16&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;성공하지 못했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 코드를 여러 개의 슬러그와 함께 작동시키는 방법이 있습니까?&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/39644645/allow-checkout-only-when-a-product-of-a-mandatory-category-is-in-cart&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>Wordpress</category>
      <author>powerit</author>
      <guid isPermaLink="true">https://powerit.tistory.com/1399</guid>
      <comments>https://powerit.tistory.com/1399#entry1399comment</comments>
      <pubDate>Mon, 30 Oct 2023 21:21:05 +0900</pubDate>
    </item>
    <item>
      <title>*ngIf에 대해 Angular 8 HTML 템플릿에서 Enum 사용</title>
      <link>https://powerit.tistory.com/1398</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;*ngIf에 대해 Angular 8 HTML 템플릿에서 Enum 사용&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Angular 8 템플릿에서 Enums를 사용하려면 어떻게 해야 합니까?&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;component.ts&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;import { Component } from '@angular/core';
import { SomeEnum } from './global';

@Component({
  selector: 'my-app',
  templateUrl: './app.component.html',
  styleUrls: [ './app.component.css' ]
})
export class AppComponent  {
  name = SomeEnum.someValue;
}

&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;&amp;lt;span *ngIf=&quot;name === SomeEnum.someValue&quot;&amp;gt;This has some value&amp;lt;/value&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;템플릿에 다음에 대한 참조가 없으므로 현재 작동하지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;SomeEnum&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;. 어떻게 해결해야 합니까?&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;ERROR Error: Cannot read property 'someValue' of undefined&lt;/code&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;import { SomeEnum } from 'path-to-file';

public get SomeEnum() {
  return SomeEnum; 
}
&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;HTML로&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;*ngIf=&quot;SomeEnum.someValue === 'abc'&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;hr&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;get&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;방법.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;두 가지 솔루션 모두 효과가 있으므로 가장 마음에 드는 솔루션을 선택하면 됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;시험관에서&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;import { SomeEnum } from 'path-to-file';

export class ClassName {
  readonly SomeEnum = SomeEnum;
}
&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;HTML로&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;*ngIf=&quot;SomeEnum.someValue === 'abc'&quot;
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;먼저 재산으로 신고해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;import { Component } from '@angular/core';
import { SomeEnum } from './global';

@Component({
  selector: 'my-app',
  templateUrl: './app.component.html',
  styleUrls: [ './app.component.css' ]
})
export class AppComponent  {
  name = SomeEnum.someValue;
  importedSomeEnum = SomeEnum;
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;13&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그런 다음 템플릿에 사용합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;span *ngIf=&quot;name === importedSomeEnum.someValue&quot;&amp;gt;This has some value&amp;lt;/span&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;hr&gt; 
&lt;blockquote&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://stackblitz.com/edit/angular-zpw8pe?file=src%2Fapp%2Fapp.component.html&quot; rel=&quot;noreferrer&quot; papago-id=&quot;14-1&quot;&gt;&lt;strong papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;작업&lt;/font&gt;&lt;/strong&gt;&lt;/a&gt; 데모가 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt;&lt;p papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;불필요한 논리로 수업을 부풀리고 싶지 않다면 이것이 더 간단한 해결책 중 하나가 될 것이라고 생각합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;열거를 반환하는 함수를 호출하는 것은 피할 것입니다. 왜냐하면 열거는 모든 재렌더에서 호출되고 이것이 많이 사용될 경우 성능에 영향을 미칠 것이기 때문입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;public readonly myEnum : typeof MyEnum = MyEnum;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;16&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음과 같은 필드를 선언할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;SomeEnum&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;17&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;enum(다른 파일에서 가져올 수 있음)은 구성 요소 파일의 공용 클래스 필드입니다.&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;// component 
export class AppComponent  {
  name = SomeEnum.someValue;
  enum = SomeEnum;
}

// template
&amp;lt;span *ngIf=&quot;name === enum.someValue&quot;&amp;gt;This has some value&amp;lt;/value&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;font class=&quot;papago-parent&quot;&gt;이를 위한 몇 가지 방법이 있습니다. 1. 아래와 같이 구성 요소 ts 파일에 Enum 참조를 추가합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;someEnum = SomeEnum;
&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;&amp;lt;span *ngIf=&quot;name === someEnum.someValue&quot;&amp;gt;This has some value&amp;lt;/value&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;ol start=&quot;2&quot;&gt; 
 &lt;li papago-id=&quot;20&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;두번째 방법은 이름을 매개변수로 템플릿에서 함수를 호출하여 타이프스크립트 파일에서 비교하는 것입니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p&gt;&lt;code&gt;&amp;lt;span *ngIf=&quot;checkCondition(name)&quot;&amp;gt;This has some value&amp;lt;/value&amp;gt;&lt;/code&gt;&lt;/p&gt;&lt;p papago-id=&quot;21&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 열거형을 많은 구성요소에 사용할 계획이라면 Pipe를 사용하는 것이 좋습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;import { Pipe, PipeTransform } from '@angular/core';
import { SomeEnum } from 'path/to/some-enum.enum';

@Pipe({
    name: 'compareToSomeEnum',
})
export class CompareToSomeEnumPipe implements PipeTransform {
    transform(
        value: SomeEnum,
        compareTo: keyof SomeEnum,
    ): boolean {
        return value === SomeEnum[compareTo];
    }
}

&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;&amp;lt;span *ngIf=&quot;name | compareToSomeEnum : 'someValue'&quot;&amp;gt;This has some value&amp;lt;/span&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;도움이 됐으면 좋겠네요!&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/59289095/use-of-enums-in-angular-8-html-template-for-ngif&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>Angular</category>
      <author>powerit</author>
      <guid isPermaLink="true">https://powerit.tistory.com/1398</guid>
      <comments>https://powerit.tistory.com/1398#entry1398comment</comments>
      <pubDate>Mon, 30 Oct 2023 21:20:56 +0900</pubDate>
    </item>
    <item>
      <title>HTML 캔버스에서 텍스트의 높이를 어떻게 찾을 수 있습니까?</title>
      <link>https://powerit.tistory.com/1397</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;HTML 캔버스에서 텍스트의 높이를 어떻게 찾을 수 있습니까?&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;규격에는 context.measure텍스트(text) 함수가 있어 해당 텍스트를 인쇄하는 데 필요한 너비를 알려주지만 높이를 알 수 있는 방법을 찾을 수 없습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;글꼴 기준인 건 알지만, 글꼴 문자열을 텍스트 높이로 변환할 수는 없습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;브라우저는 고급 &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/TextMetrics&quot; rel=&quot;noreferrer&quot; papago-id=&quot;2-1&quot;&gt;텍스트 메트릭&lt;/a&gt;을 지원하기 시작하고 있으며, 이 작업이 널리 지원될 때 이 작업은 사소한 것이 될 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;let metrics = ctx.measureText(text);
let fontHeight = metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent;
let actualHeight = metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;code&gt;fontHeight&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;code&gt;actualHeight&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;렌더링 중인 문자열에 따라 다릅니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;규격 : https://www.w3.org/TR/2012/CR-2dcontext-20121217/ #&lt;a href=&quot;https://www.w3.org/TR/2012/CR-2dcontext-20121217/#dom-textmetrics-fontboundingboxascent&quot; rel=&quot;noreferrer&quot; papago-id=&quot;5-1&quot;&gt;dom-textmetrics- &lt;/a&gt;font bounding box accents 및 그 바로 아래 섹션&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;지원 현황(2017년 8월 20일):&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Chrome은 깃발 뒤에 그것을 가지고 있습니다 (https://bugs.chromium.org/p/chromium/issues/detail?id=277215) .&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;파이어폭스는 이를 개발 중입니다(https://bugzilla.mozilla.org/show_bug.cgi?id=1102584)&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;Edge가 지원되지 않습니다(https://wpdev.uservoice.com/forums/257854-microsoft-edge-developer/suggestions/30922861-advanced-canvas-textmetrics) .&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://github.com/Automattic/node-canvas&quot; papago-id=&quot;10-0&quot; rel=&quot;noreferrer&quot;&gt;node-canvas&lt;/a&gt;(node.js module), 대부분 지원(&lt;a href=&quot;https://github.com/Automattic/node-canvas&quot; papago-id=&quot;10-0&quot; rel=&quot;noreferrer&quot;&gt;https://github.com/Automattic/node-canvas/wiki/Compatibility-Status)&lt;/a&gt; .&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt;&lt;p papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;11-0&quot;&gt;업데이트&lt;/strong&gt; - 예를 들어 &lt;a href=&quot;https://github.com/danielearwicker/carota&quot; rel=&quot;noreferrer&quot; papago-id=&quot;11-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;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;tmAscent&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;tmDescent&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;14&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Win32의 &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/dd144941%28v=vs.85%29.aspx&quot; papago-id=&quot;14-1&quot; rel=&quot;noreferrer&quot;&gt;GetTextMetric&lt;/a&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;img src=&quot;https://i.stack.imgur.com/h7tRn.png&quot; alt=&quot;Big Text on canvas with metric lines&quot;&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;위 이미지는 Safari의 캔버스에서 생성되었으며 빨간색은 캔버스가 텍스트를 그리도록 지시된 맨 위 선이고 초록색은 기준선, 파란색은 하단입니다(그래서 빨간색에서 파란색은 전체 높이).&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;간결성을 위해 jQuery 사용:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var getTextHeight = function(font) {

  var text = $('&amp;lt;span&amp;gt;Hg&amp;lt;/span&amp;gt;').css({ fontFamily: font });
  var block = $('&amp;lt;div style=&quot;display: inline-block; width: 1px; height: 0px;&quot;&amp;gt;&amp;lt;/div&amp;gt;');

  var div = $('&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;');
  div.append(text, block);

  var body = $('body');
  body.append(div);

  try {

    var result = {};

    block.css({ verticalAlign: 'baseline' });
    result.ascent = block.offset().top - text.offset().top;

    block.css({ verticalAlign: 'bottom' });
    result.height = block.offset().top - text.offset().top;

    result.descent = result.height - result.ascent;

  } finally {
    div.remove();
  }

  return result;
};
&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;display: inline-block&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;vertical-align&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;스타일을 입력한 다음 브라우저가 어디에 있는지 확인합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그래서 당신은 물건을 돌려받습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ascent&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;,&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;descent&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;10&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;height&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(이것은 그저&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ascent&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;12&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;+&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;descent&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;13&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;편의상)&lt;/font&gt; 테스트를&lt;font 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;var testLine = function(ctx, x, y, len, style) {
  ctx.strokeStyle = style; 
  ctx.beginPath();
  ctx.moveTo(x, y);
  ctx.lineTo(x + len, y);
  ctx.closePath();
  ctx.stroke();
};
&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;var font = '36pt Times';
var message = 'Big Text';

ctx.fillStyle = 'black';
ctx.textAlign = 'left';
ctx.textBaseline = 'top'; // important!
ctx.font = font;
ctx.fillText(message, x, y);

// Canvas can tell us the width
var w = ctx.measureText(message).width;

// New function gets the other info we need
var h = getTextHeight(font);

testLine(ctx, x, y, w, 'red');
testLine(ctx, x, y + h.ascent, w, 'green');
testLine(ctx, x, y + h.height, w, 'blue');
&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;대문자 M의 길이를 확인하면 수직 높이에 대한 근사치를 얻을 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;ctx.font = 'bold 10px Arial';

lineHeight = ctx.measureText('M').width;
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;28&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;캔버스 사양에는 끈의 높이를 측정할 수 있는 방법이 없습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 텍스트 크기를 픽셀 단위로 설정할 수 있으며 일반적으로 세로 경계를 비교적 쉽게 파악할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;29&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;더 정확한 것이 필요하다면 텍스트를 캔버스에 던진 다음 픽셀 데이터를 가져와 수직으로 사용되는 픽셀 수를 파악할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 비교적 간단하지만 그다지 효율적이지는 않습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음과 같은 작업을 수행할 수 있습니다(작업은 가능하지만 일부 텍스트를 캔버스에 그려 제거합니다).&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;function measureTextHeight(ctx, left, top, width, height) {

    // Draw the text in the specified area
    ctx.save();
    ctx.translate(left, top + Math.round(height * 0.8));
    ctx.mozDrawText('gM'); // This seems like tall text...  Doesn't it?
    ctx.restore();

    // Get the pixel data from the canvas
    var data = ctx.getImageData(left, top, width, height).data,
        first = false, 
        last = false,
        r = height,
        c = 0;

    // Find the last line with a non-white pixel
    while(!last &amp;amp;&amp;amp; r) {
        r--;
        for(c = 0; c &amp;lt; width; c++) {
            if(data[r * width * 4 + c * 4 + 3]) {
                last = r;
                break;
            }
        }
    }

    // Find the first line with a non-white pixel
    while(r) {
        r--;
        for(c = 0; c &amp;lt; width; c++) {
            if(data[r * width * 4 + c * 4 + 3]) {
                first = r;
                break;
            }
        }

        // If we've got it then return the height
        if(first != r) return last - first;
    }

    // We screwed something up...  What do you expect from free code?
    return 0;
}

// Set the font
context.mozTextStyle = '32px Arial';

// Specify a context and a rect that is safe to draw in when calling measureTextHeight
var height = measureTextHeight(context, 0, 0, 50, 50);
console.log(height);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;30&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;베스핀의 경우 소문자 'm'의 너비를 측정하여 키를 위장합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 이것이 어떻게 쓰이는지 모르며, 이 방법을 추천하고 싶지 않습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;관련 Bespin 방법은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var fixCanvas = function(ctx) {
    // upgrade Firefox 3.0.x text rendering to HTML 5 standard
    if (!ctx.fillText &amp;amp;&amp;amp; ctx.mozDrawText) {
        ctx.fillText = function(textToDraw, x, y, maxWidth) {
            ctx.translate(x, y);
            ctx.mozTextStyle = ctx.font;
            ctx.mozDrawText(textToDraw);
            ctx.translate(-x, -y);
        }
    }

    if (!ctx.measureText &amp;amp;&amp;amp; ctx.mozMeasureText) {
        ctx.measureText = function(text) {
            ctx.mozTextStyle = ctx.font;
            var width = ctx.mozMeasureText(text);
            return { width: width };
        }
    }

    if (ctx.measureText &amp;amp;&amp;amp; !ctx.html5MeasureText) {
        ctx.html5MeasureText = ctx.measureText;
        ctx.measureText = function(text) {
            var textMetrics = ctx.html5MeasureText(text);

            // fake it 'til you make it
            textMetrics.ascent = ctx.html5MeasureText(&quot;m&quot;).width;

            return textMetrics;
        }
    }

    // for other browsers
    if (!ctx.fillText) {
        ctx.fillText = function() {}
    }

    if (!ctx.measureText) {
        ctx.measureText = function() { return 10; }
    }
};
&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;strong papago-id=&quot;31-1&quot;&gt;캔버스 변환을 사용하고 있습니까?&lt;/strong&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그렇다면 변환 행렬을 추적해야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음 방법은 초기 변환으로 텍스트의 높이를 측정해야 합니다.&lt;/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;편집 #2: 이상하게도 이 StackOverflow 페이지에서 실행하면 아래 코드에서 정답이 나오지 않습니다. 일부 스타일 규칙이 있으면 이 기능이 중단될 수 있습니다.&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;캔버스는 CSS에 의해 정의된 글꼴을 사용하므로 이론적으로는 문서에 적절한 스타일의 텍스트 덩어리를 추가하고 높이를 측정할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 텍스트를 렌더링한 후 픽셀 데이터를 확인하는 것보다 훨씬 쉽고, 또한 업센더와 다운센더를 존중해야 한다고 생각합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음을 확인해 보십시오.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var determineFontHeight = function(fontStyle) {
  var body = document.getElementsByTagName(&quot;body&quot;)[0];
  var dummy = document.createElement(&quot;div&quot;);
  var dummyText = document.createTextNode(&quot;M&quot;);
  dummy.appendChild(dummyText);
  dummy.setAttribute(&quot;style&quot;, fontStyle);
  body.appendChild(dummy);
  var result = dummy.offsetHeight;
  body.removeChild(dummy);
  return result;
};

//A little test...
var exampleFamilies = [&quot;Helvetica&quot;, &quot;Verdana&quot;, &quot;Times New Roman&quot;, &quot;Courier New&quot;];
var exampleSizes = [8, 10, 12, 16, 24, 36, 48, 96];
for(var i = 0; i &amp;lt; exampleFamilies.length; i++) {
  var family = exampleFamilies[i];
  for(var j = 0; j &amp;lt; exampleSizes.length; j++) {
    var size = exampleSizes[j] + &quot;pt&quot;;
    var style = &quot;font-family: &quot; + family + &quot;; font-size: &quot; + size + &quot;;&quot;;
    var pixelHeight = determineFontHeight(style);
    console.log(family + &quot; &quot; + size + &quot; ==&amp;gt; &quot; + pixelHeight + &quot; pixels high.&quot;);
  }
}
&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;높이를 측정하는 DOM 요소의 글꼴 스타일을 정확하게 파악해야 하지만 이는 매우 간단합니다. 실제로 다음과 같은 것을 사용해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var canvas = /* ... */
var context = canvas.getContext(&quot;2d&quot;);
var canvasFont = &quot; ... &quot;;
var fontHeight = determineFontHeight(&quot;font: &quot; + canvasFont + &quot;;&quot;);
context.font = canvasFont;
/*
  do your stuff with your font and its height here.
*/
&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;JJ Stiff가 제안하는 것처럼 텍스트를 스팬에 추가한 다음 오프셋을 측정할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;스팬의 높이입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var d = document.createElement(&quot;span&quot;);
d.font = &quot;20px arial&quot;;
d.textContent = &quot;Hello world!&quot;;
document.body.appendChild(d);
var emHeight = d.offsetHeight;
document.body.removeChild(d);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;36&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://www.html5rocks.com/en/tutorials/canvas/texteffects/#toc-text-shadow-clipping&quot; rel=&quot;noreferrer&quot; papago-id=&quot;36-1&quot;&gt;HTML5Rocks&lt;/a&gt;에 나와 있는 것처럼.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;37&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;컨텍스트를 사용하여 글꼴을 정의하면 픽셀 단위의 텍스트 높이가 글꼴 크기(단위)와 동일하지 않습니까?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;폰트?&lt;/font&gt;&lt;/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;/p&gt; 
&lt;p papago-id=&quot;39&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음은 그래픽 답변입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;img src=&quot;https://i.stack.imgur.com/mSH1c.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;40&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;코드는 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;    function textHeight (text, font) {

    var fontDraw = document.createElement(&quot;canvas&quot;);

    var height = 100;
    var width = 100;

    // here we expect that font size will be less canvas geometry
    fontDraw.setAttribute(&quot;height&quot;, height);
    fontDraw.setAttribute(&quot;width&quot;, width);

    var ctx = fontDraw.getContext('2d');
    // black is default
    ctx.fillRect(0, 0, width, height);
    ctx.textBaseline = 'top';
    ctx.fillStyle = 'white';
    ctx.font = font;
    ctx.fillText(text/*'Eg'*/, 0, 0);

    var pixels = ctx.getImageData(0, 0, width, height).data;

    // row numbers where we first find letter end where it ends 
    var start = -1;
    var end = -1;

    for (var row = 0; row &amp;lt; height; row++) {
        for (var column = 0; column &amp;lt; width; column++) {

            var index = (row * width + column) * 4;

            // if pixel is not white (background color)
            if (pixels[index] == 0) {
                // we havent met white (font color) pixel
                // on the row and the letters was detected
                if (column == width - 1 &amp;amp;&amp;amp; start != -1) {
                    end = row;
                    row = height;
                    break;
                }
                continue;
            }
            else {
                // we find top of letter
                if (start == -1) {
                    start = row;
                }
                // ..letters body
                break;
            }

        }

    }
   /*
    document.body.appendChild(fontDraw);
    fontDraw.style.pixelLeft = 400;
    fontDraw.style.pixelTop = 400;
    fontDraw.style.position = &quot;absolute&quot;;
   */

    return end - start;

}
&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;Daniel의 대답에 덧붙여보자면, (멋져요! 그리고 확실히 맞아요!) JQuery가 없는 버전:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;function objOff(obj)
{
    var currleft = currtop = 0;
    if( obj.offsetParent )
    { do { currleft += obj.offsetLeft; currtop += obj.offsetTop; }
      while( obj = obj.offsetParent ); }
    else { currleft += obj.offsetLeft; currtop += obj.offsetTop; }
    return [currleft,currtop];
}
function FontMetric(fontName,fontSize) 
{
    var text = document.createElement(&quot;span&quot;);
    text.style.fontFamily = fontName;
    text.style.fontSize = fontSize + &quot;px&quot;;
    text.innerHTML = &quot;ABCjgq|&quot;; 
    // if you will use some weird fonts, like handwriting or symbols, then you need to edit this test string for chars that will have most extreme accend/descend values

    var block = document.createElement(&quot;div&quot;);
    block.style.display = &quot;inline-block&quot;;
    block.style.width = &quot;1px&quot;;
    block.style.height = &quot;0px&quot;;

    var div = document.createElement(&quot;div&quot;);
    div.appendChild(text);
    div.appendChild(block);

    // this test div must be visible otherwise offsetLeft/offsetTop will return 0
    // but still let's try to avoid any potential glitches in various browsers
    // by making it's height 0px, and overflow hidden
    div.style.height = &quot;0px&quot;;
    div.style.overflow = &quot;hidden&quot;;

    // I tried without adding it to body - won't work. So we gotta do this one.
    document.body.appendChild(div);

    block.style.verticalAlign = &quot;baseline&quot;;
    var bp = objOff(block);
    var tp = objOff(text);
    var taccent = bp[1] - tp[1];
    block.style.verticalAlign = &quot;bottom&quot;;
    bp = objOff(block);
    tp = objOff(text);
    var theight = bp[1] - tp[1];
    var tdescent = theight - taccent;

    // now take it off :-)
    document.body.removeChild(div);

    // return text accent, descent and total height
    return [taccent,theight,tdescent];
}
&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;방금 위의 코드를 테스트해봤는데 맥의 최신 크롬, FF, 사파리에서 잘 작동합니다.&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;strong papago-id=&quot;43-0&quot;&gt;편집:&lt;/strong&gt; 폰트 크기도 추가했고 시스템 폰트 대신 웹 폰트로 테스트했습니다. 잘 작동합니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;44&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;여기에 정답이 없다는 것에 좀 충격을 받았습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;견적이나 추측을 할 필요가 없습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;또한 글꼴 크기는 글꼴의 경계 상자의 실제 크기가 아닙니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;글꼴 높이는 오름차순과 내림차순이 있는지 여부에 따라 달라집니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;14&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;계산하려면 를 사용합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ctx.measureText()&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;actualBoundingBoxAscent&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;16&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;actualBoundingBoxDescent&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;font*&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;18&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;요소 높이와 같은 것을 계산하는 데 사용되는 크기를 얻기 위한 버전이지만 실제로 사용된 글꼴 공간의 높이는 정확히 아닙니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;/p&gt;
&lt;div class=&quot;snippet&quot; data-lang=&quot;js&quot; data-hide=&quot;false&quot; data-console=&quot;true&quot; data-babel=&quot;false&quot;&gt; 
 &lt;div class=&quot;snippet-code&quot;&gt; 
  &lt;pre class=&quot;snippet-code-js lang-js prettyprint-override&quot;&gt;&lt;code&gt;const text = 'Hello World';
const canvas = document.querySelector('canvas');
canvas.width = 500;
canvas.height = 200;

const ctx = canvas.getContext('2d');
const fontSize = 100;

ctx.font = `${fontSize}px Arial, Helvetica, sans-serif`;
// top is critical to the fillText() calculation
// you can use other positions, but you need to adjust the calculation
ctx.textBaseline = 'top';
ctx.textAlign = 'center';

const metrics = ctx.measureText(text);
const width = metrics.width;
const actualHeight = metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent;
// fallback to using fontSize if fontBoundingBoxAscent isn't available, like in Firefox. Should be close enough that you aren't more than a pixel off in most cases.
const fontHeight = (metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent) ?? fontSize;

ctx.fillStyle = '#00F'; // blue
ctx.fillRect((canvas.width / 2) - (width / 2), (canvas.height / 2) - (fontHeight / 2), width, fontHeight);

ctx.fillStyle = '#0F0'; // green
ctx.fillRect((canvas.width / 2) - (width / 2), (canvas.height / 2) - (actualHeight / 2), width, actualHeight);

// canvas.height / 2 - actualHeight / 2 gets you to the top of
// the green box. You have to add actualBoundingBoxAscent to shift
//  it just right
ctx.fillStyle = '#F00'; // red
ctx.fillText(text, canvas.width / 2, canvas.height / 2 - actualHeight / 2 + metrics.actualBoundingBoxAscent);&lt;/code&gt;&lt;/pre&gt; 
  &lt;pre class=&quot;snippet-code-html lang-html prettyprint-override&quot;&gt;&lt;code&gt;&amp;lt;canvas&amp;gt;&amp;lt;/canvas&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;50&quot; papago-translate=&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 height = parseInt(ctx.font) * 1.2; 
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;51&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;CSS &quot;선 높이: 정상&quot;은 1에서 1.2 사이입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;52&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;자세한 내용은 &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/line-height&quot; rel=&quot;noreferrer&quot; papago-id=&quot;52-1&quot;&gt;여기&lt;/a&gt;를 읽으십시오.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;53&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 제가 여기에 있는 다른 답변들을 바탕으로 한 것입니다.&lt;/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 measureText(text, font) {
	const span = document.createElement('span');
	span.appendChild(document.createTextNode(text));
	Object.assign(span.style, {
		font: font,
		margin: '0',
		padding: '0',
		border: '0',
		whiteSpace: 'nowrap'
	});
	document.body.appendChild(span);
	const {width, height} = span.getBoundingClientRect();
	span.remove();
	return {width, height};
}

var font = &quot;italic 100px Georgia&quot;;
var text = &quot;abc this is a test&quot;;
console.log(measureText(text, font));&lt;/code&gt;&lt;/pre&gt; 
 &lt;/div&gt; 
&lt;/div&gt; 
&lt;p&gt;&lt;/p&gt;&lt;p papago-id=&quot;54&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;터미널 에뮬레이터를 쓰고 있어서 캐릭터 주변에 직사각형을 그려야 했어요.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var size = 10
var lineHeight = 1.2 // CSS &quot;line-height: normal&quot; is between 1 and 1.2
context.font = size+'px/'+lineHeight+'em monospace'
width = context.measureText('m').width
height = size * lineHeight
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;55&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;분명히 캐릭터가 차지하는 정확한 공간을 원한다면 도움이 되지 않을 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;하지만 특정 용도에 대해서는 정확한 근사치를 제공할 것입니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;56&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;여기 간단한 기능이 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;라이브러리가 필요 없습니다.&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;textBaseline&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;alphabetic&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 class=&quot;papago-parent&quot;&gt;그리고 그것이 최고와 최저의 한계입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;상대적인 값으로 반환되므로 높이가 20px이고 기준선 아래에 아무것도 없으면 상한은&lt;/font&gt;&lt;/font&gt;&lt;code&gt;-20&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;61&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;문자를 입력해야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그렇지 않으면 당연히 높이와 너비가 0이 됩니다.&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;pre&gt;&lt;code&gt;alert(measureHeight('40px serif', 40, 'rg').height)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;63&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;기능은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;function measureHeight(aFont, aSize, aChars, aOptions={}) {
    // if you do pass aOptions.ctx, keep in mind that the ctx properties will be changed and not set back. so you should have a devoted canvas for this
    // if you dont pass in a width to aOptions, it will return it to you in the return object
    // the returned width is Math.ceil'ed
    console.error('aChars: &quot;' + aChars + '&quot;');
    var defaultOptions = {
        width: undefined, // if you specify a width then i wont have to use measureText to get the width
        canAndCtx: undefined, // set it to object {can:,ctx:} // if not provided, i will make one
        range: 3
    };

    aOptions.range = aOptions.range || 3; // multiples the aSize by this much

    if (aChars === '') {
        // no characters, so obviously everything is 0
        return {
            relativeBot: 0,
            relativeTop: 0,
            height: 0,
            width: 0
        };
        // otherwise i will get IndexSizeError: Index or size is negative or greater than the allowed amount error somewhere below
    }

    // validateOptionsObj(aOptions, defaultOptions); // not needed because all defaults are undefined

    var can;
    var ctx; 
    if (!aOptions.canAndCtx) {
        can = document.createElement('canvas');;
        can.mozOpaque = 'true'; // improved performanceo on firefox i guess
        ctx = can.getContext('2d');

        // can.style.position = 'absolute';
        // can.style.zIndex = 10000;
        // can.style.left = 0;
        // can.style.top = 0;
        // document.body.appendChild(can);
    } else {
        can = aOptions.canAndCtx.can;
        ctx = aOptions.canAndCtx.ctx;
    }

    var w = aOptions.width;
    if (!w) {
        ctx.textBaseline = 'alphabetic';
        ctx.textAlign = 'left'; 
        ctx.font = aFont;
        w = ctx.measureText(aChars).width;
    }

    w = Math.ceil(w); // needed as i use w in the calc for the loop, it needs to be a whole number

    // must set width/height, as it wont paint outside of the bounds
    can.width = w;
    can.height = aSize * aOptions.range;

    ctx.font = aFont; // need to set the .font again, because after changing width/height it makes it forget for some reason
    ctx.textBaseline = 'alphabetic';
    ctx.textAlign = 'left'; 

    ctx.fillStyle = 'white';

    console.log('w:', w);

    var avgOfRange = (aOptions.range + 1) / 2;
    var yBaseline = Math.ceil(aSize * avgOfRange);
    console.log('yBaseline:', yBaseline);

    ctx.fillText(aChars, 0, yBaseline);

    var yEnd = aSize * aOptions.range;

    var data = ctx.getImageData(0, 0, w, yEnd).data;
    // console.log('data:', data)

    var botBound = -1;
    var topBound = -1;

    // measureHeightY:
    for (y=0; y&amp;lt;=yEnd; y++) {
        for (var x = 0; x &amp;lt; w; x += 1) {
            var n = 4 * (w * y + x);
            var r = data[n];
            var g = data[n + 1];
            var b = data[n + 2];
            // var a = data[n + 3];

            if (r+g+b &amp;gt; 0) { // non black px found
                if (topBound == -1) { 
                    topBound = y;
                }
                botBound = y; // break measureHeightY; // dont break measureHeightY ever, keep going, we till yEnd. so we get proper height for strings like &quot;`.&quot; or &quot;:&quot; or &quot;!&quot;
                break;
            }
        }
    }

    return {
        relativeBot: botBound - yBaseline, // relative to baseline of 0 // bottom most row having non-black
        relativeTop: topBound - yBaseline, // relative to baseline of 0 // top most row having non-black
        height: (botBound - topBound) + 1,
        width: w// EDIT: comma has been added to fix old broken code.
    };
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;code&gt;relativeBot&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;relativeTop&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;24&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;,그리고.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;height&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;25&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;반환 대상에 있는 유용한 것들입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;67&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용 예시는 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;/p&gt;
&lt;div class=&quot;snippet&quot; data-lang=&quot;js&quot; data-hide=&quot;false&quot; data-console=&quot;false&quot; data-babel=&quot;false&quot;&gt; 
 &lt;div class=&quot;snippet-code&quot;&gt; 
  &lt;pre class=&quot;snippet-code-html lang-html prettyprint-override&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;title&amp;gt;Page Title&amp;lt;/title&amp;gt;
&amp;lt;script&amp;gt;
function measureHeight(aFont, aSize, aChars, aOptions={}) {
	// if you do pass aOptions.ctx, keep in mind that the ctx properties will be changed and not set back. so you should have a devoted canvas for this
	// if you dont pass in a width to aOptions, it will return it to you in the return object
	// the returned width is Math.ceil'ed
	console.error('aChars: &quot;' + aChars + '&quot;');
	var defaultOptions = {
		width: undefined, // if you specify a width then i wont have to use measureText to get the width
		canAndCtx: undefined, // set it to object {can:,ctx:} // if not provided, i will make one
		range: 3
	};
	
	aOptions.range = aOptions.range || 3; // multiples the aSize by this much
	
	if (aChars === '') {
		// no characters, so obviously everything is 0
		return {
			relativeBot: 0,
			relativeTop: 0,
			height: 0,
			width: 0
		};
		// otherwise i will get IndexSizeError: Index or size is negative or greater than the allowed amount error somewhere below
	}
	
	// validateOptionsObj(aOptions, defaultOptions); // not needed because all defaults are undefined
	
	var can;
	var ctx; 
	if (!aOptions.canAndCtx) {
		can = document.createElement('canvas');;
		can.mozOpaque = 'true'; // improved performanceo on firefox i guess
		ctx = can.getContext('2d');
		
		// can.style.position = 'absolute';
		// can.style.zIndex = 10000;
		// can.style.left = 0;
		// can.style.top = 0;
		// document.body.appendChild(can);
	} else {
		can = aOptions.canAndCtx.can;
		ctx = aOptions.canAndCtx.ctx;
	}
	
	var w = aOptions.width;
	if (!w) {
		ctx.textBaseline = 'alphabetic';
		ctx.textAlign = 'left';	
		ctx.font = aFont;
		w = ctx.measureText(aChars).width;
	}
	
	w = Math.ceil(w); // needed as i use w in the calc for the loop, it needs to be a whole number
	
	// must set width/height, as it wont paint outside of the bounds
	can.width = w;
	can.height = aSize * aOptions.range;
	
	ctx.font = aFont; // need to set the .font again, because after changing width/height it makes it forget for some reason
	ctx.textBaseline = 'alphabetic';
	ctx.textAlign = 'left';	
	
	ctx.fillStyle = 'white';
	
	console.log('w:', w);
	
	var avgOfRange = (aOptions.range + 1) / 2;
	var yBaseline = Math.ceil(aSize * avgOfRange);
	console.log('yBaseline:', yBaseline);
	
	ctx.fillText(aChars, 0, yBaseline);
	
	var yEnd = aSize * aOptions.range;
	
	var data = ctx.getImageData(0, 0, w, yEnd).data;
	// console.log('data:', data)
	
	var botBound = -1;
	var topBound = -1;
	
	// measureHeightY:
	for (y=0; y&amp;lt;=yEnd; y++) {
		for (var x = 0; x &amp;lt; w; x += 1) {
			var n = 4 * (w * y + x);
			var r = data[n];
			var g = data[n + 1];
			var b = data[n + 2];
			// var a = data[n + 3];
			
			if (r+g+b &amp;gt; 0) { // non black px found
				if (topBound == -1) { 
					topBound = y;
				}
				botBound = y; // break measureHeightY; // dont break measureHeightY ever, keep going, we till yEnd. so we get proper height for strings like &quot;`.&quot; or &quot;:&quot; or &quot;!&quot;
				break;
			}
		}
	}
	
	return {
		relativeBot: botBound - yBaseline, // relative to baseline of 0 // bottom most row having non-black
		relativeTop: topBound - yBaseline, // relative to baseline of 0 // top most row having non-black
		height: (botBound - topBound) + 1,
		width: w
	};
}

&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body style=&quot;background-color:steelblue;&quot;&amp;gt;
&amp;lt;input type=&quot;button&quot; value=&quot;reuse can&quot; onClick=&quot;alert(measureHeight('40px serif', 40, 'rg', {canAndCtx:{can:document.getElementById('can'), ctx:document.getElementById('can').getContext('2d')}}).height)&quot;&amp;gt;
&amp;lt;input type=&quot;button&quot; value=&quot;dont reuse can&quot; onClick=&quot;alert(measureHeight('40px serif', 40, 'rg').height)&quot;&amp;gt;
&amp;lt;canvas id=&quot;can&quot;&amp;gt;&amp;lt;/canvas&amp;gt;
&amp;lt;h1&amp;gt;This is a Heading&amp;lt;/h1&amp;gt;
&amp;lt;p&amp;gt;This is a paragraph.&amp;lt;/p&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt; 
 &lt;/div&gt; 
&lt;/div&gt; 
&lt;p&gt;&lt;/p&gt; 
&lt;p&gt;&lt;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;relativeBot&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;relativeTop&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&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API/Tutorial/Drawing_text&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;71&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API/Tutorial/Drawing_text&lt;/font&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;img src=&quot;https://www.whatwg.org/specs/web-apps/current-work/images/baselines.png&quot; alt=&quot;&quot;&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;HTML 캔버스를 이용하여 텍스트의 정확한 높이와 폭을 측정할 수 있는 멋진 라이브러리를 구현하였습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이렇게 하면 당신이 원하는 대로 될 겁니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://github.com/ChrisBellew/text-measurer.js&quot; rel=&quot;nofollow&quot; papago-id=&quot;73&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;https://github.com/ChrisBellew/text-measurer.js&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;p papago-id=&quot;74&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;TextMetrics의 너비만 있고 높이는 없다는 것이 재미있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#textmetrics&quot; rel=&quot;nofollow&quot; papago-id=&quot;75&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#textmetrics&lt;/font&gt;&lt;/a&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;이 예와 같이 Span을 사용할 수 있습니까?&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;http://mudcu.be/journal/2011/01/html5-typographic-metrics/#alignFix&quot; rel=&quot;nofollow&quot; papago-id=&quot;77&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;http://mudcu.be/journal/2011/01/html5-typographic-metrics/ #alignFix&lt;/font&gt;&lt;/a&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;상자 텍스트 내의 텍스트만 표시합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;값이 높으면 자신만의 정의가 필요합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;미리 설정된 높이가 클수록 표시 및 가로채기가 필요한 텍스트의 높이가 증가합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://i.stack.imgur.com/9kMcX.png&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;79&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;효과처리 후(해결)&lt;/font&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://i.stack.imgur.com/HWar4.png&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;80&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;효과처리전(미해결)&lt;/font&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;  AutoWrappedText.auto_wrap = function(ctx, text, maxWidth, maxHeight) {
var words = text.split(&quot;&quot;);
var lines = [];
var currentLine = words[0];

var total_height = 0;
for (var i = 1; i &amp;lt; words.length; i++) {
    var word = words[i];
    var width = ctx.measureText(currentLine + word).width;
    if (width &amp;lt; maxWidth) {
        currentLine += word;
    } else {
        lines.push(currentLine);
        currentLine = word;
        // TODO dynamically get font size
        total_height += 25;

        if (total_height &amp;gt;= maxHeight) {
          break
        }
    }
}
if (total_height + 25 &amp;lt; maxHeight) {
  lines.push(currentLine);
} else {
  lines[lines.length - 1] += &quot;…&quot;;
}
return lines;};
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;81&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;81-1&quot;&gt;저는 JUST FOR&lt;/strong&gt; ARIAL이 경계 상자의 높이를 찾는 가장 간단하고 빠르고 정확한 방법은 특정 글자의 너비를 사용하는 것임을 발견했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용자가 다른 글꼴을 선택하지 않고 특정 글꼴을 사용할 계획이라면 해당 글꼴에 적합한 문자를 찾기 위해 약간의 조사를 수행할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;/p&gt;
&lt;div class=&quot;snippet&quot; data-lang=&quot;js&quot; data-hide=&quot;false&quot; data-console=&quot;true&quot; data-babel=&quot;false&quot;&gt; 
 &lt;div class=&quot;snippet-code&quot;&gt; 
  &lt;pre class=&quot;snippet-code-html lang-html prettyprint-override&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;body&amp;gt;

&amp;lt;canvas id=&quot;myCanvas&quot; width=&quot;700&quot; height=&quot;200&quot; style=&quot;border:1px solid #d3d3d3;&quot;&amp;gt;
Your browser does not support the HTML5 canvas tag.&amp;lt;/canvas&amp;gt;

&amp;lt;script&amp;gt;
var c = document.getElementById(&quot;myCanvas&quot;);
var ctx = c.getContext(&quot;2d&quot;);
ctx.font = &quot;100px Arial&quot;;
var txt = &quot;Hello guys!&quot;
var Hsup=ctx.measureText(&quot;H&quot;).width;
var Hbox=ctx.measureText(&quot;W&quot;).width;
var W=ctx.measureText(txt).width;
var W2=ctx.measureText(txt.substr(0, 9)).width;

ctx.fillText(txt, 10, 100);
ctx.rect(10,100, W, -Hsup);
ctx.rect(10,100+Hbox-Hsup, W2, -Hbox);
ctx.stroke();
&amp;lt;/script&amp;gt;

&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Note:&amp;lt;/strong&amp;gt; The canvas tag is not supported in Internet 
Explorer 8 and earlier versions.&amp;lt;/p&amp;gt;

&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt; 
 &lt;/div&gt; 
&lt;/div&gt; 
&lt;p&gt;&lt;/p&gt;&lt;p papago-id=&quot;82&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;글꼴 크기를 설정하는 것이 실용적이지 않을 수도 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;83&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;ctx.font = ''&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;84&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;는 CSS에 의해 정의된 것과 내장된 글꼴 태그를 사용할 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;CSS 글꼴을 사용할 경우 측정을 사용하여 프로그래밍 방식으로 높이가 얼마인지 알 수 없습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;문자 방식, 매우 근시안적입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 다른 참고로 IE8은 너비와 높이를 반환하지 않습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;85&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 1) 멀티라인 텍스트에 대해서도 2) 그리고 IE9에서도 작동합니다!&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;div class=&quot;measureText&quot; id=&quot;measureText&quot;&amp;gt;
&amp;lt;/div&amp;gt;


.measureText {
  margin: 0;
  padding: 0;
  border: 0;
  font-family: Arial;
  position: fixed;
  visibility: hidden;
  height: auto;
  width: auto;
  white-space: pre-wrap;
  line-height: 100%;
}

function getTextFieldMeasure(fontSize, value) {
    const div = document.getElementById(&quot;measureText&quot;);

    // returns wrong result for multiline text with last line empty
    let arr = value.split('\n');
    if (arr[arr.length-1].length == 0) {
        value += '.';
    }

    div.innerText = value;
    div.style['font-size']= fontSize + &quot;px&quot;;
    let rect = div.getBoundingClientRect();

    return {width: rect.width, height: rect.height};
};
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;86&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것이 오래된 질문이라는 것을 알고 있지만, 나중에 참고할 수 있도록 JS 전용(jquery가 없는) 짧은 솔루션을 추가하고자 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var measureTextHeight = function(fontFamily, fontSize) 
{
    var text = document.createElement('span');
    text.style.fontFamily = fontFamily;
    text.style.fontSize = fontSize + &quot;px&quot;;
    text.textContent = &quot;abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 &quot;;
    document.body.appendChild(text);
    var result = text.getBoundingClientRect().height;
    document.body.removeChild(text);
    return result;
};
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;87&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;프로젝트 중 하나에서 실제 텍스트 높이를 포함하도록 CanvasRenderingContext2D.measureText()를 몽키 패치했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;바닐라 JS로 쓰여 있고 의존성이 없습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;/*
 * Monkeypatch CanvasRenderingContext2D.measureText() to include actual height of the text
 */
; (function (global) {
  &quot;use strict&quot;;

  var _measureText = global.CanvasRenderingContext2D.prototype.measureText;

  global.CanvasRenderingContext2D.prototype.measureText = function () {
    var textMetrics = _measureText.apply(this, arguments);

    var _getHeight = function (text) {
      var $span = global.document.createElement(&quot;span&quot;);
      var spanTextNode = global.document.createTextNode(text);
      $span.appendChild(spanTextNode);
      $span.setAttribute(&quot;style&quot;, `font: ${this.font}`);

      var $div = global.document.createElement(&quot;div&quot;);
      $div.setAttribute(&quot;style&quot;, &quot;display: inline-block; width: 1px; height: 0; vertical-align: super;&quot;);

      var $parentDiv = global.document.createElement(&quot;div&quot;);
      $parentDiv.appendChild($span);
      $parentDiv.appendChild($div);

      var $body = global.document.getElementsByTagName(&quot;body&quot;)[0];
      $body.appendChild($parentDiv);

      var divRect = $div.getBoundingClientRect();
      var spanRect = $span.getBoundingClientRect();
      var result = {};

      $div.style.verticalAlign = &quot;baseline&quot;;
      result.ascent = divRect.top - spanRect.top;

      $div.style.verticalAlign = &quot;bottom&quot;;
      result.height = divRect.top - spanRect.top;

      result.descent = result.height - result.ascent;

      $body.removeChild($parentDiv);

      return result.height - result.descent;
    }.bind(this);

    var height = _getHeight(arguments[0]);

    global.Object.defineProperty(textMetrics, &quot;height&quot;, { value: height });

    return textMetrics;
  };

})(window);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;88&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이렇게 쓰시면 됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;ctx.font = &quot;bold 64px Verdana, sans-serif&quot;; // Automatically considers it as part of height calculation
var textMetrics = ctx.measureText(&quot;Foobar&quot;);
var textHeight = textMetrics.height;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;parseInt(ctx.font, 10)&lt;/code&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;89&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;예.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;let text_height = parseInt(ctx.font, 10)&lt;/code&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;90&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;예:반품35&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;91&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;정상적인 상황에서는 다음이 작동해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var can = CanvasElement.getContext('2d');          //get context
var lineHeight = /[0-9]+(?=pt|px)/.exec(can.font); //get height from font variable
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;92&quot; papago-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;context.font = &quot;22px arial&quot;;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;93&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 높이를 22 px로 설정할 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;94&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;유일한 이유는..&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;context.measureText(string).width
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;95&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;문자열의 너비는 원하는 문자열을 알지 못하는 한 글꼴로 그려진 모든 문자열에 대해 결정할 수 없기 때문입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;키는 22 px 입니다.&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;만약 당신이 px가 아닌 다른 측정을 사용한다면, 높이는 여전히 같겠지만, 그 측정을 사용하면 당신은 기껏해야 측정을 변환하기만 하면 될 것입니다.&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;/p&gt; 
&lt;pre&gt;&lt;code&gt;var c = document.getElementById(&quot;myCanvas&quot;);
var ctx = c.getContext(&quot;2d&quot;);
ctx.font = &quot;100px Arial&quot;;
var txt = &quot;Hello guys!&quot;
var wt = ctx.measureText(txt).width;
var height = wt / txt.length;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;98&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 단일 글꼴로 정확한 결과가 될 것입니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;99&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/1134586/how-can-you-find-the-height-of-text-on-an-html-canvas&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>JavaScript</category>
      <author>powerit</author>
      <guid isPermaLink="true">https://powerit.tistory.com/1397</guid>
      <comments>https://powerit.tistory.com/1397#entry1397comment</comments>
      <pubDate>Mon, 30 Oct 2023 21:20:48 +0900</pubDate>
    </item>
    <item>
      <title>Postgre와 동등한 오라클SQL INSERT...돌아오는 *;</title>
      <link>https://powerit.tistory.com/1396</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Postgre와 동등한 오라클&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;SQL INSERT...&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;돌아오는 *;&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Oracle에서 Postgre로 많은 DML(INSERT/UPDATE/DEETE) 쿼리를 변환했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;SQL과 이제 동일한 행 집합을 생성하는지 확인해야 합니다. 즉, Oracle 및 postgresql 데이터베이스에 처음에 동일한 데이터가 포함되어 있다고 가정하고 동일한 행을 삭제하고 동일한 행을 업데이트하는 경우 등입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;포스트그레에&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;SQL 측면, DML 문과 함께 리턴 조항을 사용할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;INSERT INTO test(id, name) VALUES(42, 'foo') RETURNING *;
&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;위 문장의 좋은 점은 구조나 실행되는 테이블의 이름조차 모른 채 모든 DML 문장에 'returning *'라는 행을 붙이고 선택 문장처럼 모든 행을 얻을 수 있다는 것입니다.&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;설명서에 따르면 오라클 8i(제가 작업하고 있는 제품)는 RETURNING 절을 지원하지만, 결과를 변수로 저장해야 하고, 수동으로 열 이름을 지정하는 대신 모든 결과 열을 얻을 수 있는 명확한 방법이 없는 것 같습니다.&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;따라서 문제는 Postgre를 에뮬레이션할 오라클 문(또는 문 시퀀스)이 있는지 여부입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;하드코딩 테이블 또는 열 이름이 없는 SQL 'returning *'.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;즉, 다음과 같은 Oracle 함수를 작성할 수 있는 방법이 있습니까?&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;fn('INSERT INTO test(id, name) VALUES(42, ''foo'')') 
&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;SQL 문에 의해 삽입(또는 일반적인 경우 수정)된 행 집합을 반환해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;업데이트: 실제로 매우 &lt;a href=&quot;https://stackoverflow.com/questions/1074843/is-there-an-oracle-equivalent-to-sql-servers-output-inserted&quot; papago-id=&quot;6-1&quot;&gt;유사한 질문&lt;/a&gt;을 찾았습니다(Postgre가 아닌 SQL 서버에서 변환하기 위한 질문).&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;SQL, Oracle)로 이동합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그래도 가능하다면 좀 더 간단한 대답을 듣고 싶습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://docs.oracle.com/cd/B19306_01/appdev.102/b14261/executeimmediate_statement.htm#i33888&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;7-1&quot;&gt;,&lt;/a&gt; , , , 를 포함하는 해결책을 상상할 수 있었지만, 분명 단순하지 않을 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 이전에 임의 유형의 레코드를 사용해야 하는 문제에 대해 &lt;a href=&quot;https://stackoverflow.com/questions/6265160/to-char-of-an-oracle-pl-sql-table-type#6268606&quot; papago-id=&quot;7-5&quot;&gt;XML과 관련된 이&lt;/a&gt;와 같은 해결책을 발견했습니다&lt;a href=&quot;https://stackoverflow.com/questions/6265160/to-char-of-an-oracle-pl-sql-table-type#6268606&quot; papago-id=&quot;7-5&quot;&gt;.&lt;/a&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그들은 아주 별난 놈들입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;두 개의 개별 쿼리를 실행해야 할 것 같습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;특히 Oracle 8i의 경우 대부분의 기능을 활용하지 못할 것으로 예상됩니다.&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;간단히 말해서, Postgres만큼 강력한 SQL Construct는 없다고 생각합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;... RETURNING&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;Oracle의 절입니다.&lt;/font&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;특히 8i와 같은 이전 버전의 오라클에서는 현재는 불가능합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;비슷한 질문에 대한 이 &lt;a href=&quot;https://stackoverflow.com/a/2890709/64921&quot; papago-id=&quot;10-1&quot;&gt;답변&lt;/a&gt;을 참조하십시오.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/8820789/oracle-equivalent-of-postgresql-insert-returning&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>Oracle</category>
      <author>powerit</author>
      <guid isPermaLink="true">https://powerit.tistory.com/1396</guid>
      <comments>https://powerit.tistory.com/1396#entry1396comment</comments>
      <pubDate>Mon, 30 Oct 2023 21:20:26 +0900</pubDate>
    </item>
    <item>
      <title>서브쿼리의 출력을 조절할 수 있습니까?</title>
      <link>https://powerit.tistory.com/1395</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;서브쿼리의 출력을 조절할 수 있습니까?&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;값을 반환하는 쿼리가 있지만 쉼표로 구분된 단일 출력으로 필요합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그래서 쉼표로 출력을 조절하려고 했는데 작동이 안 되나요?&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;select id from videos where duration=0;  /// this would return some rows
&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;나는 concat과 concat_ws를 시도했지만 작동하지 않았습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;select concat(select concat(id,',') from videos where duration=0);
select concat((select id from videos where duration=0),',');
select concat_ws(',',(select id from videos where duration=0));
&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;쉼표 부분이 있는 모든 행의 ID가 필요합니다.&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;예를 들어 출력은 1,4,6,78,565이어야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;무슨 생각 있어요?&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat&quot; rel=&quot;noreferrer&quot; papago-id=&quot;7-1&quot;&gt;group_concat&lt;/a&gt;이 수행하는 작업입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;select group_concat(id) as video_list
from videos 
where duration=0
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;0&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용해보기&lt;/font&gt;&lt;/font&gt;&lt;code&gt;GROUP_CONCAT&lt;/code&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;     GROUP_CONCAT([DISTINCT] expr [,expr ...]
         [ORDER BY {unsigned_integer | col_name | expr}
             [ASC | DESC] [,col_name ...]]
         [SEPARATOR str_val])
&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;참조 : http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat&quot; rel=&quot;noreferrer&quot; papago-id=&quot;10-1&quot;&gt;group_concat&lt;/a&gt; 사용:&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 함수는 그룹에서 연결된 NULL이 아닌 값이 포함된 문자열 결과를 반환합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;NULL이 아닌 값이 없으면 NULL을 반환합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;pre&gt;&lt;code&gt;SELECT
  GROUP_CONCAT(id)
FROM
  videos
WHERE
  duration=0
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용할 수 없는 문제를 해결하기 위해 노력하는 것.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;LIMIT&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;GROUP_CONCAT&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;하위 쿼리의 결과를 기준으로 그룹화할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 쿼리는 비디오 ID를 20개 그룹으로 나눕니다(일부 데이터셋에서는 매우 느릴 수 있음).&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;select group_concat(v.id) as video_list
from videos as v
where v.duration=0
group by (
    select floor(count(v2.id)/20)
    from videos as v2
    where v2.duration=0
    and v2.id &amp;lt;= v.id
)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또는 결과가 많지만 이렇게 느린 쿼리를 원하지 않는 경우 사용자 크기로 늘릴 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;group_concat_max_len&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;17&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_group_concat_max_len) 당신의 것까지.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;max_allowed_packet&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;18&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_max_allowed_packet), 이 길이가 여전히 충분하지 않다면 max_allowed_packet 크기도 늘려야 합니다.&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;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/3812864/concat-the-output-of-the-subquery&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>MYSQL</category>
      <author>powerit</author>
      <guid isPermaLink="true">https://powerit.tistory.com/1395</guid>
      <comments>https://powerit.tistory.com/1395#entry1395comment</comments>
      <pubDate>Mon, 30 Oct 2023 21:20:20 +0900</pubDate>
    </item>
    <item>
      <title>jQuery UI 슬라이더(프로그래밍 방식으로 설정)</title>
      <link>https://powerit.tistory.com/1394</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;jQuery UI 슬라이더(프로그래밍 방식으로 설정)&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&gt;&lt;code&gt;$(&quot;#slider&quot;).slider(&quot;option&quot;, &quot;values&quot;, [50,80]);
&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;$(&quot;#slider&quot;).trigger('change');
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;역시 도움이 되지 않습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;값 AND 슬라이더 위치를 수정하는 다른/더 나은 방법이 있습니까?&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;변경하려는 현재 범위의 값이면 .slider() 메서드를 사용해야 하지만 구문이 사용한 것과 약간 다릅니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$(&quot;#slider&quot;).slider('value',50);
&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;$(&quot;#slider&quot;).slider('values',0,50); // sets first handle (index 0) to 50
$(&quot;#slider&quot;).slider('values',1,80); // sets second handle (index 1) to 80
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;변경하려는 범위라면 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$(&quot;#slider&quot;).slider('option',{min: 0, max: 500});
&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;UI Slider에서 슬라이드 이벤트를 완벽하게 트리거합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;hs=$('#height_slider').slider();
hs.slider('option', 'value',h);
hs.slider('option','slide')
       .call(hs,null,{ handle: $('.ui-slider-handle', hs), value: h });
&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;hs.slider('option', 'value',h);&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;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;여기서 주의할 점은&lt;/font&gt;&lt;/font&gt;&lt;code&gt;h&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;html을 사용하는 경우 인덱스/위치(값이 아님)&lt;/font&gt;&lt;/font&gt;&lt;code&gt;select&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;위의 어떤 답변도 저에게 도움이 되지 않았습니다. 아마도 이전 버전의 프레임워크를 기반으로 했을 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;16&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;기본 컨트롤의 값을 설정한 다음 아래와 같이 새로 고침 방법을 호출하면 됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$(&quot;#slider&quot;).val(50);
$(&quot;#slider&quot;).slider(&quot;refresh&quot;);
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Mal의 대답은 나에게 유일하게 통했습니다 (아마도 jquery).&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;UI가 변경되었습니다), 범위를 다루는 변형은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$( &quot;#slider-range&quot; ).slider('values',0,lowerValue);
$( &quot;#slider-range&quot; ).slider('values',1,upperValue);
$( &quot;#slider-range&quot; ).slider(&quot;refresh&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;p papago-id=&quot;19&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;input type=&quot;text&quot; id=&quot;amount&quot;&amp;gt;
&amp;lt;input type=&quot;text&quot; id=&quot;amount2&quot;&amp;gt;
&amp;lt;div id=&quot;slider-range&quot;&amp;gt;&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;20&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;js:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;    $( &quot;#slider-range&quot; ).slider({
    range: true,
    min: 0,
    max: 217,
    values: [ 0, 217 ],
    slide: function( event, ui ) {
        $( &quot;#amount&quot; ).val( ui.values[ 0 ] );
        $( &quot;#amount2&quot; ).val( ui.values[ 1 ] );
    }
    });

$(&quot;#amount&quot;).change(function() {
    $(&quot;#slider-range&quot;).slider('values',0,$(this).val());
});
$(&quot;#amount2&quot;).change(function() {
    $(&quot;#slider-range&quot;).slider('values',1,$(this).val());
});
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;a href=&quot;https://jsfiddle.net/brhuman/uvx6pdc1/1/&quot; rel=&quot;nofollow&quot; papago-id=&quot;21&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;https://jsfiddle.net/brhuman/uvx6pdc1/1/&lt;/font&gt;&lt;/a&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;@gaurav 솔루션의 한 부분은 여러 개의 슬라이더가 있는 jQuery 2.1.3과 JQuery UI 1.10.2에서 작동했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;제 프로젝트는 이 &lt;a href=&quot;https://github.com/jiren/filter.js&quot; rel=&quot;nofollow&quot; papago-id=&quot;22-1&quot;&gt;filter.js 플러그인&lt;/a&gt;으로 4개의 레인지 슬라이더를 사용하여 데이터를 필터링하는 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;다른 솔루션들은 슬라이더 핸들을 시작 끝점으로 다시 정상적으로 재설정하고 있었지만 filter.js가 이해한 이벤트를 실행하지는 않은 것으로 보입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;슬라이더를 통과하는 방법은 이렇습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$(&quot;yourSliderSelection&quot;).each (function () {
    var hs = $(this); 
    var options = $(this).slider('option');

    //reset the ui
    $(this).slider( 'values', [ options.min, options.max ] ); 

    //refresh/trigger event so that filter.js can reset handling the data
    hs.slider('option', 'slide').call(
        hs, 
        null, 
        {
            handle: $('.ui-slider-handle', hs),
            values: [options.min, options.max]
        }
    );

});
&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;hs.slider()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;코드는 데이터를 재설정하지만 내 시나리오의 UI는 재설정하지 않습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것이 다른 사람들에게 도움이 되길 바랍니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;25&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음과 같은 이벤트를 수동으로 트리거할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p 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;var s = $('#slider').slider();
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;27&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;...&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;28&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;슬라이더 값 설정&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;s.slider('value',10);
&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;슬라이드 이벤트 트리거, ui 개체 전달&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;s.trigger('slide',{ ui: $('.ui-slider-handle', s), value: 10 });
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;30&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;입력 박스 뿐만 아니라 슬라이더도 업데이트하고 싶었습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 팔로우가 일을 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;a.slider('value',1520);
$(&quot;#labelAID&quot;).val(1520);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;어디에&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;a&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;는 목적어는 다음과 같습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt; var a= $( &quot;&amp;lt;div id='slider' style='width:200px;margin-left:20px;'&amp;gt;&amp;lt;/div&amp;gt;&quot; ).insertAfter( &quot;#labelAID&quot; ).slider({
            min: 0,
            max: 2000,
            range: &quot;min&quot;,
            value: 111,
            slide: function( event, ui ) {

                $(&quot;#labelAID&quot;).val(ui.value    );
            }
        });

        $( &quot;#labelAID&quot; ).keyup(function() {
            a.slider( &quot;value&quot;,$( &quot;#labelAID&quot; ).val()  );
        });
&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;제 경우에는 핸들이 2개인 jquery slider만 작동했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$('#Slider').slider('option',{values: [0.15, 0.6]});
&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;슬라이더 값 설정&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;  $('#slider-width').slider('values', 0, range[ 0 ]);
  $('#slider-width').slider('values', 1, range[ 1 ]);
  setSliderHandles('width', range[ 0 ], range[ 1 ]);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;36&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;핸들을 제자리로 이동&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;  function setSliderHandles(type, min, max){
    $('#slider-' + type + ' span.ui-slider-handle:eq(0) .price-range-min').html(min + '&quot;');
    $('#slider-' + type + ' span.ui-slider-handle:eq(1) .price-range-max').html(max + '&quot;');
    $('#slider-' + type + ' span.price-range-both').html('&amp;lt;i&amp;gt;' + min + '&quot; - &amp;lt;/i&amp;gt;' + max + '&quot;');
    
    if ( min == max ) {
      $('#slider-' + type + ' span.price-range-both i').css('display', 'none');
      $('#single_' + type).val(min);
    } else {
      $('#slider-' + type + ' span.price-range-both i').css('display', 'inline');
      $('#single_' + type).val('');
    }

    if (collision($('#slider-' + type + ' span.price-range-min'), $('#slider-' + type + ' span.price-range-max')) == true) {
        $('#slider-' + type + ' span.price-range-min, #slider-' + type + ' span.price-range-max').css('opacity', '0');  
        $('#slider-' + type + ' span.price-range-both').css('display', 'block');        
    } else {
        $('#slider-' + type + ' span.price-range-min, #slider-' + type + ' span.price-range-max').css('opacity', '1');  
        $('#slider-' + type + ' span.price-range-both').css('display', 'none');     
    }        
  }

function collision($div1, $div2) {
    var x1 = $div1.offset().left;
    var w1 = 40;
    var r1 = x1 + w1;
    var x2 = $div2.offset().left;
    var w2 = 40;
    var r2 = x2 + w2;
      
    if (r1 &amp;lt; x2 || x1 &amp;gt; r2) return false;
    return true;
}
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;37&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;시작 또는 새로 고침 시 값 = 0 (기본값) http 요청에서 값을 가져오는 방법&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt; &amp;lt;script&amp;gt;
       $(function() {
         $( &quot;#slider-vertical&quot; ).slider({
    animate: 5000,
    orientation: &quot;vertical&quot;,
    range: &quot;max&quot;,
    min: 0,
    max: 100,
    value: function( event, ui ) {
        $( &quot;#amount&quot; ).val( ui.value );

  //  build a URL using the value from the slider
  var geturl = &quot;http://192.168.0.101/position&quot;;

  //  make an AJAX call to the Arduino
  $.get(geturl, function(data) {

  });
  },
    slide: function( event, ui ) {
        $( &quot;#amount&quot; ).val( ui.value );

  //  build a URL using the value from the slider
  var resturl = &quot;http://192.168.0.101/set?points=&quot; + ui.value;

  //  make an AJAX call to the Arduino
  $.get(resturl, function(data) {
  });
  }
  });

$( &quot;#amount&quot; ).val( $( &quot;#slider-vertical&quot; ).slider( &quot;value&quot; ) );

});
   &amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;38&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;마지막으로 저는 아래와 같습니다.&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;$(&quot;#priceSlider&quot;).&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;slider('옵션', {min:5, max:20, value:[6,19]}); $(&quot;#priceSlider&quot;).&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;슬라이더 (&quot;refresh&quot;);&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;40&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;작업 버전은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var newVal = 10;
var slider = $('#slider');        
var s = $(slider);
$(slider).val(newVal);
$(slider).slider('refresh');
&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;URL : https://stackoverflow.com/questions/2833396/jquery-ui-slider-setting-programmatically&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>jquery</category>
      <author>powerit</author>
      <guid isPermaLink="true">https://powerit.tistory.com/1394</guid>
      <comments>https://powerit.tistory.com/1394#entry1394comment</comments>
      <pubDate>Mon, 30 Oct 2023 21:20:13 +0900</pubDate>
    </item>
    <item>
      <title>연결 테스트를 위한 범용 SELECT 쿼리</title>
      <link>https://powerit.tistory.com/1393</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;연결 테스트를 위한 범용 SELECT 쿼리&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;당사의 애플리케이션은 MySQL, MS SQL Server 및 Oracle DB와 함께 작동합니다.&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;우리의 C3P0 구성은&lt;/font&gt;&lt;/font&gt;&lt;code&gt;preferredTestQuery&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;여기 우리의 Spring 구성이 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;b:bean id=&quot;phoenixDataSource&quot; 
               class=&quot;com.mchange.v2.c3p0.ComboPooledDataSource&quot;
               destroy-method=&quot;close&quot;&amp;gt;

            &amp;lt;b:property name=&quot;driverClass&quot; value=&quot;${database.driver}&quot;/&amp;gt;
            &amp;lt;b:property name=&quot;jdbcUrl&quot; value=&quot;${database.connectionURL}&quot;/&amp;gt;
            &amp;lt;b:property name=&quot;user&quot; value=&quot;${database.user}&quot;/&amp;gt;
            &amp;lt;b:property name=&quot;password&quot; value=&quot;${database.password}&quot;/&amp;gt;

            &amp;lt;b:property name=&quot;initialPoolSize&quot;&amp;gt;&amp;lt;b:value&amp;gt;${database.initialPoolSize:10}&amp;lt;/b:value&amp;gt;&amp;lt;/b:property&amp;gt;
            &amp;lt;b:property name=&quot;minPoolSize&quot;&amp;gt;&amp;lt;b:value&amp;gt;${database.minPoolSize:1}&amp;lt;/b:value&amp;gt;&amp;lt;/b:property&amp;gt;
            &amp;lt;b:property name=&quot;maxPoolSize&quot;&amp;gt;&amp;lt;b:value&amp;gt;${database.maxPoolSize:25}&amp;lt;/b:value&amp;gt;&amp;lt;/b:property&amp;gt;
            &amp;lt;b:property name=&quot;acquireRetryAttempts&quot;&amp;gt;&amp;lt;b:value&amp;gt;${database.acquireRetryAttempts:10}&amp;lt;/b:value&amp;gt;&amp;lt;/b:property&amp;gt;
            &amp;lt;b:property name=&quot;acquireIncrement&quot;&amp;gt;&amp;lt;b:value&amp;gt;${database.acquireIncrement:5}&amp;lt;/b:value&amp;gt;&amp;lt;/b:property&amp;gt;
            &amp;lt;b:property name=&quot;idleConnectionTestPeriod&quot;&amp;gt;&amp;lt;b:value&amp;gt;${database.idleConnectionTestPeriod:60}&amp;lt;/b:value&amp;gt;&amp;lt;/b:property&amp;gt;
            &amp;lt;b:property name=&quot;maxIdleTime&quot;&amp;gt;&amp;lt;b:value&amp;gt;${database.maxIdleTime:10800}&amp;lt;/b:value&amp;gt;&amp;lt;/b:property&amp;gt;
            &amp;lt;b:property name=&quot;maxConnectionAge&quot;&amp;gt;&amp;lt;b:value&amp;gt;${database.maxConnectionAge:14400}&amp;lt;/b:value&amp;gt;&amp;lt;/b:property&amp;gt;
            &amp;lt;b:property name=&quot;preferredTestQuery&quot;&amp;gt;&amp;lt;b:value&amp;gt;${database.preferredTestQuery:SELECT 1}&amp;lt;/b:value&amp;gt;&amp;lt;/b:property&amp;gt;
            &amp;lt;b:property name=&quot;testConnectionOnCheckin&quot;&amp;gt;&amp;lt;b:value&amp;gt;${database.testConnectionOnCheckin:false}&amp;lt;/b:value&amp;gt;&amp;lt;/b:property&amp;gt;
            &amp;lt;b:property name=&quot;testConnectionOnCheckout&quot;&amp;gt;&amp;lt;b:value&amp;gt;${database.testConnectionOnCheckout:false}&amp;lt;/b:value&amp;gt;&amp;lt;/b:property&amp;gt;

        &amp;lt;/b:bean&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;code&gt;SELECT 1&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;는 Oracle에 대해 유효한 쿼리가 아니지만,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;SELECT 1 FROM DUAL&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;를 생성하지 않는 한 SQL Server에 대해 유효한 쿼리가 아닙니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;DUAL&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;물건.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;매우 간단한 질문: 연결을 테스트하기 위해 모든 플랫폼에서 보편적으로 사용할 수 있는 SELECT 또는 &lt;strong papago-id=&quot;7-1&quot;&gt;무해&lt;/strong&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;Oracle 설치를 위해 속성 파일의 TestQuery를 선호했지만 실행 가능한 범용 솔루션이 있는지 여전히 궁금합니다.&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;[편집] 커넥티비티 체크는 내 코드와 독립적으로 C3P0에서 이루어집니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;쿼리가 실패하면(디버그 로깅이 활성화된 경우) 로그에 오류를 기록합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;제가 알기로는 해당 쿼리를 사용하는 코드는 없습니다. 시설이 연결 설정 여부를 자체적으로 확인하기 때문에 C3P0 구성의 일부입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러면 저는 다른 일을 할 수 없습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;현재 오라클 설치에 대한 쿼리를 구성만으로 재정의할 수 있었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그런데 코드를 통해 방언 구현을 테스트할 수 &lt;strong papago-id=&quot;10-1&quot;&gt;있다고&lt;/strong&gt; 해도 &quot;연결성을 테스트하기 위해 범용 쿼리를 실행할 수 있습니까? 아니면 DBMS에 특화된 무해한 쿼리를 실행해야 합니까?&quot;와 같은 질문이 반복될 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;blockquote&gt; 
 &lt;p papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;연결을 테스트하기 위해 모든 플랫폼에서 보편적으로 사용할 수 있는 무해한 쿼리?&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;12&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;12-1&quot;&gt;연결성&lt;/strong&gt;을 테스트하기 위해서?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;내 생각엔 너의&lt;/font&gt;&lt;/font&gt;&lt;code&gt;SELECT * FROM DUAL&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;연결을 테스트하기 위해 3개의 데이터베이스 모두가 괜찮을 것입니다. 인.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;SQL Server&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;strong papago-id=&quot;14-1&quot;&gt;오류&lt;/strong&gt;가 나타납니다. 잘못된 개체 이름 '&lt;strong papago-id=&quot;14-1&quot;&gt;dual'..&lt;/strong&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;14-3&quot;&gt;데이터베이스에 연결&lt;/strong&gt;되어 있음을 의미하며 테이블이 존재하지 않는다는 오류를 반환했습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;연결되어 있지 않으면 다른 오류가 발생하고 테이블에 대한 표준 오류 스택이 존재하지 않기 때문입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;16&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다행히 SQL Server에서 dual이라는 이름의 테이블이 생성되면 좋을 것 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;하지만 나는 궁금해요, 그것을 갖는 것이 얼마나 어려운지.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;IF-ELSE&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;19&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;백엔드에 여러 개의 데이터베이스 제품을 사용하는 대부분의 애플리케이션은 연결을 확인하기 위한 속성이 정의되어 있다고 생각합니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;20&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://docs.spring.io/spring/docs/current/spring-framework-reference/html/expressions.html&quot; rel=&quot;nofollow&quot; papago-id=&quot;20-1&quot;&gt;여기&lt;/a&gt;서 설명한 것처럼 Spring Configuration 파일에서 ternary 연산자를 시도하거나 DB 프로바이더를 기반으로 적절한 쿼리를 사용하여 테스트 DB에 논리를 적용하는 순수 Java 구성을 시도할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;21&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;희망이 당신을 도와줬습니다!&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;22&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/29818881/universal-select-query-for-testing-connectivity&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>Oracle</category>
      <author>powerit</author>
      <guid isPermaLink="true">https://powerit.tistory.com/1393</guid>
      <comments>https://powerit.tistory.com/1393#entry1393comment</comments>
      <pubDate>Mon, 30 Oct 2023 21:20:04 +0900</pubDate>
    </item>
    <item>
      <title>xsd:include와 xsd:import의 차이점은 무엇입니까?</title>
      <link>https://powerit.tistory.com/1392</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;xsd:include와 xsd:import의 차이점은 무엇입니까?&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;xsd:include&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;xsd:import&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;? 다른 것 대신에 언제 쓰실 건가요, 언제 쓰셔도 상관없나요?&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사이의 근본적인 차이점은&lt;/font&gt;&lt;/font&gt;&lt;code&gt;include&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;import&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;import&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다른 &lt;em papago-id=&quot;7-1&quot;&gt;대상&lt;/em&gt; 네임스페이스에 있는 선언 또는 정의를 참조하려면 다음을 사용해야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;include&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;em papago-id=&quot;8-1&quot;&gt;동일&lt;/em&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;출처 : https://web.archive.org/web/20070804031046/http ://xsd.stylusstudio.com/2002Jun/post08016.htm&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;a href=&quot;http://www.w3.org/TR/xmlschema-1/#compound-schema&quot; papago-id=&quot;10-1-0&quot;&gt;xsd: include&lt;/a&gt;&lt;/strong&gt;를 사용하여 네임스페이스가 &lt;strong papago-id=&quot;10-3&quot;&gt;&lt;em papago-id=&quot;10-3-0&quot;&gt;동일&lt;/em&gt;&lt;/strong&gt;하거나 없는 XSD를 가져옵니다.&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-1&quot;&gt;&lt;a href=&quot;http://www.w3.org/TR/xmlschema-1/#composition-schemaImport&quot; papago-id=&quot;11-1-0&quot;&gt;xsd:import&lt;/a&gt;&lt;/strong&gt;를 사용하여 &lt;strong papago-id=&quot;11-3&quot;&gt;&lt;em papago-id=&quot;11-3-0&quot;&gt;다른&lt;/em&gt;&lt;/strong&gt; 네임스페이스에서 XSD를 가져옵니다.&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;@namespace&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;속성 및/또는 schemaLocation을 지정합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;@schemaLocation&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;15&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나, 의도된 include 스키마의 URI를 참조하여 가져오기만 허용합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;@schemaLocation&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;16&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;attribute, &lt;strong papago-id=&quot;16-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;13&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용할 수 있는 기능.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;@namespace&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;14&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;속성은 intra 간 네임스페이스 가져오기와는 분명히 다른 점입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;19&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를 들어, xml 스키마 유효성 검사자는 &lt;em papago-id=&quot;19-1&quot;&gt;네임스페이스별&lt;/em&gt;로 모든 스키마의 위치를 이미 알고 있을 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;스키마 URL 위치별로 XML 네임스페이스를 참조하는 것은 다른 시스템에서 문제가 될 수 있다는 점을 고려할 때 특히 그렇습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;classpath://&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;16&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;아무 의미가 없거나, 어디에&lt;/font&gt;&lt;/font&gt;&lt;code&gt;http://&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;17&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;허용되지 않거나 URL이 다른 시스템과 동일한 것을 가리키지 않는 경우.)&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;22&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;유효한 가져오기 및 잘못된 가져오기의 코드 샘플에는 다음이 포함됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;23&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;xsd:import namespace=&quot;some/name/space&quot;/&amp;gt;
&amp;lt;xsd:import schemaLocation=&quot;classpath://mine.xsd&quot;/&amp;gt;

&amp;lt;xsd:include schemaLocation=&quot;classpath://mine.xsd&quot;/&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;24&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;올바르지 않음:&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;xsd:include namespace=&quot;some/name/space&quot;/&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;18&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저도 이것에 관심이 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;내가 찾은 유일한 설명은&lt;/font&gt;&lt;/font&gt;&lt;code&gt;xsd:include&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;19&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;namespace 내 포함에 사용됩니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;xsd:import&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;20&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;namespace 간 포함을 위한 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;28&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/ms256480(v=vs.110).aspx#sectionSection3&quot; papago-id=&quot;28-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;MSDN&lt;/a&gt;에서 직접 인용 : &lt;a href=&quot;https://msdn.microsoft.com/en-us/library/ms256480(v=vs.110).aspx#sectionSection3&quot; papago-id=&quot;28-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;&amp;lt;xsd:import&amp;gt; 요소, 비고 섹션&lt;/a&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p papago-id=&quot;29&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;29-1&quot;&gt;include&lt;/strong&gt; 요소와 &lt;strong papago-id=&quot;29-3&quot;&gt;가져오기&lt;/strong&gt; 요소의 차이점은 &lt;strong papago-id=&quot;29-5&quot;&gt;가져오기&lt;/strong&gt; 요소가 대상 네임스페이스가 서로 다른 스키마 문서의 스키마 구성 요소에 대한 참조를 허용하고 &lt;strong papago-id=&quot;29-7&quot;&gt;include&lt;/strong&gt; 요소는 대상 네임스페이스가 동일하거나 지정된 대상 네임스페이스가 없는 다른 스키마 문서의 스키마 구성 요소를 포함하는 항목에 추가한다는 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;도식의&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;간단히 말해, &lt;strong papago-id=&quot;29-9&quot;&gt;가져오기&lt;/strong&gt; 요소를 사용하면 모든 스키마의 스키마 구성 요소를 사용할 수 있고, &lt;strong papago-id=&quot;29-11&quot;&gt;포함&lt;/strong&gt; 요소를 사용하면 포함된 스키마의 모든 구성 요소를 포함하는 스키마에 추가할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt; &lt;/p&gt;&lt;p papago-id=&quot;30&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Use xsd:include는 외부 스키마 문서의 모든 선언과 정의를 현재 스키마로 가져옵니다.&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;xsd:import를 사용하여 다른 네임스페이스에서 XSD를 가져오며 기존 스키마 문서를 확장하여 새 스키마를 구축하는 데 사용됩니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;32&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/2357943/whats-the-difference-between-xsdinclude-and-xsdimport&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>XML</category>
      <author>powerit</author>
      <guid isPermaLink="true">https://powerit.tistory.com/1392</guid>
      <comments>https://powerit.tistory.com/1392#entry1392comment</comments>
      <pubDate>Mon, 30 Oct 2023 21:19:57 +0900</pubDate>
    </item>
    <item>
      <title>(마우스 오버/아웃 설정 없이) 호버가 있는지 확인하는 순수한 자바스크립트</title>
      <link>https://powerit.tistory.com/1391</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(마우스 오버/아웃 설정 없이) 호버가 있는지 확인하는 순수한 자바스크립트&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 다음과 같은 jQuery 구문을 본 적이 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;if($(element).is(':hover')) { do something}
&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;저는 jQuery를 사용하지 않기 때문에 순수 자바스크립트로 이것을 할 수 있는 가장 좋은 방법을 찾고 있습니다.&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;mouseover&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;mouseout&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;, 대신 DOM을 통해 원소의 고유 특성을 검사할 수 있는 방법이 없을까요?&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;if(element.style.className.hovered === true) {do something}
&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;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;단순하게 사용&lt;/font&gt;&lt;/font&gt;&lt;code&gt;element.matches(':hover')&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;제게 잘 맞는 것 같습니다. 오래된 브라우저에도 포괄적인 폴리필을 사용할 수 있습니다. https://developer.mozilla.org/en-US/docs/Web/API/Element/matches&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;9-3&quot;&gt;querySelector&lt;/strong&gt; for &lt;strong papago-id=&quot;9-3&quot;&gt;IE&amp;gt;&lt;/strong&gt;=&lt;strong papago-id=&quot;9-3&quot;&gt;8&lt;/strong&gt;:&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;/p&gt;
&lt;div class=&quot;snippet&quot; data-lang=&quot;js&quot; data-hide=&quot;false&quot; data-console=&quot;true&quot; data-babel=&quot;false&quot;&gt; 
 &lt;div class=&quot;snippet-code&quot;&gt; 
  &lt;pre class=&quot;snippet-code-js lang-js prettyprint-override&quot;&gt;&lt;code&gt;const isHover = e =&amp;gt; e.parentElement.querySelector(':hover') === e;    

const myDiv = document.getElementById('mydiv');
document.addEventListener('mousemove', function checkHover() {
  const hovered = isHover(myDiv);
  if (hovered !== checkHover.hovered) {
    console.log(hovered ? 'hovered' : 'not hovered');
    checkHover.hovered = hovered;
  }
});&lt;/code&gt;&lt;/pre&gt; 
  &lt;pre class=&quot;snippet-code-css lang-css prettyprint-override&quot;&gt;&lt;code&gt;.whyToCheckMe {position: absolute;left: 100px;top: 50px;}&lt;/code&gt;&lt;/pre&gt; 
  &lt;pre class=&quot;snippet-code-html lang-html prettyprint-override&quot;&gt;&lt;code&gt;&amp;lt;div id=&quot;mydiv&quot;&amp;gt;HoverMe
  &amp;lt;div class=&quot;whyToCheckMe&quot;&amp;gt;Do I need to be checked too?&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/code&gt;&lt;/pre&gt; 
 &lt;/div&gt; 
&lt;/div&gt; 
&lt;p&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;뒤로 물러나는 것은 괜찮다고 생각합니다 @Kolink 답변.&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;(function() {
    var matchfunc = null, prefixes = [&quot;&quot;,&quot;ms&quot;,&quot;moz&quot;,&quot;webkit&quot;,&quot;o&quot;], i, m;
    for(i=0; i&amp;lt;prefixes.length; i++) {
        m = prefixes[i]+(prefixes[i] ? &quot;Matches&quot; : &quot;matches&quot;);
        if( document.documentElement[m]) {matchfunc = m; break;}
        m += &quot;Selector&quot;;
        if( document.documentElement[m]) {matchfunc = m; break;}
    }
    if( matchfunc) window.isHover = function(elem) {return elem[matchfunc](&quot;:hover&quot;);};
    else {
        window.onmouseover = function(e) {
            e = e || window.event;
            var t = e.srcElement || e.target;
            while(t) {
                t.hovering = true;
                t = t.parentNode;
            }
        };
        window.onmouseout = function(e) {
            e = e || window.event;
            var t = e.srcElement || e.target;
            while(t) {
                t.hovering = false;
                t = t.parentNode;
            }
        };
        window.isHover = function(elem) {return elem.hovering;};
   }
})();
&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;요소가 덮여 있는지 확인하는 한 가지 방법은 CSS에서 사용되지 않는 속성을 설정하는 것이라는 생각이 들었습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;:hover&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;13&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;javascript에 해당 속성이 있는지 확인합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;돔 native 호버 속성을 사용하지 않기 때문에 문제에 대한 적절한 해결책은 아니지만, 제가 생각할 수 있는 가장 가깝고 최소의 해결책입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;html&amp;gt;
    &amp;lt;head&amp;gt;
        &amp;lt;style type=&quot;text/css&quot;&amp;gt;
#hover_el
{   
    border: 0px solid blue;
    height: 100px;
    width: 100px;
    background-color: blue;
}   
#hover_el:hover
{   
    border: 0px dashed blue;
}
        &amp;lt;/style&amp;gt;
        &amp;lt;script type='text/javascript'&amp;gt;
window.onload = function() {check_for_hover()};
function check_for_hover() {
    var hover_element = document.getElementById('hover_el');
    var hover_status = (getStyle(hover_element, 'border-style') === 'dashed') ? true : false;
    document.getElementById('display').innerHTML = 'you are' + (hover_status ? '' : ' not') + ' hovering';
    setTimeout(check_for_hover, 1000);
};
function getStyle(oElm, strCssRule) {
    var strValue = &quot;&quot;;
    if(document.defaultView &amp;amp;&amp;amp; document.defaultView.getComputedStyle) {
        strValue = document.defaultView.getComputedStyle(oElm, &quot;&quot;).getPropertyValue(strCssRule);
    }
    else if(oElm.currentStyle) {
        strCssRule = strCssRule.replace(/\-(\w)/g, function (strMatch, p1) {
            return p1.toUpperCase();
        });
        strValue = oElm.currentStyle[strCssRule];
    }
    return strValue;
};
        &amp;lt;/script&amp;gt;
    &amp;lt;/head&amp;gt;
    &amp;lt;body&amp;gt;
        &amp;lt;div id='hover_el'&amp;gt;hover here&amp;lt;/div&amp;gt;
        &amp;lt;div id='display'&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;14&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(함수)&lt;/font&gt;&lt;/font&gt;&lt;code&gt;getStyle&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/4172871/javascript-get-styles&quot; papago-id=&quot;8-1&quot;&gt;JavaScript get Styles&lt;/a&gt;) 덕분에&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;16&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;깃발로 사용하기에 더 나은 CSS 속성을 생각할 수 있는 사람이 있다면,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;solid/dashed&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;17&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저에게 알려주세요. 가급적이면 그 부동산은 거의 사용되지 않고 상속받을 수 없는 것이 좋을 것 같습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;편집: CSS 변수는 아마도 이를 확인하는 데 사용하는 것이 더 나을 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;예.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;/p&gt;
&lt;div class=&quot;snippet&quot; data-lang=&quot;js&quot; data-hide=&quot;false&quot; data-console=&quot;true&quot; data-babel=&quot;false&quot;&gt; 
 &lt;div class=&quot;snippet-code&quot;&gt; 
  &lt;pre class=&quot;snippet-code-js lang-js prettyprint-override&quot;&gt;&lt;code&gt;const fps = 60;

setInterval(function() {
  if(getComputedStyle(document.getElementById('my-div')).getPropertyValue('--hovered') == 1) {
    document.getElementById('result').innerHTML = 'Yes';
  } else {
    document.getElementById('result').innerHTML = 'No';
  };
}, 1000 / fps);&lt;/code&gt;&lt;/pre&gt; 
  &lt;pre class=&quot;snippet-code-css lang-css prettyprint-override&quot;&gt;&lt;code&gt;#my-div {
  --hovered:0;
  color: black;
}

#my-div:hover {
  --hovered:1;
  color: red;
}&lt;/code&gt;&lt;/pre&gt; 
  &lt;pre class=&quot;snippet-code-html lang-html prettyprint-override&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
  &amp;lt;head&amp;gt;
    &amp;lt;title&amp;gt;Detect if div is hovered with JS, using CSS variables&amp;lt;/title&amp;gt;
  &amp;lt;/head&amp;gt;
  &amp;lt;body&amp;gt;
    &amp;lt;div id=&quot;my-div&quot;&amp;gt;Am I hovered?&amp;lt;/div&amp;gt;
    &amp;lt;div id=&quot;result&quot;&amp;gt;&amp;lt;/div&amp;gt;
  &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt; 
 &lt;/div&gt; 
&lt;/div&gt; 
&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;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;if&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;querySelector&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;21&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;. 선택기 끝에 &quot;:hover&quot;를 추가하면 요소가 호버 중인 경우에만 요소가 반환됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;즉, null을 반환하는지 여부를 테스트할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그것은 마치.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;element.matches(&quot;:hover)&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;다음은 예입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;if (document.querySelector(&quot;body &amp;gt; p:hover&quot;) != null) {
    console.log(&quot;hovered&quot;);
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;24&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 코드를 간격에 두고 호버링할 때마다 코드를 실행할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;setInterval(() =&amp;gt; {
    if (document.querySelector(&quot;body &amp;gt; p:hover&quot;) != null) {
        console.log(&quot;hovered&quot;);
    }
}, 10);
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;var mytext = document.getElementById(&quot;myId&quot;);
if(myval.matches(&quot;:hover&quot;)) {
    //has hover
} else {
   //no hover
}
&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;if(myval.parentNode.matches(&quot;:hover&quot;) { }을(를) 사용할 수도 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;26&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/14795099/pure-javascript-to-check-if-something-has-hover-without-setting-on-mouseover-ou&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>jquery</category>
      <author>powerit</author>
      <guid isPermaLink="true">https://powerit.tistory.com/1391</guid>
      <comments>https://powerit.tistory.com/1391#entry1391comment</comments>
      <pubDate>Mon, 30 Oct 2023 21:19:50 +0900</pubDate>
    </item>
    <item>
      <title>C에서 EOF 검출</title>
      <link>https://powerit.tistory.com/1390</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;C에서 EOF 검출&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;EOF가 발생할 때까지 사용자의 입력을 받기 위해 아래의 C 코드를 사용하고 있습니다만, 문제는 이 코드가 작동하지 않는다는 것입니다, 첫 번째 입력을 받은 후에 종료됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 코드에 무슨 문제가 있습니까?&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;float input;
 
printf(&quot;Input No: &quot;);
scanf(&quot;%f&quot;, &amp;amp;input);
    
while(!EOF)
{
    printf(&quot;Output: %f&quot;, input);
    printf(&quot;Input No: &quot;);
    scanf(&quot;%f&quot;, &amp;amp;input);
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;EOF&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;0&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;는 값(일반적으로 -1)을 가진 매크로일 뿐입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;당신은 어떤 것을 시험해 봐야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;EOF&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;, 예를 들면 A의 결과와 같은&lt;/font&gt;&lt;/font&gt;&lt;code&gt;getchar()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;불러.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;스트림의 끝을 테스트하는 한 가지 방법은&lt;/font&gt;&lt;/font&gt;&lt;code&gt;feof&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;if (feof(stdin))
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;'스트림 종료' 상태는 읽기 실패 &lt;strong papago-id=&quot;7-1&quot;&gt;후&lt;/strong&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;예제에서는 scanf의 반환 값을 확인해야 할 것이며, 이 값이 필드를 읽지 않았음을 나타내는 경우 파일의 끝을 확인해야 합니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;code&gt;EOF&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;는 C의 상수입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;EOF에 대한 실제 파일을 확인하고 있지 않습니다.&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;while(!feof(stdin))
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;10&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://www.cplusplus.com/reference/clibrary/cstdio/feof/&quot; papago-id=&quot;10-1&quot; rel=&quot;noreferrer&quot;&gt;여기&lt;/a&gt;에 제공해야 할 문서가 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://www.cplusplus.com/reference/clibrary/cstdio/scanf/&quot; papago-id=&quot;10-3&quot; rel=&quot;noreferrer&quot;&gt;scanf&lt;/a&gt;의 return 값도 확인할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;성공적으로 변환된 항목 수를 반환합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;EOF&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&gt;&lt;code&gt;scanf(&quot;%f&quot;, &amp;amp;input);&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;뿐. 사용자가 &quot;pi&quot;와 같이 C 부동소수점 숫자로 해석할 수 없는 것을 입력하는 경우,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;scanf()&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;input&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;이는 &quot;pi&quot;를 계속 읽으려고 시도하고 실패한다는 것을 의미합니다.&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;while(!feof(stdin))&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;13&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;만약 당신이 &quot;pi&quot;를 입력한다면, 그 이전의 가치를 출력하는 끝없는 루프가 있을 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;input&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;14&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;프롬프트를 출력하지만 프로그램은 새로운 입력을 처리하지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;scanf()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;15&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;지정한 입력 변수에 대한 할당 수를 반환합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;만약 할당하지 않았다면 부동 소수점 번호를 찾지 못했다는 뜻이고, 다음과 같은 내용으로 더 많은 입력을 읽어봐야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;char string[100];scanf(&quot;%99s&quot;, string);&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;16&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;. 이렇게 하면 입력 스트림에서 다음 문자열이 제거됩니다(어쨌든 최대 99자 - 추가).&lt;/font&gt;&lt;/font&gt;&lt;code&gt;char&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;17&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;는 문자열의 null 터미네이터를 위한 것입니다).&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;18&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;내가 싫어하는 이유들이 생각나는군요&lt;/font&gt;&lt;/font&gt;&lt;code&gt;scanf()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;19&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;, 그리고 내가 왜 사용하는지는&lt;/font&gt;&lt;/font&gt;&lt;code&gt;fgets()&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;sscanf()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;21&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;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;while(!EOF)
&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;while(!feof(stdin))
&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;scanf()의 결과를 확인하여 변환이 성공적으로 이루어졌는지 확인하려고 합니다. 그렇지 않은 경우 세 가지 중 하나가 참입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li papago-id=&quot;29&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;scanf()가 %f 변환 지정자에 대해 유효하지 않은 문자(즉, 숫자, 점, 'e' 또는 'E'가 아닌 문자)에서 질식하고 있습니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;30&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;scanf()가 EOF를 검출했습니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;31&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;scanf ()에서 stdin을 읽을 때 오류가 감지되었습니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p papago-id=&quot;32&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;예:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;int moreData = 1;
...
printf(&quot;Input no: &quot;);
fflush(stdout);
/**
 * Loop while moreData is true
 */
while (moreData)
{
  errno = 0;
  int itemsRead = scanf(&quot;%f&quot;, &amp;amp;input);
  if (itemsRead == 1)
  {
    printf(&quot;Output: %f\n&quot;, input);
    printf(&quot;Input no: &quot;);
    fflush(stdout);
  }
  else
  {
    if (feof(stdin))
    {
      printf(&quot;Hit EOF on stdin; exiting\n&quot;);
      moreData = 0;
    }
    else if (ferror(stdin))
    {
      /**
       * I *think* scanf() sets errno; if not, replace
       * the line below with a regular printf() and
       * a generic &quot;read error&quot; message.
       */
      perror(&quot;error during read&quot;);
      moreData = 0;
    }
    else
    {
      printf(&quot;Bad character stuck in input stream; clearing to end of line\n&quot;);
      while (getchar() != '\n')
        ; /* empty loop */
      printf(&quot;Input no: &quot;);
      fflush(stdout);
    }
 }
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;while(scanf(&quot;%d %d&quot;,a,b)!=EOF)
{

//do .....
}
&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;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/1428911/detecting-eof-in-c&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>c</category>
      <author>powerit</author>
      <guid isPermaLink="true">https://powerit.tistory.com/1390</guid>
      <comments>https://powerit.tistory.com/1390#entry1390comment</comments>
      <pubDate>Mon, 30 Oct 2023 21:19:42 +0900</pubDate>
    </item>
    <item>
      <title>UpdatePanel의 ListView의 LinkButton으로 인해 전체 포스트백 발생</title>
      <link>https://powerit.tistory.com/1389</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;UpdatePanel의 ListView의 LinkButton으로 인해 전체 포스트백 발생&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;UpdatePanel의 ListView에 LinkButton이 있습니다.&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;asp:UpdatePanel ID=&quot;upOutcomes&quot; UpdateMode=&quot;Conditional&quot; runat=&quot;server&quot;&amp;gt;
  &amp;lt;ContentTemplate&amp;gt;
      &amp;lt;asp:ListView ID=&quot;lvTargets&quot; runat=&quot;server&quot; onitemdatabound=&quot;lvTargets_ItemDataBound&quot;&amp;gt;
        &amp;lt;ItemTemplate&amp;gt;
          &amp;lt;asp:LinkButton ID=&quot;lnkAddTarget&quot; CssClass=&quot;lo&quot; Text='&amp;lt;%# Eval(&quot;Title&quot;) + &quot; &amp;lt;b&amp;gt;&quot; + Eval(&quot;Level&quot;) + Eval(&quot;SubLevel&quot;) + &quot;&amp;lt;/b&amp;gt;&quot; %&amp;gt;' runat=&quot;server&quot;&amp;gt;&amp;lt;/asp:LinkButton&amp;gt;
        &amp;lt;/ItemTemplate&amp;gt;
      &amp;lt;/asp:ListView&amp;gt;
  &amp;lt;/ContentTemplate&amp;gt;
&amp;lt;/asp:UpdatePanel&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&gt;&lt;code&gt;protected void lvTargets_ItemDataBound(object sender, ListViewItemEventArgs e) {
  var lb = e.Item.FindControl(&quot;lnkAddTarget&quot;) as LinkButton;
  tsm.RegisterAsyncPostBackControl(lb);  // ToolkitScriptManager
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;별반 차이가 없어요&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;비슷한 글들도 몇 개 있지만 해결책을 찾을 수가 없네요!&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;무슨 생각 있어요?&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;고객.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;ASP에서 IDMode 설정.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;NET 4를 사용하면 ASP 방법을 지정할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;NET은 HTML 요소의 id 속성을 생성합니다.&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;이전 버전의 ASP에서.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;NET(즉, 4 이전), 기본 동작은 Auto와 동등했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;클라이언트의 ID 설정&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;6-1&quot;&gt;가능&lt;/em&gt;합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;http://www.asp.net/learn/whitepapers/aspnet4/breaking-changes&quot; rel=&quot;noreferrer&quot; papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Microsoft 기사 읽기&lt;/font&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;스크립트 관리자가 의 이전 버전에서 HTML 컨트롤이 생성될 것으로 예상하는 방식 때문에 이 경우 AutoId가 필요합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그물.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음을 설정하여 이 문제를 해결했습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ClientIDMode=&quot;AutoID&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;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;%@ Page Title=&quot;&quot; ClientIDMode=&quot;AutoID&quot; Language=&quot;C#&quot;%&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;/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;CommandName&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;CommandArgument&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;OnCommand&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;15&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음과 같이 링크 버튼에 이벤트 핸들러가 표시됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;asp:LinkButton CommandName='test' CommandArgument='&amp;lt;%# Eval(&quot;Title&quot;) %&amp;gt;' ID=&quot;lnkAddTarget&quot; runat=&quot;server&quot; OnCommand=&quot;LinkButtonCommandEventHandler&quot; /&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;16&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또는 - 추가&lt;/font&gt;&lt;/font&gt;&lt;code&gt;OnItemCommand&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;17&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;전체 ListView에 대한 핸들러입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;18&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음을 설정하여 이 문제를 해결했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;고객&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;IDMode=&quot;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;해당 페이지의 페이지 지시에 &quot;AutoID&quot;는 다음과 같이 표시됩니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&amp;lt;%@ Page Title=&quot;&quot; ClientIDMode=&quot;AutoID&quot; Language=&quot;C#&quot;%&amp;gt;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;19&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;, 따라서 전체 포스트백을 발생시키기 위해 ListView 내에 ASP 링크 버튼이 있는 이전 문제를 해결할 수 있습니다.&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;그러나 클라이언트 코드(Jquery, Javascript)에 대한 ASP 컨트롤을 브라우저 소스 코드에 표시되는 대로 전체 이름으로 참조해야 할 수도 있습니다(Firefox에서 Firebug를 사용하여 이름을 가져옵니다).&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를 들어, 이 Jquery 함수는&lt;/font&gt;&lt;/font&gt;&lt;code&gt;$(&quot;#ContentPlaceHolder1_btnCancelReferCustomer&quot;).click(function () { $(&quot;#divRefer&quot;).hide({ effect: &quot;slide&quot;, duration: 200 }); return false; });&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;21&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음으로 변경되었습니다(선택기에서 asp 버튼 이름 변경에 유의하십시오).&lt;/font&gt;&lt;/font&gt;&lt;code&gt;$(&quot;#ctl00_ContentPlaceHolder1_btnCancelReferCustomer&quot;).click(function () { $(&quot;#divRefer&quot;).hide({ effect: &quot;slide&quot;, duration: 200 }); return false; });&lt;/code&gt;&lt;/p&gt;&lt;p papago-id=&quot;22&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음을 설정하여 이 문제를 해결했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;고객&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;IDMode=&quot;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;해당 페이지의 페이지 지시문에 &quot;AutoID&quot;가 표시됩니다.&amp;lt;%@ 페이지 제목=&quot;&quot;&quot;클라이언트&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;IDMode=&quot;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;AutoID&quot; 언어=&quot;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;C#&quot;%&amp;gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;23&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/5652728/linkbutton-in-listview-in-updatepanel-causes-full-postback&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>ajax</category>
      <author>powerit</author>
      <guid isPermaLink="true">https://powerit.tistory.com/1389</guid>
      <comments>https://powerit.tistory.com/1389#entry1389comment</comments>
      <pubDate>Mon, 30 Oct 2023 21:19:34 +0900</pubDate>
    </item>
  </channel>
</rss>