목록분류 전체보기 (107)
정글에서 온 개발자
단위 테스트 기초제품 코드와 테스트 코드의 비율은 보통 1:1에서 ~1:3. 많으면 1:10까지테스트 코드가 제품 코드보다 많아지는 것 같아 이게 맞나 싶었는데, 이게 정상이였다.단위 테스트의 주요 목표는 소프트웨어 프로젝트의 지속 가능한 성장이다.더 나은 설계가 주요 목표가 아니다!테스트코드 짜기 쉬움은 좋은 설계에 대한 좋은 부정 지표지만, 좋은 긍정 지표는 아니다. (테스트 짜기 쉽다고 좋은 설계는 아닌 것)테스트 커버리지 역시 좋은 테스트에 대한 좋은 부정 지표지만, 좋은 긍정 지표는 아니다.커버리지에 집착하지 말자.테스트 코드도 역시 코드고, 모든 코드는 자산이 아닌 책임(부채)이다. 좋지 않은 코드는 지우자!모든 코드를 똑같이 작성할 필요는 없다.테스트의 비용 요소테스트 리팩토링코드 변경 시..

SDL 라이브러리* Simple DirectMedia Layer 라이브러리* Mac, Window 상관 없이 윈도우 생성, 기본 2D 그래픽 처리, 입력 처리, 오디오 출력 등을 가능하게 해주는 게임 개발 라이브러리게임 프레임의 구조입력게임 세계 갱신출력* 메인 함수 안에 Game.RunLoop() 가 있고, RunLoop의 while문 안에 Game.입력, Game.갱신, Game.출력 메소드가 들어있는 구조SDL_PollEventwhile(SDL_PollEvent(&event)){}위 코드에서 , 큐에 요소가 있는한 계속 true를 반환한다. 큐 쌓이는 속도가 while문 처리속도보다 빠르면 frame이 밀릴 수도 있다. 이걸 어떻게 해결하는지는 찾아봐도 모르겠다.직접 처리속도를 제한하는 방법은 없..
Golang으로 작성된 레거시 프로젝트를 이어받아서 feature를 개발하던 중 테스트 코드를 작성하고 싶어졌다.이유는 내가 짠 api에서 성능 개선을 해보겠다고, 혹은 response 데이터를 변경하면서 이전에 잡았던 버그를 다시 내는 일이 몇 번 있었기 때문이다.이 때마다 hot fix로 PR을 다시 날리는 것도 귀찮고, 내가 짠 코드라고 방심하고 함부로 코드를 정리하다가 큰일 날 수도 있겠구나 하는 생각이 들었다.종합적으로 테스트 목적 중 ‘회귀 방지’를 위해서 도입하고자 했다.고민테스트 코드를 짜려고 하다 보니 걸리는 게 있었다.api 하나를 통째로 여러 케이스로 검사하는 게 unit 테스트가 맞나?테스트가 어떻게 실제 DB에 영향을 안 줄 수 있을까?1. API 전체 테스트?단위 테스트에서 말하..
공부 동기쿼리를 통해 나온 결과를 엑셀 파일로 제공하는 기능을 개발하던 중, 일반화 프로그래밍을 위해 쿼리로 가져온 값을 배열로 일반화해야 했다. GPT는 go 리플렉션을 추천했는데 이전부터 공부하고 싶던 주제라 찾아봤다.리플렉션이란?프로그램 실행 중(런타임)에 자기 자신의 구조와 동작(클래스, 메서드, 속성)을 검사하거나 수정할 수 있는 능력동적으로 코드를 조작할 수 있음요약하면 객체의 메타적인 정보를 다루게 해준다사용되는 주요 사례프레임워크와 라이브러리JSON, XML 등 데이터 직렬화테스트 코드단점성능 저하 - 런타임에 메소드, 필드에 접근하기 위한 추가적 처리가 필요하기 때문코드 가독성 떨어짐예상치 못한 동작 - private 메서드 등에도 접근 가능하기 때문지원 언어자바, C#, 파이썬, 자바..

도입 이유기존의 local build → zip 파일을 호스팅 서버로 ftp 전송 → 압축 풀기 → systemctl 실행 의 프로세스를 단축하는 배포 자동화를 구축하고자 함버전별 아카이빙 혹은 추후 버전 롤백을 염두해 호스팅 서버가 ‘버전 스토리지’ 역할도 할 수 있도록 구성하고자 함 (docker image 스토리지 등으로도 사용 가능)구성 후 사용 방법git push 나 PR merge 등으로 배포하고 싶은 git 버전을 구성레포지토리의 Actions에 들어가서 자동 워크플로우 이름 → Run workflow → Run workflow를 클릭배포 완료 후 호스팅 서버에 접속하여 sudo systemctl restart server 실행이제 github에 올라간 새로운 버전이 호스팅 서버에서 돌아간다..

