<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>shepherd's Blog</title>
    <link>https://shepherd44.tistory.com/</link>
    <description>개인 공부 위주 블로그입니다.</description>
    <language>ko</language>
    <pubDate>Wed, 6 May 2026 21:22:18 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>shepherd.dev</managingEditor>
    <image>
      <title>shepherd's Blog</title>
      <url>https://t1.daumcdn.net/cfile/tistory/2230DC45559B9BCD28</url>
      <link>https://shepherd44.tistory.com</link>
    </image>
    <item>
      <title>Trino - HIVE_TABLE_LOCK_NOT_ACQUIRED</title>
      <link>https://shepherd44.tistory.com/37</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 문제 발생&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Iceberg table에 데이터를 쓰는 ETL에서 에러가 발생하고 있어 확인해 보니 trino에서 &lt;code&gt;EXTERNAL_ERROR - HIVE_TABLE_LOCK_NOT_ACQUIRED&lt;/code&gt; 에러가 발생하고 있었다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1478&quot; data-origin-height=&quot;94&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Lsaqi/btsCxIvQn2O/VBZ8CkI4boMDFKksHyvBu1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Lsaqi/btsCxIvQn2O/VBZ8CkI4boMDFKksHyvBu1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Lsaqi/btsCxIvQn2O/VBZ8CkI4boMDFKksHyvBu1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLsaqi%2FbtsCxIvQn2O%2FVBZ8CkI4boMDFKksHyvBu1%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;1478&quot; height=&quot;94&quot; data-origin-width=&quot;1478&quot; data-origin-height=&quot;94&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 선조치&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 테이블에 write 작업을 할 수 없는 상태라 우선 해결 방법이 있나 구글링하는데, hive table lock을 수동으로 해제하는 명령이나 방법을 찾질 못했다. 해결할 방법을 찾던 중 hive가 metadata를 관리하기 위해 database를 사용했던 게 기억나 hive database에 접속해서 table 목록을 살펴봤다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오 public.hive_locks table이 보여 조회를 해보니 문제가 발생한 테이블의 lock이 남아 있는 걸 확인했다. lock 관련 테이블은 hive_locks 외에는 없는 거 같아 해당 테이블의 lock을 전부 지우고 다시 ETL을 돌려보니 정상적으로 데이터가 정상적으로 들어가기 시작했다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3242&quot; data-origin-height=&quot;728&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cooaCg/btsCAMw3E4s/CMSfgYpZ09qfdHzNE77jk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cooaCg/btsCAMw3E4s/CMSfgYpZ09qfdHzNE77jk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cooaCg/btsCAMw3E4s/CMSfgYpZ09qfdHzNE77jk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcooaCg%2FbtsCAMw3E4s%2FCMSfgYpZ09qfdHzNE77jk1%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;3242&quot; height=&quot;728&quot; data-origin-width=&quot;3242&quot; data-origin-height=&quot;728&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 원인&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사라지지 않은 lock은 trino coordinator에서 획득한 lock이었다. lock이 왜 남아서 문제를 일으키는지 trino coordinator와 worker의 로그를 확인해 봤지만, INFO Level의 로그로는 자세한 상황을 알 수 없었고, 비정기적으로 계속 발생했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수동 조치하며 원인을 찾던 중 worker가 자주 죽는 걸 확인했다.&lt;br /&gt;worker가 왜 죽을까 생각하며 설정을 확인해 보니 trino cluster에 설정해둔 cpu 기반의 오토스케일러가 문제로 보였다.&lt;br /&gt;k8s에서 trino cluster에 cpu 기반으로 오토스케일을 걸어 둔 상태로 쓰고 있었는데(trino helm chart 오토스케일러 설정), 오토스케일러 때문에 lock을 획득한 쿼리가 중간에 죽지 않았을까 하는 생각이 들었고, 다음 시나리오 기반으로 테스트를 해봤다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;쿼리 요청 증가&lt;/li&gt;
