저널 ·
글 하나가 열세 페이지가 되기까지
ipe.rest 의 글은 한 번, 두 언어로 쓰이고, 나머지 열 언어는 그 옆의 작은 파일에서 옵니다. 그러면 스크립트 하나가 그 열한 개 파일로 열세 페이지를 만듭니다. 어떻게 되는지 적었습니다.
지난 글은 페이지가 나가기 전에 도는 테스트를 다뤘습니다. 이번 글은 그 앞 단계, 페이지가 만들어지는 과정입니다. 수치는 2026년 11월 10일에, 지금의 저장소와 11월 8일 글을 더한 커밋에서 쟀습니다. 이 글은 11월 9일 자이지만 이틀 동안 글이 없었던 뒤인 10일에 썼습니다. 그 사실을 숨기지 않으려 합니다.
손으로 쓰는 것
원고 파일 하나에 글의 영어와 한국어 본문이, 그리고 제목, 설명, 요약, 구조화 데이터가 들어 있습니다. 파일 열 개에는 독일어, 프랑스어, 스페인어, 포르투갈어, 러시아어, 아랍어, 힌디어, 일본어, 중국어, 인도네시아어로 제목, 머리글, 설명, 요약, 발췌, 본문이 들어 있습니다. 이 열 개는 기계가 쓴 초안이고, 그것으로 만든 페이지에는 그렇다고 적혀 있습니다. 그래서 글 하나에 파일이 열한 개입니다. 손으로 쓰는 저널 페이지는 없습니다.
스크립트가 만드는 것
journal_sync.py 라는 스크립트가 이 파일들을 읽고 나머지를 모두 씁니다. 글마다 언어별로 열두 페이지를 만들고, 그 자체의 언어가 없는 열세 번째 페이지를 하나 만듭니다. 이 페이지는 방문자를 전에 고른 언어, 또는 브라우저가 쓰는 언어로 보냅니다. 열두 개의 목록 페이지, RSS 피드, 사이트맵, llms.txt 도 다시 씁니다. 두 번째 스크립트 home_sync.py 는 열두 개 홈페이지에서 가장 새로운 글 세 개의 카드를 새로 고칩니다.
무엇이든 쓰기 전에 스크립트는 원고를 확인합니다. 대표 링크나 본문이 없는 글, 언어마다 머리글 하나씩이 아닌 글, 구조화 데이터가 깨졌거나 이미지가 없는 글, 서식의 채우지 않은 칸이 남은 글은 거부합니다.
글 하나의 크기
11월 8일 글을 더한 커밋은 파일 245개를 바꿨습니다. 우리가 쓴 것은 11개입니다. 하나는 서비스 워커 버전이라는 한 줄이었습니다. 나머지 233개는 만들어진 것입니다. 새 페이지 13개, 모든 페이지가 최신 글을 나열하기 때문에 대개 한두 줄만 바뀐 이전 저널 파일 206개, 그리고 열두 개의 홈페이지, 사이트맵, llms.txt 입니다.
그래서 만들어진 페이지는 절대 손으로 고치지 않습니다. 손으로 고친 것은 다음 실행에서 덮어써지고, 만들어진 파일이 하나라도 최신이 아니면 테스트가 실패합니다.
하지 못하는 것
열세 페이지를 만드는 스크립트는 글이 읽을 만한지, 기계 초안이 우리가 뜻한 바를 말하는지 알지 못합니다. 페이지들이 원고와, 그리고 서로와 맞는지만 확인합니다. 읽는 일은 사람에게 남습니다.
ipe(); // write once, generate the rest
원고 하나, 페이지 열세 개, 그리고 같은 줄을 두 번 치는 일은 없습니다. 무언가 바뀌어야 하면 원고를 고치고 스크립트를 다시 돌립니다.