Coder Social home page Coder Social logo

all-about-programming's People

Contributors

jiwon-hwang avatar

Watchers

 avatar  avatar

all-about-programming's Issues

이전에 commit한 message 수정하기

https://velog.io/@mayinjanuary/git-%EC%BB%A4%EB%B0%8B-%EB%A9%94%EC%84%B8%EC%A7%80-%EC%88%98%EC%A0%95%ED%95%98%EA%B8%B0-changing-commit-message

1. git rebase -i HEAD~3 (수정을 시작할 커밋의 이전 커밋)

이 명령어를 실행하면 "수정을 시작할 커밋의 이전 커밋" ~ "현재 커밋(HEAD)" 범위에 있는 모든 커밋들의 리스트가 출력된다. 예를 들어 git rebase -i HEAD~3 를 실행하면 HEAD ~ 2, HEAD ~ 1, HEAD 커밋들이 출력된다.
image
image

2. 수정하고 싶은 commit message 좌측의 pickreword로 바꾸기

image
reword로 수정하고 esc + :wq(write and quit)하고 나오면 이렇게 commit message 수정 창이 이어서 뜬다. 이 때 수정해주고 다시 :wq

3. git push origin +master

remote 저장소와 local 저장소의 내용이 다르므로, 강제로 remote로 push해준다.

이렇게 하면 끝!

※주의※
수정할 시작할 커밋의 이전 커밋 ~ 현재 커밋(HEAD) 범위의 모든 커밋 리스트들을 다 출력한 것이므로, 강제로 push하게 되면 수정하지 않은 커밋 메세지들까지 싹 다 그대로 push 된다. (시간만 update될 뿐 영향은 x)

따라서 웬만하면 사용하지말자... 모든 커밋 기록들 싹 다 건드리므로 conflict날 확률 큼(remote와 local)

bool vs BOOL

bool

  • C++ 자료형
  • char, 1Byte
  • true(1), false(0)

c++에서는 이걸 쓰면 됨!

BOOL

  • C에서 사용, But 자료형이 따로 없기 때문에 #define으로 따로 매크로 정의해줘야 함
  • int, 4Byte
  • TRUE, FALSE => 0, 1이 아닐 수 있음!

[C++] string 클래스와 문자열 입출력 (cin, getlline(), c_str(), atoi())

C++의 클래스

  • 다양한 문자열 메소드를 제공하는 STL
  • c_strI(), length(), copy(), compare(), begin(), end(), operator + 등 지원
  • C언어의 char * 문자열과 달리, 문자열 끝에 '\0' 과 같은 null이 들어가 있지 않음

string 객체 생성 방법

// 방법 1
string str1("Hello");
// 방법 2
string str1;
str1 = "Hello";
// 방법 3
string str2(str1);

string 문자열 입력 받기 (cin vs getline)

  • cin : 공백 문자 만나면 입력 받기 종료 ("Hello World"에서 "Hello" 까지만 입력받음)
  • getline() : 공백 포함 한 줄 모두 입력받음. (에 정의된 cin의 멤버함수)

string 클래스의 c_str() 메소드

  • C++ 스타일의 string 문자열을 C 스타일의 문자열로 변경해주는 함수 (출력 시)
  • string type -> char type
  • 맨 끝에 null ('\0') 포함

C : 문자열을 배열에 저장하고, 마지막에 문자열의 끝이라는 신호로 널문자 삽입됨. 따라서 배열 사이즈가 실제 문자열 사이즈보다 1이 큼.

  • c_str() 사용 이유 : atoi() 함수 사용할 때와 같이 매개변수 타입이 string 타입이 아닌 char 타입(c 스타일) 일 때!
    image

새로운 pc에서 기존 git 관리 프로젝트 옮겨 사용하기

1. 옮기려는 pc에 이미 등록되어 있는 github 계정이 있는지 확인한다

git config user.name
git config user.email
을 하면 기존의 계정 정보가 각각 출력된다.

있으면 새로운 내 계정으로 바꿔주고, 없다면 계속 진행한다.

