그거 아십니까? XCode 업데이트는 거부할수 없고, 수락하면 보통 기존의 React Native 빌드가 터진다는 사실을... 해괴한 cpp 에러 메시지와 함께요
bgl gwyng
@bgl@hackers.pub · 99 following · 124 followers
GitHub
- @bglgwyng
않이 nix 재설치할라카니까 디스크 작업 중 맥북이 무지개 바람개비를 건너버렸는데...
@nyeongAn Nyeong (安寧) nix-darwin 유저셨군요. 지뢰제거반의 노고에 감사드립니다.
난 요거 반대의 도구를 찾고 있는데, remote로 electron이나 tauri등을 띄운다음에 웹뷰를 브라우저로 볼수있게하는 것이다. 안그래도 지금 GitButler 깔았는데 remote 사용을 지원안해서 난감해졌다.
@bglbgl gwyng X11 Server의 선견지명! 💨
많은 부분 Hackers' Pub에서 이미 사용하고 있는 패턴들. 그리고 기본 키를 uuid로 했을 때 지역성(locality)가 떨어져서 성능상 손해를 보는 문제는 UUIDv7을 쓰면 해결된다.
난 요거 반대의 도구를 찾고 있는데, remote로 electron이나 tauri등을 띄운다음에 웹뷰를 브라우저로 볼수있게하는 것이다. 안그래도 지금 GitButler 깔았는데 remote 사용을 지원안해서 난감해졌다.
...는 https://github.com/tauri-apps/tauri/discussions/6357 이런 시도가 있네요
난 요거 반대의 도구를 찾고 있는데, remote로 electron이나 tauri등을 띄운다음에 웹뷰를 브라우저로 볼수있게하는 것이다. 안그래도 지금 GitButler 깔았는데 remote 사용을 지원안해서 난감해졌다.
@kodingwarriorJaeyeol Lee 홧김에 Git Butler 설치했습니다. 같이 선발대 가시죠.
@bglbgl gwyng 깃버틀러는 변경사항을 가상의 브랜치로 나눠서 상하차하고 머지하려는 브랜치에 PR 날리는 워크플로우에요. 이미 머지가 되어있는 브랜치에서 다른 브랜치로 톡톡 떼고, 뭐뭐 머지 안했는지 체크리스트만드는게 제가 궁극적으로 원하는건데... 해결하려는 문제가 달랐어요. 이거만 해결되면 충성충성하고 쓸 것 같네요..
@kodingwarriorJaeyeol Lee 홧김에 Git Butler 설치했습니다. 같이 선발대 가시죠.
bgl gwyng shared the below article:
hoonie-blog v1.1.1 등장!
카미유 @renegade_v00@hackers.pub
개선된 기술 블로그 1.1.1 버전이 공개되었습니다. 이번 업데이트에서는 사용자 경험을 향상시키기 위한 다양한 개선 사항들이 적용되었습니다. 특히, 사이트 성능 최적화를 통해 로딩 속도를 개선하고, 반응형 디자인을 강화하여 다양한 기기에서 일관된 사용자 인터페이스를 제공합니다. 또한, 새로운 기능들을 추가하여 블로그 탐색 및 콘텐츠 접근성을 높였습니다. 이번 업데이트는 마치 게임 패치노트처럼 작성되어, 개발 과정과 변경 사항을 더욱 재미있게 확인할 수 있습니다. 블로그를 방문하여 새로운 기능들을 직접 경험하고, 개선된 사용성을 느껴보세요.
Read more →Vim/Neovim의 시대가 가고, Vibe Coding 내지는 LLM 에이전트의 도움을 얻는 시대가 왔다지만, 난 아직까지는 전적으로 동의하지는 않음(부분적으로는 동의한다는 의미) 아직까지는 수제로 직접 코드를 짜는 것도 의미가 있고, CLI 기반의 에디터도 저마다의 발전을 하고 있다고 자신있게 말할 수 있음.
내가 생각하는 요오즘 시대 개발의 장점도 언급하면서 CLI 기반의 에디터는 어떤 위치에 있는지도 얘기해보고자 한다.
-
신뢰구간이 넓지 않아도 되는 작업을 할때는 AI를 사용하는 코드가 분명 시간을 확 줄여주고 결과적으로 생산성을 향상시키는 경향은 있지만, "정확함"을 위해서 프롬프트를 넣어야 하는데 그 프롬프트를 넣는 작업이 품이 많이 들때(넣어야 하는 맥락이 너무 많을때) 그렇게 정확하지는 않을뿐더러 맥락을 넣는 시간 때문에 차라리 내가 직접 짜는게 나을때가 많음. 수제로 직접 짜기 vs AI한테 전적으로 맡겨버리기 두 세계를 적절하게 오가면서 작업하는게 베스트이지 않나 싶음.
-
GUI 에디터 특유의 장점도 분명 있긴 있다. GUI 에디터가 올인원 기능을 갖추고 있는 경우도 많고 편의성 면에서 미니멀리즘을 추구하는 CLI 기반의 에디터보다 가진 기능이 많다. 남이 차려준 밥상이 그렇게 달달하지 않을 수 없다. 하지만, 그런 기능들을 제공하는 플러그인이나 자체 기능들의 내부 구현을 막상 까보면 CLI 도구에 의존하는 기능들이 많다. 특히, LSP/린터/포매터가 그렇다. 다만 추상화레이어를 어떻게 감쌌느냐 정도의 차이가 있는데, 그 추상화레이어를 커스터마이징하는데 있어서의 진입장벽은 CLI 기반의 에디터가 상대적으로 낮은 편이다. 왜냐면, 인고의 시간을 거쳐서 해온게 딱 그거라서(.....)
-
바이브 코딩은 분명 압도적인 속도로 코드가 짜여질 수 있게 하고, 단위시간당 코드가 짜여지는 양 자체도 어마어마하다. 특히, scaffolding을 할때 더더욱 빛을 발휘한다. 그렇기 때문에, 코드를 짜는건 기계/인공지능에 위임하고, 자세한 디테일을 채우는건 유저리서치를 하거나 와이어프레임을 그려서 기획을 더 보강하는 등 중요한 영역에 집중할 수 있게 된다. 코드를 짜는데 드는 시간은 최소한으로, 중요한 영역에 집중하기 위해 생각하는 시간을 더 많이 가지는 것은 분명 좋은 일이다. 관련해서는 이 글도 읽어보면 좋을 것 같다. https://two-wrongs.com/typing-fast-is-about-latency-not-throughput
물론, 코드를 짜는데 있어서 중요한 것은 리터러시이다. LLM이 코드베이스의 이해를 빠르게 할 수 있도록 도와주긴 하지만, 위에서 언급했듯 어느 정도 시점이 되면 결국엔 직접 짜고 직접 수정하는 일도 있어야 한다. 로컬 LLM이 발전한다 하더라도, LLM을 사용할 여력이 되지 않는 환경에서도 동일한 생산성을 유지할 수 있을까? 생산성이 일관적이지 않다면, 그렇지 않은 환경에 노출이 되었을때 어떻게 대응할 수 있을지가 중요한 포인트일 수 있다고 생각한다. 인자강, 즉, 사람 자체가 강해질 필요가 있다고 생각한다.
인공지능에 전적으로 의존하지 않고 수제로 직접 코드를 짜는 사람들이 기계/인공지능에 저항해서 어떻게 살아남을까를 생각해보면 인간공학에 기반해서 편집하는 테크닉이 더 연구될 필요가 있다.
GUI 기반의 에디터가 날이 갈수록 좋아지고 있는 상황 속에서 CLI 기반의 에디터가 살아남으려면 더더욱 CLI 기반의 도구와 궁합이 좋은 것을 내세워서 차별점을 내세울 필요가 있다. Neovim은 그런 관점에서 IDE와 유사한 경험을 제공하는 쪽으로 잘 발전되어 왔다고 보고 있다.
Vim/Neovim 생태계는 아직까지는 미래가 낙관적이라고 본다.
@kodingwarriorJaeyeol Lee 저는 VS Code를 오래 써서, Cursor든 Windsurf든 VS Code 포크들은 아무 비용없이 갈아탈수 있었는데요. 사실 저런 툴들의 진짜 강점은 API 요금제인거 같습니다. Claude Code 붙여서 종량제로 쓰면 그게 제일 퍼포먼스 좋겠지만 돈이 계속 나간다는게 상당한 압박인데, Windsurf 한달에 15달러 내면 그냥 채팅용으로도 쓸수있고, 개발자 입장에서 단 한개의 AI 구독이 되는게 가능해요. 그러니까 에디터 자체는 별로 안중요하고 그 뒤에 묶여있는 AI 상품이 매력적인 거죠.
Aider같은 걸로 비슷한 요금제를 구현하는게 가능할지 모르겠네요. 또는 로컬 LLM 성능이 궤도에 오르면 그때 또 많이 달라질거라 봅니다.
@bglbgl gwyng 그래도 GHC가 뱉는 JavaScript는 런타임이 무겁지 않나요?
@hongminhee洪 民憙 (Hong Minhee) 아, 성능 부분이라면 잘 모르겠네요. v8등이 JIT 잘 할수있게 뱉을 수가 있는지...
@bglbgl gwyng 그래도 GHC가 뱉는 JavaScript는 런타임이 무겁지 않나요?
@hongminhee洪 民憙 (Hong Minhee) 1년전쯤에 hello world 10Mb인가 나와서 포기했는데 최근에 몇십키로바이트 수준까지 줄였을거에요. 10Mb 나오던 시절은 버그에 가까웠고 개선의 여지가 많은거 같아요.
프로그래밍 언어 하스켈은 1990년 4월 1일에 처음 나와 올해 35주년이 되었습니다. 오늘이 하스켈 생일이에요. 이거 만우절 농담 아니고 진짜예요.
하스켈 학교에 다니고 나를 찾는 사람 사라졌다
RE: https://hackers.pub/@curry/0195ec78-1026-7277-a2f0-c783c70cb1b9
사실 그냥 누가 PureScript나 좀 살려냈으면 좋겠다.
@hongminhee洪 民憙 (Hong Minhee) 그새 GHC의 JS 백엔드가 쓸만해져서, PureScript 위치가 애매해진거 같아요
요즘 주의 깊게 보고 있는 두 언어:
-
Gleam: Erlang의 OTP 런타임에서 돌아간다는 점에서 Elixir와 비슷한데, 처음부터 정적 타입 언어로 설계되었다. 아, JavaScript 타깃도 지원한다. Haskell의 타입클래스(typeclass)나 Rust의 트레이트(trait)에 해당하는 기능이 없다는 게 개인적으로는 조금 아쉬운 점.
-
MoonBit: 중국 쪽에서 주도해서 만들고 있는 WebAssembly 타깃 언어로, 이지 모드 Rust에 가까워 보인다. 다만 개발 과정이 완전히 오픈 소스는 아니고, (오픈 소스 라이선스이긴 하지만) 소스만 공개하는 형태라 거버넌스 측면에서 아쉬움이 있다.
많은 분들이 인용 방법을 혼란스러워 하셔서, 인용 버튼을 추가했습니다. 게시글이나 단문 아래의 아이콘들 중에 왼쪽에서 세 번째 아이콘을 누르시면 해당 콘텐츠를 인용한 글들이 나열되고, 그 위에 인용 글 입력란이 뜨게 됩니다. 거기서 인용 글을 쓸 수 있습니다. 아, 종래의 인용 UI도 그대로 사용하실 수 있습니다.
참고로 인용 아이콘은 @xtjuxtapose 님께서 수고해 주셨습니다. 감사합니다.
RE: https://hackers.pub/@xt/0195eb06-9f50-763d-85c8-5600ec78c539
vim.kr 디스코드에도 물어보긴 했는데, 해커스펍에도 공개적으로 물어봅니다.
Git 관련 유틸리티 중에 이런거 없을까요?
개발된 기능들은 어지간하면 싹 다 Staging 브랜치에 합쳐서 개발망에 배포중인데, 개발망에 배포된 기능/버그픽스 중에 몇개 컨펌된 것만 프로덕션에 배포하고 싶어요. 커밋을 가능하면 잘게 쪼개서 하는 편이긴 한데, 컨펌된 것만 한땀한땀 골라서 체리픽하다보니까 관리하는게 여간 귀찮은게 아니네요. 오죽하면 스프레드시트로 관리할 정도입니다 -_-;;;
커밋 중 몇개는 서로 독립적이긴 한데, 몇개는 비엔나소세지마냥 줄줄이 의존성이 엮여있어요. 줄줄이 의존성이 엮여있긴해도, 가만히 보면 A기능 / B기능 잘개 쪼개져있긴 해서, 그걸 좀 더 보기좋게 시각화하고 싶어요. staging 브랜치에 PR 머지할때도 일부러 Squash and merge로 머지합니다.
한줄 요약
- 의도적으로 커밋 간의 연결관계를 디펜던시 그래프 형태로 가시화할 수 있는 Git 유틸리티 추천받습니다.
@kodingwarriorJaeyeol Lee 서로 독립적이지 않은 커밋들을 체리피킹해야 하는 상황자체가 어려운거 같네요. 그런 상황에 처하는걸 피해야한다는 속편한 이야기는 아닙니다. 단지 좋은 해결책이 마련되어 있을지에 대해 좀 의문이에요.
vim.kr 디스코드에도 물어보긴 했는데, 해커스펍에도 공개적으로 물어봅니다.
Git 관련 유틸리티 중에 이런거 없을까요?
개발된 기능들은 어지간하면 싹 다 Staging 브랜치에 합쳐서 개발망에 배포중인데, 개발망에 배포된 기능/버그픽스 중에 몇개 컨펌된 것만 프로덕션에 배포하고 싶어요. 커밋을 가능하면 잘게 쪼개서 하는 편이긴 한데, 컨펌된 것만 한땀한땀 골라서 체리픽하다보니까 관리하는게 여간 귀찮은게 아니네요. 오죽하면 스프레드시트로 관리할 정도입니다 -_-;;;
커밋 중 몇개는 서로 독립적이긴 한데, 몇개는 비엔나소세지마냥 줄줄이 의존성이 엮여있어요. 줄줄이 의존성이 엮여있긴해도, 가만히 보면 A기능 / B기능 잘개 쪼개져있긴 해서, 그걸 좀 더 보기좋게 시각화하고 싶어요. staging 브랜치에 PR 머지할때도 일부러 Squash and merge로 머지합니다.
한줄 요약
- 의도적으로 커밋 간의 연결관계를 디펜던시 그래프 형태로 가시화할 수 있는 Git 유틸리티 추천받습니다.
@kodingwarriorJaeyeol Lee 시각화 도구는 아니지만, 그리고 제가 써 본 건 아니지만 GitButler가 그런 종류의 작업을 편하게 해주는 도구라고 듣긴 했던 것 같아요.
Hello
@MastodonEngineering,
I wanted to share some feedback on the documentation provided in the Highlighting Journalism on Mastodon blog post.
Specifically, in The technical section, the example code for the fediverse:creator meta tag is given as:
<meta name="fediverse:creator" content="@Gargron@mastodon.social" />
Based on my testing (and that of others), Mastodon doesn't seem to recognize the creator link correctly when the leading @ is present in the content attribute. It only works when the @ is removed, like this:
<meta name="fediverse:creator" content="Gargron@mastodon.social" />
Following the blog's example directly led to some wasted time figuring out why it wasn't working. It would be great if either the example in the blog post could be corrected to reflect the current requirement, or if Mastodon's parser could be made more flexible to accept the handle with or without the leading @.
Appreciate all you do for #Mastodon!
올해도 벌써 25%나 지나갔다는 사실이 믿기지 않네요. 그래도 한 건 많겠지 싶어서 1분기에 했던 일들을 회고로 정리해 봤습니다.
Polymarket 등의 예측 시장에는 오라클 문제가 있다. 블록체인으로 만들어봤자, 어차피 베팅의 승패를 결정하려면 외부에서 딸깍 해줘야한다. 가령 4월 내에 탄핵이 이뤄질거냐 마냐 같은 게임을 상상하면 된다. 그 딸각하는 사람을 어떻게 믿을수 있냐는 문제가 오라클 문제다.
오라클 문제가 없는 예측 시장이 하나 생각났는데, 바로 수학 문제가 언제 풀릴 것이냐에 대한 것이다. 가령 리만 가설이 앞으로 1,000,000 블록 내에 풀릴지, 또는 P=NP랑 둘 중에 뭐가 먼저 풀릴지 등에 대한 것이다. 여기서 풀리는건 Lean 등으로 작성된 Formal Proof을 통해서 온체인으로 판단한다.
수학자들은 자신이 베팅을 걸어놓고 연구를 열심히해서 돈을 벌 수도 있다. 또 직접 연구를 하지 않더라도 GPU를 사서 자신의 베팅에 유리하도록 연구에 도움을 줄 수 있다. 앞서 그냥 유명하단 이유로 너무 거창한 문제를 예시로 들었는데, 그보다는 더 작고 쉬운 많은 문제들에 대해 이런 식의 경제가 돌아가는걸 상상해보자. 연구에 들어가는 자원 배분이 최적화되지 않을까?
@bglbgl gwyng 개인적으로는 오라클이 필수적인 애플리케이션은 처음부터 블록체인으로 만들면 안 된다고 생각합니다. 😂 관련된 주제로 〈탈중앙 게임, 그리고 블록체인과 NFT〉라는 글을 예전에 쓴 바 있습니다.
@bglbgl gwyng 개인적으로는 오라클이 필수적인 애플리케이션은 처음부터 블록체인으로 만들면 안 된다고 생각합니다. 😂 관련된 주제로 〈탈중앙 게임, 그리고 블록체인과 NFT〉라는 글을 예전에 쓴 바 있습니다.
@hongminhee洪 民憙 (Hong Minhee) 아 좋은 글이지요. 사실 예에전에 이미 읽었습니다ㅋㅋ
어떤. 일을 '실제로 하는 것'과 '하는 것 같은 느낌을 받는 것'을 헛갈리면 큰일난다.
그렇군요
Polymarket 등의 예측 시장에는 오라클 문제가 있다. 블록체인으로 만들어봤자, 어차피 베팅의 승패를 결정하려면 외부에서 딸깍 해줘야한다. 가령 4월 내에 탄핵이 이뤄질거냐 마냐 같은 게임을 상상하면 된다. 그 딸각하는 사람을 어떻게 믿을수 있냐는 문제가 오라클 문제다.
오라클 문제가 없는 예측 시장이 하나 생각났는데, 바로 수학 문제가 언제 풀릴 것이냐에 대한 것이다. 가령 리만 가설이 앞으로 1,000,000 블록 내에 풀릴지, 또는 P=NP랑 둘 중에 뭐가 먼저 풀릴지 등에 대한 것이다. 여기서 풀리는건 Lean 등으로 작성된 Formal Proof을 통해서 온체인으로 판단한다.
수학자들은 자신이 베팅을 걸어놓고 연구를 열심히해서 돈을 벌 수도 있다. 또 직접 연구를 하지 않더라도 GPU를 사서 자신의 베팅에 유리하도록 연구에 도움을 줄 수 있다. 앞서 그냥 유명하단 이유로 너무 거창한 문제를 예시로 들었는데, 그보다는 더 작고 쉬운 많은 문제들에 대해 이런 식의 경제가 돌아가는걸 상상해보자. 연구에 들어가는 자원 배분이 최적화되지 않을까?
@bglbgl gwyng 해커스펍에서 인용하고 싶은 글의 링크를 글 작성란에 붙여 넣기 하면 인용을 인식해서 인용 여부를 물어봅니다.
@curry박준규 글의 링크를 쉽게 알 방법이 있나요? 들어가서 url 복사하는 방법 뿐인가요?
인용RT 어떻게 하는걸까요? 저만 모르거나, 그게 아니라면 하는 방법을 좀더 알기쉽게 하면 좋을거 같습니다
별 것 아니지만, Markdown 문법 가이드를 추가했습니다. Markdown을 모르는 분들은 거의 없겠지만, Hackers' Pub은 Markdown 확장 문법을 꽤 많이 지원하기 때문에, 이를 문서화할 필요가 있었습니다.
단문 작성 화면에서 “이미지 업로드” 버튼 왼쪽의 “Markdown 사용 가능” 링크를 누르시면 언제든지 Markdown 문법 가이드를 보실 수 있습니다.
@bglbgl gwyng
@disjukrㄹ CSS에서 그렇게 뭔가 연산을 해서 스타일을 적용하는 로직은 없을 걸요? 여기서는 .box2가 .box1보다 나중에 선언됐기 때문에 d1과 d2 모두 .box2가 적용됩니다.
React Native에선 설계를 보고 라이브러리를 고를 수가 없다. 뭔가 돌아가긴하는게 있다면 그걸 써야한다. react-navigation의 디자인을 도저히 이해못하겠는데 다른 선택지가 없는게 예시다.
엘리먼트의 클래스 목록에서 순서는 의미가 없고 집합처럼만 작동하기 때문에 (선언 순서가 영향을 주는건 css rule만 해당) d1과 똑같이 적용될 것 같아요.
@disjukrㄹ 그러니까 (width >= 300px) ⊂ (width >= 200px)이라서 300px로 적용된다는 말씀이죠?
@kodingwarrior 많이들 쓰는 firebase 등과 비교해서 어떤 특장점이 있나요? 사실 운영을 본격적으로 안해봐서 잘 모릅니다.
@bglbgl gwyng 파이어베이스랑은 결이 좀 다른 것 같구요. 그나마 비교를 할만하다면, 구글 애널리틱스랑 그나마 비교가 가능할 것 같은데, posthog는 퍼널 분석은 깔고 가는거고 메트릭별로 쿼리를 날려보고 그걸로 차트도 뽑아볼 수 있어욥.
개인프로젝트 어딘가에 https://posthog.com/ 붙이고 싶은데 뭔가 서빙하고 있는게 하나도 없음....... 플러터앱 출시하면 좀 넣어볼까
@kodingwarrior 많이들 쓰는 firebase 등과 비교해서 어떤 특장점이 있나요? 사실 운영을 본격적으로 안해봐서 잘 모릅니다.
드디어 단문 입력란에 “이미지 업로드” 버튼이 생겼습니다. 기존에도 이미지 업로드는 가능했지만 드래그 앤 드롭을 하거나 클립보드에서 붙여넣기를 해야 했기 때문에, 특히 모바일 같은 환경에서는 불편함이 있었습니다. 이제는 버튼을 누르면 이미지 파일을 선택하는 창이 뜨게 됩니다.
참고로 이 기능은 100% Claude Code로 구현되었습니다. 커밋까지도요. 제가 한 일은 다음 프롬프트를 적은 것 뿐입니다:
현재는
Composer컴포넌트에 이미지 업로드 기능이 있긴 하지만 1) 드래그 앤 드롭을 하거나 2) 클립보드에서 붙여넣기를 해야 합니다. 그래서 이미지 업로드 기능이 있다는 걸 인지조차 못하는 경우도 있습니다. 이를 개선하기 위해, 명시적인 이미지 업로드 버튼을 추가하려고 합니다. 기존의 이미지 업로드 기능을 망가뜨리지 않으면서 동작하는 이미지 업로드 버튼을 구현해 주실 수 있을까요? 참고로 UI 프레임워크는 Preact를 쓰고 있습니다. 코드 내 주석은 영어로 작성해 주세요.
구체적인 변경 사항이 궁금하신 분은 dfa9091ed32536fe8e8c22d57b56b3dd191290ec 커밋을 확인해 보세요.
https://ramen.tools/wiki/korean-fediverse-instance-list
한국 연합우주 인스턴스 목록을 만들고 있어요!
여러분이 와서 추가할 수도 있고
다양한 의견 환영해요!
bgl gwyng shared the below article:
연합우주(fediverse)와 ActivityPub 프로토콜 이해하기: 개발자를 위한 가이드
洪 民憙 (Hong Minhee) @hongminhee@hackers.pub
연합우주란 무엇일까?
X(구 Twitter)나 Instagram 같은 중앙화된 소셜 미디어에 지치셨나요? 데이터 프라이버시, 알고리즘 추천, 그리고 끊임없는 광고가 걱정되시나요? 여기 대안이 있습니다. 바로 연합우주(fediverse)입니다.
페디버스(fediverse)는 “federated”(연합된)와 “universe”(우주)를 합친 말로, 한국어권에서는 주로 “연합우주”라고 불립니다. 연합우주는 하나의 거대한 플랫폼이 아닌, 서로 대화할 수 있는 독립적인 서버(인스턴스)들의 네트워크입니다.
이게 어떻게 가능할까요? 바로 ActivityPub이라는 프로토콜 덕분입니다. 이 프로토콜은 서로 다른 소셜 미디어 플랫폼이 정보를 교환할 수 있게 해주는 공통 언어 같은 것입니다.
연합우주는 어떻게 작동하나요?
연합우주를 이해하는 가장 쉬운 방법은 이메일 시스템과 비교하는 것입니다.
Gmail 사용자가 네이버 메일 사용자에게 이메일을 보낼 수 있는 것처럼, Mastodon 사용자는 Misskey나 PeerTube 사용자와 소통할 수 있습니다. (Mastodon, Misskey, PeerTube가 무엇인지는 아래에서 설명하겠습니다. Gmail과 네이버처럼 서로 다른 서비스라고 보시면 됩니다.) 이것이 가능한 이유는 이 서비스들이 모두 같은 언어인 ActivityPub 프로토콜로 대화하기 때문입니다.
연합우주에서 사용자 ID는 @사용자명@인스턴스.도메인 형식으로 되어 있습니다. 이메일 주소와 매우 비슷하죠? 예를 들면:
@honggildong@mastodon.social: mastodon.social 인스턴스 사용자@kimcheolsu@pixelfed.social: pixelfed.social 인스턴스 사용자@leeyeonghui@misskey.io: misskey.io 인스턴스 사용자
연합우주의 다양한 플랫폼 둘러보기
연합우주는 마치 여러 행성으로 이루어진 태양계 같습니다. 각 행성(플랫폼)은 고유한 특성을 가지고 있지만, 모두 같은 우주(연합우주)에 속해 있죠. 아래 표에서 주요 플랫폼들을 살펴봅시다:
| 플랫폼 | 설명 | 주요 인스턴스 | 특징 |
|---|---|---|---|
| Mastodon | X(구 Twitter)와 유사한 마이크로블로깅 플랫폼 | • mastodon.social (공식 인스턴스) • 우리.인생 (한국 중심) |
500자 제한의 짧은 게시물, 해시태그, 컨텐츠 경고 기능 |
| Misskey | 일본에서 개발된 고도로 커스터마이징 가능한 마이크로블로깅 플랫폼 | • misskey.io (가장 인기 있는 일본 인스턴스) • 스텔라 (한국 중심) |
리액션, 게임, 채팅 등 다양한 기능, 높은 커스터마이징 가능성 |
| Pixelfed | Instagram과 유사한 이미지 공유 플랫폼 | • pixelfed.social (공식 인스턴스) • 추억:사진 (한국 중심) |
스토리, 필터, 발견 기능 |
| PeerTube | YouTube와 유사한 비디오 호스팅 플랫폼 | • PeerTube.TV | P2P 기술로 비디오 스트리밍, 채널, 재생목록 |
| WriteFreely | 미니멀한 블로그 플랫폼 | • write.as | Markdown 지원, 심플한 디자인 |
| Lemmy | Reddit과 유사한 링크 애그리게이터 및 토론 플랫폼 | • lemmy.ml • YuruLemmy (한국 중심) |
커뮤니티(서브레딧과 유사), 투표, 토론 |
플랫폼 vs 인스턴스: 무슨 차이가 있을까?
연합우주를 이해할 때 흔히 혼동되는 개념이 있습니다. 바로 플랫폼(소프트웨어)과 인스턴스(서버)의 차이인데요.
플랫폼은 Mastodon, Misskey, Pixelfed와 같은 소프트웨어 자체를 의미합니다. 이들은 오픈 소스 소프트웨어로, 누구나 다운로드받아 설치할 수 있습니다.
인스턴스는 그 소프트웨어를 실행하는 개별 서버를 말합니다. mastodon.social과 우리.인생은 모두 Mastodon 플랫폼을 실행하는 별도의 인스턴스입니다.
Meta의 Threads 같은 일부 서비스는 플랫폼과 인스턴스가 동일합니다. 하지만 대부분의 연합우주 서비스는 여러 인스턴스로 구성되어 있습니다.
연합우주의 매력 포인트
연합우주가 갖는 몇 가지 매력적인 특징이 있습니다:
- 탈중앙화: 특정 기업이 모든 데이터와 규칙을 통제하지 않습니다. 각 인스턴스는 자체 규칙을 가질 수 있습니다.
- 데이터 주권: 자신의 데이터에 대한 더 많은 통제권을 가질 수 있습니다.
- 검열 저항성: 한 인스턴스가 차단되더라도 다른 인스턴스로 쉽게 이동할 수 있습니다.
- 커뮤니티 중심: 각 인스턴스는 특정 관심사나 지역 커뮤니티를 중심으로 형성됩니다.
- 다양성: 다양한 플랫폼과 인스턴스가 존재하여 선택의 폭이 넓습니다.
연합우주 시작하기
연합우주에 참여하는 것은 생각보다 쉽습니다:
- 자신의 관심사나 지역과 관련된 인스턴스를 선택합니다.
- 해당 인스턴스에 계정을 만듭니다.
- 다른 인스턴스의 사용자들을 팔로우하고 소통을 시작합니다!
한국 사용자라면 Mastodon 인스턴스인 우리.인생, Misskey 인스턴스인 스텔라 같은 한국어 중심 인스턴스를 추천합니다. 한국어 환경을 지원하고 한국 사용자들이 활발하게 활동하고 있어 시작하기 좋습니다.
아니면 이 글이 올라온 Hackers' Pub도 괜찮습니다. 소프트웨어 엔지니어들을 위한 소셜 미디어랍니다. 아직 개발중이라 공개적으로 가입을 받고 있지는 않습니다만, 홍민희에게 연락 주시면 계정을 생성해 드릴 수 있습니다.
ActivityPub: 연합우주의 심장
이제 개발자 관점에서 ActivityPub이 어떻게 작동하는지 자세히 살펴보겠습니다.
ActivityPub은 W3C에서 권장하는 표준 프로토콜로, 분산 소셜 네트워킹의 기반이 됩니다. ActivityStreams 2.0 데이터 형식을 기반으로 하며, 서로 다른 서버 간에 정보를 교환하는 방법을 정의합니다.
ActivityPub의 핵심 개념
ActivityPub은 몇 가지 핵심 개념으로 구성됩니다:
- 액터(actor): 사용자, 그룹 등 행동을 수행할 수 있는 주체입니다. 각 액터는 고유한 URL을 가지며, 수신함(inbox)과 발신함(outbox)을 가집니다.
- 액티비티(activity): 액터가 수행하는 행동으로, 게시물 작성, 댓글 좋아요, 다른 사용자 팔로우 등이 있습니다.
- 객체(object): 텍스트 게시물, 이미지, 비디오와 같이 생성되고 공유되는 콘텐츠입니다.
실제 작동 방식
홍길동(@honggildong@mastodon.social)이 게시물을 작성하고, 이영희(@leeyeonghui@misskey.io)가 이에 반응하는 과정을 살펴봅시다:
-
게시물 작성: 홍길동이 Mastodon에서 게시물을 작성합니다. Mastodon 서버는 이 게시물을 ActivityStreams 2.0 형식의
Create(Note)액티비티로 변환합니다. 이 액티비티는 홍길동의 팔로워(이영희 포함)에게 전달됩니다. -
게시물 수신: 이영희의 Misskey 서버는 이 액티비티를 받고 처리하여 이영희의 타임라인에 홍길동의 게시물을 표시합니다.
-
상호작용: 이영희가 게시물에 좋아요를 누르면, Misskey 서버는
Like(Note)액티비티를 생성하여 홍길동의 Mastodon 서버로 보냅니다. 홍길동은 이영희가 자신의 게시물을 좋아했다는 알림을 받게 됩니다.
마치 다른 언어를 사용하는 사람들이 통역사를 통해 대화하는 것과 비슷하죠? ActivityPub이 바로 그 통역사 역할을 합니다.
ActivityPub의 실제 메시지 들여다보기
개발자로서 실제 ActivityPub 메시지가 어떻게 생겼는지 궁금하실 텐데요. 몇 가지 예시를 살펴봅시다:
1. 사용자 프로필(액터) 정보
{
"@context": [
"https://www.w3.org/ns/activitystreams",
"https://w3id.org/security/v1"
],
"id": "https://mastodon.social/users/honggildong",
"type": "Person",
"preferredUsername": "honggildong",
"name": "홍길동",
"summary": "연합우주의 개척자",
"inbox": "https://mastodon.social/users/honggildong/inbox",
"outbox": "https://mastodon.social/users/honggildong/outbox",
"followers": "https://mastodon.social/users/honggildong/followers",
"following": "https://mastodon.social/users/honggildong/following",
"publicKey": {
"id": "https://mastodon.social/users/honggildong#main-key",
"owner": "https://mastodon.social/users/honggildong",
"publicKeyPem": "-----BEGIN PUBLIC KEY-----\n...\n-----END PUBLIC KEY-----"
},
"icon": {
"type": "Image",
"mediaType": "image/jpeg",
"url": "https://mastodon.social/system/accounts/avatars/000/000/001/original/avatar.jpg"
}
}
이 JSON 데이터는 홍길동의 프로필 정보를 담고 있습니다. 사용자 이름, 소개, 프로필 사진 URL, 그리고 중요한 inbox와 outbox URL이 포함되어 있죠.
2. 게시물 작성 액티비티
{
"@context": "https://www.w3.org/ns/activitystreams",
"id": "https://mastodon.social/users/honggildong/statuses/123456/activity",
"type": "Create",
"actor": "https://mastodon.social/users/honggildong",
"published": "2025-02-21T14:30:00Z",
"to": [
"https://www.w3.org/ns/activitystreams#Public"
],
"cc": [
"https://mastodon.social/users/honggildong/followers"
],
"object": {
"id": "https://mastodon.social/users/honggildong/statuses/123456",
"type": "Note",
"content": "<p>연합우주에 오신 것을 환영합니다! #fediverse #연합우주</p>",
"published": "2025-02-21T14:30:00Z",
"attributedTo": "https://mastodon.social/users/honggildong",
"to": [
"https://www.w3.org/ns/activitystreams#Public"
],
"cc": [
"https://mastodon.social/users/honggildong/followers"
],
"tag": [
{
"type": "Hashtag",
"href": "https://mastodon.social/tags/fediverse",
"name": "#fediverse"
},
{
"type": "Hashtag",
"href": "https://mastodon.social/tags/연합우주",
"name": "#연합우주"
}
]
}
}
이것은 홍길동이 게시물을 작성했을 때 생성되는 Create(Note) 액티비티입니다. 게시물 내용, 해시태그, 공개 범위 등이 포함되어 있습니다.
3. 팔로우 액티비티
{
"@context": "https://www.w3.org/ns/activitystreams",
"id": "https://misskey.io/users/leeyeonghui/follow/1234",
"type": "Follow",
"actor": "https://misskey.io/users/leeyeonghui",
"object": "https://mastodon.social/users/honggildong"
}
이영희가 홍길동을 팔로우할 때 생성되는 Follow 액티비티입니다. 단순하죠?
ActivityPub 서버 구현하기: 개발자를 위한 팁
직접 ActivityPub 서버를 구현하고 싶다면 다음 단계를 따라야 합니다:
- 액터 구현: 사용자 프로필 정보를 ActivityStreams 형식으로 제공합니다.
- 수신함과 발신함 설정: HTTP 엔드포인트를 만들어 액티비티를 받고 전송합니다.
- 서명 및 인증: HTTP Signatures를 사용하여 요청을 서명하고 검증합니다.
- 액티비티 처리: 다양한 액티비티 유형(
Create,Follow,Like등)을 처리하는 로직을 구현합니다. - 데이터 저장: 사용자, 게시물, 액티비티 등의 정보를 데이터베이스에 저장합니다.
- 연합 정책 구현: 어떤 인스턴스와 연합할지, 어떤 컨텐츠를 허용할지 등을 설정합니다.
개발을 시작하기 전에 Mastodon, Misskey 같은 기존 구현체의 코드를 살펴보는 것이 도움이 됩니다. 처음부터 모든 것을 구현하는 것보다 Fedify 같은 프레임워크를 활용하는 것도 좋은 방법입니다.
WebFinger: 사용자를 찾는 방법
연합우주에서 @leeyeonghui@misskey.io 같은 사용자 ID를 어떻게 실제 ActivityPub 액터 URL로 변환할까요? 그 비밀은 WebFinger 프로토콜에 있습니다:
GET https://misskey.io/.well-known/webfinger?resource=acct:leeyeonghui@misskey.io
이 요청을 보내면 서버는 다음과 같은 응답을 반환합니다:
{
"subject": "acct:leeyeonghui@misskey.io",
"links": [
{
"rel": "self",
"type": "application/activity+json",
"href": "https://misskey.io/users/leeyeonghui"
}
]
}
이제 https://misskey.io/users/leeyeonghui URL을 통해 사용자의 전체 프로필 정보를 얻을 수 있습니다. 마치 전화번호부에서 이름으로 전화번호를 찾는 것과 비슷하죠!
연합우주의 도전 과제와 미래
연합우주는 계속 성장하고 있지만, 몇 가지 도전 과제도 있습니다:
- 확장성: 수많은 서버 간의 통신을 효율적으로 처리하는 것은 쉽지 않습니다.
- 모더레이션: 각 인스턴스가 자체 규칙을 가지므로 콘텐츠 조정에 일관성이 부족할 수 있습니다.
- 발견성: 중앙화된 플랫폼에 비해 새로운 사용자나 콘텐츠를 찾기 어려울 수 있습니다.
- 사용자 경험: 일부 플랫폼은 아직 UI/UX 측면에서 개선이 필요합니다.
그러나 Threads와 같은 주요 서비스들이 ActivityPub을 채택하기 시작하면서, 연합우주의 미래는 밝아 보입니다. 개발자로서, 이런 성장하는 생태계에 참여할 수 있는 기회가 많이 있습니다.
마무리
연합우주와 ActivityPub은 중앙화된 소셜 미디어의 대안으로서 점점 더 주목받고 있습니다. 사용자에게 더 많은 통제권을 부여하고, 다양하고 풍부한 온라인 경험을 제공하는 연합우주의 세계는 계속해서 확장되고 있습니다.
개발자로서, 여러분은 이 새로운 탈중앙화된 웹의 생태계에 기여할 수 있습니다. 기존 애플리케이션에 ActivityPub 지원을 추가하거나, 완전히 새로운 서비스를 만들거나, 현재의 도전 과제를 해결하는 솔루션을 개발할 수 있습니다.
한국 개발자들의 참여가 늘어나면 한국 사용자들을 위한 더 다양하고 풍부한 서비스가 생길 것이고, 이는 더 건강하고 다양한 인터넷 문화를 만드는 데 기여할 것입니다.
그럼, 연합우주로의 여행을 시작해 보시는 건 어떨까요?
@hongminhee洪 民憙 (Hong Minhee) 꼭 외래어만 그런 건 아니지만 ㅐ와 ㅔ의 혼선이 제법 있는데, 이를테면 lag 랙("렉"으로 틀림) 같은 사례가 있습니다. 그 밖에는 daemon 다이먼(동계어인 demon에 이끌려 "데몬"이 널리 쓰이지만, 애초에 demon의 올바른 표기는 "디먼"임) 같은 게 생각나네요. 뭐 알아도 그렇게 안 쓰는 사람이 너무 많아서 대부분 틀린 표기로 쓰게 되지만...
@yurume유루메 Yurume
@hongminhee洪 民憙 (Hong Minhee) "lag"의 외래어 표기법에 따른 표기는 "랙"이 아니라 "래그"입니다. 유성음으로 끝나기 때문에 "ㅡ"를 붙입니다. "log"가 "록"이 아니라 "로그"인 것도 이것 때문입니다.
bgl gwyng shared the below article:
페디버스에서 어떤 사람들을 팔로하면 좋을까?
Jaeyeol Lee @kodingwarrior@hackers.pub
페디버스 입문이 막막한 개발자들을 위해, Hackers' Pub을 포함한 ActivityPub 기반 서비스 활용법을 소개합니다. 트위터와 달리 추천 기능이 부족한 페디버스에서, 어떤 인스턴스를 선택하고 누구를 팔로우해야 할지 어려움을 겪는 분들을 위해 유용한 정보들을 제공합니다. 먼저, 개발자들이 많이 모여있는 국내외 마스토돈 인스턴스들을 소개합니다. silicon.moe, hachyderm.io, emacs.ch 등 다양한 관심사에 맞는 인스턴스를 선택할 수 있습니다. 또한, Geeknews Bot, Hacker News, Lobsters 등 개발 관련 뉴스를 제공하는 계정들과, Mastodon, Golang, Asahi Linux 등 오픈소스 프로젝트에 기여하는 개발자들을 팔로우하여 유용한 정보를 얻을 수 있습니다. 이 글은 페디버스 생태계에서 개발자들이 양질의 정보를 얻고 소통할 수 있도록 돕는 것을 목표로 합니다. 페디버스 입문자들이 자신에게 맞는 인스턴스와 계정을 찾아 팔로우함으로써, 더욱 풍부하고 유익한 경험을 할 수 있도록 안내합니다.
Read more →Hackers' Pub 타임라인에 내부적인 개선이 있었습니다. 이제까지는 타임라인을 렌더링하기 위해 실시간으로 복잡한 조건의 SQL을 실행하는 방식이었지만, 이제는 글이 작성될 때 구독자의 수신함(inbox)에 글이 들어가는 방식으로 바뀌었습니다. 타임라인을 렌더링할 때는 각자의 수신함만 확인하면 되기 때문에 훨씬 조건이 간단해진 것입니다.
더불어, 같은 글을 여러 사람이 공유했을 때 타임라인이 같은 글로 도배되던 문제를 해결했습니다. 이제는 마지막에 공유한 사람의 글만 딱 하나 보이게 됩니다.
이번 변경에 관해 궁금하신 분은 f692909cdd5149c68ca5a91fb4e964042115ab83 커밋을 확인하시면 되겠습니다.
이 변경을 배포하다가 데이터베이스 스키마 마이그레이션이 PostgreSQL을 멈추게 하여 Hackers' Pub이 몇 분 동안 내려가는 일이 있었습니다. 마이그레이션 SQL이 너무 비효율적이라 그랬던 것인데요, Claude Code의 도움을 받아 하나의 비효율적인 SQL을 몇 개의 SQL로 나눠서 실행하게끔 고쳐서 해결했습니다. 이 역시 궁금하신 분은 33f2209f206bee84ddf5d1a7124527dade948610 커밋을 확인하시면 됩니다.
앞으로는 더 안정적인 서비스 운영을 위해 노력하겠습니다. 죄송하고 감사합니다.
bgl gwyng shared the below article:
Vim이랑 Neovim은 어떻게 다를까?
Jaeyeol Lee @kodingwarrior@hackers.pub
이 글은 Vim과 Neovim의 결정적인 차이점을 명확히 설명하며, 독자들의 궁금증을 해소하고자 합니다. Vim은 VimScript를 사용하는 반면, Neovim은 Lua를 사용하여 커스터마이징할 수 있다는 점을 강조합니다. Lua는 VimScript에 비해 가독성이 좋고, macOS 자동화 툴인 Hammerspoon이나 터미널 에뮬레이터 Wezterm과 같은 Unix CLI 프로그램 설정에 널리 사용됩니다. 또한, Neovim은 LuaRocks 패키지 매니저를 통해 다양한 패키지를 활용할 수 있으며, Telescope, nvim-cmp, Treesitter와 같은 강력한 플러그인 생태계를 자랑합니다. 특히, Treesitter는 소스 코드를 트리 구조로 분석하여 코드 탐색 및 조작을 용이하게 해줍니다. Language Server 지원도 준수하며, coc-nvim을 통해 편리하게 설정할 수 있습니다. 이 글은 Vim과 Neovim 중 어떤 에디터를 선택할지 고민하는 개발자에게 유용한 정보를 제공하며, Neovim의 강력한 기능과 확장성을 통해 생산성을 향상시킬 수 있음을 시사합니다.
Read more →I received a heartwarming #testimonial about #Fedify today!
@bglbgl gwyng shared in the FediDev KR Discord server:
I had trouble finding good resources explaining ActivityPub, but after reading through the Fedify docs from start to finish, I feel like I've actually digested it.
They also posted on their Hackers' Pub:
If you want to learn ActivityPub efficiently, just read the Fedify docs from beginning to end.
This makes all the documentation work worthwhile. Glad our docs are helping people understand not just Fedify, but #ActivityPub itself.
ActivityPub 효율적으로 익히려면 그냥 fedify 문서 첨부터 끝까지 읽으면 되는듯요
컼 점점 중간에 ㅌㅌ할 수 없게 되어버린다
RE: https://hackers.pub/@hongminhee/0195e0f7-8c44-76c6-8c60-4f1978e5f4a2
@curry박준규 알림기능이 먼저 만들어질지 아니면 마스토돈 API 지원이 먼저일지 세기의 경쟁
@kodingwarriorJaeyeol Lee
@curry박준규 알림은 조만간 구현 예정이고, Mastodon API는 아마도 구현 안 될 것 같아요. 대신 @xiniha 님 주도로 GraphQL API가 생길 예정!
@curry박준규
@bglbgl gwyng 알림이 달리 없어서 지나쳐버렸네요, 의견 감사합니다! 혹시 이야기 해주신 UTop이 아래 링크의 UTop이 맞다면, 저 UTop을 직접 구현해보는 걸 추천해주신걸까요?
https://opam.ocaml.org/blog/about-utop/
@morealLee Dogeon
@curry박준규 저는 OCaml을 많이 안 써봤지만 그걸로 만들기 유리한 종류의 프로그램이 특별히 있는지 잘모르겠네요. 아마 이미 아시겠지만, ReScript같은건 바로 써먹고 생산성도 잘나와서 장점을 쉽게 느낄수 있을거 같네요.
@bglbgl gwyng
@curry박준규 펑터(Functor)의 수학귀신적 번역어로 ‘구조를 보존하는’은 어떤가요?
‘그물망 던지기’는 어떤 의미인가요? 펑터와 어떻게 연결해야 할지 모르겠어요.
오에카키 커뮤니티 오이카페를 오픈 소스로 공개했습니다.
Rust, Axum, MiniJinja, HTMX 등으로 만들었고, 그림판은 PaintBBS NEO와 tegaki.js를 지원합니다.
많은 관심 부탁드립니다!
@bglbgl gwyng
@curry@hackers.pub박준규 어렸을 때 읽어본 것 같아요. 지금도 저희 집 책장에 꽂혀 있어요.
@bglbgl gwyng 네? ‘수학귀신적’이 뭔가요?
@curry박준규 앗,혹시 수학귀신 책 읽어보셨나요?









