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

Yard와 저장소

~11 min · yard, 내용-주소-저장소, 제출물, 지속성

Level 0찬 쇠
0 XP0/36 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete

Yard와 저장소

참가한 세션은 저장소 아래 자기 몫의 yard에서 일해. yard에는 받은 과제서, 있을 경우 얼린 기준점, 그 단계의 재료, 마음대로 써도 되는 연습 공간, 그리고 반드시 있어야 하는 submission/ 폴더가 있어. 오래 남는 발굴 현장이지 심사 대상 그 자체는 아니고, 다른 참가자의 작업 공간은 더더욱 아니야.

자리가 완료를 표시하면 Anvil이 선언된 제출 나무를 훑어서, 비어 있거나 너무 큰 나무를 거절한 다음 파일마다 해시를 계산해 고유한 제출 번호 아래 보관해. 저장된 나무와 경로·해시·바이트 수 명세는 심사단 자리가 열리기 전에 바꿀 수 없는 심사 입력이 돼. 이게 심사 전에 보관한다는 규칙이야.

저장소는 똑같은 제출을 하나로 합치는 구조가 아니라 파일마다 내용으로 주소를 매겨. 내용이 똑같은 나무 둘도 제출 번호, 자리 기록, 보고서, 명세, 기록 줄기의 사건이 각각 달라. 다음 단계는 새 제출 항목과 나무를 만들고, 회차 지도의 단계와 자리 계보가 그 관계를 설명해.

yard와 저장소의 나무는 아빠가 회차를 명시적으로 지우기 전까지 함께 남아. 만료 시간도, 돌려쓰기도, 보관 기한이 지나 사라지는 경로도 없어. 한 달 뒤에도 저장소만으로 겨루기를 다시 세울 수 있고 yard에는 일한 흔적이 남아.

yard에서 일하고 보관된 나무를 심사해. 명세가 모든 심사위원이 받는 정확한 파일을 못박아.

Code

보관 경계 — 내용이 같아도 사건은 다르다·python
import hashlib


def archive_tree(submission_id, files):
    """파일마다 내용으로 주소를 매기고, 제출은 사건으로 센다."""
    if not files:
        raise ValueError("빈 제출 나무는 보관하지 않는다")
    manifest = [
        {"path": p,
         "sha256": hashlib.sha256(b).hexdigest(),
         "bytes": len(b)}
        for p, b in sorted(files.items())
    ]
    return {"submission_id": submission_id, "manifest": manifest}


tree = {"submission/fix.py": b"print(1)\n"}

first = archive_tree("s-01", tree)
second = archive_tree("s-02", tree)          # 바이트가 완전히 같은 나무

# 파일 주소는 같지만 제출 사건은 다르다 — 합쳐지지 않는다.
assert first["manifest"] == second["manifest"]
assert first["submission_id"] != second["submission_id"]
print(first["manifest"][0]["sha256"][:12], first["submission_id"],
      second["submission_id"])

External links

Exercise

파일 셋짜리 제출의 보관 명세를 쓰고, 나중 수정본이 바이트가 같아도 어떤 기록이 새로 생기는지 밝혀.
Hint
파일 해시가 겹쳐도 제출 사건과 나무는 고유하게 남아.

Progress

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

댓글 0

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

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