8/02/2017

도커 이미지에 볼륨 마운트시 소유권한 문제

Docker 이미지를 VM 이나 기타 환경에서 동작시킬 때 문제 중 하나는, 특정 프로퍼티파일이나 볼륨 마운트를 실시간에 Puppet등으로 docker -v 를 통해서 붙이는 경우의 파일 퍼미션이다. 이를테면 도커 이미지에서 동작하는 톰캣의 UID와 GID가 각각 1200:1200 이런 식이라고 할 때, 볼륨 마운트 시킨 파일의 퍼미션이 위와 같이 일치하지 않거나 최소한 읽기 권한 등이 없으면 파일에 접근할 수가 없다.
이것의 또 다른 문제점은 해당 docker 이미지 내의 UID / GID가 puppet이나 도커 이미지를 실행하는 VM에 의해서 생성된 것이 아니라는 것이다. 
언뜻 생각하기에는 실행하는 VM이 해당 도커 이미지 안으로 로그인하여 파일 소유 권한을 바꿔야 하는 특정 디렉토리에 접근해서 해당 디렉토리/파일의 UID GID를 VM의 것으로 바꾸던지(이런 경우 passwd와 group의 것도 바꿔야 함) 하면 될 것 같지만 이런 경우 immutable environment 라는 컨셉이 깨질 수가 있고( 도커 이미지로 만들어질 때와 그 이후 실행될 때의 상태가 다름), 또한 의도치 않게 도커 이미지 안에서 해당 UID GID로 실행되어야 하는 다른 것들이 있을 경우 그 프로세스들이 접근 퍼미션 문제를 겪을 수가 있다.
또 다른 방법으로는 도커를 실행하는 프로세스가 docker run -t <image name> /bin/bash 등으로 도커 이미지 내부에 들어가서 /etc/password와 /etc/group 등에 접근해서 UID PID를 알아낸 다음 그걸 이용해서 도커에 마운트하는 로컬 볼륨의 소유권한을 바꾸는 방법이 있을 수 있다. 
이것도 뭔가 구리다 싶으면 마지막 방법으로는 그냥 서로 "약속"을 통해서 해당 마운트를 읽어들여야 하는 계정의 UID와 GID를 미리 정해놓는 것이다. 즉 도커 이미지를 생성할 때 추가할 tomcat의 UID GID를 1200으로 미리 맞춰놓고 도커 이미지를 실행하는 VM의 Puppet등이 docker -v 로 마운트하는 볼륨의 소유권한을 죄다 1200:1200으로 바꿔놓는 것이다. 유저명이나 그룹 이름은 매칭할 필요가 없다 어차피 UID GID가 같으면 그냥 같은 애들이니깐.
좀 무식한 것 같지만 사실 마지막 방법이 제일 편하다. -_-;; (퇴근전에 왜 이런 뻘글을 쓰고 있나)
제일 쉬운 방법은 그냥 읽어들여야 하는 내용을 파일에 넣지 말고 어디 데이터베이스나 key/value storage(etcd같은?) Vault 같은 곳에 넣고 읽으면 될 것 같지만.. 그럼에도 볼구하고 파일을 런타임시 마운트해서 읽어야 하는 케이스는 종종 존재한다. 혹시 같은 문제를 겪고 있는 혹은 곧 겪을 분들은 참고하시라.

7/24/2017

Hyper X Cloud II vs. Logitech G633 비교

