Programming
최단 경로 문제 - 다익스트라 알고리즘
최단 경로 문제 - 다익스트라 알고리즘
2024.04.09최단 경로 문제 최단 경로 문제는 그래프 내의 두 정점(노드) 간의 가장 짧은 경로, 즉, 각 간선들의 가중치의 합이 최소가 되는 경로를 찾는 문제이다. 그래프의 형태에 따라 다양한 최단 경로 알고리즘이 존재한다. 이러한 알고리즘은 그래프의 크기, 가중치의 존재 유무 또는 음수 사이클의 존재 여부 등에 따라 다르게 사용한다. 대표적인 알고리즘 복습할 겸 대표적인 최단 경로 알고리즘을 찾아봤다. 다익스트라 알고리즘: 가중치가 음수가 아닐 때 사용될 수 있다. 다익스트라가 대학원생이던 시절 여자 친구와 함께 커피숍에 갔다가 20분 만에 고안한 알고리즘으로도 유명하다. 벨만-포드 알고리즘: 음수인 가중치를 처리할 수 있는 알고리즘이다. 음수 사이클을 탐지할 수 있는 것이 특징이다. 플로이드-워셜 알고리즘: 가..
CertBot 인증서가 만료가 되었다
CertBot 인증서가 만료가 되었다
2024.01.21문제의 상황 모도코라는 사이트의 API Server를 운영하고 있고 CertBot으로 무료 인증서를 Let's Encrypt로부터 받아와서 사용하고 있다. 무료 인증서는 갱신 기간이 90일밖에 되지 않기 때문에 CertBot으로 자동으로 renew되도록 cronjob을 등록해놓았다. 실제로 거의 1년 동안 신경 안 쓰고 잘 사용해왔다. 그런데 인증서가 만료되면서 사이트 로그인이 되지 않는다고 갑자기 문의가 들어왔다. 일단 API 서버가 사용중인 인증서를 보니 이전에 만료된 Let's Encrypt 인증서를 사용하고 있었다. 운영 환경 API Server를 관리하기 위해 PM2라는 Process Manager를 사용하고 있다. GitHub에 Code를 업데이트하면 GitHub Action으로 자동으로 AW..
Error installing cocoapods 해결 후, CocoaPods 업그레이드하는 법
Error installing cocoapods 해결 후, CocoaPods 업그레이드하는 법
2023.11.17최신 코코아팟(CocoaPods)으로 업그레이드하기 맥을 Sonama(14.1.1)로 업그레이드를 하고 XCode17에 대응하기 위해 코코아팟을 업그레이드하려 했습니다. 그런데 sudo gem install cocoapods을 했더니 다음과 같은 오류가 발생했습니다. Fetching cocoapods-downloader-2.0.gem Fetching cocoapods-core-1.14.2.gem Fetching cocoapods-1.14.2.gem ERROR: Error installing cocoapods: There are no versions of cocoapods-downloader (>= 2.0) compatible with your Ruby & RubyGems 원인 루비(Ruby) & 패키지 ..
Flutter3.0 Firebase 연동하기
Flutter3.0 Firebase 연동하기
2023.10.051. Firebase CLI를 설치한다다음의 페이지에서 설치할 수 있다. CLI 설치 가이드: https://firebase.google.com/docs/cli?hl=ko#setup_update_cli 설치한 다음 로그인까지 해주자.firebase login2. Firebase Project를 하나 생성한다firebase projects:create groot-fcm-test나는 groot-fcm-test라는 이름으로 프로젝트를 만들었다. 전세계에서 유일한 명칭이어야 해서 특이하게 설정해야 한다. 이제 Firebase Console에 접속해보면 방금 생성한 프로젝트가 보일 것이다. 콘솔 링크: https://console.firebase.google.com/ 3. 작업할 Flutter 프로젝트를 생성하자..
NestJS v8에서 v9으로 업그레이드 하는 법
NestJS v8에서 v9으로 업그레이드 하는 법
2022.10.05최근에 NestJS v9의 Major Update가 있었다. REPL 기능이라든지 Swagger 업그레이드라든지 필요한 기능들이 있어서 업그레이드를 진행해보고자 했다. v9 업데이트에 관해서는 아래의 글에서 간단하게 참고할 수 있다. https://trilon.io/blog/nestjs-9-is-now-available NestJS v9 is now available Today I am excited to announce the official release of Nest 9: A progressive Node.js framework for building efficient and enterprise-grade, server-side applications. trilon.io v9.0.0 PR은 http..
CloudFront에 올린 Font(woff, woff2)가 CORS 때문에 차단되는 경우
CloudFront에 올린 Font(woff, woff2)가 CORS 때문에 차단되는 경우
2022.08.21폰트가 계속 차단이 되는 경우 확인해 볼 것 CORS 에러가 발생한 상황 프로젝트를 하다가 유독 Web Font(woff, woff2)만 CORS에 의해 막히는 이상한 현상이 발생했습니다. 아래와 같이 CSS에서 우리가 CDN에 올려준 Font를 불러오도록 했습니다. Access-Control-Allow-Origin 응답 Header에 이 Font를 요청하는 사이트 주소도 잘 추가되어 있었습니다. 일단 저는 S3에 폰트를 업로드하고 CDN이랑 연동을 했습니다. 그리고 CDN에서는 S3 bucket의 CORS 정책을 쓰도록 했습니다. CloudFront와 CORS 정책은 아무 문제가 없어 보였습니다. 그런데 계속 Access-Control-Allow-Origin에 의해 CORS 의해 막혔습니다. Conso..
NestJS에 NewRelic 연동하는 법
NestJS에 NewRelic 연동하는 법
2022.07.18NestJS에 NewRelic을 연동하는 법이다. 1. New Relic에 접속한 후 Add data를 누른다. 2. Data sources를 Node.js를 선택한다. TS로 작성된 NestJS도 결국 JS로 컴파일되어서 NodeJS로 실행되기 때문에 Node.js를 선택한다. 3. Begin Installation을 클릭한다. 이때 아래 캡처본에는 안 나왔지만 방화벽 같은 것이 있을 경우 Proxy를 사용하는 법에 대해서 나와있다. 참고하자. 4. 해당하는 NodeJS 배포 환경을 고른다. 나는 EC2 인스턴스에 PM2로 NodeJS 프로세스를 올리며 관리하고 있다. 그래서 On a host (with PM2)를 선택했다. 5. Node.js Agent의 명령어를 서버에 실행한다. 이걸 실행하고 기다..
웹 문서를 만들기 전에 고민해볼 것들
웹 문서를 만들기 전에 고민해볼 것들
2022.04.17이 글은 HTML에 대해 다시 공부하며 적고 싶은 걸 적는 두서 없는 글입니다. 어떤 사이트가 좋은 웹일까요? 신경 쓸 것들 1. 웹 표준(참고한 사이트) 우리는 웹 표준을 준수하는 웹 페이지를 만들어야 합니다. 그래야 검색엔진에 유의미한 정보들이 수집도 잘되고(SEO 최적화!!) 다른 개발자 또는 기기들이 해석하기 좋습니다. div 태그로만 되어있는데 class명도 자기 마음대로 짠 웹을 고치게 된다고 생각해보십쇼... (사실 처음에 제가 그렇게 많이 했어서 잘압니다. 다신 건드리기 싫습니다.) HTML의 요소들 요소는 로 다른 텍스트와 구별합니다. 요소는 대소문자 구분이 없습니다. 태그를 문서의 루트로 둡니다. 문서의 첫 부분에는 항상 과 같이 이 문서가 몇 버전의 HTML을 사용하는지 알려주는 DT..
Flask를 CLI에서 실행해야 하는 이유와 환경 세팅하기
Flask를 CLI에서 실행해야 하는 이유와 환경 세팅하기
2021.06.08Flask를 CLI에서 실행해야 하는 이유 공부할 시간도 부족한데 매번 구글링해서 환경 설정을 하기 귀찮아서 Flask에 관해서 정리할 겸 작성하는 글입니다. Flask를 왜 CLI에서 실행해야 할까? 더보기 나는 주로 웹 브라우저로 웹 IDE(Codespace 또는 Replit)에 접속해서 작업한다. 위 웹 IDE 인스턴스에서는 Ubuntu 18에서 코드를 실행해준다. 고로 이 글은 리눅스 기준임을 참고하자. 두 가지의 실행 방법 CLI에서 flask run VS 스크립트에서 app.run() - 개인적으로 느꼈던 의문 - Python 코드 외부인 CLI에서 Flask를 실행하지 말고 그냥 run() 메서드 써서 Flask 인스턴스를 실행하면 안 되는건강? 나는 Flask를 CLI(명령어 환경)에서 F..
Deno를 사용해보자!
Deno를 사용해보자!
2021.06.02Deno 사용해보기 최근에 JS와 Node.js 공부를 하면서 점점 감당이 안 될 정도로 늘어나는 node_modules이 불편했었다. 내가 공부하는 환경의 특성상 어떤 바이너리나 자료들을 설치하거나 PC에 직접 다운로드하지 못한다. 그래서 주로 replit 같은 곳에서 하는데 인스턴스가 매번 초기화되기도 하고 매번 모듈들을 다운로드하는 것도 오래 걸렸다. 그렇다고 프로젝트 통째로 다 Push 하기도 곤란했다. 그래서 해결책을 찾는 와중 Deno라는 친구를 찾았다. 사용법도 Node.js와 비슷하다고 해서 바로 써봤는데 추가된 것이 몇 개 있긴 하지만 그렇다 하더라도 기본적인 사용법은 금방 익힐 수 있다. 더 찾아보니 장점도 뚜렷하고 마음에 든다. 아직은 알아가는 중이지만 공부하는데 많은 도움이 될 것 ..
티스토리 사이드바에 GitHub Contribution Graph 넣는 방법
티스토리 사이드바에 GitHub Contribution Graph 넣는 방법
2020.06.06GitHub Contribution 그래프를 아래와 같이 임베딩하는 방법 1. 사이드바에 HTML을 넣을 수 있도록 해주는 배너 출력 플러그인을 적용한다 "블로그 관리 페이지 > 플러그인"에서 적용할 수 있다. 2. 사이드바에 모듈이 추가됐는지 확인한다 사이드바 페이지의 기본 모듈 카테고리에 [플러그인] HTML 배너출력이 있어야 한다. 3. HTML 배너출력 모듈을 우측 사이드바에 배치한다 노출되길 원하는 위치에 HTML 배너출력 모듈을 배치해주자. 4. GitHub Contribution 그래프를 가져오는 HTML 코드를 나에게 맞게 수정한다. 아래 코드의 22번째 줄 있는 "사용자명"을 자신의 GitHub 사용자명으로 바꾸고 전체를 복사한다. 나는 GitHub 사용자명이 IamGroooooot이기 ..
[Compiler] 연산자의 Associativity와 Recursion의 연관성
[Compiler] 연산자의 Associativity와 Recursion의 연관성
2020.05.10연산자의 Associativity와 CFG의 문법(Recursion)의 연관성 정의 연산자의 Associativity란? (괄호가 없을 때) 같은 우선순위의 연산자들 중 무엇을 먼저 결합할지 결정해주는 속성을 말한다. + 연산자가 Left Asscociative하면 1+2+3은 (1+2)+3과 동일한 의미를 가지게 되고 Right Asscociative하면 1+2+3는 1+(2+3)과 동일한 의미를 가지게 된다. Recursion이란? CFG에서 non-terminal이 그 non-terminal을 포함한 sequence를 유도할 수 있으면 Recursive하다(순환한다)고 말한다. 우측에서 순환할 수도 있고 좌측에서 순환할 수도 있고 양쪽에서 순환할 수도 있다. 예시를 보면서 이해를 해보자. Left ..