블로그 이미지
Flying Mr.Cheon youGom

Recent Comment»

Recent Post»

Recent Trackback»

« 2024/5 »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

 
 

Visual Studio Code(이하 vscode)에서 Go 언어 개발 환경 세팅 방법을 포스팅 해봅니다.

 

go 플러그인 설치

Image

먼저 vscode에서 위 이미지와 같이 ‘go’ 플러그인을 설치합니다.

 

개발 디렉토리 설정

그리고 소스를 관리할 개발용 디렉토리를 설정합니다. 저같은 경우는 Windows에서는 C:\Workspace\vscode_go로 세팅했고, Linux에서는 /home/snowdeer/Workspace/go 아래에 설정했습니다.

그리고 GOPATH 환경 변수 설정을 해야 합니다. Windows에서는

Image

환경 변수 편집 화면에서 GOPATH 항목을 등록해주면 되고, Linux에서는 터미널에서 export 명령어를 이용하면 됩니다.

export GOPATH="/home/snowdeer/Workspace/go"

그리고 해당 디렉토리에는 각각 src, pkg, bin 이름의 하위 디렉토리를 만들어줍니다.

 

추가 파일 설치

이제 vscode에서 Go 프로그래밍을 위한 실행 파일들을 다운로드하고 설치하는 작업을 합니다. 위에서 만든 디렉토리의 src 폴더 아래에 main.go 파일을 작성하고 vscode에서 열어봅니다.

그러면 vscode에서 아래 이미지와 같이 필요한 파일들을 설치할 것인지를 물어볼 것입니다.

Image

그냥 Install All을 선택해서 모든 파일들을 설치하면 됩니다. 모든 파일들을 설치하는데는 약 5분 정도의 시간이 걸릴 수 있습니다.

Installing 9 tools at C:\Workspace\vscode_go\bin
  gopkgs
  go-outline
  go-symbols
  guru
  gorename
  godef
  goreturns
  golint
  dlv

Installing github.com/uudashr/gopkgs/cmd/gopkgs SUCCEEDED
Installing github.com/ramya-rao-a/go-outline SUCCEEDED
Installing github.com/acroca/go-symbols SUCCEEDED
Installing golang.org/x/tools/cmd/guru SUCCEEDED
Installing golang.org/x/tools/cmd/gorename SUCCEEDED
Installing github.com/rogpeppe/godef SUCCEEDED
Installing sourcegraph.com/sqs/goreturns SUCCEEDED
Installing github.com/golang/lint/golint SUCCEEDED
Installing github.com/derekparker/delve/cmd/dlv SUCCEEDED

All tools successfully installed. You're ready to Go :).

 

테스트 코드 및 실행

다음 코드로 실행 테스트를 해봅니다.

package main

import "fmt"

func main() {
	fmt.Println("Hello, snowdeer")
	fmt.Println("안녕. 스노우디어")
}

코드 작성 후

F5

키를 눌러 실행을 해봅니다. 브레이크 포인트(Break Point)를 걸고 디버깅을 해볼 수도 있습니다.

Image
출처 : 

https://snowdeer.github.io/go/2018/01/21/how-to-programming-go-using-visual-studio-code/

:

ref : https://golangkorea.github.io/post/vim-go/

아래 박스 내용은 제대로 안되길래 박싱-클로징 시켜둠.




ref : https://github.com/socialpercon/getting-start-golang/blob/master/docs/vim-go.md

아래 내용도 에러가 발생해서 맨 아래 내용으로 강제 설치후,

아래 내용을 수동으로 설정함






위에 꺼 두개 다 안되서 아래 링크 내용으로 수동 설치함. 설치 후 위에 내용 참조하여 재설정.


ref : https://github.com/Microsoft/vscode-go/wiki/Go-tools-that-the-Go-extension-depends-on

Go tools that the Go extension depends on


go get -u -v github.com/ramya-rao-a/go-outline
go get -u -v github.com/acroca/go-symbols
go get -u -v github.com/mdempsky/gocode
go get -u -v github.com/rogpeppe/godef
go get -u -v golang.org/x/tools/cmd/godoc
go get -u -v github.com/zmb3/gogetdoc
go get -u -v golang.org/x/lint/golint
go get -u -v github.com/fatih/gomodifytags
go get -u -v golang.org/x/tools/cmd/gorename
go get -u -v sourcegraph.com/sqs/goreturns
go get -u -v golang.org/x/tools/cmd/goimports
go get -u -v github.com/cweill/gotests/...
go get -u -v golang.org/x/tools/cmd/guru
go get -u -v github.com/josharian/impl
go get -u -v github.com/haya14busa/goplay/cmd/goplay
go get -u -v github.com/uudashr/gopkgs/cmd/gopkgs
go get -u -v github.com/davidrjenni/reftools/cmd/fillstruct
go get -u -v github.com/alecthomas/gometalinter
gometalinter --install