페이스북에서 쓰기 시작하다가 내용이 길어져서 미디엄과 블로거로 옮김.
집에서는 HyberX Cloud II Gaming Headset을 쓰고 회사에서는 Logitech G633을 쓰고 있는데 나름 두개 다 게이밍 헤드셋 중에서는 가격이나 성능이 중급 이상은 되는 기기들이다. 혹시라도 게이밍 해드셋 고민중이신 분들께 도움을 드릴 겸 평을 써보자면…
헤드셋의 마이크 감도는 로지텍쪽이 월등한 듯 하다. 문제는 굳이 들리지 않아도 되는 주변 소음까지 너무 잘 잡는 듯한 느낌. 마이크의 성능이나 상대방이 듣는 음질 자체는 HyberX Cloud II가 나은 듯.
G633은 헤드셋 자체에 매크로 버튼이랑 볼륨 조절 버튼이 왼쪽 헤드셋 자체에 붙어 있어서 게임하거나 음악 듣다가 음량 조절이 무척 쉽다. 매크로 키는 거의 쓸데가 없고… HyberX Cloud 는 다른 헤드셋과 마찬가지로 헤드셋 줄에 붙어있는 컨트롤러를 통해서 조절가능. 다만 여기 마이크랑 헤드셋, 그리고 7.1채널 시뮬레이션을 해주는 버튼이 같이 붙어 있어서 마이크와 헤드셋 음량을 동시 조절하긴 이쪽이 편함.
G633은 USB와 3.5mm잭을 동시에 입력받을 수 있음. 이 말이 뭐냐면 만약에 PC와 맥을 동시에 가지고 있다면 PC에 G633의 USB 포트를 연결하고 맥에 3.5mm잭을 연결하면 PC로 게임이나 작업을 하면서 소리를 듣다가도 혹시라도 맥쪽에서 이벤트가 발생하거나 뭔가 소리가 시스템으로부터 발생하면 그 소리도 같이 들을 수 있음. 쓸데없다면 쓸데없지만 또 유용하게 쓸 수 있는 기능. (당연히 3.5mm용 컨트롤러도 붙어 있어서 볼륨조절이나 마이크 뮤트가 가능)
글을 쓰고 있는 현재 시점에 가격대는 둘 다 비슷비슷한 $100 USD근처. 다만 무선 버전을 원한다면 G633의 무선버전인 G933도 있다. G933은 유선기능은 G633과 동일하고 거기다가 무선 연결도 지원하는 버전. 가격은 현재 기준으로 대략 $140USD.
귀와 접촉하는 부분의 재질을 보자면, HyberX Cloud II는 두가지, 가죽과 천 모두를 지원한다. 근대 개인적으로 가죽 재질은 게임할때 정말 덥다. 특히나 게임하다 보면 몰입해서 얼굴이나 귀에 땀이 차기 쉬운데(나는 그럼 -_-;; 안그런 게임은 재미가 없으니까) HyperX Cloud II는 가죽과 천 재질 두가지를 제공하고 이걸 교체 가능하긴 한데.. 가죽은 덥고 땀 차이고.. 천 재질은 이상하게도 먼지가 잘 들러붙는다. 정전기가 잘 발생하는 재질인거 같기도. 반면에 G633은 천재질만 재공하긴 하는데 최소한 먼지가 들러붙진 않는다. 다만 G633은 약간 귀를 감싸는 부분이 사각형 비슷해서 귓볼이 좀 크거나 귀 모양이 많이 둥근 사람이라면 귀 일부분이 헤드셋 커버 부분과 접촉될 수 있어서 불편함을 느낄 수 있음. 반면 Hyper X Cloud II 는 거의 완벽하고 둥근 모양이라서 덜 그런 듯.
두가지 모두 6개월 이상 쓰고 있는 사용자로써의 리뷰는 여기까지.

3/08/2017

Hackerrank Array Left Rotation test case failing at test case 6, 8, 9

I'm learning GoLang and decided to do some algorithm quiz at Hackerrank with Go instead of reading and just follow up the tutorial code.

The one I tried yesterday was https://www.hackerrank.com/challenges/ctci-array-left-rotation

Following was my initial solution. It's kind of brute-force algorithm for shift things left, but anyway...

package main
import (
    "fmt"
    "strings"
    "bufio"
    "os"
    "bytes"
)

