공부하고 기록하는, 경제학과 출신 개발자의 노트

프로그래밍/이것저것_개발일지 24

PaliGemma 모델로 Object Detection Fine Tuning한 방법 정리

https://aifactory.space/task/2733/overview 2024 Gemma 파인튜닝톤 (아이디어톤)🕹️ Gemma 파인튜닝 어디까지 해봤니?aifactory.space  AIFactory Gemma 파인튜닝 아이디어톤에 제출해서, 3등 우수상으로 입상한 내용PaliGemma로 Object Classification을 위한 데이터 준비 방법을 기록하기 위한 것.PaliGemma란?https://developers.googleblog.com/ko/gemma-explained-paligemma-architecture/ Gemma 설명: PaliGemma 아키텍처- Google Developers BlogGemma AI Announcements 전 세계 누구나 이해할 수 있도록 – Gem..

tinygo로 Wasm filter 만들어서 istio에 envoy plugin으로 붙이기

eventing-kafka-broker로 외부의 cloudevent를 받아서 Fanout하는 기능을 만들고 있었는데event source별로 순서 보장이 필요하지만cloudevent 보내는 쪽의 로직을 변경할 수 없는상황을 해결하기 위한 여러 작업 중 하나.  외부 cloudevent 이벤트를 받아서 kafka에 저장할 때, cloudevent spec에서 제공하는 paritionkey라는 옵션을 쓰면 된다.https://github.com/cloudevents/spec/blob/main/cloudevents/extensions/partitioning.md특정 kafka partition별로 매핑하기 위한 옵션으로, 같은 paritionkey를 가진 cloudevent는 동일한 kafka partitio..

Python SQLAlchemy의 many to many relation에 soft delete 기능 적용하기

FastAPI + SQLAlchemy로 API 서비스 만들면서 해결한 사안 정리하기. soft delete가 필요한 이유? 삭제 요청이 들어올 때마다 물리적으로 DB에서 row 정리해 버리면, 삭제된 데이터를 복원한다던가 / 삭제된 데이터의 이력이나 히스토리 파악하려면 데이터베이스 엔진 레벨에서 작업해야 한다. 민감정보 다루는 게 아니고, 서버로그처럼 많이 쌓여서 주기적으로 삭제해야 하는 entity 같은 성격이 아니라면 간단한 비즈니스 로직이나 api에서는 soft delete이 주는 편익이 비용보다 훨씬 크다고 생각함. GORM은 soft delete 기능 도입이 엄청 쉽고, soft delete 적용한 object끼리 relation을 조합하면 ORM에서 자동으로 쿼리를 생성해준다. https://..

FastAPI, SQLAlchemy 프로덕트에서 alembic을 쓰지 않은 이유

작은 사이드 프로젝트 중간에 투입돼서 코드 개선을 하게 되었는데, FastAPI + SQLAlchemy (postgres) + Alembic으로 구성된 기존 방식에서 Alembic을 atlas로 변경했다. Python으로 구성하는 API Server + ORM + DB migration tool 조합의 정석으로 많이 쓰이지만, 글 작성 기준 alembic 최신버전인 v1.13.1 프로덕트를 써보니 장점보다는 단점이 더 크게 느껴졌다. 당연하게도, 내가 느낀 단점이나 불편함이 alembic 프로덕트 자체의 한계는 아닐 수도 있다. 문서에서 내가 놓친 부분이 있을 수도 있다. 이런 고민을 하게 된 상황은 아래와 같은 조건에서였다. Python으로 production level의 웹 서비스를 목표로 상정하고 ..

2023 서울디지털재단 주최 생성AI 해커톤 - 상담부문 최우수상 후기

서울시 생성AI 해커톤 후기공고: https://aifactory.space/competition/detail/2376작업물: https://github.com/AIFactory-CallPilot (공모2) 생성형 AI를 활용한 상담지원 서비스 앱・웹 개발aifactory.space기획 / 아이디어 아이디어는 공고에 첨부되어 있던 '다산콜센터 상담 프로세스'의 위 페이지 한 장에서 완성됐다. LLM에서 기술적으로 성능이 검증된 기능 중 하나가 '문해력'이다. 긴 글의 맥락 이해, 문서 요약과 같은 작업의 수행 능력이 뛰어나다. 일평균 2만 건을 사람이 직접 처리하고 있다면, 자동화를 제안할 명분으로는 충분했다. LangChain을 활용하면 LLM을 활용한 로직을 소스코드로 자동화할 수 있다. LangCh..

