CS/Python & C++ (12) 썸네일형 리스트형 LLM을 활용한 코드리뷰 자동화 개인 프로젝트를 진행하다 보면 코드 리뷰에 대한 갈망이 생긴다. 객관적인 시각으로 한번 봐야 내가 놓치고 있는 부분이나 실수를 발견할 수 있어서 LLM을 활용하여 개인 프로젝트 레파지토리에 push나 pull request(pull request를 추가할 수 있지만 혼자 하는 프로젝트이기 때문에 pr을 올리지는 않아서 push 로만 한정하였다.)를 올릴 때마다 코멘트로 해당 commit에 대한 피드백을 받을 수 있도록 리뷰 시스템을 개발하였다. 자동 코드 리뷰 시스템을 구축하는데 많은 방법이 있겠지만 나는 Github Actions와 OpenAI API를 사용하였고 크게 바꾸어야 할 부분은 3가지이고 다음과 같다. 1. .yml 파일 생성github 서버는 레포지토리 안에 .github/workflo.. 병렬 처리 로컬 컴퓨터 메모리로 처리 가능할 정도의 코드를 구성하는 방법은 쉬운 접근법이 가능하다. 배열들 하나 하나에 인풋, 중간 산출물, 아웃풋을 담아서 한번에 처리하면 된다. 그러나 이 배열들 하나마다 원소의 개수가 너무 많아진다면 한번에 배열에 담지 못하게 된다. 그래서 중간 결과물들을 쪼개서 가용 가능할 정도로만 메모리에 올려서 처리하는 방법이 필요하게 된다. 이때, 처리 기준이 되는 단위로 쪼개는 방법과 쪼개서 처리한 결과를 원래의 구성과 같게 병합하는 과정도 필요하다. 대량의 데이터에 대하여 OpenAI API를 호출해야 하는 상황이 있었다. ThreadPoolExecutor를 사용하여 멀티 쓰레딩으로 API를 병렬처리하면 훨씬 빠르게 수행 가능하다. 아래와 같은 방식으로 수행 가능하다.with Th.. 파일 다루기 파이썬으로 개발하다보면 로컬에서 테스트 하는 경웨 폴더안의 파일들을 찾고 읽고 쓰는 것과 관련한 코드들을 체감상 가장 많이 사용하는 것 같다.많이 사용하는 것 만큼 외워질 정도로 체화가 되면 생산성이 급증한다. 1. 특정 폴더 안의 모든 파일 가져오기import osimport jsonread_folder_path = "example/path/example"file_path_l = [os.path.join(read_folder_path, file_n) for file_n in os.listdir(read_folder_path)]for file_path in file_path_l: with open(file_path, "r", encoding="utf-8") as rd: text_data = rd... 람다 식(Lambda Expression)과 STL 알고리즘 람다 식 1- 람다 식이란? 이름 없는 함수 개체(메모리 잡아먹는 모든 것을 개체라고 함). 내포(nested) 되는 함수 예시 1. 벡터 정렬하기 std::sort(scores.begin(), scores.end(), [](float a, float b) { return (a>b);}); -> { } captures - 캡처 블록 parameters - 매개변수 목록(선택사항) specifiers - 지정자(선택사항) return_type - 반환 형(선택사항) body - 함수 바디 2- 캡처 블록 람다식을 품는 범위(scope) 안에 있는 변수를 람다 식에 넘겨줄 때 사용. [] : 비어 있음. 캡처 하지 않음 ex) int main() { Method1 auto noCa.. C++의 문자열 std::string std::string이 필요한 이유 char line[256]; cin.getline(line, 256); (참고로 const int LINE_LENGTH = 256; 과 같이 하는게 좋음) 위와 같은 코드는 아래 2가지 경우에 대해서 작동하지 않는다. ㄱ. 아무것도 읽지 못했을 때 ㄴ. 한 줄에 문자가 256자 이상일 때 (즉 버퍼가 충분히 크지 않을때) std::string 클래스 - std::string 클래스를 이요한 문자열은 길이가 증가할 수 있음. 문자열 대입(Assignment)과 덧붙이기(Appending) C 스타일 char firstName[20] = "SeongMin"; char fullNmae[20]; // 대입 - 안전하지 않음 strcpy(fullName, firstName); .. 이동 생성자 & 이동 대입 연산자 1.1값(value)의 분류 lvalue: 단일 식을 넘어 지속되는 개체 (임시적이지 않은 것 ) - 주소가 있음 - 이름이 있는 변수 - const 변수 - 배열 변수 - 비트 필드 (bit-fields) - 공용 구조체(unions) - 클래스 멤버 - 좌측 값 참조(&)로 반환하는 함수 호출 - 문자열 리터럴 rvalue: 사용되는 단일 식을 넘어 지속되지 않는 일시적인 값 - 주소가 없는 개체 - 리터럴 (문자열 리터럴 제외) - 참조로 반환하지 않는 함수 호출 - i++와 i-- (++i와 --i는 lvalue 들) - 기본으로 지원되는 산술식, 논리식, 그리고 비교식 - 열거형(enum) - 람다(lamda) EX) int num = 10; 10 = num; (num + 1) = 20; int.. 스마트 포인터 1. 스마트 포인터 종류 unique_ptr shared_ptr weak_ptr 2. 스마트 포인터를 왜? 기존 포인터의 문제점 아래와 같이 포인터를 할당했으면 더 이상 포인터가 필요 없을 때, delete를 해줘야 하는데 프로그래머들이 delete를 자꾸 까먹음… 그런데 스마트 포인터를 쓰면 delete를 호출해 줄 필요가 없다! 또한 가비지 컬렉션 보다 빠르다. (C++에는 가비지 컬렉이 없긴 하다) 3. unique_ptr 3.1 원리 Object가 생성 될 때 리소스를 할당하고 소유권을 가지고 있으면서 Object가 소멸할 때 리소스를 해제한다. 아래의 코드 처럼 unique_ptr는 따로 delete를 할 필요가 없고 unique_ptr의 소멸자에서 delete가 호출된다. 따라서 scope를 .. Circular Dependency (순환 종속성) 상호 종속성 (Circular Dependency)란? Civil의 코드는 많은 시간동안 많은 개발자들의 손을 거쳐왔다. 그렇기 때문에 새로운 개발사항이 있을 시 이미 종속성이 존재하는 프로젝트들 간에서 상호 종속성(Circular Dependency)을 만드는 경우가 생긴다. 구체적인 예시로써, View cube 개발을 했던 경우에 view cube는 wg_gru 프로젝트에 존재하고 view는 wg_gr 프로젝트에 존재한다. 이때, view cube에서 view의 데이터와 함수를 조작할 일이 생기고 view에서 view cube의 데이터와 함수를 조작하는 일이 발생한다. 그러나 이미 wg_gr 프로젝트는 wg_gru 프로젝트에 종속되어 있기 때문에 wg_gru에서 wg_gr의 변수를 변경하기 위해서는 .. 이전 1 2 다음