개발/Node & Javascript(34)
-
[RxJS] bufferCount 써보기
개요 stream으로 값을 불러오는 경우 여러개의 값을 bulk로 처리하고 싶을 때가 있다. 이 때 bufferCount를 통해서 여러값을 처리하도록 만들어 보자. 예제 test generator를 생성한다. const sleep = async function (ms: number): Promise { return new Promise(resolve => { setTimeout(resolve, ms); }); } const doBackground = async (count: number, subscriber: Subscriber) => { for (let i = 0; i < count; i++) { if (count % 4 == 0) { await sleep(10); }; subscriber.next(i..
2022.05.08 -
[RxJS] Promise.all 대신 mergeMap 써보기
개요 여러 async 함수를 동시에 수행해서 결과를 만들고 싶을 때, Promise.all()을 사용한다. 이 때 Promise.all에서 많은 함수가 동시에 call이 되는 것을 막고 싶을 때가 있다. 이를 편리하게 구현할 수 있게 RxJS에서는 mergeMap을 제공한다. 예제 준비코드 아래와 같이 일정 시간 delay후 종료되는 task함수를 만들자. const sleep = async function (ms: number): Promise { return new Promise(resolve => { setTimeout(resolve, ms); }); } const task = async function (id: string): Promise { console.log(id, new Date()); ..
2022.05.08 -
JS - flame graph로 cpu profiling
개요 flamegraph를 통해서 쉽게 성능 분석을 할 수 있다. 아래 예제는 dtrace를 mac 환경에서 실행했고, 이외에도 perf나 다양한 툴들을 통해 profiling하고, 이를 flamegraph로 만들어 낼 수 있다. 준비사항 flamegraph를 아래와 같이 설치해준다. brew install flamegraph # 패키징된걸 사용한다. test app # app 실행 후, pid 확인 ps | grep -e "node"; # 가능한 probe 정보를 확인할 수 있다. profile probe에 관련된 것들을 확인 sudo dtrace -l | grep -e "profile" # user stack을 확인한다. pid를 알맞게 넣어주면 된다. # -x는 runtime args를 지정할 수 ..
2022.04.24 -
Sharp.js로 blurhash 이미지 합성하기
개요 sharp.js를 통해서 여러가지 이미지 처리를 할 수 있다. 이 글에서는 blurhash를 뒷배경으로 깔아보자. 준비사항 1. 이미지 준비 아래와 같이 무료 이미지를 준비해둔다. 2. blurhash, sharp 설치 yarn add sharp --save yarn add blurhash --save yarn add @types/sharp --dev 예제 우선 다음 단계로 진행한다. blurhash 값 생성 blurhash image decoding 원본 이미지와 합치기 1. blurhash 값 생성 sharp를 통해서 image를 로드하고, blurhash값을 생성해준다. async test(): Promise { const originalImageFilePath = path.join(__dir..
2022.03.31 -
Node.js - trampoline이란? ( tail call, recursion )
개요 trampoline이라는 기법을 알아보려고 한다. 시나리오 먼저 1 ~ n 까지 더하는 함수를 작성한다고 하자. 테스팅 코드 우선 아래의 코드를 통해서 테스트를 진행할 것이다. const test = (name, n, fn) => { try { console.time(name); fn(n); console.timeEnd(name); } catch (error) { console.error(error); } } // test('counter1', 100, counter); 1. 기본 우리는 바로 다음과 같이 작성할 것이다. const counter1 = (n) => { let sum = 0; for (let i = 1; i { if (n === 0) { return n; } return n + cou..
2022.03.13 -
Nest.js 탐험기 7 - microservice (grpc) 를 사용해보자 - 인터셉터
개요 공통된 로직을 처리해야 할 경우 interceptor를 활용할 수 있다. nest.js grpc의 경우에도 interceptor를 활용할 수 있게 제공이 되는데, 이를 활용해 보도록 하자. 예제 1. Interceptor 생성 아래와 같이 interceptor에 대한 code를 작성해준다. @Injectable() export class GrpcLoggingInterceptor implements NestInterceptor { private readonly logger = new Logger(GrpcLoggingInterceptor.name); intercept(context: ExecutionContext, next: CallHandler): Observable { this.logger.log(..
2022.03.06