<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Maxima's Lab</title>
    <link>https://maxima-lab.tistory.com/</link>
    <description>Deep Learning, Machine Learning, Computer Vision, Python, C++, Docker 의 내용들을 배우시는 분들 위한 블로그입니다.</description>
    <language>ko</language>
    <pubDate>Mon, 13 Apr 2026 02:29:38 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>Minima</managingEditor>
    <item>
      <title>2026년, AI 에이전트가 업무를 주도한다: 당신의 일상은 어떻게 바뀔까?</title>
      <link>https://maxima-lab.tistory.com/entry/2026-AI-Agent</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;##&amp;nbsp;&lt;b&gt;2026년, AI 에이전트가 업무를 주도한다: 당신의 일상은 어떻게 바뀔까?&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image1_ai_agent_concept.svg&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;400&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qDaUd/dJMcaakbWKd/eZvA6oFIKwBSuJqnR48rM0/tfile.svg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qDaUd/dJMcaakbWKd/eZvA6oFIKwBSuJqnR48rM0/tfile.svg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qDaUd/dJMcaakbWKd/eZvA6oFIKwBSuJqnR48rM0/tfile.svg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqDaUd%2FdJMcaakbWKd%2FeZvA6oFIKwBSuJqnR48rM0%2Ftfile.svg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;900&quot; height=&quot;400&quot; data-filename=&quot;image1_ai_agent_concept.svg&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;400&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;**AI&amp;nbsp;에이전트,&amp;nbsp;무엇이&amp;nbsp;다른가?**&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;기존의&amp;nbsp;AI&amp;nbsp;도구들이&amp;nbsp;특정&amp;nbsp;작업을&amp;nbsp;효율적으로&amp;nbsp;수행하는&amp;nbsp;데&amp;nbsp;초점을&amp;nbsp;맞췄다면,&amp;nbsp;AI&amp;nbsp;에이전트는&amp;nbsp;한&amp;nbsp;단계&amp;nbsp;더&amp;nbsp;나아가&amp;nbsp;'자율성(Autonomy)',&amp;nbsp;'적응성(Adaptability)',&amp;nbsp;'목표&amp;nbsp;지향성(Goal-oriented)'을&amp;nbsp;특징으로&amp;nbsp;합니다.&amp;nbsp;이들은&amp;nbsp;주어진&amp;nbsp;목표를&amp;nbsp;달성하기&amp;nbsp;위해&amp;nbsp;스스로&amp;nbsp;계획을&amp;nbsp;수립하고,&amp;nbsp;다양한&amp;nbsp;소프트웨어와&amp;nbsp;데이터를&amp;nbsp;활용하며,&amp;nbsp;예상치&amp;nbsp;못한&amp;nbsp;상황에&amp;nbsp;유연하게&amp;nbsp;대처할&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;예를&amp;nbsp;들어,&amp;nbsp;특정&amp;nbsp;시장&amp;nbsp;조사를&amp;nbsp;목표로&amp;nbsp;설정하면,&amp;nbsp;AI&amp;nbsp;에이전트는&amp;nbsp;필요한&amp;nbsp;데이터를&amp;nbsp;인터넷에서&amp;nbsp;검색하고,&amp;nbsp;보고서를&amp;nbsp;작성하며,&amp;nbsp;심지어&amp;nbsp;관련&amp;nbsp;부서에&amp;nbsp;결과를&amp;nbsp;공유하는&amp;nbsp;일련의&amp;nbsp;과정을&amp;nbsp;자율적으로&amp;nbsp;수행할&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;이는&amp;nbsp;우리가&amp;nbsp;기존에&amp;nbsp;생각했던&amp;nbsp;업무의&amp;nbsp;개념을&amp;nbsp;완전히&amp;nbsp;재정의하는&amp;nbsp;사건입니다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;**업무&amp;nbsp;환경의&amp;nbsp;혁신:&amp;nbsp;AI&amp;nbsp;에이전트가&amp;nbsp;주도하는&amp;nbsp;변화**&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image2_work_automation.svg&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;400&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/z5pzg/dJMcafMALy8/0Mx0YaH2z2tvfbGKWWROa1/tfile.svg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/z5pzg/dJMcafMALy8/0Mx0YaH2z2tvfbGKWWROa1/tfile.svg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/z5pzg/dJMcafMALy8/0Mx0YaH2z2tvfbGKWWROa1/tfile.svg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fz5pzg%2FdJMcafMALy8%2F0Mx0YaH2z2tvfbGKWWROa1%2Ftfile.svg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;900&quot; height=&quot;400&quot; data-filename=&quot;image2_work_automation.svg&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;400&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;AI&amp;nbsp;에이전트의&amp;nbsp;등장은&amp;nbsp;기업의&amp;nbsp;생산성과&amp;nbsp;효율성을&amp;nbsp;극대화하는&amp;nbsp;동시에,&amp;nbsp;인간&amp;nbsp;노동의&amp;nbsp;본질에&amp;nbsp;대한&amp;nbsp;재정의를&amp;nbsp;요구하고&amp;nbsp;있습니다.&lt;br /&gt;&lt;br /&gt;1.&amp;nbsp;&amp;nbsp;**반복적이고&amp;nbsp;지루한&amp;nbsp;업무의&amp;nbsp;완전한&amp;nbsp;자동화**:&amp;nbsp;데이터&amp;nbsp;입력,&amp;nbsp;보고서&amp;nbsp;작성,&amp;nbsp;이메일&amp;nbsp;분류,&amp;nbsp;회의록&amp;nbsp;요약&amp;nbsp;등&amp;nbsp;반복적이고&amp;nbsp;규칙적인&amp;nbsp;업무는&amp;nbsp;AI&amp;nbsp;에이전트의&amp;nbsp;영역이&amp;nbsp;되고&amp;nbsp;있습니다.&amp;nbsp;이를&amp;nbsp;통해&amp;nbsp;직원들은&amp;nbsp;단순&amp;nbsp;작업에서&amp;nbsp;벗어나&amp;nbsp;더&amp;nbsp;창의적이고&amp;nbsp;전략적인&amp;nbsp;업무에&amp;nbsp;집중할&amp;nbsp;수&amp;nbsp;있게&amp;nbsp;됩니다.&amp;nbsp;예를&amp;nbsp;들어,&amp;nbsp;마케팅&amp;nbsp;부서에서는&amp;nbsp;AI&amp;nbsp;에이전트가&amp;nbsp;시장&amp;nbsp;트렌드&amp;nbsp;분석,&amp;nbsp;경쟁사&amp;nbsp;동향&amp;nbsp;파악,&amp;nbsp;캠페인&amp;nbsp;성과&amp;nbsp;보고서&amp;nbsp;작성을&amp;nbsp;전담하며,&amp;nbsp;마케터들은&amp;nbsp;새로운&amp;nbsp;전략&amp;nbsp;기획과&amp;nbsp;고객&amp;nbsp;관계&amp;nbsp;구축에&amp;nbsp;더&amp;nbsp;많은&amp;nbsp;시간을&amp;nbsp;할애할&amp;nbsp;수&amp;nbsp;있습니다.&lt;br /&gt;&lt;br /&gt;2.&amp;nbsp;&amp;nbsp;**초개인화된&amp;nbsp;업무&amp;nbsp;비서&amp;nbsp;및&amp;nbsp;의사결정&amp;nbsp;지원**:&amp;nbsp;AI&amp;nbsp;에이전트는&amp;nbsp;개인의&amp;nbsp;업무&amp;nbsp;패턴과&amp;nbsp;선호도를&amp;nbsp;학습하여&amp;nbsp;맞춤형&amp;nbsp;정보를&amp;nbsp;제공하고,&amp;nbsp;의사결정을&amp;nbsp;돕는&amp;nbsp;개인&amp;nbsp;비서&amp;nbsp;역할을&amp;nbsp;수행합니다.&amp;nbsp;수많은&amp;nbsp;데이터&amp;nbsp;속에서&amp;nbsp;의미&amp;nbsp;있는&amp;nbsp;통찰을&amp;nbsp;도출하고,&amp;nbsp;잠재적&amp;nbsp;위험을&amp;nbsp;예측하며,&amp;nbsp;최적의&amp;nbsp;대안을&amp;nbsp;제시하는&amp;nbsp;능력을&amp;nbsp;갖추고&amp;nbsp;있습니다.&amp;nbsp;영업&amp;nbsp;사원은&amp;nbsp;AI&amp;nbsp;에이전트의&amp;nbsp;도움을&amp;nbsp;받아&amp;nbsp;고객의&amp;nbsp;니즈를&amp;nbsp;정확히&amp;nbsp;파악하고,&amp;nbsp;최적의&amp;nbsp;제품을&amp;nbsp;추천하며,&amp;nbsp;협상&amp;nbsp;전략을&amp;nbsp;수립하여&amp;nbsp;성공률을&amp;nbsp;높일&amp;nbsp;수&amp;nbsp;있습니다.&lt;br /&gt;&lt;br /&gt;3.&amp;nbsp;&amp;nbsp;**협업&amp;nbsp;및&amp;nbsp;프로젝트&amp;nbsp;관리의&amp;nbsp;효율&amp;nbsp;증대**:&amp;nbsp;AI&amp;nbsp;에이전트는&amp;nbsp;팀원&amp;nbsp;간의&amp;nbsp;협업을&amp;nbsp;촉진하고&amp;nbsp;프로젝트&amp;nbsp;진행&amp;nbsp;상황을&amp;nbsp;실시간으로&amp;nbsp;추적하며,&amp;nbsp;잠재적&amp;nbsp;병목&amp;nbsp;현상을&amp;nbsp;예측하고&amp;nbsp;해결책을&amp;nbsp;제시합니다.&amp;nbsp;복잡한&amp;nbsp;프로젝트에서도&amp;nbsp;여러&amp;nbsp;AI&amp;nbsp;에이전트들이&amp;nbsp;각자의&amp;nbsp;전문&amp;nbsp;분야에&amp;nbsp;따라&amp;nbsp;역할을&amp;nbsp;분담하고&amp;nbsp;유기적으로&amp;nbsp;협력하여&amp;nbsp;목표를&amp;nbsp;달성하는&amp;nbsp;모습이&amp;nbsp;일반화되고&amp;nbsp;있습니다.&amp;nbsp;개발팀에서는&amp;nbsp;AI&amp;nbsp;에이전트가&amp;nbsp;코드&amp;nbsp;검토,&amp;nbsp;버그&amp;nbsp;탐지,&amp;nbsp;테스트&amp;nbsp;자동화를&amp;nbsp;수행하며&amp;nbsp;개발&amp;nbsp;주기를&amp;nbsp;단축하고&amp;nbsp;품질을&amp;nbsp;향상시킵니다.&lt;br /&gt;&lt;br /&gt;4.&amp;nbsp;&amp;nbsp;**새로운&amp;nbsp;비즈니스&amp;nbsp;모델과&amp;nbsp;산업의&amp;nbsp;탄생**:&amp;nbsp;AI&amp;nbsp;에이전트는&amp;nbsp;기존&amp;nbsp;산업의&amp;nbsp;경계를&amp;nbsp;허물고,&amp;nbsp;완전히&amp;nbsp;새로운&amp;nbsp;서비스와&amp;nbsp;비즈니스&amp;nbsp;모델을&amp;nbsp;창출하고&amp;nbsp;있습니다.&amp;nbsp;AI&amp;nbsp;에이전트가&amp;nbsp;직접&amp;nbsp;고객&amp;nbsp;서비스를&amp;nbsp;제공하거나,&amp;nbsp;맞춤형&amp;nbsp;콘텐츠를&amp;nbsp;생성하거나,&amp;nbsp;심지어&amp;nbsp;새로운&amp;nbsp;제품을&amp;nbsp;디자인하는&amp;nbsp;시대가&amp;nbsp;도래하고&amp;nbsp;있습니다.&amp;nbsp;이는&amp;nbsp;기업들에게&amp;nbsp;전례&amp;nbsp;없는&amp;nbsp;성장&amp;nbsp;기회를&amp;nbsp;제공하며,&amp;nbsp;동시에&amp;nbsp;경쟁&amp;nbsp;환경의&amp;nbsp;변화를&amp;nbsp;가속화하고&amp;nbsp;있습니다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;**개인의&amp;nbsp;역할과&amp;nbsp;역량&amp;nbsp;변화:&amp;nbsp;인간&amp;nbsp;고유의&amp;nbsp;가치&amp;nbsp;재조명**&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image3_human_ai_collaboration.svg&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;400&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b99D0W/dJMcaaEvG9A/pYcZNHrrLJ58zKTVzpk3d1/tfile.svg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b99D0W/dJMcaaEvG9A/pYcZNHrrLJ58zKTVzpk3d1/tfile.svg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b99D0W/dJMcaaEvG9A/pYcZNHrrLJ58zKTVzpk3d1/tfile.svg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb99D0W%2FdJMcaaEvG9A%2FpYcZNHrrLJ58zKTVzpk3d1%2Ftfile.svg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;900&quot; height=&quot;400&quot; data-filename=&quot;image3_human_ai_collaboration.svg&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;400&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;AI&amp;nbsp;에이전트가&amp;nbsp;업무의&amp;nbsp;많은&amp;nbsp;부분을&amp;nbsp;주도하면서,&amp;nbsp;인간의&amp;nbsp;역할은&amp;nbsp;더욱&amp;nbsp;고도화되고&amp;nbsp;전문화될&amp;nbsp;것입니다.&amp;nbsp;단순&amp;nbsp;반복&amp;nbsp;업무에서&amp;nbsp;해방된&amp;nbsp;인간은&amp;nbsp;다음과&amp;nbsp;같은&amp;nbsp;역량에&amp;nbsp;집중해야&amp;nbsp;합니다.&lt;br /&gt;&lt;br /&gt;1.&amp;nbsp;&amp;nbsp;**창의성과&amp;nbsp;혁신**:&amp;nbsp;AI&amp;nbsp;에이전트가&amp;nbsp;데이터를&amp;nbsp;분석하고&amp;nbsp;기존&amp;nbsp;지식을&amp;nbsp;조합하는&amp;nbsp;데&amp;nbsp;능숙하다면,&amp;nbsp;인간은&amp;nbsp;전혀&amp;nbsp;새로운&amp;nbsp;아이디어를&amp;nbsp;창출하고,&amp;nbsp;비판적으로&amp;nbsp;사고하며,&amp;nbsp;복잡한&amp;nbsp;문제에&amp;nbsp;대한&amp;nbsp;독창적인&amp;nbsp;해결책을&amp;nbsp;제시하는&amp;nbsp;데&amp;nbsp;강점을&amp;nbsp;가집니다.&amp;nbsp;예술,&amp;nbsp;디자인,&amp;nbsp;전략&amp;nbsp;기획&amp;nbsp;등&amp;nbsp;인간의&amp;nbsp;직관과&amp;nbsp;통찰력이&amp;nbsp;필요한&amp;nbsp;영역의&amp;nbsp;가치는&amp;nbsp;더욱&amp;nbsp;높아질&amp;nbsp;것입니다.&lt;br /&gt;&lt;br /&gt;2.&amp;nbsp;&amp;nbsp;**비판적&amp;nbsp;사고&amp;nbsp;및&amp;nbsp;문제&amp;nbsp;해결**:&amp;nbsp;AI&amp;nbsp;에이전트가&amp;nbsp;제시하는&amp;nbsp;정보와&amp;nbsp;제안을&amp;nbsp;맹목적으로&amp;nbsp;받아들이기보다는,&amp;nbsp;그&amp;nbsp;타당성을&amp;nbsp;검토하고,&amp;nbsp;맥락을&amp;nbsp;이해하며,&amp;nbsp;최종적인&amp;nbsp;판단을&amp;nbsp;내리는&amp;nbsp;능력은&amp;nbsp;여전히&amp;nbsp;인간의&amp;nbsp;몫입니다.&amp;nbsp;예상치&amp;nbsp;못한&amp;nbsp;문제에&amp;nbsp;직면했을&amp;nbsp;때,&amp;nbsp;유연하게&amp;nbsp;사고하고&amp;nbsp;해결책을&amp;nbsp;찾아내는&amp;nbsp;능력&amp;nbsp;또한&amp;nbsp;중요합니다.&lt;br /&gt;&lt;br /&gt;3.&amp;nbsp;&amp;nbsp;**감성&amp;nbsp;지능&amp;nbsp;및&amp;nbsp;대인&amp;nbsp;관계**:&amp;nbsp;AI&amp;nbsp;에이전트는&amp;nbsp;공감,&amp;nbsp;설득,&amp;nbsp;협상과&amp;nbsp;같은&amp;nbsp;감성적&amp;nbsp;영역에서&amp;nbsp;인간의&amp;nbsp;복잡한&amp;nbsp;상호작용을&amp;nbsp;완전히&amp;nbsp;대체하기&amp;nbsp;어렵습니다.&amp;nbsp;팀워크,&amp;nbsp;리더십,&amp;nbsp;고객과의&amp;nbsp;신뢰&amp;nbsp;구축&amp;nbsp;등&amp;nbsp;인간적인&amp;nbsp;소통과&amp;nbsp;관계&amp;nbsp;형성을&amp;nbsp;요구하는&amp;nbsp;역량은&amp;nbsp;더욱&amp;nbsp;중요해질&amp;nbsp;것입니다.&lt;br /&gt;&lt;br /&gt;4.&amp;nbsp;&amp;nbsp;**AI&amp;nbsp;에이전트와의&amp;nbsp;협업&amp;nbsp;능력**:&amp;nbsp;AI&amp;nbsp;에이전트를&amp;nbsp;효과적으로&amp;nbsp;활용하고&amp;nbsp;관리하며,&amp;nbsp;이들과&amp;nbsp;시너지를&amp;nbsp;창출하는&amp;nbsp;능력은&amp;nbsp;미래의&amp;nbsp;핵심&amp;nbsp;역량입니다.&amp;nbsp;AI&amp;nbsp;에이전트의&amp;nbsp;한계를&amp;nbsp;이해하고,&amp;nbsp;적절한&amp;nbsp;지시를&amp;nbsp;내리며,&amp;nbsp;그들의&amp;nbsp;결과물을&amp;nbsp;해석하고&amp;nbsp;개선하는&amp;nbsp;역할이&amp;nbsp;중요해집니다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;**일상생활의&amp;nbsp;변화와&amp;nbsp;미래&amp;nbsp;전망:&amp;nbsp;더&amp;nbsp;풍요로운&amp;nbsp;삶을&amp;nbsp;향하여**&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;업무&amp;nbsp;환경의&amp;nbsp;변화는&amp;nbsp;우리의&amp;nbsp;일상생활에도&amp;nbsp;지대한&amp;nbsp;영향을&amp;nbsp;미칩니다.&lt;br /&gt;&lt;br /&gt;1.&amp;nbsp;&amp;nbsp;**일과&amp;nbsp;삶의&amp;nbsp;균형&amp;nbsp;개선**:&amp;nbsp;AI&amp;nbsp;에이전트가&amp;nbsp;업무&amp;nbsp;부담을&amp;nbsp;덜어주면서,&amp;nbsp;개인은&amp;nbsp;더&amp;nbsp;많은&amp;nbsp;여가&amp;nbsp;시간을&amp;nbsp;확보하고,&amp;nbsp;취미&amp;nbsp;활동이나&amp;nbsp;자기&amp;nbsp;계발에&amp;nbsp;투자할&amp;nbsp;수&amp;nbsp;있게&amp;nbsp;됩니다.&amp;nbsp;이는&amp;nbsp;삶의&amp;nbsp;질을&amp;nbsp;향상시키고,&amp;nbsp;정신적,&amp;nbsp;육체적&amp;nbsp;건강을&amp;nbsp;증진하는&amp;nbsp;데&amp;nbsp;기여할&amp;nbsp;것입니다.&lt;br /&gt;&lt;br /&gt;2.&amp;nbsp;&amp;nbsp;**평생&amp;nbsp;학습의&amp;nbsp;중요성&amp;nbsp;증대**:&amp;nbsp;기술의&amp;nbsp;빠른&amp;nbsp;변화&amp;nbsp;속도에&amp;nbsp;맞춰,&amp;nbsp;새로운&amp;nbsp;지식과&amp;nbsp;기술을&amp;nbsp;지속적으로&amp;nbsp;습득하는&amp;nbsp;평생&amp;nbsp;학습의&amp;nbsp;중요성이&amp;nbsp;더욱&amp;nbsp;커집니다.&amp;nbsp;AI&amp;nbsp;에이전트는&amp;nbsp;개인화된&amp;nbsp;학습&amp;nbsp;콘텐츠를&amp;nbsp;제공하고,&amp;nbsp;학습&amp;nbsp;경로를&amp;nbsp;설계하는&amp;nbsp;데&amp;nbsp;도움을&amp;nbsp;줄&amp;nbsp;수&amp;nbsp;있습니다.&lt;br /&gt;&lt;br /&gt;3.&amp;nbsp;&amp;nbsp;**새로운&amp;nbsp;직업군의&amp;nbsp;등장**:&amp;nbsp;기존의&amp;nbsp;직업들이&amp;nbsp;사라지거나&amp;nbsp;변화하는&amp;nbsp;동시에,&amp;nbsp;AI&amp;nbsp;에이전트를&amp;nbsp;개발,&amp;nbsp;관리,&amp;nbsp;감독하거나,&amp;nbsp;AI가&amp;nbsp;해결하기&amp;nbsp;어려운&amp;nbsp;인간&amp;nbsp;고유의&amp;nbsp;영역에서&amp;nbsp;새로운&amp;nbsp;직업들이&amp;nbsp;탄생할&amp;nbsp;것입니다.&amp;nbsp;AI&amp;nbsp;에이전트&amp;nbsp;윤리&amp;nbsp;전문가,&amp;nbsp;AI&amp;nbsp;시스템&amp;nbsp;코치,&amp;nbsp;AI&amp;nbsp;데이터&amp;nbsp;큐레이터&amp;nbsp;등이&amp;nbsp;그&amp;nbsp;예시입니다.&lt;br /&gt;&lt;br /&gt;4.&amp;nbsp;&amp;nbsp;**윤리적,&amp;nbsp;사회적&amp;nbsp;고려사항**:&amp;nbsp;AI&amp;nbsp;에이전트의&amp;nbsp;광범위한&amp;nbsp;도입은&amp;nbsp;데이터&amp;nbsp;프라이버시,&amp;nbsp;알고리즘&amp;nbsp;편향,&amp;nbsp;책임&amp;nbsp;소재,&amp;nbsp;일자리&amp;nbsp;감소와&amp;nbsp;같은&amp;nbsp;윤리적,&amp;nbsp;사회적&amp;nbsp;문제들을&amp;nbsp;야기할&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;이에&amp;nbsp;대한&amp;nbsp;사회적&amp;nbsp;합의와&amp;nbsp;제도적&amp;nbsp;보완이&amp;nbsp;필수적입니다.&amp;nbsp;우리는&amp;nbsp;기술&amp;nbsp;발전의&amp;nbsp;혜택을&amp;nbsp;누리면서도,&amp;nbsp;그&amp;nbsp;그림자에&amp;nbsp;대한&amp;nbsp;깊은&amp;nbsp;성찰과&amp;nbsp;대응&amp;nbsp;방안을&amp;nbsp;마련해야&amp;nbsp;합니다.&lt;br /&gt;&lt;br /&gt;2026년,&amp;nbsp;AI&amp;nbsp;에이전트는&amp;nbsp;이미&amp;nbsp;업무의&amp;nbsp;중요한&amp;nbsp;파트너이자&amp;nbsp;주도자로서&amp;nbsp;우리의&amp;nbsp;삶에&amp;nbsp;깊이&amp;nbsp;관여하고&amp;nbsp;있습니다.&amp;nbsp;이러한&amp;nbsp;변화는&amp;nbsp;위기이자&amp;nbsp;동시에&amp;nbsp;엄청난&amp;nbsp;기회입니다.&amp;nbsp;AI&amp;nbsp;에이전트의&amp;nbsp;잠재력을&amp;nbsp;이해하고,&amp;nbsp;그들과&amp;nbsp;효과적으로&amp;nbsp;협력하며,&amp;nbsp;인간&amp;nbsp;고유의&amp;nbsp;가치를&amp;nbsp;재발견하는&amp;nbsp;노력을&amp;nbsp;통해&amp;nbsp;우리는&amp;nbsp;더욱&amp;nbsp;생산적이고&amp;nbsp;풍요로운&amp;nbsp;미래를&amp;nbsp;만들어&amp;nbsp;나갈&amp;nbsp;수&amp;nbsp;있을&amp;nbsp;것입니다.&amp;nbsp;지금이야말로&amp;nbsp;AI&amp;nbsp;에이전트와&amp;nbsp;함께하는&amp;nbsp;새로운&amp;nbsp;시대에&amp;nbsp;대한&amp;nbsp;깊은&amp;nbsp;이해와&amp;nbsp;선제적인&amp;nbsp;준비가&amp;nbsp;필요한&amp;nbsp;시점입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  이 내용은 AI가 만들었어요! 참고용으로 활용하고, 중요한 내용은 꼭 확인해 보세요.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  AI가 작성한 콘텐츠입니다. 사실 여부를 한 번 더 확인해 주세요!&lt;/p&gt;
&lt;/blockquote&gt;</description>
      <category>Analysis</category>
      <category>Agent</category>
      <category>Ai</category>
      <author>Minima</author>
      <guid isPermaLink="true">https://maxima-lab.tistory.com/110</guid>
      <comments>https://maxima-lab.tistory.com/entry/2026-AI-Agent#entry110comment</comments>
      <pubDate>Tue, 10 Mar 2026 23:02:48 +0900</pubDate>
    </item>
    <item>
      <title>[Apache] NiFi 설치 하는 방법 (Ubuntu)</title>
      <link>https://maxima-lab.tistory.com/entry/Apache-NiFi-Installation-Ubuntu</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요, 오늘은 NiFi 설치하는 방법에 대해서 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Apache NiFi는 데이터를 &lt;b&gt;자동으로 모으고, 가공하고, 옮기고, 추적할 수 있는 GUI 기반 데이터 흐름 자동화 툴&lt;/b&gt;입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼, Ubuntu에서 NiFi를 설치하는 방법에 대해서 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1749259732816&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo add-apt-repository ppa:openjdk-r/ppa
sudo apt update
sudo apt install openjdk-21-jdk -y
java -version&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저, NiFi를 실행시키기 위해 Java를 설치해야 하는데 NiFi 2.4.0을 설치할 예정이기 떄문에 Java 21 개발 킷(JDK)을 설치해 줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1749259871026&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;wget https://archive.apache.org/dist/nifi/2.4.0/nifi-2.4.0-bin.zip
unzip nifi-2.4.0-bin.zip
cd nifi-2.4.0&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NiFi 2.4.0 버전을 Apache 공식 아카이브에서 다운로드 후 압축을 풀어줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1749259931819&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;echo 'export JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64' &amp;gt;&amp;gt; ~/.bashrc
echo 'export PATH=$JAVA_HOME/bin:$PATH' &amp;gt;&amp;gt; ~/.bashrc
source ~/.bashrc&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫번째에서 설치해 준 Java 21을 PATH에 등록해줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1749259985147&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;./bin/nifi.sh start&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 명령어를 통해 NiFi를 시작할 수 있으며, 최종적으로는 https://localhost:8443/nifi 를 브라우저를 통해 접속가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금까지, Apache NiFi를 설치하는 방법에 대해서 알아보았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;감사드립니다.&lt;/p&gt;</description>
      <category>Apache</category>
      <category>apache</category>
      <category>Installation</category>
      <category>java</category>
      <category>nifi</category>
      <author>Minima</author>
      <guid isPermaLink="true">https://maxima-lab.tistory.com/109</guid>
      <comments>https://maxima-lab.tistory.com/entry/Apache-NiFi-Installation-Ubuntu#entry109comment</comments>
      <pubDate>Sat, 7 Jun 2025 10:35:01 +0900</pubDate>
    </item>
    <item>
      <title>[Apache] Kafka 설치 하는 방법 (Ubuntu)</title>
      <link>https://maxima-lab.tistory.com/entry/Apache-Kafka-Installation-Ubuntu</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요, 오늘은 Kafka를 설치하는 방법에 대해서 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;실시간 데이터 스트리밍 플랫폼&lt;/b&gt;으로, 대규모 데이터를 빠르고 안정적으로 처리할 수 있게 해주는 &lt;b&gt;분산 메시징 시스템&lt;/b&gt; 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Kafka 관련된 용어는 다음과 같습니다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Producer&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Kafka로 데이터를 보내는 주체 (예: 웹 서버, 센서 등)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Consumer&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Kafka에서 데이터를 읽는 주체 (예: 분석 시스템, DB 등)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Topic&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;메시지가 저장되는 논리적인 공간. 데이터의 주제(채널) 같은 개념&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Broker&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Kafka 서버 하나하나를 의미. 여러 개가 클러스터로 동작&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Zookeeper&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Kafka 클러스터를 관리해주는 조율자 역할. 최근엔 &lt;b&gt;KRaft 모드&lt;/b&gt;로 대체 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Partition&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Topic을 나눈 작은 단위로, &lt;b&gt;병렬성&lt;/b&gt;과 &lt;b&gt;처리 속도&lt;/b&gt;를 높이는 데 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Offset&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Consumer가 Topic에서 읽은 메시지의 위치 정보 (&lt;b&gt;재처리&lt;/b&gt; 또는 &lt;b&gt;중단 복구&lt;/b&gt;에 사용)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이어서, Ubuntu에서 Kafka를 설치하는 방법에 대해서 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1749187818043&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;wget https://archive.apache.org/dist/kafka/3.7.0/kafka_2.13-3.7.0.tgz
tar -xzf kafka_2.13-3.7.0.tgz
cd kafka_2.13-3.7.0&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://archive.apache.org/dist/kafka/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://archive.apache.org/dist/kafka/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1749187891481&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Index of /dist/kafka&quot; data-og-description=&quot;&quot; data-og-host=&quot;archive.apache.org&quot; data-og-source-url=&quot;https://archive.apache.org/dist/kafka/&quot; data-og-url=&quot;https://archive.apache.org/dist/kafka/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://archive.apache.org/dist/kafka/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://archive.apache.org/dist/kafka/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Index of /dist/kafka&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;archive.apache.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이상으로, Ubuntu에서 Apache Kafka 설치하는 방법에 대해서 알아보았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;감사드립니다.&lt;/p&gt;</description>
      <category>Apache</category>
      <category>apache</category>
      <category>Installation</category>
      <category>Kafka</category>
      <category>설치</category>
      <author>Minima</author>
      <guid isPermaLink="true">https://maxima-lab.tistory.com/108</guid>
      <comments>https://maxima-lab.tistory.com/entry/Apache-Kafka-Installation-Ubuntu#entry108comment</comments>
      <pubDate>Fri, 6 Jun 2025 14:34:14 +0900</pubDate>
    </item>
    <item>
      <title>[선형대수학, Python] 고윳값과 고유벡터 &amp;amp; PCA (주성분 분석)</title>
      <link>https://maxima-lab.tistory.com/entry/%EC%84%A0%ED%98%95%EB%8C%80%EC%88%98%ED%95%99-Python-%EA%B3%A0%EC%9C%B3%EA%B0%92%EA%B3%BC-%EA%B3%A0%EC%9C%A0%EB%B2%A1%ED%84%B0-PCA</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요, 오늘은 선형대수학 내 고윳값과 고유벡터 그리고 PCA (주성분 분석)에 대해서 알아보고 해당 개념들을 파이썬을 통해 예제로 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Principal Component Analysis (PCA, 주성분 분석)은 고차원 데이터를 저차원 데이터로 줄임과 동시에 데이터의 주요 특성을 최대한 보존하는 방법을 의미한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이는, 데이터의 분산이 가장 큰 방향으로 데이터를 재 표현하는 방법이며, 해당 방향을 주성분이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미지, 텍스트 등과 같은 데이터들은 다수의 특징(Feature)를 가지기 때문에 PCA를 통해 데이터 압축, 노이즈 제거, 시각화 등에 사용된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음은 Logit 데이터를 PCA를 적용하는 파이썬 예시 이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1742996016075&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_digits

