@joonnotnotJoon 오, 후원 감사합니다!

洪 民憙 (Hong Minhee)
@hongminhee@hackers.pub · 565 following · 372 followers
Hi, I'm who's behind Fedify, Hollo, BotKit, and this website, Hackers' Pub!
Fedify, Hollo, BotKit, 그리고 보고 계신 이 사이트 Hackers' Pub을 만들고 있습니다.
Website
- hongminhee.org
GitHub
- @dahlia
Hollo
- @hongminhee@hollo.social
DEV
- @hongminhee
velog
- @hongminhee
Qiita
- @hongminhee
Zenn
- @hongminhee
Matrix
- @hongminhee:matrix.org
X
- @hongminhee
@saengmotmi생못미
@jasonkim자손킴 안녕하세요, 어서 오세요!
그러고 보니 Hackers' Pub에서 해시태그 팔로가 안 되네… 할 거 많다.
Pulumi 웹사이트를 보고 Apache Libcloud랑 비슷한 건가 싶었는데, Perplexity에 따르면 둘은 꽤 다른 물건이구나.
- 새 MacBook Air 세팅
- 가끔씩 응답이 늦는 Hackers' Pub 버그 살펴보기
- Hackers' Pub 다국어 콘텐츠 기능 설계
Hackers' Pub은 현재 원격 콘텐츠에 포함된 온갖 이미지를 캐시하지 않고 원격 URL 그대로 서빙하고 있는데, 일부 ActivityPub 구현은 계정 프로필 사진이 바뀌면 기존 프로필 사진을 아예 삭제해 버려서 가끔씩 원격 계정의 프로필 사진이 로딩이 안 되고 깨지는 문제가 발생하고 있다. 음… 귀찮아서 캐시를 안 하고 있었는데 역시 캐시를 하긴 해야 하나?
Hackers' Pub에서는 현재 PostgreSQL 드라이버로 Postgres.js를 쓰고 있는데, 문제는 이 드라이버가 OpenTelemetry 지원하지 않는다… 수동으로라도 계측 코드를 짜려면 훅이 필요한데, 훅 API도 들어올 예정이 없다.
그래서 PostgreSQL 드라이버를 아예 node-postgres로 바꿀까 싶기도 한데, 이미 @fedify/postgres 패키지가 Postgres.js에 의존을 하고 있기 때문에 한 애플리케이션에서 두 종류의 드라이버를 쓰는 꼴이 된다. 음, 아무래도 상관 없으려나?
거의 7년 가까이 DevOps에서 손을 뗀 채 지냈더니 이제 DevOps를 어떻게 하는 건지 도통 모르겠다. 처음부터 다시 배워야 하는 상황.
Deno는 console.log()
에서 %c
형식 지정자를 통해 간단한 CSS를 사용할 수 있다.
console.log("%cHello World", "color: red");
console.log("%cHello World", "background-color: blue");
console.log("%cHello World", "text-decoration: underline");
console.log("%cHello World", "text-decoration: line-through");
console.log("%cHello World", "font-weight: bold");
console.log("%cHello World", "color: red; font-weight: bold");
console.log("%cHello %cWorld", "color: red", "color: blue");
console.log("%cHello World", "color: #FFC0CB");
console.log("%cHello World", "color: rgb(255, 192, 203)");
위 코드는 아래처럼 출력된다:
Hello World
Hello World
Hello World
Hello World
Hello World
Hello World
Hello World
Hello World
Hello World
I've been wrestling with implementing #multilingual content support in Hackers' Pub, our #ActivityPub-powered platform for software engineers.
While ActivityPub theoretically supports multilingual content through the contentMap
property, the reality is that most server implementations (Mastodon, Misskey, etc.) don't properly handle this content as of April 2025. This creates a significant challenge for us.
We want our users to share their knowledge in multiple languages, but we need to ensure compatibility with existing ActivityPub servers. I'm considering several approaches:
- Creating separate posts for each language with clear language indicators, linking them through
inReplyTo
relationships (so translations appear as replies to the original post) - Using the primary language in
content
while storing translations incontentMap
- Adding "View in other languages" links at the bottom of each post
- Implementing inline language dividers that degrade gracefully on non-supporting servers, for example:
<div lang="en"> <h3>English</h3> <p>This is the English content…</p> </div> <hr> <div lang="ko"> <h3>한국어</h3> <p>한국어 내용입니다…</p> </div>
I'm leaning toward a hybrid approach—showing content in the user's preferred language when possible while providing easy access to other language versions.
Has anyone tackled this problem effectively? I'd love to hear about your experiences or ideas for making multilingual content work well in the fediverse, especially when dealing with server implementations that don't fully support ActivityPub's multilingual features.
소프트웨어 엔지니어를 위한 연합우주 서비스 Hackers' Pub을 알고 계신가요? 저희가 특별히 중요시하는 것은 다른 플랫폼과는 조금 다른 행동 강령입니다.
저희는 현실 세계의 불평등이 온라인 공간에도 그대로 반영된다는 사실을 인식하고 있습니다. 그래서 “모든 사람을 동등하게 대우”한다는 표면적인 중립성이 아닌, 구조적 불평등에 적극적으로 대응하는 자세를 분명히 하고 있습니다. 이러한 접근의 일환으로, 차별적 발언과 차별에 대항하는 발언을 구분합니다. 이를 통해 “차별은 안 된다”는 명목 하에 차별 비판까지 동일시하는 “양비론”의 함정을 피할 수 있다고 생각합니다.
기술 커뮤니티에서 자주 볼 수 있는 문제로는 특정 기술 선택에 대한 비판이나 기술 수준에 따른 계층화가 있습니다. “이것도 모르냐?”는 태도는 학습을 방해할 뿐입니다. 저희는 초보자와 경험자 모두 동등하게 존중받는 환경 조성을 중요시합니다.
또한, 연합우주의 핵심 가치로 프라이버시가 있지만, Hackers' Pub에서는 특히 익명성의 권리를 강조합니다. 타인의 신원을 특정하려는 행위나 익명이라는 이유로 차별하는 것을 금지함으로써, 안심하고 참여할 수 있는 공간을 지향합니다.
이러한 행동 강령 자체도 완벽하지 않으며, 커뮤니티와 함께 발전해 나가는 것이라고 생각합니다. 모든 구성원이 개선안을 제안할 수 있는 체계를 마련함으로써, 더 나은 환경을 함께 만들어 나가고자 합니다.
자세한 내용은 Hackers' Pub 행동 강령을 참조해 주세요. 연합우주에서 더 건강한 기술 커뮤니티를 함께 키워나가지 않으실래요?
그 동안에는 Mastodon 등 다른 연합우주 인스턴스에서 앙케트를 만들면 Hackers' Pub에서는 앙케트의 선택지가 보이지도 않고 참여할 수도 없었는데요, 이제 Hackers' Pub에서도 앙케트(poll)에 참여할 수 있게 되었습니다. 다만, 아직 Hackers' Pub에서 새 앙케트를 만드는 기능은 구현되지 않았습니다. 새 앙케트를 만드는 기능은 필요하다는 의견이 많으면 구현하도록 하겠습니다. 언제나 같은 패턴이지만, UI 만드는 게 힘들어서요. 😅
딱 오늘까지만 (하던 거 오늘 못 끝내면 내일 오전까지만) ActivityPub 연합 관련 기능 만들고, 그 뒤에는 자체 기능에 집중해야지…
사소한 업데이트지만… 기존에는 다른 연합우주 인스턴스로부터 비디오가 첨부된 단문이 왔을 때 비디오는 아예 누락되었는데, 이제는 비디오의 섬네일이 보이고 누르면 비디오가 재생되도록 만들었습니다. 다만, 여전히 Hackers' Pub에서 비디오를 첨부하는 기능은 구현되지 않았습니다. (우선 순위가 낮아서 언제 구현될 지 저도 모르겠네요.)
RE: https://hollo.social/@hongminhee/01963809-041e-7b26-a242-a8e1cc4b0afc
데이터베이스 마이그레이션 도구들이 모두들 Alembic을 본받아서 브랜치와 머지를 지원했으면 좋겠다…
오브젝트 스토리지 추상화 계층으로 FlyDrive를 쓰고 있는데… 이건 어째서 Disk.getUrl()
메서드가 Promise<string>
을 반환하게 해 뒀을까…? 아무데서나 쉽게 호출할 수가 없네.
@kkungMinyoung Jeong 님 어서 오세요!
요즘 바이브 코딩을 계속 시도해 보고 있는데, 국제화 등의 작업에서는 아주 만족스러운 반면, 다소 복잡한 과업에서는… 너무 헤매거나, 너무 오래 걸리는 것 같다. 결국 답답해서 직접 코딩하게 되는 것의 반복.
아, 일단 여태까지는 Claude Sonnet 3.7을 주로 쓰긴 했다. Gemini 2.5 Pro도 써 보긴 해야 하는데…
그나저나 작년 12월에 MVP로 목표했던 기능 중에 하나가 패스키였는데… 이것으로 처음 생각했던 MVP는 달성한 것 같다.
지금까지 Hackers' Pub은 반드시 이메일을 통해 로그인 링크를 수신하는 식으로만 로그인이 가능했는데, 사실은 많이 번거로웠죠?
이를 해결하기 위해 Hackers' Pub에 패스키 기능을 추가했습니다. 패스키 추가는 설정 → 패스키 페이지에서 할 수 있으며, 패스키가 등록된 기기 및 브라우저에서는 로그인 페이지에서 자동적으로 패스키를 사용할 것인지 묻는 창이 뜨게 됩니다.
어째서 ActivityPub을 바닥부터 구현하는 것보다 Fedify를 쓰는 게 여러모로 나은지에 대한 글(영어)을 썼습니다.
제가 직접 쓴 튜토리얼이긴 하지만, Fedify를 활용하는 〈나만의 연합우주 마이크로블로그 만들기〉도 꽤 괜찮은 자료라고 생각합니다. 😅
다른 연합우주 서버로부터 앙케트 조사를 담은 Create(Question)
액티비티가 자주 들어오고 있는데, Hackers' Pub에서도 적어도 앙케트 조사를 열 수는 없어도 참여할 수는 있게 해야 하나 고민하고 있다. 그런데 이것도 결국 UI가 귀찮은 문제인데…
Hackers' Pub에도 #해시태그 기능이 추가되었습니다.
Hackers' Pub은 검색에서 몇 가지 기본적인 문법들을 지원하고 있습니다. 문서화되지 않았기 때문에 한 번 정리해 봅니다.
문법 | 설명 | 예시 |
---|---|---|
" 키워드 " |
따옴표 안에 들어간 문자열을 띄어쓰기를 포함하여 찾습니다. 대소문자는 구분하지 않습니다. (따옴표 안에 따옴표를 넣으려면 \" 와 같이 이스케이프.) |
"Hackers' Pub" |
from: 핸들 |
해당 사용자가 쓴 콘텐츠만 추립니다. | from:hongminhee from:hongminhee@hollo.social |
lang: ISO 639-1 |
해당 언어로 쓰여진 콘텐츠만 추립니다. | lang:ko |
# 태그 |
해당 태그가 달린 콘텐츠만 추립니다. 대소문자는 구분하지 않습니다. |
#Fedify |
조건 조건 |
띄어쓰기 양 옆의 조건을 모두 만족하는 콘텐츠만 추립니다(논리곱). | "Hackers' Pub" lang:ko |
조건 OR 조건 |
OR 연산자 양 옆의 조건 중 하나라도 만족하는 콘텐츠를 추립니다(논리합). |
해커즈퍼브 OR "Hackers' Pub" lang:ko |
( 조건 ) |
괄호 안의 연산자들을 먼저 결합합니다. | (해커즈퍼브 OR 해커즈펍 OR 해커스펍) lang:ko |
구체적인 동작 방식은 Hackers' Pub 소스 코드를 보시면 더 자세히 알 수 있습니다.
드디어 @xtjuxtapose 님이 기다리시던 차단 기능이 구현되었습니다. 차단할 사용자의 프로필 페이지에 가서 팔로·언팔로 버튼 오른쪽에 보이는 말줄임표 아이콘에 마우스 커서를 갖다 대면 (모바일에서는 터치하면) 상세 메뉴가 나오는데, 그 안에 팔로워 삭제 버튼과 차단 버튼이 생겼습니다.
ActivityPub 프로토콜 수준에서는 차단은 Block
액티비티를 차단한 액터에게 보내며, 차단을 해제할 경우 Undo(Block)
액티비티를 보냅니다. 그러나, 그 액티비티를 받은 인스턴스의 구현이 차단한 사용자의 콘텐츠를 볼 수 없도록 막지 않을 수도 있습니다…만, 실질적으로는 모든 구현이 막고 있습니다. 아, 당연하지만 차단은 자동적으로 상호 언팔로를 수행합니다. 차단을 해제하더라도 풀렸던 팔로 관계는 자동적으로 회복되지 않습니다.
Hackers' Pub에 차단 구현하면서 지금 만들고 있는 코드인데… fromAccountToTarget
/fromTargetToAccount
말고 좀 더 짧으면서 좋은 이름이 없을까? 🤔
export type RelationshipState =
| "block"
| "follow"
| "request"
| "none";
export interface Relationship {
account: Account & { actor: Actor };
target: Actor;
fromAccountToTarget: RelationshipState;
fromTargetToAccount: RelationshipState;
}
Hackers' Pub에 차단 기능을 구현합니다.
차단 기능의 밑작업으로… 차단 당하는 기능을 만들었습니다. Hackers' Pub 사용자 여러분은 이제 연합우주 내 다른 인스턴스의 사용자로부터 차단 당할 수 있습니다. ActivityPub의 Block
액티비티 및 Undo(Block)
액티비티를 수신하고 처리할 수 있게 되었다는 뜻입니다. 하지만 아직 차단을 하는 건 안 됩니다. 오늘은 일단 여기까지 하기로 하고… 차단 기능은 아마 내일이나 완성될 것 같군요.
어떻게 git reset --hard
를 막아놓든가 해야지, 가끔 가다 한 번씩 꼭 실수로 작업하던 걸 날려서 후회를 하네…
Hackers' Pub에 차단 기능을 만들다 보니 일단 모델 쪽에서 팔로워 삭제 기능이 필요하다는 것을 깨달았다. 즉시 하던 작업 다 git stash
하고 팔로워 삭제 먼저 만드는 중… (하지만 UI로 노출하는 건 나중에 할 생각.)
Hackers' Pub에 차단 기능을 만들고 있는데, A가 B를 차단했을 때 A가 B의 콘텐츠를 볼 수 있어야 한다고 생각하시나요? 물론 타임라인 등에서는 기본적으로 다 가려지겠지만, B가 올린 콘텐츠의 퍼머링크를 굳이 찾아서 들어갔을 때 말이죠. 아, 당연히 B 입장에서는 A의 콘텐츠는 전혀 볼 수 없고요. (A가 공개로 올린 콘텐츠를 B가 로그인하지 않은 채 볼 수야 있겠지만…)
생각해 보니 에모지 반응 찍을 때 게시물이 Mastodon에서 작성된 경우에는 선택지를 없애는 게 나으려나…? Like
액티비티로 표현되는 ❤️ 이외에는 모두 Mastodon이 받아들이지 않는 EmojiReact
액티비티로 표현되기 때문에, 게시물 작성자가 어차피 에모지 반응을 볼 수 없으므로…
사실 Hackers' Pub 같은 거 운영하면서 최신 DevOps도 배우고 좀 그래야 하는데…
GeekNews가 자체적으로 ActivityPub을 구현하면 정말 좋을 것 같은데, 아마 그렇게 되는 것보다 Hackers' Pub에 링크 집계 기능을 넣는 게 더 빠르겠지…
PostgreSQL 내장 전문 검색의 가장 큰 문제는 성능이 아니라, 색인을 만들거나 검색할 때 대상 언어를 지정해야 한다는 것. 당연히 언어가 섞여 있으면 제대로 동작 안 하고, 색인하려는 내용이 어떤 언어로 작성되었는지 모를 때도 곤란하다.
技術者向けSNS「Hackers' Pub」の招待枠を持っています。ActivityPubに対応し多言語サポートもある、エンジニアや技術に興味がある方のためのコミュニティです。参加希望の方はDMやコメントでメールアドレスをお知らせください。招待状をお送りします。
#HackersPub #テック #プログラミング
RE: https://hackers.pub/@hongminhee/0195faee-783f-7d33-ad90-88c497655ab9
GeekNews의 〈소프트웨어 엔지니어로 산다는 건 미친 짓이야〉 주제에 @youknowone 님께서 쓰신 좋은 댓글:
소프트웨어 개발이 어려운 일이라는 사람들은 본인이 그 일을 하는 이유가 뭘까요? 고되고 힘든 일이지만 보람있는 일이라서 하시나요? 이 업계에서 그런 분들은 그리 많지는 않았던 것 같습니다. 남들이 못하는 것 같으니까 어렵다고 주장하는거지, 실상은 그게 본인한테 가장 쉬운 일이니까 하시는 것 아닌가요? 남들이 좀 띄워준다고 자화자찬하면서 나만 특별한 양 여기면서 눈을 가리지 말고 주위를 봐야합니다. 이공계에서 어떤 분야가 방구석에서 인터넷 좀 보고 독학한다고 (잘 하면) 몇달만에 현업에 투입할 수 있는 전문가가 됩니까?
(…중략…)
물론 남들이 가지지 못한 훌륭한 손재주를 가진 사람은 존중받아 마땅하지만, 약간의 손재주를 연마했다고 해서 소싯적 배워둔 손재주로 평생 먹고 살면 좋을텐데 왜 그럴수 없을까, 나는 이런 훌륭한 손재주를 가졌는데 다른 사람들처럼 힘들게 일하지 않아야 하는 것 아닐까, 나는 남들은 쉽게 하지 못하는 대단한 재능을 가진 것이 아닐까 등등의 특별한 나에 심취하는건 교만에 가까운 일이 아닐까 합니다.
@zerodice0검은곰 님, 어서 오세요!
메타적인 얘기지만, 저는 오늘 “Kubernetes는 적정 기술인가?”라는 떡밥이 Hackers' Pub 내부적으로 발생했다는 사실이 아주 기쁩니다. 여태까지는 Hackers' Pub 자체에 대한 떡밥이거나, GeekNews나 X에서 넘어온 떡밥이었거든요.
PostgreSQL에서는 GENERATED ALWAYS AS
절을 통해 생성된 칼럼을 지원하는데, 이게 간단한 사칙연산이나 문자열 연결 정도는 쉽게 가능하지만, 이 안에서 서브쿼리를 쓸 수 없기 때문에 조금만 복잡한 계산도 할 수가 없다. 나 같은 경우에는 {"foo": 1, "bar": 2, "baz": 3}
과 같은 jsonb
값이 있을 때 이로부터 6
과 같은 합산을 해야 하는 상황인데, sum()
같은 집계 함수를 쓸 수 없기 때문에 원하는 동작을 만들어 내지 못한다… 최후의 카드로 커스텀 함수 정의해서 쓰는 방법이 있긴 한데… 음…
개판으로 짜 뒀던 Hackers' Pub 코드, 더이상은 무리라서 리팩터링을 조금씩 해보고 있다. (여러분이 생각하는 것 이상으로 개판입니다.)
Hackers' Pub의 에모지 반응 기능은 Mastodon의 좋아요, Misskey 계열, Pleroma 계열, kmyblue 및 Fedibird의 에모지 반응 기능과 호환됩니다. 기술적으로는 기본 에모지인 ❤️는 Like
액티비티로 표현되며 그 외 나머지 에모지는 EmojiReact
액티비티로 표현됩니다. Mastodon, kmyblue, Fedibird의 좋아요는 ❤️ 에모지 반응으로 변환됩니다 (Misskey의 동작과 유사). 또한, Misskey 계열과 달리 한 사람이 한 콘텐츠에 여러 에모지 반응을 남길 수도 있습니다 (Pleroma 계열의 동작과 유사). Hackers' Pub 사용자가 남길 수 있는 에모지 반응은 ❤️, 🎉, 😂, 😲, 🤔, 😢, 👀 이렇게 7종이며, 그 외의 에모지 및 커스텀 에모지는 보낼 수는 없고 받는 것만 됩니다.
에모지 반응 기능이 배포되었습니다. 당분간 버그가 좀 있을 수도 있지만 양해 바랍니다. 전 이제 차단을 구현하러 가겠습니다…
ANSI SQL 표준에서 NULL
값이 서로 DISTINCT
하지 않은 것은… 그 성질이 아주 편할 때도 많지만, 그렇지 않을 때는 아주 골치가 아프다. 특히 UNIQUE
제약 조건이나 색인과 결부되면 더욱 그렇다.
Kubernetes를 아직도 쓸 줄 모르는 1人… Hackers' Pub도 그냥 Docker Compose로 운영하고 있습니다. 🙄
RE: https://hackers.pub/@ujuc/0196189f-1c95-7120-831b-27d7c51e8f38