PC에 RTX 4090 & CUDA 설치

sudo dnf config-manager --add-repo http://developer.download.nvidia.com/compute/cuda/repos/rhel9/$(uname -i)/cuda-rhel9.repo

sudo dnf install kernel-headers-$(uname -r) kernel-devel-$(uname -r) tar bzip2 make automake gcc gcc-c++ pciutils elfutils-libelf-devel libglvnd-opengl libglvnd-glx libglvnd-devel acpid pkgconfig dkms

sudo dnf module install nvidia-driver:latest-dkms

echo "blacklist nouveau" | sudo tee /etc/modprobe.d/blacklist-nouveau.conf

echo 'omit_drivers+=" nouveau "' | sudo tee /etc/dracut.conf.d/blacklist-nouveau.conf

sudo dracut --regenerate-all --force

sudo depmod -a

curl -L https://raw.githubusercontent.com/pyenv/pyenv-installer/master/bin/pyenv-installer | bash

Posted in Linux | Leave a comment

Openapi Code Generator

nest.js 프로젝트시 Swagger 를 사용한다.

스웨거 사용시 api 스펙 문서를 생성할수 있는데 해당 문서로 Client Code ( feat axios )를 생성 할수 있다.

클라이언트 코드생성을 간단히 하는 방법을 정리 해본다.

1.OpenAPI Generator 설치

설치하는 방법은 여러가지로 제공 한다. homebrew 설치 npm 설치 .. 등등.

지금은 npm 기반으로 설치 하겠다. ( 사전에 JDK 설치가 필요함 )

npm i @openapitools/openapi-generator-cli --save-dev

2. Generator Config 파일 작성

root 경로에 openapitools.json 파일을 생성후 아래 코드 작성.

{
  "$schema": "node_modules/@openapitools/openapi-generator-cli/config.schema.json",
  "spaces": 2,
  "generator-cli": {
    "version": "6.6.0",
    "generators": {
      "v3.0": {
        "generatorName": "typescript-axios",
        "output": "./output/",
        "glob": "swagger.json"
      }
    }
  }
}

3. Script 등록 및 Generator 실행

/* package.json*/
{
  "scripts":{
      "openapi-client-gen": "openapi-generator-cli generate",
  }
}

script 실행

npm run openapi-client-gen

결과물

생성된 파일 구조

  • index.ts: 모듈을 모아주는 파일
  • configuration.ts : Axios 모듈을 사용하기 위한 설정
  • base.ts , common.ts: 공통적으로 사용하는 모듈 정의
  • api.ts : 클라이언트에서 직접사용하는 모듈 ( API 문서로 정의한 API )
Posted in Javascript, nodejs | Leave a comment

TypeOrm Mysql bigint string

TypeOrm에선 기본적으로 bigint를 string 포맷으로 인식함

number로 인식하게 하기 위해선 bigNumberStrings: false 해줘야됨.

https://typeorm.io/data-source-options#mysql–mariadb-data-source-options

Posted in Javascript, nodejs | Leave a comment

Mongodb Select Query 기본 예제

– 쿼리 조건절1. “$lt” ( SQL의 < 연산 )

 > db.user.find( { “age” : { “$lt” : 20 } } )

  : user Collection에서 나이가 20세 보다 작은 사용자를 찾아라 

2. “$lte” ( SQL의 <= 연산 )

 >db.user.find( { “age” : { “$lte” : 20 } } )

  : user Collection에서 나이가 20세와 같거나 작은 사용자를 찾아라 

3. “$gt” ( SQL의 > 연산 )

 >db.user.find( { “age” : { “$gt” : 20 } } )

  : user Collection에서 나이가 20세 보다 큰 사용자를 찾아라 

4. “$gte” ( SQL의 >= 연산 )

 >db.user.find( “age” : { “$gte” : 20 } } )

  : user Collection에서 나이가 20세와 같거나 큰 사용자를 찾아라 

– OR 쿼리