&lt;li&gt;cpu 사용량 증가로 worker 늘어남&lt;/li&gt;
&lt;li&gt;쿼리 실행 완료&lt;/li&gt;
&lt;li&gt;cpu 사용량 감소로 worker 줄어듬&lt;/li&gt;
&lt;li&gt;k8s의 cpu 기반 오토스케일러라 쿼리 실행에 상관없이 worker 죽임&lt;/li&gt;
&lt;li&gt;죽은 worker에 실행 중인 쿼리는 실패&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;큰 쿼리와 작은 쿼리를 여러 개 실행했고, 워커가 늘어나고 줄어드는 과정에서 남아 있던 큰 쿼리는 worker 통신 실패로 죽는 걸 확인했다.&lt;br /&gt;이 에러의 끝이 보이는 거 같았다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 조치&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오토스케일러를 해제하고 쿼리가 실행되는 적정 수준의 리소스를 유지하도록 설정했다.&lt;br /&gt;조치한 후에는 해당 문제가 발생하지 않고 정상적으로 운영되고 있다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 남아있는 의문&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;trino coordinator에서 lock을 획득했다면 worker가 죽은 다음 coordinator에서 lock을 반납하는게 정상 동작일 거 같다.&lt;br /&gt;이런 상황이라면 trino의 버그일 수도 있겠다는 생각이 들어 관련된 이슈를 찾아봐야 겠다는 생각이 들었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;trino cluster를 사용하는데 cpu 기반의 오토스케일링은 맞지 않다는 생각이 든다. trino helm chart에서 제공하는 기본 오토스케일링 말고 worker의 trino query 실행 중인 상태를 확인하면서 실행되는 오토스케일이 가능할지 확인해 봐야겠다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. 남은 과제&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;trino autoscaling 고도화 가능성 확인&lt;/li&gt;
&lt;li&gt;trino 비정상 종료 시 hive lock 처리 확인&lt;/li&gt;
&lt;/ol&gt;</description>
      <category>Data Engineering</category>
      <category>hive metastore</category>
      <category>Iceberg</category>
      <category>Trino</category>
      <author>shepherd.dev</author>
      <guid isPermaLink="true">https://shepherd44.tistory.com/37</guid>
      <comments>https://shepherd44.tistory.com/37#entry37comment</comments>
      <pubDate>Mon, 25 Dec 2023 23:41:19 +0900</pubDate>
    </item>
    <item>
      <title>rancher version downgrade 후 clusterrolebinding 삭제 에러</title>
      <link>https://shepherd44.tistory.com/35</link>
      <description>&lt;p&gt;rancher version 2.6.13 업그레이드 후 dashboard쪽 속도가 너무 느려져서 rancher v2.6.4 로 버전을 낮춘 다음 발생한 문제이다.&lt;/p&gt;
&lt;h1&gt;증상&lt;/h1&gt;
&lt;p&gt;RBAC 삭제 안됨&lt;/p&gt;
&lt;h1&gt;원인&lt;/h1&gt;
&lt;p&gt;rancher v2.6.13으로 업그레이드 후 모든 RBAC에 wrangler.cattle.io/auth-prov-v2-crb finalizer가 추가되었고,&lt;/p&gt;
&lt;p&gt;다시 버전을 낮추면서 해당 finalizer를 처리할 controller가 없어지면서 계속 남아있게 되고 removing 상태로 남아있게 됨&lt;/p&gt;
&lt;h1&gt;조치&lt;/h1&gt;
&lt;p&gt;해당 finalizer를 처리할 필요가 없으므로 강제로 제거해주면서 문제 해결 됨&lt;/p&gt;</description>
      <category>k8s</category>
      <category>k8s</category>
      <category>rancher</category>
      <author>shepherd.dev</author>
      <guid isPermaLink="true">https://shepherd44.tistory.com/35</guid>
      <comments>https://shepherd44.tistory.com/35#entry35comment</comments>
      <pubDate>Wed, 16 Aug 2023 19:04:44 +0900</pubDate>
    </item>
    <item>
      <title>[k8s] argocd aplication yaml 예시</title>
      <link>https://shepherd44.tistory.com/36</link>
      <description>&lt;h1&gt;기본 셋&lt;/h1&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;apiVersion: argoproj.io/v1alpha1  