마지막으로..

위에거 삽질하고나서 다시 검색해보니, 아래 링크에 vim-go ( vatih-vim ) 사용법에 대해 상세히 나와 있었음 -_-;;

일찍 찾았으면 삽질을 좀 더 덜했을텐데.. ( 영어라는 것에 주의가 필요함 )

ref : https://github.com/fatih/vim-go/blob/master/doc/vim-go.txt



:

출처 : http://blog.xcoda.net/82


잘 정리되어 있는 글s~



:


대략적으로 알고 있었으나, 알고보니 잘못 알고 있었던 용어.



* 엔터프라이즈 : 실제적으로 데이터를 공유할 필요가 있는 영역을 지칭하는 개념, 컴퓨터 분야에서는 동일한 의미로 사용.

 - ERP ( Enterprise Resource Planning ) : 실제적으로 데이터를 공유할 필요가 있는 영역의 다양한 Rsource ( 예 : 사람, 기계, 절차 ) 에 대한 계획을 수행( Planning ) 하는 프로그램

 - EAI ( Enterprise Application Integration ) : 실제적으로 데이터를 공유할 필요가 있는 영역에 있는 애플리케이션의 통합과 관련된 프로그램 

 - ESB ( Enterprise Service Bus ) : 실제적으로 데이터를 공유할 필요가 있는 영역에 있는 다양한 서비스( 사용자가 원하는 기능을 제공하기 위한 기본 단위 )를 연결하는 프로그램


* 솔루션 : 엔터프라이즈의 구성단위이며, 개발자의 관점에서 단독적으로 수행가능한 기능 단위이다. ( 보안 솔루션, 사용자 인증 솔루션 등 )


* 애플리케이션 : 개발자의 관점에서 개발된 단위 작업 수행 프로그램을 말한다. 그러므로 한개의 솔루션은 여러가지 애플리케이션으로 구성될 수 있으며, 한 개의 애플리케이션은 여러가지 솔루션에 포함될 수 있다.



예.

 회사의 업무는 인사 업무, 재무 관리, 영업 관리로 이루어지고, 인사, 재무, 영업은 서로 자료를 주고 받으며 운영된다. 이때 전체를 총괄하는 것은 엔터프라이즈인데, 엔터프라이즈는 인사, 재무, 영업 솔루션으로 구성된다. 그 중에서 인사 업무 솔루션에 속하는 신입사원 등록, 경조사 관리 시스템 등과 같은 것은 애플리케이션이 된다.




'소프트웨어 공학' 카테고리의 다른 글

NHN 교육 기관 설립  (0) 2011.10.19
Spring 문서 정보  (0) 2011.06.21
:

















Git이라는거 좋네.

처음에는 '이게 왜필요하지'라는 생각으로 접근했다. 이 책을 읽어보니.. 왜 필요한 것인지 알았다.

Git, 분산 버젼 관리 시스템은 기존의 버젼 관리 시스템을 보완한거였다.


기존 버젼관리에서 중요부분을 수정하고나서 반영하려면, rock을 걸거나 공지한 후 모두가 커밋을 정지한상태에서 진행해야한다. 항상 모두가 동기화되어 진행하고 브랜치나 태그 따는데도 모두가 공유해야 한다. 안정적이든 불안정적이든간에.


물론, 지속적통합을 위해서 동기화되어 있는것이 맞다. 그러나 개발을 진행하다 보면, 약간의 비동기가 필요할때가 있다. 안정적 버젼을 제공해주기 위해 여러 브랜치테스팅이 필요한 경우도 있다. 이런 브랜치의 기능을 강화 시킨 솔루션이 '분산 버젼관리 시스템'이다. 


여기 분산버젼관리시스템의 핵심은 바로 '브랜치'다. 브랜치를 자유롭게 사용한다는 것이다. 때에 따라서 브랜치 정보를 수정할수도있고. 다른 부분에서 사용된 브랜치의 커밋정보도 끌어다 쓸 수가 있는 것이다. 이 부분은 기존 서버집중 버젼관리시스템에서는 약간 이해하기 어려운 부분이기도 했다. 독자도 이 부분의 개념을 이해하기 위해 3~4번 정도 번복해서 정독했었다.