1.”$in” ( 하나의 키에 다양한 값들과 비교 하는 쿼리 )

 > db.user.find( { “no” : { “$in” : [ 1 , 10 , 30 ] } } )

  : user Collection에 “no”가 1 , 10 , 30 인 사용자를 찾아라 

 > db.user.find( { “user_id” : { “$in” : [ 1234 , “austin” ] } )

  : user Collection에 “user_id”가 1234 이거나 austin인 사용자를 찾아라 

  : 위의 예시는 점진적으로 user_id를 번호 대신 사용자 이름으로 변경 이전하는 경우 유용하게 사용할수 있다.

2. “$nin” ( “$in”쿼리의 반대 이다 해당 값들이 일치하지 않은경우를 쿼리 )

 >db.user.find( { “no” : { “$nin” : [ 1 , 10 , 30 ] } } )

  : user Collection에 “no”가 1 , 10 , 30 이 아닌 모든 사용자를 찾아라

3. Array 에서 찾기

내장문서에 하나 이상의 키에 대해 조건과 일치 여부를 확인할때 

{

“_id” : ObjectId(“507256d3e4b050361f0ed128”),

“SENDER_ID” : NumberLong(9),

“USER_ARRAY” : [

{

“RECEIVER_ID” : “9”,

“USER_ACTIVE” : 0,

“IS_BLOCK” : 1

},

{

“RECEIVER_ID” : “16”,

“USER_ACTIVE” : 0,

“IS_BLOCK” : 1

},

{

“RECEIVER_ID” : “10”,

“USER_ACTIVE” : 0,

“IS_BLOCK” : 1

}

],

“IS_ACTIVE” : 1,

“IS_VOICE” : 2,

“REG_DATE” : NumberLong(“1349670611157”)

}

위 필드에서 RECEIVER_ID : 9 이고 USER_ACTIVE : 0인 것을 찾는 쿼리

db.collectionName.find(  { USER_ARRAY: { $elemMatch:{ RECEIVER_ID : “16” , USER_ACTIVE:0 } } } );

Posted in NoSQL&MySQL | Leave a comment

AWS SSH Tunneling 을 이용한 리소스 접근

AWS DocumentDB(MongoDB) , AWS ES ( ElasticSearch ) 등의 서비스들은 EC2 와 다르게 외부 PC( 개발노트북등등..)에서 접근이 안되게 되어있다.

접근 방법으로 SSH Tunnel 을 제공하는데 해당 기능이 쓰기 굉장히 불편하다.

SSH Tunneling의 도식이다.

로컬에서 ssh 시작

ssh -i {my-key.pem} ec2-user@{my-aws-public-domain} -N -L {local-port}:{elasticsearch-endpoint}:{port}

my-key.pem : aws 인증파일 , my-aws-public-domain : 내 ec2 접근 ip or 도메인 , local-port : 로컬에서 사용할 포트 , elasticsearch-endpoint : elastic 혹은 몽고디비 endpoint 주소 , port : endpoint에서 서비스되는 포트 ( https 는 443 등등 포트를 꼭 적어줘야됨. )

위와 같이 터널링을 한후 로컬에서 접근하게 되면 원격지의 포트로 포워딩이 되게 된다.

아래 링크는 터널링하는 예제 이니다.

https://linuxize.com/post/how-to-setup-ssh-tunneling/

Posted in AWS, Linux | Leave a comment

NGINX proxy NodeJS 사용하기 설정 ( Static Serve )

http://labs.ssen.name/Server/NginX/NginX%EB%A5%BC%20Node.js%EC%9D%98%20Reverse%20Proxy%EB%A1%9C%20%EC%84%A4%EC%A0%95%ED%95%98%EA%B8%B0.html

Posted in Linux | Leave a comment

Centos6 nodejs 12.x 이상 버전 설치 방법

nvm 으로 노드 버전을 관리중 12.x 버전으로 업그레이드 하면서 문제가 생겼다.

에러 내용은 아래와 같다.

node: /usr/lib64/libstdc++.so.6: version `glibcxx_3.4.14'

해당 에러는 GLIBC가 하위버전이 설치 되어서 그렇다 적어도 3.4.18이상은 있어야된다.

최신 libstdc++.so.6은 크롬 설치버전에서 라이브러리로 제공한다.

최신크롬 설치

rpm -ivh http://li.nux.ro/download/nux/dextop/el6/x86_64//chrome-deps-stable-3.11-1.x86_64.rpm

파일경로는 /opt/google/chrome/lib64/libstdc++.so.6

위 링크에 있는 파일을 카피해준다.

rm -r /usr/lib64/libstdc++.so.6
cp /opt/google/chrome/lib/libstdc++.so.6 /usr/lib64/
/lib64/libc.so.6

해당 파일도 문제가 된다 해당 파일은 강제로 다운로드 해주는 쉘을 하나 만든다.

#! /bin/sh

# update glibc to 2.17 for CentOS 6

wget http://copr-be.cloud.fedoraproject.org/results/mosquito/myrepo-el6/epel-6-x86_64/glibc-2.17-55.fc20/glibc-2.17-55.el6.x86_64.rpm
wget http://copr-be.cloud.fedoraproject.org/results/mosquito/myrepo-el6/epel-6-x86_64/glibc-2.17-55.fc20/glibc-common-2.17-55.el6.x86_64.rpm
wget http://copr-be.cloud.fedoraproject.org/results/mosquito/myrepo-el6/epel-6-x86_64/glibc-2.17-55.fc20/glibc-devel-2.17-55.el6.x86_64.rpm
wget http://copr-be.cloud.fedoraproject.org/results/mosquito/myrepo-el6/epel-6-x86_64/glibc-2.17-55.fc20/glibc-headers-2.17-55.el6.x86_64.rpm

sudo rpm -Uvh glibc-2.17-55.el6.x86_64.rpm \
glibc-common-2.17-55.el6.x86_64.rpm \
glibc-devel-2.17-55.el6.x86_64.rpm \
glibc-headers-2.17-55.el6.x86_64.rpm --force --nodeps

해당 쉘 실행

chomod 755 libc_install.sh
./libc_install.sh

이제 모든 준비가 완료 되었다.

nvm install --lts

node -v

Posted in Javascript, nodejs | Leave a comment

Puppeteer querySelector Wildcard 옵션으로 찾기

wildcard로 attirbute value를 찾고자 할때 옵션을 간단히 설명한다.

<!DOCTYPE html> 
<html> 
	<head> 
	</head> 
	<body> 
		<h1>GeeksforGeeks</h1> 
		
		<!-- Since we have used * with str, all items with 
			str in them are selected -->
		<div class="str_first">The first div element.</div> 
		<div class="second">The second div element.</div> 
		<div class="my-strt">The third div element.</div> 
		<p class="mystr">Paragraph Text</p> 
	</body> 
</html>

위와 같은 Html이 있을경우

document.querySelectorAll( '[class*=str]' )

value에 str이 포함될경우를 찾는 것이다.

div 2개와 p 엘레멘트 까지 총 3개의 엘레멘트를 찾을수 있다.

document.querySelectorAll( '[class$=str]' )

$로 찾으면 str로 끝나는 엘레멘트를 찾게 된다.

p 1개를 찾을수 있다. <p class=”mystr”>

document.querySelectorAll( '[class^=str]' )

^로 찾게되면 str로 시작하는 엘레멘트를 리턴하게 된다.

div 1개를 찾을 수 있다. <div class=”str_first”>

Posted in Javascript, nodejs | Leave a comment

Nestjs ScheduleModule 사용시 주의 점

Nestjs 같은경우 CronJob을 간단히 구현 할수있는데

@Cron 어노테이션을 사용해서 구현한다.

@Cron( '01 * * * * *' )
    async handleCron() {
        this.logger.debug( `cron job start..... process PID: ${process.pid} `);
    }

나의 삽질로 해당 클론이 2번씩 호출되는 문제가 있었음..

해당 서비스를 두군데 모듈(Module)에서 providers에 포함 시키니 그런 결과가 나옴.

Cron이 포함된 서비스는 한군데 모듈에서만 포함시키자.

Posted in Javascript, nodejs | Leave a comment

javascript Promise all / race 차이점


const getMessage = async()=>{
}
작성중...

Promise를 사용할때 보통 많이 실수하는 부분이 Promise iterable 객체를 처리할때 이다.

위의 예제에서 실행결과 Promise의 배열만 리턴해주게 된다.

이럴때 사용하는 메서드가 Promise.all or Promise.race 이다.

메서드

Promise.all(iterable)
iterable 내의 모든 프로미스가 이행한 뒤 이행하고, 어떤 프로미스가 거부하면 즉시 거부하는 프로미스를 반환합니다. 반환된 프로미스가 이행하는 경우 iterable 내의 프로미스가 결정한 값을 모은 배열이 이행 값입니다. 반환된 프로미스가 거부하는 경우 iterable 내의 거부한 프로미스의 이유를 그대로 사용합니다. 이 메서드는 여러 프로미스의 결과를 모을 때 유용합니다.
Promise.race(iterable)
iterable 내의 어떤 프로미스가 이행하거나 거부하는 즉시 스스로 이행하거나 거부하는 프로미스를 반환합니다. 이행 값이나 거부 이유는 원 프로미스의 값이나 이유를 그대로 사용합니다.

 

정리해보면 두메서드의 결정적인 차이는 iterable안의 Promise가 하나라도 실패하면 리턴(race)하느냐 실패하더라도 전체 iterable을 완료해서 Promise의 결과를 모으냐의(all) 차이다.

MDN의 Promise 참조

Posted in Javascript, nodejs | Tagged , , , | Leave a comment