2023년 4월 5일 수요일

[NodeJS] 프로젝트에 힙 크기 할당 (PM2 이용)


pm2 설치

# npm을 사용하여 pm2-logrotate를 전역으로 설치

$sudo npm i pm2-logrotate -g


# 활성화

$sudo pm2 set pm2-logrotate:active true


# 설정변경 (선택사항)

$pm2 set pm2-logrotate:max_size 10M

$pm2 set pm2-logrotate:retain 7

$pm2 set pm2-logrotate:compress true


pm2 실행 시 메모리 할당

$pm2 start ./src/index.js --name 15_SCHE --node-args="--max-old-space-size=10240"


pm2를 이용하여 start 할 때 --node-args를 이용하여 nodejs에 인자를 전달한다.


--max-old-space-size 인자는 nodejs에서 Mbyte 단위의 메모리를 할당한다.

System의 램 용량을 확인하여 할당하도록 한다.

2023년 3월 27일 월요일

[AWS] Front에서 S3에 파일 직접 업로드

1. S3에 버킷 생성

2. 버킷 [권한] 설정

A. 퍼블릭 액세스 차단(버킷 설정)

B. 객체 소유권 편집

C. CORS 편집


[
    {
        "AllowedHeaders": [
            "*"
        ],
        "AllowedMethods": [
            "GET",
            "PUT",
            "POST",
            "HEAD"
        ],
        "AllowedOrigins": [
            "*"
        ],
        "ExposeHeaders": [
            "x-amz-server-side-encryption",
            "x-amz-request-id",
            "x-amz-id-2"
        ],
        "MaxAgeSeconds": 3000
    }
]


3. IAM에서 사용자 및 역할 구성
버킷명이 afterdata인 경우

{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Statement1",
"Effect": "Allow",
"Action": [
    "s3:PutObject",
    "s3:PutObjectAcl",
    "s3:GetObject"
],
"Resource": [
    "arn:aws:s3:::zipl/*"
]
}
]
}









2022년 12월 5일 월요일

[Javascript] call, apply, bind

JS에서는 함수 호출 방식과 관계없이 this를 지정할 수 있음


const mike = {

    name: 'Mike',

};


const tom = {

    name: 'Tom',

}


function showThisName() {

    console.log(this.name);

}


showThisName();    // 아무것도 나오지 않음

showThisName.call(mike);    // Mike

showThisName.call(tom);    // Tom

// 함수.call()의 인자로 객체를 넘기면 this에 할당됨


function update(birthYear, occupation) {

    this.birthYear = birthYear;

    this.occupation = occupation;

}


update.call(mike, 1999, 'singer');

update.call(tom, 2002, 'teacher');


update.apply(mike, [1999, 'singer']);

update.apply(tom, [2002, 'teacher']);


const updateMike = update.bind(mike);

// mike 객체가 할당되어 update기능을 수행하는 updateMike라는 함수를 만듦


[Javascript] Number, Math

Number

toString()

: 10진수 -> 2진수/16진수


let num = 10;

num.toString();    // '10'

num.toString(2);    // '1010'

let num2 = 255;

num2.toString(16);    // 'ff'


toFixed()

: 소수점 자릿수


let userRate = 30.1234;

userRate.toFixed(2);    // '30.12'

userRate.toFixed(0);    // '30'

userRate.toFixed(6);    // '30.123400'