Git의 기본은 로컬에서 Commit하여 로컬저장소에 보관하여, 안정적인 버젼을 서버로 Push하는 것이다.

여기에서 시작하여 각각의 버젼관리가 이루어진다. 태그는 수정불가는한 릴리즈 버젼을 지니고 있다.

태그를 수정하기 위해서는 새로운 브랜치를 생성하여 진행할 수 있다. 브랜치는 어느 버젼관리와 마찬가지로 여러갈래로 나뉘어지고, 다시 하나로 합쳐질 수 있다. 이 부분( 브랜치 및 합치기 ) 을 진행할 때, 로컬에서 자체적으로 수행하고, 공유가 필요한 부분만 서버에 전송( Push ) 한다.


이 책 부록에, 유용한 명령어 모음집이 맨 마지막에 붙어 있다. 어쩌면 설명없는 명령여 요약본으로 볼 수 있다.

독자도 나중에 필요할 것을 대비하여, 휴대가 편하도록 복사해 두었다.





'소프트웨어 공학 > 유지-보수' 카테고리의 다른 글

Doxygen 참고 자료  (0) 2011.10.25
:



핵심 부분만 간추려서 적어 놓았다.

아래 코드는 컴파일시도하지 않는 코드이다.

아래 가이드 코드를 작성하기 전에 ( 방금전에 ) 리플렉션 코드를 완성하고 테스트를 마친상태에서 정리한 것이다.


regist는 클래스를 선언할때 등록이 되며, getClass는 클래스가 필요할때 아무데서나 불러쓸수 있다.

이 c++ 리플렉션의 장점은 해당 클래스가 필요할지라도 getClass를 부를 때 ConcreteA.h 를 포함하지 않고

SuperVisor.h파일만 포함하고 있으면 해당 클래스를 가져다 쓸수 있다.


이 리플렉션을 활용하면 클래스간의 커플링이 제거된다.



// super 

class Object;


// without implement class.

class ConcreteA;

class ConcreteB;


// factory

class CreateBase

: public Object

{

public: ...

public: virtual Object* Create() = 0;

}


template < class Conrete >

class CreateImpl

: public CreateBase

{

public: ...

public: virtual Object* Create() { return Concrete; }

}


// class resource management

class SuperVisor

{

static bool Regist( const char* name, Object* pObj )

{

map.add( name, pObj );

}

static Object* GetClass( const char* name )

{

Object* pCreator = map.get( name )

return pCreator->Create();

}

}


// macro

#define Regist( obj )    SuperVisor::Regist( #obj, new obj() )

#define GetClass( obj )  SuperVisor::GetClass( #obj )


/*

* Regist() macro will be used the page of .cpp file of implment class.

*/


// using.

Regist( ConcreteA );

Regist( ConcreteB );


Object* A = GetClass( ConcreteA );

Object* B = GetClass( ConcreteB );





:


강의 제목 : CBD ( Component Based SW Design )
강사 : 부산대 채흥석 교수


여기에 적는 수강 후기 내용은
참고 자료 없이 강의 완료( '12. 08. 31 ) 후 3일 후인 오늘 ( '12. 09. 02 )  기억에 남는 부분을 적은 내용이다.

SW 설계할 때, OO의 관점으로 바라 보았다.
Component는 그런 OO를 기능의 한 묶음으로, 좀 더 큰 범위로 응집해 SW를 설계 할 수 있다는 것을 이해했다.
기존에 알고 있었던, 어쩌면 추측 했었던 Component란 개념을 새롭게 알 수 있었던 좋은 기회였다.

교수님이 보내주신다는 CBD 책을 한번 더 읽어보고, 블로그에 좀 더 구체적으로 정리해볼 생각이다.
그 다음에 더 상위 레벨인 Product Line에 대해서 관심을 가져야겠다.
Domain Design보다 Product Line이 Component 기반설계보다 좀 더 큰 범위의 설계라 하셨다.

Component에 대한 핵심, 범위, 요구사항, 설계, 검증, 구현에 대해 간략히 적었다.
그리고 중간에 컴포넌트에서 중요시 하는 Interface에 대한 내용도 적었다.


