Fedify를 활용하여 제가 만드는 텍스트 전용 블로깅 플랫폼인 타이포 블루에 연합우주 기능을 구현했습니다. 많은 관심 부탁드립니다!
bgl gwyng
@bgl@hackers.pub · 98 following · 123 followers
GitHub
- @bglgwyng
시간이 지날 수록 Cursor랑 대화할 때 사용하는 주어가 바뀌는게 재밌네.
- 초반에는 "나 지금 XX를 만들고 싶어" 와 같은 식으로, 내가 작업의 메인이니까 넌 검색해와 같은 느낌에 가까웠다.
- 조금 익숙해지니까 점점 "너가 XX를 만들어 와" 라고 일을 위임하는 어조로 바꼈다.
- 그러다가 오늘 코드를 지칭할 때 무의식적으로 "우리가 만든 코드"라는 표현을 사용했다. 개발 사이클을 여러 번 돌리다보니 공동 저작물이라는 인식이 나도 모르게 생겼나보다.
Hackers' Pub의 로고 디자인이 완료되었습니다! 디자인은 박은지 님(@murinono무리노노)께서 해주셨습니다.
연합우주라는 콘셉트에 맞게 고양이의 입 주변을 별 모양으로, 목 아래에도 고리(orbital ring) 모양으로 디자인했습니다. 고양이를 고른 이유는 소프트웨어 프로그래머 커뮤니티에서 다른 동물보다 유독 고양이가 사랑 받기 때문이기도 하고, 고양이가 호기심이 강하기 때문이기도 합니다.
로고 디자인은 CC-BY-SA 4.0 라이선스로 배포됩니다.
지난 한달간 열심히 개발한 실시간 퀴즈 사이트입니다. django, django drf, jwt 기반 인증, websocket, ticket으로 받아오는 jwt websocket 인증, celery, 등을 모두 사용한 예시이기도 합니다. 구경와주세요~
프로그램 명세서는 문서 그 자체로도 컴파일 되어야만 한다
JS 라이브러리를 만들때 개발시엔 invariant check를 위해 assert를 쓰되, 배포할땐 빼고싶거든요. 어떤 좋은 방법이 있을까요?
@bglbgl gwyng Vite 같은 경우에는 기본적으로 import.meta.env.DEV이 빌드 시에는 false로 치환되어서 minifier 돌리면 안쪽 코드가 통째로 날아가게 할 수 있습니다. 다른 번들러들에서도 비슷한 방법을 찾아볼 수 있을 것 같네요
API 기반 에이전트에서 요금제 기반 에이전트로 넘어와, 이제 마음껏 감사인사를 하는 풍부한 인간이 되었습니다.
미리미리 아부 떨어서 기계화 시대를 대비하자
이번 Ubucon Korea 2025에서 발표할 주제로, 식탁보의 리눅스 버전에 대한 이야기를 준비하면서 간단한 Demo를 WSL로 준비해보았습니다.
일상적으로 사용하는 리눅스 시스템에 보안 플러그인을 그대로 설치하는 것은 솔직히 많이 위험합니다. 하지만, LXD 덕분에 이런 위험을 최소화하면서도 편의성과 보안의 균형을 맞추고, 더 나아가서는 Windows에 종속된 인터넷 뱅킹과 전자 정부 대고객 서비스의 대체 가능성을 살펴볼 수 있는 좋은 기회가 될 수 있다고 생각합니다.
연말을 목표로 리눅스 버전의 식탁보 프리뷰를 선보이도록 노력해보겠습니다. :-D
https://drive.google.com/file/d/1xapy_k4ofzyaNFPAPTF1QUYvLrz6MN55/view?usp=drive_link
보정한 결과물입니다. 19년도에 아이폰 X로 기내에서 찍었던 것 같습니다.
저는 ActivityPub 인스턴스 운영을 쉽게 해주는 프레임워크 Fedify 의 CLI 툴에 Webfinger 를 손쉽게 조회할 수 있는 fedify webfinger 커멘드를 구현했어요! https://github.com/fedify-dev/fedify/pull/278
bgl gwyng shared the below article:
프론트엔드 애플리케이션 상태를 다루는 법
ㄹ @disjukr@hackers.pub
이 글은 리액티브 프로그래밍에서 시간의 흐름에 따른 의존 그래프 관리를 설명하며, 특히 프론트엔드 상태 관리에 있어 옵저버블보다 시그널이 더 적합한 이유를 제시합니다. 저자는 프론트엔드 상태가 시간에 따라 결정적으로 변하지 않고, 노드의 의존 관계가 렌더 트리에 따라 변화무쌍하게 바뀌기 때문이라고 주장합니다. Rx, Redux, XState와 같은 기존 상태 관리 방식의 한계를 지적하며, 시그널(+ DI와 수명관리)을 중심으로 옵저버블, 리듀서, 스테이트머신을 함께 사용하는 것이 각 기술의 장점을 극대화할 수 있다고 설명합니다. 애니메이션, 폼 관리, NPC 인공지능과 같이 특정 상황에 적합한 기술을 시그널로 묶어 전체 애플리케이션 상태를 선언적으로 관리하는 방법을 제안하며, 이를 통해 애플리케이션의 구조를 더욱 명확하고 효율적으로 만들 수 있다고 강조합니다.
Read more →안녕하세요! 현재 컴퓨터공학과 학부 2학년 재학중인 새내기입니다.
PLT, Lexer 등에 관심이 많습니다. Emulation, VM 기술 등도 관심이 많습니다. 아직 주 전공 분야를 정하진 못했지만 넓게 두루두루 좋아합니다.
올드 레트로 기술들 또한 좋아합니다.
Go와 .NET 언어 일부를 주력으로 삼고 있으며 F# 을 학습하려고 공부 중입니다.
현재는 취미와 흥미 위주의 프로젝트를 주로 진행 중입니다. 감사합니다!
아직 저만 팔로하신 분들을 위한 끌올!!!!
Hackers' Pub 400명 돌파!
거의 느낌이 더 좋다는 이유만으로 rootless컨테이너를 시도했고, 이후에는 갈아엎기 귀찮다는 이유로 계속 써왔다. uid를 외부랑 일치 시키면 이미지가 권한 관련 문제를 일으키기도 하고, 자동으로 이미지내 파일 소유를 바꿔주는 기능은 첫 실행 시 너무 느리기나 하고... 자동 재시작은 systemd랑 엮어서 쓸 수 있다고 알고 있기는 한데 어쨌든 별도의 시스템이라 아직도 안쓰고 있다. 아마 별 일 없으면 계속 이렇게 쓰겠지...?
SteamOS 의 일종인 Bazzite 설치.
- 내가 하는 대부분의 게임이 잘 된다.
- 리눅스 데스크탑이 윈도보다 반응성 빠르고 편의성도 좋다.
- 안 되는 게임 https://www.protondb.com/app/2507950 안 되는 것들은 멀티 게임들. 안티 치트 등, 드라이버를 통해 치팅 검사하는 프로그램이 들어가는 것들이 안되는 모양.
애초에 윈도 아닌 게임이 의외로 많이 나오고 있고(Crusader Kings 3, Factorio) 직장이 아니면 집에서 윈도 안 쓴지도 몇 년 되었고, Debian, Arch Linux, OS X 만 쓰고 있다.
bazzite 는 Fedora CoreOS 기반인 모양인데 알게 된지 며칠 안 되어서 패키지 관리가 어떻게 되는 것인지 잘 모르겠다. neovim 설치는 일단 brew 로 하면 되는 모양인데, 다른 소프트웨어들은 flatpak 으로 설치하고 있고...
1년 반 만에 글을 썼다. 웹이 복잡해진 과정을 간략히 되돌아보고, 웹을 지탱해온 하이퍼미디어라는 개념이 얼마나 강력한 힘을 가졌는지 짚어보았다. https://parksb.github.io/article/43.html
bgl gwyng shared the below article:
Upyo 0.2.0 Release Notes
洪 民憙 (Hong Minhee) @hongminhee@hackers.pub
Upyo 0.2.0 has been released, introducing new features to this cross-runtime email library that supports Node.js, Deno, Bun, and edge functions. The latest version expands its capabilities with Amazon SES transport support, enabling AWS Signature v4 authentication and session-based authentication. Additionally, comprehensive OpenTelemetry integration has been added, offering distributed tracing, metrics collection, and error classification without altering existing code. The OpenTelemetry transport automatically instruments email operations, tracking delivery rates and latency, and integrates with existing OpenTelemetry infrastructure. Community feedback is encouraged to further improve Upyo, whether through testing the new Amazon SES transport, implementing OpenTelemetry, or contributing to the GitHub repository. This release enhances Upyo's utility by providing more transport options and robust observability features, making it a valuable tool for developers needing reliable email sending across various environments.
Read more →그동안 짬짬히 테스트 기능을 만들고 있었는데 얼추 돌아간다
bgl gwyng shared the below article:
퍼즐: 1번 칸에 말 올려! 2번 칸에서 말 내려!
Bubbler @bubbler@hackers.pub
이 글은 1부터 20까지 번호가 매겨진 게임판에서 특정 규칙에 따라 말을 움직여 모든 칸에 말을 채우는 퍼즐 문제를 소개합니다. 핵심은 $k$번 칸에 말을 올리기 위해 필요한 최소 동작 횟수가 $2^{k-1}$임을 밝히는 것입니다. 이를 통해 20번 칸까지 말을 채우는 데 필요한 총 동작 횟수를 계산하는 방법을 설명합니다. 이 퍼즐은 BOJ 29225 문제에서 아이디어를 얻었으며, 문제 해결 과정에서 발견되는 패턴과 논리적 추론이 흥미로운 인사이트를 제공합니다.
Read more →
Ji-Haeng Huh replied to the below article:
하스켈 편지
박준규 @curry@hackers.pub
이메일 교환을 요약하면, 한국의 취미 프로그래머 박준규 님이 Haskell에 대한 관심을 표현하며 NRAO의 다니엘 님에게 연락을 시작합니다. 다니엘 님은 Haskell 경험과 NRAO에서의 Haskell 프로젝트(antioch)를 공유하며, 박준규 님의 Haskell 학습 경험과 프로젝트에 대한 질문을 던집니다. 박준규 님은 자신이 관리하는 Hackage 패키지와 Protohackers 문제 풀이 경험을 공유하고, 다니엘 님은 이에 대한 격려와 함께 Typeclassopedia와 free monad를 추천합니다. 이 대화는 Haskell에 대한 열정과 지식을 공유하며, 서로에게 영감을 주는 긍정적인 교류를 보여줍니다. 다니엘 님은 박준규 님에게 Haskell 관련 질문을 언제든지 환영하며, 이 대화를 자유롭게 공유해도 좋다고 허락합니다.
Read more →
@curry박준규 정말 귀한 글 올려주셔서 감사합니다.
저 역시 사람들에게 마지막 답장에 언급된 typeclassopedia를 가장 많이 추천합니다. 많은 분들이 하스켈 입문 후 당장의 코딩 경험을 쌓기보다 "모나드는 부리또다"로 대표되는 하스켈 튜토리얼류에 집착적으로 빠져들며 학습의 발란스를 깨는 경향이 보입니다. 무엇에 기인하는 현상인지 아직 확실히 파악은 못했지만 분명 안타까운 상황인 거 같아요.
물론 typeclassopedia도 튜토리얼 문서의 일종이지만 저자만의 특수한 깨달음 포인트가 아닌 정공법으로 설명해주다 보니, "저자의 창의적인 비유와 설명" -> "이제야 알 것 같은 독자" -> "그렇게 생긴 깨달음이 실제 코딩에 도움이 안됨" -> "새로운 문서를 찾아 헤맴" 의 끝없는 반복을 부숴줄 힘이 있는 것 같습니다.
쌀집 앞에 참새가 많아 공유합니다. 좋은 하루 되세요!
사실 애플리케이션 만드는 것보다 라이브러리 만드는 게 훨씬 재밌다. 왜 그런지는 잘 모르겠음… 아마도 UI 개발에 약해서?
그냥 엄청 재미없는 놀이공원에 왔다고 생각하니 예비군 훈련도 할만하다
Show GN: Upyo: 현대적인 JavaScript/TypeScript용 크로스 런타임 이메일 전송 라이브러리
------------------------------
안녕하세요. 개인적으로 이메일 발송 라이브러리를 만들어서 공유해봅니다.
## 왜 만들게 되었나요?
최근에 여러 프로젝트를 진행하면서 Node.js, Deno, Bun 등 다양한 런타임을 사용하게 되었는데, 이메일 발송 부분에서 매번 다른 라이브러리를 찾거나 설정을 다시 해야 하는 불편함이 있었습니다. 특히 D…
------------------------------
https://news.hada.io/topic?id=21971&utm_source=googlechat&utm_medium=bot&utm_campaign=1834
@tedpool테드풀
@kodingwarriorJaeyeol Lee
@gaebalgom개발곰
@nyeongAn Nyeong (安寧) @joonnotnotJoon
@crohasang크롸상
@z9mb1Jiwon @r4bb1t톡기
@2chanhaeng초무
@cosmic_elevatorSooji Choi @ooheunda @woaol
@meneleHanal Ae
@devomdv @eottabom
@hjleee93hyeonjeong lee 오늘 발대식에서 만나 뵈어서 반가웠습니다! 다시 한 번 앞으로 잘 부탁드립니다! 화이팅!
피드 내리다가 살짝 위로 스크롤하면 탑바(네비게이터)가 노출 되면 편할꺼 같다
bgl gwyng shared the below article:
AI도 무조건 틀리는 Javascript 퀴즈
중고 자몽차(따뜻함) @dvbeetle@hackers.pub
이 JavaScript 퀴즈는 `age` 객체와 `preferences` 객체를 사용하여 각 이름에 대한 나이를 출력하는 문제입니다. `forEach` 메서드를 통해 배열의 각 요소(이름)를 `printAge` 함수에 전달하고, 이 함수는 템플릿 리터럴을 사용하여 "name is age" 형태의 문자열을 콘솔에 출력합니다. Claude Opus, GPT 4.5, Gemini 2.5 Pro와 같은 고급 AI 모델들도 이 문제에서 오답을 냈다는 점이 흥미롭습니다. 이 코드를 통해 JavaScript의 객체 접근과 배열 메서드 사용법을 다시 한번 상기할 수 있습니다.
Read more →.NET으로 서버 만들 때는 이메일 보낼 때 FluentEmail이라는 패키지를 유용하게 썼는데, JavaScript 쪽에도 비슷한 게 있나 찾아봤지만 뭔가 다 조금씩 마음에 안 드네… 내가 원하는 건 다음과 같다:
- Mailgun, SendGrid, SMTP 등 다양한 이메일 전송 트랜스포트를 하나의 일관된 API로 사용할 수 있어야 한다.
- 멋대로 환경 변수에 의존하지 말아야 한다.
- Node.js는 물론 Deno에서도 동작해야 한다.
오히려 파일 첨부 같은 부가 기능은 없어도 되기 때문에 간단하게 필요한 라이브러리를 찾을 수 있을 거라고 생각했는데, 못 찾고 있다. 음… 바이브 코딩으로 하나 만들까?
결국 하나 만들었습니다. “우표”라는 이름으로…
GPT와 최근에 같이 작업한 주제에 대해서 아예 커스텀 GPT를 만들었다.
https://chatgpt.com/g/g-68706e91bb348191a0053c8a2399e63b-gugsan-amho-korea-cryptography
Diffsitter – A Tree-sitter based AST difftool to get meaningful semantic diffs
Link: https://github.com/afnanenayet/diffsitter
Discussion: https://news.ycombinator.com/item?id=44520438
js 커뮤니티는 환경변수 주입 정도는 컴파일타임 의존성 주입처럼 생각하긴 하는듯. 과거에 subpath import, export 없을 때 많이 쓰이던 방식이 고착화된게 아닌가 하는 뇌피셜이 있음..
이와 비슷하게 청개구리 스택 경로라는 것도 생각해 볼 수 있겠다. 예를 들어 Deno를 선택했으면 Fresh는 청개구리 스택 경로가 아니다. 그런데 Deno를 선택한 다음 Next.js를 선택하면 오히려 청개구리 스택 경로가 된다.
예전에 카페에서 코딩하는데 처음 보는 사람이 보더니 혹시 프로그래머냐고 자기 좀 도와달라길래 무슨 문제냐고 하니까 자바 환경설정 좀 도와달라길래 바로 GG치고 튐
bgl gwyng shared the below article:
펑터Functor
lionhairdino @lionhairdino@hackers.pub
하스켈 펑터 입문자를 위한 이 글은 `Maybe Int` 타입의 값에서 `Int`를 직접 "꺼내올 수 없다"는 개념을 설명합니다. `Maybe`의 `fmap`이나 `fromJust`가 마치 값을 꺼내는 것처럼 보이지만, 이는 실제로는 값을 꺼내는 것이 아니라, 원본 타입(`Int`)의 구조를 보존하며 새로운 `Maybe Int` 타입의 값을 "생성"하는 과정이라는 것입니다. 미끄럼틀 비유를 통해, `Maybe Int`의 `Just 1`은 `Int` 값 `1`과 연관되어 있지만, `Just 1` 자체가 `1`을 의미하는 것은 아닙니다. 펑터는 원본 타입의 관계(구조)를 그대로 유지하며 다른 타입으로 변환하는 역할을 합니다. `fmap`은 `Maybe Int` 안의 `Int`를 직접 조작하는 것이 아니라, 원본 `Int` 값의 관계를 바탕으로 새로운 `Maybe Int` 값을 만들어내는 것입니다. 상자 메타포가 유용할 때도 있지만, 펑터의 본질을 오해하게 만들 수 있습니다. 상자 안의 값을 꺼내는 것이 아니라, 값의 "성격"은 값을 다루는 함수들의 동작에 따라 결정된다는 점을 강조합니다. 이 글은 "없을 수도 있는 수를 꺼낸다"는 표현의 모순을 지적하며, 펑터의 개념을 더 깊이 이해하도록 돕습니다.
Read more →
bgl gwyng shared the below article:
힙스택 보존 법칙
RanolP @ranolp@hackers.pub
이 글에서는 프로젝트 진행 시 기술 스택 선정에 대한 경험적 법칙인 "힙스택 보존 법칙"을 소개하며, 힙한 기술 스택을 과도하게 선택할 경우 프로젝트가 산으로 갈 수 있음을 경고합니다. 저자는 신기술 도입 시 발생하는 호환성 문제와 그로 인한 추가 작업의 부담을 설명하며, 커뮤니티가 크고 성숙한 기술의 중요성을 강조합니다. 힙한 기술을 사용하더라도 프로젝트를 성공적으로 이끌 수 있는 두 가지 조건, 즉 기술의 안정성과 개발자의 숙련도를 제시하며, 힙스택을 사용하기 전에 충분한 학습과 경험을 통해 기술적 내성을 길러야 함을 역설합니다. 이 글은 기술 스택 선택의 중요성과 개발자의 역량 강화 필요성을 동시에 강조하며, 균형 잡힌 기술 스택 선택이 프로젝트 성공에 미치는 영향을 시사합니다.
Read more →Node.js 커뮤니티는 환경 변수를 너무 좋아하는 것 같다. 거의 라이브러리 API의 일부로 생각하는 듯?
Deno만 해도 환경 변수는 --allow-env 플래그를 통해 명시적으로 허용하지 않으면 접근 못하고, Haskell에서도 getEnv는 String이 아니라 IO String을 반환하게 되어 있다.
반면 Node.js에서는 process.env로 너무 쉽게 접근 가능해서 그런가, 환경 변수 접근이 입출력이라는 생각을 아예 안 하는 모양이다.
오늘 오전에 저와 같은 하늘을 보신 분이 계실지.. 더위 조심하시고, 맛점하시길 바랍니다 ☺️
아마 다들 비슷한 경험이 있으실겁니다. 태어나서 처음으로 쌍방향 연결에 성공해서 두 클라이언트가 대화할 수 있게 했을때의 기쁨... 저는 딱 15년만에 하는거라(...) 처음 해본것처럼 기쁘네요
역시 프로젝트를 빨리 이해하려면 직접 써보는게 가장 확실한거 같다
JS Error 클래스에
class Error {
...
throw() {
throw this
}
}
이런 메소드 있으면 편할 것 같은데 왜 없지? 예를 들면:
# 현재
const user = findUser();
if (!user) {
throw new Error("Not found user");
}
# `throw` 메소드
const user = findUser() ?? new Error("Not found user").throw();
이렇게 쓸 수도 있고
이름 별로면 raise 써도 되고
TC39 에 한번 제안해볼까...
오픈소스 레포에 Windsurf Agent로 짠 Swift 코드로된 PR을 날렸는데, 저자의 코드 리뷰를 복붙해서 그걸 그대로 다시 Windsurf Agent한테 전달하고 있다. 이게 머하는 짓이고...
macOS에서는 Xcode에서 git을 함께 주지만 brew install git으로 별도로 설치해서 사용해야 한다. 왜냐하면 Git 취약점 최신 패치버전은 2.50.1인데 Xcode git 버전은 2.39.5 버전이다 😱 (다른 패치버전들도 있는데 2.43 및 이후 버전들만 관리 중인가 보다[1])
https://github.blog/open-source/git/git-security-vulnerabilities-announced-6/
![에이전트가 실행중인 터미널 화면. 이하는 터미널의 내용
[에이전트]
save_emacs_buffers_in_repo() 함수:
- emacsclient로 실행 중인 Emacs와 통신
- 해당 리포지토리 경로에 속한 버퍼만 필터링 (string-prefix-p)
- 수정된 버퍼만 저장 (buffer-modified-p)
- 저장된 버퍼 개수를 메시지로 표시
- emacsclient가 없거나 통신 실패 시 경고만 출력하고 계속 진행
이제 스크립트 실행 시 해당 리포지토리의 모든 수정된 Emacs 버퍼가 자동으로 저장됩니다.
[사용자]
> 좋아 네가 최고야
[에이전트]
⏺ 감사합니다! 스크립트가 이제 안전하고 똑똑하게 작동할 것 같네요. 혹시 테스트해보시고 문제가 있으면 언제든 알려주세요.](https://media.hackers.pub/note-media/afaa2a81-a922-4d9b-913f-3a36f07d52ba.webp)