func main() {
    var len, nToRotate int
    var input string
    var buffer bytes.Buffer
    
    fmt.Scanln(&len, &nToRotate)
    
    scanner := bufio.NewScanner(os.Stdin)
    for scanner.Scan() {
        buffer.WriteString(scanner.Text())
    }
    input = buffer.String()
    var items []string
    items = strings.Fields(input)
    
    //fmt.Printf("%d", len(items))
    
    for i := 0; i < nToRotate; i++ {
        items = append(items[1:], items[0])
    }
    
    fmt.Println(strings.Join(items[:]," "))
}

My code passed the test when I clicked "Run Code", but it's failing unit test 6, 8, 9 when submitting the code. Those 6, 8, and 9 is pretty long one line input string and I was wondering if it's some kind of timeout or library error due to input string size.

After hours of investigation and asking questions to other GoLang experts ( than me ), I was able to pass all the tests and submitted the solution. Here is my answer. I changed algorithm a bit to be more time/space efficient as well. Check the highlighted line which was the solution of Runtime Error in Hackerrank page.

package main
import (
 "fmt"
)


func main() {
 var (
  length, nToRotate int
 )

 fmt.Scanln(&length, &nToRotate)

 items := make([]string, length)
 for i := 0; i < length; i++ {
  fmt.Scan(&items[i])
 }

 items = ShiftLeft(items, nToRotate)

 for i := 0; i < len(items); i++ {
  fmt.Printf("%s ", items[i])
 }
}

func ShiftLeft(items []string, nToRotate int) []string {
 var (
  i, j, k int
  temp string
 )
 size := len(items)
 for i = 0; i < gcd(nToRotate, size); i++ {
  temp = items[i];
  j = i
  for {
   k = j + nToRotate
   if k >= size {
    k = k - size
   }
   if k == i {
    break
   }
   items[j] = items[k]
   j = k
  }
  items[j] = temp
 }
 return items
}

func gcd(x, y int) int {
 for y != 0 {
  x, y = y, x % y
 }
 return x
}


And I just found that someone already had same issue (of course) with Go, and opened issue at GoLang's GitHub page. Check those conversation if you want to understand more about the issue.

https://github.com/golang/go/issues/17910


3/02/2017

HVAC 수리 및 견적 요령

아파트가 아닌 스스로 관리해야 하는 개인주택 혹은 콘도 등에 살게 되면 HVAC(Heating Ventilation and Air-Conditioning) 문제를 꼭 한번씩은 겪게 된다.  새로 지은 주택이 아닌 이상 미국에서 주택을 구입하면 주택이 20~50년 된 경우가 아주 흔한데, 이런 경우 에어컨이나 히터, 혹은 그 공기들을 집 안으로 배분해주는 Duct등에 꼭 문제가 있기 마련이다.

특히나 태양이 뜨거운 Southern California지역이라면 한여름에 에어컨이 고장나서 온 가족이 고생하고, 수리기사를 불러도 죄다 바빠서 2~3주 후에나 올 수 있는 경우가 있기 때문에 다가오는 여름을 대비해서 날씨가 더워지기 전에 미리미리 에어컨을 점검하고 손봐두는 것이 필요하다.

