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
2
1

Meta, Valve의 Steam Deck용으로 설계된 Linux 스케줄러를 대규모 서버에 사용
------------------------------
- Valve의 Steam Deck를 위해 설계된 *SCX-LAVD 리눅스 스케줄러* 가 Meta의 대규모 서버 환경에서도 효과적으로 작동한다는게 공개됨
- 이 스케줄러는 *게임 콘솔 수준의 효율적 자원 관리* 를 목표로 설계된 것인데, Meta는 이를 통해 *서버 워크로드의 성능 향상* 과 *지연 시간 최소화* 를 추구
- 휴대용 게…
------------------------------
https://news.hada.io/topic?id=25293&utm_source=googlechat&utm_medium=bot&utm_campaign=1834

3

iOS에서 내가 쓸 단모음 키보드 앱을 만들고 있다.

기존에 쓰던 앱들이 있긴 했는데, 하나는 어느샌가 키보드 자판 위에 툴바를 붙이더니 월 구독 결제를 안하면 숨길 수 없게 해놨고 다른 하나는 최근 iOS 업데이트 이후로 텍스트를 지울때 단어가 망가지는 문제가 생겨서 대체제를 찾다가 마음에 드는게 없어서 결국 직접 만들기로 결정함..

직접 만들어서 테스트하다보니 유저 입장에서 어떤 부분이 불편한지 - 해소해야할지 보인다. 재미는 있는데 생각보다 신경써야 할 게 많다.

3

그런데 실제로 이를 조건 분기로 구현해보면 상당히 복잡해진다. 더 일반화된 방법이 필요하다. 버전 관계를 다시 정의해보자. 변환기를 기준으로 생각해보면 모든 버전 사이에 순서가 있다고 할 수는 없다. 버전을 poset으로 모델링해보면 어떨까? a ≺ b 관계가 성립하는 경우에는 b의 변환기를 이용해 a를 마이그레이션할 수 있다. 이 관계가 성립하려면 (1) a가 안정 버전이고, (2) b가 알파 버전이 아니고, (3) major(a) < major(b)이어야 한다.

(1.x, 3.x)는 모든 조건을 만족하기 때문에 변환기를 거쳐 마이그레이션할 수 있다. (1.x, 3.x-beta)도 모든 조건을 만족한다. 반면 (3.x-beta, 1.x)는 (1), (3)을 위반하기 때문에 변환기를 사용할 수 없다. (2.x-alpha.1, 3.x-alpha.0)는 (1), (2)를 위반한다. 이렇게 출발 버전부터 시작해 a ≺ b 관계를 만족하고, b가 목적 버전이 아닌 경우 안정 버전이어야 한다는 조건을 적용해 나가면 도착 버전까지의 경로도 얻을 수 있다.

버전 계보를 나타내는 흐름도. 왼쪽에는 변환 가능한 버전이 세로로 배치되어 있으며, 1.x에서 시작해 2.x, 3.x, 4.x를 거쳐 5.x-beta로 순차적으로 업그레이드된다. 3.x에서 3.x-beta로의 분기와 3.x에서 4.x로의 진행이 표시되어 있다. 오른쪽에는 사각형 테두리로 묶인 영역이 있으며, 이 안에는 2.x-alpha.0에서 2.x-alpha.1로 이어지는 알파 버전 체인, 2.x-alpha.k, 그리고 3.x-alpha.0이 포함된다. 점선 화살표는 변환기가 있는 버전(2.x, 3.x)에서 변환기가 없는 알파 버전으로의 파생 관계를 나타낸다. 녹색 노드는 변환기가 있는 버전, 흰색 노드는 변환기가 없는 버전을 의미하도록 색칠되어 있다.
1

오랜만에 복잡한 문제를 단순한 형태로 모델링해서 해결했다. 문제 상황은 대략 라이브러리의 메이저 버전을 위해 자동 마이그레이션을 지원하는 것이다. 각 메이저 버전에는 이전 버전의 코드를 자동으로 변환해주는 변환기가 함께 배포된다. 만약 1.x에서 3.x로 업데이트할 때는 2.x 변환기, 3.x 변환기를 순차적으로 실행해야 한다. 즉, 하위 버전에서 출발해 상위 버전에 도착하는 경로를 구해야 한다.

그런데 베타 버전(x.y-beta)과 알파 버전(x.y-alpha.z)을 고려해야 한다. 베타 버전에는 직전 버전에 대한 변환기가 있고, 알파 버전에는 변환기가 없다. 나이브하게 생각해보면 출발 버전 유형과 도착 버전 유형의 조합에 대해 모든 경우를 분기해서 경로를 구할 수 있을 것처럼 보인다.

