Profile img

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).

FedifyHolloBotKit、そしてこのサイト、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

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

컴퓨터공학에서 사용하는 회귀(Regression, 回歸) 라는 용어에 대해

JakeSeo @jakeseo@hackers.pub

이 글은 컴퓨터 공학에서 '회귀(Regression)'라는 용어가 사용되는 두 가지 주요 맥락, 즉 머신러닝과 소프트웨어 테스팅에서의 의미를 명확히 구분하여 설명합니다. 머신러닝에서는 변수 간의 관계를 모델링하여 값을 예측하는 기법을 의미하며, 그 기원과 함께 집값 예측 예시를 들어 이해를 돕습니다. 반면 소프트웨어 테스팅에서는 과거의 버그가 재발하는 현상을 검증하는 과정을 지칭하며, 개발이 '뒤로 회귀했다'는 표현으로 설명합니다. 이 글을 통해 독자는 회귀라는 용어가 가진 다의성을 이해하고, 각 분야에서 어떻게 활용되는지 명확히 파악할 수 있습니다.

Read more →
2
2

굉장히 오랜만에 들어와서 쓰는 근황입니다.

  • TIS-100의 모든 레벨을 클리어했습니다. 다음 목표는 아마 Opus Magnum 아니면 A=B가 될 것 같습니다.
  • 올해 여름부터 지금까지 7문제를 백준에 출제했습니다. 여기의 맨 아래에서 보실 수 있습니다. 개인적으로 가장 재밌었던 문제는 SWAP-C Sort인데 그만큼 어렵습니다.
  • 웹 기반으로 뭔가 만들 게 생겨서 프레임워크를 알아보다가 Solid를 써보기로 결정했습니다. 웹 UI는 Flowbite, 그래픽 요소는 Konva를 쓰게 될 것 같습니다.
  • 그런데 이쪽을 첫삽을 뜨기도 전에 갑자기 굉장히 어려운 퍼즐틱한 문제 하나의 풀이가 완성되어서(....) 논문(?!)을 하나 쓰기 시작했습니다. 이런 거 받아주는 저널 어디 없을까요(????)
3
1

오는 11() 8() 光云大學校(광운대학교)에서 開催(개최)되는 FOSS for All 컨퍼런스 2025에서 제가 〈야크 셰이빙: 새로운 오픈 소스의 原動力(원동력)〉이라는 主題(주제)基調演說(기조연설)을 하게 되었습니다!

올해 처음 열리는 FOSS for All 컨퍼런스는 “Free and Open Source Software for All”이라는 슬로건 아래, 모두를 ()한 오픈 소스 컨퍼런스를 目標(목표)로 하는 非營利(비영리) 오픈 소스 커뮤니티 컨퍼런스입니다.

파란色 背景의 FOSS for All 컨퍼런스 2025 發表者 카드. 右側 아래에는 發表者 洪民憙의 寫眞이 있고, 中央의 흰色 말風船 안에는 「Keynote」라는 文句와 함께 發表 題目 〈야크 셰이빙: 새로운 오픈 소스의 原動力〉이 쓰여 있다.
14
0
0
1

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

2025년 연말, 중소기업 개발자 채용에 대한 단상

Juntai Park @arkjun@hackers.pub

회사의 면접 과정에 참여하면서 신입 개발자 채용의 어려움을 실감하게 되었다는 내용입니다. 지원자들의 높은 경쟁률과 뛰어난 스펙, 열정적인 준비에 감탄하면서도, 채용 인원의 제한으로 인해 안타까움을 느낍니다. 만약 자신이 지금 신입 구직자라면 합격하기 어려울 것이라는 생각과 함께, 20대든 40대든 모두가 버티고 배우며 나아가야 할 시기임을 강조합니다. 40대 중반 개발자의 주관적인 관점이지만, 현재 개발자 채용 시장의 현실을 엿볼 수 있는 글입니다.

Read more →
2
0
3
0
2
4

아무래도 대 LLM 시대에 스키마 지향적인 삶을 살아야한다고 생각이 듦과 동시에 원래 사용하던 protobuf 외에도 trpc와 graphql 모두 검토를 진행중. 백엔드, 프론트엔드간 필드 마이그레이션 문제는 결국 다 필연적으로 마주치게되는 것 같고 어떤식으로 해결하거나 감내할것인지 결정하는게 중요할것 같다.