# [1] 데이터 로드
digits = load_digits()
X = digits.data      # (1797, 64) - Flattened 8x8 images
y = digits.target    # (1797,) - Digit labels

# [2] 평균 중심화
X_meaned = X - np.mean(X, axis=0)

# [3] 공분산 행렬 및 고유값 분해
cov_matrix = np.cov(X_meaned.T)
eigenvalues, eigenvectors = np.linalg.eig(cov_matrix)

# [4] 고유값 내림차순 정렬 후 주성분 2개 선택
sorted_idx = np.argsort(eigenvalues)[::-1]
top2_vectors = eigenvectors[:, sorted_idx[:2]]

# [5] 2D로 투영
X_2D = X_meaned @ top2_vectors

# [6] 시각화
plt.figure(figsize=(10, 8))
scatter = plt.scatter(X_2D[:, 0], X_2D[:, 1], c=y, cmap='tab10', alpha=0.7)
plt.title(&quot;Visualization of handwriting data reduced by PCA (2D)&quot;)
plt.xlabel(&quot;Principal Component  1&quot;)
plt.ylabel(&quot;Principal Component  2&quot;)
plt.legend(*scatter.legend_elements(), title=&quot;Digit&quot;)
plt.grid(True)
plt.show()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 파이썬 코드를 실행한 결과는 다음과 같다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2025-03-26 at 10.34.12 PM.png&quot; data-origin-width=&quot;1736&quot; data-origin-height=&quot;1386&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b2WBEU/btsMWVLN8LC/N3ujIVfvrOkWPJm1gvvt91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b2WBEU/btsMWVLN8LC/N3ujIVfvrOkWPJm1gvvt91/img.png&quot; data-alt=&quot;PCA 적용 및 시각화 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b2WBEU/btsMWVLN8LC/N3ujIVfvrOkWPJm1gvvt91/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb2WBEU%2FbtsMWVLN8LC%2FN3ujIVfvrOkWPJm1gvvt91%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;647&quot; height=&quot;517&quot; data-filename=&quot;Screenshot 2025-03-26 at 10.34.12 PM.png&quot; data-origin-width=&quot;1736&quot; data-origin-height=&quot;1386&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;PCA 적용 및 시각화 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금까지, 고윳값, 고유벡터 그리고 PCA (주성분 분석)의 개념과 파이썬을 활용한 예시에 대해서 알아보았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;감사드립니다.&lt;/p&gt;</description>
      <category>Linear Algebra</category>
      <category>Linear Algebra</category>
      <category>pca</category>
      <category>고유벡터</category>
      <category>고윳값</category>
      <category>선형대수학</category>
      <category>주성분 분석</category>
      <author>Minima</author>
      <guid isPermaLink="true">https://maxima-lab.tistory.com/107</guid>
      <comments>https://maxima-lab.tistory.com/entry/%EC%84%A0%ED%98%95%EB%8C%80%EC%88%98%ED%95%99-Python-%EA%B3%A0%EC%9C%B3%EA%B0%92%EA%B3%BC-%EA%B3%A0%EC%9C%A0%EB%B2%A1%ED%84%B0-PCA#entry107comment</comments>
      <pubDate>Wed, 26 Mar 2025 22:36:53 +0900</pubDate>
    </item>
    <item>
      <title>[Python, Pytorch] Distributed Data Parallel (DDP) 사용법</title>
      <link>https://maxima-lab.tistory.com/entry/Python-Pytorch-Distributed-Data-Parallel-DDP-Usage</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요, 오늘은 Distributed Data Parallel (DDP) 사용하는 방법에 대해서 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Distributed Data Parallel (DDP)는 PyTorch에서 멀티 GPU 학습을 효율적으로 처리하는 병렬 학습 프레임워크입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 GPU가 자신의 모델 복사본을 가지고 데이터를 나누어 학습하므로써, Backward 시에만 Gradient를 서로 통신하여 동기화합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음은, DPP를 활용하는 코드 예시 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1742913671918&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import os
import torch
import torch.nn as nn
import torch.optim as optim
import torch.distributed as dist
from torch.nn.parallel import DistributedDataParallel as DDP
from torchvision import datasets, transforms
from torch.utils.data import DataLoader, DistributedSampler

def main():
    # 환경 변수로부터 rank/local_rank/world_size 읽기
    local_rank = int(os.environ[&quot;LOCAL_RANK&quot;])
    torch.cuda.set_device(local_rank)

    # DDP 초기화
    dist.init_process_group(backend=&quot;nccl&quot;)

    # 데이터셋 및 DistributedSampler 설정
    transform = transforms.Compose([transforms.ToTensor()])
    train_dataset = datasets.MNIST(root='./data', train=True, download=True, transform=transform)
    train_sampler = DistributedSampler(train_dataset)
    train_loader = DataLoader(train_dataset, batch_size=128, sampler=train_sampler)

    # 모델, loss, optimizer
    model = CNN().to(local_rank)
    model = DDP(model, device_ids=[local_rank])
    criterion = nn.CrossEntropyLoss().to(local_rank)
    optimizer = optim.Adam(model.parameters(), lr=0.001)

    num_epochs = 10
    import time
    start_time = time.time()
    for epoch in range(num_epochs):
        model.train()
        train_sampler.set_epoch(epoch)  # Epoch마다 셔플을 다르게
        total_loss = 0.0
        for images, labels in train_loader:
            images = images.to(local_rank)
            labels = labels.to(local_rank)

            optimizer.zero_grad()
            outputs = model(images)
            loss = criterion(outputs, labels)
            loss.backward()
            optimizer.step()

            total_loss += loss.item()

        if dist.get_rank() == 0:  # 0번 GPU만 출력
            print(f&quot;[Epoch {epoch+1}] Loss: {total_loss:.4f}&quot;)

    print(time.time() - start_time)

    dist.destroy_process_group()

if __name__ == &quot;__main__&quot;:
    main()&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1742913879371&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;!torchrun --nproc_per_node=2 ddm.py&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 코드는 GPUs가 2개인 경우에 DDP를 활용한 모델 학습 코드입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 코드는 다음과 같은 내용으로 구성되어 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;GPU ID : 환경변수 LOCAL_RANK를 통해 각 프로세스가 사용할 GPU를 설정&lt;/li&gt;
&lt;li&gt;CUDA 디바이스 설정 : torch.cuda.set_device(local_rank)로 GPU 지정&lt;/li&gt;
&lt;li&gt;DDP 초기화 : dist.init_process_group(backend=&quot;nccl&quot;)로 GPU 간 통신 그룹 생성&lt;/li&gt;
&lt;li&gt;데이터 로딩 : DistributedSampler로 GPU 마다 데이터 분할&lt;/li&gt;
&lt;li&gt;종료 : dist.destroy_process_group()으로 통신 정리&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음은 DataParallel과 Distributed Data Parallel (DDP) 학습 결과를 보여줍니다. (GPU - RTX 4090 x2EA 기준)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2025-03-26 at 12.05.55 AM.png&quot; data-origin-width=&quot;484&quot; data-origin-height=&quot;422&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sTD64/btsMWjSFvVd/vgD9FoQQeO4ePkIkALmPYK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sTD64/btsMWjSFvVd/vgD9FoQQeO4ePkIkALmPYK/img.png&quot; data-alt=&quot;DataParallel 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sTD64/btsMWjSFvVd/vgD9FoQQeO4ePkIkALmPYK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsTD64%2FbtsMWjSFvVd%2FvgD9FoQQeO4ePkIkALmPYK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;262&quot; data-filename=&quot;Screenshot 2025-03-26 at 12.05.55 AM.png&quot; data-origin-width=&quot;484&quot; data-origin-height=&quot;422&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;DataParallel 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2025-03-26 at 12.06.04 AM.png&quot; data-origin-width=&quot;484&quot; data-origin-height=&quot;422&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Wfcrg/btsMVbVAusw/B6iCyJtDlxZsUjriJKPlLK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Wfcrg/btsMVbVAusw/B6iCyJtDlxZsUjriJKPlLK/img.png&quot; data-alt=&quot;Distributed Data Parallel (DDP)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Wfcrg/btsMVbVAusw/B6iCyJtDlxZsUjriJKPlLK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWfcrg%2FbtsMVbVAusw%2FB6iCyJtDlxZsUjriJKPlLK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;262&quot; data-filename=&quot;Screenshot 2025-03-26 at 12.06.04 AM.png&quot; data-origin-width=&quot;484&quot; data-origin-height=&quot;422&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Distributed Data Parallel (DDP)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금까지, PyTorch를 활용해서 Distributed Data Parallel (DDP)를 적용하는 방법에 대해서 알아보았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;감사드립니다.&lt;/p&gt;</description>
      <category>Python/Pytorch</category>
      <category>dataparallel</category>
      <category>DDP</category>
      <category>Deep Learning</category>
      <category>distributed data parallel</category>
      <category>pytorch</category>
      <category>딥러닝</category>
      <author>Minima</author>
      <guid isPermaLink="true">https://maxima-lab.tistory.com/106</guid>
      <comments>https://maxima-lab.tistory.com/entry/Python-Pytorch-Distributed-Data-Parallel-DDP-Usage#entry106comment</comments>
      <pubDate>Wed, 26 Mar 2025 00:11:39 +0900</pubDate>
    </item>
    <item>
      <title>[Python, Deep Learning] Tensorflow2 Classification 모델, .onnx &amp;amp; .trt 변환 및 Inference 방법</title>
      <link>https://maxima-lab.tistory.com/entry/Python-Deep-Learning-Tensorflow2-Classification-ONNX-TensorRT-Inference</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요, 오늘은 Tensorflow 프레임워크에서 Classification 모델을 .onnx 파일과 .trt 파일로 변환하고 해당 파일을 활용하여 Inference 하는 방법에 대해서 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 위해 TEST를 진행한 패키지 버전 및 환경은 다음과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1720797822881&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;- OS : Ubuntu 22.04
- CUDA : 11.8
- GPU : NVIDIA GeForce RTX 4070 Laptop GPU

- Python : 3.10.12

- tensorflow : 2.14.0
- tf2onnx : 1.16.1
- onnxruntime-gpu : 1.18.1
- nvidia-tensorrt : 8.4.3.1
- pycuda : 2024.1&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저, tensorflow 2 모델을 onnx 파일로 변환하는 코드에 대해서 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1720798759289&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import tensorflow as tf

def convert_tf_to_onnx(tf_model_path, onnx_model_path):
    model = tf.keras.models.load_model(tf_model_path)
    spec = (tf.TensorSpec((1, 1024, 1024, 3), tf.float32, name=&quot;input&quot;),)
    model_proto, _ = tf2onnx.convert.from_keras(model, input_signature=spec, opset=13, output_path=onnx_model_path)
    return onnx_model_path&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 모델은 Tensorflow2 모델의 Input Shape : (1024, 1024, 3)인 상황입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;.onnx 파일에 대한 Inference 코드는 다음과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1720799481753&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import onnxruntime as ort
import numpy as np

def do_inference_onnx(session, input_data):
    input_name = session.get_inputs()[0].name
    output_name = session.get_outputs()[0].name
    input_data = {input_name: input_data}
    output = session.run([output_name], input_data)
    return output
    
providers = ['CUDAExecutionProvider', 'CPUExecutionProvider']
ort_session = ort.InferenceSession(onnx_model_path, providers=providers)
input_data = np.random.random((1, 1024, 1024, 3)).astype(np.float32)

for _ in range(100):
    onnx_outputs = do_inference_onnx(ort_session, input_data)&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이어서, 변환된 .onnx 파일을 .trt 파일로 변환하는 코드에 대해서 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1720799224083&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;imort os

def convert_onnx_to_trt(onnx_model_path, trt_engine_path):
    command = f&quot;trtexec --onnx={onnx_model_path} --saveEngine={trt_engine_path} --verbose&quot;
    os.system(command)
    return trt_engine_path&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1720799778644&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import pycuda.driver as cuda
import tensorrt as trt

def allocate_buffers(engine):
    inputs = []
    outputs = []
    bindings = []
    stream = cuda.Stream()

    for binding in engine:
        size = trt.volume(engine.get_binding_shape(binding)) * engine.max_batch_size
        dtype = trt.nptype(engine.get_binding_dtype(binding))
        host_mem = cuda.pagelocked_empty(size, dtype)
        device_mem = cuda.mem_alloc(host_mem.nbytes)
        bindings.append(int(device_mem))

        if engine.binding_is_input(binding):
            inputs.append((host_mem, device_mem))
        else:
            outputs.append((host_mem, device_mem))
    return inputs, outputs, bindings, stream
    
def load_trt_engine(trt_engine_path):
    with open(trt_engine_path, 'rb') as f:
        engine_data = f.read()
    runtime = trt.Runtime(TRT_LOGGER)
    if runtime is None:
        print(&quot;Failed to create TensorRT runtime&quot;)
    engine = runtime.deserialize_cuda_engine(engine_data)
    if engine is None:
        print(&quot;Failed to load TensorRT engine&quot;)
    return engine

# GPU device 설정
cuda.init()
device = cuda.Device(0) # gpu_id = 0 (int)
context = device.make_context()

&quot;&quot;&quot; TensorRT Engine 로드 &quot;&quot;&quot;
engine = load_trt_engine(trt_engine_path)
context = engine.create_execution_context()

inputs, outputs, bindings, stream = allocate_buffers(engine)

&quot;&quot;&quot; Input Data를 설정 &quot;&quot;&quot;
input_data = np.random.random_sample(inputs[0][0].shape).astype(np.float32)
np.copyto(inputs[0][0], input_data.ravel())

&quot;&quot;&quot; Inference &quot;&quot;&quot;
for _ in range(1000):
    trt_outputs = do_inference(context, bindings=bindings, inputs=inputs, outputs=outputs, stream=stream)
    
cuda.Context.pop()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금까지, Tensorflow 2 모델을 .onnx 파일 및 .trt 파일로 변환하고 Inference 하는 방법에 대해서 알아보았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;감사드립니다.&lt;/p&gt;</description>
      <category>Deep Learning</category>
      <category>Deep Learning</category>
      <category>engine</category>
      <category>onnx</category>
      <category>Python</category>
      <category>tensorrt</category>
      <author>Minima</author>
      <guid isPermaLink="true">https://maxima-lab.tistory.com/105</guid>
      <comments>https://maxima-lab.tistory.com/entry/Python-Deep-Learning-Tensorflow2-Classification-ONNX-TensorRT-Inference#entry105comment</comments>
      <pubDate>Sat, 13 Jul 2024 09:29:16 +0900</pubDate>
    </item>
    <item>
      <title>[Python] YAML (.yaml) 파일 작성 및 사용 하는 방법</title>
      <link>https://maxima-lab.tistory.com/entry/Python-YAML</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요, 오늘은 YAML 파일 작성 및 사용 하는 방법에 대해서 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;YAML 파일을 작성 후 Python에서 사용하기 위해서는 다음 패키지를 설치합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1720615208272&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pip install pyyaml&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;패키지 설치 후 다음과 같이 config.yaml 파일을 작성하는 예시를 살펴 보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;YAML 파일을 작성하는 주요 데이터 형식은 다음과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;문자열 (String)&lt;/li&gt;
&lt;li&gt;정수 (Integer)&lt;/li&gt;
&lt;li&gt;부동 소수점 (Float)&lt;/li&gt;
&lt;li&gt;Boolean&lt;/li&gt;
&lt;li&gt;Null 값&lt;/li&gt;
&lt;li&gt;Collection (리스트, 딕셔너리)&lt;/li&gt;
&lt;li&gt;복합 자료형&lt;/li&gt;
&lt;/ol&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저, 문자열 (String) 예시에 대해서 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1720615574935&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;string: &quot;Hello, World!&quot;
single_quoted_string: 'Hello, World!'
unquoted_string: HelloWorld
multiline_string: |
  This is a
  multiline string.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두번째, 정수 (Interger)에 대한 예시 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1720615636466&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;integer: 42
negative_integer: -42
octal_integer: 0o52
hex_integer: 0x2A&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세번째, 부동 소수점(Float)에 대한 예시 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1720615663365&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;float: 3.14
negative_float: -3.14
exponential_float: 1.0e+2&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네번째, Boolean에 대한 예시 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1720615703381&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;boolean_true: true
boolean_false: false&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다섯번째, Null 값에 대한 예시 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1720615725498&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;null_value: null
empty_value:&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여섯번째, Collecions 내 리스트에 대한 예시 입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1720615765464&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;list:
  - item1
  - item2
  - item3
inline_list: [item1, item2, item3]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;딕셔너리에 대한 예시 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1720615798148&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;dict:
  key1: value1
  key2: value2
inline_dict: {key1: value1, key2: value2}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막, 복합 자료형에 대한 예시 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) 리스트 안에 딕셔너리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1720615863113&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;list_of_dicts:
  - name: server1
    ip: 192.168.1.1
    role: web
  - name: server2
    ip: 192.168.1.2
    role: db&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) 딕셔너리 안에 리스트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1720615888946&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;dict_of_lists:
  web_servers:
    - server1
    - server2
  db_servers:
    - server3
    - server4&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 작성된 YAML 파일을 파이썬에 대해서 다음과 같이 사용할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1720616163442&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import yaml
# os.path.dirname(os.path.abspath(__file__))

# YAML 파일 읽기
with open('config.yaml', 'r') as file:
    config_data = yaml.safe_load(file)
    
# YAML 파일 업데이트
config_data[...] = ...

# YAML 파일 저장
with open('config.yaml', 'w') as file:
    yaml.dump(config_data, file, default_flow_style=False)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금까지, YAML 파일을 작성하고 파이썬 패키지를 활용하여 사용하는 방법에 대해서 알아보았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;감사드립니다.&lt;/p&gt;</description>
      <category>Python</category>
      <category>Python</category>
      <category>pyyaml</category>
      <category>yaml</category>
      <category>__FILE__</category>
      <author>Minima</author>
      <guid isPermaLink="true">https://maxima-lab.tistory.com/104</guid>
      <comments>https://maxima-lab.tistory.com/entry/Python-YAML#entry104comment</comments>
      <pubDate>Wed, 10 Jul 2024 21:58:06 +0900</pubDate>
    </item>
    <item>
      <title>[Python] Cryptography 라이브러리 (hazmat 모듈) 사용법</title>
      <link>https://maxima-lab.tistory.com/entry/Python-Cryptography-hazmat</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요, 오늘은 Cryptography 라이브러리에서 hazmat 모듈을 사용하는 방법에 대해서 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;hazmat 모듈을 사용하는 예시는 다음과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1720528460556&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.primitives import padding
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC
import os
import base64

def encrypt_file(file_path, password, output_path):
    backend = default_backend()
    salt = os.urandom(16)
    kdf = PBKDF2HMAC(
        algorithm=hashes.SHA256(),
        length=32,
        salt=salt,
        iterations=100000,
        backend=backend
    )
    key = kdf.derive(password.encode())

    iv = os.urandom(16)
    cipher = Cipher(algorithms.AES(key), modes.CBC(iv), backend=backend)
    encryptor = cipher.encryptor()

    with open(file_path, 'rb') as f:
        data = f.read()

    padder = padding.PKCS7(128).padder()
    padded_data = padder.update(data) + padder.finalize()

    encrypted_data = encryptor.update(padded_data) + encryptor.finalize()

    with open(output_path, 'wb') as f:
        f.write(base64.b64encode(salt + iv + encrypted_data))

# 사용 예시
encrypt_file('model.h5', 'test_password', 'model.encrypted')&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 코드는 tensorflow2 프레임워크 내 특정 모델 model.h5 파일을 특정 비밀번호 = 'test_password'를 활용해서 model.encrypted 파일로 암호화 하는 코드 입니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이어서, 해당 파일을 복호화하는 코드에 대해서 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1720528659381&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.primitives import padding
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC
import base64

def decrypt_file(encrypted_file_path, password, output_path):
    backend = default_backend()

    with open(encrypted_file_path, 'rb') as f:
        encrypted_data = base64.b64decode(f.read())

    salt = encrypted_data[:16]
    iv = encrypted_data[16:32]
    cipher_text = encrypted_data[32:]

    kdf = PBKDF2HMAC(
        algorithm=hashes.SHA256(),
        length=32,
        salt=salt,
        iterations=100000,
        backend=backend
    )
    key = kdf.derive(password.encode())

    cipher = Cipher(algorithms.AES(key), modes.CBC(iv), backend=backend)
    decryptor = cipher.decryptor()

    padded_data = decryptor.update(cipher_text) + decryptor.finalize()

    unpadder = padding.PKCS7(128).unpadder()
    data = unpadder.update(padded_data) + unpadder.finalize()

    with open(output_path, 'wb') as f:
        f.write(data)

# 사용 예시
decrypt_file('model.encrypted', 'test_password', 'model.h5')&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추가적으로, 복호화 시 따로 model.h5 파일로 저장하지 않고 복호화 후, 메모리 상헤서 바로 로드하여 사용하는 방법에 대해서 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1720528851928&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.primitives import padding
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC
import base64
import io
import h5py
import tensorflow as tf

def decrypt_and_load_model(encrypted_file_path, password):
    backend = default_backend()

    with open(encrypted_file_path, 'rb') as f:
        encrypted_data = base64.b64decode(f.read())

    salt = encrypted_data[:16]
    iv = encrypted_data[16:32]
    cipher_text = encrypted_data[32:]

    kdf = PBKDF2HMAC(
        algorithm=hashes.SHA256(),
        length=32,
        salt=salt,
        iterations=100000,
        backend=backend
    )
    key = kdf.derive(password.encode())

    cipher = Cipher(algorithms.AES(key), modes.CBC(iv), backend=backend)
    decryptor = cipher.decryptor()

    padded_data = decryptor.update(cipher_text) + decryptor.finalize()

    unpadder = padding.PKCS7(128).unpadder()
    data = unpadder.update(padded_data) + unpadder.finalize()

    # 메모리 상에서 파일 객체로 변환
    model_data = io.BytesIO(data)

    # TensorFlow 모델 로드
    with h5py.File(model_data, 'r') as f:
    	model = tf.keras.models.load_model(f)

    return model

# 사용 예시
model = decrypt_and_load_model('model.encrypted', 'test_password')&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 코드에서 파일을 저장하지 않고, io.BytesIO를 사용하여 데이터를 메모리 상의 파일 객체로 만들고, tf.keras.models.load_model() 함수를 사용하여 Tensorflow 모델을 로드할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추가적으로 각 OS 별로 환경 변수 설정하는 방법에 대해서 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;bash를 사용하는 경우&amp;nbsp; : nano ~/.bashrc&lt;/li&gt;
&lt;li&gt;zsh를 사용하는 경우 : nano ~/.zshrc&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일 끝에 다음과 같은 줄을 추가 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1720529898629&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;export ENCRYPTION_PASSWORD=test_password&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이어서 변경 사항을 적용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1720529949388&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;source ~/.bashrc  # 또는 ~/.zshrc 등&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;환경 변수로 정상적으로 적용되었는 지 확인하기 위해서는 다음 명령어로 확인 가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;Linux / MacOs&amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1720530056544&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;echo $ENCRYPTION_PASSWORD&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;Windows&amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1720530086994&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;echo %ENCRYPTION_PASSWORD%&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파이썬 코드에서 위와 같이 설정한 환경 변수를 사용하기 위해서는 다음과 같은 코드를 사용 가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1720529996861&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import os

# 환경 변수에서 비밀번호 가져오기
password = os.getenv('ENCRYPTION_PASSWORD')

if password is None:
    raise ValueError(&quot;환경 변수 ENCRYPTION_PASSWORD가 설정되지 않았습니다.&quot;)

# 사용 예시
model = decrypt_and_load_model('encrypted_model.encrypted', password)&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금까지, Cryptography 라이브러리 내 hazmat 모듈을 사용하여 파일을 암호화, 복호화 및 메모리 상의 파일 객체로 만드는 방법, 그리고 환경 변수 설정 및 사용방법에 대해서 알아보았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;감사드립니다.&lt;/p&gt;</description>
      <category>Python</category>
      <category>bashrc</category>
      <category>Cryptography</category>
      <category>decrypt</category>
      <category>echo</category>
      <category>ENCRYPT</category>
      <category>hazmat</category>
      <category>Python</category>
      <category>zshrc</category>
      <category>환경변수</category>
      <author>Minima</author>
      <guid isPermaLink="true">https://maxima-lab.tistory.com/103</guid>
      <comments>https://maxima-lab.tistory.com/entry/Python-Cryptography-hazmat#entry103comment</comments>
      <pubDate>Tue, 9 Jul 2024 22:05:02 +0900</pubDate>
    </item>
    <item>
      <title>[Kubernetes] Node Selector 개념 및 예제 코드</title>
      <link>https://maxima-lab.tistory.com/entry/Kubernetes-Node-Selector-Definition-Example-Code</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요, 오늘은 Node Selector 개념에 대해서 알아보고 예제 코드를 적용해보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#nodeselector&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#nodeselector&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1718631057088&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Assigning Pods to Nodes&quot; data-og-description=&quot;You can constrain a Pod so that it is restricted to run on particular node(s), or to prefer to run on particular nodes. There are several ways to do this and the recommended approaches all use label selectors to facilitate the selection. Often, you do not &quot; data-og-host=&quot;kubernetes.io&quot; data-og-source-url=&quot;https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#nodeselector&quot; data-og-url=&quot;https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/QWjJw/hyWlbLvewU/NvjColTfF2w5RnOU2KKUA1/img.png?width=1727&amp;amp;height=373&amp;amp;face=0_0_1727_373&quot;&gt;&lt;a href=&quot;https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#nodeselector&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#nodeselector&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/QWjJw/hyWlbLvewU/NvjColTfF2w5RnOU2KKUA1/img.png?width=1727&amp;amp;height=373&amp;amp;face=0_0_1727_373');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Assigning Pods to Nodes&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;You can constrain a Pod so that it is restricted to run on particular node(s), or to prefer to run on particular nodes. There are several ways to do this and the recommended approaches all use label selectors to facilitate the selection. Often, you do not&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;kubernetes.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Node Selector&lt;/b&gt; 란?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 노드에 할당된 라벨을 기반으로 파드를 특정 노드에만 스케줄링하도록 제한합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Node Selector는 Node에 할당된 Label과 Pod Spec에 정의된 Node Selector를 매칭하여 작동하며, Node가 Pod의 Node Selector 요구사항을 충족하는 라벨을 가지고 있으면 해당 파드를 해당 노드에 스케줄링할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음은 Node Selector를 적용하는 YAML 파일 예시입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 예시는 특정 Node에 SSD Storage에 대한 Label을 부여하고, Pod Spec을 통해 Node Selector을 정의하여 매칭합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1718631459786&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;kubectl label nodes &amp;lt;노드 이름&amp;gt; disktype=ssd&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1718631369637&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
spec:
  containers:
  - name: nginx
    image: nginx
  nodeSelector:
    disktype: ssd&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 YAML 파일을 통해 실행된 결과는 &lt;span&gt;disktype=ssd&lt;/span&gt; 라벨을 가진 노드에서만 스케줄링 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Node Selector 사용의 장점은 다음과 같습니다.&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&amp;nbsp;단순성: Node Selector는 사용법이 간단하고 이해하기 쉬워, 간단한 스케줄링 요구사항에 적합&lt;/li&gt;
&lt;li&gt;&amp;nbsp;제어: 노드 라벨을 기반으로 파드 배치를 제어하는 명확한 방법을 제공&lt;/li&gt;
&lt;li&gt;&amp;nbsp;자원 관리: Node Selector를 사용하여 특정 자원을 가진 노드에 워크로드를 효과적으로 배치 가능&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Node Selector의 한계는 다음과 같습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&amp;nbsp;제한된 유연성: Node Selector는 라벨의 정확한 매칭만 지원하며, 더 복잡한 매칭 규칙이나 표현을 지원X&lt;/li&gt;
&lt;li&gt;소프트 제약 없음: Node Selector는 선호도나 소프트 제약 조건을 지원하지 않습니다. 모든 지정된 제약 조건이 충족되어야만 파드를 스케줄링 가능&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;더 복잡한 Scheduling을 위해서는 &lt;b&gt;Node Affinity &lt;/b&gt;를 사용하면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금까지, Node Selector의 개념과 예제 코드에 대해서 알아보았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;감사드립니다.&lt;/p&gt;</description>
      <category>Kubernetes</category>
      <category>k8s</category>
      <category>kubernetes</category>
      <category>node selector</category>
      <category>POD</category>
      <category>spec</category>
      <author>Minima</author>
      <guid isPermaLink="true">https://maxima-lab.tistory.com/102</guid>
      <comments>https://maxima-lab.tistory.com/entry/Kubernetes-Node-Selector-Definition-Example-Code#entry102comment</comments>
      <pubDate>Mon, 17 Jun 2024 22:50:59 +0900</pubDate>
    </item>
    <item>
      <title>[Kubernetes] Pod Scheduling (Taints &amp;amp; Tolerations) 개념 및 예제 코드</title>
      <link>https://maxima-lab.tistory.com/entry/Kubernetes-Pod-Scheduling-Taints-Tolerations</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요, 오늘은 Pod Scheduling을 하는 방법 중에 하나인 Taints와 Tolerations 개념과 예제 코드에 대해서 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Taints와 Tolerations는 노드에 특정 Pod가 스케줄링되는 것을 제어하기 위한 메커니즘이며, 특정 노드에 특정 Pod가 배치되지 않도록 하거나, 특정 Pod가 특정 노드에서만 실행되도록 할 때 사용됩니다. Taints와 Tolerations는 함께 작동하여 노드의 리소스를 보다 효율적으로 사용하고, 특정 요구 사항을 가진 Pod의 배치를 제어하는 개념입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Taints 개념을 적용하기 위한 형식은 다음과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1718203772919&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;kubectl taint nodes &amp;lt;node-name&amp;gt; key=value:effect&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;key: Taint의 키.&lt;/li&gt;
&lt;li&gt;value: Taint의 값.&lt;/li&gt;
&lt;li&gt;effect: Taint의 효과로, 노드에 적용되는 Taint의 동작을 정의하며, 3가지로 구성됨
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;NoSchedule&lt;/b&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;: Taint를 허용하지 않는 Pod는 이 노드에 스케줄링되지 않습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;PreferNoSchedule&lt;/b&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;: Taint를 허용하지 않는 Pod는 가능하면 이 노드에 스케줄링되지 않도록 합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;NoExecute&lt;/b&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;: Taint를 허용하지 않는 Pod는 즉시 이 노드에서 제거되거나, 처음부터 이 노드에 스케줄링되지 않습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;Tolerations 개념을 적용하기 위한 형식은 다음과 같습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1718204304211&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;tolerations:
- key: &quot;key1&quot;
  operator: &quot;Equal&quot;
  value: &quot;value1&quot;
  effect: &quot;NoSchedule&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 활용하여 다음과 같이 YAML 파일을 작성할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1718204352559&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: my-container
    image: nginx
  tolerations:
  - key: &quot;key1&quot;
    operator: &quot;Equal&quot;
    value: &quot;value1&quot;
    effect: &quot;NoSchedule&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 Taints와 Tolerations는 다음과 같은 상황에서 주로 사용하게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;특정 노드에만 특정 Pod 스케줄링: 고성능 컴퓨팅을 필요로 하는 WorkLoad를 특정 노드에만 배치함&lt;/li&gt;
