전체 글 115

wsl 용량 정리하기

1. intro노트북에 뭘 깐게 없는게 계속해서 용량이 줄어들어 이상하다고 생각해 어떤 어플리케이션이 얼마나 용량을 먹고 있는지를 확인해보니ubuntu가 엄청난 용량을 점유하고 있음을 알게 되었다.윈도우에 우분투를 설치하면 그 우분투가 사용하는 용량이 늘어날수록, C드라이브의 가용 용량이 줄어들게 된다.문제는, wsl의 파일을 정리해 용량을 줄인다고 해도, 한 번 늘어난 wsl의 하드 점유량이 줄어들지 않아 윈도우에서 사용할 수 있는 용량은 그대로라는 점이다.이를 해결하려면 우분투 자체를 한 번 지우고 다시 설치하는 방법이 있지만 wsl 내부의 파일이 많을수록 백업과 설정 import에도 시간이 오래 걸리고, 그 떄까지의 config를 제대로 가져오기도 힘들다.따라서 주기적으로 캐시나 로그 등 wsl에 ..

기타 2025.05.01

Telethon을 이용한 텔레그램 메시지 전달 프로그램 만들기 (w/ AWS)

친구가 암호화폐 트레이딩 관련 텔레그램 방에서 정보를 받아 읽어보는데, 말하는 사람이 너무 많고, 유용한 정보는 한정되어 있어 읽기가 힘들다고 했다. 그래서 트레이딩을 잘하는 사람(이하 타깃)이 차트 분석을 해 설명과 함께 차트를 올리면 이것만 따로 감지해서 다른 텔레그램 방으로 전달해주는 프로그램을 만들어줬다. 이걸 AWS에서 구동해 언제나 스크립트가 가동되도록 하는 것까지 해보았다. 1. 준비물 1. 텔레그램 계정 봇을 사용하는 건 생각보다 제약이 심하다. 텔레그램 계정은 인증에 핸드폰 번호를 요구하는데, 이미 텔레그램 계정이 있었지만 해당 작업을 위해 LG U+ 에서 회선을 하나 더 사서 월 3천원 정도를 주고 사용하고 있다. 범수씨, 핸드폰 번호를 바꾸실거면 그 전에 그 번호로 가입한 곳은 탈퇴좀..

기타 2023.12.11

디자인 패턴을 적용한 oauth login 구현 Part 3

마지막으로 서비스 단에서 가독성이 더 좋고, 코드를 조금 더 재활용할 수 있도록 디자인 패턴을 적용해보자. 1. Strategy (전략 패턴) 전략 패턴은 중간에 추상화된 인터페이스를 하나 만들고, 필요에 따라 적절한 클래스에 속하는 인스턴스를 껴서 사용하는 방식이다. 덕 타이핑이라는 용어가 있는데, "만약 어떤 동물이 오리처럼 꽥꽥거리고, 뒤뚱거리면서 걷고, 수영하고 등등 오리가 하는걸 다 한다면 난 그걸 오리라고 취급하겠다" 라는 뜻에서 용어를 그렇게 정했다고 한다. 상황에 완전히 들어맞지는 않지만 나는 이 패턴을 이해하는데 도움이 되었다. 코드에 대입하자면 몇가지 함수가 정의된 인터페이스가 있고 (class와 비슷하다고 보면 된다.), 다른 클래스가 이 인터페이스에 정의된 함수를 다 가지고 있다면,..

Nodejs 2023.12.10

Cryptozombie - Ch1. Making Zombie Factory