2
3
4

프로젝트 시작전에, tRPC의 도입을 고민하다가, 학습비용과 프로젝트 기간에 대한 압박이 있어서 일단은 쓰지 않고 진행하고 있는데, Client와 Backend에서 타입일치를 위해서, 동일한 모델 선언이 반복적으로 일어나다 보니 (한쪽의 모델을 참조해서 쓸 수 있게 반쯤 자동화되어 있기는 하지만) 다음에는 (tRPC가 아니라도, 타입불일치를 막을 수 있는 어떤 장치나 무언가를) 도입해야겠다는 생각이 든다.

3

Interesting poll results! I didn't expect Attoparsec to go toe-to-toe with Megaparsec.

So I did some digging into based programming language projects on Github, and here's what I found (lexer and parser mentioned separately, if different):

- Purescript: handwritten + Happy
- Elm: handwritten
- Agda: Alex + Happy
- Dex: Megaparsec
- Carp: Parsec
- Dhall: Megaparsec
- Grace: Megaparsec + Earley
- Plutus: Megaparsec
- Grin: Megaparsec
- Futhark: Alex + Happy
- Granule / Gerty: Alex + Happy
- Kaleidoscope: Parsec
- Egison: Megaparsec
- Amulet: Alex + Happy
- Paskell: Parsec
- Facet: Handwritten + Parsec
- Eclair: Megaparsec
- Olifant: Megaparsec
- Shellcheck: Parsec
- Nixfmt: Megaparsec

It seems like Megaparsec is the clear winner when it comes to parsing programming languages in Haskell. However, if I focus on projects that parse file formats and network protocols, Attoparsec is the most popular one.

1
4

작은 SI 중소기업의 신입,주니어 개발자 채용공고에 왜 이렇게 지원자가 많은가 (약 600명이 넘는 지원자가 몰렸다.) 채용시장이 많이 안좋은가 의문을 갖고 있었는데, 문득 (혹시나) 회사의 복지정책 중 하나인 간식무제한제공때문이 아닐까 하는 생각이 들었다. (일단은 인하우스 개발인 점도 한몫하겠지만)

3

I making next-version of apmodel, that uses pydantic for better validation and better loader.

Currently, this feature is either not implemented or not fully implemented:

  • export to json is not avaliable

Additionally, some models have not been migrated to pydantic, so they cannot be used properly.

If you interested this, can read this branch: https://github.com/fedi-libs/apmodel/tree/pydantic

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

Fresh와의 안 좋은 첫 만남: @fedify/fresh 제작기 - 1

개발곰 @gaebalgom@hackers.pub

Deno 팀에서 개발하는 Fresh 프레임워크를 Fedify 프로젝트에 통합하는 과정에서 겪은 문제점을 공유합니다. Fresh 2.X 버전으로 업데이트되면서 기존 코드와의 호환성 문제가 발생했고, Fedify 패키지 구조 변경으로 인해 Fresh 통합을 위한 별도 패키지를 만들어야 했습니다. 개발 환경 설정 중 `node_modules` 관련 오류와 Preact 렌더링 문제가 발생했으며, Fedify 미들웨어 적용 시 Vite의 SSR Module Runner가 CJS를 지원하지 않아 서버 실행에 실패했습니다. Vite 설정에서 외부 의존성을 지정하여 개발 서버 문제를 해결했지만, 빌드 후 실행 시 CJS 관련 문제가 다시 발생하여 Rollup 옵션을 조정해야 했습니다. 이 글은 Fresh와 Fedify를 통합하려는 개발자들이 겪을 수 있는 어려움을 해결하는 데 도움이 될 것입니다.

Read more →
4
0

새로운 서비스를 실험하고 있는데요.

