Profile img

bgl gwyng

@bgl@hackers.pub · 98 following · 123 followers

GitHub
@bglgwyng

bgl gwyng replied to the below article:

스마일 PRO 라식 수술 후기

자손킴 @jasonkim@hackers.pub

오랫동안 안경 생활에 익숙해져 시력 교정의 필요성을 느끼지 못하던 저자가 스쿠버 다이빙 중 겪은 불편함을 계기로 스마일PRO(SMILE Pro) 수술을 결심하고 진행한 상세한 과정을 다룹니다. 정밀 검사를 통해 각막 두께와 안압의 정상 상태를 확인하고, 노안(presbyopia) 발생 가능성을 고려하여 교정 시력을 미세하게 조정하는 상담 과정을 거쳤습니다. 수술 과정에서 레이저 조사(laser irradiation) 시 초록색 불빛에 시선을 고정하는 기술적 고충과 개인별 안구 각도에 따른 정렬 최적화의 중요성을 생생하게 묘사합니다. 수술 직후 발생하는 일시적인 눈시림과 이물감을 극복하며 시력이 점진적으로 회복되는 단계별 변화를 기록하고 있으며, 철저한 사후 관리와 안약 투여의 필요성을 강조합니다. 이 글은 시력 교정술을 고민하는 이들에게 수술 당일의 긴장감 넘치는 진행 과정과 실제 회복 단계에서 얻을 수 있는 구체적인 인사이트를 제공하며 안경 없는 새로운 삶의 가치를 전달합니다.

Read more →
2
1

@bglbgl gwyng

전 LangChain / LangGraph에 비하면 Vercel AI SDK가 훨씬 sane하다고 생각합니다 ^_ㅜ… 원래 에이전트를 LangChain으로 만들다 이제 Vercel AI SDK에 정착했습니다.

Tool calling은 무엇을 써서 만들어도 안에선 결국 LLM이 호출할 함수와 실행 인자 토큰을 보내면 그걸 provider의 SDK나 그걸 감싼 라이브러리(e.g. LangChain or AI SDK)에서 schema validation을 하고 실패하면 retry를 시키고 하면서 사실상 자기 혼자서 멀티 턴처럼 수행합니다.(그러다가 루프가 나거나 하지 않도록 안에서 상태 머신을 만들고 depth라던가 제한하는거구요.) 그리고 각 파트가 업데이트되고 토큰을 계속 업데이트하다가 동작이 모두 끝나면 그 Part 속 전체 메세지와는 별개의 Message 전체 출력이 나온다는 점에서 이 방식이 맞다고 생각합니다.

저흰 클라이언트와 서버가 굉장히 구분된 편이긴 한데, 서버에서 SSE로 스트림 돌면서 text-delta이면 토큰 이벤트로 추가된 토큰을 내려주고, 스트림이 다 끝나면 전체 텍스트를 가져와서 완료 이벤트로 전체 텍스트를 한번 더 내려주고 대화 제목 업데이트가 필요하면 대화 제목 만들어서 대화 제목 이벤트 보내주고 완료 시점에 데이터베이스에 저장하고 완료 이벤트를 내리고 있습니다. + 클라이언트의 SSE 연결이 끊어져도 해당 작업은 계속 백그라운드에서 돌게만 해두었습니다.

아마 저희가 AI SDK의 프론트엔드 컴포넌트를 쓰지 않고 별도로 자체적으로 이벤트 목록과 스키마를 정해서 그걸로 컴포넌트를 만들어서 크게 스트레스를 못 받는 것일지도 모르겠네요.

@nebuletoHaze 멀티턴을 Message 여러개하는 걸로 할수있지 않나요? 멀티턴을 위해 Part가 필요한지 모르겠습니다.

별개로 말씀하신 구현이 저의 구현이 비슷할거 같습니다. 저도 Vercel AI SDK는 그냥 프로바이더들의 공통 인터페이스로만 쓰고 실제로 delta다루는 로직은 직접 다 하고있습니다.

0

@nebuletoHaze Vercel AI SDK에 대한 불만은 인용에 써놨구요, 챗봇 UI에서는 서버에서 상태를 스트리밍으로 받와야하는데(저도 SSE 쓰고 있습니다), 이 시나리오에서 NextJS가 사실상 도움이 안됩니다.

0

NextJS 처음 써보는데, 챗봇 UI처럼 인터액티브한 웹앱을 만들때 도움이 되는 부분이 뭔지를 모르겠다. 처음엔 SPA + API 서버 만드는것과 비교해, 자명한 데이터 바인딩 보일러플레이트를 줄여줄거라 생각했다. 근데, 순수 SSR로 처리할 수 없는, 클라에서 상태를 업데이트하는 약간만 복잡한 플로우에서도 전혀 도움이 안된다.

