전체 글 (165)

05
23

1. 나만의 소수 공략법

  • 소수를 이중 반복문을 이용해 구해본다.
  • 결괏값은 문자열 '-'로 연결되어 있다.
  • 분명, 효율적인 방법은 아니다. 하지만, 이렇게 하면 답은 나온다. 꼭 리펙토링 해보아야 한다.
function LisPrimes(num) {
    let result = '2'; //소수는 1과 자기 자신을 제외한 숫자를 몫으로 가지지 않는 수이다. 이때, 문자열 '-' 과 연결해야 함을 생각하면 항상 들어갈 소수인 2는 빼둔다.
    for(let i = 3; i <= num; i++) { //3부터 소수가 될 수 있으니 3부터 i를 준다.
      let isPrime = true; //일단은 isPrime으로 이 수가 소수가 될 수 있음을 선언한다.
        for(let j = 2; j < i; j++) { 
          if(i % j === 0) { //3이상부터 num까지의 모든 숫자를 서로서로 다 나눠본다.
          isPrime = false; //이때, 나눠진다면 2또는 자기 자신이외의 숫자로 나눠서 떨어진다는 이야기, 즉 소수가 아니게 되므로 false로 빼버린다.
          }
        } if(isPrime) { //그래서 그 수가 소수라면
          result = result + '-' + i; //result에 문자열 '-'와 붙여 넣어준다.
        }
    } return result; //끝으로 리턴한다.
}

2. 가끔 틀리는 타입별 계산

'스트링 + 다른 타입' 의 경우, 스트링 뒤의 어떤 타입이 오든, 스트링 타입으로 바꿔서 더해 버린다.

  • NaN는 과연 숫자일까?
    • 숫자이다. 생각해 보면 참 이상한 경우다. NaN 말 그대로 Not a Number이지만 typeof를 해보면,
      분명 number 타입이다. 숫자가 아니라는 숫자라는 것이다!
    • undefined는 undefined라는 타입이다. 아직 결정나지 않은 것이다.

3. 선언과 호출 사이

가끔 선언을 해놓고 호출을 똑바로 못 해서 결과 값이 틀리는 경우가 종종 있다.
혹은 문자를 빼버리려 한다던가...타입별 구분을 잘 못하거나 해서 헷갈리는 경우도 있다.

  • [] : 배열이다. 안에 있는 엘리먼트를 말할 수 있다.
  • () : 변수를 넣을 곳이다.
  • 그냥 스트링 혹은 숫자 : 선언이 되어 있다면 그것일 것이고, 중간에 타입이 바뀌는 경우도 있다.
COMMENT
 
05
21

1. Git

보존하는 Version 관리를 하는 시스템이다.

  • 만약, 수정을 잘 못 해서 복구할 수 없거나 이미 저장해 버린 상태라면?
  • 심지어 여러 사람이 하나의 파일을 다 같이 작업 중이라면?? 근데 문제가 터진다면???
  • 과제할 때 만들던, 최종, 진짜 최종, 리얼 찐막 같은걸 계속 저장해 두는 것 과 같다.
    • 스냅숏 : 날짜별로 저장된 백업 파일
    • commut : 스냅숏을 만드는 활동
    • Gtihub 와는 다르다! : 깃허브는 깃을 이용한 저장소이다.
    • commut : 스냅샷을 만드는 활동
    • Gtihub 와는 다르다! : 깃허브는 깃을 이용한 저장소이다.

 즉, 깃을 이용해 백업 혹은 프로젝트를 저장하고, 그것을 깃 허브에 올려서,