너무 연속으로 컨텐츠를 봐서 피로해지는 서비스가 아닌, 어쩌다 접속해서 멍 때릴 수 있는 서비스를 고민하며 기획을 했습니다. 가끔 버스 창밖을 바라보며 멍때리는 것처럼요. 멍때리다 창밖의 간판들이 가끔 눈에 들어 오듯, 글이나 낙서가 눈에 띄면 어떨까 싶어서, 초기 인연이 있는 분들에게 부탁해서 다양한 글을 좀 채워 넣으려 했습니다. (AI로 목업을 채워 넣으면 맛이 없을 것 같아서, 실제 다양한 사람들의 글을 원했습니다.) 이게 매우 어려운 벽이다를 실감하고 있습니다.

  1. SNS 성격의 서비스는 이용하기 싫다.
  2. 이미 이용 중인 SNS가 여러 개라, 또 추가하기 싫다.
  3. 로그인 해서 보니, 그다지 나한테 맞지 않는다.
  4. 몇 번 로그인해서 봐도 흥미가 생기지 않는다.
  5. 가끔 접속해서 보는 소소한 재미가 있을지도 모르겠다.
  6. ...

0번은 어차피 제외고, 초기 지인 분들은 적어도 3번까지는 가 주길 기대했는데, 1번조차 넘질 못하고 있습니다. 쓸만한 서비스 혹은, 기획을 조정하면서 고민해 볼 가치가 있는지 보기 위해선, 그래도 1번은 넘어 가야 뭘 할텐데 말입니다. 부탁을 받은 지인들 조차 1번을 넘기 어려운데, SNS 서비스를 홍보한다는 건 꽤 험난한 길이겠습니다.

처음 제가 해커스펍의 1번 문턱을 넘었던 이유를 생각해보면, 저는 사람이었던 것 같습니다. 같은 직군에 있는 사람들이 모여 있어, 대화가 잘 통할 것 같아서 선뜻 들어 온 게 아닐까 싶습니다. 몇 달을 써 보면서 결론은, 해커스펍은 분명 자기만의 영역이 있는 서비스란 생각이 듭니다. 좋다는 생각을 가지기 까지는 좀 써봐야 아는 건데, 해커스펍이 꽤 어려운 걸 돌파했구나란 생각이 듭니다.

혹시 ikariam이라는 게임을 즐겨 본 분 계신가요? 그거, 은근 재밌게 했는데, 주변에서 제가 하는 걸 보더니 "어떻게 그런 게 재밌냐"고 묻는 사람들이 대부분이긴 했습니다. 오랜만에 찾아 보니 아직도 ikariam은 잘 살아 있네요. 멍때림이 싫지 않은 사람들이 분명 있긴 있을텐데, 어떻게 그 분들을 찾아 1번을 넘어가게 할까 고민이네요.

8

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

참 쉽죠?

박준규 @curry@hackers.pub

하스켈(Haskell) 프로젝트를 처음 시작하는 사람들을 위해, `cabal`을 이용한 간단한 실행 파일 생성 과정을 소개합니다. 이 글은 `ghc`와 `cabal`이 `ghcup`을 통해 이미 설치되었다는 전제하에, 프로젝트 디렉터리 생성부터 기본적인 파일 구조 초기화, 그리고 빌드 및 실행까지의 단계를 최소한의 노력으로 빠르게 따라 할 수 있도록 안내합니다. `cabal init` 명령어를 사용하여 프로젝트를 초기화하고, 생성된 `app/Main.hs` 파일을 통해 "Hello, Haskell!"을 출력하는 예제를 통해 하스켈 개발의 첫걸음을 쉽게 내딛을 수 있도록 돕습니다. 이 글은 복잡한 설정 없이 하스켈 프로젝트를 시작하고 실행하는 기본적인 방법을 제시하며, 독자들이 하스켈의 세계에 더 쉽게 접근할 수 있도록 돕는 것을 목표로 합니다.

Read more →
9

I'm working my way through the Web Browser Engineering book (by Pavel Panchekha & Chris Harrelson), but I'm using asyncio for my implementation instead of the book's examples.

I hit a roadblock in Chapter 2, which introduces tkinter. How do you make tkinter's event loop and asyncio's event loop play nicely together?

A bit of research led me to this fantastic library, async-tkinter-loop, which seems to solve this exact problem. Sharing in case anyone else is on a similar journey!

P.S. If you're curious, the repository I'm working on is here: https://codeberg.org/hongminhee/hongju.

2
1

Ghost 라는 도구를 self-hosted 로 직접 구동하려고 하는데, 설치 사용자 경험이 무척 안좋다. 좀 더 정확하게는 강결합되어 있는 Tinybird라는 도구의 설치 사용자 경험이 매우 안좋다. 딱 2시간만 더 써보고 기대/예상대로 동작 안 하면 포기해야겠다.

