반응형

혼자 공부하는 컴퓨터 구조 & 운영체제

 

http://www.kyobobook.co.kr/product/detailViewKor.laf?mallGb=KOR&ejkGb=KOR&barcode=9791162243091 

 

혼자 공부하는 컴퓨터 구조+운영체제 - 교보문고

누구를 위한 책인가요? ● 개발자가 되고 싶어 컴퓨터 구조와 운영체제를 배우려고 하는 비전공자, 일반인 ● 컴퓨터 구조와 운영체제의 기본 용어조차 헷갈리는 학부생 ● 취업을 위해 기술 면

www.kyobobook.co.kr


컴퓨터 관련 서적중에 평이 괜찮길래 한번 읽어보았다.

 

컴퓨터 구조와 운영체제에 대해서 쉽고 명확하게 잘 설명되어 있고

 

삽화를 통해 시각적으로도 더 이해하기 쉽게 잘 정리되어 있는 책이다.

 

매 챕터마다 연습 문제를 제공하고 있어 챕터를 읽고 정리해볼 수 있어서 더 좋았다.

 

기본적으로 알아두면 좋을 정도의 수준까지 내용이 정리되어 있는데

 

(그래도 핵심적인 내용들을 잘 정리해 주셔서 알참) 

 

일단 이 책으로 큰 그림을 먼저 익히고 더 세세하게 공부해 나가면 될 것 같다.

 

챕터와 관련해서 코드로 보면 좋을 부분은 github을 통해 제공되고 있으니 같이 보면 좋을 것 같다.

반응형

'독서' 카테고리의 다른 글

바보 빅터  (0) 2012.03.19
성공하는 한국인의 7가지 습관  (0) 2011.10.10
나를 바꾸는 심리학의 지혜 프레임  (0) 2011.09.21
365일 매일 쓰는 메모 습관  (0) 2011.09.21
1만 시간의 법칙  (1) 2011.09.15
Posted by msparkms
,
반응형

가끔가다가 개발 환경을 변경하고 싶어질 때가 있다.

 

PC를 교체 받았다거나 Visual Studio 버전업을 했다거나 등등

 

그러면 보통 코딩용 폰트를 다시 한번 찾아보게 된다.

 

매년 검색해보면 새로 폰트들이 나와 있어서 다운 받아서 확인해보곤 하는데

 

이것저것 확인해보다가 요즘에 꾸준히 사용하고 있는 폰트가 있어서 추천한다.

 

바로 Ubuntu Mono이다.

 

https://design.ubuntu.com/font/

 

Ubuntu font

Ubuntu Monospace A: Would you tell me, please, which way I ought to go from here? C: That depends a good deal on where you want to get to.

design.ubuntu.com

 

여기서 Ubuntu Monospace를 선택하고 다운받으면 된다.

반응형
Posted by msparkms
,
반응형

Ebiten으로 간단한 게임을 구현해보려고 하는데 이번에는 그래픽 리소스를 직접 만들어보고 싶었다.

개인적으로 픽셀 감성을 좋아해서 픽셀을 찍어보려고 하기는 하는데 역시 쉽지 않다;;

뭐가 되었든 테스트용으로 간단한 픽셀 스프라이트를 Asesprite로 찍을 수 있었다.

 

Asesprite를 export 하면 json 파일과 png 파일을 뽑을 수 있는데

이 데이터를 읽어서 스프라이트 애니메이션을 구현해야 한다.

뽑힌 데이터들을 보니 애니메이션을 구현할만한 정보는 모두 포함되어 있었다.

 

그래서 일단 json 정보를 읽어보는것을 먼저 해보기로 했다.

검색해보니 기본적으로 'encoding/json' 패키지를 제공하고 있었고 다른 분이 만든 gson도 유명해보였다.

goasesprite라는 패키지도 있는데 (내부에서 gson을 이용해서 파싱) 테스트해보니 바로 애니메이션이 잘 동작했지만

json 읽는 부분도 연습해볼겸 직접 로드해보기로 했다.

 

일단 기본 흐름은 os.Open()으로 파일을 읽고 ioutil.ReadAll()로 []byte로 변경한뒤 json.Unmarshal()로 읽어오면된다.

Unmarshal을 하기 위해 json struct를 만들어주고 json의 key값을 연결해주어야 한다.

 

예를 들어 asesprite json에 있는 Meta 부분의 정보를 읽어오려면

