<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>muds</title>
    <link>https://muds.tistory.com/</link>
    <description>각종 프로그래밍 정보를 다루는 블로그입니다.</description>
    <language>ko</language>
    <pubDate>Mon, 6 Apr 2026 00:51:29 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>muds</managingEditor>
    <item>
      <title>공급업체 스크립트를 별도로 묶어서 웹팩에 필요에 따라 필요한 경우 어떻게 해야 합니까?</title>
      <link>https://muds.tistory.com/1512</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;font papago-translate=&quot;translated&quot;&gt;여기에 jQuery는 모든 모듈에서 사용되며 일부 모듈은 jQuery 플러그인이 필요할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러면 이 라이브러리는 일부 또는 모든 모듈이 필요한 여러 다른 웹 사이트에서 사용됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;모듈 간의 종속성을 정의하는 것은 매우 쉬웠지만 타사의 종속성을 정의하는 것은 예상보다 어려운 것 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제가 &lt;strong&gt;이루고 싶은 것&lt;/strong&gt;은 각 앱에 대해 필요한 타사 종속성이 있는 번들 파일 2개와 라이브러리에서 필요한 모듈이 있는 번들 파일 2개를 원합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;예&lt;/strong&gt;:&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;내 라이브러리에 다음과 같은 모듈이 있다고 가정해 보겠습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;a (requires: jquery, jquery.plugin1)&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;b (requires: jquery, a)&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;c (requires: jquery, jquery.ui, a, b)&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;d (requires: jquery, jquery. plugin2, a)&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고 모듈 a, b, c가 필요한 앱이 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 경우의 웹팩은 다음 파일을 생성해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;벤더 번들&lt;/strong&gt;: jquery, jquery. &lt;strong&gt;plugin&lt;/strong&gt;1 및 jquery.ui;&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;웹사이트 번들&lt;/strong&gt;: 모듈 a, b 및 c 포함;&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;결국, 저는 jQuery를 모든 파일에 요구할 필요가 없도록 글로벌로 보유하고 싶습니다(예를 들어 메인 파일에서만 요구할 수 있습니다).&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고 jQuery 플러그인은 필요한 경우에 대비하여 $global을 확장할 것입니다(필요하지 않은 다른 모듈에서 사용할 수 있다면 문제가 되지 않습니다).&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;내 webpack.config.js (버전 1,2,3) 파일에서, 나는&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;function isExternal(module) {
  var context = module.context;

  if (typeof context !== 'string') {
    return false;
  }

  return context.indexOf('node_modules') !== -1;
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;플러그인 배열로&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;plugins: [
  new CommonsChunkPlugin({
    name: 'vendors',
    minChunks: function(module) {
      return isExternal(module);
    }
  }),
  // Other plugins
]
&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;plugins: [
  new CommonsChunkPlugin({
    name: 'common',
    minChunks: function(module, count) {
      return !isExternal(module) &amp;amp;&amp;amp; count &amp;gt;= 2; // adjustable
    }
  }),
  new CommonsChunkPlugin({
    name: 'vendors',
    chunks: ['common'],
    // or if you have an key value object for your entries
    // chunks: Object.keys(entry).concat('common')
    minChunks: function(module) {
      return isExternal(module);
    }
  })
]
&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;또한 버전 4에서는 이것이 바뀔 예정입니다.&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;/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;a href=&quot;https://github.com/webpack/docs/wiki/list-of-plugins#commonschunkplugin&quot; rel=&quot;noreferrer&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;vendor&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;, 및 생성할 파일 이름()&lt;/font&gt;&lt;/font&gt;&lt;code&gt;vendor.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;/p&gt; 
&lt;pre&gt;&lt;code&gt;new webpack.optimize.CommonsChunkPlugin(&quot;vendor&quot;, &quot;vendor.js&quot;, Infinity),
&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;vendor&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;vendor&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;entry: {
    app: 'entry.js',
    vendor: ['jquery', 'jquery.plugin1']
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;JQuery as global&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;동일한 문제를 가지고 &lt;a href=&quot;http://webpack.github.io/docs/list-of-plugins.html#provideplugin&quot; rel=&quot;noreferrer&quot;&gt;ProvidPlugin&lt;/a&gt;으로 해결했습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여기서 전역 객체를 정의하는 것이 아니라 모듈에 대한 일종의 차단입니다. 즉, 다음과 같이 구성할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;new webpack.ProvidePlugin({
    $: &quot;jquery&quot;
})
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고 이제 당신은 사용할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;$&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;당신의 코드의 어디든 - 웹팩은 그것을 자동적으로 변환할 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;require('jquery')
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;도움이 됐기를 바랍니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;https://github.com/Confitura/zaslepka/blob/master/webpack.config.js&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;font papago-translate=&quot;translated&quot;&gt;사람들은 처음에 Angular documentation에 대해 같은 말을 했습니다 :)&lt;/font&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;엔트리포인트별 벤더 청크를 사용하려면 CommonsChunkPlugins를 여러 번 사용해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;new webpack.optimize.CommonsChunkPlugin(&quot;vendor-page1&quot;, &quot;vendor-page1.js&quot;, Infinity),
new webpack.optimize.CommonsChunkPlugin(&quot;vendor-page2&quot;, &quot;vendor-page2.js&quot;, Infinity),
&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;entry: {
    page1: ['entry.js'],
    page2: ['entry2.js'],
    &quot;vendor-page1&quot;: [
        'lodash'
    ],
    &quot;vendor-page2&quot;: [
        'jquery'
    ]
},
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;일부 라이브러리가 엔트리 포인트 간에 중복(대부분의 라이브러리)되어 있으면 구성이 다른 동일한 플러그인을 사용하여 공통 파일로 추출할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;https://github.com/webpack/webpack/tree/master/examples/multiple-commons-chunks&quot; rel=&quot;noreferrer&quot;&gt;이&lt;/a&gt; 예를 참조하십시오.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;공급업체 스크립트와 별도로 스크립트를 자동으로 번들링하는 경우:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var webpack = require('webpack'),
    pkg     = require('./package.json'),  //loads npm config file
    html    = require('html-webpack-plugin');

module.exports = {
  context : __dirname + '/app',
  entry   : {
    app     : __dirname + '/app/index.js',
    vendor  : Object.keys(pkg.dependencies) //get npm vendors deps from config
  },
  output  : {
    path      : __dirname + '/dist',
    filename  : 'app.min-[hash:6].js'
  },
  plugins: [
    //Finally add this line to bundle the vendor code separately
    new webpack.optimize.CommonsChunkPlugin('vendor', 'vendor.min-[hash:6].js'),
    new html({template : __dirname + '/app/index.html'})
  ]
};
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 기능에 대한 자세한 내용은 &lt;a href=&quot;https://webpack.github.io/docs/code-splitting.html#split-app-and-vendor-code&quot; rel=&quot;noreferrer&quot;&gt;공식 문서&lt;/a&gt;에서 확인할 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;또한 귀사의 사례를 완전히 이해했는지는 모르겠지만, 각 번들에 대해 별도의 벤더 청크를 생성하기 위한 구성 스니펫이 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;entry: {
  bundle1: './build/bundles/bundle1.js',
  bundle2: './build/bundles/bundle2.js',
  'vendor-bundle1': [
    'react',
    'react-router'
  ],
  'vendor-bundle2': [
    'react',
    'react-router',
    'flummox',
    'immutable'
  ]
},

plugins: [
  new webpack.optimize.CommonsChunkPlugin({
    name: 'vendor-bundle1',
    chunks: ['bundle1'],
    filename: 'vendor-bundle1.js',
    minChunks: Infinity
  }),
  new webpack.optimize.CommonsChunkPlugin({
    name: 'vendor-bundle2',
    chunks: ['bundle2'],
    filename: 'vendor-bundle2-whatever.js',
    minChunks: Infinity
  }),
]
&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;CommonsChunkPlugin&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;문서: http://webpack.github.io/docs/list-of-plugins.html#commonschunkplugin&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/30329337/how-to-bundle-vendor-scripts-separately-and-require-them-as-needed-with-webpack&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>JavaScript</category>
      <author>muds</author>
      <guid isPermaLink="true">https://muds.tistory.com/1512</guid>
      <comments>https://muds.tistory.com/1512#entry1512comment</comments>
      <pubDate>Tue, 7 Nov 2023 21:13:00 +0900</pubDate>
    </item>
    <item>
      <title>MySQL 연결이 많은 연결 오류로 차단된 이유는 무엇입니까?</title>
      <link>https://muds.tistory.com/1511</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;다음과 같은 오류가 발생합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;...많은 연결 오류로 인해 차단됨&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;몇 가지 답을 찾아봤지만 문제가 해결되지 않았습니다.&lt;/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;%&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;호스트 행에 있어서 보안상의 문제로 IP 주소로 변경하려고 했는데 이런 오류가 생겨서 지금 막혔습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;MySQL은 잘못된 형식의 클라이언트로부터 MySQL을 보호하기 위해 연결하는 동안 발생한 오류를 차단합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그래서 먼저, 어떤 종류의 오류인지 찾아야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;데이터 디렉토리에서 MySQL 오류 로그를 확인할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;(일반적으로 &lt;strong&gt;hostname.err&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;max_connect_errors&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;32비트의 경우, 64비트의 경우 4294967295. 18446744073709547520. (&lt;a href=&quot;http://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html#sysvar_max_connect_errors&quot;&gt;수동&lt;/a&gt;)&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;mysql&amp;gt; SET GLOBAL max_connect_errors = 100000000;
&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;FLUSH HOSTS&lt;/code&gt;&lt;font 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; FLUSH HOSTS;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;외부 mysqladmin 콘솔에서 실행하려면 mysqladmin 명령을 사용합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;# mysqladmin flush-hosts
&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;mysqladmin -u [username] -p flush-hosts
**** [MySQL password]
&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;mysqladmin flush-hosts -u [username] -p
**** [MySQL password]
&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;mysqladmin -h &amp;lt;ENDPOINT URL&amp;gt; -P &amp;lt;PORT&amp;gt; -u &amp;lt;USER&amp;gt; -p flush-hosts
mysqladmin -h [END POINT URL] -P 3306 -u [DB USER] -p flush-hosts 
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;추가 제안은 my.ini 파일 [Mysql configuration file]을 편집하여 차단된 많은 연결 오류 문제를 영구적으로 해결할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;변수 max_connections = 10000;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아니면&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;명령줄을 사용하여 MySQL에 로그인합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;mysql -u [username] -p
**** [MySQL password]
&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;SET GLOBAL max_connect_errors=10000;
set global max_connections = 200;
&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;show variables like &quot;max_connections&quot;;
show variables like &quot;max_connect_errors&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/20014746/why-mysql-connection-is-blocked-of-many-connection-errors&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>MySQL</category>
      <author>muds</author>
      <guid isPermaLink="true">https://muds.tistory.com/1511</guid>
      <comments>https://muds.tistory.com/1511#entry1511comment</comments>
      <pubDate>Tue, 7 Nov 2023 21:11:41 +0900</pubDate>
    </item>
    <item>
      <title>jQuery를 사용하여 폭과 높이를 동적으로 설정하는 방법</title>
      <link>https://muds.tistory.com/1510</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;div&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;요소는 동적으로 jQuery를 사용합니다.&lt;/font&gt;&lt;/font&gt;&lt;/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 id=&quot;mainTable&quot; style=&quot;width:100px; height:200px;&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;$(&quot;#mainTable&quot;).css(&quot;width&quot;, &quot;100&quot;);