누구든지 혹은 자신 스스로 환경에 구에 받지 않고 사용할 수 있게 한다.

  • Fork : 내가 프로젝트에 기여하고 싶다면? 그 프로젝트(오픈소스)를 내 원격 저장소로 가져와야 한다. 이것이 Fork다.
  • Clone : Fork한 소스코드를 내 컴퓨터로 가져온다 -Push : 나의 작업이 끝나면 다시 Push 해서 모두가 다시 사용할 수 있도록 원격 저장소로 옮겨 준다.
  • Pull : 또 변경사항이 있을때는 Pull 해서 내 컴퓨터로 가져올 수 도 있다. 위의 과정을 통해서 github애 서 받아온 clone 들을 내 컴퓨터로 가져올 수 있다.
    (git clone 깃허브에서 가져온 주소 명령어 사용)

2. Git 명령

  • git init : 폴더를 하나 지정해서, 이 폴더를 Repository로 지정함.
  • git config --global user.name "이름" : 사용자 이름을 정한다.
  • git config --global user.email "메일 주소" : 사용자 메일 주소를 정한다.
  • git status : 지금 Staging area 와 Unstaged files를 알아본다.
  • git restore 파일 이름 : Work space의 변경사항을 clone을 처음 받아온 상태로 돌린다.
  • git add. : 싹 다 Staging area로 옮겨라 (원래는. 대신 파일 이름)
  • git commit (메시지를 넣으려면? -m "메시지(메시지도 변수 이름 정하는 것과 마찬가지로 보기 의미 있게, 직관성 있게 작성한다.)" :
     말 그대로 커밋. 이 시점의 파일들을 저장한다.
  • git log : 이때까지 만든 commit들을 확인한다.
  • git reset 돌아갈 시점의 commit 코드 앞 6개 : 그 시점의 commit으로 돌아간다.
    • 이때, 코드 뒤에 --hard를 붙이면, 원래 있던 시점으로는 갈 수 없게 된다. 원래 있던 파일들의 기록 정보를 함께 버린다.
  • git revert 취소할 시점의 commit 코드 앞 6개 : 과거에 했던 기록을 보고 그것과 똑같은 새로운 commit을 만든다. (git rest과 비슷하긴 하나 조금 다르다.)
    • 이때, 코드 뒤에 HEAD^ 를 붙이면 바로 전의 commit을 취소할 수 있다.
  • git branch 만들 branch이름 : 지금의 시점에서 branch(가지)를 치겠다. 즉, 새로운 분기를 만들어 저장하겠다.
     (ex : 엔딩이 여러 개인 게임을 위해 분기점에 저장하는 것)
  • git checkout 넘어갈 branch이름 : 다른 branch로 이동하겠다.
  • git merge 가져올 branch이름 : 가져올 branch를 지금 있는 branch에 합친다.
  • git branch -D 지울 branch 이름 : 다 사용한 branch를 지운다.
  • git push origin master(거의다 기본 설정인 origin에 master) : 이제 다 작업되고 merge까지 마친
     'master' branch를 Remote Repository에 업로드한다.
  • git remote : 원격 repository를 확인할 수 있다.

3. 혼자 작업 시 merge 시 충돌.

 만약, 서로 다른 branch 사이에 같은 파일의 같은 코드를 다른 내용으로 수정했다면, 충돌이나 아예 branch 이동조차도 되지 않는다.
수정을 하고 옮기라고 경고창이 바꿔야 할 파일 이름과 함께 뜬다. VScode에서 보면 어떤 것이 충돌이 났는지 색깔로 확실히 볼 수 있다.

4. Github를 이용한 업로드

 여러 명이서 함께 작업하거나, 혼자서 작업을 하더라도 Remote Repository에 작업물을 업로드하는 것이 중요한데, 이것을 github에 하면 된다.

  • 어떻게 하는가?
    • 깃허브에 가서 Repository를 만들어준다.
    • 만든 Repository에 코드가 있다. 그것을 이용해 내 컴퓨터의 Repository를 등록하고 그때 뜨는 주소를 명령어 git remote add 주소로 등록까지 한다.
       (거의 rocal의 master branch가 원격의 origin이라는 master를 추적한다고 뜬다. 이것이 기본 설정인 이름들이라서 그렇다.)
    • github에 가서 확인한다.
    • 이제 git push origin master를 입력하면 github에 업로드가 된다.
    • 만약, 공개된 오픈 소스라도 유저 정보와 같이 함께 공유되서는 안 되는 내용이 있다면?
    • gitignore 파일을 만든다. 이후 add 해서 commit 하고 push 하면 github에서는 안 보이는 파일이 만들어진다!
    • 실행하면 패키지가 받아진다던지, 코드를 이용해 생산되는 것이라거나, 보안이 중요한 정보들을 이곳에 작성하면 된다.
    • 이미 골격이 있는 프로그래밍 프로젝트를 보면. gitignore파일을 볼 수 있다.
       내용은 깃에 올릴 필요가 없는 것이나 컴퓨터의 ID 세팅이 나와 있다고 한다.

5. 작업 주고받기

 remote repository와 local repository의 설정이 끝난 이후, remote add 상대 이름 주소로 repository를 연결해 준다.

  • 작업 주고받기에 쓰이는 명령어
    • git remote -v : local repository와 연결된 remote repository목록을 확인할 수 있다.
    • git fetch : 입력 후에 git status를 입력해 보면 github에 올라와 있는 상황을 알려준다.
    • git pull 원격명 브랜치 이름 : 업데이트된 내용을 github에 직접 가지 않고도 다운로드하여 준다. commit 내용도 동기화시켜 준다.

6. 여럿이서 작업 중에 merge와 pull로 인한 충돌

 예를 들어, 이미 A라는 사람이 어떤 commit을 받아 수정하고 push까지 마쳤는데, B는 그것을 pull 받기 전에 이미 고쳐 버렸다. 이럴 때 충돌이 일어난다.
 혹은 혼자 작업할 때처럼 같은 부분을 고쳤을 때도 마찬가지.

이럴 때는 알아서 합의를 보고 수정한다. 이후 add 하고 commit 하고 push 해서 업로드까지 하면 된다.

몹시 편한 기능이다. 하지만 사용할 때 오류가 난다면 상대에게 민폐가 될 수 있기도 하다.
그러므로 혼자서 연습을 많이 해 보는 것이 좋겠다.

코드를 다룰 때 고민하는 시간을 줄이는 것이 좋겠다. 그 시간에 뭔가 적으면서 답에 가까워지면서 바로 틀리고
다시 수정하는 방법이 가장 빠르게 실력을 늘려가는 방법이라고 한다. 그리고 물론, 정답은 계속 최대한 안 보는 것이 좋겠다.
주말 동안 다시 한번 이중 반복문의 소수 구하는 방법을 정리할 예정이다. 이제 이중 반복문도 조건문처럼
익숙하게 사용은 할 수 있는데

소수만 나오면 너무 헷갈린다. 조금 더 매달려 봐야겠다.

'Coding > Today I Learned' 카테고리의 다른 글

2021.05.23(Sun.) <문자열 가장 마지막 자르기>  (0) 2021.05.23
2021.05.23(Sat.) <소수 공략법>  (0) 2021.05.23
2021.05.20(Thu.) <CLI와 Node.js>  (0) 2021.05.20
2021.05.19(Wed.)  (0) 2021.05.20
2021.05.18(Tue.)  (0) 2021.05.18
COMMENT
 
05
20

1. CLI

  • CLI는 화면에 표시되는 GUI와는 다르게 명령어들로 직접 컴퓨터에게 명령을 내리는 것을 뜻한다.
  • 처음 터미널을 사용하게 되면 프롬프트(Prompt)가 반짝이며, 그곳에 명령을 입력하게 된다.
  • 이동과 관련한 명령들
    • pwd : 지금 내가 있는 곳은 어디일까?
    • ls : 지금의 장소에 있는 파일 리스트를 보여줘! (-l or -al ir -a : 자세한 권한까지 보여줘!)
    • cd 경로 : 다음 경로로 가자(한 폴더씩만 건너뛸 수 있다.)
    • mkdir 이름 : '이름'을 가진 폴더를 만들어줘
    • cat 파일 이름 : 파일의 내용을 보여줘
    • nautilus : GUI로 보여줘 (맥은 open)
    • touch 파일 이름 : '파일이름'으로 파일을 만들어줘
    • rm 파일 이름 : '파일 이름'을 삭제한다.
      • 폴더를 삭제할때는 rm -r(recursive) f(force)를 뒤에 붙여준다. 권한을 묻지도 따지지도 않고 삭제된다.
         매우 강한 명령으로 중요한 것도 강제로 삭제시키기 때문에 주의를 요한다.
    • mv '파일 이름' 경로 : '파일 이름'을 경로로 옮긴다.
      • 컴퓨터에서 파일을 옮기는 방법은, 파일 내용을 잠시 가지고 있다가, 원래 있던 파일을 지우고
         설정한 경로에 파일을 저장하는 순으로 이루어진다. 그러므로, mv를 이용하면 원래 있던 파일을 이름을 바꾸거나 하는
         원본 파일의 수정도 할 수 있게 된다.
        • cp '파일 이름' '복사할 파일 이름' : '파일 이름'을 '복사할 파일 이름'으로 복제한다.
    • 마찬가지로, 폴더를 복사할때는 상위 권한이 필요하다.

2. 권한

  • 헤킹과 실수로 파일이 손실되는 것을 막기 위해 '권한'을 부여해 해당 유저에 맞게 할 수 있는 행동의 범위를 지정해두었다.
     그래서 알맞는 권한( sudo처럼)에 따라 행동이 제약이 있다.
  • whoami : 현재 로그인된 사용자는?
    • sudo : 관리자의 권한을 얻는다.

3. 경로

  • 절대경로 : 위치상의 모든 폴더를 다 표시한 것.' /'으로 폴더 사이를 나눈다.
  • 상대 경로 : 특정한 파일이나 폴더의 위치를 통해 경로를 나타낼 수 있다. 현재의 폴더는 '.'이며, 그 상위 폴더는 '..'이다.
     즉, 내가 있는 폴더의 이름을 몰라도 이전 폴더로 돌아갈 수 있는 응용이 가능하다. 복사나 이동도 마찬가지.

4. 텍스트 에디터

  • 텍스트를 원격으로 편집할 수 있는 것으로, 'nano'커멘드를 사용해서 실행시킬 수 있다.
    • 실행시키고 나면 아래에 다양한 커멘드들이 있다.
    • 아래 창에서 보이지는 않지만 ctrl + o 키를 누르면 파일을 닫지 않고도 저장할 수 있다.

5. 패키지와 패키지 매니저

  • 어떠한 파일을 실행시키기 위해서는 그에 맞는 몇 가지 재료들이 필요하다.
    • 프로그램의 파일
    • 프로그램의 설치 파일
    • 프로그램의 정보
    • 프로그램을 위한 설명서
  • 이것들이 다 따로 돌아다니면 파일들 옮기거나 수정할 때 엄청난 추가 작업들이 필요할 것이다.
     이를 막기 위해 이것을 한 번에 묶어 '패키지'의 형태로 공유하게 된다.
  • 우분투에는 기본적으로 'apt' 패키지 매니저가 있다. (맥은 'brew') 이들은 각종 패키지들을 목록을 갱신하거나, (sudo update)
     설치하고, (sudo install) 버전을 업그레이드하고, (sudo apt upgrade) 설치된 패키지를 확인하며, (apt list --installed) 삭제한다(sudo apt remove).
    • 거의 설치, 삭제 등의 확인 이외의 명령어들은 관리자 권한이 필요하다.
    • 무언가 잘 못 되고 있으면 취소하면 된다. ctri + c로 가능하다.

6. 런타임(runtime)

  • 프로그램이 동작할 '필드'를 정해준다.
  • 우리는 node.js를 이용해서 자바스크립트의 파일의 런타임을 만들어 줄 수 있다.
  • 설치된 런타임의 버전을 관리하기 위해 'nvm'을 사용한다.
    • 버전이 다르면 실행 시 오류가 있을 수 있기 때문에 원래 있던 버전을 삭제하고 다시 알맞은 버전을 다운로드하는 수고를 덜기 위해,
       간단하게 nvm install '바꾸고 싶은 버전'을 사용한다.

7. node.js

  • node '파일 이름'으로 node환경에서 파일을 실행시킬 수 있다.

이때, 프로그램에 필요한 설명서가 package.json에 있다.
 (이것은 '설명서'일 분이다. 진짜 프로그램을 실행시키기 위해 필요한 모듈은 node_modules에 따로 존재한다.)

  • package.json 읽는 법
    • devDependencies : 오직, 프로그램을 개발을 위한 모듈. 실행과는 관계없다(npm install '모듈 이름' --save-dev로 설치하며,
       뒤에 명령어 덕분에 자동으로 devDependencies에 추가된다. )
    • dependency : 실행에 필요한 모듈. (npm install '모듈 이름'으로 설치하며 마찬가지로, 자동으로 dependency에 추가됨.)
  • scripts 읽는 법
    • 사용 가능한 명령어가 적혀 있다. npm run <스크립트 이름>으로 실행한다.
터미널만 보고도 적어도 이동은 완벽하게 할 수 있어야 한다.
당황하지 않도록, Git 사용을 해보면서 적응하자.

'Coding > Today I Learned' 카테고리의 다른 글

2021.05.23(Sat.) <소수 공략법>  (0) 2021.05.23
2021.05.21(Fri.) <Git 정리>  (0) 2021.05.21
2021.05.19(Wed.)  (0) 2021.05.20
2021.05.18(Tue.)  (0) 2021.05.18
2021.05.17(Mon.) <기초 CSS>  (0) 2021.05.17
COMMENT
 
05
20

1. str[] 와 indexOf('str')의 다양한 사용

  • 배열안의 문자열을 직접 찾아 낼 수 있으며, 그 문자열이 몇번 들어 있는가를 알 수 있는 메서드 들이다.
  • 둘다 문자를 직접적으로 바꿔줄 수는 없다. (immutable)
    • Ex)
      • str[a] + str[b]를 여러번 해서, 모든 경우의 수의 문자를 만들어야 한다.
      • ab,aa,bb,ba이런 4개의 문자열을 얻을 수 있다.
      • 이때, 이 문자열들을 ,(쉼포)로 묶는법은?
      • 이런식으로 마지막에 쉼표를 잘라준다.
let result = '';
// <생략>
result = result + (str[a] + str[b]) + ',';
return result.slice(0, result.length - 1);

2. 문자열의 마지막에 , 넣기

  • Ex)
    • str[a] + str[b]를 여러번 해서, 모든 경우의 수의 문자를 만들어야 한다.
    • ab,aa,bb,ba이런 4개의 문자열을 얻을 수 있다.
    • 이때, 이 문자열들을 ,(쉼포)로 묶는법은?
    • 이런식으로 마지막에 쉼표를 잘라준다. 
let result = ''; 
// <생략> 
result = result + (str[a] + str[b]) + ',';
return result.slice(0, result.length - 1);

 

'Coding > Today I Learned' 카테고리의 다른 글

2021.05.21(Fri.) <Git 정리>  (0) 2021.05.21
2021.05.20(Thu.) <CLI와 Node.js>  (0) 2021.05.20
2021.05.18(Tue.)  (0) 2021.05.18
2021.05.17(Mon.) <기초 CSS>  (0) 2021.05.17
2021.05.16(Sun.)  (0) 2021.05.16
COMMENT