kind: Application  
metadata:  
  name: kafka-ui  
  namespace: argocd  
spec:  
  destination:  
    namespace: kafka-ui  
    server: 'https://kubernetes.default.svc'
  source:  
    path: manifests/kafka-ui  
    repoURL: 'git repo url'  
    targetRevision: HEAD  
  sources: []
  project: default  
  syncPolicy:  
    automated: {}&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;helm chart 사용&lt;/h1&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;argocd를 통해 helm chart를 배포할 경우 helm 배포 리소스가 생성되지 않고 argocd를 통해 리소스가 관리되므로helm 명령을 통해 관리할 수 없게 된다. helm 명령을 통해 지속적인 관리를 할 경우 argocd를 피해 다른 배포 방법을 사용하는게 좋다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;helm chart와 override value 파일을 분리해서 사용할 때 예시&lt;/p&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: superset-cluster
  namespace: argocd
spec:
  destination:
    namespace: superset
    server: 'https://kubernetes.default.svc'
  sources:
    - repoURL: 'https://apache.github.io/superset'
      targetRevision: 0.10.5
      chart: superset
      helm:
        valueFiles:
          - $values/charts/superset/values.yaml
        releaseName: superset-cluster
    - repoURL: 'git repo url'
      targetRevision: main
      ref: values
  project: default
  syncPolicy:
    automated: {}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>k8s</category>
      <category>argocd</category>
      <category>argocd application yaml</category>
      <category>k8s</category>
      <author>shepherd.dev</author>
      <guid isPermaLink="true">https://shepherd44.tistory.com/36</guid>
      <comments>https://shepherd44.tistory.com/36#entry36comment</comments>
      <pubDate>Wed, 16 Aug 2023 17:24:17 +0900</pubDate>
    </item>
    <item>
      <title>spark streaming batch size</title>
      <link>https://shepherd44.tistory.com/34</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;spark streaming kafka에서 batch size 조절 옵션&lt;/p&gt;
&lt;pre class=&quot;lisp&quot;&gt;&lt;code&gt;df = (
    stream_reader
    .option(&quot;maxOffsetsPerTrigger&quot;, &quot;100000&quot;)
    .load()
)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://spark.apache.org/docs/latest/structured-streaming-kafka-integration.html&quot;&gt;https://spark.apache.org/docs/latest/structured-streaming-kafka-integration.html&lt;/a&gt;&lt;/p&gt;</description>
      <category>Data Engineering</category>
      <category>spark</category>
      <category>Spark Streaming</category>
      <category>spark structured streaming</category>
      <author>shepherd.dev</author>
      <guid isPermaLink="true">https://shepherd44.tistory.com/34</guid>
      <comments>https://shepherd44.tistory.com/34#entry34comment</comments>
      <pubDate>Fri, 21 Jul 2023 00:26:57 +0900</pubDate>
    </item>
    <item>
      <title>[k8s] 기록 - etcd 리더 선출 실패로 실행되지 않을 경우 리더 선출 없이 실행</title>
      <link>https://shepherd44.tistory.com/33</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;control plane A에 control plane을 추가하던 중 control plane A가 죽으면서 control plane B의 etcd 복제가 중지되고 control plane B 추가 과정이 멈추게 되었다.&lt;br /&gt;문제 발생 후 control plane A의 etcd에서 control plane B의 etcd를 찾을 수 없어 리더 선출 실패라는 메시지와 함께 리더 선출을 계속 실패했다.&lt;br /&gt;느낌상 두번째 control plane을 붙이는 중 실패하면서 노드가 짝수가 되어(split-brain) 실패하는걸로 보였다.&lt;br /&gt;리더 선출 실패는 control plane B의 ip가 미사용 interface에 셋팅된 ip로 설정되면서 A와 B의 통신 실패로 리더 선출 과정이 정상적으로 이루어 지지 않았다.&lt;br /&gt;control plane B의 미사용 network interface 내리고 다시 붙여봤지만, A의 etcd 가 죽은 상황이라 k8s api server도 죽은 상황이라 다음 단계를 진행할 수가 없었다.&lt;br /&gt;etcdctl 를 통해 etcd에서 B를 제거하고 싶어도 etcd 리더 선출이 되질 않아 etcdctl는 계속 context expire만 발생해서 etcd member를 제거할수도 없었다. 백업도 해두지 않은 상황이라 control plane A의 etcd를 꼭 다시 살려야만 했다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;해결&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여러 삽질 후 강제로 leader로 만드는 옵션을 찾았다. etcd 같은 버전으로 수동으로 실행시켜 보았다.&lt;/p&gt;