$(&quot;#mainTable&quot;).css(&quot;height&quot;, &quot;200&quot;);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하지만 저에게는 통하지 않습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그 이유를 이해할 수 있도록 도와주시기 바랍니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여러분 감사합니다.&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;문제는 숫자의 따옴표에 있었습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;잘 작동합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$(&quot;#mainTable&quot;).css(&quot;width&quot;, 100);
$(&quot;#mainTable&quot;).css(&quot;height&quot;, 200);
&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() {
  $(&quot;#mainTable&quot;).width(100).height(200);
});
&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;이것은 2가지 변경사항을 가지고 있습니다. 이제 와 를 사용하고 코드를 실행합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;document.ready&lt;/code&gt;&lt;font 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;$(function() { })&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;포장지(또는)&lt;/font&gt;&lt;/font&gt;&lt;code&gt;$(document).ready(function() { })&lt;/code&gt;&lt;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;#mainTable&quot;)&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아무것도 찾지 못할 뿐...&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;뭐, 할 일을 하라구요.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;http://jsfiddle.net/kKH7v/&quot; rel=&quot;noreferrer&quot;&gt;여기에서 사용 예시&lt;/a&gt;를 볼 수 &lt;a href=&quot;http://jsfiddle.net/kKH7v/&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;@Misha Moroshko가 이미 글을 올렸듯이, 이것은 효과가 있습니다:&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-js prettyprint-override&quot;&gt;&lt;code&gt;$(&quot;#mainTable&quot;).css(&quot;width&quot;, 100);
$(&quot;#mainTable&quot;).css(&quot;height&quot;, 200);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;@Nick Craver의 답변에 비해 이 기법의 장점이 있습니다. 다양한 단위를 지정할 수도 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-js prettyprint-override&quot;&gt;&lt;code&gt;$(&quot;#mainTable&quot;).css(&quot;width&quot;, &quot;100%&quot;);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;따라서 &lt;strong&gt;@Nick Craver의 방법은 실제로&lt;/strong&gt; 일부 사용자들에게 &lt;strong&gt;잘못된 선택&lt;/strong&gt;일 수 &lt;strong&gt;있습니다&lt;/strong&gt;.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;jquery API(http://api.jquery.com/width/) :&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;.css(width)와 .width()의 차이점은 후자가 단위가 없는 픽셀 값(예: 400px)을 반환하는 반면 전자는 단위가 온전한 값(예: 400px)을 반환한다는 것입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;수학적 계산에서 요소의 너비를 사용해야 할 경우 .width() 방법을 사용하는 것이 좋습니다.&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;var modWidth = 250;
var modHeight = 150;
&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;#ContainerId .sDashboard li&quot; ).width( modWidth ).height(modHeight);
&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 id=&quot;mainTable&quot; style=&quot;width:100px; height:200px;&quot;&amp;gt;&amp;lt;/div&amp;gt; 

$(document).ready(function() {
  $(&quot;#mainTable&quot;).width(100).height(200);
}) ;
&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;#mainTable&quot;).css(&quot;width&quot;, &quot;100px&quot;);
$(&quot;#mainTable&quot;).css(&quot;height&quot;, &quot;200px&quot;);
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;위의 모든 제안들을 시도해 보았는데 그 중 아무 것도 나에게 맞지 않았고, 그들은 클라이언트 Width와 클라이언트를 변경했습니다.&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;$(.width).width 및 height 메서드에 대한 jQuery 문서에는 다음과 같이 나와 있습니다. &quot;.width(&quot;value&quot;)는 CSS 상자 크기 지정 속성의 값에 관계없이 상자의 내용 너비를 설정합니다.&quot;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;CSS 접근 방식도 마찬가지여서 대신 $(.attr() 메서드를 사용해야 했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;_canvas.attr('width', 100);
_canvas.attr('height', 200);
&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;$(&quot;#mainTable&quot;).css(&quot;width&quot;, &quot;200px&quot;);
$(&quot;#mainTable&quot;).css(&quot;height&quot;, &quot;2000px&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/2722068/how-to-set-width-and-height-dynamically-using-jquery&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>jquery</category>
      <author>muds</author>
      <guid isPermaLink="true">https://muds.tistory.com/1510</guid>
      <comments>https://muds.tistory.com/1510#entry1510comment</comments>
      <pubDate>Tue, 7 Nov 2023 21:11:35 +0900</pubDate>
    </item>
    <item>
      <title>스위프트 하나를 통과하는 방법UI 뷰를 다른 뷰 구조의 변수로 사용</title>
      <link>https://muds.tistory.com/1509</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;스위프트 하나를 통과하는 방법&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;UI 뷰를 다른 뷰 구조의 변수로 사용&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;em&gt;탐색&lt;/em&gt; 링크(NavigationLink)를 구현하고 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;MenuItem&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;View&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;실행.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;var body : some View&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그 안에 들어있는.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;NavigationLink&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;. 나는 어떻게든 제시할 견해를 저장할 필요가 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;NavigationLink&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;의 몸속에&lt;/font&gt;&lt;/font&gt;&lt;code&gt;MenuItem&lt;/code&gt;&lt;font 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;destinationView&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;인에&lt;/font&gt;&lt;/font&gt;&lt;code&gt;MenuItem&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;로서의 몸.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;some View&lt;/code&gt;&lt;font 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;struct MenuItem: View {
    private var destinationView: some View

    init(destinationView: View) {
        self.destinationView = destinationView
    }

    var body : some View {
        // Here I'm passing destinationView to NavigationLink...
    }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;--&amp;gt;&lt;strong&gt; 오류:&lt;/strong&gt; 프로토콜 'View'는 자체 또는 관련 유형 요구 사항이 있으므로 일반 제약 조건으로만 사용할 수 있습니다.&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;struct MenuItem: View {
    private var destinationView: some View

    init&amp;lt;V&amp;gt;(destinationView: V) where V: View {
        self.destinationView = destinationView
    }

    var body : some View {
        // Here I'm passing destinationView to NavigationLink...
    }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;--&amp;gt;&lt;strong&gt; 오류:&lt;/strong&gt; '일부 보기' 유형에 'V' 유형 값을 할당할 수 없습니다.&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;struct MenuItem: View {
    private var destinationView: some View

    init&amp;lt;V&amp;gt;(destinationView: V) where V: View {
        self.destinationView = destinationView as View
    }

    var body : some View {
        // Here I'm passing destinationView to NavigationLink...
    }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;--&amp;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;NavigationLink가 일부 보기를 인수로 받아들일 수 있는 경우 방법이 있어야 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;감사합니다;D&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여기서 제가 읽은 모든 것과 저에게 효과가 있었던 해결책을 요약하자면 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;struct ContainerView&amp;lt;Content: View&amp;gt;: View {
    @ViewBuilder var content: Content
    
    var body: some View {
        content
    }
}
&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;View&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;안에서, 또한 덕분에&lt;/font&gt;&lt;/font&gt;&lt;code&gt;@ViewBuilder&lt;/code&gt;&lt;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-else&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;switch-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;struct SimpleView: View {
    var body: some View {
        ContainerView {
            Text(&quot;SimpleView Text&quot;)
        }
    }
}

struct IfElseView: View {
    var flag = true
    
    var body: some View {
        ContainerView {
            if flag {
                Text(&quot;True text&quot;)
            } else {
                Text(&quot;False text&quot;)
            }
        }
    }
}

struct SwitchCaseView: View {
    var condition = 1
    
    var body: some View {
        ContainerView {
            switch condition {
            case 1:
                Text(&quot;One&quot;)
            case 2:
                Text(&quot;Two&quot;)
            default:
                Text(&quot;Default&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;/p&gt; 
&lt;pre&gt;&lt;code&gt;struct GreedyContainerView&amp;lt;Content: View&amp;gt;: View {
    @ViewBuilder let content: Content
    
    var body: some View {
        content
            .frame(maxWidth: .infinity, maxHeight: .infinity)
    }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;hr&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;보기에 이니셜라이저가 필요한 경우 다음을 사용할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;@ViewBuilder&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;init(@ViewBuilder content: () -&amp;gt; Content) {…}
&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;ViewBuilder&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;. 그것을 당신의 마지막 논쟁, 혹은 유일한 논쟁으로 삼으세요.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;init&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;방법&lt;/font&gt;&lt;/font&gt;&lt;code&gt;MenuItem&lt;/code&gt;&lt;font 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;..., @ViewBuilder builder: @escaping () -&amp;gt; Content)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음과 같이 정의된 속성에 할당합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;let viewBuilder: () -&amp;gt; Content
&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;HStack {
    viewBuilder()
}
&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;MenuItem {
   Image(&quot;myImage&quot;)
   Text(&quot;My Text&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;이렇게 하면 최대 10개의 보기를 통과하여 사용할 수 있습니다.&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;조건 등이 더 제한적이기를 원한다면 자신의 함수 작성기를 정의해야 할 것입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;나는 그렇게 하지 않았으니 당신은 그것을 검색해야 할 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;일반 매개 변수를 의 일부로 만들어야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;MenuItem&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-swift prettyprint-override&quot;&gt;&lt;code&gt;struct MenuItem&amp;lt;Content: View&amp;gt;: View {
    private var destinationView: Content

    init(destinationView: Content) {
        self.destinationView = destinationView
    }

    var body : some View {
        // ...
    }
}
&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 ENavigationView&amp;lt;Content: View&amp;gt;: View {

    let viewBuilder: () -&amp;gt; Content

    var body: some View {
        NavigationView {
            VStack {
                viewBuilder()
                    .navigationBarTitle(&quot;My App&quot;)
            }
        }
    }

}

struct ENavigationView_Previews: PreviewProvider {
    static var previews: some View {
        ENavigationView {
            Text(&quot;Preview&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;struct ContentView: View {

    var body: some View {
        ENavigationView {
            Text(&quot;My Text&quot;)
        }
    }

}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음과 같이 Navigation Link(또는 기타 보기 위젯)를 변수로 하위 보기로 전달할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;import SwiftUI

struct ParentView: View {
    var body: some View {
        NavigationView{

            VStack(spacing: 8){

                ChildView(destinationView: Text(&quot;View1&quot;), title: &quot;1st&quot;)
                ChildView(destinationView: Text(&quot;View2&quot;), title: &quot;2nd&quot;)
                ChildView(destinationView: ThirdView(), title: &quot;3rd&quot;)
                Spacer()
            }
            .padding(.all)
            .navigationBarTitle(&quot;NavigationLinks&quot;)
        }
    }
}

struct ChildView&amp;lt;Content: View&amp;gt;: View {
    var destinationView: Content
    var title: String

    init(destinationView: Content,  title: String) {
        self.destinationView = destinationView
        self.title = title
    }

    var body: some View {
        NavigationLink(destination: destinationView){
            Text(&quot;This item opens the \(title) view&quot;).foregroundColor(Color.black)
        }
    }
}

struct ThirdView: View {
    var body: some View {
        VStack(spacing: 8){

            ChildView(destinationView: Text(&quot;View1&quot;), title: &quot;1st&quot;)
            ChildView(destinationView: Text(&quot;View2&quot;), title: &quot;2nd&quot;)
            ChildView(destinationView: ThirdView(), title: &quot;3rd&quot;)
            Spacer()
        }
        .padding(.all)
        .navigationBarTitle(&quot;NavigationLinks&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;strong&gt;iOS 14 &lt;/strong&gt;+ &lt;strong&gt;macOS 11&lt;/strong&gt;로 구문이 더욱 깔끔해졌습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;struct ContainerView&amp;lt;Content: View&amp;gt;: View {
  @ViewBuilder var content: Content
    
  var body: some View {
    content
  }
}
&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;ContainerView{
  ...
}
&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;View&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/59592697/9607863&quot;&gt;여기&lt;/a&gt;에 나와 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;확장자:&lt;/font&gt;&lt;/font&gt;&lt;code&gt;View&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;(일반인 사용) - 기억하세요&lt;/font&gt;&lt;/font&gt;&lt;code&gt;import SwiftUI&lt;/code&gt;&lt;font 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;extension View {

    /// Navigate to a new view.
    /// - Parameters:
    ///   - view: View to navigate to.
    ///   - binding: Only navigates when this condition is `true`.
    func navigate&amp;lt;SomeView: View&amp;gt;(to view: SomeView, when binding: Binding&amp;lt;Bool&amp;gt;) -&amp;gt; some View {
        modifier(NavigateModifier(destination: view, binding: binding))
    }
}


// MARK: - NavigateModifier
fileprivate struct NavigateModifier&amp;lt;SomeView: View&amp;gt;: ViewModifier {

    // MARK: Private properties
    fileprivate let destination: SomeView
    @Binding fileprivate var binding: Bool


    // MARK: - View body
    fileprivate func body(content: Content) -&amp;gt; some View {
        NavigationView {
            ZStack {
                content
                    .navigationBarTitle(&quot;&quot;)
                    .navigationBarHidden(true)
                NavigationLink(destination: destination
                    .navigationBarTitle(&quot;&quot;)
                    .navigationBarHidden(true),
                               isActive: $binding) {
                    EmptyView()
                }
            }
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;또는 정적 함수 확장을 사용할 수도 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예를 들어 제목 표시줄을 텍스트로 확장합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이를 통해 코드를 재사용하기가 매우 쉽습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 경우 뷰 클로저가 있는 @Viewbuilder 래퍼를 전달하여 뷰에 맞는 사용자 지정 유형을 반환할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예를 들어,&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-swift prettyprint-override&quot;&gt;&lt;code&gt;import SwiftUI

extension Text{
    static func titleBar&amp;lt;Content:View&amp;gt;(
        titleString:String,
        @ViewBuilder customIcon: ()-&amp;gt; Content
    )-&amp;gt;some View {
        HStack{
            customIcon()
            Spacer()
            Text(titleString)
                .font(.title)
            Spacer()
        }
        
    }
}

struct Text_Title_swift_Previews: PreviewProvider {
    static var previews: some View {
        Text.titleBar(titleString: &quot;title&quot;,customIcon: {
            Image(systemName: &quot;arrowshape.turn.up.backward&quot;)
        })
            .previewLayout(.sizeThatFits)
    }
}


&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다른 보기에 두 개의 다른 보기를 전달하려고 하는데 이 오류 때문에 이 보기를 수행할 수 없는 경우:&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;식에 대한 진단을 생성하지 못했습니다. 버그 보고서를 제출하십시오.&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&amp;lt;Content:&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;처음 통과한 보기 &amp;gt;입니다. 처음 통과한 보기는 해당 유형을 저장하고, 통과 중인 두 번째 보기는 동일한 유형이어야 합니다. 이렇게 하면 텍스트와 이미지를 통과하려는 경우에는 통과할 수 없습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;솔루션은 간단합니다. 다른 컨텐츠 보기를 추가하고 이름을 다르게 지정합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;struct Collapsible&amp;lt;Title: View, Content: View&amp;gt;: View {
@State var title: () -&amp;gt; Title
@State var content: () -&amp;gt; Content

@State private var collapsed: Bool = true

var body: some View {
    VStack {
        Button(
            action: { self.collapsed.toggle() },
            label: {
                HStack {
                    self.title()
                    Spacer()
                    Image(systemName: self.collapsed ? &quot;chevron.down&quot; : &quot;chevron.up&quot;)
                }
                .padding(.bottom, 1)
                .background(Color.white.opacity(0.01))
            }
        )
        .buttonStyle(PlainButtonStyle())
        
        VStack {
            self.content()
        }
        .frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: collapsed ? 0 : .none)
        .clipped()
        .animation(.easeOut)
        .transition(.slide)
    }
}
&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;Collapsible {
            Text(&quot;Collapsible&quot;)
        } content: {
                ForEach(1..&amp;lt;5) { index in
                    Text(&quot;\(index) test&quot;)
                }
        }
&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;pre&gt;&lt;code&gt;struct PopOver&amp;lt;Content, PopView&amp;gt; : View where Content: View, PopView: View {
var isShowing: Bool
@ViewBuilder var content: () -&amp;gt; Content
@ViewBuilder var popover: () -&amp;gt; PopView

var body: some View {
    ZStack(alignment: .center) {
        self
            .content()
            .disabled(isShowing)
            .blur(radius: isShowing ? 3 : 0)
        
        ZStack {
            self.popover()
        }
        .frame(width: 112, height: 112)
        .opacity(isShowing ? 1 : 0)
        .disabled(!isShowing)
        
    }
}
&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/56938805/how-to-pass-one-swiftui-view-as-a-variable-to-another-view-struct&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>swift</category>
      <author>muds</author>
      <guid isPermaLink="true">https://muds.tistory.com/1509</guid>
      <comments>https://muds.tistory.com/1509#entry1509comment</comments>
      <pubDate>Tue, 7 Nov 2023 21:11:28 +0900</pubDate>
    </item>
    <item>
      <title>Oracle 데이터 통합업체란 무엇입니까?</title>
      <link>https://muds.tistory.com/1508</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Oracle 데이터 통합업체란 무엇입니까?&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;ODI란 무엇입니까? ODI의 실제 사용법은 무엇입니까? Oracle Data Integrator 도구가 프로그래밍에 도움이 되는 방법은 무엇입니까?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;sql 개발자 도구와 ODI 도구의 차이점은 실제로 무엇입니까?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;일부 사이트에서 볼 수 있는 정의에 정말 질렸습니다. 누군가 gud 설명을 생각해 낸다면 좋을 것입니다.&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;ODI는 ETL 공구로, 정확히 말하면 EL-T 공구입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;ETL vs EL-T에 대한 자세한 내용은 wiki에서 확인하실 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;오라클은 OWB(Oracle Warehouse Builder)를 판매하기도 했고, 그 후에는 Sunopsis에서 ODI를 구매하기도 했습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;OWB는 더 이상 지원되지 않으며 ODI는 많은 Oracle 애플리케이션에서 사용되는 도구가 될 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;ODI를 사용하면 여러 가지 작업을 수행할 수 있지만 주로 소스(파일, 데이터베이스)에서 데이터를 추출하고 스테이징 영역에서 데이터를 변환한 후 대상 데이터베이스로 로드하는 데 사용할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;ETL 프로젝트는 일반적으로 많은 시간과 노력이 필요하며, 사용자 정의 코드를 작성하여 유사한 작업을 수행할 수 있지만, ETL 도구는 개발자가 이러한 어려운 작업을 쉽게 수행할 수 있도록 도와줍니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;ETL 도구는 데이터 통합 프로젝트, 데이터 웨어하우징 등에 사용됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;MS SQL Server와 함께 제공되는 Microsoft SSIS 도구에 대해 들어본 적이 있다면 ODI가 무엇을 위한 것인지 알 수 있을 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;ODI를 사용하는 방법과 맞춤형 코딩에 비해 이점이 무엇인지를 설명하는 좋은 &lt;a href=&quot;http://www.oracle.com/technetwork/middleware/data-integrator/learnmore/odi-best-practice-data-warehouse-168255.pdf&quot;&gt;백서&lt;/a&gt;입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Oracle은 ODI Data Services라는 ODI 버전도 고안했는데, 이는 ODI를 SOA 시장으로 확장하기 위한 마케팅 전략입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;또한 다른 애플리케이션 및 웹 서비스와 잘 연동할 수 있는 실시간 ETL 및 데이터 연합 프로젝트를 위한 Golden Gate 제품도 판매하고 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;데이터 연합은 ETL을 하지 않고 실시간으로 데이터를 병합/통합하는 과정입니다.&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;ODI는 ETL 도구입니다.&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;1) 즉, 모든 변환이 SQL의 대상 데이터 웨어하우스 서버에서 수행되는 ELT 유형의 접근 방식을 사용합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것은 ODI가 블랙박스가 아니며 개발자들은 무슨 일이 일어나고 있는지 정확히 알고 있다는 것을 의미합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;디버깅에 아주 적합합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;또한 ODI는 대상 웨어하우스 서버의 성능을 활용할 수 있으며 기존 ETL 툴, Informatica 등과 같은 추가 애플리케이션 서버를 필요로 하지 않습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;TCO를 절감합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;2) The main advantage of ODI over competitive products is the code template approach. This guarantees extreme reusability of your and your developer's ETL code. Data transformation logic and strategies are encapsulated in so called Knowledge Modules and can be reused across your data warehouse. This may cut down development time by 30-50%.&lt;/p&gt; 
&lt;p&gt;Links to &lt;a href=&quot;http://www.business-intelligence-quotient.com/?p=379&quot; rel=&quot;nofollow&quot;&gt;ODI tutorials&lt;/a&gt; can be found on the BI Quotient blog&lt;/p&gt;&lt;p&gt;Here is a brief description found on &lt;a href=&quot;http://www.oracle.com/technetwork/middleware/data-integrator/odi-11g-faq-168660.html#gen1&quot; rel=&quot;nofollow&quot;&gt;Oracle ODI FAQ&lt;/a&gt;: &lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;strong&gt;What is Oracle Data Integrator (ODI)?&lt;/strong&gt;&lt;/p&gt; 
 &lt;p&gt;Oracle Data Integrator is a comprehensive data integration platform that covers all data integration requirements: from high-volume, high-performance batch loads, to event-driven, trickle-feed integration processes, to SOA-enabled data services.&lt;/p&gt; 
 &lt;p&gt;&lt;strong&gt;Which projects are suitable for Oracle Data Integrator?&lt;/strong&gt;&lt;/p&gt; 
 &lt;p&gt;Oracle Data Integrator can be used in several projects including:&lt;/p&gt; 
 &lt;ul&gt; 
  &lt;li&gt;Conventional Data Integration &lt;/li&gt; 
  &lt;li&gt;Business Intelligence and Data Warehousin &lt;/li&gt; 
  &lt;li&gt;Modernization Initiatives &lt;/li&gt; 
  &lt;li&gt;Migrations and Consolidations &lt;/li&gt; 
  &lt;li&gt;Service Oriented Architecture (SOA) Initiatives &lt;/li&gt; 
  &lt;li&gt;Master Data Management&lt;/li&gt; 
 &lt;/ul&gt; 
&lt;/blockquote&gt;&lt;p&gt;ReferenceURL : &lt;a href=&quot;https://stackoverflow.com/questions/11340872/what-is-oracle-data-integrator&quot; target=&quot;_blank&quot;&gt;https://stackoverflow.com/questions/11340872/what-is-oracle-data-integrator&lt;/a&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>oracle</category>
      <author>muds</author>
      <guid isPermaLink="true">https://muds.tistory.com/1508</guid>
      <comments>https://muds.tistory.com/1508#entry1508comment</comments>
      <pubDate>Tue, 7 Nov 2023 21:11:07 +0900</pubDate>
    </item>
    <item>
      <title>RecordSet에서 오류 3001이 발생했습니다. 이유를 알 수 없습니다.</title>
      <link>https://muds.tistory.com/1507</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;RecordSet에서 오류 3001이 발생했습니다. 이유를 알 수 없습니다.&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;MariaDb 5에서 4개의 열을 가져오려고 하는데 보통 이 코드에서 작동하지만 지금 오류 3001이 발생합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;오류 3001 - 인수 유형이 잘못되었거나, 허용 가능한 범위를 벗어났거나, 서로 충돌했습니다.&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;Sub Rempli_contacts()

    Dim rs As ADODB.Recordset
    Dim Derligne As Integer, i As Integer
    Dim Requete As String

    Set rs = New ADODB.Recordset
        ConnectionDB

    Requete = &quot;SELECT Ref,Nom,Marque,PrixVente FROM Produits_Beta&quot;
            rs.Open Requete, oConnect
End Sub
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;온라인에서 오류가 발생합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;rs.Open Requete, oConnect&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Nathan_Sav가 지적했듯이, 분명히 이전에 oConnect를 로드해야 했고, 이제는 완벽하게 작동합니다(Welp, 아직 ListBox의 열을 채울 수는 없지만 이는 다른 이야기입니다)&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/52479578/got-error-3001-on-recordset-dont-know-why&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>MariaDB</category>
      <author>muds</author>
      <guid isPermaLink="true">https://muds.tistory.com/1507</guid>
      <comments>https://muds.tistory.com/1507#entry1507comment</comments>
      <pubDate>Tue, 7 Nov 2023 21:11:01 +0900</pubDate>
    </item>
    <item>
      <title>가명일 때는 케이스로 그룹핑을 해주실 수 있나요?</title>
      <link>https://muds.tistory.com/1506</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;SELECT 문은 'Length'로 별칭된 상태(또는 여러 IF 문을 사용할 수 있음)에서 계산되고 있으며, 결과를 정확하게 그룹화해야 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;SELECT가 작동하는 것처럼 보이지만 그룹이 잘못 그룹화합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여기 제 진술이 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;SELECT CASE 
    WHEN DATEDIFF(o.EndDate, o.StartDate) &amp;lt; 30 THEN '&amp;lt;1 Month'
    WHEN DATEDIFF(o.EndDate, o.StartDate) &amp;lt; 90 THEN '1 - 2 Months'
    WHEN DATEDIFF(o.EndDate, o.StartDate) &amp;lt; 210 THEN '3 - 4 Months'
    ELSE '&amp;gt;4 Months' END AS 'Length', 
    COUNT(DISTINCT(person.ID)) AS 'COUNT'
FROM person
    INNER JOIN opportunity AS o
    INNER JOIN Organization AS org
    ON person.EntityID = o.id 
        AND O.OrganizationID = Org.ID
WHERE person.TitleID = 2
    AND o.bID = 1
GROUP BY 'Length'
ORDER BY 'Length' ASC;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 그룹은 모두 '3~4개월'로 귀결되는데, 이는 옳지 않습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;당신은 전체를 사용해야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;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;code&gt;GROUP BY&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;subquery로 포장하지 않으면 조항입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;SELECT  CASE 
            WHEN DATEDIFF(o.EndDate, o.StartDate) &amp;lt; 30 THEN '&amp;lt;1 Month'
            WHEN DATEDIFF(o.EndDate, o.StartDate) &amp;lt; 90 THEN '1 - 2 Months'
            WHEN DATEDIFF(o.EndDate, o.StartDate) &amp;lt; 210 THEN '3 - 4 Months'
            ELSE '&amp;gt;4 Months' 
        END AS `Length`, 
        COUNT(DISTINCT(person.ID)) AS `COUNT`
FROM    person
        INNER JOIN opportunity AS o
            ON person.EntityID = o.id
        INNER JOIN Organization AS org
            ON o.OrganizationID = Org.ID
WHERE   person.TitleID = 2
        AND o.bID = 1
GROUP   BY  CASE 
                WHEN DATEDIFF(o.EndDate, o.StartDate) &amp;lt; 30 THEN '&amp;lt;1 Month'
                WHEN DATEDIFF(o.EndDate, o.StartDate) &amp;lt; 90 THEN '1 - 2 Months'
                WHEN DATEDIFF(o.EndDate, o.StartDate) &amp;lt; 210 THEN '3 - 4 Months'
                ELSE '&amp;gt;4 Months' 
            END
ORDER   BY Length ASC;
&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;ORDER BY&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;절&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 바로 같은 문제로 어려움을 겪고 있었는데, 다음과 같이 해결책을 제시했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;SELECT CASE 
WHEN DATEDIFF(o.EndDate, o.StartDate) &amp;lt; 30 THEN '&amp;lt;1 Month'
WHEN DATEDIFF(o.EndDate, o.StartDate) &amp;lt; 90 THEN '1 - 2 Months'
WHEN DATEDIFF(o.EndDate, o.StartDate) &amp;lt; 210 THEN '3 - 4 Months'
ELSE '&amp;gt;4 Months' END AS `Length`, 
COUNT(DISTINCT(person.ID)) AS `COUNT`
FROM person
INNER JOIN opportunity AS o
INNER JOIN Organization AS org
ON person.EntityID = o.id 
    AND O.OrganizationID = Org.ID
WHERE person.TitleID = 2
AND o.bID = 1
GROUP BY `Length`
ORDER BY `Length` ASC;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음과 같이 select에서 문장을 참조하여 그룹화할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/q/7392730/2664585&quot;&gt;이 질문&lt;/a&gt;도 참조하십시오.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;SELECT CASE 
    WHEN DATEDIFF(o.EndDate, o.StartDate) &amp;lt; 30 THEN '&amp;lt;1 Month'
    WHEN DATEDIFF(o.EndDate, o.StartDate) &amp;lt; 90 THEN '1 - 2 Months'
    WHEN DATEDIFF(o.EndDate, o.StartDate) &amp;lt; 210 THEN '3 - 4 Months'
    ELSE '&amp;gt;4 Months' END AS 'Length', 
    COUNT(DISTINCT(person.ID)) AS 'COUNT'
FROM person
    INNER JOIN opportunity AS o
    INNER JOIN Organization AS org
    ON person.EntityID = o.id 
        AND O.OrganizationID = Org.ID
WHERE person.TitleID = 2
AND o.bID = 1
GROUP BY 1
ORDER BY 1 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;URL : https://stackoverflow.com/questions/19096344/can-you-group-by-with-a-case-when-then-alias-name&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>MySQL</category>
      <author>muds</author>
      <guid isPermaLink="true">https://muds.tistory.com/1506</guid>
      <comments>https://muds.tistory.com/1506#entry1506comment</comments>
      <pubDate>Tue, 7 Nov 2023 21:10:55 +0900</pubDate>
    </item>
    <item>
      <title>Wordpress Multisite에서 HTACCCESS를 사용하여 WP-CONTER URL에 하위 디렉토리 추가</title>
      <link>https://muds.tistory.com/1505</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Wordpress Multisite에서 HTACCCESS를 사용하여 WP-CONTER URL에 하위 디렉토리 추가&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;단일 사이트 WordPress 설치를 다중 사이트로 전환하는 과정에 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;메인 사이트에서 깨져버린 CSS/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;ul&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;http://www.example.com&quot; rel=&quot;noreferrer&quot;&gt;http://www.example.com&lt;/a&gt; (기본)&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;http://dev.example.com&quot; rel=&quot;noreferrer&quot;&gt;http://dev.example.com&lt;/a&gt; (2차)&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제 멀티사이트 설치는 워드프레스라고 부르는 &lt;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;public_html/wordpress&lt;/code&gt;&lt;font 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;내 목표는 두 사이트 모두 URL에 &quot;워드프레스&quot; 하위 디렉토리를 갖지 않는 것입니다. 주 사이트에서 부서진 CSS와 JS를 제외하고는 모두 작동하는 것 같습니다(보조 사이트는 괜찮아 보임).&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;코드를 검사할 때 모든 CSS 및 JS 호출은 http://www.example.com/wp-content/ 을 가리키지만 파일은 거기서 찾을 수 없습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;브라우저에서 http://www.example.com/wordpress/wp-content 로 이동하면 파일을 찾을 수 있습니다.&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;HTACCESS 파일을 어떻게 설정해야 하는지 혼란스럽습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;서브디렉토리 내의 멀티 사이트가 동작하도록 하기 위해 이미 초기 변경을 했습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것들은 모두 당신의 사이트를 서브디렉토리가 있는 다중 사이트로 이동하고 서브디렉토리를 숨기는 방법과 관련하여 StackOverflow 및 다른 온라인에서 발견한 가이드를 따르는 것이었습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;파손된 CSS/JS 문제를 해결하는 것에 대해 아무것도 찾지 못했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;3개 이상의 HTACCESS 파일을 업데이트해야 한다고 생각했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;1.) public_html/.htaccess&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;IfModule mod_rewrite.c&amp;gt;
RewriteEngine on
RewriteCond %{HTTP_HOST} ^(www.)?example.com$
RewriteCond %{REQUEST_URI} !^/wordpress/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /wordpress/$1
RewriteCond %{HTTP_HOST} ^(www.)?example.com$
RewriteRule ^(/)?$ /wordpress/index.php [L] 
&amp;lt;/IfModule&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;2.) public_html/wordpress/.htaccess&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;IfModule mod_rewrite.c&amp;gt;
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /wordpress/
RewriteRule ^index\.php$ - [L]

# add a trailing slash to /wp-admin
RewriteRule ^([_0-9a-zA-Z-]+/)?wp-admin$ $1wp-admin/ [R=301,L]
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) $2 [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(.*\.php)$ $2 [L]
RewriteRule . index.php [L]
&amp;lt;/IfModule&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;3.) public_html/wordpress/wp-content/.htaccess&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;예를 들어, 현재 http://www.example.com/wp-content/uploads/image.jpg 은 고장 &lt;a href=&quot;http://www.example.com/wordpress/wp-content/uploads/image.jpg&quot; rel=&quot;noreferrer&quot;&gt;났지만 &lt;/a&gt;http://www.example.com/wordpress/wp-content/uploads/image.jpg 은 작동합니다.&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;IfModule mod_rewrite.c&amp;gt;
RewriteEngine on
# ADD WORDPRESS IF URL DOES NOT HAVE IT
RewriteCond %{HTTP_HOST} ^(www.)?example.com$
RewriteCond %{REQUEST_URI} !^/wordpress/
RewriteRule ^(.*)$ /wordpress/$1
&amp;lt;/IfModule&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다양한 HTACCESS 파일에 다른 줄을 추가해 보았지만 아무 것도 작동하지 않았습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;새로운 규칙을 어떤 줄 번호로 삽입해야 하는지도 잘 모르겠습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제가 새로 만든 규칙 중 하나가 맞았을 수도 있지만 잘못된 곳에 있을 수도 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아래는 제가 정말 될 줄 알았는데 안 될 것 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;RewriteRule ^/wp-content/(.*)$ /wordpress/wp-content/$1 [R=301,NC,L]
&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;.htaccess&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;파일 및 하나만 루트에 유지합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;public_html/.htaccess&lt;/code&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;둘째, 당신의 마지막 규칙이 약간 틀려서 작동하지 않습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음 항목에서 변경해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;RewriteRule ^/wp-content/(.*)$ /wordpress/wp-content/$1 [R=301,NC,L]
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;받는 사람:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;RewriteRule ^wp-content/(.*)$ wordpress/wp-content/$1 [L,NC]
&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;그리고 301번 방향전환할 필요는 없습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;당신은 당신의 것을 유지하길 원합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;wordpress&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;폴더를 숨기고 요청한 URL을 매핑합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;wp-content/(.*)&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;로.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;wordpress/wp-content/$1&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;또한 이 규칙은 .htaccess 파일에서 기본 Wordpress 규칙보다 우선해야 합니다.&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;.htaccess&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;부터&lt;/font&gt;&lt;/font&gt;&lt;code&gt;public_html/&lt;/code&gt;&lt;font 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;RewriteEngine On
RewriteBase /
RewriteRule ^wp-content/(.*)$ wordpress/wp-content/$1 [L,nc]
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;도움이 되길 바랍니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여러 개를 설치할 필요는 없습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;.htaccess&lt;/code&gt;&lt;font 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;.htaccess&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;public_html/.htaccess&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아니면 당신의&lt;/font&gt;&lt;/font&gt;&lt;code&gt;public_html/wordpress&lt;/code&gt;&lt;font 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;이제 기본적으로 WordPress는 다음을 생성합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;.htaccess&lt;/code&gt;&lt;font 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;# BEGIN WordPress
&amp;lt;IfModule mod_rewrite.c&amp;gt;
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
&amp;lt;/IfModule&amp;gt;
# END WordPress
&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;URL을 다시 쓰려면 &lt;strong&gt;WordPress 코드 블록 앞&lt;/strong&gt;에 다시 쓰기 규칙을 추가해야 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;RewriteRules는 위에서 아래로 처리되기 때문에, 요청이 먼저 다음으로 다시 작성되는 경우&lt;/font&gt;&lt;/font&gt;&lt;code&gt;index.php&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;WordPress 블록에 의해 규칙이 처리되지 않습니다.&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;RewriteRule ^/wp-content/(.*)$ /wordpress/wp-content/$1 [R=301,NC,L]
&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;.htaccess&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;, 제거합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;.htaccess&lt;/code&gt;&lt;font 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;font papago-translate=&quot;translated&quot;&gt;이것은 서버가 example.com 을 사용하는 경우 네트워크의 기본 사이트에 대한 URL이 됨을 의미합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하위 디렉터리에 WordPress Multisite를 설치한 경우 하위 도메인을 사용할 수 없습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;example.com 에 이미 단일 사이트가 설치되어 있고 Multisite를 실행하는 하위 디렉토리에 다른 WordPress 설치를 추가하는 경우 해당 주소는 example.com/wordpress 이 됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;새 네트워크에 생성하는 모든 사이트는 example.com/wordpress/my-new-site 에서 확인할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여기서는 하위 디렉토리를 만드는 것이 불가능합니다. 왜냐하면 example.com/wordpress/my-new-site.network 같은 주소에 있어야 하기 때문입니다. 이 주소는 작동하지 않습니다.&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/74297627/add-subdirectory-to-wp-content-url-using-htaccess-in-wordpress-multisite&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>WordPress</category>
      <author>muds</author>
      <guid isPermaLink="true">https://muds.tistory.com/1505</guid>
      <comments>https://muds.tistory.com/1505#entry1505comment</comments>
      <pubDate>Tue, 7 Nov 2023 21:10:47 +0900</pubDate>
    </item>
    <item>
      <title>왜 Py_를 해야 합니까?C에서 Py_None을 반환하기 전에 INCRECF(Py_None)가 필요합니까?</title>
      <link>https://muds.tistory.com/1504</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;왜 Py_를 해야 합니까?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;C에서 Py_None을 반환하기 전에 INCRECF(Py_None)가 필요합니까?&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;왜 Py_를 해야 합니까?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음과 같이 C에서 Py_None을 반환하기 전에 CRINCF(Py_None)가 필요합니까?&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Py_INCREF(Py_None);
return Py_None;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Py_INCREFF(Py_None)가 생략되면 어떻게 됩니까?&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;누락된 A&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Py_INCREF&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;에 대한 참조 수를 잘못 세게 됩니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Py_None&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;, 그로 인해 인터프리터가 할당을 해제하게 될 수도 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Py_None&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;.부터&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Py_None&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;에 정적으로 할당됩니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Objects/object.c&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;파일:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;PyObject _Py_NoneStruct = {
  _PyObject_EXTRA_INIT
  1, &amp;amp;PyNone_Type
};
&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;Include/object.h&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음과 같은 정의가 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#define Py_None (&amp;amp;_Py_NoneStruct)
&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;Fatal Python error: deallocating None
&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;none_dealloc&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;기능을 다함&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Objects/object.c&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;/* ARGUSED */
static void
none_dealloc(PyObject* ignore)
{
    /* This should never get called, but we also don't want to SEGV if
     * we accidentally decref None out of existence.
     */
    Py_FatalError(&quot;deallocating None&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;NoneType&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;할당 해제 기능이 자체적으로 없었기 때문에 분할 오류를 얻을 수 있었습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;free&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;스택에서 호출이 수행됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;http://docs.python.org/2/extending/newtypes.html&quot; rel=&quot;noreferrer&quot;&gt;자습서&lt;/a&gt;의 예제를 복사하여 다음에 호출을 추가하여 테스트할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Py_DECREF(Py_None)&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;안으로&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Noddy_name&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;함수, 확장을 구축하고 그 방법을 호출하는 루프를 수행합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;hr&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;일반적인 경우 기준 카운트는&lt;/font&gt;&lt;/font&gt;&lt;code&gt;0&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;프로그램이 여러 가지 방법으로 실패하게 할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;특히 python은 할당 해제된 개체가 사용하는 메모리를 자유롭게 다시 사용할 수 있습니다. 즉, 개체에 대한 모든 참조가 임의의 개체(또는 빈 메모리 위치)에 대한 참조가 될 수 있으며 다음과 같은 것을 볼 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; None   #or whatever object that was deallocated
&amp;lt;ARandomObjectYouNeverSawBefore object at ...&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;(C 확장자를 쓸 때 이런 &lt;a href=&quot;https://stackoverflow.com/questions/11897597/implementing-nb-inplace-add-results-in-returning-a-read-only-buffer-object&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;Py_INCREF&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;).&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다른 상황에서는 다른 종류의 오류가 발생하거나 통역사가 충돌하거나 오류가 발생할 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;code&gt;Py_None&lt;/code&gt;&lt;font 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;Python은 모든 참조를 셀 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;PyObject*&lt;/code&gt;&lt;font 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;참조 횟수를 증가시키지 않으면 Python 인터프리터는 참조 횟수가 도달한 후 개체를 폐기합니다.&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;Py_None&lt;/code&gt;&lt;font 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;Py_INCREF(Py_None)&lt;/code&gt;&lt;font 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;return Py_BuildValue(&quot;&quot;);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아니면&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Py_RETURN_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;URL : https://stackoverflow.com/questions/15287590/why-should-py-increfpy-none-be-required-before-returning-py-none-in-c&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>C</category>
      <author>muds</author>
      <guid isPermaLink="true">https://muds.tistory.com/1504</guid>
      <comments>https://muds.tistory.com/1504#entry1504comment</comments>
      <pubDate>Tue, 7 Nov 2023 21:10:40 +0900</pubDate>
    </item>
    <item>
      <title>XElement 네임스페이스(방법?)</title>
      <link>https://muds.tistory.com/1503</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;XElement 네임스페이스(방법?)&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음과 같은 노드 접두사를 사용하여 xml 문서를 만드는 방법:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;sphinx:docset&amp;gt;
  &amp;lt;sphinx:schema&amp;gt;
    &amp;lt;sphinx:field name=&quot;subject&quot;/&amp;gt;
    &amp;lt;sphinx:field name=&quot;content&quot;/&amp;gt;
    &amp;lt;sphinx:attr name=&quot;published&quot; type=&quot;timestamp&quot;/&amp;gt;
 &amp;lt;/sphinx:schema&amp;gt;
&lt;/code&gt;&lt;/pre&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;new XElement(&quot;sphinx:docset&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;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 papago-translate=&quot;translated&quot;&gt;Xml.Xml 예외:&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;':' 문자(16진수 값 0x3A)는 이름에 포함할 수 없습니다.&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;시스템에서.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Xml.XmlConvert.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;NCName 확인(문자열 이름, 예외)&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;br&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;시스템에서.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Xml.Linq.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;XName..ctor(XName 공백, 문자열 localName)&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;시스템에서.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Xml.Linq.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;XNamespace.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;GetName(String localName)&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;시스템에서.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Xml.Linq.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;XName.Get(String expandedName)&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;LINQ에서 XML로의 변환은 매우 쉽습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;XNamespace ns = &quot;sphinx&quot;;
XElement element = new XElement(ns + &quot;docset&quot;);
&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;XNamespace ns = &quot;http://url/for/sphinx&quot;;
XElement element = new XElement(&quot;container&quot;,
    new XAttribute(XNamespace.Xmlns + &quot;sphinx&quot;, ns),
    new XElement(ns + &quot;docset&quot;,
        new XElement(ns + &quot;schema&quot;),
            new XElement(ns + &quot;field&quot;, new XAttribute(&quot;name&quot;, &quot;subject&quot;)),
            new XElement(ns + &quot;field&quot;, new XAttribute(&quot;name&quot;, &quot;content&quot;)),
            new XElement(ns + &quot;attr&quot;, 
                         new XAttribute(&quot;name&quot;, &quot;published&quot;),
                         new XAttribute(&quot;type&quot;, &quot;timestamp&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;&amp;lt;container xmlns:sphinx=&quot;http://url/for/sphinx&quot;&amp;gt;
  &amp;lt;sphinx:docset&amp;gt;
    &amp;lt;sphinx:schema /&amp;gt;
    &amp;lt;sphinx:field name=&quot;subject&quot; /&amp;gt;
    &amp;lt;sphinx:field name=&quot;content&quot; /&amp;gt;
    &amp;lt;sphinx:attr name=&quot;published&quot; type=&quot;timestamp&quot; /&amp;gt;
  &amp;lt;/sphinx:docset&amp;gt;
&amp;lt;/container&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;XDocument xml = XDocument.Load(address);
XNamespace ns = xml.Root.Name.Namespace;
foreach (XElement el in xml.Descendants(ns + &quot;whateverYourElementNameIs&quot;))
    //do stuff
&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/4985974/xelement-namespaces-how-to&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>xml</category>
      <author>muds</author>
      <guid isPermaLink="true">https://muds.tistory.com/1503</guid>
      <comments>https://muds.tistory.com/1503#entry1503comment</comments>
      <pubDate>Tue, 7 Nov 2023 21:10:34 +0900</pubDate>
    </item>
    <item>
      <title>SQL(Oracle)의 느낌표</title>
      <link>https://muds.tistory.com/1502</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;SQL(Oracle)의 느낌표&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;데이터베이스에서 V$SQL을 살펴보니 방금 다음과 같은 이상한 쿼리를 발견했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;UPDATE &quot;MYTABLE&quot; &quot;A1&quot; SET &quot;SOMECOLUMN&quot; = (
    SELECT &quot;A2&quot;.&quot;ANOTHERCOLUMN&quot; 
    FROM &quot;ANOTHERTABLE&quot;@! &quot;A2&quot; 
    WHERE &quot;A2&quot;.ROWID=:B1
)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;구문 @의 의미를 아는 사람?&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;오라클에서 이런 것을 본 적이 없습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;감사해요.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;원격 데이터베이스에서 발생한 쿼리입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;V$SQL에서 이 쿼리를 본 데이터베이스가 @DB_NAME 구문을 사용하여 원격 데이터베이스의 쿼리에서 참조되었습니다.&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;alter system flush shared_pool;
select sysdate from dual@myself;
select sql_text from gv$sql where sql_fulltext like '%@!%';

SQL_TEXT
--------
SELECT SYSDATE@! FROM &quot;DUAL&quot; &quot;A1&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;예를 들어 Oracle에서 'tns_service_name'을 사용하여 암호로 식별된 remote_username에 대한 내 링크 연결을 공용 데이터베이스 링크 생성을 사용합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 사용자(remote_username) 다음에 테이블이 있는 경우 사용할 수 있는 다른 테이블: &quot;A2&quot; 선택.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&quot;AnotherTable&quot;의 &quot;AnotherColumn&quot;@mylink &quot;A2&quot;에서 &quot;A2&quot;.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;ROWID=1&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여기서 ! 기호가 어떻게 쓰이는지 저는 잘 모르겠습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;일반적으로 ! 기호는 데이터베이스 클라이언트가 실행 중인 셸에 액세스할 때 사용하는 기호입니다.&lt;/font&gt;&lt;/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;URL : https://stackoverflow.com/questions/21548336/exclamation-mark-in-sql-oracle&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>oracle</category>
      <author>muds</author>
      <guid isPermaLink="true">https://muds.tistory.com/1502</guid>
      <comments>https://muds.tistory.com/1502#entry1502comment</comments>
      <pubDate>Tue, 7 Nov 2023 21:10:27 +0900</pubDate>
    </item>
    <item>
      <title>오라클에서 예약된 작업을 삭제하는 방법</title>
      <link>https://muds.tistory.com/1501</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;strong&gt;ENTERT_TIME&lt;/strong&gt;이라는 작업을 만들었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;BEGIN
      DBMS_SCHEDULER.CREATE_JOB (
       job_name           =&amp;gt;  'ENTRY_TIME',
       job_type           =&amp;gt;  'STORED_PROCEDURE',
       job_action         =&amp;gt;  'PK_ENTRY_TIME.PROC_ENTRY_TIME',
       start_date         =&amp;gt;  '24-MAY-16 07.00.00 AM America/Chicago',
       repeat_interval    =&amp;gt;  'FREQ=DAILY',
       end_date           =&amp;gt;  '20-NOV-99 07.00.00 AM America/Chicago',
       auto_drop          =&amp;gt;   FALSE,
      comments           =&amp;gt;  'My new job');
    END;
    /
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이제 이 일을 그만두고 싶습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 작업 &lt;strong&gt;Entry_time&lt;/strong&gt;을 영구적으로 삭제하려면 어떤 쿼리를 사용해야 합니까?&lt;/font&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;BEGIN
  dbms_scheduler.drop_job(job_name =&amp;gt; 'ENTRY_TIME');
END;
/
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/37458051/how-to-drop-a-scheduled-job-in-oracle&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>oracle</category>
      <author>muds</author>
      <guid isPermaLink="true">https://muds.tistory.com/1501</guid>
      <comments>https://muds.tistory.com/1501#entry1501comment</comments>
      <pubDate>Tue, 7 Nov 2023 21:10:21 +0900</pubDate>
    </item>
    <item>
      <title>exec에서 출력 잡기</title>
      <link>https://muds.tistory.com/1500</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;exec에서 출력 잡기&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;명령어 출력을 잡는 C 프로그램을 작성하려고 하는데 다른 프로그램으로 전달하겠습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;문제가 있어서 명령어 출력 및 저장 방법을 찾을 수 없습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아래는 제가 가지고 있는 것의 샘플입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;if(fork() == 0){
   execl(&quot;/bin/ls&quot;, &quot;ls&quot;, &quot;-1&quot;, (char *)0);
   /* do something with the output here */
}
else{
    //*other stuff goes here*
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그래서 기본적으로 &quot;execl&quot;에서 출력을 얻어 다른 것(예를 들어 일종의 버퍼에 저장)으로 전달할 수 있는 방법이 있는지 궁금합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;좋은 제안이 있겠습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;상위 프로세스에서 하위 프로세스로 파이프를 생성해야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;pipe()&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;. 그런 다음 리디렉션해야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;standard ouput&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;(STDOUT_FILENO) 및&lt;/font&gt;&lt;/font&gt;&lt;code&gt;error output&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;(STDERR_FILENO) 사용&lt;/font&gt;&lt;/font&gt;&lt;code&gt;dup&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아니면&lt;/font&gt;&lt;/font&gt;&lt;code&gt;dup2&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;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;
#include &amp;lt;unistd.h&amp;gt;

#define die(e) do { fprintf(stderr, &quot;%s\n&quot;, e); exit(EXIT_FAILURE); } while (0);

int main() {
  int link[2];
  pid_t pid;
  char foo[4096];

  if (pipe(link)==-1)
    die(&quot;pipe&quot;);

  if ((pid = fork()) == -1)
    die(&quot;fork&quot;);

  if(pid == 0) {

    dup2 (link[1], STDOUT_FILENO);
    close(link[0]);
    close(link[1]);
    execl(&quot;/bin/ls&quot;, &quot;ls&quot;, &quot;-1&quot;, (char *)0);
    die(&quot;execl&quot;);

  } else {

    close(link[1]);
    int nbytes = read(link[0], foo, sizeof(foo));
    printf(&quot;Output: (%.*s)\n&quot;, nbytes, foo);
    wait(NULL);

  }
  return 0;
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;파이프를 열고 그 파이프에 맞게 stdout을 바꿉니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt; #include &amp;lt;sys/types.h&amp;gt;
 #include &amp;lt;unistd.h&amp;gt;
 #include &amp;lt;stdio.h&amp;gt;
 #include &amp;lt;stdlib.h&amp;gt;

 int pipes[2];

 pipe(pipes); // Create the pipes

 dup2(pipes[1],1); // Set the pipe up to standard output
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그 후 stdout으로 가는 모든 것(예: printf)이 파이프[0]에서 나옵니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;FILE *input = fdopen(pipes[0],&quot;r&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;a href=&quot;http://www.gnu.org/s/hello/manual/libc/Creating-a-Pipe.html&quot; rel=&quot;noreferrer&quot;&gt;글&lt;/a&gt;을 참조하십시오.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;조나단 레플러에게 감사드리며, 한 번만 모든 응답을 읽을 수 없기 때문에 위 코드를 최적화합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;
#include &amp;lt;unistd.h&amp;gt;
#include &amp;lt;string.h&amp;gt;
#include &amp;lt;sys/wait.h&amp;gt;

#define die(e) do { fprintf(stderr, &quot;%s\n&quot;, e); exit(EXIT_FAILURE); } while (0);

int main() {
  int link[2];
  pid_t pid;
  char foo[4096 + 1];
  memset(foo, 0, 4096);

  if (pipe(link)==-1)
    die(&quot;pipe&quot;);

   if ((pid = fork()) == -1)
    die(&quot;fork&quot;);

  if(pid == 0) {

    dup2 (link[1], STDOUT_FILENO);
    close(link[0]);
    close(link[1]);
    execl(&quot;/bin/ls&quot;, &quot;ls&quot;, &quot;-1&quot;, (char *)0);
    die(&quot;execl&quot;);
  } else {
    close(link[1]);
    int nbytes = 0;
    std::string totalStr;
    while(0 != (nbytes = read(link[0], foo, sizeof(foo)))) {
        totalStr = totalStr + foo;
        printf(&quot;Output: (%.*s)\n&quot;, nbytes, foo);
        memset(foo, 0, 4096);
    }
    wait(NULL);
  }
  return 0;
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;문자열(char *)로 출력하려면 다음 옵션이 있습니다(최소한 Linux의 경우).&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#include &amp;lt;errno.h&amp;gt;
#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;
#include &amp;lt;sys/uio.h&amp;gt;
#include &amp;lt;sys/wait.h&amp;gt;
#include &amp;lt;unistd.h&amp;gt;

char* qx(char** cmd, int inc_stderr) {
  int stdout_fds[2];
  pipe(stdout_fds);

  int stderr_fds[2];
  if (!inc_stderr) {
    pipe(stderr_fds);
  }

  const pid_t pid = fork();
  if (!pid) {
    close(stdout_fds[0]);
    dup2(stdout_fds[1], 1);
    if (inc_stderr) {
      dup2(stdout_fds[1], 2);
    }

    close(stdout_fds[1]);

    if (!inc_stderr) {
      close(stderr_fds[0]);
      dup2(stderr_fds[1], 2);
      close(stderr_fds[1]);
    }

    execvp(*cmd, cmd);
    exit(0);
  }

  close(stdout_fds[1]);

  const int buf_size = 4096;
  char* out = malloc(buf_size);
  int out_size = buf_size;
  int i = 0;
  do {
    const ssize_t r = read(stdout_fds[0], &amp;amp;out[i], buf_size);
    if (r &amp;gt; 0) {
      i += r;
    }

    if (out_size - i &amp;lt;= 4096) {
      out_size *= 2;
      out = realloc(out, out_size);
    }
  } while (errno == EAGAIN || errno == EINTR);

  close(stdout_fds[0]);

  if (!inc_stderr) {
    close(stderr_fds[1]);
    do {
      const ssize_t r = read(stderr_fds[0], &amp;amp;out[i], buf_size);

      if (r &amp;gt; 0) {
        i += r;
      }

      if (out_size - i &amp;lt;= 4096) {
        out_size *= 2;
        out = realloc(out, out_size);
      }

    } while (errno == EAGAIN || errno == EINTR);

    close(stderr_fds[0]);
  }

  int r, status;
  do {
    r = waitpid(pid, &amp;amp;status, 0);
  } while (r == -1 &amp;amp;&amp;amp; errno == EINTR);

  out[i] = 0;

  return out;
}

int main() {
  char* argv[3];
  argv[0] = &quot;ls&quot;;
  argv[1] = &quot;-la&quot;;
  argv[2] = NULL;
  char* out = qx(argv, 0);
  printf(&quot;%s&quot;, out);
  free(out);
}
&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/7292642/grabbing-output-from-exec&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>C</category>
      <author>muds</author>
      <guid isPermaLink="true">https://muds.tistory.com/1500</guid>
      <comments>https://muds.tistory.com/1500#entry1500comment</comments>
      <pubDate>Tue, 7 Nov 2023 21:10:15 +0900</pubDate>
    </item>
    <item>
      <title>PL/SQL &amp;lt;&amp;gt;의 의미는 무엇입니까?</title>
      <link>https://muds.tistory.com/1499</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;PL/SQL &amp;lt;&amp;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;PL/SQL에서 쌍각 괄호 안에 있는 단어의 의미는 무엇입니까?&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&amp;lt;&amp;lt;word&amp;gt;&amp;gt;&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;?&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;구글 검색을 해봤는데 구글이 구두점을 건너뛰네요.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그것은 무엇에 쓰입니까?&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;질문 댓글 작성자가 언급한 바와 같이, 이는 복합문에 라벨을 붙이는 데 사용되며 GOTO의 대상으로도 사용됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;END와 END LOOP의 라벨을 사용하면 가독성이 좋아지는 등의 효과를 얻을 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&amp;lt;&amp;lt;countdown&amp;gt;&amp;gt; for i in 1.9 loop blah; end loop countdown;&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;set echo on
set serveroutput on

&amp;lt;&amp;lt;begin_end_block&amp;gt;&amp;gt; 
declare 
  msg varchar2(1000);
begin
  dbms_output.enable;
  msg := chr(9) || 'start';
  &amp;lt;&amp;lt;loopblk&amp;gt;&amp;gt; 
  for itr8 in 1 .. 5
  loop
    msg := msg || chr(10) || chr (9) ||  'loop';
    dbms_output.put_line ('Iterator is ' || itr8);
    &amp;lt;&amp;lt;ifblck&amp;gt;&amp;gt; if itr8 &amp;gt; 2
    then
      msg := msg || chr(10) || chr(9) || 'greater than 2';
      goto gototarg;
    end if;
    exit loopblk when mod (itr8, 4) = 0;
    continue loopblk;
    &amp;lt;&amp;lt;gototarg&amp;gt;&amp;gt;
    dbms_output.put_line ('after goto target');
  end loop loopblk;
  dbms_output.put_line ('Ending, here are the messages' || chr(10) || msg);
end begin_end_block;
/
&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;anonymous block completed
Iterator is 1
Iterator is 2
Iterator is 3
after goto target
Iterator is 4
after goto target
Iterator is 5
after goto target
Ending, here are the messages
    start
    loop
    loop
    loop
    greater than 2
    loop
    greater than 2
    loop
    greater than 2
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&amp;lt;&amp;gt; 구문은 루프 이름 지정을 위한 것입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;중첩 루프가 있고 EX를 사용해야 할 때 유용합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;종료할 루프를 제어하는 IT loop_name WHEN ... 구문입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예를 보려면 http://docs.oracle.com/cd/B28359_01/appdev.111/b28370/controlstructures.htm#BABJCCFJ 를 참조하십시오.&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/9062894/pl-sql-whats-the-meaning-of-word&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>oracle</category>
      <author>muds</author>
      <guid isPermaLink="true">https://muds.tistory.com/1499</guid>
      <comments>https://muds.tistory.com/1499#entry1499comment</comments>
      <pubDate>Tue, 7 Nov 2023 21:10:05 +0900</pubDate>
    </item>
    <item>
      <title>오라클 프로시저 내에서 date parameter를 전달하는 방법은?</title>
      <link>https://muds.tistory.com/1498</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;오라클 프로시저 내에서 date parameter를 전달하는 방법은?&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;create or replace procedure pro_test(start_date date, end_date date)
is 
begin

insert into test1 select col1, col2, col3 from main where range_date between start_date and end_date;

exception

&amp;lt; what are the exception I need to capture &amp;gt;

end;
/
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Q1: 이 방법이 절차 내에서 직접 날짜를 전달하는 올바른 방법입니까?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Q2 : 만약 그렇지 않다면, 절차 내에서 varchar를 통과하여 선언 부분에서 날짜를 변환할 수 있습니까?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Q3: 연산자 간의 시작 부분에서 절차 매개 변수를 직접 전달할 수 있습니까?&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;exec pro_test('10102015','30102015');&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;start_date와 end_date 사이에 이 정도면 충분합니까, 아니면 날짜 형식을 마스킹해야 합니까?&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;Q1: 이 방법이 절차 내에서 직접 날짜를 전달하는 올바른 방법입니까?&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;Q3: 연산자 간의 시작 부분에서 절차 매개 변수를 직접 전달할 수 있습니까?&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;무슨 뜻인지는 모르겠지만 삽입문은 괜찮습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;DATE&lt;/strong&gt;를 매개변수로 전달하고 테이블에 삽입합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제 생각에는 이 모든 것이 한 번의 &lt;strong&gt;삽입&lt;/strong&gt;으로 이루어질 수 있다고 봅니다&lt;strong&gt;.&lt;/strong&gt;&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;순수 &lt;strong&gt;SQL&lt;/strong&gt;로 &lt;strong&gt;SELECT&lt;/strong&gt; 문을 선택합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;insert into test1 
select col1, col2, col3 
from main 
where range_date 
between TO_DATE(&amp;lt;date_literal&amp;gt;,&amp;lt;format mask&amp;gt;)
and TO_DATE(&amp;lt;date_literal&amp;gt;,&amp;lt;format mask&amp;gt;);
&lt;/code&gt;&lt;/pre&gt; 
&lt;hr&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;OP당 &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;이 절차를 수행하는 동안 exec pro_test('10102015', '30102015');&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;문장 사이에 제가 언급해야 할 것은 무엇입니까?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;start_date와 end_date 사이에 이 정도면 충분합니까, 아니면 날짜 형식을 마스킹해야 합니까?&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;&lt;code&gt;'10102015'&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;DATE가 아니라 문자열 리터럴입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;DATE로 전달해야 하므로, 시간 부분이 없으므로 &lt;strong&gt;TO_DATE&lt;/strong&gt;와 적절한 형식 마스크 또는 &lt;strong&gt;ANSI Date 리터럴&lt;/strong&gt;을 사용해야 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;ANSI 날짜 문자 그대로 고정 형식 사용&lt;/font&gt;&lt;/font&gt;&lt;code&gt;'YYYY-MM-DD'&lt;/code&gt;&lt;font 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;strong&gt;TO_DATE&lt;/strong&gt; 사용하기:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;EXEC pro_test(TO_DATE('10102015','DDMMYYYY'),TO_DATE('30102015','DDMMYYYY'));
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;ANSI 날짜 리터럴&lt;/strong&gt; 사용:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;EXEC pro_test(DATE '2015-10-10', DATE '2015-10-30');
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;Q1.&lt;/strong&gt; 어떤 &lt;strong&gt;종류&lt;/strong&gt;의 &lt;strong&gt;파라미터&lt;/strong&gt;가 입력 또는 출력되는지(&lt;strong&gt;입력&lt;/strong&gt; 또는 출력) 절차를 설명해야 합니다. 절차에 따라 입력됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;create or replace procedure pro_test(start_date in date, end_date in date)&lt;/code&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;당신의 절차에 있는 다른 것들은 괜찮습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;특히 주의를 기울이려면 SQL 문에 사용될 때 pl/sql 변수의 네임스페이스를 지정해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;create or replace procedure pro_test(start_date date, end_date date)
is 
begin

  insert into test1
  select col1, col2, col3
  from main where range_date
  between pro_test.start_date and pro_test.end_date;
...
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이렇게 하면 SQL 엔진에서 참조된 테이블의 열과 이름이 같을 경우 변수를 &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;create procedure my_procedure (p_customer_id number)
...
where customer_id = p_customer_id
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;변수 네임스페이스를 사용하면 접두사 없이 깨끗한 인터페이스를 유지할 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/33932677/how-to-pass-date-parameter-inside-the-oracle-procedure&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>oracle</category>
      <author>muds</author>
      <guid isPermaLink="true">https://muds.tistory.com/1498</guid>
      <comments>https://muds.tistory.com/1498#entry1498comment</comments>
      <pubDate>Tue, 7 Nov 2023 21:09:59 +0900</pubDate>
    </item>
    <item>
      <title>원래 변수는 그대로 유지하면서 mutate_at로 새 변수 만들기</title>
      <link>https://muds.tistory.com/1497</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;원래 변수는 그대로 유지하면서 mutate_at로 새 변수 만들기&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;library(dplyr)
library(tibble)

dataframe &amp;lt;- tibble(helloo = c(1,2,3,4,5,6),
                        ooooHH = c(1,1,1,2,2,2),
                        ahaaa = c(200,400,120,300,100,100))

# A tibble: 6 x 3
  helloo ooooHH ahaaa
   &amp;lt;dbl&amp;gt;  &amp;lt;dbl&amp;gt; &amp;lt;dbl&amp;gt;
1      1      1   200
2      2      1   400
3      3      1   120
4      4      2   300
5      5      2   100
6      6      2   100
&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;ntile&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;포함된 모든 열에&lt;/font&gt;&lt;/font&gt;&lt;code&gt;oo&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;, 하지만 저는 이 새로운 칼럼들을&lt;/font&gt;&lt;/font&gt;&lt;code&gt;cat&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;+ 대응란&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;dataframe %&amp;gt;% mutate_at(vars(contains('oo')), .funs = funs(ntile(., 2)))
# A tibble: 6 x 3
  helloo ooooHH ahaaa
   &amp;lt;int&amp;gt;  &amp;lt;int&amp;gt; &amp;lt;dbl&amp;gt;
1      1      1   200
2      1      1   400
3      1      1   120
4      2      2   300
5      2      2   100
6      2      2   100
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하지만 내게 필요한 건 이건&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;# A tibble: 8 x 5
  helloo   ooooHH   ahaaa cat_helloo cat_ooooHH
     &amp;lt;dbl&amp;gt;    &amp;lt;dbl&amp;gt; &amp;lt;dbl&amp;gt;    &amp;lt;int&amp;gt;    &amp;lt;int&amp;gt;
1        1        1   200        1        1
2        2        1   400        1        1
3        3        1   120        1        1
4        4        2   300        2        2
5        5        2   100        2        2
6        5        2   100        2        2
7        6        2   100        2        2
8        6        2   100        2        2
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;중간 데이터를 저장하고 원래 데이터 프레임으로 다시 병합할 필요가 없는 솔루션이 있습니까?&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;dplyr 1.0.0에 대한 2020-06 업데이트&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;strong&gt;dplyr 1.0.0&lt;/strong&gt;부터 시작하여,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;across()&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;mutate_at()&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;. 코드는 상당히 친숙하게 보여야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;across()&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;, 그 안에 내포되어 있는&lt;/font&gt;&lt;/font&gt;&lt;code&gt;mutate()&lt;/code&gt;&lt;font 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;dataframe %&amp;gt;%
     mutate( across(contains('oo'), 
                    .fns = list(cat = ~ntile(., 2))) )

# A tibble: 6 x 5
  helloo ooooHH ahaaa helloo_cat ooooHH_cat
   &amp;lt;dbl&amp;gt;  &amp;lt;dbl&amp;gt; &amp;lt;dbl&amp;gt;      &amp;lt;int&amp;gt;      &amp;lt;int&amp;gt;
1      1      1   200          1          1
2      2      1   400          1          1
3      3      1   120          1          1
4      4      2   300          2          2
5      5      2   100          2          2
6      6      2   100          2          2
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;1.0.0에서는 새 열 이름을 변경하는 것이 조금 더 쉽습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;.names&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;의 논쟁.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;across()&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;strong&gt;글루&lt;/strong&gt; 구문을 사용합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;dataframe %&amp;gt;%
     mutate( across(contains('oo'), 
                    .fns = list(cat = ~ntile(., 2)),
                    .names = &quot;{fn}_{col}&quot; ) )

# A tibble: 6 x 5
  helloo ooooHH ahaaa cat_helloo cat_ooooHH
   &amp;lt;dbl&amp;gt;  &amp;lt;dbl&amp;gt; &amp;lt;dbl&amp;gt;      &amp;lt;int&amp;gt;      &amp;lt;int&amp;gt;
1      1      1   200          1          1
2      2      1   400          1          1
3      3      1   120          1          1
4      4      2   300          2          2
5      5      2   100          2          2
6      6      2   100          2          2
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;mutate_at()이 있는 원래 답변&lt;/font&gt;&lt;/strong&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;dplyr의 변경 사항을 반영하도록 편집되었습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;dplyr 0.8.0 기준,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;funs()&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사용되지 않습니다.&lt;/font&gt;&lt;/font&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;code&gt;~&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;대신 사용해야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;/em&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;전달할 목록에 함수 이름을 지정할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;.funs&lt;/code&gt;&lt;font 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;dataframe %&amp;gt;% mutate_at(vars(contains('oo')), .funs = list(cat = ~ntile(., 2)))

# A tibble: 6 x 5
  helloo ooooHH ahaaa helloo_cat ooooHH_cat
   &amp;lt;dbl&amp;gt;  &amp;lt;dbl&amp;gt; &amp;lt;dbl&amp;gt;      &amp;lt;int&amp;gt;      &amp;lt;int&amp;gt;
1      1      1   200          1          1
2      2      1   400          1          1
3      3      1   120          1          1
4      4      2   300          2          2
5      5      2   100          2          2
6      6      2   100          2          2
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;만약 당신이 그것을 접두사로 원한다면, 당신은 다음을 사용할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;rename_at&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이름을 바꾸려고 합니다&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;dataframe %&amp;gt;% 
     mutate_at(vars(contains('oo')), .funs = list(cat = ~ntile(., 2))) %&amp;gt;%
     rename_at( vars( contains( &quot;_cat&quot;) ), list( ~paste(&quot;cat&quot;, gsub(&quot;_cat&quot;, &quot;&quot;, .), sep = &quot;_&quot;) ) )

# A tibble: 6 x 5
  helloo ooooHH ahaaa cat_helloo cat_ooooHH
   &amp;lt;dbl&amp;gt;  &amp;lt;dbl&amp;gt; &amp;lt;dbl&amp;gt;      &amp;lt;int&amp;gt;      &amp;lt;int&amp;gt;
1      1      1   200          1          1
2      2      1   400          1          1
3      3      1   120          1          1
4      4      2   300          2          2
5      5      2   100          2          2
6      6      2   100          2          2
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이전코드와&lt;/font&gt;&lt;/font&gt;&lt;code&gt;funs()&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이전 버전의 &lt;strong&gt;dplyr&lt;/strong&gt;에서:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;dataframe %&amp;gt;% 
     mutate_at(vars(contains('oo')), .funs = funs(cat = ntile(., 2))) %&amp;gt;%
     rename_at( vars( contains( &quot;_cat&quot;) ), funs( paste(&quot;cat&quot;, gsub(&quot;_cat&quot;, &quot;&quot;, .), sep = &quot;_&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/45947787/create-new-variables-with-mutate-at-while-keeping-the-original-ones&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>DataFrame</category>
      <author>muds</author>
      <guid isPermaLink="true">https://muds.tistory.com/1497</guid>
      <comments>https://muds.tistory.com/1497#entry1497comment</comments>
      <pubDate>Tue, 7 Nov 2023 21:09:52 +0900</pubDate>
    </item>
    <item>
      <title>매크로에서 사용할 수 있는 트릭에는 어떤 것이 있습니까?</title>
      <link>https://muds.tistory.com/1496</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;매크로에서 사용할 수 있는 트릭에는 어떤 것이 있습니까?&lt;/font&gt;&lt;/h2&gt;
&lt;div&gt; 
 &lt;aside class=&quot;s-notice s-notice__info post-notice js-post-notice mb16&quot; role=&quot;status&quot;&gt; 
  &lt;div class=&quot;d-flex fd-column fw-nowrap&quot;&gt; 
   &lt;div class=&quot;d-flex fw-nowrap&quot;&gt; 
    &lt;div class=&quot;flex--item wmn0 fl1 lh-lg&quot;&gt; 
     &lt;div class=&quot;flex--item fl1 lh-lg&quot;&gt; 
      &lt;div&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;b&gt;문&lt;/b&gt; 닫았습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 질문은 더 많아야 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;/help/closed-questions&quot;&gt;집중력&lt;/a&gt;이 있는&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;현재 답변을 받지 않고 있습니다.&lt;/font&gt;&lt;/div&gt; 
     &lt;/div&gt; 
    &lt;/div&gt; 
   &lt;/div&gt; 
  &lt;/div&gt; 
  &lt;hr class=&quot;my12 outline-none baw0 bb bc-powder-400&quot;&gt; 
  &lt;div class=&quot;fw-nowrap fc-black-600&quot;&gt; 
   &lt;div class=&quot;d-flex fd-column lh-md&quot;&gt; 
    &lt;div class=&quot;mb0 d-flex&quot;&gt; 
     &lt;div class=&quot;flex--item mr8&quot;&gt; 
      &lt;svg aria-hidden=&quot;true&quot; class=&quot;svg-icon iconLightbulb&quot; width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 18 18&quot;&gt;
       &lt;path d=&quot;M15 6.38A6.48 6.48 0 0 0 7.78.04h-.02A6.49 6.49 0 0 0 2.05 5.6a6.31 6.31 0 0 0 2.39 5.75c.49.39.76.93.76 1.5v.24c0 1.07.89 1.9 1.92 1.9h2.75c1.04 0 1.92-.83 1.92-1.9v-.2c0-.6.26-1.15.7-1.48A6.32 6.32 0 0 0 15 6.37ZM4.03 5.85A4.49 4.49 0 0 1 8 2.02a4.48 4.48 0 0 1 5 4.36 4.3 4.3 0 0 1-1.72 3.44c-.98.74-1.5 1.9-1.5 3.08v.1H7.2v-.14c0-1.23-.6-2.34-1.53-3.07a4.32 4.32 0 0 1-1.64-3.94ZM10 18a1 1 0 0 0 0-2H7a1 1 0 1 0 0 2h3Z&quot;&gt;&lt;/path&gt;
      &lt;/svg&gt; 
     &lt;/div&gt; 
     &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;b&gt;이 질문을 개선하고 싶으십니까?&lt;/b&gt;&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;/posts/650461/edit&quot;&gt;이 게시물을 편집&lt;/a&gt;하여 한 가지 문제에만 초점을 맞추도록 질문을 업데이트합니다.&lt;/font&gt;&lt;/p&gt; 
    &lt;/div&gt; 
    &lt;div class=&quot;mb0 mt6 d-flex&quot;&gt; 
     &lt;p class=&quot;ml24 pl2&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;span class=&quot;relativetime&quot; title=&quot;2016-02-04 20:03:32Z&quot; papago-attr-id=&quot;1&quot;&gt;7년전&lt;/span&gt;에 문을 닫았습니다.&lt;/font&gt;&lt;/p&gt; 
    &lt;/div&gt; 
    &lt;div class=&quot;ml24 pl2&quot;&gt; 
    &lt;/div&gt; 
   &lt;/div&gt; 
  &lt;/div&gt; 
  &lt;div class=&quot;mt24 d-flex gsx gs8&quot;&gt; 
   &lt;a class=&quot;s-btn s-btn__outlined flex--item js-post-notice-edit-post&quot; href=&quot;/posts/650461/edit&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 질문을 개선합니다.&lt;/font&gt;&lt;/a&gt; 
  &lt;/div&gt; 
 &lt;/aside&gt; 
&lt;/div&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;우리의 레거시 코드와 현대 코드에서 우리는 매크로를 사용하여 코드 생성 등의 훌륭한 솔루션을 수행합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고 우리는 둘 다 사용합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;#&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;##&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;오퍼레이터들.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다른 개발자들이 매크로를 사용해서 멋진 일을 할 수 있는 방법이 궁금합니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;C에서, 말 그대로의 인수를 얻는 것을 하는 매크로를 정의하는 것이 일반적이며, 동시에 그 주소를 투명하게 얻을 수 있도록 함수를 정의합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;// could evaluate at compile time if __builtin_sin gets
// special treatment by the compiler
#define sin(x) __builtin_sin(x)

// parentheses avoid substitution by the macro
double (sin)(double arg) {
    return sin(arg); // uses the macro
}

int main() {
    // uses the macro
    printf(&quot;%f\n&quot;, sin(3.14));

    // uses the function
    double (*x)(double) = &amp;amp;sin;

    // uses the function
    printf(&quot;%f\n&quot;, (sin)(3.14));
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;DRY 및 간단한 코드 생성에 유용할 수 있는 X Macro 관용구도 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하나는 아직 &lt;strong&gt;정의&lt;/strong&gt;되지 않은 매크로를 사용하여 헤더 gen.x에서 일종의 테이블을 정의합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;/** 1st arg is type , 2nd is field name , 3rd is initial value , 4th is help */
GENX( int , &quot;y&quot; , 1 , &quot;number of ...&quot; );
GENX( float , &quot;z&quot; , 6.3 , &quot;this value sets ...&quot; );
GENX( std::string , &quot;name&quot; , &quot;myname&quot; , &quot;name of ...&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;class X
{
public :

     void setDefaults()
     {
#define GENX( type , member , value , help )\
         member = value ;
#include &quot;gen.x&quot;
#undef GENX
     }

     void help( std::ostream &amp;amp; o )
     {
#define GENX( type , member , value , help )\
          o &amp;lt;&amp;lt; #member &amp;lt;&amp;lt; &quot; : &quot; &amp;lt;&amp;lt; help &amp;lt;&amp;lt; '\n' ;
#include &quot;gen.x&quot;
#undef GENX
     }

private :

#define GENX( type , member , value , help )\
     type member ;
#include &quot;gen.x&quot;
#undef GENX
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;디버깅을 위해 SHOW():&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#define SHOW(X) cout &amp;lt;&amp;lt; # X &quot; = &quot; &amp;lt;&amp;lt; (X) &amp;lt;&amp;lt; endl
&lt;/code&gt;&lt;/pre&gt; 
&lt;hr&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;인수를 확장하기 위한 이중 평가 트릭: (예: &quot;_LINE__&quot;이 아닌 실제 라인 번호를 사용합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;    /* Use CONCATENATE_AGAIN to expand the arguments to CONCATENATE */
#define CONCATENATE(      x,y)  CONCATENATE_AGAIN(x,y)
#define CONCATENATE_AGAIN(x,y)  x ## y
&lt;/code&gt;&lt;/pre&gt; 
&lt;hr&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;정적 컴파일 시간 주장입니다.&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#define CONCATENATE_4(      a,b,c,d)  CONCATENATE_4_AGAIN(a,b,c,d)
#define CONCATENATE_4_AGAIN(a,b,c,d)  a ## b ## c ## d

    /* Creates a typedef that's legal/illegal depending on EXPRESSION.       *
     * Note that IDENTIFIER_TEXT is limited to &quot;[a-zA-Z0-9_]*&quot;.              *
     * (This may be replaced by static_assert() in future revisions of C++.) */
#define STATIC_ASSERT( EXPRESSION, IDENTIFIER_TEXT)                     \
  typedef char CONCATENATE_4( static_assert____,      IDENTIFIER_TEXT,  \
                              ____failed_at_line____, __LINE__ )        \
            [ (EXPRESSION) ? 1 : -1 ]
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음을 통해 사용:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;typedef  int32_t  int4;

STATIC_ASSERT( sizeof(int4) == 4, sizeof_int4_equal_4 );
&lt;/code&gt;&lt;/pre&gt; 
&lt;hr&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;클래스 CodeLocation 인스턴스를 초기화하는 중: (파일/라인/함수를 호출하는 시점부터 저장 -- 이 작업은 매크로를 사용하거나 __FILE__/_에 직접 액세스하여 *ONLY*할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;소스 포인트의 LINE__/etc 매크로.)&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;        /* Note:  Windows may have __FUNCTION__.  C99 defines __func__. */
#define CURRENT_CODE_LOCATION()  \
           CodeLocation( __PRETTY_FUNCTION__, __FILE__, __LINE__ )
&lt;/code&gt;&lt;/pre&gt; 
&lt;hr&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이후 MESSAGE/WARn/FAIL 매크로에서 편리한 소스-위치 인쇄 메커니즘으로 사용됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예를 들어,&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#define WARN_IF_NAN(X)                                      \
  do                                                        \
  {                                                         \
    if ( isnan(X) != 0 )                                    \
      WARN( # X &quot; is NaN (Floating Point NOT-A-NUMBER)&quot; );  \
    if ( isinf(X) != 0 )                                    \
      WARN( # X &quot; is INF (Floating Point INFINITY)&quot; );      \
  } while ( false )
&lt;/code&gt;&lt;/pre&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;font papago-translate=&quot;translated&quot;&gt;구성 요소는 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;ASSERT( foo, ==, bar )
&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;UNLESS( foo, &amp;gt;=, 0, value=0; return false; );
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;합법적입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Assert/Macro가 자동으로 CodeLocation, 스택 트레이스, 예외/코어덤핑/세출과 같은 모든 종류의 유용한 정보를 추가할 수 없는 한.&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;#define ERRNO_FORMAT  &quot;errno= %d (\&quot;%s\&quot;)&quot;
#define ERRNO_ARGS    errno, strerror(errno)
#define ERRNO_STREAM  &quot;errno= &quot; &amp;lt;&amp;lt; errno &amp;lt;&amp;lt; &quot; (\&quot;&quot; &amp;lt;&amp;lt; strerror(errno) &amp;lt;&amp;lt; &quot;\&quot;) &quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예: printf( &quot;열지 못했습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&quot; ERNO_FORMAT, ERNO_ARGS );&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;가장 멋진 매크로는 주장하기, 보호자 포함하기, __FILE__, __LINE__입니다.&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;코드에 다른 매크로를 사용하지 마십시오.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;편집:&lt;/font&gt;&lt;/strong&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;매크로는 법률적 해결책이 없는 경우에만 사용합니다.&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://www.boost.org/doc/libs/1_38_0/libs/preprocessor/doc/index.html&quot; rel=&quot;noreferrer&quot;&gt;Boost&lt;/a&gt;를 보실 수 있습니다&lt;a href=&quot;http://www.boost.org/doc/libs/1_38_0/libs/preprocessor/doc/index.html&quot; rel=&quot;noreferrer&quot;&gt;.&lt;/a&gt;&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;전처리기의 흥미로운 용도를 찾기 위한 &lt;a href=&quot;http://www.boost.org/doc/libs/1_38_0/libs/preprocessor/doc/index.html&quot; rel=&quot;noreferrer&quot;&gt;전처리기&lt;/a&gt;...&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;내가 가장 좋아하는 트릭 중 하나는 변수 개수의 인수를 매크로에 전달하는 방법인데, 나중에 printf와 같은 함수를 호출할 때 사용됩니다.&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;#define TRACE( allargs) do { printf allargs; } while ( 0)
...
TRACE(( &quot;%s %s\n&quot;, &quot;Help&quot;, &quot;me&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;#ifndef blah
    #define blah(x) // something fun
    #include __FILE__
    #undef blah
#endif

#ifndef blah
    #define blah(x) // something else that is also fun
    #include __FILE__
    #undef blah
#endif

#ifdef blah
    blah(foo)
    blah(bar)
#endif
&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;내장 코드의 경우 embeddedgurus.com 의 멋진 트릭을 사용하면 이진 값을 처리할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;B8(01010101) // 85
B16(10101010,01010101) // 43,605
B32(10000000,11111111,10101010,01010101) // 2,164,238,93
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이는 BOOST_BINARY에 대한 @Ferruccio의 이전 응답과 유사한 목표를 달성하는 것이지만, 약간의 확장이 이루어졌습니다.&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;// Internal Macros
#define HEX__(n) 0x##n##LU
#define B8__(x) ((x&amp;amp;0x0000000FLU)?1:0) \
  +((x&amp;amp;0x000000F0LU)?2:0) \
  +((x&amp;amp;0x00000F00LU)?4:0) \
  +((x&amp;amp;0x0000F000LU)?8:0) \
  +((x&amp;amp;0x000F0000LU)?16:0) \
  +((x&amp;amp;0x00F00000LU)?32:0) \
  +((x&amp;amp;0x0F000000LU)?64:0) \
  +((x&amp;amp;0xF0000000LU)?128:0)

// User-visible Macros
#define B8(d) ((unsigned char)B8__(HEX__(d)))
#define B16(dmsb,dlsb) (((unsigned short)B8(dmsb)&amp;lt;&amp;lt;8) + B8(dlsb))
#define B32(dmsb,db2,db3,dlsb) \
  (((unsigned long)B8(dmsb)&amp;lt;&amp;lt;24) \
  + ((unsigned long)B8(db2)&amp;lt;&amp;lt;16) \
  + ((unsigned long)B8(db3)&amp;lt;&amp;lt;8) \
  + B8(dlsb))
&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;기본값이 0이 아닌 구조 리터럴(0이 아닌), C99 가변 매크로 사용&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;struct Example {
   int from;
   int to;
   const char *name;
}

#define EXAMPLE(...) ((struct Example){.from=0, .to=INT_MAX, .name=&quot;&quot;, __VA_ARGS__})
&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;EXAMPLE(.name=&quot;test&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;name&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;. 이 섀도잉은 나중에 같은 멤버에 대한 언급과 함께 표준에 잘 정의되어 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;로깅은 매크로가 특히 자주 사용되는 한 곳입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#define LOG(log) \
  if (!log.enabled()) {} \
  else log.getStream() &amp;lt;&amp;lt; __FILE__ &amp;lt;&amp;lt; &quot;@&quot; &amp;lt;&amp;lt; __LINE__ &amp;lt;&amp;lt; &quot;: &quot;


log_t errorlog;
...

LOG(errorlog) &amp;lt;&amp;lt; &quot;This doesn't look good:&quot; &amp;lt;&amp;lt; somedata;
&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;#ifdef DEBUG
#define D(s) do { s; } while(0)
#else
#define D(s) do {/**/} while(0)
#endif
&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;D(printf(&quot;level %d, condition %s\n&quot;, level, condition));
&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;do{}while(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;code&gt;D(...)&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;for(i=1;i&amp;lt;10;++i) D(printf(&quot;x[%d]=%f\n&quot;,i,x[i]));
SomeReallyExpensiveFunction(x);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;만약 내가 그 경우에 오류를 던지게 할 수 있다면, 나는 그럴 것이지만, 그 전처리기는 다음을 말하기 위해 완전한 컴파일러 그 자체여야 할 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;D()&lt;/code&gt;&lt;font 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;핵심은 주장된 조건이 거짓이면 오류를 던지는 고유한 이름의 typedef를 구성하는 것입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;캐서트.h 우리는 다음을 가지고 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;/*! \brief Compile-time assertion.
 *
 *  Note that the cassert() macro generates no code, and hence need not
 *  be restricted to debug builds.  It does have the side-effect of
 *  declaring a type name with typedef.  For this reason, a unique
 *  number or string of legal identifier characters must be included
 *  with each invocation to avoid the attempt to redeclare a type.
 *
 *  A failed assertion will attempt to define a type that is an array
 *  of -1 integers, which will throw an error in any standards
 *  compliant compiler. The exact error is implementation defined, but
 *  since the defined type name includes the string &quot;ASSERTION&quot; it
 *  should trigger curiosity enough to lead the user to the assertion
 *  itself.
 *
 *  Because a typedef is used, cassert() may be used inside a function,
 *  class or struct definition as well as at file scope.
 */
#define cassert(x,i) typedef int ASSERTION_##i[(x)?1:-1]
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고 어떤 소스 파일에서는 어디서든 유형 디프가 합법적일 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#include &quot;cassert.h&quot;
...
cassert(sizeof(struct foo)==14, foo1);
...
&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;그것은 C로 컴파일될 많은 메시지 디스패치 글루를 쓸 때 특히 편리합니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;매크로를 주로 사용하는 곳은 자체 테스트 프레임워크입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예를 들어, 어떤 코드가 던져야 한다고 주장하고 싶을 때는 다음 매크로를 사용합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#define MUST_THROW( expr )                       
  try {                                
    (expr);                              
    (myth_suite_).Fail( #expr +                    
            std::string( &quot; should throw but didn't&quot; ) );  
  }                                  
  catch( ... ) {                            
  }                                  
&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;MUST_THROW( some_bogus_stuff() );
MUST_THROW( more_bogus_stuff() );
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;내가 그것들을 사용하는 유일한 다른 장소는 학급 선언문입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;매크로가 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#define CANNOT_COPY( cls )              \
  private:                              \
    cls( const cls &amp;amp; );                 \
    void operator=( const cls &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;pre&gt;&lt;code&gt;class BankAccount {

    CANNOT_COPY( BankAccount );
    ....
};
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것은 특별한 것을 하지 않지만 사람들의 관심을 끌며 쉽게 검색될 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사람은 반복되는 일을 단순화할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;열거형 목록&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;enum {
  kOneEnum,
  kTwoEnum,
  kThreeEnum,
  kFourEnum
};
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;...그리고 나중에 구조화된 방식으로 스위치 케이스를 수행합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#define TEST( _v ) \
    case k ## _v ## Enum: \
      CallFunction ## _v(); \
      break;

switch (c) {
    TEST( One   );
    TEST( Two   );
    TEST( Three );
    TEST( Four  );
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;em&gt;참고:&lt;/em&gt; 함수 포인터 배열을 사용하여 수행할 수도 있지만 매개 변수를 추가하고 단일 해시와 함께 문자열 확장을 사용할 수 있는 유연성을 조금 더 확보할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;...또는 문자열을 테스트하여 올바른 열거값을 가져옵니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;int value = -1;
char *str = getstr();

#define TEST( _v ) \
    if (!strcmp(# _v, str)) \
        value = k ## _v ## Enum

TEST( One   );
TEST( Two   );
TEST( Three );
TEST( Four  );
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;CrashRpt 프로젝트에서 매크로를 넓히고 다음을 정의하는 요령이 필요합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#define WIDEN2(x) L ## x 
#define WIDEN(x) WIDEN2(x)
std::wstring BuildDate = std::wstring(WIDEN(__DATE__)) + L&quot; &quot; + WIDEN(__TIME__);
&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;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;
#include &amp;lt;limits.h&amp;gt;
#include &amp;lt;string.h&amp;gt;

#define DEFINE_BITS_STR(name, type)               \
char *bits_str_##name(type value)                 \
{                                                 \
    int len = sizeof(type) * CHAR_BIT;            \
    char *result;                                 \
    type n;                                       \
    int i;                                        \
                                                  \
    result = (char *)calloc(len+1, sizeof(type)); \
    if(result == NULL)                            \
        return NULL;                              \
                                                  \
    memset(result, '0', len);                     \
    result[len] = 0x00;                           \
                                                  \
    n = value;                                    \
    i = len;                                      \
    while(n)                                      \
    {                                             \
        if(n &amp;amp; 1)                                 \
            result[i] = '1';                      \
                                                  \
        n &amp;gt;&amp;gt;= 1;                                  \
        --i;                                      \
    }                                             \
                                                  \
    return result;                                \
}

DEFINE_BITS_STR(uchar, unsigned char)
DEFINE_BITS_STR(uint, unsigned int)
DEFINE_BITS_STR(int, unsigned int)

int main()
{
    unsigned char value1 = 134;
    unsigned int value2 = 232899;
    int value3 = 255;
    char *ret;

    ret = bits_str_uchar(value1);
    printf(&quot;%d: %s\n&quot;, value1, ret);

    ret = bits_str_uint(value2);
    printf(&quot;%d: %s\n&quot;, value2, ret);

    ret = bits_str_int(value3);
    printf(&quot;%d: %s\n&quot;, value3, ret);

    return 1;
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 예제에서는 세 가지 함수를 정의합니다(&lt;/font&gt;&lt;/font&gt;&lt;code&gt;bits_str_uchar()&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;bits_str_uint()&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;bits_str_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;unsigned char&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;unsigned int&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;int&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;). 그러나 모두 전달된 값의 비트가 포함된 문자열을 반환합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;COM 서버를 구현할 때 코드에서 발생할 수 있는 모든 예외를 처리해야 합니다. COM 메서드 경계를 통해 예외를 허용하면 호출 응용 프로그램이 자주 중단됩니다.&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;try&quot;를 포함하는 매크로인 오프닝 브래킷과 &quot;catch&quot;를 포함하는 클로징 브래킷이 있으며 ErrorInfo로 예외를 래핑하고 HRESULT를 생성합니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;마이크로 컨트롤러에서는 하드웨어 중단점이 많은 단점을 가지고 있기 때문에 UART를 사용하여 코드를 디버그하는 것이 일반적입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이는 매우 유용한 것으로 입증된 간단한 매크로입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#define DEBUG_OUT(value) sprintf(uartTxBuf, &quot;%s = 0x%04X\n&quot;, #value, value);\
                         puts_UART((uint16_t *) uartTxBuf)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사용 예:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;for (i=0; i &amp;lt; 4; i++)
{
    DEBUG_OUT(i);
    DEBUG_OUT(i % 3);
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;받은 스트림:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;i = 0x0000
i % 3 = 0x0000
i = 0x0001
i % 3 = 0x0001
i = 0x0002
i % 3 = 0x0002
i = 0x0003
i % 3 = 0x0000
&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;C++ Unit Testing 프레임워크는 매크로를 기반으로 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;https://github.com/unittest-cpp/unittest-cpp&quot; rel=&quot;nofollow noreferrer&quot;&gt;UnitTest++&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;a href=&quot;http://www.boost.org/doc/libs/1_38_0/libs/utility/utility.htm#BOOST_BINARY&quot; rel=&quot;nofollow noreferrer&quot;&gt;BOOST_BINARY&lt;/a&gt; 매크로는 C++에게 숫자 상수를 이진법으로 표현할 수 있는 기능을 제공하기 위해 몇 가지 수준의 사전 프로세서 트릭을 수행합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;단, 0-255로 제한됩니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;http://math.arizona.edu/~swig/documentation/pthreads/pt.h&quot; rel=&quot;nofollow noreferrer&quot;&gt;pthreads 유틸리티 매크로&lt;/a&gt;는 특히 인상적인 IMHO입니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;3GPP RRC/NBAP/RNSAP에 사용되는 것과 같은 거대한 c/c++ 중첩 구조를 작업할 때, 나는 코드를 깨끗하게 보이기 위해 이 방법을 따릅니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;struct leve1_1
{
  int data;

  struct level2
  {
    int data;

    struct level3
    {
      int data;
    } level_3_data;

  } level_2_data;

} level_1_data;

level_1_data.data = 100;

#define LEVEL_2 leve1_1_data.level_2_data
LEVEL_2.data = 200;

#define LEVEL_3 LEVEL_2.level_3_data
LEVEL_3.data = 300;

#undef LEVEL_2
#undef LEVEL_3
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이를 통해 유지보수 시간 동안 생활이 한결 수월해질 것입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;또한 디자인 시간과 코드는 읽을 수 있을 것입니다.&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;void _zero_or_die(int v, const char* filename, int line)
{
    if (v != 0)
    {
       fprintf(stderr, &quot;error %s:%d\n&quot;, filename, line);
       exit(1);
    }
}

#define ZERO_OR_DIE_ for (int _i=1; _i == 1; _zero_or_die(_i, __FILE__, __LINE__)) _i=



ZERO_OR_DIE_   pipe(fd);
ZERO_OR_DIE_   close(0);
ZERO_OR_DIE_   sigaction(SIGSEGV, &amp;amp;sigact, NULL);
ZERO_OR_DIE_   pthread_mutex_lock(&amp;amp;mt);
ZERO_OR_DIE_   pthread_create(&amp;amp;pt, NULL, func, NULL);
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 이걸 자주 써요.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;debug.h&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;헤더는 다음과 같이 정의합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#ifndef DEBUG_H
#define DEBUG_H
    #ifdef DEBUG
    #define debuf if(1)
    #else
    #define debug if(0)
    #endif
#endif
&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;debug {
   printf(&quot;message from debug!&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;&quot;message from debug!&quot;&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;message, 컴파일:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;gcc -D DEBUG foo.c
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그렇지 않으면 아무 일도 일어나지 않습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Gcc는 매우 똑똑한 컴파일러입니다. 만약&lt;/font&gt;&lt;/font&gt;&lt;code&gt;DEBUG&lt;/code&gt;&lt;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(0)&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;(dead code)는 일부 최적화 기능을 설정한 상태에서 코드에서 제거됩니다.&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;debug 
{
   pritnf(&quot;I'm in debug mode!\n&quot;);
} 
else 
{
  printf(&quot;I'm not in debug mode\n&quot;);
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;얼마 전에 D &lt;a href=&quot;http://dlang.org/index.html&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;pre&gt;&lt;code&gt;#define in_debug if(1)
#define not_debug else
&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;in_debug {
  printf(&quot;I'm in debug mode!&quot;);
}
not_debug {
  printf(&quot;Not in debug mode!&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;다음은 for loop의 예입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;

#define loop(i,x) for(i=0; i&amp;lt;x; i++)

int main(int argc, char *argv[])
{
    int i;
    int x = 5;
    loop(i, x)
    {
        printf(&quot;%d&quot;, i); // Output: 01234
    } 
    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/650461/what-are-some-tricks-i-can-use-with-macros&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>C</category>
      <author>muds</author>
      <guid isPermaLink="true">https://muds.tistory.com/1496</guid>
      <comments>https://muds.tistory.com/1496#entry1496comment</comments>
      <pubDate>Tue, 7 Nov 2023 21:09:44 +0900</pubDate>
    </item>
    <item>
      <title>C/C++에서 OpenGL 셰이더를 위한 손쉬운 프레임워크</title>
      <link>https://muds.tistory.com/1495</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;C/C++에서 OpenGL 셰이더를 위한 손쉬운 프레임워크&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;사진을 텍스처로 찍어 적용하는 C 프로그램을 작성하는 것은 그리 쉽지 않은 것으로 드러났습니다. 그 위에 프래그먼트 쉐이더로 가우스 블러를 적용하는 것입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;코드 100줄 같은 OpenGL을 초기화하고 GL 버퍼 등을 이해해야 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;또한 윈도잉 시스템과 통신하기 위해서는 또 다른 프레임워크인 GLUT를 사용해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;엔비디아의 Fx 작곡가가 쉐이더를 가지고 놀기에 좋은 것으로 드러났습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하지만 저는 주어진 프래그먼트 쉐이더를 이미지에 적용해서 그 결과를 보여주는 간단한 C나 C++ 프로그램을 가지고 싶습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예를 든 사람이 있습니까, 아니면 틀이 있습니까?&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;무엇보다도, 저는 과도한 양을 사용하는 것을 피하고자 합니다. 그것은 버그가 많고, 약 10년 동안 업데이트되지 않았고, 그것의 디자인은 오늘날 대부분의 사람들이 원하는 것과 잘 맞지 않습니다. 예를 들어, 애니메이션에 사용할 수 &lt;em&gt;있지만&lt;/em&gt;, 그것은 주로 정적인 디스플레이를 만들기 위한 것입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 &lt;a href=&quot;https://stackoverflow.com/questions/2254706/how-to-start-developing-with-opengl-and-c-what-tools-do-i-need-to-install-on-w/2254966#2254966&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;class shader_prog {
    GLuint vertex_shader, fragment_shader, prog;

    template &amp;lt;int N&amp;gt;
    GLuint compile(GLuint type, char const *(&amp;amp;source)[N]) {
        GLuint shader = glCreateShader(type);
        glShaderSource(shader, N, source, NULL);
        glCompileShader(shader);
        GLint compiled;
        glGetShaderiv(shader, GL_COMPILE_STATUS, &amp;amp;compiled);
        if (!compiled) {
            GLint length;
            glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &amp;amp;length);
            std::string log(length, ' ');
            glGetShaderInfoLog(shader, length, &amp;amp;length, &amp;amp;log[0]);
            throw std::logic_error(log);
            return false;
        }
        return shader;
    }
public:
    template &amp;lt;int N, int M&amp;gt;
    shader_prog(GLchar const *(&amp;amp;v_source)[N], GLchar const *(&amp;amp;f_source)[M]) {
        vertex_shader = compile(GL_VERTEX_SHADER, v_source);
        fragment_shader = compile(GL_FRAGMENT_SHADER, f_source);
        prog = glCreateProgram();
        glAttachShader(prog, vertex_shader);
        glAttachShader(prog, fragment_shader);
        glLinkProgram(prog);
    }

    operator GLuint() { return prog; }
    void operator()() { glUseProgram(prog); }

    ~shader_prog() {
        glDeleteProgram(prog);
        glDeleteShader(vertex_shader);
        glDeleteShader(fragment_shader);
    }
};
&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;const GLchar *vertex_shader[] = {
    &quot;void main(void) {\n&quot;,
    &quot;    gl_Position = ftransform();\n&quot;,
    &quot;    gl_FrontColor = gl_Color;\n&quot;,
    &quot;}&quot;
};

const GLchar *color_shader[] = {
    &quot;void main() {\n&quot;,
    &quot;    gl_FragColor = gl_Color;\n&quot;,
    &quot;}&quot;
};
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음과 같은 것을 사용할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;void draw() { 
    // compile and link the specified shaders:
    static shader_prog prog(vertex_shader, color_shader);

    // Use the compiled shaders:    
    prog(); 

    // Draw something:
    glBegin(GL_TRIANGLES);
        glColor3f(0.0f, 0.0f, 1.0f);
        glVertex3f(-1.0f, 0.0f, -1.0f);
        glColor3f(0.0f, 1.0f, 0.0f);
        glVertex3f(1.0f, 0.0f, -1.0f);
        glColor3f(1.0f, 0.0f, 0.0f);
        glVertex3d(0.0, -1.0, -1.0);
    glEnd();
}
&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;prog1();&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;prog2();&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;void draw() { 
    static shader_prog wall_shader(&quot;wall_vertex&quot;, &quot;wall_frag&quot;);
    static shader_prog skin_shader(&quot;skin_vertex&quot;, &quot;skin_frag&quot;);

    wall_shader();
    draw_walls();

    skin_shader();
    draw_skin();
}
&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;편집: @rotoglup이 정확히 지적한 바와 같이, 이 사용은&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;변수는 OpenGL 컨텍스트가 파괴된 후까지 파괴를 지연하므로 파괴자가 사용을 시도할 때&lt;/font&gt;&lt;/font&gt;&lt;code&gt;glDeleteProgram&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;/&lt;/font&gt;&lt;/font&gt;&lt;code&gt;glDeleteShader&lt;/code&gt;&lt;font 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;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;class some_character_type { 
    shader_prog skin_shader;
public:
    // ...
};
&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;예를 들어, 갈라가나 센티페데와 같은 고대의 &quot;많은 목표물을 죽인다&quot;는 게임의 3D 버전을 생각해 보세요.&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;shared_ptr&amp;lt;shader_prog&amp;gt;&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;특정 대상 유형의 모든 인스턴스 간에 공유되는 쉐이더의 단일 인스턴스를 생성합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;동일한 타겟 타입을 여러 번 다시 사용하는 것을 고려할 때, 그보다 조금 더 나아가기를 원할 수도 있기 때문에 특정 타입의 타겟이 보여질 때만이 아니라 전체 게임을 통해 동일한 쉐이더를 유지하게 됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/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; 비용이 많이 드는 과정이기 때문에 일반적으로 쉐이더를 생성하고 파괴하는 것을 피하기 위해 수명을 관리하기를 원한다는 것입니다(하지만 게임 초반에 쉐이더를 모두 생성하고 마지막에만 파괴하는 것이 중요하다는 것은 아닙니다).&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;약 1년 반 전에도 저는 비슷한 입장이었습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;GLSL을 사용하기 위한 간단한 튜토리얼과 소스 코드를 빠르게 찾았습니다. 하지만 GLUT와 GLW를 작동시켜야 했고, 적어도 하나는 내가 직접 컴파일한 것 같습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Windows(윈도우)를 사용하고 있었기 때문에(Windows(윈도우)는 표준이 아닌 특수한 경우로, 오픈 프로젝트에서는 거의 완벽하게 처리되지 않습니다.) DLL과 헤더 파일을 수동으로 복사하여 특정 공통 위치에 붙여넣어야 하는 우스꽝스러운 프로세스도 수반되었습니다.&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;어쨌든 지금 찾을 수 있는 GLSL을 이용한 가장 편리한 쉐이더 예는 이것입니다 - http://www.lighthouse3d.com/opengl/glsl/index.php?minimal&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;유감스럽게도 GLUT와 GLW를 활용하고 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;만약 당신이 이 질문에 대한 더 좋은 답변을 얻게 된다면, 저도 어느 사이트에서 코드를 제공하든 즉시 팬이 될 것입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;행운을 빌어요.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;http://www.mathematik.uni-dortmund.de/~goeddeke/gpgpu/tutorial.html&quot; rel=&quot;nofollow noreferrer&quot;&gt;이&lt;/a&gt; 자습서는 유용할 수 있습니다(이전 Cg 내용 외에 GLSL 자료도 포함되어 있음).&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그래픽이 아닌 GPGPU 형태의 것들을 구현하기 위해 쉐이더를 쓰는 것은 요즘에는 쓸모없는 접근법이라고 생각합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;OpenCL 또는 CUDA는 분명히 미래에 가야 할 방향입니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;목표는 아니지만 Noel Lopis의 OpenGL ES 2.0 쉐이더 샘플에서 무언가를 얻을 수 있습니다. http://www.mobileorchard.com/getting-started-with-opengl-es-20-on-the-iphone-3gs/&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/2795044/easy-framework-for-opengl-shaders-in-c-c&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>C</category>
      <author>muds</author>
      <guid isPermaLink="true">https://muds.tistory.com/1495</guid>
      <comments>https://muds.tistory.com/1495#entry1495comment</comments>
      <pubDate>Tue, 7 Nov 2023 21:09:29 +0900</pubDate>
    </item>
    <item>
      <title>PHP oci_connect() TNS: 연결 식별자(ORA-12154)를 확인할 수 없습니다.</title>
      <link>https://muds.tistory.com/1494</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;PHP oci_connect() TNS: 연결 식별자(ORA-12154)를 확인할 수 없습니다.&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;우분투 서버에서 PHP 코드를 테스트하고 있는데 &quot;tnsping&quot; 명령으로 오라클 데이터베이스 연결이 확인됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-none prettyprint-override&quot;&gt;&lt;code&gt;Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.3.14)(PORT = 1521)) (CONNECT_DATA = (SERVICE_NAME = ORCL) (SID = ORCL)))
OK (10 msec)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러나 PHP의 occi_connect 함수는 다음과 같은 경고를 표시합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;경고: oci_connect(): ORA-12154: TNS: 라인 62의 /usr/local/ipm5/wui/manager/123.bih에 지정된 연결 식별자를 확인할 수 없습니다.&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;물론 OCI8은 활성화되어 있으며(phpinfo를 통해 확인됨) 일부 환경(&lt;/font&gt;&lt;/font&gt;&lt;code&gt;PATH&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ORACLE_BASE&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ORACLE_HOME&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ORACLE_SID&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;TNS_ADMIN&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;LD_LIBRARY_PATH&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;) 변수를 다음과 같이 설정합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;/etc/bash.bashrc&lt;/code&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;추천해주실 분 계신가요?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;무엇이 문제인지.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;ORCL 대신 전체 문자열을 oci_connect에 넣을 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.3.14)(PORT = 1521)) (CONNECT_DATA = (SERVICE_NAME = ORCL) (SID = ORCL)))
&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;oci_connect($username, $password, '(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.3.14)(PORT = 1521)) (CONNECT_DATA = (SERVICE_NAME = ORCL) (SID = ORCL)))');
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;phpinfo() output &quot;Environment&quot; 부분을 확인합니다. ORACRAL_HOME, TNS_ADMIN이 없다면 php_module로 컴파일된 아파치에 대해 PHP 실행 환경에서 사용할 수 있도록 해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;export ORACLE_HOME=/path/to/oracle_home
export TNS_ADMIN=/path/to/tns_admin
apachectl start
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;php-cgi 또는 php-fpm의 경우&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;export ORACLE_HOME=/path/to/oracle_home
export TNS_ADMIN=/path/to/tns_admin
/script/to/start/fpm
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이는 연결할 수 없는 원격 데이터베이스를 사용하거나 VPN 연결에 액세스해야 하는 경우에도 발생할 수 있습니다.&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/20345605/php-oci-connect-tnscould-not-resolve-the-connect-identifier-ora-12154&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>oracle</category>
      <author>muds</author>
      <guid isPermaLink="true">https://muds.tistory.com/1494</guid>
      <comments>https://muds.tistory.com/1494#entry1494comment</comments>
      <pubDate>Tue, 7 Nov 2023 21:09:21 +0900</pubDate>
    </item>
    <item>
      <title>Python으로 Excel에서 병합된 셀 읽기</title>
      <link>https://muds.tistory.com/1493</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Python으로 Excel에서 병합된 셀 읽기&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;xlrd를 이용하여 python으로 엑셀의 merged cell을 읽으려고 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;My Excel: (첫번째 열은 세 행에 걸쳐 병합됨)&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-none prettyprint-override&quot;&gt;&lt;code&gt;    A   B   C
  +---+---+----+
1 | 2 | 0 | 30 |
  +   +---+----+
2 |   | 1 | 20 |
  +   +---+----+
3 |   | 5 | 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;이 예제에서 첫번째 열의 세번째 줄을 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&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;all_data = [[]]
excel = xlrd.open_workbook(excel_dir+ excel_file)
sheet_0 = excel.sheet_by_index(0) # Open the first tab

for row_index in range(sheet_0.nrows):
    row= &quot;&quot;
    for col_index in range(sheet_0.ncols):
        value = sheet_0.cell(rowx=row_index,colx=col_index).value             
        row += &quot;{0} &quot;.format(value)
        split_row = row.split()   
    all_data.append(split_row)
&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;'2', '0', '30'
'1', '20'
'5', '52'
&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;'2', '0', '30'
'2', '1', '20'
'2', '5', '52'
&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-python prettyprint-override&quot;&gt;&lt;code&gt;all_data = []
excel = xlrd.open_workbook(excel_dir+ excel_file)
sheet_0 = excel.sheet_by_index(0) # Open the first tab

prev_row = [None for i in range(sheet_0.ncols)]
for row_index in range(sheet_0.nrows):
    row= []
    for col_index in range(sheet_0.ncols):
        value = sheet_0.cell(rowx=row_index,colx=col_index).value
        if len(value) == 0:
            value = prev_row[col_index]
        row.append(value)
    prev_row = row
    all_data.append(row)
&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-none prettyprint-override&quot;&gt;&lt;code&gt;[['2', '0', '30'], ['2', '1', '20'], ['2', '5', '52']]
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이전 행의 값을 추적하고 현재 행의 해당 값이 비어 있으면 이 값을 사용합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;위 코드는 주어진 셀이 실제로 병합된 셀 집합의 일부인지 여부를 확인하지 않으므로 셀이 실제로 비어 있어야 할 경우 이전 값을 복제할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그래도 도움이 될지도 모르겠네요.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;추가 정보:&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그 후 병합된 셀의 다양한 범위에 포함된 셀을 결정하는 데 사용할 수 있는 속성에 대해 설명하는 문서 페이지를 찾았습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;설명서에는 &quot;버전 0.6.1의 새 버전&quot;이라고 되어 있는데, xlrd-0.9.3과 함께 사용하려고 했을 때 설치된 것으로 되어 있었습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;pip&lt;/code&gt;&lt;font 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;구현되지 않음 오류: formating_info=True가 아직 구현되지 않았습니다.&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;저는 특별히 다른 버전의 xlrd를 추적해서 테스트할 생각은 없습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;merged_cells&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;feature, 하지만 만약 위의 코드가 당신의 요구에 불충분하고 당신이 내가 했던 것과 같은 오류를 마주친다면 당신은 그렇게 하는 것에 흥미를 느낄지도 모릅니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;formatting_info=True&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;팬더 https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.fillna.html 에서 사용할 수 있는 필나 방법을 사용해 볼 수도 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;df = pd.read_excel(dir+filename,header=1)
df[ColName] = df[ColName].fillna(method='ffill')
&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;병합된 셀을 처리하려는 사람들을 위해, OP가 요청한 방식이지만 병합되지 않은 빈 셀을 덮어쓰지는 않습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;OP의 코드와 @gordthompson의 답변과 @stavinsky의 코멘트를 바탕으로 다음 코드는 엑셀파일(xls, xlsx)에 적용될 것이며, 엑셀파일의 첫번째 시트를 데이터 프레임으로 읽을 것입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;원래 포스터에서 요청한 대로 병합된 이 셀이 나타내는 모든 셀에 병합된 셀 내용이 복제됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;'xls' 파일에 대한 xlrd의 merged_cell 기능은 워크북을 여는 동안 'formating_info' 매개 변수가 전달된 경우에만 작동합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;import pandas as pd
filepath = excel_dir+ excel_file
if excel_file.endswith('xlsx'):
    excel = pd.ExcelFile(xlrd.open_workbook(filepath), engine='xlrd')
elif excel_file.endswith('xls'):
    excel = pd.ExcelFile(xlrd.open_workbook(filepath, formatting_info=True), engine='xlrd')
else:
    print(&quot;don't yet know how to handle other excel file formats&quot;)
sheet_0 = excel.sheet_by_index(0) # Open the first tab
df = xls.parse(0, header=None) #read the first tab as a datframe

for e in sheet_0.merged_cells:
    rl,rh,cl,ch = e
    print e
    base_value = sheet1.cell_value(rl, cl)
    print base_value
    df.iloc[rl:rh,cl:ch] = base_value
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;XLRD 병합 셀 사용&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;ExcelFile = pd.read_excel(&quot;Excel_File.xlsx&quot;)
xl = xlrd.open_workbook(&quot;Excel_File.xlsx&quot;)
FirstSheet = xl.sheet_by_index(0)
for crange in FirstSheet.merged_cells:
    rlo, rhi,clo, chi = crange
    for rowx in range(rlo,rhi):
        for colx in range(clo,chi):
            value = FirstSheet.cell(rowx,colx).value
        if len(value) == 0:
            ExcelFile.iloc[rowx-1,colx] = FirstSheet.cell(rlo,clo).value
&lt;/code&gt;&lt;/pre&gt;&lt;h1&gt;&lt;font papago-translate=&quot;translated&quot;&gt;xlwings 사용&lt;/font&gt;&lt;/h1&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;# Import libraries like VBA
import xlwings as xw
# Read content of workbook
wb = xw.Book(Your_file with xlsx)
# Read first Sheet of workbook
Sheet1=wb.sheets[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;def VMC(Sheet1, x):
    # Get index of a cell 
    row=Sheet1[x].row
    column=Sheet1[x].column
    # Get first non-empty row
    if Sheet1[x].merge_cells:
        i=1
        while Sheet1[row-i,column-1:column].merge_cells:
            i+=1
        t=Sheet1[row-i+1,column-1:column].value
    else:
        t=Sheet1[row-i+1,column-1:column].value
    return t
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러면 그렇게 예를 들 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;a=VMC(Sheet1, 'D'+str(row_index_first))
a
&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;/p&gt; 
&lt;pre&gt;&lt;code&gt;sheet = book.sheet_by_index(0)
all_data = []

for row_index in range(sheet.nrows):
    row = []
    for col_index in range(sheet.ncols):
        valor = sheet.cell(row_index,col_index).value
        if valor == '':
            for crange in sheet.merged_cells:
                rlo, rhi, clo, chi = crange
                if rlo &amp;lt;= row_index and row_index &amp;lt; rhi and clo &amp;lt;= col_index and col_index &amp;lt; chi:
                    valor = sheet.cell(rlo, clo).value
                    break
        row.append(valor)
    all_data.append(row)

print(all_data)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;앞으로 누군가에게 도움이 되었으면 좋겠습니다.&lt;/font&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;openpyxl.worksheet.merged_cell_ranges
&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;['A1:M1', 'B22:B27']&lt;/code&gt;&lt;font 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;openpyxl.worksheet.merged_cells
&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/30727017/read-merged-cells-in-excel-with-python&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>Excel</category>
      <author>muds</author>
      <guid isPermaLink="true">https://muds.tistory.com/1493</guid>
      <comments>https://muds.tistory.com/1493#entry1493comment</comments>
      <pubDate>Tue, 7 Nov 2023 21:09:15 +0900</pubDate>
    </item>
    <item>
      <title>그래들을 통해 지프스터 프로젝트를 만들고 있는데, 첫 번째 프로젝트는 잘 실행되지만 두 번째 프로젝트는 예외가 있습니까?</title>
      <link>https://muds.tistory.com/1492</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그래들을 통해 지프스터 프로젝트를 만들고 있는데, 첫 번째 프로젝트는 잘 실행되지만 두 번째 프로젝트는 예외가 있습니까?&lt;/font&gt;&lt;/h2&gt;
&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;원인: org.spring framework.&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;[org.springframework.data.elasticsearch.repository]를 인스턴스화하지 못했습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;지지하다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;NumberKeyedRepository]:&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;생성자가 예외를 던졌습니다. 중첩 예외는 com.gitub.vanroy.springdata.jest.exception입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;JestElasticsearchException: jest 액션을 실행할 수 없습니다. 응답 코드: 400, 오류: {&quot;root_cause&quot;:&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;[{&quot;type&quot;]:&quot;index_already_exists_exception&quot;, 이유:&quot;index [user/37]&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;YxejngRkiJQ4GXn082kQ]이(가) 이미 있습니다.&quot;,index_uuid&quot;:&quot;37&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;YxejngRkiJQ4GXn082kQ&quot;,index&quot;:&quot;user&quot;},type&quot;:&quot;index_이미_exists_exception&quot;,reason&quot;:&quot;index [user/37]&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;YxejngRkiJQ4GXn082kQ]이(가) 이미 있습니다.&quot;,index_uuid&quot;:&quot;37&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;YxejngRkiJQ4GXn082kQ&quot;, &quot;index&quot;:&quot;user&quot;}, 메시지: null&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/52426243/im-build-jhipster-project-through-gradle-first-time-project-run-fine-but-secon&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>MariaDB</category>
      <author>muds</author>
      <guid isPermaLink="true">https://muds.tistory.com/1492</guid>
      <comments>https://muds.tistory.com/1492#entry1492comment</comments>
      <pubDate>Tue, 7 Nov 2023 21:09:07 +0900</pubDate>
    </item>
    <item>
      <title>비주얼 스튜디오 코드로 Debug &amp;amp; Run Angular2 타입스크립트?</title>
      <link>https://muds.tistory.com/1491</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;비주얼 스튜디오 코드로 Debug &amp;amp; Run Angular2 타입스크립트?&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;비주얼 스튜디오 코드로 Debug &amp;amp; Run Angular2 타입스크립트?&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;VS 코드 https://angular.io/guide/quickstart 로 Angular2 typescript 응용 프로그램을 디버깅하려고 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;VS 코드에서 디버그하고 실행하는 단계를 공유해 줄 수 있는 사람?&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;시작하기 전에 VS 코드의 최신 버전이 있는지 확인합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;최신 버전을 확인할 수 있습니다 – [도움말] &amp;gt; [업데이트 확인] 또는 [정보].&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;'Debugger for Chrome'이라는 확장 프로그램을 설치합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;설치가 완료되면 VS 코드를 다시 시작합니다.&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;디버그 창으로 이동하여 Chrome을 사용하여 launch.json을 엽니다.&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Launch.json configuration 섹션에서 아래 config를 사용합니다.&lt;/font&gt;&lt;/p&gt; &lt;pre&gt;&lt;code&gt;{
    &quot;name&quot;: &quot;Launch localhost with sourcemaps&quot;,
    &quot;type&quot;: &quot;chrome&quot;,
    &quot;request&quot;: &quot;launch&quot;,
    &quot;url&quot;: &quot;http://localhost:3000/Welcome&quot;,
    &quot;sourceMaps&quot;: true,
    &quot;webRoot&quot;: &quot;${workspaceRoot}&quot;
}
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;tsconfig.json에서 &quot;sourceMap&quot;: true가 있는지 확인합니다.&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;font papago-translate=&quot;translated&quot;&gt;이제 디버깅을 시작하기 전에 기존의 모든 Chrome을 확인합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예를 닫았습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;작업 관리자에서 확인하거나 DOS 명령 'kill all chrome' 사용&lt;/font&gt;&lt;/p&gt; 
&lt;ol start=&quot;5&quot;&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;npm start 명령어와 Chrome을 기본 브라우저로 사용하여 프로젝트를 실행합니다.&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;애플리케이션이 성공적으로 실행되면 포트 번호를 받게 됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;크롬 브라우저에서 URL을 복사하여 위의 URL 섹션에 붙여넣습니다. (참고: 응용프로그램에서 라우팅을 사용하는 경우 url은 위에서 ending index.html 등이 됩니다.)&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;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다시 VS 코드의 디버그 창으로 이동하여 Run을 누릅니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;디버거에 연결된 탭/인스턴스는 다음과 같습니다.&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p&gt;&lt;a href=&quot;https://i.stack.imgur.com/MQ6w6.png&quot; rel=&quot;noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/MQ6w6.png&quot; alt=&quot;Chrome Debugging&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;userDataDir 지정 - 이미 실행 중인 다른 Chrome 인스턴스와의 충돌을 방지합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 때문에 Chrome은 지정한 포트에서 수신을 중단합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아래는 제가 사용하는 것이고 아주 좋습니다!&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;{
    &quot;name&quot;: &quot;Launch&quot;,
    &quot;type&quot;: &quot;chrome&quot;,
    &quot;request&quot;: &quot;launch&quot;,
    &quot;url&quot;: &quot;http://localhost:3000/#/about&quot;,
    &quot;port&quot;: 9223,
    &quot;sourceMaps&quot;: true,
    &quot;diagnosticLogging&quot;: true,
    &quot;webRoot&quot;: &quot;${workspaceRoot}&quot;,
    &quot;userDataDir&quot;: &quot;${workspaceRoot}/out/chrome&quot;
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;@reecebradley 덕분에 - &lt;a href=&quot;https://github.com/Microsoft/vscode-chrome-debug/issues/111#issuecomment-225101947&quot; rel=&quot;noreferrer&quot;&gt;GitHub: 대상에 연결&lt;/a&gt;할 수 &lt;a href=&quot;https://github.com/Microsoft/vscode-chrome-debug/issues/111#issuecomment-225101947&quot; rel=&quot;noreferrer&quot;&gt;없습니다: connect ECONREFUSED&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;인터넷을 횡단한 후 github의 스레드에서 해결책을 찾았습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://github.com/AngularClass/angular2-webpack-starter/issues/144#issuecomment-218721972&quot; rel=&quot;noreferrer&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;https://github.com/AngularClass/angular2-webpack-starter/issues/144#issuecomment-218721972&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;strong&gt;참고:-&lt;/strong&gt; 시작하기 전에 최신 버전의 비주얼 스튜디오 코드가 있는지 확인하고 VS Code에 '&lt;a href=&quot;https://code.visualstudio.com/blogs/2016/02/23/introducing-chrome-debugger-for-vs-code&quot; rel=&quot;noreferrer&quot;&gt;Debugger for Chrome&lt;/a&gt;'라는 확장 프로그램을 설치해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;먼저 '.config/webpack.dev.js'에서&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;=&amp;gt; devtool &lt;em&gt;사용:&lt;/em&gt; '&lt;em&gt;source-map'&lt;/em&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;=&amp;gt; devtool &lt;em&gt;대신: &lt;/em&gt;'cheap- module-source-map'&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그런 다음 write-file-webpack-plugin을 설치하고 사용합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;em&gt;&lt;font papago-translate=&quot;translated&quot;&gt;npm install --save write-file-webpack-&lt;/font&gt;&lt;/em&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음을 추가하여 플러그인을 '..config/webpack.dev.js'에 추가합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;em&gt;&lt;font papago-translate=&quot;translated&quot;&gt;const WriteFilePlugin = 필수 ('write-file-webpack-plugin')&lt;/font&gt;&lt;/em&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;상단의 웹팩 플러그인 아래에 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;계속 추가:&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;em&gt;&lt;font papago-translate=&quot;translated&quot;&gt;새 쓰기 파일 플러그인()&lt;/font&gt;&lt;/em&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;새 DefinePlugin() 이후의 플러그인 목록으로 이동합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;plugins:[
    new DefinePlugin({....}),
    new WriteFilePlugin(),
    ....
]
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong&gt;&lt;em&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이렇게 하면 소스 맵이 디스크에 기록됩니다.&lt;/font&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;마지막으로 저의 launch.json은 아래와 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;{
    &quot;version&quot;: &quot;0.2.0&quot;,
    &quot;configurations&quot;: [{
        &quot;name&quot;: &quot;Launch Chrome against localhost, with sourcemaps&quot;,
        &quot;type&quot;: &quot;chrome&quot;,
        &quot;request&quot;: &quot;launch&quot;,
        &quot;url&quot;: &quot;http://localhost:3000/&quot;,
        &quot;runtimeArgs&quot;: [
           &quot;--user-data-dir&quot;,
           &quot;--remote-debugging-port=9222&quot;
        ],
        &quot;sourceMaps&quot;: true,
        &quot;diagnosticLogging&quot;: true,
        &quot;webRoot&quot;: &quot;${workspaceRoot}&quot;,
        &quot;userDataDir&quot;: &quot;${workspaceRoot}/.vscode/chrome&quot;
    },
    {
        &quot;name&quot;: &quot;Attach to Chrome, with sourcemaps&quot;,
        &quot;type&quot;: &quot;chrome&quot;,
        &quot;request&quot;: &quot;attach&quot;,
        &quot;url&quot;: &quot;http://localhost:3000/&quot;,
        &quot;port&quot;: 9222,
        &quot;sourceMaps&quot;: true,
        &quot;diagnosticLogging&quot;: true,
        &quot;webRoot&quot;: &quot;${workspaceRoot}&quot;
    }]
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;webroot에 '/dist/'이(가) 없습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 구성을 사용하면 source-maps는 ./dist/에 있지만 ./src/를 가리킵니다. vScode는 절대 루트를 작업 공간 앞에 붙이고 파일을 올바르게 확인합니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음은 VSCode https://code.visualstudio.com/docs/nodejs/angular-tutorial#_configure-the-chrome-debugger 에서 Angular를 디버깅하는 방법에 대한 공식 비주얼 스튜디오 코드 설명서입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;클라이언트 측 Angular code를 디버깅하려면 Debugger for Chrome 확장자를 설치해야 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;확장 보기(Ctrl+Shift+X)를 열고 검색 상자에 '크롬'을 입력합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Chrome을 참조하는 몇 가지 확장 기능을 볼 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;크롬용 디버거 설치 버튼을 누릅니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;버튼이 Installing(설치)으로 바뀌면 설치가 완료되면 Reload(재로드)로 바뀝니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Reload를 눌러 VS Code를 다시 시작하고 확장을 활성화합니다.&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;이렇게 하려면 디버그 보기(Ctrl+Shift+D)로 이동하고 gear 버튼을 클릭하여 lunch.json 디버거 구성 파일을 만듭니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Select Environment(환경 선택) 드롭다운에서 Chrome(크롬)을 선택합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이렇게 하면 프로젝트의 새 .vscode 폴더에 lunch.json 파일이 생성됩니다. 여기에는 웹 사이트를 시작하거나 실행 중인 인스턴스에 연결하는 구성이 모두 포함됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예를 들어 포트를 8080에서 4200으로 변경해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 이 문제에 대해 문제가 있었고 @Sankets 답변이 도움이 된 반면 https://github.com/angular/angular-cli/issues/2453 은 이 문제를 해결해 주었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;구체적으로 아래를 launch.json에 추가합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&quot;sourceMapPathOverrides&quot;: {
    &quot;webpack:///c:/foo/bar/angular-project/*&quot;: &quot;${workspaceRoot}/*&quot;
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;각진 시드의 경우:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;{
  &quot;version&quot;: &quot;0.2.0&quot;,
  &quot;configurations&quot;: [
    {
      &quot;name&quot;: &quot;Debug with chrome&quot;,
      &quot;type&quot;: &quot;chrome&quot;,
      &quot;request&quot;: &quot;launch&quot;,
      &quot;url&quot;: &quot;http://localhost:5555&quot;,
      &quot;sourceMaps&quot;: true,
      &quot;webRoot&quot;: &quot;${workspaceRoot}/src/client&quot;,
      &quot;userDataDir&quot;: &quot;${workspaceRoot}/out/chrome&quot;,
      &quot;sourceMapPathOverrides&quot;: {
        &quot;app/*&quot;: &quot;${webRoot}/app/*&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;launch.json&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&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;// This forces chrome to run a brand new instance, allowing existing
// chrome windows to stay open.
&quot;userDataDir&quot;: &quot;${workspaceRoot}/.vscode/chrome&quot;,
&quot;webRoot&quot;: &quot;${workspaceRoot}&quot;,
&quot;sourceMaps&quot;: true,
&quot;sourceMapPathOverrides&quot;: { &quot;webpack:///./*&quot;: &quot;${webRoot}/*&quot; }
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이건 시험해 보고 시험해 본 겁니다&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;1단계:&lt;/strong&gt; Chrome debugger 설치: VS Code에서 명령 팔레트(Ctrl+Shift+P)를 열고 Extensions를 입력하면 됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Extension 명령을 설치합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;확장자 목록이 나타나면 'chrome'을 입력하여 목록을 필터링하고 Debugger for Chrome 확장자를 설치합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그런 다음 런치 구성 파일을 만듭니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://code.visualstudio.com/blogs/2016/02/23/introducing-chrome-debugger-for-vs-code&quot; rel=&quot;nofollow noreferrer&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;[1단계 상세 정보]&lt;/font&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; lunch.json 파일 생성 및 업데이트:&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;launch.json의 두 예제 구성은 &quot;request&quot;: &quot;launch&quot;입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;로컬 파일 또는 URL에 대해 Chrome을 시작하려면 파일 또는 url을 지정해야 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;url을 사용하는 경우 webRoot를 파일이 제공되는 디렉터리로 설정합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 경로는 절대 경로이거나 ${workspaceRoot}(코드에서 열려 있는 폴더)를 사용하는 경로일 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;webRoot는 디스크의 파일(예: &quot;/Users/me/project/app.js&quot;)에 URL(예: &quot;&lt;a href=&quot;http://localhost/app.js&quot; rel=&quot;nofollow noreferrer&quot;&gt;http://localhost/app.js&lt;/a&gt;&quot;)을 확인하는 데 사용되므로 올바르게 설정되도록 주의해야 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;lunch.json 파일의 내용을 다음과 같이 업데이트합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;{
    &quot;version&quot;: &quot;0.1.0&quot;,
    &quot;configurations&quot;: [
        {
            &quot;name&quot;: &quot;Launch localhost&quot;,
            &quot;type&quot;: &quot;chrome&quot;,
            &quot;request&quot;: &quot;launch&quot;,
            &quot;url&quot;: &quot;http://localhost/some_name&quot;,
            &quot;webRoot&quot;: &quot;${workspaceRoot}/wwwroot&quot;
        },
        {
            &quot;name&quot;: &quot;Launch index.html (disable sourcemaps)&quot;,
            &quot;type&quot;: &quot;chrome&quot;,
            &quot;request&quot;: &quot;launch&quot;,
            &quot;sourceMaps&quot;: false,
            &quot;file&quot;: &quot;${workspaceRoot}/index.html&quot;
        },
    ]
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;a href=&quot;https://github.com/Microsoft/vscode-chrome-debug&quot; rel=&quot;nofollow noreferrer&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;[2단계 세부사항]&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사용할 필요가 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;CORS&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;그리고 크롬에 디버거를 붙여서 Angular application 디버깅을 합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;웹 보안이 비활성화된 상태에서 크롬을 시작하는 CMD 라인:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;cd &quot;C:\Program Files (x86)\Google\Chrome\Application\&quot;
chrome.exe --user-data-dir=&quot;C:/Chrome dev session&quot; --disable-web-security --remote-debugging-port=9222
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;code&gt;launch.json&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;디버거 첨부 파일:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    &quot;version&quot;: &quot;0.2.0&quot;,
    &quot;configurations&quot;: [
        {
            &quot;type&quot;: &quot;chrome&quot;,
            &quot;request&quot;: &quot;attach&quot;,
            &quot;name&quot;: &quot;Attach to Chrome&quot;,
            &quot;port&quot;: 9222,
            &quot;webRoot&quot;: &quot;${workspaceFolder}&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/a/37605661&quot;&gt;Sanket의 대답&lt;/a&gt;은 맞았지만 저는 그것에 대해 약간의 문제가 있었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;첫째, Launch.json은 프로젝트의 &quot;.vscode&quot; 디렉토리에 있고, 둘째, 포트 번호는 앱을 실행할 때 사용하는 기본 서버 포트와 같아야 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;프로젝트 런칭을 위해 cmd의 &lt;strong&gt;serve를 사용&lt;/strong&gt;하고 있고 기본 포트 번호가 &lt;strong&gt;4200&lt;/strong&gt; 이여서 launch.json 파일을 다음과 같이 변경하였습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-json prettyprint-override&quot;&gt;&lt;code&gt;{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    &quot;version&quot;: &quot;0.2.0&quot;,
    &quot;configurations&quot;: [
        {
            &quot;type&quot;: &quot;chrome&quot;,
            &quot;request&quot;: &quot;launch&quot;,
            &quot;name&quot;: &quot;Launch Chrome against localhost&quot;,
            &quot;url&quot;: &quot;http://localhost:4200&quot;,
            &quot;sourceMaps&quot;: true,
            &quot;webRoot&quot;: &quot;${workspaceFolder}&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/36494938/debug-run-angular2-typescript-with-visual-studio-code&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>angular</category>
      <author>muds</author>
      <guid isPermaLink="true">https://muds.tistory.com/1491</guid>
      <comments>https://muds.tistory.com/1491#entry1491comment</comments>
      <pubDate>Tue, 7 Nov 2023 21:09:01 +0900</pubDate>
    </item>
    <item>
      <title>.NET에서 오라클 연결을 닫는 방법</title>
      <link>https://muds.tistory.com/1490</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;.NET에서 오라클 연결을 닫는 방법&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;OracleConnection connection = new OracleConnection(connectionString);  
OracleCommand command = new OracleCommand(sql, connection);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;연결이나 Oracle을 닫으려면 명령을 호출해야 합니까?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;폐기(), 연결.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;폐기() 또는 둘 다?&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 정도면 충분한가요?&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;using(connection)  
{
    OracleDataReader reader = cmd.ExecuteReader();
    // whatever...
}
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;using (OracleConnection connection = new OracleConnection(connectionString))
{
    using (OracleCommand command = new OracleCommand(sql, connection))
    {
        using (OracleDataReader reader = cmd.ExecuteReader())
        {
        }
    }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;ID를 일회용으로 구현하고 생성하면 사용 블록에 넣습니다.&lt;/font&gt;&lt;/p&gt;&lt;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;ID를 사용할 수 있는 개체에 폐기()합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&quot;using&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; using (OracleConnection connection = new OracleConnection(connectionString))
 using (OracleCommand command = new OracleCommand(sql, connection))
 using (OracleDataReader reader = cmd.ExecuteReader())
    {
        // do something here
    }
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 정도면 충분합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;statement를 사용하면 dispose statement가 랩핑되므로 예외가 삭제되더라도 사용자는 안전합니다. 리소스를 폐기하는 것이 제가 선호하는 방법입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;using(OracleConnection connection = new OracleConnection(connectionString);    )  
{
   //Create a command object 
    using(OracleCommand command = new OracleCommand(sql, connection))
    {
      using(OracleDataReader reader = cmd.ExecuteReader())
      {
      }

    }
    // whatever...
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&quot;using&quot;을 사용하면 컴파일러에게 시도를 요청할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;마지막으로 차단하고, 마지막으로 차단하면 일회용 물건을 닫을 것입니다.&lt;/font&gt;&lt;/p&gt;&lt;p&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 papago-translate=&quot;translated&quot;&gt;통과할 수도 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;CommandBehavior.CloseConnection&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;지휘관의 지시에 따라&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ExecuteReader&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;접기 전에 닫는 방법&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Dispose&lt;/code&gt;&lt;font 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/698397/how-do-i-close-an-oracleconnection-in-net&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>oracle</category>
      <author>muds</author>
      <guid isPermaLink="true">https://muds.tistory.com/1490</guid>
      <comments>https://muds.tistory.com/1490#entry1490comment</comments>
      <pubDate>Tue, 7 Nov 2023 21:08:51 +0900</pubDate>
    </item>
    <item>
      <title>MariaDB는 엄격 모드가 해제되어 있고 열이 NULL이 아니며 기본값이 없을 때 행을 삽입하지 않습니다. 왜죠?</title>
      <link>https://muds.tistory.com/1489</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;MariaDB는 엄격 모드가 해제되어 있고 열이 NULL이 아니며 기본값이 없을 때 행을 삽입하지 않습니다. 왜죠?&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Windows 10에서 MariaDB 10.1.21로 XAMPP를 실행하고 있습니다.&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;col2&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;NULL이 아니며 기본값이 없습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;SQL 문이 2개 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;1. &lt;/font&gt;&lt;code&gt;INSERT INTO table (col1, col2) VALUES (2, '')&lt;/code&gt; &lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;2. &lt;/font&gt;&lt;code&gt;INSERT INTO table (col1) VALUES (2)&lt;/code&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사례 1의 경우 PHPMyAdmin에서 다음과 같은 응답을 받습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;1행 삽입.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;[br] 삽입 행 ID: 3 (쿼리에 0.0541초 소요됨)&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;케이스2 나는 이해합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;0 행 삽입.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;(쿼리는 0.0018초가 걸렸습니다.)&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;그러나 리눅스의 MySQL 5.6에서는 삽입이 성공합니다.&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;SQL_MODE=''&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;이 설정은 STRECT 모드가 꺼짐을 의미하는 것으로 알고 있습니다.)&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;XAMPP/Windows/MariaDB&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하지만 성공은.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Linux/MySQL&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;? 리눅스 시스템은 수년간 운영되어 왔고, 윈도우 시스템은 처음으로 설치되고 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/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/44935250/mariadb-is-not-inserting-a-row-when-strict-mode-is-off-and-column-is-not-null-an&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>MariaDB</category>
      <author>muds</author>
      <guid isPermaLink="true">https://muds.tistory.com/1489</guid>
      <comments>https://muds.tistory.com/1489#entry1489comment</comments>
      <pubDate>Tue, 7 Nov 2023 21:08:45 +0900</pubDate>
    </item>
    <item>
      <title>오라클 10g이 칼럼 모호성에 대해 불평하지 않는 이유는?</title>
      <link>https://muds.tistory.com/1488</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;오라클 10g이 칼럼 모호성에 대해 불평하지 않는 이유는?&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Oracle 10g(XE 10.2.0.1.0)를 사용하고 있는데 이해할 수 없는 동작이 나타납니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-sql prettyprint-override&quot;&gt;&lt;code&gt;select * 
from employees manager
    join employees worker on MANAGER.EMPLOYEE_ID = WORKER.MANAGER_ID
    join departments on DEPARTMENTS.manager_id = 108
where
    department_id = 100
;
&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;department_id&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;where 절에서, 그것은 두 표의 열이기 때문에.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;employees&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;departments&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;. 사실은 Oracle 10g에 있습니다. 그렇지 않습니다. 그리고 결과는 다음을 해석한다는 것을 보여줍니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;department_id&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;에 있어서의 일인자로서&lt;/font&gt;&lt;/font&gt;&lt;code&gt;departments&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;. 하지만 두번째 조인문(위 4행)에 대해 언급하면 오라클은 예상대로 &quot;ORA-00918: column ambully defined&quot;라고 불만을 제기합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그렇다면 누군가 Oracle 10g에서 모호성이 정의되는 방법을 설명하는 데 도움을 줄 수 있습니까?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아니면 이것이 10g 안에 있는 버그일까요?&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;BTW: 테이블은 Oracle 10g에 번들로 제공되는 기본 HR 스키마에 정의되어 있습니다.&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;https://stackoverflow.com/questions/3264334/why-does-oracle-sql-mysteriously-resolve-ambiguity-in-one-joins-and-does-not-in-o&quot;&gt;Oracle SQL이 한 조인에서 모호성을 불가사의하게 해결하고 다른 조인에서는 해결하지 못하는 이유&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;오라클이 고치지 않기로 한 것은 오라클 10g의 버그라고 생각합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;애플리케이션을 10g에서 11gR2로 업그레이드할 때 모호한 열 이름과 관련하여 &quot;느리게&quot; 작성되었지만 Oracle 10g에서 작동하는 쿼리 몇 개를 발견했습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그들은 모두 11gR2에서 작업을 중단했습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;오라클에 문의해 보았지만 모호한 컬럼 이름에 대한 관대한 행동은 오라클 10g의 올바른 행동이고 엄격한 행동은 11g의 올바른 행동이라고 거의 말했습니다.&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;alias&lt;/code&gt;&lt;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;alias&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;departments&lt;/code&gt;&lt;font 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;departments&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;ORA-00918을 다시 받아야 할 가명입니다.&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/6293193/why-oracle-10g-doesnt-complain-about-column-ambiguity&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>oracle</category>
      <author>muds</author>
      <guid isPermaLink="true">https://muds.tistory.com/1488</guid>
      <comments>https://muds.tistory.com/1488#entry1488comment</comments>
      <pubDate>Tue, 7 Nov 2023 21:08:39 +0900</pubDate>
    </item>
    <item>
      <title>wordpress root url을 구하는 방법 (ABSPATH 각 페이지 변경사항)</title>
      <link>https://muds.tistory.com/1487</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;wordpress root url을 구하는 방법 (ABSPATH 각 페이지 변경사항)&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;strong&gt;&lt;a href=&quot;http://example.com/wordpress/&quot; rel=&quot;noreferrer&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;http://example.com/wordpress/&lt;/font&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;홈페이지에 있을 때 ABCPATH 상수는 바로 그 값을 출력하지만, 다른 페이지로 이동할 때는 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;http://example.com/wordpress/contact&quot; rel=&quot;noreferrer&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;http://example.com/wordpress/contact&lt;/font&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;ABSPATH는 다음과 같은 기능도 제공합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;http://example.com/wordpress/contact&quot; rel=&quot;noreferrer&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;http://example.com/wordpress/contact&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;ABCPATH가 값을 변경하는 이유에 대해 조금 혼란스럽습니다. 상수는 정의되면 변경할 수 없는 것 아닌가요?&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;Site_url();&lt;/code&gt;&lt;font 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;WP는 추가로 삽입되는 폴더를 피해야 할 뿐만 아니라 폴더 자체에 설치될 수도 있습니다.&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;DIRECTORY_SEPARATOR&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;문제 또한:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;if (!defined(PLUGINUPDATEMGR_DOMAIN)) 
    define(&quot;PLUGINUPDATEMGR_DOMAIN&quot;, strtolower( $_SERVER['HTTP_HOST'] ) );

$wprootbase = strtolower( site_url() );

$wprootstart = strpos( $wprootbase, PLUGINUPDATEMGR_DOMAIN ) + 
    strlen( PLUGINUPDATEMGR_DOMAIN  ); // + 1 to strip the leading slash/backslash

$wprootend = strlen( $wprootbase );

$wproot = substr( $wprootbase, $wprootstart, $wprootend );

echo &quot;Local WP path = '&quot; . $wproot . '&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;Local WP path = '/wp/wordpress-3.4.2&quot; 
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그럼요 YMMV =;;?&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;ABSPATH는 /var/www/wordpress/와 같은 서버의 php 파일에 절대 경로를 반환합니다. 워드프레스 설치를 확인하십시오.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;당신의 문제에 대한 답은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;site_url()&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아니면&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;블로그 정보&lt;/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;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;$var = get_bloginfo ('wpurl')&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;pre&gt;&lt;code&gt;&amp;lt;?php echo esc_url( home_url( '/' ) ); ?&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;hr&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여기 텍스트가 있습니다. 왜냐하면 최소 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;URL : https://stackoverflow.com/questions/6175885/how-to-obtain-wordpress-root-url-abspath-changes-on-each-page&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>WordPress</category>
      <author>muds</author>
      <guid isPermaLink="true">https://muds.tistory.com/1487</guid>
      <comments>https://muds.tistory.com/1487#entry1487comment</comments>
      <pubDate>Thu, 2 Nov 2023 22:11:10 +0900</pubDate>
    </item>
    <item>
      <title>gprof : 메인 프로그램과 연동되는 공유 라이브러리의 함수에 대한 호출 그래프 생성 방법</title>
      <link>https://muds.tistory.com/1486</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;gprof : 메인 프로그램과 연동되는 공유 라이브러리의 함수에 대한 호출 그래프 생성 방법&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;나는 두 개의 'C' 소스 패키지 트레인과 test_train을 가지고 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;컴파일 시 train package가 libtrain.so 을 생성&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;test_train 링크를 libtrain.so 에 연결하고 실행 가능한 train-test를 생성합니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이제 저는 gprof를 사용하여 libtrain.so 내부의 함수뿐만 아니라 메인 프로그램의 함수들의 호출 순서를 보여주는 호출 그래프를 생성하고자 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;두 패키지 모두 -pg 옵션으로 컴파일하여 링크하고 있으며 디버깅 레벨은 o0입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;내가 기차 테스트를 하고 나면, gmon.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;out이 생성됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그 다음에 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$ gprof -q ./train-test gmon.out
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여기서 출력은 열차 시험에서는 함수의 호출 그래프를 보여주지만 libtrain.so 에서는 보여주지 않습니다.&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;gprof&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;작동이 안 돼요, 당신이 사용해야 해요.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;sprof&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;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://stackoverflow.com/questions/881074/how-to-use-sprof&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;스프로프 사용법?&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;http://greg-n-blog.blogspot.com/2010/01/profiling-shared-library-on-linux-using.html&quot; rel=&quot;noreferrer&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;http://greg-n-blog.blogspot.com/2010/01/profiling-shared-library-on-linux-using.html&lt;/font&gt;&lt;/a&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;ol&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;공유 라이브러리(libmylib)를 컴파일합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;디버그(-g) 모드로 설정합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아니요 -pg.&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;LD_Profile_OUTPUT='pwd' 내보내기&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;LD_PROFILE=libmylib.so 내보내기&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;rm -f $LD_Profile.profile&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;libmylib.so 을 로드하는 프로그램을 실행합니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;PATH-TO-LIB/$의 스프롭&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;LD_Profile $LD_Profile.profile -p &amp;gt;log&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;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;2단계에서 기존 디렉토리여야 합니다. 그렇지 않으면 유용한 경고가 표시됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고 3단계에서 라이브러리를 다음과 같이 지정해야 할 수도 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;libmylib.so.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;.X.Y&lt;/code&gt;&lt;font 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;sprof&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;. 대신에 제가.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;oprofile&lt;/code&gt;&lt;font 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;code&gt;operf --callgraph /path/to/mybinary&lt;/code&gt;&lt;/p&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;응용프로그램이 완료될 때까지 기다리거나 Ctl-c를 수행하여 프로파일링을 중지합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이제 프로파일 요약을 생성해 보겠습니다.&lt;/font&gt;&lt;/p&gt; 
 &lt;p&gt;&lt;code&gt;opreport --callgraph --symbols&lt;/code&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이를 해석하려면 &lt;a href=&quot;http://oprofile.sourceforge.net/doc/opreport.html&quot; rel=&quot;nofollow&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;font papago-translate=&quot;translated&quot;&gt;블록의 주요 기호는 움푹 패이지 않은 것입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그 위에 있는 것들은 그 기능을 호출하는 기능이고, 그 아래에 있는 것들은 그 기능에 의해 호출되는 것들입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아래 섹션의 백분율은 해당 호출자에서 보낸 시간의 상대적인 양입니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;만약 당신이 리눅스에 있지 않다면(솔라리스의 나처럼), 당신은 단지 운이 없는 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;sprof&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;truss&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;. 옵션으로&lt;/font&gt;&lt;/font&gt;&lt;code&gt;-u [!]lib,...:[:][!]func, ...&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/1838989/gprof-how-to-generate-call-graph-for-functions-in-shared-library-that-is-linke&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>C</category>
      <author>muds</author>
      <guid isPermaLink="true">https://muds.tistory.com/1486</guid>
      <comments>https://muds.tistory.com/1486#entry1486comment</comments>
      <pubDate>Thu, 2 Nov 2023 22:11:03 +0900</pubDate>
    </item>
    <item>
      <title>WooCommerce - 주문 ID에서 구독 ID 가져오기</title>
      <link>https://muds.tistory.com/1485</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;WooCommerce - 주문 ID에서 구독 ID 가져오기&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;나는 액션 훅에서 그것을 얻으려 하고 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그것은 고객이 전환할 때마다 변경되는 것을 나에게 줍니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예를 들어,&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;가 인 경우 원본은 입니다.&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;이제 고객이 만든 모든 스위치는 새로운 주문 ID를 생성하며, 위의 작업을 통해 이 ID를 제공합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 시점에서 나는 , , , 그리고 원본을 가지고 있습니다 ,&lt;/font&gt;&lt;/font&gt;&lt;br&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;$subscription ID를 검색하는 전용 기능을 사용할 수 있습니다.&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_action('woocommerce_order_status_changed', 'action_order_status_changed');
function action_order_status_changed( $order_id ){
    $subscriptions_ids = wcs_get_subscriptions_for_order( $order_id, array( 'order_type' =&amp;gt; 'any' ) );
    // We get all related subscriptions for this order
    foreach( $subscriptions_ids as $subscription_id =&amp;gt; $subscription_obj )
        if($subscription_obj-&amp;gt;order-&amp;gt;id == $order_id) break; // Stop the loop

    // The subscription ID: $subscription_id 
    // The An instance of the Subscription object: $subscription_obj 
    // ...
}
&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/43150761/woocommerce-get-the-subscription-id-from-the-order-id&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>WordPress</category>
      <author>muds</author>
      <guid isPermaLink="true">https://muds.tistory.com/1485</guid>
      <comments>https://muds.tistory.com/1485#entry1485comment</comments>
      <pubDate>Thu, 2 Nov 2023 22:10:57 +0900</pubDate>
    </item>
    <item>
      <title>C에서 지정된 이니셜라이저는 무엇입니까?</title>
      <link>https://muds.tistory.com/1484</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;C에서 지정된 이니셜라이저는 무엇입니까?&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;C에서 &lt;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;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;C에서 지정된 이니셜라이저는 무엇입니까?&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;1) 어레이의 특정 요소를 빠르게 초기화할 수 있는 방법을 제공합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;int foo[10] = { [3] = 1, [5] = 2 };
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;모든 요소를 다음으로 설정합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;foo&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;1로 설정되는 인덱스 3과 2로 설정되는 인덱스 5를 제외하고 0으로 설정됩니다.&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;2) 명시적으로 초기화하는 방법을 제공합니다.&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;회원들.&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;struct Foo { int a, 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;pre&gt;&lt;code&gt;struct Foo foo { .a = 1, .b = 2 };
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 경우, 명시적으로 초기화되지 않은 구성원은 마치 인스턴스가 초기화된 것처럼 초기화됩니다.&lt;/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;/p&gt; 
&lt;p&gt;&lt;/p&gt;
&lt;hr&gt; Both are standard C, but note that C++ does not support either (as constructors can do the job in that language.)
&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;Designed Initializer는 ISO C99 이후 등장했으며 초기화 시 C로 초기화할 수 있는 새롭고 더 역동적인 방법입니다.&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;,&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;혹은&lt;/font&gt;&lt;/font&gt;&lt;code&gt;array&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/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://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html&quot; rel=&quot;noreferrer&quot;&gt;GNU 가이드&lt;/a&gt;에서:&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;표준 C90은 초기화되는 배열 또는 구조의 요소 순서와 동일하게 초기화자의 요소가 고정된 순서로 나타나도록 요구합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;ISO C99에서 당신은 요소들을 무작위 순서로 줄 수 있고, 그것들이 적용되는 배열 인덱스나 구조 필드 이름을 지정할 수 있고, GNU C는 이것을 C90 모드에서도 확장으로 허용합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;hr&gt; 
&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예&lt;/font&gt;&lt;/h2&gt; 
&lt;h3&gt;&lt;font papago-translate=&quot;translated&quot;&gt;1. 배열 색인&lt;/font&gt;&lt;/h3&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 class=&quot;lang-c prettyprint-override&quot;&gt;&lt;code&gt;  int a[6] = { 0, 0, 15, 0, 29, 0 };
&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 class=&quot;lang-c prettyprint-override&quot;&gt;&lt;code&gt;  int a[6] = {[4] = 29, [2] = 15 }; // or
  int a[6] = {[4]29 , [2]15 }; // or
  int widths[] = { [0 ... 9] = 1, [10 ... 99] = 2, [100] = 3 };
&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;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;표준 초기화&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-c prettyprint-override&quot;&gt;&lt;code&gt;struct point { int x, y; };
&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 class=&quot;lang-c prettyprint-override&quot;&gt;&lt;code&gt; struct point p = { .y = 2, .x = 3 }; or
 struct point p = { y: 2, x: 3 };
&lt;/code&gt;&lt;/pre&gt; 
&lt;h3&gt;&lt;font papago-translate=&quot;translated&quot;&gt;3. 연속적인 요소의 일반적인 C 초기화와 명명 요소를 결합합니다.&lt;/font&gt;&lt;/h3&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 class=&quot;lang-c prettyprint-override&quot;&gt;&lt;code&gt;int a[6] = { 0, v1, v2, 0, v4, 0 };
&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 class=&quot;lang-c prettyprint-override&quot;&gt;&lt;code&gt;int a[6] = { [1] = v1, v2, [4] = v4 };
&lt;/code&gt;&lt;/pre&gt; 
&lt;h3&gt;&lt;font papago-translate=&quot;translated&quot;&gt;4. 기타:&lt;/font&gt;&lt;/h3&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 class=&quot;lang-c prettyprint-override&quot;&gt;&lt;code&gt;int whitespace[256] = { [' '] = 1, ['\t'] = 1, ['\h'] = 1,
                        ['\f'] = 1, ['\n'] = 1, ['\r'] = 1 };
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;'=' 앞에 일련의 '.fieldname' 및 '[index]' 지정자를 작성하여 초기화할 중첩 하위 개체를 지정합니다.&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-c prettyprint-override&quot;&gt;&lt;code&gt;struct point ptarray[10] = { [2].y = yv2, [2].x = xv2, [0].x = xv0 };
&lt;/code&gt;&lt;/pre&gt; 
&lt;hr&gt; 
&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;가이드&lt;/font&gt;&lt;/h2&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://www.geeksforgeeks.org/designated-initializers-c/&quot; rel=&quot;noreferrer&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;지정- initializer-c | geeksforgeeks.org&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://riptutorial.com/c/example/18609/using-designated-initializers&quot; rel=&quot;noreferrer&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사용 지정 initial화기&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://www.tutorialspoint.com/designated-initializers-in-c&quot; rel=&quot;noreferrer&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;tutorialspoint.com | 지정- initial라이저-in-c&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;C99표준안&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것은 특별히 깨달음을 주는 것이 아니라, 단지 나 자신의 병적인 호기심을 만족시키기 위해서입니다: &lt;a href=&quot;https://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf&quot; rel=&quot;nofollow noreferrer&quot;&gt;WG14/N1256 C99 표준 초안&lt;/a&gt;.&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;6.7.8 초기화&lt;/font&gt;&lt;/p&gt; 
 &lt;pre&gt;&lt;code&gt;designator-list:
  designator
  designator-list designator

designator:
  [ constant-expression ]
  . identifier
&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;6 지정자가 양식을 가지고 있는 경우&lt;/font&gt;&lt;/p&gt; 
 &lt;pre&gt;&lt;code&gt;[ constant-expression ]
&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;7 지정자가 양식을 가지고 있는 경우&lt;/font&gt;&lt;/p&gt; 
 &lt;pre&gt;&lt;code&gt;. identifier
&lt;/code&gt;&lt;/pre&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러면 현재 객체(아래 정의)는 구조 또는 조합 유형을 가져야 하며 식별자는 해당 유형의 멤버 이름이어야 합니다.&lt;/font&gt;&lt;/p&gt; 
 &lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;의미론&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;17 각 브레이스로 둘러싸인 이니셜라이저 목록에는 관련된 현재 객체가 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;지정이 존재하지 않는 경우, 현재 객체의 하위 객체들은 현재 객체의 종류에 따라 순서대로 초기화됩니다: 첨자 순서가 증가하는 배열 요소들, 선언 순서의 구조 부재들, 그리고 첫 번째로 명명된 조합의 구성원.129) 이와 대조적으로,&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;18 각 지정자 목록은 가장 가까운 주변 가새 쌍과 관련된 현재 개체로 설명을 시작합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;지정자 목록의 각 항목(순으로)은 현재 개체의 특정 멤버를 지정하고 다음 지정자(있는 경우)의 현재 개체를 해당 멤버로 변경합니다.131) 지정자 목록의 끝에 있는 현재 개체는 다음 이니셜라이저에서 초기화할 하위 개체입니다.&lt;/font&gt;&lt;/p&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예제 9 배열은 다음과 같은 지정자를 사용하여 열거의 요소에 대응하도록 초기화할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
 &lt;pre&gt;&lt;code&gt;enum { member_one, member_two };
const char *nm[] = {
    [member_two] = &quot;member two&quot;,
    [member_one] = &quot;member one&quot;,
}
&lt;/code&gt;&lt;/pre&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사례 11 장식되지 않은 초기화 목록이 잘못 이해될 수 있는 경우 지정자를 사용하여 명시적인 초기화를 제공할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
 &lt;pre&gt;&lt;code&gt;struct { int a[3], b; } w[] =
    { [0].a = {1}, [1].a[0] = 2 };
&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;URL : https://stackoverflow.com/questions/47202557/what-is-a-designated-initializer-in-c&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>C</category>
      <author>muds</author>
      <guid isPermaLink="true">https://muds.tistory.com/1484</guid>
      <comments>https://muds.tistory.com/1484#entry1484comment</comments>
      <pubDate>Thu, 2 Nov 2023 22:10:50 +0900</pubDate>
    </item>
    <item>
      <title>새 줄이 발견될 때까지 차단하면서 stdin에서 줄을 읽는 방법은?</title>
      <link>https://muds.tistory.com/1483</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;새 줄이 발견될 때까지 차단하면서 stdin에서 줄을 읽는 방법은?&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;명령 줄에 있는 stdin에서 임의 길이의 한 줄씩 읽으려고 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;GNU 읽기 라인을 포함할 수 있을지 확실하지 않고 라이브러리 기능을 사용하는 것을 선호합니다.&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;getline&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;#include &amp;lt;stdio.h&amp;gt;
int main()
{
    char *line = NULL;
    if (getline(&amp;amp;line, NULL, stdin) == -1) {
        printf(&quot;No line\n&quot;);
    } else {
        printf(&quot;%s\n&quot;, line);
    }
    return 0;
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;생산품&lt;/font&gt;&lt;/font&gt;&lt;code&gt;No line&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;, 따라서 사용자 입력을 수락하기에 적합하지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이거 어떻게 해요?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사소한 일이어야 한다는 것을 알지만, 저는 그것을 알아낼 수 없었습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 패치를 사용해 보십시오.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;char *line = NULL;
+size_t size;
+if (getline(&amp;amp;line, &amp;amp;size, stdin) == -1) {
-if (getline(&amp;amp;line, 0, stdin) == -1) {
    printf(&quot;No line\n&quot;);
} else {
&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;차단 불가&quot; 동작을 재현할 수 있었습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;getline&lt;/code&gt;&lt;font 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;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;

int main()
{
        char    *buffer;
        size_t  n = 1024;
        buffer = malloc(n);
        return getline(&amp;amp;buffer, &amp;amp;n, stdin);
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;code&gt;getline(&amp;amp;buffer...&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;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;buffer&lt;/code&gt;&lt;font 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;getline(NULL, &amp;amp;n, stdin);
&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;getline&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;실패하고 차단되지 않는 것 &lt;em&gt;같습니다&lt;/em&gt;.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;어쩌면 무효일 수도 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;n&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/12252103/how-to-read-a-line-from-stdin-blocking-until-the-newline-is-found&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>C</category>
      <author>muds</author>
      <guid isPermaLink="true">https://muds.tistory.com/1483</guid>
      <comments>https://muds.tistory.com/1483#entry1483comment</comments>
      <pubDate>Thu, 2 Nov 2023 22:10:43 +0900</pubDate>
    </item>
    <item>
      <title>오래된 도커 컨테이너를 제거하는 방법</title>
      <link>https://muds.tistory.com/1482</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;em&gt;&lt;a href=&quot;https://stackoverflow.com/questions/17014263/should-i-be-concerned-about-excess-non-running-docker-containers&quot;&gt;도커 컨테이너의 초과, 미실행에 대해&lt;/a&gt;&lt;/em&gt; 우려해야 &lt;em&gt;&lt;a href=&quot;https://stackoverflow.com/questions/17014263/should-i-be-concerned-about-excess-non-running-docker-containers&quot;&gt;합니까?&lt;/a&gt;&lt;/em&gt;와 관련된 질문입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;오래된 컨테이너를 어떻게 제거해야 하는지 궁금합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;docker rm 3e552code34a&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하나를 제거할 수는 있지만 이미 많이 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;docker rm --help&lt;/code&gt;&lt;font 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;a href=&quot;https://github.com/moby/moby/blob/master/CHANGELOG.md#1130-2017-01-18&quot; rel=&quot;noreferrer&quot;&gt;Docker 1.13.x&lt;/a&gt; 이후에는 &lt;a href=&quot;https://docs.docker.com/engine/reference/commandline/container_prune/&quot; rel=&quot;noreferrer&quot;&gt;Docker 컨테이너 프루닝&lt;/a&gt;을 사용할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;docker container prune
&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;https://docs.docker.com/engine/reference/commandline/system_prune/&quot; rel=&quot;noreferrer&quot;&gt;도커 시스템 프루닝&lt;/a&gt;도 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;docker system prune
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사용되지 않는 모든 컨테이너, 네트워크, 이미지(대깅 및 참조되지 않음) 및 선택적으로 볼륨을 하나의 명령으로 정리합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;hr&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;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;$ docker ps --filter &quot;status=exited&quot; | grep 'weeks ago' | awk '{print $1}' | xargs --no-run-if-empty docker rm
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 예는 https://twitter.com/jpetazzo/status/347431091415703552 에서 제공하는 것입니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Guillaume J. Charmes(예정지 신용)로부터 받은 또 다른 방법:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;docker rm `docker ps --no-trunc -aq`
&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;그리고 Windows용 Bartosz Bilicki:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;FOR /f &quot;tokens=*&quot; %i IN ('docker ps -a -q') DO docker rm %i
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;PowerShell의 경우:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;docker rm @(docker ps -aq)
&lt;/code&gt;&lt;/pre&gt; 
&lt;hr&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;도커 1.13(2016년 4분기) 업데이트, &lt;a href=&quot;https://stackoverflow.com/users/6309/vonc&quot;&gt;VonC&lt;/a&gt; 크레딧(이 &lt;a href=&quot;https://stackoverflow.com/a/39860665/6309&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;&lt;code&gt;docker system prune&lt;/code&gt;&lt;/strong&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/docker/docker/pull/26108&quot; rel=&quot;noreferrer&quot;&gt;PR 26108&lt;/a&gt; 및 &lt;a href=&quot;https://github.com/docker/docker/commit/86de7c000f5d854051369754ad1769194e8dd5e1&quot; rel=&quot;noreferrer&quot;&gt;커밋 86de7c0&lt;/a&gt;을 참조하십시오. 여기에는 도커 데몬 데이터가 디스크에서 차지하는 공간을 시각화하고 &quot;필요하지 않은&quot; 초과분을 쉽게 제거할 수 있도록 지원하는 몇 가지 새로운 명령이 소개되어 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;docker system prune

WARNING! This will remove:
    - all stopped containers
    - all volumes not used by at least one container
    - all images without at least one container associated to them
Are you sure you want to continue? [y/N] y
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;업데이트된 답변&lt;/strong&gt; 사용&lt;/font&gt;&lt;/font&gt;&lt;code&gt;docker system prune&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아니면&lt;/font&gt;&lt;/font&gt;&lt;code&gt;docker container prune&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;지금. &lt;a href=&quot;https://stackoverflow.com/questions/17236796/how-to-remove-old-docker-containers/39860665#39860665&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; 위의 여러 가지 힌트를 구성하면 실행되지 않는 모든 용기를 제거하는 가장 우아한 방법은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;docker rm $(docker ps -q -f status=exited)&lt;/code&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;code&gt;-q&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;열 머리글 없이 컨테이너 ID만 인쇄합니다.&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;-f&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;인쇄된 용기 목록을 필터링할 수 있습니다(이 경우 종료된 용기만 표시하도록 필터링합니다).&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;https://github.com/docker/docker/pull/6112&quot; rel=&quot;noreferrer&quot;&gt;공식적&lt;/a&gt;인 방법은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;docker rm `docker ps -aq`
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;도커 유지 관리자는 이에 대한 명령이 없을 것이라고 표시했습니다. 당신은 다음과 같이 명령을 작성합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;우리는 이에 대해 이전에 논의한 바 있으며 사용자가 도커에 추가 코드를 추가할 필요 없이 위 라인을 사용하는 것을 선호합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;도커 1.13(2016년 4분기)을 통해 이제 다음과 같은 이점을 얻게 되었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;https://docs.docker.com/engine/reference/commandline/system_prune/&quot; rel=&quot;noreferrer&quot;&gt;&lt;strong&gt;&lt;code&gt;docker system prune -a&lt;/code&gt;&lt;/strong&gt;&lt;/a&gt; 에서는 사용되지 않는 모든 데이터(즉, 정지된 컨테이너, 정지된 볼륨, 컨테이너 없는 이미지 순)를 삭제합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;docker system prune&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;-a가 없으면 (이미지의 경우) 매달린 이미지만 제거되거나, &lt;a href=&quot;https://stackoverflow.com/users/1447867/smilebomb&quot;&gt;스마일밤&lt;/a&gt;에서 &lt;a href=&quot;https://stackoverflow.com/questions/17236796/how-to-remove-old-docker-containers/39860665?noredirect=1#comment89860875_39860665&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;a href=&quot;https://github.com/docker/docker/pull/26108&quot; rel=&quot;noreferrer&quot;&gt;PR 26108&lt;/a&gt; 및 &lt;a href=&quot;https://github.com/docker/docker/commit/86de7c000f5d854051369754ad1769194e8dd5e1&quot; rel=&quot;noreferrer&quot;&gt;커밋 86de7c0&lt;/a&gt;을 참조하십시오. 여기에는 도커 데몬 데이터가 디스크에서 차지하는 공간을 시각화하고 &quot;필요하지 않은&quot; 초과분을 쉽게 제거할 수 있도록 지원하는 몇 가지 새로운 명령이 소개되어 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;docker system prune -a

WARNING! This will remove:
    - all stopped containers
    - all volumes not used by at least one container
    - all images without at least one container associated to them
Are you sure you want to continue? [y/N] y
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/users/1336078/wjv&quot;&gt;wjv&lt;/a&gt; 댓글로.&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;또한 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;docker {container,image,volume,network} prune&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;/blockquote&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;https://github.com/docker/docker/commit/913e5cb77bcb7134be2e9b1aaa7e63627285e676&quot; rel=&quot;noreferrer&quot;&gt;커밋 913e5cb&lt;/a&gt;에 소개되어 있으며, 도커 1.13+ 전용입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;docker container prune
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;2021년&lt;/strong&gt; 업데이트(신규)&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;docker container prune
&lt;/code&gt;&lt;/pre&gt; 
&lt;hr&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;This - &lt;strong&gt;2017&lt;/strong&gt; (OLD) 방식&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;docker rm $(docker ps -a -q)
&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;strong&gt;)&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;docker rm  -f $(docker ps -a -q)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이제 &lt;a href=&quot;http://docs.docker.com/reference/commandline/ps/#filtering&quot;&gt;필터링&lt;/a&gt;을 사용할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;docker ps&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;docker rm $(docker ps -q -f status=exited)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;http://docs.docker.com/reference/commandline/images/#filtering&quot;&gt;이미지&lt;/a&gt;의 경우:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;docker rmi $(docker images -q -f &quot;dangling=true&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;docker rm&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아니면&lt;/font&gt;&lt;/font&gt;&lt;code&gt;docker rmi&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;일치하는 컨테이너가 없을 때 오류를 던집니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;형들이&lt;/font&gt;&lt;/font&gt;&lt;code&gt;docker rm $(docker ps -aq)&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;모든 실행중인 컨테이너를 제거하려다 실패하면서 트릭은 더욱 악화되었습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여기에 더 깨끗한 스크립트를 추가합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;~/.bashrc&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아니면&lt;/font&gt;&lt;/font&gt;&lt;code&gt;~/.profile&lt;/code&gt;&lt;font 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;# Use `docker-cleanup --dry-run` to see what would be deleted.

function docker-cleanup {
  EXITED=$(docker ps -q -f status=exited)
  DANGLING=$(docker images -q -f &quot;dangling=true&quot;)

  if [ &quot;$1&quot; == &quot;--dry-run&quot; ]; then
    echo &quot;==&amp;gt; Would stop containers:&quot;
    echo $EXITED
    echo &quot;==&amp;gt; And images:&quot;
    echo $DANGLING
  else
    if [ -n &quot;$EXITED&quot; ]; then
      docker rm $EXITED
    else
      echo &quot;No containers to remove.&quot;
    fi
    if [ -n &quot;$DANGLING&quot; ]; then
      docker rmi $DANGLING
    else
      echo &quot;No images to remove.&quot;
    fi
  fi
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;em&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;편집: 아래에 언급된 바와 같이 원래 답변은 용기가 아닌 이미지를 제거하는 것입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;문서에 대한 새로운 링크를 포함하여 두 가지 모두에 대해 답변하도록 업데이트되었습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;새로운 것에 대해 언급해 준 Adrian(그리고 Ryan의 답변)에게 감사드립니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ps&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여과의&lt;/font&gt;&lt;/font&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;pre&gt;&lt;code&gt;docker rm $(docker ps -a | grep Exited | awk '{print $1}')
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/users/2113724/pauk960&quot;&gt;pauk960&lt;/a&gt;의 코멘트로부터:&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;버전 &lt;strong&gt;1.3.0&lt;/strong&gt;부터 필터를 사용할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;docker ps&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;, 대신에&lt;/font&gt;&lt;/font&gt;&lt;code&gt;grep Exited&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사용하다&lt;/font&gt;&lt;/font&gt;&lt;code&gt;docker ps -a -f status=exited&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;. 그리고 만약 당신이 사용한다면.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;-q&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그것으로 당신은 전체 출력 대신 컨테이너 ID만 얻을 수 있고, 그것을 위해 awk를 사용할 필요가 없습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;모든 컨테이너를 제거하지 않으려면 특정 컨테이너 이전 또는 이후에 생성된 모든 컨테이너를 선택할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;docker ps -f before=&amp;lt;container-ID&amp;gt;&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아니면 같이&lt;/font&gt;&lt;/font&gt;&lt;code&gt;docker ps -f since=&amp;lt;container-ID&amp;gt;&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 papago-translate=&quot;translated&quot;&gt;해당 작업 버전 이전에 만든 컨테이너를 제거하려고 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;작업 컨테이너의 ID를 결정합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;docker ps&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;.&lt;/font&gt;&lt;/font&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;docker rm $(docker ps -f before=9c49c11c8d21 -q)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;또 다른 예.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;데이터베이스가 이미 도커 컨테이너에서 실행 중입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다른 컨테이너에서 실행할 응용프로그램을 개발했고 이제 불필요한 컨테이너가 여러 개 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;특정 컨테이너 뒤에 생성된 컨테이너 제거&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;docker rm $(docker ps -f since=a6ca4661ec7f -q)
&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;/var/lib/docker/containers&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Ubuntubuntu에서.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여분의 컨테이너는 다른 피해는 없지만 디스크 공간을 차지한다고 생각합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;업데이트:&lt;/strong&gt; 도커 버전 1.13(2017년 1월 출시) 이후로 정지된 컨테이너, 사용되지 않은 볼륨, 매달린 이미지 및 사용되지 않은 네트워크를 정리하기 위해 다음 명령을 내릴 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;docker system prune
&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;exited&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;status, 사용 방법을 사용합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;docker ps -aq -f status=exited | xargs docker rm
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;마찬가지로 도커 항목을 정리하는 경우 태그가 지정되지 않은 이름 없는 이미지를 다음과 같은 방법으로 제거할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;docker images -q --no-trunc -f dangling=true | xargs docker rmi
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것은 나의&lt;/font&gt;&lt;/font&gt;&lt;code&gt;docker-cleanup&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;#!/bin/sh
# Cleanup docker files: untagged containers and images.
#
# Use `docker-cleanup -n` for a dry run to see what would be deleted.

untagged_containers() {
  # Print containers using untagged images: $1 is used with awk's print: 0=line, 1=column 1.
  docker ps -a | awk '$2 ~ &quot;[0-9a-f]{12}&quot; {print $'$1'}'
}

untagged_images() {
  # Print untagged images: $1 is used with awk's print: 0=line, 3=column 3.
  # NOTE: intermediate images (via -a) seem to only cause
  # &quot;Error: Conflict, foobarid wasn't deleted&quot; messages.
  # Might be useful sometimes when Docker messed things up?!
  # docker images -a | awk '$1 == &quot;&amp;lt;none&amp;gt;&quot; {print $'$1'}'
  docker images | tail -n +2 | awk '$1 == &quot;&amp;lt;none&amp;gt;&quot; {print $'$1'}'
}

# Dry-run.
if [ &quot;$1&quot; = &quot;-n&quot; ]; then
  echo &quot;=== Containers with uncommitted images: ===&quot;
  untagged_containers 0
  echo

  echo &quot;=== Uncommitted images: ===&quot;
  untagged_images 0

  exit
fi

# Remove containers with untagged images.
echo &quot;Removing containers:&quot; &amp;gt;&amp;amp;2
untagged_containers 1 | xargs --no-run-if-empty docker rm --volumes=true

# Remove untagged images
echo &quot;Removing images:&quot; &amp;gt;&amp;amp;2
untagged_images 3 | xargs --no-run-if-empty docker rmi
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;출처 : https://github.com/blueyed/dotfiles/blob/master/usr/bin/docker-cleanup&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;먼저 용기를 제거하기 전에 실행을 중지합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;h3&gt;&lt;font papago-translate=&quot;translated&quot;&gt;실행 중인 컨테이너 제거&lt;/font&gt;&lt;/h3&gt; 
&lt;pre&gt;&lt;code&gt;docker rm $(docker stop -t=1 $(docker ps -q))
&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;kill&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;대신에&lt;/font&gt;&lt;/font&gt;&lt;code&gt;stop&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;. 내 경우엔 내가 더 선호합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;stop&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제가 재방송을 하는 편이고, 매번 새로 만드는 편이기 때문에 잘 닫으려고 노력합니다.&lt;/font&gt;&lt;/font&gt;&lt;/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;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;오류: 실행 중인 컨테이너를 제거할 수 없습니다. 먼저 중지하십시오.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;h3&gt;&lt;font papago-translate=&quot;translated&quot;&gt;모든 용기 제거&lt;/font&gt;&lt;/h3&gt; 
&lt;pre&gt;&lt;code&gt;docker rm $(docker ps -a -q)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Windows 셸에서 모든 컨테이너 제거:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;FOR /f &quot;tokens=*&quot; %i IN ('docker ps -a -q') DO docker rm %i
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/HardySimpson/docker-cleanup&quot; rel=&quot;noreferrer&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;https://github.com/HardySimpson/docker-cleanup&lt;/font&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;h1&gt;&lt;font papago-translate=&quot;translated&quot;&gt;도커정리&lt;/font&gt;&lt;/h1&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;작은 일체형 셸로 다음을 제거합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;1일 이상 실행되지 않은 컨테이너&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;나머지 컨테이너에 속하지 않는 이미지&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;크론탭 작업으로 실행할 의도&lt;/font&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;특징&lt;/font&gt;&lt;/h2&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;모두 제거됩니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&amp;lt;none&amp;gt;:&amp;lt;none&amp;gt;&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이미지들&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이미지에 여러 repo:tag 참조가 있는 경우 컨테이너 실행을 제외한 모든 repo:tag가 제거됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사실 그것은 &quot;도커미&quot;의 성격입니다.&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;2&amp;gt;/dev/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;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;도커-gc에서 무언가를 배우고 문제를 해결합니다(복수의 repo:tag가 있는 이미지는 제거할 수 없습니다).&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;따라서 개인적으로는 이미지와 컨테이너 모두에 대한 배포 스크립트의 일부로 최신 n개의 컨테이너와 이미지만 유지하는 것을 권장합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;도커 이미지에 함께 사용하는 버전 스키마와 동일한 태그를 지정합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;git tag&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;REPOSITORY              TAG       IMAGE ID        CREATED         VIRTUAL SIZE
some_repo/some_image    0.0.5     8f1a7c7ba93c    23 hours ago    925.4 MB
some_repo/some_image    latest    8f1a7c7ba93c    23 hours ago    925.4 MB
some_repo/some_image    0.0.4     0beabfa514ea    45 hours ago    925.4 MB
some_repo/some_image    0.0.3     54302cd10bf2    6 days ago      978.5 MB
some_repo/some_image    0.0.2     0078b30f3d9a    7 days ago      978.5 MB
some_repo/some_image    0.0.1     sdfgdf0f3d9a    8 days ago      938.5 MB
&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;마지막 3개나 4개는 롤백으로 하고 나머지는 다 없애줬으면 좋겠어요.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;유닉스&lt;/font&gt;&lt;/font&gt;&lt;code&gt;tail&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;당신의 가장 친한 친구입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;부터&lt;/font&gt;&lt;/font&gt;&lt;code&gt;docker images&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;docker ps&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;날짜별로 둘다 주문하면 됩니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;tail&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;/p&gt; 
&lt;pre&gt;&lt;code&gt;docker rmi $(docker images -q | tail -n +4)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;배포 스크립트와 함께(또는 로컬에서) 실행하면 공간을 너무 많이 차지하거나 오래된 이미지로 인해 어수선한 작업을 하지 않고도 항상 이미지를 충분히 롤백할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;개인적으로, 저는 언제든지 생산 박스에 컨테이너 하나만 보관하고 있지만, 더 많은 것을 원한다면 컨테이너를 가지고도 같은 종류의 일을 할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;docker rm $(docker ps -aq | tail -n +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 papago-translate=&quot;translated&quot;&gt;마지막 세 개의 이미지를 some_repo/some_image에 저장하려고 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&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;code&gt;awk&lt;/code&gt;&lt;font 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;docker rmi $(docker images -a | grep 'some_repo/some_image' | awk '{print $3}' | tail -n +4)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다시 말하지만, 용기에도 같은 생각이 적용되지만, 이 시점에서 이해하게 되므로 예는 그만 두겠습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;용도:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;docker rm -f $(docker ps -a -q)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;로컬에 있는 모든 컨테이너를 강제로 중지하고 제거합니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;모든 기존 이미지 보기:&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;docker images -a
&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;docker ps -a
&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;docker images -a
docker rmi &amp;lt;IMAGE_ID&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;docker ps -a
docker stop &amp;lt;CONTAINER_ID&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;docker ps -a
docker stop &amp;lt;CONTAINER_ID1&amp;gt; &amp;lt;CONTAINER_ID2&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;docker ps -a
docker rm &amp;lt;CONTAINER_ID&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;docker images -a
docker rmi &amp;lt;IMAGE_ID1&amp;gt; &amp;lt;IMAGE_ID2&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;docker ps -a
docker rm &amp;lt;CONTAINER_ID1&amp;gt; &amp;lt;CONTAINER_ID2&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;docker rmi -f $(docker images -a -q)
&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;docker rm $(docker ps -a -q) &amp;amp;&amp;amp; docker rmi -f $(docker images -a -q)
&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;docker container prune
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;가장 오래된 5개의 용기를 제거합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;docker rm `docker ps -aq | tail -n 5`
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;남은 컨테이너 수 확인:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;docker ps -aq | wc -l
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;정지된 모든 용기를 제거합니다.&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;sudo docker rm (sudo docker ps -a -q)&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이렇게 하면 도커 ps -a -q가 있는 모든 컨테이너의 목록을 얻고 ID를 도커 rm에 전달하여 정지된 모든 컨테이너를 제거합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이렇게 하면 실행 중인 컨테이너가 제거되지 않으며 실행 중인 이미지를 제거할 수 없다는 것을 알 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;태그가 지정되지 않은 모든 이미지 제거&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이제 오래된 이미지를 정리하여 공간을 절약하려고 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;sudo docker rmi (sudo docker images -q --filter &quot;dangling=true&quot;)&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;새로운 방법:&lt;/strong&gt; spotify/docker-gc가 속임수를 씁니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt; docker run --rm -v /var/run/docker.sock:/var/run/docker.sock -v /etc:/etc spotify/docker-gc
&lt;/code&gt;&lt;/pre&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;/ul&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;환경 설정을 지원해 왔습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;태그가 여러 개인 이미지를 강제로 삭제&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt; FORCE_IMAGE_REMOVAL=1
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;컨테이너 삭제 강제화&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt; FORCE_CONTAINER_REMOVAL=1 
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;가비지 컬렉션에서 최근에 종료된 컨테이너 및 이미지 제외&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt; GRACE_PERIOD_SECONDS=86400
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 설정은 또한 GRACE_PERIODE_SECONDS 초 미만으로 생성된 이미지를 제거하지 못하도록 합니다.&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; DRY_RUN=1
&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; CLEAN_UP_VOLUME&lt;strong&gt;=&lt;/strong&gt;1&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;참조 : &lt;a href=&quot;https://github.com/spotify/docker-gc&quot; rel=&quot;noreferrer&quot;&gt;도커-gc&lt;/a&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;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; docker ps -a -q -f status=exited | xargs --no-run-if-empty docker rm
             OR 
 docker rm $(docker ps -a -q)
&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; docker images -q | xargs --no-run-if-empty docker rmi
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;도커 버전 1.10.x 이상에 대해 고아 도커 볼륨 정리&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt; docker volume ls -qf dangling=true | xargs -r docker volume rm
&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; docker ps -a | grep &quot;weeks ago&quot; | awk &quot;{print $1}&quot; | xargs --no-run-if-empty docker rm
 docker ps -a | grep &quot;days ago&quot; | awk &quot;{print $1}&quot; | xargs --no-run-if-empty docker rm
 docker ps -a | grep &quot;hours ago&quot; | awk &quot;{print $1}&quot; | xargs --no-run-if-empty docker rm
&lt;/code&gt;&lt;/pre&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;pre&gt;&lt;code&gt;docker rm $(docker ps -a -q)
&lt;/code&gt;&lt;/pre&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;$ docker ps -a (lists all old containers)

$ docker rm container-Id
&lt;/code&gt;&lt;/pre&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;docker rm $(sudo docker ps -a | grep Exit | cut -d ' ' -f 1)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;도커의 이전 이미지도 제거하기 위한 전체 요지: &lt;a href=&quot;https://gist.github.com/urodoz/8ff64c77ecfb27c7cb32&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;저는 이 간단한 답을 보지 못했기 때문에 추가하고 싶었고, 질문은 구체적으로 &quot;전체&quot;가 아니라 &quot;오래된&quot; 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;sudo docker container prune --filter &quot;until=24h&quot;&lt;/code&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;보다 오래된 용기를 제거하고자 하는 시간 범위에 따라 24시간을 조정합니다.&lt;/font&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;#!/bin/bash
# docker-gc --- Remove stopped docker containers

RUNNING=$(docker ps -q)
ALL=$(docker ps -a -q)

for container in $ALL ; do
    [[ &quot;$RUNNING&quot; =~ &quot;$container&quot; ]] &amp;amp;&amp;amp; continue
    echo Removing container: $(docker rm $container)
done
&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;docker stop $(docker ps -a -q)&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;docker rm $(docker ps -a -q)&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;docker system prune -a
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;항상 사용합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;docker rmi $(docker ps -a -q)&lt;/code&gt;&lt;font 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;/var/lib/docker/graph&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언제&lt;/font&gt;&lt;/font&gt;&lt;code&gt;docker rmi&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;불합격의&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;h3&gt;&lt;font papago-translate=&quot;translated&quot;&gt;모든 용기 및 이미지를 정지/제거하는 기본 단계&lt;/font&gt;&lt;/h3&gt; 
&lt;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;code&gt;docker ps -aq&lt;/code&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;code&gt;docker stop $(docker ps -aq)&lt;/code&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;code&gt;docker rm $(docker ps -aq)&lt;/code&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;code&gt;docker rmi $(docker images -q)&lt;/code&gt;&lt;/p&gt; &lt;/li&gt; 
&lt;/ol&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;참고:&lt;/strong&gt; 먼저 실행 중인 모든 용기를 중지한 후 제거해야 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;또한 이미지를 제거하기 전에 해당 종속 컨테이너를 중지하고 제거해야 합니다.&lt;/font&gt;&lt;/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;docker stop --force $(docker ps -a|grep Exited| awk '{print $1}')
docker rm --force $(docker ps -a|grep Exited| awk '{print $1}')
docker stop --force $(docker ps -a|grep Restarting| awk '{print $1}')
docker rm --force $(docker ps -a|grep Restarting| awk '{print $1}')
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아래 명령을 사용하여 &lt;strong&gt;none&lt;/strong&gt;(없음)으로 명명된 이미지를 제거&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;docker image rm --force $(docker image ls  |grep none |awk '{print $3}')
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;관심있는 모든 사람들을 위해 qkrijger의 예를 들어 명확한 all로 바꿨습니다(모두 멈추고 제거).&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;docker stop `docker ps --no-trunc -aq` ; docker rm `docker ps --no-trunc -aq`
&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/17236796/how-to-remove-old-docker-containers&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>docker</category>
      <author>muds</author>
      <guid isPermaLink="true">https://muds.tistory.com/1482</guid>
      <comments>https://muds.tistory.com/1482#entry1482comment</comments>
      <pubDate>Thu, 2 Nov 2023 22:10:36 +0900</pubDate>
    </item>
    <item>
      <title>iOS 8에서 팝업을 올바르게 표시하는 방법</title>
      <link>https://muds.tistory.com/1481</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;iOS 8에서 팝업을 올바르게 표시하는 방법&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Swift iOS 8 앱에 UIPopoverView를 추가하려고 하는데 팝업이 올바른 모양으로 표시되지 않아 PopoverContentSize 속성에 액세스할 수 없습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var popover: UIPopoverController? = nil 

    func addCategory() {

    var newCategory = storyboard.instantiateViewControllerWithIdentifier(&quot;NewCategory&quot;) as UIViewController
    var nav = UINavigationController(rootViewController: newCategory)
    popover = UIPopoverController(contentViewController: nav)
    popover!.setPopoverContentSize(CGSizeMake(550, 600), animated: true)
    popover!.delegate = self
    popover!.presentPopoverFromBarButtonItem(self.navigationItem.rightBarButtonItem, permittedArrowDirections: UIPopoverArrowDirection.Any, animated: true)
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;출력:&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;img src=&quot;https://i.stack.imgur.com/kwxBG.png&quot; alt=&quot;enter image description here&quot;&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;UIPopover Presentation Controller를 통해 동일한 작업을 수행할 때도 여전히 수행되지 않습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이게 내 코드입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;func addCategory() {

    var popoverContent = self.storyboard.instantiateViewControllerWithIdentifier(&quot;NewCategory&quot;) as UIViewController
    var nav = UINavigationController(rootViewController: popoverContent)
    nav.modalPresentationStyle = UIModalPresentationStyle.Popover
    var popover = nav.popoverPresentationController as UIPopoverPresentationController
    popover.delegate = self
    popover.popoverContentSize = CGSizeMake(1000, 300)
    popover.sourceView = self.view
    popover.sourceRect = CGRectMake(100,100,0,0)

    self.presentViewController(nav, animated: true, completion: nil)

}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 정확히 같은 출력을 받습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;팝업 크기를 사용자 지정하려면 어떻게 해야 합니까?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;어떤 도움이라도 주시면 대단히 감사하겠습니다!&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;좋아요, 하우스메이트가 그걸 보고 알아냈어요&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt; func addCategory() {

    var popoverContent = self.storyboard?.instantiateViewControllerWithIdentifier(&quot;NewCategory&quot;) as UIViewController
    var nav = UINavigationController(rootViewController: popoverContent)
    nav.modalPresentationStyle = UIModalPresentationStyle.Popover
    var popover = nav.popoverPresentationController
    popoverContent.preferredContentSize = CGSizeMake(500,600)
    popover.delegate = self
    popover.sourceView = self.view
    popover.sourceRect = CGRectMake(100,100,0,0)

    self.presentViewController(nav, animated: true, completion: nil)

}
&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;preferredContentSize&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 papago-translate=&quot;translated&quot;&gt;스토리보드에서 사용할 뷰 컨트롤러를 팝업으로 만들고 뷰 컨트롤러 클래스를 평소처럼 만들어야 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;팝업을 열고 싶은 개체에서 아래와 같이 seegue를 만듭니다. 이 경우에는&lt;/font&gt;&lt;/font&gt;&lt;code&gt;UIBarButton&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이름은 &quot;Config&quot;입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;img src=&quot;https://i.stack.imgur.com/kPCoq.png&quot; alt=&quot;enter image description here&quot;&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&quot;Mother View Controller&quot;에서 다음을 구현합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;UIPopoverPresentationControllerDelegate&lt;/code&gt;&lt;font 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;func popoverPresentationControllerDidDismissPopover(popoverPresentationController: UIPopoverPresentationController) {
    //do som stuff from the popover
}
&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;prepareForSeque&lt;/code&gt;&lt;font 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;override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
     //segue for the popover configuration window
    if segue.identifier == &quot;yourSegueIdentifierForPopOver&quot; {
        if let controller = segue.destinationViewController as? UIViewController {
            controller.popoverPresentationController!.delegate = self
            controller.preferredContentSize = CGSize(width: 320, height: 186)
        }
    }
}
&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;그리고 당신은 컨텐츠 컨트롤러를 사용하여 손에 넣을 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;popoverPresentationController.presentedViewController&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;메소드 인 더&lt;/font&gt;&lt;/font&gt;&lt;code&gt;UIPopoverPresentationController&lt;/code&gt;&lt;font 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;func adaptivePresentationStyle(for controller: UIPresentationController) -&amp;gt; UIModalPresentationStyle {

        return UIModalPresentationStyle.none
    } 
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;장치/방향 https://github.com/frogcjn/AdaptivePopover_iOS8_Swift 에 관계없이 &lt;em&gt;항상&lt;/em&gt; 팝업을 표시할 수 있도록 이 모든 것을 작동시키는 방법에 대한 완벽한 예를 찾았습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;핵심은 UIA Adaptive Presentation Controller 딜러를 구현하는 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;func adaptivePresentationStyleForPresentationController(PC: UIPresentationController!) -&amp;gt; UIModalPresentationStyle {
    // This *forces* a popover to be displayed on the iPhone
    return .None
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그런 다음 위의 예(Imagine Digital에서)를 확장합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;nav.popoverPresentationController!.delegate = implOfUIAPCDelegate
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;스위프트 2.0&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;스토리보드에서 보기 컨트롤러를 만들었습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;PopOverViewController 클래스와 연관되어 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;import UIKit

class PopOverViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()    
        self.preferredContentSize = CGSizeMake(200, 200)    
        self.navigationItem.leftBarButtonItem = UIBarButtonItem(barButtonSystemItem: .Done, target: self, action: &quot;dismiss:&quot;)    
    }    
    func dismiss(sender: AnyObject) {
        self.dismissViewControllerAnimated(true, completion: nil)
    }
}      
&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;//  ViewController.swift

import UIKit

class ViewController: UIViewController, UIPopoverPresentationControllerDelegate
{
    func showPopover(base: UIView)
    {
        if let viewController = self.storyboard?.instantiateViewControllerWithIdentifier(&quot;popover&quot;) as? PopOverViewController {    

            let navController = UINavigationController(rootViewController: viewController)
            navController.modalPresentationStyle = .Popover

            if let pctrl = navController.popoverPresentationController {
                pctrl.delegate = self

                pctrl.sourceView = base
                pctrl.sourceRect = base.bounds

                self.presentViewController(navController, animated: true, completion: nil)
            }
        }
    }    
    override func viewDidLoad(){
        super.viewDidLoad()
    }    
    @IBAction func onShow(sender: UIButton)
    {
        self.showPopover(sender)
    }    
    func adaptivePresentationStyleForPresentationController(controller: UIPresentationController) -&amp;gt; UIModalPresentationStyle {
        return .None
    }
}  
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;참고: Func showPopover(기본:&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;UIView) 메서드는 ViewDidLoad 앞에 배치해야 합니다.&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;iOS9 UIPoverController에서는 사용하지 않습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그래서 iOS9.x 위의 Objective-C 버전에 대해 아래 코드를 사용할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;- (IBAction)onclickPopover:(id)sender {
UIStoryboard *sb = [UIStoryboard storyboardWithName:@&quot;Main&quot; bundle:[NSBundle mainBundle]];
UIViewController *viewController = [sb instantiateViewControllerWithIdentifier:@&quot;popover&quot;];

viewController.modalPresentationStyle = UIModalPresentationPopover;
viewController.popoverPresentationController.sourceView = self.popOverBtn;
viewController.popoverPresentationController.sourceRect = self.popOverBtn.bounds;
viewController.popoverPresentationController.permittedArrowDirections = UIPopoverArrowDirectionAny;
[self presentViewController:viewController animated:YES completion:nil]; }
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여기 &quot;Joris416&quot; Swift Code를 Objective-c로 변환합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;-(void) popoverstart
{
    ViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@&quot;PopoverView&quot;];
    UINavigationController *nav = [[UINavigationController alloc]initWithRootViewController:controller];
    nav.modalPresentationStyle = UIModalPresentationPopover;
    UIPopoverPresentationController *popover = nav.popoverPresentationController;
    controller.preferredContentSize = CGSizeMake(300, 200);
    popover.delegate = self;
    popover.sourceView = self.view;
    popover.sourceRect = CGRectMake(100, 100, 0, 0);
    popover.permittedArrowDirections = UIPopoverArrowDirectionAny;
    [self presentViewController:nav animated:YES completion:nil];
}

-(UIModalPresentationStyle) adaptivePresentationStyleForPresentationController: (UIPresentationController * ) controller
{
    return UIModalPresentationNone;
}
&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;ADD할 것을 기억합니다.&lt;/font&gt;&lt;/font&gt;&lt;br&gt; &lt;code&gt;UIPopoverPresentationControllerDelegate, UIAdaptivePresentationControllerDelegate&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이는 &lt;a href=&quot;http://www.shinobicontrols.com/blog/posts/2014/08/26/ios8-day-by-day-day-21-alerts-and-popovers&quot;&gt;iOS8 Day-by-Day&lt;/a&gt; 블로그에서 가장 잘 설명됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;간단히 말해, UIViewController의 modal Presentation Style을 로 설정한 후에 말입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;팝업, 컨트롤러의 popover Presentation Controller 속성을 통해 UIP popover Presentation Class(새로운 iOS8 클래스)를 가져올 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;위의 Objective-C 버전의 Imagine Digitals 빠른 답변을 만들었습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사전 테스트 중에 작동하는 것 같아서 빠진 것은 없는 것 같은데 발견되면 알려주시면 업데이트하겠습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;-(void) presentPopover
{
    YourViewController* popoverContent = [[YourViewController alloc] init]; //this will be a subclass of UIViewController
    UINavigationController* nav =  [[UINavigationController alloc] initWithRootViewController:popoverContent];
    nav.modalPresentationStyle = UIModalPresentationPopover;
    UIPopoverPresentationController* popover = nav.popoverPresentationController;
    popoverContent.preferredContentSize = CGSizeMake(500,600);
    popover.delegate = self;
    popover.sourceRect = CGRectMake(100,100,0,0); //I actually used popover.barButtonItem = self.myBarButton;

    [self presentViewController:nav animated:YES completion:nil];
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;xcode 9.1 / swift 4에 대한 나의 2센트.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;class ViewController: UIViewController, UIPopoverPresentationControllerDelegate {

    override func viewDidLoad(){
        super.viewDidLoad()

        let when = DispatchTime.now() + 0.5

        DispatchQueue.main.asyncAfter(deadline: when, execute: { () -&amp;gt; Void in
            // to test after 05.secs... :)
            self.showPopover(base: self.view)

        })

}


func showPopover(base: UIView) {
    if let viewController = self.storyboard?.instantiateViewController(withIdentifier: &quot;popover&quot;) as? PopOverViewController {

        let navController = UINavigationController(rootViewController: viewController)
        navController.modalPresentationStyle = .popover

        if let pctrl = navController.popoverPresentationController {
            pctrl.delegate = self

            pctrl.sourceView = base
            pctrl.sourceRect = base.bounds

            self.present(navController, animated: true, completion: nil)
        }
    }
}


@IBAction func onShow(sender: UIButton){
    self.showPopover(base: sender)
}

func adaptivePresentationStyle(for controller: UIPresentationController, traitCollection: UITraitCollection) -&amp;gt; UIModalPresentationStyle{
    return .none
}
&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;funcaptive PresentationStyle...&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;    return .popover
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;또는: .pageSheet... 등을 반환합니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;View 컨트롤러에 UIA Adaptive PresentationControllerDelegate를 구현합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그런 다음 추가:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;func adaptivePresentationStyle(for controller: UIPresentationController, traitCollection: UITraitCollection) -&amp;gt; UIModalPresentationStyle{
    return .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;a href=&quot;https://www.appcoda.com/presentation-controllers-tutorial/&quot; rel=&quot;nofollow noreferrer&quot;&gt;https://www.appcoda.com/presentation-controllers-tutorial/&lt;/a&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;요약하면, 실행 가능한 구현(&lt;strong&gt;Swift 4.2&lt;/strong&gt;의 원래 기사 구문에서 일부 업데이트된 부분이 있음)은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;func showPopover(ofViewController popoverViewController: UIViewController, originView: UIView) {
    popoverViewController.modalPresentationStyle = UIModalPresentationStyle.popover
    if let popoverController = popoverViewController.popoverPresentationController {
        popoverController.delegate = self
        popoverController.sourceView = originView
        popoverController.sourceRect = originView.bounds
        popoverController.permittedArrowDirections = UIPopoverArrowDirection.any
    }
    self.present(popoverViewController, animated: true)
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 중 많은 부분은 @mmc의 답변에서 이미 다루었지만, 이 기사는 사용된 코드 요소 중 일부를 설명하는 데 도움이 되며, 확장할 수 있는 방법도 보여줍니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;또한 iPhone 대 iPad의 프레젠테이션 스타일을 처리하기 위해 위임을 사용하는 방법과 전체 화면으로 보여진 경우 팝업을 삭제할 수 있는 방법에 대한 추가 세부 정보도 제공합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;다시&lt;/strong&gt;, &lt;strong&gt;Swift 4&lt;/strong&gt;.2용으로 업데이트됨:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;func adaptivePresentationStyle(for: UIPresentationController) -&amp;gt; UIModalPresentationStyle {
    //return UIModalPresentationStyle.fullScreen
    return UIModalPresentationStyle.none
}

func adaptivePresentationStyle(for controller: UIPresentationController, traitCollection: UITraitCollection) -&amp;gt; UIModalPresentationStyle {
    if traitCollection.horizontalSizeClass == .compact {
        return UIModalPresentationStyle.none
        //return UIModalPresentationStyle.fullScreen
    }
    //return UIModalPresentationStyle.fullScreen
    return UIModalPresentationStyle.none
}

func presentationController(_ controller: UIPresentationController, viewControllerForAdaptivePresentationStyle style: UIModalPresentationStyle) -&amp;gt; UIViewController? {
    switch style {
    case .fullScreen:
        let navigationController = UINavigationController(rootViewController: controller.presentedViewController)
        let doneButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonItem.SystemItem.done, target: self, action: #selector(doneWithPopover))
        navigationController.topViewController?.navigationItem.rightBarButtonItem = doneButton
        return navigationController
    default:
        return controller.presentedViewController
    }
}

// As of Swift 4, functions used in selectors must be declared as @objc
@objc private func doneWithPopover() {
    self.dismiss(animated: true, completion: nil)
}
&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 popoverContent = (self.storyboard?.instantiateViewController(withIdentifier: &quot;WhatsNewViewController&quot;))! as UIViewController
        var nav = UINavigationController(rootViewController: popoverContent)
    nav.modalPresentationStyle = UIModalPresentationStyle.popover
        var popover = nav.popoverPresentationController
        popoverContent.preferredContentSize = CGSize(width: 500, height: 100)
        popover?.delegate = self
        popover?.sourceView = self.view
        popover?.sourceRect = CGRectMake(100,100,0,0)

    self.present(nav, animated: true, completion: nil)
&lt;/code&gt;&lt;/pre&gt;&lt;h1&gt;&lt;font papago-translate=&quot;translated&quot;&gt;공부하고 싶은 사람들을 위해!&lt;/font&gt;&lt;/h1&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 Popover view를 연구하고 사용하려는 사람들을 위해 Open Source 프로젝트를 만들었습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;프로젝트는 여기서 찾을 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;https://github.com/tryWabbit/KTListPopup&quot; rel=&quot;nofollow noreferrer&quot;&gt;https://github.com/tryWabbit/KTListPopup&lt;/a&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/20557360/61028815-3d1b3480-a3d7-11e9-8293-ee6e6c18b97a.gif&quot; alt=&quot;KTListNewResize&quot;&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/24635744/how-to-present-popover-properly-in-ios-8&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>swift</category>
      <author>muds</author>
      <guid isPermaLink="true">https://muds.tistory.com/1481</guid>
      <comments>https://muds.tistory.com/1481#entry1481comment</comments>
      <pubDate>Thu, 2 Nov 2023 22:10:24 +0900</pubDate>
    </item>
    <item>
      <title>오류: &amp;quot;삽입할 노드가 다른 문서 컨텍스트에 있습니다.&amp;quot;</title>
      <link>https://muds.tistory.com/1480</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;오류: &quot;삽입할 노드가 다른 문서 컨텍스트에 있습니다.&quot;&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;내가 전화할 때&lt;/font&gt;&lt;/font&gt;&lt;code&gt;XmlNode.AppendChild()&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;, 다음 오류가 발생합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;삽입할 노드는 다른 문서 컨텍스트에서 가져온 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;pre&gt;&lt;code&gt;static public XmlNode XMLNewChildNode(XmlNode oParent, string sName, 
    string sNamespaceURI, string sNodeType)
{
    XmlNode oNode = moDoc.CreateNode(sNodeType, sName, sNamespaceURI);
    oParent.AppendChild(oNode);
    return oNode;
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 코드는 VB 6.0 버전에서 변환되었습니다(선택적 매개 변수는 무시하십시오. C# 버전에서는 오버로드가 발생합니다).&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Public Function XMLNewChildNode(ByVal oParent As IXMLDOMNode, ByVal _
    sName As String, Optional ByVal sNamespaceURI As String = &quot;&quot;, _
    Optional ByVal sNodeType As String = &quot;element&quot;) As IXMLDOMNode
'**************** DESCRIPTION *******************
  'Create a new Child Node for passed Parent.
'***************** VARIABLES ********************
  Dim oNode As IXMLDOMNode
'************************************************
  Set oNode = moDoc.createNode(sNodeType, sName, sNamespaceURI)
  Call oParent.appendChild(oNode)
  Set XMLNewChildNode = oNode
End Function
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;C#은 작동하지 않는 반면 VB 코드는 작동하는 이유는 무엇입니까?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;VB와 C#가 XML을 처리하는 방식에 차이가 있습니까?&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;XmlNode oNode = moDoc.CreateNode(sNodeType, sName, sNamespaceURI);

//necessary for crossing XmlDocument contexts
XmlNode importNode = oParent.OwnerDocument.ImportNode(oNode, true);

oParent.AppendChild(importNode);
return oNode;
&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/3019136/error-the-node-to-be-inserted-is-from-a-different-document-context&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>xml</category>
      <author>muds</author>
      <guid isPermaLink="true">https://muds.tistory.com/1480</guid>
      <comments>https://muds.tistory.com/1480#entry1480comment</comments>
      <pubDate>Thu, 2 Nov 2023 22:10:11 +0900</pubDate>
    </item>
    <item>
      <title>우커머스를 카트 URL에 추가</title>
      <link>https://muds.tistory.com/1479</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;우커머스를 카트 URL에 추가&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;우커머스 카트에 상품을 추가하기 위해 버튼에 간단한 HTML URL 링크를 붙이는 것이 가능한지 알아보려고 합니다.&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이 포함된 각 제품에 대한 버튼이 있지만 클릭하면 제품을 우커머스 카트에 추가할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;짧은 코드를 사용하여 이를 수행하는 방법이 있는 것처럼 보이지만 테마는 괄호를 제거하여 전체 URL이 필요합니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;특정 제품을 카트에 추가하는 URL을 가지고 카트/체크아웃 페이지를 열고 싶다면, 보호된 디렉토리에 저장되어 있으므로 다운로드 가능한 파일에 직접 링크할 수 없습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;http://yourproducturl.com/checkout/?add-to-cart=%ID%&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;http://yourproducturl.com/checkout/ ?add-to-cart=%ID%&lt;/font&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;http://yourproducturl.com/cart/?add-to-cart=%ID%&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;http://yourproducturl.com/cart/ ?add-to-cart=%ID%&lt;/font&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;교체하다&lt;/font&gt;&lt;/font&gt;&lt;code&gt;%ID%&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;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/21511395/woocommerce-add-to-cart-url&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>WordPress</category>
      <author>muds</author>
      <guid isPermaLink="true">https://muds.tistory.com/1479</guid>
      <comments>https://muds.tistory.com/1479#entry1479comment</comments>
      <pubDate>Thu, 2 Nov 2023 22:10:04 +0900</pubDate>
    </item>
    <item>
      <title>mariadb의 &amp;quot;With As&amp;quot;를 변경하는 다른 방법</title>
      <link>https://muds.tistory.com/1478</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;mariadb의 &quot;With As&quot;를 변경하는 다른 방법&lt;/font&gt;&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;WITH KPILibHier (kpilib_code,parent_code,kpi_name, depth, iscategory)
AS ( SELECT K.kpilib_code, K.parent_code, K.kpi_name_en, K.kpi_depth, K.iscategory 
     FROM TPMDPERIODKPILIB K 
     INNER JOIN TPMDPERIODKPI PK ON PK.period_code = K.period_code 
     UNION ALL 
     SELECT A.kpilib_code, A.parent_code, A.kpi_name_en, A.kpi_depth, A.iscategory 
     FROM TPMDPERIODKPILIB A 
     INNER JOIN KPILibHier AS B ON A.kpilib_code = B.parent_code )
SELECT DISTINCT Z.kpi_name AS libname, Z.kpilib_code AS libcode,
Z.parent_code AS pcode, Z.depth, Z.iscategory, PK.target
FROM KPILibHier Z
LEFT JOIN TPMDPERIODKPILIB KPI 
  ON KPI.kpilib_code = Z.kpilib_code
LEFT JOIN TPMDPERIODKPI PK 
  ON PK.period_code = KPI.period_code 
ORDER BY Z.depth, Z.kpi_name 
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이건 내 암호입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;SQL 서버에서 실행할 수 있지만 이제는 마리아드비를 사용해야 하고 마리아드비는 &quot;WITH AS&quot;를 사용하지 않습니다. 그렇다면 동일한 결과에 대해 이 코드를 변경할 수 있는 다른 방법이 있습니까?&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;보시다시피 CTE 내부에도 'INNER JOIN KPILIBHier'가 있어서 평소처럼 평범한 서브쿼리를 만들지 못했습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;CTE의 내용을 파생된 테이블로 옮기는 것만으로도 사용 가능한 것을 제공할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;뭐 그런 거..&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;SELECT DISTINCT Z.kpi_name AS libname, Z.kpilib_code AS libcode,
Z.parent_code AS pcode, Z.depth, Z.iscategory, PK.target
FROM
( SELECT K.kpilib_code, K.parent_code, K.kpi_name_en AS kpi_name, K.kpi_depth AS depth, K.iscategory 
     FROM TPMDPERIODKPILIB K 
     INNER JOIN TPMDPERIODKPI PK ON PK.period_code = K.period_code 
     UNION ALL 
     SELECT A.kpilib_code, A.parent_code, A.kpi_name_en, A.kpi_depth, A.iscategory 
     FROM TPMDPERIODKPILIB A 
     ) z
INNER JOIN z AS B ON A.kpilib_code = B.parent_code 
LEFT JOIN TPMDPERIODKPILIB KPI 
  ON KPI.kpilib_code = Z.kpilib_code
LEFT JOIN TPMDPERIODKPI PK 
  ON PK.period_code = KPI.period_code 
ORDER BY Z.depth, Z.kpi_name 
&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/32642962/any-other-ways-to-change-with-as-for-mariadb&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>MariaDB</category>
      <author>muds</author>
      <guid isPermaLink="true">https://muds.tistory.com/1478</guid>
      <comments>https://muds.tistory.com/1478#entry1478comment</comments>
      <pubDate>Thu, 2 Nov 2023 22:09:58 +0900</pubDate>
    </item>
    <item>
      <title>선언은 Swift 1.2의 '최종' 오류와 '동적' 오류 모두일 수 없습니다.</title>
      <link>https://muds.tistory.com/1477</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;선언은 Swift 1.2의 '최종' 오류와 '동적' 오류 모두일 수 없습니다.&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;value&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아래&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;import Foundation

class AAA: NSObject {
    func test2() {
        self.dynamicType
    }
}
extension AAA {
    static let value    =   111
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음 컴파일 오류가 발생합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;A declaration cannot be both 'final' and 'dynamic'
&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.2 (Xcode 6.3.16 D1002 내에 출고된 버전)를 사용하고 있습니다.&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;이 문제는 클래스가 다음에서 상속되므로 Swift가 Obj-C 호환성에 대한 정적 속성에 대한 동적 액세스자를 생성하려고 하기 때문에 발생합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;NSObject&lt;/code&gt;&lt;font 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;만약 당신의 프로젝트가 a를 사용하는 것이 아니라 swift에만 있다면,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;var&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;accessor 를 통해 문제를 피할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;@nonobjc&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Swift 2.0의 속성:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;import Foundation

class AAA: NSObject {}
extension AAA {
    @nonobjc static let value = 111
}
&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;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하위 분류:&lt;/font&gt;&lt;/font&gt;&lt;code&gt;NSObject&lt;/code&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;Has a&lt;/font&gt;&lt;/font&gt;&lt;code&gt;static let&lt;/code&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;dynamicType&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;왜 이런 일이 생기는지는 모르겠지만, 이 방법을 사용해 보세요.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;static var value: Int {
    get {
        return 111
    }
}
&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;static var value: Int {
    return 111
}
&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;static var { get }&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;대신에&lt;/font&gt;&lt;/font&gt;&lt;code&gt;static let&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;hr&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;속성 게터와 그 호출 비용은 위의 예에서 LLVM optimizer에 의해 제거될 가능성이 매우 높으나, 이를 명시적으로 피하는 것이 좋을 것입니다.&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;static var value: Int {
    return cache
}
private let cache = getTheNumber()
&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;static var value: Int {
    struct Local {
        static let cache = getTheNumber()
    }
    return Local.cache
}
&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;pre&gt;&lt;code&gt;extension NotificationsViewController: UITableViewDataSource , UITableViewDelegate {

    static var timeIntervalFormatter = NSDateComponentsFormatter()

}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;수업 실행으로 옮겨서 문제가 해결되었습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 다른 원인으로 같은 문제를 우연히 발견했고, 같은 불필요한 오류 메시지를 경험하는 다른 사람들을 위해 여기에 게시하고 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;확장에 정의된 계산 변수를 재정의하는 최종 클래스도 이 오류를 발생시킵니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것은 기능을 위해 작동하기 때문에 컴파일러 버그처럼 보입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;// at line 0: a declaration cannot be both 'final' and 'dynamic'

import UIKit

extension UIViewController {
    var test: Int { return 0 }
}

final class TestController: UIViewController {
    override var test: Int { return 1 }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 이 문제를 제가 확장자에서 정의한 새로운 구조로 static declaration을 이동하여 해결하였습니다.&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;extension NSOperationQueue {
    static var parsingQueue : NSOperationQueue = {
        let queue = NSOperationQueue()
        queue.maxConcurrentOperationCount = 1
        return queue
        }()
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;나는 이것을 가지고 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;extension NSOperationQueue {        
    struct Shared {
        static var parsingQueue : NSOperationQueue = {
            let queue = NSOperationQueue()
            queue.maxConcurrentOperationCount = 1
            return queue                
            }()
    }
}
&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;extension AAA {

    private static let value = 111

    public func getDatValue() -&amp;gt; Int {
        return AAA.value
    }    
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저 같은 경우는 확장 자체에 있는 재산만 참고했기 때문에 굳이 노출시킬 필요가 없었습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/a/29814707/1035008&quot;&gt;@Eonil의 답변&lt;/a&gt;에 비해 약간의 개선으로,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;get&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;필요 없음:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;static var value: Int { return  111 }
&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/29814706/a-declaration-cannot-be-both-final-and-dynamic-error-in-swift-1-2&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>swift</category>
      <author>muds</author>
      <guid isPermaLink="true">https://muds.tistory.com/1477</guid>
      <comments>https://muds.tistory.com/1477#entry1477comment</comments>
      <pubDate>Thu, 2 Nov 2023 22:09:51 +0900</pubDate>
    </item>
    <item>
      <title>linux/list.h의 macro의 container_뒤에 있는 이론적 근거</title>
      <link>https://muds.tistory.com/1476</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;linux/list.h의 macro의 container_뒤에 있는 이론적 근거&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;/include/linux/list.h&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;, (아래 붙여넣기)의 첫 번째 줄 뒤에 있는 근거는 무엇입니까?&lt;/font&gt;&lt;/font&gt;&lt;code&gt;container_of&lt;/code&gt;&lt;font 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;const typeof( ((type *)0)-&amp;gt;member ) *__mptr = (ptr);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;나의 샘플 코드에서 나는 이 줄을 제거하고 정의를 다음으로 변경했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#define container_of(ptr, type, member) ({                      \
     (type *)( (char *)ptr - offsetof(type,member) );})
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제 코드는 여전히 기대했던 결과를 보여줬습니다&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그럼 첫번째 줄은 중복인가요?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아니면 제가 모르는 숨겨진 함정이 있는 건가요?&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;http://kernelnewbies.org/FAQ/LinkedLists&quot; rel=&quot;noreferrer&quot;&gt;FAQ/LinkedLists&lt;/a&gt;에서 찾은 코드&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;/**
 * container_of - cast a member of a structure out to the containing structure
 * @ptr:        the pointer to the member.
 * @type:       the type of the container struct this is embedded in.
 * @member:     the name of the member within the struct.
 *
 */
#define container_of(ptr, type, member) ({                      \
        const typeof( ((type *)0)-&amp;gt;member ) *__mptr = (ptr);    \
        (type *)( (char *)__mptr - offsetof(type,member) );})

#define offsetof(TYPE, MEMBER) ((size_t) &amp;amp;((TYPE *)0)-&amp;gt;MEMBER)
&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;struct foo { int bar; };

....

float a;
struct foo *var = container_of(&amp;amp;a, foo, bar);
&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;warning: initialization from incompatible pointer type
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;매크로가 어떻게 작동하는지에 대한 좋은 설명: 그렉 크로아-하트만의 &lt;a href=&quot;http://www.kroah.com/log/linux/container_of.html&quot;&gt;컨테이너&lt;/a&gt;.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/6083734/rationale-behind-the-container-of-macro-in-linux-list-h&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>C</category>
      <author>muds</author>
      <guid isPermaLink="true">https://muds.tistory.com/1476</guid>
      <comments>https://muds.tistory.com/1476#entry1476comment</comments>
      <pubDate>Thu, 2 Nov 2023 22:09:43 +0900</pubDate>
    </item>
    <item>
      <title>__sync_sync_sync_sync는 어떤 역할을 합니까?</title>
      <link>https://muds.tistory.com/1475</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;__sync_sync_sync_sync는 어떤 역할을 합니까?&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;__sync_synchronize()를 사용한 &lt;a href=&quot;https://stackoverflow.com/questions/890847/uint64-utc-time&quot;&gt;타이밍에 대한 질문에 대한 답변&lt;/a&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;/ul&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것은 &lt;a href=&quot;http://gcc.gnu.org/onlinedocs/gcc-4.6.2/gcc/Atomic-Builtins.html&quot; rel=&quot;noreferrer&quot;&gt;완전한 기억 장벽&lt;/a&gt;을 위해 내장된 원자입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;어떤 메모리 피연산자도 전진 또는 후진 작업을 통해 이동되지 않습니다.&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;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Memory_fence&quot; rel=&quot;noreferrer&quot;&gt;기억의 울타리&lt;/a&gt;를 강제하는 것 같아요.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 내장형은 전체 메모리 장벽을 발행합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;메모리 장벽의 경우 cpu는 명령어를 정렬하여 일반적으로 효율성을 향상시키지만 예상치 못한 결과를 초래할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예를 들어, 하드웨어에 4개의 레지스터가 있을 수 있습니다. 작업 명령을 내릴 때 레지스터 1개는 작업 명령을 저장하고(읽기 등), 레지스터 2개는 파라미터를 저장하고(주소, 크기 등), 마지막 레지스터는 제어 레지스터입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;모든 매개변수가 준비되면 하드웨어는 매개변수를 읽고 프로그램을 실행합니다. 이는 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;    writereg (dev.register_size,size);
    writereg (dev.register_addr,addr);
    writereg (dev.register_cmd,READ);
    writereg (dev.register_control,GO);

&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;마지막 동작 코드가 다른 코드보다 먼저 배치되면 이는 우리가 예상했던 것과 다릅니다. 따라서 처음 세 코드와 마지막 코드 사이에 메모리 장벽을 설치하여 CPU가 처음 세 코드 다음에 마지막 코드를 작동하도록 할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;    writereg (dev.register_size,size);
    writereg (dev.register_addr,addr);
    writereg (dev.register_cmd,READ);
    __sync_synchronize();
    writereg (dev.register_control,GO);

&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;쓰기 대기열과 읽기 캐싱을 중지합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&quot;volatile&quot;은 코드를 사용하여 값을 즉시 가져오거나 저장하는 컴파일러 옵션이지만, 오늘날의 CPU는 메모리 캐시와 외부 메모리에 대한 지연된 쓰기를 가진 여러 개의 코어를 가지고 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;__sync_synchron화 ()은 모든 코어가 동일한 값을 동시에 볼 수 있도록 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;...
X = new_value; // compiler and/or CPU could update X later when convienent
...
if ( X ) ... // compiler and/or CPU could use previous cached value of X
...
&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/982129/what-does-sync-synchronize-do&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>C</category>
      <author>muds</author>
      <guid isPermaLink="true">https://muds.tistory.com/1475</guid>
      <comments>https://muds.tistory.com/1475#entry1475comment</comments>
      <pubDate>Thu, 2 Nov 2023 22:09:37 +0900</pubDate>
    </item>
    <item>
      <title>XML 구문 분석 - 요소트리 대 SAX 및 DOM</title>
      <link>https://muds.tistory.com/1474</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;XML 구문 분석 - 요소&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;트리 대 SAX 및 DOM&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Python은 XML을 구문 분석하는 여러 가지 방법을 가지고 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;SAX&lt;/strong&gt;로 파싱하는 것의 기본을 이해합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이벤트 기반 API로 스트림 파서 기능을 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;DOM&lt;/strong&gt; 파서도 이해합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;XML을 메모리로 읽어 파이썬으로 접근할 수 있는 객체로 변환합니다.&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;파이썬 2.5부터는 ElementTree도 &lt;strong&gt;있습니다&lt;/strong&gt;.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것은 DOM과 SAX와 비교하면 어떻습니까?&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;ElementTree는 XML 트리(기본적으로)를 목록의 구조로 나타내고 속성은 사전으로 나타내기 때문에 훨씬 사용하기 쉽습니다.&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;ElementTree는 XML 트리에 대해 DOM보다 훨씬 적은 메모리를 필요로 하기 때문에 더 빠릅니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;iterparse&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;SAX에 필적합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;또한.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;iterparse&lt;/code&gt;&lt;font 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;ElementTree는 Python 2.5에서와 마찬가지로 완전한 XML 라이브러리에 비해 작은 피쳐 세트만 가지고 있지만 많은 응용 프로그램에 충분합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;검증 파서 또는 전체 XPath 지원이 필요한 경우 lxml을 사용하는 것이 좋습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예전에는 상당히 불안정했는데 2.1 이후로는 문제가 없었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;ElementTree는 노드가 부모 및 형제에 액세스할 수 있는 DOM에서 벗어납니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;텍스트 노드는 실제 노드로 취급되지 않기 때문에 데이터 저장소가 아닌 실제 문서를 처리하는 것도 다소 번거롭습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;XML 토막글에서&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;a&amp;gt;This is &amp;lt;b&amp;gt;a&amp;lt;/b&amp;gt; test&amp;lt;/a&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;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;tail&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;요소가 있는&lt;/font&gt;&lt;/font&gt;&lt;code&gt;b&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;일반적으로 Element를 추천합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;트리는 Python을 사용하는 모든 XML 처리의 기본값이며, DOM 또는 SAX는 특정 문제에 대한 솔루션입니다.&lt;/font&gt;&lt;/p&gt;&lt;h1&gt;&lt;font papago-translate=&quot;translated&quot;&gt;최소 DOM 구현:&lt;/font&gt;&lt;/h1&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;http://docs.python.org/2/library/xml.dom.minidom.html#module-xml.dom.minidom&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;Python은 XML DOM(&lt;em&gt;xml.dom&lt;/em&gt;)의 완전한 W3C 표준 구현과 &lt;em&gt;최소한의 구현&lt;/em&gt;인 xml&lt;em&gt;.dom&lt;/em&gt;.minidom을 제공합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 후자의 것은 전체 구현보다 더 간단하고 작습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러나 &quot;파싱적인 관점&quot;에서는 표준 DOM의 모든 장단점을 가지고 있습니다. 즉, 메모리에 모든 것을 로드합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;기본 XML 파일 고려:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot;?&amp;gt;
&amp;lt;catalog&amp;gt;
    &amp;lt;book isdn=&quot;xxx-1&quot;&amp;gt;
      &amp;lt;author&amp;gt;A1&amp;lt;/author&amp;gt;
      &amp;lt;title&amp;gt;T1&amp;lt;/title&amp;gt;
    &amp;lt;/book&amp;gt;
    &amp;lt;book isdn=&quot;xxx-2&quot;&amp;gt;
      &amp;lt;author&amp;gt;A2&amp;lt;/author&amp;gt;
      &amp;lt;title&amp;gt;T2&amp;lt;/title&amp;gt;
    &amp;lt;/book&amp;gt;
&amp;lt;/catalog&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;em&gt;미니돔&lt;/em&gt;을 사용할 수 있는 파이썬 파서는 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;import os
from xml.dom import minidom
from xml.parsers.expat import ExpatError

#-------- Select the XML file: --------#
#Current file name and directory:
curpath = os.path.dirname( os.path.realpath(__file__) )
filename = os.path.join(curpath, &quot;sample.xml&quot;)
#print &quot;Filename: %s&quot; % (filename)

#-------- Parse the XML file: --------#
try:
    #Parse the given XML file:
    xmldoc = minidom.parse(filepath)
except ExpatError as e:
    print &quot;[XML] Error (line %d): %d&quot; % (e.lineno, e.code)
    print &quot;[XML] Offset: %d&quot; % (e.offset)
    raise e
except IOError as e:
    print &quot;[IO] I/O Error %d: %s&quot; % (e.errno, e.strerror)
    raise e
else:
    catalog = xmldoc.documentElement
    books = catalog.getElementsByTagName(&quot;book&quot;)

    for book in books:
        print book.getAttribute('isdn')
        print book.getElementsByTagName('author')[0].firstChild.data
        print book.getElementsByTagName('title')[0].firstChild.data
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;em&gt;xml.&lt;/em&gt; parsers.expat은 Expat 비 validating XML 파서(docs.python.org/2/library/pyexpat.html) 에 대한 Python 인터페이스입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;em&gt;xml.dom&lt;/em&gt; 패키지는 예외 클래스 DOME &lt;em&gt;exception&lt;/em&gt;도 제공하지만 &lt;em&gt;minidom&lt;/em&gt;에서는 지원되지 않습니다!&lt;/font&gt;&lt;/p&gt; 
&lt;h1&gt;&lt;font papago-translate=&quot;translated&quot;&gt;더 엘리먼트&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;트리 XML API:&lt;/font&gt;&lt;/h1&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;http://docs.python.org/2/library/xml.etree.elementtree.html&quot; rel=&quot;noreferrer&quot;&gt;링크&lt;/a&gt;.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;em&gt;ElementTree&lt;/em&gt;는 XML DOM보다 훨씬 사용하기 쉽고 메모리도 덜 필요합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;또한 C 구현(&lt;em&gt;xml.etree&lt;/em&gt;)을 사용할 수 있습니다&lt;em&gt;.&lt;/em&gt;&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;em&gt;cElementTree&lt;/em&gt;).&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;em&gt;Element&lt;/em&gt;를 이용한 Python 파서 가능&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;em&gt;트리&lt;/em&gt;:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;import os
from xml.etree import cElementTree  # C implementation of xml.etree.ElementTree
from xml.parsers.expat import ExpatError  # XML formatting errors

#-------- Select the XML file: --------#
#Current file name and directory:
curpath = os.path.dirname( os.path.realpath(__file__) )
filename = os.path.join(curpath, &quot;sample.xml&quot;)
#print &quot;Filename: %s&quot; % (filename)

#-------- Parse the XML file: --------#
try:
    #Parse the given XML file:
    tree = cElementTree.parse(filename)
except ExpatError as e:
    print &quot;[XML] Error (line %d): %d&quot; % (e.lineno, e.code)
    print &quot;[XML] Offset: %d&quot; % (e.offset)
    raise e
except IOError as e:
    print &quot;[XML] I/O Error %d: %s&quot; % (e.errno, e.strerror)
    raise e
else:
    catalogue = tree.getroot()

    for book in catalogue:
        print book.attrib.get(&quot;isdn&quot;)
        print book.find('author').text
        print book.find('title').text
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;ElementTree에 더 많은 pythonic 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;Element와 같은 API를 가지고 있어서 &lt;a href=&quot;https://lxml.de/&quot; rel=&quot;nofollow noreferrer&quot;&gt;lxml&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;ElementTree의 parse()는 DOM과 같고 iterparse()는 SAX와 같습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;내 생각에, 요소&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;트리는 작업하기 쉬운 API를 제공한다는 점에서 DOM이나 SAX보다 우수합니다.&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/192907/xml-parsing-elementtree-vs-sax-and-dom&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>xml</category>
      <author>muds</author>
      <guid isPermaLink="true">https://muds.tistory.com/1474</guid>
      <comments>https://muds.tistory.com/1474#entry1474comment</comments>
      <pubDate>Thu, 2 Nov 2023 22:09:30 +0900</pubDate>
    </item>
    <item>
      <title>Spring Security로 사용자 업데이트 시 권한을 다시 로드하는 방법</title>
      <link>https://muds.tistory.com/1473</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Spring Security로 사용자 업데이트 시 권한을 다시 로드하는 방법&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;Spring Security를 사용한 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;em&gt;SecurityContextHolder&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;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;로그인한 사용자 권한을 동적으로 업데이트해야 하는 경우(이러한 권한이 변경된 경우), 물론 로그아웃하고 로그인할 필요가 없습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Authentication&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;봄에 개체(보안 토큰)&lt;/font&gt;&lt;/font&gt;&lt;code&gt;SecurityContextHolder&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Authentication auth = SecurityContextHolder.getContext().getAuthentication();

List&amp;lt;GrantedAuthority&amp;gt; updatedAuthorities = new ArrayList&amp;lt;&amp;gt;(auth.getAuthorities());
updatedAuthorities.add(...); //add your role here [e.g., new SimpleGrantedAuthority(&quot;ROLE_NEW_ROLE&quot;)]

Authentication newAuth = new UsernamePasswordAuthenticationToken(auth.getPrincipal(), auth.getCredentials(), updatedAuthorities);

SecurityContextHolder.getContext().setAuthentication(newAuth);
&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;SessionRegistry&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;, &lt;a href=&quot;http://static.springsource.org/spring-security/site/docs/3.1.x/apidocs/org/springframework/security/core/session/SessionRegistry.html#getAllPrincipals%28%29&quot; rel=&quot;noreferrer&quot;&gt;getAllPrincipals()&lt;/a&gt;를 사용하여 세션에서 수정할 사용자와 현재 활성 사용자를 비교할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;세션이 존재하는 경우 다음을 사용하여 세션을 무효화할 수 있습니다. &lt;a href=&quot;http://static.springsource.org/spring-security/site/docs/3.1.x/apidocs/org/springframework/security/core/session/SessionInformation.html#expireNow%28%29&quot; rel=&quot;noreferrer&quot;&gt;expireNow()(&lt;/a&gt;from)&lt;/font&gt;&lt;/font&gt;&lt;code&gt;SessionInformation&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;재authentic화를 강제합니다.&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;securityContextPersistenceFilter&lt;/code&gt;&lt;font 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;// user object = User currently updated
// invalidate user session
List&amp;lt;Object&amp;gt; loggedUsers = sessionRegistry.getAllPrincipals();
for (Object principal : loggedUsers) {
    if(principal instanceof User) {
        final User loggedUser = (User) principal;
        if(user.getUsername().equals(loggedUser.getUsername())) {
            List&amp;lt;SessionInformation&amp;gt; sessionsInfo = sessionRegistry.getAllSessions(principal, false);
            if(null != sessionsInfo &amp;amp;&amp;amp; sessionsInfo.size() &amp;gt; 0) {
                for (SessionInformation sessionInformation : sessionsInfo) {
                    LOGGER.info(&quot;Exprire now :&quot; + sessionInformation.getSessionId());
                    sessionInformation.expireNow();
                    sessionRegistry.removeSessionInformation(sessionInformation.getSessionId());
                    // User is not forced to re-logging
                }
            }
        }
    }
} 
&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;그러나 추가 인터셉터로 인해 성능에 일부 영향이 있습니다(예: 데이터베이스에서 사용자 역할을 가져온 경우 모든 HTTP 요청에 대해 쿼리됩니다).&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;@Component
public class VerifyAccessInterceptor implements HandlerInterceptor {

    // ...

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        Authentication auth = SecurityContextHolder.getContext().getAuthentication();
        Set&amp;lt;GrantedAuthority&amp;gt; authorities = new HashSet&amp;lt;&amp;gt;();
        if (auth.isAuthenticated()) {
            authorities.add(new SimpleGrantedAuthority(&quot;ROLE_USER&quot;));
        }
    
        User userFromDatabase = getUserFromDatabase(auth.getName());
        if (userFromDatabase != null) {
            // add whatever authorities you want here
            authorities.add(new SimpleGrantedAuthority(&quot;...&quot;)); 
        }
    
        Authentication newAuth = null;
    
        if (auth.getClass() == OAuth2AuthenticationToken.class) {
            OAuth2User principal = ((OAuth2AuthenticationToken)auth).getPrincipal();
            if (principal != null) {
                newAuth = new OAuth2AuthenticationToken(principal, authorities,(((OAuth2AuthenticationToken)auth).getAuthorizedClientRegistrationId()));
            }
        }
    
        SecurityContextHolder.getContext().setAuthentication(newAuth);
        return true;
    }

}
&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;이 특정 구현은 OAuth2를 사용합니다(&lt;/font&gt;&lt;/font&gt;&lt;code&gt;OAuth2AuthenticationToken&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;), 그러나 사용할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;UsernamePasswordAuthenticationToken&lt;/code&gt;&lt;font 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;@Configuration
public class WebConfiguration extends WebMvcConfigurationSupport {

    @Autowired
    private VerifyAccessInterceptor verifyAccessInterceptor;


    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(verifyAccessInterceptor).addPathPatterns(&quot;/**&quot;);
    }

}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;https://twin.sh/articles/24/spring-security-reload-authorities-on-every-request&quot; rel=&quot;nofollow noreferrer&quot;&gt;저도 이에 대한 기사&lt;/a&gt;를 만들었습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;핵심 사항 - 사용자에게 접근할 수 있어야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;SecurityContext&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;HttpSession&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;~하듯이&lt;/font&gt;&lt;/font&gt;&lt;code&gt;securityContextRepository&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;당신의&lt;/font&gt;&lt;/font&gt;&lt;code&gt;securityContextPersistenceFilter&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;, 스프링으로 할 수 있을 겁니다&lt;/font&gt;&lt;/font&gt;&lt;code&gt;SessionRegistry&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;. 사용자에게 재인증을 강요하려면(무음 권한 취소보다 낫아야 함) 사용자의 권한을 무효화합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;HttpSession&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;. 추가하는 것을 잊지 마세요.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;HttpSessionEventPublisher&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;web.xml로&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;listener&amp;gt;
    &amp;lt;listener-class&amp;gt;
        org.springframework.security.web.session.HttpSessionEventPublisher
    &amp;lt;/listener-class&amp;gt;
&amp;lt;/listener&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;securityContextRepository&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;, 사용자 정의 필터를 추가해야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;springSecurityFilterChain&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;관리하다&lt;/font&gt;&lt;/font&gt;&lt;code&gt;SecurityContext&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;springSecurityFilterChain&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;구성(없음)&lt;/font&gt;&lt;/font&gt;&lt;code&gt;security&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;namespace 단축키)&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;일부 링크는 사용자의 문제를 정확하게 해결하지 못합니다(No Open).&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;ID), 하지만 유용할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;서블릿 환경의 &lt;a href=&quot;https://github.com/alx3apps/spring-embedded-tomcat/tree/master/components/src/main/java/ru/concerteza/springtomcat/components/registry&quot; rel=&quot;nofollow noreferrer&quot;&gt;NIH 세션 레지스트리&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://github.com/alx3apps/spring-embedded-tomcat/blob/master/etomcat6-test/src/main/app-dirs/registrydir/conf/etomcat-test-ctx.xml&quot; rel=&quot;nofollow noreferrer&quot;&gt;플레인-빈 스프링 구성&lt;/a&gt; 작업 예시입니다&lt;a href=&quot;https://github.com/alx3apps/spring-embedded-tomcat/blob/master/etomcat6-test/src/main/app-dirs/registrydir/conf/etomcat-test-ctx.xml&quot; rel=&quot;nofollow noreferrer&quot;&gt;.&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://github.com/alx3apps/spring-embedded-tomcat/blob/master/etomcat6-test/src/main/app-dirs/x509dir/conf/etomcat-test-ctx.xml&quot; rel=&quot;nofollow noreferrer&quot;&gt;실생활 플레인빈 스프링 구성&lt;/a&gt; X&lt;a href=&quot;https://github.com/alx3apps/spring-embedded-tomcat/blob/master/etomcat6-test/src/main/app-dirs/x509dir/conf/etomcat-test-ctx.xml&quot; rel=&quot;nofollow noreferrer&quot;&gt;.509&lt;/a&gt; auth, 당신은 그것으로 시작해서 Open을 사용하도록 수정할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;X.509 대신 신분증.&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 위의 매우 구체적인 사례가 있는데, 저는 Redis를 사용하여 https://github.com/spring-projects/spring-session 과의 사용자 세션을 추적합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그런 다음 관리자가 사용자에게 일부 역할을 추가하면 Redis에서 사용자 세션을 찾아서 대체합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;principal&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;authorities&lt;/code&gt;&lt;font 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 void updateUserRoles(String username, Set&amp;lt;GrantedAuthority&amp;gt; newRoles) {
        if (sessionRepository instanceof FindByIndexNameSessionRepository) {
            Map&amp;lt;String, org.springframework.session.Session&amp;gt; map =
                    ((FindByIndexNameSessionRepository&amp;lt;org.springframework.session.Session&amp;gt;) sessionRepository)
                            .findByPrincipalName(username);
            for (org.springframework.session.Session session : map.values()) {
                if (!session.isExpired()) {
                    SecurityContext securityContext = session.getAttribute(SPRING_SECURITY_CONTEXT_KEY);
                    Authentication authentication = securityContext.getAuthentication();
                    if (authentication instanceof UsernamePasswordAuthenticationToken) {
                        Collection&amp;lt;GrantedAuthority&amp;gt; authorities = new HashSet&amp;lt;&amp;gt;(authentication.getAuthorities());
                        //1. Update of authorities
                        authorities.addAll(newRoles);
                        Object principalToUpdate = authentication.getPrincipal();
                        if (principalToUpdate instanceof User) {
                            //2. Update of principal: Your User probably extends UserDetails so call here method that update roles to allow
                            // org.springframework.security.core.userdetails.UserDetails.getAuthorities return updated 
                            // Set of GrantedAuthority
                            securityContext
                                    .setAuthentication(new UsernamePasswordAuthenticationToken(principalToUpdate, authentication
                                            .getCredentials(), authorities));
                            session.setAttribute(SPRING_SECURITY_CONTEXT_KEY, securityContext);
                            sessionRepository.save(session);
                        }
                    }
                }
            }
        }
    }
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;TwiN에서 제공하는 답변을 사용하지만 성능에 영향을 줄이기 위해 제어 변수(users_to_update_rolles)를 만듭니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;@Component
public class RoleCheckInterceptor implements HandlerInterceptor {
public static ArrayList&amp;lt;String&amp;gt; update_role = new ArrayList&amp;lt;&amp;gt;();

@Autowired
private IUser iuser;

public static Set&amp;lt;String&amp;gt; users_to_update_roles = new HashSet&amp;lt;&amp;gt;();

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
        throws Exception {

    Authentication auth = SecurityContextHolder.getContext().getAuthentication();

    try {

        CurrentUser current = (CurrentUser) auth.getPrincipal();

        String username = current.getUser().getUsername();
        if (users_to_update_roles.contains(username)) {
            updateRoles(auth, current);
            users_to_update_roles.remove(username);
        }

    } catch (Exception e) {
        // TODO: handle exception
    }

    return true;
}

@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
        ModelAndView modelAndView) throws Exception {

}

@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
        throws Exception {

}

private void updateRoles(Authentication auth, CurrentUser current) {
    User findOne = iuser.findOne(current.getUser().getUsername());
    List&amp;lt;GrantedAuthority&amp;gt; updatedAuthorities = new ArrayList&amp;lt;&amp;gt;();
    for (Role role : findOne.getRoles()) {
        updatedAuthorities.add(new SimpleGrantedAuthority(role.name()));
    }

    Authentication newAuth = new UsernamePasswordAuthenticationToken(auth.getPrincipal(), auth.getCredentials(),
            updatedAuthorities);

    SecurityContextHolder.getContext().setAuthentication(newAuth);
}
}
&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 ModelAndView roleSave(@PathVariable long numero_documento, Funcionario funcionario) {
    ModelAndView modelAndView = new ModelAndView(&quot;funcionario/role&quot;);
    Set&amp;lt;Role&amp;gt; roles = funcionario.getPessoa().getUser().getRoles();
    funcionario = funcionarioService.funcionarioNumero_documento(numero_documento);
    funcionario.getPessoa().getUser().setRoles(roles);
    iUser.save(funcionario.getPessoa().getUser());
    RoleCheckInterceptor.users_to_update_roles.add(funcionario.getPessoa().getUser().getUsername());
    modelAndView.addObject(&quot;funcionario&quot;, funcionario);
    modelAndView.addObject(&quot;sucess&quot;, &quot;Permissões modificadas&quot;);
    return modelAndView;
}
&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/9910252/how-to-reload-authorities-on-user-update-with-spring-security&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>Spring</category>
      <author>muds</author>
      <guid isPermaLink="true">https://muds.tistory.com/1473</guid>
      <comments>https://muds.tistory.com/1473#entry1473comment</comments>
      <pubDate>Thu, 2 Nov 2023 22:09:23 +0900</pubDate>
    </item>
    <item>
      <title>자바스크립트에서 Pass by Value and Pass by Reference</title>
      <link>https://muds.tistory.com/1472</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;자바스크립트에서 Pass by Value and Pass by Reference&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Angular2를 작업한 지 거의 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;특별한 경우&lt;/font&gt;&lt;/font&gt;&lt;code&gt;this&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;키워드 관련 참조 또는 인스턴스를 통과하고 있는 것이 분명합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;DOM Object&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아니면&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Class&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예를들면.&lt;/font&gt;&lt;/font&gt;&lt;/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;ControlGroup&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;ControlGroup&lt;/code&gt;&lt;font 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;이것은 Angular나 TypeScript에 특정한 것이 아니라 단지 자바스크립트가 작동하는 방식입니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;em&gt;무엇을 하고&lt;/em&gt; 있는지 &lt;em&gt;알고&lt;/em&gt; 있는 &lt;em&gt;경우&lt;/em&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;foo() {
  int num = 1;
  bar(num);
  // num is 2!!
}
bar(int arg byRef) {
  arg = 2
}
&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;function foo() {
  let num = 1;
  (() =&amp;gt; {
    const ret = bar(num) as any;
    num = ret.arg;
  })();
  // num is 2!!
}
function bar(arg) {
  arg = 2;
  return { arg };
}
&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/35473404/pass-by-value-and-pass-by-reference-in-javascript&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>angular</category>
      <author>muds</author>
      <guid isPermaLink="true">https://muds.tistory.com/1472</guid>
      <comments>https://muds.tistory.com/1472#entry1472comment</comments>
      <pubDate>Thu, 2 Nov 2023 22:09:13 +0900</pubDate>
    </item>
    <item>
      <title>MySQL에서 테이블의 고유 제약 조건을 표시하려면 어떻게 해야 합니까?</title>
      <link>https://muds.tistory.com/1471</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;/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;/ol&gt;&lt;pre&gt;&lt;code&gt;select distinct CONSTRAINT_NAME
from information_schema.TABLE_CONSTRAINTS
where table_name = 'table_name' and constraint_type = 'UNIQUE';
&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;SHOW CREATE TABLE table_name;
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;select distinct CONSTRAINT_NAME
from information_schema.TABLE_CONSTRAINTS
where CONSTRAINT_SCHEMA = 'mysql'
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 쿼리는 프라이머리 키, 고유 키 및 외부 키를 반환합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;show indexes from table_name;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;OP는 싱글 테이블을 요청했는데, 이렇게 하면 됩니다.&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;where&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;절에는 고유한 제약 조건으로 보호되는 데이터베이스에 대한 모든 열이 표시됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;SELECT
  CONSTRAINT_NAME,
  TABLE_NAME,
  COLUMN_NAME
FROM information_schema.KEY_COLUMN_USAGE
WHERE
  CONSTRAINT_NAME LIKE 'UNIQ%'
  AND TABLE_SCHEMA = 'your_database_name'
  AND TABLE_NAME = 'your_table_name';
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;유감스럽게도 mysql은 쿼리 결과에 따라 인덱스를 제거하지 못합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음 쿼리의 출력을 실행하여 두 쿼리의 모든 고유 열을 삭제할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;SELECT CONCAT(
  'ALTER TABLE ',
  TABLE_NAME,
  ' DROP INDEX ',
  CONSTRAINT_NAME,
  '; -- drops ',
  COLUMN_NAME,
  ' constraint'
)
FROM information_schema.KEY_COLUMN_USAGE
WHERE
  CONSTRAINT_NAME LIKE 'UNIQ%'
  AND TABLE_SCHEMA = 'your_database_name';
&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/1836502/how-do-i-show-unique-constraints-of-a-table-in-mysql&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>MySQL</category>
      <author>muds</author>
      <guid isPermaLink="true">https://muds.tistory.com/1471</guid>
      <comments>https://muds.tistory.com/1471#entry1471comment</comments>
      <pubDate>Thu, 2 Nov 2023 22:09:06 +0900</pubDate>
    </item>
    <item>
      <title>join을 사용하기 위해 이 쿼리를 변경하는 방법은 무엇입니까?</title>
      <link>https://muds.tistory.com/1470</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;join을 사용하기 위해 이 쿼리를 변경하는 방법은 무엇입니까?&lt;/font&gt;&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;SELECT breakgame, Streak,
((SELECT (maxGameId - gameId) as gameGap
FROM game_result
WHERE game_result.breakgame &amp;gt;= kokopam.game_streak.breakgame
ORDER BY gameId DESC LIMIT 1)/ Streak) as nowWeight
FROM kokopam.game_streak, (SELECT max(gameId) as maxGameId FROM game_result ORDER BY gameId DESC LIMIT 1) maxGameId
WHERE breakgame&amp;gt;= 2
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;join을 사용하기 위해 이 쿼리를 변경하는 방법은 무엇입니까?&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;우선 행이 공유하는 ID를 나타내는 &quot;where&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;Select * 
From tableA a, tableB b
Where a.id=b.id
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;와 같습니까?&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Select *
From tableA a
Inner join tableB b on b.id=a.id
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;쿼리에 무엇을 하려고 했는지와 테이블에 있는 열을 지정해주시면 조금 더 도와드리겠습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/45666959/how-to-change-this-query-to-use-join&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>MariaDB</category>
      <author>muds</author>
      <guid isPermaLink="true">https://muds.tistory.com/1470</guid>
      <comments>https://muds.tistory.com/1470#entry1470comment</comments>
      <pubDate>Thu, 2 Nov 2023 22:08:59 +0900</pubDate>
    </item>
    <item>
      <title>모든 모바일 장치에서 스크롤 사용 안 함</title>
      <link>https://muds.tistory.com/1469</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;모든 모바일 장치에서 스크롤 사용 안 함&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것은 인터넷 전체에 해결책이 있어야 할 것처럼 들리는데, 왜 찾을 수 없는지 잘 모르겠습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;모바일 기기에서 가로 스크롤을 비활성화하고 싶습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;기본적으로 이를 달성하기 위해 노력하고 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;body{
   overflow-x:hidden  // disable horizontal scrolling.
}
&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;&amp;lt;meta content='width=device-width; initial-scale=1.0; maximum-scale=1.0; user-scalable=0;' name='viewport' /&amp;gt;
&amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width&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;html, body {
  overflow-x: hidden;
}
body {
  position: relative;
}
&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;cg벡터의 대답은 제게 통하지 않았지만, 이것은 효과가 있었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;document.body.addEventListener('touchstart', function(e){ e.preventDefault(); });
&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;https://stackoverflow.com/questions/2890361/disable-scrolling-in-an-iphone-web-application&quot;&gt;iPhone &lt;/a&gt;웹 애플리케이션에서 &lt;a href=&quot;https://stackoverflow.com/questions/2890361/disable-scrolling-in-an-iphone-web-application&quot;&gt;스크롤&lt;/a&gt;을 사용하지 &lt;a href=&quot;https://stackoverflow.com/questions/2890361/disable-scrolling-in-an-iphone-web-application&quot;&gt;않도록&lt;/a&gt; 설정하시겠습니까&lt;a href=&quot;https://stackoverflow.com/questions/2890361/disable-scrolling-in-an-iphone-web-application&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;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;스크롤은 방지하고 상황에 맞는 메뉴는 유지하려면 다음을 수행합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;document.body.addEventListener('touchmove', function(e){ e.preventDefault(); });
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여전히 일부 사용자가 원하는 것보다 훨씬 더 많이 방지할 수 있지만 대부분의 브라우저에서 방지할 수 있는 기본 동작은 스크롤뿐입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;스크롤할 수 없는 본체 내에서 스크롤 가능한 요소를 허용하고 고무줄을 방지하는 보다 정교한 솔루션에 대해서는 여기에서 제 답변을 살펴보세요.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/a/20250111/1431156&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;https://stackoverflow.com/a/20250111/1431156&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;h1&gt;&lt;font papago-translate=&quot;translated&quot;&gt;스크롤&lt;/font&gt;&lt;/h1&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;OP에 대답하려면 스크롤을 비활성화하기 위해 필요한 것은 창을 가로채는 것뿐입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;scroll&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;touchmove&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;행사와 전화&lt;/font&gt;&lt;/font&gt;&lt;code&gt;preventDefault&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;stopPropagation&lt;/code&gt;&lt;font 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;window.addEventListener(&quot;scroll&quot;, preventMotion, false);
window.addEventListener(&quot;touchmove&quot;, preventMotion, false);

function preventMotion(event)
{
    window.scrollTo(0, 0);
    event.preventDefault();
    event.stopPropagation();
}
&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;body&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;html&lt;/code&gt;&lt;font 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;html:
{
    overflow: hidden;
}

body
{
    overflow: hidden;
    position: relative;
    margin: 0;
    padding: 0;
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;h1&gt;&lt;font papago-translate=&quot;translated&quot;&gt;줌잉&lt;/font&gt;&lt;/h1&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러나 스크롤은 한 가지이지만 줌도 비활성화할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;마크업에서 메타 태그를 사용하여 수행할 작업:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;meta name=&quot;viewport&quot; content=&quot;user-scalable=no&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;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;(일부에서 다음과 같은 속성을 추가하라는 조언을 주의하십시오.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;initial-scale&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;width&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;html {
  overflow-x: hidden;
}
&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;body {
  overflow-x: hidden;
}
&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-html prettyprint-override&quot;&gt;&lt;code&gt;&amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=no&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 class=&quot;lang-css prettyprint-override&quot;&gt;&lt;code&gt;html, body {
  overflow-x: hidden;
  overflow-y: hidden;
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그것은 html과 body 둘다 입니다!&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것을 멋대로 쓰다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;body
{
overflow:hidden;
width:100%;
}
&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;meta name=&quot;viewport&quot; content=&quot;user-scalable=no, width=device-width, initial-scale=1.0&quot; /&amp;gt;
&amp;lt;meta name=&quot;apple-mobile-web-app-capable&quot; content=&quot;yes&quot; /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;CSS 속성 터치 &lt;strong&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/touch-action&quot; rel=&quot;nofollow noreferrer&quot;&gt;동작&lt;/a&gt;&lt;/strong&gt;은 일부 대상 브라우저에서는 &lt;a href=&quot;https://caniuse.com/#feat=css-touch-action&quot; rel=&quot;nofollow noreferrer&quot;&gt;작동하지 않을&lt;/a&gt; 수 &lt;a href=&quot;https://caniuse.com/#feat=css-touch-action&quot; rel=&quot;nofollow noreferrer&quot;&gt;있지만&lt;/a&gt; 원하는 것을 얻을 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;html, body {
    width: 100%; height: 100%;
    overflow: hidden;
    touch-action: none;
}
&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;html,
body {
  overflow-x: hidden;
  height: 100%;
}

body {
  position: relative;
}
&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;vh&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이거는. 더.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;height: 100%&lt;/code&gt;&lt;font 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;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;document.body.style.position = &quot;fixed&quot;;
document.body.style.overflowY = &quot;hidden&quot;;
document.body.addEventListener('touchstart', function(e){ e.preventDefault()});
&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.addEventListener(&quot;touchstart&quot;, function(event){
             if(event.target.tagName==&quot;HTML&quot; || event.target.tagName==&quot;BODY&quot;){
                     event.preventDefault();
             }
} ,false);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;100% 작동하지 않으며 다음 내용도 추가했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;window.addEventListener(&quot;scroll&quot;,function(){
    window.scrollTo(0,0)
},false)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Apple 장치의 경우&lt;/font&gt;&lt;/font&gt;&lt;code&gt;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 papago-translate=&quot;translated&quot;&gt;다음 코드는 모든 장치에서 작동합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;html, body {
  overflow: hidden;
  position: fixed;
}
&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;HTML과 BODY 요소에 높이를 100% 추가해야 한다는 것을 알았습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아래의 규칙들이 모두 필요한 것은 아니지만, 이 마법 조합을 우연히 발견하는 데 시간이 충분히 걸렸고, 효과가 있는 것으로 보입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;html {
    height: 100%;
    overflow: hidden;
}
body{
    margin: 0;
    overflow: hidden;
    height: 100%;
    position: relative;
}
&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;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1&quot;&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제 앱은 절대 위치 요소를 많이 사용했는데, 그 중 일부는 시야 밖으로 미끄러지면서 다른 시간에 부분적으로 화면이 꺼졌습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;결과적으로, 신체 요소는 신체에 어떤 면적/크기를 부여하기 위한 내용물이 없었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;모바일 기기에서 발생하는 '스크롤링'은 브라우저가 뷰포트(장치 폭으로의 스케일링) 계산을 하기 위해 페이지 크기의 정도를 알지 못한 결과라는 것을 알게 되었습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;0px 높이의 본체가 페이지의 높이나 폭 중 어느 하나도 브라우저에 전달하지 못하고 있었던 것 같아, 본체의 높이를 100%로 설정하는 것이 해결책의 핵심이었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;편집: 제 해결책을 찾은 후에 답변을 다시 살펴보니, &quot;톰스 코더리&quot;의 다른 답변이 비록 그의 x 방향으로만 되어 있지만 본질적으로 제 해결책과 동일하다는 것을 깨달았습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;em&gt;CSS&lt;/em&gt; 코드만 &lt;em&gt;있으면&lt;/em&gt; 거의 단순하게 진행되는 &lt;strong&gt;가장&lt;/strong&gt; 간단한 방법:&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;/p&gt;
&lt;div class=&quot;snippet&quot; data-lang=&quot;js&quot; data-hide=&quot;false&quot; data-console=&quot;true&quot; data-babel=&quot;false&quot;&gt; 
 &lt;div class=&quot;snippet-code&quot;&gt; 
  &lt;pre class=&quot;snippet-code-css lang-css prettyprint-override&quot;&gt;&lt;code&gt;body, html {
    overflow-x: hidden;
    position: relative;
}&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;$('body, html').css('overflow-y', 'hidden');
$('html, body').animate({
    scrollTop:0
}, 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/10592411/disable-scrolling-in-all-mobile-devices&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>iPhone</category>
      <author>muds</author>
      <guid isPermaLink="true">https://muds.tistory.com/1469</guid>
      <comments>https://muds.tistory.com/1469#entry1469comment</comments>
      <pubDate>Thu, 2 Nov 2023 22:08:53 +0900</pubDate>
    </item>
    <item>
      <title>XML-RPC WordPress API 및 Python with category를 사용하여 게시물 게시</title>
      <link>https://muds.tistory.com/1468</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;XML-RPC WordPress API 및 Python with category를 사용하여 게시물 게시&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;플러그인 Custom Post Types(사용자 지정 게시 유형)를 사용하여 내 요구에 맞는 새로운 사용자 지정 유형을 만들고 각 사용자 지정 유형에 대한 범주를 만들었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그런 다음 버전 3.4.x 이후 지원되는 새로운 Wordpress XML-RPC API를 사용하여 DB에서 게시물을 가져와 새로운 (테스트) 웹사이트에 원격으로 푸시하는 스크립트를 파이썬(본&lt;a href=&quot;http://www.jansipke.nl/using-python-to-add-new-posts-in-wordpress/&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;xmlrpclib.Fault: &amp;lt;Fault 401: 'Sorry, one of the given taxonomies is not supported by the post type.'&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;카테고리 ID를 지정하는 데 구문을 잘못 사용하고 있는 것 같습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;코드는 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;import datetime, xmlrpclib, MySQLdb

def post_remotely(post_data):

    wp_url = &quot;[my wordpress blog url]&quot;
    wp_username = &quot;[myuser]&quot;
    wp_password = &quot;[mypasswd]&quot;
    wp_blogid = &quot;0&quot;

    status = 'publish'

    server = xmlrpclib.ServerProxy(wp_url)

    data = { 'post_title': post_data['title'], 'post_content': post_data['content'], 
             'post_date': post_data['data'], 'post_type': post_data['post_type'], 'terms': post_data['categories'], 
             'post_status': status  }

    post_id = server.wp.newPost(wp_blogid, wp_username, wp_password, data)

    return post_id
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고 발신자에게 카테고리를 지정하려면:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;new_post['categories'] = [ { 'term_id': 3, 'taxonomy': 'news-cat' } ]
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&quot;news-cat&quot;은 사용자 정의 유형 &quot;news&quot;와 관련된 분류 체계의 이름입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&quot;term-id&quot;는 제가 phpMyAdmin을 사용하여 알게 된 카테고리의 ID입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다른 방법들도 시도해 보았지만 소용이 없었습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;카테고리가 없으면 잘 작동합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;어떤 도움이든 미리 감사드립니다 :)&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;http://codex.wordpress.org/XML-RPC_WordPress_API/Posts#wp.newPost&quot; rel=&quot;noreferrer&quot;&gt;XML-RPC WordPress API Document&lt;/a&gt;는 다음과 같이 말합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;struct terms: Taxonomy names as keys, array of term IDs as values.
struct terms_names: Taxonomy names as keys, array of term names as values.
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;즉, terms 및 terms_names는 디렉토리이고, 키 이름은 원하는 분류 체계의 이름이며, 값은 배열 목록입니다.&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;‘terms‘:{‘my-category’:[4]} 
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아니면&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;‘terms_names’:{‘my-category’:[&quot;Wordpress&quot;]} 
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;포스트 구조에서 &quot;my-category&quot;는 분류 체계의 이름입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음의 일부 정보:&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;http://www.godoone.com/archives/python-wordpress-sorry-one-of-the-given-taxonomies-is-not-supported-by-the-post-type.html&quot; rel=&quot;noreferrer&quot;&gt;解决Python发布wordpress内容返回抱歉，文章类型不支持您的分类法.错误&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/12585307/publish-a-post-using-xml-rpc-wordpress-api-and-python-with-category&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>WordPress</category>
      <author>muds</author>
      <guid isPermaLink="true">https://muds.tistory.com/1468</guid>
      <comments>https://muds.tistory.com/1468#entry1468comment</comments>
      <pubDate>Thu, 2 Nov 2023 22:08:44 +0900</pubDate>
    </item>
    <item>
      <title>추가 쿼리 매개 변수를 사용할 때 Instagram Redirect URI가 원래 Redirect URI와 일치하지 않음</title>
      <link>https://muds.tistory.com/1467</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;추가 쿼리 매개 변수를 사용할 때 Instagram Redirect URI가 원래 Redirect URI와 일치하지 않음&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;/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;사용자는 워드프레스 설정 페이지에서 &quot;인스타그램 로그인&quot;을 클릭합니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사용자는 Instagram의 Authorization 화면(로그인 화면)으로 이동합니다.&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;Instagram은 사용자를 My &lt;strong&gt;Redirect URI&lt;/strong&gt;로 리디렉션합니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&quot;instagram-api-redirect.php&quot; 파일은 &quot;code&quot; 및 &quot;return_uri&quot; 매개 변수를 모두 가져옵니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여기서 &quot;코드&quot;는 &quot;액세스 토큰&quot;을 요청하기 위해 사용됩니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;액세스 토큰과 함께 WordPress 설정 페이지로 다시 리디렉션됩니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;플러그인은 요청 인증에 사용할 &quot;액세스 토큰&quot;을 데이터베이스에 저장합니다.&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;문제가 있는 것은 5단계에서 &quot;&lt;em&gt;리다이렉트 URI는 원래 리다이렉트 URI와 일치하지 않습니다&quot;&lt;/em&gt;라는 오류 메시지가 표시된다는 것입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;Redirect URI&lt;/strong&gt;에서 &quot;return_uri&quot; 쿼리 매개 변수를 제거하면 잘 작동합니다.&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;br&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;리디렉션 URI&lt;/strong&gt;입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;http:// mysite.com/plugins/pulp_instagram/instagram-api-redirect.php&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Instagram의 &lt;strong&gt;&quot;/authorization&quot;&lt;/strong&gt;에 보내는 &lt;strong&gt;Redirect&lt;/strong&gt; URI는 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;http:// mysite.com/plugins/pulp_instagram/instagram-api-redirect.php?return_uri=http :// localhost/ instagram-app&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Instagram의 &lt;strong&gt;&quot;/authorize&lt;/strong&gt;&quot;에 보내는 전체 승인 URL은 다음과 같습니다&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;https:// api.instagram.com/oauth/authorize/ ?client_id=CLIENT-ID&amp;amp;redirect_uri= http:// mysite.com/plugins/pulp_instagram/instagram-api-redirect.php?return_uri=http :// localhost/ instagram-app&amp;amp;response_type= code&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL 응답은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;http:// mysite.com/plugins/pulp_instagram/instagram-api-redirect.php?return_uri=http :// localhost/ instagram-app&amp;amp;code=557d15 dacd0d40459edf70aa 159476de&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음은 &quot;instagram-api-redirect.php&quot; 파일의 전체 코드입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;?php 

// the redirect uri
$return_uri = $_GET['return_uri'];

require 'instagram.class.php';

// Initialize class
$instagram = new Instagram(array(
  'apiKey'      =&amp;gt; 'CLIENT-ID',
  'apiSecret'   =&amp;gt; 'CLIENT-SECRET',
  'apiCallback' =&amp;gt; 'http://mysite.com/plugins/pulp_instagram/instagram-api-redirect.php'
));

// Receive OAuth code parameter
$code = $_GET['code'];

// Check whether the user has granted access
if (true === isset($code)) {

    // Receive OAuth token object
    $data = $instagram-&amp;gt;getOAuthToken($code);
    print_r($data); 
} else {

  // Check whether an error occurred
  if (true === isset($_GET['error'])) {
    echo 'An error occurred: '.$_GET['error_description'];
  }

}
?&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;또한 &lt;a href=&quot;https://github.com/cosenary/Instagram-PHP-API&quot; rel=&quot;noreferrer&quot;&gt;코세리너리&lt;/a&gt;의 &quot;Instagram PHP API&quot; 클래스(instagram.class.php)를 사용하고 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;미리 감사드립니다!&lt;/font&gt;&lt;/p&gt;&lt;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/15035175/instagram-redirect-uri-doesnt-match-original-redirect-uri-when-using-additional&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>WordPress</category>
      <author>muds</author>
      <guid isPermaLink="true">https://muds.tistory.com/1467</guid>
      <comments>https://muds.tistory.com/1467#entry1467comment</comments>
      <pubDate>Thu, 2 Nov 2023 22:08:38 +0900</pubDate>
    </item>
    <item>
      <title>jQuery: 부모의 특정한 자녀에게 어떻게 접근합니까?</title>
      <link>https://muds.tistory.com/1466</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;간단한 예를 들어, 페이지에 다음 블록이 여러 번 반복됩니다(동적으로 생성됨).&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;div class=&quot;box&quot;&amp;gt;
   &amp;lt;div class=&quot;something1&quot;&amp;gt;&amp;lt;/div&amp;gt;
   &amp;lt;div class=&quot;something2&quot;&amp;gt;
      &amp;lt;a class=&quot;mylink&quot;&amp;gt;My link&amp;lt;/a&amp;gt;
   &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;클릭하면 다음을 통해 링크의 상위로 이동할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$(&quot;.mylink&quot;).click(function() {
   $(this).parents(&quot;.box&quot;).fadeOut(&quot;fast&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;&amp;lt;div class=&quot;something1&quot;&amp;gt;&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그 특정한 부모의.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;기본적으로 누가 상급 형제를 직접 참조하지 못하고 참조하는 방법을 알려줄 수 있나요?&lt;/font&gt;&lt;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;parents(&quot;.box .something1&quot;) ... no luck.
parents(&quot;.box &amp;gt; .something1&quot;) ... no luck.
siblings() ... no luck.
&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;.parents(&quot;.box .something1&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;.box .something&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;. 즉, 다음과 같은 상위 요소를 반환합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;.something1&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고 안에 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;.box&lt;/code&gt;&lt;font 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;$(this).closest('.box').children('.something1')
&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;.children&lt;/code&gt;&lt;font 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;$(this).parent()
&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).parent().siblings(&quot;.something1&quot;);

$(this).parent().prev(); // if you always want the parent's previous sibling

$(this).parents(&quot;.box&quot;).children(&quot;.something1&quot;);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고 훨씬 더 많은 방법으로 이러한 &lt;a href=&quot;http://api.jquery.com/category/traversing/tree-traversal/&quot; rel=&quot;noreferrer&quot;&gt;문서들&lt;/a&gt;이 도움이 될 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;클래스가 있는 첫 번째 부모를 찾습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;box&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그런 다음 정규식 일치하는 첫 번째 자식 클래스를 찾습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;something&lt;/code&gt;&lt;font 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;.mylink&quot;).closest(&quot;.box&quot;).find('[class*=&quot;something&quot;]').first().attr(&quot;id&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;$(this).parents('.box').children('.something1')&lt;/code&gt;&lt;font 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;.each()&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;와 함께&lt;/font&gt;&lt;/font&gt;&lt;code&gt;.children()&lt;/code&gt;&lt;font 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;//Grab Each Instance of Box.
$(&quot;.box&quot;).each(function(i){

    //For Each Instance, grab a child called .something1. Fade It Out.
    $(this).children(&quot;.something1&quot;).fadeOut();
});
&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/2398947/jquery-how-to-get-to-a-particular-child-of-a-parent&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>jquery</category>
      <author>muds</author>
      <guid isPermaLink="true">https://muds.tistory.com/1466</guid>
      <comments>https://muds.tistory.com/1466#entry1466comment</comments>
      <pubDate>Thu, 2 Nov 2023 22:08:30 +0900</pubDate>
    </item>
    <item>
      <title>[object Object] Nodejs로 저장된 Blob</title>
      <link>https://muds.tistory.com/1465</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;[object Object] Nodejs로 저장된 Blob&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;저는 HTML5로 마이크에서 오디오를 녹음한 후 저장할 서버로 보내고 싶습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러나 현재 저장된 파일에는 다음과 같은 내용만 포함되어 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;[object Object]&lt;/code&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여기 제 코드의 일부분이 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;h3&gt;&lt;font papago-translate=&quot;translated&quot;&gt;프론트엔드:&lt;/font&gt;&lt;/h3&gt; 
&lt;pre&gt;&lt;code&gt;console.log(blob);
$http.post('/api/save_recording', blob)
  .success(function(new_recording) {
    console.log(&quot;success&quot;);
  })
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;로그 인쇄:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Blob {type: &quot;audio/wav&quot;, size: 237612, slice: function}
success
&lt;/code&gt;&lt;/pre&gt; 
&lt;h3&gt;&lt;font papago-translate=&quot;translated&quot;&gt;백엔드:&lt;/font&gt;&lt;/h3&gt; 
&lt;pre&gt;&lt;code&gt;exports.saveRecording = function(req, res) {
  console.log(req.body);

  fs.writeFile(&quot;temp/test.wav&quot;, req.body, function(err) {
    if(err) {
      console.log(&quot;err&quot;, err);
    } else {
      return res.json({'status': 'success'});
    }
  }) 
}
&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;{ type: 'audio/wav', size: 786476 }&lt;/code&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것이 왜 작동하지 않는지, 그리고 어떻게 고쳐야 하는지 알려주시겠습니까?&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;드디어 일을 시작했어요.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것을 작동시키는 방법은 클라이언트에서 블롭을 인코딩하고 서버에서 해독하는 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;h3&gt;&lt;font papago-translate=&quot;translated&quot;&gt;프론트엔드:&lt;/font&gt;&lt;/h3&gt; 
&lt;pre&gt;&lt;code&gt;// converts blob to base64
var blobToBase64 = function(blob, cb) {
  var reader = new FileReader();
  reader.onload = function() {
    var dataUrl = reader.result;
    var base64 = dataUrl.split(',')[1];
    cb(base64);
  };
  reader.readAsDataURL(blob);
};

blobToBase64(blob, function(base64){ // encode
  var update = {'blob': base64};
  $http.post('/api/save_recording', update)
    .success(function(new_recording) {
      console.log(&quot;success&quot;);
    });
});    
&lt;/code&gt;&lt;/pre&gt; 
&lt;h3&gt;&lt;font papago-translate=&quot;translated&quot;&gt;백엔드:&lt;/font&gt;&lt;/h3&gt; 
&lt;pre&gt;&lt;code&gt;exports.saveRecording = function(req, res) {
  var buf = new Buffer(req.body.blob, 'base64'); // decode
  fs.writeFile(&quot;temp/test.wav&quot;, buf, function(err) {
    if(err) {
      console.log(&quot;err&quot;, err);
    } else {
      return res.json({'status': 'success'});
    }
  }); 
};
&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/23986953/blob-saved-as-object-object-nodejs&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>angularjs</category>
      <author>muds</author>
      <guid isPermaLink="true">https://muds.tistory.com/1465</guid>
      <comments>https://muds.tistory.com/1465#entry1465comment</comments>
      <pubDate>Thu, 2 Nov 2023 22:08:24 +0900</pubDate>
    </item>
    <item>
      <title>데이터를 삽입하고 특정 열을 확인하여 중복을 방지합니다.</title>
      <link>https://muds.tistory.com/1464</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;여러 행의 데이터를 삽입하려고 하는 로컬 db가 있지만 중복을 원하지 않습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;삽입하려는 두 번째 db가 없습니다.&lt;/font&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;/p&gt; 
&lt;pre&gt;&lt;code&gt;(db)artists
    (table)names-&amp;gt;     ID  |  ArtistName  |  ArtistURL  |  Modified
&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;INSERT names (ArtistName, Modified) 
VALUES (name1, date),
       (name2, date2),
       ...
       (name40, date40)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;문제는 SQL을 사용하여 삽입하고자 하는 이 데이터 목록에 특정 열을 확인하여 데이터를 삽입하고 중복을 방지하는 방법입니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;뭘 복제해요?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;중복 이름?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;중복 행?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;나는 의심하지 않을 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ArtistName&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;갖고 있다&lt;/font&gt;&lt;/font&gt;&lt;code&gt;UNIQUE(ArtistName)&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;(또는&lt;/font&gt;&lt;/font&gt;&lt;code&gt;PRIMARY KEY&lt;/code&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;INSERT IGNORE&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;대신에&lt;/font&gt;&lt;/font&gt;&lt;code&gt;IGNORE&lt;/code&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;/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;LEFT 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;저는 완전히 새로운 테이블에 제 모든 가치를 삽입함으로써 @Hart CO의 조언을 조금이나마 따르게 되었습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그런 다음 SQL 문을 사용했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;SELECT ArtistName
FROM testing_table
WHERE !EXISTS 
(SELECT ArtistName FROM names WHERE 
testing_table.ArtistName = testing_table.ArtistName)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것은 이름표가 아닌 제 데이터에 있는 모든 아티스트 이름을 알려주었습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그런 다음 sql 파일로 내보내고 INSERT를 약간 조정하여 해당 데이터와 함께 이름 테이블에 삽입했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;INSERT IGNORE INTO `names` (ArtistName) VALUES
*all my values from the exported data*
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;(ArtistName)에서 반환된 데이터를 가질 수 있는 위치.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예를 들어 (ArtistName, ArtistUrl, Modified).&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;내보내기에서 반환된 값이 3개의 값을 가지면 됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것은 아마도 가장 효율적이지는 않겠지만, 제가 하려는 일에는 효과가 있었습니다.&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/39731012/insert-data-and-avoid-duplication-by-checking-a-specific-column&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>MariaDB</category>
      <author>muds</author>
      <guid isPermaLink="true">https://muds.tistory.com/1464</guid>
      <comments>https://muds.tistory.com/1464#entry1464comment</comments>
      <pubDate>Thu, 2 Nov 2023 22:08:17 +0900</pubDate>
    </item>
    <item>
      <title>C에서 읽기 전용 메모리는 어떻게 구현됩니까?</title>
      <link>https://muds.tistory.com/1463</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;C에서 읽기 전용 메모리는 어떻게 구현됩니까?&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제가 C에서 들어본적어도.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;char *s = &quot;hello world&quot;. 
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&quot;헬로 월드&quot;는 실제로 읽기 전용 메모리에 저장됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;읽기 전용 메모리에 대해서는 잘 모릅니다.&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;그것은 C&lt;a href=&quot;http://en.wikipedia.org/wiki/C_%28programming_language%29&quot; rel=&quot;noreferrer&quot;&gt; 언어&lt;/a&gt;의 특징이 아니라 컴파일러/링커와 운영 체제가 함께 작동하는 특징입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이러한 코드를 컴파일하면 다음과 같은 일이 발생합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;컴파일러는 문자열을 읽기 전용 데이터 섹션에 넣을 것입니다.&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;링커는 이러한 읽기 전용 섹션의 모든 데이터를 수집하여 단일 세그먼트에 넣습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 세그먼트는 실행 파일에 있으며 &quot;읽기 전용&quot; 속성으로 플래그 지정됩니다.&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이제 운영 체제 실행 파일 로더가 등장합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;실행 파일을 로드하거나 더 정확하게는 메모리에 매핑합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이렇게 하면 로더는 섹션을 이동하고 각 세그먼트에 대한 액세스 권한을 설정합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;읽기 전용 데이터 세그먼트의 경우 코드 실행 및 쓰기 액세스를 비활성화할 가능성이 높습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;코드(예: 함수)는 실행 권한을 얻지만 쓰기 권한은 얻지 못합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;정적 변수와 같은 일반적인 데이터는 읽기 및 쓰기 액세스 등을 수행합니다.&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것이 현대 운영 체제가 하는 방식입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;말씀하신 것처럼 C 언어의 특징은 아닙니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예를 들어 DOS에 대해 동일한 문제를 컴파일하면 프로그램이 실행되지만 DOS 로더가 읽기 전용 섹션에 대해 알지 못하기 때문에 쓰기 보호는 불가능합니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;실행 파일에는 전역 변수가 포함된 .data 섹션과 실제 컴퓨터 코드가 포함된 .text 섹션의 두 부분이 있습니다.&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;C가 &quot;Hello world&quot;를 볼 때 하는 일은 실행 파일 자체에 &quot;Hello world&quot; 문자열을 넣고 프로그램의 &quot;Hello world&quot; 인스턴스를 해당 문자열이 로드되는 주소로 대체하는 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그렇다고 해도, 왜 읽기 전용인지 잘 모르겠습니다. 이론적으로 프로그램은 자신의 메모리를 수정할 수 있어야 합니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;진정한 읽기 전용 메모리는 OS의 메모리 서브시스템에 의해 구현됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;OS는 특정 페이지를 읽기 전용으로 표시할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;바이너리에서 컴파일러는 실행 파일의 어떤 부분을 읽기 전용 대 읽기-쓰기 메모리 페이지에 배치해야 하는지 OS에 알려줄 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;당신이 글을 쓸때&lt;/font&gt;&lt;/font&gt;&lt;code&gt;char s[10]=&quot;sneha&quot;&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;; 개체 파일에 10바이트의 저장 공간(메모리가 아니라 프로그램을 실행할 때만 메모리가 그림으로 표시됨)을 할당합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것은 (컴파일 시) 메모리의 정적 할당입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하지만 당신이 글을 쓸때&lt;/font&gt;&lt;/font&gt;&lt;code&gt;char *s=&quot;sneha&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;sneha&quot;&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;. READ ONLY 섹션에 저장됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하지만 포인터는&lt;/font&gt;&lt;/font&gt;&lt;code&gt;s&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;&quot;sneha&quot;&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;. 따라서 여기에 적으려고 하면 세그멘테이션 오류가 발생합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예를 들어,&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;char *s = &quot;sneha&quot;;
s[1] = 'N'; 
printf(&quot;%s&quot;,s);  // you expecting output sNeha, 
                 // but you get a seg fault since it is READ ONLY DATA 
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;리눅스에서 이것을 하는 방법의 예는 Mark Mitchell, Jeffrey Olham 및 Alex Samuel의 &lt;a href=&quot;http://books.google.cl/books?id=oRqqAVyXjwAC&amp;amp;pg=PA179&amp;amp;lpg=PA179&amp;amp;dq=linux%20memory%20%20readonly&amp;amp;source=bl&amp;amp;ots=LgBAMGXFkj&amp;amp;sig=dF0Ru0jDu5ktvm6ug29O8CwbQ2w&amp;amp;hl=en&amp;amp;ei=ALX4StrEHs6InQfZ09XtBQ&amp;amp;sa=X&amp;amp;oi=book_result&amp;amp;ct=result&amp;amp;resnum=15&amp;amp;ved=0CDYQ6AEwDg#v=onepage&amp;amp;q=&amp;amp;f=false&quot; rel=&quot;nofollow noreferrer&quot;&gt;&lt;em&gt;Advanced Linux Programming&lt;/em&gt; 179페이지&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;s[4] = '0';
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;전화할 때 '안녕하세요 w0ld'라고 써있는지 확인해보세요&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;puts(s);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;즉시 Segmentation Fault(세그먼트화 오류) 또는 Data Execution Prevention(데이터 실행 방지) 예외를 발생시키는 경우에는 읽기 전용일 수 있습니다. (시스템에서 이 문제를 해결할 수 있게 해준다면 좋은 방법이 아닙니다.)&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;더 정확하게 말하면, C 표준은 인용된 문자열이 &quot;constchar[]&quot; 유형을 갖는 것으로 간주된다고 명시합니다. (또는 그와 같은 의미의 단어는 현재 표준을 가지고 있지 않습니다.)&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이러한 문자열의 내용을 수정하려는 코드는 정의되지 않은 동작을 호출합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이는 말 그대로 그 시점에서 모든 일이 일어날 수 있다는 것을 의미하며, 컴파일러 공급자는 발생할 수 있는 일을 문서화할 필요조차 없습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;실제로 휴대용을 원하는 C 또는 C++ 프로그램은 일정한 문자열을 수정하지 않아야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;일반적으로 컴파일러에서는 &quot;const&quot; 변수의 내용을 수정할 수 없으므로 대부분의 경우 &quot;const&quot;를 &quot;읽기 전용&quot;을 의미하는 것으로 간주할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;유감스럽게도 역사적인 이유로 인해 char *와 constar *에 대한 특별한 예외가 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 코드는 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;char *x = &quot;Hello, World&quot;;
*x = 'h';
&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/1704893/how-is-read-only-memory-implemented-in-c&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>C</category>
      <author>muds</author>
      <guid isPermaLink="true">https://muds.tistory.com/1463</guid>
      <comments>https://muds.tistory.com/1463#entry1463comment</comments>
      <pubDate>Thu, 2 Nov 2023 22:08:10 +0900</pubDate>
    </item>
  </channel>
</rss>