전체 글
-
점심 메뉴 추천 프로그램Side Project 2023. 4. 9. 15:43
회사에서 점심 메뉴를 정하는 것도 일이다. 나를 포함한 막내 포지션 3인이 요일을 정해서 메뉴를 정하기로 했으나... 실행이 잘 안 되었고 "스트레스 받을 바에는 프로그램을 만들자!" 해서 점심 메뉴 추천 프로그램을 만들게 되었다. 웹은 추후에 만들도록 하고 일단은 소스코드와 DB만 만들었다. 데이터는 RDB로 관리한다. MySQL을 사용했으며 추후 다른 팀에서도 프로그램을 사용할 것을 고려한 유저 테이블(lnch_user), 음식 종류별 음식점 이름 및 음식점 거리를 관리하는 메뉴 테이블(lnch_menu), 먹은 메뉴를 날짜별로 관리하는 기록 테이블(lnch_record)로 구성했다.-- 유저 테이블CREATE TABLE lnch_user ( SEQ_NO int not null auto_in..
-
I/O multiplexing이 가능한 채팅 프로그램Side Project 2023. 3. 26. 23:43
채팅 프로그램은 입사하고 처음 과제로 받았던 파일럿 프로젝트인데 이번 기회에 OOP로 리팩토링을 하면서 다시 들여다본다. 당시에 국비로 머신러닝, 데이터 분석을 6개월 배우고 입사했기 때문에 개발에 대한 경험은 데이터 파이프라인을 구축해 본 경험이 전부였다. 이 분야에서 뭘 잘하는지도 모르겠고 일단 부딪히면서 생각해보자라는 주의로 입사했는데 지금 생각해보면 어디서 그런 밑도끝도 없는 용기가 나왔는지 신기하다. 결론은 실무를 하며 배우는 부분이 참 많고 여러가지 경험을 하고 있기 때문에 잘 한 선택이라고 생각한다. 각설하고 본론으로 들어가면 이 포스팅은 다중 client가 하나의 서버에서 대화를 주고받을 수 있는 채팅 프로그램에 대한 글이다. 채팅 서버는 client들의 요청을 비동기적으로 수행한다. 서..
-
회문 판별과 N-gram 만들기Python/Grammar 2023. 3. 25. 20:55
# 1. 회문 판별하기 회문(palindrome)이란? 거꾸로 읽어도 제대로 읽은 것과 같은 단어나 문장을 말한다. 예를 들어 SOS, level, nurses run, rotator, 기러기, 토마토 등이 있다. 1-1. 반복문으로 문자 검사하기 0부터 문자열 길이의 절반만큼 반복하면서 왼쪽 문자, 왼쪽 문자와 대칭되는 위치의 오른쪽 문자를 비교해서 문자가 다르면 회문이 아니라고 판단한다.word = intput()is_palindrome = Truefor i in range(len(word) // 2): if word[i] != word[-i -1]: is_palindrome = False breakprint(is_palindrome) 1-2. 시퀀스 뒤집기로 문자 검..
-
[Redis] 백업을 통한 데이터 영속화DataBase/NoSQL 2023. 3. 12. 22:55
Redis는 인메모리 저장 방식으로 리부팅시 데이터가 휘발된다. 따라서 기존 데이터를 영속화하여 복구, 유지시키기 위해서는 디스크에 데이터 백업해주는 과정이 필요하다. 백업 방식에는 1) RDB snapshot, 2) AOF 2가지가 있다. RDB snapshot은 특정 시점을 스냅샷으로 남겨 데이터를 저장하는 방식을 말한다. 여기서 "RDB"는 관계형 데이터베이스가 아니라 Redis DataBase를 의미한다. redis.conf 파일에서 스냅샷 저장에 대한 주기 설정을 할 수 있는데, save 60 10으로 설정하면 60초마다 10개 이상의 데이터 변경이 있을 때 데이터를 저장하겠다는 의미이다. 아래는 redis.conf에 기본으로 설정되어있는 # save 3600 1 300 100 60 1000..
-
15. 제너레이터 사용하기Python/Grammar 2023. 3. 11. 11:00
💡 제너레이터(generator)란? 이터레이터를 생성해주는 함수로 "발생자"라고 부르기도 한다. 함수 안에서 yield 키워드를 사용함으로써 제너레이터로 동작하는 함수를 만들 수 있다. 제너레이터 객체는 __iter__, __next__ 메소드를 가지고 있으며, 제너레이터 객체에서 __next__ 메소드를 호출할 때마다 함수 안의 마지막 yield까지 코드를 실행하며 yield에서 값을 발생(generate)시킨다. 따라서 이름을 제너레이터라고 한다. 정리해보면 이터레이터를 만드는 방법은 다음 네 가지가 있다. 1. iterable.__iter__() 2. __iter__, __next__ 메소드를 구현한 클래스의 객체 생성 3. __getitem__ 메소드를 구현한 클래스의 객체 생성 4. yield..
-
12. elif를 사용하여 여러 방향으로 분기하기Python/Grammar 2023. 3. 10. 22:14
# 1. elif 사용하기 elif는 "else if"라는 뜻으로 if 조건식이 참이 아닌 상태에서 조건식을 지정할 때 사용한다. elif 여러 개를 사용해 다수 개의 조건을 지정할 수 있으며 적용 예시로는 자판기가 있다. if, else와 같이 조건식 끝에 콜론을 붙이고 다음줄은 들여쓰기를 해야 한다. 단독으로는 사용할 수 없어 if-elif 형태로 사용하거나 if-elif-else 형태로 사용한다. else와 함께 사용할 때는 반드시 elif가 else보다 먼저 와야한다. else는 선행된 모든 조건을 만족하지 않는 조건을 가지기 때문이다. 1-1. if, elif, else 모두 사용하기 모든 상황을 처리하기 위해 if-elif / if-else 형태의 두 가지 분기로는 부족할 때 if-elif-e..
-
11. else를 사용하여 두 방향으로 분기하기Python/Grammar 2023. 3. 9. 23:23
# 1. else 사용하기 1-1. if와 else의 기본 형태와 실행 흐름 알아보기 else의 코드는 if 조건식을 만족하지 않을 때 실행한다. 즉, if 조건식이 True이면 if 본문(if의 코드)이 실행되고 False이면 else 본문(else의 코드)이 실행된다. else 조건문은 단독으로 사용할 수 없으며, 조건식 뒤에 콜론을 붙이는 형식과 실행할 코드를 조건식 다음줄에 들여쓰기 후 작성하는 규칙은 if 조건문과 같다. ❗️ False로 취급하는 것들 - None - False - 0인 숫자들 -> 0, 0.0, 0j - 비어있는 문자열 -> '', "" - 비어있는 리스트 -> [] - 비어있는 튜플 -> () - 비어있는 딕셔너리 -> {} - 비어있는 세트 -> set() - 클래스 인스..
-
[Redis] Sentinel을 이용한 자동 장애조치DataBase/NoSQL 2023. 2. 19. 16:30
1. master-replica-sentinel 구성을 위해 아래와 같이 docker-compose.yml 파일을 작성한다. 2. docker-compose yml파일을 build한다. 3. master, replica, sentinel 3대가 떠 있는 것을 확인한다. 4. sentinel1의 컨테이너에서 redis에 진입해서 바라보고 있는 master의 정보를 확인한다. $ info sentinel 다른 prompt에서 master의 ip주소를 확인한다. $ docker inspect redis-master sentinel1에서 조회한 master의 ip가 실제 master ip와 일치하는 것을 확인할 수 있다. 5. master를 stop한다. sentinel1, sentinel2, senti..