umask 파일이나 디렉터리 생성 시 부여되는 기본 허가권 값을 지정하는 명령이다. umask 명령을 실행하면 설정된 umask값을 확인할 수 있다. 파일의 기본 허가권은 666, 디렉터리의 기본 허가권은 777이다. 사용법 $ umask umask 확인 $ umask -S umask 문자로 확인 $ umask 022 umask 022로 변경 $ umask u=rwx,g=rw,o=rw umask의 값을 문자로 설정(011) umask로 기본 허가권 계산하기 umask 077 : 000 111 111 umask 보수 : 111 000 000 디렉터리 기본 허가권 : 111 111 111 umask 보수, 디렉터리 기본 허가권 AND 연산 : 111 000 000 → drwx------ umask 077 :..
vi 편집기 사용법 커서 이동하기 h, j, k, l로 왼쪽 아래 위 오른쪽 이동 가능하다. z[Enter] : 현재 커서가 위치한 줄을 화면의 첫줄로 만든다. n% : n퍼센트에 해당하는 줄로 이동한다. :0, :$ : 줄의 제일 처음, 끝으로 이동한다. 복사 및 붙이기 복사 및 붙이기도 정수값 n을 붙이면 여러 줄 복사나 붙이기가 된다. 예를 들면, 한줄 복사는 yy를 누르면 되는데, 커서가 위치한 줄부터 5줄을 복사하려면 5yy라 입력하면 된다. 붙여넣을 때 명령어 는 p이다. 삭제하기 삭제도 정수값 n을 붙이면 여러 줄을 지울 수 있다. 예를 들면, 한 줄 삭제는 dd를 누르면 되는데, 커서가 위치한 줄부터 5줄을 삭제하려면 5dd라고 입력하면 된다. 되돌리기 및 패턴 검색 u : 직전에 내린 명..
man 로컬 시스템에서 여러 참고 문서들을 이용하여 특정 명령이나 자원들의 메뉴얼을 출력하는 영역으로 유닉스에서는 총 8개의 영역으로 되어 있으나 리눅스 커널 부분이 추가되어 총 9개의 영역으로 구성되어 있다. Manual Section 사용법 $ man [options] [section] command [SPACE] : 한 페이지 밑으로 내려간다 [ENTER] : 한 줄 밑으로 내려간다. [b] : 전 페이지로 올라간다. [q] : man 명령을 종료한다. 주요 옵션 -k 키워드 : 해당 키워드로 발견되는 모든 매뉴얼의 내용을 검색하여 보여준다. -f 키워드 : 해당 키워드에 대한 완벽히 일치되는 매뉴얼 페이지에 대한 정보를 보여준다. -w 키워드 : man 명령 실행 시에 호출되는 '메뉴얼 페이지' ..
유니코드와 UTF-8 초기에 문자를 표현하던 대표적인 방식은 ASCⅡ 인코딩 방식으로, 1바이트에 모든 문자를 표현했다. 게다가 1비트는 체크섬으로 제외하여 7비트, 즉 128글자로 문자를 표현했다. 그러다 보니 한글이나 한자 같은 문자는 2개 이상의 특수 문자를 합쳐서 표현하곤 했는데, 당연히 이런 방식은 비정상적이며, 경우에 따라서는 깨지거나 제대로 표현되지 않는 경우가 잦았다. 이런 문제를 해결하기 위해 2~4 바이트의 공간에 여유 있게 문자를 할당하고자 등장한 방식이 바로 유니코드다. 그러나 유니코드 자체는 1바이트로 표현이 가능한 영문자도 2바이트 이상의 공간을 사용하기 때문에 이를 그대로 사용하면 메모리 낭비가 심하고 따라서 이를 가변 길이 문자 인코딩 방식으로 효율적으로 인코딩하는 대표적인 ..
X 윈도 X 윈도의 개념 및 특징 X 윈도의 역사 DEC, IBM, MIT가 공동으로 시작한 아데나 프로젝트의 일환으로 Bob Scheigler와 Jim Gettys가 1984년 최초 버전을 발표 XFree86 IBM 호환 시스템을 사용하는 유닉스 계열 운영체제를 위한 이 후 자유 소프트웨어 재단의 GPL 라이선스와 호환되지 않으면서 대부분의 개발자들이 X.org로 옮겨감 개발 중단됨 X.org X. org Server라 부름 소스가 공개된 자유 소프트웨어로 X Window System에 사용되는 디스플레이 서버 현재 거의 다 X.org Server 사용함 X 윈도의 특징 네트워크 프로토콜에 기반을 둔 그래픽 사용자 인터페이스 환경 X 윈도의 구조 X 윈도는 클라이언트/서버 구조로 되어 있고, 서로간의 ..
리눅스의 구조 부트 매니저 부팅을 도와주는 역할을 하는 프로그램 선택하여 부팅할 수 있도록 해줌 부트로더 하드디스크의 맨 앞쪽 영역인 MBR(Master Boot Record)에 설치 MBR은 부트 섹터로 디스크의 첫 번째 섹터에 해당하고 크기는 512 바이트 부트 섹터에 부트 매니저 프로그램과 파티션 정보가 기록 리눅스에서 사용하는 대표적인 부트 매니저 프로그램에는 LILO(Linux Loader)와 GRUB(Grand Unified BootLoader)가 있음 LILO는 특정 파일 시스템에 구애받지 않고 플로피 디스크와 하드디스크를 이용한 부팅을 지원 현재는 GRUB 씀. GRUB GNU 프로젝트에서 만든 부트로더 다양한 파일 시스템 지원 부팅 시에 커널 인자를 조정하여 동적인 부팅을 지원 메뉴 인터..
리눅스와 하드웨어 하드웨어의 이해 리눅스 설치를 위한 하드웨어 정보 파악 CPU 인텔사의 x86 계열 CPu 지원, 추가적으로 AMD, 모토롤라,SPARC 등 지원 정확한 모델 정보를 알아야 함 CPU 비트수 파악도 중요 CPU의 가상화 기술 지원 여부도 매우 중요 메모리(RAM) 메모리의 용량은 정확히 알고 있어야 함. 스왑 파티션 설정과 관련이 있어서 32비트 리눅스 운영체제에서는 페이징 기법의 차이로 4GB 이상의 램을 인식할 수 없음 64비트 리눅스 운영체제는 메모리 용량을 16TB 이상을 지원 하드디스크 드라이브 현존하는 대부분의 하드디스크 사용이 가능. USB, SSD도 가능 파티션 변경이나 설정, 스왑 설정 등 리눅스 시스템 ㅅ ㅏ용 중에 변경할 일 이 발생 /dev/hdx 파일 형식, /d..
리눅스 기초 리눅스의 철학 리눅스의 철학 처음 개발자인 리누스 토발즈의 주도하에 개발이 진행됨. GNU GNU's Not Unix 리철드 스톨먼을 주축으로 자유로운 스프트웨어를 희망하던 공동체들이 가장 먼저 유닉스를 모태로 개발을 시작. gcc, emacs, GNOME, GNU tar, bash, GRUB 등과 같은 다양한 분야의 응용 프로그램 만듬 FSF(Free Software Foundation)와 자유 소프트웨어 자유 소프트웨어의 생산, 보급, 발전시키기 위해 리처드 스톨만이 세운 비영리 조직. 자유 소프트웨어 프로그램을 실행시킬 수 있는 자유 프로그램이 어떻게 동작하는 지 학습하고, 필요에 따라서 프로그램을 개작할 수 있는 자유 무료 또는 유로로 프로그램을 재배포할 수 있는 자유 프로그램을 개선..
운영체제의 개요 컴퓨터 하드웨어와 컴퓨터 사용자 간의 매개체 역할을 하는 시스템 소프트웨어로 사용자가 프로그램을 수행할 수 있는 환경을 제공. 좁은 의미는 하드웨어와 응용 프로그램간의 다리 역할을 하는 커널을 의미, 넓은 의미에서는 커널, 미들웨어, 응용 프로그램 실행 환경과 사용자 인터페이스 프레임워크를 모두 포괄하여 정의 주목적은 컴퓨터 시스템을 편리하게 이용하는 것에 있고, 추가적인 목적은 PCU, 주기억장치, 입출력장치 등의 컴퓨터 하드웨어를 효율적으로 관리하는 데 있음. 운영체제의 이해 운영체제의 주요 역할 하드웨어 제어 작업의 순서 정함, 입출력 연산 제어 프로그램 실행 제어, 데이터 및 파일 저장 관리 사용자들 간의 하드웨어 자원 공유 시스템 자원을 스케줄링하여 효율적으로 활용 입출력을 쉽게..
리트코드 Group Anagrams from typing import List import collections class Solution: def groupAnagrams(self, strs: List[str]) -> List[List[str]]: anagrams = collections.defaultdict(list) for word in strs: anagrams[''.join(sorted(word))].append(word) print(anagrams) return anagrams.values() if __name__ == '__main__': s = Solution() print(s.groupAnagrams(["eat","tea","tan","ate","nat","bat"])) sorted()는..
re 모듈 sub 함수 정규식과 매치되는 부분을 다른 문자로 바꾸어준다. sub 메서드의 첫 번째 매개변수는 바꿀 문자열이 되고, 두 번째 매개 변수는 대상 문자열이 된다. 그런데 딱 한 번만 바꾸고 싶은 경우도 있다. 이렇게 바꾸기 횟수를 제어하려면 다음과 같이 세 번째 매개변수로 count값을 넘기면 된다. import re s = "A man, a plan, a canal: Panama" s = re.sub('[^0-9a-z]', '', s) # 영어 소문자, 숫자 빼고 나머지 다 없앰. print(s) # s = "manaplanacanalanama" s = "A man, a plan, a canal: Panama" s = re.sub('[^0-9a-z]', '', s, count=1) print..
isalnum 함수 isalnum()는 영문자, 숫자 여부를 판별하는 함수 lower 함수 모두 소문자로 변환한다. class Solution: def isPalindrome(self, s: str) -> bool: strs: Deque = collections.deque() for char in s: if char.isalnum(): #영문자, 숫자 여부를 판별 strs.append(char.lower()) # 모두 소문자 변환 while len(strs) > 1: if strs.popleft() != strs.pop(): return False return True 출처 파이썬 알고리즘 인터뷰 (글 : 박상길 그림 : 정진호) [책만]
typing 모듈 타입 어노테이션을 사용하다 보면 리스트, 사전, 터플, 세트와 같은 파이썬 내장 자료 구조에 대한 타입을 명시해야 할 때가 있습니다. 이럴 때는 typing 모듈에서 제공하는 List, Dict, Tuple, Set를 사용하여 타입 어노테이션을 추가한다. from typing import Deque class Solution: def isPalindrome(self, s: str) -> bool: strs: Deque = collections.deque() for char in s: if char.isalnum(): strs.append(char.lower()) while len(strs) > 1: if strs.popleft() != strs.pop(): return False ret..
제너레이터 제너레이터는 루프의 반복 동작을 제어할 수 있는 루틴 형태를 말한다. 예를 들어 임의의 조건으로 숫자 1억 개를 만들어내 계산하는 프로그램을 작성한다고 가정해보자. 이 경우 제너레이터가 없다면 메모리 어딘가에 만들어낸 숫자 1억 개를 보관하고 있어야 하낟. 그러나 제너레이터를 이용하면, 단순히 제너레이터만 생성해두고 필요할 때 언제든 숫자를 만들어낼 수 있다. 이때 yield 구문을 사용하면 제너레이터를 리턴할 수 있다. 기조느이 함수는 return 구문을 맞닥뜨리면 값을 리턴하고 모든 함수의 동작을 종료한다. 그러나 yield는 제너레이터가 여기까지 실행 중이던 값을 내보낸다는 의미로, 중간 값을 리턴한 다음 함수는 종료되지 않고 계속해서 맨 끝에 도달할 때까지 실행된다. yield의 값을 ..
locals locals()는 로컬 심볼 테이블 딕셔너리를 가져오는 메소드로 업데이트 또한 가능하다. 여기서는 딕셔너리를 가져오는 부분에 집중해 살펴보자면, 로컬에 선언된 모든 변수를 조회할 수 있는 강력한 명령이므로 디버깅에 도움이 된다. 변수명을 일일이 찾아낼 필요 없이 로컬 스코프에 정의된 모든 변수를 출력하기 떄문에 편리하다. import pprint pprint.pprint(locals()) """ {'__annotations__': {}, '__builtins__': , '__cached__': None, '__doc__': None, '__file__': '3.py', '__loader__': , '__name__': '__main__', '__package__': None, '__spec_..
sort + ramda 람다 표현식이란 식별자 없이 실행 가능한 함수를 말하며, 함수 선언 없이도 하나의 식으로 함수를 단순하게 표현할 수 있다. letters = ['let1 art can', 'let2 own kit dig', 'let3 art zero'] letters.sort(key=lambda x : (x.split()[1:], x.split()[0])) # 출력 : ['let1 art can', 'let3 art zero', 'let2 own kit dig'] 식별자를 제외한 문자열 [1:]을 키로 하여 정렬하며, 동일한 경우 후순위로 식별자 [0]를 지정해 정렬되도록, 람다 표현식을 이용해 정렬할 수 있다. 출처 파이썬 알고리즘 인터뷰 (글 : 박상길 그림 : 정진호) [책만]
print 리스트를 출력할 떄는 join()으로 묶어서 처리한다. a = ['A', 'B'] print(' '.join(a)) # A B 다음과 같이 idx와 fruit이 정의되 있을 때 가장 선호되는 print() 방법은 f-string이다. 변수를 뒤에 별도로 부여할 필요 없이 마치 템플릿을 사용하듯 인라인으로 삽입할 수 있어 편리하게 사용할 수 있다. idx = 1 fruit = "Apple" print(f'{idx +1}: {fruit}') # 2: Apple 출처 : 파이썬 알고리즘 인터뷰 (글 : 박상길 그림 : 정진호)
타입 힌트 오류 확인 mypy를 사용하면 타입 힌트에 오류가 없는지 자동으로 확인 할 수 있으므로 이를 통해 수정 할 수 있다. 타입 힌트가 잘못 지정된 코드는 다음과 같이 InCompatible return value type 오류가 발생하므로 확인 후 직접 코드를 수정할 수 있다. $ mypy solution.py 출처 : 파이썬 알고리즘 인터뷰 (글 : 박상길 그림 : 정진호)
카멜 케이스와 스네이크 케이스 카멜 케이스 단어를 대소문자로 구분하여 섞어서 작명하는 방식으로, 자바의 대표적인 표기 방식이기도 하다. 스네이크 케이스 각 단어를 언더스코어로 구분한다. 일반적으로 모두 소문자로 표기하지만 경우에 따라 시작 문자는 대문자로 표기하기도 한다. 연구 결과에 따르면 스네이크 케이스가 카멜 케이스보다 훨씬 더 인지하기 쉽다고 한다. 파이썬은 PEP8을 통해 스네이크 케이스 방식의 네이밍 컨벤션을 권장한다. camelCase: int = 1 snake_case: int = 1 네이밍 컨벤션 파이썬의 변수명 네이밍 컨벤션은 자바와 달리 각 단어를 밑줄(_)로 구분하여 표기하는 스네이크 케이스를 따른다. 이는 함수명도 마찬가지다. 특히 파이썬은 파이썬다운 방식에 굉장한 자부심이 있어서..
구조체 파이썬에는 구조체가 없을 뿐더러 클래스 또한 데이터 타입을 지정할 수 없어, 구조체와 같은 형태를 정의하려면 네임드 튜플을 사용해야 했다. from collections import namedtuple MyStruct = namedtuple("MyStruct", "field1 field2 field3") m = MyStruct("foo", "bar", "baz") 위처럼 정의해 사용하는 방법밖에 없었는데, 파이썬 3.7부터 dataclass를 지원하며, @dataclass 데코레이션으로 타입 힌트와 함께 활용함으로써 다음과 같이 class를 이용해 구조체 형태로 정의할 수 있다. from dataclasses import dataclass @dataclass class Product: weight..
네트워크 침해 유형 및 특징 네트워크 침해 유형 및 특징 DoS(Denial of Service) 공격 시스템이나 네트워크의 구조적인 취약점을 공격하여 정상적인 서비스를 할 수 없도록 방해하는 것. 과도한 부하를 발생시켜 데이터나 자원을 잠식. 파괴 공격, 시스템 자원 고갈 공격, 네트워크 자원 고갈 공격으로 분류. Ping of Death Ping을 이용하여 ICMP 패킷을 정상적인 크기보다 아주 크게 만들어 보낸는 공격 방법. ICMP Flooding의 일종. UDP Flooding UDP 패킷을 대량 발생시켜 특정 시스템의 서비스를 방해하는 공격. 소스 주소가 스푸핑된 시스템에서 UDP 패킷을 공격 대상이 되는 시스템에 대량 전송하여 네트워크 대역폭을 소모하는 형태로 공격이 이루어짐 TCP SYN ..
12. 제품 소프트웨어 패키징 제품 소프트웨어 패키징하기 사용자 중심의 패키징 수행 제품 소프트웨어 패키징의 개념 개발이 완료된 제품 소프트웨어를 고객에게 전달하기 위한 형태로 포장하는 과정 제품 소프트웨어 패키징 적용 시 특성 전체 내용을 포함하는 메뉴얼 작성 버전 관리 / 릴리즈 노트 고객, 사용자 편의성 중심 모듈화 제품 소프트웨어 패키징을 위한 모듈 빌드 제품 소프트웨어 패키징은 모듈들을 통해 수행되므로, 최초 소스 개발 시 해당 모듈 단위 및 모듈화를 통해 제품 소프트웨어 패키징을 수행 소프트웨어 모듈 및 패키징 모듈화 개념 모듈을 이용하여 소프트웨어의 성능을 향상시키거나 시스템의 디버깅, 시험, 통합 및 수정을 용이하도록 하는 소프트웨어 설계 기법. 모듈화의 장점 프로그램의 효율적인 관리 소프..
제네릭 프로그래밍 제네릭이란 파라미터의 타입이 나중에 지어되게 해서 재활용성을 높일 수 있는 프로그래밍 스타일이다. 파이썬은 동적 타이핑 언어이기 때문에 제네릭이 필요 없다. 하지만 동적 타이핑의 장점이자 단점은 얼핏 사용하기엔 매우 편하지만 코드의 복잡도가 높아질수록 혼란을 가중시킨다는 점이다. 타입을 아예 명시하지 않으면 가독성을 낮추고 버그 발생 확률이 높아진다. 따라서 다음과 같이 타입을 명시할 수 있다. from typing import TypeVar T = TypeVar('T') U = TypeVar('U') def are_equal(a: T, b: U) -> bool: return a == b are_equal(10, 10.0) 파이썬은 동적 타이핑 언어지만 이처럼 타입을 명시하게 되면 가독..
11. 응용 SW 기초 기술 활용 데이터베이스 기초 활용하기 데이터베이스 종류 데이터베이스 데이터베이스 개념 다수의 인원, 시스템 또는 프로그램이 사용할 목적으로 통합하여 관리되는 데이터의 집합 데이터베이스 종류 파일 시스템 종류 ISAM : Indexed Sequential Access Method. 자료 내용은 주 저장부, 자료의 색인은 자료가 기록된 위치와 함께 색인부에 기록되는 시스템 VSAM : Virtual Storage Access Method. 대형 운영체제에서 사용되는 파일 관리 시스템 계층형 데이터베이스 관리시스템(HDBMS; Hierarchical Database Management System) 데이터를 상하 종속적인 관계로 계층화하여 관리하는 데이터베이스 접근 속도가 빠르지만, 종..
11. 응용 SW 기초 기술 활용 운영체제의 특징 운영체제의 종류 운영체제(OS; Operating System)의 개념 사용자가 컴퓨터의 하드웨어를 쉽게 사용할 수 있도록 인터페이스를 제공해 주는 소프트웨어 한정된 시스템 자원을 효과적으로 사용할 수 있도록 관리 및 운영함으로써 사용자에게 편리성을 제공 컴퓨터 시스템과 사용자 간의 인터페이스 기능을 담당 운영체제의 종류 윈도즈 운영체제 MS-DOS의 멀티태스킹 기능과 GUI 환경을 제공하는 응용 프로그램으로서, 마이크로소프트사가 개발 윈도즈 운영체제 특징 그래픽 사용자 인터페이스(GUI) 제공 선점형 멀티태스킹 방식 제공 자동감지 기능 제공 OLE(Object Linking and Embedding) 사용 : 개체를 현재 작성 중인 문서에 자유롭게 연결..
10. 프로그래밍 언어 활용 기본 문법 활용하기 변수 활용 변수 : 어떤 값을 주기억 장치에 기억하기 위해서 사용하는 공간 식별자 : 프로그램의 구성요소를 구별하기 위한 기준 바인딩 : 변수와 변수에 관련된 속성을 연결하는 과정 선언 : 변수에 이름, 데이터 타입 등의 속성을 부여하는 작업 영역 : 이름이 사용되는 범위를 의미 할당 : 변수에 메모리 공간을 바인딩하는 작업 데이터 타입 : 변수가 가질 수 있는 속성 및 속성 값의 길이 연산자 : 데이터 처리를 위해 연산을 표현하는 기호 명령문 : 프로그램을 구성하는 문장으로, 지시 사항을 처리하는 단위 자료구조 개념 컴퓨터에 데이터를 삽입, 삭제, 수정하게 해주는 논리적인 공간 구조 자료 구조 분류 단순 구조 : 프로그래밍 언어에서 제공하는 기본 데이터 ..
Pandas 특징 Easy-to-use data structure and data analysis tools Relational 하거나 labeled data에 대한 쉬운 접근 및 data manipulation 관련 기능 제공 효율적인 연산이 가능한 다차원 array 자료형 제공 Pandas에서 주로 다루는 데이터 테이블 형태의 데이터(주로 SQL table, csv) Time series 데이터 주요기능 결측치(missing data) 처리 간편한 slicing 및 indexing 여러 개의 데이터를 하나로 병합하는 join/merge 그룹화 기능 Pandas vs Numpy Pandas는 Numpy의 기능을 확장한 패키지 1-d array, 2-d array를 각각 Series와 DataFrame이..
Numpy Numpy Array 한 array 객체에는 모두 동일한 타입의 elements들이 포함됨 dtype array 객체에 포함된 elements의 타입을 설명하는 객체 ndim 차원의 수, 축의 수 import numpy as np a = np.array([[0, 1], [5, 6]]) print(a.ndim) # 2 shape 각 차원의 크기를 나타내는 integer들의 tuple tuple 객체의 length는 ndim과 동일함 import numpy as np a = np.array([[0, 1], [5, 6]]) print(a.shape) size 행렬의 모든 원소 갯수 shape의 elements들을 모두 곱한 결과와 같음 import numpy as np a = np.array([[0..
가상화 관리 가상화 서비스의 이해 가상화의 정의 및 개요 한 컴퓨터의 물리적 시스템 자원인 CPU, 메모리, 디스크 등을 여럿으로 나누거나, 다수의 컴퓨터들의 물리적 자원을 하나로 묶어서 제공하는 기술 가상화의 기능 공유(Sharing) 다수의 많은 가상 자원들이 하나의 동일한 물리적 자원과 연결되어 있거나 가리키는 것 서버내의 논리적 파티셔닝(LPARs), 가상머신(VM), 가상 디스크, 가상 LAN(VLANs) 단일화(Aggregation) 공유의 반대되는 가상화 개념. 가상 자원은 여러 개의 물리적 자원들에 걸쳐서 만들어질 수 있으며 이를 통해 외견상 전체 용량을 증가시키고, 전체적인 관점에서 활용과 관리를 단순화시켜 줌. 에뮬레이션(Emulation) 물리적 자원 자체에는 원래부터 존재하지 않았지..