본문 바로가기

개발 이야기

(48)
2021 Junction X Seoul 해커톤 참여 후기 You can read this post in English! 2021 JunctionX Hackathon 한글 버전으로 읽을 수 있어요 roseline.oopy.io 🧚‍♀️ 왜 나는 스스로 불구덩이에 뛰어드나 작년 엔젤해커톤에서 힘들었던 기억이 있어 다시는 해커톤 하지 말아야지했다. 그런데 다시 할만 해졌는지 해커톤 홍보 포스트를 보고 가슴이 두근거렸다. 특히 AWS, MS 등 대기업에서 참여하는 큰 규모의 해커톤이라서 주제는 어려워보였지만 꼭 참여하고 싶었다. 이렇게 좋은 것(이면서 고통스러운 것)을 주변 사람들과 함께 하고싶어 여기저기 홍보했다. 그중 한번도 해커톤을 경험해보지 않았던 회사 동료도 함께 신청했다. 그분도 정말 좋은 경험을 했을 것이다. 물론 늘 그렇듯이 팀으로 나가지는 않았다. 해..
가장 빠른 머신러닝 앱 배포하기 | fastapi, gunicorn, nginx 로 lightsail에 배포하기 가볍고 빠르게 구축하거나 실행할 수 있는 모듈들로 머신러닝 앱을 배포해보자. fast api, uvicorn, gunicorn, nginx, lightsail fast api fastapi는 가볍고 높은 퍼포먼스를 낼 수 있으며 ASGI 서버를 지원하는 모던 웹 프레임워크다. ML 프로젝트는 데이터, 패키지만 있으면 다른 디펜던시가 필요없으므로 이것저것 설정해야하는 django보다는 가벼운 fastapi를 사용하면 빠르고 쉽게 앱을 build할 수 있다. 마이크로소프트, 넷플릭스와 같은 대형 서비스에서도 ML 프로젝트를 fastapi로 빌드했다고 한다. uvicorn uvloop, httptools를 사용해 가볍고 빠른 ASGI 서버를 구현할 수 있다. gunicorn과 함께 사용하려면 uvicorn w..
konlpy + fastapi Docker Image로 머신러닝 환경 구축하기 konlpy에서 자바를 사용하기때문에 우분투 이미지를 베이스로, java와 python이 함께 깔려있어야 한다. 첫 설정에 어려움이 많아 docker image로 만들어 허브에 올려놓았다. Docker Hub Docker Hub hub.docker.com 필요 조건 - requirements.txt (docker 내에서 uvicorn으로 실행하므로 uvicorn은 꼭 있어야 한다) 실행 - 도커 이미지 가져오기 docker pull roseline124/konlpy-fastapi - 컨테이너 실행 docker run -d --name -p 80:80 roseline124/konlpy-fastapi dockerfile FROM ubuntu:latest LABEL maintainer="roseline124 ..
AWS LightSail에서 Docker 설치하기 | 설치 오류 해결 용량 파악하기 lightsail에서 플랜을 바꾸려면 스냅샷을 생성하고 새 인스턴스를 생성해야 한다. 메모리가 낮은 상태에서 docker를 올리면 인스턴스가 뻗어버리므로 로컬에서 먼저 도커 컨테이너를 띄워보고 얼마나 용량을 차지하는지 확인한다. docker ps -a CONTAINER ID IMAGE NAME COMMAND CREATED STATUS PORTS c8c71bb80138 elasticsearch elastic_container "/bin/tini -- /usr/l…" 3 days ago Up 3 days 0.0.0.0:9200->9200/tcp, 9300/tcp docker stats CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK..
자바스크립트 실행컨텍스트#2 - 코드의 실행과 관리 | 코드 평가, 실행, 실행의 결과는 어떻게 관리되는가 실행 컨텍스트 실행 컨텍스트, 알아두면 좋은 이유 식별자와 값의 바인딩을 관리하는 방식 호이스팅 발생 이유 클로저 동작 방식 이벤트 핸들러와 비동기 처리의 동작 방식 등 실행 컨텍스트를 알면 자바스크립트의 동작 원리를 이해할 수 있다. 이번 포스팅에서는 이해하기 조금 어려운 용어들이 나온다. 만약 환경 레코드에 대해 더 자세히 알고 싶다면 이 포스팅을 참고하면 된다. 🧚‍♀️모던 자바스크립트 딥 다이브 23장과 ECMAscript 스펙 참고하여 작성. 실행 컨텍스트의 구성 실행 컨텍스트는 '코드 평가 state', 'Function', 'Realm', 'ScriptOrModule' 네 개의 State 컴포넌트로 구성된다. 코드 평가 state(code evaluation state): 실행컨텍스트의 코드..
자바스크립트 실행컨텍스트#1 - 환경 레코드 | 변수의 저장과 참조 방식 실행 컨텍스트를 배우기 앞서, 실행 컨텍스트를 구성하는 컴포넌트 중 하나인 *렉시컬 환경의 '환경 레코드(Environment Record)'를 알아보자. *렉시컬 환경(Lexical Environment): 식별자와 값을 관리하고, 외부 상위 스코프에 대한 참조를 기록하는 데 사용하는 자료구조. 환경 레코드와 외부 렉시컬 환경 참조에 대한 정보로 구성되어 있다. 환경 레코드(Environment Record) 환경레코드란? 🧚‍♀️ Environment Record is a specification type used to define the association of Identifiers to specific variables and functions, based upon the lexical nest..
phaser로 만든 웹 게임 데모 - 로즈마리오 로즈마리오 typescript, phaser 객체, 맵 이미지는 phaser3-example 레파지토리에서 가져옴
[Javascript] shallow copy, deep copy | 원시값과 객체의 copy 얕은 복사는 한 단계까지만 복사하고, 깊은 복사는 객체에 중첩된 객체까지 모두 복사한다. 얕은 복사를 하면 같은 객체를 참조함으로써 서로 영향을 주고, 깊은 복사는 별개의 값으로서 서로 영향을 주지 않는다. 이번 포스팅에서는 원시값과 객체의 특징을 알아보고 객체의 얇은 복사와 깊은 복사가 왜 이런 결과가 나오는지 다룬다. 원시값의 불변성 원시값(primitive)은 변경 불가능한 불변의 값이다. 원시값에는 String, Number, undefined, Boolean, Symbol, BigInt 6종류가 존재한다. 변수 변경 ≠ 원시값의 변경 변수 값이 변경되는 것을 원시값이 변경된다고 생각하면 안된다. 이전 포스팅에서 변수는 값을 담고 있는 메모리 공간 자체 또는 그 메모리 공간의 주소를 가리키는 식별..
여러 개의 docker-compose 파일 사용하기 | multiple docker-compose files db와 엘라스틱서치 컨테이너를 같은 docker-compose 파일에서 띄우면 둘 중 하나만 다운시키고 싶을 때 *문제가 될 수 있다. docker-compose up 으로 컨테이너를 따로 띄울 수는 있지만 docker-compose down은 특정 컨테이너만 다운시킬 수 없기 때문이다. 그러므로 docker-compose 파일을 따로 분리해서 관리한다. *엘라스틱서치의 인덱스가 날아가거나, dump 떠놓은 로컬 DB가 날아간다거나. 큰 문제는 아니지만 다시 작업하기 귀찮다. docker-compose에서 default로 읽을 수 있는 파일 이름은 docker-compose.yml 과 docker-compose.override.yml 이다. 다른 이름의 docker-compose 파일을 사용하려면 -f ..
Symbol을 사용하는 이유는 뭘까 | symbol usage ECMAScript로 표준화된 이후로 자바스크립트에는 string, number, boolean, null, undefined, object 6개의 데이터 타입이 있었다. 그리고 es6에서 새로운 데이터 타입 Symbol이 추가 되었다. symbol은 무엇이고 언제 사용하는 걸까? What is Symbol? 심볼, Symbol 심볼은 변경 불가능한 원시 타입의 값이며, 다른 값과 중복되지 않는 고유한 값이다. 심볼 값은 충돌 위험이 없는 오브젝트의 유일한 프로퍼티 키를 만들기 위해서 사용할 수 있다. 하위호환성을 유지하면서 표준을 확장한다든지, 고유한 상수값을 만드는 데 사용할 수 있다. const symbolA = Symbol('symbol') const symbolB = Symbol('symbol'..