반응형

📢 컴퓨터에서의 수표현

▼ 컴퓨터는 10진수가 아닌 2진수로 수를 표현한다. 

일반적으로 컴퓨터에서 사용되는 정수형의 종류는 char (8bit,1byte) , short (16bit, 2byte) , int(32bit , 4byte) , long (64bit , 8byte) 이다. 이중 int (32bit가 제일 많이쓰여 32bit 기준으로 설명을 하겠다.)

4byte는 32bit 이며 1bit는 0과 1중 둘중 하나로 사용을 할 수 있다. 즉 2진수로 32개의 자리수를 차지하여 숫자를 표현한다.

보통 컴퓨터언어에서 맨앞자리 그니간 맨왼쪽자리 1비트는 + - 의 부호비트로 사용한다. 따라서 양수로 표현할수있는 가장 큰 32 비트값은?

0111 1111 1111 1111 1111 1111 1111 1111(2) (0x7FFFFFFF) = 2147483647 가 된다. (여기서 0은 +라는 부호비트로 사용), 만약 숫자 3을 이진수로 뽑으면 011 이겠지만 사실상 int 형(4byte)에 담아 본다면.

0000 0000 0000 0000 0000 0000 0000 0011 이렇게 될것이다 int형의 32bit 자리수를 다채우지만 앞에가 0이라 생략이 된 것.

 

📋 컴퓨터에서 음수를 표현할 때

▼ 컴퓨터에서 음수를 표현할때는 맨앞자리가 0이면 + 1이면 -이다. 음수를 표현하는 방법은 여러가지가 잇겠지만 그중 대중적인건 2의 보수를 사용한다. 그 이유는 bit는 1개가 0과 1을 표현한다. 그러니 수를 표현하는 비트수가 많건 적건 결과는 항상 짝수이다. 그렇다보니 음수를 표현하는대있어 1의보수와 부호화 절대치방법 들은 +0과 -0이 공존하게된다. 같은 0인데도 말이다.

2의 보수의 경우 +0과 -0이 따로없고 0은 오로지 1개 그리고 음수가 숫자가 1개가 더많다. 예를들어 양수로 7까지표현한다면 음수로는 -8까지 표현이 가능하다는 말이다.  만약 java로 int형 변수에 담아 이진수로 출력하게될경우

ex ) 1111 1111 1111 1111 1111 1111 1111 1101 (2) 이렇게 표현이 될것이다. 그 이유는 java등 기타 많은 언어들은 대부분 음수표현을 2의 보수 형태로 취하고 있기 때문이다.

컴퓨터(논리회로) 가 음수를 표현하는 방법은 여러 가지가 있지만, 그중 대표적으로 3가지를 말하자면 부호화 절대치 방법, 1의보수 방법 , 2의보수 방법 이렇게 3가지가 있다.

 

📋 부호화 절대치 방법 (Sign Magnitude)

▼ 부호비트를 제외한 수를 양수로 읽고, 마이너스를 붙이는 방법 즉 이진수 000011(2) = +3으로, 100011(2) = -3으로 인식하는 것. 이는 표기하기도 직관적이고 사칙연산중 곱셈 나눗셈 할땐 매우 유리하지만, 음수의 덧셈은 양수의 뺄셈과 전혀 다른 결과라서 이를 해결하기 위해서는 피연산자의 절댓값을 서로 비교하는 추가적인 연산이 필요로 한다는 단점이 있다.

예를 들어 3 - 3 = 0 을 계산하면 000011(2) = 3과 100011(2) = -3을 이진수 계산으로 더하면 000011(2) + 100011(2) = 100110(2) = -6이 되는데, 이는 결과값으로 나와야 할 (+3) + (-3) = 0과는 다른 값이다.

 

 

📢 보수의 개념, 보수의 정의

▼보수란? 어원적 의미로는 상호 보완하는 수로, 임의의 수를 보완해주는 다른 임의의 수다.

보충해주는 수 라는 의미를 가지고있으며 컴퓨터가 뺄셈을 할 때 사용되는 개념입니다.

컴퓨터가 뺄셈을 하기 위해 이런 개념이 필요한 이유는, 컴퓨터는 뺄셈을 할 수 없기 때문입니다. (가산기만 가지고 계산을함) 가산기란 : 덧셈연산을 수행하는 논리회로 (계산기)

그럼 가산기만 가지고 사칙연산을 하는법은? +는 더하면되고 -는 보수를취해서한다, X 곱셈은 +를 n번하면되고 / 나누기는 -를 n번하면 됩니다. 이렇게 컴퓨터는 가산기만가지고 사칙연산을 다계산합니다.