type FrameTag struct {
...
}

type Meta struct {
  App string `json:"app"`	// meta.app을 읽어온다.
  ...
  Img string `json:"image"`	// meta.image를 읽어온다.
  ...
  FrameTags []FrameTag `json:"FrameTag"`	// meta.FrameTag을 읽어온다. (배열)
}

위와 같이 `json:"app"`과 같이 json의 키를 직접 입력해주어야 한다.

FrameTag와 같이 기본 타입이 아니라면 그에 맞는 struct를 추가해서 읽어줘야 하고 배열이라면 배열로 잡아야 한다.

 

Meta정보와 다르게 Frame은 배열이 아니라 Map의 형태로 되어있다.

이때는 Frames map[string]Frame `json:"frames"` 와 같이 map으로 읽으면 된다.

 

이 정도만 되어도 일단 원하는 데이터는 다 읽어올 수 있었다.

 

다음에는 이 데이터를 이용해서 애니메이션을 구현해봐야겠다.

반응형

'프로그래밍 > Go' 카테고리의 다른 글

Go - Ebiten TTF 폰트 사용하기  (0) 2022.04.17
Go 언어 환경설정 간단 정리(IDE - VS Code)  (0) 2022.03.19
Posted by msparkms
,
반응형

요즘 Go의 Ebiten을 조금씩 보고 있다.

아직 Go 언어가 익숙하지는 않지만 조금씩 기능을 추가해가면서 공부해보려고 한다.

 

일단 가장 기본적인 기능으로 텍스트 출력을 해보고 싶었다. (FPS 출력;;)

그래서 무료 라이센스의 TTF 파일을 우선 찾았고 이 파일을 어떻게 사용할까 찾아보았다.

ebiten에서 텍스트를 사용하는 기능은 지원하고 있어서 TTF를 읽어서 font.Face를 만들어내기만 하면 되었다.

 

TTF를 읽기 위해서 freetype 패키지를 설치하였다.

go get github.com/golang/freetype

 

그리고 아래와 같이 파일 경로를 통해서 파일을 읽고 해당 파일을 바이트로 변경하고 truetype으로 파싱해서 font.Face를 생성하는 함수를 만들었다. 나는 utils 패키지를 만들어서 ttfLoader.go 파일로 빼놓았다.

 

func Load_TTF(fontPath string) font.Face {
	f, err := ebitenutil.OpenFile(fontPath)
	if err != nil {
		log.Fatal(err)
	}
	defer f.Close()

	b, err := ioutil.ReadAll(f)
	if err != nil {
		log.Fatal(err)
	}

	tt, err := truetype.Parse(b)
	if err != nil {
		log.Fatal(err)
	}

	const dpi = 72
	return truetype.NewFace(tt, &truetype.Options{
		Size:    24,
		DPI:     dpi,
		Hinting: font.HintingFull,
	})
}

 

update 함수에서 ebiten.CurrentFPS() 를 이용하여 현재 FPS를 얻어내 문자열을 만들었고

draw 함수에서 text.Draw()로 텍스트를 출력해보았다.

 

이렇게 조금 조금씩 코드를 추가해나가면서 간단한 게임 엔진을 만들어보려고 하는데

간단히 정리할 수 있는 내용이 있다면 블로그에 올리도록 하겠다.

반응형

'프로그래밍 > Go' 카테고리의 다른 글

Go - Asesprite json 파일 읽기  (0) 2022.05.01
Go 언어 환경설정 간단 정리(IDE - VS Code)  (0) 2022.03.19
Posted by msparkms
,
반응형

Golang을 익혀보기 위해서 기본적으로 환경설정이 필요하다.

 

일단 Golang을 다운 받는다.

 

https://go.dev/dl/

 

Downloads - The Go Programming Language

Downloads After downloading a binary release suitable for your system, please follow the installation instructions. If you are building from source, follow the source installation instructions. See the release history for more information about Go releases

go.dev

 

에서 각자 OS에 맞게 설치 파일을 받아서 설치해주면 된다.

 

IDE는 VS Code를 사용할 예정이다. VS Code는 이미 설치되어 있어서 따로 받지는 않았다.

코드를 작성할 폴더를 하나 만들어주고 해당 폴더를 열어준다.

 

Golang은 기본 설정은 같은 Workspace를 두고 개발하기 때문에

모든 프로젝트에서 같은 패키지를 사용한다고 한다.

