728x90

-맥 터미널 기준으로 작성되었습니다.-

 

터미널에서 PATH나 여타 설정을 할 필요가 있을 때,

zshrcbashrc 등의 파일을 사용한다.

또, 도커나 여타 설정 파일들을 터미널에서 간단히 확인하고자 할때 

우리는 보통 cat ${원하는 파일}, vim ${원하는 파일}  등의 명령어를 사용해서 파일을 체크한다.

물론 사용할때마다 눈이 아프다...

하얗게만 꾸며져 있는 이 터미널...

.... 그저 검은 땅에 내린 눈 ...

 

이런 삭막한 터미널은 그만.

바~로 프로 출신들의 비기를 사용할 시간.

bat 명령어 하나만 있으면 해결할 수 있다.

일단 기본적으로는 내장되어 있지는 않아서 다운로드 해주어야 한다.

$ brew install bat

// m1등에서 Rosetta2 관련 에러가 발생하면 아래 명령어로 실행 
$ arch -arm64 brew install bar

 

 

그러고 나서는 다른 것과 같이 써주면 된다.

   bat ${명령어}   

 

???

내가 아까 vim 과 cat으로 보던 그 파일 맞나 싶을꺼다.

알록달록 전혀 다른 비주얼이 기다리고 있다.

 

라인 넘버와 export 등의 색 표시까지....

진짜 깔끔하다. 그저 GOAT...

 

보기 좋게 코딩하쟈 레쯔고우.

 

 

728x90
728x90

 

두 함수 모두 객체에서 특정 key 값이 있는지를 확인할 수 있다.

hasOwnProperty
hasOwn

 

위 처럼 객체가 해당 키 값을 가지고 있으면 true를 반환해 준다.

심지어 null 값이나 객체를 넣어도 오류 없이 false를 반환해 준다. (예외 처리 안해도 된다! 네이스!!)

 

그러면.. 두 함수 모두 기능이 똑같으니까 입맛대로 쓰면 될까요..?

노오옵!! 앞으로는 hasOwn를 쓰도록!

 

hasOwn이 hasOwnProperty의 상위호환이기 때문이다.

hasOwnProperty가 문제가 있을 때가 있다. 

 

1. Object.create(null) 로 생성 시에 접근할 수 없다.

접근이 불가

2. 객체 내에 선언 시에 덮어쓸 수 없다.

덮어쓰기 안되는 hasOwnProperty

 

본연의 기능을 하는 hasOwn

 

 

 


 

개인적으로 hasOwnProperty를 사용할 때,

오류가 나는 두 경우를 직접 만나지는 못해서 굳이..? 라는 생각도 있지만,

참고 링크 상단에 보이듯

hasOwn()hasOwnProperty()를 대체하는것을 목표로 했다고 한다.

그렇다면.. 사용해 주는 방향으로 버릇을 바꾸는게 좋을 것 같다.

 

참고 : https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwn

 

728x90
728x90

 

.gitignore 는 git 을 관리하면서 올리지 않을 파일들을 관리한다.

해당 파일에 명시된 파일, 폴더들은 git에 올라가지 않는다.

그런데 만약 해당 파일을 만들기 전에

ignore 되어야할 파일들이 이미 push 되서 올라갔다면 어찌해야할까?

그 파일들은 그냥 나두면 없어지지 않고 유지된 채로 존재한다.

일일이 하나씩 지워야 할까?

 

아래 명령어를 사용하면 gitignore가 반영시켜서 push를 할 수 있다.

 

git rm -r --cached
git add .
git commit -m "yout commit message"
git push

 

 

위 과정을 통해서 .gitignore 파일을 push된 브랜치에 적용시켜 버릴 수 있다!

이렇게 하면 일일이 지우는 과정을 생략할 수 있다.

 

728x90
728x90

 

node의 버전은 프로젝트 마다 중요하다.

충족시키지 못하면 아래와 같은 에러가 나오거나 노드 모듈 실패로 이어진다.

'you are using Node.js...'

 

 

그렇기에 프로젝트 별로 잘 관리해줄 필요성이 있다.

근데 어디다가 적어둘까? 뭐 메모장에 다 적어라도 둘까?

NOPE

 

프로출신들은  

.nvmrc 파일을 생성함으로

노드 버전 관리를 끝내버린다.

 

일단,

.nvmrc파일을 루트에 만들고 버전을 써준다.

 

