@kodingwarriorJaeyeol Lee
@hongminhee洪 民憙 (Hong Minhee) 그 HS인가 앱 켜면 나오는 그... 저화질 로고라도...

洪 民憙 (Hong Minhee)
@hongminhee@hackers.pub · 415 following · 277 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
@akastoot악하
@kodingwarriorJaeyeol Lee 뭐 로고는 나중에 생각하고 일단 후원 신청부터 했습니다.
해펍도 SNS니까... 5만원 내면... 커뮤니티 가능할까... (#파이콘한국2025 #후원사모집 #Call_for_Sponsors)
@akastoot악하 후원 해봐야겠네요!
해펍도 SNS니까... 5만원 내면... 커뮤니티 가능할까... (#파이콘한국2025 #후원사모집 #Call_for_Sponsors)
바뀌지도 않은 코드가 잘 되다가 갑자기 안 되니 미치고 팔짝 뛰겠다…
複数の文字列を受け付けられるようにしたv0.5.0を出荷しました。ほぼVibe Codingで更新しました。
@yamanoku/baseline-mcp-server - JSR
WASM 2.0 공식 릴리즈
------------------------------
- *Wasm 2.0 스펙* 이 공식적으로 발표됨
- Wasm Community와 Working Groups가 2022년부터 스펙을 완성했고, 주요 구현체는 이미 2.0을 지원하고 있었음
- 2.0부터는 *에버그린 모델* 이 도입되어, Candidate Recommendation 문서가 지속적으로 최신 상태로 갱신됨
- 새 버전이 발표될 때마다 최종 권고안으로…
------------------------------
https://news.hada.io/topic?id=20812&utm_source=googlechat&utm_medium=bot&utm_campaign=1834
Void Linux 미러의 Helm 차트를 정리해서 다양한 미러를 구성할 수 있는 Helm 차트를 만들었어요~~
https://github.com/kyokugirl/helm-charts/tree/main/charts/file-mirror
AWS 를 바닥 (vpc 세팅) 부터 새롭게 하고 있다. private, public subnet 나누고 NAT 인스턴스 올리고, 베스천으로 프록시점프해서 private 구간 인스턴스 ssh 접속 확인하고 nginx 올리고 next 프로젝트 가져와서 proxy pass 걸고 alb 넣고.. 콘솔에서 바닥부터 한땀한땀 설정하는 게 오랜만이라 그런가 재밌다.
(요즘 엔지니어들이라면 IaC로 단숨에 끝냈겠지만)
아무도 알아주지 않지만 견고하게(?) 세팅 끝냈다며 혼자 뿌듯해 하는 1인, 그렇게 하루종일 개발 안하고 인프라 만지작 거리다 하루가 끝났다.
Fedify에 드디어 RFC 9421을 얼추 구현했고, 이제 상호운용성 테스트를 위해 Mastodon의 특정 브랜치를 실제로 인스턴스로 띄워서 액티비티를 송수신해봐야 한다. 그런데 Mastodon 띄우기가 너무나 귀찮다… (Mastodon 띄우기 귀찮아서 ActivityPub 개발 시작한 사람.)
@hongminhee洪 民憙 (Hong Minhee) 사실
git reset --hard
를 타이핑하고 엔터를 누르는 순간까지는, '이 변경사항이 필요할일은 결코 없겠지'란 확신을 200%가지고 있지요ㅋㅋ
@bglbgl gwyng 맞습니다.
git stash
로 동작하게 해둬도 git stash drop
까지 쳐버리고 나중에 후회할지도요… 😂
예전부터 생각하던 건데, git reset --hard
를 인자 없이 쓰면 git stash
로 동작하거나, 아니면 적어도 인자 없이 썼을 때 오류가 나게끔 설정할 수 있었으면 좋겠다. 별 생각 없이 날려도 괜찮겠지 싶어서 git reset --hard
쳤다가 몇 분 뒤에 후회하는 경우가 종종 있다.
그냥 습관을 바꿀 수 있으면 좋겠다…
예전부터 생각하던 건데, git reset --hard
를 인자 없이 쓰면 git stash
로 동작하거나, 아니면 적어도 인자 없이 썼을 때 오류가 나게끔 설정할 수 있었으면 좋겠다. 별 생각 없이 날려도 괜찮겠지 싶어서 git reset --hard
쳤다가 몇 분 뒤에 후회하는 경우가 종종 있다.
I shipped a fix to https://fedidb.com addressing missing servers, the culprit was our updated crawler robots.txt logic.
Next up: software version tracker, feature matrix, FEP Library, People Directory, Dev Tools, and Starter Kits.
The fedi deserves great tools. We deliver. ✨
Did you know that `Function.length` returns the number of parameters?
I just (re)learnt that today but it doesn't explain why I wrote this code a year ago 🤦
which means I'm just gonna leave it alone...
@leetekwooteklee 님 어서 오세요!
We're excited to announce that we've implemented RFC 9421 (HTTP Message Signatures) in #Fedify, complete with our double-knocking mechanism to maintain backward compatibility with the draft cavage version.
This implementation includes both signature generation and verification, meaning #RFC9421 is used when both sending and receiving activities. While we haven't merged the RFC 9421 implementation branch yet, we're currently conducting interoperability tests with development versions of Mastodon and other #ActivityPub implementations. Once these tests confirm compatibility, we'll proceed with the merge.
As noted in the attached docs, although RFC 9421 is the final and official standard for HTTP Signatures, the draft cavage version remains widely used across the #fediverse. Our double-knocking mechanism ensures maximum compatibility by trying the RFC 9421 version first, then falling back to draft cavage if needed.
Currently, we support RSA-PKCS#1-v1.5 key pairs for generating HTTP Message Signatures, with plans to expand to other signature types in future releases.
We look forward to contributing to a more standardized and secure fediverse!
학과 책장에 11년 전에 출간한 웹 접근성 책을 찾았습니다.
책 목차를 살펴보니 WCAG 표준에서 제정한 아래 4가지 원칙을 개별마다 많은 사례를 바탕으로 다루고 있네요.
- 인지할 수 있는(Perceivable)
- 조작 가능한(Operable)
- 이해할 수 있는(Understandable)
- 견고함(Robust)
자료가 오래되었지만 흥미 있는 사례집이라 읽어 보려고 합니다.
요 며칠 코딩이 잘 안 되는 느낌… 아닌가, 원래 평소에도 이랬던가? 😑
세계 접근성 인식의 날은 매년 5월 셋째주 목요일로 지정되어있고, 올해는 오는 5월 15일(목)입니다.
a11ykr 커뮤니티 멤버들과 함께 한국어 소개글을 준비해서 제출했는데, 사이트에 게시되면 좋겠습니다.
The abbreviation #a11y itself is not very accessible. #accessibility
국산 코드에서 gubun
같은 식별자를 볼 때, 우리는 그게 왜 type
내지는 discriminator
가 아닌지 물을 것이 아니라, 어째서 구분
이 될 수 없는지를 물어야 한다.
国産のコードでdenwa
の様な識別子を目にした際、我々は「なぜphone
やtel
ではないのか」と問うのではなく、「なぜ電話
には成らないのか」と問うべきだと考える。
국산 코드에서 gubun
같은 식별자를 볼 때, 우리는 그게 왜 type
내지는 discriminator
가 아닌지 물을 것이 아니라, 어째서 구분
이 될 수 없는지를 물어야 한다.
@hongminhee洪 民憙 (Hong Minhee)
RAILS_ENV=test bin/rspec [spec/some/test/file.rb] 돌리시면 됩니다. 파일명 없이 돌리면 전체 테스트가 돌아갑니다
혹시 Rails 프로젝트 좀 경험해보신 분 계신가요? Mastodon 저장소에서 단위 테스트를 돌리고 싶은데 어떻게 돌리는지 잘 모르겠습니다. 일단 bundle install
로 의존성은 다 설치해둔 상태입니다.
방금 하스켈 학교에서 객체지향 vs 함수형 떡밥이 n번째로 돌았는데, 나는 그냥 객체지향 = 상속(서브타이핑) 이라고 생각한다. 객체지향에서 상속을 빼면 뭐 남는게 없다. 그래서 객체지향이란 단어를 의미있게 사용하려면 상속이랑 동치시켜 사용할수 밖에 없다고 본다.
근데 상속은 코드를 합성하는 수많은 방법중 하나일 뿐이다. Java같은 언어는 그 수많은 방법중 딱 하나 상속만을 언어 자체에서 지원하는거고, 거기서 벗어나는 다른 유용한 추상화들은 죄다 디자인 패턴이라고 퉁쳐서 부른다. 그래서 객체지향 vs 함수형(= 상속 vs 함수형)은, 나에겐 Monoid vs 타입클래스 같은 비교처럼 들린다. 좌변과 우변이 체급이 안 맞아서 대결이 불성립한다.
@bglbgl gwyng 좀 더 정제된 말로 설명하자면 OOP에서 가장 중요한 건 부분형 다형성(subtype polymorphism)이라고 봐야겠죠. 🤔
C++를 통해 Rust의 매력을 보여준 Matt Godbolt의 설득
------------------------------
- 20년 이상 C++을 사용한 저자가 *Rust의 장점을 재발견* 하게 된 계기를 Matt Godbolt의 강연을 통해 소개함
- C++에서는 *타입 혼동에 의한 실수* 가 컴파일러에서 제대로 잡히지 않지만, Rust는 이를 *컴파일 타임에 강하게 차단* 함
- Rust는 *단순한 메모리 안전성 외에도 API 오용 방지* 에 유리한 설계를…
------------------------------
https://news.hada.io/topic?id=20760&utm_source=googlechat&utm_medium=bot&utm_campaign=1834
JetBrains사의 C/C++ IDE인 CLion은 이제 비상업적 용도로는 무료로 쓸 수 있다고 한다.
CLion Is Now Free for Non-Commercial Use - https://blog.jetbrains.com/clion/2025/05/clion-is-now-free-for-non-commercial-use/
@holloJoonkyu Park @hong_minhee洪 民憙 (Hong Minhee) 제가
자는 동안 서버가 내려갔었던 것 같습니다… 😅
FedifyにRFC 9421を実装した後、昨晩からhttpsig.orgで生成(署名)したテストベクターとの照合を試みていたが、どう見てもテストに成功せず、一日を無駄にした末に、httpsig.orgで生成したテストベクターがhttpsig.orgでも検証に失敗するという事実を悟ってしまった。
@dansupDaniel Supernault I'd like to list up my instance hackers.pub on FediDB, but how could I do that?
개발자의 저주: 고치는 능력을 가진 자의 무한한 책임감
------------------------------
- 사소한 자동화를 반복하다 보면 어느 순간 모든 도구와 시스템이 *고쳐야 할 대상* 으로 보이게 되는 *인지의 임계점* 에 도달하게 됨
- 기술력이 쌓일수록 문제를 단순히 인식하는 것을 넘어 *책임처럼 느끼게 되는 감정의 무게* 를 가지게 됨
- *고치고자 하는 욕구* 는 단순한 생산성 향상을 넘어서 감정…
------------------------------
https://news.hada.io/topic?id=20735&utm_source=googlechat&utm_medium=bot&utm_campaign=1834
나는 버전 올리기 강박증같은게 있는데, RN 초기에 불안정한 라이브러리들 많이 쓰다가 생긴거 같다. 일단 버전 올린다음에 빌드 터지는지 기존 기능 잘돌아가는지 확인하는데, 이거하느라 쓰는 시간도 꽤 된다. 실제로 시간을 아끼고 있는지(모르던 버그를 모르고 해결해서) 아닌지 모르겠다.
GitHub 저장소 코드를 분석해 AI로 문서화하는 도구. 다이어그램을 적극적으로 활용해 아키텍처를 쉽게 이해할 수 있고, 문서의 깊이와 정확도도 높다. 여러모로 <오픈 소스 소프트웨어 아키텍처>를 읽으며 아쉬웠던 부분들을 커버해주는 프로젝트. https://deepwiki.com/
.cursorrules나 .windsurfrules 등의 파일에 프로젝트에 대한 설명을 써놓는것도 도움이 되나요? 공심 홈페이지의 가이드라인을 보면 코딩스타일 등의 지침만 써놓아서요. 어차피 알아서 일종의 인덱싱을 할테니 필요없을까요?
@bglbgl gwyng 도움이 되는지는 모르겠지만, 저는 써놓을 때도 있고 안 써놓을 때도 있었네요. 🤔
@hongminhee洪 民憙 (Hong Minhee) https://orm.drizzle.team/docs/latest-releases/drizzle-orm-v0311 요렇게 쿼리 결과가 reactive해서 refetching 대신 구독을 할수있는 쿼리를 Live Query라고 하더라고요.
@bglbgl gwyng 오, 이런 게 있군요. Drizzle ORM을 서버 사이드에서만 써 봐서 이런 게 있는 줄 몰랐습니다.
잉 drizzle에 Live Query 지원이 되네요? [join된 테이블의 reactivity에 문제가 있는데] 이건 고치면되는 버그같고요? 지금 만들고 있는거 왜 하고있지? 제가 원하는 추가 기능을 넣으려면 새로 짤 필요가 있을순 있지만 말이죠.
@bglbgl gwyng Live Query가 뭔가요?
먼 미래에는 어떻게 될 지 잘 모르겠지만, 일단 코딩 에이전트한테 LSP를 툴로 쥐어 줘야 하는 게 아닌가 하는 생각이 요즘 많이 든다.
Claude Code가 다 좋은데, Claude 모델들이 죄다 콘텍스트 윈도가 짧아가지고 금방 오토 컴팩션이 도는 탓에, 그러고 나면 하던 걸 죄다 까먹고 갑자기 바보가 된다…
AI에 대한 SW 엔지니어들의 자신감은 "어쨌거나 업계 내에서 만드는거라서-" 인거 같다. 손바닥 위에 있다는 감각(얼추 맞긴 하다).
타 직업군은 AI나 LLM 솔루션 자체를 다루는데도 한계가 있거니와(아무래도 fork떠서 고친다거나 할순 없으니까) 결과물도 자기 의사와 관계 없이 학습당하고 있기 때문에…
아예 거스를 수 없는 것이기 때문에, 타 분야에서는 오히려 공격적으로 자기 분야에 특화된 모델을 만들고, 기존 저작물들을 학습으로 부터 보호해서 우선권을 선점 하는게 그나마 좀 더 낫지 않을까?
근데 후자는… 테크기업이 양아치라서 잘 안될거같다.
Next.js 서버 액션은 서버 데이터를 가져오는 용도로 사용하기에 적합하지 않다. React 공식문서에서는 다음과 같이 말하고 있다.
Server Functions are designed for mutations that update server-side state; they are not recommended for data fetching. Accordingly, frameworks implementing Server Functions typically process one action at a time and do not have a way to cache the return value.
서버 액션이 여러 호출되면 바로 실행되는 대신 큐에 쌓이고 순차적으로 처리된다. 이미 실행된 서버 액션은 이후 취소할 수 없다.
이에 서버 액션을 데이터 가져오기로 활용하면 끔찍해지는 UX가 생길 수 있는데, 예를 들어 페이지의 목록 검색 화면에서 검색 후 데이터를 가져오는 상황에 않았다고 다른 화면으로 네비게이션이 불가능한 것은 일반적인 경험이 아니다.
이러면 RSC를 통해 무한 스크롤을 구현하지 못하는가? 에 대해서 의문이 생길 수 있는데 여기에 대해서 대안을 발견했다.
function ServerComponent({ searchParams }) {
const page = parseInt((await searchParams).page ?? "1", 10)
const items = await getItems(page)
return (
<Collection id={page}>
{items.map(item => <InfiniteListItem key={item.id} {...items} />)}
</Collection>
)
}
"use client"
function Collection({ id, children }) {
const [collection, setCollection] = useState(new Map([[id, children]]))
const [lastId, setLastId] = useState(id)
if (id !== lastId) {
setCollection(oldCollection => {
const newCollection = new Map(oldCollection)
newCollection.set(id, children)
return newCollection
})
setLastId(id)
}
return Array
.from(collection.entries())
.map(
([id, children]) => <Fragment key={id}>{children}</Fragment>
)
}
대충 이런 꼴이다. 이러고 page를 증가시키거나 감소시키는건 intesection observer나 특정 엘리먼트의 onClick 이벤트 따위를 의존하면 된다. 이러면 데이터 가져오기 패턴을 RSC 형태로 의존할 수 있다. InfiniteListItem
는 서버컴포넌트, 클라이언트컴포넌트 무엇으로 구현하더라도 상관없다. 가령 아래와 같은 식:
function ServerComponent({ searchParams }) {
const page = parseInt((await searchParams).page ?? "1", 10)
const { items, hasNext } = await getItems(page)
return (
<div>
<Collection id={page}>
{items.map(item => <InfiniteListItem key={item.id} {...items} />)}
</Collection>
{hasNext && (
<IntersectionObserver nextUrl={`/?page=${page + 1}`} />
)}
</div>
)
}
검색 조건이나 검색어에 따라 상태를 초기화시키려면 다음과 같이 표현하면 된다.
function ServerComponent({ searchParams }) {
const page = parseInt((await searchParams).page ?? "1", 10)
const query = parseInt((await searchParams).query ?? "")
const { items, hasNext } = await getItems(page, query)
return (
<div>
<Form action="/">
<input name="query" />
<button />
</Form>
<Collection id={page} key={query}>
{items.map(item => <InfiniteListItem key={item.id} {...items} />)}
</Collection>
{hasNext && (
<IntersectionObserver nextUrl={`/?page=${page + 1}&query=${query}`} />
)}
</div>
)
}
매우 PHP스럽고, 암묵적이기도 하다. 다만 RSC의 데이터 가져오기 패턴을 활용하면서 기존 컴포넌트를 최대한 재사용할 수 있게 된다는 점이 좋다.
실제로 방금 어떤 사례를 발견했냐면, 계산이 살짝 까다로운 값에 대한 테스트를 만들라고 시켰더니 코드를 한 백줄 뱉어내는데
expect(x).toBe(42)
이렇게 값에 대한 테스트를 안하고
expect(typeof x).toBe("number")
이러고 넘어가려고 했다. 손바닥 이리내.
실제로 방금 어떤 사례를 발견했냐면, 계산이 살짝 까다로운 값에 대한 테스트를 만들라고 시켰더니 코드를 한 백줄 뱉어내는데
expect(x).toBe(42)
이렇게 값에 대한 테스트를 안하고
expect(typeof x).toBe("number")
이러고 넘어가려고 했다. 손바닥 이리내.
@bglbgl gwyng 맞아요. 아마도 실세계에 이런 테스트 코드가 많기 때문에 더 그러는 게 아닐까 싶습니다… ㅋㅋㅋ
性能がいいマシンがメインのRTX積んでるやつしかないのでLLM動かすのはここじゃないと難しそう🤔
@cocoa甘瀬ここあ LLMはGPUの性能も重要ですが、VRAMの容量も多く必要なので、最近ではLLMの研究者の間でMac mini M4の統合RAM容量を最大にアップグレードしたモデルが最もコスパが良いと言われているようです。
안녕하세요, 숫자상입니다.
@numberer58숫자상 반갑습니다, 어서 오세요!
Hackers' Pub은 기본 Markdown 문법 외에 다양한 확장 문법을 지원합니다. TeX을 통한 수식, 각주, 경고 박스(admonitions), 표, Graphviz를 통한 도표, 코드 블록에서 특정 줄만 강조하기 등…
마땅한 기술 블로깅 플랫폼을 못 찾았다면, Hackers' Pub도 고려해 보세요!