2
3
2

그동안 Nix 쓰면서 고통도 많이 받았는데 그래도 주변에 꾸준히 Nix를 권한다. Nix가 '빌드'라는 소프트웨어 개발의 아주 일반적인 문제를 한방에 푸는 방법론이기 때문이다. 물론 아직 몇가지 문제가 좀 있지만(잘 안된다, 불편하다 식의 단순한 문제는 아니다), 나 자신도 그 해결책을 위한 몇가지 아이디어를 가지고 있고, 머지않은 미래에 풀릴거라 생각한다.

UNIX 철학이 작은 기능을 확실하게 수행하는 프로그램들을 만들어 조합하자인데, ls, cat, grep 등이 그 예시다. 내가 볼땐 Nix도 생각도 거기에 해당된다. Nix도 좋은 의미로 의외로 꽤 작다.

5

@hongminhee洪 民憙 (Hong Minhee) Vercel AI SDK에서 제가 문제점이라고 느낀 디자인을 그대로 갖고 있네요. 사실 저도 아직 충분히 고민해보진 못했고 반대 의견은 매우 환영입니다.

제가 문제라고 느낀 부분은 Message 타입 밑에 Part가 있는 건데요. 그러니까 LLM의 응답이 플랫하게 Message[]이 아니라 Message[].Part[]가 됩니다. Part는 Plain Text거나 Tool Call일 수 있습니다. 그런데 이게 메시지를 DB에 저장하고 Streaming UI를 만들때 불편합니다. 그냥 Part를 없애고 Message만 있으면 좋겠어요.

처음에 저런식의 디자인을 한 동기를 추측해보자면, Message[]를 User/Assitant/User/Assistant/... 이렇게 번갈아 나타나는 형태를 기대하고, 그걸 만족시키려면 Assistant/Assitant 이렇게 연달아 나타나는걸 피해야하니 Part를 도입한게 아닌가 싶습니다. 근데 실제론 저 번갈아 나타나야한다는 조건이 타입으로 강제도 안되고(이건 어려우니 OK) 런타임에서 뭐라고 하지도 않아요. 그리고 실제 사용에서 연달아 나타나는걸 허용하는게 오히려 자연스럽습니다.

그래서 처음에 잠깐 잘못 생각해서 나온 디자인이, 실제론 의도한 제약을 주고있지도 못하고 그냥 쓰임만 불편하게 만들고 있는거 같습니다.

2
1
1
0
4

요즘 개발자들 만나면 죄다 AI 얘기밖에 안하는데, 대부분 ‘동물원 가서 코끼리 봤어’ 수준의 이야기라 다 들어주기가 피곤하다. 여기서 들은 얘기 저기서 또 들어야하고.

10

bgl gwyng shared the below article:

Claude API의 Request Body 분석

자손킴 @jasonkim@hackers.pub

Claude API를 효과적으로 활용하기 위해 반드시 이해해야 할 요청 본문(Request Body)의 네 가지 핵심 구성 요소를 살펴봅니다. 우선 시스템 메시지(System Messages)는 모델의 페르소나와 제약 사항을 정의하는 최상위 설정으로, 응답의 톤과 매너를 결정짓는 중추적인 역할을 수행합니다. 메시지(Messages) 배열은 사용자와 어시스턴트(assistant) 간의 대화 흐름을 관리하며, 특히 어시스턴트의 답변을 미리 작성하는 프리필(Prefill) 기법이나 도구 사용(tool_use) 및 결과(tool_result)를 주고받는 상호작용의 핵심이 됩니다. 여기에 제이슨 스키마(JSON Schema)를 기반으로 도구(Tools)를 정의하면 모델이 복잡한 작업을 수행하기 위해 필요한 기능을 스스로 판단하고 호출할 수 있게 됩니다. 마지막으로 모델 선택과 토큰 제한, 확장 사고(Extended Thinking) 예산 등을 조절하는 모델 및 구성(Model & Config) 옵션을 통해 API 동작의 세부 사항을 정교하게 제어할 수 있습니다. 이 네 가지 요소의 구조와 유기적인 연결 방식을 이해하면 Claude의 능력을 극대화하여 더욱 강력한 인공지능 애플리케이션을 설계할 수 있는 핵심적인 통찰을 얻게 될 것입니다.

Read more →
3

"OOO 주식회사 OOO 대표님 맞으시죠? 산업안전보건교육 받아야 하는 업체에 해당합니다. 직원이나 프리랜서 고용 있으시죠? 어쩌고~" 일단 쎄한 느낌을 받았습니다. 다다다 쏴붙이면서 중간에 질문할 틈을 최대한 막으면서 가는 꼬락서니가 관공서는 아니구나 싶었습니다. 고용이나 프리랜서 없다고 하니, 뚝 끊어 버립니다. 검색해보니, 이런식의 반쯤 사기같은 행태가 존재한다고 하네요. 소규모 법인 대표님들 조심하세요~