2. git으로 관리하던 프로젝트 폴더를 통째로 현재 pc에 옮겨주고, 그 위치에서 git bash를 실행한다

git staus, git log 등을 통해 이전 작업 기록들을 그대로 확인할 수 있다.
image

3. 작업을 마치고 push하면 github login 팝업이 뜨면 로그인한다

image

만약 비번 까먹어서 로그인 실패하면 위와 같이 실패 메세지와 계정 이름 재입력 칸이 뜨고,

image

이렇게 다시 입력하면 된다..

image

그럼 바로 성공! 끝!

2차원 배열 동적 할당, 해제, 초기화

2차원 배열을 동적 할당으로 열었을 경우엔 다음과 같이 "초기화" 및 "할당"!! 시켜주자!

// 메모리 할당
short** ppsImage = new short*[nHeight];
for (int row = 0; row < nHeight; row++){
   ppsImage[row] = new short[nWidth];  // 각 행의 열 값들도 동적 할당 (메모리 열기)
   memset(ppsImage[row], 0, sizeof(short)*nWidth); // 메모리 공간을 0으로 채우기
}

// 메모리 해제 sol1
for (int row = 0; row < nHeight; row++){
   delete [] ppsImage[i]; 
}

// 메모리 해제 sol2
SAFE_DELETE_ARRAY(pusImage); // 1차원 배열일 때
SAFE_DELETE_VOLUME(ppsImage , nHeight); // 2차원 배열일 때 (배열명, 1차원 배열 수)

cf. 참고

https://felixblog.tistory.com/72
https://grandstayner.tistory.com/entry/C-2%EC%B0%A8%EC%9B%90-%EB%B0%B0%EC%97%B4-%EB%8F%99%EC%A0%81%ED%95%A0%EB%8B%B9

list() vs split()

문자열을 분리하여 리스트로 만드는 방법 2가지 비교

  • list() : 문자열을 하나하나 분리하여 각 요소를 리스트에 넣어서 반환
  • split() : split함수 안의 인자를 기준으로 문자열을 분리하여 각 덩어리들을 리스트 요소로 넣어 반환 (하나하나 X)

단, 인자가 없으면 default : ' ' (공백) or '\n' (개행) 문자를 기준으로 덩어리로 쪼갬

list()

image

split()

image

헤더란 (*.h) & 다수의 파일로 관리하기 & <>, "" 차이

  • 수많은 함수를 만들게 되는데 한 파일에 다 선언하고 정의해 놓으면 가독성도 좋지 못하고 비효울적
  • 따라서 여러 함수들을 각각 다른 cpp 파일들에 기능을 구현해두고 .h 헤더파일에 선언만 해두면 추후 사용히 단순히 #include "~.h" 으로 불러오기만 하면 됨.
  • 헤더 파일 : 클래스 선언부
  • 일종의 메뉴판 같은 역할
  • 클래스의 재사용을 위해 분리해서 저장. 클래스마다 분리하여 저장.

image

Git Clone vs Git Pull

Git Clone

local에 아무것도 없는 상태에서 원격 저장소의 데이터를 가져오는 것

Git Pull

local에 이미 있고 원격 저장소의 수정 상태를 반영하기 위해 가져오는 것.

  • cf. git clone {url} == git init + git remote add origin {url} + git pull origin master
  • 즉, git 프로젝트를 시작 + url을 원격 저장소로 지정 + 원격 저장소를 현재 로컬 master에 병합

클래스, 생성자, 소멸자, 멤버함수

생성자와 소멸자

cf. 생성자와 소멸자 모두 자동으로 호출되는 함수, 모두 return 값이 없고 void도 사용할 수 없다!
cf. 포인터를 사용하지 않는다면, for loop 등 한 블록이 끝나는 동시에 자동으로 소멸됨! (소멸자에 따로 정의 안해도)

