<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>css3</title>
    <link>https://css3.tistory.com/</link>
    <description>각종 프로그래밍 정보를 다루는 블로그입니다.</description>
    <language>ko</language>
    <pubDate>Thu, 7 May 2026 09:22:42 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>css3</managingEditor>
    <item>
      <title>iframe에서 jquery를 사용하여 내용을 동적으로 변경하려면 어떻게 해야 합니까?</title>
      <link>https://css3.tistory.com/1170</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;iframe에서 jquery를 사용하여 내용을 동적으로 변경하려면 어떻게 해야 합니까?&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;iframe과 iframe 내용을 30초마다 변경하는 jquery code가 있는 사이트가 가능한지 궁금합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;내용이 다른 웹 페이지에 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이와 같은 것:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;html&amp;gt;
  &amp;lt;head&amp;gt;
    &amp;lt;script type=&quot;text/javascript&quot; src=&quot;jquery.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;script&amp;gt;
      $(document).ready(function(){
        var array = new array();
        array[0] = 'http://webPage1.com';
        array[1] = 'http://webPage2.com';
        // And so on.
        // Do something here to change the iframe every 30 second
      });
    &amp;lt;/script&amp;gt;
  &amp;lt;/head&amp;gt;
  &amp;lt;body&amp;gt;
    &amp;lt;iframe id=&quot;frame&quot;&amp;gt;&amp;lt;/iframe&amp;gt;
  &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;&amp;lt;html&amp;gt;
  &amp;lt;head&amp;gt;
    &amp;lt;script type=&quot;text/javascript&quot; src=&quot;jquery.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;script&amp;gt;
      $(document).ready(function(){
        var locations = [&quot;http://webPage1.com&quot;, &quot;http://webPage2.com&quot;];
        var len = locations.length;
        var iframe = $('#frame');
        var i = 0;
        setInterval(function () {
            iframe.attr('src', locations[++i % len]);
        }, 30000);
      });
    &amp;lt;/script&amp;gt;
  &amp;lt;/head&amp;gt;
  &amp;lt;body&amp;gt;
    &amp;lt;iframe id=&quot;frame&quot;&amp;gt;&amp;lt;/iframe&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;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;iframe 내부의 실제 컨텐츠가 아니라 iframe이 가리키는 위치만 변경하려면, 당신은 단지 iframe 내부의 실제 컨텐츠를 변경하기만 하면 됩니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;src&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;기여하다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt; $(&quot;#myiframe&quot;).attr(&quot;src&quot;, &quot;newwebpage.html&quot;);
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;var handle = setInterval(changeIframe, 30000);
var sites = [&quot;google.com&quot;, &quot;yahoo.com&quot;];
var index = 0;

function changeIframe() {
  $('#frame')[0].src = sites[index++];
  index = index &amp;gt;= sites.length ? 0 : index;
}
&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/1554396/how-do-i-dynamically-change-the-content-in-an-iframe-using-jquery&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>jQuery</category>
      <author>css3</author>
      <guid isPermaLink="true">https://css3.tistory.com/1170</guid>
      <comments>https://css3.tistory.com/1170#entry1170comment</comments>
      <pubDate>Mon, 6 Nov 2023 22:00:37 +0900</pubDate>
    </item>
    <item>
      <title>blueimp 파일 업로드 플러그인의 maxFileSize 및 acceptFileTypes가 작동하지 않습니다. 이유는 무엇입니까?</title>
      <link>https://css3.tistory.com/1169</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;blueimp 파일 업로드 플러그인의 maxFileSize 및 acceptFileTypes가 작동하지 않습니다. 이유는 무엇입니까?&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;업로드 파일에 Blueimp 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&gt;&lt;code&gt;maxFileSize&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;acceptFileTypes&lt;/code&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;$(document).ready(function () {
    'use strict';

    $('#fileupload').fileupload({
        dataType: 'json',
        autoUpload: false,
        acceptFileTypes: /(\.|\/)(gif|jpe?g|png)$/i,
        maxFileSize: 5000000,
        done: function (e, data) {
            $.each(data.result.files, function (index, file) {
                $('&amp;lt;p style=&quot;color: green;&quot;&amp;gt;' + file.name + '&amp;lt;i class=&quot;elusive-ok&quot; style=&quot;padding-left:10px;&quot;/&amp;gt; - Type: ' + file.type + ' - Size: ' + file.size + ' byte&amp;lt;/p&amp;gt;')
                    .appendTo('#div_files');
            });
        },
        fail: function (e, data) {
            $.each(data.messages, function (index, error) {
                $('&amp;lt;p style=&quot;color: red;&quot;&amp;gt;Upload file error: ' + error + '&amp;lt;i class=&quot;elusive-remove&quot; style=&quot;padding-left:10px;&quot;/&amp;gt;&amp;lt;/p&amp;gt;')
                    .appendTo('#div_files');
            });
        },
        progressall: function (e, data) {
            var progress = parseInt(data.loaded / data.total * 100, 10);

            $('#progress .bar').css('width', progress + '%');
        }
    });
});
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;같은 문제가 있었는데 블루임프 사람이 &quot;&lt;a href=&quot;https://github.com/blueimp/jQuery-File-Upload/issues/760&quot; rel=&quot;noreferrer&quot;&gt;maxFileSize &lt;/a&gt;및&lt;a href=&quot;https://github.com/blueimp/jQuery-File-Upload/issues/760&quot; rel=&quot;noreferrer&quot;&gt; acceptFileTypes는 UI 버전에서만 지원&lt;/a&gt;됩니다&quot;라고 말하며 _validate 및 _hasError 메서드를 통합할 수 있는 (중단된) 링크를 제공했습니다.&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;pre&gt;&lt;code&gt;add: function(e, data) {
        var uploadErrors = [];
        var acceptFileTypes = /^image\/(gif|jpe?g|png)$/i;
        if(data.originalFiles[0]['type'].length &amp;amp;&amp;amp; !acceptFileTypes.test(data.originalFiles[0]['type'])) {
            uploadErrors.push('Not an accepted file type');
        }
        if(data.originalFiles[0]['size'].length &amp;amp;&amp;amp; data.originalFiles[0]['size'] &amp;gt; 5000000) {
            uploadErrors.push('Filesize is too big');
        }
        if(uploadErrors.length &amp;gt; 0) {
            alert(uploadErrors.join(&quot;\n&quot;));
        } else {
            data.submit();
        }
},
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여기 코드에 나와 있는 .file 업로드 옵션을 시작할 때&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$(document).ready(function () {
    'use strict';

    $('#fileupload').fileupload({
        add: function(e, data) {
                var uploadErrors = [];
                var acceptFileTypes = /^image\/(gif|jpe?g|png)$/i;
                if(data.originalFiles[0]['type'].length &amp;amp;&amp;amp; !acceptFileTypes.test(data.originalFiles[0]['type'])) {
                    uploadErrors.push('Not an accepted file type');
                }
                if(data.originalFiles[0]['size'].length &amp;amp;&amp;amp; data.originalFiles[0]['size'] &amp;gt; 5000000) {
                    uploadErrors.push('Filesize is too big');
                }
                if(uploadErrors.length &amp;gt; 0) {
                    alert(uploadErrors.join(&quot;\n&quot;));
                } else {
                    data.submit();
                }
        },
        dataType: 'json',
        autoUpload: false,
        // acceptFileTypes: /(\.|\/)(gif|jpe?g|png)$/i,
        // maxFileSize: 5000000,
        done: function (e, data) {
            $.each(data.result.files, function (index, file) {
                $('&amp;lt;p style=&quot;color: green;&quot;&amp;gt;' + file.name + '&amp;lt;i class=&quot;elusive-ok&quot; style=&quot;padding-left:10px;&quot;/&amp;gt; - Type: ' + file.type + ' - Size: ' + file.size + ' byte&amp;lt;/p&amp;gt;')
                .appendTo('#div_files');
            });
        },
        fail: function (e, data) {
            $.each(data.messages, function (index, error) {
                $('&amp;lt;p style=&quot;color: red;&quot;&amp;gt;Upload file error: ' + error + '&amp;lt;i class=&quot;elusive-remove&quot; style=&quot;padding-left:10px;&quot;/&amp;gt;&amp;lt;/p&amp;gt;')
                .appendTo('#div_files');
            });
        },
        progressall: function (e, data) {
            var progress = parseInt(data.loaded / data.total * 100, 10);

            $('#progress .bar').css('width', progress + '%');
        }
    });
});
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;파일 크기 기능을 추가한 것은 UI 버전에서만 작동하기 때문입니다.&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;@lopside에서 제안한 과거 문제를 가져오기 위해 업데이트됨:&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;추가된&lt;/font&gt;&lt;/font&gt;&lt;code&gt;data.originalFiles[0]['type'].length&lt;/code&gt;&lt;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.originalFiles[0]['size'].length&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;a href=&quot;https://github.com/blueimp/jQuery-File-Upload/blob/master/js/jquery.fileupload-process.js&quot;&gt;작동&lt;/a&gt;하려면 jquery&lt;a href=&quot;https://github.com/blueimp/jQuery-File-Upload/blob/master/js/jquery.fileupload-process.js&quot;&gt;.fileupload-process.&lt;/a&gt;&lt;a href=&quot;https://github.com/blueimp/jQuery-File-Upload/blob/master/js/jquery.fileupload-validate.js&quot;&gt;js&lt;/a&gt;와 jquery&lt;a href=&quot;https://github.com/blueimp/jQuery-File-Upload/blob/master/js/jquery.fileupload-validate.js&quot;&gt;.fileupload-validate.js&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;jquery.fileupload-process.js&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고 나서.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;jquery.fileupload-validate.js&lt;/code&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;fileuploadadd&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://github.com/blueimp/jQuery-File-Upload/issues/760#issuecomment-35675651&quot;&gt;다음과 같이&lt;/a&gt; 제안했습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여기를 보세요: https://github.com/blueimp/jQuery-File-Upload/wiki/Options#wiki-callback-options&lt;/font&gt;&lt;/p&gt; 
 &lt;blockquote&gt; 
  &lt;blockquote&gt; 
   &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;bind(또는 jQuery 1.7+를 사용하는 방법) 메서드를 통해 이벤트 수신기를 추가하는 것이 jQuery File Upload UI 버전으로 콜백 설정을 유지하는 데 선호되는 옵션입니다.&lt;/font&gt;&lt;/p&gt; 
  &lt;/blockquote&gt; 
 &lt;/blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;또는 다음과 같이 자신의 콜백에서 간단히 처리를 시작할 수도 있습니다. https://github.com/blueimp/jQuery-File-Upload/blob/master/js/jquery.fileupload-process.js#L50&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&gt;&lt;code&gt;$fileInput.fileupload({
    url: 'upload_url',
    type: 'POST',
    dataType: 'json',
    autoUpload: false,
    disableValidation: false,
    maxFileSize: 1024 * 1024,
    messages: {
        maxFileSize: 'File exceeds maximum allowed size of 1MB',
    }
});

$fileInput.on('fileuploadadd', function(evt, data) {
    var $this = $(this);
    var validation = data.process(function () {
        return $this.fileupload('process', data);
    });

    validation.done(function() {
        makeAjaxCall('some_other_url', { fileName: data.files[0].name, fileSizeInBytes: data.files[0].size })
            .done(function(resp) {
                data.formData = data.formData || {};
                data.formData.someData = resp.SomeData;
                data.submit();
        });
    });
    validation.fail(function(data) {
        console.log('Upload error: ' + data.files[0].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;$('#fileupload').fileupload({

    dataType: 'json',
    //acceptFileTypes: /(\.|\/)(xml|pdf)$/i,
    //maxFileSize: 15000000,

    add: function (e, data) {
        var uploadErrors = [];

        var acceptFileTypes = /\/(pdf|xml)$/i;
        if(data.originalFiles[0]['type'].length &amp;amp;&amp;amp; !acceptFileTypes.test(data.originalFiles[0]['type'])) {
            uploadErrors.push('File type not accepted');
        }

        console.log(data.originalFiles[0]['size']) ;
        if (data.originalFiles[0]['size'] &amp;gt; 5000000) {
            uploadErrors.push('Filesize too big');
        }
        if(uploadErrors.length &amp;gt; 0) {
            alert(uploadErrors.join(&quot;\n&quot;));
        } else {
            data.context = $('&amp;lt;p/&amp;gt;').text('Uploading...').appendTo(document.body);
            data.submit();
        }

    },
    done: function (e, data) {
        data.context.text('Success!.');
    }
});
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&quot;jquery.fileupload-ui.js&quot;라는 이름의 파일을 열면 다음과 같은 코드가 표시됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt; $.widget('blueimp.fileupload', $.blueimp.fileupload, {

    options: {
        // By default, files added to the widget are uploaded as soon
        // as the user clicks on the start buttons. To enable automatic
        // uploads, set the following option to true:
        acceptFileTypes: /(\.|\/)(gif|jpe?g|png)$/i,
        autoUpload: false,
        // The ID of the upload template:
        uploadTemplateId: 'template-upload',
        // The ID of the download template:
        downloadTemplateId: 'template-download',
        。。。。
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;한 줄 코드만 추가하면 됩니다. --- 새 속성 &quot;acceptFileTypes&quot;는 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt; options: {
        // By default, files added to the widget are uploaded as soon
        // as the user clicks on the start buttons. To enable automatic
        // uploads, set the following option to true:
        **acceptFileTypes: /(\.|\/)(gif|jpe?g|png)$/i,**
        autoUpload: false,
        // The ID of the upload template:
        uploadTemplateId: 'template-upload',
        // The ID of the download template:
        downloadTemplateId: 'template-d
&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;플러그인 JS를 모두 가져왔고 올바른 순서로 가져왔지만 여전히 문제가 있는 경우, 자신의 &quot;add&quot; 핸들러를 지정하면 *-validate.js 플러그인의 핸들러를 너프(nerf)하는 것 같습니다. 그러면 일반적으로 data.process()를 호출하여 모든 유효성 검사가 시작됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;따라서 이 문제를 해결하려면 &quot;추가&quot; 이벤트 핸들러에서 다음과 같은 작업을 수행하면 됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$('#whatever').fileupload({
...
add: function(e, data) {
   var $this = $(this);
   data.process(function() {
      return $this.fileupload('process', data);
   }).done(function(){
      //do success stuff
      data.submit(); &amp;lt;-- fire off the upload to the server
   }).fail(function() {
      alert(data.files[0].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;ul&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다중 파일 입력&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하나 또는 &lt;strong&gt;여러 파일&lt;/strong&gt; 업로드의 경우 -&lt;/font&gt;&lt;/font&gt;&lt;code&gt;$.grep()&lt;/code&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;image&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;audio&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;체재를 갖추다&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;문자열에서 동적 파일 형식&lt;/font&gt;&lt;/font&gt;&lt;code&gt;new RegExp()&lt;/code&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;acceptFileTypes.test()&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;- 다음과 같은 오디오 파일에 대해 마임 유형 확인&lt;/font&gt;&lt;/font&gt;&lt;code&gt;.mp3&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그럴 것이다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;audio/mpeg&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;모든 blueimp 옵션: https://github.com/blueimp/jQuery-File-Upload/wiki/Options&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$('input[type=&quot;file&quot;]').each(function(i){

    // .form_files is my div/section of form for input file and progressbar
    var $progressbar = $(this).parents('.form_files:first').find('.progress-bar:first');

    var $image_format = 'jpg|jpeg|jpe|png|gif';
    var $audio_format = 'mp3|mpeg';
    var $all_formats = $image_format + '|' + $audio_format;

    var $image_size = 2;
    var $audio_size = 10;
    var mb = 1048576;

    $(this).fileupload({
        // ...
        singleFileUploads: false,   // &amp;lt;&amp;lt; send all together, not single
        // ...
        add: function (e, data) {

            // array with all indexes of files with errors
            var error_uploads_indexes = [];

            // when add file - each file
            $.each(data.files, function(index, file) {

                // array for all errors
                var uploadErrors = [];


                // validate all formats first
                if($all_formats){

                    // check all formats first - before size
                    var acceptFileTypes = &quot;(\.|\/)(&quot; + $all_formats + &quot;)$&quot;;
                    acceptFileTypes = new RegExp(acceptFileTypes, &quot;i&quot;);

                    // when wrong format
                    if(data.files[index]['type'].length &amp;amp;&amp;amp; !acceptFileTypes.test(data.files[index]['type'])) {
                        uploadErrors.push('Not an accepted file type');

                    }else{

                        // default size is image_size
                        var $my_size = $image_size;

                            // check audio format
                            var acceptFileTypes = &quot;(\.|\/)(&quot; + $audio_format + &quot;)$&quot;;
                            acceptFileTypes = new RegExp(acceptFileTypes, &quot;i&quot;);

                            // alert(data.files[index]['type']);
                            // alert(acceptFileTypes.test('audio/mpeg'));

                            // if is audio then size is audio_size
                            if(data.files[index]['type'].length &amp;amp;&amp;amp; acceptFileTypes.test(data.files[index]['type'])) {
                                $my_size = $audio_size;
                            }

                        // check size
                        if(data.files[index]['size'] &amp;gt; $my_size * mb) {
                            uploadErrors.push('Filesize is too big');
                        };
                    };

                }; // &amp;lt;&amp;lt; all_formats

                // when errors
                if(uploadErrors.length &amp;gt; 0) {
                    //  alert(uploadErrors.join(&quot;\n&quot;));

                    // mark index of error file
                    error_uploads_indexes.push(index);
                    // alert error
                    alert(uploadErrors.join(&quot;\n&quot;));

                };

            }); // &amp;lt;&amp;lt; each


            // remove indexes (files) with error
            data.files = $.grep( data.files, function( n, i ) {
                return $.inArray(i, error_uploads_indexes) ==-1;
            });


            // if are files to upload
            if(data.files.length){
                // upload by ajax
                var jqXHR = data.submit().done(function (result, textStatus, jqXHR) {
                        //...
                     alert('done!') ;
                        // ...
                });
            } // 

        }, // &amp;lt;&amp;lt; add
        progressall: function (e, data) {
            var progress = parseInt(data.loaded / data.total * 100, 10);
            $progressbar.css(
                'width',
                progress + '%'
                );
        }
    }); // &amp;lt;&amp;lt; file_upload

    //          
}); // &amp;lt;&amp;lt; each input file
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Add 이벤트에 대한 이벤트 처리기의 예입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;singleFileUploads 옵션(기본값)이 활성화되어 있다고 가정합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;추가/파일 업로드 추가 이벤트로 바인딩하는 방법에 대한 jQuery File Upload 설명서를 더 읽어 보십시오.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;인사이드 루프에서는 vars &lt;strong&gt;this&lt;/strong&gt; 또는 file을 &lt;strong&gt;모두&lt;/strong&gt; 사용할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;size 속성을 가져오는 예: &lt;strong&gt;this['size']&lt;/strong&gt; 또는 &lt;strong&gt;file.size&lt;/strong&gt;입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;    /**
     * Handles Add event
     */
    base.eventAdd = function(e, data) {

        var errs = [];
        var acceptFileTypes = /(\.|\/)(gif|jpe?g|png)$/i;
        var maxFileSize = 5000000;

        // Validate file
        $.each(data.files, function(index, file) {
            if (file.type.length &amp;amp;&amp;amp; !acceptFileTypes.test(file.type)) {
                errs.push('Selected file &quot;' + file.name + '&quot; is not alloawed. Invalid file type.');
            }
            if (this['size'] &amp;gt; maxFileSize) {
                errs.push('Selected file &quot;' + file.name + '&quot; is too big, ' + parseInt(file.size / 1024 / 1024) + 'M.. File should be smaller than ' + parseInt(maxFileSize / 1024 / 1024) + 'M.');
            }
        });

        // Output errors or submit data
        if (errs.length &amp;gt; 0) {
            alert('An error occured. ' + errs.join(&quot; &quot;));
        } else {
            data.submit();
        }
    };
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;크롬, jquery.fileupload.js 버전은 5.42.3입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;     add: function(e, data) {
        var uploadErrors = [];
        var ext = data.originalFiles[0].name.split('.').pop().toLowerCase();
        if($.inArray(ext, ['odt','docx']) == -1) {
            uploadErrors.push('Not an accepted file type');
        }
        if(data.originalFiles[0].size &amp;gt; (2*1024*1024)) {//2 MB
            uploadErrors.push('Filesize is too big');
        }
        if(uploadErrors.length &amp;gt; 0) {
            alert(uploadErrors.join(&quot;\n&quot;));
        } else {
            data.submit();
        }
    },
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;.fileupload({
    add: function (e, data) { 
        var attachmentValue = 3 * 1000 * 1024;
        var totalNoOfFiles = data.originalFiles.length;
        for (i = 0; i &amp;lt; data.originalFiles.length; i++) {
            if (data.originalFiles[i]['size'] &amp;gt; attachmentValue) {
                $attachmentsList.find('.uploading').remove();
                $attachmentMessage.append(&quot;&amp;lt;li&amp;gt;&quot; + 'Uploaded bytes exceeded the file size' + &quot;&amp;lt;/li&amp;gt;&quot;);
                $attachmentMessage.show().fadeOut(10000, function () {
                    $attachmentMessage.html('');
                });
                data.originalFiles.splice(i, 1);
            }
        }
        if (data.files[0]) {
            $attachmentsList
           .prepend('&amp;lt;li class=&quot;uploading&quot; class=&quot;clearfix loading-content&quot;&amp;gt;' + data.files[0].name + '&amp;lt;/li&amp;gt;');
        }
        data.submit();                    
    }
&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;3g2|3gp|3gp2|3gpp|aac|aaf|aca|accdb|accde|accdt|acx|adt|adts|afm|ai|aif|aifc|aiff|appcache|application|art|asd|asf|asi|asm|asr|asx|atom|au|avi|axs|bas|bcpio|bin|bmp|c|cab|calx|cat|cdf|chm|class|clp|cmx|cnf|cod|cpio|cpp|crd|crl|crt|csh|css|csv|cur|dcr|deploy|der|dib|dir|disco|dll|dllconfig|dlm|doc|docm|docx|dot|dotm|dotx|dsp|dtd|dvi|dvr-ms|dwf|dwp|dxr|eml|emz|eot|eps|esd|etx|evy|exe|execonfig|fdf|fif|fla|flr|flv|gif|gtar|gz|h|hdf|hdml|hhc|hhk|hhp|hlp|hqx|hta|htc|htm|html|htt|hxt|ico|ics|ief|iii|inf|ins|isp|IVF|jar|java|jck|jcz|jfif|jpb|jpe|jpeg|jpg|js|json|jsonld|jsx|latex|less|lit|lpk|lsf|lsx|lzh|m13|m14|m1v|m2ts|m3u|m4a|m4v|man|manifest|map|mdb|mdp|me|mht|mhtml|mid|midi|mix|mmf|mno|mny|mov|movie|mp2|mp3|mp4|mp4v|mpa|mpe|mpeg|mpg|mpp|mpv2|ms|msi|mso|mvb|mvc|nc|nsc|nws|ocx|oda|odc|ods|oga|ogg|ogv|one|onea|onepkg|onetmp|onetoc|onetoc2|osdx|otf|p10|p12|p7b|p7c|p7m|p7r|p7s|pbm|pcx|pcz|pdf|pfb|pfm|pfx|pgm|pko|pma|pmc|pml|pmr|pmw|png|pnm|pnz|pot|potm|potx|ppam|ppm|pps|ppsm|ppsx|ppt|pptm|pptx|prf|prm|prx|ps|psd|psm|psp|pub|qt|qtl|qxd|ra|ram|rar|ras|rf|rgb|rm|rmi|roff|rpm|rtf|rtx|scd|sct|sea|setpay|setreg|sgml|sh|shar|sit|sldm|sldx|smd|smi|smx|smz|snd|snp|spc|spl|spx|src|ssm|sst|stl|sv4cpio|sv4crc|svg|svgz|swf|t|tar|tcl|tex|texi|texinfo|tgz|thmx|thn|tif|tiff|toc|tr|trm|ts|tsv|ttf|tts|txt|u32|uls|ustar|vbs|vcf|vcs|vdx|vml|vsd|vss|vst|vsto|vsw|vsx|vtx|wav|wax|wbmp|wcm|wdb|webm|wks|wm|wma|wmd|wmf|wml|wmlc|wmls|wmlsc|wmp|wmv|wmx|wmz|woff|woff2|wps|wri|wrl|wrz|wsdl|wtv|wvx|x|xaf|xaml|xap|xbap|xbm|xdr|xht|xhtml|xla|xlam|xlc|xlm|xls|xlsb|xlsm|xlsx|xlt|xltm|xltx|xlw|xml|xof|xpm|xps|xsd|xsf|xsl|xslt|xsn|xtp|xwd|z|zip
&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;    function checkFileType(filename, typeRegEx) {
        if (filename.length &amp;lt; 4 || typeRegEx.length &amp;lt; 1) return false;
        var filenameParts = filename.split('.');
        if (filenameParts.length &amp;lt; 2) return false;
        var fileExtension = filenameParts[filenameParts.length - 1];
        return typeRegEx.test('.' + fileExtension);
    }
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;작동&lt;/strong&gt;하려면 jquery&lt;strong&gt;.fileupload-process.&lt;/strong&gt;&lt;strong&gt;js&lt;/strong&gt;와 jquery&lt;strong&gt;.fileupload-validate.js&lt;/strong&gt;를 포함해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그럼...&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$(this).fileupload({
    // ...
    processfail: function (e, data) {
        data.files.forEach(function(file){
            if (file.error) {
                self.$errorMessage.html(file.error);
                return false;
            }
        });
    },
//...
}
&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;ul&gt; 
 &lt;li&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;/p&gt; &lt;pre&gt;&lt;code&gt;add : function (e,data){
   var extension = data.originalFiles[0].name.substr( 
   (data.originalFiles[0].name.lastIndexOf('.') +1) );
            switch(extension){
                case 'csv':
                case 'xls':
                case 'xlsx':
                    data.url = &amp;lt;Your URL&amp;gt;; 
                    data.submit();
                break;
                default:
                    alert(&quot;File type not accepted&quot;);
                break;
            }
  }
&lt;/code&gt;&lt;/pre&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;add: function(e, data) {
        data.url = 'xx/';
        var uploadErrors = [];
         var acceptFileTypes = /^image\/(gif|jpe?g|png)$/i;
        console.log(data.originalFiles);
        for (var i = 0; i &amp;lt; data.originalFiles.length; i++) {
            if(data.originalFiles[i]['type'].length &amp;amp;&amp;amp; !acceptFileTypes.test(data.originalFiles[i]['type'])) {
                    uploadErrors.push('Not an accepted file type');
                    data.originalFiles
                }
                if(data.originalFiles[i]['size'].length &amp;amp;&amp;amp; data.originalFiles[i]['size'] &amp;gt; 5000000) {
                    uploadErrors.push('Filesize is too big');
                }
                if(uploadErrors.length &amp;gt; 0) {

                      alert(uploadErrors.join(&quot;\n&quot;));
                }
        }
        data.submit();
      },
&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/17451629/maxfilesize-and-acceptfiletypes-in-blueimp-file-upload-plugin-do-not-work-why&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>jQuery</category>
      <author>css3</author>
      <guid isPermaLink="true">https://css3.tistory.com/1169</guid>
      <comments>https://css3.tistory.com/1169#entry1169comment</comments>
      <pubDate>Mon, 6 Nov 2023 22:00:30 +0900</pubDate>
    </item>
    <item>
      <title>블로거 XML 파일을 WXR 파일로 변환하는 방법은?</title>
      <link>https://css3.tistory.com/1168</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;블로거 XML 파일을 WXR 파일로 변환하는 방법은?&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;47.9인 블로거 내보내기 파일을 가지고 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;워드프레스(자체 호스팅)로 가져와야 하는 MB&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;보통 구글 앱 도구를 사용하여 파일을 변환한 다음 WP로 가져오기 위해 더 작은 비트로 분할합니다.&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;translated&quot;&gt;413 오류: Entity Too Large 요청 클라이언트에서 너무 큰 요청을 발행했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이렇게 큰 파일에 사용할 수 있는 다른 앱이나 XML 파일을 수동으로 WXR 파일로 변환하는 방법에 대한 튜토리얼이 있습니까?&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;꼭 이렇게 할 필요가 있습니까? &lt;a href=&quot;http://codex.wordpress.org/Importing_Content#Blogger&quot; rel=&quot;nofollow&quot;&gt;워드프레스&lt;/a&gt; 코덱스에 따르면 블로거로부터 직접 가져올 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;위 링크의 관련 정보는 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;워드프레스 2.2 이상 사용자는 블로거에서 가져올 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이전 버전은 &quot;New Blogger&quot;가 Google에 의해 출시되어 이전 버전의 모든 수입업체가 무효화되었기 때문에 Blogger에서 가져올 수 없습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;워드프레스 2.2 이상만 &quot;뉴 블로거&quot;를 지원합니다.&lt;/font&gt;&lt;/p&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아직 사용하지 않았다면 New Blogger와 Google Account on Blogger를 사용하고 있어야 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여전히 Old Blogger를 사용하는 경우 수입자가 작동하지 않지만 기존 Blogger Atom 내보내기를 Wordpress WXR 내보내기 파일로 변환하는 유용한 온라인 도구가 있습니다.&lt;/font&gt;&lt;/p&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Blogger 가져오기를 시작하려면 Tools(도구) → Import(가져오기) → Blogger(블로거)로 이동합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;WordPress 버전 2.0.2 ~ 2.6.5의 경우 관리 → 가져오기 → 블로거로 이동합니다.&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;URL : https://stackoverflow.com/questions/12254015/how-to-convert-a-blogger-xml-file-to-a-wxr-file&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>WordPress</category>
      <author>css3</author>
      <guid isPermaLink="true">https://css3.tistory.com/1168</guid>
      <comments>https://css3.tistory.com/1168#entry1168comment</comments>
      <pubDate>Mon, 6 Nov 2023 22:00:15 +0900</pubDate>
    </item>
    <item>
      <title>PHP 5.3을 위한 PHP 5.2 '호환 모드'가 있습니까?</title>
      <link>https://css3.tistory.com/1167</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;PHP 5.3을 위한 PHP 5.2 '호환 모드'가 있습니까?&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;나는 방금 대부분의 주요 워드프레스 호스팅 환경이 여전히 PHP 5.2를 사용하고 있다는 사실을 알게 되었습니다. 5.2가 더 이상 공식적으로 지원되지 않음에도 불구하고 5.2용 보안 패치가 여전히 출시되고 있다는 사실을 고려하면 5.2는 곧 사용되지 않을 것으로 보입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;따라서 늦은 정적 바인딩 및 폐쇄와 같은 몇 가지 5.3 기능을 사용한 리팩토링을 수행해야 할 것 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이상적으로는 5.2 환경을 설치하기 위해 5.3 환경을 완전히 낭비하고 싶지 않습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;유효한 5.2 구문만 받아들이도록 5.3 설정에 '호환성 모드'를 설정할 수 있는 방법이 있습니까?&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그럴 방법이 없어요, 5.2를 설치하셔야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;호환되지 않는 구문 수준만 잡고 살 수 있다면 (&lt;/font&gt;&lt;/font&gt;&lt;code&gt;static::&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;, 람다 함수,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;goto&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;, ...), 그러면 격리된 위치에 5.2 바이너리를 두고 파일에 대한 구문 검사를 실행할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;php -l&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;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/6791517/is-there-a-php-5-2-compatibility-mode-for-php-5-3&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>WordPress</category>
      <author>css3</author>
      <guid isPermaLink="true">https://css3.tistory.com/1167</guid>
      <comments>https://css3.tistory.com/1167#entry1167comment</comments>
      <pubDate>Mon, 6 Nov 2023 22:00:09 +0900</pubDate>
    </item>
    <item>
      <title>여러 프로토콜을 신속하게 준수하는 유형</title>
      <link>https://css3.tistory.com/1166</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;나는 여러 프로토콜을 준수하는 Objective-C 변수를 가지고 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;id &amp;lt;NSObject, NSCopying, NSCoding&amp;gt; identityToken; 
&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;var identityToken: NSObjectProtocol &amp;amp; NSCopying &amp;amp; NSCoding 
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;NS Object 대신 NS Object Protocol을 신속하게 사용해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음은 몇 가지 추가적인 예입니다.&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여러 프로토콜을 준수하는 객체 배열:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var array: [NSObjectProtocol &amp;amp; NSCopying &amp;amp; NSCoding]
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다중 프로토콜을 준수하는 파라미터로 기능:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;func foo(param: NSObjectProtocol &amp;amp; NSCopying &amp;amp; NSCoding) {

}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Swift 3.1 이전 버전의 경우 다음을 사용합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var identityToken: (NSObjectProtocol, NSCopying, NSCoding)
&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;pre&gt;&lt;code&gt;var idToken: NSObjectProtocol &amp;amp; NSCopying &amp;amp; NSCoding

func foo(_ delegateAndDataSource: UICollectionViewDelegate &amp;amp; UICollectionViewDataSource) { ... }
&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;typealias IDToken = NSObjectProtocol &amp;amp; NSCopying &amp;amp; NSCoding
&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 idToken: IDToken

var array: [IDToken] = []

func foo(param: IDToken) { ... }
&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;internal protocol MyOtherProtocol : NSObjectProtocol, NSCopying, NSCoding {
    func someOtherNecessaryMethod()
}
&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 identityToken : MyOtherProtocol
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제네릭의 경우에도 다음과 같이 작동합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;func setCollectionViewDataSourceDelegate&amp;lt;D: UICollectionViewDataSource &amp;amp; UICollectionViewDelegate&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/24027380/types-conforming-to-multiple-protocols-in-swift&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>SWIFT</category>
      <author>css3</author>
      <guid isPermaLink="true">https://css3.tistory.com/1166</guid>
      <comments>https://css3.tistory.com/1166#entry1166comment</comments>
      <pubDate>Mon, 6 Nov 2023 22:00:03 +0900</pubDate>
    </item>
    <item>
      <title>f() aint16_t를 인쇄하려면 어떻게 해야 합니까?</title>
      <link>https://css3.tistory.com/1165</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;f() aint16_t를 인쇄하려면 어떻게 해야 합니까?&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;aint16_t를 인쇄하려면 printf()를 사용해야 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 SO답안(&lt;a href=&quot;https://stackoverflow.com/questions/12120426/how-to-print-uint32-t-and-uint16-t-variables-value&quot;&gt;unint32_t &lt;/a&gt;및&lt;a href=&quot;https://stackoverflow.com/questions/12120426/how-to-print-uint32-t-and-uint16-t-variables-value&quot;&gt; unint16_t variables value를 출력&lt;/a&gt;하는 방법&lt;a href=&quot;https://stackoverflow.com/questions/12120426/how-to-print-uint32-t-and-uint16-t-variables-value&quot;&gt;?)&lt;/a&gt;은 intype.h를 사용해야 한다고 말합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하지만 임베디드 시스템을 작업 중인데 intype.h는 사용할 수 없습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;aunt16_t의 형식 지정자를 사용할 수 없을 때 aunt16_t를 인쇄하려면 어떻게 해야 합니까?&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;inttype.h 스타일을 사용하되 기호를 직접 정의해야 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예를 들어,&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#define PRIu8 &quot;hhu&quot;
#define PRId8 &quot;hhd&quot;
#define PRIx8 &quot;hhx&quot;
#define PRIu16 &quot;hu&quot;
#define PRId16 &quot;hd&quot;
#define PRIx16 &quot;hx&quot;
#define PRIu32 &quot;u&quot;
#define PRId32 &quot;d&quot;
#define PRIx32 &quot;x&quot;
#define PRIu64 &quot;llu&quot; // or possibly &quot;lu&quot;
#define PRId64 &quot;lld&quot; // or possibly &quot;ld&quot;
#define PRIx64 &quot;llx&quot; // or possibly &quot;lx&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;필요한 intype.h 및 도형으로 다른 것을 살펴봅니다.&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;저는 70년대 후반부터 임베디드 시스템 작업을 해왔습니다.&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;printf(&quot;%u\n&quot;, (unsigned int)x);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;서명되지 않은 int는 최소 16비트가 보장되므로 손실 변환이 아닙니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;code&gt;short int&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;최소 16비트 길이이므로 값을 다음으로 변환합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;unsigned short int&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;인쇄합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;%hu&lt;/code&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/29112878/how-do-i-printf-a-uint16-t&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>C</category>
      <author>css3</author>
      <guid isPermaLink="true">https://css3.tistory.com/1165</guid>
      <comments>https://css3.tistory.com/1165#entry1165comment</comments>
      <pubDate>Mon, 6 Nov 2023 21:59:57 +0900</pubDate>
    </item>
    <item>
      <title>Oracle의 MD5를 PHP의 MD5와 일치시키는 방법</title>
      <link>https://css3.tistory.com/1164</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Oracle의 MD5를 PHP의 MD5와 일치시키는 방법&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;PHP에서 생성된 MD5 체크섬과 오라클 10g에서 생성된 체크섬을 비교하려고 합니다.&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;//md5 tests

  //php md5
  print md5('testingthemd5function');

  print '&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;';

  //oracle md5
  $md5query = &quot;select md5hash('testingthemd5function') from dual&quot;;

  $stid = oci_parse($conn, $md5query);
  if (!$stid) {
   $e = oci_error($conn);
   print htmlentities($e['message']);
   exit;
  }

  $r = oci_execute($stid, OCI_DEFAULT);
  if (!$r) {
   $e = oci_error($stid);
   echo htmlentities($e['message']);
   exit;
  }

  $row = oci_fetch_row($stid); 
  print $row[0];
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;오라클의 md5 함수(위의 쿼리에서 볼 수 있음)는 'dbms_obfuscation_toolkit.md5' 패키지(?)를 사용하며 다음과 같이 정의됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;CREATE OR REPLACE FUNCTION PORTAL.md5hash (v_input_string in varchar2) return varchar2     
is
   v_checksum varchar2(20);
   begin
   v_checksum := dbms_obfuscation_toolkit.md5 (input_string =&amp;gt; v_input_string);
   return v_checksum;
end;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;내 PHP 페이지에 나오는 내용은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;29dbb90ea99a397b946518c84f45e016

)Û¹©š9{”eÈOEà 
&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;원시 바이트를 반환하므로 16진수로 변환해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$x = unpack(&quot;H*&quot;, $row[0]); 
echo $x[1];
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Oracle 쿼리에서 인쇄되는 것은 대부분의 옥텟이 ASCII 문자가 아니기 때문에 md5 체크섬의 원시 바이트 스트림인 것으로 보입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;먼저 16진수로 변환해 보십시오.&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 or replace
function md5( input varchar2 ) return sys.dbms_obfuscation_toolkit.varchar2_checksum as
begin
    return lower(rawtohex(utl_raw.cast_to_raw(sys.dbms_obfuscation_toolkit.md5( input_string =&amp;gt; input ))));
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;select md5('foobar') from dual;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&quot;dbms_obfuscation_toolkit.md5&quot;는 실제로 raw 형식으로 반환되지 않으므로 &quot;utl_raw.cast_to_raw&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;Oracle에서 md5를 사용하려는 경우 다음 방법을 사용할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;select lower(rawtohex(md5hash('foobar'))) from dual
&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;pre&gt;&lt;code&gt;CREATE OR REPLACE FUNCTION MD5RAW( v_input_string in varchar2 )
RETURN varchar2 IS
v_checksum varchar2( 32 );
BEGIN
    v_checksum := SYS.DBMS_OBFUSCATION_TOOLKIT.MD5( input_string =&amp;gt; v_input_string );
    return v_checksum;
END;

CREATE OR REPLACE FUNCTION MD5HEX( v_input_string in varchar2 )
RETURN varchar2 IS
v_hex_value varchar2( 32 );
BEGIN
    SELECT  LOWER( RAWTOHEX( MD5RAW( v_input_string ) ) ) 
    INTO    v_hex_value
    FROM    dual;
    return v_hex_value;
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;SELECT md5hex( 'my string smoked your hash' ) FROM dual;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그 두 번째 함수는 당신이 제공하는 함수에 대해 Bazz가 제공하는 SELECT 문을 발행하는 것과 동일하지만, 나는 모든 쿼리 내에서 rawToHex --&amp;gt; lower conversion을 할 필요가 없는 것을 선호합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러면 쿼리를 사용할 때마다 너무 많은 문제가 발생할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;런타임이 아닌 생성 시에 컴파일되기 때문에 저도 더 빠를 수 있다고 생각합니다만, 틀릴 수도 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/1228685/getting-oracles-md5-to-match-phps-md5&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>oracle</category>
      <author>css3</author>
      <guid isPermaLink="true">https://css3.tistory.com/1164</guid>
      <comments>https://css3.tistory.com/1164#entry1164comment</comments>
      <pubDate>Mon, 6 Nov 2023 21:59:51 +0900</pubDate>
    </item>
    <item>
      <title>팬더 WITH 지수에서 데이터 프레임을 사전으로 변환하는 방법</title>
      <link>https://css3.tistory.com/1163</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;팬더 WITH 지수에서 데이터 프레임을 사전으로 변환하는 방법&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;df&lt;/code&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;| name  | coverage |
|-------|----------|
| Jason | 25.1     |
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 그것을 사전으로 바꾸고 싶습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음 명령을 사용했습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;pandas&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;dict=df.to_dict()
&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;dict&lt;/code&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;{'coverage': {0: 25.1}, 'name': {0: 'Jason'}} 
&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;0&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;나의 산출물로&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;데이터 프레임에 있는 열 인덱스 때문에 캡처된 것 같습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;df&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;. 제거하려면 어떻게 해야 합니까?&lt;/font&gt;&lt;/font&gt;&lt;code&gt;0&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;내 출력에서 (인덱스가 캡처되지 않았으면 합니다.) 예상 출력:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;{'coverage': 25.1, 'name': 'Jason'} 
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;열이 2개인 당신의 데이터셋을 보면 데이터 프레임이 아닌 시리즈가 보입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;시도해 보기:&lt;/font&gt;&lt;/font&gt;&lt;code&gt;d = df.set_index('name')['coverage'].to_dict()&lt;/code&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;그러나 공통 키가 아닌 더 많은 열을 사용하고자 하는 경우 'records'를 사용하여 열을 배열에 저장할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;d = df.to_dict('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;/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;import pandas as pd

df = pd.DataFrame({
    'name': ['Jason'],
    'coverage': [25.1]
})

print(df.to_dict())
print(df.set_index('name')['coverage'].to_dict())
print(df.to_dict('r'))
&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;{'name': {0: 'Jason'}, 'coverage': {0: 25.1}}
{'Jason': 25.1}
[{'name': 'Jason', 'coverage': 25.1}]
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고 한 가지 더, 변수 이름 dict를 예약된 대로 사용하지 않도록 해야 합니다.&lt;/font&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;dict1 = df.to_dict('records')
&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;dict2 = df.to_dict('list')
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;code&gt;list&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;: 키는 열 이름, 값은 열 데이터 목록입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;records&lt;/code&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;data.to_dict('list')

#output:
#{'Feeling low in energy-slowed down': [2, 4, 2, 4]}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;1열만 있는 경우, 1열을 잘라냅니다(영상 시리즈로 변환됨) dict 함수로 래핑합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;dict( myDF.iloc[:, -1] )
# [: , -1] means: return all rows, return last column)

{Jason: 25.1}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;zip은 다른 선택 사항 dict= dict(zip('name',df['coverage'])이어야 합니다.&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/52547805/how-to-convert-dataframe-to-dictionary-in-pandas-without-index&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>dataframe</category>
      <author>css3</author>
      <guid isPermaLink="true">https://css3.tistory.com/1163</guid>
      <comments>https://css3.tistory.com/1163#entry1163comment</comments>
      <pubDate>Mon, 6 Nov 2023 21:59:43 +0900</pubDate>
    </item>
    <item>
      <title>다중 로그 파일 스프링 부팅</title>
      <link>https://css3.tistory.com/1162</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;&quot;@Slf4j&quot; 주석이 달린 클래스가 있는 봄 부팅 프로젝트에서 특정 클래스에 대해 다른 파일에 기록하고 싶습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하지만 어떻게 하는지는 알 수 없었습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;logback-spring.xml 파일은 다음과 같이 내 속성 파일에서 참조됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;logging.config= path/to/logback-spring.xml
logging.file=myCurrentLogFile.log
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;지금 logback-spring.xml 파일을 하나 더 만들어야 합니까?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;또는 현재 파일로 구성할 수 있습니다. 그렇다면 사용할 로거를 어떻게 선택할 수 있습니까?&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;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;logback.xml&lt;/code&gt;&lt;/p&gt; 
&lt;p&gt; &lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;property name=&quot;LOGS_HOME&quot; value=&quot;/var/applications/myProject/applogs/&quot; /&amp;gt;

&amp;lt;appender name=&quot;STDOUT&quot; class=&quot;ch.qos.logback.core.ConsoleAppender&quot;&amp;gt;
    &amp;lt;layout class=&quot;ch.qos.logback.classic.PatternLayout&quot;&amp;gt;
        &amp;lt;Pattern&amp;gt;
            %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n
        &amp;lt;/Pattern&amp;gt;
    &amp;lt;/layout&amp;gt;
&amp;lt;/appender&amp;gt;

&amp;lt;appender name=&quot;FILE&quot;
    class=&quot;ch.qos.logback.core.rolling.RollingFileAppender&quot;&amp;gt;
    &amp;lt;file&amp;gt;${LOGS_HOME}myProject_log.log&amp;lt;/file&amp;gt;
    &amp;lt;encoder class=&quot;ch.qos.logback.classic.encoder.PatternLayoutEncoder&quot;&amp;gt;
        &amp;lt;Pattern&amp;gt;
            %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n
        &amp;lt;/Pattern&amp;gt;
    &amp;lt;/encoder&amp;gt;

    &amp;lt;rollingPolicy class=&quot;ch.qos.logback.core.rolling.TimeBasedRollingPolicy&quot;&amp;gt;
        &amp;lt;!-- rollover daily --&amp;gt;
        &amp;lt;fileNamePattern&amp;gt;${LOGS_HOME}myProject_log.%d{yyyy-MM-dd}.%i.log&amp;lt;/fileNamePattern&amp;gt;
        &amp;lt;timeBasedFileNamingAndTriggeringPolicy class=&quot;ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP&quot;&amp;gt;
            &amp;lt;maxFileSize&amp;gt;100MB&amp;lt;/maxFileSize&amp;gt;
        &amp;lt;/timeBasedFileNamingAndTriggeringPolicy&amp;gt;
    &amp;lt;/rollingPolicy&amp;gt;
&amp;lt;/appender&amp;gt;

&amp;lt;appender name=&quot;FILE-AUDIT&quot; class=&quot;ch.qos.logback.core.rolling.RollingFileAppender&quot;&amp;gt;
    &amp;lt;file&amp;gt;${LOGS_HOME}myProject_audit.log&amp;lt;/file&amp;gt;
    &amp;lt;encoder class=&quot;ch.qos.logback.classic.encoder.PatternLayoutEncoder&quot;&amp;gt;
        &amp;lt;Pattern&amp;gt;
            %d{yyyy-MM-dd HH:mm:ss};%msg%n
        &amp;lt;/Pattern&amp;gt;
    &amp;lt;/encoder&amp;gt;

    &amp;lt;rollingPolicy class=&quot;ch.qos.logback.core.rolling.TimeBasedRollingPolicy&quot;&amp;gt;
        &amp;lt;!-- rollover daily --&amp;gt;
        &amp;lt;fileNamePattern&amp;gt;${LOGS_HOME}myProject_audit.%d{yyyy-MM-dd}.%i.log&amp;lt;/fileNamePattern&amp;gt;
        &amp;lt;timeBasedFileNamingAndTriggeringPolicy class=&quot;ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP&quot;&amp;gt;
            &amp;lt;maxFileSize&amp;gt;100MB&amp;lt;/maxFileSize&amp;gt;
        &amp;lt;/timeBasedFileNamingAndTriggeringPolicy&amp;gt;
    &amp;lt;/rollingPolicy&amp;gt;
&amp;lt;/appender&amp;gt;

&amp;lt;logger name=&quot;com.myCompany.myProject&quot; level=&quot;info&quot; additivity=&quot;false&quot;&amp;gt;
    &amp;lt;appender-ref ref=&quot;FILE&quot; /&amp;gt;
    &amp;lt;appender-ref ref=&quot;STDOUT&quot; /&amp;gt;
&amp;lt;/logger&amp;gt;

&amp;lt;logger name=&quot;audit-log&quot; level=&quot;info&quot; additivity=&quot;false&quot;&amp;gt;
    &amp;lt;appender-ref ref=&quot;FILE-AUDIT&quot; /&amp;gt;
    &amp;lt;appender-ref ref=&quot;STDOUT&quot; /&amp;gt;
&amp;lt;/logger&amp;gt;

&amp;lt;root level=&quot;error&quot;&amp;gt;
    &amp;lt;appender-ref ref=&quot;FILE&quot; /&amp;gt;
    &amp;lt;appender-ref ref=&quot;STDOUT&quot; /&amp;gt;
&amp;lt;/root&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;코드에서 로거에 액세스할 수 있는 위치는 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;private static Logger audit = LoggerFactory.getLogger(&quot;audit-log&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;audit-log&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;로거와 사용&lt;/font&gt;&lt;/font&gt;&lt;code&gt;FILE-AUDIT&lt;/code&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;standart&quot; appender는 지정된 패키지에 있는 클래스와 함께 사용됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;private static Logger logger = LoggerFactory.getLogger(MyApplication.class);
&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;&amp;lt;logger name=&quot;com.myCompany.myProject&quot; level=&quot;info&quot; additivity=&quot;false&quot;&amp;gt;&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고 명백히 파일 신청자입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;만약 당신이 두개의 다른 파일을 가지길 원한다면 당신은 태그 아래에 추가할 필요가 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&amp;lt;appender&amp;gt;&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음 코드:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;File name=&quot;FILE-AUDIT-SUIVI&quot; fileName=&quot;${LOGS_HOME}myProject_audit.log&quot;&amp;gt;
        &amp;lt;PatternLayout&amp;gt;
            &amp;lt;pattern&amp;gt;
                ${LOGS_HOME}
            &amp;lt;/pattern&amp;gt;
        &amp;lt;/PatternLayout&amp;gt;
    &amp;lt;/File&amp;gt;

&amp;lt;RollingFile name=&quot;FileAppender&quot; fileName=&quot;${LOGS_HOME}archived/myProject_audit.log&quot;
        filePattern=&quot;${LOGS_HOME}archived/myProject_audit.%d{yyyy-MM-dd}.%i.log&quot;&amp;gt;
        &amp;lt;PatternLayout&amp;gt;
            &amp;lt;Pattern&amp;gt;${LOGS_HOME}&amp;lt;/Pattern&amp;gt;
        &amp;lt;/PatternLayout&amp;gt;
        &amp;lt;Policies&amp;gt;
            &amp;lt;SizeBasedTriggeringPolicy size=&quot;10MB&quot; /&amp;gt;
        &amp;lt;/Policies&amp;gt;
        &amp;lt;DefaultRolloverStrategy max=&quot;1&quot; /&amp;gt;
    &amp;lt;/RollingFile&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/39103771/spring-boot-multiple-log-files&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>spring-boot</category>
      <author>css3</author>
      <guid isPermaLink="true">https://css3.tistory.com/1162</guid>
      <comments>https://css3.tistory.com/1162#entry1162comment</comments>
      <pubDate>Mon, 6 Nov 2023 21:59:37 +0900</pubDate>
    </item>
    <item>
      <title>MySQL 오류 1062: 키에 대한 중복 항목</title>
      <link>https://css3.tistory.com/1161</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;MySQL 오류 1062: 키에 대한 중복 항목&lt;/font&gt;&lt;/h2&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;&lt;strong&gt;날짜&lt;/strong&gt; 테이블에서 다음과 같이 UNIECIAL 제약 조건을 사용하여 &lt;em&gt;모이&lt;/em&gt; 열을 만듭니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;    CREATE TABLE date (
        dateID int NOT NULL,
        annee int NOT NULL,
        mois int NOT NULL,
        .
        .
        CONSTRAINT PK_date PRIMARY KEY (dateID, annee, mois, semaine, jour),
        UNIQUE KEY idx_mois (mois),
    ) Engine=innoDB;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;FKs 정의는 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;CREATE TABLE astreinte_mensu (
dateID int NOT NULL PRIMARY KEY,
annee int,
mois int,
Personne1Nuit int,
Personne2Nuit int,
Personne1Jour int,
Personne2Jour int,
FOREIGN KEY (annee) REFERENCES date(annee),
FOREIGN KEY (mois) REFERENCES date(mois),
FOREIGN KEY (Personne1Nuit) REFERENCES contact(PersonID),
FOREIGN KEY (Personne2Nuit) REFERENCES contact(PersonID),
FOREIGN KEY (Personne1Jour) REFERENCES contact(PersonID),
FOREIGN KEY (Personne2Jour) REFERENCES contact(PersonID)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;) Engine=innoDB;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;스크립트의 후반부에 절차 &lt;strong&gt;fill_date&lt;/strong&gt;:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;CREATE PROCEDURE fill_date()
BEGIN
DECLARE currentdate DATE;
DECLARE stopdate DATE;
SET currentdate = CURDATE();
SET stopdate = ADDDATE(currentdate, INTERVAL 1 YEAR);
WHILE currentdate &amp;lt; stopdate DO
INSERT INTO date VALUES (
YEAR(currentdate)*10000+MONTH(currentdate)*100 + DAY(currentdate),
YEAR(currentdate),
MONTH(currentdate),
WEEKOFYEAR(currentdate),
DAY(currentdate));

SET currentdate = ADDDATE(currentdate,INTERVAL 1 DAY);
END WHILE;
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;그래서 내 테이블은 2018년 6월부터 2019년 6월까지인데 그것 때문에 오류가 발생하고 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;121행의 오류 1062(23000): 키 'idx_mois'에 대한 중복 항목 '6'이(가) 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;누가 내 양초에 불을 붙여줄 수 있습니까?&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;EDIT:&lt;/strong&gt; Astreinte_mensu를 링크하고 싶기 때문에 장고의 &lt;strong&gt;ForeignKey.to&lt;/strong&gt; _field 인수에 UNIQUE 제약 조건이 필요합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;em&gt;Mois&lt;/em&gt; 필드에서 &lt;em&gt;Date.mois&lt;/em&gt; 필드로 이동합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이렇게 해서 이 &lt;a href=&quot;https://i.stack.imgur.com/RIwmj.png&quot; rel=&quot;nofollow noreferrer&quot;&gt;django admin 페이지의 스크린샷&lt;/a&gt;처럼 완전한 날짜가 아닌 months가 표시되었으면 좋겠습니다.&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;SELECT&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다양한 날짜 &lt;a href=&quot;https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html&quot; rel=&quot;nofollow noreferrer&quot;&gt;&lt;em&gt;시간 함수&lt;/em&gt;&lt;/a&gt;를 사용하는 쪽&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;숫자 및 문자열 함수보다 선호하는 날짜 산술 함수를 사용합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예&lt;/font&gt;&lt;/font&gt;&lt;code&gt;CURDATE() - INTERVAL 2 MONTH&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;UNIQUE KEY idx_mois (mois)&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;당신이 그 표에서 12개 이상의 행을 가질 수 없다는 것을 의미합니까?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아니면 어떻게든 12개월 이상의 시간이 있습니까?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아마도 당신이 의도한 것은 아니었을 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;UNIQUE&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;?&lt;/font&gt;&lt;/font&gt;&lt;/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/50854119/mysql-error-1062-duplicate-entry-for-key&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>MariaDB</category>
      <author>css3</author>
      <guid isPermaLink="true">https://css3.tistory.com/1161</guid>
      <comments>https://css3.tistory.com/1161#entry1161comment</comments>
      <pubDate>Mon, 6 Nov 2023 21:59:29 +0900</pubDate>
    </item>
    <item>
      <title>getString() 대신 JDBC getNString()을 사용해야 합니까?</title>
      <link>https://css3.tistory.com/1160</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;getString() 대신 JDBC getNString()을 사용해야 합니까?&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;JDBC(드라이버)를 사용하여 액세스하는 Oracle 데이터베이스를 통해 지원되는 Java 애플리케이션을 구축하고 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ojdbc6.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;orai18n.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;NVARCHAR2&lt;/code&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;JDBC에 대한 &lt;a href=&quot;http://download.oracle.com/javase/6/docs/api/java/sql/ResultSet.html#getNString%28int%29&quot;&gt;JDBC 문서&lt;/a&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ResultSet&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;라고 합니다&lt;/font&gt;&lt;/font&gt;&lt;code&gt;getNString()&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;특히 NCAR, NVARCHAR 등의 데이터 유형과 함께 사용하기 위한 것이지만, 현재 우리는 단지 사용하고 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;getString()&lt;/code&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;getNString()&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;보다는&lt;/font&gt;&lt;/font&gt;&lt;code&gt;getString()&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;. 이스&lt;/font&gt;&lt;/font&gt;&lt;code&gt;getString()&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;ASC가 아닌 경우 실패 시작&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;II 문자가 입력되어 있거나 Oracle JDBC 드라이버가 어떤 메서드를 사용해야 하는지에 대해 무관심합니까?&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://social.msdn.microsoft.com/Forums/en/sqldataaccess/thread/8e0d9743-241e-4b09-b3a2-137238c02bf1&quot;&gt;SQL Server&lt;/a&gt;는 연결 매개 변수에 따라 &lt;a href=&quot;http://social.msdn.microsoft.com/Forums/en/sqldataaccess/thread/8e0d9743-241e-4b09-b3a2-137238c02bf1&quot;&gt;사용자&lt;/a&gt;가 어떤 &lt;a href=&quot;http://social.msdn.microsoft.com/Forums/en/sqldataaccess/thread/8e0d9743-241e-4b09-b3a2-137238c02bf1&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;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;우리 어플에 테스트를 해보았는데 아마&lt;/font&gt;&lt;/font&gt;&lt;code&gt;getNString()&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Java 6, JDBC 6, Oracle JDBC 6 드라이버 및 Oracle 11.1.0.6.0에서는 불필요합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제가 사용한 테스트 문자열은 http://en.wikipedia.org/wiki/Unicode 에서 복사한 &quot;δ, й, ק, م, ๗, あ, 叶, 말&quot;입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;대부분의 데이터 액세스는 저장 프로시저를 통해 이루어집니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;자바는 다음을 통해 위의 테스트 문자열을 올바르게 설정하고 검색할 수 있었습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;setObject()&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;getString()&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;(아니오)&lt;/font&gt;&lt;/font&gt;&lt;code&gt;setString()&lt;/code&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;getString()&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Oracle 11g(위 링크의 SQL Server와 같이)로 Unicode 데이터에 대해 정상적으로 작동하므로 우리는 이것을 사용하지 않고 계속 사용할 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;getNString()&lt;/code&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;만약 당신의 DB가&lt;/font&gt;&lt;/font&gt;&lt;code&gt;NVARCHAR2&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;getNXXX()&lt;/code&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/5892163/should-i-be-using-jdbc-getnstring-instead-of-getstring&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>oracle</category>
      <author>css3</author>
      <guid isPermaLink="true">https://css3.tistory.com/1160</guid>
      <comments>https://css3.tistory.com/1160#entry1160comment</comments>
      <pubDate>Mon, 6 Nov 2023 21:59:22 +0900</pubDate>
    </item>
    <item>
      <title>.replace 또는 .strip과 같은 문자열 메서드를 호출하면 문자열을 수정(변형)하지 않는 이유는 무엇입니까?</title>
      <link>https://css3.tistory.com/1159</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;.replace 또는 .strip과 같은 문자열 메서드를 호출하면 문자열을 수정(변형)하지 않는 이유는 무엇입니까?&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;X = &quot;hello world&quot;
X.replace(&quot;hello&quot;, &quot;goodbye&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;X&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;변경, 부터&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&quot;hello world&quot;&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;로.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&quot;goodbye world&quot;&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;?&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것은 &lt;strong&gt;Python에서 문자열은 불변&lt;/strong&gt;하기 때문입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그 말은.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;X.replace(&quot;hello&quot;,&quot;goodbye&quot;)&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 papago-translate=&quot;translated&quot;&gt;이 때문에 이 줄을 교체해야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;X.replace(&quot;hello&quot;, &quot;goodbye&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;X = X.replace(&quot;hello&quot;, &quot;goodbye&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;strong&gt;이는 문자열의 &lt;/strong&gt;내용을 &quot;&lt;strong&gt;제자리&quot;&lt;/strong&gt;로 &lt;strong&gt;변경하는 모든 파이썬 문자열&lt;/strong&gt; 방식에 &lt;strong&gt;적용됩니다.&lt;/strong&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;replace&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;strip&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;translate&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;lower&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;/&lt;/font&gt;&lt;/font&gt;&lt;code&gt;upper&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;join&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;,...&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;폐기하지 않고 &lt;strong&gt;사용하려면 출력물&lt;/strong&gt;을 어떤 &lt;strong&gt;것에 할당해야 합니다&lt;/strong&gt;.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;X  = X.strip(' \t')
X2 = X.translate(...)
Y  = X.lower()
Z  = X.upper()
A  = X.join(':')
B  = X.capitalize()
C  = X.casefold()
&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;lower&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;upper&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;strip&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;well it is an iterable&lt;/code&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;x = 'hello'
x[0] = 'i' #'str' object does not support item assignment
&lt;/code&gt;&lt;/pre&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;a href=&quot;https://stackoverflow.com/questions/8680080/why-are-python-strings-immutable-best-practices-for-using-them&quot;&gt;파이썬 문자열은 왜 불변입니까?&lt;/a&gt;&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/8680080/why-are-python-strings-immutable-best-practices-for-using-them&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;URL : https://stackoverflow.com/questions/9189172/why-doesnt-calling-a-string-method-such-as-replace-or-strip-modify-mutate&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>Python</category>
      <author>css3</author>
      <guid isPermaLink="true">https://css3.tistory.com/1159</guid>
      <comments>https://css3.tistory.com/1159#entry1159comment</comments>
      <pubDate>Mon, 6 Nov 2023 21:59:16 +0900</pubDate>
    </item>
    <item>
      <title>mysql 콘솔 내부의 mysql 덤프</title>
      <link>https://css3.tistory.com/1158</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;mysql 콘솔 내부의 mysql 덤프&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;MySQL 콘솔 내에서 MySQL 덤프를 수행할 수 있는 SQL 명령어가 있습니까?&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;내 sqdump를 사용해 보았지만 작동이 되지 않습니다.&lt;/font&gt;&lt;/p&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;mysqldump는 mysql 콘솔과 같은 외부 명령이므로 MySQL 콘솔 내에서 mysqldump를 실행할 수 없습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;콘솔을 종료하고 다음과 같이 mysqldump 명령을 사용합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;mysqldump -u 사용자 이름 -p -h 호스트 이름 (또는 ip address) 데이터베이스 이름 &amp;gt; sqlfilename&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;mysqldump에 대한 더 자세한 내용은 http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html 에서 확인할 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사용하다&lt;/font&gt;&lt;/font&gt;&lt;code&gt;\!&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;\! mysqldump -u username -p database &amp;gt; database_dump.sql
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;a href=&quot;http://dev.mysql.com/doc/refman/5.0/en/mysql-commands.html&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;MySQL 설명서 참조(시스템 명령 참조)&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;mysqdump -u 사용자 이름 -p 데이터베이스&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;사용자 이름: dbuser&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/9460729/mysql-dump-inside-mysql-console&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>MySQL</category>
      <author>css3</author>
      <guid isPermaLink="true">https://css3.tistory.com/1158</guid>
      <comments>https://css3.tistory.com/1158#entry1158comment</comments>
      <pubDate>Mon, 6 Nov 2023 21:59:10 +0900</pubDate>
    </item>
    <item>
      <title>파괴된 보기 사용 시도: 변경사항 탐지</title>
      <link>https://css3.tistory.com/1157</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;저는 Angular Meteor 2를 이용해 간단한 UI를 만들고 있습니다.&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) 나는 '로그아웃' 버튼이 있는 상단 navbar 부품을 가지고 있습니다.&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;code&gt;EXCEPTION: Attempt to use a destroyed view: detectChanges&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;EXCEPTION: Attempt to use a destroyed view: detectChanges
browser_adapter.js:77 EXCEPTION: Attempt to use a destroyed view: detectChangesBrowserDomAdapter.logError @ browser_adapter.js:77BrowserDomAdapter.logGroup @ browser_adapter.js:87ExceptionHandler.call @ exception_handler.js:57(anonymous function) @ application_ref.js:265schedulerFn @ async.js:123SafeSubscriber.__tryOrUnsub @ Subscriber.js:225SafeSubscriber.next @ Subscriber.js:174Subscriber._next @ Subscriber.js:124Subscriber.next @ Subscriber.js:88Subject._finalNext @ Subject.js:128Subject._next @ Subject.js:120Subject.next @ Subject.js:77EventEmitter.emit @ async.js:112onError @ ng_zone.js:120onHandleError @ ng_zone_impl.js:66ZoneDelegate.handleError @ angular2-polyfills.js:394Zone.runTask @ angular2-polyfills.js:323ZoneTask.invoke @ angular2-polyfills.js:490
browser_adapter.js:77 STACKTRACE:BrowserDomAdapter.logError @ browser_adapter.js:77ExceptionHandler.call @ exception_handler.js:59(anonymous function) @ application_ref.js:265schedulerFn @ async.js:123SafeSubscriber.__tryOrUnsub @ Subscriber.js:225SafeSubscriber.next @ Subscriber.js:174Subscriber._next @ Subscriber.js:124Subscriber.next @ Subscriber.js:88Subject._finalNext @ Subject.js:128Subject._next @ Subject.js:120Subject.next @ Subject.js:77EventEmitter.emit @ async.js:112onError @ ng_zone.js:120onHandleError @ ng_zone_impl.js:66ZoneDelegate.handleError @ angular2-polyfills.js:394Zone.runTask @ angular2-polyfills.js:323ZoneTask.invoke @ angular2-polyfills.js:490
browser_adapter.js:77 Error: Attempt to use a destroyed view: detectChanges
    at ViewDestroyedException.BaseException [as constructor] (http://localhost:3000/packages/modules.js?hash=560db94ec01c0b3e8f499491ffcce7a2ec6c3c5e:3349:23)
    at new ViewDestroyedException (http://localhost:3000/packages/modules.js?hash=560db94ec01c0b3e8f499491ffcce7a2ec6c3c5e:10626:16)
    at DebugAppView.AppView.throwDestroyedError (http://localhost:3000/packages/modules.js?hash=560db94ec01c0b3e8f499491ffcce7a2ec6c3c5e:11277:72)
    at DebugAppView.AppView.detectChanges (http://localhost:3000/packages/modules.js?hash=560db94ec01c0b3e8f499491ffcce7a2ec6c3c5e:11230:18)
    at DebugAppView.detectChanges (http://localhost:3000/packages/modules.js?hash=560db94ec01c0b3e8f499491ffcce7a2ec6c3c5e:11321:44)
    at ViewRef_.detectChanges (http://localhost:3000/packages/modules.js?hash=560db94ec01c0b3e8f499491ffcce7a2ec6c3c5e:11011:65)
    at http://localhost:3000/app/app.js?hash=323b1216814e80ed467d95bcda255eb217d7c468:2224:23
    at ZoneDelegate.invokeTask (http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:4721:174)
    at Object.onInvokeTask (http://localhost:3000/packages/modules.js?hash=560db94ec01c0b3e8f499491ffcce7a2ec6c3c5e:9393:41)
    at ZoneDelegate.invokeTask (http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:4721:72)
  -------------   Elapsed: 80 ms; At: Wed Jun 15 2016 20:22:09 GMT-0700 (PDT)   -------------  
    at Object.onScheduleTask (http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:5734:30)
    at ZoneDelegate.scheduleTask (http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:4704:57)
    at Zone.scheduleMacroTask (http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:4652:47)
    at http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:4467:37
    at setTimeout (eval at createNamedFn (http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:5346:24), &amp;lt;anonymous&amp;gt;:3:37)
    at new TopNavbarComponent (http://localhost:3000/app/app.js?hash=323b1216814e80ed467d95bcda255eb217d7c468:2221:9)
    at DebugAppView._View_HomeComponent0.createInternal (HomeComponent.template.js:48:34)
    at DebugAppView.AppView.create (http://localhost:3000/packages/modules.js?hash=560db94ec01c0b3e8f499491ffcce7a2ec6c3c5e:11098:21)
  -------------   Elapsed: 2 ms; At: Wed Jun 15 2016 20:22:09 GMT-0700 (PDT)   -------------  
    at Object.onScheduleTask (http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:5734:30)
    at ZoneDelegate.scheduleTask (http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:4704:57)
    at Zone.scheduleMicroTask (http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:4649:47)
    at scheduleResolveOrReject (http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:4928:22)
    at resolvePromise (http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:4893:29)
    at http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:4930:25
    at ZoneDelegate.invokeTask (http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:4721:174)
    at Object.onInvokeTask (http://localhost:3000/packages/modules.js?hash=560db94ec01c0b3e8f499491ffcce7a2ec6c3c5e:9393:41)
  -------------   Elapsed: 0 ms; At: Wed Jun 15 2016 20:22:09 GMT-0700 (PDT)   -------------  
    at Object.onScheduleTask (http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:5734:30)
    at ZoneDelegate.scheduleTask (http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:4704:57)
    at Zone.scheduleMicroTask (http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:4649:47)
    at scheduleResolveOrReject (http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:4928:22)
    at ZoneAwarePromise.then (http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:5011:25)
    at RuntimeCompiler.resolveComponent (http://localhost:3000/packages/modules.js?hash=560db94ec01c0b3e8f499491ffcce7a2ec6c3c5e:40230:14)
    at DynamicComponentLoader_.loadNextToLocation (http://localhost:3000/packages/modules.js?hash=560db94ec01c0b3e8f499491ffcce7a2ec6c3c5e:10788:31)
    at RouterOutlet.activate (http://localhost:3000/packages/modules.js?hash=560db94ec01c0b3e8f499491ffcce7a2ec6c3c5e:26844:26)
  -------------   Elapsed: 0 ms; At: Wed Jun 15 2016 20:22:09 GMT-0700 (PDT)   -------------  
    at Object.onScheduleTask (http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:5734:30)
    at ZoneDelegate.scheduleTask (http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:4704:57)
    at Zone.scheduleMicroTask (http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:4649:47)
    at scheduleResolveOrReject (http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:4928:22)
    at resolvePromise (http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:4893:29)
    at http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:4877:21
    at ZoneDelegate.invoke (http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:4696:161)
    at Object.onInvoke (http://localhost:3000/packages/modules.js?hash=560db94ec01c0b3e8f499491ffcce7a2ec6c3c5e:9402:41)
  -------------   Elapsed: 0 ms; At: Wed Jun 15 2016 20:22:09 GMT-0700 (PDT)   -------------  
    at Object.onScheduleTask (http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:5734:30)
    at ZoneDelegate.scheduleTask (http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:4704:57)
    at Zone.scheduleMicroTask (http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:4649:47)
    at scheduleResolveOrReject (http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:4928:22)
    at resolvePromise (http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:4893:29)
    at http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:4877:21
    at ZoneDelegate.invoke (http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:4696:161)
    at Object.onInvoke (http://localhost:3000/packages/modules.js?hash=560db94ec01c0b3e8f499491ffcce7a2ec6c3c5e:9402:41)
  -------------   Elapsed: 0 ms; At: Wed Jun 15 2016 20:22:09 GMT-0700 (PDT)   -------------  
    at Object.onScheduleTask (http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:5734:30)
    at ZoneDelegate.scheduleTask (http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:4704:57)
    at Zone.scheduleMicroTask (http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:4649:47)
    at scheduleResolveOrReject (http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:4928:22)
    at resolvePromise (http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:4893:29)
    at http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:4930:25
    at ZoneDelegate.invokeTask (http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:4721:174)
    at Object.onInvokeTask (http://localhost:3000/packages/modules.js?hash=560db94ec01c0b3e8f499491ffcce7a2ec6c3c5e:9393:41)
  -------------   Elapsed: 1 ms; At: Wed Jun 15 2016 20:22:09 GMT-0700 (PDT)   -------------  
    at Object.onScheduleTask (http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:5734:30)
    at ZoneDelegate.scheduleTask (http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:4704:57)
    at Zone.scheduleMicroTask (http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:4649:47)
    at scheduleResolveOrReject (http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:4928:22)
    at ZoneAwarePromise.then (http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:5011:25)
    at http://localhost:3000/packages/modules.js?hash=560db94ec01c0b3e8f499491ffcce7a2ec6c3c5e:26895:53
    at http://localhost:3000/packages/meteor.js?hash=ae8b8affa9680bf9720bd8f7fa112f13a62f71c3:1105:22
    at ZoneDelegate.invoke (http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:4696:161)
  -------------   Elapsed: 0 ms; At: Wed Jun 15 2016 20:22:09 GMT-0700 (PDT)   -------------  
    at Object.onScheduleTask (http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:5734:30)
    at ZoneDelegate.scheduleTask (http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:4704:57)
    at Zone.scheduleMicroTask (http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:4649:47)
    at scheduleResolveOrReject (http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:4928:22)
    at resolvePromise (http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:4893:29)
    at http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:4877:21
    at http://localhost:3000/packages/meteor.js?hash=ae8b8affa9680bf9720bd8f7fa112f13a62f71c3:1105:22BrowserDomAdapter.logError @ browser_adapter.js:77ExceptionHandler.call @ exception_handler.js:60(anonymous function) @ application_ref.js:265schedulerFn @ async.js:123SafeSubscriber.__tryOrUnsub @ Subscriber.js:225SafeSubscriber.next @ Subscriber.js:174Subscriber._next @ Subscriber.js:124Subscriber.next @ Subscriber.js:88Subject._finalNext @ Subject.js:128Subject._next @ Subject.js:120Subject.next @ Subject.js:77EventEmitter.emit @ async.js:112onError @ ng_zone.js:120onHandleError @ ng_zone_impl.js:66ZoneDelegate.handleError @ angular2-polyfills.js:394Zone.runTask @ angular2-polyfills.js:323ZoneTask.invoke @ angular2-polyfills.js:490
Subscriber.js:229 Uncaught Attempt to use a destroyed view: detectChanges
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;상단-내브바.구성요소.ts&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&quot;use strict&quot;;
import {Logger} from &quot;../services/logger.service&quot;;
import {Component, ChangeDetectionStrategy, ChangeDetectorRef} from '@angular/core';
import {User} from &quot;../models/user&quot;;
import {Router} from '@angular/router-deprecated';
import {UserService} from &quot;../services/user.service&quot;;
import {CORE_DIRECTIVES} from '@angular/common';
import {DROPDOWN_DIRECTIVES} from '../../node_modules/ng2-bootstrap';

@Component({
    selector: 'top-navbar',
    templateUrl: 'client/top-navbar/top-navbar.html',
    bindings: [UserService, Logger],
    directives: [CORE_DIRECTIVES, DROPDOWN_DIRECTIVES]
})

export class TopNavbarComponent {

    public user:User;

    public statusDropdown = {
        isOpen: false
    };

    constructor(private userService:UserService, private router:Router, private logger:Logger, private ref:ChangeDetectorRef) {
        setTimeout(() =&amp;gt; {
            this.ref.markForCheck();
            this.user = this.userService.getLoggedInUser();
            this.ref.detectChanges();
        }, 0)
    }

    logout() {
        this.logger.warn('[Top Navbar] Logging out the user.');
        localStorage.clear();
        this.router.navigateByUrl('/login');
    }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여기가 제 login.component.ts 입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&quot;use strict&quot;;
import { Component, ChangeDetectionStrategy, ChangeDetectorRef } from '@angular/core';
import { FormBuilder, ControlGroup, Validators } from '@angular/common';
import { MeteorComponent } from 'angular2-meteor';
import { Router } from '@angular/router-deprecated';
import { Logger } from &quot;../services/logger.service&quot;;

@Component({
    selector: 'login',
    templateUrl: 'client/login/login.html',
    changeDetection: ChangeDetectionStrategy.OnPush,
    bindings: [Logger]
})

export class LoginComponent extends MeteorComponent {

    loginForm:ControlGroup;
    loginFailed = false;

    constructor(private _logger:Logger, private _router:Router, private ref:ChangeDetectorRef) {
        super();
        let fb = new FormBuilder();
        this.loginForm = fb.group({
            username: [&quot;&quot;, Validators.required],
            password: [&quot;&quot;, Validators.required]
        });
    }

    login() {


        this.call('authenticateUser', this.loginForm.value.username, this.loginForm.value.password, (err, data) =&amp;gt; {

            if (err) {
                this._logger.error(err);

            } else {
                this._logger.info('[Authentication API] ', data);

                if (data.status != 'LOGIN_SUCCESS') {
                    this.loginFailed = true;

                } else {
                    this.loginFailed = false    ;
                    var user = {
                        id: data.id,
                        name: data.name,
                        role: data.role
                    }
                    localStorage.setItem('user', JSON.stringify(user));
                    this._router.navigate(['Home'])
                }
                //This is required for letting Angular know that something has changed.
                //Because this part of code runs out of Angular zone.
                this.ref.markForCheck();  // Mark this component and its children for change detection in next detecting cycle.
                this.ref.detectChanges(); // Trigger change detection.

            }

        });
    }
}
&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;if (!this.changeDetectionRef['destroyed']) {
    this.changeDetectionRef.detectChanges();
}
&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;detectChanges()&lt;/code&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;implements OnDestroy&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;, 그 다음에 당신은 다음과 같은 변경을 취소해야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;this.ref.detectChanges()&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;TopNavbarComponent&lt;/code&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;export class TopNavbarComponent implements OnDestroy {
  // ... your code

  ngOnDestroy() {
    this.cdRef.detach(); // do this

    // for me I was detecting changes using `detectChanges()` inside a subscription with `subscribe()` to observable without limitation, so was enough for me to just `unsubscribe()` like the following line;
    // this.authObserver.unsubscribe();
  }
}
&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;unsubscribe()&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/questions/38008334&quot;&gt;각/RxJs&lt;/a&gt; 언제&lt;a href=&quot;https://stackoverflow.com/questions/38008334&quot;&gt; 구독을 취소해야 합니까?&lt;/a&gt;를 참조하십시오.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;편집&lt;/strong&gt;: 웹에서 오류 자체를 처리하여 문제를 해결하려는 다른 솔루션은 알고 있지만 가장 좋은 방법은 문제의 근본을 아는 것입니다. 보기가 파괴되었는지 여부를 확인하는 것이 원래 원인은 메모리 누출의 문제가 될 수 있으므로 좋은 솔루션인지 확인하는 것입니다. 누가 알겠어요! 그래서 문제의 근본은 서비스 ne를 실행하는 것입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;삭제할 eds 문제의 근본을 모른 채 오류 자체를 삭제하려고만 하는 것이 아닙니다. 예를 들어 실행 중인 구독(특히 사용자 지정 구독)을 닫아야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그래서! 집안일을 하는 것은 더 나은 성능을 위해 필요합니다. 항상 더 쉽고 빠른 해결책이 더 좋은 해결책은 아닙니다. 카펫 밑에 먼지를 숨긴다고 해서 방이 정말 멋져 보인다고 해서 &quot;청소&quot;를 하는 것은 아닙니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사용가능&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;this.cdref.markForCheck(); &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;this.cdref.detectChanges(); &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;하지만 가장 좋은 방법은 @Al-Mothafar 팁을 따르는 것입니다.&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 (!(&amp;lt;ViewRef&amp;gt;this.cd).destroyed) {
   this.cd.detectChanges();
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;ChangeDetectorRef OnDestroy 라이프사이클 후크를 분리하고 DetectChanges 메서드를 실행하기 전에 ChangeDetectorRef가 파괴되었는지 확인하기만 하면 됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;    constructor(private cd: ChangeDetectorRef){}

    someFunction(){
      if(!this.cd['destroyed']){
        this.cd.detectChanges();
      }
    }

    ngOnDestroy(){
      this.cd.detach();
    }
&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;import { Component, OnInit, ChangeDetectionStrategy, ChangeDetectorRef, OnDestroy } from '@angular/core';
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/observable/of';
import { Cartservice } from './../cartservice.service';
import { ISubscription } from 'rxjs/Subscription';



export class CartComponent implements OnInit, OnDestroy {

private subscription: ISubscription;
ngOnInit() {
    this.subscription = this.cartservice.productsObservable.subscribe(cart =&amp;gt; {
      this.cartProducts = cart.products;
      this.cartTotal = cart.cartTotal;
      this.changeDetectorRef.detectChanges();
    });
  }

 ngOnDestroy() {
    this.subscription.unsubscribe();
  }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;methodOnDestroy()의 변경사항을 등록 취소했습니다.&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;ngOnInit() {
     this._currentUserSubscription = this._auth.currentUser.subscribe(currentUser =&amp;gt; {});
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;changeDetector.detach()를 사용한 구독 취소:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;ngOnDestroy() {
    this._currentUserSubscription.unsubscribe();
    this._cdRef.detach();
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그것은 제 코드에 꼭 필요한 것이었습니다. 저는 ChangeDetectorRef 기능도 사용해야 하는데, 그 두 가지만 오류 없이 제 코드를 보여줍니다.&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;내 원인은 NgbActiveModal로 모달 대화를 열려고 할 때 발생했습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;전화를 건 것 같습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;.dismiss()&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;자체적으로&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ngOnInit()&lt;/code&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;export class MyModal {
    constructor(private modalInstance: NgbActiveModal) {
    }

    ngOnInit() {
       if (foo) this.modalInstance.dismiss();
    }
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;해결책은 해고 전에 잠깐 기다리는 것이었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;if (foo) setTimeout(() =&amp;gt; this.modalInstance.dismiss());&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;ngOnInit() {
    if (this.destroyedComponent) this.changeDetector.reattach();

this.destroyedComponent = false;
this.subscription = this.reactive.channel$.subscribe(msg =&amp;gt; {
  switch (msg) {
    case &quot;config:new_data&quot;:
      if (!this.destroyedComponent) {
        this.table.initTable();
        this.changeDetector.detectChanges();
      }
  }
})
}

ngOnDestroy() {
   this.subscription = null;
   this.destroyedComponent = true;
   this.changeDetector.detach();
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;설명:&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;구성요소가 이전에 파괴된 경우 디텍터를 다시 부착합니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이전 플래그를 거짓 값으로 설정합니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;RxJs 구독을 저장하고 원하는 논리를 내부에 설정합니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;구성 요소가 이전에 선언된 플래그에 의해 파괴된 것으로 설정되었는지 여부를 확인하는 조건으로 해당 로직을 래핑합니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;해당 블록 내부의 변경사항을 원하는 대로 탐지합니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;ngOnDestroy() 메서드를 설정하고 구독을 무효화한 다음 destroyComponent 플래그를 truth 값으로 설정하고 changeDetector를 분리합니다.&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;ol&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;오류 코드에 &lt;a href=&quot;https://basarat.gitbooks.io/typescript/docs/async-await.html&quot; rel=&quot;nofollow noreferrer&quot;&gt;TypeScript Async/Await&lt;/a&gt;을 사용하는 각() 앞에 단수 비동기가 있었습니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;작동시키기 위해 각() 이전에 두 개를 사용하고 있는데, 첫 번째는 각()의&lt;a href=&quot;https://angular.io/guide/testing#the-first-asynchronous-beforeeach&quot; rel=&quot;nofollow noreferrer&quot;&gt; 비동기()&lt;/a&gt;를 사용하여 비동기를 처리하고, 두 &lt;a href=&quot;https://angular.io/guide/testing#the-second-synchronous-beforeeach&quot; rel=&quot;nofollow noreferrer&quot;&gt;번째&lt;/a&gt;는 각&lt;a href=&quot;https://angular.io/guide/testing#the-second-synchronous-beforeeach&quot; rel=&quot;nofollow noreferrer&quot;&gt;()&lt;/a&gt;이 &lt;a href=&quot;https://angular.io/guide/testing#the-second-synchronous-beforeeach&quot; rel=&quot;nofollow noreferrer&quot;&gt;동기화되기 전&lt;/a&gt;에 사용합니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;코드가 오류를 일으킵니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;beforeEach(async () =&amp;gt; {
    await TestBed.configureTestingModule({
        imports: [
            BrowserAnimationsModule
        ],
        providers: [
            { provide: ComponentFixtureAutoDetect, useValue: true },
            { provide: OptionsService, useValue: optionServiceMock },
        ],
        declarations: [EventLogFilterComponent],
        schemas: [NO_ERRORS_SCHEMA]
    }).compileComponents();
    fixture = TestBed.createComponent(EventLogFilterComponent);
    component = fixture.componentInstance;
    optionsService = TestBed.get(OptionsService);
    component.filterElem = jasmine.createSpyObj('filterElem', ['close']);
    fixture.detectChanges();
});
&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;beforeEach(async(() =&amp;gt; {
    TestBed.configureTestingModule({
        imports: [
            BrowserAnimationsModule
        ],
        providers: [
            { provide: ComponentFixtureAutoDetect, useValue: true },
            { provide: OptionsService, useValue: optionServiceMock },
        ],
        declarations: [EventLogFilterComponent],
        schemas: [NO_ERRORS_SCHEMA]
    }).compileComponents();
}));

beforeEach(() =&amp;gt; {
    fixture = TestBed.createComponent(EventLogFilterComponent);
    component = fixture.componentInstance;
    optionsService = TestBed.get(OptionsService);
    component.filterElem = jasmine.createSpyObj('filterElem', ['close']);
    fixture.detectChanges();
});
&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;fixture.detectChanges()&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;안에서.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;fixture.whenStable().then(() =&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;async&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;기능.&lt;/font&gt;&lt;/font&gt;&lt;/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;it('should...', () =&amp;gt; {
  fixture.whenStable().then(() =&amp;gt; {
    fixture.detectChanges();
  });
});
&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;it('should...', async(() =&amp;gt; {
  fixture.whenStable().then(() =&amp;gt; {
    fixture.detectChanges();
  });
}));
&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;&amp;lt;child-component
    *ngIf=&quot;childComponentIsShown&quot;
    (formCloseEmitter)=&quot;hideChildComponent()&quot;
&amp;gt;&amp;lt;/child-component&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고 상위 구성요소에서 &quot;hideChildComponent()&quot; 메서드가 변경 사항을 감지합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;hideChildComponent() {
  this.childComponentIsShown = false;
  this.cdr.detectChanges();
}
&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;이 오류를 방지하려면 detectChanges()를 호출하는 대신 다음과 같이 코드를 변경하는 모델을 래핑합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;this.ngZone.run(() =&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;import { OnDestroy } from '@angular/core';
import { Subject } from 'rxjs/Subject';

export class Component implements OnDestroy {
    componentDestroyed: Subject&amp;lt;boolean&amp;gt; = new Subject();

constructor() { }

function() {
   this.service.serviceFunction
     .takeUntil(this.componentDestroyed)
     .subscribe((incomingObservable: Type) =&amp;gt; {
       this.variable = incomingObservable;
     });
  }

ngOnDestroy() {
   this._cdRef.detach(); //If you use change dectector
   this.componentDestroyed.next(true);
   this.componentDestroyed.complete();
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;지연 매개변수 없이 setTimeout을 사용해 봅니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;모델 업데이트가 끝난 후 변경 사항을 지연 없이 설정하는 것은 까다로운 방법이기 때문에 저에게는 잘 작동했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;setTimeout(() =&amp;gt; {
   if (!this.ref['destroyed']) {
      this.ref.detectChanges();
   }   
});
&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/37849453/attempt-to-use-a-destroyed-view-detectchanges&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>Angular</category>
      <author>css3</author>
      <guid isPermaLink="true">https://css3.tistory.com/1157</guid>
      <comments>https://css3.tistory.com/1157#entry1157comment</comments>
      <pubDate>Mon, 6 Nov 2023 21:59:04 +0900</pubDate>
    </item>
    <item>
      <title>쿼리 인덱스를 최적화하는 이상한 동작(MariaDB + InnoDB)</title>
      <link>https://css3.tistory.com/1156</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;쿼리 인덱스를 최적화하는 이상한 동작(MariaDB + InnoDB)&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;서버에서 MariaDB 버전 10.1.26-MariaDB-0+deb9u1을 실행하고 있으며 다음 구성 옵션이 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;key_buffer_size         = 5G
max_allowed_packet      = 16M
thread_stack            = 192K
thread_cache_size       = 8

myisam_sort_buffer_size = 512M
read_buffer_size        = 2M
read_rnd_buffer_size    = 1M

query_cache_type = 0
query_cache_limit = 256K
query_cache_min_res_unit = 2k
query_cache_size = 0M

join_buffer_size = 8M
sort_buffer_size = 8M
tmp_table_size = 64M
max_heap_table_size = 64M
table_open_cache = 4K
performance_schema = ON
innodb_buffer_pool_size = 30G
innodb_log_buffer_size = 4MB
innodb_log_file_size = 1G
innodb_buffer_pool_instances = 10
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;테이블 모양에는 최대 &lt;strong&gt;12.1&lt;/strong&gt;까지 합하여 약&lt;strong&gt; 680만 개&lt;/strong&gt;의 행이 포함되어 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;GB&lt;/strong&gt;이며 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;CREATE TABLE `ad_master_test` (
    `ID_AD_MASTER` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
    /* Some more attribute fields (mainly integers) ... */
    `FK_KAT` BIGINT(20) UNSIGNED NOT NULL,
    /* Some more content fields (mainly varchars/integers) ... */
    `STAMP_START` DATETIME NULL DEFAULT NULL,
    `STAMP_END` DATETIME NULL DEFAULT NULL,
    PRIMARY KEY (`ID_AD_MASTER`),
    INDEX `TEST1` (`STAMP_START`, `FK_KAT`),
    INDEX `TEST2` (`FK_KAT`, `STAMP_START`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
ROW_FORMAT=DYNAMIC
AUTO_INCREMENT=14149037;
&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;저는 여기서 제 문제를 설명하기 위해 FORCE INDEX를 사용하고 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 첫&lt;strong&gt; 번째 인덱스&lt;/strong&gt;는 설명문을 사용하여 최적화되었으며 (설명 출력과 관련하여) 상당히 유망해 보입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;SELECT * 
FROM `ad_master_test`
FORCE INDEX (TEST1)
WHERE FK_KAT IN
    (94169,94163,94164,94165,94166,94167,94168,94170,94171,94172,
     94173,94174,94175,94176,94177,94162,99606,94179,94180,94181,
     94182,94183,94184,94185,94186,94187,94188,94189,94190,94191,
     94192,94193,94194,94195,94196,94197,94198,94199,94200,94201,
     94202,94203,94204,94205,94206,94207,94208,94209,94210,94211,
     94212,94213,94214,94215,94216,94217,94218,94219,94220,94221,
     94222,94223,94224,94225,94226,94227,94228,94229,94230,94231,
     94232,94233,94234,94235,94236,94237,94238,94239,94240,94241,
     94178,94161)

ORDER BY STAMP_START DESC
LIMIT 24
&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;id     select_type   table            type     possible_keys   key     key_len    ref        rows      Extra
1      SIMPLE        ad_master_test   index    (NULL)          TEST1   14         (NULL)     24        Using where
&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;Status                  Duration
starting                0.000180
checking permissions    0.000015
Opening tables          0.000041
After opening tables    0.000013
System lock             0.000011
Table lock              0.000013
init                    0.000115
optimizing              0.000044
statistics              0.000050
preparing               0.000039
executing               0.000009
Sorting result          0.000016
Sending data            4.827512
end                     0.000023
query end               0.000008
closing tables          0.000004
Unlocking tables        0.000014
freeing items           0.000011
updating status         0.000132
cleaning up             0.000021
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;두 &lt;strong&gt;번째 인덱스&lt;/strong&gt;는 필드가 뒤바뀐 것입니다(여기서는 &lt;strong&gt;https://dev.mysql.com/doc/refman/8.0/en/order-by-optimization.html&lt;/strong&gt; ). 이는 꽤 끔찍해 보입니다(설명 출력 &lt;strong&gt;regarding&lt;/strong&gt;).&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;SELECT * 
FROM `ad_master_test`
FORCE INDEX (TEST2)
WHERE FK_KAT IN (94169,94163,94164,94165,94166,94167,94168,94170,94171,94172,94173,94174,94175,94176,94177,94162,99606,94179,94180,94181,94182,94183,94184,94185,94186,94187,94188,94189,94190,94191,94192,94193,94194,94195,94196,94197,94198,94199,94200,94201,94202,94203,94204,94205,94206,94207,94208,94209,94210,94211,94212,94213,94214,94215,94216,94217,94218,94219,94220,94221,94222,94223,94224,94225,94226,94227,94228,94229,94230,94231,94232,94233,94234,94235,94236,94237,94238,94239,94240,94241,94178,94161)
ORDER BY STAMP_START DESC
LIMIT 24
&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;id     select_type   table            type     possible_keys   key     key_len    ref        rows      Extra
1      SIMPLE        ad_master_test   range    TEST2           TEST2   8          (NULL)     497.766   Using index condition; Using filesort
&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;Status                 Duration
starting               0.000087
checking permissions   0.000007
Opening tables         0.000021
After opening tables   0.000007
System lock            0.000006
Table lock             0.000005
init                   0.000058
optimizing             0.000023
statistics             0.000654
preparing              0.000480
executing              0.000008
Sorting result         0.433607
Sending data           0.001681
end                    0.000010
query end              0.000007
closing tables         0.000003
Unlocking tables       0.000011
freeing items          0.000010
updating status        0.000158
cleaning up            0.000021
&lt;/code&gt;&lt;/pre&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;strong&gt;경우 다음&lt;/strong&gt;과 같이 변경됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;id     select_type   table            type     possible_keys   key     key_len    ref        rows      Extra
1      SIMPLE        ad_master_test   index    TEST2           TEST1   14         (NULL)     345       Using where
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;프로파일 및 런타임은 TEST1 인덱스에서 FORCE INDEX를 사용할 때와 동일하게 유지됩니다(예상대로).&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;/편집&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 솔직히 머리를 싸매지 못합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;설명과 실제 쿼리 성능이 크게 다른 이유는 무엇입니까?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;5초 &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;TEXT&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아니면&lt;/font&gt;&lt;/font&gt;&lt;code&gt;BLOB&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;또는 심지어 큰&lt;/font&gt;&lt;/font&gt;&lt;code&gt;VARCHAR&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;12.1GB/6.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;8M = 1.8KB.&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;두 지수는 (4.8초 대 0.4초) 다른 시간이 소요되는 것으로 보입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;(&lt;/font&gt;&lt;/font&gt;&lt;code&gt;STAMP_START&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;FK_KAT&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;)&lt;/font&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이렇게 하면 인덱스 B트리를 원하는 순서로 스캔하여 &quot;파일 정렬&quot;을 방지할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그것은 일치하는 fk_kat에 대해 모든 항목을 확인해야 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;24시 이후에 멈출 것 같습니다(참조).&lt;/font&gt;&lt;/font&gt;&lt;code&gt;LIMIT&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;행이 일치하지만 처음 24개(빠름), 마지막 24개(매우 느림) 또는 그 사이에 있을 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;(&lt;/font&gt;&lt;/font&gt;&lt;code&gt;FK_KAT&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;STAMP_START&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;)&lt;/font&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 쇼는 82개의 모든 ID로 직접 이동하여 각각의 ID를 스캔하고(유일하지 않다고 가정), 수백 개의 행을 수집합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그런 다음 &quot;파일 정렬&quot;을 수행합니다. (참고: 디스크 정렬이 있는 경우 디스크 정렬이 됩니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;TEXT&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;그럼 처음 24개를 전달해주세요. (이런, MariaDB 10.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;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;key_buffer_size = 20G&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;하지만 만약 그렇다면, 이것을 RAM의 10%로 바꾸세요.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그렇지 않으면 다음으로 바꿉니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;30M&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;RAM의 70%를 제공합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;innodb_buffer_pool_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;/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;EXPLAIN FORMAT=JSON SELECT ...&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;각각의 질의에 대해&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것은 왜 더 나쁜 지수를 선택했는지를 설명하는 &quot;비용&quot; 분석을 하게 될 것입니다.&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;SELECT *&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;, 타이밍을 조절하고 그리고&lt;/font&gt;&lt;/font&gt;&lt;code&gt;EXPLAINs&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;단번에&lt;/font&gt;&lt;/font&gt;&lt;code&gt;SELECT ID_AD_MASTER&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;. &quot;빠름&quot;이 입증되면 쿼리를 재구성하여 다음과 같이 처리합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;SELECT b.*   -- (or selected columns from `b`)
    FROM ( SELECT ID_AD_MASTER FROM ... ) AS a
    JOIN ad_master_test AS b  USING(ad_master_test)
    ORDER BY STAMP_START DESC ;   -- (yes, repeat the ORDER BY)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;my.cnf [mysqld] 섹션(RPS는 Rate Per Second)에 고려할 제안&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;thread_handling=pool-of-threads  # from one-thread-per-connection see refman
max_connections=100  # from 151 because max_used_connections &amp;lt; 60
read_rnd_buffer_size=256K  # from 1M to reduce RAM used, &amp;lt; handler_read_rnd_next RPS
aria_pagecache_division_limit=50  # from 100 for WARM cache for &amp;lt; aria_pagecache_reads RPS
key_cache_division_limit=50  # from 100 for WARM cache for &amp;lt; key_reads
key_buffer_size=2G  # from 5G  Mysqltuner reports 1G used (this could be WRONG-test it)
innodb_io_capacity=30000  # from 200 since you have SSD
innodb_buffer_pool_instances=8  # from 16 for your volume of data
innodb_lru_scan_depth=128  # from 1024 to conserve CPU every SECOND see refman
innodb_buffer_pool_size=36G  # from 30G for effective size of 32G when
innodb_change_buffer_pool_size=10  # from 25% set aside for Del,Ins,Upd activities
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Skype ID를 포함한 연락처 정보를 보려면 프로필, 네트워크 프로필을 확인하십시오.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;구성을 개선할 수 있는 추가적인 기회가 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;조언을 하루에 한 번만 변경하고, 긍정적인 결과가 나오면 다음 제안으로 넘어갑니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그렇지 않으면 심각한 결과와 어떤 변화가 문제를 일으켰는지 알려주시기 바랍니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;분석&lt;/font&gt;&lt;/font&gt;&lt;code&gt;VARIABLES&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;GLOBAL STATUS&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;관측치:&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;버전: 10.1.26-MariaDB-0+deb9u1&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;64GB의 RAM&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;가동시간 = 7d 22:50:19&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Windows에서 실행되고 있지 않습니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;64비트 버전 실행 중&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;전체(또는 대부분) InnoDB를 실행하고 있는 것 같습니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&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;&quot;로드 평균&quot;이 1(또는 그 이상)이면 일반적으로 비효율적인 쿼리를 나타냅니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이는 다음에 대한 큰 값으로 더욱 확인할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Created_tmp_disk_tables&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Handler_read_rnd_next&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&quot;단순히&quot; 초당 91개의 쿼리를 수행할 수 있습니다.&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://mysql.rjweb.org/doc.php/mysql_analysis#slow_queries_and_slowlog&quot; rel=&quot;nofollow noreferrer&quot;&gt;&lt;em&gt;권장&lt;/em&gt;&lt;/a&gt; 사항을 참조하십시오.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;thread_cache_size = 20&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;My ISAM을 없앴으니 이렇게 크게 할 필요가 없습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;key_buffer_size&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;; 5G에서 5M로 감소합니다.&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;ROW_FORMAT=COMPRESSED&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;압축/압축 해제를 위한 CPU 증가 및 추가 buffer_pool 공간이 필요합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;반면에.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;GLOBAL STATUS&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;는 30GB가 &quot;너무 작음&quot;을 나타내지 않습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;디스크 공간 사용을 줄일 필요가 있습니까?&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;최적화 기능을 꺼 놓으셨습니까?&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;code&gt;( (key_buffer_size - 1.2 * Key_blocks_used * 1024) / _ram ) = (5120M - 1.2 * 25 * 1024) / 65536M = 7.8%&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;-- key_buffer에서 낭비된 RAM 비율입니다. -- key_buffer_size를 줄입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;( Key_blocks_used * 1024 / key_buffer_size ) = 25 * 1024 / 5120M = 0.00%&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;-- key_buffer 사용 비율입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하이워터마크. -- 불필요한 메모리 사용을 방지하기 위해 키_버퍼_크기를 낮춥니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;( innodb_buffer_pool_size / _ram ) = 30720M / 65536M = 46.9%&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;-- InnoDB 버퍼_pool에 사용된 RAM 비율(%)&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;( table_open_cache ) = 4,096&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;-- 캐시할 테이블 설명자 수 -- 일반적으로 수백 개가 좋습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;( Innodb_os_log_written / (Uptime / 3600) / innodb_log_files_in_group / innodb_log_file_size ) = 6,714,002,432 / (687019 / 3600) / 2 / 1024M = 0.0164&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;-- 비율 -- (분 참조)&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;( Uptime / 60 * innodb_log_file_size / Innodb_os_log_written ) = 687,019 / 60 * 1024M / 6714002432 = 1,831&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;-- InnoDB 로그 회전 간격 분 5.6.8부터는 동적으로 변경할 수 있습니다. my.cnf도 변경해야 합니다. -- (회전 간격 60분 권장 사항은 다소 자의적입니다.)&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;innodb_log_file_size 조정 (AWS에서는 변경 불가)&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;( default_tmp_storage_engine ) = default_tmp_storage_engine =&lt;/code&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;( Innodb_rows_deleted / Innodb_rows_inserted ) = 1,319,619 / 2015717 = 0.655&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;-- 전환 - &quot;대기열에 넣지 말고 그냥 해.&quot; (MySQL이 대기열로 사용되는 경우)&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;( innodb_thread_concurrency ) = 0&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;-- 0 = InnoDB가 currency_tickets에 가장 적합한 항목을 결정하도록 합니다. -- 0 또는 64로 설정합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러면 CPU가 줄어들 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;( innodb_print_all_deadlocks ) = innodb_print_all_deadlocks = OFF&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;code&gt;( innodb_buffer_pool_populate ) = OFF = 0&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;-- NUMA 제어&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;( query_prealloc_size / _ram ) = 24,576 / 65536M = 0.00%&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;램(RAM)의 pct&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;( query_alloc_block_size / _ram ) = 16,384 / 65536M = 0.00%&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;램(RAM)의 pct&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;( net_buffer_length / max_allowed_packet ) = 16,384 / 16M = 0.10%&lt;/code&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;( bulk_insert_buffer_size / _ram ) = 8M / 65536M = 0.01%&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;-- 다중 행 INSERT 및 LOAD DATA의 버퍼 - 너무 크면 RAM 크기가 위협받을 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;너무 작으면 그러한 작업이 방해될 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;( Created_tmp_tables ) = 19,436,364 / 687019 = 28 /sec&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;-- 복잡한 SELECT의 일부로 &quot;temp&quot; 테이블을 만드는 빈도입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;( Created_tmp_disk_tables ) = 17,887,832 / 687019 = 26 /sec&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;-- tmp_table_size 증가 및 max_heap_table_size 증가와 같은 복잡한 SELECT의 일부로 &lt;em&gt;디스크&lt;/em&gt; &quot;temp&quot; 테이블을 만드는 빈도입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;MyISAM 대신 MEMORY를 사용할 때의 온도 테이블 규칙을 확인합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사소한 스키마나 쿼리 변경으로 MyISAM을 피할 수도 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;더 나은 인덱스와 쿼리 재구성이 도움이 될 가능성이 높습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;( Created_tmp_disk_tables / Questions ) = 17,887,832 / 62591791 = 28.6%&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;-- 디스크에 있는 tmp 테이블이 필요한 쿼리의 pct. -- 더 나은 인덱스 / no blobs / 등입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;( Created_tmp_disk_tables / Created_tmp_tables ) = 17,887,832 / 19436364 = 92.0%&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;-- 디스크에 흘린 임시 테이블의 백분율 -- tmp_table_size 및 max_heap_table_size를 늘리거나 인덱스를 개선하거나 blob을 방지할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;( tmp_table_size ) = 64M&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;-- RAM 부족을 방지하기 위해 SELECT -- Reduction tmp_table_size를 지원하는 데 사용되는 &lt;em&gt;메모리&lt;/em&gt; 온도 테이블 크기 제한.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아마도 64M 이상은 아닐 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;( Handler_read_rnd_next ) = 703,386,895,308 / 687019 = 1023824 /sec&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;-- 테이블 검색이 많은 경우 높음 - 부적절한 키일 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;( Handler_read_rnd_next / Com_select ) = 703,386,895,308 / 58493862 = 12,024&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;-- SELECT마다 스캔한 평균 증가율(약) -- read_buffer_size를 높이는 방법을 고려합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;( Select_full_join ) = 15,981,913 / 687019 = 23 /sec&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;-- joins without index - JOIN에 사용되는 테이블에 적합한 인덱스를 추가합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;( Select_full_join / Com_select ) = 15,981,913 / 58493862 = 27.3%&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;-- 인덱스 없는 조인을 선택한 비율(%) - JOIN에 사용되는 테이블에 적합한 인덱스를 추가합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;( Select_scan ) = 1,510,902 / 687019 = 2.2 /sec&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;-- 전체 테이블 검색 - 인덱스 추가/쿼리 최적화(작은 테이블이 아닌 경우)&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;( sort_buffer_size ) = 8M&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;-- 스레드당 하나씩이고 5.6.4까지 풀 사이즈로 배치되므로 낮게 유지하십시오. 그 이후에는 더 큰 것이 좋습니다. 사용 가능한 RAM을 소모하는 것일 수 있습니다. 2M 이하를 권장하지 마십시오.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;( binlog_format ) = binlog_format = STATEMENT&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;ROW가 선호되므로 기본값이 될 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;( slow_query_log ) = slow_query_log = OFF&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;-- 느린 쿼리 기록 여부 (5.1.12)&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;( long_query_time ) = 10&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;-- &quot;느린&quot; 쿼리를 정의하기 위한 컷오프(초) -- 제안 2&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;( Threads_created / Connections ) = 3,081 / 303642 = 1.0%&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;-- 프로세스 생성의 신속성 - 스레드_cache_size 증가(Windows 이외)&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;Connection_errors_peer_address = 2
Handler_icp_attempts = 71206 /sec
Handler_icp_match = 71206 /sec
Handler_read_next / Handler_read_key = 283
Handler_read_prev = 12522 /sec
Handler_read_rnd_deleted = 16 /sec
Innodb_rows_read = 1255832 /sec
Key_blocks_unused = 4.24e+6
Performance_schema_table_instances_lost = 32
Select_range / Com_select = 33.1%
Sort_scan = 27 /sec
Tc_log_page_size = 4,096
innodb_lru_scan_depth / innodb_io_capacity = 5.12
innodb_max_dirty_pages_pct_lwm = 0.10%
max_relay_log_size = 100MB
myisam_sort_buffer_size = 512MB
&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;Compression = ON
innodb_cleaner_lsn_age_factor = HIGH_CHECKPOINT
innodb_empty_free_list_algorithm = BACKOFF
innodb_fast_shutdown = 1
innodb_foreground_preflush = EXPONENTIAL_BACKOFF
innodb_log_checksum_algorithm = INNODB
myisam_stats_method = NULLS_UNEQUAL
opt_s__engine_condition_pushdown = off
opt_s__mrr = off
opt_s__mrr_cost_based = off
&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/51499098/weird-behavior-optimizing-query-indices-mariadb-innodb&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>MariaDB</category>
      <author>css3</author>
      <guid isPermaLink="true">https://css3.tistory.com/1156</guid>
      <comments>https://css3.tistory.com/1156#entry1156comment</comments>
      <pubDate>Mon, 6 Nov 2023 21:58:50 +0900</pubDate>
    </item>
    <item>
      <title>SQL: '좋아요' 함수의 결과에 따라 '그룹화'가 가능합니까?</title>
      <link>https://css3.tistory.com/1155</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;Oracle SQL을 사용하고 있는데 함수 결과가 '좋아요'인 다른 행들을 그룹화하고 싶습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예를 들어 설명하자면:&lt;/font&gt;&lt;/p&gt; 
&lt;hr&gt; 
&lt;p&gt;&lt;em&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제가 테이블 MESA를 가지고 있다고 가정해 보겠습니다. 열 중 하나가 큰 문자열입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고 특정 패턴과 일치하는 행의 수를 세고 있습니다.&lt;/font&gt;&lt;/em&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;SELECT m.str, count(*)
FROM MESA m
WHERE m.str LIKE '%FRUIT%'
AND (m.str LIKE '%APPLE%' OR m.str LIKE '%ORANGE%')
&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;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;과일..afsafafasfaasfa...&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;RED_APPLE 20&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;과일..afsafafasfaasfa...&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;YELLOW_APPLE&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;과일..afsafafasfaasfa...&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그린_APPLE 3&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;과일..afsafafasfaasfa...&lt;/font&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;과일..afsafafasfaasfa...&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;RED_ORANGE 45&lt;/font&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;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;애플 35&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;ORANGE 49&lt;/font&gt;&lt;/p&gt; 
&lt;hr&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이게 가능한가요?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;만약 그렇다면, 어떻게? :)&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;댓글과 코드 스니펫은 대단히 감사합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;추신: 물론 질의와 결과는 위의 예시보다 더 복잡합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그냥 설명의 단순성을 위해서 그렇게 썼어요.&lt;/font&gt;&lt;/p&gt; 
&lt;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;WITH Fruits AS (
    SELECT 
        CASE 
           WHEN m.str LIKE '%APPLE%' THEN 'Apple'
           WHEN m.str LIKE '%ORANGE%' THEN 'Orange' 
        END AS FruitType           
    FROM MESA m
    WHERE m.str LIKE '%FRUIT%')
SELECT FruitType, COUNT(*) 
FROM Fruits
WHERE FruitType IN ('Apple', 'Orange')
GROUP BY FruitType;
&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 
  fruit_name,
  count(1)  as fruit_count
FROM (
  SELECT 
    CASE 
      WHEN m.str LIKE '%APPLE%' THEN 'Apple'
      WHEN m.str LIKE '%ORANGE%' THEN 'Orange' 
    END                                         as fruit_name
  FROM 
    MESA m
  WHERE 
    m.str LIKE '%FRUIT%'
    AND 
    (m.str LIKE '%APPLE%' OR m.str LIKE '%ORANGE%')
)
GROUP BY 
  fruit_name  
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;동일하지만 필요한 경우는 단 한 가지뿐이므로 지원이 단순화됩니다.&lt;/font&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;SELECT count(*) AS 'Apples'
FROM MESA m
WHERE m.str LIKE '%FRUIT%'
AND m.str LIKE '%APPLE%'

SELECT count(*) AS 'Oranges'
FROM MESA m
WHERE m.str LIKE '%FRUIT%'
AND m.str LIKE '%ORANGE%'
&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;SELECT Fruit,
      SUM(counter)
 FROM ( SELECT CASE 
                   WHEN m.str LIKE '%APPLE%'
                       THEN 'APPLE'
                   ELSE 'ORANGE'
               END AS Fruit
               COUNT(*) AS counter
          FROM MESA m 
         WHERE m.str LIKE '%FRUIT%' 
           AND (m.str LIKE '%APPLE%' OR m.str LIKE '%ORANGE%')
         GROUP BY m.str
      )
GROUP BY Fruit
&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;WITH fruits AS (
  SELECT 'APPLE' fruit FROM DUAL
  UNION ALL
  SELECT 'ORANGE' fruit FROM DUAL
)
SELECT fruit, count(*)
FROM MESA m, fruits
WHERE m.str LIKE '%FRUIT%'
AND m.str LIKE '%' || fruits.fruit || '%'
GROUP BY fruit
&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;WHERE m.str LIKE 'FRUIT%' || fruits.fruit ||'%'&lt;/code&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/3299330/sql-is-it-possible-to-group-by-according-to-like-functions-results&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>oracle</category>
      <author>css3</author>
      <guid isPermaLink="true">https://css3.tistory.com/1155</guid>
      <comments>https://css3.tistory.com/1155#entry1155comment</comments>
      <pubDate>Mon, 6 Nov 2023 21:58:40 +0900</pubDate>
    </item>
    <item>
      <title>Android 시스템에서 C/C++ 프로그램을 컴파일하여 실행하는 방법</title>
      <link>https://css3.tistory.com/1154</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Android 시스템에서 C/C++ 프로그램을 컴파일하여 실행하는 방법&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;Q1) 안드로이드 에뮬레이터에서 간단한 c 프로그램을 실행하고 싶습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사용중입니다&lt;/font&gt;&lt;/font&gt;&lt;code&gt;windows xp&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;내 기계에 os가 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;설치했습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;sdk, jdk, eclipse&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;안드로이드 개발용으로 AVD에서 안드로이드 애플리케이션을 실행하는 데 성공했습니다.&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;Q2) (Java 없이) C 프로그램을 실행할 수 있는 방법이 있는지 알고 싶습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;AVD&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;. 제 기계에 암을 설치하고 C 프로그램을 컴파일했습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Q3) 컴파일된 바이너리를 안드로이드 기기로 푸시하는 것이 가능한지도 알고 싶습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;AVD&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Android 장치의 단말기를 사용하여 실행하거나,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;AVD&lt;/code&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;ARM 크로스 컴파일러로 C 프로그램을 컴파일할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;arm-linux-gnueabi-gcc -static -march=armv7-a test.c -o test
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러면 컴파일된 이진 파일을 어딘가로 밀어 넣을 수 있습니다(SD 카드에 넣지 마십시오).&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;adb push test /data/local/tmp/test
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;NDK를 성공적으로 설치한 경우 샘플 애플리케이션부터 시작합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;http://developer.android.com/sdk/ndk/overview.html#samples&quot; rel=&quot;nofollow noreferrer&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;http://developer.android.com/sdk/ndk/overview.html#samples&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;a href=&quot;http://shareprogrammingtips.blogspot.com/2018/07/cross-compile-cc-based-programs-and-run.html&quot; rel=&quot;nofollow noreferrer&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;http://shareprogrammingtips.blogspot.com/2018/07/cross-compile-cc-based-programs-and-run.html&lt;/font&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;컴파일된 바이너리를 안드로이드 기기나 AVD에 밀어넣고 안드로이드 기기나 AVD의 단말기를 이용하여 실행할 수 있는지도 알고 싶습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여기서 &lt;a href=&quot;http://shareprogrammingtips.blogspot.com/2018/07/cross-compile-cc-based-programs-and-run.html&quot; rel=&quot;nofollow noreferrer&quot;&gt;NestedVM&lt;/a&gt;을 볼 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;NestedVM은 Java Bytecode에 대한 이진 변환을 제공합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것은 GCC가 MIPS 바이너리로 컴파일하게 하고 그 후 자바 클래스 파일로 변환하게 함으로써 수행됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;따라서 C, C++, Fortran 또는 GCC가 지원하는 기타 언어로 작성된 모든 애플리케이션은 소스 변경 없이 100% 순수 Java로 실행할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;hr&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예: &lt;a href=&quot;http://shareprogrammingtips.blogspot.com/2018/07/cross-compile-cc-based-programs-and-run.html&quot; rel=&quot;nofollow noreferrer&quot;&gt;Hello world &lt;/a&gt;C&lt;a href=&quot;http://shareprogrammingtips.blogspot.com/2018/07/cross-compile-cc-based-programs-and-run.html&quot; rel=&quot;nofollow noreferrer&quot;&gt; 프로그램을 교차 컴파일하여 안드로이드에서 실행&lt;/a&gt;합니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;http://developer.android.com/sdk/ndk/index.html&quot; rel=&quot;noreferrer&quot;&gt;네이티브 개발&lt;/a&gt; 키트를 다운로드해야 &lt;a href=&quot;http://developer.android.com/sdk/ndk/index.html&quot; rel=&quot;noreferrer&quot;&gt;합니다&lt;/a&gt;.&lt;/font&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;

int main() {
    int rows, i, j;
    
    // Read the number of rows from the user
    printf(&quot;Enter the number of rows: &quot;);
    scanf(&quot;%d&quot;, &amp;amp;rows);
    
    // Pattern 1
    printf(&quot;\nPattern 1:\n&quot;);
    for (i = 1; i &amp;lt;= rows; i++) {
        for (j = 1; j &amp;lt;= i; j++) {
            printf(&quot;*&quot;);
        }
        printf(&quot;\n&quot;);
    }
    
    // Pattern 2
    printf(&quot;\nPattern 2:\n&quot;);
    for (i = rows; i &amp;gt;= 1; i--) {
        for (j = 1; j &amp;lt;= i; j++) {
            printf(&quot;*&quot;);
        }
        printf(&quot;\n&quot;);
    }
    
    // Pattern 3
    printf(&quot;\nPattern 3:\n&quot;);
    for (i = rows; i &amp;gt;= 1; i--) {
        for (j = 1; j &amp;lt;= i; j++) {
            printf(&quot;*&quot;);
        }
        printf(&quot;\n&quot;);
    }
    
    // Pattern 4
    printf(&quot;\nPattern 4:\n&quot;);
    for (i = 1; i &amp;lt;= rows; i++) {
        for (j = 1; j &amp;lt;= i; j++) {
            printf(&quot;*&quot;);
        }
        printf(&quot;\n&quot;);
    }
    
    // Pattern 5
    printf(&quot;\nPattern 5:\n&quot;);
    for (i = 1; i &amp;lt;= rows; i++) {
        if (i % 2 != 0) {
            for (j = 1; j &amp;lt;= rows; j++) {
                printf(&quot;*&quot;);
            }
        } else {
            printf(&quot;*&quot;);
        }
        printf(&quot;\n&quot;);
    }
    
    // Pattern 6
    printf(&quot;\nPattern 6:\n&quot;);
    for (i = 1; i &amp;lt;= rows; i++) {
        for (j = 1; j &amp;lt;= i; j++) {
            printf(&quot;*&quot;);
        }
        for (j = 1; j &amp;lt;= rows - i; j++) {
            printf(&quot; &quot;);
        }
        for (j = 1; j &amp;lt;= rows - i; j++) {
            printf(&quot; &quot;);
        }
        for (j = 1; j &amp;lt;= i; j++) {
            printf(&quot;*&quot;);
        }
        printf(&quot;\n&quot;);
    }
    
    // Pattern 7
    printf(&quot;\nPattern 7:\n&quot;);
    for (i = rows; i &amp;gt;= 1; i--) {
        for (j = 1; j &amp;lt;= i; j++) {
            printf(&quot;*&quot;);
        }
        printf(&quot;\n&quot;);
    }
    
    // Pattern 8
    printf(&quot;\nPattern 8:\n&quot;);
    for (i = 1; i &amp;lt;= rows; i++) {
        for (j = 1; j &amp;lt;= i; j++) {
            printf(&quot;*&quot;);
        }
        for (j = 1; j &amp;lt;= rows - i; j++) {
            printf(&quot; &quot;);
        }
        for (j = 1; j &amp;lt;= rows - i; j++) {
            printf(&quot; &quot;);
        }
        for (j = 1; j &amp;lt;= i; j++) {
            printf(&quot;*&quot;);
        }
        printf(&quot;\n&quot;);
    }
    
    return 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/8698798/how-to-compile-and-run-a-c-c-program-on-the-android-system&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>C</category>
      <author>css3</author>
      <guid isPermaLink="true">https://css3.tistory.com/1154</guid>
      <comments>https://css3.tistory.com/1154#entry1154comment</comments>
      <pubDate>Mon, 6 Nov 2023 21:58:33 +0900</pubDate>
    </item>
    <item>
      <title>jQuery의 부모에서 모든 자녀(어떤 수준이든)를 선택하는 방법?</title>
      <link>https://css3.tistory.com/1153</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;jQuery의 부모에서 모든 자녀(어떤 수준이든)를 선택하는 방법?&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;.unbind()&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;상위 노드에서 모든 요소를 선택합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;부모 중에서 모든 자녀를(어떤 수준이든) 선택하려면 어떻게 해야 합니까?&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;시도:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$('#google_translate_element *').unbind('click');
&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;a href=&quot;http://jsfiddle.net/YPBxn/&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://api.jquery.com/find/&quot; rel=&quot;noreferrer&quot;&gt;jQuery.find()&lt;/a&gt;를 사용하여 한 &lt;strong&gt;단계 이상&lt;/strong&gt; 깊이의 어린이를 찾습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;.find() 및 .children() 메서드는 DOM 트리 아래로 한 단계만 이동한다는 점을 제외하고 유사합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;pre&gt;&lt;code&gt;$('#google_translate_element').find('*').unbind('click');
&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;code&gt;find()&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;나머지 트리 순회 메서드와는 달리 선택자 식을 .find()로 호출할 때 필요합니다.&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;/p&gt; 
&lt;pre&gt;&lt;code&gt;$('#google_translate_element').find('*').each(function(){
    $(this).unbind('click');
});
&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;#my_parent_element *&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;함께 일함&lt;/font&gt;&lt;/font&gt;&lt;code&gt;unbind()&lt;/code&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;다음 html을 예로 들어보겠습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;div id=&quot;#my_parent_element&quot;&amp;gt;
  &amp;lt;div class=&quot;div1&quot;&amp;gt;
    &amp;lt;div class=&quot;div2&quot;&amp;gt;hello&amp;lt;/div&amp;gt;
    &amp;lt;div class=&quot;div3&quot;&amp;gt;my&amp;lt;/div&amp;gt;
  &amp;lt;/div&amp;gt;
  &amp;lt;div class=&quot;div4&quot;&amp;gt;name&amp;lt;/div&amp;gt;
  &amp;lt;div class=&quot;div5&quot;&amp;gt;
    &amp;lt;div class=&quot;div6&quot;&amp;gt;is&amp;lt;/div&amp;gt;
    &amp;lt;div class=&quot;div7&quot;&amp;gt;
      &amp;lt;div class=&quot;div8&quot;&amp;gt;marco&amp;lt;/div&amp;gt;
      &amp;lt;div class=&quot;div9&quot;&amp;gt;(try and click on any word)!&amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;button class=&quot;unbind&quot;&amp;gt;Now, click me and try again&amp;lt;/button&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고 약간의 질문은.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$('.div1,.div2,.div3,.div4,.div5,.div6,.div7,.div8,.div9').click(function() {
  alert('hi!');
})
$('button.unbind').click(function() {
  $('#my_parent_element *').unbind('click');
})
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여기서 시도해보실 수 있습니다: http://jsfiddle.net/fLvwbazk/7/&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/7648761/how-to-select-all-children-in-any-level-from-a-parent-in-jquery&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>jQuery</category>
      <author>css3</author>
      <guid isPermaLink="true">https://css3.tistory.com/1153</guid>
      <comments>https://css3.tistory.com/1153#entry1153comment</comments>
      <pubDate>Mon, 6 Nov 2023 21:58:25 +0900</pubDate>
    </item>
    <item>
      <title>SQL 인젝션을 통해 사이트가 해킹당했습니다.</title>
      <link>https://css3.tistory.com/1152</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;최근에 SQL 주입으로 제 사이트가 해킹당했습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;해커는 내 DB 이름을 얻기 위해 다음 쿼리를 사용했습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;나는 그들이 쓴 이 질문을 이해할 수 없습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;쿼리:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;=-999.9%20UNION%20ALL%20SELECT%20concat(0x7e,0x27,Hex(cast(database()%20as%20char)),0x27,0x7e),0x31303235343830303536,0x31303235343830303536,0x31303235343830303536--
&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;쿼리를 실행한 후 정수 결과를 표시했습니다. &quot;와 같은 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;74545883&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&quot;.&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;https://www.owasp.org/index.php/Buffer_overflow_attack&quot; rel=&quot;noreferrer&quot; title=&quot;버퍼 오버플로 공격&quot; papago-attr-id=&quot;1&quot;&gt;오버플로 공격&lt;/a&gt; 같아요.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그들은&lt;/font&gt;&lt;/font&gt;&lt;code&gt;UNION&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;-ed를 기존 쿼리로 변경합니다. 당신의 모든 쿼리를 대체합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;%20&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;url-encoded가 다음을 산출하므로 (공백)을 사용합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;=-999.9 UNION ALL SELECT CONCAT(0x7e,0x27,Hex(cast(database() as char)),0x27,0x7e),0x31303235343830303536,0x31303235343830303536,0x31303235343830303536-
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그것을 분해합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그&lt;/font&gt;&lt;/font&gt;&lt;code&gt;=-999.9&lt;/code&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;0x31303235343830303536&lt;/code&gt;&lt;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 papago-translate=&quot;translated&quot;&gt;가지고 계시다면&lt;/font&gt;&lt;/font&gt;&lt;code&gt;SELECT * FROM users&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;4개의 기둥이 있었고,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;UNION&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;또한 4개의 열이 있어야 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;결과적으로, 그들은 단지 'NULL 값을 사용하여 그 열들을 채웠습니다.&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;진짜 혼란은 에 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;CONCAT()&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;. 126, 39, 데이터베이스 이름을 16진수 값, 39, 126으로 조합하고 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;--&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;mysql 주석입니다. 다음에 나머지 쿼리를 무시합니다.&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이번 공격으로 미루어 볼 때, 당신이 입력한 내용을 포장하지 않은 것으로 의심됩니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;mysql_real_escape_string()&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;, 당신의 쿼리에서 튀어나와 자신의 쿼리를 실행할 수 있도록 공격을 허용한 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;자세한 정보는 owasp.org 을 참조하십시오.&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;먼저 %20을(를) 유니언 부분의 빈 공간으로 교체하면 다음과 같은 이점을 얻을 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;SELECT concat(0x7e,0x27,Hex(cast(database() as char)),0x27,0x7e),0x31303235343830303536,0x31303235343830303536,0x31303235343830303536--
&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;따라서 먼저 쿼리의 원래 조건을 완료할 수 있는 숫자(999.9)가 있다는 것을 알 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그런 다음 UNION 파트가 추가됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;마지막으로 UNION 부분 뒤에 주석 문자가 추가되어(-- ) 나머지 쿼리(시스템에서 추가될 수 있음)가 바이패스됩니다.&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 
    concat
    (
        0x7e,
        0x27,
        Hex(cast(database() as char)),
        0x27,
        0x7e
    ),
    0x31303235343830303536,
    0x31303235343830303536,
    0x31303235343830303536
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이제 결과의 첫 번째 열의 하위 문자열이 데이터베이스 이름의 16진수 인코딩 형식을 포함합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;실제로는 작은 따옴표(0x27)로 둘러싸여 있어야 하고, 다시 ~(0x7e)로 둘러싸여 있어야 합니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;쿼리는 &lt;a href=&quot;http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_database&quot; rel=&quot;nofollow&quot;&gt;데이터베이스()&lt;/a&gt;를 사용하여 데이터베이스 이름을 반환한 다음 &lt;a href=&quot;http://dev.mysql.com/doc/refman/5.5/en/string-functions.html#function_hex&quot; rel=&quot;nofollow&quot;&gt;HEx()&lt;/a&gt; 함수를 사용하여 16진수 값으로 변환했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;일단 이것을 가지고 나면 &lt;a href=&quot;http://dev.mysql.com/doc/refman/5.5/en/string-functions.html#function_unhex&quot; rel=&quot;nofollow&quot;&gt;UNHEX&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;UNHEX&lt;/code&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;mysql&amp;gt; SELECT UNHEX('4D7953514C');
        -&amp;gt; 'MySQL'
mysql&amp;gt; SELECT 0x4D7953514C;
        -&amp;gt; 'MySQL'
mysql&amp;gt; SELECT UNHEX(HEX('string'));
        -&amp;gt; 'string'
mysql&amp;gt; SELECT HEX(UNHEX('1267'));
        -&amp;gt; '1267'
&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;-999.9 UNION ALL SELECT 
CONCAT('Hex(cast(database() as char))'),
0x31303235343830303536,
0x31303235343830303536,
0x31303235343830303536
&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;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Havij를 이용한 주입의 예입니다. 0x7e와 0x27은 id=99999.9와 같은 HTML 디스플레이를 프레임화하는 데 사용될 ~와 '에 해당합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;+유니온+전부+선택+0x313032353438303536, (선택+콘캣(0x7e,0x27,unhex(주물)_tbl.이름+aschar)),0x27,0x7e+from+&lt;/font&gt;&lt;/font&gt;&lt;code&gt;test&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;.sample_tbl+Order+by+id+limit+0,1)+-- 이 쿼리는 테이블 테스트의 테이블 sample_tbl에서 열 이름의 필드 값인 ~'Alfred'~를 렌더링합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;~r3dm0v3_hvj_injection'~는 http://www.string-functions.com/hex-string.aspx 에 따라 Havij 서명 코드 unhex0x7233646D3076335F68766A5F696E6A656374696F6E입니다.&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;우선 쿼리는 HTML로 인코딩된 것처럼 보입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;교체&lt;/font&gt;&lt;/font&gt;&lt;code&gt;%20&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;공간이 있는 s는 조금 더 가독성이 높아질 것입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;또한 그들은 쿼리의 일부를 어떤 것의 16진수 표현으로 변환하고 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;문장의 그 부분도 16진수로 해독해 보십시오.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;SQL 인젝션 위험은 SQL을 문자열로 동적으로 생성한 후 DBMS로 전송할 때 생성됩니다. 검색 바 등에서 사용하기 위해 시스템에 저장된 이와 같은 문자열을 상상해 보십시오.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;SELECT * FROM SOME_TABLE WHERE SOME_COLUMN=&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;'x' or 1=1&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;SELECT * FROM SOME_TABLE WHERE SOME_COLUMN='x' or 1=1&lt;/code&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;SOME_COLUMN&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;어떤 변수든 될 수 있어요, 어디서 실패하든 상관없어요, 중요한 건&lt;/font&gt;&lt;/font&gt;&lt;code&gt;1=1&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;는 항상 참이므로 공격자가 해당 테이블의 모든 행에 액세스할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이제 알았으니 코드를 살펴보고 동적으로 생성된 모든 쿼리를 준비된 문으로 대체합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;OWASP 사이트에는 방어용 코딩을 위한 많은 리소스도 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;http://www.owasp.org&quot; rel=&quot;nofollow&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;www.owasp.org&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;네, 그는 당신이 말하는 '74545883' 데이터베이스 이름의 16진수 형식을 가지고 있습니다.&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/4600954/site-has-been-hacked-via-sql-injection&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>MySQL</category>
      <author>css3</author>
      <guid isPermaLink="true">https://css3.tistory.com/1152</guid>
      <comments>https://css3.tistory.com/1152#entry1152comment</comments>
      <pubDate>Mon, 6 Nov 2023 21:58:18 +0900</pubDate>
    </item>
    <item>
      <title>설정 IF NULL 또는 기타 값의 MySQL Update 필드</title>
      <link>https://css3.tistory.com/1151</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;설정 IF NULL 또는 기타 값의 MySQL Update 필드&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;field1 OFTYPE INT
field2 OFTYPE DATETIME
field3 OFTYPE DATETIME

UPDATE `Table1` SET `field1` = `field1` + 1, `field2` = NOW() WHERE `id` = $id;
UPDATE `Table1` SET `field3` = NOW() WHERE `id` = $id AND (`field3` &amp;lt; '2011-00-00 00:00:00' OR `field3` IS NULL);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음과 같이 UPDATE를 수행할 수 있는 쿼리를 구하려고 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;UPDATE `Table1` 
SET `field1` = `field1` + 1,
    `field2` = NOW(),
    `field3` = ISNULL(NOW(), `first_seen`);
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;IF 문을 사용하여 이 작업을 수행하는 것이 가능하다고 생각합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;IF 문을 사용할 때 식, true이면 값, false이면 값, false이면 값의 세 가지 매개 변수를 사용합니다.&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;UPDATE Table1 
SET 
    field1 = field1 + 1, 
    field2 = NOW(),
    field3 = IF(field3 &amp;lt; '2011-00-00 00:00:00' OR field3 IS NULL, NOW(), field3)
WHERE id = $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;field3&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;될 것이다&lt;/font&gt;&lt;/font&gt;&lt;code&gt;NOW()&lt;/code&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;CASE&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;*:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;UPDATE Table1
SET field1 = field1 + 1,
  field2 = NOW(),
  field3 =
        CASE
        WHEN field3 &amp;lt; '2011-00-00 00:00:00' THEN /* Evaluates to false if NULL */
          NOW()
        WHEN field3 IS NULL THEN
          NOW()
        ELSE /* Don't change */
          field3
        END
WHERE id = 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;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이렇게 하면 됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;UPDATE `Table1` 
SET `field1` = `field1` + 1,
    `field2` = NOW(),
    `field3` = COALESCE(field3, NOW())
WHERE id = 1;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이렇게 하면 모든 field1 및 field2가 업데이트되고 field3이 null이면 null이 아니면 원래 상태로 유지됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하지만 이것은 NULL에서만 작동합니다!!!&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;field3&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;와는 다른 조건으로 업데이트되어야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;field1&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;field2&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;, 하나의 쿼리로 모든 것을 할 수는 없다고 생각합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;쿼리를 함께 실행하거나 아무것도 실행하지 않으면 &lt;a href=&quot;http://dev.mysql.com/doc/refman/5.0/en/commit.html&quot; rel=&quot;nofollow&quot;&gt;트랜잭션&lt;/a&gt;을 수행할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/9691138/mysql-update-field-of-set-if-null-or-other-value&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>MySQL</category>
      <author>css3</author>
      <guid isPermaLink="true">https://css3.tistory.com/1151</guid>
      <comments>https://css3.tistory.com/1151#entry1151comment</comments>
      <pubDate>Mon, 6 Nov 2023 21:58:11 +0900</pubDate>
    </item>
    <item>
      <title>문자열 내용에서 XML 리더</title>
      <link>https://css3.tistory.com/1150</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;문자열 내용에서 XML 리더&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;XslTransform을 사용하여 다른 XML에서 XML을 생성하려고 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;두 파일(소스 XML과 XSL 변환 파일)을 모두 문자열 내용으로 받아서 XSL 파일을 Xsl Transform에 전달하려고 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;() 메서드를 XmlReader로 로드합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이제 XSL 파일을 포함하는 소스 문자열로 XmlReader를 만들어야 하므로 다음과 같이 시도합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;MemoryStream memStream = new MemoryStream();
byte[] data = Encoding.Default.GetBytes(transformation.XsltContent);
memStream.Write(data, 0, data.Length);
memStream.Position = 0;
XmlReader reader = XmlReader.Create(memStream);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;또한 StringReader를 사용해 보았습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;XmlReader reader = XmlReader.Create(new StringReader(transformation.XsltContent));
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;안타깝게도 봇 메소드가 작동하지 않는 것 같습니다. 입력이 문제가 없는 것 같고, 기본적인 단일 요소 XML을 만들어 전달하려고 시도하기도 했지만 작동하지 않습니다. 판독기에 {None}이(가)&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;XmlReader xmlReader = XmlReader.Create(new StringReader(YourStringValue));&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;StringReader -&amp;gt; XmlReader 접근법은 괜찮으니 그대로 해야 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아직 읽지 않았기 때문에 독자가 아무 것도 보고하지 않습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;읽기()로 전화를 걸어 어떤 일이 발생하는지 확인해 보십시오.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;또한 이러한 변화는 읽기를 요구할 것입니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/4518544/xmlreader-from-a-string-content&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>xml</category>
      <author>css3</author>
      <guid isPermaLink="true">https://css3.tistory.com/1150</guid>
      <comments>https://css3.tistory.com/1150#entry1150comment</comments>
      <pubDate>Mon, 6 Nov 2023 21:58:04 +0900</pubDate>
    </item>
    <item>
      <title>NSA rray에 c-struct를 넣는 가장 좋은 방법은?</title>
      <link>https://css3.tistory.com/1149</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;NSA rray에 c-struct를 넣는 가장 좋은 방법은?&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;c-구조물을 저장하는 일반적인 방법은 무엇입니까?&lt;/font&gt;&lt;/font&gt;&lt;code&gt;NSArray&lt;/code&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;valueWithBytes&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;valueWithPointer&lt;/code&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;http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/NumbersandValues/Articles/Values.html#//apple_ref/doc/uid/20000174-BAJJHDEG&quot; rel=&quot;noreferrer&quot;&gt;다음&lt;/a&gt;은 애플이 다음과 같이 논의하는 &lt;a href=&quot;http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/NumbersandValues/Articles/Values.html#//apple_ref/doc/uid/20000174-BAJJHDEG&quot; rel=&quot;noreferrer&quot;&gt;링크입니다.&lt;/a&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;valueWithBytes:objCType:&lt;/code&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;약간의 측면적인 사고와 성능을 좀 더 보기 위해, Evgen은 다음과 같은 문제를 제기했습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;STL::vector&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;C++&lt;/strong&gt;로&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;em&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;(그것은 흥미로운 문제를 제기합니다: fast c library가 있습니까, 다름이 아닙니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;STL::vector&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;훨씬 더 가벼워진 덕분에 최소한의 &quot;어레이의 tidy 처리&quot;가 가능해졌습니다.&lt;/font&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;그래서 원래 질문은...&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;typedef struct _Megapoint {
    float   w,x,y,z;
} Megapoint;
&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;NSArray&lt;/code&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;그건 그렇고 여기 NSData 접근법이 있습니다. 아마도요?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;최고가 아닌...&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Megapoint p;
NSArray *a = [NSArray arrayWithObjects:
    [NSData dataWithBytes:&amp;amp;p length:sizeof(Megapoint)],
    [NSData dataWithBytes:&amp;amp;p length:sizeof(Megapoint)],
    [NSData dataWithBytes:&amp;amp;p length:sizeof(Megapoint)],
        nil];
&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;BTW를 참고로 하고 자렛 하디 덕분에 저장하는 방법은 다음과 같습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;CGPoints&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;유사한 점이 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;NSArray&lt;/code&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;NSArray *points = [NSArray arrayWithObjects:
        [NSValue valueWithCGPoint:CGPointMake(6.9, 6.9)],
        [NSValue valueWithCGPoint:CGPointMake(6.9, 6.9)],
        nil];
&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/899600/how-can-i-add-cgpoint-objects-to-an-nsarray-the-easy-way&quot;&gt;CGPoint 개체를 NSRray에 쉽게 추가하려면 어떻게&lt;/a&gt; 해야 &lt;a href=&quot;https://stackoverflow.com/questions/899600/how-can-i-add-cgpoint-objects-to-an-nsarray-the-easy-way&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;a href=&quot;https://developer.apple.com/documentation/foundation/nsvalue&quot; rel=&quot;noreferrer&quot;&gt;NSValue&lt;/a&gt;는 CoreGraphics 구조를 지원할 뿐만 아니라 자신만의 구조로도 사용할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;나는 그렇게 하는 것을 추천합니다, 왜냐하면 아마 수업은 무게가 더 가벼울 것이기 때문입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;NSData&lt;/code&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;[NSValue valueWithBytes:&amp;amp;p objCType:@encode(Megapoint)];
&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;Megapoint p;
[value getValue:&amp;amp;p];
&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;경로를 고수하는 것을 제안하고 싶지만, 정말로 당신이 평범한 것을 보관하고 싶다면, ol.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;struct&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;NSray의 데이터 유형(및 코코아의 다른 수집 개체)을 사용하면 간접적으로나마 Core Foundation과 &lt;a href=&quot;http://www.cocoadev.com/index.pl?TollFreeBridging&quot; rel=&quot;nofollow&quot;&gt;수신자&lt;/a&gt; 부담 없는 &lt;a href=&quot;http://www.cocoadev.com/index.pl?TollFreeBridging&quot; rel=&quot;nofollow&quot;&gt;브리징&lt;/a&gt;을 사용할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;http://developer.apple.com/library/ios/#documentation/CoreFoundation/Reference/CFArrayRef/Reference/reference.html&quot; rel=&quot;nofollow&quot;&gt;&lt;code&gt;CFArrayRef&lt;/code&gt;&lt;/a&gt; (그리고 그 변하기 쉬운 상대는,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;CFMutableArrayRef&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;CFArrayRef CFArrayCreate (
    CFAllocatorRef allocator,
    const void **values,
    CFIndex numValues,
    const CFArrayCallBacks *callBacks
);
&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;CFArrayRef&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;translated&quot;&gt;의무적인 예:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;// One would pass &amp;amp;kCFTypeArrayCallBacks (in lieu of NULL) if using CF types.
CFMutableArrayRef arrayRef = CFArrayCreateMutable(kCFAllocatorDefault, 0, NULL);
NSMutableArray *array = (NSMutableArray *)arrayRef;

struct {int member;} myStruct = {.member = 42};
// Casting to &quot;id&quot; to avoid compiler warning
[array addObject:(id)&amp;amp;myStruct];

// Hurray!
struct {int member;} *mySameStruct = [array objectAtIndex:0];
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;위의 예는 메모리 관리와 관련된 문제를 완전히 무시합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;구조는&lt;/font&gt;&lt;/font&gt;&lt;code&gt;myStruct&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;hr&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;스택 대신 힙에 할당된 구조를 사용하는 방법은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;typedef struct {
    float w, x, y, z;
} Megapoint;

// One would pass &amp;amp;kCFTypeArrayCallBacks (in lieu of NULL) if using CF types.
CFMutableArrayRef arrayRef = CFArrayCreateMutable(kCFAllocatorDefault, 0, NULL);
NSMutableArray *array = (NSMutableArray *)arrayRef;

Megapoint *myPoint = malloc(sizeof(Megapoint);
myPoint-&amp;gt;w = 42.0f;
// set ivars as desired..

// Casting to &quot;id&quot; to avoid compiler warning
[array addObject:(id)myPoint];

// Hurray!
Megapoint *mySamePoint = [array objectAtIndex: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;pre&gt;&lt;code&gt;typedef struct BSTNode
{
    int data;
    struct BSTNode *leftNode;
    struct BSTNode *rightNode;
}BSTNode;

BSTNode *rootNode;

//declaring a NSMutableArray
@property(nonatomic)NSMutableArray *queues;

//storing the pointer in the array
[self.queues addObject:[NSValue value:&amp;amp;rootNode withObjCType:@encode(BSTNode*)]];

//getting the value
BSTNode *frontNode =[[self.queues objectAtIndex:0] pointerValue];
&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;당신이 너덜너덜하다고 느끼거나 정말로 생성해야 할 클래스가 많은 경우: 동적으로 객체 클래스를 구성하는 것이 때때로 유용합니다(ref:&lt;/font&gt;&lt;/font&gt;&lt;code&gt;class_addIvar&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;필드별로 필드를 지정하거나 구조물의 정보를 전달할 수 있습니다(NSData를 실질적으로 복제하는 것입니다).&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;때로는 유용하지만 아마도 대부분의 독자들에게 더 '재미있는 사실'일 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여기에 이걸 어떻게 발라요?&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;class_addIvar를 호출하여 새로운 클래스에 메가포인트 인스턴스 변수를 추가하거나 런타임에 메가포인트 클래스의 objc 변형(예: 메가포인트의 각 필드에 대한 인스턴스 변수)을 합성할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;전자는 컴파일된 objc 클래스와 동등합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;@interface MONMegapoint { Megapoint megapoint; } @end
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;후자는 컴파일된 objc 클래스와 동등합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;@interface MONMegapoint { float w,x,y,z; } @end
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;ivar를 추가한 후 메서드를 추가/synthe할 수 있습니다.&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;object_getInstanceVariable&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;, 아니면&lt;/font&gt;&lt;/font&gt;&lt;code&gt;valueForKey:&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;(이는 종종 이러한 스칼라 인스턴스 변수를 NSNumber 또는 NSValue 표현으로 변환합니다.)&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그건 그렇고: 여러분이 받은 모든 답변은 유용하고, 몇몇은 상황에 따라 더 나은/worse/invalid한/scenario한 답변도 있습니다.&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;NSArray에 c-struct를 넣는 가장 좋은 방법은 없으며, 단지 '&lt;em&gt;특정&lt;/em&gt; 시나리오,&lt;em&gt; 사례 또는 요구사항 집합&lt;/em&gt;에 대해 NSArray에 c-struct를 넣는 가장 좋은 방법'만 있을 뿐입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;또한 NSRray는 포인터 크기(또는 그보다 작은) 유형에 대해 일반적으로 재사용 가능한 어레이 인터페이스이지만 여러 가지 이유로 c-struct에 더 적합한 다른 컨테이너도 있습니다(std::vector는 c-struct의 일반적인 선택입니다).&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여러 abis/architecture에서 이 데이터를 공유하는 경우 poor-man's objc serializer를 사용하는 것이 가장 좋습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Megapoint mpt = /* ... */;
NSMutableDictionary * d = [NSMutableDictionary new];
assert(d);

/* optional, for your runtime/deserialization sanity-checks */
[d setValue:@&quot;Megapoint&quot; forKey:@&quot;Type-Identifier&quot;];

[d setValue:[NSNumber numberWithFloat:mpt.w] forKey:@&quot;w&quot;];
[d setValue:[NSNumber numberWithFloat:mpt.x] forKey:@&quot;x&quot;];
[d setValue:[NSNumber numberWithFloat:mpt.y] forKey:@&quot;y&quot;];
[d setValue:[NSNumber numberWithFloat:mpt.z] forKey:@&quot;z&quot;];

NSArray *a = [NSArray arrayWithObject:d];
[d release], d = 0;
/* ... */
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;...특히 시간이 지남에 따라(또는 목표 플랫폼에 따라) 구조가 변경될 수 있는 경우.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다른 옵션만큼 빠르지는 않지만 일부 조건(중요하거나 중요하지 않은 조건)에서 오류가 발생할 가능성이 적습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;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;어느 경우든, NSData, NSValue와 비교하여 계산된 개체를 이미 추가하고 있으므로...&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;많은 경우 메가포인트를 보유한 objc 클래스를 만드는 것이 정답입니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;C/C++ 유형의 경우 std::vector 또는 std::list를 사용하는 것이 좋습니다. 처음에는 NSRray보다 빠르기 때문이고, 나중에는 속도가 부족할 경우 언제든지 STL 컨테이너에 대한 할당자를 직접 생성하여 훨씬 더 빠르게 만들 수 있기 때문입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;모든 최신 모바일 게임, 물리학 및 오디오 엔진은 내부 데이터를 저장하기 위해 STL 컨테이너를 사용합니다.&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;NSValue에 대한 남자들의 좋은 답변이 있는 것처럼, 당신을 위한 것이 아니라면 가장 받아들일 만하다고 생각합니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;구조를 NSRray에 넣으려고 하는 대신 구조의 배열로 NSData 또는 NSMutableData에 넣을 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;액세스하려면 다음 작업을 수행해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;const struct MyStruct    * theStruct = (const struct MyStruct*)[myData bytes];
int                      value = theStruct[2].integerNumber;
&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;struct MyStruct    * theStruct = (struct MyStruct*)[myData mutableBytes];
theStruct[2].integerNumber = 10;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;NSValue를 사용하면 구조물을 Obj-C 개체로 저장할 수 있지만 NSrchiver/NSKeyedArchiver가 있는 구조물이 포함된 NSValue를 인코딩할 수 없습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;대신 개별 구조 부재를 인코딩해야 합니다...&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;http://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/Archiving/Articles/codingctypes.html#//apple_ref/doc/uid/20001294-96941-BBCDIHEF&quot; rel=&quot;nofollow&quot;&gt;Apple의 Archives and Serializations Programming Guide &lt;/a&gt;&amp;gt; &lt;a href=&quot;http://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/Archiving/Articles/codingctypes.html#//apple_ref/doc/uid/20001294-96941-BBCDIHEF&quot; rel=&quot;nofollow&quot;&gt;Structures and Bit&lt;/a&gt; 필드 &lt;a href=&quot;http://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/Archiving/Articles/codingctypes.html#//apple_ref/doc/uid/20001294-96941-BBCDIHEF&quot; rel=&quot;nofollow&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;a href=&quot;https://clang.llvm.org/docs/ObjectiveCLiterals.html&quot; rel=&quot;nofollow noreferrer&quot;&gt;속성&lt;/a&gt;을 추가할 수 있습니다.&lt;/font&gt;&lt;/font&gt; &lt;code&gt;objc_boxable&lt;/code&gt;&lt;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;호출하지 않고 NSValue 인스턴스에 구조를 넣을 구문&lt;/font&gt;&lt;/font&gt;&lt;code&gt;valueWithBytes:objCType:&lt;/code&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;typedef struct __attribute__((objc_boxable)) _Megapoint {
    float   w,x,y,z;
} Megapoint;

NSMutableArray&amp;lt;NSValue*&amp;gt;* points = [[NSMutableArray alloc] initWithCapacity:10];
for (int i = 0; i &amp;lt; 10; i+= 1) {
    Megapoint mp1 = {i + 1.0, i + 2.0, i + 3.0, i + 4.0};
    [points addObject:@(mp1)];//@(mp1) creates NSValue*
}

Megapoint unarchivedPoint;
[[points lastObject] getValue:&amp;amp;unarchivedPoint];
//or
// [[points lastObject] getValue:&amp;amp;unarchivedPoint size:sizeof(Megapoint)];
&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;NSArray&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;, 다른 용기가 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;NSPointerArray&lt;/code&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-objectivec prettyprint-override&quot;&gt;&lt;code&gt;Megapoint point = ...;
NSPointerArray *arr = [NSPointerArray weakObjectsPointerArray];

[arr addPointer:&amp;amp;point];

for (NSUInteger i = 0; i &amp;lt; arr.count; i++) {
    Megapoint *ppoint = [arr pointerAtIndex:i];
    NSLog(@&quot;%p&quot;, ppoint);
}

&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;Obj C 객체는 일부 요소가 추가된 C 구조일 뿐입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;따라서 사용자 지정 클래스를 생성하면 NSRray에 필요한 C 구조의 유형을 갖게 됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;NSO 개체가 C 구조 내에 포함하는 여분의 크래프트가 없는 C 구조는 NSArray에서 소화할 수 없습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;NSData를 래퍼로 사용하는 것은 원래의 구조물이 아닌 구조물의 복사본만 저장하는 것일 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;C-Structures 이외의 NSObject 클래스를 사용하여 정보를 저장할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;NSO 개체를 NSRray에 쉽게 저장할 수 있습니다.&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/4516991/whats-the-best-way-to-put-a-c-struct-in-an-nsarray&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>iPhone</category>
      <author>css3</author>
      <guid isPermaLink="true">https://css3.tistory.com/1149</guid>
      <comments>https://css3.tistory.com/1149#entry1149comment</comments>
      <pubDate>Mon, 6 Nov 2023 21:57:58 +0900</pubDate>
    </item>
    <item>
      <title>$sce.trustAsHtml 내에서 지시문 렌더링</title>
      <link>https://css3.tistory.com/1148</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;$sce.trustAsHtml 내에서 지시문 렌더링&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여기에 Plunker를 포함시켰습니다. http://plnkr.co/edit/4vqV8toHo0vNjtfICtzI?p=preview&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;DOM에 버튼을 추가하려고 하는데 클릭하면 DOM에 바인딩된 기능이 실행됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 경우 &quot;테스트&quot;에 경고해야 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;코드는 여기 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;콘트롤러&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;app.controller('MainCtrl', function($scope, $sce) {
        $scope.trustedHtml = $sce.trustAsHtml('&amp;lt;button ng-click=&quot;testAlert()&quot;&amp;gt;Submit&amp;lt;/button&amp;gt;');  

        $scope.testAlert = function () {
            alert('testing')
        };
});
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;HTML&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;body ng-controller=&quot;MainCtrl&quot;&amp;gt;
    &amp;lt;div ng-bind-html=&quot;trustedHtml&quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;/body&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;$sce.trustAsHtml&lt;/code&gt;&lt;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-bind-html&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;지시사항이 있는 HTML을 구축하기 위한 것이 아닙니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 기술은 사용할 수 없습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것은 각이 먼저 컴파일한 후 연결함으로써 작동하기 때문입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;http://docs.angularjs.org/guide/concepts&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;간단히 말해서, 당신이 당신의 컴퓨터에 정의된 HTML을 링크할 때까지.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;trustAsHtml&lt;/code&gt;&lt;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-click&lt;/code&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;HTML을 동적으로 추가하기 위해서는 당신은&lt;/font&gt;&lt;/font&gt;&lt;code&gt;$compile&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;서비스(및/또는 지시)&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;http://docs.angularjs.org/api/ng.%24compile&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;Angular 1.6.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;&amp;lt;div ng-bind-html=&quot;trustAsHtml(content);&quot; init-bind&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;    $scope.trustAsHtml = function(string) {
        return $sce.trustAsHtml(string);
    };
&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;.directive('initBind', function($compile) {
return {
        restrict: 'A',
        link : function (scope, element, attr) {
            attr.$observe('ngBindHtml',function(){
                if(attr.ngBindHtml){
                     $compile(element[0].children)(scope);
                }
            })
        }
    };
})
&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/20623118/rendering-directives-within-sce-trustashtml&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>AngularJS</category>
      <author>css3</author>
      <guid isPermaLink="true">https://css3.tistory.com/1148</guid>
      <comments>https://css3.tistory.com/1148#entry1148comment</comments>
      <pubDate>Mon, 6 Nov 2023 21:57:49 +0900</pubDate>
    </item>
    <item>
      <title>jQuery: 창 너비를 즉시 감지하는 방법은 무엇입니까?</title>
      <link>https://css3.tistory.com/1147</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;jQuery: 창 너비를 즉시 감지하는 방법은 무엇입니까?&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;내 페이지에 스크롤 요소가 있습니다(jScrollPanejQuery 플러그인 포함).&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;지금 당장 1000px 너비의 창에서 시작해서 350px 크기로 조정하면 스크롤 기능이 남아있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;브라우저 폭이 440px가 되면 바로 스크롤 기능이 꺼졌으면 좋겠습니다.&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 windowsize = $(window).width();

$(window).resize(function() {
  var windowsize = $(window).width();
});

if (windowsize &amp;gt; 440) {
  //if the window is greater than 440px wide then turn on jScrollPane..
    $('#pane1').jScrollPane({
       scrollbarWidth:15, 
       scrollbarMargin:52
    });
}
&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;if&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;-block. 함수에 공통 코드를 넣고 이벤트를 바인딩한 다음 함수를 호출합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$(document).ready(function() {
    // Optimalisation: Store the references outside the event handler:
    var $window = $(window);
    var $pane = $('#pane1');

    function checkWidth() {
        var windowsize = $window.width();
        if (windowsize &amp;gt; 440) {
            //if the window is greater than 440px wide then turn on jScrollPane..
            $pane.jScrollPane({
               scrollbarWidth:15, 
               scrollbarMargin:52
            });
        }
    }
    // Execute on load
    checkWidth();
    // Bind event listener
    $(window).resize(checkWidth);
});
&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;if 조건을 안에 넣습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;resize&lt;/code&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 windowsize = $(window).width();

$(window).resize(function() {
  windowsize = $(window).width();
  if (windowsize &amp;gt; 440) {
    //if the window is greater than 440px wide then turn on jScrollPane..
      $('#pane1').jScrollPane({
         scrollbarWidth:15, 
         scrollbarMargin:52
      });
  }
});
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아래는 화면 크기가 768px 이하일 때 Id 요소를 숨기고, 768px 이상일 때 표시하는 방법입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;효과가 좋습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var screensize= $( window ).width();

if(screensize&amp;lt;=768){
        if($('#column-d0f6e77c699556473e4ff2967e9c0251').length&amp;gt;0)
            {
                $('#column-d0f6e77c699556473e4ff2967e9c0251').css('display','none');
            }
}
else{
        if($('#column-d0f6e77c699556473e4ff2967e9c0251').length&amp;gt;0)
            {
                $('#column-d0f6e77c699556473e4ff2967e9c0251').removeAttr( &quot;style&quot; );
            }

}
changething = function(screensize){
        if(screensize&amp;lt;=768){
            if($('#column-d0f6e77c699556473e4ff2967e9c0251').length&amp;gt;0)
            {
                $('#column-d0f6e77c699556473e4ff2967e9c0251').css('display','none');
            }
        }
        else{
        if($('#column-d0f6e77c699556473e4ff2967e9c0251').length&amp;gt;0)
            {
                $('#column-d0f6e77c699556473e4ff2967e9c0251').removeAttr( &quot;style&quot; );
            }

        }
}
$( window ).resize(function() {
 var screensize= $( window ).width();
  changething(screensize);
});
&lt;/code&gt;&lt;/pre&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;pre&gt;&lt;code&gt;$(window).resize(function() {
       if(screen.width == window.innerWidth){
           alert(&quot;you are on normal page with 100% zoom&quot;);
       } else if(screen.width &amp;gt; window.innerWidth){
           alert(&quot;you have zoomed in the page i.e more than 100%&quot;);
       } else {
           alert(&quot;you have zoomed out i.e less than 100%&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/9720294/jquery-how-to-detect-window-width-on-the-fly&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>jQuery</category>
      <author>css3</author>
      <guid isPermaLink="true">https://css3.tistory.com/1147</guid>
      <comments>https://css3.tistory.com/1147#entry1147comment</comments>
      <pubDate>Mon, 6 Nov 2023 21:57:43 +0900</pubDate>
    </item>
    <item>
      <title>열 이름에 접두사 추가</title>
      <link>https://css3.tistory.com/1146</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;a href=&quot;http://stat.ethz.ch/R-manual/R-patched/library/base/html/colnames.html&quot;&gt;도움말&lt;/a&gt; 파일을 읽을 때 열 이름에 접두사를 추가할 수 있어야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;colnames(x, do.NULL = TRUE, prefix = &quot;col&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;m2 &amp;lt;- cbind(1,1:4)
colnames(m2, do.NULL = FALSE)
colnames(m2) &amp;lt;- c(&quot;x&quot;,&quot;Y&quot;)
colnames(m2) &amp;lt;- colnames(m2, prefix = &quot;Sub_&quot;)
colnames(m2)
&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;code&gt;do.NULL&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;: 논리적으로. 만약에&lt;/font&gt;&lt;/font&gt;&lt;code&gt;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&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;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;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;&amp;gt; m2 &amp;lt;- cbind(1,1:4)
&amp;gt; colnames(m2) &amp;lt;- c(&quot;x&quot;,&quot;Y&quot;)
&amp;gt; colnames(m2) &amp;lt;- paste(&quot;Sub&quot;, colnames(m2), sep = &quot;_&quot;)
&amp;gt; m2
     Sub_x Sub_Y
[1,]     1     1
[2,]     1     2
[3,]     1     3
[4,]     1     4
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;추가하겠습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;tidyverse&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;다음은 a에 접두사를 추가한 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;dplyr&lt;/code&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;dplyr 1.0.2 이상&lt;/font&gt;&lt;/h3&gt; 
&lt;pre&gt;&lt;code&gt;library(dplyr)
df &amp;lt;- data.frame(x = c(1, 2), y = c(3, 4))

## Adding prefixes
df %&amp;gt;% rename_with( ~ paste0(&quot;a&quot;, .x))

## Adding suffixes
df %&amp;gt;% rename_with( ~ paste0(.x, &quot;a&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;paste&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;뿐만 아니라&lt;/font&gt;&lt;/font&gt;&lt;code&gt;sep&lt;/code&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;h3&gt;&lt;font papago-translate=&quot;translated&quot;&gt;dplyr 1.0.2 업데이트 전&lt;/font&gt;&lt;/h3&gt; 
&lt;pre&gt;&lt;code&gt;library(dplyr)
df &amp;lt;- data.frame(x = c(1, 2), y = c(3, 4))
df %&amp;gt;% rename_all( ~ paste0(&quot;a&quot;, .x))
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;접미사를 추가하는 것이 더 쉽습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;df %&amp;gt;% rename_all(paste0, &quot;a&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;tidyverse&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;메소드(포함)&lt;/font&gt;&lt;/font&gt;&lt;code&gt;dplyr 1.0.2&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;) 용도&lt;/font&gt;&lt;/font&gt;&lt;code&gt;rename_with()&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;처럼&lt;/font&gt;&lt;/font&gt;&lt;code&gt;rename_all()&lt;/code&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;iris %&amp;gt;% rename_with( ~ paste(&quot;Sub&quot;, .x, sep = &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;stats::setNames&lt;/code&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-r prettyprint-override&quot;&gt;&lt;code&gt;
iris.dt &amp;lt;- data.table::as.data.table(iris)

microbenchmark::microbenchmark(
  
  base = colnames(iris) &amp;lt;- paste(&quot;Sub&quot;, colnames(iris), sep = &quot;_&quot;),
  stats = setNames(iris, paste(&quot;Sub&quot;, colnames(iris), sep = &quot;_&quot;)), 
  dplyr = dplyr::rename_with(iris, ~ paste(&quot;Sub&quot;, .x, sep = &quot;_&quot;)),
  datatable = data.table::setnames(iris.dt, paste(&quot;Sub&quot;, names(iris.dt), sep = &quot;_&quot;))
  
)
#&amp;gt; Unit: microseconds
#&amp;gt;       expr     min       lq       mean   median      uq        max neval cld
#&amp;gt;       base  11.094  16.2140   21.62408  19.2010  23.681     65.707   100   a
#&amp;gt;      stats   8.107  13.8670   17.40435  16.6405  19.841     39.254   100   a
#&amp;gt;      dplyr 786.772 842.8785 5236.67222 877.0130 984.959 402378.407   100   a
#&amp;gt;  datatable  40.961  49.9200   84.06237  62.2935  73.600    834.560   100   a
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;sup&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;https://reprex.tidyverse.org&quot; rel=&quot;nofollow noreferrer&quot;&gt;repex&lt;/a&gt; 패키지(v0.3.0)에서 2020-10-21에 생성됨&lt;/font&gt;&lt;/sup&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/14872081/add-a-prefix-to-column-names&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>dataframe</category>
      <author>css3</author>
      <guid isPermaLink="true">https://css3.tistory.com/1146</guid>
      <comments>https://css3.tistory.com/1146#entry1146comment</comments>
      <pubDate>Mon, 6 Nov 2023 21:57:35 +0900</pubDate>
    </item>
    <item>
      <title>이 너비 속성 값 선언에서 9의 의미는 무엇입니까?</title>
      <link>https://css3.tistory.com/1145</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 너비 속성 값 선언에서 9의 의미는 무엇입니까?&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/18907131/detecting-ie-version-using-css-capability-feature-detection&quot; dir=&quot;ltr&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;CSS Capability/Feature Detection을 이용한 IE 버전 검출&lt;/font&gt;&lt;/a&gt; 
    &lt;span class=&quot;question-originals-answer-count&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;(18개 답변)&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;2022-09-27 18:34:27Z&quot; papago-attr-id=&quot;1&quot;&gt;11개월 전&lt;/span&gt;에.&lt;/font&gt;&lt;/div&gt; 
  &lt;/div&gt; 
 &lt;/aside&gt; 
&lt;/div&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것의 의미는 무엇입니까?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;브라우저 해킹이라고 추측하고 있지만 정확히 무엇을 하는지 찾지 못했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;width: 500px\9;
&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;\9&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;?&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;code&gt;\9&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;는 인터넷 익스플로러 7, 8, 9에 특화된 &quot;CSS 해킹&quot;입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것은 단순히 CSS의 한 특정 라인이 a로 끝나는 것을 의미합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;\9;&lt;/code&gt;&lt;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;는 IE 7, 8, 9에서만 유효합니다.&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;width: 500px\9;&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;500 픽셀의 너비를 의미합니다(다음과 같은 결과).&lt;/font&gt;&lt;/font&gt;&lt;code&gt;width: 500px;&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;)는 IE 7, 8, 9를 사용하는 동안에만 적용됩니다.&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;width: 500px\9;&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;전적으로, 따라서 적용되지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;width: 500px;&lt;/code&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;CSS가 이렇게 생겼다면...&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#myElement {
    width: 300px;
    width: 500px\9;
}
&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;#myElement&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;IE 7, 8, 9에서 너비 500 픽셀인 반면, 다른 모든 브라우저에서는&lt;/font&gt;&lt;/font&gt;&lt;code&gt;#myElement&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;폭이 300픽셀일 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://web.archive.org/web/20160702085511/http://webdesignandsuch.com/ie9-specific-css-hack/&quot; rel=&quot;noreferrer&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;더 많은 정보&lt;/font&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;hr&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;이 답변은 2011년에 작성되었습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이제 이 해킹은 IE 10에서도 작동한다는 것을 주목해야 합니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;IE9 이하 버전의 CSS 해킹입니다.&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;width: 500px\9;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 기사 보기 http://dimox.net/personal-css-hacks-for-ie6-ie7-ie8/&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;너비 속성을 설정하려면 IE9에서 이 해킹만 추가하면 됩니다.&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;.align {
    float:left;
    margin:5px;
    background-color:blue;
    width:65px;
    width:\9 !important;
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;IE9용 CSS 해킹&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;/* Hack CSS IE9 */
.csshackie9 {color:#f00\9\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/8004765/what-is-the-meaning-of-9-in-this-width-property-value-declaration&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>CSS</category>
      <author>css3</author>
      <guid isPermaLink="true">https://css3.tistory.com/1145</guid>
      <comments>https://css3.tistory.com/1145#entry1145comment</comments>
      <pubDate>Mon, 6 Nov 2023 21:57:29 +0900</pubDate>
    </item>
    <item>
      <title>쿠폰코드 WooCommerce에서 쿠폰 상세정보 검색</title>
      <link>https://css3.tistory.com/1144</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;쿠폰코드 WooCommerce에서 쿠폰 상세정보 검색&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/47360869/set-a-coupon-description-in-woocommerce&quot; dir=&quot;ltr&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;WooCommerce에서 쿠폰 설명 설정&lt;/font&gt;&lt;/a&gt; 
    &lt;span class=&quot;question-originals-answer-count&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;(1개 답변)&lt;/font&gt;&lt;/span&gt; 
   &lt;/div&gt; 
   &lt;div class=&quot;flex--item mb0 mt4&quot;&gt; 
    &lt;a href=&quot;/questions/44977174/get-coupon-data-from-woocommerce-orders&quot; dir=&quot;ltr&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;WooCommerce 주문에서 쿠폰 데이터 가져오기&lt;/font&gt;&lt;/a&gt; 
    &lt;span class=&quot;question-originals-answer-count&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;(2개 답변)&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;2017-11-27 18:10:58Z&quot; papago-attr-id=&quot;1&quot;&gt;5년 전&lt;/span&gt;에.&lt;/font&gt;&lt;/div&gt; 
  &lt;/div&gt; 
 &lt;/aside&gt; 
&lt;/div&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이전에 이 &lt;a href=&quot;https://stackoverflow.com/questions/47360869/set-a-coupon-description-in-woocommerce&quot;&gt;질문을 &lt;/a&gt;한 적이 있지만 WooCommerce의 쿠폰에서 데이터를 가져오는 방법에 대한 답변은 없습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;두 질문 모두 쿠폰을 포함하지만, 첫 &lt;a href=&quot;https://stackoverflow.com/questions/47360869/set-a-coupon-description-in-woocommerce&quot;&gt;번째 질문&lt;/a&gt;은 메타데이터를 어떻게 설정하느냐는 질문이고, 이 질문은 데이터를 어떻게 검색하느냐는 질문입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;hr&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;쿠폰 코드로 우커머스에서 쿠폰 내역을 받으려고 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하지만 저는 이 일을 어떻게 해야 할지 잘 모르겠습니다.&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;Call to undefined function WC_Coupon()&lt;/code&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$coupon_code = 'save10percent';
global $woocommerce;
$c = WC_Coupon($coupon_code);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;쿠폰 내역을 어떻게 받아야 합니까?&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;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;WC_Coupon&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;기능이 작동하려면 기능을 호출하기 전에 &quot;새로운&quot; 키워드를 추가해야 했습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아래에 설명된 바와 같이.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$coupon_code = 'save10percent';
global $woocommerce;
$c = new WC_Coupon($coupon_code);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이제 쿠폰에 대한 자세한 내용을 이렇게 알 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;echo &quot;Discount Amount &quot;.$c-&amp;gt;amount.&quot;&amp;lt;br&amp;gt;&quot;;//Get Discount amount
echo &quot;Discount Type &quot;.$c-&amp;gt;discount_type.&quot;&amp;lt;br&amp;gt;&quot;;//Get type of discount
echo &quot;Individual Use &quot;.$c-&amp;gt;individual_use.&quot;&amp;lt;br&amp;gt;&quot;;//Get individual use status
echo &quot;Usage Count &quot;.$c-&amp;gt;usage_count.&quot;&amp;lt;br&amp;gt;&quot;;//Get number of times the coupon has been used
echo &quot;Uage Limit &quot;.$c-&amp;gt;usage_limit.&quot;&amp;lt;br&amp;gt;&quot;;//Get usage limit
echo &quot;Coupon Description &quot;.$c-&amp;gt;description.&quot;&amp;lt;br&amp;gt;&quot;;//Get coupon description
&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/47517058/retrieve-coupon-details-from-coupon-code-woocommerce&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>WordPress</category>
      <author>css3</author>
      <guid isPermaLink="true">https://css3.tistory.com/1144</guid>
      <comments>https://css3.tistory.com/1144#entry1144comment</comments>
      <pubDate>Mon, 6 Nov 2023 21:57:22 +0900</pubDate>
    </item>
    <item>
      <title>GDB가 루프에서 벗어나도록 하려면 어떻게 해야 합니까?</title>
      <link>https://css3.tistory.com/1143</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;GDB가 루프에서 벗어나도록 하려면 어떻게 해야 합니까?&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;나는 GDB에게 즉시 기능에서 돌아오라고 말할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;return&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;, 함수를 호출합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;call myFunction&lt;/code&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;break;&lt;/code&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;jump myfile.c:&amp;lt;linenumber&amp;gt;&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것을 하는 방법?&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사용가능&lt;/font&gt;&lt;/font&gt;&lt;code&gt;until&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;루프를 끝내려고 한거죠&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;고리 끝에 줘야 돼요.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;루프를 반복하기 위해 개입할 필요가 없는 경우에 유용합니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;code&gt;jump&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;당신이 원하는 것처럼 보입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;http://sourceware.org/gdb/current/onlinedocs/gdb/Jumping.html#Jumping&quot; rel=&quot;noreferrer&quot;&gt;다른 주소에서 계속&lt;/a&gt;하기 참조&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;나는 이렇게 합니다.&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;1. 소스 리스트를 작성합니다.&lt;/font&gt;&lt;/font&gt;&lt;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;/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;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. 루프의 마지막 줄에 중단점을 설정합니다.&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. 중단점이 맞으면 루프 조건 변수를 false로 설정합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하지만 직접적인 브레이크 문구로는 작동하지 않을 것입니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/2200556/how-do-i-get-gdb-to-break-out-of-a-loop&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>C</category>
      <author>css3</author>
      <guid isPermaLink="true">https://css3.tistory.com/1143</guid>
      <comments>https://css3.tistory.com/1143#entry1143comment</comments>
      <pubDate>Mon, 6 Nov 2023 21:57:16 +0900</pubDate>
    </item>
    <item>
      <title>PowerShell에서 특정 UTC DateTime을 사용하여 DateTime 개체 생성</title>
      <link>https://css3.tistory.com/1142</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;PowerShell에서 특정 UTC DateTime을 사용하여 DateTime 개체 생성&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;DateTime&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;PowerShell에 특정 UTC 타임스탬프가 있는 개체입니다.&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;Get-Date
    -Format (Get-Culture).DateTimeFormat.UniversalSortableDateTimePattern
    -Date &quot;1970-01-01 00:00:00Z&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;1969-12-31 19:00:00Z
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;몇 시간 동안 쉬거든요.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제가 잘못 이해한 부분은 어디 있습니까?&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그&lt;/font&gt;&lt;/font&gt;&lt;code&gt;DateTime&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;개체 자체가 적절한 UTC 시간으로 생성되고 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러나 PowerShell이 출력하면 이를 현지 문화와 시간대로 변환하므로 차이점이 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;증명:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$UtcTime = Get-Date -Date &quot;1970-01-01 00:00:00Z&quot;
$UtcTime.ToUniversalTime()
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;(get-date).ToUniversalTime().ToString(&quot;yyyyMMddTHHmmssfffffffZ&quot;)
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;$utctime = New-Object DateTime 1970, 1, 1, 0, 0, 0, ([DateTimeKind]::Utc)
&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;$utctime&lt;/code&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;1. januar 1970 00:00:00
&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;$utctime.Kind&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;로 올바르게 설정되어 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Utc&lt;/code&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;$time = [DateTime]::UtcNow | get-date -Format &quot;yyyy-MM-ddTHH:mm:ssZ&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;SpecificKind 메서드를 사용할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;PSC:\IT\s3&amp;gt; $time stamp&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;2018년 7월 18일 (수) 오후 7:57:14&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;PSC:\IT\s3&amp;gt; $timestamp.kind&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;PSC:\IT\s3&amp;gt; $uttimestamp = [DateTime]:&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;:Kind 지정($time stamp, [DateTimeKind]::UTC)&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;PSC:\IT\s3&amp;gt; $uttime 스탬프&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;2018년 7월 18일 (수) 오후 7:57:14&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;PSC:\IT\s3&amp;gt; $uttimestamp.kind&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;UTC&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;NET 맞죠?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;PowerShell은 ToUniversalTime 메서드만 호출합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;출처: http://msdn.microsoft.com/en-us/library/system.datetime.touniversaltime.aspx&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;The Coordinated Universal Time (UTC) is equal to the local time minus the 
UTC offset. For more information about the UTC offset, see TimeZone.GetUtcOffset.
The conversion also takes into account the daylight saving time rule that applies 
to the time represented by the current DateTime object. 
&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/10487011/creating-a-datetime-object-with-a-specific-utc-datetime-in-powershell&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>powershell</category>
      <author>css3</author>
      <guid isPermaLink="true">https://css3.tistory.com/1142</guid>
      <comments>https://css3.tistory.com/1142#entry1142comment</comments>
      <pubDate>Mon, 6 Nov 2023 21:57:10 +0900</pubDate>
    </item>
    <item>
      <title>ajax 요청 후 Chrome window.open(크롬 창)이 팝업처럼 작동합니다.</title>
      <link>https://css3.tistory.com/1141</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;ajax 요청 후 Chrome window.open(크롬 창)이 팝업처럼 작동합니다.&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사용자가 버튼을 누르면 ajax 요청을 수행한 다음 ajax 요청 결과를 사용하여 새 탭에서 열고 싶은 URL을 생성하는 상황이 발생합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러나 ajax 요청에 대해 성공 처리기에서 window.open을 호출하면 팝업처럼 새 창에서 열립니다(팝업 차단기에 의해 차단됨).&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;성공 코드는 클릭 핸들링 코드에서 비동기식 코드이기 때문에 크롬은 클릭과 인과관계가 있지만 클릭으로 트리거된 것은 아니라고 생각합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;ajax 요청을 동기화하지 않고 이를 방지할 수 있는 방법이 있습니까?&lt;/font&gt;&lt;/p&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;$('#myButton').click(function() {
    $.ajax({
        type: 'POST',
        url: '/echo/json/',
        data: {'json': JSON.stringify({
            url:'http://google.com'})},
        success: function(data) {
            window.open(data.url,'_blank');
        }
    });
});
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;a href=&quot;http://jsfiddle.net/ESMUA/2/&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;http://jsfiddle.net/ESMUA/2/&lt;/font&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;한 가지 설명 사항:&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;팝업 차단으로 차단되는 것보다 탭이 아닌 별도의 창에서 열리는 것이 더 걱정됩니다.&lt;/font&gt;&lt;/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;window.open(url,'_blank');
&lt;/code&gt;&lt;/pre&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;사용자 작업의 즉각적인 결과가 아닌 페이지를 열 때(즉, 비동기화가 아닌) 팝업 차단 기능을 사용할 수는 없다고 생각합니다.&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 $a = $('&amp;lt;a&amp;gt;', {
        href: url,
        target: '_blank' 
    });

$(document.body).append($a);
$a.click();
&lt;/code&gt;&lt;/pre&gt; 
&lt;h3&gt;&lt;font papago-translate=&quot;translated&quot;&gt;편집2&lt;/font&gt;&lt;/h3&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;동기화를 유지하는 게 더 나은 것 같네요&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;새 창이 &quot;동일한 원점&quot;인 한 JS로 조작할 수 있는 힘이 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$('#a').on('click', function(e){
    e.preventDefault();
    var wi = window.open('about:blank', '_blank');

    setTimeout(function(){ // async
        wi.location.href = 'http://google.com';
    }, 500);
});
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;sync: false를 추가해 보십시오.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;효과가 있을 겁니다&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$('#myButton').click(function() {
$.ajax({
    type: 'POST',
    async: false,
    url: '/echo/json/',
    data: {'json': JSON.stringify({
        url:'http://google.com'})},
    success: function(data) {
        window.open(data.url,'_blank');
    }
});
});
&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 win = window.open('about:blank', '_blank');

myrepository.postmethod('myserviceurl', myArgs)
.then(function(result) {
    win.location.href = 'http://yourtargetlocation.com/dir/page';
});
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;범위 내에 있는 동안 동기화 호출 전에 새 창 탭을 열고 창 핸들을 잡은 다음 약속에서 ajax 결과를 받으면 다시 탐색합니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;위의 @pstenstrm에서 올린 답변(Edit 2)은 대부분 효과가 있지만, 솔루션을 보다 우아하게 만들기 위해 한 줄만 추가했습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제 경우의 ajax call이 1초 이상 걸리는데 빈 페이지에 직면한 사용자가 문제를 제기했습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;좋은 점은 방금 만든 새 창에 HTML 콘텐츠를 넣을 수 있는 방법이 있다는 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$('#a').on('click', function(e){
    e.preventDefault();
    var wi = window.open('about:blank', '_blank');
    $(wi.document.body).html(&quot;&amp;lt;p&amp;gt;Please wait while you are being redirected...&amp;lt;/p&amp;gt;&quot;);

    setTimeout(function(){ // async
        wi.location.href = 'http://google.com';
    }, 500);
});
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러면 새 탭이 &quot;방향 전환되는 동안 기다려주세요..&quot;라는 텍스트로 채워집니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;.&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;font papago-translate=&quot;translated&quot;&gt;FF 및 IE6 SP2에서 pop-blocker에 의해 탭/윈도우가 차단된 경우 window.open은 null 값을 반환합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Window/open#FAQ&quot; rel=&quot;nofollow&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;https://developer.mozilla.org/en-US/docs/Web/API/Window/open#FAQ&lt;/font&gt;&lt;/a&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;Mozilla/Firefox와 Internet Explorer 6 SP2의 팝업 차단 기능이 내장되어 있으므로 window.open()의 반환 값을 확인해야 합니다. window가 열리지 않으면 null이 됩니다.&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;URL : https://stackoverflow.com/questions/22007592/chrome-window-open-after-ajax-request-acts-like-popup&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>Ajax</category>
      <author>css3</author>
      <guid isPermaLink="true">https://css3.tistory.com/1141</guid>
      <comments>https://css3.tistory.com/1141#entry1141comment</comments>
      <pubDate>Mon, 6 Nov 2023 21:57:03 +0900</pubDate>
    </item>
    <item>
      <title>열거형에 콩 주입</title>
      <link>https://css3.tistory.com/1140</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;보고서를 위한 데이터를 준비하는 DataPrepareService가 있고 보고서 유형을 가진 Enum이 있으며 Enum에 ReportService를 주입하거나 Enum에서 ReportService에 액세스할 수 있어야 합니다.&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;@Service
public class DataPrepareService {
    // my service
}
&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;public enum ReportType {

    REPORT_1(&quot;name&quot;, &quot;filename&quot;),
    REPORT_2(&quot;name&quot;, &quot;filename&quot;),
    REPORT_3(&quot;name&quot;, &quot;filename&quot;)

    public abstract Map&amp;lt;String, Object&amp;gt; getSpecificParams();

    public Map&amp;lt;String, Object&amp;gt; getCommonParams(){
        // some code that requires service
    }
}
&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;@Autowired
DataPrepareService dataPrepareService;
&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;public enum ReportType {

    REPORT_1(&quot;name&quot;, &quot;filename&quot;),
    REPORT_2(&quot;name&quot;, &quot;filename&quot;);

    @Component
    public static class ReportTypeServiceInjector {
        @Autowired
        private DataPrepareService dataPrepareService;

        @PostConstruct
        public void postConstruct() {
            for (ReportType rt : EnumSet.allOf(ReportType.class))
               rt.setDataPrepareService(dataPrepareService);
        }
    }

[...]

}
&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/16318603/1064325&quot;&gt;weeknes의 답변&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;public enum ReportType {
    @Component
    public class ReportTypeServiceInjector {
        @Autowired
        private DataPrepareService dataPrepareService;

        @PostConstruct
        public void postConstruct() {
            for (ReportType rt : EnumSet.allOf(ReportType.class))
               rt.setDataPrepareService(dataPrepareService);
        }
    }

    REPORT_1(&quot;name&quot;, &quot;filename&quot;),
    REPORT_2(&quot;name&quot;, &quot;filename&quot;),
    ...
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여러분이 탐색하고 싶은 또 다른 접근 방법이 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하지만 주사를 놓는 대신에&lt;/font&gt;&lt;/font&gt;&lt;code&gt;bean&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;안으로&lt;/font&gt;&lt;/font&gt;&lt;code&gt;enum&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그것은 a와 관련이 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;bean&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;의 소리와 함께&lt;/font&gt;&lt;/font&gt;&lt;code&gt;enum&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;WidgetType&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Widget&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;학급&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;public enum WidgetType {
  FOO, BAR;
}

public class Widget {

  WidgetType widgetType;
  String message;

  public Widget(WidgetType widgetType, String message) {
    this.widgetType = widgetType;
    this.message = message;
  }
}
&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;Widget&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;공장을 사용하는 이 유형의 s&lt;/font&gt;&lt;/font&gt;&lt;code&gt;BarFactory&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아니면&lt;/font&gt;&lt;/font&gt;&lt;code&gt;FooFactory&lt;/code&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;public interface AbstractWidgetFactory {
  Widget createWidget();
  WidgetType factoryFor();
}

@Component
public class BarFactory implements AbstractWidgetFactory {
  @Override
  public Widget createWidget() {
    return new Widget(BAR, &quot;A Foo Widget&quot;);
  }
  @Override
  public WidgetType factoryFor() {
    return BAR;
  }
}

@Component
public class FooFactory implements AbstractWidgetFactory {
  @Override
  public Widget createWidget() {
    return new Widget(FOO, &quot;A Foo Widget&quot;);
  }
  @Override
  public WidgetType factoryFor() {
    return FOO;
  }
}
&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;WidgetService&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;AutoWired&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;등록된 모든 정보를 추적하는 필드&lt;/font&gt;&lt;/font&gt;&lt;code&gt;WidgetFactor&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;ies. as a.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;postConstruct&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;operation 우리는 열거와 관련된 공장의 지도를 만듭니다.&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;WidgetService&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;class and get factory를 지정된 열거형에 사용합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;@Service
public class WidgetService {

  @Autowired
  List&amp;lt;AbstractWidgetFactory&amp;gt; widgetFactories;

  Map&amp;lt;WidgetType, AbstractWidgetFactory&amp;gt; factoryMap = new HashMap&amp;lt;&amp;gt;();

  @PostConstruct
  public void init() {
    widgetFactories.forEach(w -&amp;gt; {
      factoryMap.put(w.factoryFor(), w);
    });
  }

  public Widget getWidgetOfType(WidgetType widgetType) {
    return factoryMap.get(widgetType).createWidget();
  }

}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;Enum&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;s는 정적이기 때문에 정적인 맥락에서 콩에 접근할 수 있는 방법을 찾아야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;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;ApplicationContextProvider&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;를 구현하는&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ApplicationContextAware&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;인터페이스.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;

public class ApplicationContextProvider implements ApplicationContextAware{

 private static ApplicationContext appContext = null;

 public static ApplicationContext getApplicationContext() {
   return appContext;
 }

 public void setApplicationContext(ApplicationContext appContext) throws BeansException {
   this.appContext = appContext;
 }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그런 다음 응용프로그램 컨텍스트 파일을 추가합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;bean id=&quot;applicationContextProvider&quot; class=&quot;xxx.xxx.ApplicationContextProvider&quot;&amp;gt;&amp;lt;/bean&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;ApplicationContext appContext = ApplicationContextProvider.getApplicationContext();
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;열거형이 인스턴스화될 때 스프링 컨테이너가 이미 가동 중이고 실행 중이라는 것을 제어하는 것은 어렵습니다(테스트 케이스에 이 유형의 변수가 있는 경우 컨테이너는 일반적으로 존재하지 않습니다. aspectj autowireing이 여기에 도움이 되지 않음).&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 그냥 데이터 준비 서비스 같은 것이 enum-parameter가 있는 lookup-parameter와 함께 특정 method를 제공하도록 하는 것을 추천합니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;당신에게 필요한 것은 이것이라고 생각합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;public enum MyEnum {
    ONE,TWO,THREE;
}
&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;@Configurable
public class MySpringConfiguredClass {

          @Autowired
      @Qualifier(&quot;mine&quot;)
          private MyEnum myEnum;

}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음은 factory-method=&quot;valueOf&quot;를 사용하고 lazy-init=&quot; false&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;pre&gt;&lt;code&gt;&amp;lt;bean id=&quot;mine&quot; class=&quot;foo.bar.MyEnum&quot; factory-method=&quot;valueOf&quot; lazy-init=&quot;false&quot;&amp;gt;
    &amp;lt;constructor-arg value=&quot;ONE&quot; /&amp;gt;
&amp;lt;/bean&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고 당신은 끝!&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;수동으로 메소드에 전달하기만 하면 됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;public enum ReportType {

    REPORT_1(&quot;name&quot;, &quot;filename&quot;),
    REPORT_2(&quot;name&quot;, &quot;filename&quot;),
    REPORT_3(&quot;name&quot;, &quot;filename&quot;)

    public abstract Map&amp;lt;String, Object&amp;gt; getSpecificParams();

    public Map&amp;lt;String, Object&amp;gt; getCommonParams(DataPrepareService  dataPrepareService){
        // some code that requires service
    }
}
&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;public enum ChartTypes {
AREA_CHART(&quot;Area Chart&quot;, XYAreaChart.class),
BAR_CHART(&quot;Bar Chart&quot;, XYBarChart.class),

private String name;
private String serviceName;

ChartTypes(String name, Class clazz) {
    this.name = name;
    this.serviceName = clazz.getSimpleName();
}

public String getServiceName() {
    return serviceName;
}

@Override
public String toString() {
    return name;
}
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고 당신이 Enum의 콩을 필요로 하는 다른 클래스에서는:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;ChartTypes plotType = ChartTypes.AreaChart
Object areaChartService = applicationContext.getBean(chartType.getServiceName());
&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/16318454/inject-bean-into-enum&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>Spring</category>
      <author>css3</author>
      <guid isPermaLink="true">https://css3.tistory.com/1140</guid>
      <comments>https://css3.tistory.com/1140#entry1140comment</comments>
      <pubDate>Wed, 1 Nov 2023 22:33:37 +0900</pubDate>
    </item>
    <item>
      <title>How to cast simple pointer to a multidimensional-array of fixed size?</title>
      <link>https://css3.tistory.com/1139</link>
      <description>&lt;h2&gt;How to cast simple pointer to a multidimensional-array of fixed size?&lt;/h2&gt;
&lt;p&gt;I have a function that takes a pointer to a floating point array. Based on other conditions, I know that pointer is actually pointing to a 2x2 OR 3x3 matrix. (in fact the memory was initially allocated as such, e.g. float M[2][2] ) The important thing is I want to make this determination in the function body, not as the function argument.&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;void calcMatrix( int face, float * matrixReturnAsArray )
{
    // Here, I would much rather work in natural matrix notation
    if( is2x2 )
    {
        // ### cast matrixReturnAsArray to somethingAsMatrix[2][2]
        somethingAsMatrix[0][1] = 2.002;
        // etc..
    }
    else if(is3x3)
    { //etc...
    }

}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;I am aware that I could use templates and other techniques to better address this problem. My question is really about how to make such a cast at the ### comment. Working in C++.&lt;/p&gt;&lt;pre&gt;&lt;code&gt;float (*somethingAsMatrix)[2] = (float (*)[2]) matrixReturnAsArray;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;float *&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;그리고 그 출연진의 결과는 A의 첫번째 요소를 가리킬 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;float [][]&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;float (&amp;amp;arr)[2][2] = *reinterpret_cast&amp;lt;float (*)[2][2]&amp;gt;(matrixReturnAsArray);
&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;float **&lt;/code&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;float*&lt;/code&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;void foo(float *f) {
    f[3] = 10.;

    float (&amp;amp;arr)[2][2] = *reinterpret_cast&amp;lt;float (*)[2][2]&amp;gt;(f);
    arr[1][1] = 10.;
}

void main() {
    float a[2][2];
    foo(&amp;amp;a[0][0]); // f[3] = 10.; is undefined behavior, arr[1][1] = 10. is well defined

    float b[4];
    foo(&amp;amp;b[0]); // f[3] = 10.; is well-defined behavior, arr[1][1] = 10. is undefined
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;정해진&lt;/font&gt;&lt;/font&gt;&lt;code&gt;float arr[2][2];&lt;/code&gt;&lt;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;amp;arr[0][1] + 1&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;와 같음&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&amp;amp;arr[1][0]&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;, 내가 판단할 수 있는 한 말입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;따라서 단일 차원 배열을 다중 차원 배열로 사용할 수는 있지만,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;f[i*width + j]&lt;/code&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;It's better to use C++'s compile-time type-safety instead of just relying on not accidentally passing the wrong thing or performing the wrong reinterpret_cast. To get type-safety using raw-arrays you should use references to the raw array type you want:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;void foo(float (&amp;amp;f)[2][2]) {}
void foo(float (&amp;amp;f)[3][3]) {}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;If you want to pass arrays by value you can't use raw arrays and should instead use something like std::array:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;void foo(std::array&amp;lt;std::array&amp;lt;float,2&amp;gt;,2&amp;gt; f) {}
void foo(std::array&amp;lt;std::array&amp;lt;float,3&amp;gt;,3&amp;gt; f) {}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This sort of casting is always cleaner, and easier to deal with, with a judicious use of typedef:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;typedef float Matrix_t[2][2];

Matrix_t* someThingAsMatrix = (Matrix_t*) matrixReturnAsArray;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;If this is C++ and not C, though, you should create a matrix class. (Or better yet, look for an open source one.)&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;type deffloat Matrix_t[2][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;Matrix_t &amp;amp; matrix = *(Matrix_t *) 행렬 배열로 반환;&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아니면&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;float (&amp;amp;matrix2)[2][2] = *(float (*)[2])matrixReturnAsArray;&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;C에는 포인터를 사용하는 방법만 있습니다.&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;매트릭스_t *일부&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;ThingAsMatrix = (Matrix_t *) 행렬 배열로 반환;&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음을 통해 액세스할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;(*SomeThingAsMatrix)[1][0] = ...&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/11869056/how-to-cast-simple-pointer-to-a-multidimensional-array-of-fixed-size&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>C</category>
      <author>css3</author>
      <guid isPermaLink="true">https://css3.tistory.com/1139</guid>
      <comments>https://css3.tistory.com/1139#entry1139comment</comments>
      <pubDate>Wed, 1 Nov 2023 22:33:27 +0900</pubDate>
    </item>
    <item>
      <title>자바스크립트 HTML5 캔버스를 이용하여 N개의 포인트를 통해 매끄러운 곡선을 그리는 방법?</title>
      <link>https://css3.tistory.com/1138</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;자바스크립트 HTML5 캔버스를 이용하여 N개의 포인트를 통해 매끄러운 곡선을 그리는 방법?&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;구글 검색을 해봤지만 선 긋기 기능은 3가지 밖에 없습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;2개의 샘플 포인트의 경우, 간단히 사용할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;lineTo&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;. 3개의 샘플 포인트의 경우&lt;/font&gt;&lt;/font&gt;&lt;code&gt;quadraticCurveTo&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;, 4개의 샘플 포인트에 대해,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;bezierCurveTo&lt;/code&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;bezierCurveTo&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;배열의 모든 4개의 점에 대해 연속적인 매끄러운 곡선 대신 4개의 샘플 점마다 꼬임이 발생합니다.)&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;샘플 포인트 5개 이상으로 매끄러운 곡선을 그리는 함수를 작성하려면 어떻게 해야 합니까?&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이후의 표본 점을 분리된 &quot;곡선 To&quot; 유형의 함수와 결합할 때의 문제는 곡선이 만나는 곳이 매끄럽지 않다는 것입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이는 두 곡선이 끝점을 공유하지만 완전히 분리된 관리점의 영향을 받기 때문입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;한 가지 해결책은 다음 두 표본점 사이의 중간점을 &quot;곡선&quot;으로 만드는 것입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 새 보간 점을 사용하여 곡선을 결합하면 끝점에서 매끄러운 전환이 이루어집니다(한 반복의 끝점이 되는 것은 다음 반복의 &lt;em&gt;제어점&lt;/em&gt;이 됩니다).&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;즉, 지금은 서로 연결된 두 곡선이 훨씬 더 많은 공통점을 가지고 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 솔루션은 &quot;Foundation ActionScript 3.0 Animation:&quot;이라는 책에서 발췌되었습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사물을 움직이게 한다&quot;, p.95 - 렌더링 기법: 여러 곡선을 만듭니다.&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;em&gt;있지만&lt;/em&gt; 훨씬 복잡합니다(http://www.cartogrammar.com/blog/actionscript-curves-update/) 참조).&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;// move to the first point
   ctx.moveTo(points[0].x, points[0].y);


   for (var i = 1; i &amp;lt; points.length - 2; i++)
   {
      var xc = (points[i].x + points[i + 1].x) / 2;
      var yc = (points[i].y + points[i + 1].y) / 2;
      ctx.quadraticCurveTo(points[i].x, points[i].y, xc, yc);
   }
 // curve through the last two points
 ctx.quadraticCurveTo(points[i].x, points[i].y, points[i+1].x,points[i+1].y);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;실행 가능한 토막글:&lt;/font&gt;&lt;/p&gt; 
&lt;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;const canvas = document.querySelector(&quot;canvas&quot;);
const ctx = canvas.getContext(&quot;2d&quot;);
const points = [
  {x: 50, y: 50},
  {x: 180, y: 100},
  {x: 75, y: 120},
  {x: 40, y: 40},
];

// move to the first point
ctx.moveTo(points[0].x, points[0].y);

for (var i = 1; i &amp;lt; points.length - 2; i++) {
  var xc = (points[i].x + points[i + 1].x) / 2;
  var yc = (points[i].y + points[i + 1].y) / 2;
  ctx.quadraticCurveTo(points[i].x, points[i].y, xc, yc);
}

// curve through the last two points
ctx.quadraticCurveTo(
  points[i].x,
  points[i].y,
  points[i + 1].x,
  points[i + 1].y
);
ctx.stroke();&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 width=&quot;600&quot; height=&quot;600&quot;&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&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://en.wikipedia.org/wiki/Cubic_Hermite_spline#Cardinal_spline&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;캔버스용으로 만든 기능입니다. 다용도성을 높이기 위해 3가지 기능으로 나누어져 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;메인 래퍼 기능은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;function drawCurve(ctx, ptsa, tension, isClosed, numOfSegments, showPoints) {

  ctx.beginPath();

  drawLines(ctx, getCurvePoints(ptsa, tension, isClosed, numOfSegments));
  
  if (showPoints) {
    ctx.beginPath();
    for(var i=0;i&amp;lt;ptsa.length-1;i+=2) 
      ctx.rect(ptsa[i] - 2, ptsa[i+1] - 2, 4, 4);
  }

  ctx.stroke();
}
&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;곡선을 그리려면 x, y 점을 순서대로 배열합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;x1,y1, x2,y2, ...xn,yn&lt;/code&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;var myPoints = [10,10, 40,30, 100,10]; //minimum two points
var tension = 1;

drawCurve(ctx, myPoints); //default tension=0.5
drawCurve(ctx, myPoints, tension);
&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;function getCurvePoints(pts, tension, isClosed, numOfSegments) {

    // use input value if provided, or use a default value   
    tension = (typeof tension != 'undefined') ? tension : 0.5;
    isClosed = isClosed ? isClosed : false;
    numOfSegments = numOfSegments ? numOfSegments : 16;

    var _pts = [], res = [],    // clone array
        x, y,           // our x,y coords
        t1x, t2x, t1y, t2y, // tension vectors
        c1, c2, c3, c4,     // cardinal points
        st, t, i;       // steps based on num. of segments

    // clone array so we don't change the original
    //
    _pts = pts.slice(0);

    // The algorithm require a previous and next point to the actual point array.
    // Check if we will draw closed or open curve.
    // If closed, copy end points to beginning and first points to end
    // If open, duplicate first points to befinning, end points to end
    if (isClosed) {
        _pts.unshift(pts[pts.length - 1]);
        _pts.unshift(pts[pts.length - 2]);
        _pts.unshift(pts[pts.length - 1]);
        _pts.unshift(pts[pts.length - 2]);
        _pts.push(pts[0]);
        _pts.push(pts[1]);
    }
    else {
        _pts.unshift(pts[1]);   //copy 1. point and insert at beginning
        _pts.unshift(pts[0]);
        _pts.push(pts[pts.length - 2]); //copy last point and append
        _pts.push(pts[pts.length - 1]);
    }

    // ok, lets start..
    
    // 1. loop goes through point array
    // 2. loop goes through each segment between the 2 pts + 1e point before and after
    for (i=2; i &amp;lt; (_pts.length - 4); i+=2) {
        for (t=0; t &amp;lt;= numOfSegments; t++) {

            // calc tension vectors
            t1x = (_pts[i+2] - _pts[i-2]) * tension;
            t2x = (_pts[i+4] - _pts[i]) * tension;
    
            t1y = (_pts[i+3] - _pts[i-1]) * tension;
            t2y = (_pts[i+5] - _pts[i+1]) * tension;

            // calc step
            st = t / numOfSegments;
        
            // calc cardinals
            c1 =   2 * Math.pow(st, 3)  - 3 * Math.pow(st, 2) + 1; 
            c2 = -(2 * Math.pow(st, 3)) + 3 * Math.pow(st, 2); 
            c3 =       Math.pow(st, 3)  - 2 * Math.pow(st, 2) + st; 
            c4 =       Math.pow(st, 3)  -     Math.pow(st, 2);

            // calc x and y cords with common control vectors
            x = c1 * _pts[i]    + c2 * _pts[i+2] + c3 * t1x + c4 * t2x;
            y = c1 * _pts[i+1]  + c2 * _pts[i+3] + c3 * t1y + c4 * t2y;
        
            //store points in array
            res.push(x);
            res.push(y);

        }
    }
    
    return res;
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;점을 매끄러운 곡선(또는 x,y 배열이 있는 경우 다른 분할된 선)으로 실제로 그리려면 다음과 같이 하십시오.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;function drawLines(ctx, pts) {
    ctx.moveTo(pts[0], pts[1]);
    for(i=2;i&amp;lt;pts.length-1;i+=2) ctx.lineTo(pts[i], pts[i+1]);
}
&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;false&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 ctx = document.getElementById(&quot;c&quot;).getContext(&quot;2d&quot;);


function drawCurve(ctx, ptsa, tension, isClosed, numOfSegments, showPoints) {

  ctx.beginPath();

  drawLines(ctx, getCurvePoints(ptsa, tension, isClosed, numOfSegments));
  
  if (showPoints) {
    ctx.beginPath();
    for(var i=0;i&amp;lt;ptsa.length-1;i+=2) 
      ctx.rect(ptsa[i] - 2, ptsa[i+1] - 2, 4, 4);
  }

  ctx.stroke();
}


var myPoints = [10,10, 40,30, 100,10, 200, 100, 200, 50, 250, 120]; //minimum two points
var tension = 1;

drawCurve(ctx, myPoints); //default tension=0.5
drawCurve(ctx, myPoints, tension);


function getCurvePoints(pts, tension, isClosed, numOfSegments) {

  // use input value if provided, or use a default value     
  tension = (typeof tension != 'undefined') ? tension : 0.5;
  isClosed = isClosed ? isClosed : false;
  numOfSegments = numOfSegments ? numOfSegments : 16;

  var _pts = [], res = [],  // clone array
      x, y,         // our x,y coords
      t1x, t2x, t1y, t2y,   // tension vectors
      c1, c2, c3, c4,       // cardinal points
      st, t, i;     // steps based on num. of segments

  // clone array so we don't change the original
  //
  _pts = pts.slice(0);

  // The algorithm require a previous and next point to the actual point array.
  // Check if we will draw closed or open curve.
  // If closed, copy end points to beginning and first points to end
  // If open, duplicate first points to befinning, end points to end
  if (isClosed) {
    _pts.unshift(pts[pts.length - 1]);
    _pts.unshift(pts[pts.length - 2]);
    _pts.unshift(pts[pts.length - 1]);
    _pts.unshift(pts[pts.length - 2]);
    _pts.push(pts[0]);
    _pts.push(pts[1]);
  }
  else {
    _pts.unshift(pts[1]);   //copy 1. point and insert at beginning
    _pts.unshift(pts[0]);
    _pts.push(pts[pts.length - 2]); //copy last point and append
    _pts.push(pts[pts.length - 1]);
  }

  // ok, lets start..

  // 1. loop goes through point array
  // 2. loop goes through each segment between the 2 pts + 1e point before and after
  for (i=2; i &amp;lt; (_pts.length - 4); i+=2) {
    for (t=0; t &amp;lt;= numOfSegments; t++) {

      // calc tension vectors
      t1x = (_pts[i+2] - _pts[i-2]) * tension;
      t2x = (_pts[i+4] - _pts[i]) * tension;

      t1y = (_pts[i+3] - _pts[i-1]) * tension;
      t2y = (_pts[i+5] - _pts[i+1]) * tension;

      // calc step
      st = t / numOfSegments;

      // calc cardinals
      c1 =   2 * Math.pow(st, 3)    - 3 * Math.pow(st, 2) + 1; 
      c2 = -(2 * Math.pow(st, 3)) + 3 * Math.pow(st, 2); 
      c3 =     Math.pow(st, 3)  - 2 * Math.pow(st, 2) + st; 
      c4 =     Math.pow(st, 3)  -     Math.pow(st, 2);

      // calc x and y cords with common control vectors
      x = c1 * _pts[i]  + c2 * _pts[i+2] + c3 * t1x + c4 * t2x;
      y = c1 * _pts[i+1]    + c2 * _pts[i+3] + c3 * t1y + c4 * t2y;

      //store points in array
      res.push(x);
      res.push(y);

    }
  }

  return res;
}

function drawLines(ctx, pts) {
  ctx.moveTo(pts[0], pts[1]);
  for(i=2;i&amp;lt;pts.length-1;i+=2) ctx.lineTo(pts[i], pts[i+1]);
}&lt;/code&gt;&lt;/pre&gt; 
  &lt;pre class=&quot;snippet-code-css lang-css prettyprint-override&quot;&gt;&lt;code&gt;canvas { border: 1px solid 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;canvas id=&quot;c&quot;&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&gt;&lt;font papago-translate=&quot;translated&quot;&gt;결과는 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;img src=&quot;https://i.stack.imgur.com/xWCkp.jpg&quot; alt=&quot;Example pix&quot;&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;ctx.drawCurve(myPoints);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음을 javascript에 추가합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;if (CanvasRenderingContext2D != 'undefined') {
    CanvasRenderingContext2D.prototype.drawCurve = 
        function(pts, tension, isClosed, numOfSegments, showPoints) {
       drawCurve(this, pts, tension, isClosed, numOfSegments, showPoints)}
}
&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;이에 대한 보다 최적화된 버전은 NPM에서 확인하실 수 있습니다 (&lt;/font&gt;&lt;/font&gt;&lt;code&gt;npm i cardinal-spline-js&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;또는 &lt;a href=&quot;https://gitlab.com/epistemex/cardinal-spline-js&quot; rel=&quot;nofollow noreferrer&quot;&gt;GitLab&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;이 그래프는 모든 점을 정확하게 통과하며 점이 [x:,y:}] n개인 완벽한 곡선이 됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var points = [{x:1,y:1},{x:2,y:3},{x:3,y:4},{x:4,y:2},{x:5,y:6}] //took 5 example points
ctx.moveTo((points[0].x), points[0].y);

for(var i = 0; i &amp;lt; points.length-1; i ++)
{

  var x_mid = (points[i].x + points[i+1].x) / 2;
  var y_mid = (points[i].y + points[i+1].y) / 2;
  var cp_x1 = (x_mid + points[i].x) / 2;
  var cp_x2 = (x_mid + points[i+1].x) / 2;
  ctx.quadraticCurveTo(cp_x1,points[i].y ,x_mid, y_mid);
  ctx.quadraticCurveTo(cp_x2,points[i+1].y ,points[i+1].x,points[i+1].y);
}
&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;strong&gt;중요:&lt;/strong&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;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;https://i.stack.imgur.com/M9adH.png&quot; rel=&quot;noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/M9adH.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;이 코드를 HTML에 저장하여 테스트합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;/p&gt;
&lt;div class=&quot;snippet&quot; data-lang=&quot;js&quot; data-hide=&quot;false&quot; data-console=&quot;true&quot; data-babel=&quot;false&quot;&gt; 
 &lt;div class=&quot;snippet-code&quot;&gt; 
  &lt;pre class=&quot;snippet-code-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;1200&quot; height=&quot;700&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 cv = document.getElementById(&quot;myCanvas&quot;);
    		var ctx = cv.getContext(&quot;2d&quot;);
    
    		function gradient(a, b) {
    			return (b.y-a.y)/(b.x-a.x);
    		}
    
    		function bzCurve(points, f, t) {
    			//f = 0, will be straight line
    			//t suppose to be 1, but changing the value can control the smoothness too
    			if (typeof(f) == 'undefined') f = 0.3;
    			if (typeof(t) == 'undefined') t = 0.6;
    
    			ctx.beginPath();
    			ctx.moveTo(points[0].x, points[0].y);
    
    			var m = 0;
    			var dx1 = 0;
    			var dy1 = 0;
    
    			var preP = points[0];
    			for (var i = 1; i &amp;lt; points.length; i++) {
    				var curP = points[i];
    				nexP = points[i + 1];
    				if (nexP) {
    					m = gradient(preP, nexP);
    					dx2 = (nexP.x - curP.x) * -f;
    					dy2 = dx2 * m * t;
    				} else {
    					dx2 = 0;
    					dy2 = 0;
    				}
    				ctx.bezierCurveTo(preP.x - dx1, preP.y - dy1, curP.x + dx2, curP.y + dy2, curP.x, curP.y);
    				dx1 = dx2;
    				dy1 = dy2;
    				preP = curP;
    			}
    			ctx.stroke();
    		}
    
    		// Generate random data
    		var lines = [];
    		var X = 10;
    		var t = 40; //to control width of X
    		for (var i = 0; i &amp;lt; 100; i++ ) {
    			Y = Math.floor((Math.random() * 300) + 50);
    			p = { x: X, y: Y };
    			lines.push(p);
    			X = X + t;
    		}
    
    		//draw straight line
    		ctx.beginPath();
    		ctx.setLineDash([5]);
    		ctx.lineWidth = 1;
    		bzCurve(lines, 0, 1);
    
    		//draw smooth line
    		ctx.setLineDash([0]);
    		ctx.lineWidth = 2;
    		ctx.strokeStyle = &quot;blue&quot;;
    		bzCurve(lines, 0.3, 1);
    	&amp;lt;/script&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;&gt;&lt;a href=&quot;https://stackoverflow.com/a/10060462/268040&quot;&gt;Daniel Howard가 지적&lt;/a&gt;한 바와 같이, Rob Spencer는 http://scaledinnovation.com/analytics/splines/aboutSplines.html 에서 여러분이 원하는 것을 설명합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;대화형 데모는 다음과 같습니다. http://jsbin.com/ApitIxo/2/&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;jsbin이 다운된 경우를 대비하여 토막글로 제공합니다.&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;meta charset=utf-8 /&amp;gt;
        &amp;lt;title&amp;gt;Demo smooth connection&amp;lt;/title&amp;gt;
      &amp;lt;/head&amp;gt;
      &amp;lt;body&amp;gt;
        &amp;lt;div id=&quot;display&quot;&amp;gt;
          Click to build a smooth path. 
          (See Rob Spencer's &amp;lt;a href=&quot;http://scaledinnovation.com/analytics/splines/aboutSplines.html&quot;&amp;gt;article&amp;lt;/a&amp;gt;)
          &amp;lt;br&amp;gt;&amp;lt;label&amp;gt;&amp;lt;input type=&quot;checkbox&quot; id=&quot;showPoints&quot; checked&amp;gt; Show points&amp;lt;/label&amp;gt;
          &amp;lt;br&amp;gt;&amp;lt;label&amp;gt;&amp;lt;input type=&quot;checkbox&quot; id=&quot;showControlLines&quot; checked&amp;gt; Show control lines&amp;lt;/label&amp;gt;
          &amp;lt;br&amp;gt;
          &amp;lt;label&amp;gt;
            &amp;lt;input type=&quot;range&quot; id=&quot;tension&quot; min=&quot;-1&quot; max=&quot;2&quot; step=&quot;.1&quot; value=&quot;.5&quot; &amp;gt; Tension &amp;lt;span id=&quot;tensionvalue&quot;&amp;gt;(0.5)&amp;lt;/span&amp;gt;
          &amp;lt;/label&amp;gt;
        &amp;lt;div id=&quot;mouse&quot;&amp;gt;&amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
        &amp;lt;canvas id=&quot;canvas&quot;&amp;gt;&amp;lt;/canvas&amp;gt;
        &amp;lt;style&amp;gt;
          html { position: relative; height: 100%; width: 100%; }
          body { position: absolute; left: 0; right: 0; top: 0; bottom: 0; } 
          canvas { outline: 1px solid red; }
          #display { position: fixed; margin: 8px; background: white; z-index: 1; }
        &amp;lt;/style&amp;gt;
        &amp;lt;script&amp;gt;
          function update() {
            $(&quot;tensionvalue&quot;).innerHTML=&quot;(&quot;+$(&quot;tension&quot;).value+&quot;)&quot;;
            drawSplines();
          }
          $(&quot;showPoints&quot;).onchange = $(&quot;showControlLines&quot;).onchange = $(&quot;tension&quot;).onchange = update;
      
          // utility function
          function $(id){ return document.getElementById(id); }
          var canvas=$(&quot;canvas&quot;), ctx=canvas.getContext(&quot;2d&quot;);

          function setCanvasSize() {
            canvas.width = parseInt(window.getComputedStyle(document.body).width);
            canvas.height = parseInt(window.getComputedStyle(document.body).height);
          }
          window.onload = window.onresize = setCanvasSize();
      
          function mousePositionOnCanvas(e) {
            var el=e.target, c=el;
            var scaleX = c.width/c.offsetWidth || 1;
            var scaleY = c.height/c.offsetHeight || 1;
          
            if (!isNaN(e.offsetX)) 
              return { x:e.offsetX*scaleX, y:e.offsetY*scaleY };
          
            var x=e.pageX, y=e.pageY;
            do {
              x -= el.offsetLeft;
              y -= el.offsetTop;
              el = el.offsetParent;
            } while (el);
            return { x: x*scaleX, y: y*scaleY };
          }
      
          canvas.onclick = function(e){
            var p = mousePositionOnCanvas(e);
            addSplinePoint(p.x, p.y);
          };
      
          function drawPoint(x,y,color){
            ctx.save();
            ctx.fillStyle=color;
            ctx.beginPath();
            ctx.arc(x,y,3,0,2*Math.PI);
            ctx.fill()
            ctx.restore();
          }
          canvas.onmousemove = function(e) {
            var p = mousePositionOnCanvas(e);
            $(&quot;mouse&quot;).innerHTML = p.x+&quot;,&quot;+p.y;
          };
      
          var pts=[]; // a list of x and ys

          // given an array of x,y's, return distance between any two,
          // note that i and j are indexes to the points, not directly into the array.
          function dista(arr, i, j) {
            return Math.sqrt(Math.pow(arr[2*i]-arr[2*j], 2) + Math.pow(arr[2*i+1]-arr[2*j+1], 2));
          }

          // return vector from i to j where i and j are indexes pointing into an array of points.
          function va(arr, i, j){
            return [arr[2*j]-arr[2*i], arr[2*j+1]-arr[2*i+1]]
          }
      
          function ctlpts(x1,y1,x2,y2,x3,y3) {
            var t = $(&quot;tension&quot;).value;
            var v = va(arguments, 0, 2);
            var d01 = dista(arguments, 0, 1);
            var d12 = dista(arguments, 1, 2);
            var d012 = d01 + d12;
            return [x2 - v[0] * t * d01 / d012, y2 - v[1] * t * d01 / d012,
                    x2 + v[0] * t * d12 / d012, y2 + v[1] * t * d12 / d012 ];
          }

          function addSplinePoint(x, y){
            pts.push(x); pts.push(y);
            drawSplines();
          }
          function drawSplines() {
            clear();
            cps = []; // There will be two control points for each &quot;middle&quot; point, 1 ... len-2e
            for (var i = 0; i &amp;lt; pts.length - 2; i += 1) {
              cps = cps.concat(ctlpts(pts[2*i], pts[2*i+1], 
                                      pts[2*i+2], pts[2*i+3], 
                                      pts[2*i+4], pts[2*i+5]));
            }
            if ($(&quot;showControlLines&quot;).checked) drawControlPoints(cps);
            if ($(&quot;showPoints&quot;).checked) drawPoints(pts);
    
            drawCurvedPath(cps, pts);
 
          }
          function drawControlPoints(cps) {
            for (var i = 0; i &amp;lt; cps.length; i += 4) {
              showPt(cps[i], cps[i+1], &quot;pink&quot;);
              showPt(cps[i+2], cps[i+3], &quot;pink&quot;);
              drawLine(cps[i], cps[i+1], cps[i+2], cps[i+3], &quot;pink&quot;);
            } 
          }
      
          function drawPoints(pts) {
            for (var i = 0; i &amp;lt; pts.length; i += 2) {
              showPt(pts[i], pts[i+1], &quot;black&quot;);
            } 
          }
      
          function drawCurvedPath(cps, pts){
            var len = pts.length / 2; // number of points
            if (len &amp;lt; 2) return;
            if (len == 2) {
              ctx.beginPath();
              ctx.moveTo(pts[0], pts[1]);
              ctx.lineTo(pts[2], pts[3]);
              ctx.stroke();
            }
            else {
              ctx.beginPath();
              ctx.moveTo(pts[0], pts[1]);
              // from point 0 to point 1 is a quadratic
              ctx.quadraticCurveTo(cps[0], cps[1], pts[2], pts[3]);
              // for all middle points, connect with bezier
              for (var i = 2; i &amp;lt; len-1; i += 1) {
                // console.log(&quot;to&quot;, pts[2*i], pts[2*i+1]);
                ctx.bezierCurveTo(
                  cps[(2*(i-1)-1)*2], cps[(2*(i-1)-1)*2+1],
                  cps[(2*(i-1))*2], cps[(2*(i-1))*2+1],
                  pts[i*2], pts[i*2+1]);
              }
              ctx.quadraticCurveTo(
                cps[(2*(i-1)-1)*2], cps[(2*(i-1)-1)*2+1],
                pts[i*2], pts[i*2+1]);
              ctx.stroke();
            }
          }
          function clear() {
            ctx.save();
            // use alpha to fade out
            ctx.fillStyle = &quot;rgba(255,255,255,.7)&quot;; // clear screen
            ctx.fillRect(0,0,canvas.width,canvas.height);
            ctx.restore();
          }
      
          function showPt(x,y,fillStyle) {
            ctx.save();
            ctx.beginPath();
            if (fillStyle) {
              ctx.fillStyle = fillStyle;
            }
            ctx.arc(x, y, 5, 0, 2*Math.PI);
            ctx.fill();
            ctx.restore();
          }

          function drawLine(x1, y1, x2, y2, strokeStyle){
            ctx.beginPath();
            ctx.moveTo(x1, y1);
            ctx.lineTo(x2, y2);
            if (strokeStyle) {
              ctx.save();
              ctx.strokeStyle = strokeStyle;
              ctx.stroke();
              ctx.restore();
            }
            else {
              ctx.save();
              ctx.strokeStyle = &quot;pink&quot;;
              ctx.stroke();
              ctx.restore();
            }
          }

        &amp;lt;/script&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;&gt;잘 작동한다는 걸 알았습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;function drawCurve(points, tension) {
    ctx.beginPath();
    ctx.moveTo(points[0].x, points[0].y);

    var t = (tension != null) ? tension : 1;
    for (var i = 0; i &amp;lt; points.length - 1; i++) {
        var p0 = (i &amp;gt; 0) ? points[i - 1] : points[0];
        var p1 = points[i];
        var p2 = points[i + 1];
        var p3 = (i != points.length - 2) ? points[i + 2] : p2;

        var cp1x = p1.x + (p2.x - p0.x) / 6 * t;
        var cp1y = p1.y + (p2.y - p0.y) / 6 * t;

        var cp2x = p2.x - (p3.x - p1.x) / 6 * t;
        var cp2y = p2.y - (p3.y - p1.y) / 6 * t;

        ctx.bezierCurveTo(cp1x, cp1y, cp2x, cp2y, p2.x, p2.y);
    }
    ctx.stroke();
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;KineticJ를 시도해 보십시오. 점 배열로 스플라인을 정의할 수 있습니다.&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;이전 URL: http://www.html5canvastutorials.com/kineticjs/html5-canvas-kineticjs-spline-tutorial/&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아카이브 URL 참조: www.html5canvastutorials.com/kineticjs/html5-canvas-kineticjs-spline-tutorial/ ://https://web.archive.org/web/20141204030628/http&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;나는 user1693593의 해결책에 감사합니다: 헤르마이트 다항식은 그려질 것을 제어하는 가장 좋은 방법인 것 같고, 수학적인 관점에서 가장 만족스럽습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그 과목은 오랫동안 닫혀있는 것처럼 보이지만, 저 같은 후발주자들은 여전히 관심이 있을 수도 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;곡선을 저장하고 다른 곳에서 다시 사용할 수 있는 무료 대화형 플롯 작성기를 찾아봤지만, 웹에서 이런 것을 찾지 못했습니다: 그래서 사용자 1693593에서 언급한 위키백과 소스에서 제가 직접 만들었습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여기서는 어떻게 작동하는지 설명하기가 어려우며, 가치가 있는지 알 수 있는 가장 좋은 방법은 https://sites.google.com/view/divertissements/accueil/splines 을 보는 것입니다.&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;pre&gt;&lt;code&gt;function smooth(ctx, points)
{
    if(points == undefined || points.length == 0)
    {
        return true;
    }
    if(points.length == 1)
    {
        ctx.moveTo(points[0].x, points[0].y);
        ctx.lineTo(points[0].x, points[0].y);
        return true;
    }
    if(points.length == 2)
    {
        ctx.moveTo(points[0].x, points[0].y);
        ctx.lineTo(points[1].x, points[1].y);
        return true;
    }
    ctx.moveTo(points[0].x, points[0].y);
    for (var i = 1; i &amp;lt; points.length - 2; i ++)
    {
        var xc = (points[i].x + points[i + 1].x) / 2;
        var yc = (points[i].y + points[i + 1].y) / 2;
        ctx.quadraticCurveTo(points[i].x, points[i].y, xc, yc);
    }
    ctx.quadraticCurveTo(points[i].x, points[i].y, points[i+1].x, points[i+1].y);
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 코드는 제게 딱 맞습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;this.context.beginPath();
this.context.moveTo(data[0].x, data[0].y);
for (let i = 1; i &amp;lt; data.length; i++) {
  this.context.bezierCurveTo(
    data[i - 1].x + (data[i].x - data[i - 1].x) / 2,
    data[i - 1].y,
    data[i - 1].x + (data[i].x - data[i - 1].x) / 2,
    data[i].y,
    data[i].x,
    data[i].y);
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;올바른 매끄러운 선과 올바른 끝점 NOTEST! (y = &quot;canvas 높이&quot; - y);&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;ul&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그것은 일련의 점들로 설명됩니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;선이 점들에 작은 곡선을 가지고 있는 곳&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;선은 반드시 &lt;em&gt;점들&lt;/em&gt;을 통과할 필요는 없습니다(즉, 점들 중 약간 &quot;inside&quot;를 통과합니다).&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그렇다면 아래의 제 기능이 도움이 되기를 바랍니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;/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;1200&quot; height=&quot;700&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 cv = document.getElementById(&quot;myCanvas&quot;);
    var ctx = cv.getContext(&quot;2d&quot;);

    const drawPointsWithCurvedCorners = (points, ctx) =&amp;gt; {
        for (let n = 0; n &amp;lt;= points.length - 1; n++) {
            let pointA = points[n];
            let pointB = points[(n + 1) % points.length];
            let pointC = points[(n + 2) % points.length];

            const midPointAB = {
                x: pointA.x + (pointB.x - pointA.x) / 2,
                y: pointA.y + (pointB.y - pointA.y) / 2,
            };
            const midPointBC = {
                x: pointB.x + (pointC.x - pointB.x) / 2,
                y: pointB.y + (pointC.y - pointB.y) / 2,
            };
            ctx.moveTo(midPointAB.x, midPointAB.y);
            ctx.arcTo(
                pointB.x,
                pointB.y,
                midPointBC.x,
                midPointBC.y,
                radii[pointB.r]
            );
            ctx.lineTo(midPointBC.x, midPointBC.y);
        }
    };

    const shapeWidth = 200;
    const shapeHeight = 150;

    const topInsetDepth = 35;
    const topInsetSideWidth = 20;
    const topInsetHorizOffset = shapeWidth * 0.25;

    const radii = {
        small: 15,
        large: 30,
    };

    const points = [
        {
            // TOP-LEFT
            x: 0,
            y: 0,
            r: &quot;large&quot;,
        },
        {
            x: topInsetHorizOffset,
            y: 0,
            r: &quot;small&quot;,
        },
        {
            x: topInsetHorizOffset + topInsetSideWidth,
            y: topInsetDepth,
            r: &quot;small&quot;,
        },
        {
            x: shapeWidth - (topInsetHorizOffset + topInsetSideWidth),
            y: topInsetDepth,
            r: &quot;small&quot;,
        },
        {
            x: shapeWidth - topInsetHorizOffset,
            y: 0,
            r: &quot;small&quot;,
        },
        {
            // TOP-RIGHT
            x: shapeWidth,
            y: 0,
            r: &quot;large&quot;,
        },
        {
            // BOTTOM-RIGHT
            x: shapeWidth,
            y: shapeHeight,
            r: &quot;large&quot;,
        },
        {
            // BOTTOM-LEFT
            x: 0,
            y: shapeHeight,
            r: &quot;large&quot;,
        },
    ];

    // ACTUAL DRAWING OF POINTS
    ctx.beginPath();
    drawPointsWithCurvedCorners(points, ctx);
    ctx.stroke();
&amp;lt;/script&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;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;K3N의 기본 스플라인 방식에 추가하고 오해의 소지가 있는 곳에서 곡선 '디핑'에 대한 T. J. Crowder의 우려를 해결하기 위해 다음 코드를 삽입했습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;getCurvePoints()&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;function&lt;/font&gt;&lt;/font&gt;&lt;code&gt;res.push(x);&lt;/code&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;if ((y &amp;lt; _pts[i+1] &amp;amp;&amp;amp; y &amp;lt; _pts[i+3]) || (y &amp;gt; _pts[i+1] &amp;amp;&amp;amp; y &amp;gt; _pts[i+3])) {
    y = (_pts[i+1] + _pts[i+3]) / 2;
}
if ((x &amp;lt; _pts[i] &amp;amp;&amp;amp; x &amp;lt; _pts[i+2]) || (x &amp;gt; _pts[i] &amp;amp;&amp;amp; x &amp;gt; _pts[i+2])) {
    x = (_pts[i] + _pts[i+2]) / 2;
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이렇게 하면 각 연속적인 점 쌍 사이에 (보이지 않는) 경계 상자가 효과적으로 생성되고 곡선이 이 경계 상자 내에 유지됩니다. 즉, 곡선의 한 점이 두 점의 위/아래/좌/우에 있으면 그 위치가 상자 내에 있도록 변경됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여기서는 중간점을 사용하지만, 선형 보간을 사용하여 이를 개선할 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;만약 당신이 n개의 점을 통해 곡선의 방정식을 결정하고 싶다면, 다음 코드는 n-1차 다항식의 계수들을 당신에게 주고 이 계수들을 다음에 저장할 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;coefficients[]&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;x 좌표가 순서대로 있을 필요는 없습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것은 &lt;a href=&quot;https://en.wikipedia.org/wiki/Lagrange_polynomial&quot; rel=&quot;nofollow noreferrer&quot;&gt;라그랑주 다항식&lt;/a&gt;의 예입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var xPoints=[2,4,3,6,7,10]; //example coordinates
var yPoints=[2,5,-2,0,2,8];
var coefficients=[];
for (var m=0; m&amp;lt;xPoints.length; m++) coefficients[m]=0;
    for (var m=0; m&amp;lt;xPoints.length; m++) {
        var newCoefficients=[];
        for (var nc=0; nc&amp;lt;xPoints.length; nc++) newCoefficients[nc]=0;
        if (m&amp;gt;0) {
            newCoefficients[0]=-xPoints[0]/(xPoints[m]-xPoints[0]);
            newCoefficients[1]=1/(xPoints[m]-xPoints[0]);
    } else {
        newCoefficients[0]=-xPoints[1]/(xPoints[m]-xPoints[1]);
        newCoefficients[1]=1/(xPoints[m]-xPoints[1]);
    }
    var startIndex=1; 
    if (m==0) startIndex=2; 
    for (var n=startIndex; n&amp;lt;xPoints.length; n++) {
        if (m==n) continue;
        for (var nc=xPoints.length-1; nc&amp;gt;=1; nc--) {
        newCoefficients[nc]=newCoefficients[nc]*(-xPoints[n]/(xPoints[m]-xPoints[n]))+newCoefficients[nc-1]/(xPoints[m]-xPoints[n]);
        }
        newCoefficients[0]=newCoefficients[0]*(-xPoints[n]/(xPoints[m]-xPoints[n]));
    }    
    for (var nc=0; nc&amp;lt;xPoints.length; nc++) coefficients[nc]+=yPoints[m]*newCoefficients[nc];
}
&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;이 방법은 제 방법이며 3D로 확장할 수 있습니다.&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;translated&quot;&gt;b(t) = (1-t)^2A + &lt;em&gt;2&lt;/em&gt;(1-t)&lt;em&gt;tB&lt;/em&gt; + t^2*C&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;t = 0 또는 1일 때 곡선은 점 A 또는 C를 통과할 수 있지만 B를 통과하는 것은 보장되지 않습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그것의 1계 파생상품은&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;b'(t) = 2(t-1)&lt;em&gt;A &lt;/em&gt;+ &lt;em&gt;2&lt;/em&gt;(1-2t&lt;em&gt;)&lt;em&gt;B &lt;/em&gt;&lt;/em&gt;+ &lt;em&gt;&lt;em&gt;2tC&lt;/em&gt;&lt;/em&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;두 개의 쿼드 베저 곡선으로 P0,P1,P2 점을 통과하는 곡선을 구성하려면 p1에서 두 베저 곡선의 기울기가 같아야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;b'α(t) = 2(t-1)&lt;em&gt;P0 &lt;/em&gt;+ &lt;em&gt;2&lt;/em&gt;(1-2t&lt;em&gt;)&lt;em&gt;M1 &lt;/em&gt;&lt;/em&gt;+ 2tP1&lt;/font&gt;&lt;/p&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;b'β(t) = 2(t-1)&lt;em&gt;P1 &lt;/em&gt;+ &lt;em&gt;2&lt;/em&gt;(1-2t&lt;em&gt;)&lt;em&gt;M2 &lt;/em&gt;&lt;/em&gt;+ 2tP2&lt;/font&gt;&lt;/p&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;b'α(1) = b'β(0)&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;(M1 + M2) / 2 = P1&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그래서 이렇게 3점까지 곡선을 그릴 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;bezier(p0, m1, p1);
bezier(p1, m2, p2);
&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;m1p1 = p1m2&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;. 방향은.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;m1m2&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;중요하지 않습니다, 에 의해 발견할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;p2 - p1&lt;/code&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;4개 이상의 점을 통과하는 곡선의 경우&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;bezier(p0, m1, p1);
bezier(p1, m2, (m2 + m3) / 2);
bezier((m2 + m3) / 2, m3, p2);
bezier(p2, m4, p3);
&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;m1p1 = p1m2&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;m3p2 = p2m4&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;function drawCurve(ctx: CanvasRenderingContext2D, points: { x: number, y: number }[], tension = 2) {
    if (points.length &amp;lt; 2) {
        return;
    }
    ctx.beginPath();
    if (points.length === 2) {
        ctx.moveTo(points[0].x, points[0].y);
        ctx.lineTo(points[1].x, points[1].y);
        ctx.stroke();
        return;
    }
    let prevM2x = 0;
    let prevM2y = 0;
    for (let i = 1, len = points.length; i &amp;lt; len - 1; ++i) {
        const p0 = points[i - 1];
        const p1 = points[i];
        const p2 = points[i + 1];
        let tx = p2.x - (i === 1 ? p0.x : prevM2x);
        let ty = p2.y - (i === 1 ? p0.y : prevM2y);
        const tLen = Math.sqrt(tx ** 2 + ty ** 2);
        if (tLen &amp;gt; 1e-8) {
            const inv = 1 / tLen;
            tx *= inv;
            ty *= inv;
        } else {
            tx = 0;
            ty = 0;
        }
        const det = Math.sqrt(Math.min(
            (p0.x - p1.x) ** 2 + (p0.y - p1.y) ** 2,
            (p2.x - p1.x) ** 2 + (p2.y - p1.y) ** 2
        )) / (2 * tension);
        const m1x = p1.x - tx * det;
        const m1y = p1.y - ty * det;
        const m2x = p1.x + tx * det;
        const m2y = p1.y + ty * det;
        if (i === 1) {
            ctx.moveTo(p0.x, p0.y);
            ctx.quadraticCurveTo(m1x, m1y, p1.x, p1.y);
        } else {
            const mx = (prevM2x + m1x) / 2;
            const my = (prevM2y + m1y) / 2;
            ctx.quadraticCurveTo(prevM2x, prevM2y, mx, my);
            ctx.quadraticCurveTo(m1x, m1y, p1.x, p1.y);
        }
        if (i === len - 2) {
            ctx.quadraticCurveTo(m2x, m2y, p2.x, p2.y);
        }
        prevM2x = m2x;
        prevM2y = m2y;
    }
    ctx.stroke();
}
&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/7054272/how-to-draw-smooth-curve-through-n-points-using-javascript-html5-canvas&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>JavaScript</category>
      <author>css3</author>
      <guid isPermaLink="true">https://css3.tistory.com/1138</guid>
      <comments>https://css3.tistory.com/1138#entry1138comment</comments>
      <pubDate>Wed, 1 Nov 2023 22:33:21 +0900</pubDate>
    </item>
    <item>
      <title>mysql (mariadb) 튜닝 및 성능 테스터</title>
      <link>https://css3.tistory.com/1137</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;mysql (mariadb) 튜닝 및 성능 테스터&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;my.cnf config 파일을 편집하여 mysql(mariadb) 서버에 가장 적합한 성능을 내는 방법을 잘 모르겠습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;샘플 my-hug.ini를 기준으로 값을 변경했습니다.&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;ul&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;인텔 Xeon CPU 3.00GHz(+하이퍼 쓰레드) 2배&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;4GB RAM&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;2x scsi HDD 300gb(미러)&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;애플리케이션이 최고의 성능을 발휘할 수 있기 때문에 My ISAM을 선호합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;mysql을 실행하기 위한 서버를 기반으로 해서 정말 좋게 만들고 싶습니다 :) 쿼리 통계: 65% 선택, 30% 업데이트&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;#
# The MySQL database server configuration file.
#
# You can copy this to one of:
# - &quot;/etc/mysql/my.cnf&quot; to set global options,
# - &quot;~/.my.cnf&quot; to set user-specific options.
# 
# One can use all long options that the program supports.
# Run program with --help to get a list of available options and with
# --print-defaults to see which it would actually understand and use.
#
# For explanations see
# http://dev.mysql.com/doc/mysql/en/server-system-variables.html

# This will be passed to all mysql clients
# It has been reported that passwords should be enclosed with ticks/quotes
# escpecially if they contain &quot;#&quot; chars...
# Remember to edit /etc/mysql/debian.cnf when changing the socket location.
[client]
port        = 3306
socket      = /var/run/mysqld/mysqld.sock

# Here is entries for some specific programs
# The following values assume you have at least 32M ram

# This was formally known as [safe_mysqld]. Both versions are currently parsed.
[mysqld_safe]
socket      = /var/run/mysqld/mysqld.sock
nice        = 0

[mysqld]
#
# * Basic Settings
#
user        = mysql
pid-file    = /var/run/mysqld/mysqld.pid
socket      = /var/run/mysqld/mysqld.sock
port        = 3306
basedir     = /usr
datadir     = /var/lib/mysql
tmpdir      = /tmp
lc-messages-dir = /usr/share/mysql
skip-external-locking

key_buffer_size     = 384M
max_allowed_packet   = 1M
table_open_cache     = 512
sort_buffer_size     = 2M
read_buffer_size     = 2M
read_rnd_buffer_size     = 8M
myisam_sort_buffer_size  = 64M
thread_cache_size    = 8
query_cache_size     = 32M
thread_concurrency   = 4

# Error log - should be very few entries.
log_error = /var/log/mysql/error.log

# Here you can see queries with especially long duration
#slow_query_log_file = /var/log/mysql/mysql-slow.log
#slow_query_log      = 1
#long_query_time = 2
#log_queries_not_using_indexes


# The following can be used as easy to replay backup logs or for replication.
# note: if you are setting up a replication slave, see README.Debian about
#       other settings you may need to change.
#server-id      = 1
#log_bin            = /var/log/mysql/mysql-bin.log
expire_logs_days    = 10
max_binlog_size         = 100M
#binlog_do_db       = include_database_name
#binlog_ignore_db   = include_database_name

[mysqldump]
quick
max_allowed_packet   = 16M

[mysql]
no-auto-rehash
# Remove the next comment character if you are not familiar with SQL
#safe-updates

[myisamchk]
key_buffer_size      = 256M
sort_buffer_size     = 256M
read_buffer  = 2M
write_buffer     = 2M

[mysqlhotcopy]
interactive-timeout

[isamchk]
key_buffer      = 16M

#
# * IMPORTANT: Additional settings that can override those from this file!
#   The files must end with '.cnf', otherwise they'll be ignored.
#
!includedir /etc/mysql/conf.d/
&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/30291671/mysql-mariadb-tuning-and-performance-tester&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>MariaDB</category>
      <author>css3</author>
      <guid isPermaLink="true">https://css3.tistory.com/1137</guid>
      <comments>https://css3.tistory.com/1137#entry1137comment</comments>
      <pubDate>Wed, 1 Nov 2023 22:32:58 +0900</pubDate>
    </item>
    <item>
      <title>PHP에서 연산자 오버로드가 가능합니까?</title>
      <link>https://css3.tistory.com/1136</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;PHP에서 연산자 오버로드가 가능합니까?&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;구체적으로 Array 클래스를 생성하고 [] 연산자를 오버로드하고 싶습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;PHP5를 사용하는 경우(&lt;a href=&quot;http://us3.php.net/manual/en/class.arrayobject.php&quot; rel=&quot;noreferrer&quot;&gt;사용&lt;/a&gt;해야 할 경우), SPL &lt;a href=&quot;http://us3.php.net/manual/en/class.arrayobject.php&quot; rel=&quot;noreferrer&quot;&gt;ArrayObject&lt;/a&gt; 클래스를 살펴봅니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;설명서가 별로 좋지는 않지만 ArrayObject를 확장하면 &quot;가짜&quot; 배열을 갖게 될 것 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;편집: 간단한 예를 들어보겠습니다. 하지만 중요한 활용 사례는 없습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;class a extends ArrayObject {
    public function offsetSet($i, $v) {
        echo 'appending ' . $v;
        parent::offsetSet($i, $v);
    }
}

$a = new a;
$a[] = 1;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;실제로 최적의 솔루션은 ArrayAccess 인터페이스의 네 가지 방법인 http://php.net/manual/en/class.arrayaccess.php 을 구현하는 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;개체를 'foreach' 컨텍스트에서도 사용하려면 'Iterator' 인터페이스를 구현해야 합니다. http://www.php.net/manual/en/class.iterator.php&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;PHP의 오버로딩 및 연산자(&lt;a href=&quot;http://php.net/manual/en/language.oop5.overloading.php&quot; rel=&quot;noreferrer&quot;&gt;오버로딩&lt;/a&gt; 및 배열 &lt;a href=&quot;http://php.net/manual/en/language.operators.array.php&quot; rel=&quot;noreferrer&quot;&gt;연산자&lt;/a&gt; 참조) 개념은 C++의 개념과 다릅니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;+, -, [] 등의 연산자에 과부하가 걸릴 수는 없다고 생각합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;b&gt;&lt;font papago-translate=&quot;translated&quot;&gt;가능한 해결책&lt;/font&gt;&lt;/b&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;http://php.net/manual/en/class.arrayobject.php&quot; rel=&quot;noreferrer&quot;&gt;SPL&lt;/a&gt; Array &lt;a href=&quot;http://php.net/manual/en/class.arrayobject.php&quot; rel=&quot;noreferrer&quot;&gt;Object&lt;/a&gt; 구현(&lt;a href=&quot;https://stackoverflow.com/users/87380/cbeer&quot;&gt;Cbeer&lt;/a&gt;에서 언급한 대로)&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;http://php.net/manual/en/class.iterator.php&quot; rel=&quot;noreferrer&quot;&gt;반복기&lt;/a&gt; 구현(인 경우)&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ArrayObject&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;당신에게 너무 느립니다.&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;http://pecl.php.net/package/operator&quot; rel=&quot;noreferrer&quot;&gt;PECL 연산자&lt;/a&gt; 확장을 사용합니다(&lt;a href=&quot;https://stackoverflow.com/users/13816/benson&quot;&gt;Benson&lt;/a&gt;이 언급한 대로).&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;PHP 5.0+에서 간단하고 깨끗한 솔루션을 위해 &lt;a href=&quot;https://www.php.net/manual/en/class.arrayaccess.php&quot; rel=&quot;nofollow noreferrer&quot;&gt;인터페이스&lt;/a&gt;와 override functions offsetGet, offset, offset을 구현해야 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;존재 및 offsetUnset입니다.&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;예(PHP7+의 경우):&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;?php
class A implements ArrayAccess {
    private $data = [];

    public function offsetGet($offset) {
        return $this-&amp;gt;data[$offset] ?? null;
    }

    public function offsetSet($offset, $value) {
        if ($offset === null) {
            $this-&amp;gt;data[] = $value;
        } else {
            $this-&amp;gt;data[$offset] = $value;
        }
    }

    public function offsetExists($offset) {
        return isset($this-&amp;gt;data[$offset]);
    }

    public function offsetUnset($offset) {
        unset($this-&amp;gt;data[$offset]);
    }
}

$obj = new A();
$obj[] = 'a';
$obj['k'] = 'b';
echo $obj[0], $obj['k']; // print &quot;ab&quot;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언어의 기능이 아닌 것 같습니다. 이 &lt;a href=&quot;http://bugs.php.net/bug.php?id=9331&quot; rel=&quot;nofollow noreferrer&quot;&gt;버그&lt;/a&gt;를 참조하십시오.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하지만 오버로드를 할 수 있는 &lt;a href=&quot;http://pecl.php.net/package/operator&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;간단히 말해서, 아니요. C++ 스타일의 과부하가 필요하다고 생각되는 경우 문제 해결책을 다시 생각해 볼 필요가 있습니다.&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;Jamie Zawinski의 말을 빌리자면, &quot;당신은 문제가 있고 '나는 알고 있습니다!'라고 생각합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;오퍼레이터 과부하를 걸겠습니다!'&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이제 두 가지 문제가 생겼습니다.&quot;&lt;/font&gt;&lt;/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/787692/is-it-possible-to-overload-operators-in-php&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>php</category>
      <author>css3</author>
      <guid isPermaLink="true">https://css3.tistory.com/1136</guid>
      <comments>https://css3.tistory.com/1136#entry1136comment</comments>
      <pubDate>Wed, 1 Nov 2023 22:32:50 +0900</pubDate>
    </item>
    <item>
      <title>부모에서 자식으로 각진 상태로 이벤트 전달JS 구성요소</title>
      <link>https://css3.tistory.com/1135</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;/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;Angular2는 다음과 같은 것을 사용하여 이 문제를 해결하는 것처럼 보입니다. https://angular.io/docs/ts/latest/cookbook/component-communication.html#!#parent-to-child-local-var 하지만 예제가 #timer에서 했던 것처럼 자식 구성 요소에 &quot;pointer&quot;을 정의할 가능성은 없다고 생각합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Angular2로 쉽게 변환할 수 있도록 하기 위해 다음을 피하고 싶습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이벤트 방출(스코프에서 emit 및 브로드캐스트)&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;자식의 요구사항을 사용합니다(그리고 부모에게 콜백을 추가합니다..UGLY).&lt;/font&gt;&lt;/li&gt; 
 &lt;li&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;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예제 코드:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var app = angular.module('plunker', []);

app.controller('RootController', function() {
});

app.component('parentComponent', {
  template: `
    &amp;lt;h3&amp;gt;Parent component&amp;lt;/h3&amp;gt;
    &amp;lt;a class=&quot;btn btn-default btn-sm&quot; ng-click=&quot;$ctrl.click()&quot;&amp;gt;Notify Child&amp;lt;/a&amp;gt;
    &amp;lt;span data-ng-bind=&quot;$ctrl.childMessage&quot;&amp;gt;&amp;lt;/span&amp;gt;
    &amp;lt;child-component on-change=&quot;$ctrl.notifiedFromChild(count)&quot;&amp;gt;&amp;lt;/child-component&amp;gt;
  `,
  controller: function() {
    var ctrl = this;
    ctrl.notifiedFromChild = function(count){
      ctrl.childMessage = &quot;From child &quot; + count;
    }
    ctrl.click = function(){
    }
  },
  bindings: {
  }
});

app.component('childComponent', {
  template: `
    &amp;lt;h4&amp;gt;Child component&amp;lt;/h4&amp;gt;
    &amp;lt;a class=&quot;btn btn-default btn-sm&quot; ng-click=&quot;$ctrl.click()&quot;&amp;gt;Notify Parent&amp;lt;/a&amp;gt;
  `,
  controller: function() {
    var ctrl = this;
    ctrl.counter = 0;
    ctrl.click = function(){
        ctrl.onChange({ count: ++ctrl.counter });
    }
  },
  bindings: {
    onChange: '&amp;amp;'
  }
});
&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;http://plnkr.co/edit/SCK8XlYoYCRceCP7q2Rn?p=preview&quot; rel=&quot;noreferrer&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;http://plnkr.co/edit/SCK8XlYoYCRceCP7q2Rn?p=preview&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;a href=&quot;http://plnkr.co/edit/OfANmt4zLyPG2SZyVNLr?p=preview&quot; rel=&quot;noreferrer&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;http://plnkr.co/edit/OfANmt4zLyPG2SZyVNLr?p=preview&lt;/font&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아이가 부모를 필요로 하는 경우, 그리고 아이가 아이에 대한 부모 참조를 설정하는 경우...&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이제 부모가 아이를 이용할 수 있습니다...&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;못생겼지만 위의 각2 예와 같습니다.&lt;/font&gt;&lt;/p&gt;&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;h3&gt;&lt;font papago-translate=&quot;translated&quot;&gt;식 바인딩을 사용하여 지시 $API 게시&lt;/font&gt;&lt;/h3&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;상위 구성 요소가 이벤트를 하위 구성 요소와 통신할 수 있도록 하려면 하위 구성 요소가 API를 게시하도록 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;grid-component grid-on-init=&quot;$ctrl.gridApi=$API; $ctrl.someFn($API)&quot;&amp;gt;
&amp;lt;/grid-component&amp;gt;    
&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;app.component('gridComponent', {
  //Create API binding
  bindings: {gridOnInit: &quot;&amp;amp;&quot;},
  template: `
    &amp;lt;h4&amp;gt;Grid component&amp;lt;/h4&amp;gt;
    &amp;lt;p&amp;gt; Save count = {{$ctrl.count}}&amp;lt;/p&amp;gt;
  `,
  controller: function() {
    var ctrl = this;
    this.$onInit = function() {
        ctrl.count = 0;
        ctrl.api = {};
        //Publish save function
        ctrl.api.save = save;
        //Invoke Expression with $API as local
        ctrl.gridOnInit({$API: ctrl.api});
    };
    function save(){
      console.log(&quot;saved!&quot;);
      ctrl.count++;
    }
  }
});
&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;위의 예는 에 의해 정의된 Angular Expression을 호출합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;grid-on-init&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;API가 노출된 속성을 다음과 같습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;$API&lt;/code&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;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;'isolate' 스코프 개체 해시는 지시 요소의 속성에서 파생된 로컬 스코프 속성 집합을 정의합니다.&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;ul&gt; 
  &lt;li&gt;&lt;code&gt;&amp;amp;&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아니면&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&amp;amp;attr&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;&amp;lt;my-component my-attr=&quot;count = count + value&quot;&amp;gt;&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;격리 범위 정의 범위:&lt;/font&gt;&lt;/font&gt;&lt;code&gt;{ localFn:'&amp;amp;myAttr' }&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;, 격리 범위 속성&lt;/font&gt;&lt;/font&gt;&lt;code&gt;localFn&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;기능 래퍼를 가리킬 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;count = count + value expression&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;이것은 로컬 변수 이름과 값의 맵을 식 래퍼 fn에 전달함으로써 수행할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예를 들어 식이 다음과 같다면&lt;/font&gt;&lt;/font&gt;&lt;code&gt;increment($amount)&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러면 우리는 전화를 함으로써 금액 값을 지정할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;localFn&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;~하듯이&lt;/font&gt;&lt;/font&gt;&lt;code&gt;localFn({$amount: 22})&lt;/code&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;/blockquote&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;-- &lt;a href=&quot;https://docs.angularjs.org/api/ng/service/$compile#-scope-&quot; rel=&quot;noreferrer&quot;&gt;각진&lt;/a&gt;&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;https://docs.angularjs.org/api/ng/service/$compile#-scope-&quot; rel=&quot;noreferrer&quot;&gt;JS 포괄지침 API -- 범위&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;$&lt;/code&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;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;strong&gt;참고:&lt;/strong&gt; 각도 2+로 쉽게 전환하려면 양방향을 사용하지 마십시오.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;=&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;구속력이 있는&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;단방향 사용 대신&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&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;amp;&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;구속력이 있는&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;자세한 내용은 &lt;a href=&quot;https://docs.angularjs.org/guide/component&quot; rel=&quot;noreferrer&quot;&gt;각도&lt;/a&gt;를 참조하십시오.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;https://docs.angularjs.org/guide/component&quot; rel=&quot;noreferrer&quot;&gt;JS 개발자 가이드 &lt;/a&gt;-&lt;a href=&quot;https://docs.angularjs.org/guide/component&quot; rel=&quot;noreferrer&quot;&gt; 구성 요소&lt;/a&gt; 이해&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;상위 구성 요소가 이벤트를 하위 구성 요소와 통신할 수 있도록 하려면 하위 구성 요소가 API를 게시하도록 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;grid-component api=&quot;$ctrl.gridApi&quot;&amp;gt;&amp;lt;/grid-component&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;grid-component&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;바인딩을 사용하여 API를 상위 범위에 게시합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;api&lt;/code&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;app.component('gridComponent', {
  //Create API binding
  bindings: {api: &quot;=&quot;},
  template: `
    &amp;lt;h4&amp;gt;Grid component&amp;lt;/h4&amp;gt;
    &amp;lt;p&amp;gt; Save count = {{$ctrl.count}}&amp;lt;/p&amp;gt;
  `,
  controller: function() {
    var ctrl = this;
    this.$onInit = function() {
        ctrl.count = 0;
        ctrl.api = {};
        //Publish save function
        ctrl.api.save = save;
    };
    function save(){
      console.log(&quot;saved!&quot;);
      ctrl.count++;
    }
  }
});
&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;save&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;공개된 API를 사용하여 함수:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;ctrl.click = function(){
  console.log(&quot;Search clicked&quot;);
  ctrl.gridApi.save();
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;http://plnkr.co/edit/m7Nyxdh5lO7OmKTJhXmB?p=preview&quot; rel=&quot;noreferrer&quot;&gt;PLNKR의 데모&lt;/a&gt;.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여기 쉬운 방법이 있습니다: http://morrisdev.com/2017/03/triggering-events-in-a-child-component-in-angular/&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;기본적으로 &quot;command&quot;(또는 원하는 대로)라는 바인딩된 변수를 추가하고 $onChanges를 사용하여 해당 변수의 변경에 주의를 기울이고 수동으로 트리거하라는 이벤트가 표시되는 모든 것을 트리거합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 개인적으로 모든 변수를 &quot;설정&quot;이라는 개체에 넣어 모든 구성 요소에 전송하는 것을 좋아합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러나 개체 내의 값을 변경해도 $onChanges 이벤트가 트리거되지 않으므로 플랫 변수로 이벤트를 트리거하려면 해당 이벤트를 트리거해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&quot;적절한&quot; 방법은 아니지만 프로그래밍하기가 훨씬 쉽고 이해하기 쉬우며 나중에 A2로 변환하는 것도 훨씬 쉽습니다.&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;strong&gt;상속을 사용&lt;/strong&gt;하는 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;require&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;양방향 바인딩 대신에?&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;http://plnkr.co/edit/fD1qho3eoLoEnlvMzzbw?p=preview&quot; rel=&quot;nofollow noreferrer&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;http://plnkr.co/edit/fD1qho3eoLoEnlvMzzbw?p=preview&lt;/font&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var app = angular.module('plunker', []);

    app.controller('RootController', function() {
    });

    app.component('filterComponent', {
      template: `
        &amp;lt;h3&amp;gt;Filter component&amp;lt;/h3&amp;gt;
        &amp;lt;a class=&quot;btn btn-default btn-sm&quot; ng-click=&quot;$ctrl.click()&quot;&amp;gt;Search&amp;lt;/a&amp;gt;
        &amp;lt;span data-ng-bind=&quot;$ctrl.childMessage&quot;&amp;gt;&amp;lt;/span&amp;gt;

        &amp;lt;grid-component api=&quot;$ctrl.gridApi&quot;&amp;gt;&amp;lt;/grid-component&amp;gt;
      `,
      controller: function() {
        var ctrl = this;

        ctrl.click = function(){
          console.log(&quot;Search clicked&quot;);
          ctrl.gridApi.save();
        };
      }
    });

    app.component('gridComponent', {
      require: {parent:'^^filterComponent'},
      bindings: {api: &quot;&amp;lt;&quot;},
      template: `
        &amp;lt;h4&amp;gt;Grid component&amp;lt;/h4&amp;gt;
        &amp;lt;p&amp;gt; Save count = {{$ctrl.count}}
      `,
      controller: function() {
        var ctrl = this;



        this.$onInit = function() {
            ctrl.count = 0;
            ctrl.api = {};
            ctrl.api.save = save;

            ctrl.parent.gridApi = ctrl.api;
        };
        function save(){
          console.log(&quot;saved!&quot;);
          ctrl.count++;
        }
      }
    });
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;또는 부모에게 &lt;strong&gt;세터 방식을 정의&lt;/strong&gt;하여 보다 명확하게 할 수도 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;http://plnkr.co/edit/jmETwGt32BIn3Tl0yDzY?p=preview&quot; rel=&quot;nofollow noreferrer&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;http://plnkr.co/edit/jmETwGt32BIn3Tl0yDzY?p=preview&lt;/font&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var app = angular.module('plunker', []);

app.controller('RootController', function() {
});

app.component('filterComponent', {
  template: `
    &amp;lt;h3&amp;gt;Filter component&amp;lt;/h3&amp;gt;
    &amp;lt;a class=&quot;btn btn-default btn-sm&quot; ng-click=&quot;$ctrl.click()&quot;&amp;gt;Search&amp;lt;/a&amp;gt;
    &amp;lt;span data-ng-bind=&quot;$ctrl.childMessage&quot;&amp;gt;&amp;lt;/span&amp;gt;

    &amp;lt;grid-component pass-api=&quot;$ctrl.setGridApi(api)&quot;&amp;gt;&amp;lt;/grid-component&amp;gt;
  `,
  controller: function() {
    var ctrl = this;

    var gridApi = {};

    ctrl.setGridApi = function(api){
      gridApi = api;
    };

    ctrl.click = function(){
      console.log(&quot;Search clicked&quot;);
      gridApi.save();
    };
  }
});

app.component('gridComponent', {
  bindings: {
    passApi:'&amp;amp;'
  },
  template: `
    &amp;lt;h4&amp;gt;Grid component&amp;lt;/h4&amp;gt;
    &amp;lt;p&amp;gt; Save count = {{$ctrl.count}}
  `,
  controller: function() {
    var ctrl = this;

    this.$onInit = function() {
        ctrl.count = 0;
        ctrl.api = {};
        ctrl.api.save = save;

        ctrl.passApi({api: ctrl.api});
    };
    function save(){
      console.log(&quot;saved!&quot;);
      ctrl.count++;
    }
  }
});
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;심플: 2방향 바인딩은 생성 시 변경사항만 호출하기 때문에 속성 1방향 바인딩 하나만 필요합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;상위 컨트롤러에 새 부울 속성을 설정합니다.&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;vm.changeNow = false; //이를 vm.changeNow = !vm.changeNow 구성 요소에 메서드를 호출하도록 지시하려는 경우&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;자식 구성 요소 열기 바인딩 섹션에서&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;바인딩: {a2waybind: '=', 지금 변경: '&amp;lt;' }&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이제 자녀에 대한 $on Changes 이벤트가 필요합니다.&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;$onChanges() { // 부모님께 듣고 싶었던 달콤한 말을 하세요. }&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이제 템플릿을 호출할 때:&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하위 구성 요소 a2waybind=&quot;$ ctrl.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;mycool value &quot;change now=&quot;$ctrl.change now&quot; /childComponent&quot;&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;두 번째 방법은 자식 구성 요소에 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;        var vm = this;
        var myprop;
        Object.defineProperty(vm, 'mytwowayprop', {
            get() {
                return myprop;
            },
            set(value) {
                myprop = value; 
                vm.onchangeseventbecausemypropchanged();               
            }
        });
       vm.onchangeseventbecausemypropchanged = function () {//woot}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이렇게 하면 양방향 바인딩 속성이 내부적으로나 외부적으로 변경될 때 변경에 대한 정의된 이벤트를 가질 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/37439300/communicating-events-from-parent-to-child-in-angularjs-components&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>AngularJS</category>
      <author>css3</author>
      <guid isPermaLink="true">https://css3.tistory.com/1135</guid>
      <comments>https://css3.tistory.com/1135#entry1135comment</comments>
      <pubDate>Wed, 1 Nov 2023 22:32:44 +0900</pubDate>
    </item>
    <item>
      <title>How do I Start a job of a function i just defined?</title>
      <link>https://css3.tistory.com/1134</link>
      <description>&lt;h2&gt;How do I Start a job of a function i just defined?&lt;/h2&gt;
&lt;p&gt;How do I Start a job of a function i just defined?&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;function FOO { write-host &quot;HEY&quot; }

Start-Job -ScriptBlock { FOO } |
  Receive-Job -Wait -AutoRemoveJob
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Result:&lt;/p&gt; 
&lt;pre class=&quot;lang-none prettyprint-override&quot;&gt;&lt;code&gt;Receive-Job: The term 'FOO' is not recognized as the name of cmdlet,
function ,script file or operable program.
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;What do I do? Thanks.&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;@Shay가 지적했듯이,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;FOO&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;-InitializationScript&lt;/code&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;For your example:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$functions = {
    function FOO { write-host &quot;HEY&quot; }
}

Start-Job -InitializationScript $functions -ScriptBlock {FOO}|
    Wait-Job| Receive-Job
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;This can be useful if you want to use the same functions for different jobs.&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;@Rynant의 제안은&lt;/font&gt;&lt;/font&gt;&lt;code&gt;InitializationScript&lt;/code&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;I thought the purpose of (script) blocks is so that you can pass them around. So depending on how you are doing it, I would say go for:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$FOO = {write-host &quot;HEY&quot;}

Start-Job -ScriptBlock $FOO | wait-job |Receive-Job
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Of course you can parameterize script blocks as well:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$foo = {param($bar) write-host $bar}

Start-Job -ScriptBlock $foo -ArgumentList &quot;HEY&quot; | wait-job | receive-job
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;It worked for me as:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Start-Job -ScriptBlock ${Function:FOO}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;An improvement to @Rynant's answer:&lt;/p&gt; 
&lt;p&gt;You can define the function as normal in the main body of your script:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Function FOO 
{ 
  Write-Host &quot;HEY&quot; 
} 
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;and then recycle this definition within a scriptblock:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$export_functions = [scriptblock]::Create(@&quot;
  Function Foo { $function:FOO }
&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;(실질적인 기능체를 가지고 있다면 좀 더 의미 있는 makes을) 다음으로 전달합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Start-Job&lt;/code&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;Start-Job -ScriptBlock {FOO} -InitializationScript $export_functions| Wait-Job | Receive-Job
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;I like this way, as it is easier to debug jobs by running them locally under the debugger.&lt;/p&gt;&lt;p&gt;The function needs to be inside the scriptblock:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Start-Job -ScriptBlock { function FOO { write-host &quot;HEY&quot; } ; FOO } | Wait-Job | Receive-Job
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;As long as the function passed to the InitializationScript param on Start-Job isn't large Rynant's answer will work, but if the function is large you may run into the below error.&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;[localhost] There is an error launching the background process. Error reported: The filename or extension is too long&quot;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;Capturing the function's definition and then using Invoke-Expression on it in the ScriptBlock is a better alternative.&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;function Get-Foo {
    param
    (
        [string]$output
    )

    Write-Output $output
}

$getFooFunc = $(Get-Command Get-Foo).Definition

Start-Job -ScriptBlock {
    Invoke-Expression &quot;function Get-Foo {$using:getFooFunc}&quot;
    Get-Foo -output &quot;bar&quot;
}

Get-Job | Receive-Job

PS C:\Users\rohopkin&amp;gt; Get-Job | Receive-Job
bar
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;A slightly different take. A function is just a scriptblock assigned to a variable. Oh, it has to be a threadjob. It can't be foreach-object -parallel.&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$func = { 'hi' } # or
function hi { 'hi' }; $func = $function:hi

start-threadjob { &amp;amp; $using:func } | receive-job -auto -wait

hi
&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;@Ben Power의 수락된 답변 아래 코멘트 또한 저의 관심사였습니다. 그래서 구글에서 함수 정의를 구하는 방법을 검색해보니&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Get-Command&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;pre&gt;&lt;code&gt;Filter Greeting {param ([string]$Greeting) return $Greeting}
Filter FullName {param ([string]$FirstName, [string]$LastName) return $FirstName + &quot; &quot; + $LastName}
$ScriptText = &quot;&quot;
$ScriptText += &quot;Filter Greeting {&quot; + (Get-Command Greeting).Definition + &quot;}`n&quot;
$ScriptText += &quot;Filter FullName {&quot; + (Get-Command FullName).Definition + &quot;}`n&quot;
$Job = Start-Job `
            -InitializationScript $([ScriptBlock]::Create($ScriptText)) `
            -ScriptBlock {(Greeting -Greeting &quot;Hello&quot;) + &quot; &quot; + (FullName -FirstName &quot;PowerShell&quot; -LastName &quot;Programmer&quot;)}
$Result = $Job | Wait-Job | Receive-Job
$Result
$Job | Remove-Job
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;There's good information in the existing answers, but let me attempt a systematic summary:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;PowerShell의 &lt;a href=&quot;https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_Jobs&quot; rel=&quot;nofollow noreferrer&quot;&gt;백그라운드 작업&lt;/a&gt;&lt;/strong&gt;은&lt;sup&gt;[1]&lt;/sup&gt; 프로세스를 종료하지 않은 실행 공간(숨겨진 하위 프로세스)에서 실행되므로 &lt;strong&gt;호출자와 상태를 공유하지 않습니다&lt;/strong&gt;.&lt;/font&gt;&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;따라서 세션 중인 호출자에 의해 생성된 &lt;strong&gt;정의&lt;/strong&gt;는 백그라운드 작업에 표시되지 &lt;em&gt;않으므로&lt;/em&gt; &lt;strong&gt;작업의 컨텍스트에서 다시&lt;/strong&gt; 생성해야 &lt;strong&gt;합니다.&lt;/strong&gt;&lt;sup&gt;[2]&lt;/sup&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;strong&gt;함수 정의&lt;/strong&gt;를 다시 &lt;strong&gt;만드는 가장 간단한 방법&lt;/strong&gt;은 &lt;strong&gt;&lt;em&gt;네임스페이스 변수 표기법&lt;/em&gt;&lt;/strong&gt;(예:&lt;/font&gt;&lt;/font&gt;&lt;code&gt;$function:FOO&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/55036515/45375&quot;&gt;답변&lt;/a&gt;을 참조합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
  &lt;ul&gt; 
   &lt;li&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;슬프게도 오랜 벌레 &lt;strong&gt;때문에&lt;/strong&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;$using:&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 글을 쓰는 시점(Windows PowerShell, PowerShell (Core) 7.3.6)에서 참조는 의 매개 변수(및 의 매개 변수)로 전달된 스크립트 블록에서 작동하지 &lt;em&gt;않습니다&lt;/em&gt;. - &lt;a href=&quot;https://github.com/PowerShell/PowerShell/issues/4530&quot; rel=&quot;nofollow noreferrer&quot;&gt;GitHub 문제&lt;/a&gt; #&lt;a href=&quot;https://github.com/PowerShell/PowerShell/issues/4530&quot; rel=&quot;nofollow noreferrer&quot;&gt;4530&lt;/a&gt;&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;자체적인 예로 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;function FOO { &quot;HEY&quot; }

Start-Job -ScriptBlock { 

  # Redefine function FOO in the context of this job.
  $function:FOO = &quot;$using:function:FOO&quot; 
  
  # Now FOO can be invoked.
  FOO

} | Receive-Job -Wait -AutoRemoveJob
&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;HEY&lt;/code&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;ul&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;em&gt;&lt;font papago-translate=&quot;translated&quot;&gt;할당 대상&lt;/font&gt;&lt;/em&gt;&lt;/font&gt; &lt;code&gt;$function:FOO&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;함수를 은연중에 만듭니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;FOO&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;으로 만듭니다. 할당된 값은 인스턴스(instance) 또는 a일 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;[string]&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;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;em&gt;&lt;font papago-translate=&quot;translated&quot;&gt;참조&lt;/font&gt;&lt;/em&gt;&lt;/font&gt; &lt;code&gt;$function:FOO&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;기존의 것을 검색합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;FOO&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;신체를 a로 기능시키다&lt;/font&gt;&lt;/font&gt;&lt;code&gt;[scriptblock]&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;$using:&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;범위()&lt;/font&gt;&lt;/font&gt;&lt;code&gt;$using:function:FOO&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;)의 본문을 검색합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;FOO&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;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;참고:&lt;/font&gt;&lt;/p&gt; 
  &lt;ul&gt; 
   &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;때문에&lt;/font&gt;&lt;/font&gt;&lt;code&gt;$using:&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;$using:function:FOO&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;em&gt;가&lt;/em&gt; 아닙니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;[scriptblock]&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예를 들면, 그러나 a&lt;/font&gt;&lt;/font&gt;&lt;code&gt;[string]&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;의 경우에는&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Start-Job&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;, 의 놀라운 방식 때문에.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;[scriptblock]&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;a href=&quot;https://github.com/PowerShell/PowerShell/issues/11698&quot; rel=&quot;nofollow noreferrer&quot;&gt;GitHub issue #11698&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;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이와 같이.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&quot;...&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;$using:function:FOO&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;을 위해 불필요한&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Start-Job&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;, 하지만 그렇지는 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Start-ThreadJob&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;em&gt;문자열&lt;/em&gt;에서 본문을 재생성해야 합니다(자세한 내용은 &lt;a href=&quot;https://github.com/PowerShell/PowerShell/issues/16461#issuecomment-967759037&quot; rel=&quot;nofollow noreferrer&quot;&gt;GitHub issue #16461&lt;/a&gt; 참조).&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
    &lt;ul&gt; 
     &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그 사실은&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Start-ThreadJob&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;허용한다&lt;/font&gt;&lt;/font&gt;&lt;code&gt;$using:function:FOO&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;참조는 아마도 과 함께 사용되는 스크립트 블록에서 명시적으로 허용되지 않은 것을 고려할 때 &lt;em&gt;감독&lt;/em&gt;일 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ForEach-Object -Parallel&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;(PowerShell v7+) - &lt;a href=&quot;https://github.com/PowerShell/PowerShell/issues/12378#issuecomment-616650654&quot; rel=&quot;nofollow noreferrer&quot;&gt;GitHub 이슈 #12378&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;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;따라서, 와 함께&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ForEach-Object -Parallel&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/61273544/45375&quot;&gt;답변&lt;/a&gt;을 참조하십시오.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; &lt;/li&gt; 
    &lt;/ul&gt; &lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
&lt;/ul&gt; 
&lt;hr&gt; 
&lt;p&gt;&lt;sup&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;[1] 이 답변은 에 의해 생성된 하위 프로세스 기반 작업에만 적용되는 것이 아니라 에 의해 생성된 일반적으로 선호되는 스레드 &lt;em&gt;기반&lt;/em&gt; 작업과 에 의해 생성된 &lt;a href=&quot;https://github.com/PowerShell/PowerShell/blob/master/README.md&quot; rel=&quot;nofollow noreferrer&quot;&gt;&lt;em&gt;PowerShell(Core) 7+&lt;/em&gt;&lt;/a&gt;에서 사용할 수 있는 스레드 기반 병렬화에도 유사하게 적용됩니다.&lt;/font&gt;&lt;/font&gt; &lt;code&gt; -Parallel&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;, 또한 PowerShell &lt;a href=&quot;https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_Remote&quot; rel=&quot;nofollow noreferrer&quot;&gt;원격&lt;/a&gt; via - 즉, PowerShell이 다른 실행 공간에서 Out-of-run space를 실행하는 모든 시나리오에 적용됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/sup&gt;&lt;/p&gt; 
&lt;p&gt;&lt;sup&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;[2] &lt;em&gt;스크립트 파일&lt;/em&gt;을 통해 이러한 정의를 제공하는 것이 대안입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;*.ps1&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;또는 &lt;a href=&quot;https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_Operators#dot-sourcing-operator-&quot; rel=&quot;nofollow noreferrer&quot;&gt;도트&lt;/a&gt; 소스&lt;a href=&quot;https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_Operators#dot-sourcing-operator-&quot; rel=&quot;nofollow noreferrer&quot;&gt;()&lt;code&gt;. &lt;/code&gt;&lt;/a&gt;를 가져오거나 가져와야 &lt;em&gt;하는&lt;/em&gt; 모듈입니다.&lt;/font&gt;&lt;/font&gt;&lt;/sup&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/7162090/how-do-i-start-a-job-of-a-function-i-just-defined&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>powershell</category>
      <author>css3</author>
      <guid isPermaLink="true">https://css3.tistory.com/1134</guid>
      <comments>https://css3.tistory.com/1134#entry1134comment</comments>
      <pubDate>Wed, 1 Nov 2023 22:32:33 +0900</pubDate>
    </item>
    <item>
      <title>앱 설치 실패:장치에 쓸 수 없습니다.</title>
      <link>https://css3.tistory.com/1133</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;앱 설치 실패:&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;장치에 쓸 수 없습니다.&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Xcode 6.3에서 Swift로 작성된 iOS 프로젝트를 실제 기기에서 실행하려고 할 때 이 오류가 발생했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;앱 설치 실패&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;장치에 쓸 수 없습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;프로젝트를 정리하고 다시 실행하려고 했는데 같은 오류가 발생합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 오류를 수정하려면 어떻게 해야 합니까?&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 기기에서 앱을 삭제하고 프로젝트를 다시 실행하는 것이 좋습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;클린을 하고 앱을 성공적으로 설치했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제품-&amp;gt;클린(Shift-Cmd-K)&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;기기 전원을 껐다가 다시 켰는데 그런 오류가 발생하지 않았습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;알겠습니다, 문제를 해결하는 데 도움이 될 수 있는 몇 가지 고려 사항을 확인하고 답변을 게시해 주시기 바랍니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;당신의 프로젝트는 능력을 사용하고 있습니까?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;올바르게 설정되었는지 여부(모두 녹색이어야 함)&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다른 프로젝트(정말 간단한 프로젝트)를 시도해 보셨나요?&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;앱스토어에서 앱을 설치할 수 있습니까?&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;기기에 남아있는 여유 공간의 양을 확인했습니까?&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;만약 그렇지 않다면, 다른 제안은 예외 중단점을 사용하는 것입니다. 그것을 어떻게 설정하고, 실행하고, 로그를 게시하는 방법에 대한 설명을 게시한 누군가가 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/25234407/app-installation-failed&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;앱 설치 실패&lt;/font&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;당신에게 도움이 되길 바랍니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;완전히 다른 장치에서 일주일에 두 번이나 이 문제가 발생했습니다.&lt;/font&gt;&lt;/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;strong&gt;무료 개발자 계정&lt;/strong&gt;을 사용하는 경우 서명한 다른 앱을 제거해야 할 수도 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저에게는 프로비저닝 프로필이었습니다. 개발 대신 배포를 사용했습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저의 쟁점은 내장된 프레임워크였습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&quot;Build Phases&quot; -&amp;gt; &quot;Embed Frameworks&quot; -&amp;gt; &quot;설치할 때만 복사&quot; 확인하면 문제가 해결됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://i.stack.imgur.com/htWFF.png&quot; rel=&quot;noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/htWFF.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;저는 iOS 11 베타 10, XCode 9 베타 6에서 다음이 작동하지 않았습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;장치를 다시 시작&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;장치에서 앱 삭제&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;프로젝트에 심볼 링크가 없습니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;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;Derived Data 및 voila를 삭제하고 다시 작동했습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제 프로젝트에서 심볼릭 링크가 있는 폴더가 있어서 이 문제가 발생했습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그 폴더를 제거했는데 제대로 작동했습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 오류는 다양한 제안 답변에서 알 수 있듯이 잠재적인 근본 원인이 많습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이와 같은 앱 설치 문제를 해결하는 가장 좋은 방법은 iOS 장치 자체의 콘솔을 검사하는 것입니다. 이는 종종 훨씬 더 구체적인 오류 메시지를 제공하기 때문입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Xcode에서 'Devices and Simulators' 창을 열고 앱이 설치되어 있는 장치의 로그를 확인합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제 경우 &quot;Can't write to the device&quot;(장치에 쓸 수 없음) 오류가 발생했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;2월 27일 10:54:58 iPhone-7-110 설치 (Mobile System Services)[46] : 0x16f92f000 -[MIBundle _validate]&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;오류 발생:]: 38: /private/var/installd/Library/Caches/com.apple.mobile.installd.staging/temp.ebmR6U/extracted/SampleApp.app/Frameworks/SomeFramework.framework의 번들에서 Info.plist를 로드하지 못했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그것은 실제로 무슨 일이 일어나고 있는지를 명확하게 암시합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;나는 그것을 설정하는 것을 잊었습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Info.plist&lt;/code&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;프로젝트에서 프로젝트 외부의 파일에 대한 symlink를 가지고 있었습니다.&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;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;창 -&amp;gt; 프로젝트로 이동하여 마우스 오른쪽 단추를 누른 후 프로젝트에서 제거!&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;단말기에 같은 번들 식별자를 가진 앱이 있는 경우, Xcode는 이 오류를 던집니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;번들 식별자가 같은 잠재적인 앱을 삭제하려고 합니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;당신의 제공 프로필을 확인해 보세요, 아마도 당신은 나처럼 앱스토어 제공 프로필을 사용하고 있을 것입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;앱스토어 제공 프로필을 개발로 변경해야 했는데, 지금은 됩니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;앱 삭제, 저장 공간 정리, 프로젝트 정리...&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;마침내 작동한 것은 info.plist(일반 &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;여러 가지 이유가 있는데, 그 중 하나가 바로 저에게 일어난 일입니다.&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;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아이폰을 디버그에 사용하는 경우, 아마도 아이폰의 저장 공간이 디버그 앱보다 적기 때문일 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아이폰 청소 --- 진짜 기계&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Mac 정리 --- 시뮬레이터&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;iOS11 Xcode9에서 (베타를 선택하고, 아무나 작동합니다) 이것은 무작위로 발생할 것입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;컴파일하는 동안 감히 앱을 전환할 수 있다면 더 빈번한 것으로 보입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다시 빌드하고 xcode를 바라보세요. 제 경험으로는 두 번째로 어김없이 작동할 것입니다.&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;장치에 쓸 수 없음)가 표시됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&quot;) 앱을 실행하려고 할 때마다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;설정에서 시계를 재설정하는 것만으로 문제가 해결되었습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아무것도 도움이 되지 않았습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;나는 아래의 단계를 따랐고,&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;파생 데이터 폴더 정리&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Xcode를 종료하고 장치 연결 해제&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Macbook 다시 시작&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;장치 다시 시작&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;오픈엑스코드&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;프로젝트 정리 및 실행&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;드디어 성공했어요!!&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 같은 문제에 직면해 있다가 이 단계를 따라 해결했고 지금은 작동하고 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;장치에서 앱 삭제&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다른 응용프로그램을 설치해 봅니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;X-code에서 파생된 데이터를 제거합니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;X-Code를 다시 시작한 다음 프로젝트를 정리하고 빌드한 다음 실행합니다.&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;ol&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사용하지 않는 응용프로그램 제거&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;장치를 다시 시작하고 설정에서 Available(사용 가능) 및 Capacity(용량)를 확인합니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;장치에서 다시 앱 실행&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;잘 됐으면 좋겠네요, 맛있게 드세요.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;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://stackoverflow.com/questions/38371044/ios-app-testing-app-installation-failed-no-code-signature-found&quot;&gt;다음&lt;/a&gt;과 같은 오류 때문일 것입니다. 앱 &lt;a href=&quot;https://stackoverflow.com/questions/38371044/ios-app-testing-app-installation-failed-no-code-signature-found&quot;&gt;설치에 실패했습니다.&lt;/a&gt;&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/38371044/ios-app-testing-app-installation-failed-no-code-signature-found&quot;&gt; 코드 서명을 찾을&lt;/a&gt; 수 없습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;프로젝트를 정리한 후 오류에 대한 설명이 &quot;No code signature found&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;bundle identifier&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이로 인해 설치가 실패했기 때문에 프레임워크 번들 식별자를 두 번 확인하고 각 번들에 고유한 번들 식별자가 있는지 확인합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;환경 : Xcode 10&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;또한 Xcode를 실행 중인 기계의 공간이 부족한 경우에 표시되는 오류입니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;디버깅 목적으로 앱 컨테이너를 아이패드에 로드해야 했을 때 컨테이너가 이 장치에 비해 너무 커서(16GB에서 OS를 뺀) 작업이 실패했다고 해서 작업을 중단하고 완전히 잊어버리고 실패한 설치를 장치에 남겨두었습니다.&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;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/31002642/app-installation-failed-could-not-write-to-the-device&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>iPhone</category>
      <author>css3</author>
      <guid isPermaLink="true">https://css3.tistory.com/1133</guid>
      <comments>https://css3.tistory.com/1133#entry1133comment</comments>
      <pubDate>Wed, 1 Nov 2023 22:32:25 +0900</pubDate>
    </item>
    <item>
      <title>외부 API 통합을 위한 Best Wordpress 플러그인</title>
      <link>https://css3.tistory.com/1132</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;외부 API 통합을 위한 Best Wordpress 플러그인&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;외부 api에서 데이터를 검색하고 이 데이터를 게시물/워드프레스 페이지에 표시하기 위해 워드프레스 플러그인을 찾고 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;구글 검색을 많이 했는데 아직 플러그인을 찾지 못했습니다.&lt;/font&gt;&lt;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;보통 API에 사용할 수 있는 플러그인은 없습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;어떤 종류의 API를 사용하느냐에 따라 완전히 달라집니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;많은 API는 문서 튜토리얼을 제공합니다. 문서 튜토리얼은 명확하게 제공합니다. 어떻게 데이터를 끄집어내고 편집하고 페이지에 표시하는 방법 등을 제공합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;또한 당신이 사용하고 있는 API를 지정하지 않았습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;API 링크 공유 부탁드립니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;한편, 다음과 같은 예로 시도해 볼 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$url = &quot;http://api.crunchbase.com/v/1/company/audible-coffee.js?
api_key=API_KEY&amp;amp;callback=?&quot;;
$jsondata = file_get_contents($url);
$obj = json_decode($jsondata);
&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;   $url=&quot;https:/zyz.com/GetJobPackage&amp;amp;jobidABRASIruWl;
   $content = file_get_contents($url);
   $array = json_decode(json_encode((array)simplexml_load_string($content)),1);
   echo '&amp;lt;pre&amp;gt;';
   echo print_r($array);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;너 같은 거 먹어볼 수 있어요.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;API 링크를 공유해주시면 저희가 도와드릴 수도 있고 누구나 도와드릴 수 있습니다.&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;음, 저는 판매자로부터 apis에 연결해야 하는 비슷한 상황에 처해 있다는 것을 발견했습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;운 좋게 wp에서 이&lt;a href=&quot;https://wordpress.org/plugins/custom-api-for-wp/&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;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/28660995/best-wordpress-plugin-to-integrate-external-api%c2%b4s&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>WordPress</category>
      <author>css3</author>
      <guid isPermaLink="true">https://css3.tistory.com/1132</guid>
      <comments>https://css3.tistory.com/1132#entry1132comment</comments>
      <pubDate>Wed, 1 Nov 2023 22:32:17 +0900</pubDate>
    </item>
    <item>
      <title>보기 삭제 버튼 텍스트를 변경하는 방법</title>
      <link>https://css3.tistory.com/1131</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;translated&quot;&gt;다른 질문 스레드에서 이 테이블 보기 대리인을 사용하라는 예제를 본 적이 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;- (NSString *)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제 질문은 이 방법을 어떻게 사용하느냐는 것입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 이것을 어떻게 사용하는지 잘 모르겠습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;관리하는 컨트롤러에서&lt;/font&gt;&lt;/font&gt;&lt;code&gt;UITableView&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;당신은 실행해야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;UITableviewDelegate&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고 당신의 메소드에 대해 당신이 원하는 타이틀을 내부로 반환합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;titleForDeleteConfirmationButtonForRowAtIndexPath&lt;/code&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;@interface CategoryAddViewController : UITableViewController
@end

@implementation CategoryAddViewController
// ...
-(NSString *)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath {
return @&quot;Please don't delete me!&quot;;
}

@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;img src=&quot;https://i.stack.imgur.com/PpBGb.png&quot; alt=&quot;enter image description here&quot;&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Swift에서는 동일하지만, 메서드 서명만 다를 뿐입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;func tableView(tableView: UITableView, titleForDeleteConfirmationButtonForRowAtIndexPath indexPath: NSIndexPath) -&amp;gt; String? {
  return &quot;Erase&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;모든 행에 대해 &quot;지우기&quot;를 표시하고 싶다고 할 때, 위의 함수는 다음을 포함해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;return @&quot;Erase&quot;;
&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/1607155/how-to-change-iphone-uitableview-delete-button-title-while-editing-it&quot;&gt;읽어보기&lt;/a&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;뷰 컨트롤러가 아직 UITableViewController가 아닌 경우에도 .h 파일에 UITableViewDelegate를 추가합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그것은 다음 중 하나가 될 수 있다는 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;@interface SomeView : UIViewController &amp;lt;UITableViewDelegate&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;@interface SomeView : UITableViewController
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;스위프트 4.2&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;override func tableView(_ tableView: UITableView, titleForDeleteConfirmationButtonForRowAt indexPath: IndexPath) -&amp;gt; String? {
        return &quot;Erase&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/7394988/how-to-change-uitableview-delete-button-text&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>iPhone</category>
      <author>css3</author>
      <guid isPermaLink="true">https://css3.tistory.com/1131</guid>
      <comments>https://css3.tistory.com/1131#entry1131comment</comments>
      <pubDate>Wed, 1 Nov 2023 22:32:11 +0900</pubDate>
    </item>
    <item>
      <title>아약스 wooCommerce 3 제품 변형 카트에 추가 버튼</title>
      <link>https://css3.tistory.com/1130</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아약스 wooCommerce 3 제품 변형 카트에 추가 버튼&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;이 버튼의 사용은 상품 ID가 237, 변형 ID가 208673, 블루투스의 속성_pa_option인 상품을 카트에 추가하는 것입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것을 AJAX로 가는 방법이 있습니까?&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;div class=&quot;btnss&quot;&amp;gt;
    &amp;lt;span class=&quot;price&quot;&amp;gt;
        &amp;lt;span class=&quot;woocommerce-Price-amount amount&quot;&amp;gt;6,999&amp;amp;nbsp;
            &amp;lt;span class=&quot;woocommerce-Price-currencySymbol&quot;&amp;gt;kr&amp;lt;/span&amp;gt;
        &amp;lt;/span&amp;gt;
    &amp;lt;/span&amp;gt;
    &amp;lt;div class=&quot;quantity buttons_added&quot;&amp;gt;
        &amp;lt;input type=&quot;button&quot; value=&quot;-&quot; class=&quot;minus&quot;&amp;gt;
        &amp;lt;label class=&quot;screen-reader-text&quot; for=&quot;quantity_5b101f605f067&quot;&amp;gt;Quantity&amp;lt;/label&amp;gt;
        &amp;lt;input type=&quot;number&quot; id=&quot;quantity_5b101f605f067&quot; class=&quot;input-text qty text&quot; step=&quot;1&quot; min=&quot;1&quot; max=&quot;&quot; name=&quot;quantity&quot; value=&quot;1&quot; title=&quot;Qty&quot; size=&quot;4&quot; pattern=&quot;[0-9]*&quot; inputmode=&quot;numeric&quot; aria-labelledby=&quot;&quot;&amp;gt;
        &amp;lt;input type=&quot;button&quot; value=&quot;+&quot; class=&quot;plus&quot;&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;a href=&quot;/?add-to-cart=237&amp;amp;variation_id=208673&amp;amp;attribute_pa_option=bluetooth&quot; class=&quot;button product_type_simple add_to_cart_button ajax_add_to_cart&quot;&amp;gt;Add to cart&amp;lt;/a&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;1). 나는 먼저 당신의 버튼 html을 조금 바꿨습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;div class=&quot;btnss&quot;&amp;gt;
    &amp;lt;span class=&quot;price&quot;&amp;gt;
        &amp;lt;span class=&quot;woocommerce-Price-amount amount&quot;&amp;gt;6,999&amp;amp;nbsp;
            &amp;lt;span class=&quot;woocommerce-Price-currencySymbol&quot;&amp;gt;kr&amp;lt;/span&amp;gt;
        &amp;lt;/span&amp;gt;
    &amp;lt;/span&amp;gt;
    &amp;lt;div class=&quot;quantity buttons_added&quot;&amp;gt;
        &amp;lt;input type=&quot;button&quot; value=&quot;-&quot; class=&quot;minus&quot;&amp;gt;
        &amp;lt;label class=&quot;screen-reader-text&quot; for=&quot;quantity_5b101f605f067&quot;&amp;gt;Quantity&amp;lt;/label&amp;gt;
        &amp;lt;input type=&quot;number&quot; id=&quot;quantity_5b101f605f067&quot; class=&quot;input-text qty text&quot; step=&quot;1&quot; min=&quot;1&quot; max=&quot;&quot; name=&quot;quantity&quot; value=&quot;1&quot; title=&quot;Qty&quot; size=&quot;4&quot; pattern=&quot;[0-9]*&quot; inputmode=&quot;numeric&quot; aria-labelledby=&quot;&quot;&amp;gt;
        &amp;lt;input type=&quot;button&quot; value=&quot;+&quot; class=&quot;plus&quot;&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;a href=&quot;#&quot; class=&quot;button product_type_variation add_to_cart_button ajax variation&quot; data-product_id=&quot;237&quot; data-variation_id=&quot;208673&quot; data-quantity=&quot;1&quot; data-variation=&quot;pa_option=bluetooth&quot;&amp;gt;Add to cart&amp;lt;/a&amp;gt;
&amp;lt;/div&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;href&lt;/code&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;/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-variation=&quot;pa_option=bluetooth,pa_color=red-shiny&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;2). PHP (Wordpress-Ajax) 및 jQuery (Ajax) 코드:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;// Wordpress Ajax php: Adding variation to cart
add_action( 'wp_ajax_nopriv_variation_to_cart', 'product_variation_add_to_cart' );
add_action( 'wp_ajax_variation_to_cart', 'product_variation_add_to_cart' );
function product_variation_add_to_cart() {
    if( isset($_POST['pid']) &amp;amp;&amp;amp; $_POST['pid'] &amp;gt; 0 ){
        $product_id   = (int) $_POST['pid'];
        $variation_id = (int) $_POST['vid'];
        $quantity     = (int) $_POST['qty'];
        $attributes   = explode(',', $_POST['var']);
        $variation    = array();
        foreach($attributes as $values){
            $values = explode('=', $values);
            $variation['attributes_'.$values[0]] = $values[1];
        }
        WC()-&amp;gt;cart-&amp;gt;add_to_cart( $product_id, $quantity, $variation_id, $variation );
        echo true;
    }
    die(); // To avoid server error 500
}

// The Jquery ajax script
add_action( 'wp_footer', 'custom_product_variation_script' );
function custom_product_variation_script() {
    // HERE set the page or the post ID
    $the_id = 102;

    if( ! ( is_page($the_id) || is_single($the_id) ) ) return;

    $view_cart = '&amp;lt;a href=&quot;'.wc_get_cart_url().'&quot; class=&quot;added_to_cart wc-forward&quot; title=&quot;View cart&quot;&amp;gt;View cart&amp;lt;/a&amp;gt;';
    $adding    = __('Adding to cart…', 'woocommerce');
    ?&amp;gt;
    &amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
    jQuery( function($){
        // wc_add_to_cart_params is required to continue
        if ( typeof wc_add_to_cart_params === 'undefined' )
            return false;

        var a = 'a.button.ajax.variation',
            b = $(a).html(),
            c = '&amp;lt;?php echo $view_cart; ?&amp;gt;',
            d = '&amp;lt;?php echo $adding; ?&amp;gt;';

        // Sync the data-quantity attribute
        $('input.minus,input.plus').on( 'click blur', function(){
            $(a).attr('data-quantity',$('input.qty').val());
        });
        $('input.qty').on('input click blur', function(){
            $(a).attr('data-quantity',$('input.qty').val());
        })

        $(a).on('click', function(e){
            e.preventDefault();

            $('a.wc-forward').remove();
            $(a).html(d);

            // The Ajax request
            $.ajax({
                type: 'POST',
                url: wc_add_to_cart_params.ajax_url,
                data: {
                    'action': 'variation_to_cart',
                    'pid'   : $(a).attr('data-product_id'),
                    'vid'   : $(a).attr('data-variation_id'),
                    'qty'   : $(a).attr('data-quantity'),
                    'var'   : $(a).attr('data-variation'),
                },
                success: function (response) {
                    if(response){
                        // Update button and refresh minicart fragments
                        setTimeout(function(){
                            $(a).addClass('added').html(b).after(c);
                            $(document.body).trigger('added_to_cart').trigger('wc_fragment_refresh');
                        }, 500);
                    }
                },
                error: function (error) {
                    $(a).addClass('failed').html('Add to cart failed!');
                    console.log(error);
                }
            });
        });
    });
    &amp;lt;/script&amp;gt;
    &amp;lt;?php
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;코드가 작동합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;활성 하위 테마(또는 활성 테마)의 php 파일입니다.&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://wordpress.org/support/plugin/woocommerce-ajax-add-to-cart-for-variable-products/reviews/&quot; rel=&quot;nofollow noreferrer&quot;&gt;플러그인&lt;/a&gt;&lt;em&gt;(&quot;Wocommerce Ajax add to cart for variable products&quot;)&lt;/em&gt;을 사용하여 변화의 속성(&lt;strong&gt;예&lt;/strong&gt;: 색상)과 &lt;strong&gt;프론트엔드&lt;/strong&gt;의 수량을 선택한 후에 눌러야 하는 &lt;strong&gt;&quot;Add to cart&quot;&lt;/strong&gt; 버튼을 Ajaxify 할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 플러그인을 기본적으로 사용하지 않으면 &quot;수레에 추가&quot;를 누르면 페이지가 새로 고쳐집니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://i.stack.imgur.com/9xvOH.png&quot; rel=&quot;nofollow noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/9xvOH.png&quot; alt=&quot;enter image description here&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/50631834/ajax-add-to-cart-button-for-product-variation-in-woocommerce-3&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>WordPress</category>
      <author>css3</author>
      <guid isPermaLink="true">https://css3.tistory.com/1130</guid>
      <comments>https://css3.tistory.com/1130#entry1130comment</comments>
      <pubDate>Wed, 1 Nov 2023 22:32:04 +0900</pubDate>
    </item>
    <item>
      <title>다른 요소 뒤에 요소를 추가하려면 어떻게 해야 합니까?</title>
      <link>https://css3.tistory.com/1129</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 papago-translate=&quot;translated&quot;&gt;해봤습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;.append()&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;function, 그러나 그것은 요소의 div만 추가합니다.&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;&amp;lt;input type=&quot;text&quot; id=&quot;bla&quot; /&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고 나는 그것을 다음과 같이 바꾸고 싶습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;input type=&quot;text&quot; id=&quot;bla&quot; /&amp;gt;&amp;lt;div id=&quot;space&quot;&amp;gt;&amp;lt;/div&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;after()&lt;/code&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;$('#bla').after('&amp;lt;div id=&quot;space&quot;&amp;gt;&amp;lt;/div&amp;gt;');
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;a href=&quot;http://api.jquery.com/after/&quot; rel=&quot;noreferrer&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;문서화&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;해라&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;.insertAfter()
&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;$(content).insertAfter('#bla');
&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;input&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;요소에 종결 태그가 없어야 합니다(http://www.w3.org/TR/html401/interact/forms.html#edef-INPUT : End tag : infird).&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;append()&lt;/code&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;해결된 jQuery: 요소 뒤에 요소 추가&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;script&amp;gt;
$( &quot;p&quot; ).after( &quot;&amp;lt;strong&amp;gt;Hello&amp;lt;/strong&amp;gt;&quot; );
&amp;lt;/script&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;pre&gt;&lt;code&gt;&amp;lt;script type=&quot;text/javascript&quot;&amp;gt; 
jQuery(document).ready(function(){
jQuery ( &quot;.sidebar_cart&quot; ) .insertAfter( &quot;&amp;lt;a href='http://#'&amp;gt;Continue Shopping&amp;lt;/a&amp;gt;&quot; );
});
&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/2244605/how-can-i-add-an-element-after-another-element&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>jQuery</category>
      <author>css3</author>
      <guid isPermaLink="true">https://css3.tistory.com/1129</guid>
      <comments>https://css3.tistory.com/1129#entry1129comment</comments>
      <pubDate>Wed, 1 Nov 2023 22:31:55 +0900</pubDate>
    </item>
    <item>
      <title>(ActiveXObject 없이) JavaScript로 Excel 파일을 읽는 방법</title>
      <link>https://css3.tistory.com/1128</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;(ActiveXObject 없이) JavaScript로 Excel 파일을 읽는 방법&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;저는 이미 강력한 chart.js를 알고 있기 때문에 자바스크립트를 언어로 사용하기로 했습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하지만 chart.js를 사용하기 전에 엑셀 파일에서 데이터를 수집해야 합니다.&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;몇 가지 조사 끝에 (ActiveX를 사용하여) Internet Explorer로 이 작업을 수행했지만 브라우저 간에 작동하려면 이 작업이 필요합니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;순수 자바스크립트로 &lt;a href=&quot;https://github.com/SheetJS/js-xls&quot; rel=&quot;noreferrer&quot;&gt;XLS&lt;/a&gt; &amp;amp; &lt;a href=&quot;https://github.com/SheetJS/js-xlsx&quot; rel=&quot;noreferrer&quot;&gt;XLSX&lt;/a&gt;를 파싱할 수 있는 자바스크립트 라이브러리가 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Chrome으로 테스트를 해봤는데(Windows상에서도) 정상적으로 작동했습니다.&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;기본적으로 펀펀은 Excel에서 자바스크립트를 사용할 수 있게 해주는 도구이므로, Chart.js와 같은 라이브러리를 사용하여 스프레드시트의 데이터로부터 차트를 플롯할 수 있습니다.&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;1).&lt;/strong&gt; Office Add-in 스토어에서 Funfun Add-in을 삽입합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://i.stack.imgur.com/iQgcH.png&quot; rel=&quot;nofollow noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/iQgcH.png&quot; alt=&quot;enter image description here&quot;&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;2).&lt;/strong&gt; 새로운 펀펀을 만들거나 펀펀 온라인 편집기에서 샘플을 로드합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://i.stack.imgur.com/qZfNv.png&quot; rel=&quot;nofollow noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/qZfNv.png&quot; alt=&quot;enter image description here&quot;&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;3).&lt;/strong&gt; 다른 자바스크립트 편집기에서처럼 자바스크립트 코드를 작성합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 단계에서 스프레드시트의 데이터를 직접 사용하기 위해서는 일부 JSON I/O를 작성하여 Excel 셀을 참조해야 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 값이 &lt;strong&gt;Setting-short&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;평균 시간은 셀 A1에 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Average hours    Jan    Feb   Mar    Apr
Baby Jones       93.5   81    94.5   95.5
Joanne Jones     91.5   90    88.5   85.5
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 경우 JSON I/O 값은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;{
    &quot;months&quot;: &quot;=C6:G6&quot;,
    &quot;manager1&quot;: &quot;=C7:G7&quot;,
    &quot;manager2&quot;: &quot;=C8:G8&quot;
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;자세한 설명은 펀펀(Funfun) &lt;a href=&quot;https://www.funfun.io/1/help&quot; rel=&quot;nofollow noreferrer&quot;&gt;설명서&lt;/a&gt;를 확인할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;4).&lt;/strong&gt; 코드를 실행하여 도표를 표시합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;펀펀 온라인 에디터에서 자바스크립트(Chart.js)와 엑셀 데이터를 이용하여 만든 샘플 차트입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아래 링크에서 확인하실 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;2단계에서 설명한 것처럼 엑셀에 쉽게 로드할 수도 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://www.funfun.io/1/edit/5a365e7c74efa7334ff272a6&quot; rel=&quot;nofollow noreferrer&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;https://www.funfun.io/1/edit/5a365e7c74efa7334ff272a6&lt;/font&gt;&lt;/a&gt; &lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;&lt;em&gt;&lt;font papago-translate=&quot;translated&quot;&gt;공개:&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 펀펀의 개발자입니다.&lt;/font&gt;&lt;/em&gt;&lt;/strong&gt; &lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Excel 파일에서 데이터를 쉽게 로드할 수 있는 Chart.js 플러그인 &lt;a href=&quot;https://nagix.github.io/chartjs-plugin-datasource/&quot; rel=&quot;nofollow noreferrer&quot;&gt;chartjs-plugin-data&lt;/a&gt; source가 있습니다.&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;mydata.xlsx&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;HTML 파일과 동일한 디렉토리에 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-none prettyprint-override&quot;&gt;&lt;code&gt;+---------------+---------+----------+-------+-------+------+------+------+
|               | January | February | March | April | May  | June | July |
+---------------+---------+----------+-------+-------+------+------+------+
| Temperature   |       7 |        7 |    10 |    15 |   20 |   23 |   26 |
+---------------+---------+----------+-------+-------+------+------+------+
| Precipitation |     8.1 |     14.9 |  41.0 |  31.4 | 42.6 | 57.5 | 36.0 |
+---------------+---------+----------+-------+-------+------+------+------+
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Chart.js, &lt;a href=&quot;https://github.com/sheetjs/js-xlsx&quot; rel=&quot;nofollow noreferrer&quot;&gt;SheetJS(js-xlsx)&lt;/a&gt; 및 chartjs-plugin-datasource를 페이지에 포함합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-html prettyprint-override&quot;&gt;&lt;code&gt;&amp;lt;script src=&quot;https://cdn.jsdelivr.net/npm/chart.js@2.8.0&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script src=&quot;https://cdn.jsdelivr.net/npm/xlsx@0.14.3/dist/xlsx.full.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script src=&quot;https://cdn.jsdelivr.net/npm/chartjs-plugin-datasource@0.1.0&quot;&amp;gt; &amp;lt;/script&amp;gt;

&amp;lt;canvas id=&quot;myChart&quot;&amp;gt;&amp;lt;/canvas&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;mydata.xlsx&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;당신의 대본에.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-js prettyprint-override&quot;&gt;&lt;code&gt;var ctx = document.getElementsById(&quot;myChart&quot;);
var chart = new Chart(ctx, {
    type: 'bar',
    data: {
        datasets: [{
            type: 'line',
            yAxisID: 'temperature',
            backgroundColor: 'transparent',
            borderColor: 'rgb(255, 99, 132)',
            pointBackgroundColor: 'rgb(255, 99, 132)',
            tension: 0,
            fill: false
        }, {
            yAxisID: 'precipitation',
            backgroundColor: 'rgba(54, 162, 235, 0.5)',
            borderColor: 'transparent'
        }]
    },
    plugins: [ChartDataSource],
    options: {
        scales: {
            yAxes: [{
                id: 'temperature',
                gridLines: {
                    drawOnChartArea: false
                }
            }, {
                id: 'precipitation',
                position: 'right',
                gridLines: {
                    drawOnChartArea: false
                }
            }]
        },
        plugins: {
            datasource: {
                url: 'mydata.xlsx'
            }
        }
    }
});
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;ActiveX를 사용하지 않으면 엑셀 파일을 읽을 수 없을 것 같습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;ActiveX 없이는 엑셀파일을 읽을 수 없다는 것은 아니지만, 그 방법은 잘 모릅니다. Active를 사용해서 읽고 싶다면 엑셀파일을 읽을 때 사용할 수 있는 코드가 여기 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;input type=&quot;button&quot; id=&quot;btnSubmit&quot; onclick=&quot;readdata(1, 2)&quot; value=&quot;Submit&quot; /&amp;gt;
&amp;lt;script&amp;gt;
var xVal = 1;
var yVal = 2

    function readdata(x,y) {
        x = xVal;
        y = yVal;
        try {
            var excel = new ActiveXObject(&quot;Excel.Application&quot;);
            excel.Visible = false;
            var excel_file = excel.Workbooks.Open(&quot;D:\\Test.xls&quot;);// alert(excel_file.worksheets.count);
            var excel_sheet = excel_file.Worksheets(&quot;Sheet1&quot;);

            for(i=0;i&amp;lt;5;i++)
            {
               var data = excel_sheet.Cells(i,2).Value;
                drawWithexcelValue(data);
            }


        }
        catch (ex) {
            alert(ex);
        }

&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;IE 9 이상에서만 실행되며 설정에서 activeX 기능을 활성화해야 합니다.&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/16630413/how-can-i-read-an-excel-file-with-javascript-without-activexobject&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>Excel</category>
      <author>css3</author>
      <guid isPermaLink="true">https://css3.tistory.com/1128</guid>
      <comments>https://css3.tistory.com/1128#entry1128comment</comments>
      <pubDate>Wed, 1 Nov 2023 22:31:49 +0900</pubDate>
    </item>
    <item>
      <title>데이터를 삽입했지만 jquery는 여전히 오류를 반환합니다.</title>
      <link>https://css3.tistory.com/1127</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;데이터를 삽입했지만 jquery는 여전히 오류를 반환합니다.&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 데이터 서비스를 통해 데이터를 삽입하기 위해 jQuery를 팔로우했습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;상태 응답 201을 받고 데이터가 데이터베이스에 성공적으로 삽입되었지만 시스템은 여전히 오류로 간주하고 &quot;실패&quot; 경고를 표시합니까?&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;내가 뭘 놓치고 있는 거지?&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$.ajax({
    type: &quot;POST&quot;,
    url: &quot;http://localhost:49223/Form/WebDataService.svc/XMLForm(guid'1eaef3a0-d6df-45bf-a8f6-3e7292c0d77e')/XMLRecord/&quot;,
    data: JSON.stringify(record),
    contentType: &quot;application/json; charset=utf-8&quot;,
    dataType: &quot;json&quot;,
    success: function() {
        alert(&quot;Success&quot;);
    },
    error: function(xhr) {
        alert(&quot;fail&quot;);
    }
});
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;업데이트:&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Fire Bug에서 디버그 메시지:&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-none prettyprint-override&quot;&gt;&lt;code&gt;Preferences

POST http://localhost:49223/Form/WebDataService.svc/X...ef3a0-d6df-45bf-a8f6-3e7292c0d77e%27)/XMLRecord/

POST http://localhost:49223/Form/WebDataService.svc/XMLForm(guid%271eaef3a0-d6df-45bf-a8f6-3e7292c0d77e%27)/XMLRecord/

jquery....min.js (line 127)
POST http://localhost:49223/Form/WebDataService.svc/X...ef3a0-d6df-45bf-a8f6-3e7292c0d77e%27)/XMLRecord/

POST http://localhost:49223/Form/WebDataService.svc/XMLForm(guid%271eaef3a0-d6df-45bf-a8f6-3e7292c0d77e%27)/XMLRecord/

201 Created 6.7s

POST http://localhost:49223/Form/WebDataService.svc/X...ef3a0-d6df-45bf-a8f6-3e7292c0d77e%27)/XMLRecord/

POST http://localhost:49223/Form/WebDataService.svc/XMLForm(guid%271eaef3a0-d6df-45bf-a8f6-3e7292c0d77e%27)/XMLRecord/

201 Created


get readyState 4

get responseText &quot;{ &quot;d&quot; : {\r\n&quot;__metadata&quot;...\')/XMLForm&quot;\r\n}\r\n}\r\n} }&quot;

get responseXML null

get status 201

get statusText &quot;Created&quot;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;성공 함수가 jQuery 및 빈 응답과 함께 작동하도록 하려면 {dataType: 'text'}을(를) 전송해야 합니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;해결책:&lt;/font&gt;&lt;/strong&gt; &lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이전 코드에서 오류가 발생하는 방법을 여전히 파악할 수 없지만, (적어도 지금은) 저에게 적합한 대체 솔루션을 얻었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;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;$.ajax({
            type: &quot;POST&quot;,
            contentType: &quot;application/json; charset=utf-8&quot;,
            dataType: &quot;json&quot;,
            url: &quot;http://localhost:49223/Form/WebDataService.svc/XMLForm(guid'1eaef3a0-d6df-45bf-a8f6-3e7292c0d77e')/XMLRecord/&quot;,
            data: JSON.stringify(record),
            complete: function(xhr) {
                if (xhr.readyState == 4) {
                    if (xhr.status == 201) {
                        alert(&quot;Created&quot;);
                    }
                } else {
                    alert(&quot;NoGood&quot;);
                }
            }
            //                
            //                success: function(data) {
            //                    alert(&quot;Success&quot;);
            //                },
            //                error: function(xhr) {
            //                    alert(&quot;fail&quot; + xhr);
            //                }
        });
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;내용이 없는 201이 반드시 유효하지 않은 것으로 간주되기 때문이 아니라 빈 문자열(&quot;&quot;)을 구문 분석하는 것이 JSON 구문 분석 오류이기 때문에 발생합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 동작은 dataFilter를 설정하여 전역적으로 또는 요청별로 변경할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$.ajaxSetup({
    dataFilter: function(data, dataType) {
        if (dataType == 'json' &amp;amp;&amp;amp; data == '') {
            return null;
        } else {
            return data;
        }
    }
});
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;전에 이런 일이 있었어요.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제 문제는 질의 문자열 끝에 '.json' 확장자가 포함되어 있지 않아서 XML을 돌려받고 있었습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;jQuery가 xml을 json으로 구문 분석하려고 하면 오류 처리기가 호출됩니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 jQuery_2.1.1을 사용하는데 비슷한 문제가 있었습니다. PUT가 error() handler로 넘어갔습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;나의 REST api call principle은&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;PUT to named key path (/rest/properties/mykey1): 204=기존 개체 updated, 201=새 개체 생성 및 반환 위치 헤더, XXX=anything 등 오류와 가장 유사합니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;알 수 없는 키 경로(/rest/properties)로 POST: 201=새 개체를 만들고 위치 헤더를 반환합니다. XXX= anything 기타 오류가 가장 많습니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;http status 204는 NoContent라서 jQuery는 괜찮았지만 201=Created는 json body object를 기대하고 있었는데 0length body part를 반품했습니다.&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 개체를 반환할 수 있으므로 datatype: &quot;json&quot; 속성을 사용해야 했습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;나의 jQuery 솔루션은 201 상태 확인 오류()와 call success() 함수였습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$.ajax({
    url: &quot;/myapp/rest/properties/mykey1&quot;,
    data: jsonObj, 
    type: &quot;PUT&quot;,
    headers: { &quot;Accept&quot;:&quot;application/json&quot;, &quot;Content-Type&quot;:&quot;application/json&quot; },
    timeout: 30000,
    dataType: &quot;json&quot;,
    success: function(data, textStatus, xhr) {
        data=&quot;Server returned &quot; + xhr.status;
        if (xhr.status==201) data+=&quot; &quot;+xhr.getResponseHeader(&quot;location&quot;);
        $(&quot;#ajaxreply&quot;).text(data);
    },
    error: function(xhr, textStatus, ex) {
        if (xhr.status==201) { this.success(null, &quot;Created&quot;, xhr); return; }
        $(&quot;#ajaxreply&quot;).text( textStatus + &quot;,&quot; + ex + &quot;,&quot; + xhr.responseText );
    }
});     
&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/12410051/how-to-handle-ajax-201/34789948#34789948&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;저도 같은 문제가 있었는데, 이 문제를 해결해 준 한 가지는 &quot;dataType&quot;을 그대로 둔다는 것이었습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 작업을 수행하면 서버가 반환하는 데이터 유형을 추측하고 서버가 컨텐츠가 없는 201을 반환할 때 오류를 발생시키지 않습니다.&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;URL : https://stackoverflow.com/questions/2233553/data-inserted-successful-but-jquery-still-returning-error&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>Ajax</category>
      <author>css3</author>
      <guid isPermaLink="true">https://css3.tistory.com/1127</guid>
      <comments>https://css3.tistory.com/1127#entry1127comment</comments>
      <pubDate>Wed, 1 Nov 2023 22:31:40 +0900</pubDate>
    </item>
    <item>
      <title>MySQL: 관계에 참여하지 않는 행 찾기</title>
      <link>https://css3.tistory.com/1126</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;저는 '영화'와 '사용자'라는 두 개의 테이블을 가지고 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이들 사이에는 사용자가 본 영화를 설명하는 n:m 관계가 있습니다.&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 *
FROM movies 
WHERE movies.id NOT IN (
     SELECT seen.movie_id 
     FROM seen 
     WHERE seen.user_id=123
)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것은 잘 작동하지만 확장이 잘 되지 않는 것 같습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이에 대한 더 나은 접근 방법이 있습니까?&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;보여준 하위 쿼리 방법을 사용하지 않고 이 쿼리를 수행하는 일반적인 방법은 다음과 같습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이는 조인 기반 솔루션을 보고 싶다는 @Godke의 요청을 만족시킬 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;SELECT * 
FROM movies m
 LEFT OUTER JOIN seen s
 ON (m.id = s.movie_id AND s.user_id = 123)
WHERE s.movie_id IS NULL;
&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;두 쿼리를 모두 분석할 때는 EXPRESON을 사용하여 스키마와 데이터를 고려할 때 어떤 쿼리가 더 효과적인지 확인하는 것이 가장 좋습니다.&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 movies m
WHERE NOT EXISTS (SELECT * FROM seen s 
                  WHERE s.movie_id = m.id 
                    AND s.user_id=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 papago-translate=&quot;translated&quot;&gt;일반적으로 비용이 많이 들고 원래 예제 쿼리가 더 좋습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;반면 MySQL에서는 &quot;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;NOT EXISTS&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&quot; 종종 &quot;보다 낫습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;column NOT IN (...)&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&quot;&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;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;예를 들어, 큰 테이블의 경우에도 외부 선택에 대한 간단한 LIMIT는 매우 빠릅니다.&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;동영상의 전체에서 SEEN(사용자의 경우)에 있는 동영상 ID 집합을 효과적으로 &quot;추출&quot;하여 해당 사용자에게 보이지 않는 동영상을 생성하는 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것은 &quot;부정적인 조인&quot;이라고 불리는데 안타깝게도 NOT IN 또는 NOT EXISMENT가 최선의 선택입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;(INNER/OUTER/LEFT/RIGHT 조인과 유사한 네거티브 조인 구문을 보고 싶지만 ON 절이 뺄셈 문일 수 있습니다.)&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;@Bill은 하위 쿼리가 없는 솔루션이 효과가 있을 것입니다. 비록 Bill은 솔루션의 성능을 두 가지 방법으로 테스트하는 것이 좋습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;나는 그 서브쿼리가 전체적으로 보이든 안 보이든 아니든.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;ID 인덱스(물론 전체 무비).&lt;/font&gt;&lt;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;DBMS가 비트맵 인덱스를 지원하는 경우 시도해 볼 수 있습니다.&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/544094/mysql-finding-rows-that-dont-take-part-in-a-relationship&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>MySQL</category>
      <author>css3</author>
      <guid isPermaLink="true">https://css3.tistory.com/1126</guid>
      <comments>https://css3.tistory.com/1126#entry1126comment</comments>
      <pubDate>Wed, 1 Nov 2023 22:31:32 +0900</pubDate>
    </item>
    <item>
      <title>Lazy div 배경 이미지를 로드하는 방법</title>
      <link>https://css3.tistory.com/1125</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Lazy div 배경 이미지를 로드하는 방법&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;이제 이것을 게으른 load div 배경 이미지로 사용하고 싶습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;내가 어떻게 그럴 수 있을까?&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 현재 그 플러그인을 http://www.appelsiini.net/projects/lazyload 에서 사용할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그래서 div background와 같이 작동하는 방향으로 수정해야 합니다.&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;pre&gt;&lt;code&gt;$self.one(&quot;appear&quot;, function() {
    if (!this.loaded) {
        if (settings.appear) {
            var elements_left = elements.length;
            settings.appear.call(self, elements_left, settings);
        }
        $(&quot;&amp;lt;img /&amp;gt;&quot;)
            .bind(&quot;load&quot;, function() {
                $self
                    .hide()
                    .attr(&quot;src&quot;, $self.data(settings.data_attribute))
                    [settings.effect](settings.effect_speed);
                self.loaded = true;

                /* Remove image from array so it is not looped next time. */
                var temp = $.grep(elements, function(element) {
                    return !element.loaded;
                });
                elements = $(temp);

                if (settings.load) {
                    var elements_left = elements.length;
                    settings.load.call(self, elements_left, settings);
                }
            })
            .attr(&quot;src&quot;, $self.data(settings.data_attribute));
    }
});
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Jquery 플러그인 레이지 로드&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;먼저 교환하고 싶을 때는 생각을 해봐야 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예를 들어 div 태그가 로드될 때마다 전환할 수 있습니다.&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;그러면 생성된 이미지 태그와 함께 Data를 로드하면 됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고 img 태그를 덮어쓰지 말고 cs 배경 이미지를 적용하세요.&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 (settings.appear) {
    var elements_left = elements.length;
    settings.appear.call(self, elements_left, settings);
}
var loadImgUri;
if($self.data(&quot;background&quot;))
    loadImgUri = $self.data(&quot;background&quot;);
else
    loadImgUri  = $self.data(settings.data_attribute);

$(&quot;&amp;lt;img /&amp;gt;&quot;)
    .bind(&quot;load&quot;, function() {
        $self
            .hide();
        if($self.data(&quot;background&quot;)){
            $self.css('backgroundImage', 'url('+$self.data(&quot;background&quot;)+')');
        }else
            $self.attr(&quot;src&quot;, $self.data(settings.data_attribute))

        $self[settings.effect](settings.effect_speed);

        self.loaded = true;

        /* Remove image from array so it is not looped next time. */
        var temp = $.grep(elements, function(element) {
            return !element.loaded;
        });
        elements = $(temp);

        if (settings.load) {
            var elements_left = elements.length;
            settings.load.call(self, elements_left, settings);
        }
    })
    .attr(&quot;src&quot;, loadImgUri );
}
&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;#divToLoad&quot;).lazyload();
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고 이 예제에서는 다음과 같이 html 코드를 수정해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;div data-background=&quot;http://apod.nasa.gov/apod/image/9712/orionfull_jcc_big.jpg&quot; id=&quot;divToLoad&quot; /&amp;gt;​
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러나 div 태그로 스위치를 변경한 후 &quot;data-original&quot; 속성을 사용할 수 있는 경우에도 작동합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음은 http://jsfiddle.net/dtm3k/1/ 입니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;편집&lt;/strong&gt;: 아래로부터의 게시물은 2012년의 것이고 지금쯤이면 구식입니다!&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 이렇게 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;div class=&quot;lazyload&quot; style=&quot;width: 1000px; height: 600px&quot; data-src=&quot;%s&quot;&amp;gt;
    &amp;lt;img class=&quot;spinner&quot; src=&quot;spinner.gif&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;$(window).load(function(){

    $('.lazyload').each(function() {

        var lazy = $(this);
        var src = lazy.attr('data-src');

        $('&amp;lt;img&amp;gt;').attr('src', src).load(function(){
            lazy.find('img.spinner').remove();
            lazy.css('background-image', 'url(&quot;'+src+'&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;em&gt;2020년&lt;/em&gt; 웹&lt;a href=&quot;https://web.dev/lazy-loading-images/&quot; rel=&quot;noreferrer&quot;&gt;.&lt;/a&gt;&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;https://web.dev/lazy-loading-images/&quot; rel=&quot;noreferrer&quot;&gt;dev&lt;/a&gt;는 새로운 것과 이것을 할 수 있는 몇가지 새로운 방법을 공유하는 기사를 올렸습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;IntersectionObserver&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;CSS&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-css prettyprint-override&quot;&gt;&lt;code&gt;.lazy-background {
  background-image: url(&quot;hero-placeholder.jpg&quot;); /* Placeholder image */
}

.lazy-background.visible {
  background-image: url(&quot;hero.jpg&quot;); /* The final image */
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;자바스크립트&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-js prettyprint-override&quot;&gt;&lt;code&gt;document.addEventListener(&quot;DOMContentLoaded&quot;, function() {
  var lazyBackgrounds = [].slice.call(document.querySelectorAll(&quot;.lazy-background&quot;));

  if (&quot;IntersectionObserver&quot; in window) {
    let lazyBackgroundObserver = new IntersectionObserver(function(entries, observer) {
      entries.forEach(function(entry) {
        if (entry.isIntersecting) {
          entry.target.classList.add(&quot;visible&quot;);
          lazyBackgroundObserver.unobserve(entry.target);
        }
      });
    });

    lazyBackgrounds.forEach(function(lazyBackground) {
      lazyBackgroundObserver.observe(lazyBackground);
    });
  }
});
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;플러그인의 공식 사이트에서 이 내용을 발견했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;div class=&quot;lazy&quot; data-original=&quot;img/bmw_m1_hood.jpg&quot; style=&quot;background-image: url('img/grey.gif'); width: 765px; height: 574px;&quot;&amp;gt;&amp;lt;/div&amp;gt;

$(&quot;div.lazy&quot;).lazyload({
      effect : &quot;fadeIn&quot;
});
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;출처 : http://www.appelsiini.net/projects/lazyload/enabled_background.html&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;도움이 될만한 &quot;게으른 부하&quot; 플러그인을 만들었습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사용자의 경우 작업을 완료할 수 있는 방법은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$('img').lazyloadanything({
    'onLoad': function(e, LLobj) {
        var $img = LLobj.$element;
        var src = $img.attr('data-src');
        $img.css('background-image', 'url(&quot;'+src+'&quot;)');
    }
});
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;maosmurf의 예처럼 간단하지만 요소가 시야에 들어오면 이벤트 발화의 &quot;게으른 부하&quot; 기능을 제공합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://github.com/shrimpwagon/jquery-lazyloadanything&quot; rel=&quot;noreferrer&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;https://github.com/shrimpwagon/jquery-lazyloadanything&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 질문을 하는 것은 잠시였지만, 2020년에 다른 답변을 공유할 수 없다는 것을 의미하지는 않습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여기 jquery:&lt;a href=&quot;http://jquery.eisbehr.de/lazy/&quot; rel=&quot;noreferrer&quot;&gt;jQuery Lazy&lt;/a&gt;와 함께하는 멋진 플러그인이 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Lazy의 기본 사용법:&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;HTML&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;!-- load background images of other element types --&amp;gt;
&amp;lt;div class=&quot;lazy&quot; data-src=&quot;path/to/image.jpg&quot;&amp;gt;&amp;lt;/div&amp;gt;
enter code here
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;JS&lt;/font&gt;&lt;/strong&gt; &lt;/p&gt; 
&lt;pre&gt;&lt;code&gt; $('.lazy').Lazy({
    // your configuration goes here
    scrollDirection: 'vertical',
    effect: 'fadeIn',
    visibleOnly: true,
    onError: function(element) {
        console.log('error loading ' + element.data('src'));
    }
});
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;배경 이미지는 로딩이 귀찮습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그게 다예요!&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;실제 예제와 더 자세한 내용을 보려면 이 &lt;a href=&quot;http://jquery.eisbehr.de/lazy/example_load-background-images&quot; rel=&quot;noreferrer&quot;&gt;lazy-doc&lt;/a&gt; 링크를 확인하십시오.&lt;/font&gt;&lt;/p&gt;&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;위에서 언급한 플러그인을 사용하여 이미지를 게으르게 로드하는 것은 스크롤 이벤트에 청취자를 부착하거나 setInterval을 사용하는 기존 방식을 사용하며 getBoundingClientRect()를 호출할 때마다 브라우저가 전체 페이지를 다시 &lt;a href=&quot;https://gist.github.com/paulirish/5d52fb081b3570c81e3a&quot; rel=&quot;nofollow noreferrer&quot;&gt;배치&lt;/a&gt;하도록 강요하고 웹 사이트에 상당한 jank를 도입하기 때문에 성능이 매우 떨어집니다.&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://developers.google.com/web/updates/2016/04/intersectionobserver&quot; rel=&quot;nofollow noreferrer&quot;&gt;InteractionObserver&lt;/a&gt;를 사용하여 이미지를 지연 로드하는 &lt;strong&gt;&lt;a href=&quot;https://github.com/ApoorvSaxena/lozad.js&quot; rel=&quot;nofollow noreferrer&quot;&gt;Lozad.js&lt;/a&gt;&lt;/strong&gt;(의존 관계 없이 569바이트만 사용)를 사용합니다.&lt;/font&gt;&lt;/p&gt;&lt;h1&gt;&lt;font papago-translate=&quot;translated&quot;&gt;jQuery 미포함&lt;/font&gt;&lt;/h1&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;HTML&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;background-image: url ('default-loading-image')&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;data-src=&quot;image-you-load-to-load&quot;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;div class=&quot;ajustedBackground&quot;  style=&quot;background-image: url('default-loading-image');&quot; data-src=&quot;image-you-want-to-load&quot;&amp;gt;&amp;lt;div&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;/p&gt;
&lt;div class=&quot;snippet&quot; data-lang=&quot;js&quot; data-hide=&quot;false&quot; data-console=&quot;true&quot; data-babel=&quot;false&quot;&gt; 
 &lt;div class=&quot;snippet-code&quot;&gt; 
  &lt;pre class=&quot;snippet-code-js lang-js prettyprint-override&quot;&gt;&lt;code&gt;var tablinks = document.getElementsByClassName(&quot;ajustedBackground&quot;);
    for (i = 0; i &amp;lt; tablinks.length; i++) {
      var lazy = tablinks[i];
      var src = lazy.dataset.src;

      lazy.style.backgroundImage =  'url(&quot;'+src+'&quot;)';
    }&lt;/code&gt;&lt;/pre&gt; 
  &lt;pre class=&quot;snippet-code-css lang-css prettyprint-override&quot;&gt;&lt;code&gt;.ajustedBackground{
  width: 100%;
  height: 300px;
  background-size: 100%;
  border-radius: 5px;
  background-size: cover;
  background-position: center;
  position: relative;
}&lt;/code&gt;&lt;/pre&gt; 
  &lt;pre class=&quot;snippet-code-html lang-html prettyprint-override&quot;&gt;&lt;code&gt;&amp;lt;div class=&quot;ajustedBackground&quot;  style=&quot;background-image: url('https://monyo.az/resources/img/ezgif-6-b10ea37ef846.gif');&quot; data-src=&quot;https://monyo.az/resources-qrcode/img/Fathir_7%201.png&quot;&amp;gt;&amp;lt;div&amp;gt;&lt;/code&gt;&lt;/pre&gt; 
 &lt;/div&gt; 
&lt;/div&gt; 
&lt;p&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;모두 찾습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ajustedBackground&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;classname in html and load image from&lt;/font&gt;&lt;/font&gt;&lt;code&gt;data-src&lt;/code&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;function lazyloadImages(){
    var tablinks = document.getElementsByClassName(&quot;ajustedBackground&quot;);
    for (i = 0; i &amp;lt; tablinks.length; i++) {
      var lazy = tablinks[i];
      var src = lazy.dataset.src;

      lazy.style.background =  'url(&quot;'+src+'&quot;)';
    }

}
&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;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;제 해결책은 매우 간단합니다. 모든 이미지의 범위를 &quot;zoinked&quot;와 같은 CSS 셀렉터로 유지합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;논리:&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사용자가 스크롤하는 경우, 관련된 배경 이미지와 함께 스타일로 로드합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;알았어!&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여기 제가 도서관에서 쓴 &quot;zoinked&quot;라는 글이 있습니다. 이유를 모르겠습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그냥 일어난거죠?&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;(function(window, document, undefined) {   var Z = function() {
    this.hasScrolled = false;

    if (window.addEventListener) {
      window.addEventListener(&quot;scroll&quot;, this, false);
    } else {
      this.load();
    }   };
     Z.prototype.handleEvent = function(e) {
    if ($(window).scrollTop() &amp;gt; 2) {
      this.hasScrolled = true;
      window.removeEventListener(&quot;scroll&quot;, this);
      this.load();
    }   };
     Z.prototype.load = function() {
    $(document.body).addClass(&quot;zoinked&quot;);   };
     window.Zoink = Z; 
})(window, document);
&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;.zoinked #graphic {background-image: url(large.jpg);}

@media(max-width: 480px) {.zoinked #graphic {background-image: url(small.jpg);}}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사용자가 스크롤을 시작하는 순간 상단의 이미지 뒤에 있는 모든 이미지를 로드하는 것이 제 기술입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;더 많은 제어를 원한다면 &quot;줌킹&quot;을 더 지능적으로 만들 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;&amp;lt;div class=&quot;lazy&quot; data-bg=&quot;img/bmw_m1_hood.jpg&quot; style=&quot;width: 765px; height: 574px;&quot;&amp;gt;&amp;lt;/div&amp;gt;
    
var lazyLoadInstance = new LazyLoad({
  load_delay: 100,
  effect : &quot;fadeIn&quot;
});
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;바닐라 레이지 로드 사용하기 https://www.npmjs.com/package/vanilla-lazyload&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;jQuery를 사용하면 이미지의 존재를 확인할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;src를 원래 이미지 높이 너비의 평면 base64 해시 문자열에 추가한 다음 필요한 url로 대체했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$('[data-src]').each(function() {
  var $image_place_holder_element = $(this);
  var image_url = $(this).data('src');
  $(&quot;&amp;lt;div class='hidden-class' /&amp;gt;&quot;).load(image_url, function(response, status, xhr) {
    if (!(status == &quot;error&quot;)) {
      $image_place_holder_element.removeClass('image-placeholder');
      $image_place_holder_element.attr('src', image_url);
    }
  }).remove();
});
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;물론 저는 몇 가지 스택 답변을 사용하고 수정했습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;누군가에게 도움이 되길 바랍니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것은 각진 것입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;JS Directive를 실행합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;누군가에게 도움이 되길 바랍니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;용도:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;div background-image=&quot;{{thumbnailUrl}}&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;import * as angular from &quot;angular&quot;;

export class BackgroundImageDirective implements angular.IDirective {

    restrict = 'A';

    link(scope: angular.IScope, element: angular.IAugmentedJQuery, attrs: angular.IAttributes) {
     
        var backgroundImage = attrs[&quot;backgroundImage&quot;];

        let observerOptions = {
            root: null,
            rootMargin: &quot;0px&quot;,
            threshold: []
        };

        var intersectionCallback: IntersectionObserverCallback = (entries, self) =&amp;gt; {

            entries.forEach((entry) =&amp;gt; {
                let box = entry.target as HTMLElement;

                if (entry.isIntersecting &amp;amp;&amp;amp; !box.style.backgroundImage) {
                    box.style.backgroundImage = `url(${backgroundImage})`;
                    self.disconnect();
                }
            });
        }

        var observer = new IntersectionObserver(intersectionCallback, observerOptions);
        observer.observe(element[0]);
    }

    static factory(): angular.IDirectiveFactory {
        return () =&amp;gt; new BackgroundImageDirective();
    }
}
&lt;/code&gt;&lt;/pre&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;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;title&amp;gt;Lazy Load Background Images&amp;lt;/title&amp;gt;
    &amp;lt;style&amp;gt;
        .lazy-bg {
            width: 400px;
            height: 300px;
            background-color: #f0f0f0;
            background-size: cover;
            background-position: center;
        }
    &amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;div class=&quot;lazy-bg&quot; data-bg-src=&quot;image1.jpg&quot;&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;div class=&quot;lazy-bg&quot; data-bg-src=&quot;image2.jpg&quot;&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;div class=&quot;lazy-bg&quot; data-bg-src=&quot;image3.jpg&quot;&amp;gt;&amp;lt;/div&amp;gt;

    &amp;lt;script src=&quot;https://code.jquery.com/jquery-3.6.0.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;script&amp;gt;
        $(document).ready(function () {
            $(&quot;.lazy-bg&quot;).each(function () {
                var $element = $(this);
                var bgSrc = $element.data(&quot;bg-src&quot;);

                if (bgSrc) {
                    var img = new Image();
                    img.src = bgSrc;

                    $(img).on(&quot;load&quot;, function () {
                        $element.css(&quot;background-image&quot;, &quot;url('&quot; + bgSrc + &quot;')&quot;);
                    });
                }
            });
        });
    &amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이미지 부하와는 관계가 없는 것으로 알고 있지만, 여기서 제가 입사 면접 시험에서 한 것이 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;HTML&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;div id=&quot;news-feed&quot;&amp;gt;Scroll to see News (Newest First)&amp;lt;/div&amp;gt;
&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;article {
   margin-top: 500px;
   opacity: 0;
   border: 2px solid #864488;
   padding: 5px 10px 10px 5px;
   background-image: -webkit-gradient(
   linear,
   left top,
   left bottom,
   color-stop(0, #DCD3E8),
   color-stop(1, #BCA3CC)
   );
   background-image: -o-linear-gradient(bottom, #DCD3E8 0%, #BCA3CC 100%);
   background-image: -moz-linear-gradient(bottom, #DCD3E8 0%, #BCA3CC 100%);
   background-image: -webkit-linear-gradient(bottom, #DCD3E8 0%, #BCA3CC 100%);
   background-image: -ms-linear-gradient(bottom, #DCD3E8 0%, #BCA3CC 100%);
   background-image: linear-gradient(to bottom, #DCD3E8 0%, #BCA3CC 100%);
   color: gray;
   font-family: arial;    
}

article h4 {
   font-family: &quot;Times New Roman&quot;;
   margin: 5px 1px;
}

.main-news {
   border: 5px double gray;
   padding: 15px;
}
&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 newsData,
    SortData = '',
    i = 1;

$.getJSON(&quot;http://www.stellarbiotechnologies.com/media/press-releases/json&quot;, function(data) {

   newsData = data.news;

   function SortByDate(x,y) {
     return ((x.published == y.published) ? 0 : ((x.published &amp;lt; y.published) ? 1 : -1 ));
   }

   var sortedNewsData = newsData.sort(SortByDate);

   $.each( sortedNewsData, function( key, val ) {
     SortData += '&amp;lt;article id=&quot;article' + i + '&quot;&amp;gt;&amp;lt;h4&amp;gt;Published on: ' + val.published + '&amp;lt;/h4&amp;gt;&amp;lt;div  class=&quot;main-news&quot;&amp;gt;' + val.title + '&amp;lt;/div&amp;gt;&amp;lt;/article&amp;gt;';
     i++;    
   });

   $('#news-feed').append(SortData);
});

$(window).scroll(function() {

   var $window = $(window),
       wH = $window.height(),
       wS = $window.scrollTop() + 1

   for (var j=0; j&amp;lt;$('article').length;j++) {
      var eT = $('#article' + j ).offset().top,
          eH = $('#article' + j ).outerHeight();

          if (wS &amp;gt; ((eT + eH) - (wH))) {
             $('#article' + j ).animate({'opacity': '1'}, 500);
          }
    }

});
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;나는 날짜별로 데이터를 분류한 후 window scroll 기능으로 loading을 하고 있습니다.&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://jsfiddle.net/bhaumikmehta/agvt60vc/&quot; rel=&quot;nofollow&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;데모&lt;/font&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/12014606/how-to-lazy-load-div-background-images&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>jQuery</category>
      <author>css3</author>
      <guid isPermaLink="true">https://css3.tistory.com/1125</guid>
      <comments>https://css3.tistory.com/1125#entry1125comment</comments>
      <pubDate>Wed, 1 Nov 2023 22:31:25 +0900</pubDate>
    </item>
    <item>
      <title>ARC를 사용하고 iOS 4.0을 대상으로 할 때 약한 참조를 대체하려면 어떻게 해야 합니까?</title>
      <link>https://css3.tistory.com/1124</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;ARC를 사용하고 iOS 4.0을 대상으로 할 때 약한 참조를 대체하려면 어떻게 해야 합니까?&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 Xcode 4.2로 첫 iOS 앱을 개발하기 시작했고, &quot;유틸리티 애플리케이션&quot; 템플릿(FlipsideViewController와 함께 제공되는 애플리케이션)으로 iOS 5.0을 목표로 하고 있었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 ARC가 컴파일 타임 기능이기 때문에 iOS 4와도 호환이 되어야 한다고 읽어서 제 앱을 4.3으로 목표로 삼고 컴파일을 시도했습니다.&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;FlipsideViewController.m: 오류:&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;자동 기준 카운팅 문제:&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;현재 배포 대상이 자동화된 __weak 참조를 지원하지 않습니다.&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음 줄을 참조하고 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;@synthesize delegate = _delegate;
&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;@property (weak, nonatomic) IBOutlet id &amp;lt;FlipsideViewControllerDelegate&amp;gt; delegate;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;iOS 4에서는 &quot;weak reference&quot;가 지원되지 않는다는 것은 이해하지만, 왜 처음부터 weak reference를 사용하고 싶은지 잘 모르겠습니다. 또한 ARC를 활용하면서도 이를 사용하지 않도록 다시 쓰는 방법도 알 수 없습니다(결국 iOS 4 및 5에서 작동하는 것으로 되어 있죠?).&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;오래된 OS를 대상으로 하려면&lt;/font&gt;&lt;/font&gt;&lt;code&gt;unsafe_unretained&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;대신에&lt;/font&gt;&lt;/font&gt;&lt;code&gt;weak&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;당신의 재산 신고서에 기재되어 있고, 그것은 대부분 같은 방식으로 작동할 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;weak&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그들의 목표가 사라질 때 그들 자신을 0으로 언급하지만,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;unsafe_unretained&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;leaves는 연결하려는 개체가 할당 해제될 때 매달려 있는 포인터로 바뀔 수 있는 가능성을 열어 둡니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;후자는 당신이 사용했던 것과 같은 행동입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;assign&lt;/code&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;https://stackoverflow.com/questions/6260256/what-kind-of-leaks-does-objective-cs-automatic-reference-counting-in-xcode-4-2/6388601#6388601&quot;&gt;여기&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;/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;__unsafe_unretained&lt;/code&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;https://github.com/rpetrich/ZWRCompatibility&quot;&gt;ZWRCompatibility.h&lt;/a&gt;는 이를 다소 단순화할 것입니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Mike Ash의 호환성 라이브러리 &lt;a href=&quot;https://github.com/plausiblelabs/PLWeakCompatibility&quot;&gt;PLWeakCompatibility&lt;/a&gt; 덕분에 이제 iOS 4.x에서도 __weak을 간단히 사용할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;구성이 매우 쉽고 5.x에 대한 추가적인 고려나 노력이 필요하지 않습니다.&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/6893038/how-do-i-replace-weak-references-when-using-arc-and-targeting-ios-4-0&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>iPhone</category>
      <author>css3</author>
      <guid isPermaLink="true">https://css3.tistory.com/1124</guid>
      <comments>https://css3.tistory.com/1124#entry1124comment</comments>
      <pubDate>Wed, 1 Nov 2023 22:31:12 +0900</pubDate>
    </item>
    <item>
      <title>다른 포트에 도커 mysql</title>
      <link>https://css3.tistory.com/1123</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다른 포트에 도커 mysql&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;mysql 도커 컨테이너의 기본 노출 포트를 변경하려고 하지만 이 명령을 사용하려고 하면 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt; docker run --detach --name=test-mysql -p 52000:52000  --env=&quot;MYSQL_ROOT_PASSWORD=mypassword&quot; mysql
&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 -uroot -pmypassword -h 127.0.0.1 -P 52000 Warning: Using a password on the command line interface can be insecure. ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 0&lt;/code&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;표준 포트 3306:3306을 사용하면 잘 작동하지만 포트를 변경하고 싶습니다.&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;저는 이미 -p 52000:3600을 시도했지만 항상 다음을 얻었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;mysql -uroot -pmypassword -h 127.0.0.1 -P 52000 Warning: Using a password on the command line interface can be insecure. ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 0&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;서버의 기본 TCP 포트에 컨테이너 포트 3306을 매핑해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;-p &amp;lt;host_port&amp;gt;:&amp;lt;container_port&amp;gt; (map container_port xx on host_port yy)
&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;pre&gt;&lt;code&gt;docker run --detach --name=test-mysql -p 52000:3306  --env=&quot;MYSQL_ROOT_PASSWORD=mypassword&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;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;포트를 다른 포트에 매핑하지 말고 mysql 자체를 사용하여 다른 포트에서 직접 실행하게 합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;MYSQL_TCP_PORT&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;variable.&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;docker run --detach --name=test-mysql --env=&quot;MYSQL_TCP_PORT=52000&quot; mysql&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;URL : https://stackoverflow.com/questions/41637013/docker-mysql-on-different-port&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>MySQL</category>
      <author>css3</author>
      <guid isPermaLink="true">https://css3.tistory.com/1123</guid>
      <comments>https://css3.tistory.com/1123#entry1123comment</comments>
      <pubDate>Wed, 1 Nov 2023 22:31:06 +0900</pubDate>
    </item>
    <item>
      <title>다른 열에 대한 MySql SELECT 조합?</title>
      <link>https://css3.tistory.com/1122</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다른 열에 대한 MySql SELECT 조합?&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/2309943/unioning-two-tables-with-different-number-of-columns&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;(5개 답변)&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;2014-04-28 00:03:56Z&quot; papago-attr-id=&quot;1&quot;&gt;9년 전&lt;/span&gt;에.&lt;/font&gt;&lt;/div&gt; 
  &lt;/div&gt; 
 &lt;/aside&gt; 
&lt;/div&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;썸네일 파일이 첨부된 파일을 선택하는 선택 쿼리가 있고 썸네일이 첨부되지 않은 파일도 받아야 합니다.&lt;/font&gt;&lt;/p&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   node.title, node.nid, files.fid, files.filepath, 
         content_type_mobile_event.field_date_value, 
         content_type_mobile_event.field_movie_shorts_value, 
         content_type_mobile_event.field_director_value, 
         content_type_mobile_event.field_length_value, 
         content_type_mobile_event.field_movie_type_value, 
         content_type_mobile_event.field_year_value, 
         content_type_mobile_event.field_event_type_value, 
         content_type_mobile_event.field_movie_location_value, 
         content_type_mobile_event.field_movie_desc_value, 
         content_type_mobile_event.field_movie_id_value, 
         content_type_mobile_event.field_movie_thumb_fid, 
         content_type_mobile_event.field_movie_trailer_url 
FROM     node, content_type_mobile_event, files 
WHERE    node.nid=content_type_mobile_event.nid AND 
         content_type_mobile_event.field_movie_thumb_fid=files.fid 
ORDER BY content_type_mobile_event.field_date_value ASC
&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   node.title, node.nid, content_type_mobile_event.field_date_value, 
         content_type_mobile_event.field_movie_shorts_value, 
         content_type_mobile_event.field_director_value, 
         content_type_mobile_event.field_length_value, 
         content_type_mobile_event.field_movie_type_value, 
         content_type_mobile_event.field_year_value, 
         content_type_mobile_event.field_event_type_value, 
         content_type_mobile_event.field_movie_location_value, 
         content_type_mobile_event.field_movie_desc_value, 
         content_type_mobile_event.field_movie_id_value, 
         content_type_mobile_event.field_movie_thumb_fid, 
         content_type_mobile_event.field_movie_trailer_url 
FROM     node, content_type_mobile_event 
WHERE    node.nid=content_type_mobile_event.nid AND
         content_type_mobile_event.field_movie_thumb_fid!=1 
ORDER BY content_type_mobile_event.field_date_value ASC
&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   node.title, node.nid, files.fid, files.filepath, 
         content_type_mobile_event.field_date_value, 
         content_type_mobile_event.field_movie_shorts_value, 
         content_type_mobile_event.field_director_value, 
         content_type_mobile_event.field_length_value, 
         content_type_mobile_event.field_movie_type_value, 
         content_type_mobile_event.field_year_value, 
         content_type_mobile_event.field_event_type_value, 
         content_type_mobile_event.field_movie_location_value, 
         content_type_mobile_event.field_movie_desc_value, 
         content_type_mobile_event.field_movie_id_value, 
         content_type_mobile_event.field_movie_thumb_fid, 
         content_type_mobile_event.field_movie_trailer_url 
FROM     node, content_type_mobile_event, files 
WHERE    node.nid=content_type_mobile_event.nid AND 
         content_type_mobile_event.field_movie_thumb_fid=files.fid 
ORDER BY content_type_mobile_event.field_date_value ASC
)
UNION
(
SELECT   node.title, node.nid, content_type_mobile_event.field_date_value, 
         content_type_mobile_event.field_movie_shorts_value, 
         content_type_mobile_event.field_director_value, 
         content_type_mobile_event.field_length_value, 
         content_type_mobile_event.field_movie_type_value, 
         content_type_mobile_event.field_year_value, 
         content_type_mobile_event.field_event_type_value, 
         content_type_mobile_event.field_movie_location_value, 
         content_type_mobile_event.field_movie_desc_value, 
         content_type_mobile_event.field_movie_id_value, 
         content_type_mobile_event.field_movie_thumb_fid, 
         content_type_mobile_event.field_movie_trailer_url 
FROM     node, content_type_mobile_event 
WHERE    node.nid=content_type_mobile_event.nid AND 
         content_type_mobile_event.field_movie_thumb_fid!=1 
ORDER BY content_type_mobile_event.field_date_value ASC
)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하지만 문제는 두 번째 열은 파일을 제외하고 다른 열 집합을 가지고 있다는 것입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;* 일부)&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;나는 이것을 어떻게 하는지 평생 알 수가 없습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;서로 다른 의미를 가진 분야가 있다면, 같은 위치에서 반납할 수도 없고 해서도 안 됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러나 다음과 같이 필드에 null을 추가하여 '공백 채우기'를 수행할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;select id, name, date, null as userid, 'A' as recordtype from table1
union all
select id, name, null /*as date*/, userid, 'B' as recordtype from table2 
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;첫 번째 선택에서 null에 대한 별칭을 제공할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;명확하게 하기 위해 두 번째 선택 항목에서 별칭을 추가할 수 있지만 사용되지 않습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;레코드 유형을 나중에 구별하는 데 사용할 수 있는 상수 값을 사용할 수도 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;선택 A에 열이 없으면 null 값을 사용합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;table A (colA, ColB, ColC)

table B (colA, ColD, ColE)

select colA, ColB, ColC, null, null from table A
union
select colA, null, null, colD, colE from table B
&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;em&gt;가짜&lt;/em&gt;로 만들어 조합을 만들 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예를 들면&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;   select x, y from A
     union 
   select z, null from B
&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/7407864/mysql-select-union-for-different-columns&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>MySQL</category>
      <author>css3</author>
      <guid isPermaLink="true">https://css3.tistory.com/1122</guid>
      <comments>https://css3.tistory.com/1122#entry1122comment</comments>
      <pubDate>Wed, 1 Nov 2023 22:31:00 +0900</pubDate>
    </item>
    <item>
      <title>CSS에서 스타일 비활성화 버튼</title>
      <link>https://css3.tistory.com/1121</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;CSS에서 스타일 비활성화 버튼&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음 Fiddle에서 볼 수 있듯이 이미지가 내장된 버튼의 스타일을 변경하려고 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;http://jsfiddle.net/krishnathota/xzBaZ/1/&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;http://jsfiddle.net/krishnathota/xzBaZ/1/&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;ol&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;변경합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;background-color&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;버튼이 비활성화되어 있을 때&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;비활성화된 경우 버튼의 이미지 변경&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사용 안 함으로 설정된 경우 호버 효과 사용 안 함&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;버튼에서 이미지를 클릭하고 드래그하면 이미지가 따로 보일 수 있습니다. 그것을 피하고 싶습니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;버튼의 텍스트를 선택할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저도 그것을 피하고 싶습니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제가 해봤는데요.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;button[disabled]&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;top: 1px; position: relative;&lt;/code&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;:disabled&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;disabled&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;API(일반적으로 폼 요소).&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;CSS2를 지원하는 브라우저/디바이스에 대해서만&lt;/font&gt;&lt;/font&gt;&lt;code&gt;[disabled]&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;선택자&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이미지와 마찬가지로 버튼에 이미지를 넣지 마십시오.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;CSS 사용&lt;/font&gt;&lt;/font&gt;&lt;code&gt;background-image&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;와 함께&lt;/font&gt;&lt;/font&gt;&lt;code&gt;background-position&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;background-repeat&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;. 그러면 이미지 드래그가 발생하지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;선택 문제:&lt;/strong&gt; 다음은 특정 질문에 대한 링크입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://stackoverflow.com/questions/826782/css-rule-to-disable-text-selection-highlighting&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;텍스트 선택 강조 표시를 비활성화하는 방법&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;비활성화된 셀렉터의 예:&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;/p&gt;
&lt;div class=&quot;snippet&quot; data-lang=&quot;js&quot; data-hide=&quot;false&quot; data-console=&quot;true&quot; data-babel=&quot;false&quot;&gt; 
 &lt;div class=&quot;snippet-code&quot;&gt; 
  &lt;pre class=&quot;snippet-code-css lang-css prettyprint-override&quot;&gt;&lt;code&gt;button {
  border: 1px solid #0066cc;
  background-color: #0099cc;
  color: #ffffff;
  padding: 5px 10px;
}

button:hover {
  border: 1px solid #0099cc;
  background-color: #00aacc;
  color: #ffffff;
  padding: 5px 10px;
}

button:disabled,
button[disabled]{
  border: 1px solid #999999;
  background-color: #cccccc;
  color: #666666;
}

div {
  padding: 5px 10px;
}&lt;/code&gt;&lt;/pre&gt; 
  &lt;pre class=&quot;snippet-code-html lang-html prettyprint-override&quot;&gt;&lt;code&gt;&amp;lt;div&amp;gt;
  &amp;lt;button&amp;gt; This is a working button &amp;lt;/button&amp;gt;
&amp;lt;/div&amp;gt;

&amp;lt;div&amp;gt;
  &amp;lt;button disabled&amp;gt; This is a disabled button &amp;lt;/button&amp;gt;
&amp;lt;/div&amp;gt;&lt;/code&gt;&lt;/pre&gt; 
 &lt;/div&gt; 
&lt;/div&gt; 
&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음을 사용하여 비활성화된 버튼을 선택할 수 있어야 한다고 생각합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;button[disabled=disabled], button:disabled {
    // your css rules
}
&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;버튼 이벤트는 변경되지 않으며, 버튼을 비활성화/활성화하려면 단순히 JavaScript에서 버튼 클래스를 추가/제거하기만 하면 됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;방법1&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt; &amp;lt;asp Button ID=&quot;btnSave&quot; CssClass=&quot;disabledContent&quot; runat=&quot;server&quot; /&amp;gt;

&amp;lt;style type=&quot;text/css&quot;&amp;gt;
    .disabledContent 
    {
        cursor: not-allowed;
        background-color: rgb(229, 229, 229) !important;
    }

    .disabledContent &amp;gt; * 
    {
        pointer-events:none;
    }
&amp;lt;/style&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;방법2&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;asp Button ID=&quot;btnSubmit&quot; CssClass=&quot;btn-disable&quot; runat=&quot;server&quot; /&amp;gt;

&amp;lt;style type=&quot;text/css&quot;&amp;gt;
    .btn-disable
        {
        cursor: not-allowed;
        pointer-events: none;

        /*Button disabled - CSS color class*/
        color: #c0c0c0;
        background-color: #ffffff;

        }
&amp;lt;/style&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;CSS&lt;/strong&gt; 기준&lt;strong&gt;:&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;.disable{
   cursor: not-allowed;
   pointer-events: none;
}
&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;jquery&lt;/strong&gt;를 사용할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$(&quot;#id&quot;).toggleClass('disable');
&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;button[disabled]:active, button[disabled],
input[type=&quot;button&quot;][disabled]:active,
input[type=&quot;button&quot;][disabled],
input[type=&quot;submit&quot;][disabled]:active,
input[type=&quot;submit&quot;][disabled] ,
button[disabled]:hover,
input[type=&quot;button&quot;][disabled]:hover,
input[type=&quot;submit&quot;][disabled]:hover
{
  border: 2px outset ButtonFace;
  color: GrayText;
  cursor: inherit;
  background-color: #ddd;
  background: #ddd;
}
&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;.disable-button{ 
  pointer-events: none; 
  background-color: #edf1f2;
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;부트스트랩을 사용하는 모든 사용자의 경우 &quot;disabled&quot; 클래스를 추가하고 다음을 사용하여 스타일을 변경할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;HTML&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;button type=&quot;button&quot;class=&quot;btn disabled&quot;&amp;gt;Text&amp;lt;/button&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;CSS&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;.btn:disabled,
.btn.disabled{
  color:#fff;
  border-color: #a0a0a0;
  background-color: #a0a0a0;
}
.btn:disabled:hover,
.btn:disabled:focus,
.btn.disabled:hover,
.btn.disabled:focus {
  color:#fff;
  border-color: #a0a0a0;
  background-color: #a0a0a0;
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제출 양식과 같이 &quot;사용 불가능&quot; 클래스를 추가한다고 해서 반드시 단추가 사용 불가능한 것은 아닙니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;동작을 사용하지 않도록 설정하려면 사용하지 않도록 설정된 속성을(를)&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;button type=&quot;button&quot;class=&quot;btn disabled&quot; disabled=&quot;disabled&quot;&amp;gt;Text&amp;lt;/button&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;몇 가지 예를 다룬 작업 자료가 &lt;a href=&quot;https://jsfiddle.net/s0gw53zu/&quot; rel=&quot;noreferrer&quot;&gt;여기&lt;/a&gt;에 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;버튼을 비활성화하면 불투명도가 직접 설정됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그래서 우선 우리는 그 불투명성을 다음과 같이 설정해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;.v-button{
    opacity:1;    
}
&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;button:disabled,button[disabled]{
    background-color: #cccccc;
    cursor:not-allowed !important;
  }
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;input[type=&quot;button&quot;]:disabled,
input[type=&quot;submit&quot;]:disabled,
input[type=&quot;reset&quot;]:disabled,
{
  //  apply css here what u like it will definitely work...
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;스타일(.css) 파일을 SASS(.scss)로 변경할 경우 다음을 사용합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;button {
  background-color: #007700;
  &amp;amp;:disabled {
    background-color: #cccccc;
  }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Angular에서는 비활성화 상태를 위해 CSS의 pass 값으로 버튼을 비활성화할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;html&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;button
   [disabled]=&quot;true&quot;&amp;gt;
&amp;lt;/button&amp;gt;
&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;.button-action.disabled {
  // some css
}
&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;CSS -&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;button:disabled, button[disabled]{
  cursor: not-allowed;
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;HTML-&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;button [disabled]=&quot;true&quot;&amp;gt; Button name &amp;lt;/button&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/14750078/style-disabled-button-with-css&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>CSS</category>
      <author>css3</author>
      <guid isPermaLink="true">https://css3.tistory.com/1121</guid>
      <comments>https://css3.tistory.com/1121#entry1121comment</comments>
      <pubDate>Wed, 1 Nov 2023 22:30:52 +0900</pubDate>
    </item>
  </channel>
</rss>