Go | sabzil

December 2, 2017

KVM 스터디(with go)

주의, 이 글은 KVM이 뭔지도 제대로 모르면서 학습한 내용을 정리한거라서, 정확하지 않은 내용이 다수 포함되어 있을 수 있습니다. 틀린 내용은 지적해 주시면 수정해서 반영하도록 하겠습니다. 0. 준비물 노트북(우분투 16.04) 1. KVM이 뭔가요? 하이퍼바이저? 위키백과에 나와 있는 정의( https://ko.wikipedia.org/wiki/%ED%95%98%EC%9D%B4%ED%8D%BC%EB%B0%94%EC%9D%B4%EC%A0%80 ) 를 보면 이렇게 나와 있다. “다수의 운영 체제를 동시에 실행하기 위한 논리적 플랫폼” 여기에 우리가 잘 알고 있는 VmWare, VirtualBox와 같은것도 있고, Xen, KVM 같이 좀 낯선 것들도 있다. ... Read more

August 1, 2017

core파일 만들기

go
Go언어에서도 core dump를 떨구는 방법이 있었다. 데이브 체니님이 정리해 놓은 무려 2015년도의 글이다. https://dave.cheney.net/2015/11/29/a-whirlwind-tour-of-gos-runtime-environment-variables 환경변수로 GOTRACEBACK 을 crash로 설정만 해주면 된다. 이것도 모르고 Go언어에서는 dump 떨굴수 없다고 말하고 다녔다…; 근데 위에 처럼 환경변수 설정하고도 core파일이 안생긴다면, 다음 블로그의 글을 참고해 보면 좋을것 같다. http://lapan.tistory.com/68 블로그의 내용처럼 ulimit -a 로 확인 해보니 core file size가 0으로 되어 있다. ulimit -c unlimited 로 해주었다. 이제 panic을 발생시켜 보면 core 파일이 잘 만들어져 있는걸 확인 할 수 있다. ... Read more

June 18, 2017

delve를 사용한 Go언어 디버깅

delve는 Go언어를 위한 debugger 이다. delve 설치 설치를 하기위해서는 Go 1.5 이상의 버전이 필요하다. 지금 시점에 Go 1.5를 사용하지 않을테니… 다음의 명령으로 설치한다. $ go get github.com/derekparker/delve/cmd/dlv 이제 설치 끝! (Windows랑 MAC은 모르겠다.) delve 사용 프로세스 실행 제어, 변수, 스레드/goroutine 상태, CPU 레지스터 상태 등을 확인 할 수 있다. Commands attach: 실행중인 프로세스에 연결해서 디버깅을 한다. $ dlv attach pid [executable] 실행주인 프로세스에 디버그 세션을 연결해서 프로세스를 제어한다. ... Read more

May 25, 2017

build

go
Go언어로 개발을 하다보면 debug모드 release모드 같이 별도의 빌드 환경을 구성하고 싶을때가 있다. 그래서 build 옵션으로 특정한 환경별로 결과를 달리 할 수 있는 방법에 대해서 테스트한 내용을 정리해본다. go 파일들을 빌드하기 위해서는 일반적으로 다음과 같이 한다. $ go build Go언어 문서중에 보면 Build Constraints(https://golang.org/pkg/go/build/#hdr-Build_Constraints) 에 관한 내용이 있다. 이 내용은 build 할 때 조건을 줄 수 있다는 내용이고 방법은 다음과 같이 하면 된다고 한다. 코드의 상단에 “// +build linux” 하고 한 칸을 띄우고 “package blah” 를 시작한다. ... Read more

April 19, 2017

RabbitMQ 스터디(with go)

Go언어로 RabbitMQ를 어떻게 이용할 수 있는지 스터디하는 내용들을 대충 대충 정리하는 중… RabbitMQ라는게 뭐지? AMQP를 구현한 메세지 브로커 여기 저기에 있는 클라이언트들(Producer/Consumer)이 메세지를 서로 주고 받을 수 있도록 해주는 그런거? 설치 RabbitMQ 설치 sudo apt-get install rabbitmq-server 관리 플러그인 설치 sudo rabbitmq-plugins enable rabbitmq_management sudo service rabbitmq-server restart 실행 service rabbitmq-server start 계정 등록(id:sabzil, pw:1234) rabbimqctl add_user sabzil 1234 등록한 계정을 관리자 계정으로 변경 ... Read more

December 10, 2016

CreateFormFile()을 사용하면 Content-Type이 고정되는 현상

go
mime/multipart를 사용해서 파일을 업로드 하려 할때 파일을 업로드할 필드를 생성하기 위해서 CreateFormFile()을 사용한다. 이를 이용해서 파일을 업로드하면 “Content-Type”이 “application/octet-stream” 으로 고정되어진다. src/mime/multipart/writer.go의 CreateFormFile을 확인해 보면 다음과 같이 고정되어 있는걸 확인 할 수 있다. h.Set("Content-Type", "application/octet-stream") 관련한 이슈가 올라온게 혹시 있지 않을까 해서 찾아보니. 이런 이슈가 있었다. https://github.com/golang/go/issues/16425 bradfitz는 다음과 같이 답변을 하고 있다. “ Use CreatePart. CreateFormFile is a very thin wrapper around CreatePart. Click https://golang.org/pkg/mime/multipart/#Writer.CreateFormField and then click the CreateFormFile heading to see its source code. ... Read more

October 14, 2016

vendor 관리

vendoring되어 있는 패키지를 관리해야 할 이유가 무엇인지에 대해서 찾아보다가 좋은 글을 발견했다. https://gocodecloud.com/blog/2016/03/29/go-vendoring-beginner-tutorial/ 이 글을 읽고 이해한 정도만을 요약 vendoring을 왜 하나? Project A에서 사용하는 Pkg X의 리비전 1을 사용하고 있다. 그런데 Project B에서는 Pkg X의 리비전 2를 사용하려 한다. 그런데 $GOPATH 안에는 같은 패키지를 하나만 갖고 있을 수 있다. Pkg X의 리비전을 Project A에 맞추면 Project B가 빌드를 실패하고, Project B에 맞추면 Project A가 빌드에 실패하게 된다. 그래서 패키지들을 vendor 아래에 위치 시킨다. ... Read more

September 3, 2016

template을 생성할때 왜 이름을 지정할까?

go
Go언어의 Template 엔진을 사용할때, 왜 New()의 파라미터로 이름을 만들어서 넘겨야 하는지가 궁금했었다. Template and Associated templates라는 글을 읽고 어느 정도 이해를 하게 되었다. 다음은 위 글의 내용을 요약한 것이다. template.New() 로 template을 만들때, 이름을 정해서 만든다. 이 때 FuncMap과 템플릿 리스트를 갖는 그룹(그룹의 이 글에서 사용하는 용어로 Associated Templates를 가르킨다)이 생성된다. FuncMap에 대해서는, https://golang.org/pkg/html/template/#FuncMap http://goinbigdata.com/example-of-using-templates-in-golang/ http://technosophos.com/2013/11/23/using-custom-template-functions-in-go.html 를 확인해본다. New()를 했어도 아직 템플릿 리스트에서 관리되는 대상은 아니다. Parse(…)를 하면 템플릿 리스트에 추가가 된다. ... Read more

July 18, 2016

css와 같은 정적 컨텐츠를 html에서 사용하기 위한 팁

go
go의 “net/http”와 “html/template”를 이용해서 html과 css로 만들어진 웹페이지를 만들려고 할때, html 파일이 보여질때 css가 적용되지 않은 상태로 보여진다. 이 때 어떻게 해야 하는지 방법을 찾아가던 과정을 기록으로 남겨 놓는다. 프로젝트의 디렉토리 구조는 다음과 같다. src\ + prj + main.go + static style.css + template index.html 그래서 이렇게… func main() { http.HandleFunc("/", indexHandler) http.ListenAndServe(":8080", nil) } func indexHandler(...) { // index.html } 와 같이 하면 될 줄 알았다. 그런데 안된다. ... Read more

July 17, 2016

http 패키지의 HandleFunc과 Handle

go
HandleFunc http.ResponseWriter 와 *http.Request를 인자로 받는 함수를 전달받는다. 내부적으로 ServeHTTP가 구현된 ServeMux를 사용한다. package main import ( "net/http" ) func indexHandler(w http.ResponseWriter, r *http.Request) { .... } func main() { http.HandleFunc("/", indexHandler) http.ListenAndServe(":8080", nil) } Handle http.Handler 인터페이스를 구현한 객체를 전달받는다. 인자로 전달받은 객체는 http.Handler의 ServeHTTP(http.ResponseWriter, *http.Request)가 구현되어 있어야 한다. package main import ( "net/http" ) type indexHandler struct { } func (index *AppHandler) ServeHTTP(w http. ... Read more

© sabzil 2016