생성자

  • ClassEx::ClassEx() 형태
  • 인자를 가질 수 있음
  • 클래스의 객체 생성과 동시에 멤버 변수 초기화 가능. 클래스 이름과 동일한 이름으로 구현되며, return 값 없음
  • ClassEx::ClassEX(int a, int b) : A(a), B(b) => 이런식으로 인자가 있는 생성자는 A, B 각각을 a, b로 초기화하는 역할을 함
  • 멤버함수와 마찬가지로 public 접근지정자로 지정해야 객체 생성 가능!

소멸자

  • ClassEx::~ClassEx() 형태
  • 인자를 가질 수 없음

클래스 선언과 정의

  • 클래스 선언은 class ClassEx{void 함수명() ...] 이런식으로 하지만, 안에 포함되는 멤버 함수들에 대한 정의는 클래스 선언 안이 아닌 밖에서도 가능
  • void ClassEx::함수명()

Anaconda로 가상환경 생성 및 설정하기

가상환경(Virtual Environment)이란?

python 개발 시, 다양한 패키지나 모듈들(ex. tensorflow, keras, numpy, python 등)을 설치하고 import하게 됨. python과 다양한 패키지들의 버전 충돌 문제를 방지하기 위해서, 각 프로젝트들 마다 가상 환경을 만들어서 각각 독립적인 버전을 이용 가능하다!

Anaconda Prompt 개발환경 관련 명령어

  • conda create -n tutorial python=3.5 numpy scipy matplotlib ...
    : tutorial 이라는 이름의 개발 환경을, python 3.5 버전으로 만들고, 이 가상환경에서는 numpy, scipy, matplotlib 등의 파이썬 라이브러리들을 import 해서 사용할 수 있다.

  • activate tutorial
    : tutorial이라는 이름의 가상 환경을 활성화.

  • conda deactivate
    : 현재 개발 환경을 종료하고, 기본 환경(base)로 돌아가기

  • conda env list
    : 생성되어있는 가상환경 리스트 확인

  • conda env remove -n tutorial
    : 가상환경 제거하기. 자동으로 해당 가상환경 내의 전체 라이브러리들을 지워준다. (다른 가상환경에는 영향 x)

정적 변수(Static) vs 전역 변수(Global) , const

공통점

  • (지역 변수와 달리) 프로그램이 끝날 때까지 할당된 변수의 값과 메모리가 유지됨.

차이점

정적 변수 (Static Variable)

  • 선언된 해당 파일, 함수 내에서만 접근 가능 ==> 내부 링크
  • 초기화는 단 한번만 가능 (소스 파일에서만 초기화 가능)
  • 선언 시 : static 키워드를 반드시 사용해야 함

전역 변수 (Global Variable)

  • 해당 프로그램의 모든 파일, 함수에서도 접근 가능 ==> 외부 링크
    • 필요할 때마다 초기화를 언제든 몇번이든 가능
  • 다른 파일에서 접근하지 않는 전역 변수 선언시에는 그냥 main 함수 바깥에 선언해주면 됨
  • 다른 파일에서 접근하려면 extern 키워드로 변수를 선언해야 함
// 전역 변수 사용 ex (외부 링크 시)
int g_value; // 본문 내 선언
extern int g_value; // 다른 파일에서 extern으로 선언 후 외부에서 사용

cf. extern의 의미 : 다른 파일에서 이미 이름이 같은 전역 변수가 선언되었다는 의미 (공유)

CMake, LIB, DLL

  • CMake : 빌드 도구 (빌드 시 : .exe, .lib, .dll 파일 생성됨)

"멀티 플랫폼을 위한 빌드 지원 시스템"

  • 이 중 lib(정적 라이브러리)와 dll (동적 라이브러리)을 외부에서 사용할 수 있도록 공유
  • lib : 프로그램 실행 직전에 호출됨 (컴파일 시 호출, 링크)
  • dll : 프로그램 실행될 때 호출됨 (컴파일 할 때가 아닌 실제 exe 실행될 때) => 해당 프로그램(exe)와 같은 경로상에 존재해야 함
  • 즉, CMake : cpp 파일들을 lib, dll로 만드는 것 (+.h)
  • CMake의 목적 : 코드 은닉화 or 사용할 환경에 맞게 빌드하기