&lt;pre id=&quot;code_1675833659589&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;etcd --data-dir=/var/lib/etcd --force-new-cluster&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;해당 옵션으로 잘 실행되고 etcd api 서버도 잘 실행되고, member가 하나만 존재하는 상태로 잘 올라왔다.&lt;br /&gt;데이터도 정상이어서 다행히 k8s cluster가 날라가는 일은 없었다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;etcd 2버전대 backup을 복구할 경우 사용하던 옵션 같다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://etcd.io/docs/v2.3/admin_guide/#restoring-a-backup&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://etcd.io/docs/v2.3/admin_guide/#restoring-a-backup&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;복구 후 드는 생각들&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;작업 전 백업 필수&lt;/li&gt;
&lt;li&gt;주기적인 백업 셋팅 필요해 보임&lt;/li&gt;
&lt;li&gt;control plane 붙이기 전 설정 확인&lt;/li&gt;
&lt;li&gt;휴먼 에러 줄이기 위해 노드 셋팅 자동화&lt;/li&gt;
&lt;li&gt;etcd 3버전에선 snapshot으로 백업을 하는데 snapshot의 경우 etcd api server가 살아 있어야 restore 가능해 보였다. 동일한 문제가 발생한 경우 snapshot으로 복구가 가능할지 테스트 필요함&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>k8s</category>
      <category>etcd</category>
      <category>k8s</category>
      <category>Kubernetes</category>
      <author>shepherd.dev</author>
      <guid isPermaLink="true">https://shepherd44.tistory.com/33</guid>
      <comments>https://shepherd44.tistory.com/33#entry33comment</comments>
      <pubDate>Wed, 8 Feb 2023 20:33:31 +0900</pubDate>
    </item>
    <item>
      <title>window package manager</title>
      <link>https://shepherd44.tistory.com/32</link>
      <description>&lt;h1&gt;Windows Package Manager&lt;/h1&gt;
