@hongminhee洪 民憙 (Hong Minhee) 뭔가 에모지랑 멘션/퍼나르기/인용이랑 같은 위계에 있어서 다 똑같이 에모지 반응처럼 보이는 감이 없지 않네요... 라인으로 구분해야하는 시점인가
洪 民憙 (Hong Minhee)
@hongminhee@hackers.pub · 1014 following · 723 followers
Hi, I'm who's behind Fedify, Hollo, BotKit, and this website, Hackers' Pub! My main account is at
@hongminhee洪 民憙 (Hong Minhee)
.
Fedify, Hollo, BotKit, 그리고 보고 계신 이 사이트 Hackers' Pub을 만들고 있습니다. 제 메인 계정은:
@hongminhee洪 民憙 (Hong Minhee)
.
Fedify、Hollo、BotKit、そしてこのサイト、Hackers' Pubを作っています。私のメインアカウントは「
@hongminhee洪 民憙 (Hong Minhee)
」に。
Website
- hongminhee.org
GitHub
- @dahlia
Hollo
- @hongminhee@hollo.social
DEV
- @hongminhee
velog
- @hongminhee
Qiita
- @hongminhee
Zenn
- @hongminhee
Matrix
- @hongminhee:matrix.org
X
- @hongminhee
@kodingwarriorJaeyeol Lee (a.k.a. kodingwarrior)
음, 그러게요. 한 번 좀 더 고쳐보겠습니다.
@hongminhee洪 民憙 (Hong Minhee) 요런 느낌으로 합치면요??
@hongminhee洪 民憙 (Hong Minhee) 아니요 툴렸습니다
일단 이 정도로 가기로 했습니다.
이게 맞나…?
Powershell은. Net기반이라. Net 라이브러리도 가져다 쓸 수 있고 좀 더 이상하게까지 가면 C#코드를 임베딩해서 쓸 수도 있다. 어쨌든 셸 이지만 모든 것이 문자열이 아닌 납득할만한 타입이 있는 셸이다. 그리고 크로스 플랫폼도 지원한다. 하지만 몇몇 명령어는 어째 특정 경우의 동작이 괴상하고, 나중에 나온 크로스 플랫폼 버전에서만 납득 할만한 동작을 하게 하는 플래그가 제공 되기도 한다. 예를 들어 ConvertTo-Json은 json 문자열로 직렬화 해주는 명령인데, https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/convertto-json?view=powershell-7.5#-asarray 옵션이 없으면 요소가 한개인 배열의 경우 그 요소만 꺼내서 직렬화 해버린다.
패키지 저장소에 내가 만든 패키지를 업로드해보니까 다음과 같이 코딩말고도 할 게 꽤 많다.
- 저장소 계정 만들고 권한 승인 받기[1]
- 라이브러리 코드에 주석 적기
- 라이선스 정하기
- 소스 코드 저장소 정하기
- 커밋 메시지 적기
- 체인지로그 적기
- 테스트 코드 적기
- 버전 관리하기[^4]
LLM 덕분에 영어로 적어야 하는 문서 대부분은 어렵지 않게 할 수 있었다. LLM 때문에 바보 된다는 말도 많지만 영어 때문에 주저 했던 작업을 쉽게 시작할 수 있었다는 점에서 확실히 진입 장벽은 낮아졌다.
앞으로 더 해볼 일은 특정 배포판에 패키지를 배포하는 일이다. 해키지에서 지원하는 배포판은 다음과 같다.
- Arch
- Debian
- Fedora
- FreeBSD
- LTS
- LTSHaskell
- NixOS
- Stackage
- openSUSE
도전 과제로 위에 적은 모든 배포판에 내가 만든 패키지 배포해보는 것도 재밌겠다. LTS, LTSHaskell은 뭔가 했는데, 스태키지(Stackage)에 패키지 업로드하는 방법을 안내한 문서를 보니까 스태키지의 저장소 종류인 것 같다.
한편 해커즈 퍼브의 홍민희 님도 헤비(?) 하스켈 패키지 업로더이신데 예를 들어 seonbi도 사실 하스켈 패키지이다.
해키지 업로더 계정이 필요하신 분은 나와 홍민희 님을 멘션하면 이미 두 명의 승인은 따 놓은 당상이다.
해키지에서는 가입 후 기존 해키지 업로더 2명의 승인이 필요하다. ↩︎
FTP로 배포하는 php 서버에서(20년 전 대부분의 웹사이트), GitOps, 서버리스 아키텍쳐, 이벤트 드라이븐 프로그래밍의 편린을 엿볼수 있다. 지나고나서 이런 얘기는 누구나 다 할수있다. 근데 그 당시에 다같이 php 욕하는거에 휩쓸리지 않고 이걸 알아챈 사람이 있었을까.
@hongminhee洪 民憙 (Hong Minhee)
@kodingwarriorJaeyeol Lee 6개월 전쯤에, 국내 대형 커뮤니티에서 몇 만명의 사람들이 뛰쳐나가며 신규 사이트를 만들어서 두어달만에 안정시키는 걸 구경만 했습니다.(전 회원은 아닙니다.) 그런데, 중간쯤에 서버 부하 때문에 어지간한 이미지는 다 내리고 안정시켜 가더라고요. 언젠가 신경 쓸 날이 오면 좋은 거겠지요?
@lionhairdino
@kodingwarriorJaeyeol Lee 그런 날이 왔으면 좋겠네요. ㅎㅎㅎ
ESM 알못인데 왠지 tsx를 쓰니까 잘 돌아서(뭔가 알아서 해주는듯하다), 그냥 배포도 .ts 파일로해서 tsx로 실행하도록 바꿨다. ...는 Deno잖아;;
@lionhairdino CDN을 태우면 그렇게 비싸지는 않아요
@kodingwarriorJaeyeol Lee
@lionhairdino 네, 별로 비용이 크게 들지는 않습니다. 그리고 요즘에는 DPI가 높아져서 어차피 해상도 높은 사진을 쓰긴 해야 해요.
@hongminhee洪 民憙 (Hong Minhee) (x, 쓰레드, 마스토돈 5개월따리 입니다.) SNS를 디스코드만 써봐서 자유롭게 이모지 달다가, 다른 SNS들이 하트만 있어 의사 표현할 때 멈칫 멈칫 했었습니다. 좋아도 하트, 상황이 좋지 않아도 네 말이 맞으면 하트, 상황이 그럴만 하다도 하트...
좀 지나다 보니, 구체적인 의사 표현을 막고, 받아 들이는 사람이 해석할 여지를 두는 방식인가란 생각이 들었습니다. 해커스펍도 이러자는 얘기는 아닙니다. 그냥, 옆집에 장사 잘하는 집이 이렇게 하더라... 정도의 얘기입니다.
@lionhairdino 사실 정해진 세트로만 가는 가장 큰 이유는 UI 깎기가 힘들어서…입니다. 😂
@xiniha
@hongminhee洪 民憙 (Hong Minhee) 이거 어떡하면 좋나요ㅠㅠ ESM 잘모르고 살기 5+년동안 버텼는데, 이젠 끝이 온거같습니다.
@bglbgl gwyng @xiniha 그러고 보니 최근 Node.js에서는
require(ESM)이 된다고 들었던 것 같기도 한데, 그거랑은 상관 없는 얘기려나요?
@hongminhee洪 民憙 (Hong Minhee)
@bglbgl gwyng 리액트/릴레이도 CJS 빌드밖에 없습니다 ㅋㅋㅋㅋㅋ
@xiniha
@bglbgl gwyng 헉… 그렇군요? 어찌 그럴 수가…
Prisma를 쓰지 않을 이유가 하나 더 추가되었다…
Prisma는 ESM을 지원하지 않는구나... 그런즉 Fedify랑 같이 못쓰는구나... 매일 매일 말도안되는거 고치면서 시간이 가는구나...
Prisma는 ESM을 지원하지 않는구나... 그런즉 Fedify랑 같이 못쓰는구나... 매일 매일 말도안되는거 고치면서 시간이 가는구나...
@bglbgl gwyng 헉… 어떻게 2025년에 ESM을 지원 안 하는 라이브러리가 그렇게 널리 쓰이고 있을 수 있는 걸까요…
Hackers' Pub에 리액션 기능 만들고 있는데, 선택 가능한 에모지 세트를 이 정도로 대충 정해봤습니다. 더하거나 뺄 게 있을까요? 그리고 5 종류인 게 많다고 보시나요 적다고 보시나요?
일단 이 정도로 가기로 했습니다.
@curry박준규
@hongminhee洪 民憙 (Hong Minhee)
@akastoot악하 저는 좀 이상한 방법을 쓰는데요, 집 공유기가 ipTIME 이어서 ipTIME의 DDNS 서비스로 도메인을 얻은 뒤, Cloudflare의 DNS에 이 도메인을 CNAME으로 물려놨습니다. 이상하게도 집 IP가 바뀌지 않는지라 정상 동작하는지 여부는 확인을 못 해봤네요.
@sftblwCh.
@curry박준규
@akastoot악하 저도 예전에는 비슷하게 구성했던 것 같네요. ㅎㅎㅎ
오늘의 삽질 기록
- 한동안 Spring Boot (Java) 기반의 프로젝트만 하다가 최근 NestJS + Prisma ORM (Node) 기반으로 프로젝트를 막 시작했음.
- 윈도 (WSL), Mac을 같이 사용하다 보니 윈도만 세팅해놓고, 오늘 Mac에 세팅을 시도함.
- 소스 내려 받고
npx prisma generate+npm run start하는데 서버가 작동하지 않음. 사내 DB서버 접속이 안됨. npx prisma db pull를 시도함. 역시나 사내 DB서버 접속이 안됨.
❯ npx prisma db pull
Prisma schema loaded from prisma/schema.prisma
Environment variables loaded from .env
Datasource "db": PostgreSQL database "postgres", schema ... at "192.168.1...:5432"
✖ Introspecting based on datasource defined in prisma/schema.prisma
Error: P1001
Can't reach database server at "192.168.1...:5432"
같은 대역 (192.168.1.) 이 접속이 안될 리가 없는데 하면서 ping, nc -zv 192.168.1... 5432 모두 확인함. 당연히 접속 잘됨.
알고 보니 별것 아니었으나, 원인을 찾기 어려워서 시간을 조금 허비했다.
MacOS 에서는 (iPhone 이나 다른 기기도 마찬가지겠지만) 앱마다 로컬 네트워크 접근에 대한 허가를 해주어야 하고, 이게 거부가 된 상태에서는 로컬 네트워크에 접근을 하지 못한다. 어째서인지 모르겠으나, 내 iTerm2 앱에서도 이게 꺼져 있었다.
결론 : 그냥 Mac 의 iTerm2 앱에서 로컬 네트워크 접속 권한이 꺼진 상태였다.
Apple 메뉴 > 시스템 설정을 선택한 다음, 사이드바에서 개인정보 보호 및 보안을 클릭하십시오. (아래로 스크롤해야 할 수 있습니다.) 로컬 네트워크를 클릭하십시오. 목록의 각 앱에 대해 로컬 네트워크에 접근하는 기능을 켜거나 끄십시오.
https://support.apple.com/ko-kr/guide/mac-help/mchla4f49138/mac
@arkjunJuntai Park 아마 맨 처음 쓸 때 물어보는 창이 떴을 것 같은데, 실수로 허용 안 하는 쪽을 선택하셨을 수도…?
디지털 접근성에 관심 있는 분들이 계시려나...
구린 영어 실력에 LLM을 빌어서 일단은 혼자 하고 있지만...
예전처럼 평가 중심이 아닌 구현 방법 중심의 글을 좀 생산하고 싶다고...
일단 계획은 이런데... 같이 할 사람 있으면 좋겠다고 생각합니다아아...
@hongminhee洪 民憙 (Hong Minhee)
@kodingwarriorJaeyeol Lee 기본값의 웃는 표정 😊 우는 표정 😢은 어떨까요.
@arkjunJuntai Park
@kodingwarriorJaeyeol Lee 우는 표정은 별 고민 없이 넣었어요. 웃는 표정은… 😊로 할 지 😂로 할 지 고민 좀 해보겠습니다.
In addition to Date, which has millisecond precision, I hope that Drizzle ORM also supports Temporal.Instant, which has nanosecond precision. 😢
@hongminhee洪 民憙 (Hong Minhee) 앗. 많이 사용하는 편인데, 그렇게 비춰질 수도 있겠군요. 🤔
@arkjunJuntai Park 저도 그렇게는 생각해 본 적 없는데,
@kodingwarriorJaeyeol Lee 님 말씀으로는 Facebook에서 그렇게 쓰이는 문화가 있다고 합니다.
@hongminhee洪 民憙 (Hong Minhee) 리액션에 웃는 표현과 우는 표현은 있었으면 좋겠다는 개인적인 작은 바램은 있습니다. 😂
@arkjunJuntai Park 😂가 비웃는 표정 같다는 의견도 있어서 좀 고민이긴 합니다.
@hongminhee@hackers.pub洪 民憙 (Hong Minhee) 버그질라의 경우 이렇게 되어 있는데 저기서 😭의 부재를 많이 느꼈습니다
@saschanazKAGAMI🏳️🌈🏳️⚧️ 오… 의견 감사합니다!
@hongminhee洪 民憙 (Hong Minhee)
@curry박준규 유료인가요? 설치형인가요?
@akastoot악하
@curry박준규 무료입니다! 설치형…? 설치형이라고 해야 하려나요? cloudflared를 설치해야 합니다.
Hackers' Pub에 리액션 기능 만들고 있는데, 선택 가능한 에모지 세트를 이 정도로 대충 정해봤습니다. 더하거나 뺄 게 있을까요? 그리고 5 종류인 게 많다고 보시나요 적다고 보시나요?
@hongminhee洪 民憙 (Hong Minhee)
@lionhairdino 오늘도 빛의 속도로 개발하시는군요! ‘빛의 개발자’라고 부르겠습니다. 갑자기 궁금해졌는데 일본에서는 소프트웨어 개발자를 뭐라고 부르나요? 開発者라고 하려나요? 만약 맞다면 당신은 光の開発者!(아무말)
@curry박준규
@lionhairdino 개발자라고도 많이 하는데 SE라고도 많이
하는 것 같더라고요.
@lionhairdino 네, 이슈로 만들어 주시면 더 감사할 것 같아요!
@lionhairdino 근데, 이미 고쳤습니다. ANSI 구문 강조 테스트:
┌ Welcome to VitePress!
│
◇ Where should VitePress initialize the config?
│ ./docs
│
◇ Site title:
│ My Awesome Project
│
◇ Site description:
│ A VitePress Site
│
◆ Theme:
│ ● Default Theme (Out of the box, good-looking docs)
│ ○ Default Theme + Customization
│ ○ Custom Theme
└
연합우주 계정의 이전에 관한 규격인 FEP-7628를 구현하고 있습니다. 아직 Hackers' Pub 계정을 다른 계정으로 이전하거나, 다른 계정을 Hackers' Pub 계정으로 이전하는 기능은 구현되지 않았지만, 그 밑작업으로서 FEP-7628을 이미 구현한 Mastodon, Misskey, Pleroma 등의 계정끼리 서로 이전한 것을 반영하는 기능은 구현되었습니다. 예를 들어, 제 옛날 계정 중 하나인
@hongminhee洪 民憙 (Hong Minhee) 계정을 보면 첨부한 캡처 화면처럼 계정의 이전 안내가 표시되게 됩니다.
@hongminhee洪 民憙 (Hong Minhee) 문득, 바쁘게 개발하시는데, 서비스 성패에 직결되는 요소는 아니니 후순위로 미뤄두는 게 맞겠습니다. 이런 리포트는 다른 것에 살짝 묻혀있도록 소스 리포를 이용하도록 하겠습니다.
@lionhairdino 네, 이슈로 만들어 주시면 더 감사할 것 같아요!
@hongminhee洪 民憙 (Hong Minhee)
@akastoot악하 홈 서버의 아이피 주소가 바뀌면 어떻게 하시나요? DDNS 같은 게 있나요?
@curry박준규
@akastoot악하 Cloudflare Tunnel을 쓰고 있어요!
@hongminhee洪 民憙 (Hong Minhee) 네. 어차피 직장 못 구해서 한달 이상 집에 혼자 있을테니까요... 그동안 홈서버라도 가지고 놀려구요..
@akastoot악하 저는 Mac mini M4 가장 기본 깡통 모델을 홈 서버로 쓰고 있는데 대체로 만족중입니다.
@hongminhee洪 民憙 (Hong Minhee) 엇, 어제까지만 해도 마크다운 코드블록 ANSI가 먹었는데요. 오늘 색을 일부 수정하니, 미리보기, 퍼블리싱된 글 모두 ANSI 지원이 사라졌습니다. 관련 라이브러리 업데이트나, 영향주는 뭔가가 있었나 봅니다. 꼭 필요한 건 아닌데, 됐던 게 안되게 바뀌어 리포트합니다.
@lionhairdino 아… 어제 구문 강조 라이브러리인 Shiki의 버전을 올렸는데, 그것과 관련이 있을 것 같네요. 한 번 확인해 보도록 하겠습니다. ANSI 지원이라고 하면 이것 말씀이시겠죠?
생일 선물 받았다!
@bin_bash_shell이수호 오 생신 축하드립니다!
@hongminhee洪 民憙 (Hong Minhee) 하하! 봐도 모르겠네요⋯
@curry박준규 언어 설정에 “타임라인에서 내가 모르는 언어로 된 콘텐츠 숨기기”라는 옵션이 생겼답니다. ㅋㅋㅋ
@lionhairdino 틀렸습니다!
@hongminhee洪 民憙 (Hong Minhee) 커밋 로그 보고 와도 되나요?
@curry박준규 보고 오셔도 됩니다. ㅋㅋㅋ
오늘은 시간이 없어서 큰 작업은 못 하고, 그냥 아주 소소한 업데이트 하나 했습니다. 과연 뭐가 바뀌었을까요? (참고로 UI로도 드러나는 변화입니다.)
슬슬 탈출 준비를 하면서 서버를 알아보는데, N100 미니 PC도 종류가 많고 제조사마다 가격이 천차만별이네... 그냥 비싼거 살까
@akastoot악하 홈 서버 생각하고 계신 건가요?
하지만 이식성을 위해서 짧은 옵션을 사용해야만 할 때도 있다. BSD 계열의 커맨드 구현들은 보통 긴 옵션을 아예 제공 안 하기 때문에… 😭
당장 macOS에 내장된 커맨드들만 해도 그렇다.
하지만 이식성을 위해서 짧은 옵션을 사용해야만 할 때도 있다. BSD 계열의 커맨드 구현들은 보통 긴 옵션을 아예 제공 안 하기 때문에… 😭
보통은 Ruby 코드를 작성할때 irb 같은 대화형 인터페이스를 사용하는 것이 일반적이지만, Bash 스크립트와 섞어서 사용할때 one-liner 스크립트를 작성하면 더욱 빛을 발휘합니다. 여기서 one-liner 스크립트란 한줄짜리로 실행하는 스크립트라고 이해하면 됩니다. ruby one-liner 스크립트로 작성할때는 다음과 같이 시작합니다.
$ ruby -e "<expression>"
여기서 -e 옵션은 one-liner 스크립트의 필수요소인데, 파라미터로 넘겨준 한줄짜리 Ruby 코드를 evaluation해주는 역할을 합니다. 여러분이 **파이프 연산자**에 대한 개념을 이해하고 있다면, 이런 트릭도 사용할 수 있습니다.
$ echo "5" | ruby -e "gets.to_i.times |t| \{ puts 'hello world' \}"
# =>
# hello world
# hello world
# hello world
# hello world
# hello world
표준라이브러리를 사용하고 싶을때는 -r 옵션을 사용할 수도 있습니다. 이 옵션은 ruby에서 require를 의미하는데, 식을 평가하기전에 require문을 미리 선언하고 들어가는 것이라 이해하면 됩니다.
예를 들면, 이런 것도 가능합니다 .
$ echo "9" | ruby -rmath -e "puts Math.sqrt(gets.to_i)"
# => 3.0
위의 스크립트는 아래와 동일합니다.
$ echo "9" | ruby -e "require 'math'; puts Math.sqrt(gets.to_i)"
# => 3.0
이런 원리를 이용하면, JSON/XML/CSV/YAML 등의 포맷으로 출력되는 데이터를 어렵지 않게 처리할 수 있습니다. one-liner 스크립트를 작성하는 방법에 대해 자세히 알아가고 싶다면, https://learnbyexample.github.io/learn_ruby_oneliners/one-liner-introduction.html 여기를 참고해주시면 좋을 것 같습니다.
이에 관해서, 25분-30분 정도 분량의 글을 정리해서 올릴 것 같은데 커밍쑨.....
CLI 도구를 조합해서 커맨드 작성할때, (일회성이라면 모르겠지만) 자주 사용하는 스크립트라면 짧은 옵션보다 긴 옵션을 사용하는 것이 좋습니다. 풀 네임으로 커맨드라인 명령어를 작성하는 것이 어떻게 보면 문서화의 역할도 하기 때문입니다. 다른 프로그램에서 시스템 콜을 호출해서 사용하는 유즈케이스라면 더더욱 가독성을 높이는 효과가 있습니다.
어떤 CLI 도구는 man 커맨드로 문서를 봤을때 양이 어마어마하고 어렵게 느껴질 수 있습니다. 하지만, 위에서 언급한 것처럼 full name으로 작성한 스니펫들을 모아놓으면 그렇게 어렵지도 않고 각 도구의 역할을 명확하게 이해할 수 있고, 결과적으로는 장기적인 기억으로 남을 수 있습니다. git, curl, aws-cli, jq, gh 어떤 CLI 도구이던간에 모든 옵션을 하나하나 기억하려고 할 필요도 없습니다. 필요하면 그때그때 full name으로 명시된 옵션으로 스크립트를 짜놓고 모아두면 됩니다.
https://matklad.github.io/2025/03/21/use-long-options-in-scripts.html
https://newsletter.posthog.com/p/50-things-weve-learned-about-building
PostHog가 성공적인 제품을 만들면서 깨달은 50가지 교훈 (뉴스레터에서 지금까지 발행해놓은 것들 오마카세처럼 모아놓음)
그 중에서 마음에 드는 것들을 몇개 뽑아보자면...
- 신뢰는 투명성에서 온다. Build in Public 같은 것이 도움이 될 수 있음
- 시장에 내놓지 않으면 검증 조차 할 수 없음. 일단 시장에 내놓고 반응을 살펴볼 것
- 개밥먹기를 통해서 고객에게 전달되기 전에 문제점을 빠르게 인식하고 개선할 수 있는 흐름을 만들 것
洪 民憙 (Hong Minhee) shared the below article:
mkDerivation 인자로 함수를 넘기는 이유
lionhairdino @lionhairdino@hackers.pub
NixOS.kr 디스코드에 올렸는데, 다른 분들의 의견을 들어보려고 해커스펍에도 올립니다. 닉스 경험이 많지 않은 사람의 글이니, 정확하지 않을 수 있습니다. 틀린 곳이 있으면 바로 알려주세요.
※ 닉스를 처음 접하는 분들이나, 닉스로 실용적인 업무를 하시는데 문제가 없는 분들한테는 적당한 글은 아닙니다. 서두에 읽으면 도움이 될만한 분들을 추려서 알려 드리려고 하니, 의외로 필요한 분들이 없겠습니다. 실무자들은 이렇게까지 파고들며 알 필요 없고, 닉스 개발자들이야 당연히 아는 내용일테고, 입문자 분들도 역시 이런 내용으로 어렵다는 인식을 갖고 시작할 필요는 없으니까요. 그럼 남은 건 하나네요. mkDerivation 동작을 이미 아는 분들의 킬링 타임용이 되겠습니다.
외국어를 익힐 때, 문법없이 실전과 부딪히며 배우는 방법이 더 좋기는 한데, 가끔은 문법을 따로 보기 전엔 넘기 힘든 것들이 있습니다. 닉스란 외국어를 익히는데도 실제 설정 파일을 많이 보는 것이 우선이지만, 가끔 "문법"을 짚고 넘어가면 도움이 되는 것들이 있습니다.
닉스 알약 (제목이 재밌네요. 알약) 글을 보면 mkDerivation이 속성 집합을 받아, 거기에 stdenv 등 기본적인 것을 추가한 속성 집합을 만들어 derivaition 함수에 넘기는 간단한 래핑 함수임을 직관적으로 잘 설명하고 있습니다.
그런데, 실제 사용 예시들을 만나면, mkDerivation에 속성 집합을 넘기지 않고, attr: {...} 형태의 함수를 넘기는 경우를 더 자주 만납니다. 그래서, 왜 그러는지 실제 구현 코드를 보고 이유를 찾아 봤습니다.
mkDerivation =
fnOrAttrs:
if builtins.isFunction fnOrAttrs then
makeDerivationExtensible fnOrAttrs
else
makeDerivationExtensibleConst fnOrAttrs;
mkDerivation의 정의를 보면 인자로 함수를 받았느냐 아니냐에 따른 동작을 분기합니다. 단순히, stdenv에서 가져온 속성들을 추가한다면, 함수를 인자로 받지 않아도 속성 집합을 병합해주는 //의 동작만 있어도 충분합니다.
{ a = 1; } // { b = stdenv.XXX; }
하지만, 함수로 받는 이유를 찾으면, 코드가 단순하지 않습니다. 아래는 함수를 받을 때 동작하는 실제 구현 일부를 가져 왔습니다.
makeDerivationExtensible =
rattrs:
let
args = rattrs (args // { inherit finalPackage overrideAttrs; });
...
전체를 보기 전에 일단 args에서부터 머리가 좀 복잡해집니다. args가 args를 재귀 참조하고 있습니다. 보통 rattrs 매개 변수로는 아래와 같은 함수들이 들어 옵니다.
stdenv.mkDerivation (finalAttrs: {
pname = "timed";
version = "3.6.23";
...
tag = finalAttrs.version;
}
(와, 해커스펍은 코드 블록에 ANSI가 먹습니다! 지원하는 곳들이 드문데요.)
코드를 바로 분석하기 전에, 닉스의 재귀 동작을 먼저 보면 좋습니다.
재귀 생각 스트레칭
nix-repl> let r = {a = 1; b = a;}; in r error: undefined variable 'a'위 동작은 오류지만, 아래처럼
rec를 넣어주면 가능합니다.nix-repl> let r = rec {a = 1; b = a;}; in r { a = 1; b = 1; }※
rec동작은 Lazy 언어의fix로 재귀를 구현하는 동작입니다. ※ 참고 Fix 함수
rec를 써서 속성 안에 정의 중인 속성에 접근할 수 있습니다. 그런데, 아래 같이 속성을r.a로 접근하면,rec없이도 가능해집니다.nix-repl> let r = {a = 1; b = r.a;}; in r { a = 1; b = 1; }닉스 언어의 Lazy한 특성 때문에 가능합니다.
이제, 원래 문제와 비슷한 모양으로 넘어가 보겠습니다. 아래같은 형태로 바로 자기 자신에 재귀적으로 접근하면 무한 재귀 에러가 나지만,
nix-repl> let x = x + 1; in x
error: infinite recursion encountered
아래처럼 람다 함수에 인자로 넘기면 얘기가 달라집니다.
nix-repl> let args = (attr: {c = 1; b = attr.a + attr.c + 1;}) (args // { a = 1; }); in args
{ b = 3; c = 1; }
여기서 속성b의 정의 동작이 중요합니다. 위 내용을 nix-instantiate로 평가하면,
nix-instantiate --eval -E 'let args = (attr: {c = 1; b = attr.a + attr.c + 1;}) (args // { a = 1; }); in args'
{ b = <CODE>; c = 1; }
--eval 옵션은 WHNF까지만 평가합니다. <CODE>는 하스켈 문서에서 나오는 <thunk>와 같은, 평가가 아직 이루어지지 않은 상태를 뜻합니다. ※ Nix Evaluation Performance
b는 아직 평가가 되지 않았으니, 에러가 나지 않고, b가 필요한 순간에는 attr.a가 뭔지 알 수 있는 때가 됩니다.
attr:
{ c = 1;
b = attr.a + attr.c + 1;
}
속성 b는 아직 알 수 없는, 미래의 attr에 있는 a를 받아 써먹고,
원래는 rec없이 접근하지 못했던, c에도 attr.c로 접근이 가능합니다. (attr.c은 현재 정의하고 있는 속성셋의 c가 아니라, 매개 변수 attr로 들어온 속성셋의 c입니다.)
원래 문제로 다시 설명하면, mkDerivation에 넘기고 있는, 사용자 함수 finalAttrs: { ... }에서,
닉스 시스템이 넣어주는 stdenv 값 같은 것들과 사용자 함수내의 속성들을 섞어서 속성 정의를 할 수 있다는 얘기입니다. 아래처럼 말입니다.
tag = finalAttrs.version;
뭐하러, 이런 복잡한 개념을 쓰는가 하면, 단순히 속성 추가가 아니라, 기존 속성이 앞으로 추가 될 속성을 기반으로 정의되어야 할 때는 이렇게 해야만 합니다. 함수형 언어에선 자주 보이는, 미래값을 가져다 쓰는 재귀 패턴인데, 저는 아직 그리 익숙하진 않습니다.
@hongminhee洪 民憙 (Hong Minhee) 아항 그렇군요. 근데 제가 대화양을 컨텍스트 윈도에 잘 대응을 못시키겠네요. 정말 다른 모델은 컨텍스트 윈도가 이미 꽉찼을만큼 대화가 긴건 아니었다고 생각햇는데요. 이것도 토큰수를 직접 세보기 전엔 모르겠네요.
@bglbgl gwyng 아, 에이전트 코딩을 생각했는데 그냥 대화만 할 때는 또 다르겠네요.
프론트엔드 개발자분들 위주로 페디버스로 영입을 많이 해보고 싶다. 포트폴리오로 개발할만한 것이 지천에 널려있는데...!!
- 인스타그램 클론코딩 : PixelFed 클라이언트 개발에 적용하기
- 트위터 클론코딩 : 마스토돈 클라이언트 개발할때 적용하기
- 나만의 블로그 만들기 : 이건.... 해커스펍이 그 역할을 하겠지...?
Hackers' Pub이 검색엔진에도 잘 노출되게 할겸, 짤막짤막하게 Vim에 대한 정보글을 트위터에 남겼던걸 여기도 남겨야겠다.
해커스펍에서 리액션 다음으로 지원되는기능은 블락일까 아니면 해시태그일까

![export const REACTION_EMOJIS: readonly string[] = [
"❤️",
"🎉",
"😂",
"😲",
"🤔",
"😢",
"👀",
];
export type ReactionEmoji = (typeof REACTION_EMOJIS)[number];](https://media.hackers.pub/note-media/c0c35e4d-7eb0-41e6-a6c4-2bd5307009bc.webp)


![const REACTION_EMOJIS = ["❤️", "😕", "😮", "🤔", "👀"];
const DEFAULT_REACTION_EMOJI = REACTION_EMOJIS[0];](https://media.hackers.pub/note-media/3a08db66-8f71-4a43-adcf-b4b8edb1d61c.webp)