같은 패키지를 사용하면 공간도 절약되고 따로 설치를 하지 않아도 되서 효율적이기는 할 것 같은데

프로젝트마다 다른 버전의 패키지를 사용해야 된다면 조금 불편할 것 같기도 하다.

다른 언어들도 프로젝트마다 따로 패키지 설치를 지원하거나 virtual 환경을 만들어서 설치하고는 한다.

VS Code Settings만 조금 수정하면 VS Code를 통해서 패키지를 설치시 각 폴더에 설치할 수 있다.

Settings.json에 아래와 같이 입력하여 GOPATH를 내 폴더로 처리하도록 하면 된다.
(아니면 프로젝트 사용할때 마다 GOPATH를 직접 수정해줘도 될듯??)

 

"go.gopath": "${workspaceFolder}",
"go.inferGopath": true,
"terminal.integrated.env.windows": {
    "GOPATH": "${workspaceFolder}"
},
"terminal.integrated.env.osx": {
    "GOPATH": "${workspaceFolder}"
},

대신 이렇게 되면 내 폴더에서 이것저것 많이 생성되므로 .gitignore등을 잘 설정해줘야 될 것 같다.

 

근데 작업하다보니까 그냥 글로벌하게 설치해놓는것도 괜찮은것 같다

go mod를 이용해서 패키지들의 버전 관리를 해주면 될 것 같다

ebiten 같은 패키지는 거의 모든곳에서 사용할 것이기 때문에 한곳에 있는게 효율적일것 같기도 하고;;

 

그 뒤에는 VS Code의 Extension에서 Go를 설치해주자.

그 후에 Ctrl + Shift + P를 누르고 Go: Install/Update Tools를 선택해주면 몇가지 설치하면 좋은 Tool들이 나오는데

각자 필요한것을 골라서 설치하면 된다.

 

나는 일단 go-outline, gopls, staticcheck를 설치하였다.

gopls가 제대로 동작을 안한다면 아래 링크를 참고하여 delve를 설치해주면 된다.

https://github.com/go-delve/delve/tree/master/Documentation/installation

 

GitHub - go-delve/delve: Delve is a debugger for the Go programming language.

Delve is a debugger for the Go programming language. - GitHub - go-delve/delve: Delve is a debugger for the Go programming language.

github.com

go install github.com/go-delve/delve/cmd/dlv@latest 를 입력해주면 설치된다.

 

go 파일로 간단한 파일을 만든 뒤 F5로 실행했을때 go.mod ~ 하면서 실행이 안된다면

터미널에서 go env -w GO111MODULE=auto를 입력하여 환경 변수를 변경해주면 된다.

 

일단 이정도만 해놓으면 Golang 공부하는데 문제는 없을 것이다.

반응형

'프로그래밍 > Go' 카테고리의 다른 글

Go - Asesprite json 파일 읽기  (0) 2022.05.01
Go - Ebiten TTF 폰트 사용하기  (0) 2022.04.17
Posted by msparkms
,
반응형

C++ 코드를 보다보니 [[ ~ ]] 와 같은 형식으로 작성된 부분 있었다.

 

뭔가 싶어서 검색해보니 컴파일러에게 코드에 대해서 좀 더 명확하게 힌트를 제공하는 기능이라고 한다.

 

그중에서 자주 사용할것 같은 attribute만 간단하게 정리해보고자 한다. (개인적인 기준;;)

 

1. [[nodiscard]] - C++17

 

이 attribute가 붙은 함수나 attibute가 붙은 enum, class등을 리턴하는 함수를 만들었다면

해당 함수를 호출할때는 리턴값을 받아야 한다고 컴파일러에 알려주는 것이다.

이는 컴파일 시점에 워닝으로 알려준다.

 

[[nodiscard]] int strategic_value(int x, int y) { return x^y; }

int main()
{
  strategic_value(); // warning
  auto v = strategic_value(); // ok

  return 0;
}

 