&lt;li&gt;노드 유지보수: 노드를 유지보수 모드로 설정하여, 새로운 Pod가 스케줄링되지 않도록 하고, 기존 Pod를 점차 다른 노드로 이동함&lt;/li&gt;
&lt;li&gt;특정 Pod 격리: 테스트 환경의 Pod가 프로덕션 노드에 스케줄링되지 않도록 함&lt;/li&gt;
&lt;/ol&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금까지, Pod Scheduling 방법 중 하나인 Taints와 Tolerations의 개념에 대해서 알아보고 적용하는 예시에 대해서 알아보았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;감사드립니다.&lt;/p&gt;</description>
      <category>Kubernetes</category>
      <category>k8s</category>
      <category>kubernetes</category>
      <category>POD</category>
      <category>pod scheduling</category>
      <category>tains</category>
      <category>tolerations</category>
      <author>Minima</author>
      <guid isPermaLink="true">https://maxima-lab.tistory.com/101</guid>
      <comments>https://maxima-lab.tistory.com/entry/Kubernetes-Pod-Scheduling-Taints-Tolerations#entry101comment</comments>
      <pubDate>Thu, 13 Jun 2024 00:02:40 +0900</pubDate>
    </item>
    <item>
      <title>[Kubernetes] YAML 파일 내  Object kind (k8s 객체 유형)</title>
      <link>https://maxima-lab.tistory.com/entry/Kubernetes-YAML-Object-kind-k8s</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요, 오늘은 Kubernetes에서 YAML 파일 내 kind 항목으로 사용할 수 있는 객체 유형들에 대해서 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래는 YAML 파일을 작성하는 간단한 예시 입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1717941747898&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;apiVersion: v1
kind: Pod
metadata:
  name: sample-pod
spec:
  containers:
  - name: nginx
    image: nginx:1.14.2&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;크게 나누면 다음과 같이 나눌 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[Workloads : 애플리케이션을 정의하는 객체]&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Pod : 클러스터에서&amp;nbsp;실행&amp;nbsp;중인&amp;nbsp;프로세스의&amp;nbsp;단일&amp;nbsp;인스턴스&lt;/li&gt;
&lt;li&gt;ReplicationController : 관리하는 Pod를 지속적으로 관리 하여 원하는 복제본 수를 유지&lt;/li&gt;
&lt;li&gt;ReplicaSet : 세트&amp;nbsp;기반&amp;nbsp;선택기를&amp;nbsp;지원하여&amp;nbsp;이&amp;nbsp;기능을&amp;nbsp;확장하여&amp;nbsp;포드&amp;nbsp;선택&amp;nbsp;및&amp;nbsp;관리&amp;nbsp;방법에&amp;nbsp;대한&amp;nbsp;더&amp;nbsp;큰&amp;nbsp;유연성과&amp;nbsp;제어&amp;nbsp;기능을&amp;nbsp;제공&lt;/li&gt;
&lt;li&gt;Deployment : 롤링 업데이트를 지원하므로 가동 중지 시간 없이 애플리케이션을 업데이트 가능&lt;/li&gt;
&lt;li&gt;StatefulSet : 지속적인&amp;nbsp;스토리지와&amp;nbsp;안정적인&amp;nbsp;네트워크&amp;nbsp;ID가&amp;nbsp;필요한&amp;nbsp;상태&amp;nbsp;저장&amp;nbsp;애플리케이션을&amp;nbsp;관리&lt;/li&gt;
&lt;li&gt;DaemonSet : Pod의&amp;nbsp;복사본이&amp;nbsp;클러스터의&amp;nbsp;모든(또는&amp;nbsp;일부)&amp;nbsp;노드에서&amp;nbsp;실행되는지&amp;nbsp;확인&lt;/li&gt;
&lt;li&gt;Job : 하나&amp;nbsp;이상의&amp;nbsp;Pod를&amp;nbsp;생성하고&amp;nbsp;지정된&amp;nbsp;수의&amp;nbsp;Pod가&amp;nbsp;성공적으로&amp;nbsp;종료되는지&amp;nbsp;확인&lt;/li&gt;
&lt;li&gt;CronJob : 백업,&amp;nbsp;보고서&amp;nbsp;생성,&amp;nbsp;이메일&amp;nbsp;전송과&amp;nbsp;같은&amp;nbsp;정기적인&amp;nbsp;작업을&amp;nbsp;수행하는&amp;nbsp;데&amp;nbsp;유용&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[Service Discovery and Load Balancing : 클러스터&amp;nbsp;내&amp;nbsp;및&amp;nbsp;외부에서&amp;nbsp;서비스가&amp;nbsp;노출되고&amp;nbsp;액세스되는&amp;nbsp;방식을&amp;nbsp;관리]&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Service : Pod&amp;nbsp;그룹에 액세스하기 위해 안정적인 IP 주소와 DNS 이름을 제공&lt;/li&gt;
&lt;li&gt;Endpoint : 서비스의&amp;nbsp;대상이&amp;nbsp;되는&amp;nbsp;Pod의&amp;nbsp;실제&amp;nbsp;IP&amp;nbsp;주소를&amp;nbsp;정의&lt;/li&gt;
&lt;li&gt;Ingress : 서비스(일반적으로&amp;nbsp;HTTP)에&amp;nbsp;대한&amp;nbsp;외부&amp;nbsp;액세스를&amp;nbsp;관리&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[Config and Storage : 애플리케이션의&amp;nbsp;구성&amp;nbsp;데이터와&amp;nbsp;영구&amp;nbsp;저장소를&amp;nbsp;관리]&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;ConfigMap : 구성&amp;nbsp;데이터를&amp;nbsp;키-값&amp;nbsp;쌍으로&amp;nbsp;저장&lt;/li&gt;
&lt;li&gt;Secret : 비밀번호,&amp;nbsp;OAuth&amp;nbsp;토큰,&amp;nbsp;SSH&amp;nbsp;키&amp;nbsp;등&amp;nbsp;민감한&amp;nbsp;데이터를&amp;nbsp;암호화된&amp;nbsp;형식으로&amp;nbsp;저장&lt;/li&gt;
&lt;li&gt;PersistentVolume : 개별&amp;nbsp;Pod의&amp;nbsp;수명이&amp;nbsp;다할&amp;nbsp;때까지&amp;nbsp;데이터를&amp;nbsp;유지하는&amp;nbsp;데&amp;nbsp;사용&lt;/li&gt;
&lt;li&gt;PersistentVolumeClaim : Pod에서&amp;nbsp;영구&amp;nbsp;스토리지&amp;nbsp;리소스를&amp;nbsp;요청하는&amp;nbsp;데&amp;nbsp;사용&lt;/li&gt;
&lt;li&gt;Volume : 임시&amp;nbsp;스토리지,&amp;nbsp;영구&amp;nbsp;스토리지,&amp;nbsp;네트워크&amp;nbsp;스토리지&amp;nbsp;등&amp;nbsp;다양한&amp;nbsp;스토리지&amp;nbsp;솔루션을&amp;nbsp;제공&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[Cluster : 클러스터&amp;nbsp;수준에서&amp;nbsp;리소스와&amp;nbsp;권한을&amp;nbsp;관리]&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Namespace : 여러&amp;nbsp;사용자&amp;nbsp;또는&amp;nbsp;팀&amp;nbsp;간에&amp;nbsp;클러스터&amp;nbsp;리소스를&amp;nbsp;나누어&amp;nbsp;격리를&amp;nbsp;제공하고&amp;nbsp;리소스&amp;nbsp;할당을&amp;nbsp;관리&lt;/li&gt;
&lt;li&gt;Node : 클러스터의 작업자 노드를 나타내며, Kubernetes 런타임을 실행하고 애플리케이션을 구성하는 컨테이너를 호스팅&lt;/li&gt;
&lt;li&gt;LimitRange : Namespace&amp;nbsp;내의 CPU 및 메모리와 같은 리소스에 대한 최소/최대 제약 조건을 정의&lt;/li&gt;
&lt;li&gt;ResourceQuota : Namespace 마다 총 리소스 소비를 관리&lt;/li&gt;
&lt;li&gt;ServiceAccount : Pod에서&amp;nbsp;실행되는&amp;nbsp;프로세스에&amp;nbsp;대한&amp;nbsp;ID를&amp;nbsp;제공&lt;/li&gt;
&lt;li&gt;Role : Namespace&amp;nbsp;내의&amp;nbsp;권한을&amp;nbsp;정의&lt;/li&gt;
&lt;li&gt;RoleBinding : Namespace&amp;nbsp;내의&amp;nbsp;사용자,&amp;nbsp;그룹&amp;nbsp;또는&amp;nbsp;서비스&amp;nbsp;계정에&amp;nbsp;역할에&amp;nbsp;정의된&amp;nbsp;권한을&amp;nbsp;부여&lt;/li&gt;
&lt;li&gt;ClusterRole :  Cluster 전체 권한을 정의&lt;/li&gt;
&lt;li&gt;ClusterRoleBinding : ClusterRole에 정의된 권한을 모든 Namespace의 사용자, 그룹 또는 서비스 계정에 부여&lt;/li&gt;
&lt;/ol&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금까지, YAML 파일을 구성하는 Object kind 항목들에 대해서 알아보았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;감사드립니다.&lt;/p&gt;</description>
      <category>Kubernetes</category>
      <category>Cluster</category>
      <category>config</category>
      <category>k8s</category>
      <category>Kind</category>
      <category>kubernetes</category>
      <category>Load balancing</category>
      <category>service</category>
      <category>storage</category>
      <category>workloads</category>
      <category>yaml</category>
      <author>Minima</author>
      <guid isPermaLink="true">https://maxima-lab.tistory.com/100</guid>
      <comments>https://maxima-lab.tistory.com/entry/Kubernetes-YAML-Object-kind-k8s#entry100comment</comments>
      <pubDate>Sun, 9 Jun 2024 23:04:58 +0900</pubDate>
    </item>
    <item>
      <title>[Ubuntu] lsblk, lsblk -f,  df - h,파일 시스템, 마운트, 자동 마운트</title>
      <link>https://maxima-lab.tistory.com/entry/Ubuntu-lsblk-mount-filesystem</link>
      <description>&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;안녕하세요, 오늘은 Ubuntu 에서 디스크와&amp;nbsp; 파티션을 관리하는 방법에 대해서 알아보겠습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;Linux에서 블록 장치 정보를 출력하는 명령어는 다음과 같습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1716613871308&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;lsblk&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 명령어를 입력하게 되면 시스템에 연결된 모든 블록 장치의 목록들이 나타납니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추가적으로 -f 옵션을 사용하면 파일 시스템 정보도 확인 가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1716613922816&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;lsblk -f&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서, 파일 시스템은 데이터를 저장하고 조작하는 방법을 정의하는 시스템입니다. 이때, 우분투에서 자주 사용되는 파일 시스템은 `ext4` 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때, 특정 파이션에 파일 시스템이 없는 경우에는 파일 시스템을 생성합니다. (예시)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1716614077480&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo mkfs.ext4 /dev/sdb1&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이어서, 마운트를 하기 위해서는 마운트할 디렉토리를 생성합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1716614145815&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo mkdir /mnt/mydisk1&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마운트할 디렉토리에 파티션을 마운트합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1716614187114&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo mount /dev/sdb1 /mnt/mydisk1&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시스템 재 부팅 후에서 자동으로 마운트 할 수 있게 하려면 다음과 같이 설정해주셔야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1716614249666&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo nano /etc/fstab&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1716614363114&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/dev/sdb1 /mnt/mydisk1 ext4 defaults 0 0&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마운트의 결과가 정상적으로 적용되었는 지 확인하기 위해서는 다음 명령어로 확인 가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1716614739546&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;df -h&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금까지, 우분투에서 디스크와 파티션을 관리하면서 파티션을 마운트 및 자동 마운트 하는 방법에 대해서 알아보았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;감사드립니다.&lt;/p&gt;</description>
      <category>df -h</category>
      <category>lsblk</category>
      <category>lsblk -f</category>
      <category>mount</category>
      <category>ubuntu</category>
      <author>Minima</author>
      <guid isPermaLink="true">https://maxima-lab.tistory.com/99</guid>
      <comments>https://maxima-lab.tistory.com/entry/Ubuntu-lsblk-mount-filesystem#entry99comment</comments>
      <pubDate>Sat, 25 May 2024 14:26:56 +0900</pubDate>
    </item>
    <item>
      <title>[Kubernetes] Rancher Desktop 설치 방법 (Ubuntu)</title>
      <link>https://maxima-lab.tistory.com/entry/Kubernetes-Rancher-Desktop-Installation-Ubuntu</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요, 오늘은 Ubuntu OS에서 Rancher Desktop을 설치하는 방법에 대해서 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://docs.rancherdesktop.io/getting-started/installation/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://docs.rancherdesktop.io/getting-started/installation/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1716302596255&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Installation | Rancher Desktop Docs&quot; data-og-description=&quot;Rancher Desktop is delivered as a desktop application. You can download it from&quot; data-og-host=&quot;docs.rancherdesktop.io&quot; data-og-source-url=&quot;https://docs.rancherdesktop.io/getting-started/installation/&quot; data-og-url=&quot;https://docs.rancherdesktop.io/getting-started/installation&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://docs.rancherdesktop.io/getting-started/installation/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.rancherdesktop.io/getting-started/installation/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Installation | Rancher Desktop Docs&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Rancher Desktop is delivered as a desktop application. You can download it from&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.rancherdesktop.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 링크에 접속 후 다음 명령어 입력을 통해 Rancher Desktop을 설치합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-05-21 23-44-12.png&quot; data-origin-width=&quot;704&quot; data-origin-height=&quot;252&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/clJQM2/btsHwBq73Uc/YWp0K67yhNIBaX1bArT8EK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/clJQM2/btsHwBq73Uc/YWp0K67yhNIBaX1bArT8EK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/clJQM2/btsHwBq73Uc/YWp0K67yhNIBaX1bArT8EK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FclJQM2%2FbtsHwBq73Uc%2FYWp0K67yhNIBaX1bArT8EK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;704&quot; height=&quot;252&quot; data-filename=&quot;스크린샷 2024-05-21 23-44-12.png&quot; data-origin-width=&quot;704&quot; data-origin-height=&quot;252&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 이미지 속 명령어는 다음과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1716302702939&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;curl -s https://download.opensuse.org/repositories/isv:/Rancher:/stable/deb/Release.key | gpg --dearmor | sudo dd status=none of=/usr/share/keyrings/isv-rancher-stable-archive-keyring.gpg
echo 'deb [signed-by=/usr/share/keyrings/isv-rancher-stable-archive-keyring.gpg] https://download.opensuse.org/repositories/isv:/Rancher:/stable/deb/ ./' | sudo dd status=none of=/etc/apt/sources.list.d/isv-rancher-stable.list
sudo apt update
sudo apt install rancher-desktop&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금까지 Ubuntu OS에서 Rancher Desktop을 설치하는 방법에 대해서 알아보았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;감사드립니다.&lt;/p&gt;</description>
      <category>Kubernetes</category>
      <category>k8s</category>
      <category>kubernetes</category>
      <category>Rancher Desktop</category>
      <author>Minima</author>
      <guid isPermaLink="true">https://maxima-lab.tistory.com/98</guid>
      <comments>https://maxima-lab.tistory.com/entry/Kubernetes-Rancher-Desktop-Installation-Ubuntu#entry98comment</comments>
      <pubDate>Wed, 22 May 2024 22:53:44 +0900</pubDate>
    </item>
    <item>
      <title>[Flask] Json Web Token (JWT) 사용 방법 - (Token 생성 및 접근)</title>
      <link>https://maxima-lab.tistory.com/entry/Flask-Json-Web-Token-JWT-Token-Generation-Access</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요, 오늘은 Vue.js 프로젝트에서 Json Web Tokens (JWT)를 사용하는 방법에 대해서 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Backend에서는 Flask를 사용하여 Token을 생성할 예정입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저, 다음과 같이 파이썬 패키지를 설치합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1716296168265&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pip install flask flask_cors flask_apscheduler flask[async] Flask-SoketIO 
pip install Flask-JWT-Extented python-dotenv&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1716299856557&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import os

from flask_socketio import SocketIO, emit
from flask import Flask, request, jsonify, render_template, redirect, session, g
from flask_cors import CORS
from flask_apscheduler import APScheduler
from flask_jwt_extended import JWTManager, create_access_token, jwt_required, get_jwt_identity, verify_jwt_in_request
from dotenv import load_dotenv

load_dotenv()

class Config:
    SCHEDULE_API_ENABLED = True

app = Flask(__name__)
app.config.from_object(Config())
jwt = JWTManager(app)

app.config['SECRET_KEY'] = os.getenv('SECRET_KEY')
app.config['JWT_SECRET_KEY'] = os.getenv('JWT_SECRET_KEY')

CORS(app, resources={r'/*': {'origins' : '*'}})

# user 및 비밀번호 설정
users = {&quot;test&quot;: &quot;testpw&quot;}


# Route 설정 및 JWT token 생성
@app.route('/login', methods=['POST'])
def login():
    username = request.json.get('username', None)
    password = request.json.get('password', None)

    if not username or not password:
        return jsonify({&quot;msg&quot;: &quot;잘못된 요청&quot;}), 400

    if username not in users or users[username] != password:
        return jsonify({&quot;msg&quot;: &quot;유저 또는 비밀번호 잘못된 입력&quot;}), 401

    access_token = create_access_token(identity=username)
    return jsonify(access_token=access_token), 200


if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 코드에서 다음과 같은 명령어로 token에 접근할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1716299942042&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;curl -X POST -H &quot;Content-Type: application/json&quot; -d '{&quot;username&quot;: &quot;test&quot;, &quot;password&quot;: &quot;testpW' http://127.0.0.1:5000/login&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 명령어 입력에 따른 결과는 다음과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1716299995627&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{&quot;access_token&quot;:&quot;eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmcmVzaCI6ZmFsc2UsImlhdCI6MTcxNjI5OTcxNSwianRpIjoiMzU1MmQ2MGUtZTIzMy00NWQyLWE4ZTEtZTNiMjYwNGUwOGM1IiwidHlwZSI6ImFjY2VzcyIsInN1YiI6InRlc3R1c2VyIiwibmJmIjoxNzE2Mjk5NzE1LCJjc3JmIjoiZjFkMmMyYWQtZDEwZi00NzYzLWJkN2ItMmM1NTIzZDZmOGNhIiwiZXhwIjoxNzE2MzAwNjE1fQ.ZZIhJKC3yis-KusJIC6Z7oTu69dkTrB0Xi5gtsAOff4&quot;}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 access_token은 POST 할때 마다 다른 token이 생성되게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금까지, Flask에서 Toekn을 생성하고 접근하는 방법에 대해서 알아보았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;감사드립니다.&lt;/p&gt;</description>
      <category>Web Programming</category>
      <category>FLASK</category>
      <category>JSON Web Token</category>
      <category>JWT</category>
      <category>token</category>
      <author>Minima</author>
      <guid isPermaLink="true">https://maxima-lab.tistory.com/97</guid>
      <comments>https://maxima-lab.tistory.com/entry/Flask-Json-Web-Token-JWT-Token-Generation-Access#entry97comment</comments>
      <pubDate>Tue, 21 May 2024 23:04:46 +0900</pubDate>
    </item>
    <item>
      <title>[Linux] Ubuntu 부팅 디스크 만드는 방법 (Ubuntu 23.10, 22.04)</title>
      <link>https://maxima-lab.tistory.com/entry/Linux-Ubuntu-2310-2204</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요, 오늘은 Ubuntu 부팅 디스크를 만드는 방법에 대해서 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ubuntu 부팅 디스크를 만들기 위해 필요한 것들은 다음과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;USB&lt;/li&gt;
&lt;li&gt;Rufus 프로그램&lt;/li&gt;
&lt;li&gt;Ubuntu 23.10 .iso 파일&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1번 USB 파일을 준비 되어있는 상태에서 Rufus 프로그램을 설치하는 링크는 다음과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://rufus.ie/ko&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://rufus.ie/ko&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1715996117066&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Rufus - 간편하게 부팅 가능한 USB 드라이브 만들기&quot; data-og-description=&quot;Rufus는 USB 메모리 및 플래시 드라이브를 포맷하고 부팅할 수 있도록 만드는 도구입니다. 이 페이지 아래에 나열된 ISO 이미지 이외에도 Rufus는 여러 종류의 ISO 이미지를 지원합니다. (1) Windows 8 이&quot; data-og-host=&quot;rufus.ie&quot; data-og-source-url=&quot;https://rufus.ie/ko&quot; data-og-url=&quot;https://rufus.ie/ko/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/iRYAz/hyV6cXvMah/xmrAuK9gQDyrXweEu8Or01/img.png?width=1018&amp;amp;height=1234&amp;amp;face=0_0_1018_1234,https://scrap.kakaocdn.net/dn/bp6Eij/hyV6eHNT4N/58cQD7gu5dRymGwxv8Q1Ok/img.png?width=983&amp;amp;height=1235&amp;amp;face=0_0_983_1235,https://scrap.kakaocdn.net/dn/hIvI3/hyV590NF4n/lJq8pBXFmMgytYVJioAzKK/img.png?width=950&amp;amp;height=1266&amp;amp;face=0_0_950_1266&quot;&gt;&lt;a href=&quot;https://rufus.ie/ko&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://rufus.ie/ko&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/iRYAz/hyV6cXvMah/xmrAuK9gQDyrXweEu8Or01/img.png?width=1018&amp;amp;height=1234&amp;amp;face=0_0_1018_1234,https://scrap.kakaocdn.net/dn/bp6Eij/hyV6eHNT4N/58cQD7gu5dRymGwxv8Q1Ok/img.png?width=983&amp;amp;height=1235&amp;amp;face=0_0_983_1235,https://scrap.kakaocdn.net/dn/hIvI3/hyV590NF4n/lJq8pBXFmMgytYVJioAzKK/img.png?width=950&amp;amp;height=1266&amp;amp;face=0_0_950_1266');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Rufus - 간편하게 부팅 가능한 USB 드라이브 만들기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Rufus는 USB 메모리 및 플래시 드라이브를 포맷하고 부팅할 수 있도록 만드는 도구입니다. 이 페이지 아래에 나열된 ISO 이미지 이외에도 Rufus는 여러 종류의 ISO 이미지를 지원합니다. (1) Windows 8 이&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;rufus.ie&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이어서, Ubuntu .iso 파일을 다음 링크에서 설치합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://mirror.kakao.com/ubuntu-releases/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://mirror.kakao.com/ubuntu-releases/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1715996179177&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Ubuntu Releases&quot; data-og-description=&quot;There are 2 types of Ubuntu releases: Interim and LTS. Each Ubuntu LTS is maintained for 10 years total: 5 years of standard support + 5 years of ESM. Interim releases are maintained for 9 months. For the Ubuntu release cycle please see: The Ubuntu lifecyc&quot; data-og-host=&quot;mirror.kakao.com&quot; data-og-source-url=&quot;https://mirror.kakao.com/ubuntu-releases/&quot; data-og-url=&quot;https://mirror.kakao.com/ubuntu-releases/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://mirror.kakao.com/ubuntu-releases/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://mirror.kakao.com/ubuntu-releases/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Ubuntu Releases&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;There are 2 types of Ubuntu releases: Interim and LTS. Each Ubuntu LTS is maintained for 10 years total: 5 years of standard support + 5 years of ESM. Interim releases are maintained for 9 months. For the Ubuntu release cycle please see: The Ubuntu lifecyc&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;mirror.kakao.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_20240518.PNG&quot; data-origin-width=&quot;2009&quot; data-origin-height=&quot;1172&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dgt5eM/btsHtpYIwJC/eh16s8gPkK2GsCr1I2vmv1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dgt5eM/btsHtpYIwJC/eh16s8gPkK2GsCr1I2vmv1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dgt5eM/btsHtpYIwJC/eh16s8gPkK2GsCr1I2vmv1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdgt5eM%2FbtsHtpYIwJC%2Feh16s8gPkK2GsCr1I2vmv1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;350&quot; data-filename=&quot;edited_20240518.PNG&quot; data-origin-width=&quot;2009&quot; data-origin-height=&quot;1172&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Desktop or Server 설치에 따라서 해당 .iso 이미지를 설치해주시면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치 후 Rufus 프로그램을 실행시킵니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(이때, USB는 연결된 상태이며, 기존 파일 및 데이터가 있는 경우 백업 및 포맷에 유의하셔야 합니다.)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;20240518_2.PNG&quot; data-origin-width=&quot;759&quot; data-origin-height=&quot;1016&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ctwjeq/btsHuLTEsTg/vtR3LYuU2mgGtcwSmAwKC1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ctwjeq/btsHuLTEsTg/vtR3LYuU2mgGtcwSmAwKC1/img.png&quot; data-alt=&quot;Rufus 프로그램 실행 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ctwjeq/btsHuLTEsTg/vtR3LYuU2mgGtcwSmAwKC1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fctwjeq%2FbtsHuLTEsTg%2FvtR3LYuU2mgGtcwSmAwKC1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;535&quot; data-filename=&quot;20240518_2.PNG&quot; data-origin-width=&quot;759&quot; data-origin-height=&quot;1016&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Rufus 프로그램 실행 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 화면에서 부팅 선택 후 ISO 이미지를 선택 후 시작 버튼을 눌러 OK 및 진행해주시면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금까지, Ubuntu 부팅 디스크를 만드는 방법에 대해서 알아보았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;감사드립니다.&lt;/p&gt;</description>
      <category>Linux</category>
      <category>22.04</category>
      <category>23.10</category>
      <category>rufus</category>
      <category>Ubunt</category>
      <category>부팅</category>
      <author>Minima</author>
      <guid isPermaLink="true">https://maxima-lab.tistory.com/96</guid>
      <comments>https://maxima-lab.tistory.com/entry/Linux-Ubuntu-2310-2204#entry96comment</comments>
      <pubDate>Sat, 18 May 2024 11:40:28 +0900</pubDate>
    </item>
    <item>
      <title>[Python] .bat 파일을 활용하여 공유 폴더 설정 및 해제(Windows)</title>
      <link>https://maxima-lab.tistory.com/entry/Python-Batch-Shared-Folder-Windows</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요, 오늘은 Windows 운영체제에서 .bat 파일을 활용하여 파이썬에서 공유 폴더 설정 및 해제 하는 방법에 대해서 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공유 폴더 설정 및 해제를 위해 유의해야할 부분은 &quot;관리자 권한&quot;으로 실행해야한다는 부분입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;관리자 권한으로 실행하기 위해서 다음과 같이 .bat 파일을 구성해야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1715091461769&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@echo off

&amp;gt;nul 2&amp;gt;&amp;amp;1 &quot;%SYSTEMROOT%\system32\cacls.exe&quot; &quot;%SYSTEMROOT%\system32\config\system&quot;
if '%errorlevel%' NEQ '0' (
    echo Requesting administrative privileges...
    goto UACPrompt
) else ( goto gotAdmin )

:UACPrompt
echo Set UAC = CreateObject^(&quot;Shell.Application&quot;^) &amp;gt; &quot;%temp%\getadmin.vbs&quot;
set params = %*:&quot;=&quot;&quot;
echo UAC.ShellExecute &quot;cmd.exe&quot;, &quot;/c %~s0 %params%&quot;, &quot;&quot;, &quot;runas&quot;, 1 &amp;gt;&amp;gt; &quot;%temp%\getadmin.vbs&quot;
&quot;%temp%\getadmin.vbs&quot;
del &quot;%temp%\getadmin.vbs&quot;
exit /B

:gotAdmin
pushd &quot;%CD%&quot;
CD /D &quot;%~dp0&quot;

{실행할 명령어}
pause&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 .bat 파일에서 {실행할 명령어} 부분만 수정하면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 파일을 활용하여, 다음과 같이 코드를 수정합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1715091615468&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def create_admin_batch(script_name):
    batch_content = f&quot;&quot;&quot;
@echo off
&amp;gt;nul 2&amp;gt;&amp;amp;1 &quot;%SYSTEMROOT%\\system32\\cacls.exe&quot; &quot;%SYSTEMROOT%\\system32\\config\\system&quot;

if '%errorlevel%' NEQ '0' (
    echo Requesting administrative privileges...
    goto UACPrompt
) else ( goto gotAdmin )

:UACPrompt
echo Set UAC = CreateObject^(&quot;Shell.Application&quot;^) &amp;gt; &quot;%temp%\\getadmin.vbs&quot;
set params = %*:&quot;=&quot;&quot;
echo UAC.ShellExecute &quot;cmd.exe&quot;, &quot;/c %~s0 %params%&quot;, &quot;&quot;, &quot;runas&quot;, 1 &amp;gt;&amp;gt; &quot;%temp%\\getadmin.vbs&quot;

&quot;%temp%\\getadmin.vbs&quot;
del &quot;%temp%\\getadmin.vbs&quot;
exit /B

:gotAdmin
pushd &quot;%CD%&quot;
CD /D &quot;%~dp0&quot;