'v18.19.0' 만 추가하면 끝.

이후에 터미널에 아래와 같이 실행한다.

$ nvm use

 

 

 

해당 명령어를 실행하면

.nvmrc에 적은 노드 버전으로

노드 버전이 바로 바뀐다! 

EZ!!

 

728x90
728x90

 

 

평소같이 빌드 버전을 추가하여 젠킨스를 돌렸는데

ERROR: Step ‘Git Publisher’ failed: Tag "  " already exists

해당 에러로 인해서 빌드가 실패했다.

태그가 이미 있다라.. 

 

근데 태그가 뭐지?

 

태그(Tag)

태그는 프로젝트 개발과정에서 중요한 체크포인트를 표시하기 위해서 사용된다.

예를 들어 릴리즈 버전을 태그에 넣어서 표시해둔다.

그러하면 나중에 어느 커밋까지 릴리즈가 되었는지 한눈에 볼 수 있다!!

 

Git, 혹은 Gitlab에서 쉽게 확인해 볼 수 있다.

commit들을 볼 수 있는 곳에서 태그가 달려있는것을 확인할 수 있고,

tag 탭에서는 해당 태그들만 모아서 확인할 수 있다.

 

여기서 tag 탭에 들어가면 tag들을 한눈에 모아볼 수 있다.

여기서!!

젠킨스에서 새로운 태그를 만드는 과정에서

이미 존재하는 태그 네이밍을 사용하려고 해서 발생한 문제이다.

해당 파라미터 값을 수정해주고 다시 빌드해준다면,

문제 없이 빌드가 된다!

 

본인의 경우 근본적인 원인은

젠킨스 해당 레포이름을 이전 레포를 지우고 덮어쓰는 과정에서,

이전 태그들이 남아있어서 중복오류가 나타난 상황이었다.

해당 태그 번호를 피해서 빌드하고 나니 문제 없이 빌드가 진행되었다. 

 

태그는 중복 불가!!!

 

728x90
728x90

새로운 프로젝트를 npm install을 실행했는데,

설치 도중에

ModuleNotFoundError: No module named 'distutils'...

의 에러가 발생했다. 

왜 또 이런 시련을..  정말 npm node 이 놈의 버전들이 항상 어지럽게 한다.

 

원인은 파이썬 버전에 있었다.

disutils module을 파이썬 3.12 버전에서 지원하지 않는 다는것.. 

3.10에서 deprecated, 3.12에서 remove 되었다고 한다..

 

그래서 깔끔하게 파이썬 버전을 다운그레이드 하면

해당 문제 없이 설치를 계속 진행할 수 있다!!

 

setuptools 설치로도 해결가능하다고 한다!

참고 : https://stackoverflow.com/questions/77233855/why-did-i-get-an-error-modulenotfounderror-no-module-named-distutils

 


 

여담으로 

npm install에서 해당 문제가 있었는데...

yarn install 하니까 아무 문제없이.. 잘 설치 되었다는... 쓰읍

728x90
728x90

하나의 일감을 진행할 때마다 깃 브랜치를 새로 따서 작업을 진행한다.

여유 있을 때는 일감을 끝내고 바로 브랜치를 지워주지만

일감이 밀리고 바쁜 시기에는 매번 지워주지 못하는 경우가 생긴다.

그러고 나면... 브랜치들이 여러 개씩 쌓여 있다.

 

git branch -D branch1001 ......  벌써 어지럽다

 

하지만 프로출신 개발자들은 명령어 한줄로 

깔끔하게 원하는 브랜치들을 지워버린다. 

 

오늘의 코딩 비기 제1장🌟

 

$ git branch -D `git branch --list 'branch*'`

 

git branch -D 이후에 ` ` 값을 이용하여 삭제할 브랜치를 변수로 지정할 수 있다.

이 변수로 git branch --list 를 활용하는 것, list 뒤에는 어떤 형식의 브랜치를

삭제해 줄지 정하면 된다.

 

해당 부분에 값을 넣으면 아래와 같이 된다!!

branch* branch로 시작하는 브랜치 삭제
*1001 ~1001로 끝나는 브랜치 삭제
*anch* ~anch~ 인 브랜치 삭제

 

그럼 위에 노란 명령어를 실행하면~?

 

깔~끔하게

branch로 시작하는 모든 브랜치를 삭제해 준다.

고로 main 브랜치 하나만 남는다.. 진짜 미뗬다..

 

