Profile img

Hi, I'm who's behind Fedify, Hollo, BotKit, and this website, Hackers' Pub! My main account is at @hongminhee洪 民憙 (Hong Minhee) :nonbinary:.

Fedify, Hollo, BotKit, 그리고 보고 계신 이 사이트 Hackers' Pub을 만들고 있습니다. 제 메인 계정은: @hongminhee洪 民憙 (Hong Minhee) :nonbinary:.

FedifyHolloBotKit、そしてこのサイト、Hackers' Pubを作っています。私のメインアカウントは「@hongminhee洪 民憙 (Hong Minhee) :nonbinary:」に。

Website
hongminhee.org
GitHub
@dahlia
Hollo
@hongminhee@hollo.social
DEV
@hongminhee
velog
@hongminhee
Qiita
@hongminhee
Zenn
@hongminhee
Matrix
@hongminhee:matrix.org
X
@hongminhee

Optique 0.5.0: Enhanced error handling and message customization

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

Optique 0.5.0 is now available, bringing enhancements to error handling, help text generation, and overall developer experience while maintaining full backward compatibility. The update introduces better code organization by refactoring the large `@optique/core/parser` module into three focused modules: `@optique/core/primitives`, `@optique/core/modifiers`, and `@optique/core/constructs`. Error handling is improved with automatic conversion of default value callback errors into parser-level errors, and the new `WithDefaultError` class allows for structured error messages. Customization of default values in help text is now possible via an optional third parameter to `withDefault()`, enabling descriptive text instead of actual values. Additionally, the release provides comprehensive error message customization across all parser types and combinators, allowing context-specific feedback. These improvements aim to make Optique more user-friendly, especially for building CLI applications that require clear error messages and helpful documentation, making this release a significant step forward for developers using Optique.

Read more →
5
1
6
4
2
2
0
1
0
0

洪 民憙 (Hong Minhee) shared the below article:

[잘라먹는 프로그래밍 언어론] 타입 체계는 명제 논리와 닮아있다 (커리-하워드 대응)

RanolP @ranolp@hackers.pub

이 글은 함수 타입, 합 타입, 곱 타입과 논리 연산의 대응 관계를 탐구하며, 특히 부정(negation)을 타입 시스템에서 어떻게 표현할 수 있는지에 대해 설명합니다. "P가 아니다"는 "P이면 거짓이다"와 동치라는 점을 이용하여, 타입 이론에서 값이 없음을 거짓으로 해석하고, 이를 통해 "정수를 0으로 나눌 수 없다"는 명제를 타입으로 표현하는 방법을 제시합니다. `div_by_zero :: Int -> ⊥`와 같은 표현을 통해 타입 체계와 명제 논리 간의 커리-하워드 대응을 보여주며, 타입 시스템이 논리적 추론과 어떻게 연결되는지에 대한 통찰력을 제공합니다.

Read more →
10
0
0
0
4
0

회사에서 MLOps 를 구축해야 하는데 구축해본 적 있는 분이 있다면 커피챗을 좀 해보고 싶다...

Pheonix 트레이싱 도구를 이제서야 도입했고, Airflow 같은 것들도 제대로 써보고 싶은데 파이프라인을 제대로 구성해본 적이 없어서 생각은 하는데 아직 정확히 어떻게 구성해야 할지 잘 모르겠다..

1

토큰-링 네트워크에서 영감을 얻어 노드들이 서로 토큰을 돌려가며 서로 헬스체크하는 일종의 탈중앙화(?) 헬스체크 서비스를 대충 만들어보았다. 토큰 네트워크를 토큰이 돌며 노드들이 서로의 주소를 사인하고, 만약 다음 노드가 없거나 연락 불가하다면 이슈어에게 다시 돌려주는 방식의 단순한 토큰링 네크워크인데, 잘 작동해서 기분이 좋다.

demo of token ring health check service
3

요전번에 산 책 '관계형 데이터베이스 실전 입문' 첫 챕터를 정리했다. 정리하는 김에 원래 대학원에서 썼던 학술용 홈피도 싹 다 갈아엎을 겸 해서 맘에 드는 테마 하나 포크해서 블로그도 다시 만들어서 첫 포스트로 써서 올림...글로 쓰다보니 뭔가 보충하면 좋을 것 같은 내용들이 보였는데, 특히나 관계형 모델에서 튜플(=행)은 하나의 집합이라서 그 원소가 사실 순서가 없어도 되는데 실제 SQL로 표현되는 테이블에서는 순서가 있어야한다는 지점이 흥미로워서 다른 DB 개론서들 보면서 그 내용들을 추가하다보니 결국엔 형식적으로 정의하는 부분까지 넣게 됐다. 써놓고 보니 배보다 배꼽이 더 커진 듯한 느낌이지만...뭐 어때, 재밌으면 됐지!