cf. 빌드 : cpp 파일 -> obj(.o) 바이너리 파일로 변환(컴파일) -> 링크 -> 실행가능한 바이너리 파일(.exe)로 만드는 과정

git submodule로 한 main repo에 여러 sub repo들 관리하기

< 기존 repo를 최상위로, sub module들 추가하기 >

[ 1. 최상위 repo가 될 기존 repo의 내용들을 새로운 repo 파서 옮기기 ]

  • git clone --mirror : 기존 원격 repo를 로컬로 복제해오기
    image
    image : 기존원격레포명.git 폴더 생성

  • cd ~.git : 복제된 git 폴더로 이동

  • git remote set-url --push origin [new remote repo url] : 새로운 원격 repo의 url 주소 연결
    image

  • git push --mirror & git remote -v : mirror 한 내용 로컬에서 원격으로 push 후 정상적으로 복사 되었는지 전, 후 주소 확인

    • fetch : 기존 원격 repo로부터 필요한 파일을 다운 받음
    • push : push할 새로운 원격 레포
      image

cf. issue, wiki 등은 git의 요소가 아니므로, mirror 시에 같이 옮겨지지 않으므로 수동으로 옮겨줘야 함!

[ 2. 또 다른 모듈이 될 새 repo가 있다면 파서 올리기 ]

[ 3. 기존 로컬 repo에 연결돼있던 원격 repo와 연결을 끊고, 새로운 repo에 연결하기 ]

  • git remote remove & git remote add
    image

[ 4. 기존 repo의 issue들 옮기기 ]

  • 기존에 만들어 둔 label들 먼저 생성해둔 후 옮기고 나서 다시 태그

[ 5. 기존 원격 repo의 기록들 싹 다 비우기 ]

https://yoshikixdrum.tistory.com/200

  • 기존 원격 repo를 clone 받아와서 .git 폴더를 포함한 모든 파일들 삭제 후
  • 빈 폴더 상태에서 다시 git init & add & commit & push

[ 6. main이 된 기존 원격 repo에 add submodules ]

https://www.devhak.com/blog/git-submodule

image

  • submodule 2개 추가해준 후 commit 해보면 .gitmodules 파일은 100644지만, 나머지 두 폴더는 160000으로 다르게 특수한 파일로 인식
    • git에게 있어 160000모드는 일반적인 파일이나 디렉토리가 아니라 특별하다는 의미!

[ 결과 ]

image
image

  • local-main에는 remote-sub repo들에 반영된 내용들을 받아오도록 되어있고, local-sub과는 별개!
  • 그리고 각 submodule들은 서로 수정사항들을 알 수 없는 독립적인 관계!

< sub module 수정 및 main에 업데이트하기 (수동) >

[ 순서 : submodule update 내용 remote push -> local main update -> remote main push ]

  1. 로컬에서 local-sub 코드 수정 후 remote-sub에 push
  2. git submodule update --remote : local-main에서 remote-sub 수정사항 update
  3. git add & git commit & git push : remote-main으로 수정사항 push

cf. 중간에 git config status.submodulesummarygit status 해보면 수정 사항에 대한 commit message 확인 가능!

포인터, 주소연산자(&), 배열, 동적할당, 자료형 + vs 참조형 변수(&)

&/처럼 연산자!

  • 타입(자료형) 에 따라서 연산 결과가 다르다

즉, 일반 배열과 동적할당한 배열의 자료형이 다르므로, 같은 배열이어도 &연산 결과는 다름!

int myarr[10]; // type : int []
int *newarr = new int[10]; // type : int *

arr vs &arr

  • 가리키고 있는 것(개념) 은 다른데, 출력 값은 같다
  • if 동적할당 X 배열 => arr == &arr
  • arr : 배열의 첫번째 요소(arr[0])를 가리키고 있는 포인터
  • &arr : 전체 배열 자체의 포인터
  • 따라서 arr+1&arr+1 의 값은 다르다!

