'Story List'에 해당되는 글 179건
- 2022.04.20 :: [Git] Git 기본 정리2
- 2022.04.20 :: [Git] Git 기본 정리1
- 2022.04.19 :: [c/c++] Error C2065 'NULL': undeclared identifier
- 2022.04.18 :: [C/C++] strtok, strtok_s crash
- 2022.04.18 :: [c/c++] const 키워드 이해
- 2022.03.05 :: [패키지관리자] 개발 언어별, OS별 패키지 관리자 정리
- 2022.02.18 :: [sound] FxSound 강추
- 2022.01.26 :: [암호화폐] 코인(암호화폐) vs 토큰(Token)
- 2022.01.26 :: [암호화폐] 채굴 종류 1
- 2022.01.16 :: [정보] "새 볼륨" 볼륨은 다시 마운트 할 수 없음
앞에서 기본적은 Git의 동작 방법에 대해서 설명을 하였습니다.
그런데, 저의 경우 visual studio, pycharm, android studio, atom 등을 사용하면서, console에서 git을 사용하기 보다는 visual환경을 사용하는 것이 생산성과 편의성이 높아 GitHub Desktop을 사용합니다.
그래서, 해당 내용을 간단히 정리하고자 합니다.
1.Download: https://desktop.github.com/
2. Github 로그인
다운받은 파일을 실행(GitHubDesktopSetup-x64.exe)후 Github에 로그인(계정이 없으면 생성후 로그인)
3. 로그인후 tutorial repository 만들기
1) crate a tutorial repository 클릭
- 앞에서 local repository를 만들고, remote repository를 각각 설명했지만,
아래의 글을 보면, 동시 생성된다는 것을 확인할수 있고, 해당 저장소가 private하게 만들어짐을 확인
3. 확인
1) Default 생성된 로컬 저장소
2) 원격 저장소(remote repository)
확실히 console에서 git init, git add, git commit, git push 등등하는 것보다 월등히 편하다.
그리고 실무적으로 visual 하게 작업하는것이 잔실수를 줄이기도 합니다.
동작 개념만 명확히 이해하고 있다면, GUI환경에서 작업하는 것이 좋을 듯합니다.
감사합니다.
정리 방향은 Git 역사, 철학등은 모두 스킵하고, 클라이언트(개발자) 측면에서 필수적인 부분만 정리하고자 합니다.
(참고: Git 이전에는 cvs, svn 등이 있었지만, 현재는 Git이 천하통일(?))
1. What?(Git 이란?)
- 소스코드/리소스를 효과적으로 관리하기 위해 리누스 토르발스가 개발한 분산형 버전 관리 시스템(VSC)이다.
2. How to use?(어떻게 사용)
- "작업 공간에서 작업한 내용을 스테이지에 올려서 로컬 저장소에 커밋하고, 이를 푸시해서 원격 저장소로 보낸다"
1) 작업공간(working space)
- 개인 PC에서 작업내용(코드, 이미지 편집)을 담고 있는 프로젝트 폴더를 말함
2) 스테이지(stage)
- 작업한 내용이 올라가는 임시 영역을 말함 --> 매우 학문적인 표현 ㅠㅠㅠㅠ
- 직관적으로 표현하면, 작업 공간에서 생성/변경이 발생한 파일을 다음 커밋에 반영하기 위해 추적하는 것을 말함
- 스페이지하는 것을 인덱스(index)한다고 표현하기도 함
- 추적되는 파일은 스테이지 영역(stage area)에 넣는다고 함.
cf) 언스페이지(unsatge): 추적을 해제, 즉 스테이지 영역(stage area)에서 제외시킴
[명령어]
- git add : 작업내용을 추적(stage)시키는 명령어입니다.
ex) git add . //현재 폴더의 모든 파일과 디렉토리, 하위 디렉토리에 든 전부를 staging area에 추가한다.
git add 파일 // 파일을 staging area에 추가한다.
- git rm : 작업 내용을 추적해제(unstage)시키는 명령어입니다.
3) 커밋(commit)
- 작업한 내용을 로컬 저장소에 저장하는 과정
- 스테이지(추적) 내용을 하나로 묶는 것을 말함
- commit과 동시에 로컬 저장소에 저장됨
- 직관적으로 표현: 작업공간(working space)의 스페이지(stage, index)내용을 커밋(변경, 추적내용)해서 저장소에 저장
ex) git commit -m "메시지" //메시지는 어떤 내용을 반영했는지를 나타냅
git log // 로컬 저장소(local repository)에서 commit된 이력을 확인
git status // 마지막 commit 이후 작업 공간(work space)에서 변경이 있는 모든 파일을 보여줌
cf) 태그(tag)란? 커밋의 임의 위치에 쉽게 찾아갈 수 있도록 붙여놓은 이정표를 태그
3) 로컬 저장소(local repository)
- PC에 작업내용이 저장되는 개인 전용 저장소
ex) git init DAS // 로컬 저장소 생성
or
위와 같이 console or GUI를 통해서 작업공간(working space)를 생성하면,
.git 폴더가 생성되는되데, 이곳이 commit된 내용이 들어가는 로컬 저장소(local repository)입니다.
4) 원격 저장소(remote repository)
- 로컬 저장소에 있는 내용을 원격 서버에 여러사람과 공유 또는 공동작업을 위한 저장소
- Push/ Pull
- Push: 로컬 저장소의 내용 중 원격 저장소에 반영되지 않은 커밋을 원격 저장소로 보내는 과정
- Pull: 푸시와 반대로 원격 저장소에 있는 내용 중 로컬 저장소에 반영되지 않은 내용을 가져와서 로컬 저장소에 저장하는 과정을 의미합니다. 이를 통해 다른 팀원이 변경하고 푸시한 내용을 로컬 저장소로 가져올 수 있습니다.
푸시 과정에서 충돌(Collision)이 일어나서 푸시가 거절된 경우, 풀을 통해 원격 저장소의 변경 내용을 반영한 뒤 다시 푸시를 시도해야 합니다.
// NEXT: 실제 실무중심에서 사용하는 명령어 정리
// 예: 원격 저장소에서 로컬 저장소로 소스코드를 복사 --> git clone
해당 에러가 발생시 해결방법
[예제]
void main(){
char *pszBuff = NULL;
return;
}
Error C2065 'NULL': undeclared identifier
[에러원인]
' NULL' 이 내장(build-in) 상수(constant)가 아니기 때문이다.
[해결]
1. Assign 0
void main(){
char *pszBuff = 0;
return;
}
2. include <stddef.h> or <iostream>
#include <stddef.h>
#include <iostream> // for C++
void main(){
char *pszBuff = NULL;
return;
}
3. #define NULL 0
#define NULL 0
void main(){
char *pszBuff = NULL;
return;
}
4. In newer C++(C++11 and higher):: nullptr
#include <iostream> // for C++
void main(){
char *pszBuff = nullptr
return;
}
아주 오래전에 이와 유사한 이슈가 있었는데, 깜빡하고 똑같은 실수를 했음
개인적으로는 msdn에 해당 내용이 좀더 친절하게 되어있으면 좋겠다.
https://stackoverflow.com/questions/40034176/strtok-s-crashes-program-when-string-is-of-char
해당 이유는 아래와 같이 정리가 되어있음.
" strtok() changes the memory pointed to by the argument str, so what it points at must be writeable - i.e. a char * and not a const char *. Since in the second case this condition is not satisfied, when it attempts to write a NUL to the read-only memory it crashes."
간단하게 정리하면, strtok_s(strtok)함수의 첫번째 인자에 상수포인터(pointer to const)가 들어가면 않됨
즉, 포인터가 가르키는 address가 read-only이면 않됨
[참조]
https://choiwonwoo.tistory.com/entry/cc-const-%ED%82%A4%EC%9B%8C%EB%93%9C-%EC%9D%B4%ED%95%B4
const 키워드는 개발중에는 자연스럽게(?)사용하다가, 질문을 받고 설명하려고 하면 은근히 까다롭게 느껴져정리를 하고자 합니다. 개발자마다 설명하는 방법이 여러가지 있을 수 있지만, 저의 경우는 아래 개념으로 이해를 하고 있습니다.
1. const(constant) 키워드란?
- 상수로 만든다, 변경할수 없게 만든다.
- 변수 또는 포인터 변수를 상수로 만든다. --> 변수의 상수화
- const를 사용한 변수는 반드시 초기화 되어야 함(생각해 보면 당연함!)
2. 어디에 위치하는가?
- https://www.geeksforgeeks.org/memory-layout-of-c-program/
- const 키워드를 가진 변수는 반드시 초기화 되어야함
- Data Segment(아래 3가지 형태로 분류)에 저장됨:
1) .DATA 영역: 변수를 초기화한 상태 저장
2) .BSS 영역: 변수를 초기화하지 않은 상태 저장
2) .RODATA 영역 : 읽기 전용 데이타 (예: const char* string="hello")
--> 참고: 세크먼트 분류: CODE(TEXT), DATA, HEAP, STACK)
3. 용례
1) const int 과 int const 는 같은 의미
- 상수 int := int 상수
- const int a; // 에러 발생: const는 반드시 초기화 되어야 함
- cont int a = 10;
a = 11; // 에러발생: 상수화된 변수 내용은 변경 불가
2) const vs 포인터 변수: 4가지 조합이 가능함
- 이 문법은 아차하면 헷갈림
a) const int *pointer: 상수 포인터
- int형 상수에 대한 포인터(pointer to int const)
- 포인터 대상 or 내용을 상수화시킴
- 포인터 변수 주소 변경가능, 포인터 대상/내용 변경 불가
- const int *pointer 해석(?): int가 const이다. 그래서 내용이 변경 불가이고, 포인터 자체는 변경이 가능합
- 예:
int nValue1 = 100;
int nValue2 = 200;
const int *pnVar1 = &nValue1;
pnVar1 = &nValue2; // 성공
*pnVar1 = 500; // 에러발생:const인 변수에 할당할 수 없습니다.
b) int const * pointer:
- int형 상수에 대한 포인터(pointer to const int)
- const int *piointer와 같은 표현
c) int * const pointer: 포인터 상수
- (주소를 가지는) 포인터 그 자체를 상수화 시킴
- int형에 대한 포인터 상수(const pointer to int)
- 주소는 변경 불가, 그러나, 포인터 변수가 가르키는 내용은 변경이 가능
- int * const pointer 해석(?): pointer가 상수이므로 변겨이 불가, 그러나, 포인터가 가르키는 내용은 변경가능
-예:
int nValue1 = 100;
int nValue2 = 200;
int *const pnVar1 = &nValue1;
pnVar1 = &nValue2; // 에러
*pnVar1 = 500; // 성공.
d) const int const *pointer
- 상수를 가리키는 상수 포인터
- int 형 상수에 대한 포인터 상수(const pointer to const int)
- 주소, 값 모두 변경 불가
- int const * const pointer는 같은 표현
int nValue1 = 100;
int nValue2 = 200;
int *const pnVar1 = &nValue1;
pnVar1 = &nValue2; // 에러
*pnVar1 = 500; // 에러
[직관적으로 정리]
# const 다음에 오늘 타입/내용은 변경 불가
# 예: int function(const char* list);
--> 함수의 경우 call by reference를 통해 값은변경하지 않고, 연결되는 주소만 바꾸어서 사용하기 위함이다.
최근 Python을 주 언어로 하는 프로젝트를 완료하고, 진행 중 정리를 해야겠다는 내용을 오늘에서야 정리합니다.
개인적으로 약 20년 넘게 개발을 하면서, 프로젝트의 특성에 따라 적절한 개발 언어, 기술, 그리고 툴을 선택 또는 학습하고 진행하고 있습니다.(C/C++,C#, JAVA, Javascript, Python, PHP, Solidity etc)
하지만, 언제 부터인지는 기억이 나지 않지만(개인적인 경험에는 java가 처음이었던 것 기억됨), 최근 언어마다 다양한 pakage manager가 지원되고 있어, 협업을 위해서 패키지 관리자 부분도 프로젝트 초기에 가볍게(?) 이야기 되고 있습니다. 그래서, 간단하게 해당 내용을 정리하였습니다.
1. Pakage manager란?
- 프로그래밍 언어적인 측면에서는 프로젝트(개발)의 환경을 쉽게 만들어주고, 편리하게 관리하기 위한 도구라고 보면됩니다. (이러한 도구(?)가 없다면, 프로젝트 시작전에 각 모듈의 유효한 dependecy등을 수작업으로 해주어야 함)
- 시스템 어드민 측면에서는 시스템에 패키지(소프트웨어)의 다운로드, 설치 그리고 관리를 의미하였습니다.
2. 각 언어별 Pakage manager
1) Java - Maven, Gradle 이 있지만, 현재는 Maven이 주를 이루고 있음
2) JavaScript - npm
3) C# - nuget
4) C/C++ - vcpkg(https://choiwonwoo.tistory.com/entry/vcpkg-Please-install-the-English-language-pack?category=267468)
5) PHP - Composer
6) Python - pip, pypi, poetry
3. OS 별 Pakage manager
1) Mac: Homebrew
2) Debian: dbpkg, apt
3) Redhat: rpm, yum
4) Window: winget(https://docs.microsoft.com/ko-kr/windows/package-manager/winget/)
4. 정리
- 아주 초기에는 일일이 라이브러리를 다운받아 설치를 하여, 테스트하고 패스등의 설정을 하였지만, 근래 개발에서는 가능한 패키지 관리자를 통해서, 일관되게 관리 하여 생산성과 효율을 높이고자 합니다. 하지만, 너무 편해지다 보면 기초적인 라이브러리의 설정을 어려워하는 쥬니어 개발자를 가끔 보게 되면서 놀라곤 합니다. 아주 가끔은 한땀, 한땀 설정및 빌드를 하면서 테스트 코드 및 library version dependency 문제등을 경험하다 보면, 예상치 못한 가치와 경험이 쌓이곤합니다.
제 기억이 분명히 유료였던것으로 기억하는데, 공짜로 풀렸네요.
꼭 설치해서 사용해보세요. 정말로 소리가 다른것을 느끼실수 있어요.
# 절대강추 #무료
# 초기에는 '코인(암호화폐) vs 토큰(Token)'는 구분이 나에게 힘들었습니다.
그래서, 해당 내용을 정리한 메모내용이 발견(?)되어 기록으로 남기고자 합니다.
[차이 설명]
1. 기술적으로 독자적인 블럭체인 메인넷(네트워크)을 가지고 있으면 "코인", 없으면 "토큰"
2. 독자적인 메인넷 코인은 채굴(mining)되어 생산되고, 토큰은 미리 발행되어 뿌려짐
3. 토큰 발행을 ICO라고 하는데, 이더리움 메인넷을 기반으로 하는 경우는 전세계 표준인
ERC-20(Ethereum Request for Comment)을 기반으로 함
이 기준을 준수한다는 것은 DAPP(Decentralized Application, 탈중앙화 응용 프로그램)에서 사용할 수 있는
토큰을 의미하게 됨
4. 블럭체인 메인넷 코인: BTC, ETH, EOS, TRX, QTUM, STEEM, NEM등
5. 메인넷의 존재는 자체적인 생태계(예:독자적인 사업성), 기술력 그리고 자본력을 의미함
그래서, 처음부터 코인으로 존재하기는 어렵고, 처음에는 토큰에서 코인으로 진화(?)함
6. 진화: 토큰에서 코인으로
1) 기존 메인넷을 기반으로 토큰 제작(DApp을 활용해 개발)과 ICO를 진행(White paper 발행)
2) 블럭체인 네트워크 개발, 그리고 테스트넷 진행(Coin으로 발전할수 있는지 테스트 하는 것)
3) 테스트넷이 성공하면, 메인넷을 출시: 독자적인 생태계와 독립적인 지갑을 생성이 가능
4) 메인넷성공하면, 토큰에서 코인으로 전환됨.
초기에 생각보다 개념 정리가 힘들었서, 어느 노트에 정리할려고 모았던 자료를 기반으로 내용을 정리하였습니다.
(* 혹시 비슷한 글이 보인다면, 넓은 마음으로 이해 부탁드립니다.)
1. 채굴(mining)이란?
- 블럭체인(Blockchain)의 핵심인 노드(node)를 생성하는데 기여하고, 그 보상으로 암호화폐(예: 비트코인, 이더리음등)을 얻는 것을 의미함.
- 노드(node)의 역활은 거래내역을 담고 있고, 이거래 내역은 신뢰성을 담보함. (*노드 역할/상태에 따라 다양한 종류 있음)
- 기술적인 분류: POW(작업증명), POS(지분증명), DPOS(위임지분증명)
2. 채굴 방법
1) CPU: POW
- 현재는 채산성이 거의 없음
2) GPU: POW
- 그래픽 카드의 가격이 이슈임
3) ASIC: POW
- ASIC 정의: 특정한 목적을위해 설계된 주문형 반도체 의미
- 코인 채굴을 위해서 설계된 장비를 의미
- 다양한 종류의 ASIC장비가 생산되나, 한국에서는 구하기 어려움
- 예: 비트코인, 라이트코인, 제트 캐시, 시아 코인, 도지 코인, 카데나 등
4) Hard-disk: POW
- IPFS 기반
- 많은 하드디스크와 노동력 필요
- 비추
5) Staking: POS
- 채굴(mining)이라고 말할수 있는지 모르겠음. 하지만, 코인을 얻게 된다는 부분은 같기 때문에 정리함
- 의미: ‘스테이킹’은 보유한 코인을 일정기간 묶어두는(락업) 대신, 이자로 신규 코인을 받는 채굴 방식으로 가상자산 직접 투자보다 리스크가 적으면서 시중금리보다 높은 이자를 받을 수 있어 인기가 높다
출처 : 소비자가 만드는 신문(http://www.consumernews.co.kr)
- 자신의 코인을 락업하고 특정한 간격마다 블록을 생성하기 위해 프로토콜(POS)에 의해 임의로 선택되는 검증자가 포함될때, 더 많은 수량을 스테이킹한 참여자가 다음 블록 검증자로 선택될 확률이 더 높다.(자본주의 프로토콜)
- 스테이킹은 ASIC등과 같이 특화된 마이닝 하드웨어에 의존하지 않고 블록을 생성할 수 있음
그래서, ASIC 마이닝에는 하드웨어와 같은 상당한 투자가 필요하지만,
스테이킹은 암호화폐에 직접 투자를 하게 된다.
이 투자를 바탕으로 연산 작업을 통해 다음 블록을 위해 경쟁하는 대신
자신이 스테이킹한 코인의 수에 따라 지분 증명 검증자가 선택됩니다.
- 돈을 맞기고, 이자를 방식이라고 보면됨(예금과 비슷)
- 종류: 에이다, 폴카닷, 이더리움, 이오스, 테조스, 바이낸스 코인, 트론 등
NTFS형식 외장형 하드를 Mac계열 PC에서 사용할때 가끔 발생합니다.
원은은 정상적으로 외장형으로 unmount하지 않아서 발생한다고 하는데..원인은 추가적으로 더 있는것으로 보입니다.
이 에러가 발생하면 제가 알고 있기로는 Mac PC에서는 해결을 할수 없습니다.
윈도우 PC에서 아래와 같이 작업을 작업을 진행하시면 됩니다.
>chkdsk /F [외장하드 드라이므];