3
0
1
2
7
1
1

인간관계에 있어 일을 주든, 투자를 해주든, 내가 영업하는 제품을 구매해주든 어느 한쪽 또는 양쪽에 이익을 가져다주지 못하는 관계인 경우 아예 연락이 끊기는 정도의 수순을 밟게 되는 것이 일반적임.

오픈소스 활동의 좋은 점은 저런 명확한 이익관계가 없더라도 한번 서로 인지된 사람이면은 가늘더라도 꽤 오랫동안 서로 연락하는 관계를 유지할 수 있다는 점임.

개발자도 우울증 많다고 얘기는 많이 들었다.

이런 점에 비춰봤을 때 오픈소스는 개발자의 우울감과 소외감 극복에 도움이 될 수 있다고 생각한다.

6

洪 民憙 (Hong Minhee) shared the below article:

하스켈을 잘 모르는 프로그래머도 이해하기 쉬운 하스켈 코드 작성법

박준규 @curry@hackers.pub

이 글은 하스켈 코드의 가독성을 높이기 위한 실용적인 팁을 제시합니다. 저자는 하스켈 입문자들이 흔히 겪는 어려움을 해결하고, 코드를 더 쉽게 이해할 수 있도록 6가지 규칙을 제안합니다. 핵심은 달러 기호($) 사용을 자제하고, 연산자는 결합 가능한 것만 사용하며, do 표기법을 적극적으로 활용하는 것입니다. 또한, 렌즈 라이브러리 사용을 미루고, where와 let을 사용하여 코드를 구조화하며, 포인트 프리 스타일을 적절히 사용하는 것이 중요하다고 강조합니다. 이러한 규칙들을 따르면 하스켈 코드가 더욱 명확해지고, 함수형 프로그래밍에 익숙하지 않은 개발자들도 쉽게 이해할 수 있게 됩니다. 이 글은 하스켈의 진입 장벽을 낮추고, 더 많은 사람들이 이 언어를 배우고 활용할 수 있도록 돕는 데 기여합니다.

Read more →
11

안녕하세요 랭호입니다

여기는 대피소 겸 나중에 긴 글 덤핑하는 용도로 써야겟다 히히

공개계는 블스, 사담계는 개인서버, 대피소는 여기 이렇게 해서 쓰리배럭 굴릴까 하는데요 제 서버가 DB 쿼리 문제때문에 좀 아파서 여기 자주 올지도 몰?라요 ㅋㅋ................

나중에 블로그 만들면 자랑하러 올게요

7
2
1

상시 (개발자/프로그래머 버전, 250921 갱신)

대학교 탈출을 꿈꾸고 있는 학부생입니다. 아직은 취미(😭)로 게임/웹 개발을 하고 있고 간단한 SVG를 다룰 수 있습니다(갑자기??).

🌐 eatch.dev
🐱 github.com/EatChangmyeong
📝
blog.eatch.dev / @blog.eatch.devL"Widestring" (이전 중)
🎈 solved.ac/profile/dlaud5379 (💙₄ 2300, OVER 14313.8, CLASS 6)

자작 게임 Honeyhouse의 플레이 화면프로그래밍 문제의 삽화. 왼쪽은 낮, 오른쪽은 밤의 상황을 묘사하고 있으며, 각 상황마다 기지국과 노드가 연결되는 모든 경우의 수를 그림으로 나열하고 있다. 각각의 경우마다 기지국과 각 노드 사이의 거리의 합에서 모든 노드를 포함하는 직사각형의 넓이를 뺀 값을 계산하고 있다.
1
1

이제 WinForm과 WPF도 바이브코딩하는 시대입니다.

File-based app 기반의 템플릿과 Cursor, Github Copilot 등 MCP 서버를 활용할 수 있는 코딩 어시스턴트용 프롬프트를 결합한 개발 방법론, 도서, 아티클 등의 리소스를 준비하고 있습니다.

https://github.com/rkttu/dotnet-fba-templates

2
1

최근 며칠간 WAH라는 이름의 WebAssembly 인터프리터를 만들고 있다. ~와! 샌즈!~

WAH의 특징이라면 C로 작성되어 있는데 헤더 하나로 구성되어 있다는 점과, 거의 대부분의 코드를 Gemini가 짰다는 것 정도일까? (Claude Code도 좀 사용했지만 코드 생성은 Gemini가 다 했다.) Gemini가 디버깅을 시키면 답답한 게 사실이라서 최대한 프롬프트에 정보를 많이 넣고 few-shot으로 생성하게 하는 걸 목표로 했는데 생각보다 잘 되었다. 예를 들어서 한 프롬프트는 다음과 같았다. 저 문장 하나 하나가 시행착오의 결과이다.

