전체 글
CGI 스크립트의 환경변수
참고 1: 위키백과 - CGI 참고 2: IBM Documentation CGI 란? 공용 게이트웨이 인터페이스(Common Gateway Interface; CGI)는 웹 서버 상에서 사용자 프로그램을 동작시키기 위해, 데이터를 주고받는 방식 또는 규약입니다. 우리는 동적인 웹 서버를 구현하기 위해, 서버에서 외부 프로그램을 불러내고 그 처리 결과를 클라이언트에 송신합니다. CGI 스크립트의 환경 변수 CGI를 실행할 때 서버와 브라우저는 각자의 환경변수를 교환하며, 이는 대부분 서버에서 전달된 요청에 대한 데이터를 나타냅니다. 우리가 구현할 CGI에서는 다음과 같은 환경변수를 설정하여 전달합니다. 변수 설명 디폴트 AUTH_TYPE 인증 방법(BASIC, SSL 등). null (인증되지 않음) CO..
HTTP 헤더에 따른 콘텐츠 협상 (Content negotiation)
참고: MDN - Content negotiation 1. 콘텐츠 협상이란? 클라이언트가 URL로 특정 리소스(문서)를 요청하면, 서버는 콘텐츠 협상(Content negotiation)을 통해 가장 적절한 프레젠테이션(리소스 버전)을 제공합니다. 예를 들어, 영미권에서는 영어로 된, 한국에서는 한글로 된 프레젠테이션을 볼 수 있도록, 적절한 리소스 버전을 골라내는 것도 콘텐츠 협상에 해당합니다. 콘텐츠 협상에는 여러 방법이 있으나, 여기서는 클라이언트 Request의 HTTP 헤더에 따른 방법만 살펴보겠습니다. 2. HTTP Request 헤더에 따른 콘텐츠 협상 헤더 헤더 설명 Accept 클라이언트가 처리하고자 하는 미디어 리소스 타입(MIME 타입) Accept-Charset 클라이언트가 이해할 ..
docker run시 컨테이너 내의 파일 수정하기(환경변수 + sed명령어)
이전에 작성한 글에서 컨테이너에 환경변수를 선언하고 사용하는 법은 간단하게 설명하였습니다. 이번에는 환경변수와 sed -i명령어를 활용하여, docker run시 설정한 환경변수 값에 따라, 컨테이너에 위치할 파일의 내용을 수정해 보겠습니다. 이를 응용하면, nginx의 default 파일 내용을 환경변수 값에 따라 수정하여, nginx의 설정을 변경하는 것과 같은 작업도 할 수 있습니다. sed 명령어 sed 명령어는 다음과 같이 사용할 수 있습니다. -i 옵션을 주지 않을 경우, 실제 파일의 내용은 수정되지 않습니다. sed -i "s/찾을 문자열/바꿀 문자열/" 파일경로 파일 수정 예제 환경변수 HELLO의 옵션에 따라, hello.txt의 내용을 변경하는 예제를 작성해보았습니다. srcs/hell..
[ASM] 64bit 환경에서의 레지스터와 리눅스 함수 호출 규약
libasm은 맥 OS 64bit 환경에서 인텔 어셈블리를 이용하여 진행되기 때문에, 이를 기준으로 정리하였습니다. 범용 레지스터 우선, 16bit의 레지스터는 각 레지스터 이름의 약자로 이루어져 있습니다(ex. AX = accumulator register). 여기서 32bit 레지스터들은 앞에 E(extended) 문자가 추가되고, 64bit는 R문자가 추가됩니다. 64bit 환경에서는 아래의 레지스터들 외에, r8~r15의 레지스터 8개를 추가로 가집니다 레지스터 accumulator base counter data stack pointer stack base pointer src dest 16bit AX BX CX DX SP BP SI DI 32bit EAX EBX ECX EDX ESP EBP E..
C언어 - 완전 탐색(Brute-force) 알고리즘으로 map에 있는 구멍 찾기
완전 탐색(Brute-force)이란? 가능한 모든 케이스를 다 검사하는 알고리즘입니다. 모든 케이스를 검사하기 때문에 가장 단순하면서 확실하지만, 시간이 오래 걸릴 수도 있다는 단점이 있습니다. 예전에 랜덤한 모양의 2차원 맵을 입력받아, 게임 플레이를 위한 3d맵을 구현하는 프로그램을 작성한 적이 있습니다. 이때, 주어진 맵에 오류가 없는지 검사하는 과정이 필요했는데, 그때 작성했던 알고리즘을 문제로 재구성하여 정리해보았습니다. 문제 : 맵에 있는 구멍 찾기 랜덤한 모양의 맵이 주어진다고 가정합니다. 이때, 맵이 구멍 없이 벽으로 완전히 둘러싸여 있는지 검사하는 알고리즘을 작성해 봅시다. (맵의 사이즈는 가로 100, 세로 100 이하로만 주어진다고 가정) 맵은 0과 1로 이루어져 있으며, 외부는 '..
[ASM] Intel 어셈블리 명령어 정리 + hello world 분석
이전 글에서 어셈블리어로 "hello world"를 출력하는 예제를 작성하였습니다. 이번에는 기초적인 명령어들을 학습하고, 코드를 분석해보겠습니다. 어셈블리어의 명령어 구조 Intel문법에서의 어셈블리 명령어는 다음과 같은 구조를 하고 있습니다. 라벨 : ;주석 여기서 라벨(label)은 기계어로 직접 번역되지는 않으며, 점프(jmp) 명령어를 사용하는 등, 메모리 주소의 참조가 필요할 때 사용됩니다. 라벨 명령어의 집합. 명령어 또는 데이터의 주소를 나타냄. 명령어 mov, jmp 등의 동작을 지시. 피연산자 명령어의 피연산자(operand). 레지스터, 숫자, 문자, 메모리 주소 등. 주석 앞에 ;문자를 붙여 주석처리 어셈블리 명령어 libasm을 구현하며 학습한 명령어들을 위주로 추가 중입니다. 조..
[ASM] 어셈블리어란? 맥OS에서 Intel문법 + NASM으로 "hello world" 출력하기
어셈블리어(Assembly language)란? "기계어와 일대일 대응이 되는 컴퓨터 프로그래밍의 저급 언어" - 위키백과 프로그래밍 언어에는 C/C++과 같은 고급 언어(High-Level language) 외에도 어셈블리어와 기계어가 존재합니다. 먼저, 실제 컴퓨터 프로그램은 0과 1로만 이루어져 있는데, 이를 기계어라고 부릅니다. 그리고 어셈블리어는, 이런 기계어에 MOV, ADD와 같은 명령어를 각각 대응시킨, 프로그래밍의 저급 언어입니다. 컴퓨터 구조(CPU)마다 기계어가 다르기 때문에, 이에 대응하는 어셈블리어도 각각 달라지게 됩니다. 이러한 단점을 개선하기 위해 만들어진 것이 C언어와 같은 고급 언어로, CPU에 종속적이지 않으면서도, 저급 언어처럼 메모리에 직접 접근할 수 있다는 장점이 있..
c언어 - printf()의 서식지정자(format specifier)와 플래그
서식지정자란? 먼저, printf()는 다음과 같은 형태로 정의되어있습니다. int printf(const char *format, ...) printf()가 가변 인수 '...'으로부터 넘겨받은 변수들을 출력하기 위해서는, 각 변수의 자료형에 대한 정보가 필요합니다. 이러한 정보를 안내하는 것이 '%'기호로 시작하는 서식지정자이며, 다양한 플래그를 활용하면 넓이, 좌우 정렬 등의 출력 형태도 설정할 수 있습니다. %[플래그][넓이][.(정밀도)][길이]서식지정자 여기서 '%서식지정자'는 서식지정자를 사용할 때 필수 요소이지만, 그 밖의 플래그나 넓이 등의 옵션은 선택사항입니다. 서식지정자 실제 printf()에는 더 많은 서식지정자들이 있지만, 우선은 ft_printf에서 요구하는 서식지정자들 위주로 ..