[ 핵심 ]
* CBD의 핵심은 인터페이스다.
* CBD는 추상화가 되지 않는다.
* 그러나 인터페이스는 추상화나 상속이 가능하다.

[ Component 범위 ]
* 메소드와 특성을 하나의 연관성으로 집합 한 것이 클래스다.
* 그 클래스를 사용 가능한 단위로 집합한 것이 컴포넌트다.

[ Interface 사용 ]
* 컴포넌트는 인터페이스를 통해 연결된다.
* 정확히 말하자면, 인터페이스는 포트와 연결되며, 컴포넌트는 포트를 통해 인터페이스를 사용할 수 있다.

-> 컴포넌트1 - 포트1 - 인터페이스 - 포트2 - 컴포넌트2

* 포트라는 개념은 현재 언어에서 지원되는 것이 없다. 비슷하게 흉내내어 구현해야 한다.

* 포트라는 개념은 기존에 없던 새로운 개념이다.

* 포트를 예를 들어 설명하자면, 컴퓨터 본체에 있는 Keyboard포트, 모니터포트, 프린터 포트등을 생각하면 된다.

-> [ 모니터에 있는 D-SUB포트 ] 와 [ 본체에 있는 D-SUB 포트 ] 는 [ 모니터 Connecter ] 로 [ 서로 약속된 Data Interface ] 통해 GUI가 화면이 Display되는 것이다.

* 부가적인 설명으로, OO에서 일고 있던 인터페이스 개념과 유사하다, 하지만 포트와 맞물려 사용되기 때문에 OO에서 사용된 인터페이스와 같다고 할 수 없다. 새로운 관점에서 접근해야 한다.


[ Component RM ]

* 기존 OOAD 기법과 유사하게 적용할 수 있다. 

* 용어 선택에 주의해야 한다.

* UseCase를 사용하면 좋다.

* Actor와 UseCase의 개념을 잘 알아야 한다.


[ Component 설계 ]

* 필요에 따라 Class, Sequence, Community 등의 여러 다이어그램을 사용해서 분석하고 설계하는 게 좋다.

* Class, Method, Attribute, Stereo type 등을 명시 할 때, 추상적 / 명시적 / 묵시적인 단어를 적절히 사용해야 한다. 이 부분이 생각보다 어렵다.

* 단어 선택에 미숙할 때에는 리팩토링 관련 ( Refactorying ) 책을 참고하는 것이 도움이 된다. 그 종류의 책에서 이름 명명과 고치는 방법에 대해서 자세히 나와있다.


[ Component 설계 검증 ]

* 코드를 작성한 뒤에만 검증 하는 것이 아니다.

* 요구 사항 및 설계 단계도 검증이 필요하다.

* 일반적으로 Sequence나 Community를 사용해 기능적인 흐름에서 이상이 없는 지 파악한다.

* class 이름, method이름, stereo type의 명칭을 보았을때, 다른 사람이 내 생각과 일치 하는지 확인해야 한다.

* 설계도는 추상적이지 않으며, 매우 구체적으로 나와야 한다. 또한 모든 사람이 공통으로 보아야 하는 내용이므로 명확하고 이해하기 좋은 용어와 다이어그램이 구체적으로 상세히 작성되어야 한다. 

* 필요에 따라 각 다이어그램에는 설명을 해주는 메모가 필수적으로 있어야 한다.


[ Component 구현 ]

*  Component 는 OO( Object Oriented ) 를 적용하여 적용 가능하다.

*  Component 는 OO가 필수적인 요소는 아니다. 구현 수단의 한가지다.

* OO의 구현의 경우, 예를 들어 설명하면, 

 OO를 구현하기 위해 C++은 추상클래스와 Virtual Method를 주로 이용한다.

 OO를 구현하기 위해 C는 Structure와 Static 연산자 그리고 함수 포인터를 사용한다.

* Component의 경우, 예를 들어 설명하면,

 CBD를 구현하기 위해 C++은 Virtual Method를 주로 이용할 수 있다.

 CBD를 구현하기 위해 C는 함수 포인터를 사용할 수 있다.


[ Component 배포 ]

* CASE Tool에서 지원해주는 Generate 를 사용하여 각 개발 환경에 맞는 언어로 배포할 수 있다. 블랙박스 테스트 수준의 코드가 작성되며, 그 이상은 구현자가 실행 플랫폼에 맞게 구현해 주어야 한다.





***

확실히 전공 교수님이라 정확한 개념과 상세한 설명을 해주시는 것 같다.

