3월 31, 2016

C++ 11 이후 새로운 random 함수 표준

MT(Mersenne Twister 메르센 트위스터)

  • 유사 난수 생성기. 기존 생성기의 문제점을 피하며 매우 질이 좋은 난수를 빠르게 생성 가능.
  • 32bit(MT19937), 또는 64bit(MT19937_64) 크기의 난수 생성 가능.
  • 난수의 특성(주기, 난수의 범위 등)을 알고 있으면 그 뒤 나올 난수를 예측 가능하기 때문에 암호학적으로 안전한 생성기는 아님.
  • 예시1
  • 출력 화면
  • 예시2 - C++ 표준을 좀 더 다양하게 사용한 개선 코드
  • 출력 화면

WELL

  • MT의 개발자가 10년 후에 고안한 난수 발생 알고리즘.
  • MT보다 40% 가량 빠르며 코드도 더 간단하다고 함.
  • 분포도에 따라 WELLS512, WELLS1024, WELLS19947(숫자가 커질 수록 분포도↑) 등 다양한 종류가 존재.

references

3월 29, 2016

constructor/destructor와 assignment operator가 (자동으로) implicit define되지 않는 경우.

  • default constructor
    • 하나라도 직접 정의한 constructor가 있을 때
    • 클래스 멤버 중에 default constructing이 불가능한 멤버가 있을 때( ex. reference, const object 등)
  • copy constructor
    • 직접 정의한 copy constructor(class T에 대해 T, T&, const T&를 받는 constructor)가 하나라도 있을 때
    • 클래스 멤버 중에 copy constructing이 불가능한 멤버가 있을 때( ex. reference 등)
    • 직접 정의한 move constructor 나 move assignment op가 있을 때
  • copy assignment operator
    • 직접 정의한 copy assignment op(class T에 대해 T, T&, const T&를 받는 op)가 하나라도 있을 때
    • 클래스 멤버 중에 자동으로 assign이 불가능한 멤버가 있을 때( ex. reference, const object 등)
    • 직접 정의한 move constructor 나 move assignment op가 있을 때
  • destructor
    • 직접 정의한 destructor가 있는 경우
  • move constructor
    • 직접 정의한 move constructor가 있는 경우
    • 클래스 멤버 중에 move가 불가능한 멤버가 있는 경우( ex. deleted/inaccessible/ambiguou 등)
    • 직접 정의한 copy constructor, copy assignment op, destructor, move assignment op가 있는 경우
  • move assignment operator
    • 직접 정의한 move assignment op가 있는 경우
    • 직접 정의한 copy constructor, copy assignment op, destructor, move constructor가 있는 경우



references

3월 24, 2016

git internals: refs

refs 란?

SHA-1 값을 알면 이를 통해 해당 commit 및 전체 히스토리를 살펴볼 수 있음. 기억하기 힘든 SHA-1 값 대신 외우기 쉬운 이름으로 된 파일을 만들고 파일에 SHA-1 값을 기록했는데, 이것이 git의 refs 임. 이런 refs 들은 .git/refs 디렉토리에 저장됨.

  • .git/refs/heads: local branch 이름의 파일이 생성. 파일에는 해당 브랜치에서 head가 가리키는 commit의 SHA-1이 저장됨.
  • .git/refs/remotes: remote branch 이름의 파일이 origin 디렉토리 안에 생성됨. 파일에는 해당 브랜치에서 head가 가리키는 commit의 SHA-1이 저장됨.
  • .git/refs/tags: tag 이름의 파일이 생성됨. 파일에는 해당 태그가 가리키는 commit의 SHA-1이 저장됨.

더 알아볼 것

  • git reflog
  • git update-ref

reference

3월 22, 2016

move semantic 구현

move constructor와 move assignment operator를 정의

move constructor를 정의

  • move constructor
  • move constructor의 경우moved-to-obj의 리소스를 해제하고 그 자리에 move-from-obj의 리소스를 배정. move-from-obj의 리소스 참조를 끊어줌.(ex. pointer를 nullptr로 변경)

  • move assignment operator
  • move-to-obj와 move-from-obj가 동일한 객체인지 검사하고 동일하지 않은 객체일 경우 이동 작업을 진행.



코드의 간략화

move assignment operator를 이용해 move constructor의 중복 코드를 제거할 수 있음.


기타

  • move constructor의 move-from-obj destruct
  • 일반적으로, move constructor에서 move-from-obj를 destruct 해주지는 않음. 그러나 move constructor가 불린 후 꼭 move destructor가 뒤따라 불리는데, 이건 move constructor가 move-from-obj를 destruct해서가 아니라 함수에서 임시로 생성됐던 객체가 move constructor가 불린 후 life time이 끝나 해제가 된 것. move constructor에서 move-from-obj의 destruct해야할 어떤 책임도 없음.


rvalue를 param.로 받는 함수를 overloading.

perfect forwarding?


references

3월 21, 2016

superscript (윗첨자), subscript (아랫첨자) 삽입하는 방법. (markdown/html)

