Jaeyeol Lee

@kodingwarrior@hackers.pub · 263 following · 183 followers

Neovim Super villain. 풀스택 엔지니어 내지는 프로덕트 엔지니어라고 스스로를 소개하지만 사실상 잡부를 담당하는 사람. CLI 도구를 만드는 것에 관심이 많습니다.

Hackers' Pub에서는 자발적으로 바이럴을 담당하고 있는 사람. Hackers' Pub의 무궁무진한 발전 가능성을 믿습니다.

그 외에도 개발자 커뮤니티 생태계에 다양한 시도들을 합니다. 지금은 https://vim.kr / https://fedidev.kr 디스코드 운영 중

Github
@malkoG
Blog
kodingwarrior.github.io
mastodon
@kodingwarrior@silicon.moe

요즘 개발을 안하고 마케팅하고 프롬프트 돌려서 외주 포트폴리오 정리하고, 정리한걸 CSV 파일로 출력해서 그걸 Gemini한테 던지고 외주공고 복붙해서 지원서 생성 자동화해달라고 하는중...

3

요즘 개발을 안하고 마케팅하고 프롬프트 돌려서 외주 포트폴리오 정리하고, 정리한걸 CSV 파일로 출력해서 그걸 Gemini한테 던지고 외주공고 복붙해서 지원서 생성 자동화해달라고 하는중...

2
1

한국 페디버스 개발자 모임에서 주최한 스프린트에 다녀왔다. 기여하고자 했던 github.com/fedify-dev/fedify/i 는 또 JSON-ish 관련 이슈로 해결하지 못했지만 소규모 모임에서 얻을 수 있는 좋은 분위기와 에너지를 맘껏 느껴 좋았다. PR은 보내지 못했지만 Fedify 마스코트(이름 없음)로 키링 만들어 나눠드려 그나마 다행이었다. 행사 준비하고 진행해준 @hongminhee洪 民憙 (Hong Minhee) 님께 감사드린다.

페디버스 행사가 있는 날에 하필 트위터 서비스가 고장나서 오랜만에 마스토돈에 글 남겨본다 ㅋㅋ

페디파이 마스코트로 만든 키링맥북도 오랜만 코딩도 오랜만 스프린트도 오랜만지하철 2호선 타고 성수로 넘어가며 본 풍경이 상쾌했다.
5
0
4

다른 페디버스 서버에서 온 메시지라 그런가, 약간 외계인이 보낸 전파 신호를 감지한 느낌이 든다.

5
2
0
3

AI직원의 출근거부사태에 이어, 업데이트가 몇분째 없길래 뭐하고 있냐고 물으니까 황급하게 다시 일하기 시작했다(아마 이용자가 몰려서인것으로 예상). 졸기까지하고 사람 다 됐구만.

6
6

I've been thinking about adding a debug dashboard to that shows all activities being sent and received in real-time. This would include filters by activity type, detailed inspection of JSON-LD content, signature verification details, and retry management for failed deliveries.

As a , would you find this useful for troubleshooting federation issues? Any other features that would be helpful in such a debugging tool?

1

The Official Python Documentary has published their teaser trailer at PyCon US 2025, and I'm so honored to be part of the story of Python along with other prominent Python figures.

Check the trailer, and watch the official launch of the documentary at EuroPython later this year.

youtu.be/pqBqdNIPrbo

0
5
1

요즘은 내가 코드를 짤 일은 없고, 개발계획도 AI가 짜고, 개발을 실제로 하는것도 AI가 한다. AI가 좀 핀트 어긋난 것 같으면 내가 잠깐 수정해주는 정도? 누가 보면 바이브 코딩이지만, 엄밀하게는 "바이브 코딩"은 아니다.

요즘 애용하고 있는 워크플로우는 이렇다.

  1. Gemini 웹 대화창 띄워서 "~~한 요구사항이 있어. 시니어 개발자로서 어떻게 작업을 이어나갈지 계획을 알려줘" 하고 마스터 플랜을 뽑는다
  2. Gemini에서 응답이 오면, "AI 한테 그걸 시킬건데, AI가 이해할 수 있게 스텝 바이 스텝으로 XML 포맷으로 지시사항을 알려줘. 각각의 지시사항은 하나하나 검토하기 편하게, 여러개로 분리된 파일이었으면 좋겠어" 라고 프롬프트를 순차적으로 뽑아낸다
  3. 검토할 거 검토해보고, 적당히 괜찮겠다 싶으면, 프롬프트를 Aider든 뭐든 AI에다가 복붙하면 끝.
  4. 최종 결과는 Repomix 돌려서 Gemini 웹 대화창에 올리고, 1~3을 반복

중소규모 플젝은 이게 잘 먹히고, 3주에 걸쳐서 할 것 같았던 작업을 3일컷으로 끝냈다.

9
1
3
1
1

( ~ 5/31) 제 3회 파이 웹 심포지움 참가자 모집

< 이 행사는 한빛미디어의 장소 후원을 받았습니다 > 주제: AI 시대를 위한 파이썬으로 웹 서비스 개발하기

