분류 전체보기100 GCP Compute Engine 이용해 서버 배포하기 gcp를 이용해 서버 배포하는법을 알아보자! aws EC2 ubuntu 서버와 동일하게 대응하는것은 GCP의 Compute Engine 이다. 우선 Compute Engine에 들어가 인스턴스 만들기를 눌러준다. 새 vm 인스턴스, 템플릿에서 만들기, 머신 이미지 등등 많지만 우리가 사용할것은 vm 인스턴스이다. 이름: 내가 사용할 인스턴스 이름설정 리전: 서울로 설정(근데 왜 라스베가스보다 가격이 올라가는...?) 머신구성: N1 우리가 aws에서 항상 하던 그놈 부팅디스크는 Ubuntu로 설정해준다. 다른 블로그에서는 크기를 20으로 맞추던데 상황따라 하면 될것같다. 방화벽도 이렇게 설정해준다. 그리고 만들어주면 끝!! 정상적으로 만들어진 인스턴스에 들어가서 SSH > 브라우저 창에서 열기를 클릭하면.. 2024. 4. 16. api를 이용한 스크래핑 성능 개선 퍼페티어를 이용해 스크래핑을 완성하였으나, 성능이 너무나 뒤떨어졌다. 데이터 스크래핑을 해야하는 페이지는 사용자에게 쾌적한 사용을 주기 위해서인지 스크롤을 해서 해당 페이지에 도착했을때 해당 데이터가 네트워크 탭을 통해 들어오게 된다. 이런 특성 때문에 퍼페티어상에서도 직접 스크롤을 해야하고, 리뷰 목록을 가져올때도, 아무튼 모든걸 하나하나 클릭을 해서 가져오는데에 비해 가져올 데이터는 많아서 느려도 너무 느렸다.. 작품 데이터 상위 20개만 가져온다고 해도 먼저 랭킹페이지에서 20위까지의 상세페이지 링크를 긁어모으고, 하나하나 들어가서 원하는 데이터를 가져와야한다. 이 와중에 스크롤도 해야하고 리뷰버튼은 더보기 버튼의 css 선택자가 달랐다... 뭐 이런 문제는 차치해도 성능이 큰 문제였다. 저렇게만 .. 2024. 4. 15. Array & LinkedList / Stack & Queue Array와 LinkedList 배열과 링크드리스트는 데이터를 저장하고 관리하는데 사용되는 두 가지 기본적인 자료구조이다. 배열 연속된 메모리 공간에 데이터를 저장한다. 인덱스를 사용해 원소에 빠르게 접근할 수 있다. 고정된 크기를 가지며, 크기변경이 어렵다. 미리 할당된 메모리 크기를 초과하면 새로운 메모리 공간을 할당하고 데이터를 복사해야합니다. 원소를 삽입하거나 삭제할때, 원소들을 이동시켜야 하므로 시간이 오래 걸릴 수 있습니다. 메모리 사용이 효율적이다. 각 원소는 인덱스로 접근되며, 추가적인 메모리를 사용하지 않는다. 링크드 리스트 각 노드가 데이터와 다음 노드에 대한 참조포인터를 포함하며, 노드들이 연속되지 않은 메모리 공간에 저장된다. 원소에 접근하기 위해서 리스를 순차적으로 탐색해야 한다... 2024. 4. 15. 힙 정렬 힙정렬 우선순위 큐를 위해 만들어진 자료구조 완전 이진트리의 일종, 우선순위 큐를 위해 만들어진 자료구조 모든 데이터 정렬이 아닌 최댓값 몇몇개, 최솟값 몇몇개 뽑아낼때 유리하다 자료구조/삭제되는 요소 스택 - 가장 최근에 들어온 데이터 큐 - 가장 먼저 들어온 데이터 우선순위큐 - 가장 우선순위가 높은 데이터 힙은 일종의 반정렬상태를 유지함 - 큰값이 상위레벨, 작은값이 하위레벨에 있는 느슨한 정렬상태 - 부모노드의 키값이 자식노드의 키 값보다 항상 큰 이진트리 중복된 값을 허용한다.(이진탐색트리에서는 중복된 값을 허용하지않음) 표준적 자료구조는 배열 편한 구현을 위해 0은 사용하지않음 새로운 값이 추가되면 아래인덱스부터 비교해 교환해나간다. 부모노드=i 왼쪽 자식노드=2i 오른쪽 자식노드=2i+1 8.. 2024. 4. 12. 이모지 문자 mySql에 저장하기 크롤링 해 온 데이터를 db에 저장하는 과정 중 오류가 발생했다. "Incorrect string value: '\\xF0\\x9F\\x92\\xAC\\xF0\\x9F...' for column 'reviews' at row 1" sql 에러메시지를 살펴보니 다른 리뷰들과 다른 부분이 눈에 띄었다. 바로 😎👽🐸 이런 이모지들...!! 이모지 같은 문자들은 글자당 최대 4바이트의 사이즈가 필요한데 Mysql의 utf8 문자셋의 경우 글자당 최대 3바이트까지만 지원한다. 그래서 이런 문제가 발생하는 것이다. 해결방법 1. 이모지 제거하는 정규식 사용 var regex = /(?:[\u2700-\u27bf]|(?:\ud83c[\udde6-\uddff]){2}|[\ud800-\udbff][\udc00-\udff.. 2024. 4. 12. 퍼펫티어를 이용한 크롤링(2) 크롤링 한 데이터를 json으로 변환해서 로컬에 저장한 후, 그 데이터를 다시 파싱해서 db에 넣었다. 그렇게 한 이유는 일단 크롤링 한 데이터들이 db에 들어가기전 제대로 정제된 상태인지 눈으로 확인하고싶었고, 만약 db에 저장했을때 잘못된 정보가 있다면 수정하기 위해서 이 방법을 이용했다. 현재는 굳이 데이터를 json파일로 만들고, 그걸 다시 파싱해서 db에 넣고.. 너무 비효율적이라 수정할 계획이다. 일단 여태까지 삽질한 코드들을 블로그에 올리려 한다. fs를 이용해 path에 있는 파일을 읽고 json으로 파싱한다. async readJson(path: string, files: string[]) { const postPromises = files.map(async (file) => { cons.. 2024. 4. 11. 퍼펫티어를 이용한 크롤링(1) 퍼펫티어 npm 설치 npm i puppeteer 페이지 띄우는 코드 const url = ridibooks.ridiPage; const browser = await puppeteer.launch({ headless: true, }); const page = await browser.newPage(); 로그인, 진짜 별거 없다.. 실제로 로그인 페이지를 띄워서 로그인 정보를 입력 후 클릭한다. async login(page: any, url: string) { const { pageBtn, submitBtn, textCursor1, textCursor2 } = ridibooks.login; await page.goto(url); await page.waitForSelector(pageBtn); await.. 2024. 4. 11. 최종프로젝트 https://www.notion.so/teamsparta/1-dbe5da002a084e20bc120b8260836a03 회빙환(절대 풀네임을 물어봐선 안돼..) | Notion API 명세 - 큰 기능으로 토글화 해서 관리해보세요! teamsparta.notion.site 팀노션 https://www.notion.so/teamsparta/Daily-Scrum-780342274e014429b9cf9dc78f31e9aa Daily Scrum | Notion Built with Notion, the all-in-one connected workspace with publishing capabilities. teamsparta.notion.site 데일리 스크럼 프로젝트 소개: 웹소설 & 웹툰 종합정보 플랫폼.. 2024. 4. 9. [JS] 선택정렬 / 버블정렬 선택정렬 배열에서 최솟값을 찾은 후, 최솟값과 맨앞에 위치한 값과 교체한다. 두번째 회전에서는 맨앞에 위치한 값을 제외한 최솟값을 찾아서 계속 바꿔주는 방법이다. 하나의 원소만 남을때까지 위의 과정을 반복한다. //마지막 숫자는 자동으로 정렬되기때문에 숫자 -1만큼 반복 function selectionSort(arr) { for (let i = 0; i < arr.length - 1; i++) { min = i; for (let j = i + 1; j < arr.length; j++) { if (arr[j] < arr[min]) { min = j; } } if (i !== min) { let swap = arr[min]; arr[min] = arr[i]; arr[i] = swap; } console.l.. 2024. 4. 9. 이전 1 2 3 4 5 6 ··· 12 다음