세로로 정렬된 버전 업그레이드 흐름도. 가장 아래에 1.x가 있고, 위쪽으로 2.x, 3.x, 4.x가 순차적으로 배치되어 있다. 각 버전은 위를 향한 실선 화살표로 연결되어 있으며, 하위 메이저 버전에서 상위 메이저 버전으로의 직선적인 변환 경로를 나타낸다. 모든 노드는 연한 녹색 배경의 둥근 사각형으로 표시되어 있다.버전 계보를 나타내는 흐름도로, 변환히가 있는 안정 버전과 베타 버전, 알파 버전이 공간적으로 분리되어 배치되어 있다. 오른쪽에는 버전 흐름이 세로로 정렬되어 있으며, 1.x에서 2.x, 3.x, 4.x를 거쳐 5.x-beta로 업그레이드된다. 2.x에서 3.x-beta로, 3.x에서 3.x-alpha.0으로의 분기 경로가 명확히 표시된다. 왼쪽에는 알파 버전들이 독립적으로 배치되어 있으며, 2.x-alpha.0에서 2.x-alpha.1로 이어지는 체인과 2.x-alpha.k, 3.x-alpha.0이 포함된다. 실선과 곡선 화살표는 2.x 또는 3.x에서 각 알파 및 베타 버전으로의 파생 관계를 나타낸다. 녹색 노드는 변환기가 있는 버전, 흰색 노드는 변환기가 없는 버전을 의미한다.

그런데 실제로 이를 조건 분기로 구현해보면 상당히 복잡해진다. 더 일반화된 방법이 필요하다. 버전 관계를 다시 정의해보자. 변환기를 기준으로 생각해보면 모든 버전 사이에 순서가 있다고 할 수는 없다. 버전을 poset으로 모델링해보면 어떨까? a ≺ b 관계가 성립하는 경우에는 b의 변환기를 이용해 a를 마이그레이션할 수 있다. 이 관계가 성립하려면 (1) a가 안정 버전이고, (2) b가 알파 버전이 아니고, (3) major(a) < major(b)이어야 한다.

1

오랜만에 복잡한 문제를 단순한 형태로 모델링해서 해결했다. 문제 상황은 대략 라이브러리의 메이저 버전을 위해 자동 마이그레이션을 지원하는 것이다. 각 메이저 버전에는 이전 버전의 코드를 자동으로 변환해주는 변환기가 함께 배포된다. 만약 1.x에서 3.x로 업데이트할 때는 2.x 변환기, 3.x 변환기를 순차적으로 실행해야 한다. 즉, 하위 버전에서 출발해 상위 버전에 도착하는 경로를 구해야 한다.

그런데 베타 버전(x.y-beta)과 알파 버전(x.y-alpha.z)을 고려해야 한다. 베타 버전에는 직전 버전에 대한 변환기가 있고, 알파 버전에는 변환기가 없다. 나이브하게 생각해보면 출발 버전 유형과 도착 버전 유형의 조합에 대해 모든 경우를 분기해서 경로를 구할 수 있을 것처럼 보인다.

세로로 정렬된 버전 업그레이드 흐름도. 가장 아래에 1.x가 있고, 위쪽으로 2.x, 3.x, 4.x가 순차적으로 배치되어 있다. 각 버전은 위를 향한 실선 화살표로 연결되어 있으며, 하위 메이저 버전에서 상위 메이저 버전으로의 직선적인 변환 경로를 나타낸다. 모든 노드는 연한 녹색 배경의 둥근 사각형으로 표시되어 있다.버전 계보를 나타내는 흐름도로, 변환히가 있는 안정 버전과 베타 버전, 알파 버전이 공간적으로 분리되어 배치되어 있다. 오른쪽에는 버전 흐름이 세로로 정렬되어 있으며, 1.x에서 2.x, 3.x, 4.x를 거쳐 5.x-beta로 업그레이드된다. 2.x에서 3.x-beta로, 3.x에서 3.x-alpha.0으로의 분기 경로가 명확히 표시된다. 왼쪽에는 알파 버전들이 독립적으로 배치되어 있으며, 2.x-alpha.0에서 2.x-alpha.1로 이어지는 체인과 2.x-alpha.k, 3.x-alpha.0이 포함된다. 실선과 곡선 화살표는 2.x 또는 3.x에서 각 알파 및 베타 버전으로의 파생 관계를 나타낸다. 녹색 노드는 변환기가 있는 버전, 흰색 노드는 변환기가 없는 버전을 의미한다.
1

