본문 바로가기

전체 글141

[라이브 스트리밍 서비스] - 1. 서비스의 구조 & 실행 방법 이 글은 제가 어떻게 서비스의 구조를 가져갔는지에 대한 기록이라, 몇몇 내용들이 생략될 수 있습니다. 서버를 2개나 잡아먹고 있어서 (사실 nginx를 쓰면 그럴 이유가 없었는데) 어서 내려야해.. (빈 지갑) 자세한 것과 궁금한 부분들은 댓글로 달아주시면 감사하겠습니다. 서비스의 구조 처음 프로젝트 구상을 할 땐 이런 구조를 생각했었다. rtmp와 hls를 동시에 수행하는 컨테이너에, 사용자가 송출한 영상을 multicast하여 각 컨테이너마다 이를 처리하여 hls fragment를 구성한다. user가 많아지면 컨테이너 수를 늘려 요청을 분산하는 식으로.. 근데 multicast를 어떻게 해야 할 지 몰라서 (+ 시간없음크리..) 우선 밑에와 같이 간단하게 구성하였다. 애는 내 TODO 에 포함되어 .. 2020. 7. 4.
2020 상반기를 돌아보며 1월 부스트캠프가 마무리되고, 좋은 친구들과 해커톤에 참여하여 심사위원 상을 받았다. 이에 관한 후기는 여기에 있다. 이를 기세로 동아리 홈페이지를 만들자는 계획을 세웠고, 웹을 공부하고 싶은 친구들을 실제로 작동하는 예시를 통해 가르쳐주고 역할을 부여했다. 동아리에 디자인을 좋아하는 친구들이 만들어준 디자인을 기반으로 페이지별로 역할을 나누어 개발하였다. 잘 진행되지 않은 이유가 있는데, 가장 큰 이유는 MVP 를 너무 크게 잡았던 것 이다. 개별 페이지를 각자 개발해서 합치면 된다는 naive한 생각을 했다니.. 코드 컨벤션도 맞추고 학습 수준도 최대한 끌어올려야 하는데, 커뮤니케이션보단 각자 페이지 구성에 집중하는 바람에 실제로 코드 리뷰를 할 수 있는 사람이 나밖에 없었고, git 충돌이 너무 많.. 2020. 6. 29.
동아리 입문자 대상 학습방법에 관한 세미나 발표 자료는 여기에 있습니다. 주로 개인적인 경험을 바탕으로 이야기 한 것이라, 개개인의 성향에 따라 다를 수 있으니 의견이 다르다면 본인에게 걸맞는 학습 전략을 구성하시는 것이 좋을 것이라고 생각합니다. 도움이 필요하거나 궁금하신 점이 있으시면 카카오톡으로 문의해주세요 추가자료 window 10 shortcut Reference windows 10 shortcut : https://www.docdroid.net/fUXoZzP/windows-10-pdf 2020. 6. 29.
[Network Basic] 3. TCP Connection Multiplexing TCP connection 소켓 API는 기본적으로 blocking이라, accept() 하면 일단 block되고 본다. recv()로 data를 받을 때도 물론. 사용자가 1명이면 Blocking I/O가 문제가 되진 않겠지만, 실제로는 그럴리가 없다. 여러 connection을 동시에 다루는 기술이 필요하다. Polling Non-blocking Sockets 소켓 자체가 non-blocking operation을 할수 있게 하는 방법 중 fcntl 함수를 호출하는 것인데, 단순히 모든 active socket을 순서대로 확인하는 polling 구조로 되어있어 자원 낭비가 심하며, 구현해야 할게 추가적으로 발생한다. 그래서 일반적으로 Polling 방식을 잘 쓰지 않는다. Fo.. 2020. 6. 11.
[Network exercise] 2. TCP 소켓을 이용하여 HTTP 서버 만들기 TCP 소켓을 이용하여 서버의 현재 시간을 알려주는 HTTP 서버를 만들어보자. 우선 만든 결과 프로그램은 다음과 같다. #if defined(_WIN32) // windows #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0600 #endif #include #include #pragma comment(lib, "ws2_32.lib") #else // linux #include #include #include #include #include #include #include #endif #if defined(_WIN32) #define ISVALIDSOCKET(s) ((s) != INVALID_SOCKET) #define CLOSESOCKET(s) closesocket(s.. 2020. 5. 27.
[Network Basic] 2. Socket Socket 소켓은 communication link의 endpoint이고, 어플리케이션은 소켓을 통해 모든 네트워크 정보를 전송한다. Unix 계열에선 POSIX 소켓을 주로 사용한다. Unix Socket, BSD Socket, POSIX Socket은 같은 것을 의미한다. 윈도우 소켓 API는 Winsock 으로 불린다. Berkeley socket에 compatible 하도록 구성되어있다. 소켓은 두가지 타입으로 분류된다. - Connection-oriented - Connectless Connectionless라는게 실제로 Connection이 존재하지 않는 상태에서 데이터를 전송한다는 의미는 아니다. 요즘 시대에 자주 쓰이는 프로토콜은 두가지이다 - TCP -> Connection-orient.. 2020. 5. 27.
Java Basic (4) Essential Standard Classes BigInteger long 보다 더 긴 Integer를 저장하기 위해 사용한다. BigInteger number = new BigInteger("62957291795228763406253098"); String 을 이용하여 BigInteger 객체를 선언할 수 있다. 내부적으로 제공되는 메소드만을 사용하여 연산하여야 한다. BigInteger nine = ten.subtract(BigInteger.ONE); // 10 - 1 = 9 BigInteger oneHundredTen = ten.multiply(eleven); // 10 * 11 = 110 BigInteger twelve = oneHundredTen.divide(nine); // integer division: 12 각 메소드를 사용한다고 해서.. 2020. 5. 27.
[Network exercise] 1. Local address 목록을 나열하기 Windows 에서 Local address 목록 나열하기 windows 환경에서 minGW 컴파일러를 이용하여 동작하는 코드이다. Visual Studio C에서도 잘 동작한다. #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0600 #endif #include #include // for network adapter #include // for network adapter #include #include #include #pragma comment(lib, "ws2_32.lib") // ignored when using MinGW -> add -lws2_32 when compile #pragma comment(lib, "iphlpapi.lib") // ignored w.. 2020. 5. 26.
[nCloud] 간단한 어플리케이션 서버 띄우기 목표 1. nCloud 에 서버 인스턴스를 만들고 2. node.js 를 설치하여 간단하게 express 서버를 띄워 3. 브라우저를 통해 요청을 보내고 결과를 반환받는 것 을 해보겠습니다. *이 자료는 제가 만든 동아리 백엔드 세션 교육자료를 십분 활용하여 구성하였습니다 1. nCloud 가입하기 클라우드 자원을 이용하기 위해선 우선 계정이 있어야 합니다. 여기 로 들어가서 회원가입을 해주고, 카드 정보를 입력해주세요. 처음 가입하시면, micro 서버 하나를 무료로 1년간 사용하실 수 있고, 3개월동안 크레딧 10만원을 사용하실 수 있습니다. 일정 기간 이후엔 과금이 될 수 있으니 꼭 정해진 기간 이후에 확인을 해주세요. 2. 서버 인스턴스 생성하기. 여기 로 들어가시면 다음과 같은 화면이 나타납니다.. 2020. 5. 26.
[Network Basic] 1. Networks and Protocols OSI 개념과 프로토콜 기초개념은 생략하였다. loopback address - 127.0.0.1 -> connection to myself. OS 내부적으로 이 주소를 로컬에서만 접근되도록 보호한다. Reserved Private ranges 아래 나와있는 IPv4 address 영역은 Private network 로 사용하게끔 reserved 된 영역이다. 10.0.0.0 to 10.255.255.255 -> 10.0.0.0/8 172.16.0.0 to 172.31.255.255 -> 172.16.0.0/12 192.168.0.0 to 192.168.255.255 -> 192.168.0.0/16 IPv6 IPv6는 128bit (32byte) 이고, 각 byte는 hexadecimal characte.. 2020. 5. 26.
[1] Java Basic 이 글은 Java의 기초적인 원리를 간단하게 정리한 글입니다. hyperskill 의 글을 주로 참고하여 작성하였습니다. 함수형 프로그래밍 등의 개별 토픽에 대해서는 따로 작성할 계획입니다. Type Casting - Implicit casting Implicit casting은 Explicit하게 type casitng을 명시하지 않아도 자동으로 type casting이 되는 경우를 의미한다. 저런 관계는, 각각의 data-type이 표현하는 값의 범위에 의해 지정되는데, 넓은 범위를 표현하는 타입으로 변환될 때 Implicit 하게 casting 할 수 있다. int num = 100; long bigNum = num; // 100L short shortNum = 100; int num = short.. 2020. 5. 19.
React Native - 6. Shadow, Input handling, Alert ... Shadow shadow와 관련된 property는 5가지가 있다. - shadowColor : Shadow의 색깔 - shadowOffset : Shadow의 크기 - shadowRadius : Shadow가 blur되는 범위를 지정 - shadowOpacity : Shadow의 opacity - elevation : Shadow property는 원래 IOS 에만 적용되는 Property. elevation을 통해 shadow를 적용할 수 있다. 다만 IOS 처럼 불균등한 Shadow는 불가능하다. 하려면 react-native-shadow 컴포넌트를 이용하자. Input Handling input을 입력하게 되는 경우, Keyboard api가 자동으로 등장한다. 근데 이제 입력을 종료하려고 Inp.. 2020. 5. 15.
React Native - 5. 기초 개념 및 Styling Components React가 그렇듯, React Native도 앱에서 보여지는 구성요소들을 컴포넌트 단위로 분리하여 구성한다. 대신, React Native에 built-in으로 존재하는 Component를 이용하여 구성한다. Styling 웹이 아니기 때문에 css라는게 존재하지는 않는다. 다만, 문법은 css의 문법을 차용한다. CSS syntax를 기반으로, 몇몇 제한된 기능을 사용할 수 있다. RN에서 Styled-Component를 사용할 수 있다고 하니, 아마 이걸 쓰게 되지 않을까 싶다. Core Component 앱을 구성할 때, View를 통해 화면 영역을 지정하고, 그 안의 요소들을 넣게 된다. View 안에 여러 View들이 중첩되어 있을 수 있다. 웹으로 치면 div 같은 것. .. 2020. 5. 12.
React Native - 4. Android Studio 로 초기 앱 띄워보기 Android Studio 초기 설정 맨 처음 안드로이드 스튜디오를 설치하고 이 화면이 나온다. 오른쪽 하단의 Configure > SDK Manager를 클릭한다. 저기서 Android 9.+와 Android 9.0 버전의 SDK를 체크한 후 Apply를 누르면 다운로드가 진행된다. SDK Tools 에서도 다음 항목들을 클릭하고 설치해준다. 설치가 완료되면 Configure > AVD Manager를 눌러준 후 Create Virtual Device 버튼을 눌러준다. 플레이 스토어가 설치되어있는 디바이스를 선택한다. (편의를 위해) 선택 후 Finish를 누르면 다음과 같이 Virtual Device가 만들어져 있을 것이다. 시작 버튼을 누르면 다음과 같이 에뮬레이터가 시작된다. 앱 띄우기 에뮬레이터.. 2020. 5. 11.
React Native - 3. expo vs RN Cli & about RN React Native를 처음 시작할 때, 두가지 방식이 있다. 1. Expo CLI / Tool 을 이용하여 시작하기 2. React Native CLI 를 이용하여 시작하기 둘에는 다음과 같은 차이가 있다. Expo는 React Native의 무료로 사용할 수 있는 써드 파티 라이브러리로, 여러 Utility 덕분에 Native 기능을 손 쉽게 사용할 수 있는 반면 Expo에서 제공하는 Ecosystem에 제한되게 된다. 반면 RN에서 직접 제공하는 CLI는 Native 기능을 사용하기 위해 설정을 따로(많이) 해야하지만 자연스럽게 자유도는 높아진다. 물론 Expo로 시작하고, eject 명령어를 통해 RN Cli로 갈아탈 수 있다. Expo를 이용하여 앱을 개발할 때 , Expo Client 앱에서.. 2020. 5. 11.
React Native - 2. HOW React Native Works 실제로 React Native가 어떻게 동작할까? - RN으로 작성된 코드는 컴파일되어 IOS, Android에 equivalent 한 코드로 변환된다. - 각 컴포넌트는 그에 해당하는 Native code와 매칭된 구조 - 컴파일을 통해 RN 코드를 각 Native code로 변환시켜준다. - UI는 Compatible한 Component로 Compile된다 - Logic은 RN app에서 호스팅하는 JavaScript Thread에서 처리한다. - Equivalent UI Native Component가 있는 경우엔 컴파일 된다 - 일반 비즈니스 로직은 그대로 보존되고, App 내의 JS VM에서 동작한다. - JS VM 과 Native Platform을 Native API를 연결하는 Bridge가 .. 2020. 5. 11.
React Native - 1. 초반 설정 및 핵심 컴포넌트 초반 설정 1. npm install -g expo-cli 를 통해 global에서 expo cli를 설치한다. 2. expo init --npm 을 이용해 프로젝트를 초기화한다 (--npm 안하면 yarn으로 패키지관리) 3. android studio에서 AVD (androdi virtual device) 를 생성하고 실행한다. - configure > AVD Manager > Create Virtual Device > System image는 Pie 선택 후 생성 4. npm run android를 통해 안드로이드 앱에서 RN을 실행시킨다. - 이 때 웹에서 화면이 자동으로 띄워지고, AVD에 앱이 설치되지 않은 경우 앱이 설치되고 실행된다. View 안드로이드와 ios에서 View는 스크린의 작은.. 2020. 4. 24.
[BOJ] 2094 수학은 너무 쉬워 전혀 쉽지 않은 문제였다. 각 값을 소인수분해 한 결과를 vector에 저장하고, 해당 소인수분해 결과를 종합해서 입력된 값들이 가질 수 있는 최대공약수를 구하고, 각각의 값들이 해당 최대공약수를 만족하기 위해 필요한 값의 갯수를 찾아서 합치면 된다. 어찌보면 그냥 수학 문제인데, 생각보다 많이 어려웠다. #include #include #include #include #include using namespace std; int numbers[101], N, sieve[1001]; vector datas[101]; map sum; pair dummy; void print_vector(){ for(int i = 0 ; i < N; i++){ vector target = datas[i]; printf("%d.. 2020. 4. 24.
[BOJ] 11000 강의실 배정 입력된 일정들을 겹치지 않게 구성하기 위해 필요한 강의실의 최솟값을 구하는 문제이다. 처음엔 queue로 풀고, 구성하지 못한 경우 뒤로 넘기는 방식을 선택했는데 이렇게 하니 worst case에서 시간복잡도가 O(n^2)가 되어 버린다. 생성된 방들의 일정 중 가장 나중에 끝나는 일정의 시간만 저장하고, 그것들을 비교하면 되는데, 방의 갯수가 늘어나게 될 때 모든 방을 불필요하게 비교하지 않아도 Priority queue로 구성하게 되면, 가장 일찍 끝나는 방의 경우만 살피면 되기 때문에 시간 복잡도를 n에서 logn으로 줄일 수 있게 된다. 고로 priority-queue엔 가장 늦게 끝나는 스케줄의 끝나는 시간만 넣어놓으면 된다. #include #include #include #include #i.. 2020. 4. 17.
리눅스 개념 및 명령어 3 - Managing Software 1. Linux kernel - 리눅스 OS의 메인 컴포넌트이며, 하드웨어와 프로세스 간 Interface로서의 역할을 한다. - OS 내부에 존재하며 하드웨어의 주요 기능들을 제어함. 2. Linux kernel의 역할 - Memory Management: 메모리가 얼마나 사용되었는지 추적한다. - Process Management: 어떤 프로세스가 얼마 기간동안 CPU를 사용하는지에 대해 결정 - Device drivers: 하드웨어와 프로세스 간 조정 및 통역을 해줌 - System calls and security: 프로세스로부터 요청을 받아 특정 역할을 수행한다. 3. ps [options] : 현재 실행중인 Process의 목록을 보여준다. 보면, tony의 ps -af는 PPID가 106번째.. 2020. 4. 17.
리눅스 개념 및 명령어 2 - Linux CL tool 1. cat a b > c (concatenate) - a와 b를 concatenate 하여 c 파일을 생성한다. cat는 만약 하나의 파일만 썼을 때는 cli에 출력해주는 기능을 한다. 2. join a b - 맨 앞의 Field가 같고 정렬 가능한 값일 때 사용한다. - 맨 앞의 중첩된 field는 그대로 두고, 나머지 값을 merge한다. - 주로 csv 파일에 사용될 것 (index가 앞에 붙는 경우) 3. paste a b - 같은 줄의 값을 연이어 붙인다. 4. grep [options] regexp [files] - 특정 regexp에 부합하는 영역을 포함하는 Line을 모두 반환한다. Match 되는 부분은 색칠되어 반환. 2020. 4. 17.
리눅스 개념 및 명령어 1 - Linux CL tool 1. type type은 command가 정확히 어떤 프로그램이 실행되는건지 알려준다. 대신, built-in command인 경우엔 built-in 이라고 안내한다. -a 태그를 붙이면 이름이 같은 모든 커맨드가 등장한다. built-in의 경우 bash에서 따로 구현한 구현체가 있을 수도 있는데, 서로 다른 것이다. 2. Stream 리눅스는 모든 프로그램에 대한 Input, output을 Stream이라고 칭한다. 이러한 Stream을 Linux 명령어로 제어할 수 있다. 이를 제어하는데 주로 Redirect와 Pipe가 사용된다. 3. Redirect > 프로그램의 출력을 포함하는 파일을 생성한다. 만약 기존 파일이 있다면 덮어씌여진다. 덮어쓰는 것이 아니라 추가하고싶으면 >> 를 사용하자. st.. 2020. 4. 16.
[BOJ] 7579 앱 DP 문제인데, 정말 진땀 뺀 문제이다. 단순히 메모리의 크기를 index로 잡기엔 값이 너무 커서, cost를 인덱스로 잡아서 풀었다. 배열에 저장되는 값은 해당 cost로 얻을 수 있는 최대 Memory 이득이다. 포인트는 이부분이다. 순방향이 아니라 역방향으로 진행해야 메모리가 중복해서 사용되는 것을 방지할 수 있다. #include #include #include #include using namespace std; int N, M, temp; int c[101]; int m[101]; int dp[10001]; int main(){ scanf("%d %d", &N, &M); for(int i = 0 ; i < N ; i++){ scanf("%d", &m[i]); } for(int i = 0 ; .. 2020. 4. 16.
[BOJ] 11562 백양로 브레이크 이 문제는, 주어진 두 지점에 대해서 '최소 몇번 역방향 다리를 새로 놓아야 접근할 수 있는지' 에 대해 묻는 문제이다. 뒤집어서 생각하는 것이 관건이다. 길이 없는 경우 거리를 무한대, 양방향 길이 있는 경우 거리를 0, 단방향만 있는 경우는 길이 없는 방향에 대해 1 값을 부여한다. 그 후, Floyd-Warshall 알고리즘을 적용하면, 모든 Path에 대해 최단거리로 이동하기 위해 설치해야 할 다리의 갯수가 나온다. #include #include using namespace std; const int INF = 1 2020. 4. 14.
[2] Floyd-Warshall 알고리즘 플로이드 워셜 알고리즘은 그래프에서 "All-pair-shortest-path" - 정점들의 모든 쌍의 최단 경로의 길이를 구하는 알고리즘이다. 그래프 알고리즘 중 가장 단순한 알고리즘이라고 생각된다. Brute-Force랑 거의 같다고 볼 수 있기 때문이다. 알고리즘도 단순하다. pseudo-code를 보자. 다음과 같이 Floyd-Warshall은 for문 3개로 돌아간다. 의미를 해석하자면 i에서 j로 가는 길의 거리를 생각했을 때, i에서 j로 바로 가는게 빠른지 -> (d_ij) 아니면 k를 경유하여 가는게 빠른지를 비교해서 (d_ik + d_kj) 더 작은 길의 값이 지정이 되는 것이다. (min) 저장되는 그래프 D의 dij는 곧 i에서 j로 가는 최단 거리가 지정이 될 것이다. 2020. 4. 12.
[BOJ] 2473 세 용액 3-SUM 알고리즘을 이용하여 문제를 풀 되, 정확한 조합이 아닌 가장 가까운 답을 찾는 것이 목표이다. 고로 합산한 결과 값 중 현재 최소인 조합의 결과를 저장해야 한다. #include #include #include #include using namespace std; int a, b, c; long long N, temp, best = LLONG_MAX; vector val; int main(){ cin >> N; for (int i = 0 ; i > temp; val.push_back(temp); } sort(val.begin(), val.end()); for(int first = 0 ; first < val.size() - 2; first++){ int secon.. 2020. 4. 11.
[1] 3-SUM algorithm 3-Sum algorithm은, 세 숫자의 합이 특정 조건을 만족하는 모든 경우의 수를 탐색하는 알고리즘이다. 2-Sum 알고리즘도 있다. 애는 Linear Time에 해결할 수 있고, 이는 Hash-table을 이용하여 문제를 해결한다. 2-Sum algorithm을 nlogn의 시간복잡도로 해결하는 방법으로 sliding-window 방식이 있는데, 3-Sum algorithm은 이 방식을 한번 더 감싼 것에 불과하다. 예시 문제를 보면서 이해해보자. 주어진 문제에선 용액의 특성값을 나타내는 N개의 정수가 순서대로 제공된다. 그 때, 세 특성값의 합이 0에 가장 가까운 조합을 찾는것이 목적이다. 그냥 단순히 Brute-force로 문제를 해결하게 되면, for문을 3개 돌려서 모든 조합에 대해서 정답.. 2020. 4. 11.
Central Authentication Service (CAS) 정리 및 관건 SSO 를 지원하기 위한 방법은 여러가지가 있다. (CAS, SAML, Oauth) 이중에서 가장 간단한 구현 방법인 CAS를 다루어 보자. 정리 Central Authentication Service를 줄여서 CAS 라고 부르는데, 이 중앙 인증 서비스가 각 Application service의 사용자 인증을 함께 다룬다는 것이다. Flow는 다음과 같다. - 사용자는 Application Server에 Request를 보낸다. (이때는 Ticket이 없음) - Application Server는 사용자에게 Service ID 를 제공함과 동시에 사용자를 CAS Server로 리다이렉트 시킨다. - CAS Server는 회원의 요청에 포함된 Service ID를 이용하여 해당 Application se.. 2020. 1. 9.
AWS iam policy IAM의 policy에 관해서는 이 블로그에 정말 정리가 잘 되어 있다. 꼭 읽어보도록 하자. 이 블로그엔 내가 찾던 AWS에 대한 모든 정보들이 담겨 있는 것 같다. 정말 감사하다ㅠㅠ 대부분의 정보는 위의 블로그에 담겨 있고, 조금 더 설명해야 할 부분들을 추가하였다. Policy 결국 Policy 라는게, 어떤 정책을 의미하는건데, 가지고 있는 자원에 대한 접근 권한을 지정해 주는 것을 의미한다. 일반적으로 루트 사용자는 모든 권한을 가지고 있는데, 이 사용자의 API Key를 생성한 후 이게 유출 된다면 정말로 큰일날 지도 모른다. 모든 자원에 대한 접근 권한이 있으니, 무분별한 사용자가 인스턴스를 마구 만들어버리면 전 재산이 털리게 될 수도 있다. 그렇기 때문에, 해당 루트 사용자가 관리하는 IA.. 2020. 1. 9.
AWS CLI에 익숙해지기 (2) iam 계정 및 그룹, 정책 적용 IAM 계정 생성 해당 루트 계정에 IAM 계정을 생성할 수 있다. aws iam create-user --user-name IAM 계정 조회 해당 루트 계정 내의 IAM 계정을 조회할 수 있다. aws iam list-users IAM 그룹 생성 해당 aws iam create-group --group-name IAM 그룹 조회 해당 루트 계정 내의 IAM 그룹을 조회할 수 있다. aws iam list-groups IAM 그룹에 사용자 추가하기 해당 그룹에 사용자를 추가한다. aws add-user-to-group --group-name --user-name IAM 그룹 및 그룹 내 사용자를 조회하기 IAM 그룹과 그룹에 해당하는 모든 사용자의 정보를 조회한다. aws iam get-group --g.. 2020. 1. 8.