목차

반응형

평소에 SCP 세계관을 좋아해서 사이렌헤드 피규어를 주문해봤다.

종류가 되게 다양했는데 사이렌헤드의 경우 공식적인 설정이 없다 보니 그만큼 다양한 형태로 제작을 해서 파는 것 같다.

왼쪽은 머리가 2개인 일반적인 제품, 가운데는 머리가 3개 달리고 가장 비싼 제품, 오른쪽은 흰색으로 되어있다.

 

 

동영상을 보면 알겠지만 굉장히 신축성 있고 느낌있어서 가격대가 있는 상품이지만 그만큼 퀄리티가 좋다.

 

 

상품을 구매하면 피규어를 고정하는 받침대와 같이 온다.

 

이런 식으로 나란히 배치해보았다.

 

 

가격은 배송비 3,000원에 가격 35,000원정도 한다.

좀 비싸긴 한데 입 부분에 대한 묘사라던지 핏자국이나 여러모로 퀄리티는 만족스럽다.

 

 

집에서는 찍어도 분위기가 안 살 것 같아서 차에서 한번 찍어봤다.

워낙 어두운 느낌의 피규어다보니 검은 계열, 메탈 느낌의 장소를 찾아서 다시 한번 찍어봐야겠다.

반응형
반응형

1. 개요

2. 사용방법

3. 주의사항

 

 

 

 

 

1. 개요

개발하다 보면 아마 가장 많이 마주치는 에러가 null이거나 undefiend인 값에서 무언가를 하려고 할 때 발생하는 null exception 에러일 것이다.

그래서 어린 시절에는 if문을 듬뿍 활용하여 null인 경우 아닌 경우 나눠서 처리하고 그랬는데 이걸 엄청 편하게 하는 방법이 있다.

처음 사용할 때는 좀 뭔가 위험하지 않을까 걱정도 되는데 잘 사용하다 보면 편리하며 문제가 없었다.

이번 포스트에서 다루고자 하는 기능의 키워드는 Optional Chaining라고 부른다.

 

2. 사용방법

공식 문서에서 떠왔다.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Optional_chaining

 

 

단순하다. ?를 문제가 생길 것 같은 구문에서 적절히 삽입해주면 된다.

myMap에 bar라는 프로퍼티가 없는 경우 일반적으로 myMap.get("bar").name을 하면 오류가 발생한다.

하지만 ?를 사용하여 myMap.get("bar")?.name를 호출하면 해당 값이 undefiend, null 인 시점에서 뒤의 구문을 진행하지 않고 종료한다.

 

 

조금 더 본격적으로 쓰면 위처럼 가능하다. 구문 사이사이에 물음표가 계속 들어가 있다.

 

 

사용법은 이 정도면 충분할 것이라고 생각한다.

 

 

3. 주의사항

node에서는 일반적으로 v14 이상부터 지원한다.

javascript의 문법이지만 node에서는 일반적으로 14버전부터 지원한다. 나도 이거 쓰려고 버전업했다.

 

많이 써도 되지만 잘 알고 쓰자.

a?.c?.b?.c?.d 이런식으로 습관성 백무빙마냥 애매해서 잘 모르겠으니 그냥 에러안나면 장땡이지 하고 막 쓰는 것은 아니라고 생각한다.

try catch를 쓸때 에러가 나는 부분 try catch 해놓고 아무런 표시를 안해놨다가 나중에 에러가 발생하는 것 조차 넘어가버리는 큰 상황이 되듯이 비어있으면 안되는 상황에서는 에러를 내 주는 것이 맞다.

에러를 회피하기보다는 의도적으로 비어있을 수 있는 값이라서 if를 쓰기 귀찮으니 ?를 사용하는 느낌이라고 해야할까...?

 

뒤 구문에 영향을 줄지 확인하자

?구문을 쓴다고 해서 만사 ok가 아니다. ? 연산자를 사용하여 당장 한줄의 라인에서는 문제없이 넘어갔지만 이번에 생기지 않는 에러로 인하여 바로 다음줄, 다다음줄, 또는 먼 뒤의 로직에서 해당 구문이 실행되지 않아서 발생하는 오류가 없는지도 파악해서 처리하자.

