본문 바로가기
C.W.K.
Lesson 04 of 08 · published

화면보다 저널이 먼저야

~12 min · journal, replay, retention, sequencing, daemon

Level 0불씨
0 XP0/48 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete

라이브는 구독자지 저장소가 아니야

두고 나가는 터미널은, 없는 동안 무슨 일이 있었는지를 기억해야 해. 순진한 설계는 바이트를 화면에 쓰고 화면이 그대로이길 바라. 그건 저장소인 척하는 투영이야. Smolder 는 출력을 먼저 한도 있는 저널에 순서 붙이고, 붙어 있는 쪽에 발행해. 저널이 순서 있는 기록이야. 화면은 구독자야. 그걸 뒤집으면 창의 충돌이 이력의 구멍이 되고, 다시 붙는 폰은 따라잡을 정직한 게 없어.

한도는 성능 주석이 아니야. 한도 없는 저널은, 데몬이 안전하게 지킬 수 있는 크기를 넘을 때까지 자라는 디스크야. 한도(남는 출력의 고리, 오래된 덩어리는 버려짐)가 주인을 다시 켤 수 있게 하는 방법이야. 소유했다고 무한 스크롤백이 따라오지 않아. 프로세스가 최근에 내보낸 것의 진실한 접두를 얻고, 그게 접두라는 걸 아는 거야.

저장이 실패해도 라이브는 죽이면 안 돼

저널이 못 쓸 수 있어. 디스크가 차고, 권한이 없고, 볼륨이 사라질 때. 그래도 붙어 있는 투영에는 라이브 출력이 가야 해. 보존이 떨어져. 불은 안 떨어져. 파일에 못 적는다고 인쇄를 거부하는 데몬은, 장부와 일을 혼동한 데몬이야. 보존이 떨어졌다는 건 보여야 해. 로그 파일이 싸운다고 판이 멈추면 안 돼.

그 갈라짐은 첫 레슨의 소유 갈라짐을 바이트에 적용한 거야. 프로세스는 살아 있어. 그리는 면은 없을 수 있어. 저장소는 절뚝일 수 있어. 스트림을 끝내도 되는 건 프로세스의 죽음뿐이야. 나머지는 구독자의 나쁜 날이고, 구독자의 나쁜 날은 살해가 아니야.

재생은 다시 돌리는 게 아니야

투영이 붙으면 주인은 먼저 경계를 정해. 이 순서 번호까지는 이력이고, 그 뒤는 라이브야. 그다음 경계까지 남아 있는 출력을 에뮬레이터에 재생해서 화면이 빈칸이 아니라 머물 곳처럼 보이게 하고, 그 뒤에야 경계 다음의 라이브 바이트를 순서대로 이어 붙여. 두 번 발행되는 것도, 틈에 빠지는 것도 없어. 재생은 부작용을 눌러. 자식에게 바이트를 다시 보내지 않아. 방금 일어난 것처럼 벨을 다시 울리지 않아. 명령을 다시 돌리지 않아. 이력을 칠해. 프로세스에 말을 거는 재생은 프롬프트를 복제하거나, 더 나쁘면 제출을 복제하는 길이야.

불완전한 접두는 절대 화면으로 칠하지 않아. 남은 게 충분히 거슬러 올라가지 못하면, 그러니까 화면이 줄 중간에서, TUI 프레임 중간에서, 이제는 없는 clear 뒤에서 시작하게 되면, Smolder 는 그 바이트를 에뮬레이터에 넣고 따라잡았다고 하지 않아. 화면 재생을 건너뛰고, 살아 있는 프로세스는 그대로 두고, 남은 출력을 읽을 수 있는 평범한 텍스트로 내줘. 맥에서는 판이 한 줄로 그렇다고 말하고, Shell → Show Recovered Output… 에 그 텍스트를 두고, Control-L 같은 프로그램의 다시 그리기 키를 권해. 잘린 고리 위에 "따라잡음"이라고 도는 스피너는, 한 번도 온전하지 않았던 화면을 믿게 만드는 길이야. 따라잡음은 "아직 가진 게 이거야"를 있는 그대로 보여 주는 거야.

저널에 순서 붙이고, 화면에 발행해. 저장이 절뚝여도 라이브는 이어져. 재생은 칠하지, 되받아 말하지 않아. 불완전한 접두는 읽을 수 있는 텍스트가 되지, 가짜 화면이 되지 않아.

Code

바이트의 순서, 그리고 재생이 해도 되는 일·text
child PTY  -->  sequencer  -->  bounded journal  -->  attached projections
                     |
                     +-- if journal write fails: still publish live
                         mark retention degraded, do not freeze the pane

# Attach / reconnect
  1. attach: the owner answers "ready" and fixes a boundary sequence
  2. complete retained replay up to that boundary -> paint only
       prefix incomplete? -> NO screen replay; retained plain text, labeled,
                             plus a hint to press the program's redraw key
  3. live output after the boundary follows, in order
       (nothing before it published twice, nothing after it lost)
  4. never tell the child that replay happened

# Replay must suppress
  bells, title-as-event, bracketed-paste replies,
  anything that would look like input or a fresh side effect

# Honest catch-up
  complete prefix   =>  the screen, repainted (still only what is retained)
  incomplete prefix =>  "retained plain output", never a fake screen

External links

Exercise

십 분 떠나 있다 투영이 붙을 때 반드시 일어나야 하는 일 셋, 일어나면 안 되는 일 셋을 적어. "안 되는 일" 중 하나는 부작용(벨, 제목, 입력)이어야 해. "되어야 하는 일" 중 하나는 남은 접두가 불완전할 때 뭐라고 말하는지를 이름 붙여야 해.
Hint
"되어야 하는 일"에 자식에게 말하기가 있으면, 재생이랑 다시 실행을 혼동한 거야. "안 되는 일"에 운영자에게 할 말이 없으면, 잘린 고리랑 동기화를 혼동한 거야.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인 — 댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.