Number(userRate.toFixed(2);    // 30.12


Math

Math.PI;    // 3.141592653589793


Math.ceil();    // 올림

Math.floor();    // 내림

Math.round();    // 반올림


Math.random();    // 0 ~ 1 사이 무작위 숫자 생성

Math.abs(n);    // n의 절대값

Math.pow(n, m);    // n의 m 거듭 제곱 값

Math.sqrt(n);    // n의 제곱근


기능함수들

isNaN()

: NaN인지 아닌지 구분


parseInt()

: 숫자로 변경

let margin = '10px';
parseInt(margin);    // 10 -> 문자가 나올때까지의 숫자를 변경
Number(margin);    // NaN

let redColor = 'f3';
parseInt(redColor);    // NaN
parseInt(redColor, 16);    // 243 -> 16진수 문자열 redColor를 10진수로 변경

parseInt('11', 2);    // 3 -> 2진수 문자열 '11'을 10진수로 변경


parseFloat()

: 부동소수점으로 변환



2022년 1월 2일 일요일

VSCODE 사용자코드

 {

    // Place your snippets for javascriptreact here. Each snippet is defined under a snippet name and has a prefix, body and
    // description. The prefix is what is used to trigger the snippet and the body will be expanded and inserted. Possible variables are:
    // $1, $2 for tab stops, $0 for the final cursor position, and ${1:label}, ${2:another} for placeholders. Placeholders with the
    // same ids are connected.
    // Example:
    // "Print to console": {
    //  "prefix": "log",
    //  "body": [
    //      "console.log('$1');",
    //      "$2"
    //  ],
    //  "description": "Log output to console"
    // }
    "Create Functional React Component": {
        "prefix": "cfrc",
        "body": [
          "import React from 'react';",
          "",
          "const ${TM_FILENAME_BASE} = () => {",
          "    return (",
          "        <>",
          "            ${TM_FILENAME_BASE}",
          "        </>",
          "    );",
          "}",
          "",
          "export default ${TM_FILENAME_BASE};"
        ],
        "description": "Create Functional React Component"
    },
    "Styled Functional React Component": {
        "prefix": "sfrc",
        "body": [
          "import React from 'react';",
          "import styled from 'styled-components';",
          "",
          "const ${TM_FILENAME_BASE}Block = styled.div``;",
          "",
          "const ${TM_FILENAME_BASE} = () => {",
          "    return (",
          "        <${TM_FILENAME_BASE}Block>",
          "            ${TM_FILENAME_BASE}",
          "        </${TM_FILENAME_BASE}Block>",
          "    );",
          "}",
          "",
          "export default ${TM_FILENAME_BASE};"
        ],
        "description": "Styled Functional React Component"
    },
    "Create Class React Component": {
        "prefix": "ccrc",
        "body": [
          "import React, { Component } from 'react';",
          "",
          "class ${TM_FILENAME_BASE} extends Component {",
          "    render() {",
          "        return (",
          "            ${TM_FILENAME_BASE}",
          "        )",
          "    }",
          "}",
          "",
          "export default ${TM_FILENAME_BASE};"
        ],
        "description": "Create Class React Component"
    },
    "Create Redux Module": {
        "prefix": "crdm",
        "body": [
          "import { createAction, handleActions } from 'redux-actions';",
          "// import { takeLatest, call } from 'redux-saga/effects';",
          "// import createRequestSaga, { createRequestActionTypes } from '../lib/createRequestSaga';",
          "",
          "const INITIALIZE = '${TM_FILENAME_BASE}/INITIALIZE';",
          "const CHANGE_VALUE = '${TM_FILENAME_BASE}/CHANGE_VALUE';",
          "// const [ACTION, ACTION_SUCCESS, ACTION_FAILURE] = createRequestActionTypes('${TM_FILENAME_BASE}/ACTION');",
          "// const [REACTION, REACTION_SUCCESS, REACTION_FAILURE] = createRequestActionTypes('${TM_FILENAME_BASE}/REACTION');",
          "",
          "export const ${TM_FILENAME_BASE}Initialize = createAction(INITIALIZE);",
          "export const ${TM_FILENAME_BASE}ChangeValue = createAction(CHANGE_VALUE, ({key, value}) => ({key, value}));",
          "// export const action = createAction(ACTION, data => data);",
          "",
          "// const actionSaga = createRequestSaga(ACTION, actionAPI.action);",
          "// function reactionSaga() {",
          "//     try {",
          "//         yield call(actionAPI.reaction);",
          "//     } catch (e) {",
          "//         console.error(e);",
          "//     }",
          "// }",
          "",
          "export function* ${TM_FILENAME_BASE}Saga() {",
          "    // yield takeLatest(ACTION, actionSaga);",
          "    // yield takeLatest(REACTION, reactionSaga);",
          "}",
          "",
          "const initialState = {",
          "    ${TM_FILENAME_BASE}: null,",
          "    error: null",
          "};",
          "",
          "const ${TM_FILENAME_BASE} = handleActions(",
          "    {",
          "        [INITIALIZE]: () => initialState,",
          "        [CHANGE_VALUE]: (state, { payload: {key, value}}) => ({",
          "            ...state,",
          "            [key]: value,",
          "        }),",
          "    },",
          "    initialState,",
          ");",
          "",
          "export default ${TM_FILENAME_BASE};"
        ],
        "description": "Create Redux Module"
      }
}

2020년 3월 10일 화요일

USB 공부


인터페이스와 속도 비교
인터페이스
유형
연결개수(최대)
거리(최대)
속도(최대 bps)
일반적인 용도
USB 3.1
이중 단방향 (dual simplex) 직렬
버스당 127
1(5 허브 사용 시 5)m
10G
이동식 대용량 저장장치, 비디오
USB 3.0
이중 단방향 직렬
버스당 127
2(5 허브 사용시 10)m
5G
이동식 대용량 저장장치, 비디오
USB 2.0
반 이중 (half duplex) 직렬
버스당 127
5(5허브 사용시 30)m
1.5M, 12M, 480M
키보드, 마우스, 디스크 드라이브, 스피커, 프린터, 카메라
CAN 버스
직렬
다양한 하드웨어
500 @125kbps
1M @40m
자동차
eSATA
직렬
2(포트 확장 시 16)
2
6G
디스크 드라이브
이더넷
직렬
1024
500, 속도에 따라 다름, 광통신 이용 시 더욱 원거리 통신이 가능
10G
범용 네트워크 통신
IEEE-1394
(파이어와이어(FireWire))
직렬
64
100
3.2G
비디오, 이동식 대용량 저장장치
IEEE-488 (GPIB)
병렬
15
20
8M
산업용 장비
I2C
동기식 직렬
1007
부하와 속도에 따라 다양함
3.4M
임베디드 시스템, 범용
마이크로와이어(Microwire)
동기식 직렬
8
3
2M
임베디드 시스템, 범용
미디(MIDI)
직렬식 커런트 루프(current loop)
2(MIDI 쓰루 포트로 확장 가능)
15
31.25k
음악, 무대 제어
병렬 프린터 포트
병렬
2(데이지 체인 지원시 8)
3 ~ 10
16M
프린터, 스캐너, 디스크 드라이브
RS-232
(EIA/TIA-232)
비동기 직렬
2
15 ~ 30
20k (특수 목적 하드웨어 사용시 고속 통신 가능)
임베디드 시스템, 범용
RS-485
(TIA/EIA-485)
비동기 직렬
32 단위 부하(하드웨어에 따라 256개까지 확장 가능)
1200
10M
데이터 수집 및 제어 시스템
SPI
동기식 직렬
하드웨어에 따라 다양함
부하와 속도에 따라 다양함
2M 또는 하드웨어에 따라 고속 통신 가능
임베디드 시스템, 범용
썬더볼트 (Thunderbolt)
전이중(full duplex) 직렬
7
3m(구리선), 100m(광통신)
10G(v1), 20G(v2)
이동식 대용량 저장장치, 비디오


USB 트랜잭션 관련 정보
패킷 유형
PID
(이진)
사용되는 전송방식
소스
버스 속도
설명
토큰
(트랜잭션 형식 식별)
OUT
0001
전부
호스트
전부
OUT 트랜잭션용 디바이스, 엔드포인트 주소
IN
1001
전부
호스트
전부
IN 트랜잭션용 디바이스, 엔드포인트 주소
SOF
0101
프레임 시작
호스트
전부
프레임 시작 마커와 프레임 번호
SETUP
1101
제어
호스트
전부
SETUP 트랜잭션용 디바이스, 엔드포인트 주소
데이터
(데이터와 상태 코드 전송)
DATA0
0011
전부
호스트,
디바이스
전부
데이터 토글 또는 데이터 PID 시퀀싱
DATA1
1011
전부
호스트,
디바이스
전부
데이터 토글 또는 데이터 PID 시퀀싱
DATA2
0111
등시성
호스트,
디바이스
하이
데이터 PID 시퀀싱
MDATA
1111
등시성,
분할 트랜잭션
호스트,
디바이스
하이
데이터 PID 시퀀싱
핸드셰이크
(상태 코드 전송)
ACK
0010
제어, 벌크,
인터럽트
호스트,
디바이스
전부
수신 측에서 데이터 패킷을 에러 없이 받았음
NAK
1010
제어, 벌크,
인터럽트
디바이스
전부
수신 측에서 데이터를 받지 못했거나 송신 측이 데이터를 보내지 못했거나 전송할 데이터가 없음
STALL
1110
제어, 벌크,
인터럽트
디바이스
전부
지원하지 않는 제어 리퀘스트이거나 엔드포인트가 멈췄음
NYET
0110
제어 쓰기,
벌크 OUT,
분할 트랜잭션
디바이스
하이
디바이스가 데이터 패킷을 에러 없이 수신했으나, 추가 데이터에 대해서는 준비되지 않음. 또는 허브가 분할 데이터를 완전히 처리하지 못함
특수
PRE
1100
제어,
인터럽트
호스트
다음 패킷이 로우스피드라는 것을 식별할 수 있도록 호스트가 선행해서 만들어냄(로우/풀 스피드 구간에서만 사용)
ERR
1100
전부
허브
하이
분할 트랜잭션에서 로우/풀 스피드 에러를 보고하기 위해 허브가 반환(하이스피드 구간에서만 사용)
SPLIT
1000
전부
호스트
하이
분할 트랜잭션을 나타내는 토큰 패킷 앞에 옴
PING
0100
제어 쓰기,
벌크 OUT
호스트
하이
NYET 후에 벌크 OUT, 제어 쓰기 데이터 트랜잭션용 BUSY 체크
EXT
0000
-
호스트
전부
프로토콜 확장 토큰


일반적인 USB 2.0 순서

  1. 시스템이 새 디바이스를 갖는다.
  2. 허브가 디바이스를 감지한다.
  3. 호스트가 새 디바이스 정보를 얻는다.
  4. 허브는 디바이스가 풀스피드인지 로우스피드인지 감지한다.
  5. 허브가 디바이스를 리셋한다.
  6. 호스트는 풀스피드 디바이스가 하이스피드도 지원하는지 확인한다.
  7. 허브는 디바이스와 버스 사이의 신호 경로를 설정한다.
  8. 호스트는 Get Descriptor 리퀘스트를 보내 기본 파이프의 최대 패킷 크기를 알아낸다.
  9. 호스트가 주소를 할당한다.
  10. 호스트는 디바이스 기능에 관한 정보를 읽어온다.
  11. 호스트가 디바이스에게 추가 정보를 요청한다.
  12. 호스트가 디바이스 드라이버를 할당하고 메모리로 가져온다(혼성 디바이스는 예외)
  13. 호스트 디바이스 드라이버가 컨피규레이션을 선정한다.

디바이스 디스크립터
Offset
필드
크기
설명
0
bLength
1
디스크립터 바이트 크기(0x12)
1
bDescriptorType
1
상수 값 DEVICE(0x01)
2
bcdUSB
2
USB 규격 릴리스 번호(BCD)
4
bDeviceClass
1
클래스 코드
5
bDeviceSubClass
1
서브클래스 코드
6
bDeviceProtocol
1
프로토콜 코드
7
bMaxPacketSize0
1
엔드포인트 0의 최대 패킷 크기
8
idVendor
2
Vendor ID
10
idProduct
2
Product ID
12
bcdDevice
2
디바이스 릴리스 번호(BCD)
14
iManufacturer
1
제조사에 대한 문자열 디스크립터 인덱스
15
iProduct
1
제품에 대한 문자열 디스크립터 인덱스
16
iSerialNumber
1
일련번호에 대한 문자열 디스크립터 인덱스
17
bNumConfigurations
1
가능한 컨피규레이션 개수


















참조 : [도서] USB 완전정복