Hackers' Pub에 차단 기능을 구현합니다.

洪 民憙 (Hong Minhee)
@hongminhee@hackers.pub · 567 following · 374 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
UI 만들기 귀찮다…
Hackers' Pub에 차단 기능을 구현합니다.
Article은 진짜 폰에서는 작성 못하겠네
최근에 추천사를 썼던 책이 있는데요. 이 교재를 활용해서 LLM AI 에이전트를 개발해볼까합니다. 제가 자원봉사(?)를 하고 있는 곳에서 컨텐츠 팀을 담당하고 있는데, 거기서 하는 일 중 하나가 뉴스레터 발행입니다.
TLDR 뉴스레터처럼 링크들을 오마카세처럼 모아서 양질의 콘텐츠를 제공하는게 목표인데, 그런 데이터를 모으기 위해서 최대한 아티클들을 모아서 요약해주는 봇을 만들어야겠다는 판단이 들었습니다. 언어 LLM 관련된 리소스도 많은 파이썬을 쓰게 될 것 같고, 서버 프레임워크는 컨텐츠 관리(어드민페이지)의 수월함을 위해서 Django를 쓰게 될 것 같습니다.
https://product.kyobobook.co.kr/detail/S000216210672
RE: https://hackerspub-ask-bot.deno.dev/message/01962280-fc29-748e-9ba8-fad032795e0d
이 글을 작성한 이후로 바로 Ask 봇을 만들었는데, 생각보다 오래 걸리지 않았다.
- @fedify/botkit 리포지토리를 RepoMix에다가 넘겨서 프롬프트로 변환한다.
- 1에서 넘겨받은 프롬프트를 ChatGPT(o3-mini-high)한테 입력 넣어서 주기적으로 글 작성하는 봇 만들어달라고 한다.
- Cron 돌리는 스크립트 넣어달라고 하는등 티키타카를 한다.
- 부족한 부분은 BotKit 문서 보면서 채운다.
이렇게 하니까 1시간 컷 찍음
RE: https://hackers.pub/@kodingwarrior/0196222c-4b5a-783e-9dd8-8dc5f3e90202
# Ask Hackers Pub : 이번 주말에 뭐 하시나요?
이번 주말에 뭘 하려고 계획 중인지 편하게 얘기해 보아요.
읽을 책, 가볼 곳, 해볼 것.. 어떤 것이든 좋습니다.
도움 요청이나 피드백 요청도 좋습니다.
물론! 아무것도 하지 않고 쉬는 것도 훌륭합니다.
* 지난 주말에 계획하셨던 일의 회고도 한 번 남겨보면 좋을 것 같아요.
Hello, World!
@dlunch 어서 오세요!
Hello, World!
@kodingwarriorJaeyeol Lee 번역 품질 생각하면 그냥 LLM으로 하는 게 낫지 않을까요? 제가 만든 Yoyak에 번역 모듈이 있는데 한 번 참고해 보셔요!
@kodingwarriorJaeyeol Lee 아, 근데 링크 눌렀을 때 일본어로 뜨는 게 문제군요… 😂
흠. BotKit에다가 파파고 웹 번역 끼얹어서 Zenn.dev 피드 알림봇 부활시키려고 했는데, 파파고 웹 번역이 이제 없어........
@kodingwarriorJaeyeol Lee 번역 품질 생각하면 그냥 LLM으로 하는 게 낫지 않을까요? 제가 만든 Yoyak에 번역 모듈이 있는데 한 번 참고해 보셔요!
차단 기능의 밑작업으로… 차단 당하는 기능을 만들었습니다. Hackers' Pub 사용자 여러분은 이제 연합우주 내 다른 인스턴스의 사용자로부터 차단 당할 수 있습니다. ActivityPub의 Block
액티비티 및 Undo(Block)
액티비티를 수신하고 처리할 수 있게 되었다는 뜻입니다. 하지만 아직 차단을 하는 건 안 됩니다. 오늘은 일단 여기까지 하기로 하고… 차단 기능은 아마 내일이나 완성될 것 같군요.
@hongminhee洪 民憙 (Hong Minhee) 방금 신기능 확인하러 들어가 봤는데, 실제 렌더링 결과를 보니 드는 생각이 있어 의견 드립니다. 그냥 🗙 를 쓰는 것은 좀 위험하지 않을까 하는... 🗙 는 단순한 "창 닫기"의 의미로도 많이 쓰이기 때문에, 팔로어 목록도 일종의 인박스("이 사람이 당신을 팔로했습니다" 같은)로 여겨서, 각각의 상자를 대수롭지 않게 🗙 를 눌러서 없애 버리려고 하는 일이 발생하지 않을까 싶습니다.
"블언블"에 해당하는 강력한 조치이니만큼, 함부로 누를 수 없게 "빨간 버튼" 급의 경고가 있어야 하지 않나 하는 생각입니다. 이상적으로는 ellipsis 메뉴 안에 숨기고, ellipsis 눌러서 메뉴를 띄우면 적어도 "빨간 버튼"에 준하는 (즉 딱 봐도 위험해 보이는) 항목으로 등장하면 좋겠네요.
@xtjuxtapose 일단은 한 번 더 물어보도록 하긴 했습니다만… 이걸로는 부족할까요?
Hackers' Pub에 차단 기능을 만들다 보니 일단 모델 쪽에서 팔로워 삭제 기능이 필요하다는 것을 깨달았다. 즉시 하던 작업 다 git stash
하고 팔로워 삭제 먼저 만드는 중… (하지만 UI로 노출하는 건 나중에 할 생각.)
UI로 노출하는 건 나중에 만드려고 했지만, 어차피 테스트도 해야 해서 UI로도 노출했습니다. 자신의 팔로워 목록 페이지에 가시면 각 팔로워마다 오른쪽 위에 X 모양 아이콘이 생겼을 겁니다. 그걸 누르면 팔로워를 삭제할 수 있습니다. (X로 치면 “블언블”한 효과.)
@kodingwarriorJaeyeol Lee (a.k.a. kodingwarrior)
하지만 VS Code의 실행 취소 기능이 절 살렸습니다! 💪
Want to create a #bot for the #fediverse? #BotKit by @fedifyFedify: an ActivityPub server framework lets you build standalone #ActivityPub bots with just a few lines of code! Unlike traditional Mastodon bots, BotKit helps you create complete ActivityPub servers without platform constraints.
With BotKit, you can:
- Build bots that respond to mentions, follows, and messages
- Create rich content with formatted text, mentions, and media
- Publish scheduled posts and automatically manage conversations
- Deploy easily on Deno Deploy, Docker, or self-hosted servers
Check out our documentation at https://botkit.fedify.dev/ and start building your fediverse bot today!
#연합우주(#fediverse)를 위한 봇을 만들고 싶으신가요? #BotKit by Fedify를 사용하면 몇 줄의 코드만으로 독립형 #ActivityPub 봇을 구축할 수 있습니다! 일반적인 Mastodon 또는 Misskey 봇과 달리, BotKit은 플랫폼 제약 없이 완전한 ActivityPub 서버를 만들 수 있게 도와줍니다.
BotKit으로 할 수 있는 것:
- 멘션, 팔로우 및 메시지에 응답하는 봇 만들기
- 형식화된 텍스트, 멘션 및 미디어가 포함된 풍부한 콘텐츠 생성
- 예약된 게시물 발행 및 대화 자동 관리
- Deno Deploy, Docker 또는 자체 호스팅 서버에 쉽게 배포
문서는 https://botkit.fedify.dev/에서 확인하시고 지금 바로 연합우주 봇을 만들어 보세요!
PL을 체계적으로 공부하는걸 회피하고 그때그때 좋아보이는 개념을 찍먹만하며 살아왔더니, 그냥 현존하는 프로그래밍 언어에 불평불만만 많은 사람이 되고말았다;;
어떻게 git reset --hard
를 막아놓든가 해야지, 가끔 가다 한 번씩 꼭 실수로 작업하던 걸 날려서 후회를 하네…
Hackers' Pub에 차단 기능을 만들다 보니 일단 모델 쪽에서 팔로워 삭제 기능이 필요하다는 것을 깨달았다. 즉시 하던 작업 다 git stash
하고 팔로워 삭제 먼저 만드는 중… (하지만 UI로 노출하는 건 나중에 할 생각.)
해커즈 퍼브에서 "사용자"에 해당하는 부분에 스타일시트 적용 전후 비교
@hongminhee洪 民憙 (Hong Minhee) 트위터 같은 경우는 내가 차단한 사용자의 페이지를 퍼머링크 등으로 굳이 찾아 들어갔을 때 경고 다이얼로그 형태의 UI 를 띄우고, 거기서 확인을 누르면 비로소 내용을 보여주는 식으로 동작하더군요. 괜찮은 해법이라고 생각했었습니다.
@xtjuxtapose 흠, 그런 방법도 있겠네요. 의견 감사합니다.
생각해 보니 에모지 반응 찍을 때 게시물이 Mastodon에서 작성된 경우에는 선택지를 없애는 게 나으려나…? Like
액티비티로 표현되는 ❤️ 이외에는 모두 Mastodon이 받아들이지 않는 EmojiReact
액티비티로 표현되기 때문에, 게시물 작성자가 어차피 에모지 반응을 볼 수 없으므로…
@hongminhee@hackers.pub洪 民憙 (Hong Minhee) 우리.인생 같은 포크에선 읽기 전용으로 리액션을 볼 수 있는 경우가 있어요
@hongminhee@hackers.pub洪 民憙 (Hong Minhee) 우리.인생 같은 포크에선 읽기 전용으로 리액션을 볼 수 있는 경우가 있어요
@tirr티르 아… 그럼 https://uri.life/nodeinfo/2.0를 보고
software.version
에 +uri
가 들어갔는지 확인하든지 해야겠군요… 으으으음…
Hackers' Pub에 차단 기능을 만들고 있는데, A가 B를 차단했을 때 A가 B의 콘텐츠를 볼 수 있어야 한다고 생각하시나요? 물론 타임라인 등에서는 기본적으로 다 가려지겠지만, B가 올린 콘텐츠의 퍼머링크를 굳이 찾아서 들어갔을 때 말이죠. 아, 당연히 B 입장에서는 A의 콘텐츠는 전혀 볼 수 없고요. (A가 공개로 올린 콘텐츠를 B가 로그인하지 않은 채 볼 수야 있겠지만…)
그냥 서로 안 보이게 하는 게 낫겠네요.
Hackers' Pub에 차단 기능을 만들고 있는데, A가 B를 차단했을 때 A가 B의 콘텐츠를 볼 수 있어야 한다고 생각하시나요? 물론 타임라인 등에서는 기본적으로 다 가려지겠지만, B가 올린 콘텐츠의 퍼머링크를 굳이 찾아서 들어갔을 때 말이죠. 아, 당연히 B 입장에서는 A의 콘텐츠는 전혀 볼 수 없고요. (A가 공개로 올린 콘텐츠를 B가 로그인하지 않은 채 볼 수야 있겠지만…)
@hongminhee洪 民憙 (Hong Minhee) 이게 혹시 대상이
EmojiReact
를 받아들이는지 아닌지도 스펙에 의해 식별되는 것인가요? 만약 그렇다면 즉시 그렇게 하셔도 좋을 것 같습니다. 그런 것이 아니라 대상이 마스토돈인지 아닌지를 가지고 직접 판단을 내려야 하는, 즉 프로토콜에 없는 정보인데 하드 코딩으로 대응해야 하는 것이라면 조금 더 고민하실 여지가 있을 것 같네요...
@xtjuxtapose 제대로 된 기능 탐지(feature detection) 매커니즘이 없어서 NodeInfo라는 연합우주판
User-Agent
같은 물건에 의존해야 하는 현실입니다… 😭
'악플'이라는 말이 그 자체로 암시하는 바가 있다. 악글, 악메시지 같은 황당한 조어는 없다. 그러나 '악플'은 아주 당당하게 한국어 언중의 삶에서 확고한 위상을 점유하고 있다. 이 근본 없는 신조어가 뉴스 헤드라인에 박혀 있어도 아무도 토를 달지 않을 정도다.
오직 댓글만이 이럴 수 있다. 오직 댓글만이 사람을 자살로 몰고 가는 죄악의 주범으로 번번이 지목될 수 있고, 오직 댓글만이 정치 여론 조작의 혐의로 관계자들을 징역에 처할 수 있다. 자기 블로그에 글 썼다고 이렇게까지 지탄을 받거나 처벌을 받는 일은 없다. 이것은 의미심장하다. 이것은 개개인의 품성 문제가 아니다. 댓글이라는 시스템이 갖는 구조적 원인이 분명히 있는 것이다.
그런 의미에서 트위터 역사상 가장 훌륭한 기능 추가도 "댓글 안 받기" 기능이라고 생각한다. 그러므로 해커즈 퍼브에 댓글 안 받기 기능이 생기기만 기다리는 중...
'악플'이라는 말이 그 자체로 암시하는 바가 있다. 악글, 악메시지 같은 황당한 조어는 없다. 그러나 '악플'은 아주 당당하게 한국어 언중의 삶에서 확고한 위상을 점유하고 있다. 이 근본 없는 신조어가 뉴스 헤드라인에 박혀 있어도 아무도 토를 달지 않을 정도다.
오직 댓글만이 이럴 수 있다. 오직 댓글만이 사람을 자살로 몰고 가는 죄악의 주범으로 번번이 지목될 수 있고, 오직 댓글만이 정치 여론 조작의 혐의로 관계자들을 징역에 처할 수 있다. 자기 블로그에 글 썼다고 이렇게까지 지탄을 받거나 처벌을 받는 일은 없다. 이것은 의미심장하다. 이것은 개개인의 품성 문제가 아니다. 댓글이라는 시스템이 갖는 구조적 원인이 분명히 있는 것이다.
그런 의미에서 트위터 역사상 가장 훌륭한 기능 추가도 "댓글 안 받기" 기능이라고 생각한다. 그러므로 해커즈 퍼브에 댓글 안 받기 기능이 생기기만 기다리는 중...
@xtjuxtapose 음… ActivityPub 구현 중에서 댓글 안 받기 기능을 갖고 있는 게 있었던 것 같은데, 다시 한 번 찾아봐야겠네요. ActivityPub에서 그걸 어떻게 표현하는지 확인해 볼게요. (물론, 그냥 수신 받은 걸 다 드롭해도 되지만요.)
생각해 보니 에모지 반응 찍을 때 게시물이 Mastodon에서 작성된 경우에는 선택지를 없애는 게 나으려나…? Like
액티비티로 표현되는 ❤️ 이외에는 모두 Mastodon이 받아들이지 않는 EmojiReact
액티비티로 표현되기 때문에, 게시물 작성자가 어차피 에모지 반응을 볼 수 없으므로…
협업을 할 때 미묘하게 거슬리는 것들
- 텍스트 파일의 마지막 줄 완성 안 하기 Posix 표준 기준으로 각 줄은 새줄 문자(line feed, '\n')로 끝나야 하며, 마지막 줄도 예외는 아님
- 그리고 위의 일이 주기적으로 재발할 때
@ailrunAilrun (UTC-5/-4) 맞아요. 사실 저는 줄바꿈 문자라고 부르는 것보다 줄끝 문자라고 불러야 하지 않나 싶습니다.
협업을 할 때 미묘하게 거슬리는 것들
- 텍스트 파일의 마지막 줄 완성 안 하기 Posix 표준 기준으로 각 줄은 새줄 문자(line feed, '\n')로 끝나야 하며, 마지막 줄도 예외는 아님
- 그리고 위의 일이 주기적으로 재발할 때
사실 Hackers' Pub 같은 거 운영하면서 최신 DevOps도 배우고 좀 그래야 하는데…
쿠버네티스는 컴포즈만으로는 할 수 없는 HA (네트워킹 포함) 까지 책임져주는 솔루션 중 de-facto 라서 쓴다고 생각해요
앵간한 상황 다 대응되고
복잡하고 어려운 이유는 "앵간한 상황 다 대응"되기 때문이 아닐까 싶음... 컨테이너만 띄울거면 이렇게 복잡해질 이유가 없었음 - 사실 그 부분만 보면 컴포즈랑 비슷하기도 하고
@hongminhee洪 民憙 (Hong Minhee) 뮤트 내지는 차단했거나 일부러 팔로안한 사람까지 노출이 될 수 있을 것 같아서 버그라고 보는 입장이긴 해요
@kodingwarriorJaeyeol Lee 일단 차단 구현하면서 관련 로직도 점검하도록 하겠습니다!
해커스펍 친구가 내가 팔로하고 있지 않은 사람에게 답멘하는게 고스란히 보이고 있는데 이것도 어떻게 보면 버그인가 흠
@kodingwarriorJaeyeol Lee 구현 버그…까진 아닌데 기획 버그라고 봐야 하나요? 🤔
@xiniha 오 어떤게 그렇게 나오는지 궁금합니다!
어찌보면 말씀하신걸 그대로 다른 솔루션으로 만들 수 있다는걸 알아서 더 그렇지 않을까... 라는 생각도 드는군요 :)
@ujuc우죽 일단 쿠버가 가지는 강점은 결국 vendor-neutral한 플랫폼 위에서 다양한 벤더들이 만든 서드파티 소프트웨어를 엮어서 각자가 선호하는 애플리케이션 배포 환경을 구축할 수 있다는 점이라고 보는데요, 물론 앱 걍 띄우면 되지 굳이 커스텀된 배포 환경을 구축할 필요성이 있냐 하는 입장이라면 쿠버가 분명한 오버킬이 되겠지만 😅 개인적으로는 홈서버만 굴리는 상황에서도 도커컴포즈나 systemd를 얼기설기 엮어서 매번 뭔가를 만들기보단 처음에 한번 쿠버로 이것저것 환경 구축해두고 나중에 앱 올릴 때는 Helm 차트 파라미터만 약간 수정해서 올리는 식으로 사용하는 쪽을 선호하게 되더라구요. 해당 장점을 온전하게 대체할 수 있는 메인스트림 플랫폼이 현재로썬 없는 것으로 보이다 보니 자연스레 쿠버네티스를 밀게 되는데, 중장기적으로 WASM 컴포넌트 생태계가 성장하게 되면 wasmCloud 같은 것들이 더 우아한 대체제로 떠오를 가능성도 크다고 생각합니다!
여기에서는 트위터보다 조금 더 편하게 글을 써보려고 합니다. 해커스펍 가입해놓고 글 하나 안 올렸었네요.
여기에서는 트위터보다 조금 더 편하게 글을 써보려고 합니다. 해커스펍 가입해놓고 글 하나 안 올렸었네요.
@d01c2Hyunjoon Kim 어서 오세요!
영어와 1:1 대응을 염두에 둔 번역어 선택은 아닐 수 있겠지만, 그럼 피하고자 한 專門 검색의 의미는 advanced search 같은 느낌일까요…
@dalcrose.hyoungwonpark.netHyoung-Won Park 흠, 그러게요… 🤔 domain-specific search 같은 느낌으로 들리는 것 같기도 하고요.
미중 무역 전쟁과 관련해 사람들이 미국만 걱정하고 중국은 별 걱정안하길래, 중국의 미국으로부터의 주요 수입품을 chatgpt한테 물어봤다. 1순위가 콩이라고 한다.
두부 좀 덜먹으면 되는건가...
@bglbgl gwyng 중국에서 취두부 엄청 먹는데 곤란하지 않을까요? 💨
PostgreSQL 내장 전문 검색의 가장 큰 문제는 성능이 아니라, 색인을 만들거나 검색할 때 대상 언어를 지정해야 한다는 것. 당연히 언어가 섞여 있으면 제대로 동작 안 하고, 색인하려는 내용이 어떤 언어로 작성되었는지 모를 때도 곤란하다.
그나저나 한국어에서 full-text search의 번역어로 “전문 검색”보다 “풀텍스트 검색”이 더 많이 쓰이는 거 같은 기분이 드는데, 아마도 全文이 專門으로 들려서 그런 게 크려나?
GeekNews가 자체적으로 ActivityPub을 구현하면 정말 좋을 것 같은데, 아마 그렇게 되는 것보다 Hackers' Pub에 링크 집계 기능을 넣는 게 더 빠르겠지…
흠...... 모르는 사이에 oci가 탈탈 털렸었어요?
@meWoojin Kim 헐 오라클 클라우드 털렸는데 증거 인멸 시도까지...
https://www.perplexity.ai/search/e54ef60b-306a-4631-a9df-99a97b206605
PostgreSQL 내장 전문 검색의 가장 큰 문제는 성능이 아니라, 색인을 만들거나 검색할 때 대상 언어를 지정해야 한다는 것. 당연히 언어가 섞여 있으면 제대로 동작 안 하고, 색인하려는 내용이 어떤 언어로 작성되었는지 모를 때도 곤란하다.
그리고 좀 사소한 문제일 수도 있지만, ISO 639-1 같은 코드로 언어를 지정하는 게 아니라, 'english'
같은 PostgreSQL 독자 코드로 지정해야 한다는 것도 일을 복잡하게 만든다.
PostgreSQL 내장 전문 검색의 가장 큰 문제는 성능이 아니라, 색인을 만들거나 검색할 때 대상 언어를 지정해야 한다는 것. 당연히 언어가 섞여 있으면 제대로 동작 안 하고, 색인하려는 내용이 어떤 언어로 작성되었는지 모를 때도 곤란하다.
(어디까지나 개인 취향입니다.) 저는 글을 다른 사람과의 대화와 비슷한 느낌을 가지고 읽습니다. 제 주변에 어떤 사람도 저에게 대화할 때, ~음, ~슴, ~함 체로 말하지 않습니다. 뭐뭐 하였음, 그래서 이랬음, 결과로 뭐뭐함 ... 좀 어색하게 들리는데요. 저만 그런가요? 몇 년 째 고맙게 보고 있는 긱뉴스가 이 정책을 고수하는데, 아직도 어색하네요.
@lionhairdino 명사형 종결 어미는 옛날에도 글에서는 종종 쓰지 않았나요? 주로 통지서 같은 데서… 물론 입말로도 그러는 건 요즘의 현상 같습니다.
k8s의 인터페이스는 .yaml 보다는 API로 평가받아야 한다. .yaml도 사실 API payload 그대로 쓰라고하는거고, 딱히 사람이 직접 작성하는걸 염두한거 같지 않다. 뭐 어차피 다들 kustomize 같은걸로 템플릿화 시키니까 괜찮다.
근데 내가 알기로 k8s에서는 이미지를 업로드하고 바로 Pod으로 실행시키는 API가 없다. 그래서 무조건 레지스트리에 준비시켜놓고 주소를 줘야한다. 심지어 이미지 레지스트리 자체는 플러그인으로 다양한 방식으로 확장가능한데 말이다. 이게 맞습니까?
CJK 언어는 음절문자를 사용하는 특성상 아무데서나 끊어서 개행(改行)할 수 있고, 라틴 문자(키릴・그리스 문자도 마찬가지.)처럼 단어 단위 끊기와 음절단위 하이프네이션 원칙이 적용되지 않습니다. 따라서 CJK 텍스트는 어디서나 워드브레이크가 일어나도 괜찮도록 엔진 단위에서 처리를 달리하기 때문에 텍스트랩 설정 때문에 CJK 언어로 쓰인 문단의 텍스트플로가 달라지면 그게 더 큰일입니다.
RE: https://bsky.app/profile/did:plc:v2ob6je7otkaffdktzdaywzp/post/3lmfb5z66622e
이제 이중(?)배포 안 해도 되는건가