오래된 집의 에어컨이 고장나서 기사를 부르게 되는 경우 간단한 수리 이외에도 열에 아홉은 에어컨 교체를 권유하는 경우가 흔하다. 특히나 전국적으로 체인을 가지고 있는 큰 회사일수록 이런 upselling을 하려는 경우가 많은데, 그 대부분은 예전 에어컨들이 사용하는 냉매인 R22의 생산이 금지되었고 대체제인 R410A를 사용하는 제품들이 나와 있기 때문에 멀쩡한 것도 고장났다든가 혹은 냉매가 어디선가 세고 있다면서 이번 기회에 R410A를 쓰는 에어컨으로 교체해야 한다라는 식으로 유도한다.
 R22는 환경을 파괴한다는 오존성분이 들어가 있어서 그렇다고 하는데, 아무튼 돈이 넘쳐난다면 뭐 죄다 바꿔버리면 되겠지만 그렇지 않고 에어컨을 교체해야 하는 경우라면, 이 에어컨이 실외기(AC condenser)만 교체하면 되는게 아니라 R22에서 R410A로 냉매를 바꾸게 되면 집 안 attic이나 기타 위치에 설치되어 있는 evaporate coil도 함께 교체를 해야 한다. 요렇게 두개만 교체하게 되더라도 이미 기기값이 대략 2천후반에서 4천달러 가까이 되고(SEER라고 해서 에너지 효율이 높은 것일수록 크고 비쌈), 역시나 미국답게 인건비가 거의 한 태반을 차지하게 되서 아무리 저렴한 기본 14 SEER정도의 대략 1200~1600 sqft를 커버하는 장비로 설치를 하더라도 6천달러는 쉽게 넘어가고 혹시나 규모가 크고 upselling하는 곳이랑 진행을 하면 8천달러도 훌쩍 넘어간다. 아마도 흥정하기 전에 처음 받는 quote는 이미 만불을 훌쩍 넘었을 것.
이뿐만이 아니라 하면서 duct도 오래되었고 효율이 안좋고 insulation이 잘 안된다면서 이것도 교체하라고 권하는데 처음에 이미 만달러라는 견적을 듣게 되면 나름 큰 금액인 덕트 재 설치 비용인 2천~3천달러는 아무것도 아닌 것 처럼 느껴지게 됨.

미국에서는 뭐든 그렇겠지만, 절대로 한 군데서 견적을 받아서 그대로 진행하지 말고 COSTCO랑 하는 서비스든 아니면 Yelp에서 별다섯개짜리 리뷰를 받는 업체든 최소한 3군데 이상 HVAC 기사 불러서 견적을 내봐야 함. 대충 느낌은 전국적으로 체인이 있는 곳이 가장 비싸고(대신 뭐 24시간 출동서비스, lifetime warranty등등 바가지 씌우는 만큼 뭐 보증은 빠방하다고 말함), 집근처 동네 로컬엣어 장사하는 사람들일 수록 저렴하다. 동네라고 해도 한국의 철물점 수준인 곳도 있지만 family business 등으로 해서 꽤 오랫동안 지역주민들과 교류를 하면서 규모도 나름 큰 곳들도 있다. 특히나 furnace나 AC condenser 등은 캐리어라든지 하는 브랜드의 것을 설치하기 때문에 장비에 대한 워런터는 대형회사로부터 딸려오고, 수리가 필요할 경우 labor warranty를 설치한 업체에서 제공해주기 때문에 크게 워런티를 신경쓸 필요는 없다. 아 물론 돈 많으면 lifetime warranty를 제공해 주는 곳에서 그냥 furnace부터 AC condenser 그리고 덕트까지 쫙 바꿔버리는게 속편하긴 하겠다.

아무튼 서너군데 비교해보면서 슬쩍슬쩍 앞쪽 받았던 애들의 견적보다 조금씩 싸게 부르면서 견적을 또 보면 또 업체마다 어디가 문제다 어디가 문제다 이야기를 하는데, 어떤 부분은 굳이 고칠 필요가 없는 upsell인 부분이 있고, 또 어떤 부분은 실제로 문제가 있어서 꼭 고쳐야 하는 부분이 있다. 여러 업체에서 공통으로 지적하는 부분이 있다면 그 부분이야 말로 정말로 고쳐야하는 부분.

