kotlin

  • ONNX를 이용하여 치와와와 머핀을 구분해보자.

    새로 구입한 디바이스가 몇개 있는데 이게 스냅드래곤 X 엘리트를 탑재했다. 요즘 AI 디바이스니 뭐니 하는데 이걸 써보려고 했다. 그런데 스냅드래곤 X 엘리트에서 사용하려면 ONNX 모델로 만들어야하니 그거까지 해보려고 대충 짰다. 그래서 주제는 뭐가 좋을까… 하다가 치와와와 머핀을 구분하는 모델을 만들어봅시다. 우선 데이터셋을 얻기 위해 Kaggle에 있는 데이터를 받습니다. https://www.kaggle.com/datasets/samuelcortinhas/muffin-vs-chihuahua-image-classification 학습도 ONNX로 되는거같긴한데… 이건 그냥 파이썬으로…

  • Spring Webflux 프로젝트를 진행하는데 코틀린만 쓰면 그게 바로 코프링 아니겠나! 싶었는데 아니었다. 보통 자바로 Webflux를 사용하면 리액티브 스트림을 써서 Mono나 Flux를 사용하게 되는데, 코루틴은 mono {}나 flux {}를 통해서 변환할 수 있었는데 아예 리액터를 안쓸 수 있었다… CoRouter DSL이 있는건 알았는데 뭔가 했더니 이거였다. 그래서 대충 보면서 리액터를 안쓰고 코루틴으로만 사용해봅시다. 일단 알아본건 이정도고… 뭐가…

  • 상태관리와 npm 라이브러리 래핑하는 법도 얼추 알겠으니 풀스택을 해봅시다. 백엔드는 자주 쓰는 Spring Webflux이다. 프로젝트 구조는 루트 프로젝트 밑에 backend (Spring Boot) + frontend (Kotlin/JS React) + shared library (공통 모델 정의) 이다. 가장 막혔던 부분은 shared library에 모델을 어떻게 정의해야하는가이다. 처음에는 인터페이스로 정의하고 각 프로젝트에서 재정의해야하나 했는데 그럴거면 시발 왜 이걸 씀하는 생각이 들었는데…

  • 리액트 기본 useReducer를 쓰는건 아무리 생각해도 너무 개같아서 결국 Zustand를 래핑해서 쓰기로 했다. 기존에는 Zustand를 통째로 들어서 Kotlin/JS 로 바꾸려는 원대한 꿈을 가지고 있었으나 사실 그럴 필요가 없는게 겉으로 공개된 API에 대한 인터페이스만 만들면 되는거라 그렇게 다시 접근… Mutate 가 결국에는 종착점이 StoreApi이기 때문에 이 끝점만 알면 되는거고 중간에 뭐가 있든 신경을 안쓰면 된다. 그래서…

  • 코틀린에서는 타입스크립트의 Partial 을 자체로 구현할 수 없다. 그런데 jso 를 통해 자바스크립트 객체를 만들면 코틀린에서 nullable이 아니더라도 설정한 필드만 설정이 되고 나머지는 설정하지 않는다. (undefined) 그래서 요즘에 State 관련해서 여러개 올렸는데 useReducer에 넘기는 리듀서의 리턴타입은 온전한 State여야하기 때문에 자바스크립트에서처럼 spread 연산자로 쓰고 싶은데 코틀린은 이걸 지원 안한다. 처음에는 Object.assign을 쓰면 되지 않을까 싶어서 썼는데…

  • TaskExecutor란 프로세스 내에 상주하고 있으면서 Task를 등록하면 그 Task를 실행해주는 녀석을 말한다. (내가 그냥 대충 지은거임) 이걸 몇년 전에 자바스크립트로 만든적이 있긴 한데 자바스크립트 특성 상 이게 어떻게 동작하는지 알 수가 없어서 (사실 지금 만든것도 이해가 잘 안됨) 좀 그랬는데 이걸 코루틴으로 만들어봅시다. 아래는 executor가 실제로 실행할 작업을 정의한 클래스이다. 얘는 진행상황을 알아야하기 때문이 진행률같은…

  • 2로 올린걸 사용하려는데 시발 제대로 작동 안하는 경우가 있었다. 그래서 그냥 다음과 같이 전역 메서드로만 구성하는게 해답일 것 같다. 미들웨어는 리덕스 미들웨어처럼 다음 상태도 알 수 있는 건 아니고(store를 구현한게 아니라서;) 그냥 받은 액션과 현재 상태만 로깅하는 용도다. 예시 카운터 사용법은 CounterContext.Provider 로 적절히 감싸고 CounterContext.useSelector나 Countercontext.useDispatch 를 쓰면 된다. 다음에 알아볼 것은 npm 라이브러리를…

  • 어제 쓴 게 좀 그래서 좀 더 살펴보니 useReducer라는게 있었지 참! 싶어서 그걸로 고쳤다. 처음에 ReducerAction을 data class 로 했었는데 에러가 나서 external interface로 바꿨다. data class를 자바스크립트로 트랜스파일 했을 때 문제가 일어나는 듯 하다.

  • zustand를 써보려고 했는데 완벽한 래퍼 라이브러리가 없다보니 사용하기 매우 불편하다. 그래서 래퍼를 만들려고 했는데 타입스크립트의 타입추론을 코틀린에서 구현할 수 없어서 포기했다. 그래서 코루틴을 쓰려고 했는데 이게 Kotlin/JS 에서도 정상으로 작동할 지 확인하기 귀찮다. 그래서 object를 이용해서 구현하려 한다. 리액트 Context를 사용하면 자식 컴포넌트들에도 같은 컨텍스트를 제공할 수 있으므로 이걸 사용합시다. 그래서 어떤 식으로 쓸까 예시로는…

  • 나는 처음 리액트를 공부할 때 상태관리는 보통 리덕스를 쓴다고 책에서 봤기 때문에 그냥 다른거 더 하기 귀찮아서 모든 것에 다 리덕스를 쓰려고 했다. 근데 3년전쯤에 리덕스는 웬만하면 전체 SPA에서 공통으로 써야하는 상태에나 어울린다고 생각하고 이게 또 사용하기 여간 귀찮은게 아니다보니 리액트 18이었나? 16이었나 useState 훅이 나온 이후로는 따로 상태관리 라이브러리 안쓰고 모든 걸 다 useState로…