Linux System Service리눅스의 systemd가 관리하는 service를 system service라고 한다.systemd를 컨트롤하기 위해 systemctl을 사용한다.시스템 차원에서 등록한 service의 실행관리를 해준다.아파치나 mongodb, mysql을 직접 설치하고 돌릴 때, 모두 이 system service 가 실재 실행 파일을 찾아서 돌리는 것이였다.sudo systemctl start mongod와 같은 명령처럼, 내가 내 앱(파이썬이나 ,node.js, go로 만든) 서비스를 'myservice' 라고 지정했다면sudo systemctl start myservicesudo systemctl stop myservice와 같은 명령어로 쉽게 컨트롤 할 수 있다.시스템 서비..

문제 상황Text2Query를 이용해 챗봇을 개발하고 있습니다.단순 쿼리 생성 뿐 아니라, 주어진 쿼리를 바탕으로 출력이 나오게 실행해야 합니다.그런데, 매출까지는 잘 뽑았는데 0을 자꾸 붙이는 에러가 있었습니다. 데이터는 이건데, [(Decimal('**8061459368'),)] 자꾸 천억대 회사를 조단위 회사로 만든다거나..원래 데이터는[(Decimal('**09568240'),)]이렇게 자꾸 0을 붙이는 일이 지속됐습니다. 특히 0을 붙이는 건 온갖 프롬프팅과 데이터 정제를 해도 고쳐지지 않아서 고생했습니다.와중에 비교하고 있는 GPT는 저렇게 넣어도 답변을 잘해서 속은 타들어 갔습니다.잘 나오는 모델 쓰면 좋긴 하지만, 저렴한 비용을 위해 적은 리소스에서 성공하기 위해서 여러 시도를 해보았습니다..

프롬프트 엔지니어링개발을 생각하지 않고 프롬프트 엔지니어링을 살펴보며 ‘one shot’, ‘few shot’ 등이 나오면 ‘챗GPT 쓰는데 언제 이런 예시를 일일히 나열하고 있나’ 생각했습니다. ‘프름프트 엔지니어’가 연봉을 높게 받을 수도 있다는 얘기도 흘려들었는데, 고연봉까지는 모르겠지만 중요한 작업이라는 걸 알게 됐습니다.프롬프트 엔지니어링이 중요한 이유는 다음과 같은 사실 때문입니다.LLM 이용 시 요청하는 API는 ‘토큰’ 이라고 하는 입력 단위 (단어일수도, 단어보다 더 쪼개진 걸 수도 있다.) 의 양에 따라 비용이 청구된다.로컬에서 돌리는 머신에 요청하더라도 토큰이 많아지면, 연산이 많아지고 따라서 느려지게 된다. 빠른 서비스를 하려면 좋은 GPU를 달아야 하므로 결국 돈이다.GPT4.0 ..
*제목을 위해 원시적 모델이라고 했지만, '전통적인' 통계적 모델입니다.요약통계적 방법을 적용하던 언어 모델에 딥러닝이 적용 됐습니다. 문맥 파악을 위해 방법을 찾던 중 '어텐션 메커니즘'을 사용하는 '트랜스포머'를 개발하게 되고, 이를 응용하여 GPT가 개발되었습니다.통계적 언어 모델(SLM; Statistical Language Model)아이디어사람들이 많이 쓰는 언어의 데이터 뭉치들 (코퍼스;Corpus) 의 시퀀스(단어의 나열)를 실제로 세서(count) 전체 코퍼스 중에 해당 시퀀스가 나올 확률을 구하고자 했습니다.'모델이 생성(예측)하는 다음 단어는 확률을 통해 구한다' 는 언어 모델의 기본 개념을 정립했습니다.모델이 발전은 다음에 올 단어의 확률을 구하는 방법의 발전입니다. 가장 확률이 높..

AI (Artificial Intelligence;인공지능)인간의 지능이 가지는 학습, 추리, 적용, 논증 등 기능을 갖춘 시스템.코드로 조건 분기를 일일히 해 줄 수 있다.ex) ‘집의 크기와 가격’ 을 단순히 ‘3000*x + 1000’ 으로 놓는 것은 머신러닝을 쓰지 않은 AI 모델을 작성한 것이다.머신 러닝추론 능력을 가지는 모델을 ‘학습’ 이라는 과정을 통해 자동으로 만듦ex) ‘집의 크기와 가격’이 a*x+b 라는 ‘선형 관계’를 따를 것이다 하고 가정하고, 데이터들을 입력시켜 a 와 b를 찾아가는 것이 ‘학습’ 이자 ‘머신 러닝’이 때 최종적으로 ‘3000*x+1000’ 이 예측을 잘 하는 식이라고 결정됐다면 이 식이 학습된 ‘모델’모델은 간단한 ‘선형 모델'부터 많은 변수를 받는 ‘다변량 ..