3
5

Zed 에디터 써보는 중인데 Git 연동이 좀 부실하다. 보통은 GitKraken이나 lazygit 등의 도구를 병행해서 쓰니까, 꼭 에디터에서 Git을 빵빵하게 지원해야하냐는 의문은 든다. 다만 Git의 특정 기능들은 에디터 연동이 불가피한데(diff 보기, conflict 해결하기 등), 이런거보면 에디터가 Git의 인터페이스가 되어야하는거 같기도하고 그렇다.

5

Nushell 반나절동안 썼는데, 지금까지 문제는... 그 리치한 기능을 전혀 안 썼다는것이다. 그래서 단지 zsh와 비교해 익숙하지않음+플러그인부족에서 기인한 불편함만 체험하고 말았다.

3

언제까지 (a:number, b:number) => a + b, (a:string, b:string) => a + b, <T>(a: T, b: T) => a + b 를 해줘야 하나고
그냥 대충 눈치껏 (a, b) => a + b 하면 'ba 와 더할 수 있어야 하는 타입이고 a 는 무언가와 더할 수 있는 타입이구나' 하고 추론할 수 있는 분석기가 달린 언어가 필요함

6
0


하드디스크 처분합니다.
모든 제품 베드섹터 없으며 정상동작 확인 했습니다.
전문 업체가 아니다 보니 자체 A/S는 불가 하며 중고입니다.
각 디스크 별 상태 정보도 같이 첨부 드립니다.

택배비 미 포함 가격이며 택배비는 상황에 따라 일정하지 않아서 제가 따로 알려드리겠습니다.

1. 500GB 16MB 7200RPM 삼성 2만원(학생 할인가 1만원)
2. 250GB 8MB 7200RPM WD 1만 5천원(학생 할인가 5천원)
3. 160GB 8MB 7200RPM 씨게이트 무료

씨게이트는 멀쩡한걸 확인했지만 아무래도 씨게이트인지라 무료 입니다.

0

글풍선에 작성자 프로필 이미지를 이제야 붙였습니다. 붙이고 나니, 필수 요소겠구나 하는 생각이 듭니다. 작성한 글은 자신을 표현하는 일부인데, 내 글인지 표시가 없으면, 내가 누군가에게 표현했다는 느낌이 반감되는 것 같습니다.
yearit.com

글풍선의 프로필 이미지
1
primes :: (Integral a) => [a]
primes = 2 : ([3, 5 ..] & filter (not . has_divisor))
 where
  has_divisor n =
    any ((0 ==) . (n `mod`) . fst) $ takeWhile ((n >=) . snd) primes_with_square
  primes_with_square :: (Integral a) => [(a, a)]
  primes_with_square = [(p, p * p) | p <- primes]

euler project 문제 풀다가..

1

리액트의 dumb component는 이름과달리 약간은 더 똑똑할 필요가 있는데. dumb component는 업데이트를 반드시 부모를 통해서만 해야한다. 이때 fine-grained reactivity로 성능을 높이려면 (딱히 별 하는 일도 없는) wrapper가 필요하다. 그리고 데이터 페칭과 관련될 경우 또 wrapper를 반드시 만들어 줘야한다.

이걸 어떻게 해결할수 있나? dumb component가 Props로 raw value가 아닌 signal을 받게하는 것이다. 아쉽게도 현재 JS에 표준 Signal 인터페이스가 없기에 jotai atom 등을 써야하는데, 그러면 컴포넌트가 프레임워크에 의존하게 되어 덜 dumb해지는 문제가 있다.

2

어쩌다 커서, 윈드서프 대신에 오리지널 VS Code + 코파일럿을 쓰고 있는데, AI의 UX 통합이랑 측면에선 이쪽이 더 낫네? 윈드서프는 채팅 UI 벗어나면 잡버그때문에 못쓸 수준이다.

2
3
1
0

bgl gwyng shared the below article:

Stop writing if statements for your CLI flags

洪 民憙 (Hong Minhee) @hongminhee@hackers.pub

Traditional CLI development often involves writing repetitive runtime validation logic to manage complex dependencies between various flags and options. While modern TypeScript-first libraries have improved individual option parsing, they frequently fail to encode these inter-dependencies into the type system, resulting in loose types that necessitate manual checks. Optique solves this problem through its conditional combinator, which treats option relationships as a primary architectural concern. By utilizing a discriminator value to select specific branches of a parser, it enables the automatic inference of precise discriminated unions. This ensures that certain flags are strictly required or forbidden based on the values of other options, effectively shifting validation logic from runtime to the compiler. Whether modeling database connection strings or authentication protocols, the structure of the parser serves as the ultimate constraint. This methodology eliminates the need for manual validation code and ensures that the type system remains the single source of truth throughout the application's lifecycle. Embracing structural parsing over manual validation significantly enhances the reliability and maintainability of sophisticated command-line tools.