&lt;p&gt;기존에 사용하던 window package manager보다 괜찮아 보이는 package manager를 발견하여 글을 씁니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://scoop.sh/&quot;&gt;scoop&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;NOTE&lt;/strong&gt;&lt;br&gt;chocolatey라는 package manager도 있어서 같이 사용해 봤습니다.&lt;br&gt;설치 과정이나 사용법 등 명령어만 다르고 같은 동작을 하며, GUI 환경도 제공합니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Install&lt;/h2&gt;
&lt;p&gt;설치 방법은 아래와 같이 간단합니다.&lt;/p&gt;
&lt;p&gt;설치는 powershell admin에서 진행&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;# powershell admin
Set-ExecutionPolicy RemoteSigned -scope CurrentUser
Invoke-Expression (New-Object System.Net.WebClient).DownloadString(&amp;#39;https://get.scoop.sh&amp;#39;)&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Usage&lt;/h2&gt;
&lt;p&gt;설치한 다음부터는 git bash를 통해 진행&lt;/p&gt;
&lt;h3&gt;search&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;scoop search terraform&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;install&lt;/h3&gt;
&lt;p&gt;설치 후 바로 사용 가능합니다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;scoop install terraform
terraform --version
scoop install nvm
nvm --version&lt;/code&gt;&lt;/pre&gt;</description>
      <category>IT</category>
      <category>Scoop</category>
      <category>windows package manager</category>
      <author>shepherd.dev</author>
      <guid isPermaLink="true">https://shepherd44.tistory.com/32</guid>
      <comments>https://shepherd44.tistory.com/32#entry32comment</comments>
      <pubDate>Sun, 12 Sep 2021 18:57:03 +0900</pubDate>
    </item>
    <item>
      <title>Node.js 버전 관리</title>
      <link>https://shepherd44.tistory.com/31</link>
      <description>&lt;h1&gt;Node.js 버전 관리&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;재택근무를 하다보니 집에서 사용하는 컴퓨터에 설치된 nodejs 버전(14)과 회사에서 사용하는 nodejs 버전이 달라 문제가 발생했다.&lt;br /&gt;linux에서 openjdk의 버전을 선택적으로 사용했던 기억이 나서 비슷한게 있나 찾아보니 nvm이란 프로그램을 발견했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;npm으로 간단하게 설치할 수 있어서 설치해보니 window에서는 사용 불가능...&lt;br /&gt;다시 검색을 해보니 window는 따로 설치해야 된다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Window NVM: &lt;a href=&quot;https://github.com/coreybutler/nvm-windows&quot;&gt;https://github.com/coreybutler/nvm-windows&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;scoop이나 chocolatey에서도 제공하니 사용한다면 설치 가능!&lt;/p&gt;
&lt;pre class=&quot;mipsasm&quot;&gt;&lt;code&gt;# install nvm with scoop
scoop install nvm
# install nvm with chocolatey
choco install nvm&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;간단 사용 방법&lt;/h3&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;# install nodejs version 14
nvm install 14.12.1
# install nodejs version 12
nvm install 12.18.3
# use nodejs version 14
nvm use 14.12.1&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;nvm window npm update error&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;window에서 nvm으로 nodejs를 설치할 경우 npm update시 error가 발생한다.&lt;/p&gt;
&lt;pre class=&quot;taggerscript&quot;&gt;&lt;code&gt;$ npm install -g npm
npm ERR! code EEXIST
npm ERR! path C:\Users\sheph\scoop\apps\nvm\current\nodejs\nodejs\npm.cmd
npm ERR! Refusing to delete C:\Users\sheph\scoop\apps\nvm\current\nodejs\nodejs\npm.cmd: is outside C:\Users\sheph\scoop\apps\nvm\current\nodejs\nodejs\node_modules\npm and not a link
npm ERR! File exists: C:\Users\sheph\scoop\apps\nvm\current\nodejs\nodejs\npm.cmd
npm ERR! Remove the existing file and try again, or run npm
npm ERR! with --force to overwrite files recklessly.

npm ERR! A complete log of this run can be found in:
npm ERR!     C:\Users\sheph\AppData\Roaming\npm-cache\_logs\2021-09-09T15_12_35_230Z-debug.log&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;아래 gist의 shell로 npm을 한번 업데이트하면 그 뒤로는 문제없이 업데이트 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;shell code지만 git bash에서 사용가능하니 다운 받은 뒤 git bash로 접속하여 아래 코드를 실행하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;
&lt;script src=&quot;https://gist.github.com/shepherd44/5b63769dffc1a29403b12dc234c7fd40.js&quot;&gt;&lt;/script&gt;
&lt;/p&gt;
&lt;pre class=&quot;stata&quot;&gt;&lt;code&gt;sh window-npm-update.sh&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Node.js</category>
      <category>nvm</category>
      <author>shepherd.dev</author>
      <guid isPermaLink="true">https://shepherd44.tistory.com/31</guid>
      <comments>https://shepherd44.tistory.com/31#entry31comment</comments>
      <pubDate>Fri, 10 Sep 2021 00:51:42 +0900</pubDate>
    </item>
    <item>
      <title>vcpkg</title>
      <link>https://shepherd44.tistory.com/30</link>
      <description>&lt;h1&gt;vcpkg&lt;/h1&gt;
&lt;p&gt;window 외부 라이브러리를 설치하는 방법은 꽤 까다롭다.&lt;/p&gt;
&lt;p&gt;linux에선 패키지 관리자에서 검색하면 대부분의 라이브러리는 제공하는 경우가 많았다.&lt;/p&gt;
&lt;p&gt;하지만 windows에서는 이러한 패키지 관리자가 따로 없어 필요한 라이브러리마다 찾아서 빌드하거나 빌드된 바이너리를 찾아서 사용하였다.&lt;/p&gt;
&lt;p&gt;그러던 중 window에서도 linux처럼 패키지 관리자로 편하게 외부 라이브러리를 받는 방법을 찾았다.&lt;/p&gt;
&lt;h2&gt;특징&lt;/h2&gt;
&lt;p&gt;linux에서는 apt나 yum과 같은 패키지 관리자로 라이브러리를 설치하면 간편하게 라이브러리를 받을 수 있다.&lt;/p&gt;
&lt;p&gt;vcpkg를 설치했다면 다음 명령어 openssl을 설치할 수 있다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-console&quot;&gt;PS&amp;gt; vcpkg install openssl&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;그 뒤엔 visual studio에서 그냥 사용하면 된다.(vcpkg integration 설정 후)&lt;/p&gt;
&lt;h2&gt;설치 방법&lt;/h2&gt;
&lt;p&gt;설치 방법도 간단하다.&lt;/p&gt;
&lt;h3&gt;vcpkg 명령어 설치&lt;/h3&gt;
&lt;p&gt;git에서 vcpkg를 받은 뒤 bootstrap-vcpkg를 실행하면 된다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-console&quot;&gt;PS&amp;gt; git clone https://github.com/Microsoft/vcpkg.git
PS&amp;gt; cd vcpkg
PS&amp;gt; .\bootstrap-vcpkg.bat&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;위 명령을 실행하고 나면 해당 폴더에 vcpkg 명령이 생긴다.&lt;/p&gt;
&lt;p&gt;편한 사용을 위해 해당 경로를 PATH 환경변수에 등록하면 된다.&lt;/p&gt;
&lt;h3&gt;vcpkg 자동완성 추가&lt;/h3&gt;
&lt;p&gt;vcpkg 명령의 자동완성을 원한다면 아래 명령도 추가 실행하면 된다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-console&quot;&gt;PS&amp;gt; vcpkg integrate powershell&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;visual studio import&lt;/h3&gt;
&lt;p&gt;설치한 패키지를 visual studio project에서 자동으로 import되도록 하기 위해서는 아래 명령을 수행해야 한다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-console&quot;&gt;PS&amp;gt; vcpkg integrate install&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;따로 project 설정을 해줄 필요없이 자동으로 설치된 패키지를 찾아준다.&lt;/p&gt;
&lt;p&gt;심지어 linking도 알아서 해준다.&lt;/p&gt;
&lt;p&gt;실질적으로 vcpkg에서 이 부분이 제일 마음에 든다.&lt;/p&gt;
&lt;h2&gt;vcpkg 업그레이드&lt;/h2&gt;
&lt;p&gt;vcpkg를 업그레이드 하는 방법은 vcpkg 설치 폴더로 이동한 다음 아래 명령을 실행하면 된다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-console&quot;&gt;PS&amp;gt; git pull
PS&amp;gt; .\bootstrap-vcpkg.bat&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;자주 사용하는명령&lt;/h2&gt;
&lt;p&gt;vcpkg 에서 자주 사용할 명령어 모음&lt;/p&gt;
&lt;h3&gt;패키지 설치&lt;/h3&gt;
&lt;p&gt;필요한 라이브러리를 설치할 때 사용&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-console&quot;&gt;PS&amp;gt; vcpkg install openssl&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;패키지를 설치한다면 설치된 패키지는 vcpkg 폴더의 packages 폴더에 설치되게 된다.&lt;/p&gt;
&lt;h3&gt;설치된 패키지 검색&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-console&quot;&gt;PS&amp;gt; vcpkg list&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;패키지 검색&lt;/h3&gt;
&lt;p&gt;vcpkg 에서 제공하는 패키지를 검색&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-console&quot;&gt;PS&amp;gt; vcpkg search openssl&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;참고&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.microsoft.com/ko-kr/cpp/build/vcpkg?view=vs-2017&quot;&gt;cvpkg ms manual&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/Microsoft/vcpkg&quot;&gt;vcpkg git&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;</description>
      <category>vcpkg</category>
      <author>shepherd.dev</author>
      <guid isPermaLink="true">https://shepherd44.tistory.com/30</guid>
      <comments>https://shepherd44.tistory.com/30#entry30comment</comments>
      <pubDate>Sun, 18 Aug 2019 00:58:52 +0900</pubDate>
    </item>
    <item>
      <title>wsl2(preview version) network unreachable error</title>
      <link>https://shepherd44.tistory.com/29</link>
      <description>&lt;h1&gt;wsl2(preview version) network unreachable error&lt;/h1&gt;
&lt;p&gt;wsl2 업그레이드 후 network unreachable 문제가 발생하는 경우가 있다.&lt;/p&gt;
&lt;p&gt;wsl의 라우트 설정이 정상적으로 되지 않아서 발생하는데 아직 개발중인 버전이라 그런 것 같다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;window에서 확인한 wsl 아답터&lt;/p&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/bvwWpD/btqxtrfGCvn/mf5d8XuxfR5TnwPR22J23K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvwWpD/btqxtrfGCvn/mf5d8XuxfR5TnwPR22J23K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvwWpD/btqxtrfGCvn/mf5d8XuxfR5TnwPR22J23K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvwWpD%2FbtqxtrfGCvn%2Fmf5d8XuxfR5TnwPR22J23K%2Fimg.png&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;/li&gt;
&lt;li&gt;&lt;p&gt;wsl2로 업그레이드 후 wsl 에서 확인한 설정&lt;/p&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/bJwuh8/btqxvo2QjNy/epkkJYhtKQsXkUtEQFJag0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJwuh8/btqxvo2QjNy/epkkJYhtKQsXkUtEQFJag0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJwuh8/btqxvo2QjNy/epkkJYhtKQsXkUtEQFJag0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJwuh8%2Fbtqxvo2QjNy%2FepkkJYhtKQsXkUtEQFJag0%2Fimg.png&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;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kyc1d/btqxuTCfLjR/zL5G0acbGnxXytCTNKJw6k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kyc1d/btqxuTCfLjR/zL5G0acbGnxXytCTNKJw6k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kyc1d/btqxuTCfLjR/zL5G0acbGnxXytCTNKJw6k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fkyc1d%2FbtqxuTCfLjR%2FzL5G0acbGnxXytCTNKJw6k%2Fimg.png&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;/li&gt;
&lt;/ul&gt;
&lt;p&gt;wsl에서 route 설정과 subnet이 이상하다.&lt;/p&gt;
&lt;h2&gt;해결방법&lt;/h2&gt;
&lt;p&gt;해결방법은 아래와 같다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;window cmd에서 ipconfig로 wsl 아답터 주소 확인&lt;/p&gt;
&lt;p&gt;위 캡처에서는 192.168.176.1에 서브넷 마스크 255.255.240.0&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;wsl 접속 후 network 주소 변경&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ sudo ifconfig eth0 netmask 255.255.240.0
$ sudo ip route add default via 192.168.176.1&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;변경 후 network 설정&lt;/p&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/cf3aYM/btqxuUBbsxO/mJp5ILES2AXkd6Bas8DmO1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cf3aYM/btqxuUBbsxO/mJp5ILES2AXkd6Bas8DmO1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cf3aYM/btqxuUBbsxO/mJp5ILES2AXkd6Bas8DmO1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcf3aYM%2FbtqxuUBbsxO%2FmJp5ILES2AXkd6Bas8DmO1%2Fimg.png&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;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZmvo8/btqxuSXENFw/Qso6BmVp59TNwKiJog8yfk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZmvo8/btqxuSXENFw/Qso6BmVp59TNwKiJog8yfk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZmvo8/btqxuSXENFw/Qso6BmVp59TNwKiJog8yfk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZmvo8%2FbtqxuSXENFw%2FQso6BmVp59TNwKiJog8yfk%2Fimg.png&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;/li&gt;
&lt;/ol&gt;
&lt;p&gt;이 후 정상적으로 네트워크 사용이 되는것을 확인 했다.&lt;/p&gt;
&lt;h2&gt;참고&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;[wsl netowrk issue][&lt;a href=&quot;https://github.com/microsoft/WSL/issues/4275%5D&quot;&gt;https://github.com/microsoft/WSL/issues/4275]&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;</description>
      <category>IT</category>
      <category>window1 preview</category>
      <category>wsl2</category>
      <author>shepherd.dev</author>
      <guid isPermaLink="true">https://shepherd44.tistory.com/29</guid>
      <comments>https://shepherd44.tistory.com/29#entry29comment</comments>
      <pubDate>Thu, 15 Aug 2019 23:36:45 +0900</pubDate>
    </item>
    <item>
      <title>virtualbox6 with hyper-v</title>
      <link>https://shepherd44.tistory.com/28</link>
      <description>&lt;p&gt;virtualbox6 feature에서 눈에 띄는 부분이 있다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Added support for using Hyper-V as the fallback execution core on Windows host, to avoid inability to run VMs at the price of reduced performance In addition, the following items were fixed and/or added&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;약간의 성능 저하를 감수하고 hyper-v를 fallback excution core로 사용함으로써 hyper-v를 지원한다는 것!&lt;/p&gt;
&lt;p&gt;별다른 설정은 필요없고 virtualbox 6.0 으로 업그레이드만 진행하면 된다. (virtualbox 6.0은 64bit만 지원하기 때문에 업그레이드 시 참고)&lt;/p&gt;
&lt;p&gt;이걸로 docker와 virtualbox를 동시에 쓸 수 있다.&lt;/p&gt;
&lt;h2&gt;참고&lt;/h2&gt;
&lt;p&gt;window 10 1903 버전(preview)에 대한 지원은 되지 않아 동시 사용이 되질 않는다.&lt;/p&gt;
&lt;p&gt;wsl2를 써보기 위해 설치했다가 낭패봤다.&lt;/p&gt;
&lt;p&gt;docker, virtualbox(with vagrant)를 동시에 쓰는데, 업데이트 때 막힌다면 그냥 virtualbox에 docker를 설치해서 쓰는게 더 마음편할 것 같다.&lt;/p&gt;
&lt;h2&gt;참고 자료&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://www.virtualbox.org/wiki/Changelog-6.0&quot;&gt;virtualbox 6 changelog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.sysnative.com/forums/threads/windows-10-version-1903-hyper-v-is-currently-incompatible-with-virtualbox-6-0-x.28466/&quot;&gt;Windows 10 Version 1903 Hyper-V Is Currently Incompatible with Virtualbox 6.0.x&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;</description>
      <category>hyper-v</category>
      <category>virtualbox</category>
      <category>virtualbox6</category>
      <author>shepherd.dev</author>
      <guid isPermaLink="true">https://shepherd44.tistory.com/28</guid>
      <comments>https://shepherd44.tistory.com/28#entry28comment</comments>
      <pubDate>Sun, 11 Aug 2019 20:36:03 +0900</pubDate>
    </item>
  </channel>
</rss>