반응형
반응형

상황

git pull 명령어 사용 시 아래 문구가 뜨면서 작동안한다.

Support for password authentication was removed on August 13, 2021. Please use a personal access token instead.

과거 몇달전부터 username과 password로 인증하던 나에게 계속 경고하더니

git에서 8월 13일 이후로 아예 token 아니면 안되도록 바꿔버렸다.

 

이미 있는글인데 원하는 해결방법 부분만 깔쌈하게 올리는 사람이 없어서 내가 정리해서 올린다.

linux 기준이니 참고

 

 

해결방법

1. token 발급

 

아래 링크 들어간다. 또는 깃에서 setting > Developer settings > personal access tokens 이동

https://github.com/settings/tokens

 

GitHub: Where the world builds software

GitHub is where over 65 million developers shape the future of software, together. Contribute to the open source community, manage your Git repositories, review code like a pro, track bugs and feat...

github.com

 

generate new token 클릭

 

 

1. 해당 토큰의 닉네임

2. 토큰 만료기간

3. 토큰의 권한

그냥 권한 전부 주고 만료 안되도록 했다. 설정하고 하단 generate token 클릭

 

그럼 토큰이 나오는데 다시 조회 불가능하니 복사해서 잘 관리하라고 한다.

 

2. 발급받은 토큰 프로젝트에 설정

이게 제일 중요한데 잘써놓은 사람이 없어서 이 부분을 잘 작성해보겠다. 한 20분인가 30분 노가다 했다.

 

토큰을 사용하기 위한 상황 중 한 가지 remote를 set 하는 경우다.

양식은 아래와 같다고 한다.

 

git remote set-url origin https://<githubtoken>@github.com/<username>/<repositoryname>.git

 

만약 내 유저네임이 ajhpipe고 토큰이 ghp_13574763TEMb7oe44jy24 이고

git repo의 경로는 https://github.com/ 10moment/tenmoment-front.git이라고 하자

그러면 설정하기 위한 명령어는 다음과 같다.

 

git remote set-url origin https://ghp_13574763TEMb7oe44jy24@github.com/10moment/tenmoment-front.git

저기서 말하는 username은 내가 아니라 프로젝트 생성자의 username이니까 헷갈리지 말고 토큰과 깃 repo 경로 정보만 사용해서 명령어를 작성하면 된다.

 

참조

https://stackoverflow.com/questions/68775869/support-for-password-authentication-was-removed-please-use-a-personal-access-to

 

그럼 개발자들이여 다시 삽질하러 가자 ㅎㅇㅌ

반응형
반응형

오류

axios를 한두번 요청하는 경우에는 문제없지만 몇천번의 요청을 하는 경우 한두번꼴로 request 이후 어떠한 결과값도 반환하지 않고 그대로 홀딩되버리는 경우가 발생한다.

당연히 timeout도 옵션값에 넣었는데 timeout 작동도 잘 하지만 그냥 그게 문제가 아니다. ㅇㅇ

정말 귀신이 곡할 노릇이라서 axios 라이브러리가 문제라고 생각하기도 쉽지 않았다.

여기까지 찾아 들어온 당신 꽤 하는거다.

보상으로 어렵게 얻어낸 해결 방법을 공유하도록 하겠다.

 

원인

원인은 잘 모르겠다. 아래에도 비슷한 상황이 있는데 흔한 케이스도 아니고 어쩌면 라이브러리 버전 문제일까 싶기도 한데 딱히 찾아봐도 뭐가 안나왔다.

https://github.com/axios/axios/issues/459

 

해결

해결방법은 axios의 timeout을 사용하지말고 자체적으로 타이머를 걸어서 cancel-token이라는 기능과 함께 해당 요청이 시간이 지나면 내가 직접 취소처리를 해버리는 것 이다.

nodejs axios cancel token 이라고 검색해서 찾아보면 사용 방법이 잘 나온다.

어떤 느낌인지 보고 싶으면 아래 내가 적용하기 전과 후 코드를 봐보자.

 

왼쪽이 before, 오른쪽이 after

좀 더러워지긴 했는데 이렇게 하니까 잘 된다.

