Lobsters Interview with Matklad https://lobste.rs/s/ntruuu #person

洪 民憙 (Hong Minhee)
@hongminhee@hackers.pub · 855 following · 606 followers
Hi, I'm who's behind Fedify, Hollo, BotKit, and this website, Hackers' Pub! My main account is at @hongminhee洪 民憙 (Hong Minhee).
Fedify, Hollo, BotKit, 그리고 보고 계신 이 사이트 Hackers' Pub을 만들고 있습니다. 제 메인 계정은: @hongminhee洪 民憙 (Hong Minhee).
Fedify、Hollo、BotKit、そしてこのサイト、Hackers' Pubを作っています。私のメインアカウントは「@hongminhee洪 民憙 (Hong Minhee)」に。
Website
- hongminhee.org
GitHub
- @dahlia
Hollo
- @hongminhee@hollo.social
DEV
- @hongminhee
velog
- @hongminhee
Qiita
- @hongminhee
Zenn
- @hongminhee
Matrix
- @hongminhee:matrix.org
X
- @hongminhee
Re-activate the blog building. What do we think o3o ?
foo buzz bar
해커스펍에선 안되던 기능 바로 가져와버리기~
Open source projects I'm currently maintaining:
- Fedify, an ActivityPub server framework for TypeScript
- Hollo, an ActivityPub-enabled single-user microblogging software
- BotKit, an ActivityPub bot framework for TypeScript
- LogTape, a modern logging library for TypeScript
- Upyo, a simple and modern email sending library for TypeScript
- Optique, a type-safe combinatorial CLI parser for TypeScript
머지가 되었다는 소식
논문을 방금 제출했는데 접수 번호를 팝업으로만 띄워주고 메일로는 아무 연락이 없다… 아직 제출 기한 내 이기도 하고 다시 검토하다 보니 한줄 잘못 엔터친 부분도 수정해야 하는데 ㅠㅠ
僕がActivityPubを始めた理由 - Yaruki NotFound
AI 에이전트와 도구를 결합하는 방법 중 하나인 "재귀적 신경신호 제어 역전(recursive neuro-symbolic IoC) 패턴"에 대해 정리했다. 이름이 너무 거창해서 마음에 쏙 들지는 않지만 정확한 명명이라서 그냥 그렇게 정했다. https://wiki.g15e.com/pages/Recursive Neuro-Symbloic Inversion of Control
GitHub Classroom을 사용해서 온라인 저지 시스템을 구축해본 후기입니다.
https://theeluwin.github.io/article/online-judge-with-github-classroom/
실제로 사용하고 싶었으나, 제 결론은... 안쓰는쪽으로 났습니다. 이유는 결국, 문제 출제하는 UI/UX가 좋지 않다는 것입니다. 제가 고생을 덜 해야만 하니까요(,,,,) 암튼 GitHub Classroom이 문서도 제대로 안되어있기도 하고, 기능이 아직 좀 오락가락 합니다. 없는 기능도 너무 많구요. 제 검토를 참고해주십시오, , ,
이제 Cutter에 include 기능이 생겼다. 이제 정말 라이브러리를 짜기 시작할수 있다는 뜻.
https://github.com/makachanm/questionbasket
셀프호스트 1인용 익명 질문함 서비스의 백엔드까지는 전부 짜긴 했지만 프론트엔드를 맡아줄 사람이 없어서 그냥 백엔드 API만 작동하는 정도로 남겨두었다. 언젠간 완성할수도 있지만... 일단은 이정도 완성시킨걸로 만족하기로 하자. Gemini 없었으면 4달 전에 진행하다 버린 프로젝트를 오늘 완성시킬순 없었을거다.
펍냥이와 고양이 두부
오늘의 개인 개발
https://github.com/dodok8/discord-aladin 을 개선해서, 알라딘 URL 을 넣으면 상세 설명을 답변으로 달아주는 기능을 넣었다.
진짜 미치겠네 왜 같은 WebDAV 서버에 요청보내는데 iOS랑 macOS랑 웹브라우저랑 결과가 다르지
지나친 자동화로 인해 '과정에 담긴 가치'가 훼손되어 당장의 편리함과 장기적인 이득을 맞교환하는 실수를 종종한다. 자동화를 잘해서 과정에 담긴 가치를 오히려 증강시킨 사례를 정리해봤다. https://wiki.g15e.com/pages/Augmenting values in the process
역시 수제코딩을 해야 감각이 늘고 리터러시가 생긴다..... 뇌에 힘주고 해야하는건 수제코딩..
책 샀음. 공부의 목적이라기 보단 존재하길래 샀다.
라이프타임의 추론에 대해서 정리를 하고 walkthrough를 작성해봐야겠다
오늘의 서커스 내용 세션의 정보를 가져오는데 세션의 앱은 ApplicationGrants를 받아야 하고 세션의 프로필 ID는 ApplicationGrantProfiles으로 프로필별 승인을 받거나 전체 프로필 승인(ApplicationGrantProfiles.profileId == null)을 받야아 가져올 수 있는데 세션의 프로필을 헤더로 오버라이드할 수 있고 오버라이드된 프로필 역시 위 조건을 지키는 경우만 리턴되게 하는 쿼리를 짰어요
곰곰이 생각해보니 취약점이 있는 거 같아서 5중 조인으로 업그레이드되게 생김
SQL 조인 서커스가 진짜 머리아픈데 진짜 재밌어서 이거만큼은 손으로 짜고 싶어
오늘의 서커스 내용 세션의 정보를 가져오는데 세션의 앱은 ApplicationGrants를 받아야 하고 세션의 프로필 ID는 ApplicationGrantProfiles으로 프로필별 승인을 받거나 전체 프로필 승인(ApplicationGrantProfiles.profileId == null)을 받야아 가져올 수 있는데 세션의 프로필을 헤더로 오버라이드할 수 있고 오버라이드된 프로필 역시 위 조건을 지키는 경우만 리턴되게 하는 쿼리를 짰어요
바이브코딩으로 쌓아올려진 레거시와,,,, 듣다 보면 말은 되지만 구현하기 까다로운 요구사항과,,,, 염가에 후려쳐진 가격과,,,, 폭탄 돌리기로 넘겨받은 동작도 안되는걸 빈칸채우기 해야 하는 모든 상황이,,, 너무나도 부정하고 싶군아,,,
하 오늘은 작업하는데 LLM이 자기 맘에 안 든다고 홈서버 tailscaled를 꺼버렸다... 집에 가야지...
오픈소스 쓸 때 마음가짐
SQL 조인 서커스가 진짜 머리아픈데 진짜 재밌어서 이거만큼은 손으로 짜고 싶어
홈서버 곧 도착하면 어떤 서비스를 올려볼지 고민이네요 혹시 추천해 주실만한 서비스 있으신가요? 일단 아래는 생각 중인 목록입니다.
- https://immich.app/
- https://hollo.social/
- https://botkit.fedify.dev/
- Fly.io 에서 운영 중인 디코 챗봇 여기로 옮기기
튜링에서 한 프로세스를 실행하고, 다음 프로세스를 실행하는 걸 "명시"하지 않는데, 이를 명시적으로 어떤 combinator로 보고, 전역 변수등은 또 람다로 감싸서, 람다 컨텍스트에 있는 변수를 보게 하면, 람다와 다를게 없다.
튜링과 람다가 철학이 다르다기 보다, 마치 튜링에서 암묵적으로 하던 동작들을 모두 명시적으로 바꿔 놓은 게 람다 대수인 건 아닐까?
C# 파일 하나로 MCP 서버를 만들어 실행하고, 닷넷 런타임 없이 MCP 서버 실행 파일을 만들 수 있는 시대가 오고 있습니다. :-D
오늘은 any 타입과 싸웠다
오늘은 any 타입과 싸웠다
Optique: Type-safe combinatorial CLI parser for TypeScript https://lobste.rs/s/dlobhb #javascript
https://optique.dev/
I've recently been working on Optique, a CLI parser combinator for TypeScript. Optique allows you to describe complex CLIs by combining smaller parts. You can also handle the CLI parsing results in a type-safe manner (see code below). The idea came from Haskell's optparse-applicative, but since TypeScript's API style is so different from Haskell's, I referenced Zod and similar libraries for the API design. For a more detailed introduction, please refer to the article I posted on Hackers' Pub!
最近、OptiqueというTypeScript向けのCLIパーサー「コンビネーター」を作っています。Optiqueは、複雑なCLIを小さなパーツの組み合わせで記述できる様にしてくれます。そして、そのCLIのパース結果を型安全に扱う事が出来ます。(下記のコード参照)アイデアはHaskellのoptparse-applicative から得ましたが、TypeScriptはHaskellとAPIのスタイルがかなり異なる為、APIの面ではZod等を参考にしました。詳しい紹介はHackers' Pubに投稿した記事をご覧ください!
I've recently been working on Optique, a CLI parser combinator for TypeScript. Optique allows you to describe complex CLIs by combining smaller parts. You can also handle the CLI parsing results in a type-safe manner (see code below). The idea came from Haskell's optparse-applicative, but since TypeScript's API style is so different from Haskell's, I referenced Zod and similar libraries for the API design. For a more detailed introduction, please refer to the article I posted on Hackers' Pub!
회사의 다른 레포들 보고 있는데 zero install 방식을 사용하고 있는 곳이 보인다. 근데 아무리봐도 캐시에다가 패키지 파일을 쌓아두는게 썩 좋은 방법 같아보이지는 않는데 내가 모르는 뭔가가 있는건가
mcp에 툴을 계속 쥐어주는게 불만이다. 불안하지도 않나? 아니 pg를 관리하는 mcp를 쓰는것보다 pg를 관리하는데 사용되는 명령어를 물어보고 그걸 내가 확인 후 실행하는게 맞지 않나? deno로 권한 다 뺏고서 mcp를 실행하면 좀 방지가 되려나?
러스트의 ICE 관련 이슈는 파보면 확실히 난이도가 높다. 이번에 본건 조기 종료 때문에 에러가 전파되지 않는 것이 문제인 줄 알았는데, Higher-Rank Trait Bound와 concrete 타입 간의 불일치를 처리하지 못해서 equality 검사를 하기 직전에 뻗는 것이였음.
박준규 replied to the below article:
Optique: 타입 안전한 CLI 파서 컴비네이터