순수 markdown 문법

  • superscript: ^(text)^
  • subscript: ~(text)~

만약 text 사이에 공백이 있다면 공백에 \ (escape) 처리를 해줘야 함. ex) ^hello\ world!^


html tag 사용

markdown에서는 위의 문법을 지원하지 않는 경우가 있음. github 에서는 위의 문법을 지원하지 않는데, 이런 경우엔 html tag를 사용. markdown 뿐 아니라 html에서도 사용 가능.

  • superscript: <sup>superscript</sup>
  • subscript: <sub>subscript</sub>

3월 11, 2016

git environment initializing after installing : git 설치 후 초기 설정


user email, user name setting

git config --global user.email
git config --global user.name




push option setting

--simple / --match option 중 선택.




git's default editor setting

Visual studio code를 default editor로 설정.

git config --global core.editor="'(dir)/code.exe' -w"

-w 옵션은 editor가 종료될 때까지 git이 기다린다는 의미. git이 어떤 명령을 실행하는 중에 editor가 실행되었다면, editor가 종료된 이후에 나머지 프로세스가 진행됨.




특정 프로그램의 path를 git bash에 추가.

git을 default editor로 세팅한 이후에는 git bash에서 VS code 실행 가능. code를 통해 VS code 실행하거나 code . 명령어로 현재 폴더를 프로젝트 폴더로 지정하여 VS code를 열 수 있음. 또한 code --new-window 명령어로 empty project 상태로 VS code의 새창을 열 수도 있음.
만약 git bash에서 code 명령이 실행이 되지 않을 경우엔 git bash에 VS code의 path를 추가해주어야 함.

  1. c:\users\your_id 디렉터리에서 .bash_profile 파일을 에디터로 불러옴. 만약 파일이 없을 경우 파일을 생성.
  2. 다음 구문 추가 : alias code="dir_address/code.exe"
    ex) alias code="C:/Program\ Files\ \(x86\)/Microsoft\ VS\ Code/code.exe"
  3. 이때, 디렉터리를 구분하는 \(backward slash)를 모두 /(forward slash) 로 바꿔줌. 또한 따옴표나 (, ), space(공백) 등이 들어가는 경우 \(backward slash)를 통해 escape 처리를 해줘야 함.




references

3월 10, 2016

git branch workflow

branch의 종류

  • main branch : master, develop
  • feature branch (topic branch)
  • release branch
  • hotfix branch
main branch
  • master branch
  • 배포 가능한 상태만을 관리하는 branch. master branch에 커밋 시 태그로 버전 번호를 기록함.

  • develop branch
  • 주된 개발 활동이 일어나는 branch. 이 branch를 기반으로 개발을 진행.

feature branch

topic branch. develop branch로부터 분기해 개발을 진행함. feature branch는 공유하지 않으며, 개발이 완료되면 그 때 develop branch에 merge하여 변경내용을 다른 사람과 공유.

release branch

배포 전 최종적으로 잘 작동하는지 체크하는 branch이며 보통 branch 이름에 release-를 prefix로 붙임. 배포 하기 전 모든 기능이 잘 작동하는지 확인하고 최종적인 버그 수정을 진행하는 브랜치. 수정 사항을 모두 수정한 후 배포가 가능하게 되면 master branch에 merge하며, 해당 commit의 태그로 릴리즈 번호를 붙임. 또한 release branch 에서의 수정 사항은 master branch와 develop branch 모두에 merge해서 문제가 된 부분에 대한 수정 사항을 반영해줘야 함.


hotfix branch

배포한 버전에서 심각한 문제가 발생했을 경우 정식 개발 과정 외에 긴급히 수정하는데 사용하는 branch. 보통 branch 이름에 hotfix-를 prefix로 붙임. master branch 에서 직접 branch를 만들어 버그를 수정한 뒤 master branch에 merge. 또한 hotfix branch에서의 수정 사항은 master branch 와 develop branch 모두에 merge해서 문제가 된 부분에 대한 수정 사항을 반영해줘야 함.


references



3월 02, 2016

git log

Synopsis

git log [<options>] [<revision range>] [[\--] <path>...]

commit log를 보여주는 명령. commit log 의 출력 포맷을 직접 설정하거나 각 commit 간의 차이점을 출력하는 등 출력 결과를 다양한 방식으로 커스터마이징 할 수 있음.

Options

  • -p
  • 각 commit의 diff 결과를 보여줌.

  • -<number>
  • -n <n은 숫자>
  • 가장 최근의 n개까지의 commit log만 보여줌.

  • --since=<date1>
  • --until=<date1>
  • date1 에서 date2까지의 commit log를 보여줌

  • --author=<pattern>
  • --committer=<pattern>
  • commit의 작성자/committer가 pattern과 일치하는 commit log만 보여줌

  • --graph
  • commit log를 그래프로 표시함.

  • --pretty=<options>
  • 출력 결과를 option에 따라 보기 좋게 출력함.

    • oneline
    • short
    • medium
    • full
    • fuller
    • format:string