반응형
반응형

휴대폰 요금제를 아낄 겸 skt 요금제에서 아이즈 모바일 알뜰 요금제로 갈아타기로 했다.

근데 사용이 불가능 할 정도로 대응이 늦어서 아쉬움이 커서 후기 글을 남기고자 한다.

고소당할 수 있으니 감정은 배제하고 팩트만 적도록 하겠다.

 

 

겁나 싼 요금제를 보고 혹해서 일단 신청했다.

 

일단 유심칩 배송은 2일내로 도착해서 좋았다.

 

개통 요청 접수하라고 해서 요청했다.

 

한 이틀정도 기다렸는데 개통 관련해서 아무런 연락이 안 왔다.

보통 개통 완료됐다고 알림이 오는 게 정상이지 않나 싶어서 문의를 남기기로 했다.

 

 

아이즈모바일

가계통신비의 합리주의, 가치소비를 가장 우선으로 생각합니다.

www.eyes.co.kr

일단 아이즈 모바일 공식 고객센터 홈페이지로 갔는데...

 

나랑 비슷한 문의와 늦장 대응에 관한 컴플레인이 굉장히 많은 것을 보고 업무 처리속도가 굉장히 느린 업체라는 것을 깨달았다.

 

1:1 채팅 연결도 잘 안 됐다.

그리고 오늘 아침에 또 1:1 채팅을 신청하려 하니 문의량이 많아 상담 시간을 13~18로 조절했다는데 ?? 이해가 안 된다.

문의량이 많으면 상담 시간을 늘려야 정상 아닌가... 왜 줄이는 거지...

 

가족들도 전부 알뜰 요금제로 바꾸는데 다른 업체는 개통이 엄청 빠르고 이와 같은 불편함은 없었다고 한다.

나도 다른 업체로 갈아타야겠다.

 

아이즈 모바일 이용하시려는 분은 좀 더 고민해보자.

 

 

 

반응형
반응형

특정 이미지를 외부에서 사용하기 위해서 이미지를 외부에서 사용하기 위해서 URL을 추출해야합니다.
목차의 3개의 순서를 따르면 됩니다.

 

 

 

1. 구글 드라이브에 이미지 업로드

구글 드라이브 이동 링크를 통하여 구글 드라이브로 이동합니다.

 

드라이브로 이동을 누릅니다.

 

 

드라이브 폴더에 이미지를 드래그해서 업로드 합니다.

 

2. 업로드 된 이미지의 권한 설정

 

업로드 된 이미지를 우클릭 > Share(공유) 를 선택한다.

 

(Anyone with the linke)링크가 있는 사람과 공유하기를 선택하고 Done(완료)를 누른다.

 

이미지의 권한 설정은 완료됐다.

 

 

3. URL 추출

마지막으로 이미지의 URL을 추출하는 방법을 알아보자

 

업로드 한 이미지를 더블클릭하여 이미지를 조회하자

 

크롬 기준 Ctrl + Shift + C 를 눌러서 검사모드로 들어간 뒤 그림과 같이 이미지를 클릭하도록 하자

 

이미지를 클릭하면 오른쪽에 푸른색으로 이미지 부분이 선택된다.

 

 

거기서 이미지 링크를 우클릭 > Open in new tab을 누른다.

 

 

이미지가 열리는데 해당 이미지를 우클릭, 이미지 주소 복사를 누르면 외부에서 사용 가능한 이미지의 주소 복사가 완료된다.

 

마지막으로 이미지 URL을 필요로 하는 곳에다가 해당 주소를 넣고 사용하면 된다.

반응형
반응형

1. 오류

nodejs 모듈 fileSystem의 rmdir 기능을 사용했다.

 

코드는 아래와 같다.

fileSystem.rmdir(`./images/${insertItem.option.forkHistoryId}/${insertItem.item.itemId}`, {recursive: true},()=>{})

 

그러면 아래와 같은 에러가 발생한다.