洪 民憙 (Hong Minhee) @hongminhee@hackers.pub
이 글에서는 Haskell의 `optparse-applicative`와 TypeScript의 Zod에서 영감을 받아 제작된 새로운 CLI 파서 라이브러리인 Optique를 소개합니다. Optique는 파서 컴비네이터를 활용하여 CLI의 구조를 레고 블록처럼 조립할 수 있게 해줍니다. `option()`, `optional()`, `multiple()`, `or()`, `object()`, `constant()`, `command()`, `argument()` 등의 다양한 파서와 컴비네이터를 통해 복잡한 CLI 구조를 유연하게 정의할 수 있습니다. 특히, `or()`와 `object()` 컴비네이터를 사용하여 상호 배타적인 옵션이나 서브커맨드를 쉽게 구현하는 방법을 예제를 통해 설명합니다. Optique는 단순한 CLI 파서 역할에 집중하고 있어 모든 기능을 제공하지는 않지만, 복잡한 CLI 구조를 표현하는 데 유용하며, 소개 문서와 튜토리얼을 통해 더 자세한 내용을 확인할 수 있습니다.
Read more →@hongminhee洪 民憙 (Hong Minhee) 저도 마침 하스켈 라이브러리
optparse-applicative
를 가지고 놀고 있었는데 반갑네요! 파서 콤비네이터는 신이야!
맥 미니가 자꾸 혼자 슬립 상태로 들어가길래 쓰고 있던 카페인의 문제인가 싶어서 지우고 keepingyouawake를 설치했는데 잘 될지 모르겠네...
사실 홈 서버는 맥 미니가 아니고 딴 거긴 한데 곧 얘를 중심으로 클러스터?를 만들어봐야 할 것 같기도..
또 글쓰다가 막바지에 힘빠져서 날림으로 씀
洪 民憙 (Hong Minhee) shared the below article:
Par 언어 테스트 프레임워크 구현 -- Iterative Box Choice 패턴 적용
notJoon @joonnot@hackers.pub
Par 언어에 테스트 프레임워크를 구현하면서 `box choice` 타입의 소비 동작으로 인해 하나의 테스트 함수에서 여러 assertion을 처리하는 데 어려움을 겪었습니다. 기존 `box choice` 타입은 값을 한 번 사용하면 소비되어 재사용이 불가능했기 때문입니다. 이를 해결하기 위해 `iterative box choice` 타입을 도입하여 반복적인 사용이 가능하도록 개선했습니다. `iterative box choice` 타입은 `iterative`, `box`, `choice` 타입들을 조합하여 여러 번 사용 가능하고, 메서드 선택을 제공하며, 외부 구현과 연동할 수 있는 장점을 제공합니다. 새로운 타입 구조에 맞춰 테스트 실행 함수를 재귀적으로 수정하여 메서드 체이닝 방식과 순차적 명령문 방식 모두를 지원할 수 있게 되었습니다. 이로써 Par 언어는 더욱 유연하고 강력한 테스트 환경을 제공할 수 있게 되었습니다.
Read more →node_modules를 실시간으로 디버깅하기 위해 결국 Docker 이미지에다가 vim을 설치하는 결정을 하고 마는데.....
내가 어쩌다가 이런 짓을 하게 되었나 타임라인을 정리하자면...
문제 파악
- 내가 만들고 있는 NestJS 앱에
fedify/nestjs
설치하고, FedifyModule 세팅해놓은 이후에 POST 요청 자체가 안 가고 있었음 - 왜 에러가 발생하나하고 들여다봤더니
TypeError: Response body object should not be disturbed or locked
이런 에러가 떴음. - 오류가 발생한 위치는
fedify/express
에서 코드 복붙할때 들어갔던fromERequest
함수 호출 부분 이었음. - 혹시나 하고, 비슷한 이슈가 있나하고 찾아봤는데 Fedify 279번 이슈에도 딱 내가 밟고 있는거랑 똑같은 에러메시지를 내뱉고 있었음.
- 이런 에러가 왜 발생했는지, 여기저기 찾아봤는데 hono에서도 비슷한 오류가 있었고 그걸 해결한 사례를 발견. 요약하자면, request의 body를 두번 읽으려고 해서 생긴 문제. req에 rawBody가 들어있으면 rawBody를 ReadableStream에 넣는 것으로 분기처리하고, 아니라면 기존의 코드(
Readable.toWeb(req)
) 그대로 사용하는 것.
해결 시도
- 도커 이미지 내부에는 에디터가 설치가 되어 있지 않음. 그래서, Dockerfile.dev 파일에 vim 의존성을 먼저 깔아둠
- vim 설치 후에는 docker compose exec app /bin/bash 커맨드로 도커 컨테이너 안쪽으로 들어가서, hono에서 하던 방식대로 시도하려고 했으나.... console.log 로 까보니 rawBody는 없고, 이미 파싱이 되어 있는 body만 남아있었음. -> 여기서 알게 된 점은.... "다른 미들웨어에 통과시키기도 전에 request에 있는 rawBody는 이미 읽혀져있구나..."
- NestJS의 소스코드를 까보긴 해야겠지만, 다시 돌아와서 여기서
Readable.toWeb(req)
를req.body
로 바꾸니까 기적같이 그냥 돌아감...
NestJS 분석글... 쓰긴 해야겠지...? 근데, PR에도 올리긴 해야겠는데 어떡하지.... "이렇게 고치니까 되더라!!"는 좀 아닌 것 같다.
연합우주에서... 태그사용을 활성화해야 한다...
이제 반복/분기/출력 기능을 추가해 대부분의 프로그래밍을 자유자재로 할 수 있게 되었다. (어느정도 튜링-완전해짐)
AI 기술이 발달하면서 글이나 코드 같은건 프롬프트를 잘 던지면 굉장히 그럴싸한 결과물을 내놔서 세상이 많이 좋아졌다고 느끼는데 디자인에선 아직 잘 모르겠다. 디자인이라해도 웹이나 앱 같은 경우엔 https://www.layermate.ai/ 같이 꽤 괜찮은 도구들이 있는데 포스터 같은걸 만들면서 나는 클립아트 정도만 AI의 도움을 (그것도 몇 번이나 삽질을 해서...) 받았다.
도둑놈 심보라는 것은 알고 있지만 포스터 같은걸 만들 때도 쓸 수 있는 저런 Layermate같은 도구가 있었으면 좋겠다는 생각을 무척이나 했다. "색상은 ..., ...를 주로 활용한 A4 사이즈 포스터를 만들어줘. 안에 이미지로는 어떠한 것들이 들어가야하고, 텍스트로는 어떤 것들이 들어가야 해." 같이 프롬프트를 잘 적으면 괜찮은 포스터 시안 몇 개가 뚝딱 나오면 세상이 오죽 편할까...
8월 30일~31일 쯤에 해커스펍 밋업 모집 공지 올려야지
한국어로 쓰다가 '―' 문자를 넣는 순간 해커즈펍 자동 언어 인식 기능이 이 포스트를 러시아어로 인식하는 것을 발견(신세벌식 P2 배열을 통해 입력한 줄표)
미리보기 이미지를 클릭하면 404가 뜨는데 링크를 클릭하면 잘 표시가 된다. 이슈 생성하러 가야지
(일단 벌려놓고 생각해보기)
Hackers’ Public 어때요
블로깅의 쇠퇴, AI의 끝없는 학습, 비공개 플랫폼(Discord 등)으로의 이주, 짧고 중독성만을 강조하는 피드와 BM, 한 번 보면 다시 찾기도 힘든 SNS 포스트, 범람하는 가짜뉴스와 개소리와 혐오... 웹은 정보의 망망대해도 아닌 소행성대로 변해가고 있다.