[[nodiscard("string"]] - C++ 20은 워닝 메시지에 "string" 부분도 같이 남겨준다.

 

2. [[deprecated]] / [[deprecated("string") - C++14

 

해당 attribute가 붙은 함수를 사용하면 사용은 가능하지만 앞으로 제거될 수 있음을 워닝으로 알려준다.

엔진이나 라이브러리를 만들때 많이 사용될 것 같다.

언리얼 엔진에서도 버전업 하고 빌드해보면 나올때가 있다. 그러면 최신에 맞게 코드를 수정해주곤 한다.

 

[[deprecated]]
void TriassicPeriod() {
    std::clog << "Triassic Period: [251.9 - 208.5] million years ago.\n";
}
 
int main()
{
    TriassicPeriod(); // warning
    return 0;
}

 

3. [[fallthrough]] - C++17

 

switch / case 문을 사용하다보면 fallthrough 기능을 사용하곤한다.

컴파일러에 따라서 해당 부분을 워닝처리할때가 있는데 컴파일러에 명확하게

내가 fallthrough를 한거니까 워닝처리를 하지 말라고 하는 것이다.

 

void f(int n) {
  void g(), h(), i();
  switch (n) {
    case 1:
    case 2:
      g();
     [[fallthrough]];
    case 3: // no warning on fallthrough
    ..
  }
}

몇가지 더 있기도 하고 추가될 예정인것 같지만 일단 이정도만 알고 사용해도 되지 않을까 싶다.

반응형
Posted by msparkms
,
반응형

std::string을 사용하면서 printf처럼 formatting 기능을 사용하고 싶었다.

혹시 새로운 기능이 없을까 하고 검색해보니 c++20에 std::format이라는 기능이 추가되었다고 한다.

std::format은 아래와 같이 std::string_view를 인자로 받는다.

template<class... Args>
string format(string_view fmt, const Args&... args);

string_view이기 때문에 그냥 const char*를 넘겨도 된다.

 

기본 사용방법은 아래와 같다.

std::format("{} {}!", "Hello", "world");	// Hello world!

{} 위치에 배치된다고 보면 된다.

 

{} 이곳에 들어갈 여러가지 기능들은 너무 많아서 링크로 대신한다.

필요할때 마다 검색해서 사용해봐야 될 것 같다.

https://en.cppreference.com/w/cpp/utility/format/formatter#Standard_format_specification

 

std::formatter - cppreference.com

template struct formatter; (since C++20) The enabled specializations of formatter define formatting rules for a given type. Enabled specializations meet the Formatter requirements. In particular, they define callables parse and format. For all types T and

en.cppreference.com

 

format을 사용하기 위해서는 Visual Studio 2019를 16.10 버전 이상으로 올려야 하고

C++ 버전은 latest로 변경해야 한다.

 

Vector3를 String으로 변경하는 간단한 코드를 예제로 남기고 마무리하면 될 것 같다.

class Vector3
{
public:
  float x_, y_, z_;
  
public:
  std::string toString()
  {
    return std::format("( {:.2f}, {:.2f}, {:.2f} )", x_, y_, z_);
  }
};
반응형
Posted by msparkms
,
반응형

최근에 GitHub에 Repository를 하나 파고 작업하다가 다른 컴퓨터에서 clone을 받으려고 했다.

 

그런데 Password Authenticiation 제공이 없어져서 Personal Access Token 발급이 필요하다고 나왔다.

 

그래서 찾아보니 발급 방법과 적용방법이 간단해서 여기에도 정리해본다.

 

GitHub에 로그인 후에 우상단에 있는 내 아이콘을 클릭 후 Settings로 들어간다.

 

Developer Settings를 선택후 Personal Access Token을 클릭한다.

 

내 경우에는 다른 컴퓨터에서 Repository를 생성할 때 토큰이 자동으로 만들어져 있었다.

 

Generate New Token을 클릭하고

 

Note에 명칭을 입력해놓고 (나는 그냥 노트북 이름;;)

 

밑에 원하는 권한을 클릭해주면 되는데 그냥 코드 관리만 할거여서 repo만 클릭해줬다.

 

생성하면 토큰이 하나 발급되는데

 

그 상태에서 다시 Clone을 시도하면 웹 로그인 혹은 토큰을 입력하라고 GUI가 나온다.

 

토큰을 넣어주니 Clone이 잘 되었다.

 

 

반응형
Posted by msparkms
,
반응형

요즘 노트북 배터리가 조금 문제가 있는것 같아서 배터리 정보를 확인해보고 싶었다.

 

검색해보니 확인 방법이 매우 간단하여 정리해본다.

 

우선 명령 프롬프트 창을 관리자 권한으로 실행해야 한다.

 

윈도우 버튼을 누르면 내가 실행하고자하는 것을 입력할 수 있는데

 

거기에 cmd라고 입력해주자.

 

그러면 아마 맨 위쪽에 명령 프롬프트가 뜰것이다.

 

그 앱을 마우스 오른쪽버튼으로 클릭하여 관리자권한으로 실행하거나

 

우측에 보면 관리자권한으로 실행하는 부분이 있다.

 

둘중에 한 방법으로 실행한 후에

 

powercfg -energy라고 입력해주면 끝이다.

 

그러면 60초동안 배터리 정보를 수집해주고 배터리 사용 환경에 문제점들을 정리해준다.

 

60초가 지나면 report html 파일 경로를 알려주는데 해당 경로를 복사하여

 

실행해보면 잘 정리된 리포트 정보를 볼 수 있다.

 

리포트를 통해 내가 생각지도 못했던 프로세스가 CPU를 점유한걸 파악했다면

 

해당 프로세스를 정리하는것부터 시작해서 배터리 소모를 줄여볼 수 있을 것 같다.

반응형
Posted by msparkms
,
반응형

C++은 메모리를 직접 관리할 수 있는 언어이다.

직접 관리는 자유를 주는 대신 책임도 따른다.

메모리를 직접 관리하면 실수에 의해 누수가 일어날 수 있다.

이를 막기 위해 가비지 컬렉션등 메모리 관리를 하는 알고리즘을 구현하거나 라이브러리등을 가져와야한다.

 

C++의 스마트 포인터를 이용하면 포인터를 사용하는 것 처럼 사용할 수 있으면서 (연산자 오버로딩)

메모리 관리는 스마트 포인터 객체에게 맡길 수 있다.

 

스마트 포인터 종류를 간단히 정리해보자.

보통 메모리 누수가 발생하는 이유는 해당 메모리를 바라보는 포인터들이 여러개일 경우

맨 마지막에 해당 메모리에 접근한 포인터가 메모리를 해제해야하는데 이를 관리하기가 쉽지 않다.

 

그래서 사용하는 전략이 대표적으로 두가지가 있는데

해당 메모리를 바라보는 포인터는 무조건 하나만 존재하게 만드는 고유 소유권 방식과

해당 메모리를 바라보는 포인터가 생기면 카운트를 올려주고 해제하면 카운트를 내려서

카운트가 모두 제거되었을때 실제 메모리를 제거해주는 레퍼런스 카운팅 방식이 있다.

 

다른 이유는 delete를 하기전에 예외등이 발생하여 delete가 실행이 안되는 경우이다.

이때는 스마트 포인터 객체로 감싸져 있기 때문에

예외가 발생했을때 해당 객체가 제거되고 메모리 해제부분이 실행되어 해결이 된다.

 

unique_ptr은 고유 소유권 방식의 스마트 포인터이다.

C++14부터 잘 지원되는 auto와 std::make_unique()를 이용하면 쉽게 unique_ptr을 생성할 수 있다.

make_unique()를 이용하면 생성자의 인자를 바로 넘겨줄 수 있어 간단하고

한번 감싸져 있는 형태여서 예외가 발생했을때 누수가 발생할 염려도 없다.

 

기본적인 사용법은 아래와 같다.

기본적으로 포인터와 같은 연산자를 이용할 수 있다.

get()을 통해 내부의 포인터를 직접 얻어올 수 있다.

reset()을 통해 내부 포인터를 해제하거나 내부 포인터를 다른 포인터로 교체할 수 있다.

release()는 내부 포인터를 돌려주며 소유권을 끊어주어서 직접 해제해야 한다.

class Test
{
public:
	Test(int x) : x_(x) {};

	void Print()
	{
		std::cout << x_ << std::endl;
	}

private:
	int x_;
};

void PrintTest(std::unique_ptr<Test> testPtr)
{
	testPtr->Print();
}

int main()
{
	auto myTest = std::make_unique<Test>(1);
	myTest->Print();

	PrintTest(std::make_unique<Test>(2));

	myTest.get()->Print();		// internal pointer
	myTest.reset();			// to nullptr
	if (!myTest)
	{
		std::cout << "myTest is empty" << std::endl;
	}
	myTest.reset(new Test(3));	// to new pointer
	myTest->Print();

	auto myInternalTest = myTest.release();
	if (!myTest)
	{
		std::cout << "myTest is empty" << std::endl;
	}
	myInternalTest->Print();
	delete myInternalTest;		// manually delete

	return 0;
}
반응형
Posted by msparkms
,