(node:498071) UnhandledPromiseRejectionWarning: TypeError [ERR_INVALID_CALLBACK]: Callback must be a function
    at makeCallback (fs.js:136:11)
    at Object.rmdir (fs.js:671:14)
    at router.get (/ServerCrwal.js:499:16)
    at Layer.handle [as handle_request] (/node_modules/express/lib/router/layer.js:95:5)
    at next (/node_modules/express/lib/router/route.js:137:13)
    at Route.dispatch (/node_modules/express/lib/router/route.js:112:3)
    at Layer.handle [as handle_request] (/node_modules/express/lib/router/layer.js:95:5)
    at /node_modules/express/lib/router/index.js:281:22
    at Function.process_params (/node_modules/express/lib/router/index.js:335:12)
    at next (/node_modules/express/lib/router/index.js:275:10)
(node:498071) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
(node:498071) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

 

 

2. 원인

버전에 맞지 않는 구문을 사용해서 그렇다.

rmdir을 recursive 옵션 없이 사용하면 잘 작동하는데 문제가 발생한 환경의 node 버전은 10.x 버전이었다. 그리고 인터넷에 올라와있는 예시는 거의 12버전 이상에서 작동하는 코드들이다.

왼쪽이 10.x 구문, 오른쪽이 12.x 구문이다.

 

문제가 발생했다면 해당 환경해서 node -v로 버전을 확인해보고 12버전이상인지 확인해보자.

 

3. 해결방법

코드상의 문제는 없기 때문에 node 버전을 업그레이드 했다.

 

우분투 명령어

curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash -

sudo apt-get install -y nodejs

 

데비안 명령어

curl -sL https://deb.nodesource.com/setup_12.x | bash -

apt-get install -y nodejs

 

버전 업글하고 하면 잘된다.

반응형
반응형

나 보려고 만든건데 듣다가 알아두면 좋은 정보 메모용

 

김영한 추천 참고 서적

객체지향의 사실과 오해

토비의 스프링

자바 ORM 표준 JAP 프로그래밍

 

초기 세팅

File > Settings > Build, Execution, Deployment > Build Tools > Gradle 항목에서 위의 2개 항목을 Intellij IDEA로 변경

이렇게 안하면 Gradle 통해서 실행하기 때문에 오래걸림

 

프로젝트 익스플로러 세팅

 

테스트 코드 작성시 기본 사항

테스트코드를 짤때 막막하면 3단계 given, when, then으로 나눠서 생각하자

given : 이런이런게 주어졌을때

when : 이렇게 했을때

then : 이렇게 된다

 

추천 라이브러리

롬복 : Getter, Setter 자동설정

Getter 자동생성, Setter 자동생성, ToString 자동생성 등

 

단축키(윈도우)

F2 : 오류 난곳으로 이동

Ctrl + Shift + Enter : 자동완성(현재 상태에서 자동으로 마무리 치는것)

코딩도중에 자동완성 선택창에서 그냥 Enter가 아니라 Ctrl + Shift + Enter를 누르면 세미콜론까지 쳐짐

Alt + Insert : Generate

Ctrl + Alt + V : 현재 라인에서 결과값에 대한 수식을 변수에 담아줌

psvm : public static void main(String[] args)

sout : System.out.println();

soutm : 현재 클래스와 메소드를 System.out.println에 자동으로 넣어줌

반응형
반응형

1. 개요

2. nginx 설정 파일 찾기

3. 설정법

4. 설정한 대로 에러 페이지가 안 나올 때

 

 

 

 

1. 개요


ngnix를 사용하면 위와 같이 기본 에러 발생 시 출력되는 페이지를 설정해야 한다.

주로 점검 중이라는 이미지를 올려놓는다는지...

인터넷에 올라와있긴 한데 내가 추가로 삽질한 것도 있어서 한번 쭉 정리할 겸 올려놓는다.

 

 

2. nginx 설정 파일 찾기


일단 현재 서버에서 nginx가 사용 중인 conf파일을 찾아야 한다.

기본적으로 /etc/nginx/nginx.conf 파일인데 정확한 위치를 모르겠으면 아래 참고하자

 

1. nginx -t 명령어를 사용한다.

 

2. sudo find / -name 'nginx.conf'

 

 

3. 설정법


 

 

해당 파일을 열어보면 이미 실패한 요청에 대한 처리가 정의되어 있는 경우도 있다.

 

