목록전체 글 (60)
근본없는 코딩
컨테이너 제어 - ① Docker Desktop에서 하는 방법 생활코딩 Docker 입문수업 Run = image를 실행시켜서 container를 만드는 것 ✏️ Container Run 1. Docker Desktop 실행 > Image > Run 클릭 2. Run 버튼 클릭 시, image를 Container로 만드는 대화상자가 뜬다 ✔ 하나의 image로 여러 Container를 만들 수 있기 때문에 아래와 같이 이름을 잘 지정해 주는 것이 좋다. 3. 생성된 Container 확인 ✔ Container의 이름과 상태를 확인할 수 있다. ✔ Container가 실행되면서, 그 Container 안의 Process가 실행되고 있는 것이다. 4. Container가 실행되고 있는 모습 확..
이미지 pull 생활코딩 Docker 입문수업 ✨ Docker를 사용하기 위해 이해해야 하는 몇 가지 개념 ✔ docker hub: 레지스트리라고 불리는 서비스. 필요한 S/W를 찾는 곳 ✔ image: docker hub에서 찾아낸 것을 컴퓨터에 다운로드 받아 갖고 있는 것 ✔ container: image를 실행하는 것 → image는 여러개의 container를 가질 수 있다. ✔ pull: docker hub에서 image를 다운로드 받는 행위 ✔ run: image를 실행시키는 행위 Docker hub에서 필요한 이미지를 다운로드 받는 방법 Apache Web Server라는 프로그램을 Conatiner에서 실행시키고 싶다! 1. Docker Hub 접속 2. Explore를 클릭하여 ..
수업 소개 생활코딩 Docker 입문수업 ✔️ 배경 한 대의 컴퓨터 안에서 각각의 앱을 실행하고, 각각의 앱은 격리된 환경에서 실행된다. . 운영 체제가 설치된 컴퓨터: host . host에서 실행되는 각각의 격리된 실행환경: container ✔️ container 운영체제 전체가 설치되어있는 것이 아니고, 앱을 실행하는데 필요한 라이브러리와 실행 파일만 포함 . 이미 존재하는 운영체제를 공유하므로 추가 설치할 필요 없음. . 운영체제가 하나니까 속도도 느려지지 않는다. . 시간절약 + 저장장치 용량도 절약 가능 → Linux OS에는 이렇게 앱 실행 방법이 내장되어있는데, 이 기술을 Container 라고 한다. → Container 기술을 이용해서, 이런 일을 쉽게 해주는 S/W 중 가장 ..
01. 몬티 홀 문제 . 미국의 'Let's Make a Deal'이란 TV쇼에서 알려진 퀴즈쇼로, 쇼 진행자 'Monty Hall' 의 이름을 땄다. 3개의 문 중 1개의 문 뒤에만 자동차가 있고 나머지 2개의 문 뒤엔 염소가 있는 상황. 자동차가 어딨는지 맞춘다면 상품으로 얻을 수 있다. 참가자는 1번 문을 선택했고, 사회자는 다른 문 뒤에 염소가 있는 걸 보여주며 선택을 바꾸겠느냐고 묻는다. 이 경우 참가자가 선택을 바꾸는 게 유리할까? 여기서 딜레마가 발생한다. 참가자는 총 3가지 가능성 사이에서 고민하게 된다. ① 남은 문은 2개이니, 선택을 바꾸든 바꾸지 않든 정답을 맞힐 확률은 동일하다. ② 선택을 바꾸는 게 맞힐 확률을 높인다. ③선택을 바꾸지 않는 게 더 낫다. 02. 그래서,..
01. 트리거 (Trigger) 개념/목적 . 트리거는 데이터베이스 시스템에서 데이터의 입력, 갱신, 삭제 등의 이벤트가 발생할 때마다 자동적으로 수행되는 사용자 정의 프로시저이다. . 트리거는 Table과는 별도로 Database에 저장된다. . 트리거는 View에 대해서가 아니라 Table에 관해서만 정의될 수 있다. . 트리거는 SQL의 제약조건 방법을 통해 명시할 수 없는 무결성 제약조건을 구현하고, 관련 테이블의 데이터를 일치시킬 때 주로 사용된다. 02. Trigger의 종류 ✔️ 문장 트리거 . 많은 행에 대해 변경 작업이 발생하더라도, 오직 한 번만 트리거를 발생시키는 방법 . DML(Insert, Update, Delete)문에 대해 한 번만 실행된다. . 컬럼 값에 변화가 생길 때마다,..
#include using namespace std; int main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); int b, n; string sum =""; cin >> n >> b; while (n!=0) { int tmp = n % b; n = n / b; if (tmp < 10) sum += (tmp + '0'); else sum += (tmp + 'A' - 10); } for (int i =0; i < sum.length(); i++) { cout
#include using namespace std; int main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); int b, sum = 0; string n; cin >> n >> b; for (int i = 0; i = '0' && n[i]
01. React Hooks란? . 2018 React Conf에서 처음 소개되어 React v16.8에 도입된 기술 . 함수형 컴포넌트에서 state관리와 Life cycle을 다룰 수 있게 해주는 기술 . React Hooks 종류: useState(), useEffect(), useMemo(), useContext(), useRef(), useCallback() ... 📝 Life Cycle . Mount 그리고 Update, Unmount 3가지의 Life Cycle이 있다. ① Mount . 처음 컴포넌트가 생성되고 렌더링을 거치는 과정 ② Update . props 혹은 state가 변경될 때, forceUpdate()가 실행되었을 때 리렌더링 하는 과정 ③ Unmount . 컴포넌트가 종료되..
재해 복구 . 재해란 회사의 사업 지속이나 재정에 부정적인 영향을 미치는 이벤트. . 재해복구는 이러한 재해에 대비하고 재해가 발생할 시, 복구하는 작업 재해복구시스템 개요 및 평가 지표 The Nines . 연중 무휴로 동작해야하는 컴퓨터에서, 100% 가동 시간을 보장할 수 없다. . 시스템의 문제 뿐만아니라 자연재해, 시민불안, 전력 손실과 같은 물리적 재해에 대한 계획도 필요하다. → 사실 AWS, Google Colud, Azure와 같은 서비스를 이용하는 장점은 이러한 부분에 대해서 신경쓸 필요가 없다는 점도 있다. . 하지만, SW측면에서는 여전히 복구 계획을 마련해야 한다. ✔️ 나인스(The Nines) . 온라인 서비스의 가동시간 수준을 측정하는 방법. . 9의 개수에 따라 보장..
[ 정렬(Sort) 알고리즘 ] 버블정렬, 선택정렬, 삽입정렬, 합병정렬, 퀵정렬 00. Big O 표기법과 시간 복잡도 . 시간 복잡도: 알고리즘의 수행시간을 의미하는 지표 . 공간 복잡도: 알고리즘의 메모리 사용량 ✔️ 빅오(Big O) 표기법 . O(n): 이 함수는 n만큼의 데이터가 주어졌을 때, '최악'의 경우 n만큼의 리소스를 소모한다. ✔️ 정렬 알고리즘 . 정렬 알고리즘: 어떤 데이터 셋이 주어졌을 때 이를 정해진 순서대로 나열하여 재배치하는 문제. . 단순(구현 간단) 하지만 비효율적인 방법: 삽입정렬, 선택정렬, 버블정렬 . 복잡하지만 효율적인 방법: 퀵정렬, 힙정렬, 합병정렬, 기수정렬 01. 버블정렬(Bubble Sort) ✔️ 개념 . 서로 인접한 두 원소를 검사하여 정렬하는 알고..
#include using namespace std; using ll = long long;// 정수 범위 밖이므로 long long 타입을 사용한다. int N, M, K; ll arr[1000001]{}; ll seg[2097153]{}; void init(int s, int e, int n) { // start 와 end 의 위치가 일치하면 input[start] 값을 넣어준다. if (s == e) { seg[n] = arr[s]; return; } int m = (s + e) >> 1; init(s, m, n * 2);init(m + 1, e, n * 2 + 1); seg[n] = seg[n * 2] + seg[n * 2 + 1]; } // start, end, 찾아야하는 곳(index), 바뀐..
#include using namespace std; int main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); char str[101]; while (true) { cin.getline(str, 101); if (cin.eof()) break; cout
#include using namespace std; int main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); char str[16]; int res = 0; cin >> str; for (int i = 0; i < 15; i++) { if (str[i] == '\0') break; if (str[i]
#include using namespace std; int main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); char s1[4], s2[4]; int n1, n2; cin >> s1 >> s2; n1 = (s1[2] -'0') * 100 + (s1[1] - '0') * 10 + (s1[0] - '0'); n2 = (s2[2] - '0') * 100 + (s2[1] - '0') * 10 + (s2[0] - '0'); if (n1 > n2) cout
#include using namespace std; int main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); char str[1000001]; int cnt = 1, i; cin.getline(str, 1000001); for (i = 0; i < 1000000; i++) { if (str[i] == ' ') cnt++; if (str[i+1] == '\0') break; } if (str[0] == ' ') cnt--; if (str[i] == ' ') cnt--; cout
#include using namespace std; int main() { int t, r; char s[21]; cin >> t; for (int i = 0; i > r >> s; for (int k = 0; k < 20; k++) { if (s[k] == '\0') break; for (int j = 0; j < r; j++) cout
#include using namespace std; int main() { char str[101]; int res[26]; cin >> str; for (int i = 0; i < 26; i++) res[i] = -1; for (int i = 0; i < 100; i++) { if (str[i] == '\0') break; if (res[str[i] - 'a'] == -1) res[str[i] - 'a'] = i; } for (int i = 0; i < 26; i++) cout
#include using namespace std; int main() { int n, res=0; char str[101]; cin >> n; cin >> str; for (int i = 0; i < n; i++) { res += str[i] - '0'; } cout
#include using namespace std; int main() { char s; cin >> s; cout 숫자 (아스키코드) */ char ch = 'A'; cout