@wah.h 에 if~else~end 명령을 구현하고, 대응되는 test_*.c 파일들이 모두 성공하도록 (또는, 해당 테스트에서 잘못된 점이 있을 경우 그 원인을) 고쳐줘. 아직 loop 관련된 코드는 처리할 필요 없고 테스트 중에 그걸 테스트하는 게 있다면 주석 처리해(지우지는 마). 컴파일과 실행은 &&로 한 번에 하도록 해. 정확한 구현 방법은 이래야 해: if~else~end에서 마지막 end는 사라지고, if는 else 직후 명령으로 이동하는 conditional jump로 재활용하며, else는 unconditional jump로 바뀌어(즉 실행기 입장에서 br과 else의 동작은 똑같아야 해! else를 아예 없애고 br로 대체할지 말지는 알아서 정해). 그러니까, if A B C else D E F end G 같은 명령이 있다면 preparsing 이후에는 if <offset to D> A B B C else <offset to G> D E F G 형태가 되어야 한다는 뜻이야. WebAssembly 명세에 따르면 if 문에는 block type이 따르는데, 이 타입을 사용해서 validation을 진행하는 것도 정확히 구현해야 해(block type이 function type (T1..Tn)->(U1..Um)이면 현재 스택에 T1..Tn 타입이 들어 있고 end 이후에는 U1..Um 타입이 들어 있어야 하고, 일반 타입 T가 들어 있다면 ()->(T)와 동일하게 취급함). block type은 validation 이후 preparsing 과정에서 사라져서 런타임에는 반영되지 않도록 해.

솔직히 너무 많이 요구하는 거 아닌가, 안되면 validation 부분을 어떻게 뺄지 고민하고 있었는데 시도 세 번만에 800줄짜리 diff가 떡하니 나오고 일단 보기에는 틀린 부분이 없어서 놀랐다. 물론 삽질도 많이 했는데 가장 많이 한 삽질은 테스트를 작성할 때 수동으로 WebAssembly 바이너리를 짜면서 바이트 숫자를 잘못 세어서 오류가 나는 거랑, 분명 WebAssembly opcode를 사용해야 하는데 자기 마음대로 코드를 정해 버린다거나 하는... 그런 우스운 상황이었다.

우습기도 하고 놀랍기도 하지만 이 코드를 내가 직접 짜지 않는 이유는 귀찮아서...라기보다는 내가 이걸로 하고 싶은 일이 따로 있고 WebAssembly 인터프리터를 만드는 게 주 목표는 아니기 때문이다. (원래 하고 싶은 일은 나중에 언급할 듯.) WebAssembly 구현이라고 하면 기술적으로 복잡해 보이지만, 내 용도에서 유래하는 몇 가지 조건(대표적으로 결정론적인 동작)을 제약으로 걸면 기술적으로 복잡하다기보다는 그냥 노가다에 가까워지기 때문에 끌리지 않는 것도 있긴 하다. 이전의 Angel이 과연 얼마까지 바이브 코딩으로 할 수 있는지를 테스트하는 목표였다면, 이번에는 정말로 목표를 달성하는 수단으로 기능할지 실험해 볼 작정이다.

9
9
2
5
1

effect-ts 를 사용해보면서 느낀 장점 중 하나는... (단점이 아직 좀 더 많습니다... 3.x 인데도 코어 라이브러리 호출에 예외가 터지는 경험을 함.) async 에 대한 확인 작업이다. 이게 비동기인지 아닌지 걱정하지 않고 코드를 쓰게 된다.

내가 접근 가능한 언어 중 lua 나 ruby 또는 go 를 제대로 쓴적이 없어서 색다른 경험이긴 해. function color 구분하지 않고 호출하는 장점이 이런 느낌이구나.

예를 들면;

 const rotationUnit = unit || (yield* getCurrentLogRotationUnit());

물론 상위 함수가 effect 를 위해 제너레이터로 감싸져 있긴 하지만 이 부분은 여러 번 보고 쓰다 보니 익숙해 지더라. callback 함수 강제로 써야하던가 반대로 더이상 안쓰게 되던 경험과 비슷비슷함.