물론 어떤 일정한 형식이 있는 브랜치 그룹만

해당 방식으로 쉽게 지울 수 있다.

그럼.. 일정한 형식이 없다면,,?

 

오늘의 코딩 비기 제2장🌟

 

겁나 빠른 노가다 타이핑 두다다다다다다다다다닫

 

끝.

 

프로출신 개발자들의 도움 : https://stackoverflow.com/questions/3670355/can-you-delete-multiple-branches-in-one-command-with-git

728x90
728x90

 

오늘도 제 입맛대로 정리하는 

(js와 친근한 내용만ㅎ)

vscode 업데이트!

바로 드루가시죠.

 

 

1. Activity Bar 위치 이동 설정 추가

 

기존 왼쪽에 붙어있는 일명 activity bar,

상단으로 옮길 수 있다는 사실을 알고 있었나요?

이번에 추가적으로 하단으로도 이동이 가능하다고 하는군요!

하단으로 설정한 모습

근데.. 확실히 뭔가 어색해요..

저건 그냥 왼쪽에 붙어있는 게..

 

 

2. source control에서 부분적 revert 추가

 

해당 탭에서 변경된 파일을 누르면 이제 변화를 부분적으로 수정할 수 있는 버튼이 추가되었어요

 

이렇게 차이를 비교하는 두 개의 윈도우 사이에 버튼이 생겼어요!

앞으로 이전의 코드와 좀 더 손쉽게 비교하고 수정할 수 있을 것 같아요.

 

 

3. VScode에  Typescript 5.4 버전이 반영

자세한 5.4 버전 내용은 하단에!

https://devblogs.microsoft.com/typescript/announcing-typescript-5-4/

 

 

 

4. markdown 작업 시 이미지 추가 간소화

마크다운 작업할 때 이미지를 좌측 파일 목록에서 바로 끌어올 수 있게 되었어요!

오우 살짝 충격...

나중엔 그냥 js 파일에도 이미지를 끌어 쓰는 날이..?

 

 

 


 

조금 관심을 가지고 나니

vscode 도 계속해서 변화해가고 있는 게 느껴지지 않나요!?

우리의 IDE에게 소중한 관심 한 덩이씩 어떤가요~

728x90
728x90

 

어떤 로직으로 짠 코드가 더 빠른가.

개발자에게 흥미를 유발시킬 수 없는 소재 아닌가. 두근두근

코딩테스트를 준비 할때도 알고리즘에 따라

속도를 비교할 수 있는 좋은 방법이지 싶다.

 

 

두 가지 방법을 소개할 예정이다.

EZ 버전쌈뽕한 버전.

 

 

 

console.time()  console.timeEnd() 사용하기

 

위 처럼 해두고 node ${파일명} 해주면

 

얼마나 걸렸는지 빠르게 보여준다.

 

Benchmark js 사용해보기

좀 쌈뽕한 방법이다. 

바로 benchmark js 를 사용해보는 것

설명을 그대로 변역해보면

"고해상도 타이머를 지원하고 통계적으로 중요한 결과를 반환하는 강력한 벤치마킹 라이브러리"

이다.

야무지게 비교해준다고 한다.

 

사용방법은 

npm install benchmark 로 다운받아주고

아래와 같은 코드를 돌리면 끝!

 

const Benchmark = require("benchmark");
const suite = new Benchmark.Suite();

suite
  // 비교함수 A
  .add("convertAndAdd", function () {
    convertAndAdd("123", "123");
  })
  // 비교함수 B
  .add("digitByDigitAddition", function () {
    digitByDigitAddition("123", "123");
  })
  // Add listeners
  .on("cycle", function (event) {
    console.log(String(event.target));
  })
  // 끝나면 아래와 같이 결과 표시
  .on("complete", function () {
    console.log("Fastest is " + this.filter("fastest").map("name"));
  })
  //  Run asynchronously
  .run({ async: true });

 

.add 를 통해서 함수를 추가해준다.

.on('cycle') 은 listener 역할을 하고 끝나면 결과를 표시해주는 역할을 할 수 있다.

.on('complete') 는 전체 비교가 다 끝나고 결과를 보여준다. this는 객체로 비교 함수들 각각의 값을 가지고 있다.

위의 결과를 보면

 

 

두 함수의 속도를 매우 자세히 확인해준다.