{script_name}
pause
&quot;&quot;&quot;

    with open(&quot;run_as_admin.bat&quot;, &quot;w&quot;) as file:
        file.write(batch_content)
    print(&quot;배치 파일이 생성  완료.&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 함수를 활용하여, 다음과 같이 관리자 권한으로 batch 파일을 실행 가능합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1715091763178&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import subprocess

def run_batch_file(batch_file_path):
    # 프롬프트가 보이지 않도록 설정
    si = subprocess.STARTUPINFO()
    si.dwFlags |= subprocess.STARTF_USESHOWWINDOW
    si.wShowWindow = subprocess.SW_HIDE  # CMD 창을 숨깁니다.

    # subprocess.run을 사용하여 배치 파일 실행
    result = subprocess.run(batch_file_path, shell=True, text=True, capture_output=True, startupinfo=si)
    
    # 실행 결과 출력
    if result.returncode == 0:
        print(&quot;배치 파일이 성공적으로 실행되었습니다.&quot;)
        print(&quot;출력:&quot;, result.stdout)
    else:
        print(&quot;배치 파일 실행 중 오류가 발생했습니다.&quot;)
        print(&quot;오류 메시지:&quot;, result.stderr)

# 배치 파일 경로 지정
batch_file_path = 'run_as_admin.bat'

# 배치 파일 실행 함수 호출
run_batch_file(batch_file_path)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 2가지 함수를 활용하여 공유 폴더를 생성하는 함수를 실행할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1715091955463&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import subprocess

def create_shared_folder(share_name, folder_path):
    # 공유명과 폴더 경로를 설정합니다.
    # /grant:everyone,full은 모든 사용자에게 전체 권한을 부여합니다.
    cmd = f'net share {share_name}=&quot;{folder_path}&quot; /grant:everyone,full'
    
    create_admin_batch(cmd)
    
    # 배치 파일 경로 지정
    batch_file_path = 'run_as_admin.bat'

    # 배치 파일 실행 함수 호출
    run_batch_file(batch_file_path)
    
    

folder_path = &quot;D:\\새로운 공유 폴더&quot;
share_name = &quot;MySharedFolder&quot;
create_shared_folder(share_name, folder_path)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반대로 공유 폴더를 해제하는 함수를 실행할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1715093049876&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import subprocess

def remove_shared_folder(share_name):
    cmd = f'net share {share_name} /delete'
    
    create_admin_batch(cmd)
    
    # 배치 파일 경로 지정
    batch_file_path = 'run_as_admin.bat'

    # 배치 파일 실행 함수 호출
    run_batch_file(batch_file_path)
    
    

share_name = &quot;MySharedFolder&quot;
remove_shared_folder(share_name)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;지금까지, Windows 운영체제에서 .bat 파일을 활용하여 Python에서 공유 폴더를 설정 및 해제 하는 방법에 대해서 알아보았습니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;감사드립니다.&lt;/p&gt;</description>
      <category>Python</category>
      <category>batch</category>
      <category>Python</category>
      <category>shared folder</category>
      <category>windows</category>
      <author>Minima</author>
      <guid isPermaLink="true">https://maxima-lab.tistory.com/95</guid>
      <comments>https://maxima-lab.tistory.com/entry/Python-Batch-Shared-Folder-Windows#entry95comment</comments>
      <pubDate>Fri, 10 May 2024 22:05:48 +0900</pubDate>
    </item>
    <item>
      <title>[Python] 공유 폴더 설정 및 삭제 하기 (Ubuntu, Samba, smbclient, mount/unmount)</title>
      <link>https://maxima-lab.tistory.com/entry/Python-Shared-Folder-Ubuntu-Samba-smbclient-mount-unmount</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하새요, 오늘은 Ubuntu 운영 체제에서 Samba 서비스를 사용하여 공유 폴더를 설정하고 해제하는 방법에 대해서 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저, samba 패키지를 설치합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1715084056968&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo apt-get update
sudo apt-get install samba&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 명령어를 통해 samba 패키지를 설치 후 서비스 상태 확인을 다음 명령어를 통해 확인합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1715084341846&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo systemctl status smbd&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서비스 상태가 정상적인 것을 확인 후 다음 명령어를 통해 시스템 사용자 추가 후 Samba 사용자로 추가합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1715084425063&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo adduser 사용자이름&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1715084442344&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo smbpasswd -a 사용자이름&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 명령어 실행 후 사용자의 Samba 비밀번호를 입력가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한, 외부에서 Samba 서비스에 접근하기 위해서는 필요한 포트를 방화벽에서 열어주어야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1715085033141&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo apt-get install ufw
sudo ufw enable&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이어서 특정 IPs에 대해 Samba 서비스에 접근할 수 있도록 설정해줄 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1715085318606&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo ufw allow from {IP-1} to any port 445 proto tcp
sudo ufw allow from {IP-2} to any port 445 proto tcp
sudo ufw allow from {IP-3} to any port 445 proto tcp&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설정이 올바르게 적용되었는 지 다음 명령어를 통해 확인 가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1715085371519&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo ufw status verbose&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최종적으로 반드시 방화벽을 Reload 해주어야 합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1715085413536&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo ufw reload&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이어서, 파이썬을 통해 공유 폴더를 설정하는 코드에 대해서 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1715084818964&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import os

def add_samba_share(share_name, path, read_only=True):
    with open('/etc/samba/smb.conf', 'a') as file:
        file.write(f&quot;\n[{share_name}]\n&quot;)
        file.write(f&quot;path = {path}\n&quot;)
        file.write(f&quot;valid users  {사용자이름}\n&quot;)
        file.write(&quot;browseable = yes\n&quot;)
        file.write(f&quot;read only = {'yes' if read_only else 'no'}\n&quot;)
        file.write(&quot;guest ok = no\n&quot;)

    os.system(&quot;sudo systemctl restart smbd&quot;)

add_samba_share('MyShare', '/home/username/shared_folder', read_only=False)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이어서 공유 폴더 해제 하는 코드에 대해서 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1715085500988&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def remove_samba_share(share_name):
    with open(&quot;/etc/samba/smb.conf&quot;, &quot;r&quot;) as file:
        lines = file.readlines()

    with open(&quot;/etc/samba/smb.conf&quot;, &quot;w&quot;) as file:
        in_section = False
        for line in lines:
            if line.strip().startswith(f&quot;[{share_name}]&quot;):
                in_section = True
            elif in_section and line.startswith('['):
                in_section = False

            if not in_section:
                file.write(line)

    os.system(&quot;sudo systemctl restart smbd&quot;)

remove_samba_share('MyShare')&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이어서, Linux 및 유닉스 시스템에서 Samba 공유 폴더에 접근하기 위한 도구인 smbclient에 대해서 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 사용하기 위해서 다음 명령어를 통해 설치 가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1715085741799&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo apt update
sudo apt install smbclient&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치 완료 후 다음 명령어를 통해 Samba 공유 목록을 볼수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1715085863197&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;smbclient -L //서버주소 -U 사용자명&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 명령어를 통해 확인한 공유 폴더를 cifs-utils 패키지를 통해 Mount 할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1715085942809&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo apt-get update
sudo apt-get install cifs-utils&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 명령어를 통해 cifs-utils 패키지를 설치 후 Mount 할 디렉토리를 생성합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(Mount 시에는 빈 디렉토리에 적용하는 것이 좋습니다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1715085999227&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo mkdir /mnt/samba_share&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디렉토리 생성 후 다음 명령어를 통해 수동 Mount 가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1715086066643&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo mount -t cifs //서버주소/공유명 /mnt/samba_share -o username=사용자명,password=비밀번호&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만, 수동 Mount 시에 시스템 재부팅 하면 다시 Mount를 해주어야 하기 때문에 /etc/fstab 파일에 다음과 같이 추가합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1715086971565&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//서버주소/공유명 /mnt/samba_share cifs username=사용자명,password=비밀번호,iocharset=utf8,sec=ntlmssp 0 0&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1715087062893&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo mount -a&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Mount 된 공유에 대해 Unmount 하기 위한 명령어는 다음과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1715086149195&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo umount /mnt/samba_share&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금까지, Ubuntu(Linux)에서 공유 폴더를 설정하고 해제 및 Mount/Unmount 하는 방법에 대해서 알아보았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;감사드립니다.&lt;/p&gt;</description>
      <category>Python</category>
      <category>Linux</category>
      <category>mount</category>
      <category>Python</category>
      <category>SAMBA</category>
      <category>smbclient</category>
      <category>ubuntu</category>
      <category>unmount</category>
      <author>Minima</author>
      <guid isPermaLink="true">https://maxima-lab.tistory.com/94</guid>
      <comments>https://maxima-lab.tistory.com/entry/Python-Shared-Folder-Ubuntu-Samba-smbclient-mount-unmount#entry94comment</comments>
      <pubDate>Tue, 7 May 2024 21:53:11 +0900</pubDate>
    </item>
    <item>
      <title>[Vue.js] PrimeVue 사용하는 방법 (UI Component 라이브러리)</title>
      <link>https://maxima-lab.tistory.com/entry/Vuejs-PrimeVue-UI-Component</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요, 오늘은 Vue.js를 위한 UI Component 라이브러리인 PrimeVue를 사용하는 방법에 대해서 알아보겠습니다.&lt;br&gt;&amp;nbsp;&lt;br&gt;PrimeVue를 사용하기 위한 명령어는 다음과 같습니다.&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;npm install primevue 
npm install primeicons&lt;/code&gt;&lt;/pre&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;위의 명령어를 통해 라이브러리를 설치 후 main.js 파일을 다음과 같이 수정합니다.&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;import { createApp } from 'vue';
import App from './App.vue';
import PrimeVue from 'primevue/config';
import 'primevue/resources/themes/saga-blue/theme.css';&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
import 'primevue/resources/primevue.min.css';&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
import 'primeicons/primeicons.css';&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;

const app = createApp(App);
app.use(PrimeVue);
app.mount('#app');&lt;/code&gt;&lt;/pre&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;자세한 내용 관련 해서는 다음 링크를 통해 확인 가능합니다.&lt;br&gt;&amp;nbsp;&lt;br&gt;&lt;a href=&quot;https://primevue.org/introduction/&quot; target=&quot;_blank&quot;&gt;&lt;span&gt;https://primevue.org/introduction/&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;figure data-ke-type=&quot;opengraph&quot; data-og-title=&quot;PrimeVue | Vue UI Component Library&quot; data-ke-align=&quot;alignCenter&quot; data-og-description=&quot;The ultimate collection of design-agnostic, flexible and accessible Vue UI Components.&quot; data-og-host=&quot;primevue.org&quot; data-og-source-url=&quot;https://primevue.org/introduction/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/hIfav/hyVVFzb5iN/lQlTO0UUYnSrwYscociixk/img.jpg?width=2400&amp;amp;height=1260&amp;amp;face=0_0_2400_1260&quot; data-og-url=&quot;https://primevue.org/&quot;&gt;&lt;a href=&quot;https://primevue.org/&quot; target=&quot;_blank&quot; data-source-url=&quot;https://primevue.org/introduction/&quot;&gt;&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/hIfav/hyVVFzb5iN/lQlTO0UUYnSrwYscociixk/img.jpg?width=2400&amp;amp;height=1260&amp;amp;face=0_0_2400_1260')&quot;&gt; &lt;/div&gt;&lt;div class=&quot;og-text&quot;&gt;&lt;p class=&quot;og-title&quot;&gt;PrimeVue | Vue UI Component Library&lt;/p&gt;&lt;p class=&quot;og-desc&quot;&gt;The ultimate collection of design-agnostic, flexible and accessible Vue UI Components.&lt;/p&gt;&lt;p class=&quot;og-host&quot;&gt;primevue.org&lt;/p&gt;&lt;/div&gt;&lt;/a&gt;&lt;/figure&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;지금까지, Vue.js를 위한 UI Component 라이브러리인 PrimeVue를 사용하는 방법에 대해서 알아보았습니다.&lt;br&gt;감사드립니다.&lt;/p&gt;</description>
      <category>Web Programming</category>
      <category>npm</category>
      <category>primevue</category>
      <category>ui</category>
      <category>vue.js</category>
      <author>Minima</author>
      <guid isPermaLink="true">https://maxima-lab.tistory.com/93</guid>
      <comments>https://maxima-lab.tistory.com/entry/Vuejs-PrimeVue-UI-Component#entry93comment</comments>
      <pubDate>Tue, 30 Apr 2024 00:00:48 +0900</pubDate>
    </item>
    <item>
      <title>[Vue.js] Material Design Icons (MDI) 사용법</title>
      <link>https://maxima-lab.tistory.com/entry/Vuejs-Material-Design-Icons-MDI</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요, 오늘은 Material Design Icons (MDI) 사용 하는 방법에 대해서 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 위해 다음과 같은 명령어를 통해 패키지를 설치합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1714401186572&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm install @mdi/js&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1714401215101&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm install @jamescoyle/vue-icon&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 패키지를 설치 후 Vue Component 내 다음과 같이 사용할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1714401271372&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;script&amp;gt;
import {mdiCamera} from &quot;@mdi/js&quot;;
import SvgIcon from '@jamescoyle/vue-icon'

export default {
  name: 'TestApp',
  components: {
    SvgIcon
  },

  data: () =&amp;gt; ({
    path: mdiCamera,

  }),
}

&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 코드는 Javascript 관련 코드 입니다. 이를 활용하여, &amp;lt;template&amp;gt;&amp;lt;/template&amp;gt; 내부에서 다음과 같이 사용할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1714401491330&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;template&amp;gt;
	&amp;lt;svg-icon type=&quot;mdi&quot; :path=&quot;path&quot;&amp;gt;&amp;lt;/svg-icon&amp;gt;
&amp;lt;/template&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다양한 Icons 관련 해서는 다음 링크에서 확인 가능합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://pictogrammers.com/library/mdi/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://pictogrammers.com/library/mdi/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1714401559227&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Material Design Icons - Icon Library - Pictogrammers&quot; data-og-description=&quot;The original. Following Google's Material Design guidelines for system icons, MDI is our largest library, touting over 7200 unique icons!&quot; data-og-host=&quot;pictogrammers.com&quot; data-og-source-url=&quot;https://pictogrammers.com/library/mdi/&quot; data-og-url=&quot;https://pictogrammers.com/library/mdi/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/euFrD1/hyVZeUdxVx/z7GLZO2ADBwMt3IFtcT7Gk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/baxJfX/hyVZsLHN4m/YY28oxAVw450jPo2nSm0jk/img.png?width=288&amp;amp;height=288&amp;amp;face=0_0_288_288&quot;&gt;&lt;a href=&quot;https://pictogrammers.com/library/mdi/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://pictogrammers.com/library/mdi/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/euFrD1/hyVZeUdxVx/z7GLZO2ADBwMt3IFtcT7Gk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/baxJfX/hyVZsLHN4m/YY28oxAVw450jPo2nSm0jk/img.png?width=288&amp;amp;height=288&amp;amp;face=0_0_288_288');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Material Design Icons - Icon Library - Pictogrammers&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;The original. Following Google's Material Design guidelines for system icons, MDI is our largest library, touting over 7200 unique icons!&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;pictogrammers.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이상으로, Vue.js에서 Material Design Icons (MDI)를 사용하는 방법에 대해서 알아보았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;감사드립니다.&lt;/p&gt;</description>
      <category>Web Programming</category>
      <category>Material design icons</category>
      <category>MDI</category>
      <category>npm</category>
      <category>vue.js</category>
      <author>Minima</author>
      <guid isPermaLink="true">https://maxima-lab.tistory.com/92</guid>
      <comments>https://maxima-lab.tistory.com/entry/Vuejs-Material-Design-Icons-MDI#entry92comment</comments>
      <pubDate>Mon, 29 Apr 2024 23:40:28 +0900</pubDate>
    </item>
    <item>
      <title>[Docker] Docker를 활용한 GitLab 설치 및 사용 방법</title>
      <link>https://maxima-lab.tistory.com/entry/Docker-GitLab-Installation-Usage</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;오늘은 Docker를 활용하여 GitLab을 설치하고 사용하는 방법에 대해서 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GitLab을 설치하고 사용하기 위해 필요한 Docker 이미지는 다음과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 명령어를 통해, GitLab에 대한 Container를 생성합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1713679664427&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker run --detach \                                                                                                                                                                      Py base 15:02:30
  --hostname gitlab.example.com \
  --publish 1980:80 --publish 1922:22 --publish 19443:443 \
  --name gitlab \
  --restart always \
  --volume $HOME/gitlab/config:/etc/gitlab \
  --volume $HOME/gitlab/logs:/var/log/gitlab \
  --volume $HOME/gitlab/data:/var/opt/gitlab \
  gitlab/gitlab-ce:latest&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 명령어를 실행 후 몇분의 시간이 지난 다음 localhost:1980 접속을 하면 다음과 같은 초기 화면이 나옵니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_Screenshot 2024-04-21 at 3.09.42 PM.png&quot; data-origin-width=&quot;3000&quot; data-origin-height=&quot;1718&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bq73oq/btsGMTTNEL5/O5h480uRj1zFESxRVrnqt0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bq73oq/btsGMTTNEL5/O5h480uRj1zFESxRVrnqt0/img.png&quot; data-alt=&quot;GitLab 초기 실행 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bq73oq/btsGMTTNEL5/O5h480uRj1zFESxRVrnqt0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbq73oq%2FbtsGMTTNEL5%2FO5h480uRj1zFESxRVrnqt0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3000&quot; height=&quot;1718&quot; data-filename=&quot;edited_Screenshot 2024-04-21 at 3.09.42 PM.png&quot; data-origin-width=&quot;3000&quot; data-origin-height=&quot;1718&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;GitLab 초기 실행 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;초기 실행 화면에서 Root 계정으로 로그인 하는 방법은 다음과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1713680400596&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker exec -it gitlab /bin/bash&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1713680416629&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cat /etc/gitlab/initial_root_password&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 명령어를 통해 출력되는 초기 root 비밀번호를 통해 로그인 합니다 (username : root)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_Screenshot 2024-04-21 at 3.22.55 PM.png&quot; data-origin-width=&quot;3000&quot; data-origin-height=&quot;1718&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3JQ0L/btsGOxhGVzF/w8o7dnTYUd84lCtJROCDt1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3JQ0L/btsGOxhGVzF/w8o7dnTYUd84lCtJROCDt1/img.png&quot; data-alt=&quot;root 계정 로그인 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3JQ0L/btsGOxhGVzF/w8o7dnTYUd84lCtJROCDt1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3JQ0L%2FbtsGOxhGVzF%2Fw8o7dnTYUd84lCtJROCDt1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3000&quot; height=&quot;1718&quot; data-filename=&quot;edited_Screenshot 2024-04-21 at 3.22.55 PM.png&quot; data-origin-width=&quot;3000&quot; data-origin-height=&quot;1718&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;root 계정 로그인 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후, 개인 User들은 초기 화면에서 Register 메뉴를 통해 가입 후 Root 계정이 승인하면 로그인 가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금까지, Docker를 통해 GitLab을 설치하고 사용하는 방법에 대해서 알아보았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;감사드립니다.&lt;/p&gt;</description>
      <category>Docker</category>
      <category>Docker</category>
      <category>GitLab</category>
      <category>ROOT</category>
      <author>Minima</author>
      <guid isPermaLink="true">https://maxima-lab.tistory.com/91</guid>
      <comments>https://maxima-lab.tistory.com/entry/Docker-GitLab-Installation-Usage#entry91comment</comments>
      <pubDate>Sun, 21 Apr 2024 15:35:47 +0900</pubDate>
    </item>
    <item>
      <title>[Docker] Docker를 활용하여 Jenkins 사용하는 방법 (CI/CD)</title>
      <link>https://maxima-lab.tistory.com/entry/Docker-Jenkins-Usage-CI-CD</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요, 오늘은 Docker를 활용하여 Jenkins를 사용하는 방법에 대해서 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.jenkins.io/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.jenkins.io/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1713363626940&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Jenkins&quot; data-og-description=&quot;Jenkins &amp;ndash; an open source automation server which enables developers around the world to reliably build, test, and deploy their software&quot; data-og-host=&quot;www.jenkins.io&quot; data-og-source-url=&quot;https://www.jenkins.io/&quot; data-og-url=&quot;https://www.jenkins.io/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cqp8ZI/hyVPIQqBOh/dFFLu0LAlqHO1yFyiEtsck/img.png?width=796&amp;amp;height=398&amp;amp;face=80_109_160_197,https://scrap.kakaocdn.net/dn/b8aX3j/hyVSXd6tvL/H9GRwF9d4Du2jQDIXpeqU1/img.jpg?width=1600&amp;amp;height=938&amp;amp;face=77_190_1487_627&quot;&gt;&lt;a href=&quot;https://www.jenkins.io/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.jenkins.io/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cqp8ZI/hyVPIQqBOh/dFFLu0LAlqHO1yFyiEtsck/img.png?width=796&amp;amp;height=398&amp;amp;face=80_109_160_197,https://scrap.kakaocdn.net/dn/b8aX3j/hyVSXd6tvL/H9GRwF9d4Du2jQDIXpeqU1/img.jpg?width=1600&amp;amp;height=938&amp;amp;face=77_190_1487_627');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Jenkins&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Jenkins &amp;ndash; an open source automation server which enables developers around the world to reliably build, test, and deploy their software&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.jenkins.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Jenkins는 다양한 CI/CD 프로세스를 지원하는 강력한 오픈 소스 자동화 서버로, 구축, 테스트, 배포와 관련된 소프트웨어 개발 측면을 자동화하여 지속적인 통합과 지속적인 제공을 촉진합니다. 이는 플러그인 기반이기 떄문에, 다양한 플러그인을 확장하여 프로젝트들의 구축, 배포 및 자동화를 지원할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Jenkins를 사용하기 위해 첫번째 단계는 Docker 이미지를 가져오는 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1713363835866&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker pull jenkins/jenkins:lts&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Jenkins 컨테이너 실행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1713363927054&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker run -d -p 8080:8080 -p 50000:50000 --name jenkins-master jenkins/jenkins:lts&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컨테이너 실행 후에는 httpL//&amp;lt;docker-host-ip&amp;gt;:8080으로 이동하여 액세스 가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-04-17 at 11.29.00 PM.png&quot; data-origin-width=&quot;1974&quot; data-origin-height=&quot;2610&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xJ7i4/btsGJQg23B2/EevgheaUz34PyNsaUtRwQ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xJ7i4/btsGJQg23B2/EevgheaUz34PyNsaUtRwQ1/img.png&quot; data-alt=&quot;Jenkins 초기 실행 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xJ7i4/btsGJQg23B2/EevgheaUz34PyNsaUtRwQ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxJ7i4%2FbtsGJQg23B2%2FEevgheaUz34PyNsaUtRwQ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;793&quot; data-filename=&quot;Screenshot 2024-04-17 at 11.29.00 PM.png&quot; data-origin-width=&quot;1974&quot; data-origin-height=&quot;2610&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Jenkins 초기 실행 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 초기 설정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1713364053867&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker exec jenkins-master cat /var/jenkins_home/secrets/initialAdminPassword&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 명령어로 나온 initialAdminPassword를 입력하여 초기 설정을 진행합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-04-17 at 11.30.44 PM.png&quot; data-origin-width=&quot;1974&quot; data-origin-height=&quot;2610&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bv5QnK/btsGJNdDsza/ml9vY11dTHTWsJVHk2Nrgk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bv5QnK/btsGJNdDsza/ml9vY11dTHTWsJVHk2Nrgk/img.png&quot; data-alt=&quot;초기 설정 진행 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bv5QnK/btsGJNdDsza/ml9vY11dTHTWsJVHk2Nrgk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbv5QnK%2FbtsGJNdDsza%2Fml9vY11dTHTWsJVHk2Nrgk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;793&quot; data-filename=&quot;Screenshot 2024-04-17 at 11.30.44 PM.png&quot; data-origin-width=&quot;1974&quot; data-origin-height=&quot;2610&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;초기 설정 진행 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금까지, Docker를 활용하여 Jenkins를 사용하는 방법에 대해서 알아보았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;감사드립니다.&lt;/p&gt;</description>
      <category>Docker</category>
      <category>cd</category>
      <category>CI</category>
      <category>Docker</category>
      <category>Jenkins</category>
      <author>Minima</author>
      <guid isPermaLink="true">https://maxima-lab.tistory.com/90</guid>
      <comments>https://maxima-lab.tistory.com/entry/Docker-Jenkins-Usage-CI-CD#entry90comment</comments>
      <pubDate>Thu, 18 Apr 2024 00:01:31 +0900</pubDate>
    </item>
    <item>
      <title>[Docker] Docker Image 분할 압축 및 해제 방법</title>
      <link>https://maxima-lab.tistory.com/entry/Docker-Image-Split-Compression</link>
      <description>&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;안녕하세요, 오늘은 Docker Image를 분할 압축하는 방법에 대해서 알아보겠습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;Docker Image를 생성하다보면 대용량 Docker Image가 생성되어 해당 Docker Image를 다른 PC로 복사하지 못하는 것을 확인할 수 있습니다. 이를 해결하기 위해 각 Docker Image를 분할 압축하여 다른 PC로 전달 후 분할된 Files을 다시 결합시켜 해당 Docker Image를 Load 하는 방법입니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;먼저, 다음의 예시와 같이 용량이 큰 Docker Image를 Pull 합니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1713281161997&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker pull pytorch/pytorch:2.2.2-cuda12.1-cudnn8-devel&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;Docker Image를 호스트 시스템에 저장하는 코드는 다음과 같습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1713357977448&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker save pytorch/pytorch:2.2.2-cuda12.1-cudnn8-devel &amp;gt; pytorch_save.tar&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;위의 코드는 &quot;pytorch/pytorch:2.2.2-cuda12.1-cudnn8-devel&quot; Docker 이미지를 pytorch_save.tar 파일로 저장합니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;이어서, 해당 파일을 XZ 형식으로 압축하는 코드입니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1713358092627&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;xz -z -v -T 0 pytorch_save.tar&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;해당 명령어의 결과로 pytorch_save.tar.xz 파일이 생성되게 됩니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;다음은 위의 결과로 생성된 pytorch_save.tar.xz 파일을 여러 개의 작은&amp;nbsp; 파일로 분할하는 코드입니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1713358289411&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;split -b 1G -d pytorch_save.tar.xz pytorch_save_part_&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;위의 코드는 pytorch_save.tar.xz 파일을 1G(1 기가) 씩 여러개의 작은 파일로 분할합니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;분할된 작은 파일들을 원래의 압축 파일로 재생성 후 XZ 압축 파일을 해제 후 Docker 이미지를 로드 하는 과정은 다음과 같습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1713358526017&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cat pytorch_save_part_* &amp;gt; pytorch_save.tar.xz
xz -d -v pytorch_save.tar.xz
docker load &amp;lt; pytorch_save.tar&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;지금까지, Docker 이미지를 분할 압축 및 해제 후 로드하는 과정에 대해서 알아보았습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;감사드립니다.&lt;/p&gt;</description>
      <category>Docker</category>
      <category>Docker</category>
      <category>Load</category>
      <category>SAVE</category>
      <category>Xz</category>
      <author>Minima</author>
      <guid isPermaLink="true">https://maxima-lab.tistory.com/89</guid>
      <comments>https://maxima-lab.tistory.com/entry/Docker-Image-Split-Compression#entry89comment</comments>
      <pubDate>Wed, 17 Apr 2024 21:57:23 +0900</pubDate>
    </item>
    <item>
      <title>[Database, DB] psycopg2 패키지를 활용하여 PostgreSQL 사용하는 방법 (Table 생성, 삭제, Data 초기화)</title>
      <link>https://maxima-lab.tistory.com/entry/Database-DB-psycopg2-PostgreSQL-Usage-1</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요, 오늘은 psycopg2 패키지를 활용하여, PostgreSQL (DB)를 사용하는 방법에 대해서 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저, psycopg2 패키지를 설치합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1713188982629&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pip install psycopg2-binary&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이어서, DB에 연결하여, Table을 생성하는 방법에 대해서 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1713192861875&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import psycopg2

conn = psycopg2.connect(host='localhost', database='postgres', user='postgres', password='&amp;lt;Enter Password&amp;gt;', port=5432)
cur = conn.cursor()

print(cur.closed == 0)

create_users_table = &quot;&quot;&quot;
CREATE TABLE IF NOT EXISTS users (
    user_id SERIAL PRIMARY KEY,
    username VARCHAR(50) UNIQUE NOT NULL,
    password VARCHAR(50) UNIQUE NOT NULL,
    email VARCHAR(100),
    created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
&quot;&quot;&quot;

try:
    cur.execute(create_users_table)
    conn.commit()

except Exception as e:
    print(e)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 코드에서 cur.closed == 0 이면 정상적으로 DB 연결이 지속되고 있다는 의미입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한, &quot;users&quot; 라는 table을 생성하기 위한 sql을 작성하였으며, columns은 순서대로 user_id, username, password, email, created_at 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음은, Table을 삭제하는 방법에 대해서 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1713193051043&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import psycopg2

conn = psycopg2.connect(host='localhost', database='postgres', user='postgres', password='temptemp', port=5432)
cur = conn.cursor()

print(cur.closed == 0)

def drop_table(connection, table_name):
    cursor = connection.cursor()
    try:
        cursor.execute(f&quot;DROP TABLE IF EXISTS {table_name} CASCADE;&quot;)
        connection.commit()
        print(f&quot;Table '{table_name}' dropped successfully&quot;)
    except Exception as e:
        print(f&quot;An error occurred: {e}&quot;)

try:
    drop_table(conn, 'users')

except Exception as e:
    print(e)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 코드에서 drop_table이라는 함수는 connection 변수와 table_name을 입력으로 받아 해당 Table이 존재하는 경우 삭제하는 함수입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음은 특정 Table의 Data를 초기화하는 방법입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1713193263581&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import psycopg2

conn = psycopg2.connect(host='localhost', database='postgres', user='postgres', password='temptemp', port=5432)
cur = conn.cursor()

print(cur.closed == 0)

def reset_data(connection, table_name):
    cursor = connection.cursor()
    cursor.execute(f&quot;TRUNCATE TABLE {table_name} RESTART IDENTITY;&quot;)
    connection.commit()
    print(&quot;Table reset and data initialized successfully&quot;)

try:
    reset_data(conn, 'users')

except Exception as e:
    print(e)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 코드에서 reset_data 함수는 connection 변수와 table_name을 입력으로 받아 해당 Table 내 Data를 Reset하는 함수입니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금까지, psycopg2 패키지를 활용해서 PostgreSQL을 사용하는 방법에 대해서 알아보았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;감사드립니다.&lt;/p&gt;</description>
      <category>Web Programming</category>
      <category>delete</category>
      <category>GENERATION</category>
      <category>PostgreSQL</category>
      <category>psycopg2</category>
      <category>Python</category>
      <category>Reset</category>
      <category>table</category>
      <author>Minima</author>
      <guid isPermaLink="true">https://maxima-lab.tistory.com/88</guid>
      <comments>https://maxima-lab.tistory.com/entry/Database-DB-psycopg2-PostgreSQL-Usage-1#entry88comment</comments>
      <pubDate>Wed, 17 Apr 2024 00:19:07 +0900</pubDate>
    </item>
    <item>
      <title>[Database, DB] PostgreSQL &amp;amp; DBeaver Community 설치 및 사용 방법</title>
      <link>https://maxima-lab.tistory.com/entry/Database-PostgreSQL-DBeaver-Community-Installation-Usage</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요, 오늘은 PostgreSQL &amp;amp; DBeaver Community 설치 및 사용 방법에 대해서 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.postgresql.org/download/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.postgresql.org/download/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1713183719856&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;PostgreSQL: Downloads&quot; data-og-description=&quot;&quot; data-og-host=&quot;www.postgresql.org&quot; data-og-source-url=&quot;https://www.postgresql.org/download/&quot; data-og-url=&quot;https://www.postgresql.org/download/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://www.postgresql.org/download/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.postgresql.org/download/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;PostgreSQL: Downloads&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.postgresql.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 링크에서 각 OS에 맞게 다운로드 및 설치를 해주시면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이어서, DBeaver Community 설치 경로는 다음과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://dbeaver.io/download/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://dbeaver.io/download/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1713184076724&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Download | DBeaver Community&quot; data-og-description=&quot;Download DBeaver Community 24.0.2 Released on April 8th 2024 (Milestones). It is free and open source (license). Also you can get it from the GitHub mirror. DBeaver PRO 24.0 Released on March 11th, 2024 PRO version website: dbeaver.com Trial version is ava&quot; data-og-host=&quot;dbeaver.io&quot; data-og-source-url=&quot;https://dbeaver.io/download/&quot; data-og-url=&quot;https://dbeaver.io/download/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cAhlwh/hyVPVn4jFJ/uDRqjsrKs75xIaV938Mxjk/img.png?width=1083&amp;amp;height=222&amp;amp;face=0_0_1083_222&quot;&gt;&lt;a href=&quot;https://dbeaver.io/download/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://dbeaver.io/download/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cAhlwh/hyVPVn4jFJ/uDRqjsrKs75xIaV938Mxjk/img.png?width=1083&amp;amp;height=222&amp;amp;face=0_0_1083_222');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Download | DBeaver Community&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Download DBeaver Community 24.0.2 Released on April 8th 2024 (Milestones). It is free and open source (license). Also you can get it from the GitHub mirror. DBeaver PRO 24.0 Released on March 11th, 2024 PRO version website: dbeaver.com Trial version is ava&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;dbeaver.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PostgreSQL 및 DBeaver Community 설치가 완료되었다면, DBeaver Community를 실행시켜줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-04-15 at 9.29.34 PM.png&quot; data-origin-width=&quot;5116&quot; data-origin-height=&quot;2872&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dxIKDe/btsGB0F5a3y/6ohZyi9wYdkASdKzbJNSfk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dxIKDe/btsGB0F5a3y/6ohZyi9wYdkASdKzbJNSfk/img.png&quot; data-alt=&quot;DBeaver Community 실행 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dxIKDe/btsGB0F5a3y/6ohZyi9wYdkASdKzbJNSfk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdxIKDe%2FbtsGB0F5a3y%2F6ohZyi9wYdkASdKzbJNSfk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;5116&quot; height=&quot;2872&quot; data-filename=&quot;Screenshot 2024-04-15 at 9.29.34 PM.png&quot; data-origin-width=&quot;5116&quot; data-origin-height=&quot;2872&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;DBeaver Community 실행 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본적으로, 초기에는 database='postgres', user='postgres', port=5432로 설정되어 실행됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이상으로, PostSQL &amp;amp; DBeaver Community 설치 및 실행하는 방법에 대해서 알아보았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;감사드립니다.&lt;/p&gt;</description>
      <category>Web Programming</category>
      <category>Database</category>
      <category>db</category>
      <category>DBeaver</category>
      <category>PostgreSQL</category>
      <author>Minima</author>
      <guid isPermaLink="true">https://maxima-lab.tistory.com/87</guid>
      <comments>https://maxima-lab.tistory.com/entry/Database-PostgreSQL-DBeaver-Community-Installation-Usage#entry87comment</comments>
      <pubDate>Mon, 15 Apr 2024 21:33:57 +0900</pubDate>
    </item>
    <item>
      <title>[Python] 파이썬으로 한글 Text를 Encoding, Decoding 하는 방법</title>
      <link>https://maxima-lab.tistory.com/entry/Python-Hangul-Text-Encoding-Decoding</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요, 오늘은 파이썬으로 한글 Text를 Encoding 및 Decoding 하는 방법에 대해서 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한글 Text에 대해서 Encoding을 하기 위해서는 각 문자를 초성, 중성, 종성으로 구분해서 Encoding을 진행해야합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저, 초성, 중성, 종성이 될 수 있는 자음과 모음들에 대해서 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1712980601537&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def generate_hangul_jamos():
    # 초성
    choseong = [chr(code) for code in range(0x1100, 0x1113)]
    # 중성 (모음)
    jungseong = [chr(code) for code in range(0x1161, 0x1176)]
    # 중성
    jongseong = [chr(code) for code in range(0x11A8, 0x11C3)]
    return choseong + jungseong + jongseong&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 함수는 각각 초성, 중성, 종성이 될수 있는 자음과 모음들을 계산하여 합쳐 1개의 List로 반환하는 함수입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수의 결과는 다음과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1712980918617&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;['ᄀ', 'ᄁ', 'ᄂ', 'ᄃ', 'ᄄ', 'ᄅ', 'ᄆ', 'ᄇ', 'ᄈ', 'ᄉ', 'ᄊ', 'ᄋ', 'ᄌ', 'ᄍ', 'ᄎ', 'ᄏ', 'ᄐ', 'ᄑ', 'ᄒ', 'ᅡ', 'ᅢ', 'ᅣ', 'ᅤ', 'ᅥ', 'ᅦ', 'ᅧ', 'ᅨ', 'ᅩ', 'ᅪ', 'ᅫ', 'ᅬ', 'ᅭ', 'ᅮ', 'ᅯ', 'ᅰ', 'ᅱ', 'ᅲ', 'ᅳ', 'ᅴ', 'ᅵ', 'ᆨ', 'ᆩ', 'ᆪ', 'ᆫ', 'ᆬ', 'ᆭ', 'ᆮ', 'ᆯ', 'ᆰ', 'ᆱ', 'ᆲ', 'ᆳ', 'ᆴ', 'ᆵ', 'ᆶ', 'ᆷ', 'ᆸ', 'ᆹ', 'ᆺ', 'ᆻ', 'ᆼ', 'ᆽ', 'ᆾ', 'ᆿ', 'ᇀ', 'ᇁ', 'ᇂ']&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이어서, 위의&amp;nbsp; List의 각 원소와 Index 값을 Dictionary로 반환하는 함수는 다음과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1712981031051&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def generate_hangul_jamo_to_index():
    hangul_jamos = generate_hangul_jamos()
    jamo_to_index = {jamo: index for index, jamo in enumerate(hangul_jamos)}
    return jamo_to_index&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 함수의 실행 결과는 다음과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1712981063198&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{'ᄀ': 0, 'ᄁ': 1, 'ᄂ': 2, 'ᄃ': 3, 'ᄄ': 4, 'ᄅ': 5, 'ᄆ': 6, 'ᄇ': 7, 'ᄈ': 8, 'ᄉ': 9, 'ᄊ': 10, 'ᄋ': 11, 'ᄌ': 12, 'ᄍ': 13, 'ᄎ': 14, 'ᄏ': 15, 'ᄐ': 16, 'ᄑ': 17, 'ᄒ': 18, 'ᅡ': 19, 'ᅢ': 20, 'ᅣ': 21, 'ᅤ': 22, 'ᅥ': 23, 'ᅦ': 24, 'ᅧ': 25, 'ᅨ': 26, 'ᅩ': 27, 'ᅪ': 28, 'ᅫ': 29, 'ᅬ': 30, 'ᅭ': 31, 'ᅮ': 32, 'ᅯ': 33, 'ᅰ': 34, 'ᅱ': 35, 'ᅲ': 36, 'ᅳ': 37, 'ᅴ': 38, 'ᅵ': 39, 'ᆨ': 40, 'ᆩ': 41, 'ᆪ': 42, 'ᆫ': 43, 'ᆬ': 44, 'ᆭ': 45, 'ᆮ': 46, 'ᆯ': 47, 'ᆰ': 48, 'ᆱ': 49, 'ᆲ': 50, 'ᆳ': 51, 'ᆴ': 52, 'ᆵ': 53, 'ᆶ': 54, 'ᆷ': 55, 'ᆸ': 56, 'ᆹ': 57, 'ᆺ': 58, 'ᆻ': 59, 'ᆼ': 60, 'ᆽ': 61, 'ᆾ': 62, 'ᆿ': 63, 'ᇀ': 64, 'ᇁ': 65, 'ᇂ': 66}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최종적으로 전달받은 Text를 Encoding해서 정수 값으로 구성된 리스트로 반환하는 코드는 다음과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1712981161850&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import unicodedata
jamo_to_index = generate_hangul_jamo_to_index()

def encode_text_to_jamo_indices(text, jamo_to_index):
    decomposed_text = unicodedata.normalize('NFD', text)
    return [jamo_to_index.get(jamo, -1) for jamo in decomposed_text if jamo in jamo_to_index]

sample_text = &quot;안녕하세요 내 이름은 홍길동입니다&quot;
encoded_indices = encode_text_to_jamo_indices(sample_text, jamo_to_index)

print(&quot;Encoded Indices:&quot;, encoded_indices)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출력결과는 다음과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1712981191699&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Encoded Indices: [11, 19, 43, 2, 25, 60, 18, 19, 9, 24, 11, 31, 2, 20, 11, 39, 5, 37, 55, 11, 37, 43, 18, 27, 60, 0, 39, 47, 3, 27, 60, 11, 39, 56, 2, 39, 3, 19]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 Encoding 결과를 다시 Decoding 하기 위한 코드는 다음과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1712981545116&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def decode_jamo(indices, jamo_to_index):
    idx2jamo = {idx: jamo for jamo, idx in jamo_to_index.items()}
    composed = ''.join(unicodedata.normalize('NFC', idx2jamo[idx]) for idx in indices)
    return composed&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1712981584548&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;decoded_text = decode_jamo(encoded_indices, jamo_to_index)
print(&quot;Decoded Text:&quot;, decoded_text)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출력 결과는 다음과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1712981614880&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Decoded Text: 안녕하세요내이름은홍길동입니다&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이상으로, 파이썬으로 한글 Text를 Encoding 및 Decoding하는 방법에 대해서 알아보았습니다.&lt;/p&gt;</description>
      <category>Python</category>
      <category>Decoding</category>
      <category>deeplearning</category>
      <category>encoding</category>
      <category>nlp</category>
      <category>Python</category>
      <author>Minima</author>
      <guid isPermaLink="true">https://maxima-lab.tistory.com/86</guid>
      <comments>https://maxima-lab.tistory.com/entry/Python-Hangul-Text-Encoding-Decoding#entry86comment</comments>
      <pubDate>Sat, 13 Apr 2024 13:14:31 +0900</pubDate>
    </item>
    <item>
      <title>[Tensorflow] 대용량 데이터 학습 방법 (Tensorflow 2)</title>
      <link>https://maxima-lab.tistory.com/entry/Large-Dataset-Training-Tensorflow2</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요, 오늘은 Tensorflow 2에서 대용량 데이터를 학습하는 방법에 대해서 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저, MNIST 데이터 셋(28, 28)을 Resize(512, 512) 해서 정해진 경로에 저장하는 코드는 다음과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1712927361424&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import tensorflow as tf
from PIL import Image
import os
import cv2

# MNIST 데이터셋 로드
mnist = tf.keras.datasets.mnist
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()

# 디렉토리 생성
os.makedirs('/mnist_png', exist_ok=True)

# (28, 28) =&amp;gt; (512, 512) Resize 후 이미지 저장
def save_image(image, label, index):
    os.makedirs(f'/mnist_png/{label}', exist_ok=True)
    image_path = f'/mnist_png/{label}/{index}.{format}'
    image = cv2.resize(image, (512, 512))
    cv2.imwrite(image_path, image)

for i in range(len(train_images)): 
    image, label = train_images[i], train_labels[i]
    save_image(image, label, i)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 코드를 통해 mnist_png 디렉토리 내 (512, 512) 이미지들이 저장된 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 대용량 데이터를 학습하기 위한 코드는 다음과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1712927720238&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import tensorflow as tf
from tensorflow.keras.utils import to_categorical
from sklearn.model_selection import train_test_split
import os
import glob
import numpy as np

def read_image(mnist_dir=None):
  mnist_img_list = glob.glob('./mnist_png/**/*.png', recursive=True)
  mnist_img_array = np.array(mnist_img_list)
  label_array = np.array([os.path.dirname(os.path.basename(img_path)) for img_path in mnist_img_list])

  np.random.seed(200)
  np.random.shuffle(mnist_img_array)
  np.random.seed(200)
  np.random.shuffle(label_array)

  return mnist_img_array, to_categorical(label_array, 10)

def fn(mnist_img_path, label):

  tmp = tf.io.read_file(mnist_img_path)
  decode_img = tf.image.decode_png(tmp, channels=1)
  decode_img = tf.cast(decode_img, tf.float32)

  return decode_img, tf.cast(label, tf.float32)


x_dataset, y_dataset = read_image()

X_train, X_test, y_train, y_test = train_test_split(x_dataset, y_dataset, test_size=0.2, random_state=42, stratify=y_dataset)

train_dataset = tf.data.Dataset.from_tensor_slices((X_train, y_train)) \ 
                .map(fn, num_parallel_calls = tf.data.experimental.AUTOTUNE) \ 
                .shuffle(buffer_size=256) \ 
                .batch(4) \ 
                .prefetch(tf.data.experimental.AUTOTUNE)

validation_dataset = tf.data.Dataset.from_tensor_slices((X_test, y_test)) \
                     .map(fn, num_parallel_calls=tf.data.experimental.AUTOTUNE) \
                     .batch(4)

model = ...

model.compile(
    optimizer=tf.keras.optimizers.Adam(learning_rate=0.001), 
    loss=&quot;categorical_crossentropy&quot;, metrics=[&quot;acc&quot;])

epochs = 200
model.fit(train_dataset, epochs=epochs, validation_data=validation_dataset)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 전체 코드에 대해서 순차적으로 설명드리겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1712928967723&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def read_image(mnist_dir=None):
  mnist_img_list = glob.glob('./mnist_png/**/*.png', recursive=True)
  mnist_img_array = np.array(mnist_img_list)
  label_array = np.array([os.path.dirname(os.path.basename(img_path)) for img_path in mnist_img_list])

  np.random.seed(200)
  np.random.shuffle(mnist_img_array)
  np.random.seed(200)
  np.random.shuffle(label_array)

  return mnist_img_array, to_categorical(label_array, 10)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(512, 512) 저장된 mnist_png 디렉토리 내 저장된 이미지들의 파일 경로들을 list -&amp;gt; np.array로 변환 및 shuffle 후 반환하는 코드입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1712929068557&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def fn(mnist_img_path, label):

  tmp = tf.io.read_file(mnist_img_path)
  decode_img = tf.image.decode_png(tmp, channels=1)
  decode_img = tf.cast(decode_img, tf.float32)

  return decode_img, tf.cast(label, tf.float32)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 함수는 mnist_img_path 및 label를 전달받아 Tensorflow 문자열 Tensor로 변환 후 tf.image.decode_png 함수를 통해 디코딩 과정을 거치게 됩니다. 최종적으로 tf.cast 함수를 통해 decode_img의 DType를 변환 후 반환합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 코드에서 mnist_img_path(이미지)의 확장자가 .bmp, jpg인 경우에는 각각 다음 함수를 사용해주시면 됩니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;tf.image.decode_bmp()&lt;/li&gt;
&lt;li&gt;tf.image.decode_jpeg()&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1712929487423&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;train_dataset = tf.data.Dataset.from_tensor_slices((X_train, y_train)) \ 
                .map(fn, num_parallel_calls = tf.data.experimental.AUTOTUNE) \ 
                .shuffle(buffer_size=256) \ 
                .batch(4) \ 
                .prefetch(tf.data.experimental.AUTOTUNE)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 코드를 구성하는 요소들은 다음과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;map : 데이터셋의 각 요소에 주어진 fn 함수를 적용&lt;/li&gt;
&lt;li&gt;num_parallel_calls = tf.data.experimental.AUTOTUNE : 데이터 전처리를 병렬로 수행 (자동으로 최적의 Thread 수 결정)&lt;/li&gt;
&lt;li&gt;shuffle &amp;amp; buffer_size :&amp;nbsp; 데이터셋을 무작위로 섞으며, 섞을 요소의 수를 정의&lt;/li&gt;
&lt;li&gt;prefetch &amp;amp; tf.data.experimental.AUT : 모델 학습 동안 다음 Batch를 미리 준비하여 입출력 시간 지연을 최소화하고, 계산과 데이터 로드를 병렬로 수행&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이상으로 Tensorflow 2에서 대용량 데이터 학습하는 방법에 대해서 알아보았습니다.&lt;/p&gt;</description>
      <category>Python/Tensorflow</category>
      <category>deeplearning</category>
      <category>LargeDataset</category>
      <category>Python</category>
      <category>tensorflow</category>
      <author>Minima</author>
      <guid isPermaLink="true">https://maxima-lab.tistory.com/85</guid>
      <comments>https://maxima-lab.tistory.com/entry/Large-Dataset-Training-Tensorflow2#entry85comment</comments>
      <pubDate>Sat, 13 Apr 2024 07:53:51 +0900</pubDate>
    </item>
    <item>
      <title>[Docker] Docker-Compose를 활용해서 MariaDB, Flask, Vue.js 연동하는 방법</title>
      <link>https://maxima-lab.tistory.com/entry/Docker-Docker-Compose-MariaDB-Flask-Vuejs</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요, 오늘은 Docker-Compose를 활용해서 MariaDB, Flask Server, Vue.js Server를 연동하는 방법에 대해서 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저, docker-compose.yml 파일에 대해서 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1711465403231&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;version: '3.8'

services:

  flask-app:
    build: ./flask
    ports:
      - &quot;4000:4000&quot;
    environment:
      - DATABASE_HOST=mariadb
      - DATABASE_USER=exampleUser
      - DATABASE_PASSWORD=exampleUserPassword
    volumes:
      - ./flask:/app
    networks:
    - server_network

  vue-app:
    build: ./vue-practice
    ports:
      - &quot;8080:8080&quot;
    volumes:
      - ./vue-practice:/app
    environment:
      - CHOKIDAR_USEPOLLING=true
    networks:
    - server_network

  mariadb:
    image: mariadb:latest
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=exampleRootPassword
      - MYSQL_DATABASE=exampleDatabase
      - MYSQL_USER=exampleUser
      - MYSQL_PASSWORD=exampleUserPassword
    ports:
      - &quot;3306:3306&quot;
    volumes:
      - ./data:/var/lib/mysql
    networks:
    - server_network

networks:
  server_network:&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-03-27 at 12.06.23 AM.png&quot; data-origin-width=&quot;680&quot; data-origin-height=&quot;468&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bf63Jj/btsF55ty3F5/DtTKueWCMK05QXFekne5h0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bf63Jj/btsF55ty3F5/DtTKueWCMK05QXFekne5h0/img.png&quot; data-alt=&quot;디렉토리 구조 시각화 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bf63Jj/btsF55ty3F5/DtTKueWCMK05QXFekne5h0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbf63Jj%2FbtsF55ty3F5%2FDtTKueWCMK05QXFekne5h0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;344&quot; data-filename=&quot;Screenshot 2024-03-27 at 12.06.23 AM.png&quot; data-origin-width=&quot;680&quot; data-origin-height=&quot;468&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;디렉토리 구조 시각화 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 docker-compose.yml 파일에 대해 대응되는 디렉토리 구조 시각화 결과는 위의 이미지를 참고해주시면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이이서, docker-compose.yml 파일을 단계적으로 설명드리겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1711465717726&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;  flask-app:
    build: ./flask
    ports:
      - &quot;4000:4000&quot;
    environment:
      - DATABASE_HOST=mariadb
      - DATABASE_USER=exampleUser
      - DATABASE_PASSWORD=exampleUserPassword
    volumes:
      - ./flask:/app
    networks:
    - server_network&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 코드는 service 이름이 flask-app이며, ./flask 폴더 내의 Dockerfile를 활용해서 Build 작업을 진행합니다. 또한, Database는 mariadb (Service)를 사용하게 됩니다. 나머지는, volume과 networks에 대한 설정 등 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;pre id=&quot;code_1711465874956&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;  vue-app:
    build: ./vue-practice
    ports:
      - &quot;8080:8080&quot;
    volumes:
      - ./vue-practice:/app
    environment:
      - CHOKIDAR_USEPOLLING=true
    networks:
    - server_network&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 코드는 flask-app과 유사하지만 port 번호가 상이하며 나머지는 유사하게 적용된 것을 확인할 수 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;pre id=&quot;code_1711465949222&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;  mariadb:
    image: mariadb:latest
    restart: always
    environment:
      - MARIADB_ROOT_PASSWORD=exampleRootPassword
      - MARIADB_DATABASE=exampleDatabase
      - MARIADB_USER=exampleUser
      - MARIADB_PASSWORD=exampleUserPassword
    ports:
      - &quot;3306:3306&quot;
    volumes:
      - ./data:/var/lib/mysql
    networks:
    - server_network

networks:
  server_network:&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막으로, mariadb (Service)에 대한 설명입니다. 해당 Service를 위해서 Docker Image는 mariadb:latest를 사용하였지만 호환성을 위해서는 구체적인 tag를 지정하는 것을 추천드립니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;flask-app (Service)에서도 보셨듯이, Database 관련 Password, Database 등의 설정을 맞춰주셔야 합니다. 마찬가지로 나머지는 volume과 networks 관련 정보가 되겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이상으로, Docker-Compose를 활용하여 MariaDB, Flask, Vue.js Server를 연동하는 방법에 대해서 알아보았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;감사드립니다.&lt;/p&gt;</description>
      <category>Docker</category>
      <category>Docker</category>
      <category>docker-compose</category>
      <category>FLASK</category>
      <category>MariaDB</category>
      <category>network</category>
      <category>service</category>
      <category>vue.js</category>
      <author>Minima</author>
      <guid isPermaLink="true">https://maxima-lab.tistory.com/84</guid>
      <comments>https://maxima-lab.tistory.com/entry/Docker-Docker-Compose-MariaDB-Flask-Vuejs#entry84comment</comments>
      <pubDate>Tue, 2 Apr 2024 21:41:39 +0900</pubDate>
    </item>
    <item>
      <title>[Docker] Docker-Compose를 활용한 WordPress 배포하는 방법</title>
      <link>https://maxima-lab.tistory.com/entry/Docker-Docker-Compose-WordPress-Deployment</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요, 오늘은 Docker-Compose를 활용해서 WordPress를 배포하는 방법에 대해서 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 Docker-Compose를 적용하기 위한 word_press.yml 파일은 다음과 같습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1711544747699&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;version: '3.1'

services:
  wordpress:
    container_name: mywordpress
    image: wordpress:latest
    ports:
      - &quot;8000:80&quot;
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: wordpress
      WORDPRESS_DB_NAME: wordpress
    restart: always
    volumes:
      - wordpress_data:/var/www/html
    networks:
      - mynetwork

  db:
    container_name: certainmysql
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: somewordpress
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress
    restart: always
    volumes:
      - db_data:/var/lib/mysql
    networks:
      - mynetwork

volumes:
  wordpress_data:
  db_data:

networks:
  mynetwork:&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 애플리케이션을 구성하기 위한 Services(Containers)는 다음과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;wordpress&lt;/li&gt;
&lt;li&gt;db&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;총 2개의 Services(Containers)로 구성되어 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;순차적으로, 첫번째 Service인 wordpress에 대해서 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1711544904694&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;  wordpress:
    container_name: mywordpress
    image: wordpress:latest
    ports:
      - &quot;8000:80&quot;
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: wordpress
      WORDPRESS_DB_NAME: wordpress
    restart: always
    volumes:
      - wordpress_data:/var/www/html
    networks:
      - mynetwork&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;container_name : 사용 할 컨테이너 이름 (Unique 해야함)&lt;/li&gt;
&lt;li&gt;image : WordPress Docker Image 중 최신 이미지를 사용&lt;/li&gt;
&lt;li&gt;ports: 호스트의 포트(8000)을 컨테이너 내부 포트(80)에 맵핑&lt;/li&gt;
&lt;li&gt;environment: WordPress Container에서 사용할 환경 변수 설정&lt;/li&gt;
&lt;li&gt;restart: 컨테이너가 충돌하거나 서버가 재부팅되는 경우 컨테이너가 다시 시작하도록 설정&lt;/li&gt;
&lt;li&gt;volumes: Volume Mount&lt;/li&gt;
&lt;li&gt;networks: 사용자 정의 네트워크에 연결&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이어서, db Service(Container)에 대해서 설명하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1711545336707&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;  db:
    container_name: certainmysql
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: somewordpress
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress
    restart: always
    volumes:
      - db_data:/var/lib/mysql
    networks:
      - mynetwork&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫번째 container와 유사하게 container_name, image, environment, restart, volumes, networks를 위와 같이 설정하였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 명령어를 통해 빌드합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1711545458139&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker-compose -f word_press.yml up -d&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1711545847189&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker port mywordpress&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-03-27 at 10.19.42 PM.png&quot; data-origin-width=&quot;790&quot; data-origin-height=&quot;1554&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lV7h8/btsGayVz2kH/jaidMssN850aHoElDkiwy1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lV7h8/btsGayVz2kH/jaidMssN850aHoElDkiwy1/img.png&quot; data-alt=&quot;0.0.0.0:8000 접속 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lV7h8/btsGayVz2kH/jaidMssN850aHoElDkiwy1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlV7h8%2FbtsGayVz2kH%2FjaidMssN850aHoElDkiwy1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;1180&quot; data-filename=&quot;Screenshot 2024-03-27 at 10.19.42 PM.png&quot; data-origin-width=&quot;790&quot; data-origin-height=&quot;1554&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;0.0.0.0:8000 접속 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이상으로, Docker-Compose를 활용해서 WordPress를 배포하는 방법에 대해서 알아보았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;감사드립니다.&lt;/p&gt;</description>
      <category>Docker</category>
      <category>container</category>
      <category>Docker</category>
      <category>docker-compose</category>
      <category>MySQL</category>
      <category>Wordpress</category>
      <author>Minima</author>
      <guid isPermaLink="true">https://maxima-lab.tistory.com/83</guid>
      <comments>https://maxima-lab.tistory.com/entry/Docker-Docker-Compose-WordPress-Deployment#entry83comment</comments>
      <pubDate>Wed, 27 Mar 2024 22:21:38 +0900</pubDate>
    </item>
    <item>
      <title>[Docker] Docker-Compose를 사용해서 Vue.js &amp;amp; Flask Server 연동하는 방법</title>
      <link>https://maxima-lab.tistory.com/entry/Docker-Docker-Compose-Vuejs-Flask</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요, 오늘은 Docker-Compose를 사용해서 Vue.js &amp;amp; Flask Server를 연동하는 방법에 대해서 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저, 해당 내용을 위해 디릭토리 구조 구성은 다음과 같습니다. (tree -L 2 -f)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-03-21 at 11.38.45 PM.png&quot; data-origin-width=&quot;680&quot; data-origin-height=&quot;576&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/I7GGI/btsFZUY8ijm/Uh2Wgrk276y0CQgEsDUfhk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/I7GGI/btsFZUY8ijm/Uh2Wgrk276y0CQgEsDUfhk/img.png&quot; data-alt=&quot;디렉토리 구조 시각화&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/I7GGI/btsFZUY8ijm/Uh2Wgrk276y0CQgEsDUfhk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FI7GGI%2FbtsFZUY8ijm%2FUh2Wgrk276y0CQgEsDUfhk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;424&quot; data-filename=&quot;Screenshot 2024-03-21 at 11.38.45 PM.png&quot; data-origin-width=&quot;680&quot; data-origin-height=&quot;576&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;디렉토리 구조 시각화&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저, Flask Server에 대해서 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;./flask/app.py 파일에 대한 코드는 다음과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1711031508410&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from flask import Flask, jsonify
from flask_cors import CORS

app = Flask(__name__)
cors = CORS(app, resources={r&quot;/*&quot;: {&quot;origin&quot;: &quot;*&quot;},})

@app.route('/message', methods=['POST', 'GET'])
def get_message():
    return jsonify({'test_message': 'Hello from Flask!'})

if __name__ == '__main__':
    app.run(debug=True, host='0.0.0.0', port=4000)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 Flask Server는 Port 4000번 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 Flask 애플리케이션을 실행하기 위한 패키지 정보는 다음을 통해 저장할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1711023577462&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pip list --format=freeze &amp;gt; requirements.txt&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최종적으로 Flask Server의 Dockerfile은 다음과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1711031666427&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;FROM python:3.8-slim
WORKDIR /app
COPY requirements.txt /app/
RUN pip install -r requirements.txt
COPY . /app
CMD [&quot;python&quot;, &quot;app.py&quot;]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이어서, Vue.js Server에 대해서 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1711031785629&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;template&amp;gt;
  &amp;lt;h1&amp;gt;{{ message }}&amp;lt;/h1&amp;gt;
&amp;lt;/template&amp;gt;

&amp;lt;script&amp;gt;
import axios from 'axios';
export default {
  name: 'HelloWorld',
  props: {
    msg: String
  },

  data() {
    return {
      message: '',
    };
  },

  mounted() {
    axios.get('http://localhost:4000/message')
      .then(response =&amp;gt; {
        this.message = response.data.test_message;
      })
      .catch(error =&amp;gt; {
        console.log(error);
      });
  }
}
&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Vue.js Server 내 Dockerfile은 다음과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1711032005712&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;FROM node:lts-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
CMD [&quot;npm&quot;, &quot;run&quot;, &quot;serve&quot;]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최종적으로 Docker-Compose를 통해 빌드하는 명령어는 다음과 같습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1711031377344&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker-compose up --build&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 명령어는 Background에서 실행하는 명령어 입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1711031405359&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker-compose up -d&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Docker-Compose를 활용하여, Flask Server와 Vue.js Server를 연동하는 방법에 대해서 알아보았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;감사드립니다.&lt;/p&gt;</description>
      <category>Docker</category>
      <category>Cors</category>
      <category>Docker</category>
      <category>docker-compose</category>
      <category>FLASK</category>
      <category>vue.js</category>
      <author>Minima</author>
      <guid isPermaLink="true">https://maxima-lab.tistory.com/82</guid>
      <comments>https://maxima-lab.tistory.com/entry/Docker-Docker-Compose-Vuejs-Flask#entry82comment</comments>
      <pubDate>Thu, 21 Mar 2024 23:43:30 +0900</pubDate>
    </item>
    <item>
      <title>[Python, GPU Programming] CuPy 란? (vs NumPy)</title>
      <link>https://maxima-lab.tistory.com/entry/Python-GPU-Programming-CuPy-NumPy</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요, 오늘은 CuPy 라이브러리에 대해서 설명하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CuPy는 NumPy와 호환되며, NIVIDIA CUDA GPU에서 실행되는 라이브러리입니다. 이는 NumPy API의 GPU 가속 버전을 제공하여 대규모 수학 연산을 빠르게 수행하며 높은 수준의 병렬 처리를 수행합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래는 NumPy를 사용한 CPU 버전, 그리고 CuPy를 사용한 GPU 버전에 대한 파이썬 코드입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1710564255826&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import numpy as np
import time

# 2개의 행렬 초기화
a_cpu = np.random.rand(2000, 2000).astype(np.float32)
b_cpu = np.random.rand(2000, 2000).astype(np.float32)

for _ in range(0, 10):
  # CPU에서 행렬 곱 연산 시간 측정
  start_time = time.time()
  result_cpu = np.dot(a_cpu, b_cpu)
  cpu_time = time.time() - start_time

  print(f&quot;CPU Matrix Multiplication Time: {cpu_time} seconds&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-03-16 at 1.45.27 PM.png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;370&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lW1eT/btsFP2xe8T7/3i4KQKKcF4CsBDSsLZeKYk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lW1eT/btsFP2xe8T7/3i4KQKKcF4CsBDSsLZeKYk/img.png&quot; data-alt=&quot;CPU에서 측정 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lW1eT/btsFP2xe8T7/3i4KQKKcF4CsBDSsLZeKYk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlW1eT%2FbtsFP2xe8T7%2F3i4KQKKcF4CsBDSsLZeKYk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;181&quot; data-filename=&quot;Screenshot 2024-03-16 at 1.45.27 PM.png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;370&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;CPU에서 측정 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1710564415970&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import cupy as cp
import time

# 2개의 행렬 초기화
a_gpu = cp.random.rand(2000, 2000).astype(cp.float32)
b_gpu = cp.random.rand(2000, 2000).astype(cp.float32)

for _ in range(0, 10):
  # GPU에서 행렬의 곱 연산 시간 측정
  start_time = time.time()
  result_gpu = cp.dot(a_gpu, b_gpu)
  cp.cuda.Stream.null.synchronize()
  gpu_time = time.time() - start_time

  print(f&quot;GPU Matrix Multiplication Time: {gpu_time} seconds&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-03-16 at 1.47.22 PM.png&quot; data-origin-width=&quot;1032&quot; data-origin-height=&quot;372&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pj940/btsFRkczHPA/5bI7aGS1z0nkM7g81FuGB0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pj940/btsFRkczHPA/5bI7aGS1z0nkM7g81FuGB0/img.png&quot; data-alt=&quot;GPU에서 측정 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pj940/btsFRkczHPA/5bI7aGS1z0nkM7g81FuGB0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fpj940%2FbtsFRkczHPA%2F5bI7aGS1z0nkM7g81FuGB0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;180&quot; data-filename=&quot;Screenshot 2024-03-16 at 1.47.22 PM.png&quot; data-origin-width=&quot;1032&quot; data-origin-height=&quot;372&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;GPU에서 측정 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이상으로, CuPy에 대해서 알아보고 해당 라이브러리를 사용한 간단한 예제에 대해서 알아보았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;감사드립니다.&lt;/p&gt;</description>
      <category>Python/GPU Programming</category>
      <category>CuPy</category>
      <category>GPU Programming</category>
      <category>numpy</category>
      <category>Python</category>
      <author>Minima</author>
      <guid isPermaLink="true">https://maxima-lab.tistory.com/81</guid>
      <comments>https://maxima-lab.tistory.com/entry/Python-GPU-Programming-CuPy-NumPy#entry81comment</comments>
      <pubDate>Sat, 16 Mar 2024 13:49:24 +0900</pubDate>
    </item>
    <item>
      <title>[Python, Opencv] Binary Objects을 포함하는 가장 작은 사각형 찾기</title>
      <link>https://maxima-lab.tistory.com/entry/Python-Opencv-Binary-Objects-minAreaRect</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요, 오늘은 Binary Objects을 포함하는 가장 작은 사각형을 찾는 방법에 대해서 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;알고리즘을 적용하고자 하는 이미지는 다음과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-03-16 at 11.31.29 AM.png&quot; data-origin-width=&quot;1010&quot; data-origin-height=&quot;1010&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dP9cQw/btsFRqXS2Va/UHhNasw7AkOdysiiHlS06K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dP9cQw/btsFRqXS2Va/UHhNasw7AkOdysiiHlS06K/img.png&quot; data-alt=&quot;이미지&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dP9cQw/btsFRqXS2Va/UHhNasw7AkOdysiiHlS06K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdP9cQw%2FbtsFRqXS2Va%2FUHhNasw7AkOdysiiHlS06K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;500&quot; data-filename=&quot;Screenshot 2024-03-16 at 11.31.29 AM.png&quot; data-origin-width=&quot;1010&quot; data-origin-height=&quot;1010&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;이미지&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 이미지는 총 3개의 Connected Objects로 구성되어 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미지 내 각 Connected Object들을 포함하는 가장 작은 사각형을 구하는 코드는 다음과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1710556609566&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import cv2
import matplotlib.pyplot as plt
import numpy as np

img = cv2.imread(&quot;...png&quot;)
draw_img = img.copy()

# Contours 찾기
contours, _ = cv2.findContours(img[:, :, 0], cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)

for certain_contour in contours:

    rect = cv2.minAreaRect(certain_contour)
    box = cv2.boxPoints(rect)
    box = np.intp(box)

    # 사각형 그리기
    cv2.drawContours(draw_img, [box], 0, (0, 255, 0), 2)

plt.imshow(np.hstack([img, draw_img]))
plt.axis('off')
plt.show()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 코드를 통해 알고리즘을 적용한 결과는 다음과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-03-16 at 11.37.35 AM.png&quot; data-origin-width=&quot;986&quot; data-origin-height=&quot;494&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b4acHi/btsFRrbpPHE/cIm7q72k0JpqYXJplrt440/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b4acHi/btsFRrbpPHE/cIm7q72k0JpqYXJplrt440/img.png&quot; data-alt=&quot;알고리즘 적용 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b4acHi/btsFRrbpPHE/cIm7q72k0JpqYXJplrt440/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb4acHi%2FbtsFRrbpPHE%2FcIm7q72k0JpqYXJplrt440%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;251&quot; data-filename=&quot;Screenshot 2024-03-16 at 11.37.35 AM.png&quot; data-origin-width=&quot;986&quot; data-origin-height=&quot;494&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;알고리즘 적용 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이상으로, Binary Objects를 포함하는 가장 작은 사각형을 찾는 방법에 대해서 알아보았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;감사드립니다.&lt;/p&gt;</description>
      <category>Python/Opencv</category>
      <category>minAreaRect</category>
      <category>OpenCV</category>
      <category>Python</category>
      <author>Minima</author>
      <guid isPermaLink="true">https://maxima-lab.tistory.com/80</guid>
      <comments>https://maxima-lab.tistory.com/entry/Python-Opencv-Binary-Objects-minAreaRect#entry80comment</comments>
      <pubDate>Sat, 16 Mar 2024 13:25:29 +0900</pubDate>
    </item>
    <item>
      <title>[Vue.js 3 + Vuetify 3] Data table (Component) 사용법</title>
      <link>https://maxima-lab.tistory.com/entry/Vuejs3-Vuetify3-Data-table-Component</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요, 오늘은 Vuetify 3에서 Data table (Component) 사용하는 방법에 대해서 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://vuetifyjs.com/en/components/data-tables&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://vuetifyjs.com/en/components/data-tables&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1710174625708&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;https://vuetifyjs.com/en/components/data-tables/&quot; data-og-description=&quot;&quot; data-og-host=&quot;vuetifyjs.com&quot; data-og-source-url=&quot;https://vuetifyjs.com/en/components/data-tables&quot; data-og-url=&quot;https://vuetifyjs.com/en/components/data-tables/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://vuetifyjs.com/en/components/data-tables&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://vuetifyjs.com/en/components/data-tables&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;https://vuetifyjs.com/en/components/data-tables/&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;vuetifyjs.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저, Data table (Component)에 대한 코드 예시는 다음과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1710174223396&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;template&amp;gt;
  &amp;lt;v-card
    title=&quot;A High School&quot;
    flat
  &amp;gt;
    &amp;lt;template v-slot:text&amp;gt;
      &amp;lt;v-text-field
        v-model=&quot;search&quot;
        label=&quot;Search&quot;
        prepend-inner-icon=&quot;mdi-magnify&quot;
        variant=&quot;outlined&quot;
        hide-details
        single-line
      &amp;gt;&amp;lt;/v-text-field&amp;gt;
    &amp;lt;/template&amp;gt;

    &amp;lt;v-data-table
      :headers=&quot;headers&quot;
      :items=&quot;students&quot;
      :search=&quot;search&quot;
    &amp;gt;&amp;lt;/v-data-table&amp;gt;
  &amp;lt;/v-card&amp;gt;
&amp;lt;/template&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1710174248759&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;script&amp;gt;
  export default {
    name : 'App',
    components:{
    },
    data () {
      return {
        search: '',
        headers: [
          { align: 'center', key: 'index', sortable: false, title: 'Index' },
          { align: 'center', key: 'name', title: 'Name' },
          { align: 'center', key: 'id', title: 'Student ID'},
          { align: 'center', key: 'grade', title: 'Grade' },
        ],

        students: [
          {
            index: '1',
            name: 'Name-1',
            id: '2024-1',
            grade: 'A+'
          },

          {
            index: '2',
            name: 'Name-2',
            id: '2023-1',
            grade: 'B-'
          },

          {
            index: '3',
            name: 'Name-3',
            id: '2021-1',
            grade: 'A-'
          },

          {
            index: '4',
            name: 'Name-4',
            id: '2024-2',
            grade: 'B+'
          },

          {
            index: '5',
            name: 'Name-5',
            id: '2024-3',
            grade: 'A+'
          },
        ],
      }
    },
  }
&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 코드 실행 결과는 다음과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_Screenshot 2024-03-12 at 1.24.37 AM.png&quot; data-origin-width=&quot;2726&quot; data-origin-height=&quot;1044&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8VYpE/btsFF6myEQ2/ae5X7M5GY19YMUhRaaO7Pk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8VYpE/btsFF6myEQ2/ae5X7M5GY19YMUhRaaO7Pk/img.png&quot; data-alt=&quot;실행 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8VYpE/btsFF6myEQ2/ae5X7M5GY19YMUhRaaO7Pk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8VYpE%2FbtsFF6myEQ2%2Fae5X7M5GY19YMUhRaaO7Pk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2726&quot; height=&quot;1044&quot; data-filename=&quot;edited_Screenshot 2024-03-12 at 1.24.37 AM.png&quot; data-origin-width=&quot;2726&quot; data-origin-height=&quot;1044&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;실행 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 코드에서 header를 구성하는 titles는 다음과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Index&lt;/li&gt;
&lt;li&gt;Name&lt;/li&gt;
&lt;li&gt;Student ID&lt;/li&gt;
&lt;li&gt;Grade&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고, 해당 Table의 Items를 구성하는 변수는 students 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변수 students는 List 이며, 각 원소는 Dictionary로 구성되어 해당 원소는 Titles에 대한 Key-Value 쌍으로 구성됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이상으로, Vuetify 3에서 Data table (Component)에 대해서 알아보았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;감사드립니다.&lt;/p&gt;</description>
      <category>Web Programming</category>
      <category>Data table</category>
      <category>vue.js</category>
      <category>vuetify</category>
      <author>Minima</author>
      <guid isPermaLink="true">https://maxima-lab.tistory.com/79</guid>
      <comments>https://maxima-lab.tistory.com/entry/Vuejs3-Vuetify3-Data-table-Component#entry79comment</comments>
      <pubDate>Tue, 12 Mar 2024 01:31:40 +0900</pubDate>
    </item>
    <item>
      <title>[Vue.js 3 + Vuetify 3] File inputs (Component) 사용법</title>
      <link>https://maxima-lab.tistory.com/entry/Vuejs3-Vuetify3-File-inputs-Component</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요, 오늘은 Vuetify 3에서 File inputs (Component)을 사용하는 방법에 대해서 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://vuetifyjs.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://vuetifyjs.com/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1710168627386&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Vuetify &amp;mdash; A Vue Component Framework&quot; data-og-description=&quot;Vuetify is a no design skills required Open Source UI Component Framework for Vue. It provides you with all of the t...&quot; data-og-host=&quot;vuetifyjs.com&quot; data-og-source-url=&quot;https://vuetifyjs.com/&quot; data-og-url=&quot;https://vuetifyjs.com/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/qkXOU/hyVxDOZkuw/dZ0dK0hkbzH17ubJXDHLa1/img.png?width=2600&amp;amp;height=1300&amp;amp;face=0_0_2600_1300,https://scrap.kakaocdn.net/dn/huK3V/hyVxCoYBgn/CexZEr82SZzlFin8TyJz40/img.png?width=2600&amp;amp;height=1300&amp;amp;face=0_0_2600_1300&quot;&gt;&lt;a href=&quot;https://vuetifyjs.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://vuetifyjs.com/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/qkXOU/hyVxDOZkuw/dZ0dK0hkbzH17ubJXDHLa1/img.png?width=2600&amp;amp;height=1300&amp;amp;face=0_0_2600_1300,https://scrap.kakaocdn.net/dn/huK3V/hyVxCoYBgn/CexZEr82SZzlFin8TyJz40/img.png?width=2600&amp;amp;height=1300&amp;amp;face=0_0_2600_1300');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Vuetify &amp;mdash; A Vue Component Framework&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Vuetify is a no design skills required Open Source UI Component Framework for Vue. It provides you with all of the t...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;vuetifyjs.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;File inputs (Component)를 다양한 예시들을 활용한 결과는 다음과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1710168253366&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;template&amp;gt;
  &amp;lt;v-file-input label=&quot;File input&quot;&amp;gt;&amp;lt;/v-file-input&amp;gt;
  &amp;lt;v-file-input label=&quot;File input&quot; variant=&quot;outlined&quot;&amp;gt;&amp;lt;/v-file-input&amp;gt;
  &amp;lt;v-file-input label=&quot;File input&quot; variant=&quot;underlined&quot;&amp;gt;&amp;lt;/v-file-input&amp;gt;
  &amp;lt;v-file-input label=&quot;File input&quot; variant=&quot;solo&quot;&amp;gt;&amp;lt;/v-file-input&amp;gt;
  &amp;lt;v-file-input label=&quot;File input&quot; variant=&quot;solo-filled&quot;&amp;gt;&amp;lt;/v-file-input&amp;gt;
  &amp;lt;v-file-input label=&quot;File input&quot; variant=&quot;solo-inverted&quot;&amp;gt;&amp;lt;/v-file-input&amp;gt;
  &amp;lt;v-file-input accept=&quot;image/*&quot; label=&quot;File input&quot;&amp;gt;&amp;lt;/v-file-input&amp;gt;
  &amp;lt;v-file-input label=&quot;File input w/ chips&quot; chips multiple&amp;gt;&amp;lt;/v-file-input&amp;gt;
  &amp;lt;v-file-input label=&quot;File input&quot; counter multiple show-size&amp;gt;&amp;lt;/v-file-input&amp;gt;
  &amp;lt;v-file-input density=&quot;compact&quot; label=&quot;File input&quot;&amp;gt;&amp;lt;/v-file-input&amp;gt;
&amp;lt;/template&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-03-11 at 11.44.43 PM.png&quot; data-origin-width=&quot;2726&quot; data-origin-height=&quot;1510&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Cn8QT/btsFGKwwtxR/3xoNgMIc302ixvkvCmxMu0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Cn8QT/btsFGKwwtxR/3xoNgMIc302ixvkvCmxMu0/img.png&quot; data-alt=&quot;실행 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Cn8QT/btsFGKwwtxR/3xoNgMIc302ixvkvCmxMu0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCn8QT%2FbtsFGKwwtxR%2F3xoNgMIc302ixvkvCmxMu0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;388&quot; data-filename=&quot;Screenshot 2024-03-11 at 11.44.43 PM.png&quot; data-origin-width=&quot;2726&quot; data-origin-height=&quot;1510&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;실행 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 코드에서 variant 값의 따라서 디자인이 위의 예시 처럼 변화하는 것을 확인할 수 있으며, accept 옵션은 특정 파일 format이나 타입을 지정할 수 있습니다. 그리고, counter 옵션은 업로드 한 파일들의 수를, multiple 옵션은 다수의 파일 선택할 수 있게, 그리고 show-size는 해당 파일들의 size를 확인할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이어서, 조금 더 복잡한 Case에 대해서 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1710168936062&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;template&amp;gt;
  &amp;lt;v-file-input
    v-model=&quot;files&quot;
    :show-size=&quot;1000&quot;
    color=&quot;deep-purple-accent-4&quot;
    label=&quot;File input&quot;
    placeholder=&quot;Select your files&quot;
    prepend-icon=&quot;mdi-paperclip&quot;
    variant=&quot;outlined&quot;
    counter
    multiple
  &amp;gt;
    &amp;lt;template v-slot:selection=&quot;{ fileNames }&quot;&amp;gt;
      &amp;lt;template v-for=&quot;(fileName, index) in fileNames&quot; :key=&quot;fileName&quot;&amp;gt;
        &amp;lt;v-chip
          v-if=&quot;index &amp;lt; 2&quot;
          class=&quot;me-2&quot;
          color=&quot;deep-purple-accent-4&quot;
          size=&quot;small&quot;
          label
        &amp;gt;
          {{ fileName }}
        &amp;lt;/v-chip&amp;gt;

        &amp;lt;span
          v-else-if=&quot;index === 2&quot;
          class=&quot;text-overline text-grey-darken-3 mx-2&quot;
        &amp;gt;
          +{{ files.length - 2 }} File(s)
        &amp;lt;/span&amp;gt;
      &amp;lt;/template&amp;gt;
    &amp;lt;/template&amp;gt;
  &amp;lt;/v-file-input&amp;gt;
&amp;lt;/template&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1710169215489&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;script&amp;gt;
export default {
  name: 'App',
  components: {
  },
  data () {
    return {
      files: [],
    }
  },

}
&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 코드에 대한 실행 결과는 다음과 같습니다. 첨부 파일들 중 처음 2개의 파일을 시각화 하며, 3개 이상이여서 2개를 초과하는 파일 개수에 대해서는 요약하여 우측에 표시하게 됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-03-11 at 11.54.55 PM.png&quot; data-origin-width=&quot;2726&quot; data-origin-height=&quot;434&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bAbzo3/btsFHrRaCml/F91okWKuNmzPOK7JFX6Um0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bAbzo3/btsFHrRaCml/F91okWKuNmzPOK7JFX6Um0/img.png&quot; data-alt=&quot;실행 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bAbzo3/btsFHrRaCml/F91okWKuNmzPOK7JFX6Um0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbAbzo3%2FbtsFHrRaCml%2FF91okWKuNmzPOK7JFX6Um0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;111&quot; data-filename=&quot;Screenshot 2024-03-11 at 11.54.55 PM.png&quot; data-origin-width=&quot;2726&quot; data-origin-height=&quot;434&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;실행 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이상으로, Vuetify 3에서 File inputs (Component)를 사용하는 방법에 대해서 알아보았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;감사드립니다.&lt;/p&gt;</description>
      <category>Web Programming</category>
      <category>Component</category>
      <category>File inputs</category>
      <category>vue.js</category>
      <category>vuetify</category>
      <author>Minima</author>
      <guid isPermaLink="true">https://maxima-lab.tistory.com/78</guid>
      <comments>https://maxima-lab.tistory.com/entry/Vuejs3-Vuetify3-File-inputs-Component#entry78comment</comments>
      <pubDate>Tue, 12 Mar 2024 00:01:08 +0900</pubDate>
    </item>
    <item>
      <title>[Vue.js 3 + Vuetify 3] Vuetify 3 설치 및 적용하는 방법</title>
      <link>https://maxima-lab.tistory.com/entry/Vuejs3-Vuetify3-Installation</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요, 오늘은 Vuetify 3을 설치하고 적용하는 방법에 대해서 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저, Vue.js 3에 대한 프로젝트를 생성한 상태라고 가정하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이어서, 아래 명령어를 통해 vuetify를 설치합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1710156511738&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm install vuetify@next&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1710159448923&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm i -D vuetify vite-plugin-vuetify
npm i @mdi/font&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 명령어 실행 후 다음과 같은 경로에 파일을 추가해줍니다. (vuetify.js)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;src/plugins/vuetify.js&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1710157372573&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// src/plugins/vuetify.js
import '@mdi/font/css/materialdesignicons.css'
import 'vuetify/styles'
import { createVuetify } from 'vuetify'
import * as components from 'vuetify/components'
import * as directives from 'vuetify/directives'

export default createVuetify({
  components,
  directives,
})&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이어서, main.js 파일을 다음과 같이 수정합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;src/main.js&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1710157432039&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// src/main.js
import { createApp } from 'vue'
import App from './App.vue'
import vuetify from './plugins/vuetify'

const app = createApp(App)

app.use(vuetify)

app.mount('#app')&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 수정하면, 모든 준비는 완료하였습니다. App.vue 파일에 간단한 Vuetify 3 버튼을 추가해보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;src/App.vue&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1710157543872&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;template&amp;gt;
  &amp;lt;v-app&amp;gt;
    &amp;lt;v-btn color=&quot;primary&quot;&amp;gt;Click Me&amp;lt;/v-btn&amp;gt;
  &amp;lt;/v-app&amp;gt;
&amp;lt;/template&amp;gt;

&amp;lt;script&amp;gt;

export default {
  name: 'App',
  components: {
  }
}
&amp;lt;/script&amp;gt;

&amp;lt;style&amp;gt;
#app {
  font-family: Avenir, Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
}
&amp;lt;/style&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 실행 결과는 다음과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-03-11 at 8.46.16 PM.png&quot; data-origin-width=&quot;2712&quot; data-origin-height=&quot;668&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cZX3SZ/btsFF8LmjtS/cMw1fPkVUiacKUBTWWpAV0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cZX3SZ/btsFF8LmjtS/cMw1fPkVUiacKUBTWWpAV0/img.png&quot; data-alt=&quot;실행 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cZX3SZ/btsFF8LmjtS/cMw1fPkVUiacKUBTWWpAV0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcZX3SZ%2FbtsFF8LmjtS%2FcMw1fPkVUiacKUBTWWpAV0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2712&quot; height=&quot;668&quot; data-filename=&quot;Screenshot 2024-03-11 at 8.46.16 PM.png&quot; data-origin-width=&quot;2712&quot; data-origin-height=&quot;668&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;실행 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이상으로, Vuetify 3을 설치하고 적용하는 방법에 대해서 알아보았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;감사드립니다.&lt;/p&gt;</description>
      <category>Web Programming</category>
      <category>npm</category>
      <category>vue.js</category>
      <category>vuetify</category>
      <category>설치</category>
      <author>Minima</author>
      <guid isPermaLink="true">https://maxima-lab.tistory.com/77</guid>
      <comments>https://maxima-lab.tistory.com/entry/Vuejs3-Vuetify3-Installation#entry77comment</comments>
      <pubDate>Mon, 11 Mar 2024 20:47:53 +0900</pubDate>
    </item>
    <item>
      <title>[Kubernetes] Flask 애플리케이션을 Kubernetes 클러스터 배포하는 방법</title>
      <link>https://maxima-lab.tistory.com/entry/Kubernetes-Flask-Application-Kubernetes-Cluster</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요, 오늘은 Flask 애플리케이션을 Kubernetes 클로스터에 배포하는 방법에 대해서 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같은 과정으로 이루어집니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Flask 애플리케이션 준비&lt;/li&gt;
&lt;li&gt;Dockerfile 작성&lt;/li&gt;
&lt;li&gt;Docker 이미지 빌드 및 푸시&lt;/li&gt;
&lt;li&gt;쿠버네티스 Deployment 정의&lt;/li&gt;
&lt;li&gt;쿠버네티스 Service 정의&lt;/li&gt;
&lt;li&gt;Deployment 및 Service 적용&lt;/li&gt;
&lt;li&gt;애플리케이션 접근 확인&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저, Flask 애플리케이션을 준비하는 단계입니다. (app.py)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1709396211094&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello, Kubernetes!'

if __name__ == '__main__':
    app.run(debug=True, host='0.0.0.0', port=8080)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이어서, Dockerfile을 작성합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1709396316631&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 기본 이미지로 파이썬 3.8을 사용
FROM python:3.8-slim

# 작업 디렉토리 설정
WORKDIR /app

# 애플리케이션 파일 복사
COPY . /app

# 필요한 패키지 설치
RUN pip install --no-cache-dir flask

# 애플리케이션 실행
CMD [&quot;python&quot;, &quot;app.py&quot;]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음은 Docker 이미지를 빌드합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1709396352888&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker build -t my-flask-app:v1 .&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쿠버네티스 Deployment를 정의하는 YAML 파일을 작성합니다. (flask-deployment.yaml)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1709396441675&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;apiVersion: apps/v1
kind: Deployment
metadata:
  name: flask-app
spec:
  replicas: 2
  selector:
    matchLabels:
      app: flask-app
  template:
    metadata:
      labels:
        app: flask-app
    spec:
      containers:
      - name: flask-app
        image: my-flask-app:v1
        ports:
        - containerPort: 8080&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이어서, Flask 애플리케이션을 외부에서 접근하기 위해 Service를 정의하는 YAML 파일을 작성합니다. (flask-servie.yaml)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1709396539229&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;apiVersion: v1
kind: Service
metadata:
  name: flask-service
spec:
  type: LoadBalancer
  ports:
  - port: 80
    targetPort: 8080
  selector:
    app: flask-app&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막으로, kubectl apply 명령어를 사용하여 Deployment와 Service를 쿠버네티스 클러스터에 적용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1709396585687&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;kubectl apply -f flask-deployment.yaml
kubectl apply -f flask-service.yaml&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고, kubectl get services 명령어를 사용하여 외부 IP 또는 URL을 확인할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 명령어를 통해 출력되는 EXTERNAL-IP가 외부에서 서비스에 접근할 수 있는 IP 주소입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹 브라우저에서 &quot;http://EXTERNAL-IP&quot;로 입력하면 쿠버네티스 클러스터에서 실행 중인 Flask 애플리케이션의 홈페이지에 접속할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금까지, Flask&amp;nbsp;애플리케이션을&amp;nbsp;Kubernetes&amp;nbsp;클러스터&amp;nbsp;배포하는&amp;nbsp;방법에 대해서 알아보았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;감사드립니다.&lt;/p&gt;</description>
      <category>Kubernetes</category>
      <category>application</category>
      <category>deployment</category>
      <category>FLASK</category>
      <category>kubectl</category>
      <category>kubernetes</category>
      <category>service</category>
      <category>쿠버네티스</category>
      <author>Minima</author>
      <guid isPermaLink="true">https://maxima-lab.tistory.com/76</guid>
      <comments>https://maxima-lab.tistory.com/entry/Kubernetes-Flask-Application-Kubernetes-Cluster#entry76comment</comments>
      <pubDate>Sun, 3 Mar 2024 01:46:06 +0900</pubDate>
    </item>
    <item>
      <title>[Kubernetes] kubectl 개념 및 사용 방법 (create, apply, get, edit, scale 등)</title>
      <link>https://maxima-lab.tistory.com/entry/Kubernetes-kubectl-create-apply-get-edit-scale</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요, 오늘은 kubectl를 사용하는 방법에 대해서 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;kubectl는 쿠버네티스에서 클러스터를 관리하기 위한 커맨드 라인 도구이며, kubectl 명령어를 사용하여 클러스터의 리소스를 생성, 조회, 수정, 삭제할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;리소스 생성 및 적용&lt;/li&gt;
&lt;li&gt;리소스 조회&lt;/li&gt;
&lt;li&gt;리소스 수정&lt;/li&gt;
&lt;li&gt;리소스 삭제&lt;/li&gt;
&lt;li&gt;로그 조회 및 디버깅&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저, 리소스 생성 및 적용하는 방법에 대해서 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1709390259378&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;kubectl create namespace my-namespace&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-03-02 at 11.51.59 PM.png&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;240&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CwZ7b/btsFuIEyItM/ITjk2MBCdUvTUsxx3OBFB0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CwZ7b/btsFuIEyItM/ITjk2MBCdUvTUsxx3OBFB0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CwZ7b/btsFuIEyItM/ITjk2MBCdUvTUsxx3OBFB0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCwZ7b%2FbtsFuIEyItM%2FITjk2MBCdUvTUsxx3OBFB0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;240&quot; data-filename=&quot;Screenshot 2024-03-02 at 11.51.59 PM.png&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;240&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 명령어 처럼 kubectl create 명령어를 사용하여 새로운 리소스를 생성할 수 있습니다. 이어서, YAML 파일을 통해 리소스를 적용하는 명령어는 다음과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1709390346496&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;kubectl apply -f my-resource.yaml&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이어서, 리소스 조회하는 방법입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 Pod를 보기 위한 명령어는 다음과 같습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1709390381043&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;kubectl get pods&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Namespace를 지정하여 조회하는 명령어 입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1709390395402&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;kubectl get pods --namespace=my-namespace&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;kubectl describe 명령어를 사용하여 리소스의 상세 정보를 조회할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1709390412788&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;kubectl describe pod my-pod-name&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리소스 수정하는 방법입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;kubectl edit 명령어를 사용하여 리소스를 직접 편집할 수 있으며, YAML 정의를 텍스트 에디터에서 열어 수정할 수 있게 합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1709390575300&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;kubectl edit deployment my-deployment&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;kubectl scale 명령어를 사용하여 Deployment, Replica Set 등의 리소스를 스케일링 할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1709390587207&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;kubectl scale deployment my-deployment --replicas=5&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리소스 삭제하는 방법입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;kubectl delete 명령어를 사용하여 리소스를 삭제할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1709390693364&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;kubectl delete pod my-pod-name&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음은 파일을 사용하여 리소스를 삭제하는 명령어입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1709390708254&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;kubectl delete -f my-resource.yaml&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로그 조회 및 디버깅하는 방법입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;kubectl logs 명령어를 사용하여 Pod의 로그를 조회할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1709390775215&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;kubectl logs my-pod-name&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;kubectl exec 명령어를 사용하여 실행 중인 Pod 내부에 명령을 실행할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1709390786170&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;kubectl exec -it my-pod-name -- /bin/bash&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이상으로, kubectl 개념과 이를 사용하는 방법에 대해서 알아보았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;감사드립니다.&lt;/p&gt;</description>
      <category>Kubernetes</category>
      <category>apply</category>
      <category>Create</category>
      <category>delete</category>
      <category>describe</category>
      <category>edit</category>
      <category>Get</category>
      <category>kubectl</category>
      <category>kubernetes</category>
      <category>logs</category>
      <category>scale</category>
      <author>Minima</author>
      <guid isPermaLink="true">https://maxima-lab.tistory.com/75</guid>
      <comments>https://maxima-lab.tistory.com/entry/Kubernetes-kubectl-create-apply-get-edit-scale#entry75comment</comments>
      <pubDate>Sat, 2 Mar 2024 23:50:55 +0900</pubDate>
    </item>
    <item>
      <title>[Kubernetes] YAML 파일 작성하는 방법 (Pod, Deployment, Service, ConfigMap, Secret, PVC)</title>
      <link>https://maxima-lab.tistory.com/entry/Kubernetes-YAML-Pod-Deployment-Service-ConfigMap-Secret-PVC</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요, 오늘은 쿠버네티스에서 YAML 파일 작성하는 방법에 대해서 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;YAML 파일은 리소스의 정의, 구성, 관리를 위해 사용되며, Pod, Deployment, Service 등의 리소스를 생성하고 관리하기 위해 작성 가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리소스들의 종류는 다음과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Pod&lt;/li&gt;
&lt;li&gt;Deployment&lt;/li&gt;
&lt;li&gt;Service&lt;/li&gt;
&lt;li&gt;ConfigMap&lt;/li&gt;
&lt;li&gt;Secret&lt;/li&gt;
&lt;li&gt;PersistentVolumeClasim (PVC)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저, Pod에 대해서 설명하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Pod는 하나 이상의 컨테이너를 실행하는 가장 기본적인 배포 단위로써, 컨테이너의 집합이며 네트워크와 Storage 리소스를 공유합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같이 YAML 파일을 작성할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1709388414452&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;apiVersion: v1
kind: Pod
metadata:
  name: example-pod
  labels:
    app: myapp
spec:
  containers:
    - name: container-name
      image: container-image
      ports:
        - containerPort: 8080&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;apiVersion : 쿠버네티스 API 버전, Pod의 경우 v1&lt;/li&gt;
&lt;li&gt;kind : 리소스 유형&lt;/li&gt;
&lt;li&gt;metadata : 리소스의 이름, 레이블 등 메타데이터를 정의&lt;/li&gt;
&lt;li&gt;spec : Pod가 실행해야할 컨테이너 및 설정 명시&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Deployment는 Pod의 선언적 업데이트와 자동 롤아웃을 관리하며, 애플리케이션의 상태를 관리하고 복제본 수를 조절하여 가용성을 보장합니다. 다음과 같이 YAML 파일을 작성할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1709388557016&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;apiVersion: apps/v1
kind: Deployment
metadata:
  name: example-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: container-name
        image: container-image
        ports:
        - containerPort: 8080&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;apiVersion : Deployment의 경우 apps/v1&lt;/li&gt;
&lt;li&gt;replicas : 실행할 Pod의 복제본 수&lt;/li&gt;
&lt;li&gt;selector : Deployment가 관리할 Pod를 선택하는데 사용되는 레이블 셀렉터&lt;/li&gt;
&lt;li&gt;template : 생성될 Pod의 Template&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Service는 Pod 집합에 대한 안정적인 접근 포인트를 제공하며, Service를 사용하면 Pod를 직접 노출하지 않고도 외부 또는 내부에서 Pod에 접근할 수 있습니다. 다음과 같이 YAML 파일을 작성할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1709388706992&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;apiVersion: v1
kind: Service
metadata:
  name: example-service
spec:
  selector:
    app: myapp
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
  type: LoadBalancer&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;selector : Service가 포워딩할 트래픽을 받는 Pod를 결정&lt;/li&gt;
&lt;li&gt;ports : Service가 수신하는 포트와 Pod로 포워딩하는 targetPort를 정의&lt;/li&gt;
&lt;li&gt;type : Sercice 타입 지정함. LoadBalancer는 클라우드 제공자의 로드 밸런서를 사용하여 Pod를 인터넷에 노출&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ConfigMap은 구성 데이터를 Key-Value 쌍으로 저장하여 애플리케이션에 전달하는 데 사용됩니다. 애플리케이션 설정, 호스트 이름, 데이터베이스 URL 등을 Pod에 전달할 수 있습니다. 다음과 같이 YAML 파일을 작성할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1709388875188&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;apiVersion: v1
kind: ConfigMap
metadata:
  name: example-configmap
data:
  key1: value1
  key2: value2&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;data : 구성 데이터를 Key-Value 쌍으로 저장&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Secret은 비밀번호, OAuth 토큰, ssh 키와 같은 민감한 정보를 저장하는데 사용되며, Secret은 ConfigMap과 유사하지만 민간하 정보를 보호하기 위해 사용됩니다. 다음과 같이 YAML 파일을 작성할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1709388972939&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;apiVersion: v1
kind: Secret
metadata:
  name: example-secret
type: Opaque
data:
  password: cGFzc3dvcmQ=&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;data : 민감한 정보를 base64 인코딩된 형태로 저장&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PVC는 Storage 리소스를 동적으로 요청하는 방법을 제공하며, PVC를 사용하면 애플리케이션이 필요로 하는 Storage를 추상화하여 사용할 수 있습니다. 다음과 같이 YAML 파일을 작성할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1709389053087&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: example-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;accessModes : PVC가 Storage에 접근하는 방식입니다. 예를 들어, ReadWriteOnce는 볼륨을 단일 노드에서 읽기/쓰기 모드로 마운트할 수 있음을 의미&lt;/li&gt;
&lt;li&gt;resources : 요청된 Storage 양을 의미&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이상으로, 쿠버네티스에서 YAML 파일을 작성하는 방법에 대해서 알아보았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;감사드립니다.&lt;/p&gt;</description>
      <category>Kubernetes</category>
      <category>ConfigMap</category>
      <category>deployment</category>
      <category>kubernetes</category>
      <category>POD</category>
      <category>PVC</category>
      <category>Secret</category>
      <category>service</category>
      <category>yaml</category>
      <author>Minima</author>
      <guid isPermaLink="true">https://maxima-lab.tistory.com/74</guid>
      <comments>https://maxima-lab.tistory.com/entry/Kubernetes-YAML-Pod-Deployment-Service-ConfigMap-Secret-PVC#entry74comment</comments>
      <pubDate>Sat, 2 Mar 2024 23:26:34 +0900</pubDate>
    </item>
    <item>
      <title>[Kubernetes] Container와 POD 개념 설명 및 사용 방법</title>
      <link>https://maxima-lab.tistory.com/entry/Kubernetes-Container-POD-Execution</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요, 오늘은 쿠버네티스에서 Container와 Pod의 개념에 대해서 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 Container (컨테이너)에 대해서 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컨테이너는 애플리케이션 실행에 필요한 코드와 모든 종속성을 포함하는 독립적인 실행 환경입니다. 컨터이너화된 애플리케이션은 다양한 컴퓨터 환경에서 일관된 방식으로 실행될 수 있습니다. 이는 다음과 같은 장점을 가지고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;환경 일관성 : 개발, 테스트, Production 환경 간에 일관성을 제공합니다.&lt;/li&gt;
&lt;li&gt;효율성 : 더 적은 시스템 리소를 사용하면서 격리된 환경을 제공합니다.&lt;/li&gt;
&lt;li&gt;이식성 : 어떤 환경에서든 동일하게 실해될 수 있어, 클라우드 환경과 온프레미스 환경 간 이동이 용이합니다.&lt;/li&gt;
&lt;li&gt;빠른 배포 및 시작 시간 : 애플리케이션과 서비스를 빠르게 시작하고, 확장 가능합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이어서, Pod (포드)에 대해서 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Pod는 쿠버네티스의 기본적인 배포 단위로, 하나 이상의 컨테이너를 포함할 수 있습니다. Pod 내의 컨테이너는 스토리지, 네트워크를 공유하고, 동일한 노드에서 스케줄링되어 실행됩니다. 이는 다음과 같은 특정을 포함하고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;공유된 네트워크와 Storage : Pod 내의 컨테이너는 같은 IP 주소와 포트 공간을 공유하고, 서로를 localhost를 통해 찾을 수 있습니다. 또한, 볼륨을 공유하여 데이터를 교환할 수 있습니다.&lt;/li&gt;
&lt;li&gt;생명주기 관리 : Pod는 컨테이너의 집합으로, 포드가 시작되거나 종료될때 Pod 내의 모든 컨테이너도 함께 시작되고 종료됩니다.&lt;/li&gt;
&lt;li&gt;높은 결합도 작업의 쉬운 관리 : 밀접하게 관련된 컨테이너를 함께 포드에 배치함으로써 관리를 용이하게 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음은, Pod를 활용해서 단일 컨테이너를 실행하는 코드 예시 입니다. 이는 nginx를 사용해서 웹서버를 실행하는 컨테이너를 포드 안에 배치하는 YAML 파일 예시입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1709381197470&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  labels:
    app: nginx
spec:
  containers:
  - name: nginx-container
    image: nginx:latest
    ports:
    - containerPort: 80&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 YAML 파일을 구성하는 요소들에 대한 설명은 다음과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;apiVersion : 쿠버네티스 API 버전 (보통 v1을 사용)&lt;/li&gt;
&lt;li&gt;kind : 생성하려는 쿠버네티스 리소스 종류&lt;/li&gt;
&lt;li&gt;metadata : 리소스에 대한 메타데이터&lt;/li&gt;
&lt;li&gt;spec : Pod에 대한 명세입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 YAML 파일 (nginx-pod.yaml)을 쿠버네티스 클러스터에 적용하기 위해서는 다음과 같은 명령어를 실행합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1709381396631&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;kubectl apply -f nginx-pod.yaml&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쿠버네티스 클러스터에서 포드 상태를 확인하기 위해서는 다음 명령어를 사용 가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1709381443052&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;kubectl get pods&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-03-02 at 9.11.48 PM.png&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;78&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c3IdbA/btsFofp6J1g/kjP5PiKEYNtNWGTe0WnqKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c3IdbA/btsFofp6J1g/kjP5PiKEYNtNWGTe0WnqKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c3IdbA/btsFofp6J1g/kjP5PiKEYNtNWGTe0WnqKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc3IdbA%2FbtsFofp6J1g%2FkjP5PiKEYNtNWGTe0WnqKk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;78&quot; data-filename=&quot;Screenshot 2024-03-02 at 9.11.48 PM.png&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;78&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쿠버네티스에서 포드를 삭제하는 명령은 다음과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1709381594168&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;kubectl delete pod nginx-pod&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 명령어와 같이 특정 Pod의 이름을 사용하여 삭제할 수도 있지만, 다음과 같이 특정 레이블(selector)에 일치하는 모든 포드를 삭제하는 방법은 다음과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1709381675203&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;kubectl delete pods -l app=nginx&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 명령어는 app=nginx 레이블을 가진 모든 Pod를 삭제하는 명령어 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이상으로 Container와 Pod의 개념에 대해서 알아보고 사용하는 방법에 대해서 알아보았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;감사드립니다.&lt;/p&gt;</description>
      <category>Kubernetes</category>
      <category>container</category>
      <category>kubernetes</category>
      <category>nginx</category>
      <category>POD</category>
      <category>yaml</category>
      <author>Minima</author>
      <guid isPermaLink="true">https://maxima-lab.tistory.com/73</guid>
      <comments>https://maxima-lab.tistory.com/entry/Kubernetes-Container-POD-Execution#entry73comment</comments>
      <pubDate>Sat, 2 Mar 2024 21:16:22 +0900</pubDate>
    </item>
    <item>
      <title>[Docker] NVIDIA Container Toolkit 설치하는 방법</title>
      <link>https://maxima-lab.tistory.com/entry/Docker-NVIDIA-Container-Toolkit-Installation</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요, 오늘은 NVIDIA Container Toolkit을 설치하는 방법에 대해서 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NVIDIA Container&amp;nbsp;Toolkit를 설치하는 목적은 Docker 컨테이너 내에서 NVIDIA GPU를 효율적으로 활용할 수 있게 하여 GPU 가속화 애플리케이션의 배포와 실행을 용이하기 하기 위해 사용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NVIDIA Docker를 설치 하기 위해 호스트 시스템에 설치되어 있어야 하는 항목들은 다음과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;NVIDIA GPU Driver 설치&lt;/li&gt;
&lt;li&gt;Docker Engine 설치&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 항목들 중 NVIDIA GPU Driver와 Docker Container Toolkit이 설치되어 있는 상황에서 NVIDIA Container Toolkit을 설치하는 방법에 대해서 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1709040465574&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1709040481602&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo apt-get update
sudo apt-get install -y nvidia-docker2&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 명령어를 실행 후 다음과 같이 Docker 데몬 설정을 업데이트 합니다. (/etc/docker/daemon.json)&lt;/p&gt;
&lt;pre id=&quot;code_1709040907167&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
    &quot;runtimes&quot;: {
        &quot;nvidia&quot;: {
            &quot;path&quot;: &quot;nvidia-container-runtime&quot;,
            &quot;runtimeArgs&quot;: []
        }
    },
    &quot;default-runtime&quot;: &quot;nvidia&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막으로 Docker 서비스를 재시작 합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1709040502862&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo systemctl restart docker&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정상적으로, Docker Container Toolkit이 설치되었는 지 다음과 같은 명령어로 확인할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1709041188593&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker run --rm nvidia/cuda:11.0-base nvidia-smi&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에서 호스트 시스템의 NVIDIA Driver 버전에 따라서 CUDA 버전을 다르게 확인할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 Docker 데몬 설정을 업데이트하는 이유는 &quot;nvidia-container-runtime&quot;을 Docker 기본 런타임으로 설정하므로써, 모든 Container가 자동적으로 NVIDIA GPU에 접근할 수 있게 됩니다. 이는 GPU를 사용하는 애플리케이션을 배포할 때 추가 구성 없이 GPU 가속을 할 수 있게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이상으로, NVIDIA&amp;nbsp;Container&amp;nbsp;Toolkit&amp;nbsp;설치하는&amp;nbsp;방법에 대해서 알아보았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;감사드립니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Docker</category>
      <category>Docker</category>
      <category>docker engine</category>
      <category>nvidia container toolkit</category>
      <category>NVIDIA GPU Driver</category>
      <author>Minima</author>
      <guid isPermaLink="true">https://maxima-lab.tistory.com/72</guid>
      <comments>https://maxima-lab.tistory.com/entry/Docker-NVIDIA-Container-Toolkit-Installation#entry72comment</comments>
      <pubDate>Tue, 27 Feb 2024 22:43:05 +0900</pubDate>
    </item>
    <item>
      <title>[Python] 쉘 스크립트 (배치) 파일 내부에서 쉘 스크립트 (배치) 파일 실행하는 방법</title>
      <link>https://maxima-lab.tistory.com/entry/Python-sh-bat-Execution2</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요, 오늘은 쉘 스크립트 파일 &amp;amp; 배치 파일에서 각각 쉘 스크립트 파일들과 배치 파일들을 실행하는 방법에 대해서 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저, 쉘 스크립트 파일에서 쉘 스크립트 파일들을 실행하는 예제입니다. (순차 실행)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1709039295538&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;./script1.sh
./script2.sh&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 코드는 2개의 쉘 스크립트 파일들을 순차적으로 실행하는 쉘 스크립트 파일입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음은 병렬 실행하는 코드입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1709039368511&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;./script1.sh &amp;amp;
./script2.sh &amp;amp;
wait&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;순차 실행하는 쉘 스크립트 파일과 다르게 각 쉘 스크립트 파일 실행 시 맨 끝에 &quot;&amp;amp;&quot;가 붙게 되며 2개의 쉘 스크립트 파일이 실행이 끝날때 까지 기다리기 위해 &quot;wait&quot; 명령어를 사용하게 됩니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이어서, 배치 파일(.bat)의 경우에 순차 실행 및 병렬 실행하는 코드에 대해서 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1709039488474&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@echo off
call batch1.bat
call batch2.bat&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1709039505602&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@echo off
start batch1.bat
start batch2.bat&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 코드들은 순서대로 각각 순차 실행 및 병렬 실행하는 .bat 파일들입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이상으로, 쉘 스크립트 파일 및 배치 파일 내부에서 각각 쉘 스크립트 파일들과 배치 파일들을 실행하는 방법에 대해서 알아보았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;감사드립니다.&lt;/p&gt;</description>
      <category>Python</category>
      <category>Bat</category>
      <category>Python</category>
      <category>sh</category>
      <category>배치</category>
      <category>병렬</category>
      <category>순차</category>
      <category>쉘</category>
      <author>Minima</author>
      <guid isPermaLink="true">https://maxima-lab.tistory.com/71</guid>
      <comments>https://maxima-lab.tistory.com/entry/Python-sh-bat-Execution2#entry71comment</comments>
      <pubDate>Tue, 27 Feb 2024 22:13:59 +0900</pubDate>
    </item>
    <item>
      <title>[Python] 쉘 스크립트 파일(.sh) &amp;amp; 배치 파일(.bat) 작성 및 실행하는 방법</title>
      <link>https://maxima-lab.tistory.com/entry/Python-sh-bat-Execution</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요, 오늘은 쉘 스크립트 &amp;amp; 배치 파일을 작성하고 실행하는 방법에 대해서 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저, 쉘 스크립트 파일을 생성합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1709036815781&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;touch run_script.sh&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작성한 쉘 스크립트 파일에 실행 권한을 부여합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1709037063252&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;chmod +x run_script.sh&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최종적으로 다음 명령어를 통해 쉘 스크립트 파일을 실행할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1709037226280&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;./run_script.sh&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 쉘 스크립트 파일을 다음과 같이 구성합니다. (run_script.sh)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 코드는 각 script 파일을 순차적으로 실행하는 쉘 스크립트 구성입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1709037354239&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;python script_1.py arg_1-1 arg_1-2
python script_2.py arg_2-1 arg_2-2 arg_2-3
python script_3.py arg_3-1 arg_3-2 arg_3-3 arg_3-4&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 script.py 파일은 다음과 같이 동일하게 구성하였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1709037446267&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import sys

# 명령줄 인자 출력
print(&quot;인자:&quot;, sys.argv[1:])&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 쉘 스크립트 파일을 활용하여 실행한 결과는 다음과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-02-27 at 9.38.21 PM.png&quot; data-origin-width=&quot;812&quot; data-origin-height=&quot;132&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AOZOa/btsFh52PgJg/10WgWunwEhO33uXxj7lxOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AOZOa/btsFh52PgJg/10WgWunwEhO33uXxj7lxOk/img.png&quot; data-alt=&quot;쉘 스크립트 파일 실행 결과 (순차 실행)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AOZOa/btsFh52PgJg/10WgWunwEhO33uXxj7lxOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAOZOa%2FbtsFh52PgJg%2F10WgWunwEhO33uXxj7lxOk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;98&quot; data-filename=&quot;Screenshot 2024-02-27 at 9.38.21 PM.png&quot; data-origin-width=&quot;812&quot; data-origin-height=&quot;132&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;쉘 스크립트 파일 실행 결과 (순차 실행)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 쉘 스크립트 파일은 각 script 파일을 병렬적으로 실행하도록 구성한 코드 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1709037589043&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;python script_1.py arg_1-1 arg_1-2 &amp;amp;
python script_2.py arg_2-1 arg_2-2 arg_2-3 &amp;amp;
python script_3.py arg_3-1 arg_3-2 arg_3-3 arg_3-4 &amp;amp;
wait&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 코드에서 각 명령어 끝에 &quot;&amp;amp;&quot;를 붙이게 되면 병렬적으로 실행하게 되고 &quot;wait&quot; 을 붙이게 되면 모든 작업이 완료될때 까지 기다리게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 쉘 스크립트 파일을 활용하여 실행한 결과는 다음과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-02-27 at 9.42.47 PM.png&quot; data-origin-width=&quot;812&quot; data-origin-height=&quot;132&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cCafzv/btsFm4OVrrP/wAG2RP2MzA3OuTXNRqFRxk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cCafzv/btsFm4OVrrP/wAG2RP2MzA3OuTXNRqFRxk/img.png&quot; data-alt=&quot;쉘 스크립트 파일 실행 결과 (병렬 실행)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cCafzv/btsFm4OVrrP/wAG2RP2MzA3OuTXNRqFRxk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcCafzv%2FbtsFm4OVrrP%2FwAG2RP2MzA3OuTXNRqFRxk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;98&quot; data-filename=&quot;Screenshot 2024-02-27 at 9.42.47 PM.png&quot; data-origin-width=&quot;812&quot; data-origin-height=&quot;132&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;쉘 스크립트 파일 실행 결과 (병렬 실행)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이어서, 배치 파일 (.bat)에서 순차 실행 및 병렬 실행하는 방법에 대해서 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1709038144922&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@echo off
python script_1.py arg_1-1 arg_1-2
python script_2.py arg_2-1 arg_2-2 arg_2-3
python script_3.py arg_3-1 arg_3-2 arg_3-3 arg_3-4&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1709038167603&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@echo off
start python script_1.py arg_1-1 arg_1-2
start python script_2.py arg_2-1 arg_2-2 arg_2-3
start python script_3.py arg_3-1 arg_3-2 arg_3-3 arg_3-4&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;병렬 실행하기 위해서 .sh에서 &quot;&amp;amp;&quot;을 사용하는 것과 달리 &quot;start&quot;를 사용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이상으로, 쉘 스크립트 파일 및 배치 파일을 작성하는 방법에 대해서 알아보았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;감사드립니다.&lt;/p&gt;</description>
      <category>Python</category>
      <category>Bat</category>
      <category>Python</category>
      <category>sh</category>
      <category>배치</category>
      <category>쉘</category>
      <author>Minima</author>
      <guid isPermaLink="true">https://maxima-lab.tistory.com/70</guid>
      <comments>https://maxima-lab.tistory.com/entry/Python-sh-bat-Execution#entry70comment</comments>
      <pubDate>Tue, 27 Feb 2024 21:51:51 +0900</pubDate>
    </item>
    <item>
      <title>[Docker] Docker Image 저장 및 로드 하는 방법</title>
      <link>https://maxima-lab.tistory.com/entry/Docker-Image-Save-Load</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요, 오늘은 Docker Image를 로컬에 저장하고 저장된 Docker Image에 대해 로드 하는 방법에 대해서 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저, Docker Image를 로컬에 저장하기 위해 현재 보유하고 있는 Docker Image 목록을 확인합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1708957428236&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker images&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-02-26 at 11.24.21 PM.png&quot; data-origin-width=&quot;2532&quot; data-origin-height=&quot;74&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cduxlQ/btsFhUfosAx/LuE9ncct9awbsGMOM7K131/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cduxlQ/btsFhUfosAx/LuE9ncct9awbsGMOM7K131/img.png&quot; data-alt=&quot;docker images 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cduxlQ/btsFhUfosAx/LuE9ncct9awbsGMOM7K131/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcduxlQ%2FbtsFhUfosAx%2FLuE9ncct9awbsGMOM7K131%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2532&quot; height=&quot;74&quot; data-filename=&quot;Screenshot 2024-02-26 at 11.24.21 PM.png&quot; data-origin-width=&quot;2532&quot; data-origin-height=&quot;74&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;docker images 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;docker 이미지를 저장하기 위해서 다음 같은 명령어를 사용할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1708957550084&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker save -o &amp;lt;파일명&amp;gt;.tar &amp;lt;이미지 이름&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1708957581987&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker save -o vuedocker_save.tar vuedocker:latest&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 명령어를 통해 &quot;vuedocker:latest&quot; Docker Imagerk vuedocker_save.tar 파일의 형태로 저장되게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이어서, 로컬에 저장된 docker 이미지를 불러오기 위해서 다음 같은 명령어를 사용할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1708957703194&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker load -i &amp;lt;파일명&amp;gt;.tar&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1708957735955&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker load -i vuedocker_save.tar&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이상으로, Docker Image를 로컬에 저장하고 불러오는 방법에 대해 알아보았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;감사드립니다.&lt;/p&gt;</description>
      <category>Docker</category>
      <category>Docker</category>
      <category>docker image</category>
      <category>Load</category>
      <category>SAVE</category>
      <author>Minima</author>
      <guid isPermaLink="true">https://maxima-lab.tistory.com/69</guid>
      <comments>https://maxima-lab.tistory.com/entry/Docker-Image-Save-Load#entry69comment</comments>
      <pubDate>Mon, 26 Feb 2024 23:32:22 +0900</pubDate>
    </item>
    <item>
      <title>[Docker] Dockerfile를 사용해서 Vue.js 프로젝트를 실행하는 방법</title>
      <link>https://maxima-lab.tistory.com/entry/Docker-Dockerfile-Vuejs</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요, 오늘을 Dockerfile를 사용해서 Vue.js 프로젝트를 실행하는 방법에 대해서 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저, Vue.js 프로젝트를 생성합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1708955559846&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;vue create vuedocker --no-git&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이어서, 해당 디렉토리로 이동 후 다음과 같은 코드를 사용해서 Dockerfile을 생성합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1708955622307&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cd vuedocker
touch Dockerfile&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 코드를 통해 생성된 Dockerfile을 다음과 같은 코드로 작성합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1708955673220&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# Docker 이미지를 구성하기 위해 베이스 이미지로 Node.js의 최신 버전을 사용
FROM node:latest

# 컨테이너 내부에서 /app 디렉토리를 작업 디렉토리로 설정
WORKDIR /app

# package.json 및 package-lock.json(있는 경우) 파일을 현재 디렉토리(작업 디렉토리 /app)로 복사 및 설치
COPY package*.json ./
RUN npm install

# Dockerfile이 위치한 디렉토리의 모든 파일과 디렉토리를 컨테이너의 작업 디렉토리(/app)로 복사
COPY . .

# 프로젝트를 빌드하기 위해 package.json에 정의된 build 스크립트를 실행
RUN npm run build

# http 서버를 전역으로 설치 후 빌드된 정적 파일을 호스팅
RUN npm install -g http-server

# 컨테이너의 8080 포트를 노출
EXPOSE 8080

CMD [ &quot;http-server&quot;, &quot;dist&quot; ]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1708955862773&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker build -t &quot;docker_image_name_by_user&quot; .&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;docker image 이름을 유저가 직접 설정할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1708955888263&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker run -d -p 8080:8080 --name &quot;container_name_by_user&quot; &quot;docker_image_name_by_user&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마찬가지로, conatiner 이름도 유저가 직접 설정 가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행 결과는 다음과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-02-26 at 11.06.12 PM.png&quot; data-origin-width=&quot;2846&quot; data-origin-height=&quot;1914&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IQMMb/btsFm7qMar3/b2NSEmpFsRUjPhp3cWGZWk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IQMMb/btsFm7qMar3/b2NSEmpFsRUjPhp3cWGZWk/img.png&quot; data-alt=&quot;Docker Image에 실행 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IQMMb/btsFm7qMar3/b2NSEmpFsRUjPhp3cWGZWk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIQMMb%2FbtsFm7qMar3%2Fb2NSEmpFsRUjPhp3cWGZWk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2846&quot; height=&quot;1914&quot; data-filename=&quot;Screenshot 2024-02-26 at 11.06.12 PM.png&quot; data-origin-width=&quot;2846&quot; data-origin-height=&quot;1914&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Docker Image에 실행 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금까지, Dockerfile을 사용해서 Vue.js 프로젝트를 생성하는 방법에 대해서 알아보았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;감사드립니다.&lt;/p&gt;</description>
      <category>Docker</category>
      <category>Docker</category>
      <category>Dockerfile</category>
      <category>http-server</category>
      <category>Node</category>
      <category>vue.js</category>
      <category>도커</category>
      <author>Minima</author>
      <guid isPermaLink="true">https://maxima-lab.tistory.com/68</guid>
      <comments>https://maxima-lab.tistory.com/entry/Docker-Dockerfile-Vuejs#entry68comment</comments>
      <pubDate>Mon, 26 Feb 2024 23:08:25 +0900</pubDate>
    </item>
    <item>
      <title>[Web Programming] Modal Dialog 커스터마이징 하는 방법</title>
      <link>https://maxima-lab.tistory.com/entry/Web-Programming-Modal-Dialog-Customizing</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요, 오늘은 Modal Dialog 기능들에 대해서 커스터마이징 하는 방법에 대해서 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 기능을 구현하기 위해 편의상 html, css, js 파일에 대해 다음과 같이 구성하였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;index.html&lt;/li&gt;
&lt;li&gt;style.css&lt;/li&gt;
&lt;li&gt;script.js&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 파일들로 구성된 결과 이미지에 대해서 먼저 보도록 하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_Screenshot 2024-02-23 at 11.13.13 PM.png&quot; data-origin-width=&quot;2520&quot; data-origin-height=&quot;1576&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/upZRc/btsFhTTVh9E/1nZ8UnMuA6Hvvf3MH1861k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/upZRc/btsFhTTVh9E/1nZ8UnMuA6Hvvf3MH1861k/img.png&quot; data-alt=&quot;Modal Dialog 실행 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/upZRc/btsFhTTVh9E/1nZ8UnMuA6Hvvf3MH1861k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FupZRc%2FbtsFhTTVh9E%2F1nZ8UnMuA6Hvvf3MH1861k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;375&quot; data-filename=&quot;edited_Screenshot 2024-02-23 at 11.13.13 PM.png&quot; data-origin-width=&quot;2520&quot; data-origin-height=&quot;1576&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Modal Dialog 실행 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 index.html 코드는 다음과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1708697544495&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;en&quot;&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&amp;gt;
&amp;lt;title&amp;gt;Custom Modal Example&amp;lt;/title&amp;gt;
&amp;lt;link rel=&quot;stylesheet&quot; href=&quot;style.css&quot;&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;


&amp;lt;button id=&quot;openModalCenterBtn&quot;&amp;gt;모달 실행&amp;lt;/button&amp;gt;

&amp;lt;div id=&quot;myModal&quot; class=&quot;modal&quot;&amp;gt;
  &amp;lt;div class=&quot;modal-content&quot;&amp;gt;
    &amp;lt;span class=&quot;close&quot;&amp;gt;&amp;amp;times;&amp;lt;/span&amp;gt;
    &amp;lt;p&amp;gt;사용자 정의 메시지를 입력하세요...&amp;lt;/p&amp;gt;
    &amp;lt;button id=&quot;okBtn&quot; style=&quot;width: 50px;&quot;&amp;gt;확인&amp;lt;/button&amp;gt;
    &amp;lt;button id=&quot;cancelBtn&quot; style=&quot;width: 50px;&quot;&amp;gt;취소&amp;lt;/button&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;

&amp;lt;script src=&quot;script.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 코드에서 button은 총 3개로 구성되어 있으며, 다음과 같습니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;모달 실행&lt;/li&gt;
&lt;li&gt;확인&lt;/li&gt;
&lt;li&gt;취소&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이어서, style.css 코드는 다음과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1708697801818&quot; class=&quot;css&quot; data-ke-language=&quot;css&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/* 모달 스타일 */
.modal {
    display: none; /* 기본적으로 숨김 */
    position: fixed; /* 화면에 고정, 필요시 absolute로 변경 */
    left: 50%;
    top: 50%;
    transform: translate(-50%, -50%); /* 중앙 정렬 */
    width: 400px; /* 너비 */
    height: 200px; /* 높이 */
    background-color: #fefefe;
    padding: 20px;
    border: 1px solid #888;
    z-index: 1; /* 다른 요소 위에 표시 */
  }
  
  /* 닫기 버튼 스타일 */
  .close {
    color: #aaa;
    float: right;
    font-size: 28px;
    font-weight: bold;
  }
  
  .close:hover,
  .close:focus {
    color: black;
    text-decoration: none;
    cursor: pointer;
  }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막으로, script.js 코드입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1708697864200&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;document.addEventListener(&quot;DOMContentLoaded&quot;, function() {
    var modal = document.getElementById(&quot;myModal&quot;);
    var btnCenter = document.getElementById(&quot;openModalCenterBtn&quot;);
    var btnOkay = document.getElementById(&quot;okBtn&quot;);
    var btnCancel = document.getElementById(&quot;cancelBtn&quot;);
    var span = document.getElementsByClassName(&quot;close&quot;)[0];
  
    btnCenter.onclick = function() {
      modal.style.display = &quot;block&quot;;
      modal.style.position = &quot;fixed&quot;;
      modal.style.left = &quot;50%&quot;;
      modal.style.top = &quot;50%&quot;;
      modal.style.transform = &quot;translate(-50%, -50%)&quot;;
    }
  
    span.onclick = function() {
      modal.style.display = &quot;none&quot;;
    }

    btnOkay.onclick = function() {
        modal.style.display = &quot;none&quot;;
    }

    btnCancel.onclick = function() {
        modal.style.display = &quot;none&quot;;
    }
  
  });&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모달 실행 시 화면 중앙에서 실행되도록 하였으며, 최초에 .modal을 &quot;none&quot; 상태 였다가 모달 실행 버튼 클릭 시 &quot;block&quot; 상태로 바뀌면서 Modal Dialog가 실행되게 됩니다. 추가적으로, 확인 및 취소 버튼 클릭에 따라 &quot;none&quot; 상태로 변화하도록 하였습니다. 필요에 따라, btnOkay.onclick과 btnCancel.onclick 부분을 추가 Customize 할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이상으로, Modal Dialog 기능에 대해서 커스터마이징 하는 방법에 대해서 알아보았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;감사드립니다.&lt;/p&gt;</description>
      <category>Web Programming</category>
      <category>CSS</category>
      <category>Customizing</category>
      <category>dialog</category>
      <category>HTML</category>
      <category>JavaScript</category>
      <category>modal</category>
      <category>Web Programming</category>
      <category>웹 프로그래밍</category>
      <author>Minima</author>
      <guid isPermaLink="true">https://maxima-lab.tistory.com/67</guid>
      <comments>https://maxima-lab.tistory.com/entry/Web-Programming-Modal-Dialog-Customizing#entry67comment</comments>
      <pubDate>Fri, 23 Feb 2024 23:27:18 +0900</pubDate>
    </item>
    <item>
      <title>[Web Programming] Vue.js 사용하여 그림판 기능 구현</title>
      <link>https://maxima-lab.tistory.com/entry/Web-Programming-Vue-Drawing-Tool</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요, 오늘은 Vue.js 프레임 워크를 사용해서 간단판 그림판 기능을 구현하는 방법에 대해서 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간단한 그림판 기능을 구현하기 위한 항목들은 다음과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Canvas 그리기&lt;/li&gt;
&lt;li&gt;모두 지우기&lt;/li&gt;
&lt;li&gt;Pen 두께 증가&lt;/li&gt;
&lt;li&gt;Pen 두께 감소&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Vue.js 프레임워크를 활용하기 위해 프로젝트를 생성해줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생성된 프로젝트 내 src/App.vue 파일을 다음과 같이 수정해줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1708141031094&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;template&amp;gt;
  &amp;lt;div id=&quot;app&quot;&amp;gt;
    &amp;lt;canvas
      ref=&quot;canvas&quot;
      width=&quot;800&quot;
      height=&quot;800&quot;
      @mousedown=&quot;startDrawing&quot;
      @mousemove=&quot;draw&quot;
      @mouseup=&quot;stopDrawing&quot;
      @mouseout=&quot;stopDrawing&quot;
    &amp;gt;&amp;lt;/canvas&amp;gt;

    &amp;lt;div id=&quot;designtool&quot;&amp;gt;
      &amp;lt;button @click=&quot;buttonErase&quot;&amp;gt;모두 지우기&amp;lt;/button&amp;gt;
      &amp;lt;button @click=&quot;increaseThickness&quot;&amp;gt;두껍게&amp;lt;/button&amp;gt;
      &amp;lt;button @click=&quot;decreaseThickness&quot;&amp;gt;얇게&amp;lt;/button&amp;gt;
    &amp;lt;/div&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/template&amp;gt;

&amp;lt;script&amp;gt;
export default {
  name: &quot;App&quot;,
  data() {
    return {
      drawing: false,
      context: null,
      lastX: 0,
      lastY: 0,
    };
  },
  mounted() {
    this.initCanvas();
  },
  methods: {
    initCanvas() {
      const canvas = this.$refs.canvas;
      this.context = canvas.getContext(&quot;2d&quot;);
      this.context.strokeStyle = &quot;#000&quot;;
      this.context.lineWidth = 5; 
    },
    startDrawing(e) {
      this.drawing = true;
      this.lastX = e.offsetX;
      this.lastY = e.offsetY;
    },
    draw(e) {
      if (!this.drawing) return;
      this.context.beginPath();
      this.context.moveTo(this.lastX, this.lastY);
      this.context.lineTo(e.offsetX, e.offsetY);
      this.context.stroke();
      this.lastX = e.offsetX;
      this.lastY = e.offsetY;
    },
    stopDrawing() {
      this.drawing = false;
    },

    buttonErase() {
      this.context.clearRect(0, 0, this.$refs.canvas.width, this.$refs.canvas.height);
    },

    increaseThickness() {
      const canvas = this.$refs.canvas;
      this.context = canvas.getContext(&quot;2d&quot;);
      this.context.lineWidth += 1; 
    },

    decreaseThickness() {
      const canvas = this.$refs.canvas;
      this.context = canvas.getContext(&quot;2d&quot;);
      if (this.context.lineWidth &amp;gt; 1) {
        this.context.lineWidth -= 1; // 
      }
    },

  },
};
&amp;lt;/script&amp;gt;

&amp;lt;style scoped&amp;gt;
header {
  line-height: 1.5;
}

.logo {
  display: block;
  margin: 0 auto 2rem;
}

@media (min-width: 1024px) {
  header {
    display: flex;
    place-items: center;
    padding-right: calc(var(--section-gap) / 2);
  }

  .logo {
    margin: 0 2rem 0 0;
  }

  header .wrapper {
    display: flex;
    place-items: flex-start;
    flex-wrap: wrap;
  }
}

canvas {
  border: 2px solid white;
  background-color: green;
  cursor: pointer;
}

button {
  width: 200px;
  height: 50px;
}

&amp;lt;/style&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 코드의 결과로 실행한 초기 화면 결과는 다음과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-02-17 at 12.38.19 PM.png&quot; data-origin-width=&quot;2696&quot; data-origin-height=&quot;1842&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PaEA3/btsEZmo1pa5/cXH3sdw9QD8ZzfOfTKMKw0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PaEA3/btsEZmo1pa5/cXH3sdw9QD8ZzfOfTKMKw0/img.png&quot; data-alt=&quot;실행 결과 이미지&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PaEA3/btsEZmo1pa5/cXH3sdw9QD8ZzfOfTKMKw0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPaEA3%2FbtsEZmo1pa5%2FcXH3sdw9QD8ZzfOfTKMKw0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;410&quot; data-filename=&quot;Screenshot 2024-02-17 at 12.38.19 PM.png&quot; data-origin-width=&quot;2696&quot; data-origin-height=&quot;1842&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;실행 결과 이미지&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에서 모두 지우기, 두껍게, 얇게 버튼에 대한 기능 동작에 대한 script 코드에 대해서 자세히 설명드리겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3가지 버튼에 대한 설명에 앞서, Canvas 위에 Pen으로 그리는 기능에 대한 설명입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1708141977505&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    initCanvas() {
      const canvas = this.$refs.canvas;
      this.context = canvas.getContext(&quot;2d&quot;);
      this.context.strokeStyle = &quot;#000&quot;; // 
      this.context.lineWidth = 5; // 
    },
    startDrawing(e) {
      this.drawing = true;
      this.lastX = e.offsetX;
      this.lastY = e.offsetY;
    },
    draw(e) {
      if (!this.drawing) return;
      this.context.beginPath();
      this.context.moveTo(this.lastX, this.lastY);
      this.context.lineTo(e.offsetX, e.offsetY);
      this.context.stroke();
      this.lastX = e.offsetX;
      this.lastY = e.offsetY;
    },
    stopDrawing() {
      this.drawing = false;
    },&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 코드에서 initCanvas() 함수에 대해 최초에 mount를 적용하고, startDrawing, draw, stopDrawing 함수에 걸쳐서 Pen을 사용해서 Canvas에서 그릴 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이어서, 모두 지우기 버튼에 대한 함수 설명은 다음과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1708142138657&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    buttonErase() {
      this.context.clearRect(0, 0, this.$refs.canvas.width, this.$refs.canvas.height);
    },&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모두 지우기 버튼을 누르게 되면 위의 함수가 실행되면서 canvas 내부의 모든 그림이 지워지게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이어서, &quot;두껍게&quot; &amp;amp; &quot;얇게&quot; 버튼에 대한 함수 설명은 다음과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1708142330029&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    increaseThickness() {
      const canvas = this.$refs.canvas;
      this.context = canvas.getContext(&quot;2d&quot;);
      this.context.strokeStyle = &quot;#000&quot;;
      this.context.lineWidth += 1; 
    },

    decreaseThickness() {
      const canvas = this.$refs.canvas;
      this.context = canvas.getContext(&quot;2d&quot;);
      this.context.strokeStyle = &quot;#000&quot;;
      if (this.context.lineWidth &amp;gt; 1) {
        this.context.lineWidth -= 1;
      }
    },&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;두껍게&quot;, &quot;얇게&quot; 버튼을 누르게 되면서 각각 increaseThickness, decreaseThickness 함수가 실행되면서 lineWidth를 1씩 증가 또는 감소시키게 됩니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 기능들을 활용해서 그린 결과는 다음과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-02-17 at 1.00.34 PM.png&quot; data-origin-width=&quot;2696&quot; data-origin-height=&quot;1842&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQx4Bs/btsEV8ZWkvV/Fb6Amp3TJ5gU96Idw2K160/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQx4Bs/btsEV8ZWkvV/Fb6Amp3TJ5gU96Idw2K160/img.png&quot; data-alt=&quot;순서대로, 초기 &amp;amp;amp; 두껍게 &amp;amp;amp; 얇게 그린 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQx4Bs/btsEV8ZWkvV/Fb6Amp3TJ5gU96Idw2K160/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQx4Bs%2FbtsEV8ZWkvV%2FFb6Amp3TJ5gU96Idw2K160%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;410&quot; data-filename=&quot;Screenshot 2024-02-17 at 1.00.34 PM.png&quot; data-origin-width=&quot;2696&quot; data-origin-height=&quot;1842&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;순서대로, 초기 &amp;amp; 두껍게 &amp;amp; 얇게 그린 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이상으로, Vue.js 프레임워크를 활용해서 간단한 그림판 기능을 구현해보았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;감사드립니다.&lt;/p&gt;</description>
      <category>frontend</category>
      <category>vue.js</category>
      <category>Web Programming</category>
      <category>그림판</category>
      <category>웹 프로그래밍</category>
      <category>프론트엔드</category>
      <author>Minima</author>
      <guid isPermaLink="true">https://maxima-lab.tistory.com/66</guid>
      <comments>https://maxima-lab.tistory.com/entry/Web-Programming-Vue-Drawing-Tool#entry66comment</comments>
      <pubDate>Sat, 17 Feb 2024 13:03:23 +0900</pubDate>
    </item>
    <item>
      <title>[Docker] Docker Container를 활용한 Grafana 실행</title>
      <link>https://maxima-lab.tistory.com/entry/Docker-Container-Grafana-Execution</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요, 오늘은 Docker Container를 활용해서 Grafana를 실행하는 방법에 대해서 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://grafana.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://grafana.com/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1707404343338&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Grafana: The open observability platform | Grafana Labs&quot; data-og-description=&quot;Play around with the Grafana Stack Experience Grafana for yourself, no registration or installation needed.&quot; data-og-host=&quot;grafana.com&quot; data-og-source-url=&quot;https://grafana.com/&quot; data-og-url=&quot;https://grafana.com/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/qt9XO/hyVfXAy1ou/WRfEIUHkjASBS6fVmi9DAk/img.jpg?width=1199&amp;amp;height=672&amp;amp;face=0_0_1199_672,https://scrap.kakaocdn.net/dn/cvllMj/hyVjbKJqbe/5dEHrlQgaieQDFykV0QX70/img.jpg?width=1199&amp;amp;height=672&amp;amp;face=0_0_1199_672,https://scrap.kakaocdn.net/dn/6e9ej/hyVjipyjeN/jxFJ1jV3QFmlbT6g4qGwoK/img.png?width=1324&amp;amp;height=652&amp;amp;face=0_0_1324_652&quot;&gt;&lt;a href=&quot;https://grafana.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://grafana.com/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/qt9XO/hyVfXAy1ou/WRfEIUHkjASBS6fVmi9DAk/img.jpg?width=1199&amp;amp;height=672&amp;amp;face=0_0_1199_672,https://scrap.kakaocdn.net/dn/cvllMj/hyVjbKJqbe/5dEHrlQgaieQDFykV0QX70/img.jpg?width=1199&amp;amp;height=672&amp;amp;face=0_0_1199_672,https://scrap.kakaocdn.net/dn/6e9ej/hyVjipyjeN/jxFJ1jV3QFmlbT6g4qGwoK/img.png?width=1324&amp;amp;height=652&amp;amp;face=0_0_1324_652');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Grafana: The open observability platform | Grafana Labs&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Play around with the Grafana Stack Experience Grafana for yourself, no registration or installation needed.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;grafana.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Grafana는 모니터링을 위한 오픈 소스 플랫폼입니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저, Docker Hub에서 Grafana Image의 최신 버전을 다운받아야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1707404626827&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker pull grafana/grafana&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-02-09 at 12.05.36 AM.png&quot; data-origin-width=&quot;1220&quot; data-origin-height=&quot;198&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c6pWGP/btsEEWEDGiv/QURngy9ksyPcBMY03Si9Kk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c6pWGP/btsEEWEDGiv/QURngy9ksyPcBMY03Si9Kk/img.png&quot; data-alt=&quot;docker images 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c6pWGP/btsEEWEDGiv/QURngy9ksyPcBMY03Si9Kk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc6pWGP%2FbtsEEWEDGiv%2FQURngy9ksyPcBMY03Si9Kk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1220&quot; height=&quot;198&quot; data-filename=&quot;Screenshot 2024-02-09 at 12.05.36 AM.png&quot; data-origin-width=&quot;1220&quot; data-origin-height=&quot;198&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;docker images 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이어서 Grafana Container를 실행하는 방법에 대해서 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1707404868038&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker run -d -p 3000:3000 --name=grafana grafana/grafana&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-02-09 at 12.10.53 AM.png&quot; data-origin-width=&quot;2306&quot; data-origin-height=&quot;252&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cmYoIe/btsEDrlkg05/7aavMCPbssQeOUceUG8cxK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cmYoIe/btsEDrlkg05/7aavMCPbssQeOUceUG8cxK/img.png&quot; data-alt=&quot;docker ps 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cmYoIe/btsEDrlkg05/7aavMCPbssQeOUceUG8cxK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcmYoIe%2FbtsEDrlkg05%2F7aavMCPbssQeOUceUG8cxK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2306&quot; height=&quot;252&quot; data-filename=&quot;Screenshot 2024-02-09 at 12.10.53 AM.png&quot; data-origin-width=&quot;2306&quot; data-origin-height=&quot;252&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;docker ps 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-02-09 at 12.13.03 AM.png&quot; data-origin-width=&quot;3218&quot; data-origin-height=&quot;1844&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XiDc5/btsED86U0F8/dKBASXVPAbBFLKMibsTfY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XiDc5/btsED86U0F8/dKBASXVPAbBFLKMibsTfY0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XiDc5/btsED86U0F8/dKBASXVPAbBFLKMibsTfY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXiDc5%2FbtsED86U0F8%2FdKBASXVPAbBFLKMibsTfY0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3218&quot; height=&quot;1844&quot; data-filename=&quot;Screenshot 2024-02-09 at 12.13.03 AM.png&quot; data-origin-width=&quot;3218&quot; data-origin-height=&quot;1844&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 사진과 같이 localhost:3000으로 접속하게 되면 다음과 같은 화면이 접속되게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;초기의 계정과 비밀번호는 각각 admin, admin을 입력해주시면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금까지, Docker Container를 활용해서 Grafana를 실행하는 방법에 대해서 알아보았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;감사드립니다.&lt;/p&gt;</description>
      <category>Docker</category>
      <category>container</category>
      <category>Docker</category>
      <category>grafana</category>
      <category>그라파나</category>
      <category>도커</category>
      <category>컨테이너</category>
      <author>Minima</author>
      <guid isPermaLink="true">https://maxima-lab.tistory.com/65</guid>
      <comments>https://maxima-lab.tistory.com/entry/Docker-Container-Grafana-Execution#entry65comment</comments>
      <pubDate>Fri, 9 Feb 2024 00:16:36 +0900</pubDate>
    </item>
    <item>
      <title>[Docker] Docker 사용 명령어 - 1 (images, inspect, build, run 등등)</title>
      <link>https://maxima-lab.tistory.com/entry/Docker-Docker-1-images-inspect-build-run</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요, 오늘은 Docker를 사용하는 방법에 대해서 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저, 로컬에 저장된 Docker Image 목록을 확인하는 명령어에 대해서 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1706925211290&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker images&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-02-03 at 10.54.04 AM.png&quot; data-origin-width=&quot;1118&quot; data-origin-height=&quot;226&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b27I3y/btsEonuPY7O/cz3jroDi5B40KmK1TVs29K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b27I3y/btsEonuPY7O/cz3jroDi5B40KmK1TVs29K/img.png&quot; data-alt=&quot;docker images 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b27I3y/btsEonuPY7O/cz3jroDi5B40KmK1TVs29K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb27I3y%2FbtsEonuPY7O%2Fcz3jroDi5B40KmK1TVs29K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1118&quot; height=&quot;226&quot; data-filename=&quot;Screenshot 2024-02-03 at 10.54.04 AM.png&quot; data-origin-width=&quot;1118&quot; data-origin-height=&quot;226&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;docker images 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이어서, 특정 Docker Image의 세부 정보를 확인하는 방법에 대해서 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1706925390548&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker inspect &quot;Docker 이미지 이름&quot;:TAG&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 명령어에 대한 예시 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-02-03 at 10.57.39 AM.png&quot; data-origin-width=&quot;1736&quot; data-origin-height=&quot;362&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cMY5lj/btsEkwGGo8N/IrB0k8AYXVJgVh6KboBFC1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cMY5lj/btsEkwGGo8N/IrB0k8AYXVJgVh6KboBFC1/img.png&quot; data-alt=&quot;docker inspect python:3.8 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cMY5lj/btsEkwGGo8N/IrB0k8AYXVJgVh6KboBFC1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcMY5lj%2FbtsEkwGGo8N%2FIrB0k8AYXVJgVh6KboBFC1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1736&quot; height=&quot;362&quot; data-filename=&quot;Screenshot 2024-02-03 at 10.57.39 AM.png&quot; data-origin-width=&quot;1736&quot; data-origin-height=&quot;362&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;docker inspect python:3.8 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같이, Docker Image ID를 통해서도 세부 정보를 확인할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-02-03 at 11.02.36 AM.png&quot; data-origin-width=&quot;1736&quot; data-origin-height=&quot;362&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cmrxhW/btsEkTaZ4so/gYuUZNM8TpE77tp7q9K6Ok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cmrxhW/btsEkTaZ4so/gYuUZNM8TpE77tp7q9K6Ok/img.png&quot; data-alt=&quot;docker inspect dcdd1a525267 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cmrxhW/btsEkTaZ4so/gYuUZNM8TpE77tp7q9K6Ok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcmrxhW%2FbtsEkTaZ4so%2FgYuUZNM8TpE77tp7q9K6Ok%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1736&quot; height=&quot;362&quot; data-filename=&quot;Screenshot 2024-02-03 at 11.02.36 AM.png&quot; data-origin-width=&quot;1736&quot; data-origin-height=&quot;362&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;docker inspect dcdd1a525267 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이어서 실행 중인 Containers 보는 명령어는 다음과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1706943301609&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker ps&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 명령어는 실행중이지 않은 모든 Containers를 보는 명령어입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1706943351232&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker ps -a&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행 중인 Container를 중지하는 명령어입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1706943397886&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker stop &amp;lt;container-id&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Container를 삭제하는 명령어입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1706943432667&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker rm &amp;lt;container-id&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 명령어는 Dockerfile을 작성 후 이미지를 빌드 하는 명령어 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1706943796568&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker build -t temp-app .&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 명령어는 Dockerfile을 활용하여 TEMP-APP이라는 Docker 이미지를 빌드하는 코드이며, 위의 명령어를 실행 후 docker images 명령어를 실행하면 temp-app (REPOSITORY)의 Docker 이미지가 생성된 것을 볼 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;이때 유의하셔야 할 사항은 REPOSITORY 명은 소문자로 정해주셔야 합니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Docker 이미지 빌드 후 Container를 실행하는 방법은 다음과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1706944023671&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker run -it --rm temp-app&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이상으로, Docker를 사용하는 명령어에 대해서 알아보았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;감사드립니다.&lt;/p&gt;</description>
      <category>Docker</category>
      <author>Minima</author>
      <guid isPermaLink="true">https://maxima-lab.tistory.com/64</guid>
      <comments>https://maxima-lab.tistory.com/entry/Docker-Docker-1-images-inspect-build-run#entry64comment</comments>
      <pubDate>Sat, 3 Feb 2024 16:10:39 +0900</pubDate>
    </item>
    <item>
      <title>[Python, Tensorflow] Custom Callback 만들기 (Classification)</title>
      <link>https://maxima-lab.tistory.com/entry/Python-Tensorflow2-Custom-Callback-Classification</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요, 오늘은 Tensorflow 2에서 Classification 모델 학습 시 Callback을 Customize 하는 방법에 대해서 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MNIST 데이터 셋을 활용하여, 모델 학습하는 예시 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1706618985531&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import tensorflow as tf
from tensorflow.keras.datasets import mnist
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Flatten, Dense
from tensorflow.keras.callbacks import Callback
import numpy as np

class SimpleCallBack(Callback):
    def __init__(self, patience=0):
        super(SimpleCallBack, self).__init__()
        self.best_weights = None

    def on_train_begin(self, logs=None):
        self.best_train_accuracy = 0.0
        self.best_validation_accuracy = 0.0

    def on_epoch_begin(self, epoch, logs=None):
        pass

    def on_epoch_end(self, epoch, logs=None):
        
        epoch_accuracy = logs.get(&quot;accuracy&quot;)
        epoch_validation_accuracy = logs.get(&quot;val_accuracy&quot;)

        print(f&quot;[EPOCH : {epoch+1:3d}] &amp;gt;&amp;gt;&amp;gt; Train Accuracy : {epoch_accuracy:.3f}, Validation Accuracy : {epoch_validation_accuracy:.3f}&quot;)

        if np.less(self.best_validation_accuracy, epoch_validation_accuracy):
          self.best_weights = self.model.get_weights()
          self.model.save(&quot;./mnist_best&quot;)

          self.best_validation_accuracy = epoch_validation_accuracy
          print(&quot;MNIST Best Model Saved...&quot;)


    def on_train_end(self, logs=None):
        print(&quot;Train Finished...&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 코드를 구성하는 함수에 대해서 알아보게습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;on_train_begin : 모델 학습이 시작될 때 실행되는 함수&lt;/li&gt;
&lt;li&gt;on_epoch_begin : 모델 학습 중 특정 Epoch이 시작될 때 실행되는 함수&lt;/li&gt;
&lt;li&gt;on_epoch_end : 모델 학습 중 특정 Epoch이 종료될 때 실행되는 함수&lt;/li&gt;
&lt;li&gt;on_train_end : 모델 학습이 종료될 때 실행되는 함수&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 코드에서 유심히 봐야할 코드는 다음과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1706619152144&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    def on_epoch_end(self, epoch, logs=None):
        
        epoch_accuracy = logs.get(&quot;accuracy&quot;)
        epoch_validation_accuracy = logs.get(&quot;val_accuracy&quot;)

        print(f&quot;[EPOCH : {epoch+1:3d}] &amp;gt;&amp;gt;&amp;gt; Train Accuracy : {epoch_accuracy:.3f}, Validation Accuracy : {epoch_validation_accuracy:.3f}&quot;)

        if np.less(self.best_validation_accuracy, epoch_validation_accuracy):
          self.best_weights = self.model.get_weights()
          self.model.save(&quot;./mnist_best&quot;)

          self.best_validation_accuracy = epoch_validation_accuracy
          print(&quot;MNIST Best Model Saved...&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 코드는 특정 Epoch에 대하여 학습이 완료되었을 때 logs에서 train/validation accuracy를 불러와서 validation accuracy가 개선이 되었을 때 Model Weights을 저장하는 코드입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 코드들을 활용한 전체 코드에 대해서 보여드리겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1706619307482&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import tensorflow as tf
from tensorflow.keras.datasets import mnist
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Flatten, Dense
from tensorflow.keras.callbacks import Callback
import numpy as np

class SimpleCallBack(Callback):
    def __init__(self, patience=0):
        super(SimpleCallBack, self).__init__()
        self.best_weights = None

    def on_train_begin(self, logs=None):
        self.best_train_accuracy = 0.0
        self.best_validation_accuracy = 0.0

    def on_epoch_begin(self, epoch, logs=None):
        pass

    def on_epoch_end(self, epoch, logs=None):
        
        epoch_accuracy = logs.get(&quot;accuracy&quot;)
        epoch_validation_accuracy = logs.get(&quot;val_accuracy&quot;)

        print(f&quot;[EPOCH : {epoch+1:3d}] &amp;gt;&amp;gt;&amp;gt; Train Accuracy : {epoch_accuracy:.3f}, Validation Accuracy : {epoch_validation_accuracy:.3f}&quot;)

        if np.less(self.best_validation_accuracy, epoch_validation_accuracy):
          self.best_weights = self.model.get_weights()
          self.model.save(&quot;./mnist_best&quot;)

          self.best_validation_accuracy = epoch_validation_accuracy
          print(&quot;MNIST Best Model Saved...&quot;)


    def on_train_end(self, logs=None):
        print(&quot;Train Finished...&quot;)


# MNIST 데이터 셋 로드
(x_train, y_train), (x_val, y_val) = mnist.load_data()
x_train, x_val = x_train / 255.0, x_val / 255.0


model = Sequential([
    Flatten(input_shape=(28, 28)), 
    Dense(128, activation='relu'), 
    Dense(64, activation='relu'),  
    Dense(10, activation='sigmoid') 
])

# 모델 컴파일
model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

simple_callback = SimpleCallBack()

# 모델 학습
model.fit(x_train, y_train, batch_size=16, epochs=100, verbose=0, validation_data = (x_val, y_val), callbacks=[simple_callback])&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-01-30 at 9.55.41 PM.png&quot; data-origin-width=&quot;950&quot; data-origin-height=&quot;1058&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sGhRX/btsD8z40sVD/BhloYk8k1O491RzmbKxqkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sGhRX/btsD8z40sVD/BhloYk8k1O491RzmbKxqkk/img.png&quot; data-alt=&quot;모델 학습 시 출력 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sGhRX/btsD8z40sVD/BhloYk8k1O491RzmbKxqkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsGhRX%2FbtsD8z40sVD%2FBhloYk8k1O491RzmbKxqkk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;547&quot; height=&quot;609&quot; data-filename=&quot;Screenshot 2024-01-30 at 9.55.41 PM.png&quot; data-origin-width=&quot;950&quot; data-origin-height=&quot;1058&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;모델 학습 시 출력 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이상으로, Tensorflow 2에서 Callback을 Customize 하는 방법에 대해서 알아보았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;감사드립니다.&lt;/p&gt;</description>
      <category>Python/Tensorflow</category>
      <category>Callback</category>
      <category>Python</category>
      <category>tensorflow</category>
      <category>텐서플로우</category>
      <category>파이썬</category>
      <author>Minima</author>
      <guid isPermaLink="true">https://maxima-lab.tistory.com/63</guid>
      <comments>https://maxima-lab.tistory.com/entry/Python-Tensorflow2-Custom-Callback-Classification#entry63comment</comments>
      <pubDate>Tue, 30 Jan 2024 21:57:58 +0900</pubDate>
    </item>
    <item>
      <title>[Python] tqdm 패키지 사용법</title>
      <link>https://maxima-lab.tistory.com/entry/Python-tqdm</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요, 오늘은 tqdm 패키지 사용하는 방법에 대해서 알아보겠습니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;패키지 설치를 위한 방법은 다음과 같습니다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1706416752798&quot; class=&quot;cmake&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;pip install tqdm&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;패키지 설치 후 먼저 간단한 예시에 대해서 알아보겠습니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1706416763505&quot; class=&quot;pgsql&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;from tqdm import tqdm

for _ in tqdm(range(100000000), desc=&quot;Example - 1&quot;):
   pass&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-01-27 at 7.34.40 AM.png&quot; data-origin-width=&quot;1078&quot; data-origin-height=&quot;50&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cj1qH2/btsD4kk6ltF/pIfIa5yN8gJ4lYWgHK5E7k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cj1qH2/btsD4kk6ltF/pIfIa5yN8gJ4lYWgHK5E7k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cj1qH2/btsD4kk6ltF/pIfIa5yN8gJ4lYWgHK5E7k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcj1qH2%2FbtsD4kk6ltF%2FpIfIa5yN8gJ4lYWgHK5E7k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1078&quot; height=&quot;50&quot; data-filename=&quot;Screenshot 2024-01-27 at 7.34.40 AM.png&quot; data-origin-width=&quot;1078&quot; data-origin-height=&quot;50&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;range(100000000)이 아닌 일반적인 List를 활용한 예시는 다음과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1706416763506&quot; class=&quot;python&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;from tqdm import tqdm
import numpy as np

A = np.random.randint(0, 100, (100,))
print(A, &quot;\n&quot;)

for _ in tqdm(A, desc=&quot;Example - 2&quot;):
   pass&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-01-29 at 8.20.30 PM.png&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;206&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/16IBd/btsEcrw7umd/JaKzG4vWCBpnU0IBTax0ck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/16IBd/btsEcrw7umd/JaKzG4vWCBpnU0IBTax0ck/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/16IBd/btsEcrw7umd/JaKzG4vWCBpnU0IBTax0ck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F16IBd%2FbtsEcrw7umd%2FJaKzG4vWCBpnU0IBTax0ck%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1000&quot; height=&quot;206&quot; data-filename=&quot;Screenshot 2024-01-29 at 8.20.30 PM.png&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;206&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;tqdm를 활용해서 enumerate()와 유사한 기능을 사용하기 위한 예시는 다음과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1706531000735&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from tqdm import tqdm
import numpy as np

A = np.random.randint(0, 100, (100,))
print(A, &quot;\n&quot;)

for A_ele, index in zip(tqdm(A, desc=&quot;Example - 2&quot;), range(len(A))):
   print(&quot;\n&quot;, A_ele, index)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-01-29 at 9.23.46 PM.png&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;408&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHiFJI/btsEcbHRRdv/0eFoFupFnfR0hSTp7sE9R1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHiFJI/btsEcbHRRdv/0eFoFupFnfR0hSTp7sE9R1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHiFJI/btsEcbHRRdv/0eFoFupFnfR0hSTp7sE9R1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHiFJI%2FbtsEcbHRRdv%2F0eFoFupFnfR0hSTp7sE9R1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1000&quot; height=&quot;408&quot; data-filename=&quot;Screenshot 2024-01-29 at 9.23.46 PM.png&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;408&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이상으로, tqdm 패키지를 활용하여 간단한 예시를 구현하는 방법에 대해 알아보았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;감사드립니다.&lt;/p&gt;</description>
      <category>Python</category>
      <category>Python</category>
      <category>tqdm</category>
      <category>파이썬</category>
      <author>Minima</author>
      <guid isPermaLink="true">https://maxima-lab.tistory.com/62</guid>
      <comments>https://maxima-lab.tistory.com/entry/Python-tqdm#entry62comment</comments>
      <pubDate>Mon, 29 Jan 2024 21:25:47 +0900</pubDate>
    </item>
    <item>
      <title>[Python, Numpy] np.meshgrid를 활용하여 Image Processing 구현 - 1 (반원 그리기)</title>
      <link>https://maxima-lab.tistory.com/entry/Python-Numpy-meshgrid-Image-Processing-1-semicircle</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요, 오늘은 Numpy 패키지 내 np.meshgrid 함수를 활용하여 이미지 Processing 하는 방법들에 대해서 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1. Opencv 패키지를 활용하여 Circle을 그리고 위쪽 반원만을 구하는 예시 입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1704718655218&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import cv2
import numpy as np

circle_image = np.zeros((512, 512, 3), np.uint8)
cv2.circle(circle_image, (256, 256), 100, (0, 255, 0), -1)

x_grid, y_grid = np.meshgrid(np.arange(512), np.arange(512))
mask_image = np.where(y_grid &amp;lt;= 256, 1, 0)
mask_image = np.stack([mask_image, mask_image, mask_image], axis=-1)


semicircle_image = (circle_image * mask_image).astype(np.uint8)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 코드에서 circle_image는 다음과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-01-08 at 9.56.58 PM.png&quot; data-origin-width=&quot;1008&quot; data-origin-height=&quot;1010&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bi50yA/btsDfMWGeae/YJX2PYKQ30WGrn5Sjk9nAk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bi50yA/btsDfMWGeae/YJX2PYKQ30WGrn5Sjk9nAk/img.png&quot; data-alt=&quot;circle_image&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bi50yA/btsDfMWGeae/YJX2PYKQ30WGrn5Sjk9nAk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbi50yA%2FbtsDfMWGeae%2FYJX2PYKQ30WGrn5Sjk9nAk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;301&quot; data-filename=&quot;Screenshot 2024-01-08 at 9.56.58 PM.png&quot; data-origin-width=&quot;1008&quot; data-origin-height=&quot;1010&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;circle_image&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한, mask_image는 다음과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_Screenshot 2024-01-08 at 10.01.20 PM.png&quot; data-origin-width=&quot;1008&quot; data-origin-height=&quot;1010&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bszkvA/btsC50P9JZj/j9LvSBf5Kga1K9lk7DX7z1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bszkvA/btsC50P9JZj/j9LvSBf5Kga1K9lk7DX7z1/img.png&quot; data-alt=&quot;mask_image&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bszkvA/btsC50P9JZj/j9LvSBf5Kga1K9lk7DX7z1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbszkvA%2FbtsC50P9JZj%2Fj9LvSBf5Kga1K9lk7DX7z1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;301&quot; data-filename=&quot;edited_Screenshot 2024-01-08 at 10.01.20 PM.png&quot; data-origin-width=&quot;1008&quot; data-origin-height=&quot;1010&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;mask_image&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 circle_image와 mask_image를 통해 최종적으로 구한 semicircle_image는 다음과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-01-08 at 10.03.59 PM.png&quot; data-origin-width=&quot;1008&quot; data-origin-height=&quot;1010&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eMGmGf/btsC8Vm0zUL/4wIfa2RX034eFlKjT01CU0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eMGmGf/btsC8Vm0zUL/4wIfa2RX034eFlKjT01CU0/img.png&quot; data-alt=&quot;semicircle_image&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eMGmGf/btsC8Vm0zUL/4wIfa2RX034eFlKjT01CU0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeMGmGf%2FbtsC8Vm0zUL%2F4wIfa2RX034eFlKjT01CU0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;301&quot; data-filename=&quot;Screenshot 2024-01-08 at 10.03.59 PM.png&quot; data-origin-width=&quot;1008&quot; data-origin-height=&quot;1010&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;semicircle_image&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최종적으로 위 반원을 얻은 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이상으로, Numpy 패키지 내 np.meshgrid 함수를 활용해서 반원을 그리는 방법에 대해서 알아보았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;감사드립니다.&lt;/p&gt;</description>
      <category>Python</category>
      <category>Circle</category>
      <category>np.meshgrid</category>
      <category>numpy</category>
      <category>OpenCV</category>
      <category>Python</category>
      <category>SemiCircle</category>
      <category>파이썬</category>
      <author>Minima</author>
      <guid isPermaLink="true">https://maxima-lab.tistory.com/61</guid>
      <comments>https://maxima-lab.tistory.com/entry/Python-Numpy-meshgrid-Image-Processing-1-semicircle#entry61comment</comments>
      <pubDate>Mon, 8 Jan 2024 22:08:25 +0900</pubDate>
    </item>
  </channel>
</rss>