{"id":18297029,"url":"https://github.com/powergee/judge-server-communication-layer","last_synced_at":"2025-04-09T08:46:30.363Z","repository":{"id":119119477,"uuid":"326472991","full_name":"powergee/judge-server-communication-layer","owner":"powergee","description":"CLI to communicate with dmoj/judge-server","archived":false,"fork":false,"pushed_at":"2021-01-24T10:53:23.000Z","size":7,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2023-03-06T21:00:18.823Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/powergee.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-01-03T18:21:56.000Z","updated_at":"2024-06-19T09:10:44.190Z","dependencies_parsed_at":"2023-05-31T02:30:20.149Z","dependency_job_id":null,"html_url":"https://github.com/powergee/judge-server-communication-layer","commit_stats":null,"previous_names":[],"tags_count":0,"template":null,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/powergee%2Fjudge-server-communication-layer","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/powergee%2Fjudge-server-communication-layer/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/powergee%2Fjudge-server-communication-layer/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/powergee%2Fjudge-server-communication-layer/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/powergee","download_url":"https://codeload.github.com/powergee/judge-server-communication-layer/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248008615,"owners_count":21032554,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-05T14:46:27.233Z","updated_at":"2025-04-09T08:46:30.348Z","avatar_url":"https://github.com/powergee.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# judge-server-communication-layer\n\nDMOJ의 judge-server와 Golang으로 통신하기 위한 테스트용 리포지토리입니다.\n\njudge-server 프로세스에 Ping을 전송하거나, 채점을 명령하거나, 현재 채점 현황을 얻는 등의 작업을 할 수 있습니다.\n\n# judge-server 실행 및 통신 방법\n\n*아래의 과정은 https://docs.dmoj.ca/#/judge/setting_up_a_judge?id=judge-side-setup 의 내용을 참조하여 작성하였습니다.*\n\njudge-server는 윈도우를 지원하지 않고 리눅스 상에서 동작하므로, 아래 과정은 리눅스에서 실행하시거나, 윈도우의 WSL 상에서 실행하셔야 합니다.\n\n## judge-server 설정 파일 만들기\n\njudge-server를 설치 및 실행하기에 앞서, 특정 디렉토리에 judge-server의 세부 설정을 담고 있는 yml 파일을 만들고, 같은 디렉토리에 채점할 문제의 입출력 파일을 준비해야 합니다. **이 문서에서는 `/problems/judge.yml` 파일에 세부 설정을 작성하고, `/problems` 디렉토리에 각 문제들의 입출력 파일을 만드는 것으로 하겠습니다.**\n\n### 1. judge.yml 파일 만들기\n\n`judge.yml` 파일은 judge-server의 세부 설정을 담고 있는 파일로, 아래와 같은 정보를 담고 있습니다.\n\n1. `id`: 채점기의 ID\n2. `key` 채점기의 인증용 키 (단, 이 정보는 이 프로젝트에서는 활용하지 않으므로 임의로 작성하셔도 됩니다.)\n3. `problem_storage_root`: 각 문제의 입출력 데이터를 저장하고 있는 디렉토리 경로\n\n예를 들어, `/problems/judge.yml`의 내용을 아래와 같이 작성할 수 있습니다.\n\n```yml\nid: TestJudge\nkey: key_for_testing\nproblem_storage_root:\n  - /problems\n```\n\n### 2. 채점할 문제들의 입출력 데이터 추가\n\n각 문제들의 입출력 데이터는 위에서 설정한 `problem_storage_root` 경로(이 문서의 예시에서는 `/problems` 폴더) 아래에 저장해야 합니다. 저장 형식은 아래와 같습니다.\n\n예를 들어, [이 문제의](https://dmoj.ca/problem/aplusb) 문제 데이터를 \"aplusb\"라는 문제 ID로 저장하고 싶다고 가정 하겠습니다. 문제 ID가 \"aplusb\"인 문제의 입출력 데이터를 저장하려면, `/problems/aplusb` 디렉토리를 만들고, 그 안에 아래와 같은 파일들을 작성해야 합니다.\n\n1. `{입출력 데이터 번호}.in`: 입력 데이터를 나타냅니다.\n    - `1.in`의 내용을 아래와 같이 작성할 수 있습니다.\n    ```\n    2\n    1 1\n    -1 0\n    ```\n2. `{입출력 데이터 번호}.out`: 출력 데이터를 나타냅니다.\n    - `1.out`의 내용을 아래와 같이 작성할 수 있습니다.\n    ```\n    2\n    -1\n    ```\n3. `init.yml`: 테스트케이스 목록을 정의합니다.\n    - `1.in`, `1.out`, `2.in`, `2.out`와 같은 입출력 데이터가 있다면, `init.yml` 파일의 내용은 아래와 같습니다.\n    ```yml\n    test_cases:\n    - {in: 1.in, out: 1.out, points: 0}\n    - {in: 2.in, out: 2.out, points: 0}\n    ```\n    - 모든 `points` 값을 0으로 설정하면, 채점 도중 단 하나의 테스트 케이스에서라도 오답이 생기면 즉시 채점을 중단하게 됩니다. 반면에 `points` 값이 0이 아닌 값으로 설정되어있다면 하나가 틀리더라도 모든 테스트 케이스를 채점합니다.\n\n## judge-server 실행\n\n실행 방법에는 Docker로 실행하는 방법과 Python 3의 `pip`를 통해 실행하는 방법이 있는데, 여기에서는 Docker로 실행하는 방법을 소개하겠습니다. `pip`로 실행하는 방법은 다음 링크를 참고해주시기 바랍니다.\n\n- https://docs.dmoj.ca/#/judge/setting_up_a_judge?id=judge-side-setup\n\n### Docker 설치\n\n실행 환경에 맞게 Docker를 설치해주세요.\n\n- Ubuntu: https://docs.docker.com/engine/install/ubuntu/\n- WSL 2: https://docs.microsoft.com/ko-kr/windows/wsl/tutorials/wsl-containers\n\n### make 설치\n\n`make` 명령 실행을 위해 `sudo apt install gcc make` 를 실행해주세요.\n\n### Docker 컨테이너 빌드\n\njudge-server 리포지토리를 clone 하여 컨테이너를 빌드해야 합니다.\n\n```bash\ngit clone --recursive https://github.com/DMOJ/judge.git\ncd judge/.docker\nsudo make judge-tier1\n```\n\n이 예시에서는 `judge-tier1`을 빌드하고 있는데, tier 1은 tier 1, 2, 3 중 가장 지원하는 언어 수가 적은 컨테이너입니다. 만약 더 많은 언어를 채점하려면 `judge-tier2`, `judge-tier3`를 고려해야 합니다. 지원하는 언어의 구체적인 목록은 아래 Dockerfile에서 확인할 수 있습니다.\n\n- judge-tier1: https://github.com/DMOJ/runtimes-docker/blob/master/tier1/Dockerfile\n- judge-tier2: https://github.com/DMOJ/runtimes-docker/blob/master/tier2/Dockerfile\n- judge-tier3: https://github.com/DMOJ/runtimes-docker/blob/master/tier3/Dockerfile\n\n## judge-server-communication-layer 실행\n\n통신 레이어를 먼저 실행합니다.\n\n```\ngo run main.go\n```\n\n이렇게 하면 `Listening:9999...` 라는 메세지와 함께 9999번 포트에서 judge-server가 연결할 때까지 블록되게 됩니다.\n\n## judge-server 컨테이너 실행\n\n위에서 빌드한 Docker 컨테이너를 실행합니다.\n\n```\nsudo docker run \\\n    --name judge_name \\\n    --network host \\\n    -v /home/hyeon/problems:/problems \\\n    --cap-add=SYS_PTRACE \\\n    -d \\\n    --restart=always \\\n    dmoj/judge-tier1:latest \\\n    run -p \"9999\" -c /problems/judge.yml \"localhost\"\n```\n\n이렇게 실행하면 컨테이너가 `judge_name`이라는 이름으로 실행되고, 나중에 이 컨테이너를 종료하거나 삭제하거나 재시작해야 할 일이 있다면 `judge_name`이라는 이름으로 접근할 수 있습니다.\n\n정상적으로 실행되었다면 약 30초~1분 내에 judge-server-communication-layer와 연결되고, 통신 레이어를 실행하고 있는 표준 출력에 아래와 같은 내용이 나타납니다.\n\n```\nHandshaking is succeeded!\n\n1. ping\n2. get-current-submission\n3. submission-request\n4. terminate-submission\n5. disconnect\n```\n\n이제부터 judge-server를 직접 제어할 수 있습니다.","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpowergee%2Fjudge-server-communication-layer","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpowergee%2Fjudge-server-communication-layer","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpowergee%2Fjudge-server-communication-layer/lists"}