4

I making next-version of apmodel, that uses pydantic for better validation and better loader.

Currently, this feature is either not implemented or not fully implemented:

  • export to json is not avaliable

Additionally, some models have not been migrated to pydantic, so they cannot be used properly.

If you interested this, can read this branch: https://github.com/fedi-libs/apmodel/tree/pydantic

3
1

git worktree로 작업하고 변경 사항 가지고 오려고하면 같은 로컬 머신에 디렉토리에 있는 변경사항인데 remote 리포지토리까지 거쳐야하는게 참 멀리 돌아온다! 라는 생각을 하다가 worktree 작동 특성상 걍 git 명령어로 cherry pick 혹은 switch가 되어야하지 않을까 싶어서 써보니 잘된다.

역시 설명서를 잘 읽어야…

2
5
11

Gleam의 흥미로운 점 두 가지.

  1. 함수 오버로딩도 인터페이스 다형성도 타입클래스도 없다. 심지어 이건 기본 타입과 연산자에서도 동일해서 정수 타입인 Int와 부동소수점 실수 타입인 Float는 사용하는 연산자가 다르다! 실수 두 개를 더하려면 5.0 + 3.0이 아니라 5.0 +. 3.0이라고 써야 한다. https://tour.gleam.run/basics/floats/
  2. 위의 링크를 눌러 보았다면 눈치챘을지도 모르겠지만, Gleam에서 0으로 나누기는 에러가 아니다! 이건 정수와 실수 모두 동일하며, 그렇다고 Infinity-Infinity, NaN 따위가 나오는 것도 아니다. Gleam에서 a / 00이다.
2
10

After being a dedicated Vim/Neovim user for over 20 years, I somewhat reluctantly switched to VS Code about five years ago when I started coding in TypeScript, mainly pulled in by its ecosystem. However, I've recently started using , and I'm incredibly satisfied. One of the biggest reasons I always loved Vim/Neovim was its lightweight and fast performance. Zed feels like it captures the best of both worlds: it's modern and feature-rich like VS Code, yet remains as light and responsive as Vim.

4

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

브라우저 스터디 기록 (2)

Jaeyeol Lee @kodingwarrior@hackers.pub

이 글은 Web Browser Engineering을 독학하며 겪은 경험을 담고 있으며, 특히 Chapter 2의 연습문제 풀이에 대한 내용을 다룬다. Chapter 2는 브라우저 주소창에 입력을 감지하는 과정부터 HTML을 화면에 렌더링하는 과정을 개괄적으로 설명한다. 마우스나 키보드 입력이 CPU를 통해 커널에 인터럽트 요청으로 전달되고, 브라우저가 이를 처리하여 서버와 통신하며, 최종적으로 그래픽 시스템을 통해 화면에 표시되는 과정을 요약한다. 이벤트 루프의 역할이 중요하지만, 챕터에서는 텍스트를 화면에 출력하는 수준으로 다룬다. 연습문제 중 Emoji 지원과 RTL(Right-to-Left) 지원에 대한 해결 방법이 제시된다. 특히 RTL 지원을 위해, 저자는 텍스트를 한 줄 단위로 묶어 GUI 툴킷이 RTL 순서를 처리하도록 하고, 라인의 시작점을 계산하여 화면 오른쪽에 맞춰 출력하는 방법을 사용했다. Emoji의 경우, 좌표를 미리 지정하여 텍스트 라인과 분리하여 처리함으로써 문제를 해결했다. 이 글은 브라우저 엔진의 기본적인 동작 원리를 이해하고, 실제 구현 과정에서 마주칠 수 있는 문제에 대한 해결책을 제시하여 독자에게 실질적인 도움을 줄 수 있다.

Read more →
9

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

도커로 구축한 랩에서 혼자 실습하며 배우는 네트워크 프로토콜 입문 #3-1

자손킴 @jasonkim@hackers.pub