error_page 404 /404.html;
	location = /404.html {
	root /usr/share/nginx/html/;
}

error_page 500 502 503 504 /50x.html;
	location = /50x.html {
	root /usr/share/nginx/html/;
}

root 부분은 따로 설정해주지 않으면 현재 서버에서 설정해놓은 root 경로에서부터 시작한다.

위 설정에서 502 에러가 발생하면 /usr/share/nginx/html/50x.html을 표출하게 된다.

 

4. 설정한 대로 에러 페이지가 안 나올 때


근데 나 같은 경우는 내가 만든 html로 넘어가지지 않고 계속해서 502 Bad Gateway만 나왔다.

서버 설정이 잘못됐기 때문에 발생했다.

 

1번의 경우는 conf 파일 내에 여러 서버에 대한 정의가 되어 있었는데 내가 작업해야 하는 서버가 아니라 다른 서버에 에러 페이지 설정을 해놔서 안 되는 것이었다.

 

반응형

'Linux' 카테고리의 다른 글

Filezilla 하위 디렉토리 간편하게 생성 tip  (0) 2018.10.26
서버 SSL 인증서 파일 경로 찾기  (0) 2018.06.27
리눅스 스크린 명령어  (0) 2018.04.22
반응형

1. 개요

2. 사용하는 라이브러리, 개념 설명

3. 코드

4. 그 외

 

 

 

1. 개요

이전 게시물에서는 파일을 업로드 하는 경우에 대해서 다뤘는데 이번에는 다운로드하여 저장하는 부분을 살펴보도록 하겠다.

마찬가지로 axios를 통해서 처리한다.

 

2. 사용하는 라이브러리, 개념 설명

사용하는 라이브러리

axios 네트워크 통신

filesystem 파일에 대하여 관리할 수 있도록 도와주는 라이브러리 이미 fs로 쓰고 있을 가능성이 높음.

 

마찬가지로 코드로 넘어가기 전에 간단히 어떤 플로우를 통하여 업로드 하는지 알아보자.

업로드보다 조금 더 쉽다.

 

1. axios에서 원하는 파일 데이터를 stream 형태로 요청

2. 결과값을 writestream으로 저장

 

3. 코드

//1. axios에서 원하는 파일 데이터를 stream 형태로 요청
AxiosNetworkHelper.GetRequest({
    url: 'https://targetsite.com/image.jpg',
    responseType: 'stream',
}).then((res) => {
	//폴더 recursive로 생성 요청
    if (!fileSystem.existsSync(`./images/savefolder`))
        fileSystem.mkdirSync(`./images/savefolder`,{recursive: true})
        
 	//파일 이름 확장자명 따라서 정해주기
    let fileName = `filename.${res.headers['content-type'].split('/')[1]}`

	//2. 결과값을 writestream으로 저장
    const writer = fileSystem.createWriteStream(`./images/savefolder/${fileName }`);
    res.pipe(writer)

    writer.on('error', (error) => {console.log(`이미지 다운로드 스트림 생성 실패 ${error}`)})
    writer.on('close', () => {console.log('이미지 다운로드 성공')})
}).catch(error => {LogManager.getInstance().AddLocalLogData(forkHistoryId, `이미지 다운로드 요청 실패 ${error}`)})

 

마찬가지로 내용이 쉽기 때문에 자세한 설명은 생략하도록 하겠다.

다만 파일 확장자를 따로 정해주는 부분은 이해가 안갈수도 있는데

해당 res.headers 부분을 찍어보면 아래와 같이 나온다.

 

확장자 정보는 url을 통해서 이미 알고 있는데 왜 다시 정보를 이런식을 받아오냐 묻는다면... 가끔 확장자 정보가 없는 경우가 있다. 그런 경우 위와 같이 확장자를 그때그때 받아와서 저장하는 것 이다.

 

4. 그 외

마찬가지로 현재 게시물의 예제는 단일 이미지 다운로드에 대한 예제다.

다음에는 여러개의 이미지를 동시에 다운로드 하는 예제를 올리려고 한다.

 

nodejs axios readstream 파일 업로드

nodejs axios writestream 파일 다운로드

 

반응형