배열과 배열 주소의 관계

https://hashcode.co.kr/questions/936/%EB%B0%B0%EC%97%B4-%EC%9D%B4%EB%A6%84%EC%9D%B4%EB%9E%91-%EB%B0%B0%EC%97%B4%EC%9D%98-%EC%A3%BC%EC%86%8C%EA%B0%80-%EA%B0%99%EC%9D%80%EA%B1%B4-%EC%99%9C%EC%A3%A0

포인터 변수의 주소 == 포인터 변수에 들어있는 주솟값

  • 일 수도 있다!
  • &arr == arr == &arr[0]

image

image

image

Visual Studio 프로젝트 속성 설정 방법 (.h, .lib, .dll 디렉터리 및 환경변수 설정)

1. [ VC++ 디렉터리 ] > [ 포함 디렉터리 ]

  • include 폴더 경로 (.h 헤더 파일들을 포함)

image

2. [ VC++ 디렉터리 ] > [ 라이브러리 디렉터리 ]

  • lib 폴더 경로 (.lib 파일들 포함)

image

3. [ C/C++ ] > [ 추가 포함 디렉터리 ]

위의 [ VC++ 디렉터리 ] > [ 포함 디렉터리 ] 와 같음 (.h 들어있는 폴더 경로)

image

4. [ 링커 ] > [ 입력 ] > [ 추가 종속성 ]

  • 위의 경로에 들어있던 .lib 파일들 리스트 (실제로 사용하는)

image

cf. 환경변수의 path에 bin 폴더 경로 추가 or dll 파일 이동

환경변수에 dll이 들어있는 bin 폴더를 추가해줘야 visual studio에서 어느 경로에 실제 dll 파일이 있는지 인식 가능
image

