전체 글 114

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

hardhat network config 설정 (alchemy)

hardhat으로 컨트랙트를 배포할 때 네트워크 설정은 어떻게 하는가? module.exports = { solidity: "0.8.18", networks: { goerli: { url: "", accounts: [""] } } }; 당연히 요청을 보낼 네트워크에 관한 정보를 다음과 같이 networks에 적어주면 된다. 난 지금까지 컨트랙트를 배포하는 과정에서 대부분 private 네트워크를 사용해서 127.0.0.1을 사용했다. 문제는 직접 public 블록체인과 상호작용할 때는 어떻게 하냐, 즉, url엔 어떤 값을 써줘야 하는가이다. 지금 당장 내가 goerli public testnet에 컨트랙트를 배포를 하고 싶은데, 그러면 어떻게 해줘야 하나? 이에 대한 해답을 어제 우연히 옆 자리 친구를..

Blockchain 2023.04.01