10진수 10이 있을때, 6의 보수를 구하면 6+x = 10 이 되는 숫자인 x= 4 가 10에 대한 6의 보수 입니다.

즉 N이 있을때 N의 'X의 보수'를 구하라고 하면 X에 (보수)Y를 더하여 N이 나오면됩니다. (X+Y =N)의 식이나옵니다. 여기서 N의 X의 보수는 Y가 되는거지요 (6 + 4 = 10 , 10에대한 6의보수는 4)

10진수에서 2에대한 10의 보수는 8입니다. 즉 2+8 =10 그러나 2진수에서 2의 보수는 음수를 나타냅니다.

 

📋 1의 보수

※요약※
1. 1의보수는  0 -> 1   1->0 으로 나타냅니다.
2. 보수는 음수일경우만 취한다. 양수일경우 x
3. 덧셈 , 뺄셈 계산시 자리올림수 (캐리값)은 숫자 1로 바꾼다.
4. 이진수변환시 +0과 -0이 존재한다

양수의 비트들을 반전시켜서 음수를 표현하는 방법. (ex : 101011 를 1의보수로 바꾸면 010100 이 된다.)

조금더 정확하게 풀이하자면 모든비트가 1인 수 에서 빼면 나오는데.   11111(2) - 101011(2) = 010100 (1의보수) 이렇게 계산하여 나오는 수 ( - 뺄셈이지만 정확하게는 xor연산입니다. 결과는 같다.) 

ex) 3의 보수 : 011 -> 100      7의 보수 : 0111 -> 1000

위 처럼 0000 0001 이라면 1111 1110 이렇게 자리수는 지켜줘야 야 합니다. 그래야 덧셈 뺄셈 할때 혼동이 되지 않아요.

010110 - 11 일경우 자리수를 맞춰주고 ( 010110 - 000011 ) --> 음수를 1의보수로 바꿔주면 ( 010110 + 111100 ) --> 1010010  이와 같은 결과가 나오는대. 6자리수에서 덧셈으로인한 자리수 올림이 발생하여 7자리가 되었는대. 저기서 빨간색으로 칠한 부분은 캐리(carry) 라고 하며, 1의보수에선 캐리값을 숫자 1로 바꿔 더해줍니다.

( ex : 1010010 --> 010011 ) 이렇게 자리수를 다시 6자리로 맞춰주고 6자리외에 올림은 숫자1로 바꿔 저렇게 더해줍니다. 그러면 십진수로 계산을 해보면 22 - 3 = 19  --> 010110 - 11 = 010011 (2) 이렇게 결과가 나옵니다.

 

📋 2의 보수

※요약※
1. 2의보수는 1의보수에서 +1을 더한 상태
2. 보수는 음수일경우만 취한다. 양수일경우 x
3. 덧셈 , 뺄셈 계산시 자리올림수 (캐리값)은 버린다.
4. 이진수변환시 0은 하나만 존재한다

양수의 비트들을 반전시켜서 음수로 만든후 +1 을 더한다. 자세한설명은 아래 예제를 보며 습득하자.

10진수 부호화 절댓값 1의 보수 2의 보수
-4 - - 100
-3 111 100 101
-2 110 101 110
-1 101 110 111
-0 100 111 -
+0 000 000 000
+1 001 001 001
+2 010 010 010
+3 011 011 011

 

📋 1의보수 2의보수 예제

EX1)  ‘1’ 의 2의 보수
0000 0001   →   1111 1110   →   1111 1111
    < 1 >         <1의 보수>        <2의 보수>

EX2)  ‘3’ 의 2의 보수
0000 0011   →   1111 1100   →   1111 1101
    < 3 >            <1의 보수>      <2의 보수>      
 
EX3) ‘6’의 2의 보수
0000 0110   →   1111 1001   →   1111 1010
    < 6 >            <1의 보수>      <2의 보수>

EX4)‘9’의 2의 보수
0000 1001   →   1111 0110   →   1111 0111
    < 9 >            <1의 보수>      <2의 보수>

EX5) ‘10’ 의 2의 보수
0000 1010   →   1111 0101   →   1111 0110
   < 10 >           <1의 보수>      <2의 보수>
그럼 뺄셈의 예제를 들어보도록 하겠습니다.


EX1)  “9 - 9”
       9 - 9    →   9 + (-9)
     9: 0000 1001 
   -9: 1111 0111
결과:  0000 0000      결과값은 ‘0’ 나오게 됩니다.