Found this helpful resource by Ben Boyter (@boyter): a collection of sequence diagrams explaining how / works in practice—covering post creation, follows, boosts, deletions, and user migration.

If you're trying to implement ActivityPub, the spec can be frustratingly vague, and different servers do things differently. This aims to be a “clean room” reference for getting federation right.

https://github.com/boyter/activitypub

Found this helpful resource by Ben Boyter (@boyter): a collection of sequence diagrams explaining how / works in practice—covering post creation, follows, boosts, deletions, and user migration.

If you're trying to implement ActivityPub, the spec can be frustratingly vague, and different servers do things differently. This aims to be a “clean room” reference for getting federation right.

https://github.com/boyter/activitypub

2
2
0
1

According to @tchambersTim Chambers's My 2026 Open Social Web Predictions:

Fedify will power the federation layer for at least one mid-sized social platform (500K+ users) that adds ActivityPub support in 2026. The “build vs. buy” calculation for federation shifts decisively toward “just use Fedify.”

We're honored by this recognition and will keep working hard to make adoption easier for everyone. Thank you, Tim!

0
0
0

Here's a API design challenge I'm working on: adding async support to (CLI argument parser) without breaking the existing sync API.

The tricky part is combinators—when you compose parsers with object() or or(), the combined parser should automatically become async if any child parser is async, but stay sync if all children are sync. This “mode propagation” needs to work at both type level and runtime.

I've prototyped two approaches and documented findings. If you've tackled similar dual-mode API designs, I'd love to hear how you approached it.

https://github.com/dahlia/optique/issues/52

2
3
1

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

스마일 PRO 라식 수술 후기

자손킴 @jasonkim@hackers.pub

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

Read more →
2
5
1

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

2
4
1

Claude Code에 네이티브 LSP 지원 기능 추가
------------------------------
- 터미널에서 실행되는 *AI 기반 코딩 도구* 인
Claude Code 가 최신버전에서 *LSP (Language Server Protocol) 도구* 를 추가
- 이를 통해 *정의로 이동(go-to-definition)* , *참조 찾기(find references)* , *호버 시 문서 표시* 같은 *IDE 수준의 코드 인텔리전스 기능* 제공
-
/terminal-setup 명…
------------------------------
https://news.hada.io/topic?id=25269&utm_source=googlechat&utm_medium=bot&utm_campaign=1834

2
3
6
6
2
3

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

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

5
2

Optique 문서를 보다가 argument ordering 파트에서 프로퍼티가 나타난(? appear) 순서대로 파서가 동작(? consume)한다고 되어 있어서 Object 타입인데 이게 작성한 순서대로 Object.entries() 같은 곳에서 순회되기를 기대할 수 있나 의문이 들었다(Object가 Map같은 거라고 생각했어서).