Read more →
7

한 해를 마무리하는 글을 블로그에 썼습니다: 〈聯合宇宙(연합우주)와 함께 한 2025()〉(한글 專用文(전용문)이쪽). 題目(제목) 그대로 聯合宇宙(연합우주)와 함께 했던 저의 한 해를 되돌아 보는 글입니다. 聯合宇宙(연합우주) 德分(덕분)에 많은 因緣(인연)과 이어지게 되어서 感謝(감사)하게 생각합니다.

Fediverse Advent Calendar 2025の10日目に参加する記事をブログに投稿しました:「フェディバースと過ごした2025年」。タイトルの通り、フェディバースと共に過ごした私の一年を振り返る内容です。フェディバースのおかげで多くのご縁に恵まれ、感謝しています。これからもよろしくお願いします。

2

Fediverse Advent Calendar 2025の10日目に参加する記事をブログに投稿しました:「フェディバースと過ごした2025年」。タイトルの通り、フェディバースと共に過ごした私の一年を振り返る内容です。フェディバースのおかげで多くのご縁に恵まれ、感謝しています。これからもよろしくお願いします。

0

Vercel 제품들은 딱 봐도 설계가 너무 구리게 느껴지는데, 그렇다고 깊게 생각해보진 않고 또 쨋든 사람들이 젤 많이 쓰긴하니까, 내 느낌이 잘못된건지 헷갈린다.

1

Released Optique 0.8.0, a type-safe CLI parser for TypeScript.

This version adds conditional() for branching based on a discriminator option, passThrough() for forwarding unknown options to underlying tools, and a new @optique/logtape package for configuring LogTape via CLI.

https://hackers.pub/@hongminhee/2025/optique-080

4
2
4

SolidJS로 앱 만들다가 아이콘셋이 필요해져서 패키지를 뒤져보는데, 마이너 생태계답게 마지막 업데이트가 삼사년 전인 패키지들만 나온다. 아이콘셋에 업데이트가 필요 없긴 하지. 그래도 최근에 업데이트 된 패키지가 걸리적거리는게 없을 것 같달까. 그러다 활발히 업데이트 중인 unplugin-icons를 찾았다. 이것은 SolidJS용 패키지가 아니었다. 아이콘셋도 아니었다. 거의 모든 아이콘셋을 거의 모든 프레임워크에서 사용할 수 있게 해주는 도구다. 이런 문물이 있었다니. 누가 만들었나 함 보자. 제작자는 Anthony Fu... 아아 또 그인가. 오늘도 비 React 웹 생태계엔 Anthony Fu의 은혜가 넘친다.

6
0

(최근에 직장을 옮겨 풀타임 근무를 시작함)

새 동료들과 이야기하다 함수형 언어 이야기가 나왔는데, 밈에 불과한 이야기만 나와서(함수형 언어 사용자들의 컬트스러움 등) 좀 아쉬웠다. 답답하거나 짜증난다기 보단, 빨리 그부분을 스킵하고 진짜 재밌는 이야기로 넘어갔으면 하는 생각이 들었다. 다행히 동료들이니 앞으로 이야기할 기회가 아주 많을 것이다.

불변성, 사이드이펙트 없음, 아름다움(?) 추구 등의 이야기가 나왔는데, 물론 다 함수형 언어와 관계있지만 본질적인건 아니다. 내게 함수형 언어는 코드를 조합하는 방법을 연구하고, 조합이 잘되는 코드를 짜는걸 실천하는 것이다. 이를 통해 많은 것을 공짜로 안전하게 얻는 것이 목표이다. 그래서 '함수형'의 칭호를 부여받지 못한 방법론들은(ex: 상속), 그냥 해보니까 조합성에 한계가 있어서, 설계를 구성하는 근본적인 요소로 포함시키기에 부적절하다고 결론이 내려졌을 뿐이다. 그럼... 그냥 좋은 방법들을 엄선해놓은게 함수형인가? 그럴지도? 다함께 좋은거 합시다.

12
2
2
1
2

개인 맵 Private map을 가질 수 있고, 연인, 가족이나, 지도를 공유하면 좋은 동호회(낚시, 캠핑, 라이딩...) 분들이 공유할 수 있는 맵으로 쓸 수도 있습니다.

맵에 아무나 읽을 수 있는 권한을 주고, 블로그나, 회사 페이지 등에도 임베드할 수 있습니다.

아직은 UI가 심히 엔지니어 손 맛인데, 계속 고민하고 있습니다.

yearit.com

권한설정Private Map
5
1
5