본문 바로가기

전체 글51

PYTHON - JSON으로 집계 저장하기 지난 글에서 룰렛 결과 여섯 건을 세었다. 꽝 3회, 노래 2회, 댄스 1회. 그런데 딕셔너리는 프로그램이 실행 중일 때만 남아 있다. 다시 실행하면 counts = {}부터 시작한다.이번에는 시작할 때 파일을 읽고, 새 결과를 더한 다음 다시 저장하도록 바꿨다. 저장 형식은 내용을 직접 열어보기 쉬운 JSON으로 골랐다.딕셔너리를 JSON 파일에 쓰기import jsoncounts = {"꽝": 3, "노래": 2, "댄스": 1}with open("counts.json", "w", encoding="utf-8") as file: json.dump(counts, file, ensure_ascii=False, indent=2)dump()는 파이썬 값을 파일에 쓴다. ensure_ascii=False.. 2026. 10. 16.
HTML - 값을 고쳐도 제출이 막히는 이유 지난 글에서는 name이 없으면 입력한 값이 전송 목록에서 빠지는 문제를 다뤘다. 이번에는 값이 있어도 정해둔 규칙에 맞지 않을 때 제출을 막고, 이유를 보여주려고 한다.닉네임 입력창 하나로 시작했다. 규칙은 영문, 숫자, 밑줄로 3~12자. HTML에 조건을 적고 자바스크립트로 오류 문구를 바꿨는데, 여기에는 값을 고친 뒤 오류 상태도 풀어줘야 한다는 한 가지가 더 있었다.입력 규칙은 HTML에 적기닉네임required는 빈 값을 막는다. pattern은 값 전체가 정해둔 형태와 맞는지 검사한다. [A-Za-z0-9_]는 영문과 숫자, 밑줄이고 {3,12}는 길이 범위다. pattern만 있으면 빈 값은 허용하므로 둘을 같이 넣었다. MDN pattern 설명일반적인 제출 버튼을 누르면 브라우저가 이 .. 2026. 10. 16.
JAVA - 집계 결과를 많은 순서로 정렬하기 지난 글에서는 Map으로 언어별 표를 셌다. 개수는 구했으니 이번에는 많이 나온 항목부터 보여주는 순위를 만들어보려고 한다. 같은 표를 받은 항목은 이름순으로 놓는다.예제 투표는 JAVA 3표, HTML과 PYTHON이 각각 2표, CSS가 1표다. 원하는 순서는 JAVA → HTML → PYTHON → CSS다.Map에서 출력할 목록 꺼내기HashMap의 순회 순서는 순위가 아니다. 지금 화면에서 우연히 원하는 순서로 보이더라도 정렬 기준으로 삼을 수 없다. 집계는 Map에 두고, 출력할 항목을 List로 꺼낸다.List> ranking = new ArrayList(counts.entrySet());entrySet()으로 꺼내는 Entry 하나에는 이름과 횟수가 함께 들어 있다. 이름은 getKe.. 2026. 10. 16.
뚜봇 룰렛 개발일지 2 — 0회 항목 보여주기 지난 글에서는 결과 이벤트를 받아 선택한 항목의 횟수를 올리는 데까지 연결했다. 연결과 집계를 붙이던 6월 1일에는 관리 화면도 함께 고쳤다. 집계가 돌아가는 것과, 화면만 보고 제대로 설정됐다고 알 수 있는 것은 별개였다.이번에는 필터 저장 버튼과 0회 항목 표시를 정리한 기록이다. 처음 만든 화면에서는 저장을 눌러도 끝났는지 알기 어려웠고, 선택했지만 아직 한 번도 나오지 않은 항목은 카운터에 나타나지 않았다.저장 버튼에 결과를 보여주기처음 저장 코드는 선택 목록을 서버에 보내고 관리 상태를 다시 읽는 정도였다. 여기에 저장 중, 완료, 실패를 표시하도록 바꿨다. 아무것도 고르지 않았을 때도 바로 안내한다.항목을 하나도 고르지 않음 → 필터를 하나 이상 선택해주세요저장 요청 중 .. 2026. 10. 16.
치지직 녹화 개발일지 2 — 끊긴 뒤 다시 녹화하기 첫 번째 개발일지에서는 채널을 등록하고 자동 감시를 시작하는 부분까지 붙였다. 녹화가 끝난 뒤 MP4로 바꾸고, 변환에 실패하면 TS 원본을 남기는 흐름도 만들었다.이제 녹화 프로세스가 중간에 끝나는 경우를 처리해야 했다. 프로세스가 종료됐다고 방송까지 끝난 것은 아니다. 연결만 끊겼는데 녹화를 끝내버리면 뒤의 방송을 놓치고, 방송이 종료됐는데 무조건 재시도하면 불필요한 연결을 반복한다. 이번 기록은 초기 1.4.0에서 이 둘을 나눈 과정이다.종료 코드 뒤에 방송 상태를 한 번 더 확인하기녹화가 끝나면 우선 그때까지 받은 파일을 정리한다. 크기가 0보다 큰 TS는 MP4 변환을 시도하고, 해당 구간의 종료 시각과 파일 크기를 이력에 기록한다. 그다음 방송 상태를 다시 확인하도록 했다.녹화 프로세스 종료 .. 2026. 10. 16.
PYTHON - 리스트와 딕셔너리로 개수 세기 Python 공부 글은 작은 집계 프로그램부터 시작해보려고 한다. 룰렛 결과가 꽝, 노래, 꽝, 댄스, 노래, 꽝 순서로 들어왔다고 가정하고, 항목별 횟수를 구하는 예제다. 실제 방송 데이터 대신 여섯 개의 문자열만 넣었다.필요한 것은 두 가지다. 들어온 결과를 차례로 보관할 리스트, 그리고 이름별 횟수를 저장할 딕셔너리다.결과는 리스트에 담기results = ["꽝", "노래", "꽝", "댄스", "노래", "꽝"]print(results[0])print(len(results))실행 결과:꽝6대괄호 []로 만든 리스트에 결과 여섯 건을 넣었다. 첫 번째 위치는 0이므로 results[0]은 "꽝"이다. 같은 문자열이 여러 번 나와도 그대로 보관한다. 지금은 그 중복이 집계할 원본 데이터다.이름별 횟수.. 2026. 10. 13.
HTML - 입력했는데 form 값이 빠지는 이유 예전에 form 요소를 정리하면서 id와 name의 역할을 적어뒀다. 그런데 처음 올렸던 로그인 예제에는 id만 있고 name이 빠져 있었다. 그 예제는 고쳤지만, 입력창이 멀쩡하게 보여도 값은 전송되지 않을 수 있다는 점을 따로 남겨두려 한다.이번에는 작은 폼을 만들어서 제출했을 때 어떤 값이 남는지 확인해봤다. 로그인 정보 대신 DGDD라는 예제 닉네임을 사용했다.id만 붙이면 어떻게 될까 닉네임 제출label을 누르면 입력창에 포커스도 간다. 입력도 되고 버튼도 눌린다. 하지만 제출 후 주소에는 nickname=DGDD가 붙지 않는다.id는 문서 안에서 요소를 식별하는 이름이다. label의 for와 연결하거나 CSS·JavaScript에서 요소를 찾을 때 사용한다. 폼 데이터를 만들 때 사.. 2026. 10. 13.
JAVA - Map으로 같은 값 개수 세기 List와 Set까지 정리했으니, 이번에는 이름에 값을 붙여 저장하는 Map을 써보려고 한다. 예제는 투표 집계다. JAVA, PYTHON, JAVA, HTML, PYTHON, JAVA라는 선택 결과에서 언어별로 몇 표를 받았는지 구해보자.List에 담으면 투표 여섯 건을 그대로 보관할 수 있다. Set에 담으면 어떤 언어가 나왔는지는 알 수 있지만, 같은 언어가 몇 번 나왔는지는 남지 않는다. 필요한 결과는 JAVA → 3처럼 언어와 횟수의 짝이다.이름으로 값을 찾는 MapMap은 키(key)로 값(value)을 찾는다. 이 예제에서는 언어 이름이 키이고, 투표 수가 값이다.Map counts = new HashMap();String은 키의 자료형, Integer는 값의 자료형이다. 제네릭의 타입 자리.. 2026. 10. 13.