이 글은 네트워크 계층(L3) 프로토콜의 핵심인 IP에 대해 심도 있게 다룬다. L3 라우터의 역할부터 시작하여, IPv4의 구조, IP 단편화 과정, 그리고 PMTUD(Path MTU Discovery)의 중요성을 설명한다. IP 헤더의 각 필드(버전, 헤더 길이, ToS, 패킷 길이 등)에 대한 자세한 분석을 제공하며, IP 주소와 서브넷 마스크를 통해 네트워크와 호스트를 구분하는 방법을 설명한다. 클래스풀 주소 지정 방식과 클래스리스 주소 지정 방식의 차이점을 비교하고, 공인 IP 주소와 사설 IP 주소의 개념을 명확히 한다. 마지막으로, ICMP(Internet Control Message Protocol)를 통해 IP 레벨의 통신 상태를 확인하고 오류를 알리는 방법을 소개한다. 이 글을 통해 독자는 IP 프로토콜의 기본 원리를 이해하고, 네트워크 문제 해결 능력을 향상시킬 수 있을 것이다.

Read more →
4
1
1
3

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

자연어에서의 재귀와 카탈랑 수

구슬아이스크림 @icecream_mable@hackers.pub

이 글은 자료구조와 알고리즘에서 중요한 개념인 재귀가 자연어에서 어떻게 나타나는지, 특히 통사론적 관점에서 인간 언어 능력의 창조성을 보여주는지를 탐구합니다. 'X의 Y의 Z의...'와 같은 소유격 조사를 사용한 문장 확장을 통해 재귀의 개념을 설명하고, 이러한 재귀가 카탈랑 수와 연관되어 있음을 지적합니다. 영어 예시를 통해 전치사구의 추가가 문장의 중의성을 증가시키고, 구문 분석의 가능한 경우의 수가 카탈랑 수열을 따른다는 것을 보여줍니다. 생성 규칙을 통해 명사구를 재귀적으로 확장하면서 중의성 계수가 카탈랑 수와 동일하게 나타남을 설명합니다. 마지막으로, 자연어의 중의성 해소는 산술 표현식과 달리 확률에 의존하며, 이는 전산/심리언어학에서 중요한 연구 주제임을 강조합니다. 이 글은 재귀의 개념이 자연어에서 어떻게 복잡하게 작용하는지, 그리고 그 중의성을 이해하는 것이 왜 중요한지를 흥미롭게 제시합니다.

Read more →
7
5
2
1

요즘 심심할때 굴리고 있는 VCS에 대한 나이브한 아이디어가 있는데

  • 각 커밋에 대해 메타데이터를 줄수 있어야 한다

    레포 내의 metadata.json 같은 파일을 인식해도 되고, 아니면 Commit -> Metadata를 해주는 프로그램을 hook으로 등록하게 해줘도 된다. 이를 통해 package.json, cargol.toml 같은 파일을 읽어서 거기에 버전 의존성을 커밋의 메타데이터로 추출한다.

  • 메타데이터에 대해 인덱싱을 한다

    가령 version이라는 메타데이터가 있을때 2 <= version < 3를 만족하는 커밋의 범위를 인덱스를 활용해 빠르게 알아낼수 있게 한다.

  • 메타데이터로 커밋을 찾는 표현식을 제공한다

    max(2 <= version < 3 and has(fix-bug-foo) and has(add-feature-bar) 이런식으로 하면, 구간 내의 버전에서 foo 버그가 해결되고 bar 피쳐가 추가된 커밋중 가장 최신의 커밋을 구한다. git에서는 fix-bug-foo, add-feature-bar 각각의 브랜치로는 쉽게 갈수 있지만, 해당 브랜치가 main에 머지되기 전까지 그 브랜치 밖을 벗어나 작업하기가 까다로워진다.

  • 이런 레포들을 모아서 모노레포를 모은다음, 메타데이터에 상호 의존성을 기술한다

    그리고 dependency resolve를 해서(메타데이터 검색의 일종일 뿐임) 조건을 만족하는 모노레포 스냅샷을 구한다. 이제 우린 패키지 매니저를 공짜로 얻었다.

이 아이디어는, 현재 패키지 매니저와 VCS가 분리되어있는데 사실 그래선 안된다는 생각에서 나온것이다. 기존의 비슷한 아이디어를 찾아봤는데 gitman 이런게 있더라. 근데 내가 원하는만큼 일반적이진 못하다.

5
1
2