내가 얼마 전에 겪은 케이스도, 처음에는 home depot의 프로모션이라면서 heater tune up 서비스를 39달러? 29달러? 정도에 해준다길래 그쪽에 연락을 했더니 처음 온 회사가 전국규모의 서비스회사였는데... 튠업 한다고 attic으로 올라가더니 이것저것 지적을 시작, 아무튼 정확하게 위에서 이야기한 것 처럼 evaporator coil 바꾸고 AC condenser 바꾸고 또 덕트 작업도 하고 이래저래 해서 그들이 지적한 부분을 고치는데 처음 견적이 만불이 나왔다.  아무리 그래도 이건 아니지 싶어서 2천 달러를 후려쳐서 8천달러 해주면 내가 주말동안 생각해보고 월요일 전에 이야기해주겠다 했더니 선뜻 2천 달러를 깎아주는 게 아닌가?
어라 이것봐라? 하는 생각에 Costco쪽 HVAC에도 연락하고 그 외에 yelp에서 찾은 근처 지역 리뷰 좋은 곳 두곳을 추가로 불러서 견적을 받아 봄. 처음 애들은 furnace도 바꿔야하니 어쩌니 하는데 그 뒤에 온 3군데는 furnace는 교체된 지 3~4년밖에 안된것 같고 아무 문제가 없다는 이야기는 동일했고, 3 업체 모두 일부 leaking duct가 있는데 이 부분을 잘라내고 새 덕트로 연결하는 작업이 필요하다는 이야기까진 동일, 그런데 이 작업을 하는데 업체마다 견적이 225달러, 300달러, 그리고 800달러가 나왔다. 단 800달러를 부른 업체는 덕트 수리해야 하는 부분이 이전 두 업체에서 지적한 곳 외에도 여기저기 이음새 부분등을 해야 한다고 이야기 함.
evaporate coil과 AC condenser의 경우에는 뒤의 세 업체 중 두 업체는 R22를 쓰긴 하지만 현재 에어컨 기능에는 문제 없고 굳이 바꿀 필요없다, 그리고 한 업체는 롱텀으로 보고 교체하면 좋고 매년 R22 가스 가격도 오를거기 때문에 하면 좋다.. 근데 꼭 안해도 되긴 한다.. 라는 이야기였다.

결국은 leaking duct를 손보면(지금 생각해보니 그 부분은 처음 현재 살고 있는 집을 살때 인스펙터가 한번 지적해서 동네 핸디맨을 불러서 패치를 했던 부분) 된다고 했던 업체에 $225를 지불하고 다음주 중에 수리를 할 예정. leaking duct가 있으면 여름에는 가열된 attic 속 공기가 냉방시설쪽으로 유입되어 냉방 효율이 안좋아지고 반대로 겨울에는 차가운 공기가 난방해야 되는 히터쪽으로 유입되거나 duct를 통해서 안쪽의 공기를 차갑게 만들어 난방효율이 또 안좋아지고 또한 attic의 먼지가 필터를 통하지 않고 바로 유입되어 evaporate coil에 쌓이게 되는 등등의 다양한 문제가 발생 가능하니 발견되는 대로 고쳐주는 것이 좋다.

그 외에도 이번에 HVAC이랑 attic / duct 관련 단열과 많은 것들을 알게 되었고 또 고려중인 프로젝트 들이 있는데 아무튼 하나씩 천천히 해 보는대로 포스팅을 해볼까 함.

한줄요약 : HVAC관련 수리가 필요할 때 반드시 여러군데 견적을 받아 볼 것.


2/28/2017

사진 온라인 2차 백업을 위한 선택. 아마존 프라임 포토 vs 구글 포토