부족하고 모호했던 부분들을 채워 주신점에 대해 감사의 말씀을 전하고 싶다.

정말 즐겁고 유익한 한주였다.




'소프트웨어 공학 > 설계' 카테고리의 다른 글

[POSA1] Broker Architecture Pattern  (0) 2011.10.07
Bada App - FrameWork Concept  (0) 2011.09.21
:
그냥, 경함담..(?) ㅋ

딱 봐도, 나중에 모두 고생길로 가는 지시였다.
그럼에도 불구하고, 그냥 하는거다. ^^;

UI부분과 Network 리소스 관리에 대한 이야기다. 

UI에서 화면에 출력할 서버 데이터가 필요해 Data network 모듈에 Request를 호출한다.
너무 많이 호출( 100개 )하면 Request Queue가 Full나서 뻑난다.
그리하여, UI에서 Request 호출을 Pooling해서 Network 단에 하나씩 넘겨주라고 한다.
( 즉, 10개의 Request가 있으면, 1번 끝나면 2번 보내기 ... )

왜.. Network의 Sender( Request ) Pooling관리를 UI에서 하는지 모르겠다.
죽는 건 Network단인데, 고치는 건 UI다.

현재 1개의 UI에서 아랫단을 대신하여 만들고 있지만, 이거 하나로 모든 UI 페이지가 이 내용을 따라야 할 것이다.

약 30개 이상의 UI가 존재한다. Network에서 Pooling을 지원해주면 될 것을..
( 100줄에 끝날 내용을.. 200줄에서 최대 1만줄을 할애하는 것이다. )

이에 대한 건의는 하지 않는다. 윗분들은 제안을 좋아하지 않기 때문이다. 제안을 좋아하는 경우는 단 하나, 그 사람이 내고 싶어했던 제안을 내야 좋아한다.

그냥.. 닥치고 하라는 대로 한다.

위 지시에 대한 응답은 "알겠습니다"였다. 
나는..? 우리는..! 프로그래머가 아니라, 직장인이다.

ps. MVC보다는 Model2 Architecture와 가장 유사하다.
( 설계도는 없다. 그냥.. 아키텍쳐로 따지자면 그렇다는 것.. ^^;; 이해를 돕기 위해 비유했다. ^^; )


  


 























닥치고 정치를 하던가, 닥치고 하라는대로 하던가. 골라야 할듯 ^^;;


:

참고루.. 버젼관리 툴을 사용한다면..
툴 관리 초기화 시키거나 교체 할 때 써야합니다. 안그러면 로그 남아서.. 큰일나요 ㅎ;

티 안나게 잘 감추시길;; ㅋ

#define m(a,b,c) a##b##c
#define M(a,b,c,d,e,f) a##b##c##d##e##f
#define d(t, T, tt)  m(t,T,tt)

d(Share, Instance, Ptr)* value = M(Share, Instance, Ptr, ::Get, Ins, Tance)();
d(to, delete, type) a = value->m(mem,ber, Var);
d(de, le, te) a;

-_-;;;

티 안나게 알아서 죽어 줄거임...

but, 걸리면 클남 ㅋㅋㅋ


더 좋은 방법 있음 댓글 ^^;




저런 거 쓸까 했는데, 걍 안씀 ㅋㅋㅋ 되나 안되나 해봤는데.. 바로 죽네 오.. ^^;
:


환경 :
  • 윈도 XP
  • Eclipse 3.5.2 (subclipse plugin)
  • Subversion 1.6.x

이클립스에서 svn 클라이언트로 작업중이었는데 Team -> Show History 기능을 사용하려면 제목과 같은 에러가 나왔습니다.
구글링해서 제 설정파일과 비교해보니 간단한 문제였네요.

일반적으로 svnserve.conf는 아래와 같이 주석이 풀려있겠죠.
svnserve.conf
1 [general]anon-access = readauth-access = writepassword-db = passwdauthz-db = authz

authz 파일의 경우 저는 아래와 같이 되어있었습니다. 
authz - before
1 [groups]user = soriwa[/]@user = rw

다음과 같이 everyone에 대한 읽기 권한을 줘야 제대로 읽어옵니다.
everyone에 대해서는 정의가 없으면 권한이 없는 거니까 늘 정해진 계정을 통해서만 작업되는 경우는 필요없을거라 생각해서 빼버렸거든요...이게 문제였네요.
authz - after
1 [groups]user = soriwa[/]@user = rw* = r
: