[Node.js] Python으로부터 넘어오다
·
Study/Javascript
내가 discord.py의 기능을 온전히 활용하지 못한 탓도 있겠지만, discord.js는 보다 작성하기 용이하고 유지관리도 쉬울 것이라는 생각이 들었다. 해 보니까 진작 이거로 했어야지 싶다. 물론 예전엔 js가 머리에 접수가 안 돼서 도망친 것이지만... 일단 discord.js에서 제공하는 스타팅 가이드와 문서로 돌아가는 방식을 파악했다. 문서가 최신화가 잘 되는 듯 해 만족스럽다. 그리고 dicord.js로 개발한, 어느정도 틀이 잡혀있는 템플릿 봇을 구했다. discord.py는 정말 핑퐁 하나만 달랑 있는 봇에서 기능을 다 올린 것이기도 하고, 계획이 없었기 때문에 중구난방이었다. 마치 언리얼 엔진과 유니티 엔진의 차이와 유사하게 느껴진다. 여하튼 템플릿 봇의 코드를 뜯어보며 테스트 용으로 ..
봇 배포에 Github Action 적용
·
Study/Others
사실 지금 굴리는 봇은 크기도 크지 않고 구현 요구 사항에 따라 이리저리 서버를 옮겨다니기도 했다. 테스트용 Repo와 내가 실제로 배포하기 위해 사용하는 비공개 Repo 그리고 공개용 Repo가 계정을 넘나들며 있었기 때문에 역시 갈수록 번거로워짐이 커지기도 했다. 따라서 공개 Repo로 배포까지 할 수 있게 하고 그 Repo에서 테스트용 브랜치를 만들어 한방에 관리하기로 했다. 진작 했어야 했는데 늦어진 것은 사실이다. 주요 변경점은 아래와 같다. Repo들의 통합 공개용, 배포용, 테스트용을 하나의 Repo로 통합 Github Action 적용 공개용 main 브랜치에 push 이벤트가 있다면 인스턴스에서의 배포까지 자동 수행 서버 변경 Cloudtype이 본격적으로 유료화를 시작했기 때문에 즉시 ..
히구치 아이 / いってらっしゃい / 가사 및 해석
·
Study/Japanese
스포티파이에서 아무거나 틀어놨는데 이 노래가 딱 들렸다. 초반의 묘하게 중성적인 목소리, 끌리는 멜로디. 나만 알고 있기 참 아깝다는 생각이 들었다. 문학 작품을 번역해 보면 좋은 공부가 될 것도 같았다. 일러두기 1. 타인의 한국어 번역을 일절 참고하지 않음 - 답지를 봐버리면 공부가 안된다. 2. 공식 일본어 가사와 영어 가사만을 참고 - 영어 번역에 아티스트가 직접 참여했기 때문에 원 의미에 가까울 것임. 3. 나의 느낌대로 번역함 - 아티스트의 생각과 다를 수 있음. 4. 멜로디를 맞춰보려고 해 봄 - 의미를 해치지 않고 멜로디 맞추기라니 진짜 어렵다... 1. 가사 및 해석 ずっと探してた 捧げた心臓の在処 ∵ 계속 찾고 있었어 내가 바친 심장이 있는 곳 本当の想いを教えて 너의 진짜 생각을 알려 줘..
[Python] Pyppeteer를 버리다
·
Study/Python
여하튼 오래 걸리는 작업이다. Selenium보다 Pyppeteer가 빨랐지만, 결국 브라우저가 페이지의 많은 부분을 렌더링 해야만 하는 무거운 작업의 연속이었기에 해결책이 필요했다. 물론 Yahoo! Finance가 짧은 주기로 주가를 실시간 갱신해 주고, 다른 사이트는 이 정도로 신속하게 갱신해 주지 않기에 최대한 이를 활용하면서 속도를 올리고 싶었다. 하지만 너무 느린 속도를 감당할 수 없어서 갱신 주기를 포기하고 좀 더 가벼운 사이트를 찾기로 했다. 쓸만한 사이트를 찾은 것 같다 Stock Analysis라는 사이트를 발견했다. 처리 속도가 빠른 데스크탑에서 비교해도 명백히 이쪽이 빠르다. 아후는 무거운 렌더링 과정 없이 데이터를 가져올 수 없었지만 여기는 lxml을 통해 빠르게 가져올 수 있었다..
[Python] 스크래핑 과정 최적화를 위한 시도
·
Study/Python
동적 웹을 스크래핑하는 과정은 필수적으로 JS 렌더링이 필요하기 때문에 그 부하가 크고 시간이 오래 걸린다. 이전에 Selenium을 썼지만 이 녀석, 너무 느리다. 내 아마존 프리티어 VM이 감당하기엔 너무 큰 짐이 아니었나 싶기도 하다. 그래서 아래와 같은 방법들을 모색해 봤다. 1. 클라우드 변경 조금 더 속도가 빠른 클라우드를 찾기 위해 구글링을 거듭했다. 약간의 돈이라면 지불할 용의도 있었다. 그러다 문득 뇌리에 스친 Oracle Cloud. 1개의 OCPU를 제공한다는 뜻은 2개의 스레드를 돌릴 수 있다는 뜻이다. 일정 사용량을 초과하지만 않으면 평생 무료이기도 하니 이것으로 낙점. 한 달짜리 무료 크레딧도 받은 김에 12 코어짜리 VM도 설정했다. 내 봇엔 너무 과한 스펙이지만 어차피 사라질..
[Python] Aim Smoothing
·
Study/Python
Aim Smoothing이란 말 그대로 FPS게임 등의 에임봇이나 컨트롤러 유저를 위한 Aim Assist에 사용되는 개념이다. 조준을 수행할 때, 적에 자석처럼 붙는 것이 아니라 자연스럽게 적에게 에임을 이동시키게 해 주는 기술이라 할 수 있다. 에임 어시스트에 관한 영상으로 아래의 영상을 참고할 수 있다. https://www.youtube.com/watch?v=-RQbAO9jx_I 방법은? 적이 있는 좌표와 내 에임 사이의 좌표 간의 이동을 보간해 구현할 수 있다. 일단 각각의 차이를 보자. 보간X 아주 찰싹 달라붙는다. 빈말로도 자연스럽다고 할 수 없다. 비선형 보간법 움직임이 비교적 자연스럽다. 여전히 어색하지만 가감속도 들어가 있고 그나마 봐줄 만하다. 선형 보간법을 사용하면 저기에 가감속이 ..
[C#] 자동화 플러그인 수정
·
Study/C++ & C#
근래에 FFXIV 무인도 컨텐츠의 자동화를 도와주는 플러그인을 발견했기에 당장 써보기로 결정했다. 재미있지도 않은 미친 노가다를 안 할 수 있다니 혹하지 않을 수 있을까. 채집 노드를 알아서 따라가며 지정한 루트는 잘 돌아주지만 다른 문제가 있었으니... 1. 클라이언트 언어의 차이 무인도엔 "워크샵"이라는 컨텐츠가 있고, 각 사이클마다 상품 생산을 예약하고 생산 및 판매해 고유 화폐를 얻는 식으로 구성되어 있다. 최고 효율을 얻는 상품 생산 구성을 매 사이클마다 제공해 주는 디스코드가 있는데, 아이템 이름을 영어로만 제공한다. 저 포맷을 그대로 복사해 플러그인에 붙여 넣기 하면, 플러그인이 알아서 아이템 이름만 뽑아내 게임 데이터와 일치하는지 확인한 후 생산 예약에 등록하는 식으로 작동한다. # 위는 ..
[Python] 봇 개선 및 커맨드 추가
·
Study/Python
새로운 기능으로 주식 정보를 가져오는 명령어를 만드려고 했다가 아주 큰일이 됐다. 굳이 손대고 싶지 않았던 귀찮은 부분들에 손을 대기로 했다. 1. 메인 봇 코드 다이어트 기존엔 명령어를 별도로 빼는 것이 아니라, 아래처럼 그 명령어 함수 안에 구동부를 다 때려 넣은 형식이었다. #region sync @client.tree.command(name='sync', description='Owner only') async def sync(interaction: discord.Interaction): if interaction.user.id == OWNER_ID: await interaction.response.defer(ephemeral=True) await client.tree.sync() await in..
[C++ / Python / DB] ProcedureGenerator
·
Study/C++ & C#
이전에 Protobuf를 사용한 패킷 핸들러를 자동화할 때와 동일하게, Python과 Jinja2를 활용할 것이다. 1. XML 파서 작성 서버 소스가 아니라 Python에서 사용할 XML 파서를 작성해야 한다. import xml.etree.ElementTree as ET class XmlDBParser: def __init__(self): self.tables = {} self.procedures = [] def parse_xml(self, path): tree = ET.parse(path) root = tree.getroot() for child in root: if child.tag == 'Table': self.tables[child.attrib['name']] = Table(child) for..
[C++ / DB] ORM
·
Study/C++ & C#
자체적인 ORM을 작성해 보기로 했었다. 이제 필요한 것은 실행 시 XML 파일과 실제 DB를 비교하고 동기화하는 것이다. 1. 클래스 작성 양이 많아서 일부만 옮긴다. A. ConsoleLog 먼저 콘솔에 로그를 더 효율적으로 찍기 위한 클래스를 작성한다. // ConsoleLog.h #pragma once enum class Color { BLACK, WHITE, RED, GREEN, BLUE, YELLOW, }; class ConsoleLog { enum { BUFFER_SIZE = 4096 }; public: ConsoleLog(); ~ConsoleLog(); public: voidWriteStdOut(Color color, const WCHAR* str, ...); voidWriteStdErr(..