Paketo buildpack의 Stack Customization 테스트 기록

시도했던 이유 Knative Function은 paketo buildpack을 기본 빌드팩으로 채택해서 쓰고 있다. 빌드팩은 runtime version과 같은 정보를 동적으로 입력받은 뒤 실행 시점에서 binary를 다운로드받는다. 그런데, 신규 함수를 생성할 때마다 CPython이나 Node같은 runtime을 매번 다운로드받는 방식은 빌드 속도가 느려지는 원인이 된다. 빌드팩이 실행될 환경인 builder 이미지에서 특정 runtime은 미리 다운로드 받아두고, buildpack에서 빌드를 시도할 때 builder 이미지에 해당 runtime이 있다면 재사용하도록 만들 수 있지 않을까? cf. 원래 Buildpack은 애초에 'runtime을 동적으로 관리할 수 있도록 한다'는 철학에서 출발한 프로..

Streamlink로 유튜브 멤버십 스트리밍 영상 다운로드하기

멤버십에 가입되어 있고, 유튜브에 로그인할 수 있는 계정이 필요하다. Streamlink라는 오픈소스 프로젝트를 활용해서 유튜브의 멤버십 전용 스트리밍 영상을 다운로드받는 방법. 21.09.26 현재 streamlink 프로젝트의 latest 버전은 2.4.0이다. 우선 https://github.com/streamlink/streamlink/releases 로 들어가서 latest Version을 선택한다. Releases · streamlink/streamlink Streamlink is a CLI utility which pipes video streams from various services into a video player - streamlink/streamlink github.com Win..

화상 모의면접 연습 플랫폼 개발 프로젝트 (2) - KeyCloak 활용해서 서비스 DB에 OAuth 인증 붙이기

Yapp 동아리의 개발 프로젝트였던 화상 모의면접 연습 플랫폼 "위더뷰" 개발에 백엔드 개발자로 중도 합류했다. github.com/witherview/witherview_backend witherview/witherview_backend🎯 위더뷰 Backend. Contribute to witherview/witherview_backend development by creating an account on GitHub.github.com기본적으로는 자바 스프링부트를 사용하지만, WebRTC의 경우 Node JS를 사용하는 구조다. 프론트는 React 기반이다. 중도에 합류해서 기존 코드와 구조를 어떻게 분석했는지 / 어떻게 개선방안을 찾아갔는지 생각을 정리하는 용도의 포스트. 이 당시 서비스 백엔드는 ..

화상 모의면접 연습 플랫폼 개발 프로젝트 (1) - 채팅 DB 아키텍처 고민하기

Yapp 동아리의 개발 프로젝트였던 화상 모의면접 연습 플랫폼 "위더뷰" 개발에 백엔드 개발자로 중도 합류했다. github.com/witherview/witherview_backend witherview/witherview_backend 🎯 위더뷰 Backend. Contribute to witherview/witherview_backend development by creating an account on GitHub. github.com 기본적으로는 자바 스프링부트를 사용하지만, WebRTC의 경우 Node JS를 사용하는 구조다. 프론트는 React 기반이다. 중도에 합류해서 기존 코드와 구조를 어떻게 분석했는지 / 어떻게 개선방안을 찾아갔는지 생각을 정리하는 용도의 포스트. 처음 프로젝트에 합류..

Java WebSocket과 Stomp로 간단한 채팅프로그램 만들기

WebSocket Http처럼 서버와 클라이언트 간 양방향 통신을 제공하는 프로토콜. 한 번 connection이 맺어지면, 서버 또는 클라이언트가 connection을 종료하기 전까지 계속 통신이 가능하다. 따라서 지속적으로 서버와 클라이언트가 high frequency / low latency로 통신해야 하는 경우 http보다 websocket 프로토콜이 유리하다. url로 topic을 지정한 채 메시지를 전송 해당 메시지가 Message Broker로 도달 (Simple Broker) Message Broker는 해당 토픽에 대응되는 response channel로 Route receiver가 메시지 수신. 이 과정을 진행하기 위해서는 Stomp라는 프로토콜이 추가로 필요. Stomp WebSock..