최근 파이썬이 가장 많이 쓰이는 분야는 단연코 AI입니다. 이제 AI 서비스에 웹 개발이 필요해지는 순간이 많아졌습니다.

웹 서비스 개발 뿐 아니라 openai 나 bedrock같은 AI 서비스의 api 를 이용한 또 다른 서비스를 만들어야합니다.

AI 서비스를 만들면서 겪은 웹 서비스 기술을 함께 나누어보세요! 세션이 끝난 이후엔 다과와 함께 네트워킹 시간도 가질 수 있습니다.

일시 : 2025년 5월 31일 (토) 13:00 ~ 18:00 장소 : 서울특별시 서대문구 연희로2길 62 한빛미디어 리더스홀

https://event-us.kr/pythonkorea/event/103147

1
4

5월 24일(土) 한국 연합우주 개발자 모임(FediDev KR)에서 두 번째 스프린트 모임을 개최합니다! 장소는 뚝섬역 5번 출구쪽에 위치한 튜링의 사과(@TuringAppleDev튜링의 사과)입니다.

참고로 스프린트 모임이란 함께 모여서 오픈 소스 코딩을 하는 자리인데, 한국 연합우주 개발자 모임의 스프린트에서는 새로운 연합우주 서비스나 앱을 개발하거나, 번역이나 문서에 기여하는 등 연합우주와 관련된 다양한 오픈 소스 활동을 모여서 함께 합니다. 지난 스프린트 모임의 기록을 스프린트 블로그(@sprints.fedidev.kr한국 페디버스 개발자 모임)에서 살펴보실 수 있습니다.

저는 그날 Fedify, Hollo, Hackers' Pub에 기여하시고자 하는 분들을 옆에서 도와드릴 예정입니다. Fedify, Hollo, Hackers' Pub에 기여해보고 싶었던 분들이 계시다면 모임에 참가하여 저와 함께 스프린트를 해보는 것도 좋을 것 같습니다.

이번 모임에 관심이 있으신 분은 행사 신청 페이지를 참고하시기 바랍니다.

7
1
3
2
5

Jaeyeol Lee shared the below article:

논리와 메모리 - 논리와 저수준(Low-level) 자료 표현(Data representation) (2 편 중 2 편)

Ailrun (UTC-5/-4) @ailrun@hackers.pub

이 글은 "논리적"이 되는 두 번째 방법인 논건 대수를 재조명하며, 특히 컴퓨터 공학적 해석에 초점을 맞춥니다. 기존 논건 대수의 한계를 극복하기 위해, 컷 규칙을 적극 활용하는 반(半)공리적 논건 대수(SAX)를 소개합니다. SAX는 추론 규칙의 절반을 공리로 대체하여, 메모리 주소와 접근자를 활용한 저수준 자료 표현과의 커리-하워드 대응을 가능하게 합니다. 글에서는 랜드(∧)와 로어(∨)를 "양의 방법", 임플리케이션(→)을 "음의 방법"으로 구분하고, 각 논리 연산에 대한 메모리 구조와 연산 방식을 상세히 설명합니다. 특히, init 규칙은 메모리 복사, cut 규칙은 메모리 할당과 초기화에 대응됨을 보여줍니다. 이러한 SAX의 컴퓨터 공학적 해석은 함수형 언어의 저수준 컴파일에 응용될 수 있으며, 논리와 컴퓨터 공학의 연결고리를 더욱 강화합니다. 프랭크 페닝 교수의 연구를 바탕으로 한 SAX는 현재도 활발히 연구 중인 체계로, ML 계열 언어 컴파일러 개발에도 기여할 수 있을 것으로 기대됩니다.

Read more →
12

웹 브라우저 엔지니어링 https://browser.engineering 고성능 브라우저 엔지니어링 https://hpbn.co

요렇게 두개 번갈아서 공부하면서 기록으로 남기면 CS 향이 첨가된 프론트엔드 면접 준비하긴 괜찮을 것 같음. 전자는 웹브라우저 구현 그 자체에 대해 다루고 있다면, 후자는 웹브라우저로 서비스를 이용하는 전반적인 사이클 + 각 단계에서 성능을 최적화하는 방법을 설명하고 있음.

사실 후자는 좀 프로토콜이랑 그 응용에 좀 더 포커스를 둔 느낌이긴 하다. 이걸 엮어서 글로 써낼지.. 아니면 강박을 내려놓고, 생각이 나는 소재로 글을 쓸지... 근데 면접 준비는 하긴 해야겠는데, 고민이다.... 스터디라도 해야하나....

2

웹 브라우저 엔지니어링 https://browser.engineering 고성능 브라우저 엔지니어링 https://hpbn.co

요렇게 두개 번갈아서 공부하면서 기록으로 남기면 CS 향이 첨가된 프론트엔드 면접 준비하긴 괜찮을 것 같음. 전자는 웹브라우저 구현 그 자체에 대해 다루고 있다면, 후자는 웹브라우저로 서비스를 이용하는 전반적인 사이클 + 각 단계에서 성능을 최적화하는 방법을 설명하고 있음.