EX2)  “7 - 4”
        7 - 4    →   7 + (-4)
      7: 0000 0111
    -4: 0000 0100(4) → 1111 1011 (4의 1의보수) → 1111 1100(4의 2의보수)
   결과 : 0000 0011   결과값은 ‘3’ 나오게 됩니다.

EX3)  “19 -10”
      19 - 10   →   19 + (-10)
    19: 0001 0011
  -10: 0000 1010(10) → 1111 0101(10의 1의보수) → 1111 0110(10의 2의보수)
결과 : 0000 1001  결과값은 ‘9’ 나오게 됩니다.

EX4)  “3 - 5”
      3 - 5   →   3 + (-5)
      3: 0000 0011
    -5: 0000 0101(5) → 1111 1010(5의 1의보수) → 1111 1011(5의 2의보수)
  결과: 1111 1110  결과값은 ‘-2’ 나오게 됩니다.

EX5)   “1 - 7”
      1 - 7   →   1 + (-7)
     1: 0000 0001
   -7: 0000 0111(7) → 1111 1000(7의 1의보수) → 1111 1001(7의 2의보수)
결과: 1111 1010  결과값은 ‘-6’ 나오게 됩니다.

 

반응형
반응형

📢설치환경

NodeJS : 윈도우

MongoDB : Centos6.10 (6.9 다음버전임)

(필자는 데이터베이스를 별도의 서버로 개발을 합니다)

 

📋MONGO DB 설치 (CentOS 6)

Mongo DB 설치

yum 으로 설치시 2.16 버전이 설치되고 RPM 설치시 4.0 버전으로 설치할수 있따.

yum install mongodb mongodb-server
rpm -ivh https://repo.mongodb.org/yum/redhat/6/mongodb-org/4.0/x86_64/RPMS/mongodb-org-server-4.0.7-1.el6.x86_64.rpm

yum 명령어로 설치할경우 mongodb 2.16 으로 설치가된다. node와 버전이 맞지않으면 아래와 같은 에러가 날수있다.

reports wire version 0, but this version of Node.js Driver requires at least 2 (MongoDB2.6).

 

📋 설치로그 2019-03-28

위처럼 설치하면 server는 깔리는대 client가 안깔려서 리눅스에서 mongo 명령어가 안먹힌다. 공식문서를 본 결과의 설치방법.

1. vi 편집기로 아래 글 을 넣어준다.

$ vi /etc/yum.repos.d/mongodb-org-4.0.repo

//아래 글을 복사해서 넣어준다.

[mongodb-org-4.0]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.0/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-4.0.asc

 

2. yum 으로 install 한다

yum install -y mongodb-org

 

Mongo DB 설치 확인

[root]# service mongod status
mongod is stopped
[root@ ~]# mongod --version
[root@ ~]# mongo --version
>
db version v4.0.7
git version: 1b82c812a9c0bbf6dc79d5400de9ea99e6ffa025
OpenSSL version: OpenSSL 1.0.1e-fips 11 Feb 2013
allocator: tcmalloc
modules: none
build environment:
    distmod: rhel62
    distarch: x86_64
    target_arch: x86_64

 

Mongo DB 서비스 시작

[root@zetawiki ~]# service mongod start //stop , restart
Starting mongod:                                           [  OK  ]

 

▼ Mongo DB 외부 접속 허용

아래 bind_ip 를 0.0.0.0 으로 바꿔주자

vi /etc/mongodb.conf

##
### Basic Defaults
##
bind_ip = 127.0.0.1   <<------ 이부분을 0.0.0.0 으로 바꿔주자
port = 27017
fork = true
pidfilepath = /var/run/mongodb/mongodb.pid
logpath = /var/log/mongodb/mongodb.log
dbpath =/var/lib/mongodb
journal = true
.........................

 

📋 NODE JS -MongoDB 연결

MongoDB 패키지 설치 (mongoose)

npm install mongoose

요약 : mongoose 는 ODM 이다. Spring 의 iBtis 같은놈

Mogoose는 Node.js와 MongoDB를 위한 ODM(Object Data Mapping) library이다. Java 기반의 Hibernate. iBatis 등의 ORM(Object Relational Mapping)과 유사한 개념이다.

ODM은 데이터베이스와 객체지향 프로그래밍 언어 사이 호환되지 않는 데이터를 변환하는 프로그래밍 기법입니다. 즉 MongoDB 에 있는 데이터를 여러분의 Application에서 JavaScript 객체로 사용 할 수 있도록 해줍니다.

