새로운 개발 환경을 마주하게 될 일은 잘 없지만, 나의 입맛에 따라 환경을 다시 구성하는 것은 재밌는 일이면서도 귀찮은 일이다. vim에서 사용하면 좋은 옵션들과 플러그인들을 한 번에 모아 내가 사용하는 계정의 홈 디렉토리에 위치시키면 바로 사용할 수 있도록 정리해보았다. 아래의 설명들은 우분투 환경을 기준으로 설명한 것이다. 설정하기 $ git clone https://github.com/dirmathfl/vim-settings.git $ cd vim-settings $ tar xvf vim-settings.tar.gz $ cd vim-settings && cp -r . ~/. vim 실행 후 `:PluginInstall`을 입력하면, 포함된 플러그인들이 자동으로 설치된다. 사용하는 플러그인 Vundl..
기억 클래스 지정자(Storage class specifiler)는 변수를 위한 기억장치 할당 관리의 효율성을 담당한다. 또한 메모리, 레지스터, 스택 등 어디에 할당하느냐에 따라 scope와 life time이 달라지게 된다. 따라서 각 기억 클래스에 대한 특징을 명확히 알고 코드를 작성하는 것이 좋다. auto 흔히 사용하는 변수로, 아무것도 지정하지 않으면 자동으로 `auto` 키워드가 붙게 된다. 이는 선언된 영역 또는 함수를 벗어나면 사라지게 되며, 실행 중에는 메모리의 `stack`에 위치하게 된다. register 해당 키워드를 지정한 변수를 CPU의 `register`에 저장하도록 요청할 때 사용한다. 이는 컴파일러에 따라 사용자가 `register`라고 명시하였음에도 불구하고 `auto`..
동일한 IP 대역에서는 ARP를 통해 원하는 목적지에 주소를 찾을 수 있지만, 다른 대역의 IP 경로를 찾아가고자 한다면 경로를 찾아가기 위한 라우팅(Routing)이 필요하다. 라우팅은 어떤 방식으로 이루어지는지 이해한다면, 어떤 방식으로 네트워크를 통해 목적지에 도달할 수 있는지 이해할 수 있다. 스위치 vs 라우터 `스위치`는 같은 네트워크. 즉 동일한 IP 대역대를 가지는 네트워크의 데이터를 전송할 수 있도록 하는 장비이다. 그럼 이와 달리 `라우터`는 어떤 기능을 수행할까? `라우터`는 서론에서 말하였듯이 다른 IP 대역으로 갈 수 있도록 경로를 안내해주는 역할을 하게 되며 이를 `Routing`이라고 한다. 짧게 한 줄로 요약한다면, 스위치는 동일한 IP 대역(네트워크)에 속한 장비들끼리의 네..
리눅스에서 내가 원하는 프로세스를 할당하기 위해, 유저 레벨에서 fork()를 활용하여 나의 실행 프로그램을 부모로 하는 자식 프로세스를 생성할 수 있다. fork()가 어떤 식으로 동작하는지 정확히 이해하지 못한다면, 원치 않는 결과를 만들 수 있으므로 정리해보고자 한다. fork 살펴보기 리눅스에서 위와 같이 `man fork`를 입력하면 `fork()`에 대한 설명이 나온다. 간단히 설명하자면, `fork()`를 호출하는 프로세스, 즉 부모 프로세스를 그대로 복제한 새로운 프로세스를 생성한다. 또한, 실행 결과에 따라 반환 결과도 상이하다. 새로운 프로세스를 할당할 수 없는 경우는 `-1`을 반환한다. 부모 프로세스의 경우 생성한 자식 프로세스의 `pid`를 반환하며, 자식 프로세스의 경우 `0`을..
기본이 되는 배경지식들 Punycode 다양한 언어의 hostname을 표현하기 위해 ASCII로 변경하는 포맷 https://en.wikipedia.org/Punycode HSTS HTTP Strict Transport Security 다음과 같은 공격을 방지하기 위함 main-in-the-middle attacks protocol downgrade attacks cookie hijacking HTTPS를 사용할 경우, 강제적으로 https로 접속하도록 함 http를 통해 접속한 후 https로 리다이렉션 할 경우 위의 공격에 노출되게 됨 DNS DNS로 요청 정보를 보내기 전에 캐시를 확인 브라우저 내의 캐시 OS 내의 캐시 라우터 내의 캐시 ISP(Internet Service Provider) 내..
렉토피아 정혜경 강사님의 Secure & Generic C 강의를 듣고, 정리한 내용입니다. 해당 내용의 저작권은 정혜경 강사님에게 있습니다. 동적 할당 user level에서 사용할 수 있는 동적 할당으로는 대표적으로 `malloc`과 `calloc`이 있다. `malloc`은 사용하고자 하는 메모리 공간을 할당 후 별도의 초기화가 없어 쓰레기 값을 같는다. 이와 달리 `calloc`은 메모리 공간 할당 후에 할당된 공간을 모두 0으로 초기화 한다. malloc malloc은 parameter로 할당하고자 하는 크기를 받는다. 보통은 할당하고자 하는 공간의 데이터 타입에 따라 `sizeof(데이터 타입)` 연산을 통해 할당한다. 만약 malloc을 사용하여 크기가 5인 int 1차원 배열을 할당한다면 ..
렉토피아 정혜경 강사님의 Secure & Generic C 강의를 듣고, 정리한 내용입니다. 해당 내용의 저작권은 정혜경 강사님에게 있습니다. C의 Generic 데이터 타입에 상관없이 하나의 함수로 동일한 동작을 수행하도록 하는 방식이다. 예를 들어 정렬을 하고자 할 때, 데이터 타입 (int, double ...)에 따라 별도로 함수를 구성한다면 유지보수 측면에서 상당히 비효율적일 것이다. 따라서 c++의 STL과 유사한 기능을 C로도 만들 수 있다. 어떻게 하면 generic하게 코드를 구현할 수 있을까? 이는 앞서 다룬 다양한 포인터에서 `함수 포인터`, `void 포인터`와 같은 응용 포인터를 활용하면 데이터 타입에 상관없이 기능을 수행하는 함수들을 구현할 수 있다. Generic for-eac..
렉토피아 정혜경 강사님의 Secure & Generic C 강의를 듣고, 정리한 내용입니다. 해당 내용의 저작권은 정혜경 강사님에게 있습니다. 1차원 포인터 int *p, *pp; int arr[5] = {10, 20, 30, 40 ,50}, num = 10; p = arr; //p는 배열명을 받으므로, p[1]과 같이 배열처럼 사용가능. *(p++)도 가능. // index 3의 주소는 &arr[2], &p[2], (p + 2), (arr + 2), &*&*(arr + 2) pp = # 1차원 포인터는 특정한 주소를 포인트 할 수 있다. `배열 명`, `함수 명`, `&변수명`은 주소를 나타낸다. 따라서 위의 예시 코드와 같이 포인터 변수를 선언하고 배열명을 대입 연산하게 되면 포인터 p는 배열..