빌드 과정 : 전처리 -> 컴파일 -> 링크 (+디버깅)

  • 컴파일(compile) : 소스 코드의 문법(명령어들)을 분석해 기계어로 번역, 오브젝트 파일로 만듦 (with. 헤더파일(.h) : 어떤 함수가 있는지, #include, #define 들이 선언된 파일. 함수 정의, 사람이 읽을 수 있는 소스코드 형식)
  • 링킹(linking) : 오브젝트(.o) 파일들을 연결. 즉, 기계어로 바뀐 프로그램 코드에서 사용한 함수들을 연결 (with. 정적(.lib), 동적(.dll) 라이브러리 : 함수에 대한 정의가 구현된 부분)
  • 빌드(build) : 컴파일러가 번역한 것과 그외의 다양한 것들(ex. 라이브러리)을 모아 실행가능한 파일(.exe => bianary)로 만듦
  • 디버깅(debug) : 버그 잡는 것

image

빌드 : 코드 -> 컴파일(기계어(.o => binary)로 번역) -> 링킹 -> 실행파일(.exe) 만듦

  • 즉, F5(디버깅) 실행 시 : 컴파일 + 빌드 + 실행

NAN, isnan()

NAN

  • float이나 double형으로 표현되는 부동소수점 값이 컴퓨터가 허용하는 범위를 넘을 때 출력
  • -nan(ind)로 출력됨
  • 선언만 하고 값 할당이 되지 않은 상태면(undefined) 숫자 변수의 경우엔 NAN
  • <math.h>isnan() 함수를 통해서 NAN인지 아닌지 판별 가능! (NAN 자체로 판별 X)

.gitignore 설정하기

https://gmlwjd9405.github.io/2017/10/06/make-gitignore-file.html
너무 용량이 큰 파일이거나, 프로젝트 생성 시 1회만 필요한 설정 파일 등
remote repository에 올릴 필요 없는, 즉 Git 버전 관리에서 제외할 파일 목록
.gitignore이라는 txt 파일에 추가해 commit, push하면 된다.

local에서는 삭제되지 않지만, remote (github)에서는 나타나지 않는다!

image

전방 선언 (Forward Declaration)

A 클래스가 a.h라는 헤더파일에 있고, B 클래스가 b.h라는 헤더파일에 있는데
A에서도 B를 사용하고, B에서도 A를 사용할 때..

서로 #include를 둘 다 해서 헤더 꼬임 현상이 발생하면 무한 루프에 빠지게 되는데, (컴파일 속도도 저하됨)
이 때 전방 선언 사용!

전방 선언 사용법

한 파일에서 #include "a.h" 대신,
class Player; 라고 선언!

가비지(Garbage) & 가비지 컬렉션(Garbage Collection) / 포인터 & 메모리 동적할당

가비지 & 가비지 컬렉션

  • 가비지 : 포인터(p1)에 다른 포인터(p2)에 담긴 주소값을 옮겨 담아서 p1이 다른 곳을 가리키면, 원래 가리키던 메모리는 아무도 사용하지 않고 아무도 가리킬 수 없는 상태가 되는데, 이때 이 아무도 사용하지 않는 쓰레기 메모리가 가비지!

  • 가비지 컬렉션 : 시스템 상에서 가비지 컬렉터가 이 가비지를 찾아 자동으로 다시 사용 가능한 자원으로 회수하는 것 (수동으로 직접 해제해주지 않아도 됨)

  • cf. 댕글링 포인터 : 이미 동적 할당된 메모리를 해제했는데 여전히 가리키고 있는 포인터. p1과 p2가 한 메모리를 동시에 가리키고 있다가 그 중 한 포인터에 의해 메모리를 해제한 경우!

    • ex. 블록 밖으로 나가면서 Mat이 자동으로 해제됐는데 포인터는 그대로 가리킬 때

포인터 대입 (주소 변경)

short* psImage = NULL;
m_ciData.copyImage(9, psImage, nWidth, nHeight); // psImage -> m_ciData 가리킴

// Gaussian Filtering (smoothing)
Mat img(nWidth, nHeight, CV_16SC1, psImage); // convert Arr(short) to Mat(short) 

Mat img_filtered;
GaussianBlur(img, img_filtered, Size(7, 7), 0); // 깊은 복사

psImage = (short*)img_filtered.data; // 얕은 복사 => "주소 변경!"


//SAFE_DELETE_ARRAY(psImage); // 안해줘도 됨! => "가비지 컬렉션"

cf. Mat은 내부적으로 메모리 동적 할당과 해제를 자동으로 해줌! (해당 블록 단위로)

Convert Arr2Mat, Mat2Arr / 16bit(short) to 8bit(unsigned char) / CV_type

Convert Arr to Mat

short* psImage;
Mat psImage_mat(nWidth, nHeight, CV_16SC1, psImage);

Convert Mat to Arr

short* psImage_arr = (short*)psImage_mat.data;

Convert 16bit(short) to 8bit(unsigned char)

normalization

Mat img(row, col, CV_16SC1); // 16bit(short)
Mat img_8UC1 = img.clone();

// get min, max
double minVal;
double maxVal;
Point minLoc;
Point maxLoc;
minMaxLoc(img, &minVal, &maxVal, &minLoc, &maxLoc);

// normalization
img_8UC1 -= minVal;
img_8UC1.convertTo(img_8UC1, CV_8U, 255.0 / (maxVal - minVal)); // 8bit(uchar)

enum vs #define

enum

  • 열거형 상수
  • 자동으로 index 매겨짐
  • .h 등의 전역에 선언해두면 #define과 마찬가지로 모든 파일에 적용
  • But, 클래스 내부에 선언해두면, 그 클래스 내부에서만 사용 가능한 상수로 사용 가능
// IH.h
class IH
{
public:
   enum FEATURE
   {
      MEAN,      // 0
      VARIANCE,  // 1
      ...
   }
}

// main.cpp
cout << IH::MEAN<< endl;

#define

  • 매크로 상수 (전처리기 지시자)
  • 각각 상수를 지정해주어야 함
  • 전역으로밖에 선언 불가

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.