<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>세미531, Lifestyle</title>
    <link>https://semi531.tistory.com/</link>
    <description>자동차/ 테크/ 코딩/ 주식/ 책 리뷰 --</description>
    <language>ko</language>
    <pubDate>Sun, 10 May 2026 22:30:38 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>세미531</managingEditor>
    <image>
      <title>세미531, Lifestyle</title>
      <url>https://tistory1.daumcdn.net/tistory/4292377/attach/06ed396079bc46ddb4e4f5971a598a22</url>
      <link>https://semi531.tistory.com</link>
    </image>
    <item>
      <title>deepseek 개인정보 유출 증거 발견</title>
      <link>https://semi531.tistory.com/133</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;최근 AI 기술의 혁신과 함께 딥시크(Deepseek)가 주목받고 있는 가운데, 충격적인 개인정보 유출 증거가 공개되었습니다. 이번 글에서는 해당 영상을 기반으로 드러난 자료와 그에 따른 문제점들을 자세하게 분석하고, 앞으로 우리가 주목해야 할 사항들을 짚어봅니다.&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;br /&gt;&lt;b&gt;1.&amp;nbsp;영상&amp;nbsp;개요&amp;nbsp;및&amp;nbsp;배경 &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;사용자의&amp;nbsp;네트워크&amp;nbsp;활동을&amp;nbsp;모니터링한&amp;nbsp;결과,&amp;nbsp;암호화되지&amp;nbsp;않은&amp;nbsp;데이터&amp;nbsp;패킷의&amp;nbsp;전송&amp;nbsp;내역 &lt;br /&gt;개인정보(사용자&amp;nbsp;IP,&amp;nbsp;검색&amp;nbsp;기록,&amp;nbsp;기타&amp;nbsp;민감&amp;nbsp;정보&amp;nbsp;등)가&amp;nbsp;외부&amp;nbsp;서버로&amp;nbsp;유입되는&amp;nbsp;흔적 &lt;br /&gt;공식&amp;nbsp;개인정보&amp;nbsp;처리방침에서&amp;nbsp;&amp;ldquo;Your&amp;nbsp;Privacy&amp;nbsp;Security&amp;nbsp;is&amp;nbsp;Our&amp;nbsp;Top&amp;nbsp;Priority&amp;rdquo;라는&amp;nbsp;문구와&amp;nbsp;실제&amp;nbsp;데이터&amp;nbsp;처리&amp;nbsp;방식&amp;nbsp;사이의&amp;nbsp;괴리점 &lt;br /&gt;실제로,&amp;nbsp;딥시크가&amp;nbsp;수집한&amp;nbsp;데이터가&amp;nbsp;중국&amp;nbsp;서버에&amp;nbsp;저장된다는&amp;nbsp;주장은&amp;nbsp;이미&amp;nbsp;여러&amp;nbsp;블로그와&amp;nbsp;기사에서&amp;nbsp;언급된&amp;nbsp;바&amp;nbsp;있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&lt;b&gt;2.&amp;nbsp;Deepseek의&amp;nbsp;기술적&amp;nbsp;배경&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; &lt;/b&gt;&lt;br /&gt;딥시크는&amp;nbsp;AI&amp;nbsp;시장에서&amp;nbsp;ChatGPT와&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;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;서비스의&amp;nbsp;강점: &lt;/b&gt;&lt;br /&gt;대규모&amp;nbsp;데이터를&amp;nbsp;기반으로&amp;nbsp;한&amp;nbsp;고도화된&amp;nbsp;자연어&amp;nbsp;처리 &lt;br /&gt;무료로&amp;nbsp;제공되는&amp;nbsp;AI&amp;nbsp;기능으로&amp;nbsp;많은&amp;nbsp;사용자들이&amp;nbsp;쉽게&amp;nbsp;접근 &lt;br /&gt;하지만,&amp;nbsp;빠른&amp;nbsp;성장&amp;nbsp;뒤에는&amp;nbsp;개인정보&amp;nbsp;보호에&amp;nbsp;취약한&amp;nbsp;부분도&amp;nbsp;산재해&amp;nbsp;있다는&amp;nbsp;지적이&amp;nbsp;나옵니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;아이러니한&amp;nbsp;점: &lt;/b&gt;&lt;br /&gt;공식적으로는&amp;nbsp;개인정보&amp;nbsp;보호를&amp;nbsp;최우선으로&amp;nbsp;한다고&amp;nbsp;밝히고&amp;nbsp;있음에도 &lt;br /&gt;실제로는&amp;nbsp;수집되는&amp;nbsp;개인정보의&amp;nbsp;양과&amp;nbsp;전송&amp;nbsp;경로에서&amp;nbsp;의심스러운&amp;nbsp;패턴이&amp;nbsp;발견됨 &lt;br /&gt;또한,&amp;nbsp;딥시크&amp;nbsp;개발&amp;nbsp;주체가&amp;nbsp;중국의&amp;nbsp;헤지펀드나&amp;nbsp;관련&amp;nbsp;인공지능&amp;nbsp;연구기관과&amp;nbsp;연계되어&amp;nbsp;있다는&amp;nbsp;점은&amp;nbsp;개인정보&amp;nbsp;관리&amp;nbsp;측면에서&amp;nbsp;국제적인&amp;nbsp;우려를&amp;nbsp;자아내고&amp;nbsp;있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adfit&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;728x90&lt;/div&gt;
    &lt;ins class=&quot;kakao_ad_area&quot; style=&quot;display: none;&quot; data-ad-unit=&quot;DAN-HTkFRsyqtifHo4RK&quot; data-ad-width=&quot;728px&quot; data-ad-height=&quot;90px&quot;&gt;&lt;/ins&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;//t1.daumcdn.net/kas/static/ba.min.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&lt;b&gt;3. 개인정보 유출 증거&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;데이터 패킷 분석 결과: &lt;/b&gt;&lt;br /&gt;영상에서는&amp;nbsp;네트워크&amp;nbsp;트래픽&amp;nbsp;분석&amp;nbsp;도구를&amp;nbsp;이용해&amp;nbsp;딥시크와&amp;nbsp;관련된&amp;nbsp;통신&amp;nbsp;과정을&amp;nbsp;실시간으로&amp;nbsp;모니터링하는&amp;nbsp;장면이&amp;nbsp;나옵니다.&amp;nbsp;이&amp;nbsp;과정에서&amp;nbsp;사용자의&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;이러한&amp;nbsp;패킷에는&amp;nbsp;사용자&amp;nbsp;IP,&amp;nbsp;접속&amp;nbsp;시간,&amp;nbsp;검색&amp;nbsp;기록&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;서버&amp;nbsp;응답&amp;nbsp;및&amp;nbsp;로그&amp;nbsp;기록: &lt;/b&gt;&lt;br /&gt;영상을&amp;nbsp;통해&amp;nbsp;확보된&amp;nbsp;서버&amp;nbsp;로그에서는&amp;nbsp;의심스러운&amp;nbsp;데이터&amp;nbsp;전송&amp;nbsp;내역과&amp;nbsp;함께,&amp;nbsp;해당&amp;nbsp;서버의&amp;nbsp;IP&amp;nbsp;주소&amp;nbsp;및&amp;nbsp;위치&amp;nbsp;정보가&amp;nbsp;중국임이&amp;nbsp;확인되었습니다. &lt;br /&gt;이는&amp;nbsp;딥시크가&amp;nbsp;개인정보를&amp;nbsp;보호한다는&amp;nbsp;공식&amp;nbsp;입장과는&amp;nbsp;상반되는&amp;nbsp;결과로,&amp;nbsp;실제&amp;nbsp;서비스&amp;nbsp;운영&amp;nbsp;방식에&amp;nbsp;대한&amp;nbsp;의문을&amp;nbsp;제기합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;정책과의&amp;nbsp;괴리점: &lt;/b&gt;&lt;br /&gt;딥시크의&amp;nbsp;개인정보&amp;nbsp;처리방침은&amp;nbsp;사용자&amp;nbsp;정보&amp;nbsp;보호를&amp;nbsp;최우선으로&amp;nbsp;내세우고&amp;nbsp;있으나,&amp;nbsp;영상에&amp;nbsp;담긴&amp;nbsp;증거는&amp;nbsp;그와는&amp;nbsp;정반대의&amp;nbsp;사례를&amp;nbsp;보여줍니다.&amp;nbsp;이러한&amp;nbsp;괴리점은&amp;nbsp;사용자&amp;nbsp;신뢰도에&amp;nbsp;심각한&amp;nbsp;영향을&amp;nbsp;미칠&amp;nbsp;수밖에&amp;nbsp;없습니다. &lt;br /&gt;이와&amp;nbsp;같은&amp;nbsp;증거들은&amp;nbsp;단순한&amp;nbsp;시스템&amp;nbsp;오류나&amp;nbsp;우연이&amp;nbsp;아니라,&amp;nbsp;체계적으로&amp;nbsp;개인정보를&amp;nbsp;수집하고&amp;nbsp;외부&amp;nbsp;서버로&amp;nbsp;전송하는&amp;nbsp;행위일&amp;nbsp;수&amp;nbsp;있다는&amp;nbsp;의혹을&amp;nbsp;강화시킵니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;4.&amp;nbsp;개인정보&amp;nbsp;처리방침과&amp;nbsp;실제&amp;nbsp;운영&amp;nbsp;방식&amp;nbsp;간의&amp;nbsp;괴리 &lt;/b&gt;&lt;br /&gt;딥시크 공식 홈페이지와 개인정보 처리방침에서는 &amp;ldquo;Your Privacy Security is Our Top Priority&amp;rdquo;라는 메시지를 통해 사용자 보호를 약속하고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;데이터&amp;nbsp;수집의&amp;nbsp;불투명성: &lt;/b&gt;&lt;br /&gt;딥시크가&amp;nbsp;어떤&amp;nbsp;방식으로,&amp;nbsp;어떤&amp;nbsp;데이터를&amp;nbsp;수집하는지에&amp;nbsp;대한&amp;nbsp;구체적인&amp;nbsp;설명이&amp;nbsp;부족합니다. &lt;br /&gt;&lt;b&gt;외부&amp;nbsp;서버&amp;nbsp;전송: &lt;/b&gt;&lt;br /&gt;개인정보가&amp;nbsp;암호화&amp;nbsp;없이&amp;nbsp;외부,&amp;nbsp;특히&amp;nbsp;중국&amp;nbsp;내&amp;nbsp;서버로&amp;nbsp;전송되는&amp;nbsp;것은&amp;nbsp;국제&amp;nbsp;개인정보&amp;nbsp;보호&amp;nbsp;기준에&amp;nbsp;부합하지&amp;nbsp;않는다는&amp;nbsp;지적이&amp;nbsp;제기됩니다. &lt;br /&gt;&lt;b&gt;사용자&amp;nbsp;동의&amp;nbsp;문제: &lt;/b&gt;&lt;br /&gt;사용자가&amp;nbsp;명시적으로&amp;nbsp;동의한&amp;nbsp;절차&amp;nbsp;없이&amp;nbsp;데이터가&amp;nbsp;수집되고&amp;nbsp;전송되고&amp;nbsp;있다는&amp;nbsp;점은&amp;nbsp;법적,&amp;nbsp;윤리적&amp;nbsp;문제를&amp;nbsp;낳습니다. &lt;br /&gt;이러한&amp;nbsp;문제들은&amp;nbsp;이미&amp;nbsp;여러&amp;nbsp;분야의&amp;nbsp;전문가와&amp;nbsp;사용자&amp;nbsp;커뮤니티에서도&amp;nbsp;뜨겁게&amp;nbsp;논의되고&amp;nbsp;있는&amp;nbsp;사안으로,&amp;nbsp;딥시크의&amp;nbsp;향후&amp;nbsp;운영에&amp;nbsp;큰&amp;nbsp;영향을&amp;nbsp;미칠&amp;nbsp;것으로&amp;nbsp;보입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;5.&amp;nbsp;향후&amp;nbsp;대응&amp;nbsp;및&amp;nbsp;결론 &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;정책&amp;nbsp;개선&amp;nbsp;요구: &lt;/b&gt;&lt;br /&gt;사용자&amp;nbsp;정보&amp;nbsp;보호를&amp;nbsp;위한&amp;nbsp;더&amp;nbsp;명확하고&amp;nbsp;엄격한&amp;nbsp;정책&amp;nbsp;수립&amp;nbsp;및&amp;nbsp;공개 &lt;br /&gt;&lt;b&gt;외부&amp;nbsp;감사&amp;nbsp;및&amp;nbsp;검증: &lt;/b&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;방식&amp;nbsp;점검 &lt;br /&gt;&lt;b&gt;사용자&amp;nbsp;인식&amp;nbsp;제고: &lt;/b&gt;&lt;br /&gt;서비스&amp;nbsp;이용&amp;nbsp;전&amp;nbsp;개인정보&amp;nbsp;수집&amp;nbsp;및&amp;nbsp;처리&amp;nbsp;방식에&amp;nbsp;대해&amp;nbsp;사용자에게&amp;nbsp;충분한&amp;nbsp;안내와&amp;nbsp;동의&amp;nbsp;절차&amp;nbsp;마련 &lt;br /&gt;결국&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;것입니다.&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-origin-width=&quot;1200&quot; data-origin-height=&quot;630&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GIy0Y/btsMbXJidcG/Us2TSFLxOkyCRlKmeJHcOK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GIy0Y/btsMbXJidcG/Us2TSFLxOkyCRlKmeJHcOK/img.png&quot; data-alt=&quot;deepseek&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GIy0Y/btsMbXJidcG/Us2TSFLxOkyCRlKmeJHcOK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGIy0Y%2FbtsMbXJidcG%2FUs2TSFLxOkyCRlKmeJHcOK%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;436&quot; height=&quot;229&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;630&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;deepseek&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Life/자율주행, AI</category>
      <category>deepseek 개인정보</category>
      <category>딥시크</category>
      <category>딥시크 개인정보</category>
      <category>딥시크 개인정보 유출</category>
      <category>딥시크 개인정보 유출 정황</category>
      <category>딥시크 개인정보 유출 증거</category>
      <category>딥시크 보안</category>
      <category>딥시크 유출</category>
      <category>딥시크 증거</category>
      <category>딥시크 해킹</category>
      <author>세미531</author>
      <guid isPermaLink="true">https://semi531.tistory.com/133</guid>
      <comments>https://semi531.tistory.com/133#entry133comment</comments>
      <pubDate>Sat, 8 Feb 2025 02:43:36 +0900</pubDate>
    </item>
    <item>
      <title>MOE (Mixture of Experts) 설명</title>
      <link>https://semi531.tistory.com/132</link>
      <description>&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;MOE(Mixture-of-Experts)는 최근 대규모 언어 모델(LLM) 개발에서 모델의 파라미터 수를 기하급수적으로 늘리면서도, 실제 계산 비용은 제한된 범위 내로 유지할 수 있도록 하는 혁신적인 기법입니다. 아래에서는 MOE의 기본 원리, 구조, 주요 연구 동향, 개발 방법 및 고려사항에 대해 자세히 설명합니다.&lt;br&gt;&lt;br&gt;&lt;br&gt;---&lt;br&gt;&lt;br&gt;1. MOE의 기본 개념 및 원리&lt;br&gt;&lt;br&gt;1.1. 기본 아이디어&lt;br&gt;&lt;br&gt;다수의 전문가(Expert): MOE는 하나의 거대한 네트워크 대신 여러 개의 “전문가” 네트워크로 구성됩니다. 각 전문가는 입력 데이터의 특정 패턴이나 특징에 대해 전문적으로 학습합니다.&lt;br&gt;&lt;br&gt;동적 전문가 선택: 입력이 들어오면, 전체 전문가 중 일부(일반적으로 상위 1~2개)만 활성화하여 해당 입력에 대해 계산을 수행합니다. 이 방식을 **희소 활성화(sparse activation)**라고 부르며, 전체 모델 파라미터는 많지만 실제 연산에는 극히 일부만 사용되는 형태입니다.&lt;br&gt;&lt;br&gt;&lt;br&gt;1.2. 주요 구성 요소&lt;br&gt;&lt;br&gt;전문가 네트워크(Experts): 서로 다른 가중치를 가진 여러 하위 네트워크로, 각 전문가가 고유의 역할(예: 문맥 이해, 구문 분석 등)을 수행할 수 있습니다.&lt;br&gt;&lt;br&gt;게이팅 네트워크(Gating Network): 입력 데이터를 받아 각 전문가에 할당할 “점수(score)”를 산출합니다. 보통 입력 벡터에 대해 선형 변환 후 softmax 등을 적용하여, 확률 분포 형태로 전문가 선택 확률을 계산합니다.&lt;br&gt;&lt;br&gt;Top‑k 선택: 게이팅 네트워크는 일반적으로 top‑k(예: k=1 또는 2) 방식으로 가장 적합한 전문가를 선택하며, 선택된 전문가만이 해당 입력에 대해 계산을 수행합니다.&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;---&lt;br&gt;&lt;br&gt;2. MOE 관련 주요 연구 동향&lt;br&gt;&lt;br&gt;2.1. 초기 연구: Sparsely-Gated Mixture-of-Experts&lt;br&gt;&lt;br&gt;Shazeer et al. (2017)&lt;br&gt;논문 *“Outrageously Large Neural Networks: The Sparsely-Gated Mixture-of-Experts Layer”*에서는 MOE 개념을 Transformer 등의 모델 내에 적용하여, 거대한 모델을 실제 계산 비용은 제한하면서도 파라미터 수만 증가시키는 방법을 제시하였습니다.&lt;br&gt;&lt;br&gt;핵심 기법: 게이팅 네트워크를 통해 각 입력마다 상위 몇 개의 전문가만 선택하고, 부하 균형(loss balancing)을 위한 추가 손실 항을 도입해 특정 전문가에 계산이 편중되는 문제를 완화하였습니다.&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;2.2. 발전 연구: Switch Transformer&lt;br&gt;&lt;br&gt;Switch Transformer (Fedus et al., 2021)&lt;br&gt;이 연구에서는 기존 MOE 방식에서 더욱 단순화된 “switching” 메커니즘을 제안합니다. 각 입력 토큰에 대해 단 하나의 전문가만을 선택하는 방식으로,&lt;br&gt;&lt;br&gt;장점: 설계 및 구현의 복잡도를 줄이고, 분산 처리 환경에서의 효율성을 개선하였습니다.&lt;br&gt;&lt;br&gt;부하 균형: 단일 전문가 선택 방식에서도 부하가 한쪽으로 치우치는 문제를 해결하기 위한 다양한 정규화 및 보조 손실 기법이 함께 도입됩니다.&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;---&lt;br&gt;&lt;br&gt;3. MOE의 작동 메커니즘 및 학습 과정&lt;br&gt;&lt;br&gt;3.1. 순방향 전파 과정&lt;br&gt;&lt;br&gt;1. 입력 처리: 입력 토큰 또는 문장 임베딩이 MOE 레이어에 전달됩니다.&lt;br&gt;&lt;br&gt;&lt;br&gt;2. 게이팅 네트워크 작동: 입력 벡터에 대해 게이팅 네트워크가 각 전문가에 대한 점수를 산출합니다.&lt;br&gt;&lt;br&gt;&lt;br&gt;3. 전문가 선택: 산출된 점수에 따라 top‑k 전문가가 선택됩니다. (k=1, 2 등)&lt;br&gt;&lt;br&gt;&lt;br&gt;4. 전문가 계산: 선택된 전문가만이 해당 입력에 대해 계산을 수행합니다.&lt;br&gt;&lt;br&gt;&lt;br&gt;5. 결과 통합: 각 전문가의 출력을 게이팅 네트워크에서 산출한 가중치에 따라 가중 합산하여 다음 레이어로 전달합니다.&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;3.2. 학습 시 고려사항&lt;br&gt;&lt;br&gt;부하 균형(Load Balancing):&lt;br&gt;특정 전문가에 입력이 몰리는 현상을 방지하기 위해, 게이팅 네트워크의 출력 분포가 모든 전문가에 고르게 분포되도록 하는 부가적인 손실 함수를 함께 최적화합니다.&lt;br&gt;&lt;br&gt;희소성 유도:&lt;br&gt;실제 연산 비용을 줄이기 위해, 게이팅 네트워크가 극도로 희소한 선택(예: 단 한 개 또는 두 개의 전문가만 활성화)을 하도록 유도합니다.&lt;br&gt;&lt;br&gt;정책 및 최적화:&lt;br&gt;MOE의 동적 라우팅 특성상, 미니배치 내에서 전문가 간의 불균형 문제가 발생할 수 있으며, 이를 해결하기 위한 다양한 정규화 및 최적화 기법(예: 추가 보조 손실, 정규화 기법 등)이 연구되고 있습니다.&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;---&lt;br&gt;&lt;br&gt;4. LLM 개발에서 MOE 적용 방법 및 실무적 고려사항&lt;br&gt;&lt;br&gt;4.1. 모델 아키텍처 설계&lt;br&gt;&lt;br&gt;삽입 위치:&lt;br&gt;Transformer 기반 LLM에서는 보통 후반부의 레이어 혹은 특정 블록에 MOE 레이어를 삽입하여, 전체 모델 중 일부만이 동적 전문가 선택 방식을 사용하도록 설계합니다.&lt;br&gt;&lt;br&gt;전문가 수와 선택 기준:&lt;br&gt;모델 크기, 데이터 특성, 하드웨어 환경에 따라 전문가의 총 수와 각 입력당 활성화할 전문가의 수(k)를 조절합니다.&lt;br&gt;&lt;br&gt;&lt;br&gt;4.2. 하이퍼파라미터 튜닝&lt;br&gt;&lt;br&gt;게이팅 네트워크의 설계:&lt;br&gt;입력에 대한 적절한 변환 및 활성화 함수 선택이 중요하며, 모델 학습 안정성과 직접적으로 연관됩니다.&lt;br&gt;&lt;br&gt;부하 균형 손실 가중치:&lt;br&gt;특정 전문가로의 입력 집중을 방지하기 위해, 부하 균형에 사용되는 손실 항의 가중치를 적절히 조정해야 합니다.&lt;br&gt;&lt;br&gt;희소성 강도:&lt;br&gt;희소하게 전문가를 활성화하는 정도(예: softmax의 온도 조절 등)를 조정하여, 계산 효율과 모델 성능 사이의 균형을 맞춥니다.&lt;br&gt;&lt;br&gt;&lt;br&gt;4.3. 분산 학습 및 인프라 고려사항&lt;br&gt;&lt;br&gt;병렬 처리:&lt;br&gt;MOE는 각 전문가가 개별적으로 계산되므로, 분산 처리(예: GPU/TPU 클러스터) 환경에서 병렬로 계산하는 것이 효율적입니다.&lt;br&gt;&lt;br&gt;전문가 간 통신:&lt;br&gt;분산 환경에서는 선택된 전문가의 결과를 모으고 결합하는 과정에서 통신 오버헤드가 발생할 수 있으므로, 이에 대한 최적화가 필요합니다.&lt;br&gt;&lt;br&gt;추론 속도:&lt;br&gt;학습 시에는 희소성을 통해 계산 효율을 높일 수 있지만, 실제 서비스 환경에서는 게이팅 네트워크의 오버헤드 및 분산 통신 지연 등도 고려해야 합니다.&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;---&lt;br&gt;&lt;br&gt;5. MOE의 장점과 한계&lt;br&gt;&lt;br&gt;5.1. 장점&lt;br&gt;&lt;br&gt;모델 확장성:&lt;br&gt;실제 계산에 필요한 파라미터는 제한적이지만, 전체 모델 파라미터 수를 크게 늘릴 수 있어 모델의 표현력과 학습 용량이 향상됩니다.&lt;br&gt;&lt;br&gt;계산 효율성:&lt;br&gt;희소 활성화 덕분에 매 전파 단계마다 일부 전문가만 사용하므로, 메모리 및 계산 자원을 효율적으로 사용할 수 있습니다.&lt;br&gt;&lt;br&gt;전문화된 학습:&lt;br&gt;각 전문가가 특정 데이터 패턴에 특화되어 학습함으로써, 모델 전체의 성능 및 일반화 능력이 향상될 수 있습니다.&lt;br&gt;&lt;br&gt;&lt;br&gt;5.2. 한계 및 도전 과제&lt;br&gt;&lt;br&gt;학습 안정성 문제:&lt;br&gt;게이팅 네트워크의 부적절한 동작이나 전문가 간의 부하 불균형으로 인해 학습이 불안정해질 수 있습니다.&lt;br&gt;&lt;br&gt;구현 복잡도:&lt;br&gt;MOE 레이어의 동적 라우팅, 부하 균형 손실 등은 기존 모델에 비해 구현 및 최적화가 복잡합니다.&lt;br&gt;&lt;br&gt;추론 지연:&lt;br&gt;분산 환경에서 전문가 간 통신 및 결과 결합 과정이 추가되어, 실시간 추론 시 지연(latency)이 발생할 수 있습니다.&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;---&lt;br&gt;&lt;br&gt;6. 향후 전망&lt;br&gt;&lt;br&gt;단순화 및 효율화 연구:&lt;br&gt;Switch Transformer와 같이, MOE 구조를 단순화하면서도 효율을 유지하는 방법론이 계속해서 제안되고 있습니다.&lt;br&gt;&lt;br&gt;정규화 및 최적화 기법 개발:&lt;br&gt;전문가 선택의 불균형 문제를 해결하기 위한 새로운 정규화, 보조 손실, 라우팅 정책 등이 활발히 연구되고 있습니다.&lt;br&gt;&lt;br&gt;하드웨어 및 소프트웨어 최적화:&lt;br&gt;MOE의 특성을 잘 살릴 수 있도록, 전용 하드웨어 가속기나 분산 처리 프레임워크의 개선도 진행 중입니다.&lt;br&gt;&lt;br&gt;다양한 응용 분야 확대:&lt;br&gt;LLM뿐만 아니라 컴퓨터 비전, 음성 인식 등 다양한 분야에서 MOE 기법을 활용한 모델이 등장하고 있으며, 각 분야에 맞춘 전문가 설계가 연구될 전망입니다.&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;---&lt;br&gt;&lt;br&gt;결론&lt;br&gt;&lt;br&gt;MOE(Mixture-of-Experts) 방법론은 LLM의 규모를 획기적으로 확장하면서도, 실제 계산 비용은 희소 활성화 방식을 통해 효율적으로 관리할 수 있게 해줍니다.&lt;br&gt;&lt;br&gt;핵심 아이디어: 여러 전문가 네트워크와 게이팅 네트워크를 통해 입력에 따라 동적으로 전문가를 선택하는 방식&lt;br&gt;&lt;br&gt;연구 발전: 초기 Sparsely-Gated MOE에서 출발하여, Switch Transformer와 같은 단순화된 모델로 발전&lt;br&gt;&lt;br&gt;개발 고려사항: 하이퍼파라미터 튜닝, 부하 균형, 분산 학습 최적화 등 실무적 측면에서 여러 도전 과제 존재&lt;br&gt;&lt;br&gt;&lt;br&gt;이러한 특성 덕분에 MOE는 대규모 모델 개발의 핵심 기술로 자리 잡고 있으며, 향후 LLM 및 기타 AI 시스템의 발전에 중요한 역할을 할 것으로 기대됩니다.&lt;br&gt;&lt;br&gt;&lt;br&gt;---&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1792&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cbXKsp/btsL2Bt9NEV/5QHv6kiI7UaaauUTQcLC2K/tfile.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cbXKsp/btsL2Bt9NEV/5QHv6kiI7UaaauUTQcLC2K/tfile.webp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cbXKsp/btsL2Bt9NEV/5QHv6kiI7UaaauUTQcLC2K/tfile.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcbXKsp%2FbtsL2Bt9NEV%2F5QHv6kiI7UaaauUTQcLC2K%2Ftfile.webp&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;1792&quot; height=&quot;1024&quot; data-origin-width=&quot;1792&quot; data-origin-height=&quot;1024&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;&lt;br&gt;&lt;br&gt;이와 같이, MOE의 원리와 관련 연구, 개발 방법론 및 고려사항에 대해 정리해 보았습니다. 이를 바탕으로 최신 논문과 실제 구현 사례들을 참고하면, MOE 기법을 보다 깊이 이해하고 실무에 적용하는 데 큰 도움이 될 것입니다.&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;/p&gt;</description>
      <category>Life/자율주행, AI</category>
      <author>세미531</author>
      <guid isPermaLink="true">https://semi531.tistory.com/132</guid>
      <comments>https://semi531.tistory.com/132#entry132comment</comments>
      <pubDate>Sat, 1 Feb 2025 16:19:33 +0900</pubDate>
    </item>
    <item>
      <title>deepseek 개인정보 유출 관련 세부 내용deepseek 개인정보 유출 관련 세부 내용</title>
      <link>https://semi531.tistory.com/131</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DeepSeek 개인정보 처리 관련 네이버 AI 센터장 하정우님의 글을 보고 찾아보게 되었습니다. 일반적인 것 보다 더 많은 개인정보를 수집한다고 해서 직접 방침을 찾아서 정리해 보았습니다.&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-origin-width=&quot;195&quot; data-origin-height=&quot;41&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dE2Jvf/btsL2A1LfqD/oV5hKLf5MaVRW66bBX8es1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dE2Jvf/btsL2A1LfqD/oV5hKLf5MaVRW66bBX8es1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dE2Jvf/btsL2A1LfqD/oV5hKLf5MaVRW66bBX8es1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdE2Jvf%2FbtsL2A1LfqD%2FoV5hKLf5MaVRW66bBX8es1%2Fimg.jpg&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;195&quot; height=&quot;41&quot; data-origin-width=&quot;195&quot; data-origin-height=&quot;41&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;DeepSeek의 개인정보 처리 방침에 따르면, 회사는 사용자의 개인정보를 다음과 같은 방식으로 수집합니다:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;사용자가 제공하는 정보&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;프로필 정보&lt;/b&gt;: 계정 생성 시 제공되는 생년월일, 사용자명, 이메일 주소, 전화번호, 비밀번호 등.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;사용자 입력&lt;/b&gt;: 서비스 이용 중 입력한 텍스트나 오디오, 업로드한 파일, 피드백, 채팅 기록 등.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;문의 시 제공되는 정보&lt;/b&gt;: 고객 지원 등을 위해 제공되는 추가 정보.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;자동으로 수집되는 정보&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;기술 정보&lt;/b&gt;: 디바이스 모델, 운영 체제, IP 주소, 시스템 언어, 키스트로크 패턴, 크래시 리포트 등.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;사용 정보&lt;/b&gt;: 서비스 이용 시 사용된 기능과 활동 내역.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;쿠키 및 유사 기술&lt;/b&gt;: 쿠키를 통해 수집되는 정보로, 서비스 개선 및 사용자 경험 향상에 활용.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;다른 출처로부터의 정보&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;로그인 서비스&lt;/b&gt;: Apple이나 Google 계정을 통한 로그인 시 해당 플랫폼으로부터 수집되는 정보.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;광고 및 분석 파트너&lt;/b&gt;: 광고 및 분석 파트너로부터 제공받는 사용자 활동 정보.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수집된 정보는 다음과 같은 목적으로 사용됩니다:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;서비스 제공 및 관리&lt;/b&gt;: 사용자 지원 및 서비스 운영.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;정책 준수 및 법적 의무 이행&lt;/b&gt;: 이용 약관 및 정책 준수 여부 확인.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;안전 및 보안 유지&lt;/b&gt;: 기술적 문제나 보안 위협 대응.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;서비스 개선 및 개발&lt;/b&gt;: 사용자 상호작용 분석을 통한 서비스 품질 향상.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adfit&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;728x90&lt;/div&gt;
    &lt;ins class=&quot;kakao_ad_area&quot; style=&quot;display: none;&quot; data-ad-unit=&quot;DAN-HTkFRsyqtifHo4RK&quot; data-ad-width=&quot;728px&quot; data-ad-height=&quot;90px&quot;&gt;&lt;/ins&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;//t1.daumcdn.net/kas/static/ba.min.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DeepSeek은 수집된 정보를 다음과 같이 공유할 수 있습니다:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;서비스 제공자&lt;/b&gt;: 서비스 운영에 필요한 제3자 제공자와의 공유.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;비즈니스 파트너&lt;/b&gt;: 광고 및 분석 목적으로 파트너와의 정보 공유.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;법적 요구&lt;/b&gt;: 법적 의무 준수를 위해 정부 기관 등과의 정보 공유.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자는 자신의 개인정보에 대한 접근, 수정, 삭제 등의 권리를 가지며, 이러한 권리 행사를 위해 DeepSeek의 지원팀에 문의할 수 있습니다. 또한, 계정 설정을 통해 채팅 기록 삭제 등 일부 개인정보를 직접 관리할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DeepSeek은 개인정보를 중국에 위치한 안전한 서버에 저장하며, 수집된 정보는 암호화 및 접근 제어 등 업계 표준 보안 조치를 통해 보호됩니다. 그러나 인터넷을 통한 데이터 전송의 완전한 보안을 보장할 수 없으므로, 민감한 정보를 공유할 때는 주의가 필요합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Life/자율주행, AI</category>
      <category>deepseek 개인정보</category>
      <category>deepseek 프라이버시</category>
      <category>개인정보 중국</category>
      <category>딥시크 개인정보</category>
      <category>딥시크 개인정보 유출</category>
      <category>딥시크 개인정보 중국</category>
      <category>딥시크 보안</category>
      <category>딥시크 유출</category>
      <category>딥시크 채팅 패턴</category>
      <category>딥시크 프라이버시</category>
      <author>세미531</author>
      <guid isPermaLink="true">https://semi531.tistory.com/131</guid>
      <comments>https://semi531.tistory.com/131#entry131comment</comments>
      <pubDate>Tue, 28 Jan 2025 21:53:57 +0900</pubDate>
    </item>
    <item>
      <title>Deepseek V3 Technical Report 논문 리뷰</title>
      <link>https://semi531.tistory.com/130</link>
      <description>&lt;h3 data-pm-slice=&quot;1 3 []&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;Deepseek 때문에 세상이 시끄러운 요즘 정확한 이론적 분석을 위해 논문 리뷰를 작성했습니다. &lt;/span&gt;&lt;/h3&gt;
&lt;h3 data-pm-slice=&quot;1 3 []&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;780&quot; data-origin-height=&quot;165&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/t1p1k/btsL2AUY3yO/vBKuQ3LESTHwIjfGjWo860/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/t1p1k/btsL2AUY3yO/vBKuQ3LESTHwIjfGjWo860/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/t1p1k/btsL2AUY3yO/vBKuQ3LESTHwIjfGjWo860/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ft1p1k%2FbtsL2AUY3yO%2FvBKuQ3LESTHwIjfGjWo860%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;402&quot; height=&quot;85&quot; data-origin-width=&quot;780&quot; data-origin-height=&quot;165&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-pm-slice=&quot;1 3 []&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;Deepseek V3 모델에 대한 내용이고 53페이지 분량의 논문을 요약해서 중요 부분만 정리하였고 지속적으로 수정해나아갈 예정입니다.&lt;/span&gt;&lt;/h3&gt;
&lt;h3 data-pm-slice=&quot;1 3 []&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-pm-slice=&quot;1 3 []&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;&lt;b&gt;1. 서론&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;내용 요약:&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;DeepSeek-V3는 Mixture-of-Experts(MoE) 기반으로, 총 6710억 개의 파라미터를 가지며, 이 중 370억 개가 각 토큰에 활성화됩니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;DeepSeek-V2의 아키텍처를 기반으로 하지만 다음과 같은 혁신적인 전략을 도입했습니다:&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;보조 손실(auxiliary-loss) 없는 로드 밸런싱&lt;/b&gt;&lt;/span&gt;&lt;span&gt;으로 성능 저하 없이 계산 효율성 향상.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;**멀티 토큰 예측(MTP)**을 통해 데이터 효율성과 전반적인 성능 강화.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;FP8 혼합 정밀도 훈련&lt;/b&gt;&lt;/span&gt;&lt;span&gt;을 사용하여 효율적인 계산과 메모리 최적화를 달성했습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;사전 훈련 데이터는 14.8조 개의 토큰으로 구성되며, 지도 학습(SFT) 및 강화 학습(RL)을 포함한 후속 훈련 단계를 거쳤습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;DeepSeek-V3는 다양한 벤치마크에서 최신 성능을 달성했으며, $557.6만의 훈련 비용과 278.8만 GPU 시간을 유지했습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;배경 지식:&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;Mixture-of-Experts(MoE):&lt;/b&gt;&lt;/span&gt;&lt;span&gt; 입력 데이터를 처리할 때 일부 전문가 레이어만 활성화하여 확장성과 계산 효율성을 높이는 기법입니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;멀티 토큰 예측(MTP):&lt;/b&gt;&lt;/span&gt;&lt;span&gt; 하나의 순방향 패스에서 여러 개의 미래 토큰을 예측하여 학습 신호 밀도를 증가시키는 방법입니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;FP8:&lt;/b&gt;&lt;/span&gt;&lt;span&gt; 메모리 사용량과 계산 비용을 줄이면서도 성능 손실을 최소화하는 저정밀도 부동소수점 형식입니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;&lt;b&gt;2. 아키텍처&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;&lt;b&gt;2.1 기본 아키텍처&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;내용 요약:&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;DeepSeek-V3는 Transformer 프레임워크를 기반으로 구축되었으며, 다음을 포함합니다:&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;Multi-head Latent Attention (MLA):&lt;/b&gt;&lt;/span&gt;&lt;span&gt; 추론 중 Key-Value(KV) 캐시 크기를 줄이면서 높은 성능을 유지합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;DeepSeekMoE:&lt;/b&gt;&lt;/span&gt;&lt;span&gt; 세밀한 전문가(fine-grained experts)와 보조 손실 없는 로드 밸런싱 메커니즘을 도입한 MoE 프레임워크.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;세부 내용:&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;MLA는 Key와 Value를 저차원 압축 방식으로 처리하여 KV 캐시 크기를 줄입니다. 모델은 잠재 벡터만 캐시하여 메모리를 절약하면서도 성능을 유지합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;DeepSeekMoE는 공유 전문가와 라우팅된 전문가를 도입합니다. 로드 밸런싱은 보조 손실 대신 동적으로 라우팅 편향을 조정하여 유지됩니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;배경 지식:&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;Transformer 프레임워크:&lt;/b&gt;&lt;/span&gt;&lt;span&gt; Self-Attention 메커니즘을 사용하여 긴 문맥 정보를 학습하는 심층 학습 아키텍처.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;보조 손실(Auxiliary Loss):&lt;/b&gt;&lt;/span&gt;&lt;span&gt; MoE에서 전문가 간 로드 밸런스를 강제하기 위해 사용되는 정규화 기술로, DeepSeek-V3는 이를 최소화하거나 사용하지 않습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;&lt;b&gt;2.2 멀티 토큰 예측 (MTP)&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;내용 요약:&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;MTP는 학습 목표를 확장하여 각 입력에 대해 여러 개의 미래 토큰을 예측함으로써 데이터 효율성을 높입니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;순차적인 모듈들이 토큰을 예측하면서도 인과적 관계를 유지하여 일관성을 보장합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;배경 지식:&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;Cross-Entropy Loss:&lt;/b&gt;&lt;/span&gt;&lt;span&gt; 언어 모델에서 토큰 수준 예측을 위해 사용되는 표준 손실 함수.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;인과적 관계(Causal Relationship):&lt;/b&gt;&lt;/span&gt;&lt;span&gt; 특정 단계에서의 예측이 이전 토큰에만 의존하도록 보장하여 autoregressive 모델의 핵심입니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;&lt;b&gt;3. 인프라&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;&lt;b&gt;3.1 컴퓨팅 클러스터&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;내용 요약:&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;DeepSeek-V3는 2048개의 NVIDIA H800 GPU로 구성된 클러스터에서 훈련되었습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;각 노드는 NVLink로 연결된 8개의 GPU를 포함하며, 노드 간에는 InfiniBand(IB)가 통신을 담당합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;배경 지식:&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;NVLink/NVSwitch:&lt;/b&gt;&lt;/span&gt;&lt;span&gt; 노드 내 GPU 간 고속 데이터 전송을 가능하게 하는 NVIDIA 기술.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;InfiniBand(IB):&lt;/b&gt;&lt;/span&gt;&lt;span&gt; 노드 간 고속, 저지연 네트워킹 기술.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;&lt;b&gt;3.2 훈련 프레임워크&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;내용 요약:&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;DualPipe&lt;/b&gt;&lt;/span&gt;&lt;span&gt;라는 파이프라인 병렬 알고리즘을 사용하여 계산과 통신을 겹치게 함으로써 훈련 효율성을 극대화합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;효율적인 노드 간 통신 커널을 사용하여 MoE 훈련의 통신 병목을 줄입니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;메모리 최적화 기술로 텐서 병렬성을 사용하지 않고도 훈련이 가능합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;세부 내용:&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;DualPipe는 계산을 더 작은 청크로 나누어 순방향 및 역방향 과정을 겹쳐 GPU 유휴 시간을 줄입니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;맞춤형 통신 커널은 NVLink와 IB의 계층적 대역폭 차이를 활용합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;배경 지식:&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;파이프라인 병렬성:&lt;/b&gt;&lt;/span&gt;&lt;span&gt; 모델 계층을 장치 간에 분할하여 동시 계산을 가능하게 합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;노드 간 통신:&lt;/b&gt;&lt;/span&gt;&lt;span&gt; 분산 시스템에서 데이터 교환 효율성을 보장합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;&lt;b&gt;3.3 FP8 훈련&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;내용 요약:&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;DeepSeek-V3는 FP8 혼합 정밀도 프레임워크를 사용하여 메모리 소비를 줄이고 수치적 안정성을 유지합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;세밀한 양자화 및 누적 전략으로 아웃라이어로 인한 정밀도 손실을 완화합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;세부 내용:&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;활성화 및 그래디언트를 타일 및 블록 수준에서 양자화하여 데이터 분포 아웃라이어를 처리합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;FP8 계산은 고정밀 FP32 누적으로 지원되어 안정성을 높입니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;배경 지식:&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;양자화(Quantization):&lt;/b&gt;&lt;/span&gt;&lt;span&gt; 수치 표현의 정밀도를 줄여 메모리와 계산 비용을 절감합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;혼합 정밀도 훈련:&lt;/b&gt;&lt;/span&gt;&lt;span&gt; 낮은 정밀도와 높은 정밀도 작업을 결합하여 효율성과 정확도를 균형 있게 유지합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;&lt;b&gt;3.4 추론 및 배포&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;내용 요약:&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;추론은 전처리(prefilling)와 디코딩(decoding) 단계로 나뉘어 처리량을 최대화하면서 서비스 수준 목표(SLO)를 충족합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;중복 전문가를 동적으로 할당하여 GPU 간 로드를 균형 있게 분배합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;배경 지식:&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;전처리(prefilling):&lt;/b&gt;&lt;/span&gt;&lt;span&gt; 입력 시퀀스를 처리하여 초기 상태를 계산합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;디코딩(decoding):&lt;/b&gt;&lt;/span&gt;&lt;span&gt; 추론 중 출력 토큰을 순차적으로 생성합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adfit&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;728x90&lt;/div&gt;
    &lt;ins class=&quot;kakao_ad_area&quot; style=&quot;display: none;&quot; data-ad-unit=&quot;DAN-HTkFRsyqtifHo4RK&quot; data-ad-width=&quot;728px&quot; data-ad-height=&quot;90px&quot;&gt;&lt;/ins&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;//t1.daumcdn.net/kas/static/ba.min.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;&lt;b&gt;4. 사전 훈련&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;&lt;b&gt;4.1 데이터 구성&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;내용 요약:&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;14.8조 개의 다양한 토큰으로 사전 훈련 데이터를 구성하여 다양한 도메인과 언어를 포괄합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;&lt;b&gt;4.2 하이퍼파라미터&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;내용 요약:&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;학습 안정성과 효율성을 최적화하기 위한 학습률 스케줄, 배치 크기 등 세부 하이퍼파라미터를 설정했습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;&lt;b&gt;4.3 긴 문맥 확장&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;내용 요약:&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;문맥 길이를 두 단계로 나누어 128K 토큰까지 확장하여 긴 시퀀스를 효과적으로 처리할 수 있도록 했습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;배경 지식:&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;문맥 길이(Context Length):&lt;/b&gt;&lt;/span&gt;&lt;span&gt; 모델이 한 번에 처리할 수 있는 최대 토큰 수.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;&lt;b&gt;4.4 평가&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;내용 요약:&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;MMLU, GPQA 및 수학/코드 과제를 포함한 벤치마크에서 DeepSeek-V3는 오픈 소스 모델을 능가하고 GPT-4와 같은 폐쇄형 모델과 대등한 성능을 보였습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;&lt;b&gt;5. 후속 훈련&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;&lt;b&gt;5.1 지도 학습 (SFT)&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;내용 요약:&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;고품질 레이블 데이터셋을 사용하여 기본 모델을 인간의 선호에 맞게 조정했습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;&lt;b&gt;5.2 강화 학습 (RL)&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;내용 요약:&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;Group Relative Policy Optimization(GRPO)을 활용하여 생성 능력을 강화했습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;&lt;b&gt;5.3 평가&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;내용 요약:&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;후속 훈련 평가 결과, 추론, 사실성, 스타일 제어에서 개선된 성능을 확인했습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;&lt;b&gt;6. 결론, 한계 및 미래 방향&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;내용 요약:&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;아키텍처 혁신, 비용 효율적인 훈련, 경쟁력 있는 성능을 요약합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;특정 하드웨어 의존성과 같은 한계를 논의하며, 멀티모달 작업 지원 등 미래 개선 방향을 제안합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;배경 지식:&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;멀티모달 작업:&lt;/b&gt;&lt;/span&gt;&lt;span&gt; 텍스트, 이미지 및 오디오 처리 기능을 하나의 모델에 통합하는 작업.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Life/자율주행, AI</category>
      <category>deepseek gpu</category>
      <category>deepseek nvidia</category>
      <category>deepseek 엔비디아</category>
      <category>딥시크</category>
      <category>딥시크 gpu</category>
      <category>딥시크 h100</category>
      <category>딥시크 h800</category>
      <category>딥시크 엔비디아</category>
      <category>딥시크 엔비디아 중국</category>
      <category>딥시크 중국</category>
      <author>세미531</author>
      <guid isPermaLink="true">https://semi531.tistory.com/130</guid>
      <comments>https://semi531.tistory.com/130#entry130comment</comments>
      <pubDate>Tue, 28 Jan 2025 20:18:23 +0900</pubDate>
    </item>
    <item>
      <title>2025 Deepseek 의 멀티모달 AI, janus pro 논문 리뷰</title>
      <link>https://semi531.tistory.com/129</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Deepseek 가 세상을 흔들고 있습니다. Reasoning model 인 R1 공개부터 math 전용 모델 등 엄청난 오픈소스 공개를 하던 와중 멀티모달 모델 또한 오픈소스로 공개하였습니다. 더욱 기술적인 분석을 위해 논문 분석을 통해 기술을 알아보도록 하겠습니다.&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-origin-width=&quot;200&quot; data-origin-height=&quot;200&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xekmz/btsL2I6AJEH/HPHUI2QFrJCf7dsvj5OVeK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xekmz/btsL2I6AJEH/HPHUI2QFrJCf7dsvj5OVeK/img.png&quot; data-alt=&quot;deepseek&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xekmz/btsL2I6AJEH/HPHUI2QFrJCf7dsvj5OVeK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fxekmz%2FbtsL2I6AJEH%2FHPHUI2QFrJCf7dsvj5OVeK%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;200&quot; height=&quot;200&quot; data-origin-width=&quot;200&quot; data-origin-height=&quot;200&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;deepseek&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;논문의 전반적인 흐름은 기존 &quot;Janus&quot; 모델을 확장&amp;middot;개선한 &quot;Janus-Pro&quot;를 제안하고, 이를 통해 멀티모달(이미지+텍스트) 이해와 텍스트-투-이미지(text-to-image) 생성 성능을 동시에 높이는 과정을 다룹니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. Introduction&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;섹션 요약&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;최근 멀티모달 러닝 영역에서, &lt;b&gt;하나의 모델&lt;/b&gt;이 동시에 이미지 이해(예: 질의응답, 설명 등)와 이미지 생성(텍스트 프롬프트를 바탕으로 이미지를 생성하는 task)을 모두 수행하도록 하는 연구가 증가하고 있음.&lt;/li&gt;
&lt;li&gt;대표적인 시도들이 있지만, 같은 비전(vision) 인코더를 이해와 생성에 &lt;b&gt;공유&lt;/b&gt;하면 두 가지 목적(이해 vs. 생성)에서 요구되는 특징이 충돌하여 최적의 성능을 얻기 어렵다는 문제점이 존재함.&lt;/li&gt;
&lt;li&gt;이를 해결하기 위해 &quot;Janus&quot;라는 모델이 먼저 제안되었는데, 이 모델은 비전 인코더를 &lt;b&gt;분리(decoupling)&lt;/b&gt; 하는 아이디어로 멀티모달 이해와 이미지 생성 두 측면에서 뛰어난 성능을 보임.&lt;/li&gt;
&lt;li&gt;다만, &quot;Janus&quot;는 모델 규모와 학습 데이터가 제한적이어서 짧은 프롬프트 기반의 이미지 생성 품질이 떨어지거나 불안정성이 높았다는 한계점이 있었음.&lt;/li&gt;
&lt;li&gt;이 논문에서는 &quot;Janus-Pro&quot;를 제안하며,&lt;br /&gt;1) &lt;b&gt;최적화된 학습 전략&lt;/b&gt; 적용,&lt;br /&gt;2) &lt;b&gt;훈련 데이터 확대&lt;/b&gt;,&lt;br /&gt;3) &lt;b&gt;모델 규모 확장&lt;/b&gt;&lt;br /&gt;을 통해 단점들을 개선하고, 이해와 생성 모두에서 성능을 크게 향상시킴.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;필요한 배경 지식&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;멀티모달(멀티모달리티) 학습&lt;/b&gt;: 텍스트, 이미지, 오디오, 비디오 등 여러 모달리티를 함께 처리할 수 있는 모델을 만드는 방식.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;텍스트-투-이미지(text-to-image) 모델&lt;/b&gt;: 텍스트 프롬프트를 입력받아 해당 내용을 시각적으로 표현하는 이미지를 생성하는 모델.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;예: DALL-E 시리즈, Stable Diffusion 계열, Midjourney 등.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;이해 모델 vs. 생성 모델&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;ldquo;이해&amp;rdquo; 파이프라인은 이미지를 받아서 객체를 인식하거나, 질문에 답하거나, 이미지에 대해 설명을 생성함.&lt;/li&gt;
&lt;li&gt;&amp;ldquo;생성&amp;rdquo; 파이프라인은 텍스트로부터 이미지를 직접 생성함.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&amp;ldquo;분리된 비전 인코더(decoupled visual encoding)&amp;rdquo;&lt;/b&gt;: 이해와 생성이라는 두 가지 상이한 task에 대해 서로 다른 인코더를 사용함으로써, 두 파트가 서로의 성능을 저해하지 않도록 하는 방식.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. Method&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;섹션 요약&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Janus-Pro의 모델 구조와 학습 전략에 대한 개요를 제시.&lt;/li&gt;
&lt;li&gt;이전 &amp;ldquo;Janus&amp;rdquo;와 큰 틀은 같으나, &lt;b&gt;학습 전략&lt;/b&gt;(2.2), &lt;b&gt;데이터&lt;/b&gt;(2.3), &lt;b&gt;모델 크기&lt;/b&gt;(2.4) 측면에서 개선이 이뤄짐.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;필요한 배경 지식&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Auto-regressive transformer(자기회귀 트랜스포머)&lt;/b&gt;: 순차적으로 토큰을 하나씩 예측하는 방식의 모델. GPT 계열이 대표적이며, 문장 혹은 토큰 시퀀스를 한 번에 다루는 대신 매 시점마다 &amp;ldquo;이전까지의 토큰&amp;rdquo;을 바탕으로 &amp;ldquo;다음 토큰&amp;rdquo;을 예측함.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;LLM(Large Language Model)&lt;/b&gt;: 대규모 파라미터(수억 ~ 수천억 이상)를 가진 트랜스포머 기반 언어 모델.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;비전 토크나이저(Vision Tokenizer)&lt;/b&gt;: 이미지를 토큰 단위로 변환하는 단계. 예를 들어, VQ-VAE나 ViT 패치 토큰 등이 있음.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Decoupling&lt;/b&gt;: 하나의 기능(멀티모달 이해)과 다른 기능(이미지 생성)을 서로 간섭 없이 별도의 경로로 처리하도록 설계하는 방법.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.1. Architecture&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;섹션 요약&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Janus-Pro의 전체 구조는 이전 Janus와 동일하게, &lt;b&gt;비전 인코더를 두 개&lt;/b&gt; 준비하여 각각 이해용(&amp;ldquo;Understanding Encoder&amp;rdquo;), 생성용(&amp;ldquo;Generation Encoder&amp;rdquo;)으로 사용한다.&lt;/li&gt;
&lt;li&gt;이해용 인코더(SigLIP)와 생성용 인코더(VQ tokenizer)에서 뽑아낸 피처를, 공통으로 사용하는 &lt;b&gt;오토레그레시브 트랜스포머(LLM)&lt;/b&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;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;구조 상세&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;이해(Inference) 흐름&lt;/b&gt;&lt;br /&gt;1) 이미지를 SigLIP 모델로 인코딩 &amp;rarr; &lt;b&gt;고차원 특징&lt;/b&gt;을 추출 (공간적 grid 형태).&lt;br /&gt;2) 이 특징 지도를 1D 시퀀스로 풀어서(Flatten) &amp;ldquo;이해(understanding) 어댑터&amp;rdquo;에 통과시킴.&lt;br /&gt;3) 이 어댑터가 특징 벡터를 LLM 입출력 공간(토큰 임베딩 차원)에 맞게 변환해 줌.&lt;br /&gt;4) 이후 LLM이 텍스트 토큰과 함께 이 시각 특징 시퀀스를 받아서 질의응답, 설명 등 텍스트 형태의 출력을 생성함.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;생성(Generation) 흐름&lt;/b&gt;&lt;br /&gt;1) 이미지를 VQ tokenizer(예: VQ-VAE-like 토크나이저)로 변환하면, 2D 이미지를 코드북 인덱스(codebook index)들의 2D 배열로 바꿀 수 있음.&lt;br /&gt;2) 이를 1D 시퀀스로 Flatten한 뒤, &amp;ldquo;생성(generation) 어댑터&amp;rdquo;로 입력하여 LLM 임베딩과 매핑.&lt;br /&gt;3) LLM은 오토레그레시브하게 텍스트 및 이미지 토큰(코드 인덱스)을 다음 토큰으로 예측.&lt;br /&gt;4) 최종적으로 &amp;ldquo;이미지 디코더(=VQ 디코더)&amp;rdquo;가 이 이미지 코드들을 실제 이미지로 복원함.&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;필요한 배경 지식&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;SigLIP&lt;/b&gt;: CLIP 유사 구조로, 이미지와 텍스트를 공통 임베딩 공간으로 매핑하는 모델 중 하나. 여기서는 멀티모달 이해에 최적화된 비전 인코더로 활용.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;VQ tokenizer&lt;/b&gt;: 이미지의 픽셀을 일정 크기의 패치나 latent code로 변환해, 텍스트 토큰처럼 시퀀스로 만들 수 있게 해주는 모듈. 예컨대, VQ-VAE 계열.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Flatten&lt;/b&gt;: 2차원(예: 32&amp;times;32) 피처 맵을 1차원(32&amp;times;32=1024 길이)의 시퀀스로 펼치는 과정.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.2. Optimized Training Strategy&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;섹션 요약&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Janus에서 사용하던 세 단계 학습 전략(3-stage)을 그대로 유지하되, 내부적으로 어떻게 데이터와 학습 스케줄을 개선했는지 자세히 설명.&lt;/li&gt;
&lt;li&gt;특히, Stage II(통합 프리트레이닝)에서 ImageNet만으로 픽셀 종속성(=이미지 자체의 패턴 학습)을 많이 훈련하던 부분을 줄이고, 본격적인 텍스트-투-이미지 데이터로 학습을 더 많이 시키도록 바꿈.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;배경: 기존 Janus의 세 단계&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;Stage I&lt;/b&gt;: 이해&amp;middot;생성용 어댑터 및 이미지 디코더만 학습(LLM과 비전 인코더는 고정).&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Stage II&lt;/b&gt;: 본격적인 멀티모달 사전학습(Pretraining). LLM 파라미터도 업데이트하며, &quot;이해 + 생성&quot;이 동시에 가능하도록 대규모 데이터(이미지-텍스트 쌍)를 학습.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Stage III&lt;/b&gt;: 추가적인 지도 학습(Supervised Fine-tuning) 단계. 사람의 설명, 질문응답, 대화형 데이터 등으로 미세 조정.&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Janus-Pro 개선점&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;Stage I을 더 길게&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ImageNet을 이용해 생성 모델(디코더+생성 어댑터) 쪽에서 &lt;b&gt;픽셀 의존성&lt;/b&gt;을 충분히 학습시킴.&lt;/li&gt;
&lt;li&gt;이렇게 하면 LLM 파라미터를 고정한 상태에서도 &amp;ldquo;카테고리 명령(예: dog, cat 등)만으로 대략적인 이미지를 만드는 능력&amp;rdquo;을 빠르게 끌어올릴 수 있음.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Stage II에서는 ImageNet 활용 제거&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Janus는 Stage II에서 ImageNet 데이터를 상당 부분 섞어서 썼으나, &lt;b&gt;Janus-Pro&lt;/b&gt;는 이를 제거하고, &lt;b&gt;다양한 텍스트-투-이미지 데이터&lt;/b&gt;에만 집중.&lt;/li&gt;
&lt;li&gt;이렇게 하면 훨씬 더 풍부한 묘사(&amp;ldquo;dense description&amp;rdquo;)를 통해 이미지를 생성하는 능력을 더 효율적으로 학습할 수 있음.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Stage III에서 데이터 비율 재조정&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;멀티모달 이해, 순수 텍스트, 텍스트-투-이미지 생성 데이터를 섞을 때, 비율(7:3:10에서 5:1:4로) 변경.&lt;/li&gt;
&lt;li&gt;생성 데이터 비중을 일부 낮추어서, 이해 쪽 성능을 좀 더 끌어올림(그렇다고 해서 생성 능력이 크게 희생되지는 않음).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;필요한 배경 지식&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;ImageNet&lt;/b&gt;: 이미지 분류(classification) 중심의 대규모 데이터셋. 일반적인 이미지 도메인의 &amp;ldquo;기초 지식&amp;rdquo;을 얻는 데 도움.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;픽셀 의존성(pixel dependency)&lt;/b&gt;: 인접 픽셀 간의 구조적 패턴, 이미지의 통계적 특성 등을 학습하는 것.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Dense description&lt;/b&gt;: &quot;하늘색 재킷을 입은 사람, 손에 빨간 사과를 들고 있음&quot; 같이, 매우 풍부하고 구체적인 텍스트 설명.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.3. Data Scaling&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;섹션 요약&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Janus-Pro에서는 &lt;b&gt;데이터 규모&lt;/b&gt;를 이해&amp;middot;생성 양 측면에서 모두 크게 늘려서 학습 안정성과 성능을 향상.&lt;/li&gt;
&lt;li&gt;이해 측면: 약 &lt;b&gt;9천만 건&lt;/b&gt;의 추가 이미지-텍스트 데이터(캡션, 문서&amp;middot;차트&amp;middot;테이블 이해용 등), DeepSeek-VL2 기반 등.&lt;/li&gt;
&lt;li&gt;생성 측면: 약 &lt;b&gt;7,200만 개&lt;/b&gt; 이상의 합성(synthetic) 이미지-텍스트 데이터 추가. 기존 &lt;b&gt;실제(real) 데이터&lt;/b&gt;와 &lt;b&gt;합성 데이터&lt;/b&gt;를 1:1로 섞어 사용.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;합성 데이터는 프롬프트와 함께 생성된 이미지들이며, 종종 &amp;lsquo;미드저니(Midjourney)&amp;rsquo; 등 모델이 만들어낸 &amp;ldquo;고품질&amp;rdquo; 결과물이나, 공개된 여러 &amp;lsquo;프롬프트 &amp;harr; 이미지&amp;rsquo; 쌍 등을 말함.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;실험 결과, 합성 데이터는 실제 데이터보다 &lt;b&gt;텍스트-이미지 정합도&lt;/b&gt;가 높거나 노이즈가 적은 편이라, 학습 안정화에 유리함. 이미지 퀄리티도 올라감.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;필요한 배경 지식&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;DeepSeek-VL2&lt;/b&gt;: 저자들이 언급한 자체 대규모 멀티모달 데이터 파이프라인. 다양한 형태의 이미지-텍스트 쌍이 포함.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;합성(synthetic) 데이터&lt;/b&gt;: 사람이 직접 촬영&amp;middot;수집한 이미지가 아니라, 다른 생성 모델이 만든 이미지.
&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;단점: 생성 모델의 &amp;lsquo;편향&amp;rsquo;이나 &amp;lsquo;특유의 아트 스타일&amp;rsquo;이 섞일 수 있음.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.4. Model Scaling&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;섹션 요약&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Janus는 &lt;b&gt;1.5B(약 15억 파라미터)짜리&lt;/b&gt; LLM 기반이었으나, Janus-Pro는 1.5B와 7B 두 버전을 모두 제작.&lt;/li&gt;
&lt;li&gt;7B 모델(약 70억 파라미터)을 쓰면, 더 빠르게 손실이 줄어들고, 이해&amp;middot;생성에서 모두 더 높은 상한선에 도달.&lt;/li&gt;
&lt;li&gt;이는 &lt;b&gt;&amp;ldquo;분리된 비전 인코더를 쓰는 구조&amp;rdquo;가 모델 크기가 커질수록 효과가 커진다&lt;/b&gt;는 점을 시사.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;필요한 배경 지식&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;DeepSeek-LLM&lt;/b&gt;: 논문에서 사용한 1.5B 및 7B 크기의 언어 모델. 최대 컨텍스트 길이 4096 토큰.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;파라미터 수 vs. 모델 성능&lt;/b&gt;: 일반적으로 LLM은 파라미터가 증가할수록 표현력과 추론 능력이 향상됨(물론 데이터/학습전략이 뒷받침된다는 전제 하에).&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adfit&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;728x90&lt;/div&gt;
    &lt;ins class=&quot;kakao_ad_area&quot; style=&quot;display: none;&quot; data-ad-unit=&quot;DAN-HTkFRsyqtifHo4RK&quot; data-ad-width=&quot;728px&quot; data-ad-height=&quot;90px&quot;&gt;&lt;/ins&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;//t1.daumcdn.net/kas/static/ba.min.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. Experiments&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Janus-Pro 모델의 구체적인 성능 평가를 다루는 장.&lt;br /&gt;(논문에서는 3.1 Implementation Details, 3.2 Evaluation Setup, 3.3 Comparison with SOTA, 3.4 Qualitative Results 등으로 세분화.)&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.1. Implementation Details&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;학습 하이퍼파라미터&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Stage별 배치 사이즈, 러닝 레이트, 학습 스텝 수, warm-up 스텝 등 구체적인 값 제시(예: Stage I에서 20K 스텝, Stage II에서 360K 스텝 등).&lt;/li&gt;
&lt;li&gt;GPU 클러스터 환경(예: NVIDIA A100 40GB &amp;times; 8 GPU &amp;times; 다수 노드)에서 약 1~2주간 학습.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;이미지 전처리&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이해 데이터의 경우, &lt;b&gt;이미지의 긴 변을 384로 맞추고 짧은 변을 패딩&lt;/b&gt;으로 채움(=가로세로 비율 유지).&lt;/li&gt;
&lt;li&gt;생성 데이터의 경우, &lt;b&gt;긴 변을 384에서 크롭&lt;/b&gt;하여 384&amp;times;384로 만듦.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;시퀀스 패킹(sequence packing)&lt;/b&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;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 디테일들은 모델이 어떻게 실제로 학습되는지, 그리고 결과가 재현 가능(reproducible)하도록 필요한 정보들임.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.2. Evaluation Setup&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;멀티모달 이해 평가&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;대표적인 벤치마크: &lt;b&gt;GQA&lt;/b&gt;, &lt;b&gt;POPE&lt;/b&gt;, &lt;b&gt;MME&lt;/b&gt;, &lt;b&gt;MMBench&lt;/b&gt;, &lt;b&gt;MM-Vet&lt;/b&gt;, &lt;b&gt;MMMU&lt;/b&gt; 등.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;GQA: 주어진 이미지에 대한 시각적 질의응답.&lt;/li&gt;
&lt;li&gt;POPE: 객체 인식 및 존재 확인 등 이미지 속 사실성 검사.&lt;/li&gt;
&lt;li&gt;MME: 사용자 정의 멀티모달 평가 벤치마크로, 인식 정확도나 문맥 이해 등을 측정.&lt;/li&gt;
&lt;li&gt;MMBench, MMMU, MM-Vet: 멀티모달 reasoning 능력을 다양하게 테스트(추론, 설득력, 기억력, 정합성 등).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;텍스트-투-이미지 평가&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;GenEval&lt;/b&gt;: 텍스트로부터 생성한 이미지가 실제로 프롬프트와 잘 일치하는지(객체&amp;middot;속성&amp;middot;색상&amp;middot;수량&amp;middot;배치 등)를 세밀하게 확인할 수 있는 벤치마크.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;DPG-Bench&lt;/b&gt;(Dense Prompt Graph Benchmark): 매우 긴 프롬프트를 주고, 얼마나 정확하고 풍부하게 이미지가 해당 프롬프트를 반영하는지 평가.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.3. Comparison with State-of-the-arts&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;섹션 요약&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Janus-Pro-1B(1.5B 파라미터)와 Janus-Pro-7B 모델이 여러 벤치마크에서 기존 SoTA 모델들과 어떻게 비교되는지 결과를 정리.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;멀티모달 이해 성능&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;POPE, MME, MMBench 등에서 기존 SOTA를 뛰어넘거나 비슷한 성능을 보임.&lt;/li&gt;
&lt;li&gt;특히 여러 &amp;ldquo;이해 전용&amp;rdquo; 모델과 비교해도 떨어지지 않음.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;텍스트-투-이미지 생성 성능&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;GenEval, DPG-Bench에서 &lt;b&gt;DALL-E 3&lt;/b&gt;, &lt;b&gt;Stable Diffusion 3 Medium&lt;/b&gt;, &lt;b&gt;Emu3-Gen&lt;/b&gt; 등과 비교했을 때도 상회하거나 유사한 수준의 성능을 달성.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;GenEval&lt;/b&gt; 기준으로 Janus-Pro-7B는 &lt;b&gt;0.80&lt;/b&gt; 점수로, Janus(0.61), DALL-E 3(0.67), SD3-Medium(0.74)을 앞섬.&lt;/li&gt;
&lt;li&gt;DPG-Bench에서도 Janus-Pro-7B(84.19점)는 기존 모델보다 우수.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 통해, &lt;b&gt;단일 모델(분리된 비전 인코더 구조)임에도, 이해와 생성 두 마리 토끼를 모두 잡는다&lt;/b&gt;는 점을 강조.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.4. Qualitative Results&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;섹션 요약&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;시각적인 예시들(Figure 4)로, 실제 이미지에 대한 질문/대답(텍스트 응답)과 텍스트로부터 생성한 이미지(384&amp;times;384 해상도) 사례를 제시.&lt;/li&gt;
&lt;li&gt;간단한 텍스트(&amp;ldquo;The face of a beautiful girl&amp;rdquo;)를 프롬프트로 줬을 때, 이전 Janus에 비해 훨씬 자연스럽고 안정적인 생성 결과를 보임.&lt;/li&gt;
&lt;li&gt;또한 문자를 이미지에 삽입하거나, 여러 객체가 복잡하게 구성된 장면 생성에서도 성능이 개선됨.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;필요한 배경 지식&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Qualitative vs. Quantitative&lt;/b&gt;: 수치적 지표(Quantitative) 이외에도, 실제 예시 이미지를 보고 사람이 직접 &lt;b&gt;시각 품질&lt;/b&gt;이나 &lt;b&gt;정합성&lt;/b&gt;을 눈으로 확인하는 단계.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. Conclusion&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;섹션 요약&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Janus-Pro의 핵심은, &amp;ldquo;분리된 비전 인코더 구조&amp;rdquo;에 추가로 &lt;b&gt;학습 전략&lt;/b&gt;, &lt;b&gt;데이터&lt;/b&gt;, &lt;b&gt;모델 규모&lt;/b&gt;를 확장&amp;middot;개선하여 성능을 크게 끌어올린 것.&lt;/li&gt;
&lt;li&gt;한계점:
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;이해 파트 해상도 384&amp;times;384 제한&lt;/b&gt; &amp;rarr; 세밀한 객체 검출 혹은 OCR 등에 어려움.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;생성 파트 해상도도 384&amp;times;384&lt;/b&gt; &amp;rarr; 미세한 디테일이 부족.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;특정 인물의 얼굴이나 글씨, 작은 디테일 등이 뭉개질 수 있음.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;향후 &lt;b&gt;해상도 증가&lt;/b&gt;를 통한 세밀화가 과제가 될 것임을 언급.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;정리&lt;/h1&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;Janus&lt;/b&gt;에서 제안된 &amp;ldquo;이해와 생성의 비전 인코더 분리&amp;rdquo; 아이디어를 &lt;b&gt;더 큰 규모&lt;/b&gt;와 &lt;b&gt;더 많은 데이터&lt;/b&gt;, &lt;b&gt;더 효율적인 학습 전략&lt;/b&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;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;세 단계 학습 전략&lt;/b&gt;(분할된 Stage I, II, III)을 유지하되,
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Stage I에 ImageNet 기반 생성 프리트레이닝 시간을 늘리고,&lt;/li&gt;
&lt;li&gt;Stage II에서는 바로 실제 &amp;ldquo;텍스트-이미지&amp;rdquo; 데이터를 더 많이 사용,&lt;/li&gt;
&lt;li&gt;Stage III에서는 멀티모달 이해용 지도학습 비중을 조금 높이는 방식으로 균형을 맞춤.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;데이터 측면&lt;/b&gt;에서,
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이해용 이미지-텍스트 쌍에 9천만 건 이상 확장,&lt;/li&gt;
&lt;li&gt;생성용 합성 데이터(약 7천만 건)를 추가하여 실제 데이터와 1:1 비율로 사용함으로써 텍스트-이미지 정합성을 더욱 끌어올림.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;모델 크기&lt;/b&gt;를 기존 1.5B에서 7B까지 확장하면서, 오토레그레시브 트랜스포머(LLM) 특유의 스케일링 효과를 극대화.&lt;/li&gt;
&lt;li&gt;실험 결과,
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;멀티모달 이해 벤치마크(GQA, MME, MMBench 등)와&lt;/li&gt;
&lt;li&gt;텍스트-투-이미지 벤치마크(GenEval, DPG-Bench)에서&lt;/li&gt;
&lt;li&gt;&lt;i&gt;모두 SOTA 또는 그에 준하는 성능을 달성*&lt;/i&gt;했음을 확인.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;필요한 추가 배경 정리&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;CLIP 계열 비전 인코더&lt;/b&gt;: 오픈AI가 발표한 CLIP은 이미지와 텍스트를 동일 임베딩 공간에 사영(Projection)하여, 텍스트-이미지간 유사도를 학습. 이 논문에서 사용하는 SigLIP은 CLIP 계열로부터 변형된 모델로서, 시그모이드 로스를 활용하여 더 나은 로블러스트(robust) 특성을 가짐.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;비전 토큰(코드)&lt;/b&gt;: VQ-VAE나 디퓨전 모델(Stable Diffusion) 내부에서 &amp;ldquo; latent code &amp;rdquo; 또는 &amp;ldquo; codebook index &amp;rdquo;를 사용해 이미지를 토큰화. 이 토큰화된 시퀀스를 언어 모델에 연결해 놓으면, 언어 모델이 이산(discrete) 토큰을 예측해 나가며 이미지를 생성 가능.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;멀티모달 세대(Multimodal Generation) 모델&lt;/b&gt;: DALL-E, Stable Diffusion, Imagen, Midjourney, Emu3 등 다양한 모델들이 이미 존재하지만, 대부분은 &amp;ldquo;이미지 생성&amp;rdquo;에 특화되어 있고, &amp;ldquo;이미지 이해&amp;rdquo;나 &amp;ldquo;멀티모달 QA&amp;rdquo; 등은 별도의 모델/파이프라인을 써야 했다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;모델 성능 평가&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이해: 정확도(Accuracy), BLEU, CIDEr 등 텍스트-기반 지표.&lt;/li&gt;
&lt;li&gt;생성: Fr&amp;eacute;chet Inception Distance(FID), CLIP Score, 유저 스터디(주관 평가) 또는 자동화된 개별 객체/속성 매칭(GenEval) 등.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이처럼 Janus-Pro는 모델을 &amp;ldquo;하나로&amp;rdquo; 묶되, 내부 인코더를 이원화하여 상충 없이 훈련하는 방식을 확장&amp;middot;개선한 사례라고 볼 수 있습니다. 결론적으로, 모델 크기가 클수록, 더 많은 양질의 데이터를 쓸수록, 그리고 다양한 학습 기술을 활용할수록 멀티모달 이해와 생성 모두에서 우수한 성능을 얻을 수 있음을 잘 보여줍니다.&lt;/p&gt;</description>
      <category>Life/자율주행, AI</category>
      <category>deepseek janus</category>
      <category>deepseek janus pro</category>
      <category>deepseek nvidia</category>
      <category>deepseek r1</category>
      <category>deepseek 멀티모달</category>
      <category>딥시크 janus 논문 리뷰</category>
      <category>딥시크 논문</category>
      <category>딥시크 멀티모달</category>
      <category>딥시크 엔비디아</category>
      <category>딥시크 이미지</category>
      <author>세미531</author>
      <guid isPermaLink="true">https://semi531.tistory.com/129</guid>
      <comments>https://semi531.tistory.com/129#entry129comment</comments>
      <pubDate>Tue, 28 Jan 2025 19:13:43 +0900</pubDate>
    </item>
    <item>
      <title>삼성 VR Moohan 리뷰</title>
      <link>https://semi531.tistory.com/128</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.google.com/url?sa=E&amp;amp;source=gmail&amp;amp;q=https://www.google.com/url?sa=E%26source=gmail%26q=https://www.youtube.com/channel/UCyU72w8_X7_211_114&quot;&gt;Marques Brownlee&lt;/a&gt;가 YouTube에 업로드한 &quot;I Tried Samsung's Secret Android XR Headset!&quot;라는 제목의 동영상을 통해 삼성과 구글이 협업하여 개발한 새로운 VR 헤드셋인 Project Moohan&amp;nbsp;을 소개합니다.&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;Gemini_Generated_Image_d03aeed03aeed03a.jpg&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;2048&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/due5d2/btsL2ogcQpM/MIXzb29F2QYsBDOpTcqce1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/due5d2/btsL2ogcQpM/MIXzb29F2QYsBDOpTcqce1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/due5d2/btsL2ogcQpM/MIXzb29F2QYsBDOpTcqce1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdue5d2%2FbtsL2ogcQpM%2FMIXzb29F2QYsBDOpTcqce1%2Fimg.jpg&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;296&quot; height=&quot;296&quot; data-filename=&quot;Gemini_Generated_Image_d03aeed03aeed03a.jpg&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;2048&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-sourcepos=&quot;5:1-5:108&quot; data-ke-size=&quot;size16&quot;&gt;Project Moohan&amp;nbsp;은 안드로이드 XR 플랫폼을 기반으로 하며, 앱스토어와 구글 어시스턴트를 통합하여 사용자 경험을 향상시킵니다. 또한, 헤드셋의 디자인과 기능에 대해서도 자세히 설명합니다.&lt;/p&gt;
&lt;h2 data-sourcepos=&quot;7:1-7:20&quot; data-ke-size=&quot;size26&quot;&gt;Project Moohan&amp;nbsp;의 특징&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;9:3-16:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;9:3-9:92&quot;&gt;&lt;b&gt;안드로이드 XR 플랫폼 기반:&lt;/b&gt; Project Moohan&amp;nbsp;은 안드로이드 XR 플랫폼을 기반으로 하기 때문에, 안드로이드 앱을 자유롭게 사용할 수 있습니다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;10:3-10:79&quot;&gt;&lt;b&gt;앱스토어 통합:&lt;/b&gt; Project Moohan&amp;nbsp;에는 앱스토어가 내장되어 있어, 다양한 VR 앱을 쉽게 다운로드하고 설치할 수 있습니다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;11:3-11:75&quot;&gt;&lt;b&gt;구글 어시스턴트 통합:&lt;/b&gt; Project Moohan&amp;nbsp;에는 구글 어시스턴트가 내장되어 있어, 음성으로 명령을 내릴 수 있습니다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;12:3-12:60&quot;&gt;&lt;b&gt;가벼운 무게:&lt;/b&gt; Project Moohan&amp;nbsp;은 무게가 매우 가벼워서, 오랫동안 착용해도 편안합니다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;13:3-13:65&quot;&gt;&lt;b&gt;넓은 시야각:&lt;/b&gt; Project Moohan&amp;nbsp;은 시야각이 매우 넓어서, 몰입감 넘치는 VR 경험을 제공합니다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;14:3-14:72&quot;&gt;&lt;b&gt;고해상도 디스플레이:&lt;/b&gt; Project Moohan&amp;nbsp;은 고해상도 디스플레이를 사용하여, 선명하고 깨끗한 화면을 보여줍니다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;15:3-16:0&quot;&gt;&lt;b&gt;6DoF 컨트롤러:&lt;/b&gt; Project Moohan&amp;nbsp;에는 6DoF 컨트롤러가 포함되어 있어, 자유롭게 움직이고 상호작용할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adfit&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;728x90&lt;/div&gt;
    &lt;ins class=&quot;kakao_ad_area&quot; style=&quot;display: none;&quot; data-ad-unit=&quot;DAN-HTkFRsyqtifHo4RK&quot; data-ad-width=&quot;728px&quot; data-ad-height=&quot;90px&quot;&gt;&lt;/ins&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;//t1.daumcdn.net/kas/static/ba.min.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-sourcepos=&quot;17:1-17:20&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-sourcepos=&quot;17:1-17:20&quot; data-ke-size=&quot;size26&quot;&gt;Project Moohan&amp;nbsp;의 단점&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;19:3-22:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;19:3-19:36&quot;&gt;&lt;b&gt;가격:&lt;/b&gt; Project Moohan&amp;nbsp;은 가격이 비쌉니다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;20:3-20:47&quot;&gt;&lt;b&gt;배터리 수명:&lt;/b&gt; Project Moohan&amp;nbsp;의 배터리 수명은 길지 않습니다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;21:3-22:0&quot;&gt;&lt;b&gt;케이블:&lt;/b&gt; Project Moohan&amp;nbsp;은 케이블이 필요합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-sourcepos=&quot;23:1-23:20&quot; data-ke-size=&quot;size26&quot;&gt;Project Moohan&amp;nbsp;의 활용&lt;/h2&gt;
&lt;p data-sourcepos=&quot;25:1-25:34&quot; data-ke-size=&quot;size16&quot;&gt;Project Moohan&amp;nbsp;은 다양한 용도로 활용될 수 있습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;27:3-31:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;27:3-27:53&quot;&gt;&lt;b&gt;게임:&lt;/b&gt; Project Moohan&amp;nbsp;을 사용하여 다양한 VR 게임을 즐길 수 있습니다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;28:3-28:52&quot;&gt;&lt;b&gt;영상:&lt;/b&gt; Project Moohan&amp;nbsp;을 사용하여 360도 영상을 감상할 수 있습니다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;29:3-29:55&quot;&gt;&lt;b&gt;교육:&lt;/b&gt; Project Moohan&amp;nbsp;을 사용하여 다양한 교육 콘텐츠를 학습할 수 있습니다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;30:3-31:0&quot;&gt;&lt;b&gt;회의:&lt;/b&gt; Project Moohan&amp;nbsp;을 사용하여 원격 회의를 진행할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-sourcepos=&quot;32:1-32:6&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;p data-sourcepos=&quot;34:1-35:46&quot; data-ke-size=&quot;size16&quot;&gt;Project Moohan 은 삼성과 구글이 협업하여 개발한 새로운 VR 헤드셋으로, 뛰어난 성능과 다양한 기능을 갖추고 있습니다. 하지만, 가격이 비싸고 배터리 수명이 길지 않다는 단점이 있습니다. 그럼에도 불구하고, Project Moohan&amp;nbsp;은 VR 경험을 원하는 사람들에게 좋은 선택이 될 수 있습니다.&lt;/p&gt;</description>
      <category>Life/자율주행, AI</category>
      <category>moohan</category>
      <category>project moohan</category>
      <category>구글 vr</category>
      <category>구글 삼성 vr</category>
      <category>비전프로 삼성</category>
      <category>삼성</category>
      <category>삼성 moohan</category>
      <category>삼성 vr</category>
      <category>삼성 xr</category>
      <category>삼성 무한</category>
      <author>세미531</author>
      <guid isPermaLink="true">https://semi531.tistory.com/128</guid>
      <comments>https://semi531.tistory.com/128#entry128comment</comments>
      <pubDate>Tue, 28 Jan 2025 17:50:12 +0900</pubDate>
    </item>
    <item>
      <title>VPN 원리 설명 및 추천 (하단에 expressvpn 1달 무료 링크)</title>
      <link>https://semi531.tistory.com/127</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;하단에 express vpn 링크로 가입하면 1달 무료입니다! 급하신 분은 맨 아래로&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;VPN(Virtual&amp;nbsp;Private&amp;nbsp;Network,&amp;nbsp;가상&amp;nbsp;사설망)은&amp;nbsp;공용&amp;nbsp;네트워크를&amp;nbsp;통해&amp;nbsp;사설&amp;nbsp;네트워크를&amp;nbsp;안전하게&amp;nbsp;연결하는&amp;nbsp;기술입니다.&amp;nbsp;VPN을&amp;nbsp;사용하면&amp;nbsp;인터넷과&amp;nbsp;같은&amp;nbsp;공용&amp;nbsp;네트워크&amp;nbsp;상에서&amp;nbsp;마치&amp;nbsp;사설&amp;nbsp;네트워크를&amp;nbsp;사용하는&amp;nbsp;것처럼&amp;nbsp;안전하게&amp;nbsp;데이터를&amp;nbsp;송수신할&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;이는&amp;nbsp;원격지의&amp;nbsp;사용자나&amp;nbsp;지사가&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;1. VPN의 기본 원리&lt;/b&gt;&lt;br /&gt;&lt;b&gt;1.1. 터널링(Tunneling)&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;- 정의: 터널링은 두 지점 사이에 가상의 통신 경로를 생성하여 데이터를 전송하는 방법입니다. &lt;br /&gt;- 작동 방식: 데이터를 일반적인 네트워크 패킷으로 보내는 대신, 원래의 데이터를 다른 프로토콜로 캡슐화(encapsulation)하여 전송합니다. &lt;br /&gt;- 장점: 캡슐화된 데이터를 통해 전송함으로써 중간에 데이터가 노출되거나 변조되는 것을 방지합니다. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;1.2. 암호화(Encryption)&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;- 정의: 암호화는 데이터를 인가되지 않은 사용자가 읽지 못하도록 변환하는 과정입니다. &lt;br /&gt;- 작동 방식: VPN은 강력한 암호화 알고리즘을 사용하여 데이터를 암호화하고, 수신 측에서는 이를 복호화합니다. &lt;br /&gt;- 장점: 데이터를 가로채더라도 암호화되어 있으므로 내용 파악이 불가능합니다. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;1.3. 인증(Authentication)&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;- 정의: 인증은 접속하려는 사용자나 장치의 신원을 확인하는 절차입니다. &lt;br /&gt;- 작동 방식: 사용자 이름과 비밀번호, 디지털 인증서, 토큰 등의 방법을 사용합니다. &lt;br /&gt;- 장점: 인가된 사용자만이 VPN에 접속할 수 있어 보안성을 높입니다. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;2. VPN의 구성 요소&lt;/b&gt;&lt;br /&gt;&lt;b&gt;2.1. VPN 클라이언트(VPN Client)&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;-&amp;nbsp;사용자&amp;nbsp;측에서&amp;nbsp;VPN에&amp;nbsp;접속하기&amp;nbsp;위해&amp;nbsp;사용하는&amp;nbsp;소프트웨어나&amp;nbsp;하드웨어입니다. &lt;br /&gt;-&amp;nbsp;클라이언트는&amp;nbsp;VPN&amp;nbsp;서버와&amp;nbsp;통신하며,&amp;nbsp;암호화된&amp;nbsp;터널을&amp;nbsp;생성합니다. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;2.2. VPN 서버(VPN Server)&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;-&amp;nbsp;VPN&amp;nbsp;클라이언트의&amp;nbsp;연결&amp;nbsp;요청을&amp;nbsp;처리하고&amp;nbsp;인증을&amp;nbsp;수행합니다. &lt;br /&gt;-&amp;nbsp;클라이언트와의&amp;nbsp;터널링을&amp;nbsp;설정하고&amp;nbsp;데이터를&amp;nbsp;전송합니다. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;2.3. 네트워크 프로토콜(Network Protocol)&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;-&amp;nbsp;VPN은&amp;nbsp;다양한&amp;nbsp;프로토콜을&amp;nbsp;사용하여&amp;nbsp;터널링과&amp;nbsp;암호화를&amp;nbsp;수행합니다. &lt;br /&gt;- PPTP, L2TP/IPSec, OpenVPN, IKEv2, SSL/TLS 등이 있습니다. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;3. 주요 VPN 프로토콜&lt;/b&gt;&lt;br /&gt;&lt;b&gt;3.1. PPTP(Point-to-Point Tunneling Protocol)&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;- 특징: 초기 VPN 프로토콜로 설정이 간단하지만 보안 수준이 낮습니다. &lt;br /&gt;- 사용: 간단한 연결이 필요할 때 사용되지만 현재는 많이 사용되지 않습니다. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;3.2. L2TP/IPSec(Layer 2 Tunneling Protocol with IPsec)&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;- 특징: L2TP와 IPsec을 결합하여 보안을 강화한 프로토콜입니다. &lt;br /&gt;- 장점: 뛰어난 보안성과 호환성을 제공합니다. &lt;br /&gt;- 단점: 설정이 복잡하고 속도가 느릴 수 있습니다. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;3.3. OpenVPN&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;- 특징: 오픈 소스 프로토콜로 높은 보안성과 유연성을 제공합니다. &lt;br /&gt;- 장점: 다양한 암호화 알고리즘 지원, 방화벽 우회 가능. &lt;br /&gt;- 설정: 사용자 정의가 가능하지만 설정이 다소 복잡할 수 있습니다. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;3.4. IKEv2(Internet Key Exchange version 2)&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;- 특징: 안정성과 빠른 재연결 속도를 제공합니다. &lt;br /&gt;- 장점: 모바일 환경에서의 안정적인 연결 유지. &lt;br /&gt;- 단점: 지원하는 플랫폼이 제한적일 수 있습니다. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;3.5. SSL/TLS 기반 VPN&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;- 특징: 웹 브라우저 등을 통해 SSL/TLS를 이용하여 연결합니다. &lt;br /&gt;- 장점: 방화벽 등 네트워크 제약을 우회하기 쉽습니다. &lt;br /&gt;- 사용: 주로 기업 환경에서 원격 접속에 활용됩니다. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;4. VPN의 유형&lt;/b&gt;&lt;br /&gt;&lt;b&gt;4.1. 원격 접속 VPN(Remote Access VPN)&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;-&amp;nbsp;개인&amp;nbsp;사용자가&amp;nbsp;인터넷을&amp;nbsp;통해&amp;nbsp;기업의&amp;nbsp;사설&amp;nbsp;네트워크에&amp;nbsp;접속하는&amp;nbsp;방식입니다. &lt;br /&gt;-&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;4.2. 사이트 간 VPN(Site-to-Site VPN)&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;-&amp;nbsp;서로&amp;nbsp;다른&amp;nbsp;위치에&amp;nbsp;있는&amp;nbsp;네트워크를&amp;nbsp;하나의&amp;nbsp;네트워크처럼&amp;nbsp;연결합니다. &lt;br /&gt;-&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;5. VPN의 작동 과정&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;1. 접속 요청: 클라이언트가 VPN 서버에 연결을 요청합니다. &lt;br /&gt;2. 인증 절차: 서버는 클라이언트의 신원을 확인합니다. &lt;br /&gt;3. 암호화 및 터널링 설정: 인증이 완료되면 암호화된 터널이 설정됩니다. &lt;br /&gt;4. 데이터 통신: 클라이언트와 서버 간에 암호화된 데이터가 안전하게 전송됩니다. &lt;br /&gt;5. 접속 종료: 사용이 끝나면 터널이 해제되고 연결이 종료됩니다. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;6. VPN의 이점&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;- 보안 강화: 공용 Wi-Fi 사용 시 데이터 보호. &lt;br /&gt;- 프라이버시 보호: IP 주소 노출 방지로 온라인 익명성 유지. &lt;br /&gt;- 접근 제어: 인가된 사용자만 네트워크에 접근 가능. &lt;br /&gt;- 지역 제한 우회: 지리적 제한이 있는 콘텐츠에 접근 가능. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;7. VPN 사용 시 고려사항&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;- 속도 저하: 암호화로 인해 인터넷 속도가 느려질 수 있습니다. &lt;br /&gt;- 신뢰성: VPN 서비스 제공자의 신뢰도를 확인해야 합니다. &lt;br /&gt;- 법적 이슈: 일부 국가에서는 VPN 사용이 제한되거나 금지될 수 있습니다. &lt;br /&gt;- 보안 위험: 잘못된 설정이나 취약한 프로토콜 사용 시 보안 문제가 발생할 수 있습니다. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;8. 최신 동향&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;- 모바일 VPN: 스마트폰 및 태블릿에서의 VPN 사용 증가. &lt;br /&gt;- 클라우드 VPN: 클라우드 기반 서비스로 유연성 향상. &lt;br /&gt;- 제로 트러스트 네트워크: 내부와 외부를 신뢰하지 않는 보안 모델로 VPN의 역할 변화. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;9. 결론&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;VPN은&amp;nbsp;현대의&amp;nbsp;인터넷&amp;nbsp;환경에서&amp;nbsp;보안과&amp;nbsp;프라이버시를&amp;nbsp;강화하는&amp;nbsp;중요한&amp;nbsp;도구입니다.&amp;nbsp;VPN의&amp;nbsp;원리를&amp;nbsp;이해하고&amp;nbsp;올바르게&amp;nbsp;활용하면&amp;nbsp;개인과&amp;nbsp;기업&amp;nbsp;모두가&amp;nbsp;안전하고&amp;nbsp;효율적으로&amp;nbsp;네트워크를&amp;nbsp;사용할&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;그러나&amp;nbsp;VPN&amp;nbsp;사용&amp;nbsp;시에는&amp;nbsp;적절한&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adfit&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;728x90&lt;/div&gt;
    &lt;ins class=&quot;kakao_ad_area&quot; style=&quot;display: none;&quot; data-ad-unit=&quot;DAN-HTkFRsyqtifHo4RK&quot; data-ad-width=&quot;728px&quot; data-ad-height=&quot;90px&quot;&gt;&lt;/ins&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;//t1.daumcdn.net/kas/static/ba.min.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&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;ExpressVPN&lt;/b&gt;은 다양한 장점을 가지고 있습니다. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;1. 보안 및 암호화&lt;/b&gt;&lt;br /&gt;- AES-256 암호화: 미국 정부가 채택하고 전 세계 보안 전문가들이 기밀 정보를 보호하기 위해 사용하는 암호화 표준을 사용합니다. 이는 데이터를 안전하게 보호하여 공격자나 다른 제3자가 침입할 수 없도록 합니다. &lt;br /&gt;- 고급 암호화 표준: ExpressVPN은 타원 곡선 디피-헬먼(Diffie&amp;ndash;Hellman) 키 교환을 사용해 키를 협상하는 대칭 암호화 체계를 사용하여 데이터 채널 암호화를 수행합니다. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;2. 속도 및 성능&lt;/b&gt;&lt;br /&gt;- Lightway 프로토콜: ExpressVPN은 독자적으로 개발한 Lightway 프로토콜을 사용하여 빠른 속도를 제공합니다. 이 프로토콜은 모바일 환경에서도 배터리 효율성을 높이고, 속도와 빠른 서버 연결을 제공합니다. &lt;br /&gt;- 속도 테스트: ExpressVPN은 다양한 테스트에서 빠른 속도를 보였으며, 인근 서버에 연결하면 다운로드 속도에 거의 영향을 미치지 않습니다. 이는 빠른 게임 및 스트리밍 활동을 지원합니다. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;3. 서버 네트워크&lt;/b&gt;&lt;br /&gt;- 전 세계 105개국 서버: ExpressVPN은 전 세계 105개국에 위치한 서버를 제공하여 고객들이 가까운 곳에 위치한 서버를 선택할 수 있습니다. 이는 빠른 속도와 지역 제한 우회를 지원합니다. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;4. 고객 지원&lt;/b&gt;&lt;br /&gt;- 24시간 실시간 채팅 지원: ExpressVPN은 24시간 실시간 채팅 지원을 제공하여 고객들이 언제든지 설치 및 문제 해결을 받을 수 있습니다. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;5. 개인 정보 보호&lt;/b&gt;&lt;br /&gt;- 데이터 보존 정책: ExpressVPN은 데이터 보존법을 따르지 않는 관할권인 영국령 버진 아일랜드를 기반으로 하며, 활동 로그나 연결 로그를 보관하지 않습니다. 이는 고객들의 개인 정보를 보호합니다. &lt;br /&gt;- TrustedServer 기술: ExpressVPN의 독점 기술인 TrustedServer는 재부팅 시마다 서버에서 모든 데이터가 삭제되도록 보장합니다. 이는 시스템을 위험에 노출되기 어렵게 만듭니다. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;6. 고급 보호 기능&lt;/b&gt;&lt;br /&gt;- Threat Manager: ExpressVPN의 Threat Manager는 고객님의 기기에서 방문하는 모든 앱과 웹사이트가 고객님의 온라인 활동을 추적하지 못하도록 막습니다. 이는 스파이웨어와 피싱 도메인으로부터 고객님을 보호합니다. &lt;br /&gt;- 광고 차단기: 광고 차단기는 웹 브라우징 중 대부분의 디스플레이 광고가 표시되지 않도록 막습니다. &lt;br /&gt;- 자녀 보호 기능: 자녀 보호 기능은 성인 사이트에 접속하지 못하도록 막을 수 있습니다. 이는 자녀의 온라인 접속 시간을 줄이는 데 도움이 됩니다. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;7. 환불 정책&lt;/b&gt;&lt;br /&gt;- 30일 환불 보장: ExpressVPN은 30일 환불 보장을 제공하여 고객들이 서비스에 만족하지 못할 경우 환불을 받을 수 있습니다. &lt;br /&gt;&lt;br /&gt;이러한 장점들로 인해 ExpressVPN은 개인 정보 보호와 빠른 속도, 강력한 암호화 등 다양한 측면에서 우수한 VPN 서비스로 평가됩니다. &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;&lt;a href=&quot;https://www.expressrefer.com/refer-a-friend/30-days-free?locale=kr&amp;amp;referrer_id=97887973&amp;amp;utm_campaign=referrals&amp;amp;utm_medium=copy_link&amp;amp;utm_source=referral_dashboard&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.expressrefer.com/refer-a-friend/30-days-free?locale=kr&amp;amp;referrer_id=97887973&amp;amp;utm_campaign=referrals&amp;amp;utm_medium=copy_link&amp;amp;utm_source=referral_dashboard&lt;/a&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;독자분들이 VPN 의 원리에 대해 이해가 넓어지셨다면 좋겠습니다.&lt;/b&gt;&lt;br /&gt;&lt;br /&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;Gemini_Generated_Image_fxai1yfxai1yfxai.jpg&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;2048&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBnyAq/btsLYqeg4XQ/eZywIstEvBkZrG7AqTIFn1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBnyAq/btsLYqeg4XQ/eZywIstEvBkZrG7AqTIFn1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBnyAq/btsLYqeg4XQ/eZywIstEvBkZrG7AqTIFn1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBnyAq%2FbtsLYqeg4XQ%2FeZywIstEvBkZrG7AqTIFn1%2Fimg.jpg&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;214&quot; height=&quot;214&quot; data-filename=&quot;Gemini_Generated_Image_fxai1yfxai1yfxai.jpg&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;2048&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Coding/about Computer</category>
      <category>express vpn</category>
      <category>expressvpn</category>
      <category>private network</category>
      <category>vpn</category>
      <category>vpn 구독</category>
      <category>vpn 로그</category>
      <category>vpn 원리</category>
      <category>vpn 종류</category>
      <category>vpn 추천</category>
      <category>익스프레스 vpn</category>
      <author>세미531</author>
      <guid isPermaLink="true">https://semi531.tistory.com/127</guid>
      <comments>https://semi531.tistory.com/127#entry127comment</comments>
      <pubDate>Thu, 23 Jan 2025 23:05:15 +0900</pubDate>
    </item>
    <item>
      <title>LMDrive: Closed-Loop End-to-End Driving with Large Language Models</title>
      <link>https://semi531.tistory.com/126</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;Paper Review&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;LMDrive: Closed-Loop End-to-End Driving with Large Language Models&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Vision Encoder to Control Process&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. Framework Overview&lt;/b&gt;&lt;br /&gt;LMDrive integrates vision, language, and control to enable closed-loop, end-to-end autonomous driving. The system consists of a &lt;b&gt;vision encoder&lt;/b&gt; that processes sensor data and a &lt;b&gt;language model&lt;/b&gt; that interprets navigation and notice instructions to predict control signals.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Inputs:&lt;/b&gt; Multi-modal sensor data (multi-view RGB images and LiDAR) and natural language instructions.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Outputs:&lt;/b&gt; Control signals (steering, braking, acceleration) and a flag indicating instruction completion.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. Vision Encoder&lt;/b&gt;&lt;br /&gt;The vision encoder processes the sensor data into features for the language model.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Components:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Sensor Encoding:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Images are encoded via ResNet-50 to extract feature maps.&lt;/li&gt;
&lt;li&gt;LiDAR data is processed using PointPillars, creating ego-centric BEV (bird's-eye view) features.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;BEV Decoder:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Transforms encoded features into visual tokens, representing BEV features, waypoints, and traffic light status.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Pre-Training:&lt;/b&gt;&lt;br /&gt;Pre-training tasks for the encoder include object detection, waypoint prediction, and traffic light classification. These tasks ensure robust scene understanding.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adfit&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;728x90&lt;/div&gt;
    &lt;ins class=&quot;kakao_ad_area&quot; style=&quot;display: none;&quot; data-ad-unit=&quot;DAN-HTkFRsyqtifHo4RK&quot; data-ad-width=&quot;728px&quot; data-ad-height=&quot;90px&quot;&gt;&lt;/ins&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;//t1.daumcdn.net/kas/static/ba.min.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&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;3. Language Model&lt;/b&gt;&lt;br /&gt;The language model (LLaMA) serves as the central decision-making unit, integrating visual and textual information.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Tokenization:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Vision tokens are reduced using a Q-Former to optimize memory usage.&lt;/li&gt;
&lt;li&gt;Navigation instructions are tokenized via LLaMA&amp;rsquo;s tokenizer.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Processing:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Temporal consistency is achieved by integrating historical visual tokens (up to 40 frames).&lt;/li&gt;
&lt;li&gt;Control signals and instruction completion flags are predicted.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Adapters:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bridge visual features and language tokens, enabling unified processing.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4. Control Signal Prediction&lt;/b&gt;&lt;br /&gt;Predicted waypoints guide a PID controller to produce final control signals:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Longitudinal Control:&lt;/b&gt; Manages velocity via throttle and brake.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Latitudinal Control:&lt;/b&gt; Adjusts steering based on predicted heading.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;5. Training Process&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Stage 1: Vision Encoder Pre-Training&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Focused on scene perception tasks using a dataset of 3M frames.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Stage 2: Instruction-Finetuning&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;The entire system is trained with language-guided driving data to align control signals with instructions.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Dataset and Benchmark&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Dataset:&lt;/b&gt;&lt;br /&gt;Created using CARLA simulator, the dataset comprises 64K clips annotated with navigation and notice instructions.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Includes complex scenarios (e.g., adversarial events, misleading instructions).&lt;/li&gt;
&lt;li&gt;Clips span 2&amp;ndash;20 seconds.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;LangAuto Benchmark:&lt;/b&gt;&lt;br /&gt;Evaluates instruction-following driving across diverse conditions (e.g., weather, traffic scenarios).&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Conclusion&lt;/b&gt;&lt;br /&gt;LMDrive demonstrates a novel approach to autonomous driving by combining LLMs with multi-modal sensor data in a closed-loop framework. Its ability to interpret complex instructions and interact with humans sets a foundation for robust, explainable driving systems.&lt;/p&gt;</description>
      <category>Life/자율주행, AI</category>
      <category>Autonomous Driving</category>
      <category>e2e autonomous</category>
      <category>e2e autonomous driving</category>
      <category>e2e lmdrive</category>
      <category>e2e paper</category>
      <category>end to end autonomous driving</category>
      <category>lmdrive</category>
      <category>lmdrive 논문</category>
      <category>lmdrive 논문 리뷰</category>
      <category>엔드투엔드</category>
      <author>세미531</author>
      <guid isPermaLink="true">https://semi531.tistory.com/126</guid>
      <comments>https://semi531.tistory.com/126#entry126comment</comments>
      <pubDate>Sun, 15 Dec 2024 22:57:53 +0900</pubDate>
    </item>
    <item>
      <title>ImageNet Classification with Deep Convolutional Neural Networks</title>
      <link>https://semi531.tistory.com/125</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;ImageNet Classification with Deep Convolutional Neural Networks 논문 리뷰&lt;/h3&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. The Dataset&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ImageNet: 약 1,500만 개의 고해상도 라벨링 이미지로 구성된 데이터셋, 22,000여 개의 카테고리 포함.&lt;/li&gt;
&lt;li&gt;ILSVRC-2010: 약 1.2M 학습 이미지, 50K 검증 이미지, 150K 테스트 이미지로 구성.&lt;/li&gt;
&lt;li&gt;입력 데이터 전처리: 모든 이미지를 256&amp;times;256 고정 해상도로 리사이즈 후, 중앙 256&amp;times;256 패치 추출. 픽셀별 평균값을 빼서 정규화만 수행.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2. The Architecture&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;총 8개의 학습 계층(5 convolutional + 3 fully-connected)으로 구성된 대규모 CNN 설계.&lt;/li&gt;
&lt;li&gt;네트워크 주요 특징:
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;ReLU 활성화 함수 도입.&lt;/li&gt;
&lt;li&gt;Two-GPU 병렬 학습 구조 적용.&lt;/li&gt;
&lt;li&gt;Local Response Normalization(LRN) 및 Overlapping Pooling 사용.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adfit&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;728x90&lt;/div&gt;
    &lt;ins class=&quot;kakao_ad_area&quot; style=&quot;display: none;&quot; data-ad-unit=&quot;DAN-HTkFRsyqtifHo4RK&quot; data-ad-width=&quot;728px&quot; data-ad-height=&quot;90px&quot;&gt;&lt;/ins&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;//t1.daumcdn.net/kas/static/ba.min.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3.1 ReLU Nonlinearity&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기존 tanh, sigmoid 대비 학습 속도 대폭 향상.&lt;/li&gt;
&lt;li&gt;CIFAR-10 데이터셋 실험에서 ReLU 사용 시 동일 구조에서 tanh 대비 약 6배 빠르게 학습 진행.&lt;/li&gt;
&lt;li&gt;뉴런 활성화 범위 확대로 더 많은 뉴런이 학습에 기여할 수 있게 됨.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3.2 Training on Multiple GPUs&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;네트워크를 두 개의 GPU로 분할하여 병렬 처리 구현.&lt;/li&gt;
&lt;li&gt;특정 계층에서만 GPU 간 데이터 교환을 허용해 통신 비용 최소화.&lt;/li&gt;
&lt;li&gt;Top-1 에러율 1.7% 감소, Top-5 에러율 1.2% 감소.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;4. Reducing Overfitting&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;두 가지 주요 방법 사용:
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Data Augmentation:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;랜덤 크롭, 좌우 반전, RGB 채널 강도 변환으로 데이터 증강.&lt;/li&gt;
&lt;li&gt;학습 데이터의 다양성을 높여 과적합 방지.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Dropout:
&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;테스트 단계에서는 뉴런 출력을 0.5로 스케일링해 평균화 효과 유지.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;5. Results&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ILSVRC-2010: Top-1 37.5%, Top-5 17.0%로 기존 최고 성능 대비 큰 개선.&lt;/li&gt;
&lt;li&gt;ILSVRC-2012: Top-5 15.3%로 2위 대비 약 11% 향상된 성능 기록.&lt;/li&gt;
&lt;li&gt;두 NVIDIA GTX 580 GPU 사용, 학습 시간 약 5~6일 소요.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;결론&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대규모 CNN 학습을 GPU 병렬 처리와 효율적인 기술로 구현해 최고 성능 달성. ReLU, Dropout, Data Augmentation 등은 딥러닝에서 필수적인 기법으로 자리 잡았음. 이 연구는 대규모 데이터와 딥러닝 기술 융합의 가능성을 실증하며 딥러닝 발전에 기여했음.&lt;/p&gt;</description>
      <category>Life/자율주행, AI</category>
      <category>CNN</category>
      <category>dropout</category>
      <category>ILSVRC</category>
      <category>imagenet</category>
      <category>large neural network training</category>
      <category>LRN</category>
      <category>overfitting</category>
      <category>overlapping pooling</category>
      <category>Relu</category>
      <category>딥러닝</category>
      <author>세미531</author>
      <guid isPermaLink="true">https://semi531.tistory.com/125</guid>
      <comments>https://semi531.tistory.com/125#entry125comment</comments>
      <pubDate>Sat, 14 Dec 2024 00:07:48 +0900</pubDate>
    </item>
    <item>
      <title>What is  SITL and MAVProxy in ArduPilot?</title>
      <link>https://semi531.tistory.com/124</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;SITL (Software In The Loop)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Purpose : Acts as a full-fledged ArduPilot simulator, allowing you to test code changes, mission planning, and new features without needing a physical drone.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- How it works :&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) Simulates the ArduPilot firmware (the code that would run on your actual autopilot) within your computer.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) Mimics a complete drone, including flight dynamics, sensors (GPS, barometer, accelerometer, etx.) and even environmental factors like wind.&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;- Benefits :&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) Safe Development : Experiment without risking hardware damage.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) Controlled Testing : Introduce specific scenarios, sensor glitches, or failures to test your code's robustness.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3) Rapid Iteration : Make changes and test their effects quickly without the overhead of deploying to real drone.&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;MAVProxy (MAVLink Proxy)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Purpose : A versatile ground control station (GCS) tool that communicates with ArduPilot vehicles (both real drones and SITL simulations).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- How it works :&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) Translates commands from your computer into the MAVLink protocol, a language understood by ArduPilot autopilots.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) Receives and displays telemetry data (drone's position, battery, sensor readings, etc.) sent by the vehicle.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Functions :&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) Arming/Disarming : Control the simulated drone's motors.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) Flight Modes : Switch between modes like GUIDED, AUTO, RTL (Return To Launch).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3) Mission Control : Upload and execute pre-planned missions.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4) Parameter Tuning : Live adjustment of parameters that govern the vehicle;s behavior.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5) Data Logging : Record telemetry for analysis.&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;How SITL and MAVProxy Work Together&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Layunch SITL : Start a SITL simulation for the vehicle type you want to test (copter, plane, rover, etc.). This creates a virtual drone running the ArduPilot firmware in your computer.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Connect MAVProxy : MACProxy acts as a bridge between your computer and the simulated drone. It establishes a communication channel with the SITL instance.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. Control and Monitor : Using MAVProxy's commands, you can:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) Send commands to the SITL drone, just as you would to a real drone.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) See the simulated drone respond in a virtual environment or on a map.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3) Get real-time feedback on the drone's &quot;state&quot; through telemetry.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Gemini_Generated_Image.jpg&quot; data-origin-width=&quot;1536&quot; data-origin-height=&quot;1536&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQe9q5/btsF2vSRu6i/m3HiilLWyP0K0zsUTqL5Tk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQe9q5/btsF2vSRu6i/m3HiilLWyP0K0zsUTqL5Tk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQe9q5/btsF2vSRu6i/m3HiilLWyP0K0zsUTqL5Tk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQe9q5%2FbtsF2vSRu6i%2Fm3HiilLWyP0K0zsUTqL5Tk%2Fimg.jpg&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;494&quot; height=&quot;494&quot; data-filename=&quot;Gemini_Generated_Image.jpg&quot; data-origin-width=&quot;1536&quot; data-origin-height=&quot;1536&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <author>세미531</author>
      <guid isPermaLink="true">https://semi531.tistory.com/124</guid>
      <comments>https://semi531.tistory.com/124#entry124comment</comments>
      <pubDate>Sun, 24 Mar 2024 11:27:18 +0900</pubDate>
    </item>
    <item>
      <title>Fuzzing in drone, self driving cars</title>
      <link>https://semi531.tistory.com/123</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Fuzzing, in the context of drones and self-driving cars, refers to a technique for automatically testing these systems by feeding them unexpected or invalid data. This helps uncover bugs and vulnerabilities that might not be revealed through traditional testing methods.&lt;br /&gt;&lt;br /&gt;Here's&amp;nbsp;how&amp;nbsp;it&amp;nbsp;works:&lt;br /&gt;&lt;br /&gt;1. Scenario Generation:&amp;nbsp; A fuzzer creates a bunch of test cases, like driving scenarios for a self-driving car. These scenarios can involve unusual situations, like unexpected objects on the road or sensor malfunctions.&lt;br /&gt;&lt;br /&gt;2. Mutation Power: The fuzzer doesn't just throw random data, it cleverly mutates existing scenarios to create a wider range of test cases. Imagine starting with a normal lane change scenario, then the fuzzer might modify it to include a sudden gust of wind or another car swerving into the lane.&lt;br /&gt;&lt;br /&gt;3. Finding the Cracks:&amp;nbsp; The fuzzer monitors the system's behavior during these tests.&amp;nbsp;&amp;nbsp;Special detection methods, called oracles,&amp;nbsp;&amp;nbsp;look for signs of trouble, like the car swerving off the road or the drone crashing.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;4. Sharpening the Focus: As the fuzzer finds issues, it can learn from them and prioritize generating scenarios that are more likely to expose new problems. This way, the fuzzer becomes more efficient over time.&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;br /&gt;Fuzzing&amp;nbsp;is&amp;nbsp;beneficial&amp;nbsp;because:&lt;br /&gt;&lt;br /&gt;Real-world Mimicry: It exposes the system to unexpected situations that might occur in the real world, helping identify weaknesses traditional testing might miss.&lt;br /&gt;&lt;br /&gt;In-depth Testing: It can go beyond individual components and stress the entire system as a whole, finding bugs that emerge from interactions between different parts.&lt;br /&gt;&lt;br /&gt;Automation Advantage: Fuzzing automates a lot of the testing process, saving time and effort compared to manual testing of every possible scenario.&lt;br /&gt;&lt;br /&gt;Here's a research paper&amp;nbsp;&amp;nbsp;titled &quot;DriveFuzz: Discovering Autonomous Driving Bugs through Driving Quality-Guided Fuzzing&quot; that explores how fuzzing can be applied to self-driving cars.&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;&lt;b&gt;Types&amp;nbsp;of&amp;nbsp;Fuzzing:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Dumb&amp;nbsp;Fuzzing:&amp;nbsp;Yes,&amp;nbsp;this&amp;nbsp;is&amp;nbsp;the&amp;nbsp;truly&amp;nbsp;random&amp;nbsp;approach.&amp;nbsp;You&amp;nbsp;generate&amp;nbsp;data&amp;nbsp;without&amp;nbsp;any&amp;nbsp;knowledge&amp;nbsp;of&amp;nbsp;the&amp;nbsp;system&amp;nbsp;you're&amp;nbsp;testing.&amp;nbsp;It's&amp;nbsp;a&amp;nbsp;good&amp;nbsp;starting&amp;nbsp;point&amp;nbsp;but&amp;nbsp;often&amp;nbsp;not&amp;nbsp;the&amp;nbsp;most&amp;nbsp;efficient.&lt;br /&gt;Smart&amp;nbsp;Fuzzing:&amp;nbsp;This&amp;nbsp;incorporates&amp;nbsp;knowledge&amp;nbsp;of&amp;nbsp;the&amp;nbsp;system's&amp;nbsp;structure.&amp;nbsp;Consider&amp;nbsp;the&amp;nbsp;following:&lt;br /&gt;Protocol-aware: Understanding the data format a system expects (length, special characters, etc.) allows you to generate invalid input tailored to break things.&lt;br /&gt;Mutation-based: Start with valid input and modify it (tweak values, delete fields, etc.). This is more likely to get through initial checks into the core logic of the system.&lt;br /&gt;Coverage-guided: The fuzzer tracks which parts of a system's code have been exercised and prioritizes inputs likely to explore new areas (potentially finding deeper bugs).&lt;br /&gt;Defining&amp;nbsp;&quot;Wrong&quot;&amp;nbsp;Values&lt;br /&gt;&lt;br /&gt;&lt;b&gt;The&amp;nbsp;notion&amp;nbsp;of&amp;nbsp;&quot;wrong&quot;&amp;nbsp;in&amp;nbsp;fuzzing&amp;nbsp;depends&amp;nbsp;on&amp;nbsp;your&amp;nbsp;objective:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Finding&amp;nbsp;Crashes:&amp;nbsp;Often,&amp;nbsp;&quot;wrong&quot;&amp;nbsp;means&amp;nbsp;values&amp;nbsp;completely&amp;nbsp;outside&amp;nbsp;the&amp;nbsp;expected&amp;nbsp;range&amp;nbsp;(huge&amp;nbsp;numbers,&amp;nbsp;negative&amp;nbsp;lengths,&amp;nbsp;etc.).&amp;nbsp;The&amp;nbsp;goal&amp;nbsp;is&amp;nbsp;to&amp;nbsp;cause&amp;nbsp;the&amp;nbsp;system&amp;nbsp;to&amp;nbsp;fail&amp;nbsp;outright.&lt;br /&gt;&lt;br /&gt;Revealing&amp;nbsp;Logic&amp;nbsp;Bugs:&amp;nbsp;Here,&amp;nbsp;&quot;wrong&quot;&amp;nbsp;might&amp;nbsp;be&amp;nbsp;values&amp;nbsp;that&amp;nbsp;are&amp;nbsp;technically&amp;nbsp;valid&amp;nbsp;but&amp;nbsp;could&amp;nbsp;trigger&amp;nbsp;edge-case&amp;nbsp;behavior&amp;nbsp;within&amp;nbsp;the&amp;nbsp;system's&amp;nbsp;logic.&lt;br /&gt;&lt;br /&gt;Exploit&amp;nbsp;Finding:&amp;nbsp;&amp;nbsp;Attackers&amp;nbsp;use&amp;nbsp;fuzzing&amp;nbsp;to&amp;nbsp;deliberately&amp;nbsp;find&amp;nbsp;&quot;wrong&quot;&amp;nbsp;values&amp;nbsp;that&amp;nbsp;give&amp;nbsp;them&amp;nbsp;more&amp;nbsp;control&amp;nbsp;than&amp;nbsp;they&amp;nbsp;should&amp;nbsp;have&amp;nbsp;(overwriting&amp;nbsp;memory&amp;nbsp;to&amp;nbsp;execute&amp;nbsp;their&amp;nbsp;own&amp;nbsp;code).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Efficiency&amp;nbsp;in&amp;nbsp;Fuzzing&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;It's&amp;nbsp;more&amp;nbsp;efficient&amp;nbsp;to&amp;nbsp;focus&amp;nbsp;on&amp;nbsp;&quot;wrong&quot;&amp;nbsp;values&amp;nbsp;that&amp;nbsp;are&amp;nbsp;tailored&amp;nbsp;to&amp;nbsp;your&amp;nbsp;goals.&amp;nbsp;This&amp;nbsp;is&amp;nbsp;where&amp;nbsp;smart&amp;nbsp;fuzzing&amp;nbsp;comes&amp;nbsp;into&amp;nbsp;play.&amp;nbsp;Here's&amp;nbsp;how:&lt;br /&gt;&lt;br /&gt;Learning&amp;nbsp;from&amp;nbsp;Prior&amp;nbsp;Bugs:&amp;nbsp;Analyzing&amp;nbsp;past&amp;nbsp;vulnerabilities&amp;nbsp;in&amp;nbsp;similar&amp;nbsp;systems&amp;nbsp;gives&amp;nbsp;clues&amp;nbsp;about&amp;nbsp;the&amp;nbsp;kinds&amp;nbsp;of&amp;nbsp;invalid&amp;nbsp;input&amp;nbsp;that&amp;nbsp;might&amp;nbsp;expose&amp;nbsp;new&amp;nbsp;ones.&lt;br /&gt;Using&amp;nbsp;Feedback&amp;nbsp;Loops:&amp;nbsp;When&amp;nbsp;the&amp;nbsp;fuzzer&amp;nbsp;detects&amp;nbsp;a&amp;nbsp;crash,&amp;nbsp;it&amp;nbsp;analyzes&amp;nbsp;what&amp;nbsp;kind&amp;nbsp;of&amp;nbsp;input&amp;nbsp;caused&amp;nbsp;it.&amp;nbsp;This&amp;nbsp;helps&amp;nbsp;the&amp;nbsp;fuzzer&amp;nbsp;generate&amp;nbsp;more&amp;nbsp;input&amp;nbsp;that&amp;nbsp;is&amp;nbsp;likely&amp;nbsp;to&amp;nbsp;trigger&amp;nbsp;similar&amp;nbsp;problems.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Gemini_Generated_Image.jpeg&quot; data-origin-width=&quot;1536&quot; data-origin-height=&quot;1536&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NgDAP/btsF1TmhTFO/ewkC5AZFodQUrvUsik4HQk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NgDAP/btsF1TmhTFO/ewkC5AZFodQUrvUsik4HQk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NgDAP/btsF1TmhTFO/ewkC5AZFodQUrvUsik4HQk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNgDAP%2FbtsF1TmhTFO%2FewkC5AZFodQUrvUsik4HQk%2Fimg.jpg&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;541&quot; height=&quot;541&quot; data-filename=&quot;Gemini_Generated_Image.jpeg&quot; data-origin-width=&quot;1536&quot; data-origin-height=&quot;1536&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Life/자율주행, AI</category>
      <author>세미531</author>
      <guid isPermaLink="true">https://semi531.tistory.com/123</guid>
      <comments>https://semi531.tistory.com/123#entry123comment</comments>
      <pubDate>Sun, 24 Mar 2024 01:54:39 +0900</pubDate>
    </item>
    <item>
      <title>자율주행 개발 연구생의 2024년 전자기기 세팅</title>
      <link>https://semi531.tistory.com/122</link>
      <description>&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;내 메인 전자기기? 세팅을 보면 스마트폰, 노트북, 음향기기, 스마트워치, PC주변기기 정도 인 것 같다. 차례대로 한번 정리해보려한다.&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;먼저 스마트폰은 정말 어려서부터 관심이 많았다. 이렇게 쭉 사용하면서 여러 제품을 써보고 난 후 정착은 아이폰으로 했다. 사실 스티브잡스의 전성기 때 부터 아이폰을 매우 좋아했고 어려서 아이팟 4세대를 친구들 중 거의 유일하게 가지고 있었을 정도로 어려서부터 애플을 좋아했다. 스마트폰은 안드로이드를 줄곧 사용해왔지만 스마트폰으로는 아이폰이 가장 적합하다고 생각했다.&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;먼저 내가 생각하기에 아이폰이 가장 좋은, 편한 이유는 자잘한 세팅이 없다는 것. 이런 자잘한 세팅이 없어도 이미 사용성이 편한 것이다. UI 면에서도 훌륭하고 icloud 연동도 구독하면서 매우 잘 사용하고 있다. 또한 보안 시스템 면에서도 훌륭한 것 같다. 원래는 se 시리즈나 미니를 좋아했고 지금도 미니를 사용하고 있지만 비전프로 사용을 위한 공간 비디오? 촬영이라던가 뎁스 추출 등 궁금한 기능들도 있고 기사나 논문을 잠깐씩 급하게 읽기에 너무 작은 것 같아 다음으로 구매한다면 프로맥스 시리즈를 구매할 것 같다.&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;2. 노트북은 기니까 음향기기부터&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;3. 스마트워치&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;4. PC주변기기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주변기기라고 해봐야 별거 없다. 마우스는 hp creator 마우스도 좋고 로지텍 리프트 버티컬도 좋았다. 현재는 로지텍 G304 를 사용하고 있지만 뭐 고장나면 집에 굴러다니는 마우스를 사용하긴 한다. 그래도 추가로 구매해서 사용한다 하면 로지텍 리프트 버티컬을 사서 사용할 것 같다. 마우스패트 국룰은 다이소.&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;보조배터리는 원래 큰 걸 가지고 다녔는데 너무 무거워서 지금은 앤커 533 파워코어 30W 를 사용하고 있다. 이건 최근에 샀는데 가볍고 급할 때 노트북 충전도 되고 너무 좋다. 10000mAh 가 나한테는 괜찮은 것 같다. 나중에 조립PC 데스크탑용 스피커를 사야된다 하면 마샬을 둘 것 같다.&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;5. 노트북&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실 이게 메인이다. 일상이 개발자이고 가장 많이 사용한다. 사실 데스크탑도 좋긴한데 연구실에도 있고 해서 혹시 사게 된다면 컴퓨존에서 조립을 해서 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나이가 조금 어릴 때는 그래픽이 짱짱한게 좋아서 데탑도 그래픽 좋은 것으로 세팅하고 노트북도 게이밍 노트북을 가지고 다녔었는데 사실 사용성으로 데탑을 이기지 못하고 너무 휴대성이 떨어지고 배터리도 금방 없어져서 가벼운 노트북을 선호한다. 맥북도 사용해보고 당연히 좋았지만 리눅스를 많이 사용하기도 하고 한국에서 뭔가 하려면 윈도우가 있는게 마음이 편해서 지금은 HP 드레곤플라이 노트북으로 정착했다. 정말 가볍고 키감이 압권이다. 스피커도 뱅앤올룹슨이라 정말 좋고 튼튼하게 밀스펙도 받고 보안도 우수하고 다 좋은데 가격이 비싸다. 기즈모 유튜버님 영상을 봤는데 정말 자세하게 설명해주신다. 지금은 1세대를 사용하고 있고 지금 4세대까지 나온 것으로 알고있는데 아직도 정말 잘 돌아간다. 아마 지금 쓰는게 고장나거나 너무 느려지만 HP 드레곤플라이로 가장 최근에 나온 세대를 구매할 것이다.&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;근데 여기서 조금 아쉬운건 내가 우분투와 윈도우 듀얼부팅을 하고 사용해서 몇가지 기능을 끄고 사용한다. 일단 듀얼부팅 하려면 부팅 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;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;1) 이제 윈도우상에서 몇몇 설정을 해줘야 한다. 먼저 Fast Boot 설정을 비활성화 해줘야 한다. 진입 순서는&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;제어판 -&amp;gt; 하드웨어 및 소리 클릭 -&amp;gt; 전원 옵션 클릭 -&amp;gt; 좌측에 전원 단추 작동 설정 클릭 -&amp;gt; 위쪽에 현재 사용할 수 없는 설정 변경 클릭 -&amp;gt; 빠른 시작 켜기(권장) 부분의 체크 박스를 해제하면 된다.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;2) 장치가 암호화되는 bitlocker 를 해제해야 한다. 방법은 윈도우 설정에 들어가서&amp;nbsp; 개인정보 및 보안 클릭 -&amp;gt; 보안 부분에 장치 암호화 클릭 -&amp;gt; 장치 암호화 부분이 켜져있을텐데 이를 클릭하여 꺼주면 일정시간동안 암호를 해독한다고 나오고 설정이 완료되면 다음단계로 넘어가면 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;3) &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;Secure Boot 는 BIOS 에서 설정해야 한다. 재부팅 하며 BIOS 로 진입한다. (나의 경우 F11 을 전원버튼을 누른 후 연속적으로 누르면 진입이 가능하였는데 컴퓨터 브랜드에 따라 다르므로 BIOS 진입 버튼을 검색을 통해 찾아보고 진행해라.) 다음 Boot menu 로 들어가 고급 모드에 들어간다. (f7 을 누르면 진입 가능한듯?) 이후 안전 부팅 혹은 Secure Boot 메뉴를 찾으면 활성화가 되어있을 것이다. Secure Boot 의 경우 key를 지우면 비활성화 되는데 키 관리에 들어가 안전 부팅 키를 지우면 Secure Boot 가 비활성화되는 것을 확인할 수 있다.&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;4) &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;우분투를 새로운 파티션에 설치하기 위해 파티션 관리에 들어가 리눅스를 쓸 만큼 파티션을 나눠준다. 여유롭게 사용하기 위해 필자는 150GB 를 할당했지만 자신의 용량을 잘 보고 무리없이 할당해주면 된다. 아마 100GB 정도면 넉넉할 것이라고 생각한다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;윈도우키 + R 을 누른 후 diskmgmt.msc 를 치면 다음으로 넘어간다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;nbsp;'디스크 관리' 도구를 사용하여 축소할 파티션을 선택하고 '볼륨 축소' 옵션을 통해 축소할 공간의 크기를 지정하는 단계가 포함된다. 이렇게 생성된 공간은 나중에 Ubuntu 설치 과정에서 사용된다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;윈도우에는 일단 네트워크 보안을 위해서 express vpn 을 설치하고 뭐 카톡, 줌, 노션, vscode, visual studio, anydesk, teams enterprise, 한글, drawboard pdf, hp quickdrop, outlook 정도 설치한다. 그리고 브라우저는 메인으로 brave browser, 서브로 edge 를 사용한다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;출국 3일 전에 잠이 안와서 써봤는데 조금 두서 없긴 한 것 같다. 앞으로 종종 이 글은 수정하면서 올 1년간의 생각들의 변화도 같이 바꿔갈 생각이다. 다들 파이팅! 아래는 내가 좋아하는 BMW&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; 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;matteo-balzanelli-yEQHxc2PEFo-unsplash.jpg&quot; data-origin-width=&quot;5760&quot; data-origin-height=&quot;3840&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/llE2g/btsFCBAzZiD/KpTBVXtp8vk74Ko8kJniRk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/llE2g/btsFCBAzZiD/KpTBVXtp8vk74Ko8kJniRk/img.jpg&quot; data-alt=&quot;출처 - Unsplash&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/llE2g/btsFCBAzZiD/KpTBVXtp8vk74Ko8kJniRk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FllE2g%2FbtsFCBAzZiD%2FKpTBVXtp8vk74Ko8kJniRk%2Fimg.jpg&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;519&quot; height=&quot;346&quot; data-filename=&quot;matteo-balzanelli-yEQHxc2PEFo-unsplash.jpg&quot; data-origin-width=&quot;5760&quot; data-origin-height=&quot;3840&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 - Unsplash&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Coding/about Computer</category>
      <category>2024개발</category>
      <category>개발세팅</category>
      <category>개발환경</category>
      <category>개인 개발환경</category>
      <category>듀얼부팅</category>
      <category>아이폰</category>
      <category>우분투</category>
      <category>자율주행</category>
      <category>자율주행개발자</category>
      <author>세미531</author>
      <guid isPermaLink="true">https://semi531.tistory.com/122</guid>
      <comments>https://semi531.tistory.com/122#entry122comment</comments>
      <pubDate>Sun, 10 Mar 2024 02:27:59 +0900</pubDate>
    </item>
    <item>
      <title>Ubuntu에서 외장 SSD 마운트 후 Emergency Mode 문제 해결하기</title>
      <link>https://semi531.tistory.com/121</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;오늘은 Ubuntu에서 외장 SSD를 마운트하고 나서 발생하는 자주 보게 되는 문제 중 하나인 'Emergency Mode'에 대해 이야기하려 합니다. 이 문제는 주로 '/etc/fstab' 파일의 설정 오류로 인해 발생합니다. '/etc/fstab' 파일은 우리의 시스템이 부팅될 때 어떤 파일 시스템을 자동으로 마운트할지를 정의하는 역할을 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 바로 문제 해결 방법에 대해 알아봅시다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. 시스템 재부팅&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 문제가 발생한 시스템을 재부팅해 줍니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. 루트 사용자로 로그인&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;재부팅 후에 나타나는 'Emergency Mode' 화면에서 루트 사용자로 로그인합니다. 여기서는 그냥 Enter 를 치면 됩니다.&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;# SSD mount 는 아래 블로그에서 보면 좋아요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://znine.tistory.com/entry/LinuxUbuntu-%EC%97%90%EC%84%9C-%EC%99%B8%EC%9E%A5-SSD-%ED%8F%AC%EB%A7%B7-%EB%A7%88%EC%9A%B4%ED%8A%B8-%ED%95%98%EA%B8%B0&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://znine.tistory.com/entry/LinuxUbuntu-%EC%97%90%EC%84%9C-%EC%99%B8%EC%9E%A5-SSD-%ED%8F%AC%EB%A7%B7-%EB%A7%88%EC%9A%B4%ED%8A%B8-%ED%95%98%EA%B8%B0&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1689391417720&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;Linux(Ubuntu) 에서 외장 SSD 포맷, 마운트 하기&quot; data-og-description=&quot;윈도우 파일 백업용으로 사용하던 삼성 T7 SSD를 우분투 서버에서 쓰기 위해, ext4 file system 으로 포맷 후 마운트 하기 까지의 내용을 담아본다. 서버에 USB로 연결 후 확인 # fdisk -l Disk /dev/sda: 931.53 G&quot; data-og-host=&quot;znine.tistory.com&quot; data-og-source-url=&quot;https://znine.tistory.com/entry/LinuxUbuntu-%EC%97%90%EC%84%9C-%EC%99%B8%EC%9E%A5-SSD-%ED%8F%AC%EB%A7%B7-%EB%A7%88%EC%9A%B4%ED%8A%B8-%ED%95%98%EA%B8%B0&quot; data-og-url=&quot;https://znine.tistory.com/187&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://znine.tistory.com/entry/LinuxUbuntu-%EC%97%90%EC%84%9C-%EC%99%B8%EC%9E%A5-SSD-%ED%8F%AC%EB%A7%B7-%EB%A7%88%EC%9A%B4%ED%8A%B8-%ED%95%98%EA%B8%B0&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://znine.tistory.com/entry/LinuxUbuntu-%EC%97%90%EC%84%9C-%EC%99%B8%EC%9E%A5-SSD-%ED%8F%AC%EB%A7%B7-%EB%A7%88%EC%9A%B4%ED%8A%B8-%ED%95%98%EA%B8%B0&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;Linux(Ubuntu) 에서 외장 SSD 포맷, 마운트 하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;윈도우 파일 백업용으로 사용하던 삼성 T7 SSD를 우분투 서버에서 쓰기 위해, ext4 file system 으로 포맷 후 마운트 하기 까지의 내용을 담아본다. 서버에 USB로 연결 후 확인 # fdisk -l Disk /dev/sda: 931.53 G&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;znine.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. '/etc/fstab' 파일 편집&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;루트 사용자로 로그인하면, 이제 '/etc/fstab' 파일을 편집해 볼 차례입니다. 아래의 명령어를 통해 해당 파일을 열 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;nano /etc/fstab&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4. 외장 SSD 엔트리 수정 또는 삭제&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일을 열었다면, 외장 SSD에 대한 엔트리를 찾아 수정하거나 삭제합니다. 만약에 SSD가 항상 연결되어 있지 않다면, 'noauto' 옵션을 추가하거나 해당 엔트리를 삭제할 수 있습니다. 'noauto' 옵션은 시스템 부팅 시 해당 디스크의 자동 마운트를 방지합니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;5. 변경사항 저장 및 nano 편집기 종료&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 단계를 완료했다면, 이제 변경사항을 저장하고 nano 편집기를 종료해야 합니다. 이를 위해 Ctrl + O를 눌러 파일을 저장하고, 그 다음에 Ctrl + X를 눌러 편집기를 종료합니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;6. 시스템 재부팅&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막으로, 시스템을 다시 재부팅해 줍니다. 아래의 명령어를 사용하면 됩니다.&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;reboot&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이상으로, Ubuntu에서 외장 SSD 마운트 후에 발생하는 'Emergency Mode' 문제 해결 방법에 대해 살펴보았습니다. 위의 단계를 모두 따라도 문제가 계속된다면, SSD가 올바르게 연결되었는지, SSD에 파일 시스템이 올바르게 구성되어 있는지 등을 확인해보세요.&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-origin-width=&quot;512&quot; data-origin-height=&quot;512&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zkoJd/btsnD5ZSkCm/A3Xi6muhAk5s13xo8ygGwK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zkoJd/btsnD5ZSkCm/A3Xi6muhAk5s13xo8ygGwK/img.png&quot; data-alt=&quot;ai 를 활용하여 생성한 대표 이미지&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zkoJd/btsnD5ZSkCm/A3Xi6muhAk5s13xo8ygGwK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzkoJd%2FbtsnD5ZSkCm%2FA3Xi6muhAk5s13xo8ygGwK%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;241&quot; height=&quot;241&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;512&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ai 를 활용하여 생성한 대표 이미지&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Coding/about Computer</category>
      <category>emergency mode</category>
      <category>External Drive</category>
      <category>ubuntu</category>
      <category>ubuntu emergency mode</category>
      <category>ubuntu fstab</category>
      <category>우분투 emergency</category>
      <category>우분투 emergency mode</category>
      <author>세미531</author>
      <guid isPermaLink="true">https://semi531.tistory.com/121</guid>
      <comments>https://semi531.tistory.com/121#entry121comment</comments>
      <pubDate>Sat, 15 Jul 2023 12:22:36 +0900</pubDate>
    </item>
    <item>
      <title>How to Convert MP4 to GIF in Python using Moviepy</title>
      <link>https://semi531.tistory.com/120</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;In&amp;nbsp;this&amp;nbsp;tutorial,&amp;nbsp;we&amp;nbsp;will&amp;nbsp;demonstrate&amp;nbsp;how&amp;nbsp;to&amp;nbsp;convert&amp;nbsp;an&amp;nbsp;MP4&amp;nbsp;video&amp;nbsp;file&amp;nbsp;into&amp;nbsp;a&amp;nbsp;GIF&amp;nbsp;animation&amp;nbsp;using&amp;nbsp;the&amp;nbsp;moviepy&amp;nbsp;library&amp;nbsp;in&amp;nbsp;Python.&amp;nbsp;Moviepy&amp;nbsp;is&amp;nbsp;a&amp;nbsp;powerful&amp;nbsp;library&amp;nbsp;for&amp;nbsp;video&amp;nbsp;editing&amp;nbsp;that&amp;nbsp;allows&amp;nbsp;you&amp;nbsp;to&amp;nbsp;perform&amp;nbsp;various&amp;nbsp;operations&amp;nbsp;on&amp;nbsp;video&amp;nbsp;files.&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;Step&amp;nbsp;1:&amp;nbsp;Install&amp;nbsp;the&amp;nbsp;moviepy&amp;nbsp;library &lt;br /&gt;First,&amp;nbsp;you&amp;nbsp;need&amp;nbsp;to&amp;nbsp;install&amp;nbsp;the&amp;nbsp;moviepy&amp;nbsp;library&amp;nbsp;using&amp;nbsp;pip.&amp;nbsp;Open&amp;nbsp;your&amp;nbsp;terminal&amp;nbsp;or&amp;nbsp;command&amp;nbsp;prompt&amp;nbsp;and&amp;nbsp;run&amp;nbsp;the&amp;nbsp;following&amp;nbsp;command:&lt;/p&gt;
&lt;pre id=&quot;code_1683361223534&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pip install moviepy&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;Step&amp;nbsp;2:&amp;nbsp;Create&amp;nbsp;a&amp;nbsp;Python&amp;nbsp;script&amp;nbsp;for&amp;nbsp;the&amp;nbsp;conversion &lt;br /&gt;Once&amp;nbsp;the&amp;nbsp;library&amp;nbsp;is&amp;nbsp;installed,&amp;nbsp;you&amp;nbsp;can&amp;nbsp;create&amp;nbsp;a&amp;nbsp;Python&amp;nbsp;script&amp;nbsp;to&amp;nbsp;perform&amp;nbsp;the&amp;nbsp;conversion.&amp;nbsp;Here's&amp;nbsp;the&amp;nbsp;code&amp;nbsp;to&amp;nbsp;convert&amp;nbsp;an&amp;nbsp;MP4&amp;nbsp;file&amp;nbsp;to&amp;nbsp;a&amp;nbsp;GIF&amp;nbsp;file:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1683361251217&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from moviepy.editor import *

def convert_mp4_to_gif(input_file, output_file, start_time=0, end_time=None, resize_factor=1.0):
    # Load the video file
    video = VideoFileClip(input_file)

    # Set the start and end time if provided
    if end_time is not None:
        video = video.subclip(start_time, end_time)

    # Resize the video if a resize factor is provided
    if resize_factor != 1.0:
        video = video.resize(resize_factor)

    # Write the video as a GIF file
    video.write_gif(output_file, fps=15, program='ffmpeg')

if __name__ == &quot;__main__&quot;:
    input_file = &quot;path/to/your/input/video.mp4&quot;
    output_file = &quot;path/to/your/output/animation.gif&quot;

    # Optional parameters
    start_time = 0  # Start time in seconds, default is 0
    end_time = None  # End time in seconds, default is None (entire video)
    resize_factor = 0.5  # Resize factor, default is 1.0 (no resizing)

    convert_mp4_to_gif(input_file, output_file, start_time, end_time, resize_factor)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Replace&amp;nbsp;the&amp;nbsp;input_file&amp;nbsp;and&amp;nbsp;output_file&amp;nbsp;variables&amp;nbsp;with&amp;nbsp;the&amp;nbsp;appropriate&amp;nbsp;file&amp;nbsp;paths&amp;nbsp;for&amp;nbsp;your&amp;nbsp;input&amp;nbsp;MP4&amp;nbsp;and&amp;nbsp;output&amp;nbsp;GIF&amp;nbsp;files. &lt;br /&gt;&lt;br /&gt;Step&amp;nbsp;3:&amp;nbsp;Run&amp;nbsp;the&amp;nbsp;script &lt;br /&gt;To&amp;nbsp;convert&amp;nbsp;your&amp;nbsp;MP4&amp;nbsp;video&amp;nbsp;file&amp;nbsp;to&amp;nbsp;a&amp;nbsp;GIF&amp;nbsp;animation,&amp;nbsp;simply&amp;nbsp;run&amp;nbsp;the&amp;nbsp;Python&amp;nbsp;script&amp;nbsp;you&amp;nbsp;created&amp;nbsp;in&amp;nbsp;the&amp;nbsp;previous&amp;nbsp;step.&amp;nbsp;The&amp;nbsp;script&amp;nbsp;will&amp;nbsp;load&amp;nbsp;the&amp;nbsp;MP4&amp;nbsp;video,&amp;nbsp;create&amp;nbsp;a&amp;nbsp;subclip&amp;nbsp;if&amp;nbsp;start&amp;nbsp;and&amp;nbsp;end&amp;nbsp;times&amp;nbsp;are&amp;nbsp;provided,&amp;nbsp;resize&amp;nbsp;the&amp;nbsp;video&amp;nbsp;based&amp;nbsp;on&amp;nbsp;the&amp;nbsp;resize&amp;nbsp;factor,&amp;nbsp;and&amp;nbsp;then&amp;nbsp;write&amp;nbsp;the&amp;nbsp;output&amp;nbsp;as&amp;nbsp;a&amp;nbsp;GIF&amp;nbsp;file&amp;nbsp;with&amp;nbsp;a&amp;nbsp;frame&amp;nbsp;rate&amp;nbsp;of&amp;nbsp;15&amp;nbsp;frames&amp;nbsp;per&amp;nbsp;second. &lt;br /&gt;&lt;br /&gt;Conclusion: &lt;br /&gt;In&amp;nbsp;this&amp;nbsp;tutorial,&amp;nbsp;we&amp;nbsp;have&amp;nbsp;shown&amp;nbsp;you&amp;nbsp;how&amp;nbsp;to&amp;nbsp;convert&amp;nbsp;an&amp;nbsp;MP4&amp;nbsp;video&amp;nbsp;file&amp;nbsp;into&amp;nbsp;a&amp;nbsp;GIF&amp;nbsp;animation&amp;nbsp;using&amp;nbsp;the&amp;nbsp;moviepy&amp;nbsp;library&amp;nbsp;in&amp;nbsp;Python.&amp;nbsp;You&amp;nbsp;can&amp;nbsp;now&amp;nbsp;easily&amp;nbsp;convert&amp;nbsp;your&amp;nbsp;videos&amp;nbsp;to&amp;nbsp;GIF&amp;nbsp;animations&amp;nbsp;to&amp;nbsp;use&amp;nbsp;in&amp;nbsp;various&amp;nbsp;projects&amp;nbsp;or&amp;nbsp;share&amp;nbsp;on&amp;nbsp;social&amp;nbsp;media.&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-origin-width=&quot;512&quot; data-origin-height=&quot;512&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/crgaWH/btsd5Z0P9qs/WYEJCRjZ27fCCMDDDXlVt0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/crgaWH/btsd5Z0P9qs/WYEJCRjZ27fCCMDDDXlVt0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/crgaWH/btsd5Z0P9qs/WYEJCRjZ27fCCMDDDXlVt0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcrgaWH%2Fbtsd5Z0P9qs%2FWYEJCRjZ27fCCMDDDXlVt0%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;275&quot; height=&quot;275&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;512&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;&amp;nbsp;&lt;/p&gt;</description>
      <category>Coding/Python</category>
      <category>git enimation</category>
      <category>MoviePy</category>
      <category>mp4 to gif</category>
      <category>programming tutorial</category>
      <category>Python</category>
      <category>video editing</category>
      <category>video-conversion</category>
      <author>세미531</author>
      <guid isPermaLink="true">https://semi531.tistory.com/120</guid>
      <comments>https://semi531.tistory.com/120#entry120comment</comments>
      <pubDate>Sat, 6 May 2023 17:22:59 +0900</pubDate>
    </item>
    <item>
      <title>Ubuntu 22.04에서 기본 터미널 프로그램을 Hyper로 변경하기</title>
      <link>https://semi531.tistory.com/119</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Ubuntu에서&amp;nbsp;기본&amp;nbsp;터미널&amp;nbsp;프로그램을&amp;nbsp;사용하는&amp;nbsp;대신,&amp;nbsp;더&amp;nbsp;다양한&amp;nbsp;기능과&amp;nbsp;사용자&amp;nbsp;경험을&amp;nbsp;제공하는&amp;nbsp;다른&amp;nbsp;터미널&amp;nbsp;프로그램을&amp;nbsp;사용하고&amp;nbsp;싶을&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;Hyper는&amp;nbsp;이러한&amp;nbsp;대안&amp;nbsp;중&amp;nbsp;하나로,&amp;nbsp;아름답고&amp;nbsp;사용하기&amp;nbsp;쉬운&amp;nbsp;터미널&amp;nbsp;애플리케이션입니다.&amp;nbsp;이&amp;nbsp;포스트에서는&amp;nbsp;Ubuntu&amp;nbsp;22.04에서&amp;nbsp;기본&amp;nbsp;터미널&amp;nbsp;프로그램을&amp;nbsp;Hyper로&amp;nbsp;변경하는&amp;nbsp;방법을&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;먼저, Hyper 터미널을 설치해야 합니다. Hyper의 공식 웹사이트(https://hyper.is)에서 최신 릴리스를 다운로드하고 설치합니다. 파일을 다운로드한 후, 터미널에서 해당 파일이 있는 디렉토리로 이동한 다음 아래 명령어를 실행하세요:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1683354952879&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo dpkg -i hyper_버전_amd64.deb&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를&amp;nbsp;들어,&amp;nbsp;다운로드한&amp;nbsp;파일&amp;nbsp;이름이&amp;nbsp;hyper_4.0.0_amd64.deb라면,&amp;nbsp;다음&amp;nbsp;명령어를&amp;nbsp;사용하면&amp;nbsp;됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1683354975580&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo dpkg -i hyper_4.0.0_amd64.deb&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; 기본 터미널 애플리케이션 변경 &amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본&amp;nbsp;터미널&amp;nbsp;애플리케이션을&amp;nbsp;변경하려면,&amp;nbsp;update-alternatives&amp;nbsp;명령을&amp;nbsp;사용합니다.&amp;nbsp;먼저&amp;nbsp;아래&amp;nbsp;명령어를&amp;nbsp;실행해보세요:&lt;/p&gt;
&lt;pre id=&quot;code_1683355011481&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo update-alternatives --config x-terminal-emulator&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약&amp;nbsp;Hyper가&amp;nbsp;목록에&amp;nbsp;없다면,&amp;nbsp;다음&amp;nbsp;명령어를&amp;nbsp;사용하여&amp;nbsp;Hyper를&amp;nbsp;등록하세요:&lt;/p&gt;
&lt;pre id=&quot;code_1683355037391&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo update-alternatives --install /usr/bin/x-terminal-emulator x-terminal-emulator /opt/Hyper/hyper 50&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; 기본 터미널을 Hyper 로 변경 &amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제&amp;nbsp;다시&amp;nbsp;update-alternatives&amp;nbsp;명령을&amp;nbsp;실행하여&amp;nbsp;기본&amp;nbsp;터미널을&amp;nbsp;Hyper로&amp;nbsp;변경하세요:&lt;/p&gt;
&lt;pre id=&quot;code_1683355098063&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo update-alternatives --config x-terminal-emulator&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나타나는&amp;nbsp;목록에서&amp;nbsp;Hyper&amp;nbsp;옆에&amp;nbsp;있는&amp;nbsp;번호를&amp;nbsp;입력하고&amp;nbsp;Enter를&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;lt; 결론 &amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제&amp;nbsp;Ubuntu&amp;nbsp;22.04에서&amp;nbsp;기본&amp;nbsp;터미널&amp;nbsp;프로그램으로&amp;nbsp;Hyper가&amp;nbsp;설정되었습니다.&amp;nbsp;이&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;/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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;607&quot; data-origin-height=&quot;471&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ld5vl/btsd6sWe3xp/bEsJchPETjkWWcwkz26PQK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ld5vl/btsd6sWe3xp/bEsJchPETjkWWcwkz26PQK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ld5vl/btsd6sWe3xp/bEsJchPETjkWWcwkz26PQK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLd5vl%2Fbtsd6sWe3xp%2FbEsJchPETjkWWcwkz26PQK%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;410&quot; height=&quot;318&quot; data-origin-width=&quot;607&quot; data-origin-height=&quot;471&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Coding/딥러닝 &amp;amp; opencv</category>
      <category>hyper</category>
      <category>hyper terminal</category>
      <category>hyper 설치</category>
      <category>hyper 우분투</category>
      <category>ubuntu</category>
      <category>기본 터미널 변경</category>
      <category>리눅스</category>
      <category>우분투 터미널 변경</category>
      <category>우분투 터미널 설치</category>
      <category>우분투 터미널 프로그램</category>
      <author>세미531</author>
      <guid isPermaLink="true">https://semi531.tistory.com/119</guid>
      <comments>https://semi531.tistory.com/119#entry119comment</comments>
      <pubDate>Sat, 6 May 2023 15:43:59 +0900</pubDate>
    </item>
    <item>
      <title>CMake를 이용한 Eigen3과 OpenCV 라이브러리 포함하기</title>
      <link>https://semi531.tistory.com/118</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;본&amp;nbsp;글에서는&amp;nbsp;CMake를&amp;nbsp;이용하여&amp;nbsp;Eigen3과&amp;nbsp;OpenCV&amp;nbsp;라이브러리를&amp;nbsp;C++&amp;nbsp;프로젝트에&amp;nbsp;포함시키는&amp;nbsp;방법에&amp;nbsp;대해&amp;nbsp;설명합니다.&amp;nbsp;CMake는&amp;nbsp;크로스&amp;nbsp;플랫폼&amp;nbsp;빌드&amp;nbsp;시스템으로서,&amp;nbsp;다양한&amp;nbsp;라이브러리와&amp;nbsp;프로젝트&amp;nbsp;구성을&amp;nbsp;관리할&amp;nbsp;수&amp;nbsp;있게&amp;nbsp;해줍니다.&amp;nbsp;Eigen3는&amp;nbsp;선형&amp;nbsp;대수&amp;nbsp;라이브러리로,&amp;nbsp;행렬&amp;nbsp;및&amp;nbsp;벡터&amp;nbsp;연산을&amp;nbsp;제공합니다.&amp;nbsp;OpenCV는&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;/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;lt; Eigen3 및 OpenCV 설치 &amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Eigen3와&amp;nbsp;OpenCV를&amp;nbsp;사용하기&amp;nbsp;전에&amp;nbsp;시스템에&amp;nbsp;설치해야&amp;nbsp;합니다.&amp;nbsp;대부분의&amp;nbsp;리눅스&amp;nbsp;배포판에서는&amp;nbsp;패키지&amp;nbsp;관리자를&amp;nbsp;이용하여&amp;nbsp;간단히&amp;nbsp;설치할&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;예를&amp;nbsp;들어,&amp;nbsp;Ubuntu에서는&amp;nbsp;다음&amp;nbsp;명령어를&amp;nbsp;이용하여&amp;nbsp;Eigen3와&amp;nbsp;OpenCV를&amp;nbsp;설치할&amp;nbsp;수&amp;nbsp;있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1683303939089&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 libeigen3-dev
sudo apt-get install libopencv-dev&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; CMakeLists.txt 작성 &amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Eigen3과&amp;nbsp;OpenCV를&amp;nbsp;프로젝트에&amp;nbsp;포함시키려면,&amp;nbsp;CMakeLists.txt&amp;nbsp;파일에&amp;nbsp;필요한&amp;nbsp;설정을&amp;nbsp;추가해야&amp;nbsp;합니다.&amp;nbsp;기본&amp;nbsp;CMakeLists.txt&amp;nbsp;파일은&amp;nbsp;다음과&amp;nbsp;같습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1683303975261&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cmake_minimum_required(VERSION 3.0)
project(프로젝트_이름)

# Eigen3와 OpenCV 찾기
find_package(Eigen3 3.3 REQUIRED NO_MODULE)
find_package(OpenCV REQUIRED)

# 실행 가능한 타겟 추가
add_executable(${PROJECT_NAME} main.cpp)

# Eigen3와 OpenCV 헤더 포함
target_include_directories(${PROJECT_NAME} PRIVATE ${EIGEN3_INCLUDE_DIR})
target_include_directories(${PROJECT_NAME} PRIVATE ${OpenCV_INCLUDE_DIRS})

# Eigen3와 OpenCV 라이브러리 연결
target_link_libraries(${PROJECT_NAME} Eigen3::Eigen)
target_link_libraries(${PROJECT_NAME} ${OpenCV_LIBS})&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트_이름을&amp;nbsp;여러분의&amp;nbsp;프로젝트&amp;nbsp;이름으로,&amp;nbsp;main.cpp를&amp;nbsp;여러분의&amp;nbsp;소스&amp;nbsp;파일&amp;nbsp;이름(또는&amp;nbsp;공백으로&amp;nbsp;구분된&amp;nbsp;파일)으로&amp;nbsp;바꾸세요.&amp;nbsp;이&amp;nbsp;CMakeLists.txt&amp;nbsp;파일은&amp;nbsp;시스템에&amp;nbsp;Eigen3와&amp;nbsp;OpenCV가&amp;nbsp;설치되어&amp;nbsp;있고&amp;nbsp;CMake가&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt; 라이브러리 경로 설정 &amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라이브러리를&amp;nbsp;찾지&amp;nbsp;못하는&amp;nbsp;경우,&amp;nbsp;설치된&amp;nbsp;Eigen3와&amp;nbsp;OpenCV의&amp;nbsp;경로를&amp;nbsp;직접&amp;nbsp;지정해야&amp;nbsp;할&amp;nbsp;수도&amp;nbsp;있습니다.&amp;nbsp;이를&amp;nbsp;위해&amp;nbsp;CMakeLists.txt&amp;nbsp;파일에&amp;nbsp;CMAKE_PREFIX_PATH&amp;nbsp;또는&amp;nbsp;Eigen3_DIR,&amp;nbsp;OpenCV_DIR&amp;nbsp;변수를&amp;nbsp;설정할&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1683304016825&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;set(CMAKE_PREFIX_PATH &quot;/path/to/eigen3/installation&quot;)
set(Eigen3_DIR &quot;/path/to/eigen3/installation/share/eigen3/cmake&quot;)
set(CMAKE_PREFIX_PATH &quot;/path/to/opencv/installation&quot;)
set(OpenCV_DIR &quot;/path/to/opencv/installation/share/OpenCV&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;/path/to/eigen3/installation&amp;nbsp;및&amp;nbsp;/path/to/opencv/installation을&amp;nbsp;실제&amp;nbsp;시스템의&amp;nbsp;Eigen3&amp;nbsp;및&amp;nbsp;OpenCV&amp;nbsp;설치&amp;nbsp;경로로&amp;nbsp;바꿉니다. &lt;br /&gt;&lt;br /&gt;또한&amp;nbsp;CMake를&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;pre id=&quot;code_1683304035087&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cmake -DCMAKE_PREFIX_PATH=&quot;/path/to/eigen3/installation&quot; ..
cmake -DEigen3_DIR=&quot;/path/to/eigen3/installation/share/eigen3/cmake&quot; ..
cmake -DCMAKE_PREFIX_PATH=&quot;/path/to/opencv/installation&quot; ..
cmake -DOpenCV_DIR=&quot;/path/to/opencv/installation/share/OpenCV&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;&amp;lt; 결론 &amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CMake를&amp;nbsp;이용하여&amp;nbsp;Eigen3과&amp;nbsp;OpenCV&amp;nbsp;라이브러리를&amp;nbsp;C++&amp;nbsp;프로젝트에&amp;nbsp;포함시키는&amp;nbsp;것은&amp;nbsp;간단합니다.&amp;nbsp;이&amp;nbsp;글에서&amp;nbsp;소개한&amp;nbsp;방법을&amp;nbsp;사용하여&amp;nbsp;프로젝트에&amp;nbsp;필요한&amp;nbsp;라이브러리를&amp;nbsp;쉽게&amp;nbsp;관리할&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;라이브러리를&amp;nbsp;찾지&amp;nbsp;못하는&amp;nbsp;경우에는&amp;nbsp;설치&amp;nbsp;경로를&amp;nbsp;확인하고&amp;nbsp;CMakeLists.txt&amp;nbsp;파일에&amp;nbsp;경로를&amp;nbsp;설정하여&amp;nbsp;문제를&amp;nbsp;해결할&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;CMake,&amp;nbsp;Eigen3,&amp;nbsp;OpenCV를&amp;nbsp;사용하여&amp;nbsp;프로젝트를&amp;nbsp;구성하고&amp;nbsp;빌드하는&amp;nbsp;방법에&amp;nbsp;대해&amp;nbsp;이해했기를&amp;nbsp;바랍니다.&amp;nbsp;이를&amp;nbsp;바탕으로&amp;nbsp;다양한&amp;nbsp;프로젝트에서&amp;nbsp;적용할&amp;nbsp;수&amp;nbsp;있을&amp;nbsp;것입니다.&amp;nbsp;CMake를&amp;nbsp;사용하면&amp;nbsp;여러&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;/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-origin-width=&quot;768&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/beSzU9/btsd0nuWTKb/rKfd3ZGTJhHniaO9dgViCk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/beSzU9/btsd0nuWTKb/rKfd3ZGTJhHniaO9dgViCk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/beSzU9/btsd0nuWTKb/rKfd3ZGTJhHniaO9dgViCk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbeSzU9%2Fbtsd0nuWTKb%2FrKfd3ZGTJhHniaO9dgViCk%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;171&quot; height=&quot;171&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Coding/딥러닝 &amp;amp; opencv</category>
      <category>C++</category>
      <category>cmake</category>
      <category>Eigen3</category>
      <category>OpenCV</category>
      <category>라이브러리 포함</category>
      <category>빌드 시스템</category>
      <category>선형대수</category>
      <category>컴퓨터 비전</category>
      <category>크로스 플랫폼</category>
      <category>프로젝트 관리</category>
      <author>세미531</author>
      <guid isPermaLink="true">https://semi531.tistory.com/118</guid>
      <comments>https://semi531.tistory.com/118#entry118comment</comments>
      <pubDate>Sat, 6 May 2023 01:28:27 +0900</pubDate>
    </item>
    <item>
      <title>Install Nvidia graphic driver, Cuda Toolkit &amp;amp; Cudnn in Ubuntu 22.04</title>
      <link>https://semi531.tistory.com/117</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 NVIDIA Graphic driver 를 설치해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1683091941491&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ubuntu-drivers devices&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 명령어를 터미널에 입력하면 driver 목록이 쭉 나온다. 여기서 뒤에 recommended 라고 붙은 driver 가 있을 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) driver :nvidia-driver-525-distro non-free recommended&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_1683092035625&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo apt install nvidia-driver-525&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;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;이후 추가 드라이버 부분을 클릭하고 기다리면 아래 독점 드라이버 1개를 사용하고 있습니다 가 뜰 것이다. 이러면 드라이버는 정상적으로 설치 완료 된 것이다.&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;또한 터미널에 아래와 같은 명령어를 치고 Driver Version 을 확인한다.&lt;/p&gt;
&lt;pre id=&quot;code_1683092276477&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;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;이제 CUDA 를 설치해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 링크로 들어가서 원하는 버전 Toolkit 을 설치한다. 해당하는 ubuntu 등등을 들어가서 나는 runfile 을 통해 설치했다. 이게 가장 좋은 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://developer.nvidia.com/cuda-toolkit-archive&quot;&gt;https://developer.nvidia.com/cuda-toolkit-archive&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1683096867670&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;CUDA Toolkit Archive&quot; data-og-description=&quot;Previous releases of the CUDA Toolkit, GPU Computing SDK, documentation and developer drivers can be found using the links below. Please select the release you want from the list below, and be sure to check www.nvidia.com/drivers for more recent production&quot; data-og-host=&quot;developer.nvidia.com&quot; data-og-source-url=&quot;https://developer.nvidia.com/cuda-toolkit-archive&quot; data-og-url=&quot;https://developer.nvidia.com/cuda-toolkit-archive&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://developer.nvidia.com/cuda-toolkit-archive&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developer.nvidia.com/cuda-toolkit-archive&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;CUDA Toolkit Archive&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Previous releases of the CUDA Toolkit, GPU Computing SDK, documentation and developer drivers can be found using the links below. Please select the release you want from the list below, and be sure to check www.nvidia.com/drivers for more recent production&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;developer.nvidia.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;일단 사용하는 gpu 는 rtx3060 이다. 오래된 gpu 같은 경우는 지원하는 드라이버에 대한 파악도 필요하므로 아래 공식 링크에서 확인하고 설치하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1683217370123&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;CUDA 12.1 Update 1 Release Notes&quot; data-og-description=&quot;3.1. Notice This document is provided for information purposes only and shall not be regarded as a warranty of a certain functionality, condition, or quality of a product. NVIDIA Corporation (&amp;ldquo;NVIDIA&amp;rdquo;) makes no representations or warranties, expressed &quot; data-og-host=&quot;docs.nvidia.com&quot; data-og-source-url=&quot;https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html&quot; data-og-url=&quot;https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html&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;CUDA 12.1 Update 1 Release Notes&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;3.1. Notice This document is provided for information purposes only and shall not be regarded as a warranty of a certain functionality, condition, or quality of a product. NVIDIA Corporation (&amp;ldquo;NVIDIA&amp;rdquo;) makes no representations or warranties, expressed&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.nvidia.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;rtx3060 은 지원이 끊기는 버전들이 없으므로 내가 설치 cuda&amp;nbsp; toolkit 버전을 정한 기준은 pytorch conda install 을 지원하는 버전으로 설치를 진행했다. 여기서는 pytorch 2.0 에 대해 11.7 과 11.8 설치 가이드를 제시하므로 나는 11.8 로 지정했다. 아래는 pytorch 공식 설치 문서이므로 여기를 참고하자.&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://pytorch.org/get-started/locally/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://pytorch.org/get-started/locally/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1683217489012&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;PyTorch&quot; data-og-description=&quot;An open source machine learning framework that accelerates the path from research prototyping to production deployment.&quot; data-og-host=&quot;pytorch.org&quot; data-og-source-url=&quot;https://pytorch.org/get-started/locally/&quot; data-og-url=&quot;https://www.pytorch.org&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bTN4D4/hySvrjvwOI/NMlXmquSijd5fEuxGfMdKk/img.png?width=2500&amp;amp;height=2500&amp;amp;face=0_0_2500_2500&quot;&gt;&lt;a href=&quot;https://pytorch.org/get-started/locally/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://pytorch.org/get-started/locally/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bTN4D4/hySvrjvwOI/NMlXmquSijd5fEuxGfMdKk/img.png?width=2500&amp;amp;height=2500&amp;amp;face=0_0_2500_2500');&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;PyTorch&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;An open source machine learning framework that accelerates the path from research prototyping to production deployment.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;pytorch.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;이제 터미널에서 설치를 할 때 먼저 Abort, Continue 가 나오면 Continue 에 두고 엔터를 한다. 만약 여기서 에러가 나면 아래 명령어를 실행한 후 다시 해야한다.&lt;/p&gt;
&lt;pre id=&quot;code_1683097037897&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 build-essential&lt;/code&gt;&lt;/pre&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;이후 Licence 관련 창이 나오는데 accept 를 입력 후 엔터를 한다. 그리고 CUDA Installer 가 나오면 Driver 로 가서 스페이스바를 눌러서 체크를 해제하고 Install 을 한다. Driver 에 대한 부분만 해제하면 된다. 쭉 진행되고 Logfile is /var/log/cuda-installer.log 가 나오며 종료되면 설치가 완료된 것이다.&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;이제 해당하는 Toolkit 버전에 대한 명령어들을 하나씩 터미널에 입력한다. Toolkit 버전 11.8 면 아래와 동일하고 11.2 이면 11.8 부분을 11.2 로만 다 바꿔서 해주면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1683097252472&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo sh -c &quot;echo 'export PATH=$PATH:/usr/local/cuda-11.8/bin' &amp;gt;&amp;gt; /etc/profile&quot;
sudo sh -c &quot;echo 'export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda-11.8/lib64' &amp;gt;&amp;gt; /etc/profile&quot;
sudo sh -c &quot;echo 'export CUDADIR=/usr/local/cuda-11.8' &amp;gt;&amp;gt; /etc/profile&quot;
source /etc/profile&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 터미널에 아래 명령어를 치면 설치된 버전이 나온다. 안나오면 재부팅을 해보자.&lt;/p&gt;
&lt;pre id=&quot;code_1683097322671&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;nvcc -V&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 마지막으로 CuDNN 을 설치해야 한다. 아래 링크에 들어가서 자기 cuda toolkit 버전에 맞는 cudnn 을 설치해준다. 나는 11.8 이므로 8.9.0 을 설치하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://developer.nvidia.com/cudnn&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://developer.nvidia.com/cudnn&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1683217658587&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;CUDA Deep Neural Network&quot; data-og-description=&quot;cuDNN provides researchers and developers with high-performance GPU acceleration.&quot; data-og-host=&quot;developer.nvidia.com&quot; data-og-source-url=&quot;https://developer.nvidia.com/cudnn&quot; data-og-url=&quot;https://developer.nvidia.com/cudnn&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/nqQHJ/hySvsbF5n0/tv5ARKlbKkmCjsw1LUQuck/img.jpg?width=1200&amp;amp;height=1191&amp;amp;face=0_0_1200_1191,https://scrap.kakaocdn.net/dn/bdb4lu/hySvoNRkHM/NPFEM8PY0F3OguLAalkICk/img.png?width=1200&amp;amp;height=264&amp;amp;face=0_0_1200_264,https://scrap.kakaocdn.net/dn/hfUcF/hySvrjvzSl/AvEHQU5wY7N6Fluh3oyFkk/img.jpg?width=1145&amp;amp;height=220&amp;amp;face=0_0_1145_220&quot;&gt;&lt;a href=&quot;https://developer.nvidia.com/cudnn&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developer.nvidia.com/cudnn&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/nqQHJ/hySvsbF5n0/tv5ARKlbKkmCjsw1LUQuck/img.jpg?width=1200&amp;amp;height=1191&amp;amp;face=0_0_1200_1191,https://scrap.kakaocdn.net/dn/bdb4lu/hySvoNRkHM/NPFEM8PY0F3OguLAalkICk/img.png?width=1200&amp;amp;height=264&amp;amp;face=0_0_1200_264,https://scrap.kakaocdn.net/dn/hfUcF/hySvrjvzSl/AvEHQU5wY7N6Fluh3oyFkk/img.jpg?width=1145&amp;amp;height=220&amp;amp;face=0_0_1145_220');&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;CUDA Deep Neural Network&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;cuDNN provides researchers and developers with high-performance GPU acceleration.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;developer.nvidia.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;여기서 중요한게 1년 전에 올라온 cudnn 은 설치가 tar, tgz 등의 압축으로 되어있어 최선 버전인 cudnn 은, 특히 ubuntu 는 deb 설치 파일을 제공하고 있다. 따라서 인터넷에 정말 잘 나오지 않았으므로 아래 가이드를 따라서 잘 설치하시면 된다. 열심히 찾았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 위에 링크에서 말한대로 해당 파일을 눌러서 다운을 받는다. 내 파일 이름은 cudnn-local-repo-ubuntu2204-8.9.0.131_1.0-1_amd64.deb 였다. 아래는 이 파일로 설치하는 과정이다.&lt;/p&gt;
&lt;pre id=&quot;code_1683097402018&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cd Download (다운로드 폴더로 들어가면 된다)
sudo dpkg -i cudnn-local-repo-ubuntu2204-8.9.0.131_1.0-1_amd64.deb (자기 deb 파일 이름을 치면 된다)
sudo apt-get update
sudo apt-get install libcudnn8-dev&lt;/code&gt;&lt;/pre&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;/p&gt;
&lt;pre id=&quot;code_1683217978850&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ldconfig -N -v $(sed 's/:/ /' &amp;lt;&amp;lt;&amp;lt; $LD_LIBRARY_PATH) 2&amp;gt;/dev/null | grep libcudnn&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 아래와 같은 결과가 나오는데 이러면 설치가 완료된 것이다. 이런거 할때는 안전하게 한번 reboot 하고 하는게 좋다. 이래야 마음이 편해여.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;590&quot; data-origin-height=&quot;202&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5AElm/btsdYClUq6c/eL2geQVmxbaE6WqWIXbGuk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5AElm/btsdYClUq6c/eL2geQVmxbaE6WqWIXbGuk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5AElm/btsdYClUq6c/eL2geQVmxbaE6WqWIXbGuk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5AElm%2FbtsdYClUq6c%2FeL2geQVmxbaE6WqWIXbGuk%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;590&quot; height=&quot;202&quot; data-origin-width=&quot;590&quot; data-origin-height=&quot;202&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 제거 명령어들에 대해 확인해보자. 아래는 driver 제거 명령어이다.&lt;/p&gt;
&lt;pre id=&quot;code_1683218179493&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo apt-get purge nvidia*
sudo apt-get autoremove
sudo apt-get autoclean&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;아래는 cuda toolkit 제거 명령어들이다. 다 실행해서 확실하게 지우자.&lt;/p&gt;
&lt;pre id=&quot;code_1683218260205&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo rm -rf /usr/local/cuda*
sudo apt-get --purge remove 'cuda*'
sudo apt-get autoremove --purge 'cuda*'

sudo dpkg -l | grep nvidia #여기서 뭐 나오면 그 이름을 아래에
sudo apt-get remove --purge 지우는그이름&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;끝이다. 매우 간단하다. 제거하려면 아래 명령어를 다 실행해서 확실하게 제거하자. 아래는 cudnn 에 대한 제거 명령어이다.&lt;/p&gt;
&lt;pre id=&quot;code_1683097451238&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo apt-get remove nvidia-cudnn
sudo apt-get -y autoremove nvidia-cudnn
sudo apt-get -y purge nvidia-cudnn
sudo apt-get -y autoremove --purge nvidia-cudnn&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;362&quot; data-origin-height=&quot;50&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5oBXH/btsdPvtdvsb/AF3IavRw9WxMK91OUEeU1K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5oBXH/btsdPvtdvsb/AF3IavRw9WxMK91OUEeU1K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5oBXH/btsdPvtdvsb/AF3IavRw9WxMK91OUEeU1K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5oBXH%2FbtsdPvtdvsb%2FAF3IavRw9WxMK91OUEeU1K%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;362&quot; height=&quot;50&quot; data-origin-width=&quot;362&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;</description>
      <category>Coding/딥러닝 &amp;amp; opencv</category>
      <category>cuda install</category>
      <category>CUDA 설치</category>
      <category>cudnn install</category>
      <category>cudnn 설치</category>
      <category>nvidia driver 설치</category>
      <category>nvidia toolkit</category>
      <category>ubuntu cuda</category>
      <category>ubuntu cuDnn</category>
      <category>ubuntu nvidia driver</category>
      <category>ubuntu nvidia install</category>
      <author>세미531</author>
      <guid isPermaLink="true">https://semi531.tistory.com/117</guid>
      <comments>https://semi531.tistory.com/117#entry117comment</comments>
      <pubDate>Thu, 4 May 2023 01:05:37 +0900</pubDate>
    </item>
    <item>
      <title>Anaconda 사용법 - 설치부터 가상환경 생성 및 제거까지</title>
      <link>https://semi531.tistory.com/116</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. Anaconda 설치&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1.1 설치 파일 다운로드&lt;/b&gt;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Anaconda 공식 웹사이트(&lt;b&gt;&lt;a href=&quot;https://www.anaconda.com/products/individual&quot;&gt;https://www.anaconda.com/products/individual&lt;/a&gt;&lt;/b&gt;) 에&amp;nbsp;접속합니다.&lt;/li&gt;
&lt;li&gt;'Download' 버튼을 클릭하여 설치 파일을 다운로드합니다. Windows, macOS, Linux를 지원하며, 각 운영체제에 맞는 버전을 선택하여 다운로드하세요.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1.2 설치 과정&lt;/b&gt;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Linux (Ubuntu 18.04, 20.04, 22.04)&lt;/h3&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;/ol&gt;
&lt;pre id=&quot;code_1681051874360&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;bash Anaconda3-2021.05-Linux-x86_64.sh&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;b&gt;2. 아나콘다 설치&lt;/b&gt;&lt;/b&gt;&lt;/h2&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;라이센스를 확인하는 창이 나오지만, Ctrl + C를 눌러 바로 라이센스 확인 여부를 묻는 창으로 이동합니다.&lt;/li&gt;
&lt;li&gt;'y'를 입력하여 라이센스를 확인합니다.&lt;/li&gt;
&lt;li&gt;설치 위치를 지정합니다. 기본 경로에 설치하려면 Enter를 누르고, 다른 경로에 설치하려면 직접 경로를 입력합니다.&lt;/li&gt;
&lt;li&gt;설치가 완료되고 'yes'를 입력. (no, yes 입력하라고 나옵니다)&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. 아나콘다 환경 설정&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;터미널에서 아래 명령어를 입력하여 &lt;b&gt;.bashrc&lt;/b&gt; 파일을 엽니다.&lt;/p&gt;
&lt;pre id=&quot;code_1681052161399&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo gedit ~/.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;텍스트 편집기가 열리면 마지막 줄에 다음 코드를 추가하고 저장합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1681052233774&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;export PATH=~/anaconda3/bin:~/anaconda3/condabin:$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;터미널에서 아래 명령어를 입력하여 변경사항을 적용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1681052278505&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;source ~/.bashrc&lt;/code&gt;&lt;/pre&gt;

&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4. 아나콘다 설치 확인 및 환경 설정&lt;/b&gt;&lt;/h2&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;code conda -V&lt;/li&gt;
&lt;li&gt;터미널이 실행될 때마다 아나콘다 프롬프트가 활성화되지 않도록 설정하려면 다음 명령어를 입력합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1681052336519&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;conda config --set auto_activate_base False&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;5. 가상환경 생성&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Anaconda는 프로젝트별로 독립된 가상환경을 생성하여 관리할 수 있습니다. 이를 통해 각 프로젝트에서 필요한 라이브러리와 패키지를 별도로 관리할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1681052419425&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;conda create -n wantname python=wantversion
conda create -n mydev python=3.8.16&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_1681052456439&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;conda info --envs&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4. 가상환경 제거&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가상환경 제거 방법은 다음과 같다.&lt;/p&gt;
&lt;pre id=&quot;code_1683091586001&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;conda remove --name &amp;lt;env_name&amp;gt; --all&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_1681052491421&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;conda install anaconda-clean
anaconda-clean --yes
rm -rf ~/anaconda3&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666; text-align: start;&quot;&gt;그 다음 .bashrc 에서 conda 관련 전부 주석을 하면 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;497&quot; data-origin-height=&quot;103&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgZKwJ/btr8UV3UvOZ/8d7aDkPogMXl6BVma9SBX1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgZKwJ/btr8UV3UvOZ/8d7aDkPogMXl6BVma9SBX1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgZKwJ/btr8UV3UvOZ/8d7aDkPogMXl6BVma9SBX1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgZKwJ%2Fbtr8UV3UvOZ%2F8d7aDkPogMXl6BVma9SBX1%2Fimg.jpg&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;497&quot; height=&quot;103&quot; data-origin-width=&quot;497&quot; data-origin-height=&quot;103&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;</description>
      <category>Coding/딥러닝 &amp;amp; opencv</category>
      <category>anaconda 설치</category>
      <category>intsall anaconda</category>
      <category>ubuntu anaconda</category>
      <category>ubuntu anaconda 제거</category>
      <category>아나콘다 설치</category>
      <category>아나콘다 제거</category>
      <category>우분투 anaconda 설치</category>
      <category>우분투 아나콘다</category>
      <category>우분투 아나콘다 제거</category>
      <category>파이썬 아나콘다</category>
      <author>세미531</author>
      <guid isPermaLink="true">https://semi531.tistory.com/116</guid>
      <comments>https://semi531.tistory.com/116#entry116comment</comments>
      <pubDate>Mon, 10 Apr 2023 00:03:23 +0900</pubDate>
    </item>
    <item>
      <title>pytorch 기본 개념 , tensor , 차원</title>
      <link>https://semi531.tistory.com/115</link>
      <description>&lt;pre id=&quot;code_1675152088174&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#텐서 생성
import torch
print(torch.tensor([[1,2],[3,4]])) #2차원형태 텐서
print(torch.tensor([[1,2],[3,4]], device=&quot;cuda:0&quot;)) # gpu에 텐서 생성
print(torch.tensor([[1,2],[3,4]], dtype=torch.float64)) #dtype 을 이용하여 텐서 생성&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1675152102658&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;tensor([[1, 2],
        [3, 4]])
tensor([[1, 2],
        [3, 4]], device='cuda:0')
tensor([[1., 2.],
        [3., 4.]], dtype=torch.float64)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;----&lt;/p&gt;
&lt;pre id=&quot;code_1675152120816&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#텐서를 ndarray 로 변환
temp = torch.tensor([[1,2],[3,4]])
print(temp.numpy())&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1675152131156&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[[1 2]
 [3 4]]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;----&lt;/p&gt;
&lt;pre id=&quot;code_1675152148982&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#gpu 상의 텐서를 cpu 의 텐서로 변환한 후 ndarray 로 변환
temp = torch.tensor([[1,2],[3,4]],device=&quot;cuda:0&quot;)
print(temp.to(&quot;cpu&quot;).numpy())&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1675152159930&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[[1 2]
 [3 4]]&lt;/code&gt;&lt;/pre&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;
&lt;pre id=&quot;code_1675152179729&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#tensor 의 인덱스 조작
# torch.FloatTensor : 32비트 부동 소수점
# torch.DoubleTensor : 64비트의 부동 소수점
# torch.LongTensor : 64비트의 부호가 있는 정수

temp = torch.FloatTensor([1,2,3,4,5,6,7]) #파이토치로 1차원벡터 생성
print(temp)
print(temp[0],temp[1],temp[-1])
print(&quot;---------&quot;)
print(temp[2:5],temp[4:-1])&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1675152188479&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;tensor([1., 2., 3., 4., 5., 6., 7.])
tensor(1.) tensor(2.) tensor(7.)
---------
tensor([3., 4., 5.]) tensor([5., 6.])&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;----&lt;/p&gt;
&lt;pre id=&quot;code_1675152199685&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#텐서의 차원 조작
# view 를 이용하는 것이 대표적 : 넘파이의 reshape 과 유사
# 텐서를 결함하는 cat, stack : 다른 길이의 텐서를 하나로 병합할때
# 차원을 교환하는 t, transpose 도 사용 : 행렬의 전치 외에도 차원의 순서를 변경할 때

temp = torch.tensor([[1,2],[3,4]]) # 2*2 행렬 생성

print(temp.shape)
print('---------------')
print(temp.view(4,1)) # 2*2 행렬을 4*1 로 변형
print('---------------')
print(temp.view(-1)) # 1차원 벡터로 변형
print('---------------')
print(temp.view(1,-1)) # -1 은 1*자동으로 라는 의미. 반대도 마찬가지이다. 여기서는 1*4가 된다.&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1675152209009&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;torch.Size([2, 2])
---------------
tensor([[1],
        [2],
        [3],
        [4]])
---------------
tensor([1, 2, 3, 4])
---------------
tensor([[1, 2, 3, 4]])&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xr4lm/btrXHSw5fD1/gTxDIRHNJXQuLm9zIeTE4k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xr4lm/btrXHSw5fD1/gTxDIRHNJXQuLm9zIeTE4k/img.png&quot; data-alt=&quot;pytorch&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xr4lm/btrXHSw5fD1/gTxDIRHNJXQuLm9zIeTE4k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fxr4lm%2FbtrXHSw5fD1%2FgTxDIRHNJXQuLm9zIeTE4k%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;185&quot; height=&quot;185&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1280&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;pytorch&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Coding/딥러닝 &amp;amp; opencv</category>
      <category>1차원 벡터</category>
      <category>pytorch</category>
      <category>pytorch 행 열</category>
      <category>tensor</category>
      <category>Torch</category>
      <category>torch tensor</category>
      <category>차원 변환</category>
      <category>차원 변환 view</category>
      <category>파이토치</category>
      <category>행렬</category>
      <author>세미531</author>
      <guid isPermaLink="true">https://semi531.tistory.com/115</guid>
      <comments>https://semi531.tistory.com/115#entry115comment</comments>
      <pubDate>Tue, 31 Jan 2023 17:05:11 +0900</pubDate>
    </item>
    <item>
      <title>우분투 yolo v4 설치 및 실행 방법</title>
      <link>https://semi531.tistory.com/114</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;387&quot; data-origin-height=&quot;207&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b5r4Nb/btrCw9egFCr/Vk2tSqNaQbzudm74gQTuE1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b5r4Nb/btrCw9egFCr/Vk2tSqNaQbzudm74gQTuE1/img.png&quot; data-alt=&quot;object detection&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b5r4Nb/btrCw9egFCr/Vk2tSqNaQbzudm74gQTuE1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb5r4Nb%2FbtrCw9egFCr%2FVk2tSqNaQbzudm74gQTuE1%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;387&quot; height=&quot;207&quot; data-origin-width=&quot;387&quot; data-origin-height=&quot;207&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;object detection&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리는 우분투에서 yolo 를 실행하기 위해 CUDA, OpenCV, cuDNN 설정을 해줘야 한다. 이 설정에 대한 방법은 추후 본블로그 글에서 확인할 수 있을 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1652861123507&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo apt update
pip install opencv-python
sudo apt install libopencv-dev&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sudo apt 로 opencv 를 설치 할 수도 있지만 이러면 최신버전인 OpenCV 인 4.xx 가 아닌 3.xx 가 설치되므로 위와 같이 실행하여 설치를 해주자.&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;다음으로 cuDNN 과 CUDA 가 설정되어 있어야 하는데 이는 다음 글에서 설명하겠다. 참고로 depth 가 나오는 ZED 카메라를 사용하려면 CUDA 버전이 11.5 여야 하므로(우분투 20.04 기준)(18.04 는 10.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;그 다음 원하는 장소에 yolo 설치를 위해 git clone 을 해준다.&lt;/p&gt;
&lt;pre id=&quot;code_1652861351181&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;https://github.com/AlexeyAB/darknet.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;그 다음 설치된 darknet 폴더 안에 Makefile 을 수정해줘야 한다. Makefile 수정의 이유와 자세한 설명들은 아래 링크를 보면 되고 바로 사용하려면 아래와 같이 수정하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/AlexeyAB/darknet/#how-to-compile-on-linux-using-make&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/AlexeyAB/darknet/#how-to-compile-on-linux-using-make&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1652861492698&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - AlexeyAB/darknet: YOLOv4 / Scaled-YOLOv4 / YOLO - Neural Networks for Object Detection (Windows and Linux version of Da&quot; data-og-description=&quot;YOLOv4 / Scaled-YOLOv4 / YOLO - Neural Networks for Object Detection (Windows and Linux version of Darknet ) - GitHub - AlexeyAB/darknet: YOLOv4 / Scaled-YOLOv4 / YOLO - Neural Networks for Object ...&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/AlexeyAB/darknet/#how-to-compile-on-linux-using-make&quot; data-og-url=&quot;https://github.com/AlexeyAB/darknet&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/S2gEZ/hyOskHWg7h/9KPBdHYOa9yKy0AjJyckN0/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/AlexeyAB/darknet/#how-to-compile-on-linux-using-make&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/AlexeyAB/darknet/#how-to-compile-on-linux-using-make&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/S2gEZ/hyOskHWg7h/9KPBdHYOa9yKy0AjJyckN0/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&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;GitHub - AlexeyAB/darknet: YOLOv4 / Scaled-YOLOv4 / YOLO - Neural Networks for Object Detection (Windows and Linux version of Da&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;YOLOv4 / Scaled-YOLOv4 / YOLO - Neural Networks for Object Detection (Windows and Linux version of Darknet ) - GitHub - AlexeyAB/darknet: YOLOv4 / Scaled-YOLOv4 / YOLO - Neural Networks for Object ...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.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;pre id=&quot;code_1652861517062&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;GPU=1
CUDNN=1
CUDNN_HALF=1
OPENCV=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;그 다음 자신의 GPU 에 맞는 ARCH 를 설정해줘야 한다. 이는 아래 링크에서 확인하고 만약 Nvidia GPU 6.1 로 나와 있으면 아래와 같이 61로 변경해서 적으면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://developer.nvidia.com/cuda-gpus&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://developer.nvidia.com/cuda-gpus&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1652861648184&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;CUDA GPUs&quot; data-og-description=&quot;Your GPU Compute Capability Are you looking for the compute capability for your GPU, then check the tables below. You can learn more about Compute Capability here. NVIDIA GPUs power millions of desktops, notebooks, workstations and supercomputers around th&quot; data-og-host=&quot;developer.nvidia.com&quot; data-og-source-url=&quot;https://developer.nvidia.com/cuda-gpus&quot; data-og-url=&quot;https://developer.nvidia.com/cuda-gpus&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/csst35/hyOrd4KHEe/I63Ud3KKaWo9pKiM9QoQK0/img.jpg?width=1145&amp;amp;height=220&amp;amp;face=0_0_1145_220,https://scrap.kakaocdn.net/dn/ibvZR/hyOriZhRYd/Uhq8W3EdgT4V7QRzNFUrf1/img.jpg?width=1145&amp;amp;height=220&amp;amp;face=731_112_773_160,https://scrap.kakaocdn.net/dn/dxbF2x/hyOstx72Ww/kAOkJKWNMkMPLhR7wm67D0/img.jpg?width=1145&amp;amp;height=220&amp;amp;face=0_0_1145_220&quot;&gt;&lt;a href=&quot;https://developer.nvidia.com/cuda-gpus&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developer.nvidia.com/cuda-gpus&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/csst35/hyOrd4KHEe/I63Ud3KKaWo9pKiM9QoQK0/img.jpg?width=1145&amp;amp;height=220&amp;amp;face=0_0_1145_220,https://scrap.kakaocdn.net/dn/ibvZR/hyOriZhRYd/Uhq8W3EdgT4V7QRzNFUrf1/img.jpg?width=1145&amp;amp;height=220&amp;amp;face=731_112_773_160,https://scrap.kakaocdn.net/dn/dxbF2x/hyOstx72Ww/kAOkJKWNMkMPLhR7wm67D0/img.jpg?width=1145&amp;amp;height=220&amp;amp;face=0_0_1145_220');&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;CUDA GPUs&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Your GPU Compute Capability Are you looking for the compute capability for your GPU, then check the tables below. You can learn more about Compute Capability here. NVIDIA GPUs power millions of desktops, notebooks, workstations and supercomputers around th&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;developer.nvidia.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;pre id=&quot;code_1652861658292&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ARCH= -gencode arch=compute_61,code=[sm_61,compute_61]&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_1652861716338&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cd darknet
make&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;그 다음 yolo v4 의 weight 파일을 다운로드 해야한다. 아래와 같이 받으면 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1652861772218&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;wget https://github.com/AlexeyAB/darknet/releases/download/darknet_yolo_v3_optimal/yolov4.weights&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;이제 yolo 를 실행시켜보자. 먼저 예시 사진 명령어는 아래와 같다. 두가지 명령어 모두 같은 아웃풋이다.&lt;/p&gt;
&lt;pre id=&quot;code_1652862032168&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;./darknet detect cfg/yolov4.cfg yolov4.weights data/dog.jpg&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1652861952567&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;./darknet detector test cfg/coco.data cfg/yolov4.cfg yolov4.weights data/dog.jpg&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 명령어는 먼저 ./darknet 은 &quot;현재 darknet 폴더에서&quot;&amp;nbsp; 라는 뜻이고 detect 는 말 그대로 detect 한다는 것이고 cfg/yolov4.cfg 는 우리가 설정한 yolo 의 레이어 대로 실행한다는 뜻이고 yolov4.weights 는 우리가 다운 받거나 직접 학습시켜서 만들어낸 weight file 을 사용한다는 뜻이고 data/dog.jpg 는 data 폴터 안에 dog.jpg 라는 파일을 detect 하라는 뜻이다.&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;이제 Real-Time Detection 을 웹캠으로 하기 위한 명령어는 아래와 같다.&lt;/p&gt;
&lt;pre id=&quot;code_1652862193370&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;./darknet detector demo cfg/coco.data cfg/yolov4.cfg yolov4.weights&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 명령어를 노트북에서 실행하면 아마 내장된 웹캠으로 켜질 것이므로 카메라를 바꾸고 싶다면 아래와 같이 위에 -c 1, -c 2 와 같이 설치한 웹캠이 몇번째 카메라인지 찾으며 실행시켜 보면 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1652862261113&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;./darknet detector demo cfg/coco.data cfg/yolov4.cfg yolov4.weights -c 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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 detection 에 대한 디버깅을 하기 위해 녹화된 영상을 yolo 로 돌리기 위해서는 아래와 같은 명령어를 실행시키면 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1652862303900&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;./darknet detector demo cfg/coco.data cfg/yolov4.cfg yolov4.weights &amp;lt;video file&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1652862312199&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;./darknet detector demo cfg/coco.data cfg/yolov4.cfg yolov4.weights &amp;lt;video file&amp;gt; -out_filename &amp;lt;output_video file&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;다음에는 custom data 를 통해 학습하는 방법을 설명하도록 하겠다.&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;------------------------------&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자주 발생하는 오류 해결 링크&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/55035797/darknet-segmentation-fault-core-dumped&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://stackoverflow.com/questions/55035797/darknet-segmentation-fault-core-dumped&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1652862410306&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;Darknet- Segmentation fault (core dumped)&quot; data-og-description=&quot;I'm trying to do object detection using YOLOv2 on my custom dataset(ubuntu 18.04). The following error ocurs:- 115: nan, nan avg loss, 0.001000 rate, 17.887053 seconds, 2760 images Loaded: 0.000045&quot; data-og-host=&quot;stackoverflow.com&quot; data-og-source-url=&quot;https://stackoverflow.com/questions/55035797/darknet-segmentation-fault-core-dumped&quot; data-og-url=&quot;https://stackoverflow.com/questions/55035797/darknet-segmentation-fault-core-dumped&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cdrQLA/hyOrkbKk4J/5RO4kQNbXAjMuQHtcmNmW1/img.png?width=316&amp;amp;height=316&amp;amp;face=0_0_316_316&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/55035797/darknet-segmentation-fault-core-dumped&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://stackoverflow.com/questions/55035797/darknet-segmentation-fault-core-dumped&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cdrQLA/hyOrkbKk4J/5RO4kQNbXAjMuQHtcmNmW1/img.png?width=316&amp;amp;height=316&amp;amp;face=0_0_316_316');&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;Darknet- Segmentation fault (core dumped)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;I'm trying to do object detection using YOLOv2 on my custom dataset(ubuntu 18.04). The following error ocurs:- 115: nan, nan avg loss, 0.001000 rate, 17.887053 seconds, 2760 images Loaded: 0.000045&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;stackoverflow.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;</description>
      <category>Coding/딥러닝 &amp;amp; opencv</category>
      <category>camera detection</category>
      <category>linux yolo</category>
      <category>ubuntu camera</category>
      <category>ubuntu camera detection</category>
      <category>ubuntu yolo</category>
      <category>yolo</category>
      <category>yolo v4</category>
      <category>yolo v5</category>
      <category>우분투 yolo</category>
      <category>웹캠 yolo</category>
      <author>세미531</author>
      <guid isPermaLink="true">https://semi531.tistory.com/114</guid>
      <comments>https://semi531.tistory.com/114#entry114comment</comments>
      <pubDate>Wed, 18 May 2022 17:27:54 +0900</pubDate>
    </item>
    <item>
      <title>경로생성(Frenet)</title>
      <link>https://semi531.tistory.com/113</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1237&quot; data-origin-height=&quot;1800&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/caLVH9/btrB4PCtDz9/BQ5la52cQnBfx4IFIDFQE0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/caLVH9/btrB4PCtDz9/BQ5la52cQnBfx4IFIDFQE0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/caLVH9/btrB4PCtDz9/BQ5la52cQnBfx4IFIDFQE0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcaLVH9%2FbtrB4PCtDz9%2FBQ5la52cQnBfx4IFIDFQE0%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;1237&quot; height=&quot;1800&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1237&quot; data-origin-height=&quot;1800&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;1780&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bH1bCi/btrB7NDDC3Q/bii7QhPnYI8ZkHoPs3MIVK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bH1bCi/btrB7NDDC3Q/bii7QhPnYI8ZkHoPs3MIVK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bH1bCi/btrB7NDDC3Q/bii7QhPnYI8ZkHoPs3MIVK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbH1bCi%2FbtrB7NDDC3Q%2Fbii7QhPnYI8ZkHoPs3MIVK%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;1170&quot; height=&quot;1780&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;1780&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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1232&quot; data-origin-height=&quot;1774&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bIRTWv/btrCboXcq8n/Cavhh5FomcVEvfPFOHKce0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bIRTWv/btrCboXcq8n/Cavhh5FomcVEvfPFOHKce0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bIRTWv/btrCboXcq8n/Cavhh5FomcVEvfPFOHKce0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbIRTWv%2FbtrCboXcq8n%2FCavhh5FomcVEvfPFOHKce0%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;1232&quot; height=&quot;1774&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1232&quot; data-origin-height=&quot;1774&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1600&quot; data-origin-height=&quot;2560&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cfpvK3/btrB8YdSQbm/IQtgyIab75s0Cfat88Y8xK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cfpvK3/btrB8YdSQbm/IQtgyIab75s0Cfat88Y8xK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cfpvK3/btrB8YdSQbm/IQtgyIab75s0Cfat88Y8xK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcfpvK3%2FbtrB8YdSQbm%2FIQtgyIab75s0Cfat88Y8xK%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;1600&quot; height=&quot;2560&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1600&quot; data-origin-height=&quot;2560&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Life/자율주행, AI</category>
      <category>Cartesian</category>
      <category>cartesian 좌표</category>
      <category>cost function</category>
      <category>frenet</category>
      <category>frenet 좌표</category>
      <category>spline</category>
      <category>trajectory</category>
      <category>경사하강법</category>
      <author>세미531</author>
      <guid isPermaLink="true">https://semi531.tistory.com/113</guid>
      <comments>https://semi531.tistory.com/113#entry113comment</comments>
      <pubDate>Sat, 14 May 2022 22:48:10 +0900</pubDate>
    </item>
    <item>
      <title>sql 실습 시작(sql 입문 및 oracle 서버 시작)</title>
      <link>https://semi531.tistory.com/112</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;1. 윈도우 메뉴에서 SQL Plus 실행&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;p data-ke-size=&quot;size16&quot;&gt;# 수행 가능한 명령어 종류&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- SQL commands&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- PL/SQL blocks&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- SQL*Plus commands&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;- with a semicolon (;)&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;- with a blank line&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;# 버퍼에 저장된 명령어의 수행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- SQL&amp;gt; run&amp;nbsp; &amp;lt;- 버퍼에 있는 내용 listing 후 수행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- SQL&amp;gt; / &amp;lt;- 단순히 버퍼에 있는 내용 수행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- SQL&amp;gt; edit &amp;lt;- 버퍼에 있는 내용 수정&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;br /&gt;# SQL*PLUS 의 prompt 상태에서 작성한 SQL 명령어의 저장 &lt;br /&gt;- SQL&amp;gt; save &amp;ldquo;파일 경로&quot;/ file_name[.sql]&lt;br /&gt;&lt;br /&gt;# SQL 문을 저장한 파일 부르기&lt;br /&gt;- SQL&amp;gt; get &amp;ldquo;파일 경로&amp;ldquo;/ file_name[.sql]&lt;br /&gt;&lt;br /&gt;# 명령어 파일 수행&lt;br /&gt;- SQL&amp;gt; start &amp;ldquo;파일 경로&quot;/ file_name[.sql]&lt;br /&gt;- SQL&amp;gt; @&amp;rdquo; 파일 경로 &amp;ldquo; file_name[.sql]&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;#실행결과 spooling&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- SQL&amp;gt; spool file_name[.ext]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- SQL&amp;gt; spool off&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;##Spool 명령어 사용 방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SQL&amp;gt; spool c:~~/wantname.txt&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이거 해준 뒤에 원하는 명령어들 쓰면 그 과정들이 spool 로 저장됨.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SQL&amp;gt; spool off&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;#Create TABLE&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CREATE&amp;nbsp;TABLE&amp;nbsp;EMPLOYEE &lt;br /&gt;(Fname&amp;nbsp;VARCHAR(15)&amp;nbsp;NOT&amp;nbsp;NULL, &lt;br /&gt;Minit&amp;nbsp;CHAR, &lt;br /&gt;Lname&amp;nbsp;VARCHAR(15)&amp;nbsp;NOT&amp;nbsp;NULL, &lt;br /&gt;Ssn&amp;nbsp;CHAR(9)&amp;nbsp;NOT&amp;nbsp;NULL, &lt;br /&gt;Bdate&amp;nbsp;DATE, &lt;br /&gt;Address&amp;nbsp;VARCHAR(30), &lt;br /&gt;Sex&amp;nbsp;CHAR, &lt;br /&gt;Salary&amp;nbsp;DECIMAL(10,2), &lt;br /&gt;Super_ssn&amp;nbsp;CHAR(9), &lt;br /&gt;Dno&amp;nbsp;INT&amp;nbsp;NOT&amp;nbsp;NULL, &lt;br /&gt;PRIMARY&amp;nbsp;KEY&amp;nbsp;(Ssn), &lt;br /&gt;FOREIGN&amp;nbsp;KEY&amp;nbsp;(Super_ssn)&amp;nbsp;REFERENCES&amp;nbsp;EMPLOYEE(Ssn));&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;table&amp;nbsp;list&amp;nbsp;확인(생성확인)&amp;nbsp;:&amp;nbsp;select&amp;nbsp;*&amp;nbsp;from&amp;nbsp;tab; &lt;br /&gt;desc&amp;nbsp;employee(table&amp;nbsp;name);&amp;nbsp;-&amp;gt;&amp;nbsp;스키마&amp;nbsp;구조&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;INSERT&amp;nbsp;DATA&amp;nbsp;*/ &lt;br /&gt;INSERT&amp;nbsp;INTO&amp;nbsp;EMPLOYEE&amp;nbsp;VALUES('James','E','Borg','888665555',to_date('1937-11-10','yyyy-mm-dd'),'450&amp;nbsp;Stone,&amp;nbsp;Houston,&amp;nbsp;TX','M','55000',NULL,'1'); &lt;br /&gt;data&amp;nbsp;넣은것&amp;nbsp;확인&amp;nbsp;-&amp;gt;&amp;nbsp;select&amp;nbsp;*&amp;nbsp;from&amp;nbsp;employee; &lt;br /&gt;INSERT&amp;nbsp;INTO&amp;nbsp;EMPLOYEE&amp;nbsp;VALUES('Franklin','T','Wong','333445555',to_date('1955-12-08','yyyy-mm-dd'),'683&amp;nbsp;Voss,&amp;nbsp;Houston,&amp;nbsp;TX','M','40000','888665555','5');&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;set&amp;nbsp;linesize&amp;nbsp;150 &lt;br /&gt;set&amp;nbsp;pagesize&amp;nbsp;150&amp;nbsp;-&amp;gt;&amp;nbsp;많은&amp;nbsp;데이터&amp;nbsp;끊겨서&amp;nbsp;보이는거 &lt;br /&gt;&lt;br /&gt;commit; -&amp;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;# 환경 변수의 설정과 확인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- set / show 명령어 사용 &lt;br /&gt;SQL&amp;gt;&amp;nbsp;set&amp;nbsp;pause&amp;nbsp;on; &lt;br /&gt;SQL&amp;gt;&amp;nbsp;show&amp;nbsp;pause; &lt;br /&gt;pause&amp;nbsp;ON&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;br /&gt;pause msg : 한 화면씩 출력한 후 메시지 출력&lt;br /&gt;pause on/off : 페이지 단위로 출력 , 초기값은 on&lt;br /&gt;pagesize n : 페이지당 라인의 수를 n 으로 설정 . 초기값은 14&lt;br /&gt;linesize n : 라인당 문자 수를 n 으로 설정 . 초기값은 80&lt;br /&gt;heading on/off : heading 의 디스플레이 여부를 결정 . 초기값 on&lt;br /&gt;time&amp;nbsp;on/off&amp;nbsp;:&amp;nbsp;프롬프트&amp;nbsp;앞에&amp;nbsp;현재&amp;nbsp;시각을&amp;nbsp;나타냄&amp;nbsp;.&amp;nbsp;초기값은&amp;nbsp;off&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;append text : text 를 명령어 끝에 첨가&lt;br /&gt;change /old/new : old 를 new 로 치환&lt;br /&gt;change /text : 현 명령어 줄에서 text 를 삭제&lt;br /&gt;del : 현 명령어 줄을 지움&lt;br /&gt;input : 하나 이상의 줄을 첨가&lt;br /&gt;input text : text 를 포함하는 명령어 줄을 첨가&lt;br /&gt;list : 버퍼의 모든 내용 출력&lt;br /&gt;list * : 현 명령어 줄을 보여줌&lt;br /&gt;list last : 마지막 명령어 줄을 보여줌&lt;br /&gt;list&amp;nbsp;m&amp;nbsp;n&amp;nbsp;:&amp;nbsp;m&amp;nbsp;부터&amp;nbsp;n&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;p data-ke-size=&quot;size16&quot;&gt;#편집 명령 예시&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;SQL&amp;gt; select empno&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;From emp&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Where deptno = 10&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;2. 버퍼의 내용 출력하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SQL&amp;gt; I&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 결과&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 1. select empno&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 2. From emp&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 3* Where deptno = 10&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;SQL&amp;gt; I 3&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3* where deptno = 10&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SQL&amp;gt; change/10/30(10을 30으로 변경)&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;4. 버퍼의 내용을 출력하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SQL&amp;gt; I&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 결과&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 1. select empno&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 2. From emp&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 3* Where deptno = 30&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;# comment 달기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- remark &amp;lt;- 한 줄의 첫머리서부터&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- /*...*/ &amp;lt;- 여러 줄&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- -- &amp;lt;- 명령어의 마지막 행에&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;# catalog 관련 명령어&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- table 의 schema 구조 조회&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* SQL&amp;gt; desc &quot;table_name&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;# 현재 connect 한 사용자가 생성한 table 조회&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- SQL&amp;gt; select * from tab;&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;#Oracle에서 사용 가능한 자료형&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CHAR(size) = 고정 길이 문자열 (size 의 기본값 1, 최대값 255)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CHARACTER(size) = CHAR 와 동일&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DATE = 날짜 타입&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LONG = 가변 길이 문자열 (최대 2GB까지 가능)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LONG RAW = 이진 자료(binary data)(최대 2GB 또는 2^31 - 1)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NUMBER(p, s) = precision p 와 scale s 를 갖는 숫자 (최대 38자리)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RAW(size) = size 만큼의 크기를 갖는 이진 자료(최대 2GB)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VARCHAR2(size) = 최대 size 길이만큼의 가변길이 문자열&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;# Oracle SQL 네이밍 규칙&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 1byte 에서 30 bytes 길이로 작성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단, 데이터베이스의 이름은 8 byte 이상&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- quotation marks 를 포함하면 안됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- A-Z 범위의 글자로 시작&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- A-Z, 0-9, $, #, _ 로만 구성할 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- SQL 예약어와 중복될 수 없음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;##double quotation marks 로 둘러싼 이름&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- naming 시 위 규칙을 따르지 않아도 됨&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;CREATE TABLE DEPT (DEPTNO NUMBER(2) CONSTRAINT PK_DEPT PRIMARY KEY, DNAME VARCHAR2(14), LOC VARCHAR2(13));&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;SELECT * FROM DEPT;&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;</description>
      <category>Coding/Database</category>
      <author>세미531</author>
      <guid isPermaLink="true">https://semi531.tistory.com/112</guid>
      <comments>https://semi531.tistory.com/112#entry112comment</comments>
      <pubDate>Sat, 30 Apr 2022 16:04:01 +0900</pubDate>
    </item>
    <item>
      <title>IMU(관성측정장치) 에서 알아야 하는 필수 내용들</title>
      <link>https://semi531.tistory.com/111</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;IMU 는 관성측정장치로 3축 가속도와 3축 자이로 센서를 조합하여 자세 제어에 요구되는 Roll, Pitch, Yaw 의 기울어진 각도를 말한다. Roll 은 좌우로 기울어짐, Pitch 는 앞뒤로 기울어짐, Yaw 는 z축 방향으로 기울어짐, 즉 회전각을 나타내고 우리가 차량을 생각할 때 좌회전인지 직진인지 우회전인지 판단하는 방향의 회전각을 Yaw 라고 이해하면된다. 또한 Roll 과 Pitch 는 중력 방향을 기준으로 얼마나 기울어져 있는지를 나타낸다.&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-origin-width=&quot;700&quot; data-origin-height=&quot;520&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/caBwcd/btryp5IHv29/4CRMajwEBvCvKkW4soIob1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/caBwcd/btryp5IHv29/4CRMajwEBvCvKkW4soIob1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/caBwcd/btryp5IHv29/4CRMajwEBvCvKkW4soIob1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcaBwcd%2Fbtryp5IHv29%2F4CRMajwEBvCvKkW4soIob1%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;520&quot; data-origin-width=&quot;700&quot; data-origin-height=&quot;520&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3축 자이로 센서(Gyroscope) 는 가속도를 측정하는 가속도 센서와 달리 각속도를 측정하므로 단위는 degree/sec 이다. 자이로는 각속도를 측정하는 장치이기에 이를 이용해서 각도를 알려면 전체 시간에 대하여 적분을 하여 얻게 된다. 그러나 센서에서 측정되는 각속도는 노이즈나 다른 여러 이유에 의해 측정값에 에러가 계속 생기는데 이 오차가 적분시에는 누적이 되어 최종 값이 드리프트 되는 현상이 생긴다. 시간이 지날수록 오차는 커지므로 오차 보정 알고리즘이 필수이다.&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;Yaw 의 회전축은 z축 방향, 즉 중력방향과 동일하므로 가속도 센서가 아닌 자이로 센서의 z 축 값을 측정해서 이 값을 이용해 Yaw 값을 계산하여야 하고 드리프트되는 오차를 보상하는 다른 센서를 추가적으로 사용하는데 이것이 지자지 센서이다. 자이로는 온도가 변하면 그 값이 같이 변하는 특성이 있어 정교한 측정을 위해서는 온도 센서도 함께 사용하여 오차를 보정하기도 한다. 이를 모두 고려하면 3축 가속도 센서, 3축 자이로 센서, 3축 지자기 센서를 내장한 IMU 센서를 9축 센서라고 부르는 이유이다.&lt;/p&gt;</description>
      <category>Coding/Robot Operating System</category>
      <category>IMU</category>
      <category>imu gps</category>
      <category>imu gps 센서퓨전</category>
      <category>imu gps 캘리브레이션</category>
      <category>roll pitch yaw</category>
      <category>Yaw</category>
      <category>관성측정장치</category>
      <category>롤 피치 요</category>
      <category>칼만필터</category>
      <author>세미531</author>
      <guid isPermaLink="true">https://semi531.tistory.com/111</guid>
      <comments>https://semi531.tistory.com/111#entry111comment</comments>
      <pubDate>Tue, 5 Apr 2022 03:29:33 +0900</pubDate>
    </item>
    <item>
      <title>Spotify 의 미래</title>
      <link>https://semi531.tistory.com/110</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이번 실적발표 이후 스포티파이의 주가가 18.9% 나 하락했다. 원인을 한번 알아보자. 스포티파이는 음원 스트리밍 서비스를 하는 회사이다. 처음 스포티파이가 주목을 받은 이유는 음악 추천 알고리즘이 타 서비스들은 매우 저조한 성능을 보이는 반면 매우 좋은 성능으로 사람들에게 긍정적인 영향을 미치면서 주목받게 되었다. 또한 코로나 시국이 되면서 사용자가 더욱 증가하여 코로나 시대에 매우 수혜를 받은 회사 중 하나이다.&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-origin-width=&quot;1280&quot; data-origin-height=&quot;384&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d98Poa/btrswUS5CXS/0CZHncvHtCgU388leaKmWk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d98Poa/btrswUS5CXS/0CZHncvHtCgU388leaKmWk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d98Poa/btrswUS5CXS/0CZHncvHtCgU388leaKmWk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd98Poa%2FbtrswUS5CXS%2F0CZHncvHtCgU388leaKmWk%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;653&quot; height=&quot;196&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;384&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;&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;하지만 개인적인 생각을 써보자면 요즘 초연결 시대, 메타버스라는 개념이 증가하며 스포티파이도 분명 이러한 흐름을 타고 새로운 형식의 sns 산업에 투자할 수 있고 탄탄한 인공지능 기술과 새로운 음원 관련 비즈니스 모델을 찾아서 음악 산업을 it 업계의 관점에서 새롭게 이끌어나갈 수 있을 것이라 생각한다.&lt;/p&gt;</description>
      <category>study/Economy</category>
      <category>Spotify</category>
      <category>spotify 미래</category>
      <category>spotify 주가</category>
      <category>spotify 주식</category>
      <category>스포티파이</category>
      <category>스포티파이 메타버스</category>
      <category>스포티파이 미래</category>
      <category>스포티파이 주가</category>
      <category>스포티파이 주식</category>
      <category>스포티파이 투자</category>
      <author>세미531</author>
      <guid isPermaLink="true">https://semi531.tistory.com/110</guid>
      <comments>https://semi531.tistory.com/110#entry110comment</comments>
      <pubDate>Sat, 5 Feb 2022 01:55:37 +0900</pubDate>
    </item>
    <item>
      <title>페이스북, 메타의 미래</title>
      <link>https://semi531.tistory.com/109</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;구 페이스북 현 메타가 실적발표를 하며 이슈가 되고 있다. 실적 상승 폭이 매우 작고 앞으로의 미래가 불투명하다는 분석이 이어지면서 이다. 이 때문에 메타의 주가는 시간외거래 23% 가까이 폭락했다. 메타의 성장에 불안감을 조성하는 원인들을 살펴보자면 유튜브와 인스타그램에서 &lt;u&gt;숏 폼의 영상이 증가&lt;/u&gt;하면서 페이스북 등의 광고수익이 줄어들 것이라 예상했다. 뉴스피드보다 &lt;span style=&quot;background-color: #99cefa;&quot;&gt;릴스라고 불리는 짧은 동영상은 매우 수익성이 낮다.&lt;/span&gt; 또한 애플의 ios 의 개인정보 처리 방침 변경 이슈가 페이스북의 타겟광고를 금지하므로 이를 통한 메타의 매출이 줄어들 것이라 예상한다. 메타의 매출 중 약 98% 가 광고수익이라는 것을 생각하면 정말 스마트폰 점유율 1등인 애플의 이 정책이 페이스북에 어마어마한 영향을 미쳤다고 본다. 이번 주가 하락으로 인해 300조 이상의 시가총액이 없어졌다고 한다. 이는 정말 엄청난 금액이다. 또한 인플레이션과 공급망 차질로 광고주의 비용이 늘어난 점에서 실적이 줄어들고 올해 최초로 일일 활성 사용자 수가 감소하였다.&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-origin-width=&quot;464&quot; data-origin-height=&quot;260&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oTLww/btrsveqJToI/1tyV9F8BhF7d5kLJTqAmuk/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oTLww/btrsveqJToI/1tyV9F8BhF7d5kLJTqAmuk/img.webp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oTLww/btrsveqJToI/1tyV9F8BhF7d5kLJTqAmuk/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoTLww%2FbtrsveqJToI%2F1tyV9F8BhF7d5kLJTqAmuk%2Fimg.webp&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;464&quot; height=&quot;260&quot; data-origin-width=&quot;464&quot; data-origin-height=&quot;260&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;페이스북은 이제 메타라는 사명으로 메타버스 사업에 집중하겠다는 뜻을 확실히 표명했다. 아무래도 수익모델이 광고밖에 없었는데 사람간의 연결에서 선도하는 기술인 메타버스 사업에서 1등을 차지하려는 목표인 것 같다. 현재 메타버스 사업은 증강현식(AR) 과 가상현실(VR) 기기 및 소프트웨어를 담당하는 리얼리티랩스가 이끌 고 있고 이 부분이 이번 처음으로 공개되었지만 상당한 손실을 보고있다.&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;하지만 로봇(감각을 느끼는 진실된 메타버스) 과 메타버스 플렛폼, 인공지능 기술, VR 을 모두 연결하는 회사에 대해서 리딩하는 회사가 메타라고 생각하고 그냥 일반적인 아바타가 다니는 이름만인 메타버스가 아니라 정말 초연결을 실현할 메타버스 회사는 개인적으로 메타 밖에 없다고 생각한다.&lt;/p&gt;</description>
      <category>Life/자율주행, AI</category>
      <category>마크 주커버그</category>
      <category>메타</category>
      <category>메타 메타버스</category>
      <category>메타 주가</category>
      <category>메타 주식</category>
      <category>메타버스 페이스북</category>
      <category>페이스북 메타</category>
      <category>페이스북 메타버스</category>
      <category>페이스북 주가</category>
      <category>페이스북 주식</category>
      <author>세미531</author>
      <guid isPermaLink="true">https://semi531.tistory.com/109</guid>
      <comments>https://semi531.tistory.com/109#entry109comment</comments>
      <pubDate>Sat, 5 Feb 2022 00:56:39 +0900</pubDate>
    </item>
    <item>
      <title>문자열 리터럴에 대한 이해 (c언어)</title>
      <link>https://semi531.tistory.com/108</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;853&quot; data-origin-height=&quot;373&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oDWb1/btrscPwHudN/VnGFrACWK2M14AjQfsVcG0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oDWb1/btrscPwHudN/VnGFrACWK2M14AjQfsVcG0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oDWb1/btrscPwHudN/VnGFrACWK2M14AjQfsVcG0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoDWb1%2FbtrscPwHudN%2FVnGFrACWK2M14AjQfsVcG0%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;853&quot; height=&quot;373&quot; data-origin-width=&quot;853&quot; data-origin-height=&quot;373&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;Result&lt;br /&gt;str : sentence&lt;br /&gt;pstr : sentence&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전 이 결과값을 보고 처음에 제대로 나온게 맞는지 의문이 들었습니다. str 은 당연히 문자열이므로 sentence 가 나올 것이라 예상 했지만 *pstr 은 sentence 라는 문자열을 가르키는 포인터가 pstr 이네, 그럼 printf 하고 pstr 을 하면 sentence 가 저장된 주소값이 나와야겠군. sentence 가 출력되려면 포인터가 가진 값을 나타내는 *pstr 이라고 해줘야되겠군 했는데 아니었다. 왜 이런 결과값이 나왔는지 살펴보자.&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;여기서 우리는 리터럴(Literal) 이라는 개념을 알아야한다.&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;프로그래밍 언어에서 &lt;b&gt;리터럴&lt;/b&gt;이란 소스 코드 상에서 고정된 값을 가지는 것을 말한다. 특히 c언어의 경우 따옴표(&quot;&quot;) 로 묶인 것들을 문자열 리터럴(string literal) 이라 부른다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1643548646198&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;char *pstr = &quot;goodbye&quot;;
printf(&quot;why so serious?&quot;);
scanf(&quot;%c&quot;, str[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;위 3개의 goodbye, why so serious, %c 모두 리터럴이다. 컴퓨터는 이러한 리터럴들을 따로 모아서 보관한다. 즉 프로그램을 실행하면 메모리 상에 특별한 곳에 goodbye, why so serious, %c 와 같은 리터럴들이 보관되어 있는 공간이 생긴다는 것이다.&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;따라서 char *pstr = &quot;goodbye&quot;; 를 실행하면 컴퓨터는 &quot;goodbye&quot; 의 &lt;b&gt;시작 주소값&lt;/b&gt;을 가져와서 pstr 에 대입하라는 작업을 진행한다. 따라서 pstr 은 &quot;goodbye&quot; 라는 리터럴을 가리키고 마치 pstr[] 과 같은 것이다. 따라서 printf(&quot;%s&quot;, pstr) 의 결과값이 제대로 나오는 이유는 arr[] 에서 arr 와 &amp;amp;arr[] 이 동일함과 원리가 같다고 보면된다.&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;p data-ke-size=&quot;size16&quot;&gt;### 참고 ###&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;visual studio 2017 이상에서는 리터럴을 char * 가 가리킬 수 없다. 반드시 const char* 가 가리켜야 하며 덕분에 리터럴을 수정하는 것을 코드단에서 방지할 수 있다.&lt;/p&gt;</description>
      <category>Coding/자료구조(with C)</category>
      <category>c언어</category>
      <category>c언어 literal</category>
      <category>c언어 ptr</category>
      <category>c언어 리터럴</category>
      <category>c언어 문자열 에러</category>
      <category>c언어 문자열 오류</category>
      <category>c언어 배열 포인터</category>
      <category>c언어 에러</category>
      <category>c언어 포인터 에러</category>
      <category>리터럴</category>
      <author>세미531</author>
      <guid isPermaLink="true">https://semi531.tistory.com/108</guid>
      <comments>https://semi531.tistory.com/108#entry108comment</comments>
      <pubDate>Sun, 30 Jan 2022 22:39:22 +0900</pubDate>
    </item>
    <item>
      <title>scanf 의 원리 및 오류 상황에 대한 이해 (2)</title>
      <link>https://semi531.tistory.com/107</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;다음 글에서 소개된 문제 상황에 대한 해결책을 작성했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://semi531.tistory.com/106&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2022.01.30 - [Coding/자료구조(with C)] - scanf 의 원리 및 오류 상황에 대한 이해 (1)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1643540377994&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;scanf 의 원리 및 오류 상황에 대한 이해 (1)&quot; data-og-description=&quot;# Result 문자열을 입력하세요 : hello tesla 입력한 문자열 : hello 문자열을 입력하세요 : 입력한 문자열 : tesla 이런 오류들에 대한 설명글이므로 열심히 읽어보시길 바랍니다. //오류가 나는 scanf #inclu&quot; data-og-host=&quot;semi531.tistory.com&quot; data-og-source-url=&quot;https://semi531.tistory.com/106&quot; data-og-url=&quot;https://semi531.tistory.com/106&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/6KVPB/hyNeJX1tCH/q9xDyHeMMJTL1QtlEQsvZK/img.png?width=800&amp;amp;height=413&amp;amp;face=0_0_800_413,https://scrap.kakaocdn.net/dn/jKfq4/hyNeHeQ9lm/4Ik9tm657TBrTn7kSHHB3k/img.png?width=800&amp;amp;height=413&amp;amp;face=0_0_800_413,https://scrap.kakaocdn.net/dn/EVdQM/hyNgf8RybM/46jhEywQhbEJ91uidBTFn0/img.png?width=856&amp;amp;height=442&amp;amp;face=0_0_856_442&quot;&gt;&lt;a href=&quot;https://semi531.tistory.com/106&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://semi531.tistory.com/106&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/6KVPB/hyNeJX1tCH/q9xDyHeMMJTL1QtlEQsvZK/img.png?width=800&amp;amp;height=413&amp;amp;face=0_0_800_413,https://scrap.kakaocdn.net/dn/jKfq4/hyNeHeQ9lm/4Ik9tm657TBrTn7kSHHB3k/img.png?width=800&amp;amp;height=413&amp;amp;face=0_0_800_413,https://scrap.kakaocdn.net/dn/EVdQM/hyNgf8RybM/46jhEywQhbEJ91uidBTFn0/img.png?width=856&amp;amp;height=442&amp;amp;face=0_0_856_442');&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;scanf 의 원리 및 오류 상황에 대한 이해 (1)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;# Result 문자열을 입력하세요 : hello tesla 입력한 문자열 : hello 문자열을 입력하세요 : 입력한 문자열 : tesla 이런 오류들에 대한 설명글이므로 열심히 읽어보시길 바랍니다. //오류가 나는 scanf #inclu&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;semi531.tistory.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;pre id=&quot;code_1643540638661&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 첫번째 해결책 (별로 추천하지는 않음)
// 주의할 점은 visual studio 에서 실행(ms 계열) 으로 컴파일 해야한다. 
// 이게 무슨 말인지 모르면 그냥 늘 하던대로 하면된다.
// gcc 에서는 정상적으로 작동하지 않는 위험한 코드이다.

#include &amp;lt;stdio.h&amp;gt;

int main()
{
    int num;
    char c;
    
    printf(&quot;숫자를 입력하세요 : &quot;);
    scanf(&quot;%d&quot;, &amp;amp;num);
    
    fflush(stdin);
    
    printf(&quot;문자를 입력하세요 : &quot;);
    scanf(&quot;%c&quot;, &amp;amp;c);
    
    return 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;blockquote data-ke-style=&quot;style3&quot;&gt;fflush(stdin);&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 부분이 하는 역할은 stdin 을 비워버리라는 의미이다. 다시 말해 stdin 에 있는 모든 데이터들을 날려버리게 되는 것이다. 따라서 버퍼가 완전히 비워지게 된다. 즉 버퍼에 남아있던 \n 이 사라지게 된다. 이 이후 scanf 를 실행하면 버퍼를 다 날려줬으므로 정상적으로 실행된다. 하지만 gcc 같은 데에서는 이러한 작업을 하지 않을 가능성이 매우 크다. 따라서 그냥 간단한 코드 수행 측면에서는 원활하게 사용되지만 그다지 권장하지는 않는다. 그냥 간단하게 과제 제출용이라고만 생각하자.&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-origin-width=&quot;857&quot; data-origin-height=&quot;497&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6mvmD/btrr11yTK3q/dVwZaSdznIqnTOEPLXbByk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6mvmD/btrr11yTK3q/dVwZaSdznIqnTOEPLXbByk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6mvmD/btrr11yTK3q/dVwZaSdznIqnTOEPLXbByk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6mvmD%2Fbtrr11yTK3q%2FdVwZaSdznIqnTOEPLXbByk%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;857&quot; height=&quot;497&quot; data-origin-width=&quot;857&quot; data-origin-height=&quot;497&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;위의 코드를 보면 우리는 첫번째 scanf 뒤에 getchar() 함수를 호출했다. 이 함수의 역할은 stdin 에서 한 문자를 읽어와서 그 값을 리턴한다는 함수이다. 따라서 이 함수를 호출하면 stdin 에 남아있는 공백인 \n 을 가져오므로 stdin 을 비울 수 있다. 만약 우리가 ch = getchar(); printf(&quot;%c&quot;, ch); 를 했다면 화면상에 한칸 엔터가 쳐진 것이 출력될 것이다. 이제 버퍼가 비워진 상태로 scanf 를 해주므로 오류가 발생하지 않는다. 하지만 처음 입력할 때 만약 123abc 를 입력하면 오류가 생길 것이다. 왜냐 scanf(&quot;%d&quot;, &amp;amp;num); 을 했기 때문. %d 이므로 숫자까지만 받고 숫자 이외의 공백이나 문자가 들어오면 멈출 것이므로 결과는 아래와 같게 나온다. 입력하는 형식도 잘 맞춰서 코드를 작성하도록 하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;숫자를 입력하시오 : 123abc&lt;br /&gt;문자를 입력하시오 : 입력한 문자 : b&lt;/blockquote&gt;</description>
      <category>Coding/자료구조(with C)</category>
      <category>c언어</category>
      <category>C언어 buffer</category>
      <category>C언어 Scanf</category>
      <category>c언어 stdin</category>
      <category>C언어 버퍼</category>
      <category>scanf error</category>
      <category>scanf stdin</category>
      <category>scanf 에러</category>
      <category>scanf 오류</category>
      <category>stdin</category>
      <author>세미531</author>
      <guid isPermaLink="true">https://semi531.tistory.com/107</guid>
      <comments>https://semi531.tistory.com/107#entry107comment</comments>
      <pubDate>Sun, 30 Jan 2022 20:50:36 +0900</pubDate>
    </item>
    <item>
      <title>scanf 의 원리 및 오류 상황에 대한 이해 (1)</title>
      <link>https://semi531.tistory.com/106</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;# &lt;span style=&quot;background-color: #fcfcfc; color: #666666;&quot;&gt;Result&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666;&quot;&gt;문자열을 입력하세요 : hello tesla&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666;&quot;&gt;입력한 문자열 : hello&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666;&quot;&gt;문자열을 입력하세요 : 입력한 문자열 : tesla&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1643538650142&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//오류가 나는 scanf
#include &amp;lt;stdio.h&amp;gt;

int main()
{
    int num;
    char c;
    
    printf(&quot;숫자를 입력하시오 : &quot;);
    scanf(&quot;%d&quot;, &amp;amp;num);
    
    printf(&quot;문자를 입력하시오 : &quot;);
    scanf(&quot;%c&quot;, &amp;amp;c);
    
    return 0;
    
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;Result&lt;br /&gt;숫자를 입력하세요 : 1&lt;br /&gt;숫자를 입력하세요 :&lt;br /&gt;&lt;br /&gt;#심각한 문제가 발생했다. 우리는 scanf 를 두번 코드에 넣었기에 처음 숫자를 받은 후 두번째로 문자를 받고 결과값들을 보여줘야 하지만 코드를 실행하니 숫자만 받고 실행이 종료되어 버렸다. 이게 무슨 일인가..&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리는 키보드로 치는 모든 정보를 일시적으로 stdin 에 저장되었다가 나중에 입력이 종료되면 한꺼번에 처리하고 이렇게 저장되는 장소를 버퍼(buffer) 라고 부르고 이 중에 키보드에 대한 입력 버퍼를 stdin 이라고 하는 것이다. (입력 스트림) 우리는 입력이 완료됨을 엔터를 침으로서 입력을 마친다는 의미를 컴퓨터에 보내주게 된다. 다시말해 컴퓨터는 개행 문자 \n 을 입력을 종료하였으니 버퍼에 들어있는 내용을 가지고 처리하라는 뜻으로 받아들이게 된다. 그런데 컴퓨터는 \n 까지 버퍼에 저장하게 된다. 즉 우리가 1을 쓰고 엔터를 치면 버퍼에 아래와 같은 상태가 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;stdin&lt;br /&gt;--&amp;gt; 1\n&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 입력을 끝냈다면 scanf 함수를 이용해서 stdin 으로 부터 숫자를 얻어온다. 그 후 scanf 함수는 공백 문자를 만나기 전까지 stdin 에서 데이터를 가져간 후 버퍼에서 삭제해 버린다. 다시말해 scanf 함수가 scanf(&quot;%d&quot;, &amp;amp;num) 이라면 num 에 1을 저장한 후 버퍼의 모습은 아래와 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;stdin&lt;br /&gt;--&amp;gt; \n&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 문제가 되었던 scanf(&quot;%c&quot;, &amp;amp;c); 가 실행될 차례이다. 그런데 여기서 문제다. %c 는 stdin 에서 딱 한개의 문자만을 가져온다. 만약 stdin 에 아무것도 없다면 사용자의 입력을 기다리고 있겠지만 stdin 에 무언가가 있다면 그것을 냉큼 가져오게 된다. 그런데 위에 stdin 에 뭐가 남아있는지 보면 \n 이 남아있다. 따라서 scanf 는 이 \n 를 c 에 저장하게 된다. 즉 c 에는 사용자의 입력으러 받지도 않고 \n 을 넣게 된 것이다. 이는 %s 를 사용하게 되면 공백 말고 실질적인 문자열만 받으므로 문제를 해결할 수 있다.&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;하지만 %s 를 사용하더라도 또 다른 문제가 발생한다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;856&quot; data-origin-height=&quot;442&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dJ3PXW/btrr9g2zkym/05fboniA7CZ2HL2AONgPo0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dJ3PXW/btrr9g2zkym/05fboniA7CZ2HL2AONgPo0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dJ3PXW/btrr9g2zkym/05fboniA7CZ2HL2AONgPo0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdJ3PXW%2Fbtrr9g2zkym%2F05fboniA7CZ2HL2AONgPo0%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;856&quot; height=&quot;442&quot; data-origin-width=&quot;856&quot; data-origin-height=&quot;442&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;여기는 str1, str2 라는 문자열이 있고 이를 위와 같이 두번의 scanf 로 입력 받은 후 처음 입력받고 출력, 두번째 입력받고 출력 이렇게 실행된다. 일반적으로 문자열을 넣어주면 아무런 문제가 생기지 않지만 처음 입력을 할 때 오류가 나는 실행결과를 보여보겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;Result&lt;br /&gt;문자열을 입력하세요 : hello tesla&lt;br /&gt;입력한 문자열 : hello&lt;br /&gt;문자열을 입력하세요 : 입력한 문자열 : tesla&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 원하지 않는 오류가 나게 된다. 이제 stdin 의 상태를 살펴보면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;stdin&lt;br /&gt;--&amp;gt; hello tesla\n&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;scanf 함수는 stdin 으로부터 공백을 제외한 문자가 나올 때 까지 모든 공백 문자들은 무시한다. 위의 경우 hello 까지는 가져오지만 띄어쓰기가 공백의 역할을 하기 때문에 hello 까지만 입력되고 다음 scanf 는 입력할세도 없이 tesla 를 가져가고 문자열 뒤에 남은 공백 문자를 보고 중지하여 stdin 은 최종적으로 \n 만 남게 된다.&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;아무튼 scanf 는 상당히 이해하기 복잡하다. 다음 글에서 이 문제를 해결하는 방법을 설명하도록 하겠다.&lt;/p&gt;</description>
      <category>Coding/자료구조(with C)</category>
      <category>cpp scanf error</category>
      <category>C언어 Scanf</category>
      <category>c언어 scanf 에러</category>
      <category>c언어 scanf 오류</category>
      <category>C언어 오류</category>
      <category>scanf</category>
      <category>scanf error</category>
      <category>scanf 안됨</category>
      <category>scanf 에러</category>
      <category>scanf 오류</category>
      <author>세미531</author>
      <guid isPermaLink="true">https://semi531.tistory.com/106</guid>
      <comments>https://semi531.tistory.com/106#entry106comment</comments>
      <pubDate>Sun, 30 Jan 2022 19:54:18 +0900</pubDate>
    </item>
    <item>
      <title>전기차 스타트업 Canoo 현황</title>
      <link>https://semi531.tistory.com/105</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;카누를 지금까지 지켜봤을 때 카누의 CEO 인 토니 아퀼라는 기존의 카누 인재들이 회사에서 떠나는 상황에서 경영을 하고 있다. 이 과정이 부정적이라고 생각할 수 있지만 이는 아퀼라의 뜻에 맞게 근본적으로 회사가 변화하는 상황이라고 볼 수 있을 것 같다. 예전에 토니가 주주들에게 카누의 성장은 더디지만 오래 갈거라고 했던 말이 떠오르는데 이와 관련된 것이 다른 전기차 회사인 aperta 의 사례에서 잘 하고 있음을 볼 수 있다.&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;aperta 는 에너지 효율이 높은 자동차를 생산한다는 목표를 가지고 열심히 나아가고 있었지만 새로운 투자자들이 들어오며 자신들의 입맛대로 회사를 흐트러뜨려 결국 파산에 이르게 된다. 운 좋게도 원래의 창업자들은 다시 자산을 사들여 다시 열심히 회사를 키워나가는 중이다.&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;또한 카누의 방향은 일론 머스크가 테슬라에 투자를 시작할 때와 양상이 비슷한데 일론 머스크 또한 테슬라의 투자자였다가 CEO 가 되며 원래의 설립자들이 많이 회사를 떠나고 일론의 방향대로 테슬라를 경영해 나아갔다. 카누도 이러한 흐름을 타는 중이라고 생각할 수 있다.&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;일단 걱정되는 점들을 살펴보자면 예전의 bmw 출신, 애플로 간 ceo 는 기존 자동차업계에 있었기에 차량 생산에 대해 insight 가 있을 것이지만 카누는 차량 생산이 처음이므로 다른 여러 전기차 스타트업들이 겪는 차량 생산의 문제를 겪을 가능성이 높다. 오클라호마 공장에서 원활하게 생산되었으면 하는 바램이다.&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;canoologo.jpeg&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;556&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kKuPE/btrr4wScQvT/SpSHoHkBdt5VSpHJkQEu80/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kKuPE/btrr4wScQvT/SpSHoHkBdt5VSpHJkQEu80/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kKuPE/btrr4wScQvT/SpSHoHkBdt5VSpHJkQEu80/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkKuPE%2Fbtrr4wScQvT%2FSpSHoHkBdt5VSpHJkQEu80%2Fimg.jpg&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;585&quot; height=&quot;325&quot; data-filename=&quot;canoologo.jpeg&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;556&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Life/자율주행, AI</category>
      <category>사이버트럭</category>
      <category>전기차 스타트업</category>
      <category>카누 ev</category>
      <category>카누 배터리</category>
      <category>카누 전기</category>
      <category>카누 전기차</category>
      <category>카누 주가</category>
      <category>카누 주식</category>
      <category>카누 투자</category>
      <category>테슬라 투자</category>
      <author>세미531</author>
      <guid isPermaLink="true">https://semi531.tistory.com/105</guid>
      <comments>https://semi531.tistory.com/105#entry105comment</comments>
      <pubDate>Sun, 30 Jan 2022 01:16:46 +0900</pubDate>
    </item>
    <item>
      <title>리비안과 삼성SDI 의 배터리 파트너쉽 결렬 위기</title>
      <link>https://semi531.tistory.com/104</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;지금까지 삼성SDI 와 리비안은 배터리 협약을 맺고 리비안은 삼성 측에서 배터리를 공급받기로 했다. 하지만 최근 삼성이 fca, psa 그룹이 포함된 스텔란티스와 합작 회사를 만들고 공장 신설 및 완성차 제작에 대한 협의가 시작되었다고 보고되면서 리비안의 주가 하락에 힘을 싫어주고 있다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원래 리비안과 삼성은 추가적인 배터리 공장을 2025년까지 만들기로 계획했었다. 하지만 이 협의는 리비안의 양산에 대한 불안감과 리비안 측에서 배터리의 생산에 대한 변경을 요청하고 이 요청이 삼성SDI 측과 맞지 않았던 것 같다. 또한 어느정도의 배터리를 구입할지에 대한 협의도 잘 풀리지 않아 결렬된 것으로 보인다.&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;삼성이 떠날 위기가 크지만 리비안은 지금 필자가 팔로업하고 있는 전기차 스타트업들인 Canoo, Rivian, Lordstown 중에 가장 투자가 활발하고 이미 소량씩 생산을 하고 있는 유일한 회사이다. 또한 아마존과의 관계가 흔들린다고는 하지만 이미 판매 협약을 마치고 차의 완성도 또한 매우 높은 상태라 리비안에 투자를 고민하시는 분들이라면 이렇게 주가가 하락하는 시기가 기회가 될 수도 있다고 생각된다. 투자는 개개인의 판단이지만 필자는 이렇게 생각한다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Rivian_logo_and_wordmark.svg.png&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;512&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JxFrD/btrr1NHCnAZ/SD6PG60pq3BbGFGl9tRxd1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JxFrD/btrr1NHCnAZ/SD6PG60pq3BbGFGl9tRxd1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JxFrD/btrr1NHCnAZ/SD6PG60pq3BbGFGl9tRxd1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJxFrD%2Fbtrr1NHCnAZ%2FSD6PG60pq3BbGFGl9tRxd1%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;650&quot; height=&quot;130&quot; data-filename=&quot;Rivian_logo_and_wordmark.svg.png&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;512&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Life/자율주행, AI</category>
      <category>리비안</category>
      <category>리비안 R1S</category>
      <category>리비안 R1T</category>
      <category>리비안 SUV</category>
      <category>리비안 배터리</category>
      <category>리비안 삼성</category>
      <category>리비안 주가</category>
      <category>리비안 주식</category>
      <category>리비안 테슬라</category>
      <category>리비안 픽업트럭</category>
      <author>세미531</author>
      <guid isPermaLink="true">https://semi531.tistory.com/104</guid>
      <comments>https://semi531.tistory.com/104#entry104comment</comments>
      <pubDate>Sun, 30 Jan 2022 00:00:32 +0900</pubDate>
    </item>
    <item>
      <title>c 언어 &amp;quot; &amp;quot; 와 ' ' 의 차이점 및 문자열</title>
      <link>https://semi531.tistory.com/103</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 문자열에 대한 포인터를 간단히 복습해보자면 아래 코드와 같다.&lt;/p&gt;
&lt;pre id=&quot;code_1643222391090&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;

int main()
{
    char word[30] = {&quot;long sentence&quot;};
    char *str = word;
    
    printf(&quot;%s \n&quot;, str);
    
    return 0;
    
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;str 이라는 char 을 가리키는 포인터가 배열 word 를 가리키고 있다. 따라서 str 이 가리키는 것을 문자열로 출력하게 된다. 아래의 코드 또한 실행시켜 보면 아래와 같다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;조작 이전 : long sentence&lt;br /&gt;조작 이후 : abcd sentence&lt;/blockquote&gt;
&lt;pre id=&quot;code_1643222721219&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//문자열 변경하기
#include &amp;lt;stdio.h&amp;gt;
int main()
{
    char word[] = {&quot;long sentence&quot;};
    
    printf(&quot;조작 이전 : %s \n&quot;, word);
    
    word[0] = 'a';
    word[1] = 'b';
    word[2] = 'c';
    word[3] = 'd';
    
    printf(&quot;조작 이후 : %s \n&quot;, word);
    
    return 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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 위의 코드들에서 확인했듯이 큰따옴표인 &quot;&quot; 는 문자열(한개 이상의 문자) 를 지정할 때 사용된다. 예시로는 &quot;abd&quot;, &quot;sentence&quot; 등등이다. 작은 따옴표인 ' ' 는 'a', 'b' 와 같이 한 개의 문자를 지정할 때 사용된다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;508&quot; data-origin-height=&quot;516&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mB2QM/btrrRdkQCv6/z2qnfmr278prg9Uq15UQKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mB2QM/btrrRdkQCv6/z2qnfmr278prg9Uq15UQKk/img.png&quot; data-alt=&quot;또 복습하자&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mB2QM/btrrRdkQCv6/z2qnfmr278prg9Uq15UQKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmB2QM%2FbtrrRdkQCv6%2Fz2qnfmr278prg9Uq15UQKk%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;508&quot; height=&quot;516&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;508&quot; data-origin-height=&quot;516&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;&lt;a href=&quot;https://semi531.tistory.com/101&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2022.01.26 - [Coding/자료구조(with C)] - 포인터 swap (**pa, **pb)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1643222927871&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;포인터 swap (**pa, **pb)&quot; data-og-description=&quot;일단 전체 코드를 삽입해보겠다. #define _CRT_SECURE_NO_WARNINGS #include int pswap(int** pa, int** pb); int main() { int a, b; int* pa, * pb; pa = &amp;amp;a; pb = &amp;amp;b; printf(&amp;quot;pa 가 가리키는 변수의 주소값 :..&quot; data-og-host=&quot;semi531.tistory.com&quot; data-og-source-url=&quot;https://semi531.tistory.com/101&quot; data-og-url=&quot;https://semi531.tistory.com/101&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bJQ5xK/hyNdpdy32M/S1KBiNniKu4MrhcAsHj1tK/img.png?width=487&amp;amp;height=532&amp;amp;face=0_0_487_532,https://scrap.kakaocdn.net/dn/zRJmM/hyNdnfLVTs/cqL8yItbu2hGEcrvOdeCm0/img.png?width=487&amp;amp;height=532&amp;amp;face=0_0_487_532,https://scrap.kakaocdn.net/dn/ckBbhN/hyNdsVGoi4/Q6i03gbi5HUJ6EywwlHOC1/img.png?width=487&amp;amp;height=532&amp;amp;face=0_0_487_532&quot;&gt;&lt;a href=&quot;https://semi531.tistory.com/101&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://semi531.tistory.com/101&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bJQ5xK/hyNdpdy32M/S1KBiNniKu4MrhcAsHj1tK/img.png?width=487&amp;amp;height=532&amp;amp;face=0_0_487_532,https://scrap.kakaocdn.net/dn/zRJmM/hyNdnfLVTs/cqL8yItbu2hGEcrvOdeCm0/img.png?width=487&amp;amp;height=532&amp;amp;face=0_0_487_532,https://scrap.kakaocdn.net/dn/ckBbhN/hyNdsVGoi4/Q6i03gbi5HUJ6EywwlHOC1/img.png?width=487&amp;amp;height=532&amp;amp;face=0_0_487_532');&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;포인터 swap (**pa, **pb)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;일단 전체 코드를 삽입해보겠다. #define _CRT_SECURE_NO_WARNINGS #include int pswap(int** pa, int** pb); int main() { int a, b; int* pa, * pb; pa = &amp;amp;a; pb = &amp;amp;b; printf(&quot;pa 가 가리키는 변수의 주소값 :..&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;semi531.tistory.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;</description>
      <category>Coding/자료구조(with C)</category>
      <category>C 문자열</category>
      <category>c언어</category>
      <category>c언어 &amp;quot; &amp;quot;</category>
      <category>c언어 %</category>
      <category>c언어 %s</category>
      <category>c언어 따옴표</category>
      <category>C언어 문자</category>
      <category>c언어 문자열</category>
      <category>C언어 포인터</category>
      <category>C언어 함수</category>
      <author>세미531</author>
      <guid isPermaLink="true">https://semi531.tistory.com/103</guid>
      <comments>https://semi531.tistory.com/103#entry103comment</comments>
      <pubDate>Thu, 27 Jan 2022 03:48:54 +0900</pubDate>
    </item>
    <item>
      <title>함수 포인터 설명</title>
      <link>https://semi531.tistory.com/102</link>
      <description>&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;/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;pre id=&quot;code_1643210097727&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#define _CRT_SECURE_NO_WARNINGS
#include &amp;lt;stdio.h&amp;gt;
//함수 포인터

int max(int a, int b);
int main()
{
	int a, b;
	int (*pmax)(int, int);
	pmax = max;

	scanf(&quot;%d %d&quot;, &amp;amp;a, &amp;amp;b);
	printf(&quot;max(a,b) : %d \n&quot;, max(a, b));
	printf(&quot;pmax(a,b) : %d \n&quot;, pmax(a, b));

	return 0;
}

int max(int a, int b) {
	if (a &amp;gt; b)
		return a;
	else
		return b;

	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행 결과&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;10 15&lt;br /&gt;max(a, b) : 15&lt;br /&gt;pmax(a, b) : 15&lt;/blockquote&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;blockquote data-ke-style=&quot;style2&quot;&gt;int (*pmax)(int, int);&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위는 함수 포인터 pmax 의 정의이다. 위 정의를 보고 이 함수 포인터 pmax 는 함수의 리턴값이 int 형이고 인자 두 개가 각각 int 인 함수를 가리키므로 pmax 함수 포인터로 함수를 가리킬 때 그 함수는 반드시 pmax 의 정의와 일치해야 한다.&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;blockquote data-ke-style=&quot;style3&quot;&gt;(함수의 리턴형)(*포인터 이름)(첫번째 인자 타입, 두번째 인자 타입, ...) //인자가 없는 경우 괄호를 비워둔다&lt;br /&gt;int (*a)()&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;max 함수를 보면 pmax 의 정의와 일치하므로 max 함수의 시작 주소값을 pmax 에 대입할 수 있게 된다. 이 때, 앞에서도 말했듯이 특정한 함수의 시작 주소값을 알려면 그냥 함수 이름을 넣어주면 된다. pmax = &amp;amp;max 는 틀린 형식이다.&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;pre id=&quot;code_1643210384827&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int arr[3];
int *p = arr;

arr[2]; //p[2] 와 정확히 일치한다
p[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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;479&quot; data-origin-height=&quot;526&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFYYK2/btrrRTzzYaA/XtrrHY1690Mxvj1UGc3gI0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFYYK2/btrrRTzzYaA/XtrrHY1690Mxvj1UGc3gI0/img.png&quot; data-alt=&quot;다시한번 확인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFYYK2/btrrRTzzYaA/XtrrHY1690Mxvj1UGc3gI0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFYYK2%2FbtrrRTzzYaA%2FXtrrHY1690Mxvj1UGc3gI0%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;479&quot; height=&quot;526&quot; data-origin-width=&quot;479&quot; data-origin-height=&quot;526&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;&lt;a href=&quot;https://semi531.tistory.com/101&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2022.01.26 - [Coding/자료구조(with C)] - 포인터 swap (**pa, **pb)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1643210454685&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;포인터 swap (**pa, **pb)&quot; data-og-description=&quot;일단 전체 코드를 삽입해보겠다. #define _CRT_SECURE_NO_WARNINGS #include int pswap(int** pa, int** pb); int main() { int a, b; int* pa, * pb; pa = &amp;amp;a; pb = &amp;amp;b; printf(&amp;quot;pa 가 가리키는 변수의 주소값 :..&quot; data-og-host=&quot;semi531.tistory.com&quot; data-og-source-url=&quot;https://semi531.tistory.com/101&quot; data-og-url=&quot;https://semi531.tistory.com/101&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bJQ5xK/hyNdpdy32M/S1KBiNniKu4MrhcAsHj1tK/img.png?width=487&amp;amp;height=532&amp;amp;face=0_0_487_532,https://scrap.kakaocdn.net/dn/zRJmM/hyNdnfLVTs/cqL8yItbu2hGEcrvOdeCm0/img.png?width=487&amp;amp;height=532&amp;amp;face=0_0_487_532,https://scrap.kakaocdn.net/dn/ckBbhN/hyNdsVGoi4/Q6i03gbi5HUJ6EywwlHOC1/img.png?width=487&amp;amp;height=532&amp;amp;face=0_0_487_532&quot;&gt;&lt;a href=&quot;https://semi531.tistory.com/101&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://semi531.tistory.com/101&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bJQ5xK/hyNdpdy32M/S1KBiNniKu4MrhcAsHj1tK/img.png?width=487&amp;amp;height=532&amp;amp;face=0_0_487_532,https://scrap.kakaocdn.net/dn/zRJmM/hyNdnfLVTs/cqL8yItbu2hGEcrvOdeCm0/img.png?width=487&amp;amp;height=532&amp;amp;face=0_0_487_532,https://scrap.kakaocdn.net/dn/ckBbhN/hyNdsVGoi4/Q6i03gbi5HUJ6EywwlHOC1/img.png?width=487&amp;amp;height=532&amp;amp;face=0_0_487_532');&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;포인터 swap (**pa, **pb)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;일단 전체 코드를 삽입해보겠다. #define _CRT_SECURE_NO_WARNINGS #include int pswap(int** pa, int** pb); int main() { int a, b; int* pa, * pb; pa = &amp;amp;a; pb = &amp;amp;b; printf(&quot;pa 가 가리키는 변수의 주소값 :..&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;semi531.tistory.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;</description>
      <category>Coding/자료구조(with C)</category>
      <category>c언어 *</category>
      <category>c언어 **</category>
      <category>c언어 max</category>
      <category>c언어 swap</category>
      <category>C언어 포인터</category>
      <category>c언어 포인터 함수</category>
      <category>C언어 함수</category>
      <category>Swap 함수</category>
      <category>포인터 함수</category>
      <category>함수 포인터</category>
      <author>세미531</author>
      <guid isPermaLink="true">https://semi531.tistory.com/102</guid>
      <comments>https://semi531.tistory.com/102#entry102comment</comments>
      <pubDate>Thu, 27 Jan 2022 03:22:25 +0900</pubDate>
    </item>
    <item>
      <title>포인터 swap (**pa, **pb)</title>
      <link>https://semi531.tistory.com/101</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;일단 전체 코드를 삽입해보겠다.&lt;/p&gt;
&lt;pre id=&quot;code_1643202134350&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#define _CRT_SECURE_NO_WARNINGS
#include &amp;lt;stdio.h&amp;gt;

int pswap(int** pa, int** pb);
int main()
{
	int a, b;
	int* pa, * pb;

	pa = &amp;amp;a;
	pb = &amp;amp;b;

	printf(&quot;pa 가 가리키는 변수의 주소값 : %p \n&quot;, pa);
	printf(&quot;pa 의 주소값 : %p \n \n&quot;, &amp;amp;pa);
	printf(&quot;pb 가 가리키는 변수의 주소값 : %p \n&quot;, pb);
	printf(&quot;pb 의 주소값 : %p \n&quot;, &amp;amp;pb);

	printf(&quot;---------------호출---------------------\n&quot;);
	pswap(&amp;amp;pa, &amp;amp;pb);
	printf(&quot;--------------호출끝---------------------\n&quot;);

	printf(&quot;pa 가 가리키는 변수의 주소값 : %p \n&quot;, pa);
	printf(&quot;pa 의 주소값 : %p \n \n&quot;, &amp;amp;pa);
	printf(&quot;pb 가 가리키는 변수의 주소값 : %p \n&quot;, pb);
	printf(&quot;pb 의 주소값 : %p \n&quot;, &amp;amp;pb);

	return 0;

}

int pswap(int** ppa, int **ppb) //여기서 **는 포인터의 주소를 의미하니까 ** ! * *
//그러므로 포인터인 pa 의 주소값이 바뀌는 것이 아닌 포인터 pa 가 가리키는 변수의 주소값이 바뀐다.

//특정한 타입의 변수의 값을 바꾸려면, 특정한 타입을 가리키는 포인터로 인자를 취해야 된다.
// 이 경우 특정한 타입은 int * 타입이므로 int * 를 가리키는 포인터의 타입은 int ** 이다.

{
	int* temp = *ppa;

	printf(&quot;ppa 가 가리키는 변수의 주소값 : %p \n&quot;, ppa);
	printf(&quot;ppb 가 가리키는 변수의 주소값 : %p \n&quot;, ppb);

	*ppa = *ppb;
	*ppb = temp;

	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행결과&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;pa 가 가리키는 변수의 주소값 : 000000CB0857FBF4 &lt;br /&gt;pa 의 주소값 : 000000CB0857FC38 &lt;br /&gt;pb 가 가리키는 변수의 주소값 : 000000CB0857FC14 &lt;br /&gt;pb 의 주소값 : 000000CB0857FC58 &lt;br /&gt;---------------호출--------------------- &lt;br /&gt;ppa 가 가리키는 변수의 주소값 : 000000CB0857FC38 &lt;br /&gt;ppb 가 가리키는 변수의 주소값 : 000000CB0857FC58 &lt;br /&gt;--------------호출끝--------------------- &lt;br /&gt;pa 가 가리키는 변수의 주소값 : 000000CB0857FC14 &lt;br /&gt;pa 의 주소값 : 000000CB0857FC38 &lt;br /&gt;pb 가 가리키는 변수의 주소값 : 000000CB0857FBF4 &lt;br /&gt;pb 의 주소값 : 000000CB0857FC58&lt;/blockquote&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;출력 결과는 주소값들 이므로 개개인의 컴퓨터 환경에 따라 달라진다. 여기서 중요한 것은 pa 와 pb 의 주소값이 변경되는 것이 아닌 pa 와 pb 가 가리키는 변수의 주소값이 서로 swap 되는 것이다.&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;pa 가 가리키는 변수의 주소값은 (즉, pa 의 값) &lt;span style=&quot;background-color: #fcfcfc; color: #666666;&quot;&gt;000000CB0857FC38&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;pb 가 가리키는 변수의 주소값은 &lt;span style=&quot;background-color: #fcfcfc; color: #666666;&quot;&gt;000000CB0857FC14&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;이다. 그런데 pswap 함수를 실행한 후 서로 변경되었다. 즉 두 포인터가 가리키는 변수가 서로 뒤바뀐 것이다. 이런 함수를 만들기 위해 인자를 어떤 형식으로 취해줘야 할지 고민해야 한다. 특정한 타입의 변수의 값을 바꾸려면 특정한 타입을 가리키는 포인터로 인자를 취해야 한다. 이 예제의 경우 특정한 타입은 int* 타입이다. 그러면 int* 타입을 가리키는 포인터의 타입은 int** 타입이라고 할수 있다. 그러므로 swap 해주는 함수인 pswap 의 인자를 (**ppa, **ppb) 로 설정해주면 된다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&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;span style=&quot;background-color: #fcfcfc; color: #666666;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;우리가 위 처럼 pswap 함수를 호출하면 ppa 는 pa 를 가리키고 있고, ppb 는 pb 를 가리키고 있다. 따라서 *ppa 는 pa 의 값이다. 그런데 pa 는 int* 형이므로 pa 의 값을 보관하는 변수는 반드시 int* 이어야 한다.따라서 우리는 int* 형의 temp 변수를 정의하였다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&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;span style=&quot;background-color: #fcfcfc; color: #666666;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;우리는 위 두개의 printf 문장에서 ppa 를 출력하면 pa 의 주소값이 나오고 ppb 도 마찬가지이다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&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;blob&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;960&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cj2tUf/btrrJU1Lh4n/IkKYo4uBLxx5FVpSdMGPAk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cj2tUf/btrrJU1Lh4n/IkKYo4uBLxx5FVpSdMGPAk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cj2tUf/btrrJU1Lh4n/IkKYo4uBLxx5FVpSdMGPAk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcj2tUf%2FbtrrJU1Lh4n%2FIkKYo4uBLxx5FVpSdMGPAk%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;1280&quot; height=&quot;960&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;960&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Coding/자료구조(with C)</category>
      <category>C 포인터</category>
      <category>C언어 공부</category>
      <category>C언어 입문</category>
      <category>C언어 포인터</category>
      <category>c언어 포인터 함수</category>
      <category>C언어 함수</category>
      <category>포인터 배열</category>
      <category>포인터 설명</category>
      <category>포인터 활용 함수</category>
      <category>포인터란</category>
      <author>세미531</author>
      <guid isPermaLink="true">https://semi531.tistory.com/101</guid>
      <comments>https://semi531.tistory.com/101#entry101comment</comments>
      <pubDate>Wed, 26 Jan 2022 22:23:27 +0900</pubDate>
    </item>
    <item>
      <title>파이썬 경로 확인, import os, pickle, sys</title>
      <link>https://semi531.tistory.com/100</link>
      <description>&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;import sys : sys 모듈은 파이썬 인터프리터가 제공하는 변수와 함수를 직접 제어할 수 있게 해주는 모듈&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 모듈 불러와서 사용하기 (sys.path)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sys.path 는 파이썬 모듈들이 저장되어 있는 위치를 나타낸다. 이 위치에 있는 파이썬 모듈은 경로에 상관없이 어디에서나 불러올 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1642866570971&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; import sys
&amp;gt;&amp;gt;&amp;gt; sys.path
['', 'C:\\Windows\\SYSTEM32\\python37.zip', 'c:\\Python37\\DLLs', 
'c:\\Python37\\lib', 'c:\\Python37', 'c:\\Python37\\lib\\site-packages']
&amp;gt;&amp;gt;&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 경로 추가하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;import sys&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sys.path.append(&quot;C:/usr/mycode&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;위와 같이 파이썬 파일에서 sys.path.append 를 사용하면 경로 이름을 추가할 수 있다. 이렇게 하면 C:/usr/mycode 디렉터리에 있는 파이썬 모듈을 불러와서 사용할 수 있다.&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;import pickle&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pickle 은 객체의 형태를 그대로 유지하면서 파일에 저장하고 불러올 수 있게 하는 모듈이다. pickle 모듈의 dump 함수는 딕셔너리 객체인 data 를 그대로 파일에 저장한다.&lt;/p&gt;
&lt;pre id=&quot;code_1642867060492&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; import pickle
&amp;gt;&amp;gt;&amp;gt; f = open(&quot;test.txt&quot;, 'wb')
&amp;gt;&amp;gt;&amp;gt; data = {1: 'python', 2: 'you need'}
&amp;gt;&amp;gt;&amp;gt; pickle.dump(data, f)
&amp;gt;&amp;gt;&amp;gt; f.close()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 pickle.dump 로 저장한 파일을 pickle.load 를 사용하여 원래 있던 딕셔너리 객체 상태 그대로 불러온다.&lt;/p&gt;
&lt;pre id=&quot;code_1642867105916&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; import pickle
&amp;gt;&amp;gt;&amp;gt; f = open(&quot;test.txt&quot;, 'rb')
&amp;gt;&amp;gt;&amp;gt; data = pickle.load(f)
&amp;gt;&amp;gt;&amp;gt; print(data)
{2:'you need', 1:'python'}&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;import os&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;os 모듈은 환경 변수나 디렉터리, 파일 등의 os 자원을 제어할 수 있게 해주는 모듈이다.&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;gt; os.environ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;필자의 시스템의 PATH 환경 변수 내용을 보면 아래와 같이 표시된다.&lt;/p&gt;
&lt;pre id=&quot;code_1642867252935&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; os.environ['PATH']
'C:\\ProgramData\\Oracle\\Java\\javapath;...생략...'&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;gt; os.chdir&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;os.chdir(&quot;C:\WINDOWS&quot;)&lt;/blockquote&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;gt; os.getcwd&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;os.getcwd()&lt;br /&gt;&lt;br /&gt;'C:\WINDOWS'&lt;/blockquote&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;gt; os.system&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시스템 자체의 프로그램이나 기타 명령어를 파이썬에서 호출한다. os.system(&quot;명령어&quot;) 로 사용한다. 현재 디렉터리에서 시스템 명령어 dir을 실행하면 아래와 같다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;os.system(&quot;dir&quot;)&lt;/blockquote&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__&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 코드는 해당 코드를 가지는 파이썬 파일의 이름 혹은 경로이며 실행한 위치에서의 상대경로를 포함한다.&lt;/p&gt;
&lt;pre id=&quot;code_1642867661081&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import os

print(__file__)&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;gt; os.path.abspath()&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래는 실행 위치와 상관없이 파이썬 파일의 절대경로를 가질 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1642867732503&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import os

path = os.path.dirname(os.path.abspath(__file__))
print(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;아래와 같이 사용하면 해당 경로에 있는 파일 리스트 이름들을 나열할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1642867855323&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import os

path = os.path.dirname(os.path.abspath(__file__))

for files in os.listdir():
	p = os.path.abspath(files)
    print(p)&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;gt; os.path.relpath()&lt;/p&gt;
&lt;pre id=&quot;code_1642868039628&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import os

path = os.path.dirname(os.path.relpath(__file__))
print(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;- 하위 디렉터리 검색 -&amp;gt; os.walk(path)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;os.walk() 은 인자로 받은 경로에 대해 하위 디렉터리를 검색한다.&lt;/p&gt;
&lt;pre id=&quot;code_1642868413564&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import os

PATH = os.path.dirname(os.path.abspath(__file__))

#위의 PATH 결과로 나온 dir_name

dir_name = 'data'

for path, dirs, files in os.walk(dir_name):
	print(path, dirs, files)&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;- os.path.join&lt;/p&gt;
&lt;pre id=&quot;code_1642868524081&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import os

PATH = os.path.dirname(os.path.abspath(__file__))
dir_name = 'data'

for path, dirs, files in os.walk(dir_name):
	print(os.path.join(PATH, 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;- os.path.splitext() 특정 확장자 추출 가능&lt;/p&gt;
&lt;pre id=&quot;code_1642868847503&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import os

PATH = os.path.dirname(os.path.abspath(__file__))
dir_name = 'data'

for path, dirs, files in os.walk(dir_name):
	dir_path = os.path.join(PATH, path)
    for file in files:
    	name, ext = os.path.splitext(file)
        if ext == '.png':
        file_path = os.path.join(dir_path, file)
        print('find file : ', file_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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;python.png&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;500&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XxB2s/btrro52In2o/Now9QzcjvBm1BnrqkG62z1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XxB2s/btrro52In2o/Now9QzcjvBm1BnrqkG62z1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XxB2s/btrro52In2o/Now9QzcjvBm1BnrqkG62z1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXxB2s%2Fbtrro52In2o%2FNow9QzcjvBm1BnrqkG62z1%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;250&quot; height=&quot;156&quot; data-filename=&quot;python.png&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;500&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;</description>
      <category>Coding/Python</category>
      <category>파이썬 dirname</category>
      <category>파이썬 import</category>
      <category>파이썬 join</category>
      <category>파이썬 os</category>
      <category>파이썬 pickle</category>
      <category>파이썬 sys</category>
      <category>파이썬 경로</category>
      <category>파이썬 모듈</category>
      <category>파이썬 파일 경로</category>
      <category>파이썬 함수</category>
      <author>세미531</author>
      <guid isPermaLink="true">https://semi531.tistory.com/100</guid>
      <comments>https://semi531.tistory.com/100#entry100comment</comments>
      <pubDate>Sun, 23 Jan 2022 01:31:47 +0900</pubDate>
    </item>
    <item>
      <title>파이썬 콜백함수, 람다, map(), filter() 함수</title>
      <link>https://semi531.tistory.com/99</link>
      <description>&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;콜백함수와 매개변수&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1642679317672&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def call_10_times(func):
    for i in range(10):
        func(i)


def print_hello(number):
    print(&quot;안녕하세요&quot;, number)


call_10_times(print_hello)&lt;/code&gt;&lt;/pre&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;&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;lambda 함수 - 콜백함수 코드를 간략하게&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매개변수로 함수를 전달하기 위해 함수 구문을 작성하는 것이 번거로움을 방지하기 위해 함수를 간단하게 선언하고 사용&lt;/p&gt;
&lt;pre id=&quot;code_1642679639931&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def call_10_times(func):
    for i in range(10):
        func(i)


call_10_times(lambda number: print(&quot;안녕하세요&quot;, number))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 콜백 부분 코드에서는 print_hello 함수가 따로 있었는데 여기는 lambda 함수로 간단하게 처리&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;filter()&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리스트의 요소를 함수에 넣고 리던된 값이 True 인 것으로 새로운 리스트를 구성해주는 함수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1642679809390&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def 짝수만(number):
    return number % 2 == 0   # 필터 함수에 매개변수 사용시 - 리턴 값이 불인 녀석만 사용 가능


a = list(range(100))
b = filter(짝수만, a)

for i in b:
    print(i)                 # 이렇게 출력하거나

print(list(b))               # 이렇게 출력하거나

# 결과값
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40,
 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80,
 82, 84, 86, 88, 90, 92, 94, 96, 98]
 
 ==================================
 
 a = list(range(100))
b = filter(lambda number: number % 2 ==0, a)        # 람다 코드 사용
print(list(b))


짝수만 = lambda number: number % 2 ==0              # 이렇게도 사용 가능
a = list(range(100))
b = filter(짝수만, a)
print(list(b))&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;map()&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 리스트 기반으로 신규 리스트 만들 때 사용한다&lt;/p&gt;
&lt;pre id=&quot;code_1642679905144&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def 제곱(number):
    return number * number


a = list(range(100))
print(list(map(제곱, a)))


# 람다 방식
a = list(range(100))
print(list(map(lambda number: number * number, 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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ipad.jpeg&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1450&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CidP5/btrrku73oON/2yKvAIsIjzceqhvpwt5HL0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CidP5/btrrku73oON/2yKvAIsIjzceqhvpwt5HL0/img.jpg&quot; data-alt=&quot;뚱랑이&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CidP5/btrrku73oON/2yKvAIsIjzceqhvpwt5HL0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCidP5%2Fbtrrku73oON%2F2yKvAIsIjzceqhvpwt5HL0%2Fimg.jpg&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;249&quot; height=&quot;176&quot; data-filename=&quot;ipad.jpeg&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1450&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;뚱랑이&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Coding/Python</category>
      <category>filter 함수</category>
      <category>lambda 함수</category>
      <category>파이썬</category>
      <category>파이썬 callback</category>
      <category>파이썬 filter</category>
      <category>파이썬 lambda</category>
      <category>파이썬 map</category>
      <category>파이썬 람다</category>
      <category>파이썬 콜백</category>
      <category>파이썬 함수</category>
      <author>세미531</author>
      <guid isPermaLink="true">https://semi531.tistory.com/99</guid>
      <comments>https://semi531.tistory.com/99#entry99comment</comments>
      <pubDate>Thu, 20 Jan 2022 21:00:13 +0900</pubDate>
    </item>
    <item>
      <title>윈도우11 + 우분투 18.04 (with nvidia mx450) 듀얼부팅 방법</title>
      <link>https://semi531.tistory.com/98</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Spec&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RAM : 16GB&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CPU : Intel i7&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GPU : NVIDIA MX450 2GB&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;Requirement&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ubuntu 18.04 Boot USB&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;일단 현재 노트북에는 윈도우 11만 설정되어 있고 이 상태에서 우분투 18.04 버전을 듀얼부팅을 통해 설치해보도록 하겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 먼저 부팅 USB 를 만들어줘야 한다. 부팅 USB 만드는 방법은 아래의 개발환경 세팅 글에 나와있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://semi531.tistory.com/93&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2021.11.10 - [Coding/about Computer] - Personal 개발환경 세팅&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1641361046352&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;Personal 개발환경 세팅&quot; data-og-description=&quot;새롭게 노트북을 구매하면서 이참에 정리해놓으면 좋을 것 같아 새롭게 개인적인 개발환경 세팅 및 유용하게 사용하는 프로그램들의 링크를 첨부하려 한다. cpu : intel i7 11gen gpu : nvidia mx450 일단 &quot; data-og-host=&quot;semi531.tistory.com&quot; data-og-source-url=&quot;https://semi531.tistory.com/93&quot; data-og-url=&quot;https://semi531.tistory.com/93&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/byVjzu/hyMYSAqz7M/aTmuOuw5MxEtUsiIfit4YK/img.jpg?width=800&amp;amp;height=600&amp;amp;face=0_0_800_600,https://scrap.kakaocdn.net/dn/cFOKML/hyMYOrgunz/7WBwEepjo8HykBH9JMGyk1/img.jpg?width=800&amp;amp;height=600&amp;amp;face=0_0_800_600,https://scrap.kakaocdn.net/dn/hA3mz/hyMYTe2KXG/RRkXg2FyNOLEmoU2wKipl1/img.jpg?width=2048&amp;amp;height=1536&amp;amp;face=0_0_2048_1536&quot;&gt;&lt;a href=&quot;https://semi531.tistory.com/93&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://semi531.tistory.com/93&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/byVjzu/hyMYSAqz7M/aTmuOuw5MxEtUsiIfit4YK/img.jpg?width=800&amp;amp;height=600&amp;amp;face=0_0_800_600,https://scrap.kakaocdn.net/dn/cFOKML/hyMYOrgunz/7WBwEepjo8HykBH9JMGyk1/img.jpg?width=800&amp;amp;height=600&amp;amp;face=0_0_800_600,https://scrap.kakaocdn.net/dn/hA3mz/hyMYTe2KXG/RRkXg2FyNOLEmoU2wKipl1/img.jpg?width=2048&amp;amp;height=1536&amp;amp;face=0_0_2048_1536');&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;Personal 개발환경 세팅&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;새롭게 노트북을 구매하면서 이참에 정리해놓으면 좋을 것 같아 새롭게 개인적인 개발환경 세팅 및 유용하게 사용하는 프로그램들의 링크를 첨부하려 한다. cpu : intel i7 11gen gpu : nvidia mx450 일단&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;semi531.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 위의 글을 통해 부팅 USB 를 만들었다면 이제 윈도우상에서 몇몇 설정을 해줘야 한다. 먼저 Fast Boot 설정을 비활성화 해줘야 한다. 진입 순서는&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제어판 -&amp;gt; 하드웨어 및 소리 클릭 -&amp;gt; 전원 옵션 클릭 -&amp;gt; 좌측에 전원 단추 작동 설정 클릭 -&amp;gt; 위쪽에 현재 사용할 수 없는 설정 변경 클릭 -&amp;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-origin-width=&quot;768&quot; data-origin-height=&quot;548&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ddfBNx/btrpMQmtTzB/pY20yv8pYIrimLEwx9AMQk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ddfBNx/btrpMQmtTzB/pY20yv8pYIrimLEwx9AMQk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ddfBNx/btrpMQmtTzB/pY20yv8pYIrimLEwx9AMQk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FddfBNx%2FbtrpMQmtTzB%2FpY20yv8pYIrimLEwx9AMQk%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;530&quot; height=&quot;378&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;548&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;3. 장치 암호화 해제 (bitlocker)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;장치가 암호화되는 bitlocker 를 해제해야 한다. 방법은 윈도우 설정에 들어가서&amp;nbsp; 개인정보 및 보안 클릭 -&amp;gt; 보안 부분에 장치 암호화 클릭 -&amp;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-1. 이제 다음으로 Secure Boot 를 해제해야 한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Secure Boot 는 BIOS 에서 설정해야 한다. 재부팅 하며 BIOS 로 진입한다. (나의 경우 F11 을 전원버튼을 누른 후 연속적으로 누르면 진입이 가능하였는데 컴퓨터 브랜드에 따라 다르므로 BIOS 진입 버튼을 검색을 통해 찾아보고 진행해라.) 다음 Boot menu 로 들어가 고급 모드에 들어간다. (f7 을 누르면 진입 가능한듯?) 이후 안전 부팅 혹은 Secure Boot 메뉴를 찾으면 활성화가 되어있을 것이다. Secure Boot 의 경우 key를 지우면 비활성화 되는데 키 관리에 들어가 안전 부팅 키를 지우면 Secure Boot 가 비활성화되는 것을 확인할 수 있다.&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;4. 듀얼부팅을 위한 윈도우 파티션 나누기.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우분투를 새로운 파티션에 설치하기 위해 파티션 관리에 들어가 리눅스를 쓸 만큼 파티션을 나눠준다. 여유롭게 사용하기 위해 필자는 150GB 를 할당했지만 자신의 용량을 잘 보고 무리없이 할당해주면 된다. 아마 100GB 정도면 넉넉할 것이라고 생각한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://wnw1005.tistory.com/476&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://wnw1005.tistory.com/476&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1641710894952&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;윈도 10 파티션 축소/분할&quot; data-og-description=&quot;[관련 게시물] 2020/11/16 - [서버 운영/버추얼박스(VirtualBox)] - 버추얼박스 가상머신에 Windows 10 설치 미디어 iso 이미지 파일 등록 2020/11/18 - [윈도 10] - Windows 10 설치(+ 버추얼박스 가상머신) 2020..&quot; data-og-host=&quot;wnw1005.tistory.com&quot; data-og-source-url=&quot;https://wnw1005.tistory.com/476&quot; data-og-url=&quot;https://wnw1005.tistory.com/476&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/Hj2dB/hyM2YfcsxI/rcGikTpWhOYKbRblh97Fm0/img.png?width=403&amp;amp;height=624&amp;amp;face=0_0_403_624,https://scrap.kakaocdn.net/dn/AJMxA/hyM23nidJ8/klRG3BQV1xXynrOmCaHXf1/img.png?width=403&amp;amp;height=624&amp;amp;face=0_0_403_624,https://scrap.kakaocdn.net/dn/hr5PO/hyM1JKLbEU/N70fQL6aEEg01dptaSDFrk/img.png?width=844&amp;amp;height=672&amp;amp;face=0_0_844_672&quot;&gt;&lt;a href=&quot;https://wnw1005.tistory.com/476&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://wnw1005.tistory.com/476&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/Hj2dB/hyM2YfcsxI/rcGikTpWhOYKbRblh97Fm0/img.png?width=403&amp;amp;height=624&amp;amp;face=0_0_403_624,https://scrap.kakaocdn.net/dn/AJMxA/hyM23nidJ8/klRG3BQV1xXynrOmCaHXf1/img.png?width=403&amp;amp;height=624&amp;amp;face=0_0_403_624,https://scrap.kakaocdn.net/dn/hr5PO/hyM1JKLbEU/N70fQL6aEEg01dptaSDFrk/img.png?width=844&amp;amp;height=672&amp;amp;face=0_0_844_672');&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;윈도 10 파티션 축소/분할&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;[관련 게시물] 2020/11/16 - [서버 운영/버추얼박스(VirtualBox)] - 버추얼박스 가상머신에 Windows 10 설치 미디어 iso 이미지 파일 등록 2020/11/18 - [윈도 10] - Windows 10 설치(+ 버추얼박스 가상머신) 2020..&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;wnw1005.tistory.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;5. nouveau 비활성화 (노트북에 NVIDIA 외장 그래픽이 내장되어 있는 경우에만)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 부분은 내장그래픽만 있는 노트북은 하지 않아도 된다. Ubuntu USB 를 꼽고 마찬가지로 BIOS 화면으로 들어가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;UEFI : Ubuntu 를 제일 위로 올려주고 부팅한다. 아니면 직접 부팅 메뉴에서 선택해서 부팅해도 가능하다. 이 다음 gtub 메뉴에서 nouveau 를비활성화 하는 것이 중요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;nouveau 는 Ubuntu 에 기본으로 내장된 오픈소스 그래픽 드라이버이며 Nvidia Graphic Driver 가 깔리게 되면 충돌이 일어나는 것처럼 보인다. 따라서 비활성화를 하고 우분투를 설치하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;1) install ubuntu 로 커서를 옮기고 e 를 누른다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;2) vi 화면이 열릴텐데 linux 라고 되어있는 줄의 끝에 &lt;b&gt;nouveau.modeset=0&lt;/b&gt; 을 추가해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;혹시 이게 안되면 ...quiet splash 단어 뒤에(혹은 단어를 지우고 그 위치에) nomodeset 단어를 추가로 설정한다.&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;3) F10 을 누르면 자동으로 저장되고 부팅이 된다.&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;6. 이제 듀얼부팅으로 설치를 해준다. 설치 방법은 아래 블로그에 나와있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://wnw1005.tistory.com/477&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://wnw1005.tistory.com/477&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1641710952559&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;Windows 10 - Linux(Ubuntu) 멀티부팅(듀얼부팅) 시스템 구축&quot; data-og-description=&quot;[관련 게시물] 2020/11/16 - [서버 운영/버추얼박스(VirtualBox)] - 버추얼박스 가상머신에 Windows 10 설치 미디어 iso 이미지 파일 등록 2020/11/18 - [윈도 10] - Windows 10 설치(+ 버추얼박스 가상머신) 2020..&quot; data-og-host=&quot;wnw1005.tistory.com&quot; data-og-source-url=&quot;https://wnw1005.tistory.com/477&quot; data-og-url=&quot;https://wnw1005.tistory.com/477&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bATrM8/hyM1C5WsU8/sKiTTJakdmL1v6uGBVPHS1/img.png?width=800&amp;amp;height=433&amp;amp;face=0_0_800_433,https://scrap.kakaocdn.net/dn/baB1ZZ/hyM24GuKP6/cXGqEkGux0HLS3JZKrg2Hk/img.png?width=800&amp;amp;height=433&amp;amp;face=0_0_800_433,https://scrap.kakaocdn.net/dn/bRyoC5/hyM21weBIf/IgQSQrJ1PREPhcEAEi5ctk/img.png?width=1026&amp;amp;height=770&amp;amp;face=0_0_1026_770&quot;&gt;&lt;a href=&quot;https://wnw1005.tistory.com/477&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://wnw1005.tistory.com/477&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bATrM8/hyM1C5WsU8/sKiTTJakdmL1v6uGBVPHS1/img.png?width=800&amp;amp;height=433&amp;amp;face=0_0_800_433,https://scrap.kakaocdn.net/dn/baB1ZZ/hyM24GuKP6/cXGqEkGux0HLS3JZKrg2Hk/img.png?width=800&amp;amp;height=433&amp;amp;face=0_0_800_433,https://scrap.kakaocdn.net/dn/bRyoC5/hyM21weBIf/IgQSQrJ1PREPhcEAEi5ctk/img.png?width=1026&amp;amp;height=770&amp;amp;face=0_0_1026_770');&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;Windows 10 - Linux(Ubuntu) 멀티부팅(듀얼부팅) 시스템 구축&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;[관련 게시물] 2020/11/16 - [서버 운영/버추얼박스(VirtualBox)] - 버추얼박스 가상머신에 Windows 10 설치 미디어 iso 이미지 파일 등록 2020/11/18 - [윈도 10] - Windows 10 설치(+ 버추얼박스 가상머신) 2020..&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;wnw1005.tistory.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;그 다음 분명히! 안켜지는 사람들 있을 것이다. 엄청나게 찾아본 결과 일단 원인은 그래픽카드 충돌이다. 기존 컴퓨터에 내장된 그래픽카드와 우분투 상에서 설치되는 그래픽 드라이버가 충돌하여 오류가 나는 것이다. 아래 충돌을 해결한 글들을 첨부하겠다. 다 시도해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://hoonplay.tistory.com/entry/%EC%B9%BC%EB%A6%AC-%EB%A6%AC%EB%88%85%EC%8A%A4-%EC%9A%B0%EB%B6%84%ED%88%AC-nouveau-%EB%81%84%EA%B8%B0-%EB%B9%84%ED%99%9C%EC%84%B1%ED%99%94-%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://hoonplay.tistory.com/entry/%EC%B9%BC%EB%A6%AC-%EB%A6%AC%EB%88%85%EC%8A%A4-%EC%9A%B0%EB%B6%84%ED%88%AC-nouveau-%EB%81%84%EA%B8%B0-%EB%B9%84%ED%99%9C%EC%84%B1%ED%99%94-%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1641710824610&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;칼리 리눅스 우분투 nouveau 끄기 비활성화 하는 방법&quot; data-og-description=&quot;리눅스를 멀티부팅으로 설치 후 매번 종료할 때 마다 검은 바탕에 nouveau 라는 문구가 뜨고 한참 후에나 종료가 되는 현상 때문에 개열받았는데 이것저것 알아보다가 결국 nvidia 드라이버? 문제라&quot; data-og-host=&quot;hoonplay.tistory.com&quot; data-og-source-url=&quot;https://hoonplay.tistory.com/entry/%EC%B9%BC%EB%A6%AC-%EB%A6%AC%EB%88%85%EC%8A%A4-%EC%9A%B0%EB%B6%84%ED%88%AC-nouveau-%EB%81%84%EA%B8%B0-%EB%B9%84%ED%99%9C%EC%84%B1%ED%99%94-%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95&quot; data-og-url=&quot;https://hoonplay.tistory.com/211&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/lJLTf/hyM1IdWhy7/0mTtL6JIa8tkAqKnwErMo0/img.png?width=453&amp;amp;height=274&amp;amp;face=0_0_453_274,https://scrap.kakaocdn.net/dn/bZINAd/hyM2Xm35MX/VYMNcFP65aRL9IMMuws5jK/img.png?width=453&amp;amp;height=274&amp;amp;face=0_0_453_274,https://scrap.kakaocdn.net/dn/crwvhC/hyM1BTve5M/e4EBxlHcL2TwzsgxlNZvV1/img.jpg?width=519&amp;amp;height=490&amp;amp;face=0_0_519_490&quot;&gt;&lt;a href=&quot;https://hoonplay.tistory.com/entry/%EC%B9%BC%EB%A6%AC-%EB%A6%AC%EB%88%85%EC%8A%A4-%EC%9A%B0%EB%B6%84%ED%88%AC-nouveau-%EB%81%84%EA%B8%B0-%EB%B9%84%ED%99%9C%EC%84%B1%ED%99%94-%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://hoonplay.tistory.com/entry/%EC%B9%BC%EB%A6%AC-%EB%A6%AC%EB%88%85%EC%8A%A4-%EC%9A%B0%EB%B6%84%ED%88%AC-nouveau-%EB%81%84%EA%B8%B0-%EB%B9%84%ED%99%9C%EC%84%B1%ED%99%94-%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/lJLTf/hyM1IdWhy7/0mTtL6JIa8tkAqKnwErMo0/img.png?width=453&amp;amp;height=274&amp;amp;face=0_0_453_274,https://scrap.kakaocdn.net/dn/bZINAd/hyM2Xm35MX/VYMNcFP65aRL9IMMuws5jK/img.png?width=453&amp;amp;height=274&amp;amp;face=0_0_453_274,https://scrap.kakaocdn.net/dn/crwvhC/hyM1BTve5M/e4EBxlHcL2TwzsgxlNZvV1/img.jpg?width=519&amp;amp;height=490&amp;amp;face=0_0_519_490');&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;칼리 리눅스 우분투 nouveau 끄기 비활성화 하는 방법&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;리눅스를 멀티부팅으로 설치 후 매번 종료할 때 마다 검은 바탕에 nouveau 라는 문구가 뜨고 한참 후에나 종료가 되는 현상 때문에 개열받았는데 이것저것 알아보다가 결국 nvidia 드라이버? 문제라&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;hoonplay.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.py4u.net/discuss/1096293&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.py4u.net/discuss/1096293&lt;/a&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;7. 그래픽 드라이버 설치(CUDA 를 쓰지 않는 경우)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내장 그래픽 드라이버를 비활성화하여 그래픽 드라이버 자체가 없기 때문에 좋은 GPU 가 있더라도 해상도가 매우 안좋을 것이다. CUDA 를 쓰지 않는 사람이라면 Software Updater 에 들어가서 Setting 을 누른 뒤 Additional Drivers 에 들어가서 자신에게 맞는 Driver 를 설치해준다.&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;8. CUDA 10.0 설치 (CUDA 호환 버전을 잘 알아야할것이다)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CUDA 를 설치하면 자동으로 적절한 그래픽 드라이버를 설치해준다. 7번을 분리한 이유도 NVIDIA Graphic Driver 를 설치하고 다른 버전의 드라이버를 다시 설치하면 충돌이 일어나 무한 부팅이 일어난다. 이러면 다 지우고 다시 설치해야한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1641363000016&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo apt install gcc
sudo apt update
sudo apt upgrade

# 혹시 모르니 기존의 CUDA와 그래픽 드라이버를 삭제
sudo rm /etc/apt/source.list.d/cuda*
sudo apt remove nvidia-cuda-toolkit
sudo apt purge nvidia-*

sudo apt update
sudo apt-key adv --fetch-keys  http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/7fa2af80.pub
sudo bash -c 'echo &quot;deb http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64 /&quot; &amp;gt; /etc/apt/sources.list.d/cuda.list'
sudo apt update
sudo apt install cuda-10-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;9. 환경변수 설정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;~/.bashrc 에 export PATH=/usr/local/cuda-10.0/bin${PATH:+:${PATH}} 를 추가해준다.&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;10. nouveau 블랙리스트 설정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;안해도 설치할 때 비활성화 했으니 괜찮을 듯 하나 혹시 모르니 하자. sudo gedit /etc/modprobe.d/blacklist.conf 실행 후 아래의 내용을 추가해준다.&lt;/p&gt;
&lt;pre id=&quot;code_1641363219651&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;blacklist nouveau
blacklist lbm-nouveau
options nouveau modeset=0
alias nouveau off
alias lbm-nouveau off&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 설정 적용을 위해 sudo update-initramfs -u 를 실행한다.&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;11. 설치 확인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;재부팅 후 nvcc --version 으 실행했을 때 10.0 이 나온다면 성공이다. 터미널에서 nvidia-smi 를 실행했을 때는 다른 버전으로 표기될 수도 있으나 Runtime 시에는 CUDA 10.0 이 사용된다는 의미이므로 안심하자.&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;12. 시간 동기화 (듀얼부팅 시 윈도우의 시간 오류 수정하기)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;윈도우와 우분투에서 시스템 시계(RTC) 에 저장된 시각을 해석하는 방식이 다르다.&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;Windows : RTC 를 Local Time 으로 해석&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ubuntu : RTC 를 UTC 로 해석&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;pre id=&quot;code_1641363724480&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;timedatectl set-local-rtc 1 --adjust-system-clock&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Coding/Robot Operating System</category>
      <category>듀얼부팅</category>
      <category>우분투 18.04</category>
      <category>우분투 cuda</category>
      <category>우분투 nvidia</category>
      <category>우분투 그래픽</category>
      <category>우분투 듀얼부팅</category>
      <category>우분투 시간 에러</category>
      <category>우분투 에러</category>
      <category>윈도우 11 우분투</category>
      <category>윈도우 듀얼부팅</category>
      <author>세미531</author>
      <guid isPermaLink="true">https://semi531.tistory.com/98</guid>
      <comments>https://semi531.tistory.com/98#entry98comment</comments>
      <pubDate>Wed, 5 Jan 2022 16:00:37 +0900</pubDate>
    </item>
    <item>
      <title>파이썬 class 에 대해서</title>
      <link>https://semi531.tistory.com/97</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;클래스는 객체의 구조와 행동을 결정하고 복잡하거나 반복되는 문제를 다루기 쉽게 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인스턴스는 어떤 클래스 A 의 객체 a 가 있을 때 a 는 클래스 A 의 인스턴스 이다. 아래 코드를 보며 간단히 알아보자.&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;Human 클래스를 만들고 이 Human 클래스에서 사람의 이름, 나이, 성별을 사용하기 위해서는 아래와 같이 def __init__(self) 에 name, age, sex 를 추가해줘야 한다. 이는 클래스의 생성자라고 한다.&lt;/p&gt;
&lt;pre id=&quot;code_1640844485603&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Human:
  def __init__(self,name,age,sex):
    self.name = name
    self.age = age
    self.sex = sex&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_1640844739910&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Human:
  def __init__(self,name,age,sex):
    self.name = name
    self.age = age
    self.sex = sex

  def who(self):
    print(&quot;name : {}, age : {}&quot;.format(self.name,self.age))
    
areum = Human('harry',23,'girl')
areum.who()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 who 함수를 작성하고 fomat을 해준다. 이는 아래에서 areum = Human(....) 에 작성해준대로 이름, 나이, 성별을 지정해준 다음 areum.who() 를 통해 areum 에서 지정해준 변수들로 who() 함수를 호출한다는 뜻이다. 그리고 who 함수에서 위의 변수들을 사용하기 위해 who(self) 와 같이 self 를 넣어주어야 한다.&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;이 다음으로 areum 과 같이 지정된 이름, 나이, 성별을 변경하고 싶을 때 사용할 수 있는 setInfo 함수를 만들어보자.&lt;/p&gt;
&lt;pre id=&quot;code_1640845048093&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Human:
  def __init__(self,name,age,sex):
    self.name = name
    self.age = age
    self.sex = sex

  def who(self):
    print(&quot;name : {}, age : {}&quot;.format(self.name,self.age))


  def setInfo(self,name,age,sex):
    self.name = name
    self.age = age
    self.sex = sex

areum = Human('harry',23,'girl')

areum.who()
areum.setInfo('hao',44,'male')
areum.who()&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;이렇게 setInfo 함수 또한 (self) 를 넣어주고 이 setInfo 함수에서는 변수로 이름, 나이, 성별을 사용하기 때문에 (변수의 변경) setInfo(self,name,age,sex) 와 같이 작성해준다. 그리고 self.name = name 이런거는 맨 위의 __init__ 에서 정해준 self.name 을 name 이라는 변수명으로 사용하겠다는 명명이다.&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;blockquote data-ke-style=&quot;style3&quot;&gt;name : harry, age : 23&lt;br /&gt;name : hao, age : 44&lt;/blockquote&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;img.jpg&quot; data-origin-width=&quot;2362&quot; data-origin-height=&quot;1108&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biVaOR/btrpgzdR7ZP/hRDh8kd7lz0bR3rlw4LDjk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biVaOR/btrpgzdR7ZP/hRDh8kd7lz0bR3rlw4LDjk/img.jpg&quot; data-alt=&quot;테슬라 사야지 ㅎ&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biVaOR/btrpgzdR7ZP/hRDh8kd7lz0bR3rlw4LDjk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiVaOR%2FbtrpgzdR7ZP%2FhRDh8kd7lz0bR3rlw4LDjk%2Fimg.jpg&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;256&quot; height=&quot;120&quot; data-filename=&quot;img.jpg&quot; data-origin-width=&quot;2362&quot; data-origin-height=&quot;1108&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;테슬라 사야지 ㅎ&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Coding/Python</category>
      <category>Python</category>
      <category>python class</category>
      <category>파이썬</category>
      <category>파이썬 class</category>
      <category>파이썬 def</category>
      <category>파이썬 init</category>
      <category>파이썬 self</category>
      <category>파이썬 생성자</category>
      <category>파이썬 입문</category>
      <category>파이썬 함수</category>
      <author>세미531</author>
      <guid isPermaLink="true">https://semi531.tistory.com/97</guid>
      <comments>https://semi531.tistory.com/97#entry97comment</comments>
      <pubDate>Thu, 30 Dec 2021 15:23:27 +0900</pubDate>
    </item>
    <item>
      <title>테슬라가 1등인 이유 (1) - ECU 와 MCU</title>
      <link>https://semi531.tistory.com/96</link>
      <description>&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;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;테슬라의 차량은 &quot;통합&quot; ECU(Electronic Control Unit) 를 사용하고 있다. ECU 는 자동차의 엔진, 자동 변속기, ABS 등의 상태를 컴퓨터로 제어하는 전자 제어장치이다. ECU의 개발 목적은 처음에는 점화 시기와 연료 분사, 공회전, 한계값 설정 등 엔진의 핵심 기능을 정밀하게 제어하는 것이었다. 그러나 차량과 컴퓨터 성능의 발전과 함께 자동변속기 제어를 비롯해 구동계통, 제동계통, 조향계통 등 차량의 모든 부분을 제어하는 역할까지 담당하는 추세이다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;기존 차량들은 엔진, 자동변속기, ABS 등에 각각 ECU 모듈을 장치, 사용하는 반면 테슬라는 통합 ECU를 사용하고 있다. 테슬라 차량이라고 통합 ECU라고 해서 모든 것을 다 담당하지는 않는다. 안전에 핵심인 구동계 같은 경우는 자체적인 ECU를 가지고 있다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;통합 ECU는 시스템이 다운되었을 경우 차량 운행에 위험을 줄 수 있다. 독립된 모듈로서 ECU가 나뉘었을 경우, 하나가 에러가 생겨도 다른 ECU는 문제가 생기지 않는다. 그러나 통합 ECU는 시스템 다운으로 차량 전체의 제어에 영향을 줄 수 있다. 테슬라일 경우 주행 중 다운이 발생하는 경우가 종종 보고되는데, 구동계 부분만큼은 따로 ECU를 두기에 다운되어도 운전자가 운행을 잘 한다면 사고를 피할 수는 있긴 하다. 그렇지만 차량의 운행과 직 간접적으로 연관이 되어있는 기능이기 때문에 주행 중에 꺼지는 것은 매우 위험한 현상이라고 할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;이렇게 통합 ECU 를 사용하고 중앙에서 관리를 하고 이 프로세스를 매우 견고하게 다진다면 각각의 차에 들어가는 무수한 ECU 및 차량 제작에 들어가는 비용을 획기적으로 줄이고 수익을 극대화 할 수 있다. 초반에 통합 ECU 를 구축하고 서버를 통해 관리하는 것이 어려울 수 있어 기존의 토요타, 폭스바겐 등은 시도하지 않았지만 이렇게 시도한 테슬라는 획기적으로 이윤을 추구할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;MCU는 Media Control Unit, 즉 미디어 제어 장치로 대시 보드 중앙에 위치해 있다. 운영 체제는&amp;nbsp;리눅스를 기반으로 하며 이 MCU 전용 보드가 독립적으로 차량 내의 디스플레이, 통신, 오디오, 여러 설정들을 담당하기에, MCU가 먹통이 되더라도 오토파일럿 작동에 영향을 주지 않는다. 현재 MCU는 2가지 버전이 있으며, 하나는 2018년 2월까지 생산된 차량(모델S, X)에 탑재된 MCU1, 나머지 하나는 그 이후 생산된 차량(모델S, X, 3)에 탑재된 MCU2이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;리눅스 기반으로 c++ 로 개발되었으며 인터페이스는 javascript 로 대부분 구성했다고 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;MCU1은 Nvidia 의 쿼드 코어 프로세서가 탑재되어 있다. 보통 구형 MCU라고 표현하며, MCU1 탑재 차량은 테슬라가 제공하는 일부 게임(컵헤드 등)이나, 이번 V10에 추가된 넷플릭스/유튜브 이용이 불가능하다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;MCU2에는 Intel 의 멀티코어 Atom&amp;nbsp;프로세서가 탑재되어 있다. 2018년 3월 이후 생산된 모든 테슬라 차량에는 MCU2가 탑재되어 출하되며, 보통 MCU2를 신형 MCU라고 부른다. 구형에 비하여 더 빠른 반응속도를 제공하고, 5Ghz 와이파이를 지원하며 블루투스 최신버전 및 추가적인 안테나가 등이 추가된 것이 특징이다. 테슬라 차량 안에 보급형 태블릿 PC를 내장했다고 봐도 된다. MCU에서 MCU2로 업그레이드가 가능은 하나 2500 달러로 기능성에 비해 매우 비싸기에 그다지 추천되지 않는다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;테슬라의 이러한 통합된 ECU와 MCU는 2021년 불어닥친 반도체 수급 난항에서도 유일하게 타격을 입지 않은 기업이 되는데 큰 역할을 했다. 타 자동차 업체와 달리 자체 OS를 이용해 들어가는 반도체의 수가 타 업체 20배 수준으로 적으며 아직 생산하는 차량이 4개 밖에 되지 않는 것 역시 장점이 됐으며 테슬라가 핵심칩까지 직접설계하기 때문에 반도체회사와 직거래를 하는 유일한 자동차 기업이다. 이러한 점이 바로 기존 자동차 회사가 주행거리나 충전속도는 따라잡았음에도 불구하고 테슬라를 넘지 못 하는 가장 큰 이유 중 하나이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;이와 같은 사례로 빅테크 기업인 Apple 또한 소프트웨어와 하드웨어(프로세서) 를 모두 설계하기 때문에 반도체 수급난 및 최적화에서 다른 회사들보다 우위를 점할 수 있었던 것이다. 애플은 직접 공장을 운영하지 않고 그 비용을 소프트웨어와 하드웨어 설계 역량에 투자하였고 테슬라는 아무래도 차량은 대량생산이 정말 중요하고 쉽지 않은 요소이므로 기가팩토리를 빨리 구축하고 최대한 효율적이고 저렴하게 소프트웨어와 하드웨어를 설계하였다. 기존 차량 회사들과는 달리 소프트웨어 측면에서 보수적이던 과정을 부시고 새로운 방법을 찾은 것이 테슬라가 1위가 된 비결이라고 생각한다.&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;img.jpg&quot; data-origin-width=&quot;2362&quot; data-origin-height=&quot;1108&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sQ0Wd/btroXNp2JAd/CPTMZVJ9Zvk9Dz1mugS8fk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sQ0Wd/btroXNp2JAd/CPTMZVJ9Zvk9Dz1mugS8fk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sQ0Wd/btroXNp2JAd/CPTMZVJ9Zvk9Dz1mugS8fk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsQ0Wd%2FbtroXNp2JAd%2FCPTMZVJ9Zvk9Dz1mugS8fk%2Fimg.jpg&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;335&quot; height=&quot;157&quot; data-filename=&quot;img.jpg&quot; data-origin-width=&quot;2362&quot; data-origin-height=&quot;1108&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;</description>
      <category>Life/자율주행, AI</category>
      <category>도지코인</category>
      <category>오토파일럿</category>
      <category>일론 머스크</category>
      <category>테슬라</category>
      <category>테슬라 기술</category>
      <category>테슬라 미래</category>
      <category>테슬라 일론</category>
      <category>테슬라 자율주행</category>
      <category>테슬라 주가</category>
      <category>테슬라 주식</category>
      <author>세미531</author>
      <guid isPermaLink="true">https://semi531.tistory.com/96</guid>
      <comments>https://semi531.tistory.com/96#entry96comment</comments>
      <pubDate>Mon, 27 Dec 2021 19:18:07 +0900</pubDate>
    </item>
    <item>
      <title>ROS2 Parameter 이해</title>
      <link>https://semi531.tistory.com/95</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;1. Parameter&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ros2 에서의 파라미터는 각 노드에서 파라미터 관련 parameter server 를 실행시켜 외부의 parameter client 와 통신으로 파라미터를 변경하는 것으로 서비스와 동일하다고 볼 수 있다. 단 서비스가 서비스 요청과 응답이라는 RPC(remote procedure call)가 목적이었다면 파라미터는 노드 내 매개변수를 서비스 데이터 통시 방법을 사용하여 노드 내부 또는 외부에서 쉽게 지정하거나 변경할 수 있고 쉽게 가져와서 사용할 수 있게 하는 점에서 그 사용 목적이 다르다고 볼 수 있다.&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;파라미터 관련 기능은 RCL(ROS Client Libraries) 의 기본 기능으로 모든 노드가 자신만의 파라미터 서버를 가지고 있고 각 노드는 Parameter client 도 포함시킬 수 있어서 자기 자신의 파라미터 및 다은 노드의 파라미터를 읽고 쓸 수 있게 된다. 이를 활용하면 각 노드의 다양한 매개변수를 글로벌 매개변수처럼 사용할 수 있게 되어 추가 프로그래밍이나 컴파일 없이 능동적으로 변화 가능한 프로세스를 만들 수 있게 된다. 그리고 각 파라미터는 yaml 파일 형태의 파라미터 설정 파일을 만들어 초기 파라미터 갓 설정 및 노드 실행시에 파라미터 설정 파일을 불러와서 사용할 수 있기에 ROS2 프로그래밍에 매우 유용하게 사용할 수 있다.&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://cafe.naver.com/openrt/24165&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://cafe.naver.com/openrt/24165&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1640151550860&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;013 ROS 2 파라미터 (parameter)&quot; data-og-description=&quot;Created Date: 2020.09.02 Modified Date: 2020.09.11 revision 6 * 로봇 운영체제 ROS 강좌 목차: https://cafe....&quot; data-og-host=&quot;cafe.naver.com&quot; data-og-source-url=&quot;https://cafe.naver.com/openrt/24165&quot; data-og-url=&quot;https://cafe.naver.com/openrt/24165&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/xBWPF/hyMMM8K0wI/VykJko5zcXpgowTqJQglKK/img.png?width=550&amp;amp;height=412&amp;amp;face=0_0_550_412&quot;&gt;&lt;a href=&quot;https://cafe.naver.com/openrt/24165&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://cafe.naver.com/openrt/24165&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/xBWPF/hyMMM8K0wI/VykJko5zcXpgowTqJQglKK/img.png?width=550&amp;amp;height=412&amp;amp;face=0_0_550_412');&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;013 ROS 2 파라미터 (parameter)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Created Date: 2020.09.02 Modified Date: 2020.09.11 revision 6 * 로봇 운영체제 ROS 강좌 목차: https://cafe....&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;cafe.naver.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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;26389A3958D359A217.png&quot; data-origin-width=&quot;663&quot; data-origin-height=&quot;355&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dJUx8J/btro31nsunH/4ixTznYGp7pPYKt8jKy7SK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dJUx8J/btro31nsunH/4ixTznYGp7pPYKt8jKy7SK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dJUx8J/btro31nsunH/4ixTznYGp7pPYKt8jKy7SK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdJUx8J%2Fbtro31nsunH%2F4ixTznYGp7pPYKt8jKy7SK%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;214&quot; height=&quot;114&quot; data-filename=&quot;26389A3958D359A217.png&quot; data-origin-width=&quot;663&quot; data-origin-height=&quot;355&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Coding/Robot Operating System</category>
      <category>Parameter</category>
      <category>Ros</category>
      <category>ros parameter</category>
      <category>ros python</category>
      <category>ros 입문</category>
      <category>ros 파라미터</category>
      <category>ROS2</category>
      <category>파라미터</category>
      <category>파이썬</category>
      <category>파이썬 입문</category>
      <author>세미531</author>
      <guid isPermaLink="true">https://semi531.tistory.com/95</guid>
      <comments>https://semi531.tistory.com/95#entry95comment</comments>
      <pubDate>Wed, 22 Dec 2021 14:39:14 +0900</pubDate>
    </item>
    <item>
      <title>ros2 토픽에 대해</title>
      <link>https://semi531.tistory.com/94</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;픽(topic)은 그림 1의 `Node A - Node B`처럼 비동기식 단방향 메시지 송수신 방식으로 msg 메시지 형태의 메시지를 발행하는 `Publisher`와 메시지를 구독하는 `Subscriber` 간의 통신이라고 볼 수 있다. 이는 1:1 통신을 기본으로 하지만 그림 2의 `Node A - Node B`, `Node A - Node C`와 같이 하나의 토픽(예: Topic C)을 송수신하는 1:N도 가능하고 그 구성 방식에 따라 N:1, N:N 통신&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;도 가능하며 ROS 메시지 통신에서 가장 널리 사용되는 통신 방법이다. &lt;/span&gt;&lt;/p&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;703&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bXRNFM/btroecQZmvE/eBGGCtvNFbAgQcQgKGQwvk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bXRNFM/btroecQZmvE/eBGGCtvNFbAgQcQgKGQwvk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bXRNFM/btroecQZmvE/eBGGCtvNFbAgQcQgKGQwvk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbXRNFM%2FbtroecQZmvE%2FeBGGCtvNFbAgQcQgKGQwvk%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;1280&quot; height=&quot;703&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;703&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;703&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b4pfrD/btroj6WMeAd/KLbuRw3zEEMSFfvDKvToTk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b4pfrD/btroj6WMeAd/KLbuRw3zEEMSFfvDKvToTk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b4pfrD/btroj6WMeAd/KLbuRw3zEEMSFfvDKvToTk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb4pfrD%2Fbtroj6WMeAd%2FKLbuRw3zEEMSFfvDKvToTk%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;1280&quot; height=&quot;703&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;703&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&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;pre id=&quot;code_1639895146758&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ ros2 run turtlesim turtlesim_node&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;을 실행하면 거북이 튜토리얼이 실행된다. &lt;span style=&quot;background-color: #ffffff;&quot;&gt;`ros2 node info` 명령어를 이용하여 turtlesim_node (노드명: turtlesim, 이하 turtlesim이라 표기함) 노드의 토픽 정보를 확인해보자. &lt;span style=&quot;background-color: #ffffff;&quot;&gt;참고로 turtlesim_node 노드는 turtlesim이라는 노드 이름으로 실행된다. 서비스, 액션, 파라미터를 제거하여 본다면 아래와 같을 것이다. 여기서 알 수 있는 것은 turtlesim 노드는 geometry_msgs/msg/Twist 형태의 메시지인 cmd_vel을 구독하고 있다는 것과 turtlesim/msg/Color 형태의 color_sensor 메시지 형태인 color_sensor, 그리고 turtlesim/msg/Pose 형태의 pose 메시지를 발행하고 있다는 것이다.&lt;/span&gt;&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_1639895206831&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ ros2 node info /turtlesim
/turtlesim
  Subscribers:
    /turtle1/cmd_vel: geometry_msgs/msg/Twist
    (생략)
  Publishers:
    /turtle1/color_sensor: turtlesim/msg/Color
    /turtle1/pose: turtlesim/msg/Pose
    (생략)
  Services:
    /clear: std_srvs/srv/Empty
    /kill: turtlesim/srv/Kill
    (생략)&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;span style=&quot;background-color: #ffffff;&quot;&gt;좀 더 간단하게 메시지들을 확인하고 싶다면 아래 명령어처럼 `ros2 topic list -t`를 이용하면 된다. 이전의 명령어가 turtlesim 노드만의 정보를 확인하였다면 `ros2 topic list -t` 명령어는 현재 개발 환경에서 동작 중인 모든 노드들의 토픽 정보를 볼 수 있는 것으로 지금은 turtlesim 노드만이 실행된 상태이기에 turtlesim 노드가 발행, 구독하는 메시지만 표시되고 있다. 참고로 `-t` 옵션은 부가적인 것으로 각 메시지의 형태(type)를 함께 표시해준다.&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1639895236727&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ ros2 topic list -t
/parameter_events [rcl_interfaces/msg/ParameterEvent]
/rosout [rcl_interfaces/msg/Log]
/turtle1/cmd_vel [geometry_msgs/msg/Twist]
/turtle1/color_sensor [turtlesim/msg/Color]
/turtle1/pose [turtlesim/msg/Pose]​&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&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;/ul&gt;
&lt;pre id=&quot;code_1639895287422&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ ros2 topic info /turtle1/cmd_vel
Type: geometry_msgs/msg/Twist
Publisher count: 1
Subscriber count: 1&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;토픽 내용 확인 (ros2 topic echo)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이번에는 특정 토픽의 메시지 내용을 실시간으로 표시하는 `ros2 topic echo`를 사용해보자. 다음 명령어와 같이 `/turtle1/cmd_vel`라고 토픽을 지정하게 되면 해당 토픽의 값을 확인해볼 수 있다. 참고로 `/turtle1/cmd_vel` 토픽을 발행하는 teleop_turtle 노드를 실행한 터미널 창에서 방향 키보드 키(&amp;larr;&amp;uarr; &amp;darr;&amp;rarr;)를 눌러 명령을 내려야지만 토픽 값을 확인할 수 있다. 아래의 결과를 보자면 `/turtle1/cmd_vel` 토픽의 linear에 x, y, z 값이 있으며, angular에 x, y, z 값이 존재한다는 것을 알 수 있다. 총 6개의 값으로 구성되어 있으며 현재 linear.x 값으로 1.0 m/s 임을 확인할 수 있다. &lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-8197b349-0850-45b8-8c9c-d2aafae4c216&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-8748d0f9-eb52-4c0c-b2d4-f8ced0f9d249&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;참고로 모든 메시지는 meter, second, degree, kg 등 SI 단위를 기본으로 사용하는데 이는 다른 강좌에서 더 자세히 다루기로 하겠다.&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1639895349179&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ ros2 topic echo /turtle1/cmd_vel
linear:
x: 1.0
y: 0.0
z: 0.0
angular:
x: 0.0
y: 0.0
z: 0.0&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;토픽 대역폭 확인 (ros2 topic bw)&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;위에서 토픽의 내용을 확인해보았다. 이번에는 메시지의 대역폭, 즉 송수신받는 토픽 메시지의 크기를 확인해보자. 크기 확인은 아래 명령어와 같이 `ros2 topic bw`으로 지정된 토픽 메시지의 송수신되는 토픽의 초당 대역폭을 알 수 있다. teleop_turtle 노드에서 지속적으로 메시지를 보내는 상황이라면 평균 1.74KB/s의 대역폭으로 /turtle1/cmd_vel 토픽이 사용되는 것을 확인할 수 있다. 이는 사용하는 메시지 형태 및 주기에 따라 달라질 수 있다.&lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1639895406708&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ ros2 topic bw /turtle1/cmd_vel
Subscribed to [/turtle1/cmd_vel]
average: 1.74KB/s
mean: 0.05KB min: 0.05KB max: 0.05KB window: 100
(생략)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;토픽&amp;nbsp; 주기 확인 (ros2 topic hz)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;토픽의 전송 주기를 확인하려면 `ros2 topic hz` 명령어를 이용하면 된다. teleop_turtle 노드에서 지속적으로 /turtle1/cmd_vel 토픽을 발행한다면 아래와 같이 평균 33.2 Hz 정도가 나올 것이다. 즉 0.03 초에 한번씩 토픽을 발행하고 있다는 것이다. 이는 teleop_turtle 노드에서 얼마나 자주 /turtle1/cmd_vel 토픽을 발행하는지에 따라 달라질 수 있다.&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1639895466723&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ ros2 topic hz /turtle1/cmd_vel
average rate: 33.212
min: 0.029s max: 0.089s std dev: 0.00126s window: 2483
(생략)&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;토픽 지연시간 확인 (ros2 topic delay)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;토픽은 RMW 및 네트워크 장비를 거치기 때문에 latency 즉 지연 시간이 반드시 존재하게 된다. 이 지연 시간을 체크하는 방식으로 유저가 직접 코드로 구현하는 방법도 있겠지만 메시지내에 header[6]라는 stamp 메시지를 사용하고 있다면 `ros2 topic delay`를 명령어를 이용하여 메시지는 발행한 시간과 구독한 시간의 차를 계산하여 지연 시간을 확인할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1639895530398&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ ros2 topic delay /TOPIC_NAME
average delay: xxx.xxx
min: xxx.xxxs max: xxx.xxxs std dev: xxx.xxxs window: 10​&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;토픽 퍼블리시 (ros2 topic pub)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;토픽의 발행(publish)은 ROS 프로그램에 내장하는게 기본이다. 이는 ROS 프로그래밍 시간에 다루도록 하고 여기서는 `ros2 topic pub` 명령어를 통해 간단히 토픽을 발행하는 테스트를 해보자. 이 명령어의 사용은 다음과 같다. `ros2 topic pub` 명령어에 토픽 이름, 토픽 메시지 타입, 메시지 내용을 기술하면 된다.&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&amp;nbsp;ros2 topic pub &amp;lt;topic_name&amp;gt; &amp;lt;msg_type&amp;gt; &quot;&amp;lt;args&amp;gt;&quot;&lt;/blockquote&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;즉, 아래와 같이 기술하면 되는데 아래 명령어를 풀어 해석하자면 `--once` 옵션을 사용하여 단 한번의 발행만을 수행하도록 하였으며, 토픽 이름으로는 /turtle1/cmd_vel 을 사용하였고, 토픽 메시지 타입은 geometry_msgs/msg/Twist 을 사용하였다. 메시지 내용으로는 병진 속도 linear.x 값으로 2.0 m/s를 넣었고, 회전 속도 angular.z 값으로 1.8 rad/s를 입력하였다.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1639896036098&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ ros2 topic pub --once /turtle1/cmd_vel geometry_msgs/msg/Twist &quot;{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 1.8}}&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;지속적인 발행을 원한다면 `--once` 옵션 제거하고 대신 `--rate 1` 옵션처럼 주기 1Hz의 발행도 할 수 있다. 이를 사용하면 그림 9와 같이 동작할 것이다.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1639896061404&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ ros2 topic pub --rate 1 /turtle1/cmd_vel geometry_msgs/msg/Twist &quot;{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 1.8}}&quot;​&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;bag 기록 (ros2 bag record)&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;p id=&quot;SE-5090136d-91ef-4e0d-9270-46941b52cc69&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;ROS에는 발행하는 토픽을 파일 형태로 저장하고 필요할 때 저장된 토픽을 다시 불러와 동일 타이밍으로 재생할 수 있는 기능이 있다. 이를 rosbag이라고 한다. 이는 매우 유용한 ROS의 기능으로 디버깅에 큰 도움을 준다. &lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-e81e901e-16aa-4d88-8056-d68deeadef46&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-a82df993-72e0-4ba7-ac0c-77ac2dd5f1dc&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;예를 들어 내가 SLAM 알고리즘을 개발한다면 알고리즘 개발에 집중하기 위해서는 SLAM에 필요한 라이다와 같은 센서 정보와 로봇의 위치 정보인 오도메트리와 같은 상태 정보가 필요한데 매번 로봇을 구동시켜 데이터를 취득하기도 힘들고 데이터 취득을 매번하여 테스트를 하더라도 센서 정보 및 로봇 상태 값에 따라 결괏값이 상이해져 알고리즘이 좋아진 것인지 테스트할 때 운이 좋게 센서 및 로봇 상태 값이 좋았는지 구분하기 어렵다. 이럴 때에는 알고리즘의 입력 값을 고정하고 반복하여 테스트할 수 있다면 알고리즘만의 개선 작업 및 성능 검증 테스트를 할 수 있게 된다. rosbag은 이러한 상황에서 원하는 토픽을 기록하고 재생하는 도구이다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-73dd2b17-0ffa-4f88-aef2-dcdf102ef463&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;rosbag은 다음과 같이 bag 기록 (ros2 bag record) 명령어에 내가 기록하고자 하는 토픽 이름을 기재하면 된다. 예를 들어 /turtle1/cmd_vel 토픽을 기록하려면 다음 명령어와 같이 실행해주면 된다. 기록 종료는 프로그램을 종료하면 되는데 일반적인 노드 종료와 마찬가지로 해당 터미널 창에서 `Ctrl + c`를 눌러주면 된다. 기록이 종료되면 `rosbag2_2020_09_04-08_31_06` 이라는 이름으로 폴더가 생성된다. 참고로 원하는 이름이 별도로 있다면 `ros2 bag record -o &lt;/span&gt;&lt;span&gt;&lt;b&gt;이름&lt;/b&gt;&lt;/span&gt;&lt;span&gt; /turtle1/cmd_vel` 과 같이 `-o` (output) 옵션을 이용하여 특정 이름을 지정해도 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div id=&quot;SE-f47b0b80-c9c4-4253-adc0-410365843598&quot;&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;ros2 bag record &amp;lt;topic_name1&amp;gt; &amp;lt;topic_name2&amp;gt; &amp;lt;topic_name3&amp;gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1639896404615&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ ros2 bag record /turtle1/cmd_vel
[INFO]: Opened database 'rosbag2_2020_09_04-08_31_06'.
[INFO]: Listening for topics...
[INFO]: Subscribed to topic '/turtle1/cmd_vel'&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;bag 정보 (ros2 bag info)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;저장된 rosbag 파일의 정보를 확인하려면 아래 예제와 같이 bag 정보 (ros2 bag info) 명령어를 이용하면 된다. 내용을 살펴보면 방금 전 우리가 기록한 이 rosbag 파일은 84.4 KiB 크기에 31.602s 시간 동안 기록되었고, 기록이 언제 시작되고 언제 끝났는지 타임스태프와 취득한 토픽의 이름 메시지 형태 메시지 별 갯수와 총 갯수 등이 기록되어 있다.&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1639896492778&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ ros2 bag info rosbag2_2020_09_04-08_31_06/

Files:             rosbag2_2020_09_04-08_31_06.db3
Bag size:          84.4 KiB
Storage id:        sqlite3
Duration:          31.602s
Start:             Sep  4 2020 08:31:09.952 (1599175869.952)
End                Sep  4 2020 08:31:41.554 (1599175901.554)
Messages:          355
Topic information: Topic: /turtle1/cmd_vel | Type: geometry_msgs/msg/Twist | Count: 355 | Serialization Format: cdr&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;bag 재생 (ros2 bag play)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;rosbag 파일을 기록하고 정보를 확인해봤으니 이제는 재생을 해보자. 일단 turtlesim 노드를 종료한 후 다시 시작하여 초기화를 해준 후 아래의 예제처럼 rosbag를 재생하면 기록 시간 타이밍에 따라 토픽이 재생됨을 확인할 수 있다. 이는 위에서 설명한 `ros2 topic echo /turtle1/cmd_vel` 명령어를 이용하여 터미널 창에서 학인해도 되고, 그림 11와 같이 turtlesim 노드위의 거북이의 움직임을 비교해도 된다.&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1639896564297&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ ros2 bag play rosbag2_2020_09_04-08_31_06/
[INFO]: Opened database 'rosbag2_2020_09_04-08_31_06/'.&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;[출처] &lt;a href=&quot;https://cafe.naver.com/openrt/24101&quot;&gt;009 ROS 2 토픽 (topic) (오픈소스 소프트웨어 &amp;amp; 하드웨어: 로봇 기술 공유 카페 (오로카))&lt;/a&gt; | 작성자 &lt;a href=&quot;https://cafe.naver.com/openrt.cafe?iframe_url=%2Fca-fe%2Fcafes%2F25572101%2Fmembers%2FBYP3EQTyF498tje8XzmemQ&quot;&gt;표윤석&lt;/a&gt;&lt;/div&gt;</description>
      <category>Coding/Robot Operating System</category>
      <category>Ros</category>
      <category>ros topic</category>
      <category>ros 토픽</category>
      <category>ros 파이썬</category>
      <category>ROS2</category>
      <category>ros2 topic</category>
      <category>ros2 파이썬</category>
      <category>rosbag</category>
      <category>rosbag play</category>
      <category>rosbag record</category>
      <author>세미531</author>
      <guid isPermaLink="true">https://semi531.tistory.com/94</guid>
      <comments>https://semi531.tistory.com/94#entry94comment</comments>
      <pubDate>Sun, 19 Dec 2021 15:51:41 +0900</pubDate>
    </item>
    <item>
      <title>Personal 개발환경 세팅</title>
      <link>https://semi531.tistory.com/93</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;새롭게 노트북을 구매하면서 이참에 정리해놓으면 좋을 것 같아 새롭게 개인적인 개발환경 세팅 및 유용하게 사용하는 프로그램들의 링크를 첨부하려 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cpu : intel i7 11gen gpu : nvidia mx450&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;&lt;a href=&quot;https://wnw1005.tistory.com/477&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://wnw1005.tistory.com/477&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1636522533807&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;Windows 10 - Linux(Ubuntu) 멀티부팅(듀얼부팅) 시스템 구축&quot; data-og-description=&quot;[관련 게시물] 2020/11/16 - [서버 운영/버추얼박스(VirtualBox)] - 버추얼박스 가상머신에 Windows 10 설치 미디어 iso 이미지 파일 등록 2020/11/18 - [윈도 10] - Windows 10 설치(+ 버추얼박스 가상머신) 2020..&quot; data-og-host=&quot;wnw1005.tistory.com&quot; data-og-source-url=&quot;https://wnw1005.tistory.com/477&quot; data-og-url=&quot;https://wnw1005.tistory.com/477&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dIDaGL/hyMihHV8GO/vI7OIoRQWLtMSdkKDxz780/img.png?width=800&amp;amp;height=433&amp;amp;face=0_0_800_433,https://scrap.kakaocdn.net/dn/bTLc73/hyMigWxpNJ/xaNkvlH6LSkgEeUe2b5sgK/img.png?width=800&amp;amp;height=433&amp;amp;face=0_0_800_433,https://scrap.kakaocdn.net/dn/cXB7Dx/hyMh8KZ3WV/uYAkFoYiH2BmQJdpIL7pN0/img.png?width=1026&amp;amp;height=770&amp;amp;face=0_0_1026_770&quot;&gt;&lt;a href=&quot;https://wnw1005.tistory.com/477&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://wnw1005.tistory.com/477&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dIDaGL/hyMihHV8GO/vI7OIoRQWLtMSdkKDxz780/img.png?width=800&amp;amp;height=433&amp;amp;face=0_0_800_433,https://scrap.kakaocdn.net/dn/bTLc73/hyMigWxpNJ/xaNkvlH6LSkgEeUe2b5sgK/img.png?width=800&amp;amp;height=433&amp;amp;face=0_0_800_433,https://scrap.kakaocdn.net/dn/cXB7Dx/hyMh8KZ3WV/uYAkFoYiH2BmQJdpIL7pN0/img.png?width=1026&amp;amp;height=770&amp;amp;face=0_0_1026_770');&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;Windows 10 - Linux(Ubuntu) 멀티부팅(듀얼부팅) 시스템 구축&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;[관련 게시물] 2020/11/16 - [서버 운영/버추얼박스(VirtualBox)] - 버추얼박스 가상머신에 Windows 10 설치 미디어 iso 이미지 파일 등록 2020/11/18 - [윈도 10] - Windows 10 설치(+ 버추얼박스 가상머신) 2020..&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;wnw1005.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 블로그의 글을 참고하면 좋을 것 같다. 또한 이를 위한 부팅 usb 만드는 법은&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://wnw1005.tistory.com/367&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://wnw1005.tistory.com/367&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1636522576330&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;Rufus로 부팅 가능한 USB 디스크 만들기 - 예시 : 우분투(Ubuntu) 20.04&quot; data-og-description=&quot;[관련 게시물] 우분투(Ubuntu) 20.04 LTS Focal Fossa 관련 연재 2020/04/07 - [리눅스/Ubuntu] - 우분투(Ubuntu) 20.04 LTS Focal Fossa 릴리스 노트(ReleaseNotes) 2020/04/11 - [리눅스/Ubuntu] - 우분투(Ubunt..&quot; data-og-host=&quot;wnw1005.tistory.com&quot; data-og-source-url=&quot;https://wnw1005.tistory.com/367&quot; data-og-url=&quot;https://wnw1005.tistory.com/367&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/uSG4T/hyMjzNJDLG/XAbnZQjqCWEB3Th0yWfKG0/img.png?width=800&amp;amp;height=555&amp;amp;face=0_0_800_555,https://scrap.kakaocdn.net/dn/bpWbbP/hyMjCcBUWn/ViDLiFhv8R2V9KUpI52Euk/img.png?width=800&amp;amp;height=555&amp;amp;face=0_0_800_555,https://scrap.kakaocdn.net/dn/bC4mPa/hyMifpLUA2/EYj9eqLfLCecasbNNANZj1/img.png?width=1320&amp;amp;height=977&amp;amp;face=0_0_1320_977&quot;&gt;&lt;a href=&quot;https://wnw1005.tistory.com/367&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://wnw1005.tistory.com/367&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/uSG4T/hyMjzNJDLG/XAbnZQjqCWEB3Th0yWfKG0/img.png?width=800&amp;amp;height=555&amp;amp;face=0_0_800_555,https://scrap.kakaocdn.net/dn/bpWbbP/hyMjCcBUWn/ViDLiFhv8R2V9KUpI52Euk/img.png?width=800&amp;amp;height=555&amp;amp;face=0_0_800_555,https://scrap.kakaocdn.net/dn/bC4mPa/hyMifpLUA2/EYj9eqLfLCecasbNNANZj1/img.png?width=1320&amp;amp;height=977&amp;amp;face=0_0_1320_977');&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 디스크 만들기 - 예시 : 우분투(Ubuntu) 20.04&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;[관련 게시물] 우분투(Ubuntu) 20.04 LTS Focal Fossa 관련 연재 2020/04/07 - [리눅스/Ubuntu] - 우분투(Ubuntu) 20.04 LTS Focal Fossa 릴리스 노트(ReleaseNotes) 2020/04/11 - [리눅스/Ubuntu] - 우분투(Ubunt..&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;wnw1005.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기를 참고하자. 또한 우분투 설치 이후 ros2 를 설치한다음 bash 설정에 관련해서는 아래의 블로그를 참고하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&amp;amp;blogId=evella&amp;amp;logNo=220033323595&quot;&gt;https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&amp;amp;blogId=evella&amp;amp;logNo=220033323595&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1636522640695&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;[Turtlebot2/ROS] bash: /opt/ros/groovy/setup.bash: No such file or directory 에러 해결&quot; data-og-description=&quot;bash: /opt/ros/groovy/setup.bash: No such file or directory 에러 발생 &amp;gt;&amp;gt; ROS hydro를 깔고 ...&quot; data-og-host=&quot;blog.naver.com&quot; data-og-source-url=&quot;https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&amp;amp;blogId=evella&amp;amp;logNo=220033323595&quot; data-og-url=&quot;https://blog.naver.com/evella/220033323595&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cjKMt7/hyMjvYRhf3/hmhZ8B8YsjNBgpUepYdQu1/img.png?width=270&amp;amp;height=270&amp;amp;face=0_0_270_270&quot;&gt;&lt;a href=&quot;https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&amp;amp;blogId=evella&amp;amp;logNo=220033323595&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&amp;amp;blogId=evella&amp;amp;logNo=220033323595&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cjKMt7/hyMjvYRhf3/hmhZ8B8YsjNBgpUepYdQu1/img.png?width=270&amp;amp;height=270&amp;amp;face=0_0_270_270');&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;[Turtlebot2/ROS] bash: /opt/ros/groovy/setup.bash: No such file or directory 에러 해결&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;bash: /opt/ros/groovy/setup.bash: No such file or directory 에러 발생 &amp;gt;&amp;gt; ROS hydro를 깔고 ...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;blog.naver.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;일단 기본적으로 vscode 를 윈도우, 우분투 둘 다 사용하므로 아래 링크로 들어가 설치하면 된다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://code.visualstudio.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://code.visualstudio.com/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1636522733532&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;Visual Studio Code - Code Editing. Redefined&quot; data-og-description=&quot;Visual Studio Code is a code editor redefined and optimized for building and debugging modern web and cloud applications.&amp;nbsp; Visual Studio Code is free and available on your favorite platform - Linux, macOS, and Windows.&quot; data-og-host=&quot;code.visualstudio.com&quot; data-og-source-url=&quot;https://code.visualstudio.com/&quot; data-og-url=&quot;https://code.visualstudio.com/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/zk2zh/hyMibHGbyR/7GIOaHBop0WKouhpWyKSOK/img.png?width=1012&amp;amp;height=506&amp;amp;face=0_0_1012_506&quot;&gt;&lt;a href=&quot;https://code.visualstudio.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://code.visualstudio.com/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/zk2zh/hyMibHGbyR/7GIOaHBop0WKouhpWyKSOK/img.png?width=1012&amp;amp;height=506&amp;amp;face=0_0_1012_506');&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;Visual Studio Code - Code Editing. Redefined&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Visual Studio Code is a code editor redefined and optimized for building and debugging modern web and cloud applications.&amp;nbsp; Visual Studio Code is free and available on your favorite platform - Linux, macOS, and Windows.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;code.visualstudio.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추가로 개인적으로 pycharm 을 사용해볼까 하고 있어서 윈도우에서는 pycharm을 설치해볼 예정이다. pycharm의 다운 링크는 아래와 같고 학생계정을 등록하면 프로버전을 사용할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.jetbrains.com/ko-kr/pycharm/download/#section=windows&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.jetbrains.com/ko-kr/pycharm/download/#section=windows&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1636522816173&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;다운로드 PyCharm: JetBrains가 만든 전문 개발자용 Python IDE&quot; data-og-description=&quot;&quot; data-og-host=&quot;www.jetbrains.com&quot; data-og-source-url=&quot;https://www.jetbrains.com/ko-kr/pycharm/download/#section=windows&quot; data-og-url=&quot;https://www.jetbrains.com/ko-kr/pycharm/download/#section=windows&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://www.jetbrains.com/ko-kr/pycharm/download/#section=windows&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.jetbrains.com/ko-kr/pycharm/download/#section=windows&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;다운로드 PyCharm: JetBrains가 만든 전문 개발자용 Python IDE&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.jetbrains.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추가로 윈도우에서 c, cpp 를 위해 visualstudio를 설치해야 하므로 아래에서 설치하면 된다. 설치 이후에는 c,cpp에 관련된 추가설치 파일들을 선택해서 설치해주면 된다. 나중에 추가로 설치 혹은 제거할 수 있으므로 굳이 걱정안해도 된다. 파이썬 모듈들은 비주얼스튜디오에서는 설치하지 말자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://visualstudio.microsoft.com/ko/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://visualstudio.microsoft.com/ko/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1636522939486&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;Visual Studio: 소프트웨어 개발자 및 Teams용 IDE 및 코드 편집기&quot; data-og-description=&quot;Visual Studio 개발 도구 및 서비스를 사용하면 모든 개발자가 모든 플랫폼 및 언어로 앱을 쉽게 개발할 수 있습니다. 무료로 어디서나 코드 편집기 또는 IDE를 사용하여 개발하세요.&quot; data-og-host=&quot;visualstudio.microsoft.com&quot; data-og-source-url=&quot;https://visualstudio.microsoft.com/ko/&quot; data-og-url=&quot;https://visualstudio.microsoft.com/ko/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bQBjBF/hyMjAy6vWt/xPrqLtH5YBlUvLTMgCsfC0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/bkj0O7/hyMigPMjQy/GGKcF3RPQw8CluDqIDD1YK/img.png?width=1024&amp;amp;height=512&amp;amp;face=0_0_1024_512&quot;&gt;&lt;a href=&quot;https://visualstudio.microsoft.com/ko/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://visualstudio.microsoft.com/ko/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bQBjBF/hyMjAy6vWt/xPrqLtH5YBlUvLTMgCsfC0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/bkj0O7/hyMigPMjQy/GGKcF3RPQw8CluDqIDD1YK/img.png?width=1024&amp;amp;height=512&amp;amp;face=0_0_1024_512');&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;Visual Studio: 소프트웨어 개발자 및 Teams용 IDE 및 코드 편집기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Visual Studio 개발 도구 및 서비스를 사용하면 모든 개발자가 모든 플랫폼 및 언어로 앱을 쉽게 개발할 수 있습니다. 무료로 어디서나 코드 편집기 또는 IDE를 사용하여 개발하세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;visualstudio.microsoft.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 우분투 부팅usb 를 만들 때 iso 파일을 받아야 하므로 현재 20.04 버전을 사용하고 있지만 다른 버전도 설치 가능하다. &lt;a href=&quot;https://ubuntu.com/?_ga=2.241488708.793921432.1625851452-871045856.1625851452&quot;&gt;https://ubuntu.com/?_ga=2.241488708.793921432.1625851452-871045856.1625851452&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1636523016978&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;Enterprise Open Source and Linux | Ubuntu&quot; data-og-description=&quot;Ubuntu is the modern, open source operating system on Linux for the enterprise server, desktop, cloud, and IoT.&quot; data-og-host=&quot;ubuntu.com&quot; data-og-source-url=&quot;https://ubuntu.com/?_ga=2.241488708.793921432.1625851452-871045856.1625851452&quot; data-og-url=&quot;https://ubuntu.com/?_ga=2.241488708.793921432.1625851452-871045856.1625851452&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bVNk6C/hyMh6flKcs/5mmxUplOtAEkW7Uoax3W01/img.jpg?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/bghsDF/hyMh7L5mdW/JLI9KNCG31f9FoGTw9poU1/img.jpg?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://ubuntu.com/?_ga=2.241488708.793921432.1625851452-871045856.1625851452&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://ubuntu.com/?_ga=2.241488708.793921432.1625851452-871045856.1625851452&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bVNk6C/hyMh6flKcs/5mmxUplOtAEkW7Uoax3W01/img.jpg?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/bghsDF/hyMh7L5mdW/JLI9KNCG31f9FoGTw9poU1/img.jpg?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&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;Enterprise Open Source and Linux | Ubuntu&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Ubuntu is the modern, open source operating system on Linux for the enterprise server, desktop, cloud, and IoT.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;ubuntu.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 우분투에서 설치할 프로그램은 우분투 내의 소프트웨어 다운하는 곳에 terminator 라고 검색해서 나오는 터미널 창을 다운받으면 된다. 유용하게 사용 가능하다. 또한 위에서 말했듯이 vscode 도 설치하고 윈도우와 우분투 모두 discord 와 notion 을 설치하면 좋다. discord 는 팀원들과 소통할 때 사용하고 노션은 개인적인 메모를 사용하기 위해 설치한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://discord.com/download&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://discord.com/download&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1636523265624&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 Discord to Talk, Chat, and Hang Out&quot; data-og-description=&quot;Download the best app to communicate over video, voice, or text. Available for Windows, macOS, Linux, iOS, and Android devices.&quot; data-og-host=&quot;discord.com&quot; data-og-source-url=&quot;https://discord.com/download&quot; data-og-url=&quot;https://discord.com/download&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/0v5Ft/hyMidS5iKf/MOutLOHedfxjOFSSx1Km7K/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/Ognpe/hyMiifMKYS/wjZDyZPHpK7JfxUqqXzOfk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://discord.com/download&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://discord.com/download&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/0v5Ft/hyMidS5iKf/MOutLOHedfxjOFSSx1Km7K/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/Ognpe/hyMiifMKYS/wjZDyZPHpK7JfxUqqXzOfk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&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 Discord to Talk, Chat, and Hang Out&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Download the best app to communicate over video, voice, or text. Available for Windows, macOS, Linux, iOS, and Android devices.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;discord.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;노션은 회원가입할 때 대학교 계정으로 가입해야 무료로 많은 용량, 기능으로 사용가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.notion.so/ko-kr/product?utm_source=google&amp;amp;utm_campaign=10805039169&amp;amp;utm_medium=104440699817&amp;amp;utm_content=455555244419&amp;amp;utm_term=%EB%85%B8%EC%85%98&amp;amp;targetid=aud-842121736050:kwd-827502875973&amp;amp;gclid=CjwKCAiA1aiMBhAUEiwACw25MRjHqjoqfPQfUTq-pluqO4uqyXMMPcddKJ055LZPKVEWBONsbs-8ihoC_BoQAvD_BwE&quot;&gt;https://www.notion.so/ko-kr/product?utm_source=google&amp;amp;utm_campaign=10805039169&amp;amp;utm_medium=104440699817&amp;amp;utm_content=455555244419&amp;amp;utm_term=%EB%85%B8%EC%85%98&amp;amp;targetid=aud-842121736050:kwd-827502875973&amp;amp;gclid=CjwKCAiA1aiMBhAUEiwACw25MRjHqjoqfPQfUTq-pluqO4uqyXMMPcddKJ055LZPKVEWBONsbs-8ihoC_BoQAvD_BwE&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1636523312743&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;Notion &amp;ndash; 메모, 작업, 위키, 데이터베이스를 위한 올인원 워크스페이스&quot; data-og-description=&quot;매일 쓰는 여러 업무용 앱을 하나로 합친 새로운 도구. 당신과 당신의 팀을 위한 올인원 워크스페이스예요.&quot; data-og-host=&quot;www.notion.so&quot; data-og-source-url=&quot;https://www.notion.so/ko-kr/product?utm_source=google&amp;amp;utm_campaign=10805039169&amp;amp;utm_medium=104440699817&amp;amp;utm_content=455555244419&amp;amp;utm_term=%EB%85%B8%EC%85%98&amp;amp;targetid=aud-842121736050:kwd-827502875973&amp;amp;gclid=CjwKCAiA1aiMBhAUEiwACw25MRjHqjoqfPQfUTq-pluqO4uqyXMMPcddKJ055LZPKVEWBONsbs-8ihoC_BoQAvD_BwE&quot; data-og-url=&quot;https://www.notion.so/ko-kr/product&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bcFzFs/hyMjrIVD1M/mq4aZPKNhBixXqCp5NLjQ1/img.png?width=1200&amp;amp;height=630&amp;amp;face=907_290_1002_395,https://scrap.kakaocdn.net/dn/GINRj/hyMju6IIJ2/C66tEkPumjvIRcl11oJUmK/img.png?width=1200&amp;amp;height=630&amp;amp;face=907_290_1002_395&quot;&gt;&lt;a href=&quot;https://www.notion.so/ko-kr/product?utm_source=google&amp;amp;utm_campaign=10805039169&amp;amp;utm_medium=104440699817&amp;amp;utm_content=455555244419&amp;amp;utm_term=%EB%85%B8%EC%85%98&amp;amp;targetid=aud-842121736050:kwd-827502875973&amp;amp;gclid=CjwKCAiA1aiMBhAUEiwACw25MRjHqjoqfPQfUTq-pluqO4uqyXMMPcddKJ055LZPKVEWBONsbs-8ihoC_BoQAvD_BwE&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.notion.so/ko-kr/product?utm_source=google&amp;amp;utm_campaign=10805039169&amp;amp;utm_medium=104440699817&amp;amp;utm_content=455555244419&amp;amp;utm_term=%EB%85%B8%EC%85%98&amp;amp;targetid=aud-842121736050:kwd-827502875973&amp;amp;gclid=CjwKCAiA1aiMBhAUEiwACw25MRjHqjoqfPQfUTq-pluqO4uqyXMMPcddKJ055LZPKVEWBONsbs-8ihoC_BoQAvD_BwE&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bcFzFs/hyMjrIVD1M/mq4aZPKNhBixXqCp5NLjQ1/img.png?width=1200&amp;amp;height=630&amp;amp;face=907_290_1002_395,https://scrap.kakaocdn.net/dn/GINRj/hyMju6IIJ2/C66tEkPumjvIRcl11oJUmK/img.png?width=1200&amp;amp;height=630&amp;amp;face=907_290_1002_395');&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;Notion &amp;ndash; 메모, 작업, 위키, 데이터베이스를 위한 올인원 워크스페이스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;매일 쓰는 여러 업무용 앱을 하나로 합친 새로운 도구. 당신과 당신의 팀을 위한 올인원 워크스페이스예요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.notion.so&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://blog.naver.com/chandong83/222128977072&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://blog.naver.com/chandong83/222128977072&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1636523501016&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;파이썬(Python) - 아나콘다(Anaconda) 설치하기 - 윈도우편&quot; data-og-description=&quot;파이썬(Python) 아나콘다(Anaconda) 설치하기 - 윈도우편 주로 VSCode로 통일해 개발하다 보니 아나콘...&quot; data-og-host=&quot;blog.naver.com&quot; data-og-source-url=&quot;https://blog.naver.com/chandong83/222128977072&quot; data-og-url=&quot;https://blog.naver.com/chandong83/222128977072&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dmcC9e/hyMh9b4n1R/k6zoJ2ArCcmhjDcKHMqIdk/img.png?width=743&amp;amp;height=548&amp;amp;face=0_0_743_548&quot;&gt;&lt;a href=&quot;https://blog.naver.com/chandong83/222128977072&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://blog.naver.com/chandong83/222128977072&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dmcC9e/hyMh9b4n1R/k6zoJ2ArCcmhjDcKHMqIdk/img.png?width=743&amp;amp;height=548&amp;amp;face=0_0_743_548');&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;파이썬(Python) - 아나콘다(Anaconda) 설치하기 - 윈도우편&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;파이썬(Python) 아나콘다(Anaconda) 설치하기 - 윈도우편 주로 VSCode로 통일해 개발하다 보니 아나콘...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;blog.naver.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 우분투에서 ros2 설치 및 튜토리얼은 표윤석 박사님의 ros2 로 시작하는 로봇 프로그래밍이라는 책을 참고하였다. 정말 잘 나온 책이니 꼭 공부하자.&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;그리고 잘은 사용하지 않지만 AutoCad 도 설치한다. 이건 윈도우에만 설치하고 개인적인 사용이다.&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.autodesk.co.kr/products/autocad/overview&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.autodesk.co.kr/products/autocad/overview&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1636523683390&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;AutoCAD | 오토캐드 2022 가격 및 구입 | Autodesk&amp;nbsp;&quot; data-og-description=&quot;AutoCAD를 사용하여 정밀한 2D 및 3D 캐드 도면을 작성할 수 있습니다. 공식 Autodesk 스토어나 공인협력업체에서 AutoCAD 서브스크립션을 구매하십시오.&quot; data-og-host=&quot;www.autodesk.co.kr&quot; data-og-source-url=&quot;https://www.autodesk.co.kr/products/autocad/overview&quot; data-og-url=&quot;https://www.autodesk.co.kr/products/autocad/overview&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://www.autodesk.co.kr/products/autocad/overview&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.autodesk.co.kr/products/autocad/overview&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;AutoCAD | 오토캐드 2022 가격 및 구입 | Autodesk&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;AutoCAD를 사용하여 정밀한 2D 및 3D 캐드 도면을 작성할 수 있습니다. 공식 Autodesk 스토어나 공인협력업체에서 AutoCAD 서브스크립션을 구매하십시오.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.autodesk.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매트랩도 전공에서 종종 사용해서 이것도 윈도우만에 설치.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://kr.mathworks.com/products/matlab/student.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://kr.mathworks.com/products/matlab/student.html&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1636523719338&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;MATLAB for Students&quot; data-og-description=&quot;Use MATLAB to analyze data for homework, conduct research, and develop programming skills that prepare you for your future career.&quot; data-og-host=&quot;kr.mathworks.com&quot; data-og-source-url=&quot;https://kr.mathworks.com/products/matlab/student.html&quot; data-og-url=&quot;https://kr.mathworks.com/products/matlab/student.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://kr.mathworks.com/products/matlab/student.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://kr.mathworks.com/products/matlab/student.html&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;MATLAB for Students&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Use MATLAB to analyze data for homework, conduct research, and develop programming skills that prepare you for your future career.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;kr.mathworks.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 우분투, 윈도우 둘 다 브라우저로 네이버 웨일을 사용한다. 개인적으로 네이버를 많이 사용해서 편하다. 특히 이메일 확인할 때&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://whale.naver.com/ko/download/win/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://whale.naver.com/ko/download/win/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1636523783042&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;네이버 웨일 브라우저&quot; data-og-description=&quot;일상을 여는 새로운 시작 네이버 웨일&quot; data-og-host=&quot;whale.naver.com&quot; data-og-source-url=&quot;https://whale.naver.com/ko/download/win/&quot; data-og-url=&quot;https://whale.naver.com/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/HeeRQ/hyMjxCobtX/DUrbrgKLkxvgdzZ7XRw55K/img.png?width=1200&amp;amp;height=1200&amp;amp;face=0_0_1200_1200&quot;&gt;&lt;a href=&quot;https://whale.naver.com/ko/download/win/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://whale.naver.com/ko/download/win/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/HeeRQ/hyMjxCobtX/DUrbrgKLkxvgdzZ7XRw55K/img.png?width=1200&amp;amp;height=1200&amp;amp;face=0_0_1200_1200');&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;네이버 웨일 브라우저&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;일상을 여는 새로운 시작 네이버 웨일&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;whale.naver.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹엑스는 학교 수업 때문에. 윈도우에서만 설치되고 우분투는 크롬확장자로 설치한다. 아래 링크 들어가서 바로 받지 말고 아래로 내려서 이전 프로그램으로 설치해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.webex.com/ko/downloads.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.webex.com/ko/downloads.html&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1636523847858&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;Cisco Webex | Video Conferencing, Webinars, Screen Share, &amp;amp; Conference Call&quot; data-og-description=&quot;Cisco Webex is the leading enterprise solution for video conferencing, webinars, and screen sharing. Web conferencing, online meeting, cloud calling and equipment.&quot; data-og-host=&quot;www.webex.com&quot; data-og-source-url=&quot;https://www.webex.com/ko/downloads.html&quot; data-og-url=&quot;https://www.webex.com/downloads.html&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bOdWJr/hyMh60KgFR/Zh6kowKCZoZDbnZNu4FNIk/img.jpg?width=1200&amp;amp;height=627&amp;amp;face=0_0_1200_627,https://scrap.kakaocdn.net/dn/bVqpeR/hyMiaIO6uo/lIrktCSl9y3HnRt2nNgRek/img.jpg?width=1200&amp;amp;height=627&amp;amp;face=0_0_1200_627&quot;&gt;&lt;a href=&quot;https://www.webex.com/ko/downloads.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.webex.com/ko/downloads.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bOdWJr/hyMh60KgFR/Zh6kowKCZoZDbnZNu4FNIk/img.jpg?width=1200&amp;amp;height=627&amp;amp;face=0_0_1200_627,https://scrap.kakaocdn.net/dn/bVqpeR/hyMiaIO6uo/lIrktCSl9y3HnRt2nNgRek/img.jpg?width=1200&amp;amp;height=627&amp;amp;face=0_0_1200_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;Cisco Webex | Video Conferencing, Webinars, Screen Share, &amp;amp; Conference Call&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Cisco Webex is the leading enterprise solution for video conferencing, webinars, and screen sharing. Web conferencing, online meeting, cloud calling and equipment.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.webex.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;카카오톡도 받아주고, 우분투에서는 안됨. 뭐 할라면 하는 방법은 알지만 비추여서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.kakaocorp.com/page/service/service/KakaoTalk&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.kakaocorp.com/page/service/service/KakaoTalk&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1636523887276&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;사람과 세상을 향한 모든 연결의 시작, 카카오톡&quot; data-og-description=&quot;#메신저 #오픈채팅 #카카오톡 #플랫폼&quot; data-og-host=&quot;www.kakaocorp.com&quot; data-og-source-url=&quot;https://www.kakaocorp.com/page/service/service/KakaoTalk&quot; data-og-url=&quot;https://www.kakaocorp.com/page/service/service/KakaoTalk&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cZfioA/hyMieEqVbV/lszhhPFpnodMWhLiRe3zw0/img.jpg?width=800&amp;amp;height=400&amp;amp;face=0_0_800_400,https://scrap.kakaocdn.net/dn/M8dpV/hyMidMjGKR/A4akLrUbE9lnkNnDd8Jrfk/img.jpg?width=800&amp;amp;height=400&amp;amp;face=0_0_800_400,https://scrap.kakaocdn.net/dn/yCChI/hyMh9iOnnu/6Zw1KZ3ppROrhMhVe7Fwgk/img.png?width=1632&amp;amp;height=918&amp;amp;face=655_229_1323_841&quot;&gt;&lt;a href=&quot;https://www.kakaocorp.com/page/service/service/KakaoTalk&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.kakaocorp.com/page/service/service/KakaoTalk&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cZfioA/hyMieEqVbV/lszhhPFpnodMWhLiRe3zw0/img.jpg?width=800&amp;amp;height=400&amp;amp;face=0_0_800_400,https://scrap.kakaocdn.net/dn/M8dpV/hyMidMjGKR/A4akLrUbE9lnkNnDd8Jrfk/img.jpg?width=800&amp;amp;height=400&amp;amp;face=0_0_800_400,https://scrap.kakaocdn.net/dn/yCChI/hyMh9iOnnu/6Zw1KZ3ppROrhMhVe7Fwgk/img.png?width=1632&amp;amp;height=918&amp;amp;face=655_229_1323_841');&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;사람과 세상을 향한 모든 연결의 시작, 카카오톡&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;#메신저 #오픈채팅 #카카오톡 #플랫폼&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.kakaocorp.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 소통 툴로 slack 도 사용한다. 이 프로그램도 많이 사용하는듯. 윈도우에서만 쓰고 있었는데 우분투는 되는지 잘 모르겠다. 우분투에서는 쓸일도 별로 없고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://slack.com/intl/ko-kr/downloads/windows&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://slack.com/intl/ko-kr/downloads/windows&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1636523944616&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;Windows | 다운로드&quot; data-og-description=&quot;모바일 기기나 데스크톱에 Slack을 무료로 다운로드하세요. iOS, Android, Mac, Windows 및 Linux용 앱으로 대화를 이어나가세요.&quot; data-og-host=&quot;slack.com&quot; data-og-source-url=&quot;https://slack.com/intl/ko-kr/downloads/windows&quot; data-og-url=&quot;https://slack.com/intl/ko-kr/downloads/windows&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/g9Rpa/hyMigI011X/6rkafC10QfTrFkAophxRNk/img.png?width=256&amp;amp;height=256&amp;amp;face=0_0_256_256,https://scrap.kakaocdn.net/dn/FiCqo/hyMjqcckE0/FlMaKqJtqDCkMObP1UJc1K/img.png?width=256&amp;amp;height=256&amp;amp;face=0_0_256_256&quot;&gt;&lt;a href=&quot;https://slack.com/intl/ko-kr/downloads/windows&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://slack.com/intl/ko-kr/downloads/windows&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/g9Rpa/hyMigI011X/6rkafC10QfTrFkAophxRNk/img.png?width=256&amp;amp;height=256&amp;amp;face=0_0_256_256,https://scrap.kakaocdn.net/dn/FiCqo/hyMjqcckE0/FlMaKqJtqDCkMObP1UJc1K/img.png?width=256&amp;amp;height=256&amp;amp;face=0_0_256_256');&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;Windows | 다운로드&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;모바일 기기나 데스크톱에 Slack을 무료로 다운로드하세요. iOS, Android, Mac, Windows 및 Linux용 앱으로 대화를 이어나가세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;slack.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추가로 윈도우에서는 msoffice(ppt, excel, words) 랑 한글도 설치해주고&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우분투에서 HDmap 때문에 QGIS 도 설치하고 추가 툴도 설치해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://qgis.org/ko/site/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://qgis.org/ko/site/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1636524137158&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;QGIS 프로젝트에 오신 것을 환영합니다!&quot; data-og-description=&quot;여러분의 GIS 작업에 QGIS를 사용해 보세요.&quot; data-og-host=&quot;qgis.org&quot; data-og-source-url=&quot;https://qgis.org/ko/site/&quot; data-og-url=&quot;https://qgis.org/ko/site/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://qgis.org/ko/site/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://qgis.org/ko/site/&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;QGIS 프로젝트에 오신 것을 환영합니다!&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;여러분의 GIS 작업에 QGIS를 사용해 보세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;qgis.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://leelisp.tistory.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://leelisp.tistory.com/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1636524160090&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;LEE Lisp&quot; data-og-description=&quot;건축 설계 캐드 프로그램 LEE LISP 입니다. 오토캐드(AutoCAD)와 지스타캐드(GstarCAD)에서 실행가능하고 ZWCAD,BricsCAD 등 개발예정입니다.&quot; data-og-host=&quot;leelisp.tistory.com&quot; data-og-source-url=&quot;https://leelisp.tistory.com/&quot; data-og-url=&quot;https://leelisp.tistory.com&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bMWR8J/hyMibOs1Hj/KgR7y54AJMMmPkG6sSHiSK/img.jpg?width=580&amp;amp;height=580&amp;amp;face=0_0_580_580,https://scrap.kakaocdn.net/dn/djXYDB/hyMidlcETT/8gXC4FU6dvQhH3othsrj41/img.jpg?width=580&amp;amp;height=580&amp;amp;face=0_0_580_580,https://scrap.kakaocdn.net/dn/dO9cQa/hyMidFyikU/xyLIzr7PwunzjgbwOBiL80/img.png?width=640&amp;amp;height=400&amp;amp;face=0_0_640_400&quot;&gt;&lt;a href=&quot;https://leelisp.tistory.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://leelisp.tistory.com/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bMWR8J/hyMibOs1Hj/KgR7y54AJMMmPkG6sSHiSK/img.jpg?width=580&amp;amp;height=580&amp;amp;face=0_0_580_580,https://scrap.kakaocdn.net/dn/djXYDB/hyMidlcETT/8gXC4FU6dvQhH3othsrj41/img.jpg?width=580&amp;amp;height=580&amp;amp;face=0_0_580_580,https://scrap.kakaocdn.net/dn/dO9cQa/hyMidFyikU/xyLIzr7PwunzjgbwOBiL80/img.png?width=640&amp;amp;height=400&amp;amp;face=0_0_640_400');&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;LEE Lisp&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;건축 설계 캐드 프로그램 LEE LISP 입니다. 오토캐드(AutoCAD)와 지스타캐드(GstarCAD)에서 실행가능하고 ZWCAD,BricsCAD 등 개발예정입니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;leelisp.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://blog.naver.com/asby3/222367731790&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://blog.naver.com/asby3/222367731790&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1636524199408&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;[QGIS] 속성 테이블 조인(join)을 이용하여 시도별 코로나 발생 현황 지도 만들기&quot; data-og-description=&quot;곧 GIS 관련 프로젝트가 있어서 그동안 했던 과제들을 복습하는 와중에, 예전에 ArcMap으로 만들었던 ...&quot; data-og-host=&quot;blog.naver.com&quot; data-og-source-url=&quot;https://blog.naver.com/asby3/222367731790&quot; data-og-url=&quot;https://blog.naver.com/asby3/222367731790&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/GZcax/hyMjo6vSji/t1xMlNvSdfFBC02Z5kTi71/img.png?width=743&amp;amp;height=630&amp;amp;face=0_0_743_630&quot;&gt;&lt;a href=&quot;https://blog.naver.com/asby3/222367731790&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://blog.naver.com/asby3/222367731790&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/GZcax/hyMjo6vSji/t1xMlNvSdfFBC02Z5kTi71/img.png?width=743&amp;amp;height=630&amp;amp;face=0_0_743_630');&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;[QGIS] 속성 테이블 조인(join)을 이용하여 시도별 코로나 발생 현황 지도 만들기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;곧 GIS 관련 프로젝트가 있어서 그동안 했던 과제들을 복습하는 와중에, 예전에 ArcMap으로 만들었던 ...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;blog.naver.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&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;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://explore.zoom.us/ko/products/meetings/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://explore.zoom.us/ko/products/meetings/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1636524311529&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;Zoom Meetings: Video Conferencing With Chat | Zoom&quot; data-og-description=&quot;간소화된 엔터프라이즈급 비디오 회의와 실시간 메시징 및 콘텐츠 공유를 데스크톱과 모바일에서 모두 제공.&quot; data-og-host=&quot;explore.zoom.us&quot; data-og-source-url=&quot;https://explore.zoom.us/ko/products/meetings/&quot; data-og-url=&quot;https://explore.zoom.us/ko/products/meetings/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/3afZ7/hyMjBY5zSO/A6WF0nxbvKtRWFjdNsEUSk/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512&quot;&gt;&lt;a href=&quot;https://explore.zoom.us/ko/products/meetings/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://explore.zoom.us/ko/products/meetings/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/3afZ7/hyMjBY5zSO/A6WF0nxbvKtRWFjdNsEUSk/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512');&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;Zoom Meetings: Video Conferencing With Chat | Zoom&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;간소화된 엔터프라이즈급 비디오 회의와 실시간 메시징 및 콘텐츠 공유를 데스크톱과 모바일에서 모두 제공.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;explore.zoom.us&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://snapcamera.snapchat.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://snapcamera.snapchat.com/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1636524327842&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;Snap Camera - Snap Camera&quot; data-og-description=&quot;A new Lens on gaming Choose Lenses that match your play-style, persona, or mood.&quot; data-og-host=&quot;snapcamera.snapchat.com&quot; data-og-source-url=&quot;https://snapcamera.snapchat.com/&quot; data-og-url=&quot;https://snapcamera.snapchat.com/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://snapcamera.snapchat.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://snapcamera.snapchat.com/&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;Snap Camera - Snap Camera&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;A new Lens on gaming Choose Lenses that match your play-style, persona, or mood.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;snapcamera.snapchat.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://slid.cc/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://slid.cc/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1636524357491&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;Slid | Capture knowledge from online videos, courses, and webinars.&quot; data-og-description=&quot;Capture and take notes from videos, build your own knowledge database, share the knowledge anywhere you want.&quot; data-og-host=&quot;slid.cc&quot; data-og-source-url=&quot;https://slid.cc/&quot; data-og-url=&quot;https://slid.cc&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cQio3m/hyMicmkpWc/WxFsbrZ4fW23NzfoX0sdc0/img.png?width=1280&amp;amp;height=800&amp;amp;face=0_0_1280_800&quot;&gt;&lt;a href=&quot;https://slid.cc/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://slid.cc/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cQio3m/hyMicmkpWc/WxFsbrZ4fW23NzfoX0sdc0/img.png?width=1280&amp;amp;height=800&amp;amp;face=0_0_1280_800');&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;Slid | Capture knowledge from online videos, courses, and webinars.&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Capture and take notes from videos, build your own knowledge database, share the knowledge anywhere you want.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;slid.cc&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://dreamsososo.tistory.com/m/193&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://dreamsososo.tistory.com/m/193&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1636844338261&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;[아두이노]아두이노(Arduino) IDE 설치 방법&quot; data-og-description=&quot;아두이노 IDE 설치 방법 따라 하기 아두이노 IDE(통합개발환경) 설치 방법과 간단한 LED 구동하여 테스트하는 방법에 대하여 알려드리겠습니다. 아두이노 란? 아두이노는 마이크로컨트롤러 보드를&quot; data-og-host=&quot;dreamsososo.tistory.com&quot; data-og-source-url=&quot;https://dreamsososo.tistory.com/m/193&quot; data-og-url=&quot;https://dreamsososo.tistory.com/193&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ob06S/hyMluzhvsM/KHsrml5WJPlMTMxyh5qBMk/img.jpg?width=300&amp;amp;height=300&amp;amp;face=0_0_300_300,https://scrap.kakaocdn.net/dn/QC0Ub/hyMllI6PEN/LaksfH2FrIkJva6HCSr5b1/img.jpg?width=300&amp;amp;height=300&amp;amp;face=0_0_300_300,https://scrap.kakaocdn.net/dn/bNBZfC/hyMkAgMDxW/Sg2xfb96XmFegLkAYEeo3K/img.png?width=580&amp;amp;height=274&amp;amp;face=0_0_580_274&quot;&gt;&lt;a href=&quot;https://dreamsososo.tistory.com/m/193&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://dreamsososo.tistory.com/m/193&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ob06S/hyMluzhvsM/KHsrml5WJPlMTMxyh5qBMk/img.jpg?width=300&amp;amp;height=300&amp;amp;face=0_0_300_300,https://scrap.kakaocdn.net/dn/QC0Ub/hyMllI6PEN/LaksfH2FrIkJva6HCSr5b1/img.jpg?width=300&amp;amp;height=300&amp;amp;face=0_0_300_300,https://scrap.kakaocdn.net/dn/bNBZfC/hyMkAgMDxW/Sg2xfb96XmFegLkAYEeo3K/img.png?width=580&amp;amp;height=274&amp;amp;face=0_0_580_274');&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;[아두이노]아두이노(Arduino) IDE 설치 방법&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;아두이노 IDE 설치 방법 따라 하기 아두이노 IDE(통합개발환경) 설치 방법과 간단한 LED 구동하여 테스트하는 방법에 대하여 알려드리겠습니다. 아두이노 란? 아두이노는 마이크로컨트롤러 보드를&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;dreamsososo.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 난 포트가 인식이 안되는 오류가 있었어서 해결방법으로 아래에서 설치해주면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://makernambo.com/23&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://makernambo.com/23&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1636844377454&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;아두이노IDE  포트가 자동연결되지 않는 경우&quot; data-og-description=&quot;PC에 아두이노 IDE를 기동시켜 놓은 상태에서&amp;nbsp;USB를 통해 아두이노 보드를 연결하면 새로 연결된 아두이노 장치가 자동으로 인식되어 표시되는 것이 정상이다. &amp;nbsp; 그런데 새로운 보드를&amp;nbsp;USB에 연&quot; data-og-host=&quot;makernambo.com&quot; data-og-source-url=&quot;https://makernambo.com/23&quot; data-og-url=&quot;https://makernambo.com/23&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/jVLxg/hyMkxqTurm/BkeoG4JUmcIbL9KcXk1Iyk/img.png?width=670&amp;amp;height=346&amp;amp;face=0_0_670_346,https://scrap.kakaocdn.net/dn/CnMxj/hyMlsaoCpJ/XSKmyI3b6Z8gVQRfN5RBg0/img.png?width=670&amp;amp;height=346&amp;amp;face=0_0_670_346,https://scrap.kakaocdn.net/dn/zsZUz/hyMlhfEftL/isXTo9GcgkUSpoXRGkDQRK/img.jpg?width=697&amp;amp;height=619&amp;amp;face=0_0_697_619&quot;&gt;&lt;a href=&quot;https://makernambo.com/23&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://makernambo.com/23&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/jVLxg/hyMkxqTurm/BkeoG4JUmcIbL9KcXk1Iyk/img.png?width=670&amp;amp;height=346&amp;amp;face=0_0_670_346,https://scrap.kakaocdn.net/dn/CnMxj/hyMlsaoCpJ/XSKmyI3b6Z8gVQRfN5RBg0/img.png?width=670&amp;amp;height=346&amp;amp;face=0_0_670_346,https://scrap.kakaocdn.net/dn/zsZUz/hyMlhfEftL/isXTo9GcgkUSpoXRGkDQRK/img.jpg?width=697&amp;amp;height=619&amp;amp;face=0_0_697_619');&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;아두이노IDE 포트가 자동연결되지 않는 경우&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;PC에 아두이노 IDE를 기동시켜 놓은 상태에서&amp;nbsp;USB를 통해 아두이노 보드를 연결하면 새로 연결된 아두이노 장치가 자동으로 인식되어 표시되는 것이 정상이다. &amp;nbsp; 그런데 새로운 보드를&amp;nbsp;USB에 연&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;makernambo.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;추가되면 계속 써야지&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.gather.town/download&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.gather.town/download&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1640598331198&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 Gather&quot; data-og-description=&quot;Stay focused on your work while having a window into your Gather space.&quot; data-og-host=&quot;www.gather.town&quot; data-og-source-url=&quot;https://www.gather.town/download&quot; data-og-url=&quot;https://www.gather.town/download&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/qUrP4/hyMRG0Ql0g/WVgr3z0EuCc0KJkf57jmK1/img.png?width=1200&amp;amp;height=630&amp;amp;face=598_185_704_413,https://scrap.kakaocdn.net/dn/lgUaj/hyMRIdhKf5/hVrMwBuaGU3KA2xQMLQ7k0/img.png?width=1200&amp;amp;height=630&amp;amp;face=598_185_704_413&quot;&gt;&lt;a href=&quot;https://www.gather.town/download&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.gather.town/download&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/qUrP4/hyMRG0Ql0g/WVgr3z0EuCc0KJkf57jmK1/img.png?width=1200&amp;amp;height=630&amp;amp;face=598_185_704_413,https://scrap.kakaocdn.net/dn/lgUaj/hyMRIdhKf5/hVrMwBuaGU3KA2xQMLQ7k0/img.png?width=1200&amp;amp;height=630&amp;amp;face=598_185_704_413');&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 Gather&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Stay focused on your work while having a window into your Gather space.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.gather.town&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&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;466_hp.jpg&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1536&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lNGIO/btrkIiPaQ87/H4X0z2SKuMvMyaH0lnra71/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lNGIO/btrkIiPaQ87/H4X0z2SKuMvMyaH0lnra71/img.jpg&quot; data-alt=&quot;HEWLETT PACKARD&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lNGIO/btrkIiPaQ87/H4X0z2SKuMvMyaH0lnra71/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlNGIO%2FbtrkIiPaQ87%2FH4X0z2SKuMvMyaH0lnra71%2Fimg.jpg&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;375&quot; height=&quot;281&quot; data-filename=&quot;466_hp.jpg&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1536&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;HEWLETT PACKARD&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Coding/about Computer</category>
      <category>HP</category>
      <category>hp 노트북</category>
      <category>HP 파빌리온</category>
      <category>개발 세팅</category>
      <category>개발 툴</category>
      <category>개발 프로그램</category>
      <category>개발환경</category>
      <category>유용한 프로그램</category>
      <category>파빌리온 게이밍</category>
      <category>파빌리온 게이밍 15</category>
      <author>세미531</author>
      <guid isPermaLink="true">https://semi531.tistory.com/93</guid>
      <comments>https://semi531.tistory.com/93#entry93comment</comments>
      <pubDate>Wed, 10 Nov 2021 15:08:08 +0900</pubDate>
    </item>
    <item>
      <title>히프 정렬</title>
      <link>https://semi531.tistory.com/92</link>
      <description>&lt;pre id=&quot;code_1635681450626&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//우선순위 큐인 히프를 이용한 정렬
void heap_sort(element a[], int n)
{
  int i;
  HeapType *h;

  h = create();

  init(h);
  for (i = 0; i &amp;lt; n; i++) {
    insert_max_heap(h, a[i]);
  }
  for (i = (n-1); i &amp;gt;= 0; i--) {
    a[i] = delete_max_heap(h);
  }
  free(h);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 히프 정렬의 복잡도&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;히프트리의 전체 높이가 거의 log_2 n 이므로(완전이진트리이므로) 따라서 하나의 요소를 히프에 삽입하거나 삭제할 때 히프를 재정비하는 시간이 log_2 n 만큼 소요된다. 요소의 개수가 n개이므로 전체적으로 O(log_2 n) 의 시간이 걸린다. 이 시간 복잡도는 삽입 정렬같은 간단한 정렬 알고리즘이 O(n^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;&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;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 문제는 알고리즘 분야에서 상당히 유서 깊은 문제로 많은 응용분야를 가지고 있다. 예를 들어서 서버가 여러 개 있어서 서버에 작업을 분배할 때도 사용할 수 있다. 최적의 해를 찾는 것은 상당히 어렵다. 하지만 근사의 해를 찾는 방법이 있다. 그 중 한 가지가 LPT(longest processing time first) 방법이다. LPT 는 가장 긴 작업을 우선적으로 기계에 할당하는 것이다. 예를 들어서 다음과 같은 순서대로 7개의 작업이 예정되어 있고 동일한 기계가 3대가 있다고 하자. 각 작업들은 기계 사용시간에 따라 다음과 같이 미리 정렬되어 있다고 가정한다.(히프 정렬을 사용할 수도 있다)&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 style=&quot;width: 14.2857%;&quot;&gt;J1&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%;&quot;&gt;J2&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%;&quot;&gt;J3&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%;&quot;&gt;J4&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%;&quot;&gt;J5&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%;&quot;&gt;J6&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%;&quot;&gt;J7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 14.2857%;&quot;&gt;8&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%;&quot;&gt;7&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%;&quot;&gt;6&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%;&quot;&gt;5&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%;&quot;&gt;1&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;&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;LPT 알고리즘의 구현&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_1635684985163&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;
#define MAX_ELEMENT 200

typedef struct {
  int id;
  int avail;
} element;

typedef struct {
  element heap[MAX_ELEMENT];
  int heap_size;
} HeapType;

//생성함수
HeapType* create()
{
  return (HeapType*)malloc(sizeof(HeapType));
}

//초기화함수
void init(HeapType* h)
{
  h-&amp;gt;heap_size = 0;
}

//현재 요소의 개수가 heap_size인 히프 h 에 item을 삽입
//삽입함수
void insert_min_heap(HeapType* h, element item)
{
  int i;
  i = ++(h-&amp;gt;heap_size);

  //트리를 거슬러 올라가면서 부모 노드와 비교하는 과정
  while ((i != 1) &amp;amp;&amp;amp; (item.avail &amp;lt; h-&amp;gt;heap[i/2].avail)) {
    h-&amp;gt;heap[i] = h-&amp;gt;heap[i/2];
    i /= 2;
  }
  h-&amp;gt;heap[i] = item; //새로운 노드를 삽입
}

//삭제함수
element delete_min_heap(HeapType* h)
{
  int parent, child;
  element item, temp;

  item = h-&amp;gt;heap[1];
  temp = h-&amp;gt;heap[(h-&amp;gt;heap_size)--];
  parent = 1;
  child = 2;

  while (child &amp;lt;= h-&amp;gt;heap_size) {
    //현재 노드의 자식노드중 더 작은 자식노드를 찾는다
    if ((child &amp;lt;= h-&amp;gt;heap_size) &amp;amp;&amp;amp; (h-&amp;gt;heap[child].avail) &amp;gt; h-&amp;gt;heap[child + 1].avail)
    child++;
    if (temp.avail &amp;lt; h-&amp;gt;heap[child].avail) break;
    //한 단계 아래로 이동
    h-&amp;gt;heap[parent] = h-&amp;gt;heap[child];
    parent = child;
    child *= 2;
  }
  h-&amp;gt;heap[parent] = temp;
  return item;
}

#define JOBS 7
#define MACHINES 3

int main()
{
  int jobs[JOBS] = {8,7,6,5,3,2,1}; //작업은 정렬되어 있다고 가정
  element m = {0,0};
  HeapType* h;
  h = create();
  init(h);

  //여기서 avail 값은 기계가 사용가능하게 되는 시간이다
  for (int i = 0; i&amp;lt;MACHINES; i++) {
    m.id = i + 1;
    m.avail = 0;
    insert_min_heap(h, m);
  }
  //최소 히프에서 기계를 꺼내서 작업을 할당하고 사용가능 시간을 증가시킨후에 다시 최소히프에 추가
  for (int i = 0; i &amp;lt; JOBS; i++) {
    m = delete_min_heap(h);
    printf(&quot;JOB %d을 시간=%d부터 시간=%d까지 기계 %d번에 할당한다\n&quot;,i,m.avail,m.avail+jobs[i]-1,m.id);

    m.avail += jobs[i];
    insert_min_heap(h, m);
  }
  return 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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;768&quot; data-filename=&quot;abd7b383-0478-4891-8c94-ea98799449ed (1).jpg&quot; width=&quot;408&quot; height=&quot;306&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ce6qYA/btrjr1tiiGg/LAz0wnldHjlf6GHzOciZwK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ce6qYA/btrjr1tiiGg/LAz0wnldHjlf6GHzOciZwK/img.jpg&quot; data-alt=&quot;열심히&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ce6qYA/btrjr1tiiGg/LAz0wnldHjlf6GHzOciZwK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fce6qYA%2Fbtrjr1tiiGg%2FLAz0wnldHjlf6GHzOciZwK%2Fimg.jpg&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;768&quot; data-filename=&quot;abd7b383-0478-4891-8c94-ea98799449ed (1).jpg&quot; width=&quot;408&quot; height=&quot;306&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;열심히&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Coding/자료구조(with C)</category>
      <category>c언어 heap</category>
      <category>c언어 히프</category>
      <category>LPT 알고리즘</category>
      <category>머신 스케줄링</category>
      <category>최대 히프</category>
      <category>최소 히프</category>
      <category>히프 정렬</category>
      <category>히프 정렬 구현</category>
      <category>히프 정렬 복잡도</category>
      <author>세미531</author>
      <guid isPermaLink="true">https://semi531.tistory.com/92</guid>
      <comments>https://semi531.tistory.com/92#entry92comment</comments>
      <pubDate>Sun, 31 Oct 2021 21:58:01 +0900</pubDate>
    </item>
    <item>
      <title>히프의 구현</title>
      <link>https://semi531.tistory.com/91</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;히프는 1차원 배열로 표현될 수 있기 때문에 아래와 같이 히프의 각 요소들을 구조체 element로 정의하고, element의 1차원 배열을 만들어 히프를 구현한다. 여기서 heap_size 는 현재 히프 안에 저장된 요소의 개수이다.&lt;/p&gt;
&lt;pre id=&quot;code_1635668032171&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#define MAX_ELEMENT 200
typedef struct {
	int key;
} element;

typedef struct {
	element heap[MAX_ELEMENT];
    int heap_size;
} HeapType;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 정의를 활용하여 히프 heap 를 생성하고 싶으면 아래와 같이 하면 된다&lt;/p&gt;
&lt;pre id=&quot;code_1635668079061&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;HeapType heap;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또는 다음과 같이 동적으로 생성할 수도 있다&lt;/p&gt;
&lt;pre id=&quot;code_1635668117311&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;HeapType *heap = create();&lt;/code&gt;&lt;/pre&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;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;히프에 새로운 요소를 삽입하는 삽입 연산에 대해 알아보자. 히프에 있어서 삽입 연산은 회사에서 신입 사원이 들어오면 일단 말단 위치에 앉힌 다음에 신입 사원의 능력을 봐서 위로 승진시키는 것과 비슷하다. 히프에 새로운 요소가 들어오면, 일단 새로운 노드를 히프의 마지막 노드로 삽입된다. 마지막 노드 다음에 새로운 노드를 위치시키면 히프트리의 성질이 만족되지 않을 수 있다. 아래의 의사 코드를 이용하여 우선순위 큐의 삽입 알고리즘을 확인해보자.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;1. 히프 크기를 하나 증가시킨다&lt;br /&gt;2. 증가된 히프 크기 위치에 새로운 노드를 삽입한다&lt;br /&gt;3. i가 루트 노드가 아니고 i번째 노드가 i의 부모 노드보다 크면&lt;br /&gt;4. i번째 노드와 부모 노드를 교환&lt;br /&gt;5. 한 레벨 위로 올라간다(승진)&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;insert_max_heap(A, key):&lt;br /&gt;&lt;br /&gt;1. heap_size &amp;lt;- heap_size + 1;&lt;br /&gt;2. i &amp;lt;- heap_size;&lt;br /&gt;3. A[i] &amp;lt;- key;&lt;br /&gt;4. while i != 1 and A[i] &amp;gt; A[PARENT(i)] do&lt;br /&gt;5.&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;A[i] &amp;lt;-&amp;gt; A[PARENT]; //바꿔준다&lt;br /&gt;6.&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;i &amp;lt;- PARENT(i);&lt;/blockquote&gt;
&lt;pre id=&quot;code_1635672746304&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//히프트리에서의 삽입 함수
//현재 요소의 개수가 heap_size 인 히프 h 에 item 을 삽입한다
//삽입함수
void insert_max_heap(HeapType *h, element item)
{
	int i;
    i = ++(h-&amp;gt;heap_size);
    
    //트리를 거슬러 올라가면서 부모 노드와 비교하는 과정
    while ((i != 1) &amp;amp;&amp;amp; item.key &amp;gt; h-&amp;gt;heap[i/2].key)) {
    	h-&amp;gt;heap[i] = h-&amp;gt;heap[i/2];
        i /= 2;
 	}
 h-&amp;gt;heap[i] = item; //새로운 노드를 삽입
 }&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&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;blockquote data-ke-style=&quot;style3&quot;&gt;1. 루트 노드 값을 반환을 위하여 item 변수로 옮긴다&lt;br /&gt;2. 말단 노드를 루트 노드로 옮긴다&lt;br /&gt;3. 히프의 크기를 하나 줄인다&lt;br /&gt;4. 루트의 왼쪽 자식부터 비교를 시작한다&lt;br /&gt;5. i 가 히프트리의 크기보다 작으면 (즉 히프트리를 벗어나지 않았으면)&lt;br /&gt;6. 오른쪽 자식이 더 크면&lt;br /&gt;7-8. 두개의 자식 노드 중 큰 값의 인덱스를 largest 로 옮긴다&lt;br /&gt;9. largest 의 부모 노드가 largest 보다 크면&lt;br /&gt;10. 중지&lt;br /&gt;11. 그렇지 않으면 largest 와 largest 부모 노드를 교환한다&lt;br /&gt;12. 한 레벨 밑으로 내려간다&lt;br /&gt;14. 최대값을 반환한다&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;//히프트리에서의 삭제 알고리즘&lt;br /&gt;delete_max_heap(A):&lt;br /&gt;&lt;br /&gt;1. item &amp;lt;- A[1];&lt;br /&gt;2. A[1] &amp;lt;- A[heap_size];&lt;br /&gt;3. heap_size &amp;lt;- heap_size - 1;&lt;br /&gt;4. i &amp;lt;- 2;&lt;br /&gt;5. while i &amp;lt;= heap_size do&lt;br /&gt;6.&amp;nbsp; &amp;nbsp; &amp;nbsp;if i &amp;lt; heap_size and A[i+1] &amp;gt; A[i]&lt;br /&gt;7.&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;then largest &amp;lt;- i + 1;&lt;br /&gt;8.&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;else largest &amp;lt;- i;&lt;br /&gt;9.&amp;nbsp; &amp;nbsp; &amp;nbsp;if A[PARENT(largest)] &amp;gt; A[largest];&lt;br /&gt;10.&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; then break;&lt;br /&gt;11.&amp;nbsp; &amp;nbsp; &amp;nbsp;A[PARENT(largest)] &amp;lt;-&amp;gt; A[largest];&lt;br /&gt;12. i &amp;lt;- CHILD(largest);&lt;br /&gt;13.&lt;br /&gt;14. return item;&lt;/blockquote&gt;
&lt;pre id=&quot;code_1635674241464&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//삭제함수
element delete_max_heap(HeapType *h)
{
	int parent, child;
    element item, temp;
    
    item = h-&amp;gt;heap[1];
    temp = h-&amp;gt;heap[(h-&amp;gt;heap_size)--];
    parent = 1;
    child = 2;
    while (child &amp;lt;= h -&amp;gt; heap_size) {
    	//현재 노드의 자식노드 중 더 큰 자식노드를 찾는다
        if ((child &amp;lt; h-&amp;gt;heap_size) &amp;amp;&amp;amp; (h-&amp;gt;heap[child].key) &amp;lt; h-&amp;gt;heap[child + 1].key)
        child++;
        if (temp.key &amp;gt;= h-&amp;gt;heap[child].key) break;
        //한단계 아래로 이동
        h -&amp;gt; heap[parent] = h-&amp;gt;heap[child];
        parent = child;
        child *= 2;
	}
h-&amp;gt;heap[parent] = temp;
return item;
}&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;전체 프로그램&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;삽입과 삭제 연산을 테스트하는 완전한 프로그램 소스이다. 먼저 3개의 요소를 삽입하고 이어서 3개의 요소를 삭제하여 요소들의 킷값을 화면에 출력하였다. 최대 히프이므로 값이 큰 순서대로 출력됨을 알 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1635677279656&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;
#define MAX_ELEMENT 200

typedef struct {
  int key;
} element;

typedef struct {
  element heap[MAX_ELEMENT];
  int heap_size;
} HeapType;

//생성함수
HeapType *create()
{
  return (HeapType*)malloc(sizeof(HeapType));
}

//초기화함수
void init(HeapType* h)
{
  h -&amp;gt; heap_size = 0;
}

//현재 요소의 개수가 heap_size 인 히프 h에 item 을 삽입한다
//삽입함수

void insert_max_heap(HeapType* h, element item)
{
  int i;
  i = ++(h-&amp;gt;heap_size);

  //트리를 거슬러 올라가면서 부모 노드와 비교하는 과정
  while ((i != 1) &amp;amp;&amp;amp; (item.key &amp;gt; h-&amp;gt;heap[i/2].key)) {
    h-&amp;gt;heap[i] = h-&amp;gt;heap[i/2];
    i /= 2;
  }
  h-&amp;gt;heap[i] = item; //새로운 노드를 삽입
}

//삭제함수
element delete_max_heap(HeapType* h)
{
  int parent, child;
  element item, temp;

  item = h-&amp;gt;heap[1];
  temp = h-&amp;gt;heap[(h-&amp;gt;heap_size)--];
  parent = 1;
  child = 2;

  while (child &amp;lt;= h-&amp;gt;heap_size) {
    //현재 노드의 자식노드 중 더 큰 자식노드를 찾는다
    if ((child &amp;lt; h-&amp;gt;heap_size) &amp;amp;&amp;amp; (h-&amp;gt;heap[child].key) &amp;lt; h-&amp;gt;heap[child + 1].key)
    child++;

    if (temp.key &amp;gt;= h-&amp;gt;heap[child].key) break;
    //한단계 아래로 이동
    h-&amp;gt;heap[parent] = h-&amp;gt;heap[child];
    parent = child;
    child *= 2;
  }
  h-&amp;gt;heap[parent] = temp;
  return item;
}

int main()
{
  element e1 = {10}, e2 = {5}, e3 = {30};
  element e4, e5, e6;
  HeapType *heap;

  heap = create(); //히프 생성
  init(heap);  //초기화

  //삽입
  insert_max_heap(heap, e1);
  insert_max_heap(heap, e2);
  insert_max_heap(heap, e3);

  //삭제
  e4 = delete_max_heap(heap);
  printf(&quot;&amp;lt; %d &amp;gt; &quot;,e4.key);
  e5 = delete_max_heap(heap);
  printf(&quot;&amp;lt; %d &amp;gt; &quot;,e5.key);
  e6 = delete_max_heap(heap);
  printf(&quot;&amp;lt; %d &amp;gt; &quot;,e6.key);

  free(heap);
  return 0;
}&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;히프의 복잡도 분석&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;히프의 삽입과 삭제 연산의 시간 복잡도를 분석해보자. 삽입 연산에서 새로운 요소 히프트리를 타고 올라가면서 부모 노드들과 교환을 하게 되는데 최악의 경우, 루트 노드까지 올라가야 하므로 거의 트리의 높이에 해당하는 비교 연산 및 이동 연산이 필요하다. 히프가 완전 이진 트리임을 생각하면 히프의 높이는 log_2 n 가 되고 따라서 삽입의 시간 복잡도는 O(log_2 n) 이 된다. 삭제도 마찬가지로 마지막 노드를 루트로 가져온 후에 자식 노드들과 비교하여 교환하는 부분이 가장 시간이 걸리는 부분인데 이 역시 최악의 경우, 가장 아래 레벨까지 내려가야 하므로 역시 트리의 높이만큼의 시간이 걸린다. 따라서 삭제의 시간 복잡도도 O(log_2 n)이 된다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;768&quot; data-filename=&quot;abd7b383-0478-4891-8c94-ea98799449ed (1).jpg&quot; width=&quot;352&quot; height=&quot;264&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxHeUG/btrjlUIhBec/dL4n9WtrrApwIZLapUnjF1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxHeUG/btrjlUIhBec/dL4n9WtrrApwIZLapUnjF1/img.jpg&quot; data-alt=&quot;열심히 공부하자&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxHeUG/btrjlUIhBec/dL4n9WtrrApwIZLapUnjF1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxHeUG%2FbtrjlUIhBec%2FdL4n9WtrrApwIZLapUnjF1%2Fimg.jpg&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;768&quot; data-filename=&quot;abd7b383-0478-4891-8c94-ea98799449ed (1).jpg&quot; width=&quot;352&quot; height=&quot;264&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;열심히 공부하자&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Coding/자료구조(with C)</category>
      <category>heap c언어</category>
      <category>부모 노드</category>
      <category>자식 노드</category>
      <category>히프 구현</category>
      <category>히프 복잡도</category>
      <category>히프 삭제 연산</category>
      <category>히프 삽입 연산</category>
      <category>히프 정의</category>
      <category>히프 트리</category>
      <category>히프트리</category>
      <author>세미531</author>
      <guid isPermaLink="true">https://semi531.tistory.com/91</guid>
      <comments>https://semi531.tistory.com/91#entry91comment</comments>
      <pubDate>Sun, 31 Oct 2021 19:52:58 +0900</pubDate>
    </item>
    <item>
      <title>우선순위 큐</title>
      <link>https://semi531.tistory.com/90</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;우선순위 큐는 우선 순위의 개념을 큐에 도입한 자료구조이다. 보통의 큐는 선입선출(FIFO) 의 원칙에 의하여 먼저 들어온 데이터가 먼저 나가게 된다. 그러나 우선순위 큐(priority queue) 에서는 데이터들이 우선 순위를 가지고 있고 우선 순위가 높은 데이터가 먼저 나가게 된다. 우선순위 큐를 스택이나 큐와 비교해보면 스택에서는 먼저 들어간 데이터가 가장 늦게 나오게 된다. 큐에서는 가장 먼저 들어간 데이터가 가장 먼저 나오게 된다. 우선순위 큐는 사실 가장 일반적인 큐라고 할 수 있는데 왜냐하면 스택이나 큐도 우선순위 큐를 사용하여 얼마든지 구현할 수 있기 때문이다. 즉 적절한 우선 순위만 부여하면 우선순위 큐는 스택이나 큐로 동작할 것이다. 예를 들어 데이터가 들어온 시각을 우선 순위로 잡으면 일반적인 큐처럼 동작할 것이다.&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;style3&quot;&gt;우선순위 큐 추상자료형(ADT)&lt;br /&gt;- 객체 : n개의 element형의 우선 순위를 가진 요소들의 모임&lt;br /&gt;- 연산 :&amp;nbsp;&lt;br /&gt;create() ::=우선순위 큐를 생성한다&lt;br /&gt;init(q) ::= 우선순위 큐 q를 초기화한다&lt;br /&gt;is_empty(q) ::= 우선순위 큐 q가 비어있는지 검사한다&lt;br /&gt;is_full(q) ::= 우선순위 큐 q가 가득 찼는가를 검사한다&lt;br /&gt;insert(q, x) ::= 유선순위 큐 q에 요소 x를 추가한다&lt;br /&gt;delete(q) ::= 우선순위 큐로부터 가장 우선순위가 높은 요소를 삭제하고 이 요소를 반환한다&lt;br /&gt;find(q) ::= 우선순위가 가장 높은 요소를 반환한다&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선순위 큐는 0개 이상의 요소의 모임이다. 각 요소들은 우선 순위값을 가지고 있다. 가장 중요한 연산은 insert, delete 연산이다. 우선순위 큐는 2가지로 구분할 수 있는데 최소 우선순위 큐는 가장 우선 순위가 낮은 요소를 먼저 삭제한다. 최대 우선순위 큐는 반대로 가장 우선 순위가 높은 요소가 먼저 삭제된다.&amp;nbsp;&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;/ul&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;배열을 사용하는 방법&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 정렬이 되어있지 않은 배열을 사용하는 경우를 분석해보자. 정렬이 안 된 배열을 사용하게 되면 삽입은 가장 간단하다. 그냥 배열의 맨 끝에 새로운 요소를 추가하면 된다. 따라서 삽입의 시간 복잡도는 O(1)이다. 그러나 삭제를 할 때는 가장 우선 순위가 높은 요소를 찾아야 한다. 정렬이 안 되어 있으므로 처음부터 끝까지 모든 요소들을 스캔하여야 한다. 따라서 삭제의 복잡도는 O(n) 이 된다. 그리고 요소가 삭제된 다음, 뒤에 있는 요소들을 앞으로 이동시켜야 하는 부담도 있다. 이번에는 정렬이 되어 있는 배열의 경우를 생각해보자. 새로운 요소를 삽입할 때에는 다른 요소와 값을 비교하여 적절한 삽입 위치를 결정하여야 한다. 삽입 위치를 찾기 위하여 순차탐색이나 이진탐색과 같은 방법을 이용할 수 있다. 삽입 위치를 찾은 다음에는 삽입 위치 뒤에 있는 요소들을 이동시켜서 빈자리를 만든 다음, 삽입해야 한다. 따라서 삽입시의 시간복잡도는 일반적으로 O(n)이다. 그 대신 삭제 시에는 간단하다. 숫자가 높은 것이 우선 순위가 높다고 가정하면 맨 뒤에 위치한 요소를 삭제하면 된다. 이 경우 삭제의 시간 복잡도는 O(1) 이 될 것이다.&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;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;연결 리스트를 사용하는 방법&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;연결 리스트를 이용하는 방법도 배열의 경우와 크게 다르지 않다. 정렬된 상태로 연결 리스트를 유지할 수도 있고 정렬이 안 된 채로 연결 리스트를 사용할 수 있다. 정렬이 안 된 리스트라면 삽입 시에는 첫 번째 노드로 삽입시키는 것이 유리하다. 또한 삽입 시에 배열과 달리 다른 노드를 이동할 필요가 없다. 포인터만 변경하면 된다. 따라서 삽입의 시간 복잡도는 O(1) 이다. 삭제 시에는 포인터를 따라서 모든 노드를 뒤져보아야 한다. 이 경우 시간 복잡도는 O(n) 이 될 것이다. 만약 연결 리스트를 정렬시킨 상태로 사용한다면 시간 복잡도는 어떻게 될까? 이 경우에는 우선 순위가 높은 요소가 앞에 위치하는 것이 유리하다. 따라서 우선순위가 높은 요소가 첫 번째 노드가 되도록 한다. 삽입시에는 우선 순위값을 기준으로 삽입위치를 찾아야 하므로 O(n) 이 된다. 삭제 시에는 첫 번째 노드를 삭제하면 되므로 O(1) 이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;히프를 사용하는 방법&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;히프(heap) 는 완전 이진 트리의 일종으로 우선순위 큐를 위하여 특별히 만들어진 자료 구조이다. 이프는 일종의 느슨한 정렬 상태를 유지한다. 즉 완전히 정렬된 것은 아니지만 전혀 정렬이 안된 것도 아닌 상태를 유지한다. 히프는 이러한 느슨한 정렬 상태를 이용하여 우선순위 큐를 구현한다.&amp;nbsp;&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-origin-width=&quot;1280&quot; data-origin-height=&quot;420&quot; data-filename=&quot;KakaoTalk_20211028_010940971.jpg&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5thFv/btriYX0kLr7/y7ksmk5cqiAWAjQiqeJk0k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5thFv/btriYX0kLr7/y7ksmk5cqiAWAjQiqeJk0k/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5thFv/btriYX0kLr7/y7ksmk5cqiAWAjQiqeJk0k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5thFv%2FbtriYX0kLr7%2Fy7ksmk5cqiAWAjQiqeJk0k%2Fimg.jpg&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;420&quot; data-filename=&quot;KakaoTalk_20211028_010940971.jpg&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Coding/자료구조(with C)</category>
      <category>배열 큐</category>
      <category>연결 리스트</category>
      <category>연결 리스트 큐</category>
      <category>우선순위 큐</category>
      <category>추상자료형</category>
      <category>큐 ADT</category>
      <category>큐 추상자료형</category>
      <category>히프</category>
      <category>히프 큐</category>
      <author>세미531</author>
      <guid isPermaLink="true">https://semi531.tistory.com/90</guid>
      <comments>https://semi531.tistory.com/90#entry90comment</comments>
      <pubDate>Thu, 28 Oct 2021 01:16:18 +0900</pubDate>
    </item>
    <item>
      <title>인공지능, 우주와 종교</title>
      <link>https://semi531.tistory.com/89</link>
      <description>&lt;h1&gt;우주의 탄생 - 빅생&lt;/h1&gt;
&lt;h2&gt;빅뱅이론&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;아인슈타인의 상대성 원리에서 출발 : 중력 및 공중부양 평형의 관점에서 상대성 효과 설명&lt;/li&gt;
&lt;li&gt;에드윈 허블 : 천문 관측으로 우주가 팽창한다는 가정아래 은하 스펙트럼의 적색 이동 해석&lt;/li&gt;
&lt;li&gt;펜지어스와 윌슨 : 무선안테나에서 나는 잡음소리 제거 중 1948년 가모, 알퍼, 허먼 등이 주장한 빅뱅의 잔광임을 밝히며 이 자연 방사선이 우주의 시작점이 있었음을 증명하는 증거가 됨&lt;br&gt;우주의 시작이 있었다 != 우주가 창조되었다&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;우주과학에 대한 신학과 과학의 관계성 - 갈등적 관계&lt;/h3&gt;
&lt;p&gt;&amp;lt;신학&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;태초의 하나님이 천지를 창조하시니라&lt;/li&gt;
&lt;li&gt;우주는 인격적인 창조주가 무로부터 창조하여 만들어준 선물&lt;/li&gt;
&lt;li&gt;신 : 태초에 하늘과 땅을 만든 이&lt;br&gt;&amp;lt;과학&amp;gt;&lt;/li&gt;
&lt;li&gt;양자물리학 : 무에서 우주가 생겨날 가능성 인정&lt;/li&gt;
&lt;li&gt;시작은 있으나 원인없이 자발적 폭발로 존재하게 되었을 가능성 제시&lt;/li&gt;
&lt;li&gt;스티븐 호킹 : &amp;quot;우주가 시작을 갖는 이상 우리는 그것이 창조주도 갖는다고 가정할 수 있을 것이다. 그러나 우주가 경계도 변두리도 없어서 완전히 자기 충족적이라면 그것은 시작도 끝도 가지 않을 것이다. 그렇다면 신의 자리는 어디에 있겠는가?&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;우주과학에 대한 신학과 과학의 관계성 - 분리적 관계&lt;/h3&gt;
&lt;p&gt;&amp;lt;신학&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;과학은 궁극적 질문을 취급하지 않으므로 빅뱅물리학이 종교에서 &amp;#39;창조&amp;#39;가 의미하는 바에 대해 답을 해줄 수 없음 -&amp;gt; 빅뱅 우주론은 신학적으로 중요하지 않음&lt;/li&gt;
&lt;li&gt;&amp;#39;창조&amp;#39;에 대한 종교적 설명의 목적은 우주의 물리적 기원에 대한 설명에 있지 않음&lt;/li&gt;
&lt;li&gt;&amp;#39;창조&amp;#39;는 신에 대한 세계의 존재론적 의존성에 관한 것임&lt;/li&gt;
&lt;li&gt;빅뱅이론은 우주 탄생에 관한 과학적 이론을 제공&lt;/li&gt;
&lt;li&gt;&amp;#39;창조과학&amp;#39;은 우주의 존재에 대해 감사하는 마음을 갖도록 유도하는 것임&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cIrEHF/btriq7274eL/wCThwTk7xKCNRLpdUODBb1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cIrEHF/btriq7274eL/wCThwTk7xKCNRLpdUODBb1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cIrEHF/btriq7274eL/wCThwTk7xKCNRLpdUODBb1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcIrEHF%2Fbtriq7274eL%2FwCThwTk7xKCNRLpdUODBb1%2Fimg.jpg&quot; width=&quot;100%&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3&gt;우주과학에 대한 신학과 과학의 관계성 - 지지적 관계&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;과학의 경험적 방법은 세계가 신의 창조물이라는 문화적, 역사적 맥락에서 출발&lt;/li&gt;
&lt;li&gt;신학에서의 &amp;#39;세계의 창조&amp;#39; 개념은 세계를 보는 경험 과학의 발전에 밑거름&lt;/li&gt;
&lt;li&gt;우주의 필연성은 우주의 특정한 것들이 필연적으로 그런 방식으로 존재한다는 의미&lt;/li&gt;
&lt;li&gt;-&amp;gt;&lt;/li&gt;
&lt;li&gt;창조신학은 우주의 실재성과 본성은 창조주의 결정에서 기원한다고 주장&lt;/li&gt;
&lt;li&gt;과학의 경험주의(실제로 경험하는 것에 주의)는 창조신학의 지적, 문화적 배경에서 탄생&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;인공지능과 기독교의 관계&lt;/h1&gt;
&lt;ol&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;/ol&gt;
&lt;h1&gt;인공지능과 불교의 관계&lt;/h1&gt;
&lt;ol&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;/ol&gt;</description>
      <category>Life/북 리뷰</category>
      <category>갈등적 관계</category>
      <category>분리적 관계</category>
      <category>빅뱅이론</category>
      <category>에드윈 허블</category>
      <category>우주 창조</category>
      <category>우주와 종교</category>
      <category>인공지능과 기독교</category>
      <category>인공지능과 불교</category>
      <category>인공지능과 종교</category>
      <category>지지적 관계</category>
      <author>세미531</author>
      <guid isPermaLink="true">https://semi531.tistory.com/89</guid>
      <comments>https://semi531.tistory.com/89#entry89comment</comments>
      <pubDate>Fri, 22 Oct 2021 00:36:21 +0900</pubDate>
    </item>
    <item>
      <title>종교와 과학</title>
      <link>https://semi531.tistory.com/88</link>
      <description>&lt;h1&gt;브라만교의 교리&lt;/h1&gt;
&lt;h1&gt;카르마(karma) = 행위의 법칙(The Law of deed)&lt;/h1&gt;
&lt;p&gt;개인의 삶은 그 전 삶에 의해 결정된 것. 지금의 삶 또한 나의 다음 삶에 영향을 미친다. 이렇게 세계 자체가 끊임없이 지속되는 &lt;em&gt;윤회&lt;/em&gt; 법칙&lt;br&gt;현재 삶의 주기를 끝낸 영혼은 최종적 단계인 &lt;em&gt;목크샤(moksa)&lt;/em&gt; 에 도달하기 위해 8만4천번 윤회&lt;/p&gt;
&lt;h1&gt;업과 윤회&lt;/h1&gt;
&lt;p&gt;우주의 엄격한 법칙에 의해 업이 작동하여 나의 삶의 여러 사건들은 이미 예정된 업보라고 보는 입장&lt;/p&gt;
&lt;h1&gt;브라흐만&lt;/h1&gt;
&lt;p&gt;절대적인 말로 표현할 수 없는 것&lt;br&gt;나 자신의 본질이며 함된 자아 자체를 아트만이라고 부른다&lt;br&gt;나 자신은 브라흐만이 구체화된 상태 따라서 나와 브라흐만이 일체된 것을 &lt;em&gt;범아일여&lt;/em&gt; 라고 부른다&lt;/p&gt;
&lt;h2&gt;나와 브라흐만이 동일한 것을 모르는 것을 &lt;em&gt;무명&lt;/em&gt; , 이를 체득해서 깨닫는 것을 &lt;em&gt;해탈(목크샤)&lt;/em&gt; 라고 한다&lt;/h2&gt;
&lt;h1&gt;카스트 제도&lt;/h1&gt;
&lt;p&gt;&amp;quot;리그베다&amp;quot;에서는 우주의 근원인 태초의 인간 뿌루샤를 제물로 바친 희생제의로 뿌루샤의 몸이 전 우주를 구성한다고 설명&lt;/p&gt;
&lt;h1&gt;카스트와 정, 부정 개념&lt;/h1&gt;
&lt;p&gt;카스트 계급의 구분 기준은 &lt;em&gt;정결함&lt;/em&gt; 이다&lt;br&gt;현재의 카스트 계급은 과거 전생의 업에 의함이다.&lt;br&gt;--&amp;gt; 이는 브라만교에서 중요시 여기는 윤회법칙에 직접적으로 연결되어 있다.&lt;/p&gt;
&lt;h1&gt;자이나교(Jainism)&lt;/h1&gt;
&lt;p&gt;&amp;quot;마하비라&amp;quot; 가 창시&lt;/p&gt;
&lt;h2&gt;해탈할 수 있는 방법인 &amp;quot;아힘사(ahimsa)&amp;quot;&lt;/h2&gt;
&lt;ul&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&gt;백의파 : 여성은 해탈할 수 없고 유혹자&lt;br&gt;천의(공의)파 : 여성의 해탈 주장, 여성수도자 인정&lt;/p&gt;
&lt;h1&gt;자이나교의 교리&lt;/h1&gt;
&lt;h2&gt;5금계&lt;/h2&gt;
&lt;ul&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;br&gt;실레카나(sallekhana) : 올바른 죽음&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;금지 음식&lt;/h2&gt;
&lt;p&gt;어육류, 땅속 줄기 식물, 뿌리 채소, 익히지 않은 음식, 정제하지 않은 벼씨, 여과시키지 않은 물, 끊이지 않은 물&lt;/p&gt;
&lt;p&gt;단식 수행 강조 - 미덕의 보석 고생&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;16개월(480일) 동안 407일은 단식, 73일만 음식 섭취&lt;/li&gt;
&lt;li&gt;단식 및 낮에 햇볕 아래에서 쪼그려 앉는 자세로 명상하고 밤에는 옷을 벗고 영웅 자세로 명상&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;불교의 교리적 특징&lt;/h1&gt;
&lt;p&gt;(왜 삶은 고통인가? , 고통에서 벗어날 수 있는 방법은 무엇인가?)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;960&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cL1pkT/btrirxNIoAB/35M4YPe6gkPm9paGh0x3A1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cL1pkT/btrirxNIoAB/35M4YPe6gkPm9paGh0x3A1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cL1pkT/btrirxNIoAB/35M4YPe6gkPm9paGh0x3A1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcL1pkT%2FbtrirxNIoAB%2F35M4YPe6gkPm9paGh0x3A1%2Fimg.jpg&quot; width=&quot;100%&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;960&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;960&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dvTTf1/btritMRsE0D/hGmq6ERdsWFkZRzTlqga1k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dvTTf1/btritMRsE0D/hGmq6ERdsWFkZRzTlqga1k/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dvTTf1/btritMRsE0D/hGmq6ERdsWFkZRzTlqga1k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdvTTf1%2FbtritMRsE0D%2FhGmq6ERdsWFkZRzTlqga1k%2Fimg.jpg&quot; width=&quot;100%&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;960&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h1&gt;종교와 과학의 논쟁&lt;/h1&gt;
&lt;h1&gt;중세시대 세계관&lt;/h1&gt;
&lt;h2&gt;지구중심설(천동설)&lt;/h2&gt;
&lt;p&gt;태양과 천체가 지구 주위를 회전한다 -&amp;gt; 프톨레마이오스&lt;br&gt;인간 중심적 신학 기반으로 신학자들에게 정설로 받아 들여 짐&lt;/p&gt;
&lt;h1&gt;16세기 세계관&lt;/h1&gt;
&lt;h2&gt;태양중심설(지동설)&lt;/h2&gt;
&lt;p&gt;태양을 중심으로 지구가 회전한다 -&amp;gt; 코페르니쿠스&lt;br&gt;성경의 해석 방법 재검토 필요&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;960&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dtFoJN/btripxmSRWP/Y92ts3gzip9mPe3m69kJx1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dtFoJN/btripxmSRWP/Y92ts3gzip9mPe3m69kJx1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dtFoJN/btripxmSRWP/Y92ts3gzip9mPe3m69kJx1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdtFoJN%2FbtripxmSRWP%2FY92ts3gzip9mPe3m69kJx1%2Fimg.jpg&quot; width=&quot;100%&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;960&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2&gt;&amp;quot;조정 개념적 접근법&amp;quot; 의 신학과 천문학의 관계 논쟁에 중요한 역할, 칼뱅의 공헌&lt;/h2&gt;
&lt;h3&gt;01. 창조 질서의 강조&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;물리적 세상 &amp;amp; 인체는 신의 지혜와 개성을 입증하는 증거라고 주장&lt;/li&gt;
&lt;li&gt;천문학과 의학 연구 장려 : 자연을 과학적으로 연구하는데 종교적 동기 부여&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;02. 성경 직해주의 타파&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;성경의 주 목적은 예수 그리스도를 아는 것이라고 지적&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;종교와 과학의 논쟁1&lt;/h1&gt;
&lt;h2&gt;갈릴레이의 태양중심설을 둘러싼 종교적 논쟁&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;특정 성경 구절의 해설 문제&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;성서는 하늘나라에 가는 방법에 대한 설명서 -&amp;gt; 구원 방법론 제시&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;성서는 하늘의 작동 벙법을 설명하지 않음&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;천동설 증명에 대한 언급(여호수아 10장)(여호수아의 명령으로 태양이 멈추었다)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;갈릴레이는 &amp;lt;대공비 크리스티나께 드리는 서한&amp;gt;에서 &amp;#39;보편적 화법&amp;#39; 주장&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;성서는 신의 계시를 처음 받은 덜 교육받은 사람들의 눈높이에 맞춘 것으로 태양운동에 관한 구절도 보편적으로 알고 있는 사실을 기반으로 설명된 것&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;blockquote&gt;
&lt;p&gt;성서의 직해적 해석법을 부정한 것으로 비판 받음&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;그리스 철학자 아리스토텔레스와의 과학적 이견&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;천문학자 프톨레마이오스의 지동설&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;달 궤도 안쪽과 달 위의 세계를 우주의 구역 구분&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;달 아래 : 부패하고 불완전한 구역으로 지.수.화.풍으로 구성&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;달 위 : 모든 천제의 영역으로 완벽한 원운동을 하고 제5원소 에테르로 구성&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;성서는 구원에 관한 문제에서만 우선시 되어야 함 : &amp;#39;조정 개념적 접근법&amp;#39; 주장&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;blockquote&gt;
&lt;p&gt;성경은 교황과 박학한 신학자의 공통된 해석과 이해에 의존해야 하는 것에 반대 됨 : 17세기 로마 카톨릭과 프로테스탄티즘과외 격돌에 영향 받음&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;갈릴레이의 태양중심설을 둘러싼 종교적 논쟁 배경&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;종교개혁과 정치적 문제에 기반&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;프로테스탄트와 로마 카톨릭과의 종교갈등으로 그의 주장이 프로테스탄트적 성향으로 해석됨&lt;br&gt;프로테스탄트 : 그리스도의 가르침에 대해 신자들이 성서를 읽을 권리 주장&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;02.&lt;br&gt;1616년 코페르니쿠스 천문학 지지와 옹호 철회 지시 받음 : 이단으로 규정&lt;br&gt;교황 우리바누스 8세 : 신은 자신이 원하는 방식으로 하늘을 움직이므로 신이 어떤 방식으로 움직이게 했는가에 대한 규명은 부적절한 것으로 주장&lt;br&gt;갈릴레이의 저서 &amp;lt;두 우주 체계에 관한 대화&amp;gt;는 교황을 조롱한 것으로 해석&lt;br&gt;1633년 교회에 불복종한 죄로 유죄 판결 받음&lt;/p&gt;
&lt;h1&gt;종교와 과학의 논쟁2&lt;/h1&gt;
&lt;h2&gt;뉴턴의 태양계 역학 증명(행성 운동의 법칙)과 이신론&lt;/h2&gt;
&lt;p&gt;01.&lt;br&gt;지구가 사과를 끌어당기는 힘 = 태양과 행성 간에도 동일하게 적용 -&amp;gt; 운동 법칙의 규명 -&amp;gt; 가속도와 힘, 운동량, 속도 개념 정립&lt;br&gt;자연과 우주가 일정한 법칙에 따라 움직인다는 &amp;#39;약학적 세계관&amp;#39; 발전&lt;br&gt;자연과 우주 = 기계&lt;/p&gt;
&lt;p&gt;02.&lt;br&gt;세상 = 기계로 인식 -&amp;gt; 설계의 개념과 연결 -&amp;gt; 신의 묘사와 이해 방식 발전 : 17세기 신을 시계로 묘사&lt;/p&gt;
&lt;p&gt;03.&lt;br&gt;뉴턴은 우주는 일정한 법칙에 따라 규칙적으로 작동하여 신의 개입이 불필요하다고 봄 -&amp;gt; 신이 우주 작동에 관여할 수 없다는 의미가 아님&lt;/p&gt;
&lt;p&gt;04.&lt;br&gt;유신론에 위배되는 이신론 종교 운동 발생에 기여&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;이신론 : 신은 창조주이기는 하지만 창조물에 대한 관여나 지속 부정&lt;/li&gt;
&lt;li&gt;유신론 : 신은 세상일에 지속적으로 관여&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;다윈과 인류의 생물학적 기원&lt;/h1&gt;
&lt;p&gt;01.&lt;br&gt;1831년 12월 영국 군함 비글호는 남아메리카 해안 탐사와 세계 일주를 목표로 항해 시작&lt;br&gt;다윈은 갈라파고스제도와 티에라델푸에고에서 동식물의 생태적 특징에 주목&lt;/p&gt;
&lt;p&gt;02.&lt;br&gt;다윈 : 인간을 포함 모든 종은 오랜 시간에 걸친 복잡한 생물학적 진화 과정을 거친 결과물로 인간과 동물의 기원과 발생에 근본적인 생물학적 차이가 없음을 주장 -&amp;gt; 전통 기독교 : 인류만이 신의 형상과 동일한 최고의 창조물&lt;/p&gt;
&lt;p&gt;03.&lt;br&gt;19세기 후기 : 기독교에서는 진화를 신의 수단으로 보고, 진화의 과정은 신의 섭리에 의한 수단으로 해석&lt;/p&gt;
&lt;p&gt;04.&lt;br&gt;다윈주의는 성경 해석과 창세기 해석법과 충돌 : 6일간의 창조&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;창조 시간의 해석 문제&lt;/li&gt;
&lt;li&gt;문자 그래도 1일을 24시간으로 이해하고 6일로 보는 문제&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&gt;05.&lt;br&gt;기독교에서 바라보는 인류의 지위에 관한 문제와 충돌&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;lt;종의 기원&amp;gt; 인류는 자연 질서에 의해 출현&lt;/li&gt;
&lt;li&gt;기독교 : 인류는 창조된 질서에 속하지만 신과의 특별한 관계가 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;lt;인류의 유래&amp;gt; : &amp;quot;인간이 비록 자신의 노력으로 얻은 자리는 아니지만 유기체 계급의 맨 꼭대기에 오른 것을 자랑스럽게 느낄 만도 하다. ~ 육체에는 비천한 기원을 나타내는 지워지지 않는 흔적이 남아 있음을 인정해야 한다.&lt;/p&gt;
&lt;p&gt;06.&lt;br&gt;&amp;lt;종의 기원&amp;gt; 출간 후 기독교의 대응&lt;/p&gt;
&lt;p&gt;1) 젊은 지구 창조론&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;창세기의 상식적 해석&amp;#39; : 히브리어 욤=날=24시간이라는 길이 의미&lt;/li&gt;
&lt;li&gt;에덴동산 이전에는 어떤 종의 생물도 없었으나, 창세기의 제시된 시간 동안 모든 생물이 동시에 창조되었고, 화석에 나타난 멸종한 종의 존재는 &amp;#39;노아의 홍수&amp;#39; 시대에 멸종한 것임&lt;br&gt;2) 오랜 지구 창조론&lt;/li&gt;
&lt;li&gt;프로테스탄스에서 지지하는 견해 : 욤=부정 시간 단위로 해석&lt;/li&gt;
&lt;li&gt;욤 = 24시간과 같은 특정 기간이 아닌 오랜 시간으로 해석을 주장&lt;/li&gt;
&lt;li&gt;창세기 1장 1절과 2절 사이에는 긴 시간 간격의 존재 가능 : 연속적이기 보다는 최초의 우주 창조 시점과 지구상에 생명체 출현 시점에는 상당한 시간의 경과 가능성 있음&lt;br&gt;3) 지적 설계&lt;/li&gt;
&lt;li&gt;진화에 목적이 없다는 것에 이의 제기&lt;br&gt;4) 진화론적 유신론&lt;/li&gt;
&lt;li&gt;진화는 신이 무기물에 생명을 불어넣어 존재하게 하고, 생명의 복잡성 창조를 위해 선택한 방법론이라고 주장&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;종교와 과학의 관계 이론&lt;/h1&gt;
&lt;h2&gt;과학과 신학의 갈등 관계 해소 방법론의 제시&lt;/h2&gt;
&lt;p&gt;1) 이언 바버(Ian Barbour) : 갈등, 독립, 대화, 통합&lt;br&gt;2) 존 호트(John Haught) : 갈등, 분리, 접촉, 지지&lt;/p&gt;
&lt;h3&gt;존 호트의 종교와 과학의 관계 이론&lt;/h3&gt;
&lt;h4&gt;1. 갈등(Conflict)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;종교와 과학의 화해 불가능&lt;/li&gt;
&lt;li&gt;종교와 과학은 서로 다른 이해 방식으로 갈등 유발&lt;/li&gt;
&lt;li&gt;종교적 개념이 경험적, 즉 과학적 실험과 검증이 불가능&lt;/li&gt;
&lt;li&gt;종교는 &amp;#39;믿음&amp;#39;에 기초하고, 과학은 관찰 가능한 &amp;#39;사실&amp;#39;에 기반&lt;/li&gt;
&lt;li&gt;종교는 정서적, 주관적이고 과학은 냉정하고 객관적&lt;/li&gt;
&lt;li&gt;애플야드, &amp;quot;과학은 절대로 종교와 양립할 수 없다&amp;quot;&lt;/li&gt;
&lt;li&gt;유신론적 종교와의 양립 불가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;2. 분리(Contrast)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;종교와 과학은 다른 질문에 응답하므로 비교하고, 갈등 존재 자체가 불가능&lt;/li&gt;
&lt;li&gt;종교와 과학을 분리하여 생각하지 않고 융합(conflation)하려는 시도에서 갈등 유발하므로, 이를 피하기 위해 종교적 믿음과 과학의 융합은 바람직하지 않음&lt;/li&gt;
&lt;li&gt;종교와 과학의 융합으로 &amp;#39;창조과학&amp;#39; 과 일치주의(concordism)&amp;#39; 탄생&lt;/li&gt;
&lt;li&gt;창조과학 : &amp;lt;창세기&amp;gt; 의 창조를 직해하며 다윈의 진화론을 거부하고, 이를 과학적 이야기라고 주장&lt;/li&gt;
&lt;li&gt;일치주의 : 성서의 내용을 현대 우주론에 일치시키려는 시도&lt;br&gt;e.g. 제럴드 슈뢰더 &amp;lt;창조와 빅뱅&amp;gt; : 성서의 우주 창조 6일 -&amp;gt; 한 좌표계에서의 1일은 다른 좌표계에서의 수섭억 년일 수 있음을 증명하려는 시도&lt;br&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cruntn/btriuYqiKcL/jvq2wOKK3tP7Vwt4gnCTT1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cruntn/btriuYqiKcL/jvq2wOKK3tP7Vwt4gnCTT1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cruntn/btriuYqiKcL/jvq2wOKK3tP7Vwt4gnCTT1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcruntn%2FbtriuYqiKcL%2Fjvq2wOKK3tP7Vwt4gnCTT1%2Fimg.jpg&quot; width=&quot;100%&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;3. 접촉(Contact)&lt;/h4&gt;
&lt;ul&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;li&gt;과학이 종교적 이해를 변화시킴&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;4. 지지(Confirmiation)&lt;/h4&gt;
&lt;ul&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;li&gt;종교는 진리를 찾아야 하는 가라는 질문에 답을 제시하는 자리&lt;/li&gt;
&lt;li&gt;종교는 실재의 일관성에 대한 과학자의 신뢰를 지지해야 함&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Life/북 리뷰</category>
      <category>갈릴레이</category>
      <category>뉴턴</category>
      <category>다윈 주의</category>
      <category>브라만교</category>
      <category>성경 직해주의</category>
      <category>이언 바버</category>
      <category>자이나교</category>
      <category>존 호트</category>
      <category>종교</category>
      <category>종교와 과학</category>
      <author>세미531</author>
      <guid isPermaLink="true">https://semi531.tistory.com/88</guid>
      <comments>https://semi531.tistory.com/88#entry88comment</comments>
      <pubDate>Thu, 21 Oct 2021 18:40:37 +0900</pubDate>
    </item>
    <item>
      <title>지금까지의 자료구조 복습</title>
      <link>https://semi531.tistory.com/87</link>
      <description>&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;1. 자료구조란 무엇인가? (정의)&lt;br&gt;answer : 사람들이 사물을 정리하여 저장하는 것과 마찬가지로 프로그램에서도 자료들을 정리하여 보관하는 여러 가지 구조들이 있다. 이를 자료 구조라고 한다. 맨 위에서 자료를 추가하고 제거하는 &quot;스택&quot; 혹은 먼저 도착한 자료가 먼저 빠져나가는 &quot;큐&quot; 등을 우리는 자료 구조라고 부른다.&lt;br&gt; &lt;br&gt;2. 알고리즘이란 무엇이고 어떻게 표현하는가?&lt;br&gt;answer : 우리는 대부분의 프로그램에서 데이터를 처리하고 있고 이러한 데이터는 자료구조를 사용하여 저장된다. 또한 주어진 문제를 처리하는 절차가 필요한데 이를 알고리즘이라고 부른다. 문제와 컴퓨터가 주어진 상태에서 문제를 해결하는 방법을 정밀하게 장치가 이해할 수 있는 언어로 기술한 것으로 알고리즘은 특정한 일을 수행하는 명령어들의 집합으로 볼 수 있다. 또한 이러한 알고리즘은 한글이나 영어와 같은 자연어, 흐름도(flowchart), 의사 코드(pseudo code) 그리고 프로그래밍 언어로 표현된다.&lt;br&gt; &lt;br&gt;3. 자료구조에서 보는 자료형은 어떤 것들이 있는가?&lt;br&gt;answer : 자료형이란 데이터으 종류를 의미하는데 정수, 실수, 문자열 등이 기조적인 자료형이다. 이러한 자료형은 프로그래밍 언어가 기본적으로 제공하고 스택, 큐, 리스트, 트리와 같은 새로운 자료형들을 추가할 수 있다. c언어 에서는 기초자료형인 char, int, float, double 등 이 있고 파생 자료형으로는 배열과 포인터를 예시로 들 수 있다. 또한 사용자 정의 자료형으로는 구조체, 공용체 그리고 열거형으로 나타낼 수 있다.&lt;br&gt; &lt;br&gt;4. 추상화란 무엇인가?&lt;br&gt;answer : 추상화란 어떤 시스템의 간략화된 기술 또는 명세로서 시스템의 정말 핵심적인 구조나 동작에만 집중하는 것이다. 좋은 추상화는 사용자에게 중요한 정보는 강조되고 반면 중요하지 않은 구현 세부 사항은 제거되는 것이다. 이를 위해 information hiding 이 개발되었고 추상 자료형인 ADT 의 개념으로 발전하였다.&lt;br&gt; &lt;br&gt;5. 알고리즘의 성능 분석 방법에는 어떤 것들이 있는가?&lt;br&gt;answer : 알고리즘을 평가하는 두 가지 요소는 시간 복잡도와 공간 복잡도이다. 즉 얼마나 빠르고 얼마나 메모리를 적게 사용하는가 이다.&lt;br&gt; &lt;br&gt;6. 시간 측정 방법에는 어떤 방법이 있는가?&lt;br&gt;answer : 수행시간을 측정하는 방법에는 대표적으로 두가지 방법이 있는데 p.22&lt;br&gt; &lt;br&gt;7. 알고리즘의 성능을 표현하는 방법에는 어떤 것들이 있는가?&lt;br&gt;answer : 알고리즘의 성능을 표현하는 방법은 시간 복잡도 함수를 통해 나타내는 빅오 표기법을 예로 들 수 있다. 시간 복잡도는 알고리즘의 절대적인 수행 시간을 나타내는 것이 아니라 알고리즘을 이루고 있는 연산들이 몇 번이나 수행되는지를 숫자로 표시하는 것이다. 입력의 개수 n 과 시간 복잡도 함수 T(n) 을 통해 두개의 함수 f(n) 과 g(n) 이 주어졌을 때 모든 n&amp;gt;n0 에 대하여 |f(n)|&amp;lt;=c|g(n)| 을 만족하는 2개의 상수 c 와 n0 가 존재하면 f(n) = O(g(n)) 의 정의를 통해 빅오 표시법으로 알고리즘의 성능을 표현할 수 있다.&lt;br&gt; &lt;br&gt;8. 재귀(혹은 순환; Recursion) 기법의 장점과 단점은 무엇인가?&lt;br&gt;answer : 재귀함수는 반복문보다 상대적으로 간결하게 코드를 작성할 수 있다. 하지만 재귀함수를 사용하면 지속적으로 함수를 호출하게 되는데, 이 때 사용하는 &lt;b&gt;매개변수, 지역변수, 리턴 값, 그리고 함수 종료 후 돌아가는 위치&lt;/b&gt;등을 지속적으로 프로세스의 Stack에 저장해야 합니다. 이는 선언한 변수의 값만 변경해서 사용하는 반복문과 달리 많은 메모리 사용을 의미합니다. 또한 함수 호출과 복귀를 하기 위한 &lt;b&gt;context switching 비용이 발생하기 때문에, 속도가 상대적으로 느립니다.&lt;/b&gt; 즉, 오버헤드가 발생하여 속도가 느리게 됩니다.&lt;br&gt; &lt;br&gt;9. 또는 재귀 함수를 단순 반복구조로 변형하는 문제&lt;br&gt; &lt;br&gt; &lt;br&gt;10. 배열을 이용한 리스트, 스택, 큐의 장점과 단점은 무엇인가?&lt;br&gt;answer&lt;br&gt;리스트 : 내부 구조가 배열로 이루어져 있기 때문에 인덱스로 바로 접근이 가능하여 검색 속도가 빠르고 구현이 쉽다. 하지만 배열 리스트를 할당할 때 대략적인 자료의 양을 예측하여 할당하기 때문에 메모리 낭비가 존재하고 할당된 용량보다 데이터가 많을 시 더 큰 배열을 생성하고 데이터를 복사해야 해서 효율성이 떨어진다. 또한 연속적으로 데이터가 들어있어야 하는 특성 때문에 데이터를 추가, 삭제 시 빈 공간이 생기지 않도록 밀어주고 땡겨주는 작업이 필요하다.&lt;br&gt; &lt;br&gt;스택 : 구현이 쉽고 원하는 데이터의 접근속도가 빠르며 내가 원하는 데이터를 인덱스로 바로 접근이 가능하다. 하지만 데이터의 최대 개수를 미리 정해야 하고 또한 데이터의 삽입과 삭제에 있어 매우 비효율적이다.&lt;br&gt; &lt;br&gt;큐 : 데이터가 입력된 시간 순서대로 처리해야 할 필요가 있는 상황에서는 매우 유리하지만 크기가 제한적이고 큐의 앞 부분이 비어도 데이터를 삽입할 수 없을 뿐만 아니라 rear 가 맨 뒤에 있을 경우 큐가 empty 여도 empty 라고 판단하지 않는 오류를 내보낼 수 있다.&lt;br&gt; &lt;br&gt;11. 환형큐(Circular Queue)를 고정 배열보다 동적 배열 혹은 동적 메모리 할당을 이용하는 것이 좋다는 이유는 무엇인가?&lt;br&gt;answer = 환형큐에서 동적 메모리 할당을 이용하면 초기에 메모리 공간을 정해두지 않고 필요할 때마다 할당하므로 데이터 삽입, 삭제하는 경우 O(1) 에 가능하고 최대 메모리 공간 내에서 리스트 크기 제한이 없기 때문에 메모리 할당을 사용하는 것이 좋다. 하지만 스택과는 달리 새로 배열의 크기를 늘려주면서 이미 원형 큐에 들어가있는 데이터들을 정리해주서야 한다.&lt;br&gt; &lt;br&gt;12. 환형큐(원형큐)와 환형리스트(원형 리스트)의 차이는 무엇인가? 자료구조와 연산의 관점에서 차이점을 설명하시오. (상당히 어려움)&lt;br&gt;answer : &lt;span style=&quot;color: #000000;&quot;&gt;원형 연결 리스트란 마지막 노드가 첫 번째 노드를 가리키는 리스트이다. 즉 마지막 노드의 링크 필드가 NULL 이 아니라 첫 번째 노드 주소가 되는 리스트이다. 원형 연결 리스트에서는 하나의 노드에서 다른 모든 노드로의 접근이 가능하다. 하나의 노드에서 링크를 계속 따라 가면 결국 모든 노드를 거쳐서 자기 자신으로 되돌아 올 수 있는 것이다. &lt;/span&gt;&lt;br&gt;일반적인 배열을 사용하는 원형큐와 달리 연결리스트를 사용하면 배열을 이용한 리스트에서 가장 문제가 되었던 중간에 삽입하는 문제를 해결할 수 있다. 연결 리스트에서는 앞뒤에 있는 데이터들을 이동할 필요가 없이 줄만 변경시켜주면 된다. 삭제 시에도 마찬가지로 데이터들을 연결하는 줄만 수정하면 된다.&lt;br&gt;또한 원형큐와 달리 원형리스트를 구별하는 것은 첫 번째 데이터이다. 첫 번째 데이터만 알 수 있으면 연결 리스트의 나머지 데이터들은 포인터만 따라가면 얻을 수 있다. 연결 리스트의 또 하나의 장점은 데이터를 저장할 공간이 필요할 때마다 동적으로 공간을 만들어서 쉽게 추가할 수 있다는 것이다. 이것은 순차적인 표현 방법인 배열에 비하여 상당한 장점이 된다.&lt;br&gt; &lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1751&quot; data-origin-height=&quot;1392&quot; data-image-src=&quot;https://blog.kakaocdn.net/dn/biSFvn/btriacYdbEY/c3jM8ykX1FTWd3EZ2VlqX1/img.jpg&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biSFvn/btriacYdbEY/c3jM8ykX1FTWd3EZ2VlqX1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biSFvn/btriacYdbEY/c3jM8ykX1FTWd3EZ2VlqX1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biSFvn/btriacYdbEY/c3jM8ykX1FTWd3EZ2VlqX1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiSFvn%2FbtriacYdbEY%2Fc3jM8ykX1FTWd3EZ2VlqX1%2Fimg.jpg&quot; data-origin-width=&quot;1751&quot; data-origin-height=&quot;1392&quot; data-image-src=&quot;https://blog.kakaocdn.net/dn/biSFvn/btriacYdbEY/c3jM8ykX1FTWd3EZ2VlqX1/img.jpg&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;&lt;br&gt; &lt;br&gt; &lt;/p&gt;

&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt; &lt;/p&gt;</description>
      <category>Coding/자료구조(with C)</category>
      <category>c언어 temp</category>
      <category>c언어 연결 큐</category>
      <category>c언어 연결리스트</category>
      <category>c언어 큐</category>
      <category>연결 리스트</category>
      <category>연결 큐</category>
      <category>연결된 큐</category>
      <category>연결리스트 코드</category>
      <author>세미531</author>
      <guid isPermaLink="true">https://semi531.tistory.com/87</guid>
      <comments>https://semi531.tistory.com/87#entry87comment</comments>
      <pubDate>Mon, 18 Oct 2021 16:31:27 +0900</pubDate>
    </item>
    <item>
      <title>연결 리스트로 구현한 큐</title>
      <link>https://semi531.tistory.com/86</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;연결 리스트를 이용하여 스택을 만들 수 있는 것처럼 큐도 연결 리스트를 이용하여 만들 수 있다. 연결 리스트로 만들어진 큐를 연결된 큐(Linked queue) 라고 한다. 연결 리스트로 구현된 큐는 배열로 구현된 큐에 비하여 크기가 제한되지 않는다는 장점을 지니고 있다. 반면 배열로 구현된 큐에 비하여 코드가 복잡하고 링크 필드 때문에 메모리 공간을 더 많이 사용한다. 기본적인 구조는 단순 연결 리스트에다가 2개의 포인터를 추가한 것과 같다. front 포인터는 삭제와 관련되며 rear 포인터는 삽입과 관련된다.&amp;nbsp;&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-origin-width=&quot;1280&quot; data-origin-height=&quot;267&quot; data-filename=&quot;KakaoTalk_20211018_140801061.jpg&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/beTPiH/btrh7xGQMBd/KyQD0i0roJKzcYUCznXza1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/beTPiH/btrh7xGQMBd/KyQD0i0roJKzcYUCznXza1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/beTPiH/btrh7xGQMBd/KyQD0i0roJKzcYUCznXza1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbeTPiH%2Fbtrh7xGQMBd%2FKyQD0i0roJKzcYUCznXza1%2Fimg.jpg&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;267&quot; data-filename=&quot;KakaoTalk_20211018_140801061.jpg&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 front는 연결 리스트의 맨 앞에 있는 요소를 가리키며 rear 포인터는 맨 뒤에 있는 요소를 가리킨다. 큐에 요소가 없는 경우에는 front 와 rear 는 NULL 값이 된다. 큐의 요소들은 구조체로 정의되며 이 구조체는 데이터를 저장하는 data 필드와 다음 노드를 가리키기 위한 포인터가 들어 있는 link 필드로 이뤄져있다.&lt;/p&gt;
&lt;pre id=&quot;code_1634533978180&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//연결된 큐 정의
typedef int element;
typedef struct QueueNode { //큐의 노드의 타입입
  element data;
  struct QueueNode *link;
} QueueNode;

typedef struct { //큐 ADT 구현현
  QueueNode *front, *rear;
} LinkQueueType;&lt;/code&gt;&lt;/pre&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;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;삽입 연산은 먼저 동적 메모리 할당을 통하여 새로운 노드를 생성한 다음, 데이터를 저장하고 연결 리스트의 끝에 새로운 노드를 추가하면 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1102&quot; data-origin-height=&quot;1280&quot; data-filename=&quot;KakaoTalk_20211018_141414139.jpg&quot; width=&quot;508&quot; height=&quot;590&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cshsgm/btrh7w2hnQa/IDsscET6DWlP3RP2s5HRH1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cshsgm/btrh7w2hnQa/IDsscET6DWlP3RP2s5HRH1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cshsgm/btrh7w2hnQa/IDsscET6DWlP3RP2s5HRH1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcshsgm%2Fbtrh7w2hnQa%2FIDsscET6DWlP3RP2s5HRH1%2Fimg.jpg&quot; data-origin-width=&quot;1102&quot; data-origin-height=&quot;1280&quot; data-filename=&quot;KakaoTalk_20211018_141414139.jpg&quot; width=&quot;508&quot; height=&quot;590&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 사진은 삽입 연산의 과정을 보여준다. 그림 (a) 와 같이 만약 큐가 공백상태이면(front 와 rear 가 모두 NULL) front 와 rear 모두 새로운 노드를 가리키도록 해야한다. 만약 (b) 와 같이 공백상태가 아니고 기존의 노드가 있는 경우라면 rear 가 가리키고 있는 노드의 링크 필드와 rear 를 새로운 노드를 가리키도록 변경하면 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1634534645354&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void enqueue(LinkQueueType *q, element data)
{
  QueueNode *temp = (QueueNode *)malloc(sizeof(QueueNode));
  temp-&amp;gt;data = data; //데이터 저장
  temp-&amp;gt;link = NULL; //링크 필드를 NULL
  if (is_empty(q)) {
    q-&amp;gt;front = temp;
    q-&amp;gt;rear = temp;
  }
  else {
    q-&amp;gt;rear-&amp;gt;link = temp; //순서 중요
    q-&amp;gt;rear = temp;
  }
}&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;삭제 연산&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;삭제 연산은 연결 리스트의 처음에서 노드를 꺼내오면 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1106&quot; data-origin-height=&quot;1280&quot; data-filename=&quot;KakaoTalk_20211018_142457486.jpg&quot; width=&quot;500&quot; height=&quot;578&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMb6L1/btrh4NKgyoP/kZ50mjwZQkufJlMaqp8GG1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMb6L1/btrh4NKgyoP/kZ50mjwZQkufJlMaqp8GG1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMb6L1/btrh4NKgyoP/kZ50mjwZQkufJlMaqp8GG1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMb6L1%2Fbtrh4NKgyoP%2FkZ50mjwZQkufJlMaqp8GG1%2Fimg.jpg&quot; data-origin-width=&quot;1106&quot; data-origin-height=&quot;1280&quot; data-filename=&quot;KakaoTalk_20211018_142457486.jpg&quot; width=&quot;500&quot; height=&quot;578&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 사진은 삭제 연산의 과정을 보여준다. 삭제 연산은 먼저 큐가 공백상태인가를 검사하여야 한다. 만약 공백상태라면 당연히 오류가 된다. 현재 구현에서는 오류이면 오류 메세지를 출력하고 종료하도록 되어 있다. 만약 공백상태가 아니라면 front 가 가리키는 노드를 temp 가 가리키도록 하고 front는 front 의 링크값으로 대입한다. 그러면 front 는 현재 가리키는 노드의 다음 노드를 가리키게 될 것이다. 그런 다음 temp 가 가리키는 노드로부터 데이터를 꺼내오고 동적 메모리 해제를 통하여 이 노드를 삭제하면 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1634535241278&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//삭제 함수
element dequeue(LinkQueueType *q)
{
  QueueNode *temp = q-&amp;gt;front;
  element data;
  if (is_empty(q)) {
    fprintf(stderr,&quot;스택이 비어있음\n&quot;);
    exit(1);
  }
  else {
    data = temp-&amp;gt;data;
    q-&amp;gt;front = q-&amp;gt;front-&amp;gt;link; //front 를 다음노드를 가리키도록
    if (q-&amp;gt;front == NULL)
      q-&amp;gt;rear = NULL;
    free(temp);
    return data;
  }
}&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;&amp;nbsp;&lt;/p&gt;</description>
      <category>Coding/자료구조(with C)</category>
      <category>c언어 temp</category>
      <category>c언어 연결 큐</category>
      <category>c언어 연결리스트</category>
      <category>c언어 큐</category>
      <category>삭제 연산</category>
      <category>연결 리스트</category>
      <category>연결 큐</category>
      <category>연결된 큐</category>
      <category>연결리스트</category>
      <category>연결리스트 코드</category>
      <author>세미531</author>
      <guid isPermaLink="true">https://semi531.tistory.com/86</guid>
      <comments>https://semi531.tistory.com/86#entry86comment</comments>
      <pubDate>Mon, 18 Oct 2021 14:35:00 +0900</pubDate>
    </item>
    <item>
      <title>연결 리스트로 구현한 스택</title>
      <link>https://semi531.tistory.com/85</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;연결리스트를 이용한 스택이나 큐를 연결된 스택(Linked stack) 이라고 한다. 외부에서 보기에는 배열을 이용한 스택이나 연결 리스트를 이용한 스택이나 전혀 차이가 없다. 즉 제공되는 외부 인터페이스는 완전히 동일하다. 연결 리스트를 이용하여 스택을 만들게 되면 크기가 제한되지 않는다는 장점이 있다. 동적 메모리 할당만 할 수만 있으면 스택에 새로운 요소를 삽입할 수 있다. 반면에 연결 리스트를 이용한 스택은 동적 메모리 할당이나 해제를 해야 하므로 삽입이나 삭제 시간은 좀 더 걸린다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;연결된 스택은 기본적으로 연결 리스트이기 때문에 다음과 같이 노드를 정의한다. 노드는 우리가 저장하고 싶은 데이터 필드와 다음 노드를 가리키기 위한 포인터가 들어 있는 링크 필드로 구성된다. 또한 top은 더 이상 정수가 아니고 노드를 가리키는 포인터로 선언된다. 또한 연결된 스택에 관련된 데이터는 top 포인터뿐이지만 일관성을 위하여 LinkedStackType 이라는 구조체 타입으로 정의되었다. 모든 함수들은 이 구조체의 포인터를 매게변수로 받아서 사용한다.&lt;/p&gt;
&lt;pre id=&quot;code_1634527666792&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;typedef int element;
typedef struct StackNode
{
  element data;
  struct StackNode *link;
} StackNode;

typedef struct {
  StackNode *top;
} LinkedStackType;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;357&quot; data-filename=&quot;KakaoTalk_20211018_123309870.jpg&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bWtsuT/btrhX1P4bF0/pT9zGxYOnEKb43VOB8qkN1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bWtsuT/btrhX1P4bF0/pT9zGxYOnEKb43VOB8qkN1/img.jpg&quot; data-alt=&quot;삽입&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bWtsuT/btrhX1P4bF0/pT9zGxYOnEKb43VOB8qkN1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbWtsuT%2FbtrhX1P4bF0%2FpT9zGxYOnEKb43VOB8qkN1%2Fimg.jpg&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;357&quot; data-filename=&quot;KakaoTalk_20211018_123309870.jpg&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;삽입&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;369&quot; data-filename=&quot;KakaoTalk_20211018_123315448.jpg&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AKV7f/btrh4NiIAOZ/4kxppZ7wWgL98LlJhwbGa1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AKV7f/btrh4NiIAOZ/4kxppZ7wWgL98LlJhwbGa1/img.jpg&quot; data-alt=&quot;삭제&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AKV7f/btrh4NiIAOZ/4kxppZ7wWgL98LlJhwbGa1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAKV7f%2Fbtrh4NiIAOZ%2F4kxppZ7wWgL98LlJhwbGa1%2Fimg.jpg&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;369&quot; data-filename=&quot;KakaoTalk_20211018_123315448.jpg&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;삭제&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1634529300327&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;
#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable:4996)
#include &amp;lt;malloc.h&amp;gt;
#include &amp;lt;string.h&amp;gt;

typedef int element;
typedef struct StackNode
{
  element data;
  struct StackNode *link;
} StackNode;

typedef struct {
  StackNode *top;
} LinkedStackType;

//초기화 함수
void init(LinkedStackType *s)
{
  s-&amp;gt;top = NULL;
}

//공백 상태 검출 함수
int is_empty(LinkedStackType *s)
{
  return (s-&amp;gt;top == NULL);
}

//포화상태 검출함수
int is_full(LinkedStackType *s)
{
  return 0;
}

//삽입 함수
void push(LinkedStackType *s, element item)
{
  StackNode *temp = (StackNode *)malloc(sizeof(StackNode));
  temp-&amp;gt;data = item;
  temp-&amp;gt;link = s-&amp;gt;top;
  s-&amp;gt;top = temp;
}

void print_stack(LinkedStackType *s)
{
  for (StackNode *p = s-&amp;gt;top; p != NULL; p = p-&amp;gt;link)
    printf(&quot;%d -&amp;gt; &quot;,p-&amp;gt;data);
  printf(&quot;NULL \n&quot;);
}

//삭제함수
element pop(LinkedStackType *s)
{
  if (is_empty(s)) {
    fprintf(stderr,&quot;스택이 비어있음\n&quot;);
    exit(1);
  }
  else {
    StackNode *temp = s-&amp;gt;top;
    int data = temp-&amp;gt;data;
    s-&amp;gt;top = s-&amp;gt;top-&amp;gt;link;
    free(temp);
    return data;
  }
}

// 피크함수
element peek(LinkedStackType *s)
{
  if (is_empty(s)) {
    fprintf(stderr,&quot;스택이 비어있음\n&quot;);
    exit(1);
  }
  else {
    return s-&amp;gt;top-&amp;gt;data;
  }
}

int main()
{
  LinkedStackType s;
  init(&amp;amp;s);
  push(&amp;amp;s,1); print_stack(&amp;amp;s);
  push(&amp;amp;s,2); print_stack(&amp;amp;s);
  push(&amp;amp;s,3); print_stack(&amp;amp;s);
  pop(&amp;amp;s); print_stack(&amp;amp;s);
  pop(&amp;amp;s); print_stack(&amp;amp;s);
  pop(&amp;amp;s); print_stack(&amp;amp;s);
  return 0;
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Coding/자료구조(with C)</category>
      <category>c언어 스택</category>
      <category>c언어 연결리스트 스택</category>
      <category>c언어 코드</category>
      <category>Linked List</category>
      <category>Linked stack</category>
      <category>LinkedStackType</category>
      <category>스택 코드</category>
      <category>연결 리스트</category>
      <category>연결리스트 스택</category>
      <category>연결리스트 스택 코드</category>
      <author>세미531</author>
      <guid isPermaLink="true">https://semi531.tistory.com/85</guid>
      <comments>https://semi531.tistory.com/85#entry85comment</comments>
      <pubDate>Mon, 18 Oct 2021 12:55:58 +0900</pubDate>
    </item>
    <item>
      <title>이중 연결 리스트</title>
      <link>https://semi531.tistory.com/84</link>
      <description>&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;이중 연결 리스트는 하나의 노드가 선행 노드와 후속 노드에 대한 두 개의 링크를 가지는 리스트이다. 링크가 양방향이므로 양방향으로 검색이 가능해진다. 단점으로는 공간을 많이 차지하고 코드가 복잡해진다는 것이다. 그러나 그럼에도 불구하고 여러 가지 장점이 많기 때문에 널리 쓰인다.&amp;nbsp;&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-origin-width=&quot;1280&quot; data-origin-height=&quot;304&quot; data-filename=&quot;KakaoTalk_20211018_060638783.jpg&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b9rKpr/btrhX192wvZ/pKLr4Vck601htgb41FIXC1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b9rKpr/btrhX192wvZ/pKLr4Vck601htgb41FIXC1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b9rKpr/btrhX192wvZ/pKLr4Vck601htgb41FIXC1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb9rKpr%2FbtrhX192wvZ%2FpKLr4Vck601htgb41FIXC1%2Fimg.jpg&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;304&quot; data-filename=&quot;KakaoTalk_20211018_060638783.jpg&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 응용에서는 이중 연결 리스트와 원형 연결 리스트를 혼합한 형태가 많이 사용된다. 또 헤드 노드(head node) 라는 특별한 노드를 추가하는 경우가 많다. 헤드 포인터와는 구별하여야 한다. 헤드 포인터는 리스트의 첫 번째 노드를 가리키는 포인터이고, 헤드 노드는 데이터를 가지고 있지 않은 특별한 노드를 추가하는 것이다. 헤드 노드가 존재하게 되면 삽입, 삭제 알고리즘이 간편해진다. 헤드 노드의 데이터 필드는 아무런 정보도 담고 있지 않다. 다만 삽입과 삭제 알고리즘을 간편하게 하기위해 존재한다.&amp;nbsp; 이제 이중연결 리스트를 구현해보자. 먼저 노드의 구조를 확인해야 하는데 이중연결 리스트에서의 노드는 3개의 필드(왼쪽 링크 필드, 데이터 필드, 오른쪽 링크 필드) 로 이뤄져 있다. 링크 필드는 포인터로 이뤄져있다. 이중연결 리스트에서 임의의 노드를 가리키는 포인터를 p이라 하면 아래와 같은 관계가 항상 성립한다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;p = p-&amp;gt;llink-&amp;gt;rlink = p-&amp;gt;rlink-&amp;gt;llink&lt;/blockquote&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;/p&gt;
&lt;pre id=&quot;code_1634505222576&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;typedef int element;
typedef struct DListNode {
  element data;
  struct DListNode *llink;
  struct DListNode *rlink;
} DListNode;&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;삽입 연산&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래의 그림과 같이 그림의 순서대로 링크 필드의 값을 바꾸면 된다. 새로 만들어진 노드의 링크를 먼저 바꾸는 것을 알 수 있다. 새로 만들어진 노드의 링크는 아무런 정보도 가지고 있지 않기 때문에 변경하여도 안전하기 때문이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;582&quot; data-filename=&quot;KakaoTalk_20211018_062435398.jpg&quot; width=&quot;631&quot; height=&quot;287&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KsUI9/btrhWJu4ttL/sH8vOBi5CXpJym9HTRvNmk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KsUI9/btrhWJu4ttL/sH8vOBi5CXpJym9HTRvNmk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KsUI9/btrhWJu4ttL/sH8vOBi5CXpJym9HTRvNmk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKsUI9%2FbtrhWJu4ttL%2FsH8vOBi5CXpJym9HTRvNmk%2Fimg.jpg&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;582&quot; data-filename=&quot;KakaoTalk_20211018_062435398.jpg&quot; width=&quot;631&quot; height=&quot;287&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1634506696050&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//새로운 데이터를 노드 before 의 오른쪽에 삽입한다
void dinsert(DListNode *before, element data)
{
  DListNode *newnode = (DListNode *)malloc(sizeof(DListNode));
  newnode -&amp;gt; data = data;
  newnode-&amp;gt;llink = before;
  newnode-&amp;gt;rlink = before-&amp;gt;rlink;
  before-&amp;gt;rlink-&amp;gt;llink = newnode;
  before-&amp;gt;rlink = newnode;
}&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;삭제연산&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;479&quot; data-filename=&quot;KakaoTalk_20211018_063901760.jpg&quot; width=&quot;654&quot; height=&quot;245&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wVUrH/btrh2hK9F6Z/t7N2xsZrv0xdSLiUpmiwZ1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wVUrH/btrh2hK9F6Z/t7N2xsZrv0xdSLiUpmiwZ1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wVUrH/btrh2hK9F6Z/t7N2xsZrv0xdSLiUpmiwZ1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwVUrH%2Fbtrh2hK9F6Z%2Ft7N2xsZrv0xdSLiUpmiwZ1%2Fimg.jpg&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;479&quot; data-filename=&quot;KakaoTalk_20211018_063901760.jpg&quot; width=&quot;654&quot; height=&quot;245&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;링크들의 값을 변화시키면 된다&lt;/p&gt;
&lt;pre id=&quot;code_1634506922908&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//노드 removed 를 삭제한다
void ddelete(DListNode *head, DListNode *removed)
{
  if (removed == head) return;
  removed-&amp;gt;llink-&amp;gt;rlink = removed-&amp;gt;rlink;
  removed-&amp;gt;rlink-&amp;gt;llink = removed-&amp;gt;llink;
  free(removed);
}&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;&amp;nbsp;&lt;/p&gt;</description>
      <category>Coding/자료구조(with C)</category>
      <category>c언어</category>
      <category>c언어 이중 연결 리스트</category>
      <category>c언어 이중 연결 리스트 코드</category>
      <category>배열</category>
      <category>삭제연산</category>
      <category>이중 연결 리스트</category>
      <category>이중 연결 리스트 코드</category>
      <category>이중연결 리스트</category>
      <category>큐</category>
      <category>포인터</category>
      <author>세미531</author>
      <guid isPermaLink="true">https://semi531.tistory.com/84</guid>
      <comments>https://semi531.tistory.com/84#entry84comment</comments>
      <pubDate>Mon, 18 Oct 2021 06:43:04 +0900</pubDate>
    </item>
  </channel>
</rss>