컨셉은 좀비 군대를 생성하는 게임 컨트랙트를 만드는 것이다. 직접 컨트랙트를 만들어보면서 Solidity라는 언어의 기본적인 문법들과 다른 언어들과 비교했을 때 가지는 특성들을 알아보자. 챕터1에서는 좀비를 생성하는 공장을 만든다. 1. 목표 - 모든 좀비의 정보를 가진 db를 생성한다. - 새로운 좀비를 생성하는 함수를 가진다. - 각 좀비는 고유의 DNA를 가지며, 이 DNA로부터 외모가 결정된다. 1-1. DNA로 부터 외모를 결정하는 메커니즘 좀비 DNA는 16자리 정수로 이루어지는데, 첫 두 자리는 머리, 그 다음 두 자리는 눈을 결정한다. 첫 두자리를 7로 나눈 후 1을 더한 값이 머리 모양이다. 가령 첫 두 자리가 83 이라면 83%7 + 1 = 7, 7번 머리를 가지게 된다. 2. Cont..

Solidity 2023.12.03

디자인 패턴을 적용한 oauth login 구현 Part 2

이어서 실제로 oauth login을 구현하는 코드를 짜보자. 1. 코드 작성 controller, service단을 주로 보게 될텐데, 내가 처음 카카오 api를 이용해 oauth login을 구현할 땐 다음과 같았다. 1-1. controller import { Controller, Get, Query, Res } from "@nestjs/common"; import { LoginService } from "./login.service"; import { ConfigService } from "@nestjs/config"; @Controller("login") export class LoginController { constructor( private readonly loginService: Logi..

Nodejs 2023.11.29

디자인 패턴을 적용한 oauth login 구현 Part 1

어플리케이션에 oauth 기능을 구현해보았는데, 구현을 하다보니 oauth login 기능을 제공하는 여러 개의 제3자 앱이 제공해주는 기능, 각각의 코드 흐름들이 대부분 비슷했고, 마침 그 때 디자인 패턴을 조금 공부하고 있어 상황에 적합한 디자인 패턴을 적용해 oauth login 기능을 코드를 어느 정도 효율적으로 짜서 구현할 수 있었다. oauth login은 제3자앱에서 인증을 거쳐 개인 정보를 전달받는 기능이다. 사용자는 보안적으로 신뢰가 보장된 한정된 주체에게만 개인 정보를 공개, 저장할 수 있고, 어플리케이션은 사용자의 정보를 굳이 자신들이 따로 저장하지 않음으로써 보안에 대한 부담을 덜 수 있다. 1. OAuth login 메커니즘 Oauth login의 진행은 다음과 같다. 주의해야할 ..

Nodejs 2023.11.22

백준 7785 (nodejs)

https://www.acmicpc.net/problem/7785 7785번: 회사에 있는 사람 첫째 줄에 로그에 기록된 출입 기록의 수 n이 주어진다. (2 ≤ n ≤ 106) 다음 n개의 줄에는 출입 기록이 순서대로 주어지며, 각 사람의 이름이 주어지고 "enter"나 "leave"가 주어진다. "enter"인 경우는 www.acmicpc.net let input = require("fs") .readFileSync("/dev/stdin") .toString() .trim() .split("\n"); let att = new Set(); for (let i = 1; i < input.length; i++) { const [name, act] = input[i].split(" "); if (act ==..

Algorithm 2023.10.23

백준 14425 (nodejs)

https://www.acmicpc.net/problem/14425 14425번: 문자열 집합 첫째 줄에 문자열의 개수 N과 M (1 ≤ N ≤ 10,000, 1 ≤ M ≤ 10,000)이 주어진다. 다음 N개의 줄에는 집합 S에 포함되어 있는 문자열들이 주어진다. 다음 M개의 줄에는 검사해야 하는 문자열들이 주어 www.acmicpc.net let input = require("fs").readFileSync("/dev/stdin").toString().trim() .split("\n") let [ N, ] = input[0].split(" ") let S = new Set() for(let i = 1; i

Algorithm 2023.10.23

[nodejs] for

js에서 제공하는 여러 가지 for문에 대해 알아보자. 이것들을 능숙하게 사용할 수 있어야 할 것 같다. for문만 쓰는 것보다는 fo -while, while, for in 등을 전부 사용할 수 있는게 도움이 될 듯. 1. basic 1. for문 기본적인 for문. 시작점, 범위, 값의 변화 방식을 차례로 주면 된다 for (let i = 0; i 0; j = j - 2 ) { console.log(j) } // 10 8 6 4 2 2. while 문 괄호 안의 조건이 참인 동안 반복문 안의 코드를 계속 수행한다. let n = 0; let x = 0; // n이 3보다 작다..

Algorithm 2023.08.22

Study - Array vs. Map/Set

배열과 Map/Set의 시간 복잡도를 비교해보자. 1. array - 접근 (index 활용) : O(1) - 끝에서부터 삽입, 제거 : O(1) .push(), .pop() - 시작에서부터 삽입 제거 : O(n) .shift(), unshift() 그래서 stack 같은걸 구현할 때 shift, unshift를 쓰면 시간 초과로 틀리고, push, pop쓰면 풀리는 경우가 있었다. 단, shift, unshift처럼 배열의 처음 부분을 조작하는 method가 O(n) 인지, O(1)인지는 언어마다 다르다고 함. js는 O(n)이다. 첫 번째 요소를 제거/삭제하면, 뒤에 있는 요소들도 전부 하나씩 당기거나 밀어줘야 한다. 2. Map, Set, Object(dictionary) 객체의 한 타입이라고 생각..

Algorithm 2023.08.17

Study - Set

Set es6에 추가된 `고유한 값`들의 집합을 다루는 자료 구조이다. 즉, map과 마찬가지로 중복을 허용하지 않고, 순서가 없이 (배열에서 사용하는 idx가 없음) data를 저장한다. 1. Set 생성 map과 마찬가지로 `new` keyword를 이용해 생성한다. 초기값을 주지 않으면 빈 set이 만들어진다. const emptySet = new Set() console.log(emptySet) // Set(0) {} 배열을 인자로 주면 배열에 담긴 값으로 set을 만들 수 있다. (중복된 값은 제거됨) const numSet = new Set([1, 2, 3]) console.log(numSet) // Set(3) { 1, 2, 3 } 2. methods - Set에 값을 추가, 제거 할 때는 ..

Algorithm 2023.08.17

Study - Map

Map k-v 쌍으로 이루어진 자료 구조로, key를 통해 데이터에 빠르게 접근할 수 있는 자료 구조이다. 검색, 삽입, 제거, 존재 여부 확인 모두 O(1)의 시간 복잡도를 가짐. 단, 중복을 허용하지 않는다. 중복을 신경쓸 필요가 없고, 자료의 수정이 빈번하게 일어날 때 배열 대신 사용해주면 좋다. 1. 선언 js의 built-in 객체이므로 new를 이용해 사용할 수 있다. let m = new Map() console.log(m) // Map(0) {} 초기 값을 주고싶다면 iterable한 요소를 주면 된다. k-v 각각이 필요하므로, 1차 배열보다 2차 배열로 인수를 넘겨줘서 각 1차 배열의 두 요소가 k ,v가 되도록 한다. let tArr = [[1, "a"], [2, "b"], [3, "..

Algorithm 2023.08.17

Intro

알고리즘을 본격적으로 공부해야겠다. 백준에서 단계별 문제 분류된걸 쭉 풀어보려고 하는데 무지성으로 문제의 답을 찾는데에 집중하기 보다는 문제의 의도가 뭔지, 문제를 풀기 위해 알아야 하는 건 뭔지, 이 문제를 풀며 찾아낸 내가 모르는건 뭔지, (사소한 것이라도.. map, set이 어떤 자료 구조인지, 내가 몰랐던 쓸만한 method가 있는지) 남들과 비교해 내 방식에 어떤 장단점이 있는지, (메모리 사용량, 문제 채점에 걸린 시간 등을 비교해서 차이가 크다면 그 풀이를 보고 배울점을 찾는 식으로 하고 있음) 에 집중해가며 풀어야겠다. 현재 16장을 푸는 도중이지만 복습의 의미로 14장부터 순서대로, 배울 점이 있는 문제 위주로 정리를 해보겠다.

Algorithm 2023.08.17