이걸 보니까 느끼는데, 사실 repomix 비슷한걸 @joonnotnotJoon 님이랑 같이 만들려고 시도는 했었던게 갑자기 기억난다.... 물론 내가 만들려고 했던건 체크리스트를 자동 생성해주는 CLI를 만드는 것이긴 했지만, 궁극적으로는 LLM에 친화적인 프롬프트를 만드는것도 로드맵이었음.
tree-sitter의 tag query라는게 있다는걸 아예 몰랐어서 빙빙 돌아가다가 결국 흐지부지 되어버린 비운의 프로젝트...
@kodingwarrior@hackers.pub · 265 following · 185 followers
Neovim Super villain. 풀스택 엔지니어 내지는 프로덕트 엔지니어라고 스스로를 소개하지만 사실상 잡부를 담당하는 사람. CLI 도구를 만드는 것에 관심이 많습니다.
Hackers' Pub에서는 자발적으로 바이럴을 담당하고 있는 사람. Hackers' Pub의 무궁무진한 발전 가능성을 믿습니다.
그 외에도 개발자 커뮤니티 생태계에 다양한 시도들을 합니다. 지금은 https://vim.kr / https://fedidev.kr 디스코드 운영 중
이걸 보니까 느끼는데, 사실 repomix 비슷한걸 @joonnotnotJoon 님이랑 같이 만들려고 시도는 했었던게 갑자기 기억난다.... 물론 내가 만들려고 했던건 체크리스트를 자동 생성해주는 CLI를 만드는 것이긴 했지만, 궁극적으로는 LLM에 친화적인 프롬프트를 만드는것도 로드맵이었음.
tree-sitter의 tag query라는게 있다는걸 아예 몰랐어서 빙빙 돌아가다가 결국 흐지부지 되어버린 비운의 프로젝트...
드디어 @xtjuxtapose 님이 기다리시던 차단 기능이 구현되었습니다. 차단할 사용자의 프로필 페이지에 가서 팔로·언팔로 버튼 오른쪽에 보이는 말줄임표 아이콘에 마우스 커서를 갖다 대면 (모바일에서는 터치하면) 상세 메뉴가 나오는데, 그 안에 팔로워 삭제 버튼과 차단 버튼이 생겼습니다.
ActivityPub 프로토콜 수준에서는 차단은 Block
액티비티를 차단한 액터에게 보내며, 차단을 해제할 경우 Undo(Block)
액티비티를 보냅니다. 그러나, 그 액티비티를 받은 인스턴스의 구현이 차단한 사용자의 콘텐츠를 볼 수 없도록 막지 않을 수도 있습니다…만, 실질적으로는 모든 구현이 막고 있습니다. 아, 당연하지만 차단은 자동적으로 상호 언팔로를 수행합니다. 차단을 해제하더라도 풀렸던 팔로 관계는 자동적으로 회복되지 않습니다.
최근에 추천사를 썼던 책이 있는데요. 이 교재를 활용해서 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
그렇죠. 저도 ChatGPT 덕분에 이거 손대면 못하진 않겠지만 내 인생이 망가질 정도로 시간 낭비가 크겠는걸? 하고 엄두도 못내는 것들을 해낼때가 많으니까요. ㅎㅎ
@gnh1201어둠사자 마감기한이 빡셀수록 더더욱 머리에 힘주면서 LLM도 겸사겸사 쓰는게 불가피할 것 같습니다....
왜 이런 소리를 하고 있냐면.... 귀찮아서 손 댈 엄두도 안나고 미루기만 했을 작업을 ChatGPT랑 티키타카해서 2시간 만에 끝냄..... 평소였으면 컨텍스트 스위칭 시간 포함해서 5시간 이상은 걸렸을텐데..
음. 그렇지. 음. 이건 아니야. 음. 여기서 이렇게 하는건 어떨까?
하고 티키타카하면 코드가 짠!
RE: https://hackers.pub/@kodingwarrior/019623b8-54a2-7d15-84c6-90cd443fae96
LLM 시대의 오만이란 무엇인가...!! 수많은 연구/간증을 통해서 어지간하면 1인분할 수 있을 정도로 성능이 좋다고 알려진 LLM이 영 시원치 않다고 단정하는 것이다...!!
정보: 세기의 수학자 테렌스 타오도 대학원생 수준이라고 인정한 바가 있ㄷㅏ
https://www.thestack.technology/chatgpt-o1-strawberry-review/
LLM 시대의 오만이란 무엇인가...!! 수많은 연구/간증을 통해서 어지간하면 1인분할 수 있을 정도로 성능이 좋다고 알려진 LLM이 영 시원치 않다고 단정하는 것이다...!!
Hackers' Pub에 차단 기능을 구현합니다.
따로 의도한건 아닌데 모아서 보기가 좋음
최근에 추천사를 썼던 책이 있는데요. 이 교재를 활용해서 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 Hackers Pub : 이번 주말에 뭐 하시나요?
이번 주말에 뭘 하려고 계획 중인지 편하게 얘기해 보아요.
읽을 책, 가볼 곳, 해볼 것.. 어떤 것이든 좋습니다.
도움 요청이나 피드백 요청도 좋습니다.
물론! 아무것도 하지 않고 쉬는 것도 훌륭합니다.
* 지난 주말에 계획하셨던 일의 회고도 한 번 남겨보면 좋을 것 같아요.
@hackerspub_ask_bot 아 그냥 Deno Deploy 대시보드 Cron 탭에서 next run 칼럼 보면 되는거였네
@hackerspub_ask_bot 뭐지 왜 메시지가 올라가지 않지
@hackerspub_ask_bot 일단 요렇게 넣어봤는데 될지 안될지는 1분 뒤에 결과가 말해줄것
@hackerspub_ask_bot 아 그냥 Deno Deploy 대시보드 Cron 탭에서 next run 칼럼 보면 되는거였네
@hackerspub_ask_bot 일단 요렇게 넣어봤는데 될지 안될지는 1분 뒤에 결과가 말해줄것
이 글을 작성한 이후로 바로 Ask 봇을 만들었는데, 생각보다 오래 걸리지 않았다.
이렇게 하니까 1시간 컷 찍음
RE: https://hackers.pub/@kodingwarrior/0196222c-4b5a-783e-9dd8-8dc5f3e90202
되..겠...지????? 타이밍만 맞으면 진짜 끝... 해방....
이 글을 작성한 이후로 바로 Ask 봇을 만들었는데, 생각보다 오래 걸리지 않았다.
이렇게 하니까 1시간 컷 찍음
RE: https://hackers.pub/@kodingwarrior/0196222c-4b5a-783e-9dd8-8dc5f3e90202
@dlunch 와! 여기서도 뵙네요! 반갑습니ㄷㅏ!!!!
높은 확률로 타임존 문제가 있을 것 같다 -_-;;;;;
일단 아직 10시(UTC 03:00)로 1트
높은 확률로 타임존 문제가 있을 것 같다 -_-;;;;;
흠. BotKit에다가 파파고 웹 번역 끼얹어서 Zenn.dev 피드 알림봇 부활시키려고 했는데, 파파고 웹 번역이 이제 없어........
하스켈쪽 채널은 @lionhairdino 님이 열심히 홍보하고 계시는듯한 ㄷㄷ
Pragmatic Programmersz에서 philosophy of software design 저자 인터뷰? 이건 귀하군요 https://open.substack.com/pub/pragmaticengineer/p/the-philosophy-of-software-design?utm_source=post-email-title&publication_id=458709&post_id=160951999&utm_campaign=email-post-title&isFreemail=true&r=22ejlc&token=eyJ1c2VyX2lkIjoxMjQ5NzAxNjAsInBvc3RfaWQiOjE2MDk1MTk5OSwiaWF0IjoxNzQ0MjE2MDgyLCJleHAiOjE3NDY4MDgwODIsImlzcyI6InB1Yi00NTg3MDkiLCJzdWIiOiJwb3N0LXJlYWN0aW9uIn0.eaxyXydpQsL1CQdEWRxIUdzOadbcMTtw0lLc7JJst7M
해커즈 퍼브에서 "사용자"에 해당하는 부분에 스타일시트 적용 전후 비교
@kodingwarriorJaeyeol Lee 구현 버그…까진 아닌데 기획 버그라고 봐야 하나요? 🤔
@hongminhee洪 民憙 (Hong Minhee) 뮤트 내지는 차단했거나 일부러 팔로안한 사람까지 노출이 될 수 있을 것 같아서 버그라고 보는 입장이긴 해요
여기에서는 트위터보다 조금 더 편하게 글을 써보려고 합니다. 해커스펍 가입해놓고 글 하나 안 올렸었네요.
@d01c2Hyunjoon Kim 아늑한 해커스펍에 어서오세요
해커스펍 친구가 내가 팔로하고 있지 않은 사람에게 답멘하는게 고스란히 보이고 있는데 이것도 어떻게 보면 버그인가 흠
Jaeyeol Lee shared the below article:
정진명의 굳이 써서 남기는 생각 @index@guji.jjme.me
지적 재산권에 대해서 이야기를 하려면 지적 재산권 제도를 통해서 이룩하려는 것이 무엇인지를 이야기해야 합니다. 저는 지적 재산권을 세 가지로 보는데, 기능을 실현하는 것에 관련된 것과(특허, 실용신안) 표현에 관한 것과(저작권) 공정한 시장을 위한 것(상표)으로 나눌 수 있을 것 같습니다. 상표는 조금 성격이 다르다고 생각해 따로 이야기하겠지만, 어쨌든 지적 재산권이란 어떤 이로운 것을 새롭게 생각해낸 주체의 권리를 보장해주기 위한 제도지요.
그런데 이 '생각해낼 수 있는 어떤 이로운 것'이란, 대다수가 저렴하게 복제가 되거나 복제된다고 해서 그 가치가 줄어들지 않는다는 특징이 있습니다. 기능을 실현하는 지식도, 표현된 이야기도, 가끔은 '이 로고가 붙은 제품은 좋다'는 믿음도 말이지요. 어떤 면에서 말하자면, '생각해낼 수 있는 이로운 것'이 제한없이 복제될 수 있는 상태가 편익의 합을 극대화할 수도 있을 것입니다.
하지만 이렇다면, 어떠한 노력을 들여서 복제될 수 있는 무언가를 만들어내는 행위가 경제적으로 보답받지 못하는 상태가 되리라고 생각할 수 있겠지요. 우리는 그런 행위가- 발명과 창작이 사회의 편익을 증가시킨다고 이해하고 있고, 그걸 위한 인센티브를 주고 싶다고 생각합니다. 지적 재산권은 제 생각에 그것을 보장하기 위한 도구입니다. 그러나 극단적인 경우를 생각해 봅시다. 지적 재산권이 개인에게 기한과 범위 없이 인정되고, 그것을 계속 물려줄 수 있는 거지요. 불을 쓰기 위해서 처음 불을 발견한 사람의 자손에게 사용료를 내고요. 누군가가 벽에 커다란 낙서를 해서 그것을 방송으로 보도하면, 그 낙서를 복제한 것이기 때문에 보도하기 위해서 저작권료를 지불해야 할 수도 있지요. 뭐, 그러면 안 되는 건 아닐 순 있지만, 사회의 편익이 그렇게 높을 것 같지는 않습니다.
제 주장은, 지적 재산권은 다음 두 상황의 균형을 맞추는 제도라는 것입니다.
대부분의 경우는 1번 상황이 문제가 됩니다. 2번 상황은 꽤 이론적인 것처럼 보이지만, 충분히 주의해서 관찰한다면 사회의 어떤 문제는 2번 상황에 해당한다는 걸 찾아보실 수도 있을 것입니다. 이미 우리의 지적 재산권은 만료, 공정 이용과 같은 방식으로 동의 없는 복제를 허용하고― 다시 말해 제작자의 권리를 무한정 인정하고 있지는 않습니다.
두 상황의 균형은 사회의 영향을 받기 때문에, 지적 재산권이 어디까지는 제작자의 권리를 보호하고 어디부터는 보호 없는 복제를 허용하게 두어야 하는지는 그 사회의 변화에 맞추어 적절하게 갱신되어야 한다고 생각합니다.
좀 쓰다 급하게 마무리하고 자러 갑니다. Hacker's Pub 가입 이후 처음이라 올리긴 하는데요…
옥텟 규칙으로 본 IETF RFC 9110 “HTTP Semantics” https://eonj.github.io/trouble.log/2025-04-09.an-octet-aspect-to-ietf-rfc-9110/
GeekNews의 〈소프트웨어 엔지니어로 산다는 건 미친 짓이야〉 주제에 @youknowone 님께서 쓰신 좋은 댓글:
소프트웨어 개발이 어려운 일이라는 사람들은 본인이 그 일을 하는 이유가 뭘까요? 고되고 힘든 일이지만 보람있는 일이라서 하시나요? 이 업계에서 그런 분들은 그리 많지는 않았던 것 같습니다. 남들이 못하는 것 같으니까 어렵다고 주장하는거지, 실상은 그게 본인한테 가장 쉬운 일이니까 하시는 것 아닌가요? 남들이 좀 띄워준다고 자화자찬하면서 나만 특별한 양 여기면서 눈을 가리지 말고 주위를 봐야합니다. 이공계에서 어떤 분야가 방구석에서 인터넷 좀 보고 독학한다고 (잘 하면) 몇달만에 현업에 투입할 수 있는 전문가가 됩니까?
(…중략…)
물론 남들이 가지지 못한 훌륭한 손재주를 가진 사람은 존중받아 마땅하지만, 약간의 손재주를 연마했다고 해서 소싯적 배워둔 손재주로 평생 먹고 살면 좋을텐데 왜 그럴수 없을까, 나는 이런 훌륭한 손재주를 가졌는데 다른 사람들처럼 힘들게 일하지 않아야 하는 것 아닐까, 나는 남들은 쉽게 하지 못하는 대단한 재능을 가진 것이 아닐까 등등의 특별한 나에 심취하는건 교만에 가까운 일이 아닐까 합니다.
해커스펍이 또 달라졌어...!!!
"언급된 사용자만"으로 두고 대화를 주고 받으면, 그 게 DM인 건가요? 나중에 검색으로도 걸려들지 않는 건가요?
@lionhairdino 일단 스펙상으로는 검색으로 걸리지 않아요
해커뉴스에 대응되는 긱뉴스가 있듯이 Lobsters도 해커스펍이 대응되지 않을까 하는 상상
쿠버세란 옵스 엔지니어 연봉을 뜻한다
@hongminhee洪 民憙 (Hong Minhee)
@kodingwarriorJaeyeol Lee
@lionhairdino 저는 그냥 "유저"에 해당하는 부분 그 자체에 별도의
background
와 border
를 부여하는 것이 가장 일반적이면서 직관적이고 식별성도 좋다고 생각합니다만... (스크린샷은 각각 border-radius
를 사용한 경우와 box-shadow
를 사용한 경우입니다.)
@xtjuxtapose
@hongminhee洪 民憙 (Hong Minhee)
@lionhairdino 와, 오른쪽도 엄청 직관적이네요
Model Context Protocol has prompt injection security problems
https://simonwillison.net/2025/Apr/9/mcp-prompt-injection/
긱뉴스에도 Ask GN: 이번 주말에 뭐하세요?
같이 꾸준히 올라오는 자동 게시글이 있는데, 이걸 botkit으로 붙이면 어떨까 싶은 생각이 들었다
@kodingwarriorJaeyeol Lee
@lionhairdino 지금 생각해 보니 그냥 두꺼운 글씨를 안 쓰면 좀 낫지 않을까 싶기도 하네요.
@hongminhee洪 民憙 (Hong Minhee)
@lionhairdino
개인적으로는 멘션 통째로 있는 영역 자체가 두드러지게 보이면 좋지 않을까라는 생각이 드는데, 이렇게 된 이상 밑줄/텍스트쉐도우/얇은글씨 콜라보레이션으로 간다면 =3
@lionhairdino 안 그래도
@kodingwarriorJaeyeol Lee 님께서 이런 PR을 보내주신 바 있습니다.
@hongminhee洪 民憙 (Hong Minhee)
@lionhairdino
사실 저 이거 더 나은 제안이 있을 것 같아서 추가적인 작업은 일부러 안하고 있었는데... 밑줄말고도 그림자(text-shadow)를 넣으면 어떨까? 싶다가도 더 나은 CSS 속성이 있을 것 같아서 찾아보고는 있어요
📣 Exciting news! Fedify CLI is now available via Homebrew!
If you're using #Homebrew on macOS or #Linuxbrew on Linux, you can now install our CLI toolchain with a simple command:
brew install fedify
This makes it even easier to get started with building your federated server app. Try it out and let us know what you think!
개인적으로 쿠버네티스를 편하게 쓰기 위한 공부를 어느 정도 마친 상태에서 보면 "아 이거 쿠버 하나만 떠 있으면 편하게 이것저것 띄우고 할 수 있는데 괜히 귀찮게 세팅해야 하네"라는 생각이 들기도 하지만 😅 쿠버네티스 잘 모르는 상태에서는 참 막막하겠다 싶긴 합니다....
RE: https://hackers.pub/@xt/01961970-a29f-78ff-baaf-1db2056a78e1
저, 저도 90% 이상의 경우 도커 컴포즈 정도가 적당한 추상화 수준이라고 생각해요...
실제로 쿠버네티스 쓰는 팀에서 일해 본 경험도 그렇고, 주변 이야기 들어 봐도 그렇고, 도입하면 도입한 것으로 인해 증가하는 엔지니어링 코스트가 분명히 있다는 점은 누구도 부인하지 않는 것 같은데요. 쿠버네티스를 제대로 쓰는 것 자체도 배워야 할 것도 많고, 엔지니어가 유능해야 하고, 망치도 들여야 하고... 웬만하면 전담할 팀이 필요하지 않나 싶어요. (전담할 '사람' 한 명으로 때우기에는, 그 사람 휴가 가면 일이 마비되니까.)
엔지니어만 100명이 넘는 곳이라면 확실히 도입의 이득이 더 크겠지만, 반대로 혼자 하는 프로젝트라면 도무지 수지타산이 안 나올 것이라고 생각합니다. 따라서 쟁점은 그 손익분기점이 어디냐일 텐데... "대부분의" 서비스는 대성공하기 전까지는 도입 안 해도 되지 않나, 조심스럽게 말씀드려 봅니다. 즉 쿠버네티스가 푸는 문제는 마세라티 문제인 것이죠...
특히 클라우드 남의 컴퓨터 를 쓰지 않고 베어메탈 쓰는 경우는 더더욱...
RE: https://hackers.pub/@hongminhee/019618b4-4aa4-7a20-8e02-cd9fed50caae
Hackers' Pub의 에모지 반응 기능은 Mastodon의 좋아요, Misskey 계열, Pleroma 계열, kmyblue 및 Fedibird의 에모지 반응 기능과 호환됩니다. 기술적으로는 기본 에모지인 ❤️는 Like
액티비티로 표현되며 그 외 나머지 에모지는 EmojiReact
액티비티로 표현됩니다. Mastodon, kmyblue, Fedibird의 좋아요는 ❤️ 에모지 반응으로 변환됩니다 (Misskey의 동작과 유사). 또한, Misskey 계열과 달리 한 사람이 한 콘텐츠에 여러 에모지 반응을 남길 수도 있습니다 (Pleroma 계열의 동작과 유사). Hackers' Pub 사용자가 남길 수 있는 에모지 반응은 ❤️, 🎉, 😂, 😲, 🤔, 😢, 👀 이렇게 7종이며, 그 외의 에모지 및 커스텀 에모지는 보낼 수는 없고 받는 것만 됩니다.
에모지 반응 기능이 배포되었습니다. 당분간 버그가 좀 있을 수도 있지만 양해 바랍니다. 전 이제 차단을 구현하러 가겠습니다…
진짜 아무 생각없이 Elm 뉴스레터 구독해서 받아보고 있는데, 그냥 매번 발행될때마다 특별한 소식이 없음...
Jaeyeol Lee shared the below article:
Ailrun (UTC-5/-4) @ailrun@hackers.pub
국밥 두 그릇의 가격이 얼마인가? KTX의 속력이 몇 km/h인가? 내일 기온은 몇 도인가? 일상에서 묻는 이런 질문은 항상 같음의 개념을 암시적으로 사용하고 있다. 앞의 예시를 보다 명시적으로 바꾼다면 아래와 같이 (다소 어색하게) 말할 수 있다.
이런 질문들의 추상화인 이론들은 자연스럽게 언제 무엇과 무엇이 같은지에 대해서 답하는 데에 초점을 맞추게 된다. 예를 들면
등이 있다. 이렇게 어떤 두 대상이 같은지에 대해서 이야기를 하다보면 반대로 어떤 두 대상이 같지 않은지에 대해서도 이야기하게 된다. 즉,
이제 컴퓨터 과학(Computer Science)과 프로그래밍(Programming)에 있어 자연스러운 의문은 "두 대상이 같은지 아닌지와 같은 답을 주는 알고리즘(Algorithm)이 있나?"일 것이다. 다시 말해서 두 대상 aa와 bb를 입력으로 주었을 때
알고리즘이 있는지 물어볼 수 있다. 이런 어떤 명제가 참인지 거짓인지 판정하는 알고리즘의 존재 여부에 대한 질문을 "판정 문제"("Decision Problem")라고 하며, 명제 PP에 대한 판정 문제에서 설명하는 알고리즘이 존재한다면 "PP는 판정 가능하다"("PP is decidable")고 한다. 즉, 앞의 질문은 "임의의 aa와 bb에 대해 aa와 bb가 같은지 판정 가능한가?"라는 질문과 같은 의미라고 할 수 있다.
이 질문에 대한 대답은 당연하게도 어떤 대상을 어떻게 비교하는지에 따라 달라진다. 예를 들어 우리가 32 비트(bit) 정수에 대해서만 이야기하고 있다면 "임의의 32 비트 정수 aa와 bb에 대해 aa와 bb가 각 비트별로 같은지 판정 가능한가?"라는 질문에 대한 답은 "그렇다"이다. 반면 우리가 비슷한 질문을 자연수를 받아 자연수를 내놓는 임의의 함수에 대해 던진다면 답은 "아니다"가 된다.[1]
그렇다면 어떤 대상의 어떤 비교에 대해 판정 문제를 물어보아야할까? 프로그래머(Programmer)로서 명백한 대답은 두 프로그램(Program)이 실행 결과에 있어서 같은지 보는 것일 것이다. 그러나 앞서 자연수를 받아 자연수를 내놓는 함수에 대해 말했던 것과 비슷하게 두 프로그램의 실행 결과를 완벽하게 비교하는 알고리즘은 존재하지않는다. 이는 우리가 두 프로그램의 같음을 판정하고 싶다면 그 같음을 비교하는 방법에 제약을 두어야 함을 말한다. 여기서는 다음의 두 제약을 대표로 설명할 것이다.
이 방법은 말 그대로 두 프로그램이 문법 수준에서 같은지를 보는 것이다. 예를 들어 다음의 두 JavaScript 프로그램은 문법적으로 같은 프로그램이다.
// 1번 프로그램
let x = 5;
console.log(x);
// 2번 프로그램
let x = 5;
console.log( x );
공백문자의 사용에서 차이가 있으나, 그 외의 문법 요소는 모두 동일함에 유의하자. 반면 다음의 두 JavaScript 프로그램은 동일한 행동을 하지만 문법적으로는 다른 프로그램이다.
// 1번 프로그램
let x = 5;
console.log(x);
// 2번 프로그램
let x = 3 + 2;
console.log(x);
두 프로그램 모두 x
에 5
라는 값을 할당하고 5
를 콘솔에 출력하나, 첫번째 프로그램은 = 5;
를, 두번째 프로그램은 = 3 + 2
을 사용하여 5
를 할당하고 있기 때문에 문법적으로 다르다.
문법적 비교는 이렇게 문법만 보고서 쉽게 판정할 수 있다는 장점이 있으나, 두번째 예시처럼 쉽게 같은 행동을 함을 이해할 수 있는 프로그램에 대해서도 "같지 않음"이라는 결과를 준다는 단점을 가진다. 혹자는
3 + 2
같은 계산은 그냥 한 다음에 비교하면 안돼? 컴파일러(Compiler)도 상수 전파(Constant Propagation) 최적화라던지로3 + 2
를5
로 바꾸잖아?
라는 생각을 할 수도 있을 것이다. 이 제안을 반영한 방법이 바로 β\beta 동등성이다.
바로 앞의 소절에서 단순 계산의 추가에 의해 같음이 같지 않음으로 변하는 것을 보았다. 이런 상황을 피하기 위해서는 같음을 평가할 때 프로그램의 실행을 고려하도록 만들어야 한다. 가장 대표적인, 대부분의 프로그래밍 언어(Programming Language)에 존재하는 프로그램의 실행은 함수 호출이다. 따라서 함수 호출을 고려한 같음의 비교는 f(c)
와 함수 f
의 몸체 b
안에서 인자 x
를 c
로 치환한 것을 같다고 취급해야한다. 예를 들어
let f = (x) => x + 3;
이 있다면, f(5)
와 5 + 3
혹은 8
을 같은 프로그램으로 취급해야한다. 이 비교 방법의 큰 문제는 함수가 종료하는지 알지 못한다는 것이다. 두 프로그램 a
와 b
를 비교하는데, a
가 종료하지 않는 함수 l
을 호출한다면, 이 알고리즘은 "같음"이나 "같지 않음"이라는 결과를 낼 수조차 없다. 즉, 올바른 판정법이 될 수 없다.
더 심각한 문제는 아직 값을 모르는 변수가 있는 "열린 프로그램"("Open Program")에 대해서도 이런 계산을 고려해야한다는 것이다. 다음의 JavaScript 예시를 보자.
let g = (x) => f(x) + 3;
let h = (x) => (x + 3) + 3;
g
와 h
는 같은 프로그램일까? 우리가 g
와 h
가 같은 프로그램이기를 원한다면 f(x)
와 x + 3
을 같은 프로그램으로 보아야한다. 대부분의 프로그램은 함수 안에서 쓰여지기 때문에 프로그램의 비교는 거의 항상 g
와 h
의 몸체와 같은 열린 프로그램들의 비교이다. 따라서 g
와 h
를 다른 프로그램으로 본다면 계산을 실행하여 두 프로그램을 비교하는 의미가 퇴색되고 만다. 그렇기 때문에 우리는 x
와 같이 값이 정해지지 않은 변수가 있을 때에도 f(x)
을 호출하여 비교해야만 한다. 이는 우리가 단순히 모든 함수가 종료하는지 여부를 떠나서, 함수의 몸체에 등장하는 모든 부속 프로그램(Sub-program)이 종료하는지 아닌지를 따져야만 한다는 이야기이다.
이런 강한 제약조건으로 인해 β\beta 동등성을 통해서 프로그램 비교의 판정 문제를 해결 가능한 곳은 매우 제한적이지만, β\beta 동등성이 매우 유용한 한가지 경우가 있다. 바로 의존 형이론(Dependent Type Theory)의 형검사(Type Checking)이다.
의존 형이론은 형(Type)에 임의의 프로그램을 포함할 수 있도록 하는 형이론(Type Theory)의 한 종류이다. 예를 들어 명시적인 길이(n
)를 포함한 벡터(Vector) 형을 Vector n Int
과 같이 쓸 수 있다. 이 형은 n
개의 Int
값을 가진 벡터를 표현하는 형이다. 이제 append
라는 두 벡터를 하나로 연결하는 함수를 만든다고 해보자. 대략 다음과 같은 형을 쓸 수 있을 것이다.
append : Vector n a -> Vector m a -> Vector (n + m) a
즉, append
는 길이 n
짜리 a
형의 벡터와 길이 m
짜리 a
형의 벡터를 합쳐서 길이 n + m
짜리 a
형의 벡터를 만드는 함수이다. 이 함수를 사용해서 길이 5
의 벡터를 길이 2
와 길이 3
짜리 벡터 x
, y
로부터 만들고 싶다고 하자.
append x y : Vector (2 + 3) a
안타깝게도 우리는 길이 2 + 3
짜리 벡터를 얻었지, 길이 5
짜리 벡터를 얻진 못했다. 여기서 앞서의 질문이 다시 돌아온다.
아니,
2 + 3
를5
로 계산하면 되잖아?"
그렇다. 이런 의존 형에 β\beta 동등성을 적용하면 우리가 원하는 형을 바로 얻어낼 수 있다. Vector (2 + 3) a
과 Vector 5 a
는 같은 형이기 때문이다. 더욱이, 의존 형의 경우 종료하지 않는 부속 프로그램이 잘못된 형을 줄 수 있기 때문에 많은 경우 종료하지 않는 부속 프로그램을 어차피 포함하지 않는다. 다시 말해, 앞서 말한 제약 조건 즉 모든 부속 프로그램이 종료해야만 한다는 제약조건은 의존 형의 경우 상대적으로 훨씬 덜 심각한 제약조건이 되는 것이다.
이런 의존 형에 있어서의 β\beta 동등성 검사를 "변환 검사"("Conversion Check")라고 하며, 두 형이 β\beta 동등일 경우 이 두 형이 서로 "변환 가능하다"("Convertible")라고 한다. 이 변환 검사는 의존 형이론 구현에 있어서 가장 핵심인 기능 중 하나이며, 가장 잦은 버그를 부르는 기능 중 하나이기도 하다.
이 글에서는 같음과 같지 않음의 판정 문제에 대해 간략히 설명하고 프로그램의 같음을 판정하는 법에 대해서 단순화하여 다루어보았다. 구체적으로는 문법 기반의 비교와 β\beta 동등성을 통한 비교로 프로그램의 같음을 판정하는 법을 알아보았고, 이 중 β\beta 동등성이 적용되는 가장 중요한 예시인 의존 형이론을 β\beta 동등성을 중점으로 짤막하게 설명하였다. 마지막 문단에서 언급했듯 의존 형이론의 구현에 있어서 β\beta 동등성을 올바르게 구현하는 것은 가장 중요한 작업 중 하나이기에, 최근 연구들은 β\beta 동등성의 구현 자체를 의존 형이론 안에서 함으로서 검증된 β\beta 동등성의 구현을 하기 시작하고 있다. 이 글이 같음과 같지 않음과 판정 문제 그리고 β\beta 동등성에 있어 유용한 설명을 내놓았기를 바라며 이만 줄이도록 하겠다.
두 함수가 같다라고 보는 방법에 따라 다르나, 두 함수가 항상 같은 값을 가진다면 같다고 하자. 이때 함수의 판정 문제는 정지 문제(Halting Problem)와 동일하다. 임의의 튜링 기계(Turing Machine) ff가 입력 nn을 받았을 때 종료하면 g(n)=1g(n) = 1, 아니면 g(n)=0g(n) = 0이라고 하면 이 함수 gg와 상수 함수 c(n)=1c(n) = 1가 같은 함수임을 보이는 것은 ff가 항상 종료한다는 것을 보이는 것과 동등하다. ↩︎
Kubernetes를 아직도 쓸 줄 모르는 1人… Hackers' Pub도 그냥 Docker Compose로 운영하고 있습니다. 🙄
RE: https://hackers.pub/@ujuc/0196189f-1c95-7120-831b-27d7c51e8f38
@hongminhee洪 民憙 (Hong Minhee) 저도 그걸 써보긴 했으나.... 클라우드 환경에러는 미니멈하게 돌려도 6개월 방치했더니 100만원 깨지는거보고 식겁했습니다...