3

Next.js 서버 액션은 서버 데이터를 가져오는 용도로 사용하기에 적합하지 않다. React 공식문서에서는 다음과 같이 말하고 있다.

Server Functions are designed for mutations that update server-side state; they are not recommended for data fetching. Accordingly, frameworks implementing Server Functions typically process one action at a time and do not have a way to cache the return value.

서버 액션이 여러 호출되면 바로 실행되는 대신 큐에 쌓이고 순차적으로 처리된다. 이미 실행된 서버 액션은 이후 취소할 수 없다.

이에 서버 액션을 데이터 가져오기로 활용하면 끔찍해지는 UX가 생길 수 있는데, 예를 들어 페이지의 목록 검색 화면에서 검색 후 데이터를 가져오는 상황에 않았다고 다른 화면으로 네비게이션이 불가능한 것은 일반적인 경험이 아니다.

이러면 RSC를 통해 무한 스크롤을 구현하지 못하는가? 에 대해서 의문이 생길 수 있는데 여기에 대해서 대안을 발견했다.

function ServerComponent({ searchParams }) {
  const page = parseInt((await searchParams).page ?? "1", 10)
  const items = await getItems(page)
  return (
    <Collection id={page}>
      {items.map(item => <InfiniteListItem key={item.id} {...items} />)}
    </Collection>
  )
}
"use client"

function Collection({ id, children }) {
  const [collection, setCollection] = useState(new Map([[id, children]]))
  const [lastId, setLastId] = useState(id)
  if (id !== lastId) {
    setCollection(oldCollection => {
      const newCollection = new Map(oldCollection)
      newCollection.set(id, children)
      return newCollection
    })
    setLastId(id)
  }
  return Array
    .from(collection.entries())
    .map(
      ([id, children]) => <Fragment key={id}>{children}</Fragment>
    )
}

대충 이런 꼴이다. 이러고 page를 증가시키거나 감소시키는건 intesection observer나 특정 엘리먼트의 onClick 이벤트 따위를 의존하면 된다. 이러면 데이터 가져오기 패턴을 RSC 형태로 의존할 수 있다. InfiniteListItem는 서버컴포넌트, 클라이언트컴포넌트 무엇으로 구현하더라도 상관없다. 가령 아래와 같은 식:

function ServerComponent({ searchParams }) {
  const page = parseInt((await searchParams).page ?? "1", 10)
  const { items, hasNext } = await getItems(page)
  return (
    <div>
      <Collection id={page}>
        {items.map(item => <InfiniteListItem key={item.id} {...items} />)}
      </Collection>
      {hasNext && (
        <IntersectionObserver nextUrl={`/?page=${page + 1}`} />
      )}
    </div>
  )
}

검색 조건이나 검색어에 따라 상태를 초기화시키려면 다음과 같이 표현하면 된다.

function ServerComponent({ searchParams }) {
  const page = parseInt((await searchParams).page ?? "1", 10)
  const query = parseInt((await searchParams).query ?? "")
  const { items, hasNext } = await getItems(page, query)
  return (
    <div>
      <Form action="/">
        <input name="query" />
        <button />
      </Form>
      <Collection id={page} key={query}>
        {items.map(item => <InfiniteListItem key={item.id} {...items} />)}
      </Collection>
      {hasNext && (
        <IntersectionObserver nextUrl={`/?page=${page + 1}&query=${query}`} />
      )}
    </div>
  )
}

매우 PHP스럽고, 암묵적이기도 하다. 다만 RSC의 데이터 가져오기 패턴을 활용하면서 기존 컴포넌트를 최대한 재사용할 수 있게 된다는 점이 좋다.

2
1
0
2
2
2
0

백엔드는 모르겠고, 프론트엔드 대상으로는 많이들 권장하는 책이던데 네트워크 교과목이 실제로 어떻게 도움되는지 얘기하려면 '이거 읽는데 드는 시간이 몇배는 줄어든다' 정도로는 확 체감되게 설명은 가능할 것 같다

진심 나 이 책 가지고 프론트엔드, SRE, 백엔드 요렇게 모아놓고 스터디 한번 해보고 싶어. 책 자체가 좀 근본이기도 하고, 각자 다른 관점의 실무를 하는데 맥락이 어떻게 이어지는지도 좀 궁금해

4

커서를 제대로 사용하는 12가지 방법
------------------------------
* 커서 디자이너가 말하는 커서 사용법인데, 잘 몰랐던 내용들이 있어 공유드립니다.
1. Cursor는 프로젝트 별로 규칙(Rules)을 세울 수 있음. Cursor > Setting > Cursor Settings로 접근하면 됨
2. Cursor는 .cursurignore 기능이 있어서, 테스트 케이스 파일을 편집할 수 없게 할 수 있음
3. .cursor 폴더 안에…
------------------------------
https://news.hada.io/topic?id=20595&utm_source=googlechat&utm_medium=bot&utm_campaign=1834

1
0
0
1