timeEnd 보다 시간은 조금 걸리지만 괜히 좀 더 믿음이 가는 결과물이다.

 

좀더 정밀한 방법이 꼭 필요할 때 Benchmark 라이브러리가 유용하게 쓰이지 않을까 싶다!

728x90
728x90

특별한 풀이까지는 아니고, 차근차근 풀어가는 과정을 담아보았습니다.

프로그래머스 답 제출 후에 보면

번뜩이는 풀이들도 있으니 한번쯤 보면서 이런 방법들도 있구나 찾아보면 좋을 것 같습니다.

 

문제는 아래와 같습니다.

 

문제 설명

어떤 게임에는 붕대 감기라는 기술이 있습니다. 붕대 감기는 t초 동안 붕대를 감으면서 1초마다 x만큼의 체력을 회복합니다. t초 연속으로 붕대를 감는 데 성공한다면 y만큼의 체력을 추가로 회복합니다. 게임 캐릭터에는 최대 체력이 존재해 현재 체력이 최대 체력보다 커지는 것은 불가능합니다. 기술을 쓰는 도중 몬스터에게 공격을 당하면 기술이 취소되고, 공격을 당하는 순간에는 체력을 회복할 수 없습니다. 몬스터에게 공격당해 기술이 취소당하거나 기술이 끝나면 그 즉시 붕대 감기를 다시 사용하며, 연속 성공 시간이 0으로 초기화됩니다. 몬스터의 공격을 받으면 정해진 피해량만큼 현재 체력이 줄어듭니다. 이때, 현재 체력이 0 이하가 되면 캐릭터가 죽으며 더 이상 체력을 회복할 수 없습니다. 당신은 붕대감기 기술의 정보, 캐릭터가 가진 최대 체력과 몬스터의 공격 패턴이 주어질 때 캐릭터가 끝까지 생존할 수 있는지 궁금합니다. 붕대 감기 기술의 시전 시간, 1초당 회복량, 추가 회복량을 담은 1차원 정수 배열 bandage와 최대 체력을 의미하는 정수 health, 몬스터의 공격 시간과 피해량을 담은 2차원 정수 배열 attacks가 매개변수로 주어집니다. 모든 공격이 끝난 직후 남은 체력을 return 하도solution 함수를 완성해 주세요. 만약 몬스터의 공격을 받고 캐릭터의 체력이 0 이하가 되어 죽는다면 -1을 return 해주세요.

 

풀이

1. 필요한 변수 정리

필요한 값들을 먼저 정리합니다. 주어진 값들을 통해서 쓰기 편하도록 정리해둡니다.

    const maxHealth = health;
    const [time, healPerSec, additionalHeal] = bandage;
    const attackTime = []; // 공격시기
    const attackDmg = []; // 공격 데미지
    var success = 0;		// 연속성공
    var attackCount = 0;	// n번째 공격

    attacks.forEach((item)=>{
        attackTime.push(item[0])
        attackDmg.push(item[1])
    })

 

2. 0초부터 하나씩 올라가는 루프 함수인 for 사용합니다

공격이 있을 때와 공격이 없을때를 나누어서 로직을 구성합니다.

공격이 있을때는 health가 0이 되거나 혹은 모든 공격이 끝났을 때 해당 for 문을 벗어납니다.

for(var i=0; i <= attackTime[attackTime.length-1]; i++){
        if(i === attackTime[attackCount]){
            health = health - attackDmg[attackCount];
            if(health <= 0) return -1
            if(attackCount === attackTime.length-1) break;
            attackCount++;
            success = 0;
        } else {
             success++;
            health = Math.min(health + healPerSec, maxHealth);
            if(success === time) {
                health = Math.min(health + additionalHeal, maxHealth);
                success = 0;
            }

        }
    }

 

그리고 health 값을 리턴해주면 끝납니다!!

 

저 같은 경우에는 중간에 전체 공격이 끝났을때 break 해주는 조건을 빼먹고 했더니,

테스트는 통과 하지만 제출 후 채점에서는 박살나더군요..

 

무튼, 특별하지는 않지만 머리속에 플로우를 그대로 편안하게 옮겨보았습니다.

번뜩이는 풀이들을 보고 공부도 필요하고, 이렇게 차분하게 흐름 따라서 짜는 연습도 좋은것 같습니다 :)

또 긴장하는 코테에서 번뜩이기 쉽지 않을 것 같기도ㅎ

728x90

+ Recent posts