ODM의 사용은 코드 구성이나 개발 편의성 측면에서 장점이 많다. 호환성이 없는 프로그래밍언어(JavaScript) Object와 MongoDB의 데이터를 Mapping하여 간편한 CRUD를 가능하게 한다.

필요에 따라 확장 및 변경이 가능한 자체 검증(Validation)과 타입 변환(Casting)이 가능하며 Express와 함께 사용하면 MVC Concept 구현이 용이하다.

▼ MongoDB 패키지 설치 (mongoose)

npm install dotenv

 

요약 : db.properties 같은 db환경설정 을 저장하고있는 파일

node.js 로 개발을 하면서, 포트, DB 관련 정보 등 전역으로 필요한 여러 정보들이 존재한다. node.js 에서는 dotenv를 통해 환경변수 파일을 외부에 만들고, 관리할 수 있다. 특히, 깃허브 등에 오픈소스로 프로젝트를 공개할때, DB 계정 정보를 소스코드 내에 하드코딩하지 않고, 외부 환경변수 파일에 작성하고, .gitignore 을 통해 제외하면 안전하다.

 

📋 MongoDB 연결 테스트

 정상 연결시 Connected to DB 가 콘솔 출력 , 에러시 에러로그와 같이 에러출력. 아래 파일을 node로 실행시키면 된다.

 
const mongoose = require("mongoose");
mongoose.connect("mongodb://ip주소:port/we-tube",
    {
        useNewUrlParser:true,
        useFindAndModify: false
    });

    const db = mongoose.connection;
    const handleOpen = () => console.log("Connected to DB");
    const handleError = error => console.log(`Error on DB Connection:${error}`);
    db.once("open",handleOpen);
    db.on("error",handleError);

 

📋 MongoDB 설치 경로

▼ 내용

mongodb의 설정파일은 /etc/mongod.conf 경로에 있고

init스크립트는 /etc/rc.d/init.d/mongod 에 있습니다.

데이터파일은 /var/lib/mongo 경로에 저장되고

로그파일은 /var/log/mongo 여기에.

 

📋 MongoDB PORT 사용중인지 확인

lsof -i :27017

 

📋 dotenv 설정

dotenv 로 url 을 별도의 파일로 뺴낼수 있다. 스프링의 properties 와 비슷

test.js

lsof -i :27017

 

ABCDEFG.env

 

MONGO_URL = "mongodb://121.66.142.174:27017/we-tube"

 

 

 

 

반응형

'데이터베이스 > Mongo DB' 카테고리의 다른 글

MongoDB - 기본 명령어  (0) 2022.01.07
반응형

📢MongoDB - 기본 명령어

MongoDB 는 JAVASCRIPT 기반으로 만들어진 NO-SQL 이다.

그래서 기존 알고있는 RDBS 랑은 명령어가 다르다.

SQL 은 Structured query language

MongoDB 는 document 기반 nosql db

📋MONGO DB 명령어 사용법

 

 몽고db 들어가기

mongo

 

▼ 현재 저장되있는 데이터베이스 이름 목록 확인

>show dbs
////커맨드 내용/////
admin    0.000GB
config   0.000GB
local    0.000GB
we-tube  0.000GB

 

▼ 도움말

>help

 

▼ 데이터베이스 접속 (사용)

use we-tube

 

▼ 데이터베이스에 현재 있는 모델 확인

 

 show collections

 

▼ 데이터베이스에 모델 내용 확인

db.[모델명].find({})

 

▼ 데이터베이스에 모델 삭제

> db.[모델명].remove({})

 

반응형

'데이터베이스 > Mongo DB' 카테고리의 다른 글

Mongo DB - MongoDB 설치법 NODE 연결방법  (0) 2022.01.07
반응형

📢FaceBook 으로 로그인하기 (passport)

 

📋페이스북 로그인 인증 만들기

https://developers.facebook.com/support

▼ 여기서 로그인후 내앱 -> 새앱 만들기

▼ 만들면 대시보드로 가지는데 거기서 제품추가 쪽에서 facebook 로그인 의 설정 클릭

▼ 다음 화면에서 원하는 서비스 클릭 (저는 웹)

▼ 나의 웹서버 url 주소를 적어준후 save 클릭 후 계속 클릭

▼ 2번도 다음 클릭 , 3번도 다음클릭 , 4번도 다음클릭

▼ 5번 까지 되면 앱 ID와 시크릿 코드가 생성 되었다.

▼ 이제 설정 -> 기본설정 클릭 후 앱 ID 와 앱 시크릿 코드를 소스에 복사하자

