IRC에서 사용하는 커맨드 SERVER > 지정 서버로 접속 JOIN > 채널 입장, 생성 NICK > 대화명 설정 및 변경 같은 닉네임으로 변경시도시 아무반응 x > PART > 채널에서 나오며 서버접속은 유지 > QUIT > 접속된 서버와 접속을 끊음 > EXIT > 서버와 접속을 끊고 프로그램을 종료 > DISCONNECT > /quit 과 동일한 효과, quit 메세지는 기본메세지로 전달 > MSG > 현재 창에서 바로 메시지 보내기 > NOTICE > 사용자에게 귓속말 보내기 > KICK > 강제퇴장 시키기 (op만 사용 가능) > INVITE > 초대 > TOPIC > 채널의 주제 > MODE (-i, -t, -k, -o, -l) > 각종 설정 기능, +를 -로 하면 설정을 해제 op권한이 있어야만
Socket Programing 이란? > 모든 컴퓨터는 소통을 하게되는데 이를 위해 데이터를 요청을 하는 클라이언트 역할과 데이터를 내려주는 서버 역할이 생겨남 네트워크를 통해 데이터를 주고받게 해주는것이 네트워크 프로그래밍, 즉 소켓 프로그래밍임 Socket 이란? > 물리적인 네트워크 연결 위에서 소프트웨어적인 데이터 송수신 방법을 모든 운영체제에서 제공하는데 이것이 소켓임 데이터를 주고받기위해 소켓 디스크립터라는 파일 시스템을 사용하는데 이것을 소켓이라고 생각하면 됨 서버를 만들기위한 절차 > Socket() 다른 클라이언트와 통신을 하기위한 소켓을 생성해줌 Bind() 내가 만드려는 서버의 ip와 포트번호를 소켓에 할당해줌 listen() 다른 클라이언트
IRC (Internet Relay Chat) > Internet Relay Chat의 약자로 TCP를 기반으로 한 실시간 인터넷 채팅 프로토콜이다. 여러 사용자가 연속적인 대화를 할 수 있게 서로의 메세지를 서버를 경유해서 사용자에게 어떻게 전달할 것인지 정해둔 규약이다. 서버와 클라이언트로 구성되어있으며 1:1이 아닌 하나의 서버에 다수의 클라이언트가 접속할 수 있다.
docker란? > Go언어로 작성된 리눅스 컨테이너를 기반으로하는 오픈소스 가상화 플랫폼 VM처럼 가상화기술을 사용하여 독립된 환경에서 애플리케이션을 실행할 수 있는 컨테이너를 생성 Docker file과 Docker Image를 활용해 컨테이너를 생성할 수 있음 컨테이너와 VM의 차이 > > VM은 호스트OS에서 사용중인 PC자원중 일부를 격리시키고 해당 자원을 사용해 게스트 OS를 설치하여 호스트로부터 완전히 분리된 가상화 환경을 구축할 수 있음 컨테이너는 호스트OS에서 사용중인 프로세스를 격리시키고 어플리케이션 실행에 필요한 바이너리만 올린 뒤 가상화하여 사용하는것 VM은 OS위에 다른 OS가 올라가기에 무겁고 느릴수밖에 없지만 완전히 독립된 환경을 제공하기 때문에 더 높은
기본 패키지 설치 > sudo로 사용자 전환 su - apt 패키지 색인 업데이트 apt-get updae git 설치 sudo apt-get install -y git make 설치 sudo apt-get install -y make vim 설치 sudo apt-get install -y vim -systemd 설치 sudo apt-get install -y systemd 패키지 관리자가 https를 이용할 수 있도록 설정 sudo apt-get install -y apt-transport-https SSL통신이 가능하도록 인증서 획득 sudo apt-get install -y ca-certificates 다양한 통신 프로토콜을 지원하는 데이터 송,수신 패키지 sudo apt-get install -y curl 데이터를 암호화 하거나 서명을 추가 하여 작성자를 확인하고 변조 유무를 식별할 수 있게 해주는 GPG 설치 sudo apt-get ins
ray cast > 광선을 직선으로 투사해 가장 먼저 닿은 물체와의 거리를 파악하는 기법 cub3d에서는 플레이어의 시야에 보이는 벽과의 거리를 파악하여 화면 높이와 벽의 높이를 거리에 따른 비율로 계산해 2D맵을 3D원근법으로 렌더링하기위해 사용 특징 > 그림자, 빛의 반사 등등을 모두 계산하는 ray tracing보다는 재현율이 떨어지지만 연산횟수는 크게 차이남 1000 * 1000크기의 화면이라면 x축 크기인 1000번의 연산만 하면 모든 벽과의 거리를 파악할 수 있음 (단 모든 벽은 수직, 바닥은 평평해야하고 벽은 모두 동일한 크기의 큐브형태여야 함) 기본 원리 > 플레이어 위치로부터 시야각 내에 포함되어있는 모든 x좌표로 ray를 발사함 ray는 좌표상 x 또
cub3d > raycast와 mlx를 활용하여 1인칭 게임을 구현 ray cast > 광선을 직선으로 투사해 가장 먼저 닿은 물체와의 거리를 파악하는 기법 여기서는 플레이어의 시야에 보이는 벽과의 거리를 파악하여 화면 높이와 벽의 높이를 거리에 따른 비율로 계산해 2D맵을 3D원근법으로 렌더링하기위해 사용 구현사항 > 0, 1, N, S, E, W로 이루어진 map을 읽어올 수 있어야함 map 파일의 상단에는 불러올 텍스쳐 정보등의 identifier를 가지고 있어야 함 map이 벽으로 둘러쌓여있지 않다면 error 동, 서, 남, 북 벽들은 각각 다른 텍스쳐를 가지고 있어야 함 W, A, S, D를 사용해 캐릭터를 움직일 수 있어야함 mlx와 raycast를
CPP Module 08 > 07과 같이 템플릿을 사용하지만 여태 사용하짐 못했던 STL(Container, Iterator, Algorithm)을 적극적으로 사용하여 실습 > Sequential Container (iterator 존재 O) → std::vector, std::deque, std::list, std::forward_list > Adaptor Container (iterator 존재 X) → std::stack, std::queue, std::priority_queue ex00 > 컨테이너에서 value를 찾아 iterator를 반환해주는 easyfind()함수를 작성 이때 인자로 들어가는 컨테이너는 Sequential Container만 해당됨 template을 활용해 여러가지 컨테이너를 받을 수 있도록 함 std::find 활용해 value를 찾고 iterator를 반환 ex0
CPP Module 07 > C++ template을 실습 ex00 > 함수 템플릿을 정의해보고 호출해보기 template을 사용해 어떤 자료형이든 받아와서 사용할 수 있는 swap(a, b), min(a, b), max(a, b)함수 만들어보기 이때 세가지 함수에 들어가는 두 인자는 같은 자료형이어야 함 함수 템플릿의 정의와 선언은 모두 hpp 파일에서 이루어져야 함 ex01 > 배열의 포인터를 받아와 배열의 각 요소들에 func 함수를 적용시켜줘야 함 템플릿 함수를 함수 포인터로 받아와 사용 템플릿 함수를 호출 시 자료형을 지정해주어야 하지만 첫 인자에서 자료형이 정해진다면 지정해주지 않아도 됨 ex02 > 클래스 템플릿 Array를 정의 파라미터가 없는 생성자는 빈 Array를 생성 파라미터로 unsigned int를 받아왔다면 해당 갯수만큼의 인자를 가진 Array 생성 OCCF를 준수하여 작성 []를
CPP Module 06 > staticcast, dynamiccast등 여러종류의 type cast들을 실습 ex00 > 문자열을 인자로받고 이 문자열을 char, int, float, double로 변환하여 출력 출력할 수 없는 char은 표시할 수 없다고 출력 결과를 도출할 수 없거나 오버플로우가 발생시 impossible 출력 +inf, -inf, +inff, -inff, nan, nanf를 입력시 맞게 출력 static_cast static_cast(대상); 형변환시 사용되며 잘못된 형 변환에대한 오류를 체크해줌 double -> char 같은 사이즈가 작아지는 상황에서는 값이 사라질 수 있음 일반 포인터의 변환은 안되지만 상속관계의 포인터끼리 변환 가능, 다만 다운캐스트시 안전하지않음 Convert 클래스 ex01 > 구조가 있는 객체의 내용물을 바이트 배열로 저장하는 것을
CPP Module 05 > Exception을 활용한 예외처리 Throw 실습 try catch throw의 활용 ex00 > Bureaucrat 클래스 grade는 1이 가장 높은것이고 150이 가장 낮은것 (10에서 incGrade할 시 11이 됨) grade가 1~150을 벗어날 시 에러 에러 발생시 exception을 throw해주어 try catch문으로 에러를 받을 수 있게 해야함 std::exception을 상속받아 Bureaucrat::GradeTooHighException, Bureaucrat::GradeTooLowException 클래스를 만들어야 함 > exception 클래스 exception을 사용할 때 에는 throw 키워드를 사용하여 에러를 발생시킬 수 있고 throw로 에러를 발생시켰을때 실행중이던 컨텍스트를 종료하고 스택상 가장 가까운 catch를 찾아가게되는데 이때 catch가 존재하지 않는다면 프
CPP Module 04 > 다형성, 추상클래스, 인터페이스를 실습할 수 있는 과제 가상함수, 순수가상함수를 실습 orthodox canonical form은 항상 준수 생성자, 소멸자 호출시 적절한 메시지를 출력해주어야 함 ex00 > Animal 클래스 자식들이 재정의해서 사용할 makeSound()는 가상함수로 선언 소멸자도 가상함수로 만들어 적절하게 호출되도록 해야함 Protected인 함수, 변수는 외부에서는 접근이 불가능하고 자기자신과 자신을 상속받은 자식들만 접근할 수 있음 > Protected std::string type; > Public void makeSound(); 각 동물에게 적절한 울음소리를 출력 std::string getType(); type을 반환해줌 Cat 클래스 > Animal클래스를 상속받음 makeSound함수를 적절하게 오버로딩 type은 "Cat"으로 초기화되어야 함 >
CPP Module 03 > cpp03은 클래스의 상속과 관련한 실습을 할 수 있는 과제이다 여러가지 상황에서의 상속을 실습 -Wshadow, -Wno-shadow 플래그 사용해보기 ex00 > ClapTrap 클래스 모든 생성자와 소멸자는 호출시 메시지를 출력해야함. 모든 멤버변수는 실행시 적절한 메시지를 출력해야함. > Private Name (생성자 매개변수로 사용) Hit Points (10) Energy points (10) Attack damage (0) > Public void attack(const std::string& target); >> target에 attack시 target은 Attack damage만큼의 Hit points 감소하며 1 Energy Points 감소, 단 Energy points가 0이라면 불가. void takeDamage(unsigned int amount); >> a
CPP Module 02 > CPP02부터는 Orthodox Canonical Form 을 준수하여 작성해야함 Orthodox Canonical Form은 기본 생성자, 기본 소멸자, 복사 생성자, 할당 연산자 오버로딩을 명시적으로 선언해놓은 형식을 말함 이를 통해 클래스에 포인터나 참조 형식이 있을 때, 깊은복사 와 얕은복사를 비롯한 여러가지 잠재적인 버그를 해결하는데에 도움을 줄 수 있음 Cpp Module 02에서는 클래스의 생성자와 소멸자를 Orthodox Canonical Form으로 정의하고 여러 연산자들을 Overloading하는것을 실습할 수 있음 ex00 > 고정소수점을 표현할 수 있는 Class를 만들어보는 과제 Private멤버 고정소수점 값을 저장할 정수형 변수 분수 비트의 수를 저장하는 정적 정수형 상수. 이 상수는 항상 8의 값을 가짐 Public멤버 고정 소수점 값을 0으로 초기화해 줄 기본 생성자, 기본 소멸자, 복사
CPP module 01 ex00 > Zombie 클래스를 생성하고 해당 클래스를 heap영역과 stack영역에 할당해보고 차이를 실습해보는 과제 announce()는 문자열을 출력, randomchump()는 함수 내에서 좀비클래스를 생성, newZombie()는 new를 사용하여 Zombie클래스의 메모리를 할당하고 반환 ex01 > 00에서 만든 클래스를 클래스배열로 생성해보는 과제 N개의 Zombie클래스를 한번에 할당하고 한번에 반환해주어야 함 ex02 > 일반변수, 포인터변수, 레퍼런스변수를 사용해보고 차이점을 확인해보는 과제 "HI THIS IS BRAIN" 이라는 내용물을 담은 문자열을 작성 후 문자열의 주소를 담은 stringPTR 을 생성. 그리고 문자열의 참조를 담은 stringREF 생성. stringREF는 NULL일 수 없으며, stringREF의 값을 변경시 A의 값 역시 변경됨 ex03 >
CPP module 00 ex00 > c 표준출력을 사용하지않고 cout을 활용해 문자열을 대문자로 출력 ex) 구현 > ex01 > 간단한 전화번호부를 제작, 동적할당 금지, 최대 8개까지 저장, 8개 초과시 오래된 데이터를 삭제하고 저장, 프로그램은 비어있는채로 시작, 각 정보들을 저장할때는 각자 다른 클래스를 생성하고 저장 정보를 입력받아 저장하는 ADD, lastname, firstname, nickname, phonenumber, secret을 저장해야하고 NULL은 금지 간단한 정보를 보여주고 인덱스값을 입력받아 완전한 정보를 출력하는 SEARCH, 열의 너비는 10글자까지 오른쪽정렬로 출력, 각 구역은 '|' 로 구분함, 열의 너비보다 긴 문자의 마지막은 .으로 치환하여 출력 프로그램을 종료하는 EXIT 명령어를 구현하고 이외의 명령어는 무시 하나의 커맨드를 실행한 후 프로그램은 종료되지않고 새로운 커
Minishell > C를 활용해 bash의 일부분을 구현해보는 과제. 파트를 크게 5가지로 나누어 팀원인 jiwolee님과 각각 역할을 나누어 수행했습니다. 저는 tokenizer, built-in, signal, 특수문자 파트를 맡아 수행하였습니다. Minishell 구조 > tokenizer 환경변수처럼 해석이 필요한 문자를 해석하고 문자열을 의미있는 토큰으로 나누어 변환한 뒤 필요한 형태로 가공하여 parser로 전달한다. >> 이때 환경변수, 쌍따옴표, 홑따옴표, whitespace, 특수문자 등에 대한 처리를 잘 해주어야 이후 편하게 처리가 가능하다. > parser 토큰을 구조를 가진 구문트리(syntax tree)로 변환한다. → here-documantaion << executor 구문 트리에 맞게 명령을 실행한다. → redirection → pipe 생성 및 fork 자식프로세스 생성 → c
Builtin 함수 cd > 현재 작업 디렉토리를 절대경로, 상대경로 등 을 사용해 이동시켜주는 명령어 > minishell 요구사항 옵션없이 절대, 상대경로만을 사용할 수 있어야함 예시 \> cd ../ 상위 디렉토리로 이동 \> cd ./ 현재 디렉토리로 이동 \> cd Home 디렉토리로 이동 \> cd~ Home 디렉토리로 이동 \> cd JJEON/minishell JJEON 디렉토리의 minishell 디렉토리로 이동 echo > 받은 인자들을 출력해주는 명령어, -n옵션 사용 시 줄바꿈을 출력하지않음 minishell 요구사항 -n 옵션만을 지원하는 echo 예시 \> echo > \> echo asd asd \> echo -n asd asd\> \> echo -n -n -n asd asd\> \> echo -nnn -n -n asd asd\> \> echo -n -nnn -nm asd -nm
조건 > ctrl-C, ctrl-D and ctrl-\\ should have the same result as in bash. > ctrl-C, ctrl-D, ctrl-\\ 는 bash와 동일하게 동작하여야 합니다. > When interactive: > 상호작용이 가능할 때: > ctrl-C print a new prompt on a newline. > ctrl-C는 새로운 줄에 새로운 프롬프트를 출력합니다 ctrl-C는 cat, grep등으로 정지된 상태에서 ^C를 출력하고 줄바꿈뒤 새로운 프롬포트를 출력합니다 ctrl-C는 버퍼에 문자가 있는 상황에서는 버퍼를 지우고 새로운 프롬포트를 출력합니다 > ctrl-D exit the shell. > ctrl-D는
readline 인자 *str : 프롬포트에 출력할 문자열 기능 str을 출력하고 프롬포트에서 표준입력으로 문자열을 입력받고 입력된 문자열을 반환 입력이 완료되기 전 까지는 다음 코드로 진행되지않음 반환값 저장공간을 동적할당하고 입력받은 문자열을 저장하여 반환함 주의사항 -lreadline 라이브러리를 링크해주어야 함 반환받은 문자열은 사용 후 저장공간 할당을 해제해주어야 함 rlonnew_line 인자 없음 기능 알림형태 함수 readline 디렉토리에서 update관련 함수들에게 커서가 다음줄로 이동한것을 알려줌 반환값 성공시 0 에러시 -1 주의사항 -lreadline 라이브러리를 링크해주어야 함 rlreplaceline 인자 `*s