아래와 같이 타고 가면:

  1. 20.1.2.5 Object.entries ( O ) (User call)
  2. 7.3.23 EnumerableOwnProperties ( O, kind ) (called by 2. Let entryList be ? EnumerableOwnProperties(obj, key+value).
  3. 10.1.11 [[OwnPropertyKeys]] ( ) (called by 1. Let ownKeys be ? O.[[OwnPropertyKeys]]().)
  4. 10.1.11.1 OrdinaryOwnPropertyKeys ( O ) (called by 1. Return OrdinaryOwnPropertyKeys(O).)

아래와 같은 대목을 만나는데:

  1. Let keys be a new empty List.
  2. For each own property key P of O such that P is an array index, in ascending numeric index order, do
    1. Append P to keys.
  3. For each own property key P of O such that P is a String and P is not an array index, in ascending chronological order of property creation, do
    1. Append P to keys.
  4. For each own property key P of O such that P is a Symbol, in ascending chronological order of property creation, do
    1. Append P to keys.
  5. Return keys.

만약 key가 array index가 아닌 문자열 혹은 Symbol이라면 프로퍼티 생성 발생의 오름차순 순서(? ascending chronological order of property creation)대로 순회(?)해야한다고 적혀있다.

아마.. 잘 못 찾아서 못 본 걸수도 있지만 chronological이나 creation 같이 검색했을때 스펙에서 이를 다루는 방법을 정의하지는 않는 것 같았다. 예를 들어, PropertyDescriptor이 auto increment 되는 고유 ID를 갖고 있어야 하고 이를 통해 정렬해야한다, 거나?

실제 구현을 보고 싶어서 GitHub에 있는 V8 미러로 가서 보니 key들을 OrderedHashSet으로 갖고 있는 듯 했다. 생각해보니 그러면 되네, 싶어서 더는 안 찾아봤다.

암튼 Optique 문서대로 생성 순서대로 동작할 것 같다!

3
7

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

미소녀 보려고 미연시를 켰더니 게임 콘솔이 해킹당했어요

Helloyunho @helloyunho@hackers.pub

Ren'Py 기반 PlayStation(플레이스테이션) 게임에서 발생하는 취약점을 이용한 익스플로잇 도구인 yarpe(Yet Another Ren'Py PlayStation Exploit)의 개발 과정과 기술적 원리를 다룹니다. 이 프로젝트는 Python(파이썬)의 Pickle(피클) 라이브러리가 역직렬화 과정에서 임의의 코드를 실행할 수 있다는 보안 결함을 활용하며, 세이브 파일 내부의 데이터를 조작하여 게임 엔진의 제어권을 획득합니다. 저자는 메모리 권한 제한을 우회하기 위해 ROP(Return Oriented Programming) 기법과 unsafe-python을 도입하여 직접적인 메모리 접근 및 스택 포인터 조작을 구현했습니다. 특히 Xbox(엑스박스)에서의 성공적인 초기 실험을 바탕으로 PlayStation 5의 실행 전용 메모리(XOM)와 같은 까다로운 보안 제약 사항을 극복하고 최종적으로 코드를 실행하는 과정을 상세히 설명합니다. 이 글은 복잡한 하드웨어 보안 환경 속에서도 논리적인 분석과 창의적인 접근을 통해 시스템의 한계를 시험하는 과정을 보여주며, 임베디드 보안과 리버스 엔지니어링에 관심 있는 독자들에게 깊이 있는 기술적 통찰을 제공합니다.

Read more →
5

tauri로 패스워드 툴 만드는 이유, 레거시 프로덕트의 지속 여부를 결정할 때 llm을 어찌 썼는지, claude skill 활용 방법, 오라클 클라우드 쓰면 왜 좋은가, 개발자가 개발을 좋아하냐, 좋아 해야만 하냐, 개발자의 ethic 등... 2025년 라스트 개발 밋업이 알차네요.

4
0
3

어제 해커스펍 송년회를 잘 다녀왔습니다. 이동하는 버스 안에서 제 해커스펍 주소를 QR 코드로 열심히 만들었는데, 막상 공유할 용기는 없어서 못 했네요 ㅋㅋ

전날까지도 갈까 말까 고민을 많이 했었는데, 부담감을 이기고 다녀오길 정말 잘했다는 생각이 들었습니다. 라이트닝 토크도 하나같이 유익했어요.

저는 클로드 코드는 아직 써보지 않았는데 (토큰이 살살 녹는다는 얘기를 들어서요 ㅋ ), 이야기를 듣다 보니 요즘 대세는 확실히 클로드 코드인가 싶더라고요. 이제 써볼까 생각만 하고 있었는데, 어제 라이트닝 토크 발표를 듣고 나니 “바로 시작해봐야겠다”는 생각이 들었습니다. 🐱‍💧

6
3
2
6
7
1

https://github.com/makachanm/knife

개인적으로 진행하는 풀스택 프로젝트로써 단순한 싱글-유저 액티비티펍 블로그 플랫폼인 Knife를 제작중이다. 직접 이 플랫폼으로 글을 가끔 끼적이면서 조금씩 개선시킬 생각이다.

2

제 지인 분이 GitHub 에서 인종차별적 코멘트를 받으셨습니다. GitHub 계정이 있으시면 신고 부탁드립니다. 영어가 어려우시더라도 LLM으로 신고글 써달라고 하면 잘 써줍니다. 신고는 단 시간 내에 많이 찍혀야 실제 보고로 올라가기 때문에 가능하신 분들은 꼭 신고 부탁드립니다.

4
0
0
11
11

오늘 Hackers' Public @ Seoul 송년회에서 "개발자는 개발을 좋아해야 하는가? 에 대한 고찰"로 라이트닝 토크를 진행했습니다. 사실 제가 발표자인줄도 모르고 앞에서 이야기를 진행하게 되었는데, 많은 분께서 호응해주시고 또 경험에서 우러나온 진솔한 의견을 내주셔서 다양한 이야기가 오갈 수 있었습니다. 모두 감사드리며, 내년에 모두 원하시는 바 이루기를 기원하겠습니다. 🥰

8