▼ 시크릿 코드는 보기를 눌러야 나온다 (FACEBOOK 비번 다시 넣어야함

▼그 이후 나는 .env 파일에 fb_id , fb_secret 라는 변수로 저장했다

FB_ID="facebook 앱 id"
FB_SECRET="facebook 앱 시크릿 코드"

 

 

📋passport - facebook 설치

▼ passport facebook 패키지를 설치해줘야 한다.

npm install passport-facebook

 

📋passport - facebook 로그인하기

▼ passport.js 에 아래와 같이 저장

 import FacebookStrategy from "passport-facebook";

 passport.use(
    new FacebookStrategy({
        clientID: process.env.FB_ID,
        clientSecret: process.env.FB_SECRET,
        callbackURL: `http://localhost:4000${routes.facebookCallback}`
      },facebookLoginCallback));

컨트롤러

const facebookLogin = passport.authenticate('facebook'); 
//passport로 facebook 으로 보내서 인증 확인

const facebookLoginCallback = (accessToken, refreshToken, profile , cb) =>{
    console.log(accessToken, refreshToken, profile , cb);
}
//facebook 의 user가 있는지 확인하고 계정을 찾아내거나 새로생성

const postFacebookLogin = (req,res) => {
    res.redirect(routes.home);
};
// 마지막은 인증에 성공했을때 redirect 해주는것

▼요약

1. 먼저 passport.js 의 로그인에 맞는 strategy 를 생성

2. 해당 앱에 맞는 id,pw 를 할당해주고 콜백 url 주소와 성공적으로 실행했을경우 실행할 콜백 함수를 같이 준다.

반응형

'프로그래밍 > NodeJS' 카테고리의 다른 글

NODE JS - ESlint  (0) 2022.01.07
NODE JS - Github 으로 로그인하기 (passport)  (0) 2022.01.05
NODE JS - pug(mixin) 사용법  (0) 2022.01.05
NODE JS - multer (파일 업로드)  (0) 2019.04.10
NODE JS - WEBPACK 설치와 사용법  (0) 2019.04.10
반응형

📢NODE JS -ESlint

 

📋ESlint 설치법

 

▼ESLint

ESLint는 자바스크립트 문법 중 에러가 있는 곳에 표시를 달아놓는 도구를 의미합니다.ESLint가 뜬 이유는 바로 확장성 때문입니다. 다양한 플러그인을 사용할 수 있기 때문에 새로운 규칙을 추가할 수 있고, 손쉽게 다른 회사나 사람의 설정을 도입할 수 있습니다.

npm install eslint
eslint --init
// 또는
node node_modules\eslint\bin\eslint.js --init

////////////아래 질의문 선택////////////////////
? How would you like to use ESLint? 
To check syntax, find problems, and enforce code style

? What type of modules does your project use? 
JavaScript modules (import/export)

? Which framework does your project use? 
None of these

? Where does your code run? (Press  to select,  to toggle all,  to invert selection)
Browser

? How would you like to define a style for your project? 
Use a popular style guide

? Which style guide do you want to follow? 
Airbnb (https://github.com/airbnb/javascript)

? What format do you want your config file to be in? 
JavaScript

? Would you like to install them now with npm? 
Yes

Window 에선 위와같이 떠서 이렇게 설치했다 (Window 7 OS 기준)

설치가 정상 완료되면 Package.json 에

  "devDependencies": {
    "eslint": "^5.16.0",
    "eslint-config-airbnb-base": "^13.1.0",
    "eslint-plugin-import": "^2.16.0",
    "nodemon": "^1.18.10"
  },

//이렇게 추가가 되어있을것이다

그리고 또한 .eslintrc.js 파일도 생겻을 것이다.

▼ 삭제방법

npm uninstall eslint

▼ prettier 설치방법

npm install eslint-plugin-prettier
npm install eslint-config-prettier

package.json 에서  dependencies 에 
"eslint-plugin-prettier" : "^3.0.0", 이런게 잇을텐데
이걸 devDependencies객체로 넣자 그후 npm install prettier -D
이렇게 명령어를 쳐서 설치하면 된다.

▼ 문법에러 안뜨게하기 (몇몇 에러들은 코딩스타일인데 걸리는이유가 있다.)

.eslintrc.js
module.exports = {
  extends: ["airbnb-base", "plugin:prettier/recommended"],
  rules: {
    "no-console": "off"
 }
};
//이렇게 에러의 이름이있는데 rules 에 에러이름을넣고 off를 넣어주면된다.

 

 

반응형

+ Recent posts