프로그래밍/개발 18

[개발] 스타크래프트 인공지능을 개발해보자!

때는 바야흐로 지금으로부터 6년전 내가 대학교 1학년때 이야기이다. 알파고의 등장으로 딥러닝이 급부상한 시기였는데 이 시절에 세종대학교에서 스타크래프트 인공지능 vs 인간 이라는 대회를 개최했었다. 초보, 중급, 프로 세 명의 사람이 스타크래프트 봇과 경기하는 내용이었는데 초보와 중급 플레이어는 학생이었고 프로는 송병구 선수였다. 나도 이 경기를 관람하였고 그 때 스타크래프트 인공지능의 존재를 알게 되었으며 인공지능을 공부하기 시작한 계기가 되었다. 6년이 지난 지금 갑자기 생각나서 옛날의 추억을 회상해보려고 한다. http://www.sejongpr.ac.kr/sejongnewspaperview.do?boardType=4&pkid=8908 준비물 https://github.com/bwapi/bwapi ..

[개발] 메시지 큐

메시지 큐(Message Queue)란 무엇일까? 서로 다른 프로세스간 데이터를 통신하는 방법이다. 그렇다면 데이터를 보내는 프로세스가 있고 받는 프로세스가 있을 것이다. 여기에서 보내는 프로세스를 Producer, 받는 프로세스를 Consumer라고 한다. 일반적으로는 역할이 나눠져 있지만 특수한 경우에는 Producer이면서 Consumer인 케이스도 있을 것이다. 일단 그런 경우는 고려하지 말자. 그냥 설명만 보면 이해가 안되니 직접 코드로 확인해보자. # producer.py print("I'm producer!") idx = 0 for i in range(10): with open(f"./data/{i}", "w") as f: f.write(f"Hi! I'm {i}-th message!") pr..

[개발] 샤딩이란 것을 해보자! (3)

샤딩 1 샤딩 2 조건이 포함된 조회 쿼리 특정 이름이 들어간 유저를 찾고싶다고 하자. # datasource.py class DataSource: ... def select_by_name_exact(self, name): ix = insert_route(name) query = f"SELECT * FROM user WHERE name = '{name}'" cursor = self.cursors[ix] cursor.execute(query) result = cursor.fetchall() return result 삽입과 유사하게 사용하면 된다. 범위 조건이 포함된 조회 쿼리 이제 살짝 복잡해지기 시작한다. aa ~ bb를 찾는다고하면 1번 인스턴스에서 끝나지만 aa ~ zz를 찾는다면 1~4번 인스턴스를..

[개발] 샤딩이란 것을 해보자! (2)

지난시간에 이어 샤딩을 사용해보자. 라우터 생성 우리는 이름을 기준으로 라우팅을 할 것이다. 영어 소문자만 들어온다고 가정하자. 데이터베이스가 4개이니까 a~g로 시작하는건 1번, h~n은 2번, o~u는 3번, v~z는 4번 데이터베이스에 넣도록 하자. # router.py def insert_route(name: str): assert len(name) > 0 ch = name[0] return (ord(ch) - ord('a')) // 7 정말 간단하다. 위 라우터는 삽입할 때 사용하는 라우터이다. 삽입쿼리 추가 # datasource.py from router import insert_route class DataSource: ... def insert(self, name: str, age: in..

[개발] 샤딩이란 것을 해보자! (1)

데이터베이스 샤딩(Sharding)이란 동일한 스키마의 데이터베이스를 여러 인스턴스에 나누어 저장하는 것을 말한다. 이중화와는 다른 개념이다. 이중화는 하나의 데이터를 여러 곳에 저장하지만 샤딩은 하나의 데이터를 하나의 인스턴스에 골라서 저장을 한다. 보통은 잘 사용하지 않고 데이터가 억수로 많은 경우에 사용한다. 샤딩을 사용하면 데이터가 많은 경우에 단일 인스턴스보다 성능이 빨라지고 단일 인스턴스에 저장할 수 없는 만큼의 데이터를 가지고 있다면 샤딩을 사용해야만 할 것이다. 샤딩에는 여러 종류가 있지만 여기에서는 Range Sharding이란 것을 사용해 볼 예정이다. Range Sharding 유저테이블을 샤딩한다고 생각하자. 인스턴스를 4개(개발자가 정하면 된다.) 두고 1~3월 생일은 1번, 4~..

[개발] nginx에서 https 적용하기

지난시간 nginx설정한 도메인으로 들어가보면 http연결이라고 뜨면서 주의요함이라는 메시지를 받는다. https연결을 사용하지 않았기 때문이다. 그리고 mixed content문제라고 해서 프론트 접속할 때 https를 쓰고 백엔드 접속할 때 http를 사용하면 불러오지 못하는 문제가 생긴다. 특히 기본 https를 제공하는 gh-pages랑 http로 설정한 백엔드로 접속하려고 할 때 의문도 모른채 생기는 오류를 접할 수 있다. 그래서 요즘은 모두 https를 사용하는게 좋다. nginx에서 https를 적용하는 법을 알아보자. nginx 파일 # /etc/nginx/sites-available/aaa.riroan.com server { listen 80; server_name aaa.riroan.c..

[개발] Nginx에서 여러 도메인 적용하기

최근 진행하는 프로젝트가 꽤 많아져서 배포를 위해 인스턴스 한대를 혹사시키고 있다. Oracle Cloud에 있는 인스턴스 한 대에 백엔드서버 3개와 프론트엔드 페이지를 2개 배포중이다. 그러다보니 서로 다른 프로젝트의 도메인들이 같은 서버를 가리키고 있다. 현재, aaa.riroan.com, bbb.riroan.com이 하나의 서버 ip를 가리키고 있는 상태이다. 이를 위한 nginx 설정이 필요했다. riroan1.com, riroan2.com같이 도메인이 통채로 다른 경우도 가능하고 aaa.riroan.com, bbb.riroan.com처럼 접두어(prefix)만 다른 경우도 가능하다. (어떻게 생각해보면 당연하다.) 파일 작성 기본적으로 nginx설정을 하기 위해 /etc/nginx/sites-a..

우분투 22.04 업그레이드 오류

노트북 PC를 우분투 20.04에서 우분투 22.04로 업그레이드 하다가 오류가 났다. oh no! something has gone wrong a problem has occurred and the system can't recover. 이런 메시지가 나오면서 화면과 마우스가 먹지 않는 증상이다. 해결법 1. ctrl + alt + f3를 이용해서 CLI모드로 들어가서 로그인을 한다. 2. 다음 명령어를 입력한다. sudo apt-get update sudo apt-get dist-upgrade sudo dpkg --configure -a sudo apt-get clean sudo apt-get autoremove sudo reboot special thanks https://askubuntu.com/..