그리고 예외 처리 안하고 모두 값으로 wrapping 하는 것은 여러모로 바람직하다. 다른 플랫폼 기능 안쓰더라도 부분부분 option 이나 result 같은 것만 써도 더 나은 코드를 작성하는데 도움이 된다. 4.0 에는 좀 더 경량화 된다고 하니 업데이트 안되는 패키지 - eg. neverthrow 등 - 쓰는 것보다 그냥 effect-ts 의 에러 관리 기능만 적용해도 좋겠다.

throw 는 아무리 봐도 모던 goto 여...

1
0

안녕하세요. ActivityPub protocol에서 유저가 좋아요를 한 게시물을 보는 방법이 있나요? Actor Object에 liked collection을 찾지 못해서 혹시 다른 방법이 있는지 질문드립니다. Every actor MAY have a liked collection. 라고 문서에 나온 것처럼 liked가 필수가 아니라서 보이지 않는 건가요?

Actor Object는 이렇게 확인해봤습니다.

curl -H "Accept: application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"" \
     "https://hackers.pub/ap/actors/0197cae5-cd8e-70f1-adb5-7cbbdd35f81b"

@0xq0h3규영 Hackers' Pub이 아직 liked 컬렉션을 구현하지 않아서 그렇습니다. 음… 이게 프라이버시 문제도 있고 해서 일단은 안 보이게 해 놓은 것도 있는데요. 일단 Hackers' Pub 저장소에 관련 이슈 하나 만들어 주시면 논의를 시작해 볼 수 있을 것 같습니다!

2
<sarcasm>

쉽게 제 호감도 올리시는 법: "해커즈 퍼브"

쉽게 제 호감도 조금 내리시는 법: "해커스 펍"

쉽게 제 호감도 많이 내리시는 법: "해커스펍"

</sarcasm>
2

C++에서 UB는 하드웨어 수준에서는 UB가 아니라고 생각했던 얼마 전에 나어게 경종을 올렸던 글. "Pointers are complicated" 시리즈. 주로 Rust에 관한 글이지만 abstract machine, memory model의 개념은 C++에도 있으며 하드웨어와는 확연히 다르다. 특히 포인터가 얼마나 까다로운 개념인지, 컴파일러가 어떠한 가정하에서 최적화를 수행하는지 다시금 익혔다.

6

연구자로서, 또한 한 명의 개발자로서 현 세대에 항상 궁금한 것은 AI가 얼마나 도움이 되느냐이다.

Haskell, OCaml은 말할 것도 없고, JavaScript, Python도 AI와 써 본 경험으로는 그들이 큰 도움이 되느냐는 질문에 자신있게 "그렇다"고 하기 힘든 경험만 해봤기 때문이다.

내가 코드의 형식에 대한 집착이 너무 심한 것이 원인일 수는 있겠으나... AI가 준 결과를 여기 바꾸고 저기 바꾸다보면 결국 내가 쓴 처음부터 코드가 된다.

얼핏 드는 생각으로는 거의 "타입도 없고 문서화도 잘 안되어 있는 환경에서는 사람들이 기능을 이해하기 어려우니 AI를 쓰겠다..."싶다가도, "그러면 내가 잘 아는 분야에 대해서 왜 AI를 써야하지?"하는 생각도 떨치기 힘든 상황이 자주 찾아온다.

결과적으로 나는 AI를 사용하려는 시도를 (적어도 일시적으로는) 멈추었다.

1

dadjokes.social 만들어서 보내드려야 할 분들이 늘어나고 있네요

1

연구자로서, 또한 한 명의 개발자로서 현 세대에 항상 궁금한 것은 AI가 얼마나 도움이 되느냐이다.

Haskell, OCaml은 말할 것도 없고, JavaScript, Python도 AI와 써 본 경험으로는 그들이 큰 도움이 되느냐는 질문에 자신있게 "그렇다"고 하기 힘든 경험만 해봤기 때문이다.

내가 코드의 형식에 대한 집착이 너무 심한 것이 원인일 수는 있겠으나... AI가 준 결과를 여기 바꾸고 저기 바꾸다보면 결국 내가 쓴 처음부터 코드가 된다.

얼핏 드는 생각으로는 거의 "타입도 없고 문서화도 잘 안되어 있는 환경에서는 사람들이 기능을 이해하기 어려우니 AI를 쓰겠다..."싶다가도, "그러면 내가 잘 아는 분야에 대해서 왜 AI를 써야하지?"하는 생각도 떨치기 힘든 상황이 자주 찾아온다.

결과적으로 나는 AI를 사용하려는 시도를 (적어도 일시적으로는) 멈추었다.

7
3
9

〈내가 LLM과 함께 코딩하는 방식〉이라는 글을 써 봤습니다…만 이미 LLM 많이 활용하는 분들은 잘 알고 계실 내용들이긴 합니다.

6
0
0