현재 내가 아이폰과 카메라로 찍는 모든 사진과 동영상은 아이맥의 Photos를 통해서 가져오기를 하고 있고, 그 아이맥을 외장 USB 하드디스크를 이용해서 타임머신으로 백업을 하고 있다. 그리고 만약의 경우를 대비해서 잘 나온 사진들이나 즐거운 추억이 담긴 사진들은 코스트코를 이용해서 사진출력을 해서 앨범에 보관하고 있다.
문제는 이 모든 사진 소스들이 집이라는 한 곳에 모여 있다는 곳이고, 심지어 타임머신 백업 하드는 본체 아이맥과 10cm도 안떨어져 있는 관계로 화재라든지 혹시라도 지붕을 통한 워터 데미지, 지진, 도난 등이 발생하는 경우 통째로 디지털 원본과 백업이 사라질 수 있다는 것. 불나면 뭐... 앨범까지 홀라당 다 터버릴 것이고. 애플 아이클라우드를 통해서 백업하는 방법도 있겠지만, 이미 사진과 동영상의 용량이 1TB에 달하고 있어서 이것도 추가 공간 구입등의 문제로 비용이 만만치 않다.
그래서 뭔가 클라우드나 온라인 백업을 고려하기 시작햇는데, 어디 듣도보도 못한 이상한 그냥 웹하드랑 별반 다름없는 영세기업이나 언제 사라질지 모르는 스타트업이 운영하는 서비스는 이용하기 싫고, 저장용량 문제도 있고, 개인적으로 이것저것 따지다 보니 결국 아마존 프라임 포토와 구글 포토 두 가지가 물망에 올랐다.

Amazon Prime Photo : https://www.amazon.com/photos
Google Photo : https://photos.google.com

아마존 프라임 포토의 경우 이게 사실 별게 아니고 아마존 드라이브 서비스의 일종인데.. 프라임 포토를 통해서 업로드를 하면 그냥 아마존 드라이브 저장공간 중에 Pictures 쪽으로 저장이 된다. 아마존 프라임 멤버쉽이 있는 이용자의 경우 사진에 한해서는 무제한 용량을 제공하고, 동영상의 경우에는 5G의 용량 제한이 있어서, 이것보다 더 업로드를 하려면 추가로 1년에 $60 달러 정도를 지불하면 사진과 동영상 뿐만 아니라 아마존 드라이브에 업로드하는 모든 형태의 파일 저장 공간이 무제한이다.
구글 포토의 경우 업로드하는 이미지를 손실압축해서(여전히 high quality이긴 하겠지만) 업로드하는 옵션을 선택하면(웹이든 구글 포토 데스크탑 업로더든) 용량이 무제한, 그렇지 않고 아마존 프라임 포토처럼 오리지널을 업로드하려면 15G 정도의 제한이 있다. 다만 이 경우에는 사진과 동영상 구별을 하지는 않는 듯. 추가로 공간을 구입할 수 있긴 한데, 일단 테라 단위로 올라가면 구입 가격이 만만치가 않네. 10TB구입하려면 한달에 $99.99 라는 엄청난 금액을 내야 한다는 -_-; 다만 데스크탑 업로드의 편리함은 아마존 프라임 포토(아마존 드라이브) 보다는 구글 포토가 나음. 맥 Photos Library에 파일이 추가되면 구글 포토 데스크탑 앱은 자동응로 백업을 해주는데 아마존 프라임 포토는 그런게 없음. 
또 다른 아마존 프라임 포토의 장정은 업로드한 사진을 출력하는게 엄청 편하다는 것. 그냥 선택해서 출력하기 하면 Amazon Print쪽을 통해서 인화가 가능한데 4x6사이즈 한장 인화가격이 고작 9센트. 이건 진짜 그 어디보다도 가격이 저렴하고 코스트코의 인화 서비스보다도 저렴하다( Costco 4x6 : 0.13센트 )
그래서 제 최종 결정은요~~

아마존 프라임 포토 ( or 저장할 파일이 엄청 많은 경우에는 아마존 드라이브. 1년 무제한 공간 단돈 USD $60 )


요즘 포스팅을 모두 medium쪽으로 하고 있습니다

안녕하세요? 어쩌다보니 그냥 한번 써보기로 한 medium.com 에다가 죄다 최근 포스팅을 하고 있습니다. 현재 도메인인 potatosoft.com 은 제가 대학때인가 사회 취업한지 얼마 안됐을때부터 유지해 온 도메인이고, 블로그 시스템은 그...