├── .github_ └── workflows │ ├── create-ami.yml │ ├── create_base_ami.yml │ ├── go.yml │ ├── node.yml │ ├── perl.yml │ ├── php.yml │ ├── python.yml │ ├── ruby.yml │ └── rust.yml ├── .vscode └── settings.json ├── LICENSE ├── Makefile ├── README.md ├── bench ├── .gitignore ├── Dockerfile.dev ├── Dockerfile.prod ├── Makefile ├── assets │ ├── data │ │ └── .gitignore │ ├── load.go │ └── load_test.go ├── bin │ └── .gitignore ├── cmd │ └── bench │ │ ├── bench.go │ │ ├── benchmarker.go │ │ ├── id_ed25519.pub │ │ ├── main.go │ │ ├── reboot.go │ │ ├── s3.go │ │ ├── slack.go │ │ ├── sqs.go │ │ └── supervise.go ├── go.mod ├── go.sum ├── internal │ ├── attacker │ │ └── dns.go │ ├── bencherror │ │ ├── error.go │ │ └── message.go │ ├── benchscore │ │ ├── counter.go │ │ └── profit.go │ ├── config │ │ ├── benchmark.go │ │ ├── config.go │ │ ├── finalcheck.go │ │ ├── initialdata.go │ │ ├── pretest.go │ │ ├── reservation.go │ │ ├── supervise.go │ │ └── webapp.go │ ├── logger │ │ └── logger.go │ ├── pubsub │ │ ├── pubsub.go │ │ └── pubsub_test.go │ ├── resolver │ │ ├── dns.go │ │ └── native.go │ └── scheduler │ │ ├── commit_state.go │ │ ├── icon_scheduler.go │ │ ├── images │ │ ├── 1.jpg │ │ ├── 10.jpg │ │ ├── 100.jpg │ │ ├── 101.jpg │ │ ├── 102.jpg │ │ ├── 103.jpg │ │ ├── 104.jpg │ │ ├── 105.jpg │ │ ├── 106.jpg │ │ ├── 107.jpg │ │ ├── 108.jpg │ │ ├── 109.jpg │ │ ├── 11.jpg │ │ ├── 110.jpg │ │ ├── 111.jpg │ │ ├── 112.jpg │ │ ├── 113.jpg │ │ ├── 114.jpg │ │ ├── 115.jpg │ │ ├── 116.jpg │ │ ├── 117.jpg │ │ ├── 118.jpg │ │ ├── 119.jpg │ │ ├── 12.jpg │ │ ├── 120.jpg │ │ ├── 121.jpg │ │ ├── 122.jpg │ │ ├── 123.jpg │ │ ├── 124.jpg │ │ ├── 125.jpg │ │ ├── 126.jpg │ │ ├── 127.jpg │ │ ├── 128.jpg │ │ ├── 129.jpg │ │ ├── 13.jpg │ │ ├── 130.jpg │ │ ├── 131.jpg │ │ ├── 132.jpg │ │ ├── 133.jpg │ │ ├── 134.jpg │ │ ├── 135.jpg │ │ ├── 136.jpg │ │ ├── 137.jpg │ │ ├── 138.jpg │ │ ├── 139.jpg │ │ ├── 14.jpg │ │ ├── 140.jpg │ │ ├── 141.jpg │ │ ├── 142.jpg │ │ ├── 143.jpg │ │ ├── 144.jpg │ │ ├── 145.jpg │ │ ├── 146.jpg │ │ ├── 147.jpg │ │ ├── 148.jpg │ │ ├── 149.jpg │ │ ├── 15.jpg │ │ ├── 150.jpg │ │ ├── 151.jpg │ │ ├── 152.jpg │ │ ├── 153.jpg │ │ ├── 154.jpg │ │ ├── 155.jpg │ │ ├── 156.jpg │ │ ├── 157.jpg │ │ ├── 158.jpg │ │ ├── 159.jpg │ │ ├── 16.jpg │ │ ├── 160.jpg │ │ ├── 161.jpg │ │ ├── 162.jpg │ │ ├── 163.jpg │ │ ├── 164.jpg │ │ ├── 165.jpg │ │ ├── 166.jpg │ │ ├── 167.jpg │ │ ├── 168.jpg │ │ ├── 169.jpg │ │ ├── 17.jpg │ │ ├── 170.jpg │ │ ├── 171.jpg │ │ ├── 172.jpg │ │ ├── 173.jpg │ │ ├── 174.jpg │ │ ├── 175.jpg │ │ ├── 176.jpg │ │ ├── 177.jpg │ │ ├── 178.jpg │ │ ├── 179.jpg │ │ ├── 18.jpg │ │ ├── 180.jpg │ │ ├── 181.jpg │ │ ├── 182.jpg │ │ ├── 183.jpg │ │ ├── 184.jpg │ │ ├── 185.jpg │ │ ├── 186.jpg │ │ ├── 187.jpg │ │ ├── 188.jpg │ │ ├── 189.jpg │ │ ├── 19.jpg │ │ ├── 190.jpg │ │ ├── 2.jpg │ │ ├── 20.jpg │ │ ├── 21.jpg │ │ ├── 22.jpg │ │ ├── 23.jpg │ │ ├── 24.jpg │ │ ├── 25.jpg │ │ ├── 26.jpg │ │ ├── 27.jpg │ │ ├── 28.jpg │ │ ├── 29.jpg │ │ ├── 3.jpg │ │ ├── 30.jpg │ │ ├── 31.jpg │ │ ├── 32.jpg │ │ ├── 33.jpg │ │ ├── 34.jpg │ │ ├── 35.jpg │ │ ├── 36.jpg │ │ ├── 37.jpg │ │ ├── 38.jpg │ │ ├── 39.jpg │ │ ├── 4.jpg │ │ ├── 40.jpg │ │ ├── 41.jpg │ │ ├── 42.jpg │ │ ├── 43.jpg │ │ ├── 44.jpg │ │ ├── 45.jpg │ │ ├── 46.jpg │ │ ├── 47.jpg │ │ ├── 48.jpg │ │ ├── 49.jpg │ │ ├── 5.jpg │ │ ├── 50.jpg │ │ ├── 51.jpg │ │ ├── 52.jpg │ │ ├── 53.jpg │ │ ├── 54.jpg │ │ ├── 55.jpg │ │ ├── 56.jpg │ │ ├── 57.jpg │ │ ├── 58.jpg │ │ ├── 59.jpg │ │ ├── 6.jpg │ │ ├── 60.jpg │ │ ├── 61.jpg │ │ ├── 62.jpg │ │ ├── 63.jpg │ │ ├── 64.jpg │ │ ├── 65.jpg │ │ ├── 66.jpg │ │ ├── 67.jpg │ │ ├── 68.jpg │ │ ├── 69.jpg │ │ ├── 7.jpg │ │ ├── 70.jpg │ │ ├── 71.jpg │ │ ├── 72.jpg │ │ ├── 73.jpg │ │ ├── 74.jpg │ │ ├── 75.jpg │ │ ├── 76.jpg │ │ ├── 77.jpg │ │ ├── 78.jpg │ │ ├── 79.jpg │ │ ├── 8.jpg │ │ ├── 80.jpg │ │ ├── 81.jpg │ │ ├── 82.jpg │ │ ├── 83.jpg │ │ ├── 84.jpg │ │ ├── 85.jpg │ │ ├── 86.jpg │ │ ├── 87.jpg │ │ ├── 88.jpg │ │ ├── 89.jpg │ │ ├── 9.jpg │ │ ├── 90.jpg │ │ ├── 91.jpg │ │ ├── 92.jpg │ │ ├── 93.jpg │ │ ├── 94.jpg │ │ ├── 95.jpg │ │ ├── 96.jpg │ │ ├── 97.jpg │ │ ├── 98.jpg │ │ └── 99.jpg │ │ ├── initial.go │ │ ├── initial_livecomment_pool.go │ │ ├── initial_ngword_pool.go │ │ ├── initial_reaction_pool.go │ │ ├── interval_temperature.go │ │ ├── interval_temperature_test.go │ │ ├── livecomment_pool.go │ │ ├── livecomment_scheduler.go │ │ ├── livestream_tags_pool.go │ │ ├── livestreams_pool.go │ │ ├── reaction_pool.go │ │ ├── reservation.go │ │ ├── reservation_pool.go │ │ ├── reservation_scheduler.go │ │ ├── reservation_scheduler_test.go │ │ ├── reservation_test.go │ │ ├── stats_scheduler.go │ │ ├── stats_scheduler_test.go │ │ ├── tag_pool.go │ │ ├── user_pool.go │ │ └── user_scheduler.go ├── isupipe │ ├── agent_option.go │ ├── client.go │ ├── client_initialize.go │ ├── client_livecomment.go │ ├── client_livecomment_test.go │ ├── client_livestream.go │ ├── client_livestream_test.go │ ├── client_options.go │ ├── client_payment.go │ ├── client_payment_test.go │ ├── client_reaction.go │ ├── client_reaction_test.go │ ├── client_stats.go │ ├── client_stats_test.go │ ├── client_test.go │ ├── client_top.go │ ├── client_user.go │ ├── client_user_test.go │ ├── main_test.go │ ├── pool.go │ └── validate_response.go └── scenario │ ├── attacker.go │ ├── core_finalcheck.go │ ├── core_pretest.go │ ├── core_pretest_abnormal.go │ ├── core_pretest_calc.go │ ├── core_pretest_dnsrecord.go │ ├── core_pretest_initial.go │ ├── core_pretest_normal.go │ ├── streamer.go │ ├── testdata │ └── NoImage.jpg │ ├── viewer.go │ └── visit_page.go ├── development ├── Makefile ├── docker-compose-common.yml ├── docker-compose-go.yml ├── docker-compose-node.yml ├── docker-compose-perl.yml ├── docker-compose-php.yml ├── docker-compose-python.yml ├── docker-compose-ruby.yml ├── docker-compose-rust.yml ├── etc │ └── nginx │ │ └── conf.d │ │ └── nginx.conf ├── pdns │ └── 20_powerdns_schema.sql └── php │ ├── etc │ └── nginx │ │ └── conf.d │ │ └── nginx.conf │ └── usr │ └── local │ └── etc │ └── php-fpm.d │ └── zz-docker.conf ├── docs ├── cautionary_note.md ├── isupipe.md ├── isupipe.yaml ├── specification.md └── transplant.md ├── envcheck ├── .gitignore ├── Makefile ├── aws.go ├── check.go ├── checker.go ├── data.go ├── go.mod ├── go.sum ├── main.go └── portal.go ├── frontend ├── .eslintrc.yml ├── .gitattributes ├── .gitignore ├── .prettierignore ├── .prettierrc.json ├── .vscode │ └── settings.json ├── .yarnrc.yml ├── Makefile ├── README.md ├── index.html ├── package.json ├── scripts │ └── openapi │ │ ├── generate-api-client.ts │ │ ├── package.json │ │ └── tsconfig.build.json ├── src │ ├── @types │ │ └── global.d.ts │ ├── App.tsx │ ├── api │ │ ├── apiClient.ts │ │ ├── client.ts │ │ ├── hooks.tsx │ │ ├── icon.ts │ │ ├── types.ts │ │ └── url.ts │ ├── assets │ │ ├── img │ │ │ ├── BBB.webp │ │ │ ├── hiru.webp │ │ │ ├── hkd.webp │ │ │ ├── isucon11_final.webp │ │ │ ├── isucon12_final.webp │ │ │ ├── isucon12_final_live.webp │ │ │ ├── isucon13.webp │ │ │ ├── isucon9.webp │ │ │ ├── timewarp.webp │ │ │ ├── ube.webp │ │ │ └── yoru.webp │ │ └── index.tsx │ ├── components │ │ ├── account │ │ │ └── iconmodal.tsx │ │ ├── console │ │ │ ├── newlive.tsx │ │ │ └── ngword.tsx │ │ ├── layout │ │ │ ├── ISUPipe_yoko_color.png │ │ │ ├── Layout.tsx │ │ │ └── loginmodal.tsx │ │ ├── reaction │ │ │ └── reaction.tsx │ │ ├── toast │ │ │ └── toast.tsx │ │ └── video │ │ │ ├── about.tsx │ │ │ ├── comment.tsx │ │ │ ├── thumbnail.tsx │ │ │ └── video.tsx │ ├── index.css │ ├── main.tsx │ ├── pages │ │ ├── account │ │ │ ├── login.tsx │ │ │ └── signup.tsx │ │ ├── console │ │ │ ├── index.tsx │ │ │ └── live │ │ │ │ └── [id].tsx │ │ ├── index.tsx │ │ ├── search.tsx │ │ ├── user.tsx │ │ └── watch │ │ │ └── [id].tsx │ └── vite-env.d.ts ├── tsconfig.json ├── tsconfig.node.json ├── vite.config.ts ├── vitest.config.ts └── yarn.lock ├── provisioning ├── ansible │ ├── README.md │ ├── ansible.cfg │ ├── application-base.yml │ ├── application-deploy.yml │ ├── application.yml │ ├── benchmark.yml │ ├── inventory │ │ ├── hosts.yaml │ │ ├── localhost │ │ └── sacloud │ ├── make_latest_files.sh │ ├── roles │ │ ├── apt │ │ │ └── tasks │ │ │ │ └── main.yml │ │ ├── base │ │ │ ├── files │ │ │ │ └── pubkey.conf │ │ │ └── tasks │ │ │ │ └── main.yml │ │ ├── bench │ │ │ ├── files │ │ │ │ └── .gitignore │ │ │ └── tasks │ │ │ │ └── main.yaml │ │ ├── envcheck │ │ │ ├── files │ │ │ │ ├── .gitignore │ │ │ │ ├── envcheck.service │ │ │ │ ├── run-isucon-env-checker.sh │ │ │ │ └── warmup.sh │ │ │ └── tasks │ │ │ │ └── main.yml │ │ ├── globalip │ │ │ ├── files │ │ │ │ ├── aws-env-isucon-subdomain-address.service │ │ │ │ └── aws-env-isucon-subdomain-address.sh │ │ │ └── tasks │ │ │ │ └── main.yml │ │ ├── isuadmin-user │ │ │ ├── files │ │ │ │ └── authorized_keys │ │ │ └── tasks │ │ │ │ └── main.yml │ │ ├── isucon-user │ │ │ ├── tasks │ │ │ │ └── main.yml │ │ │ └── templates │ │ │ │ └── env.sh │ │ ├── mysql │ │ │ └── tasks │ │ │ │ └── main.yml │ │ ├── nginx │ │ │ ├── files │ │ │ │ └── etc │ │ │ │ │ └── nginx │ │ │ │ │ ├── sites-available │ │ │ │ │ └── isupipe-php.conf │ │ │ │ │ ├── sites-enabled │ │ │ │ │ └── isupipe.conf │ │ │ │ │ └── tls │ │ │ │ │ ├── _.t.isucon.dev.crt │ │ │ │ │ ├── _.t.isucon.dev.key │ │ │ │ │ ├── _.u.isucon.dev.crt │ │ │ │ │ ├── _.u.isucon.dev.issuer.crt │ │ │ │ │ └── _.u.isucon.dev.key │ │ │ └── tasks │ │ │ │ └── main.yaml │ │ ├── powerdns │ │ │ ├── files │ │ │ │ ├── auth-48 │ │ │ │ ├── pdns.conf │ │ │ │ ├── pdns.d │ │ │ │ │ ├── docker.conf │ │ │ │ │ └── gmysql-host.conf │ │ │ │ ├── pdns.list │ │ │ │ └── resolved.conf │ │ │ └── tasks │ │ │ │ └── main.yml │ │ ├── webapp │ │ │ ├── files │ │ │ │ ├── .gitignore │ │ │ │ ├── isupipe-go.service │ │ │ │ ├── isupipe-node.service │ │ │ │ ├── isupipe-perl.service │ │ │ │ ├── isupipe-php.service │ │ │ │ ├── isupipe-python.service │ │ │ │ ├── isupipe-ruby.service │ │ │ │ ├── isupipe-rust.service │ │ │ │ └── isupipe.php-fpm.conf │ │ │ └── tasks │ │ │ │ ├── go.yaml │ │ │ │ ├── main.yaml │ │ │ │ ├── node.yaml │ │ │ │ ├── perl.yaml │ │ │ │ ├── php.yaml │ │ │ │ ├── python.yaml │ │ │ │ ├── ruby.yaml │ │ │ │ └── rust.yaml │ │ ├── xbuild │ │ │ ├── files │ │ │ │ ├── .local.env │ │ │ │ └── .x │ │ │ └── tasks │ │ │ │ └── main.yml │ │ └── xbuildwebapp │ │ │ ├── files │ │ │ └── rustup-init.sh │ │ │ └── tasks │ │ │ └── main.yml │ └── sandbox.ini └── packer │ ├── Makefile │ ├── isucon13.pkr.hcl │ └── isucon13_base_image.pkr.hcl ├── scripts ├── Pipfile ├── Pipfile.lock ├── README.md ├── generate_initial_livecomment.py ├── generate_initial_ngwords.py ├── generate_initial_reaction.py ├── generate_livecomment.py ├── generate_livestream_reservation.py ├── generate_livestream_reservation_slot.py ├── generate_livestream_tags.pl ├── generate_users.py └── initial-data │ ├── autogenerated_user_livestream_foreignkey_pairs.json │ ├── bench_dummy_ngwords.txt │ ├── bench_ngwords.txt │ ├── display_names.txt │ ├── emoji.txt │ ├── initial_ngwords.txt │ ├── negative_formats.txt │ └── positive_sentence.txt ├── validated ├── after │ ├── 10.json │ ├── 102.json │ ├── 12.json │ ├── 14.json │ ├── 157.json │ ├── 166.json │ ├── 176.json │ ├── 18.json │ ├── 187.json │ ├── 205.json │ ├── 217.json │ ├── 221.json │ ├── 222.json │ ├── 235.json │ ├── 237.json │ ├── 238.json │ ├── 24.json │ ├── 266.json │ ├── 276.json │ ├── 30.json │ ├── 31.json │ ├── 34.json │ ├── 35.json │ ├── 37.json │ ├── 386.json │ ├── 399.json │ ├── 4.json │ ├── 49.json │ ├── 520.json │ ├── 55.json │ ├── 56.json │ ├── 6.json │ ├── 65.json │ ├── 683.json │ ├── 684.json │ ├── 687.json │ ├── 702.json │ ├── 728.json │ ├── 75.json │ └── 823.json ├── before │ ├── 10.json │ ├── 102.json │ ├── 12.json │ ├── 14.json │ ├── 157.json │ ├── 166.json │ ├── 176.json │ ├── 18.json │ ├── 187.json │ ├── 205.json │ ├── 217.json │ ├── 221.json │ ├── 222.json │ ├── 235.json │ ├── 237.json │ ├── 238.json │ ├── 24.json │ ├── 266.json │ ├── 276.json │ ├── 30.json │ ├── 31.json │ ├── 34.json │ ├── 35.json │ ├── 37.json │ ├── 386.json │ ├── 399.json │ ├── 4.json │ ├── 49.json │ ├── 520.json │ ├── 55.json │ ├── 56.json │ ├── 6.json │ ├── 65.json │ ├── 683.json │ ├── 684.json │ ├── 687.json │ ├── 702.json │ ├── 728.json │ ├── 75.json │ └── 823.json ├── diff │ ├── 102.diff │ ├── 12.diff │ ├── 14.diff │ ├── 157.diff │ ├── 221.diff │ ├── 222.diff │ ├── 235.diff │ ├── 238.diff │ ├── 34.diff │ ├── 35.diff │ ├── 49.diff │ ├── 56.diff │ ├── 702.diff │ └── 728.diff ├── get.sh └── teams.txt └── webapp ├── .gitignore ├── go ├── .gitignore ├── Dockerfile ├── Makefile ├── go.mod ├── go.sum ├── livecomment_handler.go ├── livestream_handler.go ├── main.go ├── payment_handler.go ├── reaction_handler.go ├── stats_handler.go ├── top_handler.go └── user_handler.go ├── img └── NoImage.jpg ├── node ├── .dockerignore ├── .eslintrc ├── .gitignore ├── .prettierrc ├── Dockerfile ├── package-lock.json ├── package.json ├── src │ ├── contants.ts │ ├── handlers │ │ ├── livecomment-handler.ts │ │ ├── livestream-handler.ts │ │ ├── payment-handler.ts │ │ ├── reaction-handler.ts │ │ ├── stats-handler.ts │ │ ├── top-handler.ts │ │ └── user-handler.ts │ ├── main.ts │ ├── middlewares │ │ └── verify-user-session-middleare.ts │ ├── types │ │ ├── application.ts │ │ └── models.ts │ └── utils │ │ ├── fill-livecomment-report-response.ts │ │ ├── fill-livecomment-response.ts │ │ ├── fill-livestream-response.ts │ │ ├── fill-reaction-response.ts │ │ ├── fill-user-response.ts │ │ ├── integer.ts │ │ └── throw-error-with.ts └── tsconfig.json ├── pdns ├── init_zone.sh ├── named.conf └── u.isucon.dev.zone ├── perl ├── .gitignore ├── Dockerfile ├── app.psgi ├── cpanfile └── lib │ └── Isupipe │ ├── App.pm │ ├── Assert.pm │ ├── Entity │ ├── Livecomment.pm │ ├── LivecommentReport.pm │ ├── Livestream.pm │ ├── LivestreamRankingEntry.pm │ ├── LivestreamStatistics.pm │ ├── LivestreamTag.pm │ ├── LivestreamViewer.pm │ ├── NGWord.pm │ ├── Reaction.pm │ ├── ReservationSlot.pm │ ├── Tag.pm │ ├── Theme.pm │ ├── User.pm │ ├── UserRankingEntry.pm │ └── UserStatistics.pm │ ├── FillResponse.pm │ ├── Handler │ ├── LivecommentHandler.pm │ ├── LivestreamHandler.pm │ ├── PaymentHandler.pm │ ├── ReactionHandler.pm │ ├── StatsHandler.pm │ ├── TopHandler.pm │ └── UserHandler.pm │ ├── Icon.pm │ ├── Log.pm │ └── Util.pm ├── php ├── .dockerignore ├── .gitignore ├── Dockerfile ├── app │ ├── Application │ │ ├── Handlers │ │ │ ├── HttpErrorHandler.php │ │ │ └── ShutdownHandler.php │ │ ├── ResponseEmitter │ │ │ └── ResponseEmitter.php │ │ └── Settings │ │ │ ├── Settings.php │ │ │ └── SettingsInterface.php │ ├── dependencies.php │ ├── routes.php │ └── settings.php ├── composer.json ├── composer.lock ├── composer.phar ├── phpcs.xml ├── phpstan.neon.dist ├── public │ └── index.php ├── src │ ├── AbstractHandler.php │ ├── InitializeHandler.php │ ├── InitializeResponse.php │ ├── Livecomment │ │ ├── FillLivecommentReportResponse.php │ │ ├── FillLivecommentResponse.php │ │ ├── Handler.php │ │ ├── Livecomment.php │ │ ├── LivecommentModel.php │ │ ├── LivecommentReport.php │ │ ├── LivecommentReportModel.php │ │ ├── ModerateRequest.php │ │ ├── NGWord.php │ │ └── PostLivecommentRequest.php │ ├── Livestream │ │ ├── FillLivestreamResponse.php │ │ ├── Handler.php │ │ ├── Livestream.php │ │ ├── LivestreamModel.php │ │ ├── LivestreamTagModel.php │ │ ├── LivestreamViewerModel.php │ │ ├── ReservationSlotModel.php │ │ └── ReserveLivestreamRequest.php │ ├── Payment │ │ ├── Handler.php │ │ └── PaymentResult.php │ ├── Reaction │ │ ├── Handler.php │ │ ├── PostReactionRequest.php │ │ ├── Reaction.php │ │ └── ReactionModel.php │ ├── Stats │ │ ├── Handler.php │ │ ├── LivestreamRankingEntry.php │ │ ├── LivestreamStatistics.php │ │ ├── UserRankingEntry.php │ │ └── UserStatistics.php │ ├── Top │ │ ├── Handler.php │ │ ├── Tag.php │ │ ├── TagModel.php │ │ └── TagsResponse.php │ └── User │ │ ├── FillUserResponse.php │ │ ├── Handler.php │ │ ├── LoginRequest.php │ │ ├── PostIconRequest.php │ │ ├── PostIconResponse.php │ │ ├── PostUserRequest.php │ │ ├── PostUserRequestTheme.php │ │ ├── Theme.php │ │ ├── ThemeModel.php │ │ ├── User.php │ │ ├── UserModel.php │ │ └── VerifyUserSession.php └── var │ └── cache │ └── .gitignore ├── python ├── Dockerfile ├── Pipfile ├── Pipfile.lock ├── app.py ├── models.py └── mypy.ini ├── ruby ├── .gitignore ├── Dockerfile ├── Gemfile ├── Gemfile.lock ├── app.rb └── config.ru ├── rust ├── .gitignore ├── Cargo.lock ├── Cargo.toml ├── Dockerfile └── src │ └── main.rs └── sql ├── init.sh ├── init.sql ├── initdb.d ├── 00_create_database.sql └── 10_schema.sql ├── initial_livecomments.sql ├── initial_livestream_tags.sql ├── initial_livestreams.sql ├── initial_ngwords.sql ├── initial_reactions.sql ├── initial_reservation_slots.sql ├── initial_tags.sql └── initial_users.sql /.github_/workflows/create_base_ami.yml: -------------------------------------------------------------------------------- 1 | name: Build Base Image with Packer 2 | 3 | on: 4 | workflow_dispatch: 5 | 6 | jobs: 7 | build-ami: 8 | runs-on: [isucon13-ci-packer-base] 9 | name: build isucon13 base image 10 | 11 | steps: 12 | - name: Checkout repository 13 | uses: actions/checkout@v3 14 | 15 | - name: Install unzip 16 | run: | 17 | sudo apt-get update 18 | sudo apt-get install unzip 19 | 20 | - name: Set up Packer 21 | uses: hashicorp/setup-packer@main 22 | with: 23 | version: "1.9.4" 24 | 25 | - name: Set up Python 26 | uses: actions/setup-python@v2 27 | with: 28 | python-version: "3.10" 29 | 30 | - name: Install Ansible 31 | run: | 32 | python -m pip install --upgrade pip 33 | pip install ansible 34 | 35 | - name: Build 36 | run: | 37 | cd provisioning/packer 38 | packer init -upgrade isucon13_base_image.pkr.hcl 39 | packer build isucon13_base_image.pkr.hcl 40 | env: 41 | AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} 42 | AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} 43 | AWS_REGION: ap-northeast-1 -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "[yaml]": { 3 | "editor.formatOnSave": false 4 | } 5 | } -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 ISUCON13 Contributors 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | MAKE=make -C 2 | 3 | DOCKER_BUILD=docker build 4 | DOCKER_BUILD_OPTS=--no-cache 5 | DOCKER_RMI=docker rmi -f 6 | 7 | ISUPIPE_TAG=isupipe:latest 8 | 9 | test: test_benchmarker 10 | .PHONY: test 11 | 12 | test_benchmarker: 13 | $(MAKE) bench test 14 | .PHONY: test_benchmarker 15 | 16 | build_webapp: 17 | $(MAKE) webapp/go docker_image 18 | .PHONY: build_webapp 19 | 20 | -------------------------------------------------------------------------------- /bench/Dockerfile.dev: -------------------------------------------------------------------------------- 1 | FROM golang:1.21.0-bookworm 2 | 3 | WORKDIR /tmp 4 | ENV DEBIAN_FRONTEND=noninteractive 5 | RUN apt-get update && \ 6 | apt-get -y upgrade && \ 7 | apt-get install -y gcc g++ make locales locales-all 8 | 9 | RUN locale-gen en_US.UTF-8 10 | RUN useradd --uid=1001 --create-home benchuser 11 | USER benchuser 12 | 13 | RUN mkdir -p /home/benchuser 14 | WORKDIR /home/benchuser 15 | COPY --chown=benchuser:benchuser ./ /home/benchuser/ 16 | RUN go build -o bench ./cmd/bench 17 | 18 | ENV GOPATH=/home/benchuser/tmp/go 19 | ENV GOCACHE=/home/benchuser/tmp/go/.cache 20 | 21 | ENV LANG en_US.UTF-8 22 | ENV LANGUAGE en_US:en 23 | ENV LC_ALL en_US.UTF-8 24 | 25 | ENTRYPOINT ["/home/benchuser/bench"] 26 | CMD ["supervise"] 27 | -------------------------------------------------------------------------------- /bench/Dockerfile.prod: -------------------------------------------------------------------------------- 1 | FROM golang:1.21.0-bookworm 2 | 3 | WORKDIR /tmp 4 | ENV DEBIAN_FRONTEND=noninteractive 5 | RUN apt-get update && \ 6 | apt-get -y upgrade && \ 7 | apt-get install -y gcc g++ make locales locales-all 8 | 9 | RUN locale-gen en_US.UTF-8 10 | RUN useradd --uid=1001 --create-home benchuser 11 | USER benchuser 12 | 13 | RUN mkdir -p /home/benchuser 14 | WORKDIR /home/benchuser 15 | COPY --chown=benchuser:benchuser ./ /home/benchuser/ 16 | RUN go build -o bench ./cmd/bench 17 | 18 | ENV GOPATH=/home/benchuser/tmp/go 19 | ENV GOCACHE=/home/benchuser/tmp/go/.cache 20 | 21 | ENV LANG en_US.UTF-8 22 | ENV LANGUAGE en_US:en 23 | ENV LC_ALL en_US.UTF-8 24 | 25 | ENTRYPOINT ["/home/benchuser/bench"] 26 | CMD ["supervise", "--production"] 27 | -------------------------------------------------------------------------------- /bench/assets/data/.gitignore: -------------------------------------------------------------------------------- 1 | hash.txt 2 | -------------------------------------------------------------------------------- /bench/assets/load.go: -------------------------------------------------------------------------------- 1 | package assets 2 | 3 | import ( 4 | "bytes" 5 | _ "embed" 6 | "encoding/hex" 7 | "strings" 8 | ) 9 | 10 | //go:embed data/hash.txt 11 | var hashList string 12 | 13 | type Asset struct { 14 | Path string 15 | Hash [32]byte 16 | } 17 | 18 | // Load は静的ファイルのハッシュ値などをローカルファイルから読み出します 19 | func Load() ([]*Asset, error) { 20 | return load(hashList) 21 | } 22 | 23 | func load(hashList string) ([]*Asset, error) { 24 | buff := bytes.NewBufferString(hashList) 25 | 26 | var assets []*Asset 27 | for { 28 | line, err := buff.ReadString('\n') 29 | if err != nil { 30 | break 31 | } 32 | 33 | line = strings.TrimSpace(line) 34 | if line == "" { 35 | continue 36 | } 37 | 38 | parts := strings.SplitN(line, " ", 2) 39 | if len(parts) != 2 { 40 | continue 41 | } 42 | 43 | pathname := strings.TrimPrefix(parts[1], ".") 44 | 45 | // hex to byte 46 | hash, err := hex.DecodeString(parts[0]) 47 | if err != nil { 48 | continue 49 | } 50 | fixed := [32]byte{} 51 | copy(fixed[:], hash) 52 | 53 | assets = append(assets, &Asset{ 54 | Path: pathname, 55 | Hash: fixed, 56 | }) 57 | } 58 | 59 | return assets, nil 60 | } 61 | -------------------------------------------------------------------------------- /bench/bin/.gitignore: -------------------------------------------------------------------------------- 1 | bench_darwin_amd64 2 | bench_darwin_arm64 3 | bench_linux_amd64 4 | bench_linux_arm64 5 | -------------------------------------------------------------------------------- /bench/cmd/bench/id_ed25519.pub: -------------------------------------------------------------------------------- 1 | ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJNZODRcueyvriMzcYRlAsM2OPJWHUnkBovbHJheuUKJ noname 2 | -------------------------------------------------------------------------------- /bench/cmd/bench/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "log" 5 | "math/rand" 6 | "os" 7 | "time" 8 | 9 | "github.com/urfave/cli" 10 | ) 11 | 12 | func init() { 13 | time.Local = time.UTC 14 | rand.New(rand.NewSource(time.Now().UnixNano())) 15 | } 16 | 17 | func main() { 18 | os.Exit(cliMain()) 19 | } 20 | 21 | func cliMain() int { 22 | app := cli.NewApp() 23 | app.Name = "isupipebench" 24 | app.Usage = "isupipe ベンチマーカー" 25 | app.Description = "isupipeのベンチマークを実施" 26 | app.HelpName = "isupipebench" 27 | 28 | app.Commands = []cli.Command{ 29 | run, 30 | supervise, 31 | } 32 | 33 | app.Action = func(cliCtx *cli.Context) error { 34 | return cli.ShowAppHelp(cliCtx) 35 | } 36 | 37 | if err := app.Run(os.Args); err != nil { 38 | exitErr := err.(*cli.ExitError) 39 | log.Println(exitErr.Error()) 40 | return exitErr.ExitCode() 41 | } 42 | 43 | return 0 44 | } 45 | -------------------------------------------------------------------------------- /bench/cmd/bench/reboot.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | _ "embed" 5 | "log" 6 | "net" 7 | 8 | "golang.org/x/crypto/ssh" 9 | ) 10 | 11 | func reboot(ip string, signer ssh.Signer) error { 12 | addr := net.JoinHostPort(ip, "22") 13 | log.Printf("addr = %s\n", addr) 14 | log.Printf("signer = %+v\n", signer) 15 | client, err := ssh.Dial("tcp", addr, &ssh.ClientConfig{ 16 | User: "isuadmin", 17 | Auth: []ssh.AuthMethod{ 18 | ssh.PublicKeys(signer), 19 | }, 20 | HostKeyCallback: ssh.InsecureIgnoreHostKey(), 21 | }) 22 | if err != nil { 23 | log.Printf("error = %s\n", err.Error()) 24 | return err 25 | } 26 | defer client.Close() 27 | 28 | session, err := client.NewSession() 29 | if err != nil { 30 | return err 31 | } 32 | defer session.Close() 33 | 34 | if err := session.Run("sudo systemctl reboot"); err != nil { 35 | return err 36 | } 37 | 38 | return nil 39 | } 40 | -------------------------------------------------------------------------------- /bench/cmd/bench/s3.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "os" 6 | 7 | "github.com/aws/aws-sdk-go/aws" 8 | "github.com/aws/aws-sdk-go/aws/credentials" 9 | "github.com/aws/aws-sdk-go/aws/session" 10 | "github.com/aws/aws-sdk-go/service/s3" 11 | "github.com/isucon/isucon13/bench/internal/config" 12 | ) 13 | 14 | func UploadFinalcheckResult(bucketName string, jobID, team int) error { 15 | fd, err := os.Open(config.FinalcheckPath) 16 | if err != nil { 17 | return err 18 | } 19 | defer fd.Close() 20 | 21 | sess := session.Must(session.NewSession(&aws.Config{ 22 | Region: aws.String("ap-northeast-1"), 23 | Credentials: credentials.NewStaticCredentials(accessKey, secretAccessKey, ""), 24 | })) 25 | client := s3.New(sess) 26 | 27 | key := fmt.Sprintf("team-%d-job-%d-finalcheck.json", team, jobID) 28 | if _, err := client.PutObject(&s3.PutObjectInput{ 29 | Bucket: aws.String(bucketName), 30 | Key: aws.String(key), 31 | Body: fd, 32 | }); err != nil { 33 | return err 34 | } 35 | 36 | return nil 37 | } 38 | -------------------------------------------------------------------------------- /bench/internal/benchscore/counter.go: -------------------------------------------------------------------------------- 1 | package benchscore 2 | 3 | import ( 4 | "context" 5 | "sync" 6 | 7 | "github.com/isucon/isucandar/score" 8 | ) 9 | 10 | const ( 11 | DNSResolve score.ScoreTag = "dns-resolve" 12 | DNSFailed score.ScoreTag = "dns-failed" 13 | 14 | TooSlow score.ScoreTag = "too-slow-left" 15 | TooManySpam score.ScoreTag = "too-many-spam" 16 | ) 17 | 18 | var ( 19 | counter *score.Score 20 | doneCounterOnce sync.Once 21 | ) 22 | 23 | func InitCounter(ctx context.Context) { 24 | counter = score.NewScore(ctx) 25 | counter.Set(DNSResolve, 1) 26 | counter.Set(DNSFailed, 1) 27 | counter.Set(TooSlow, 1) 28 | counter.Set(TooManySpam, 1) 29 | } 30 | 31 | func IncResolves() { 32 | counter.Add(DNSResolve) 33 | } 34 | 35 | func NumResolves() int64 { 36 | table := counter.Breakdown() 37 | return table[DNSResolve] 38 | } 39 | 40 | func IncDNSFailed() { 41 | counter.Add(DNSFailed) 42 | } 43 | 44 | func NumDNSFailed() int64 { 45 | table := counter.Breakdown() 46 | return table[DNSFailed] 47 | } 48 | 49 | func GetByTag(tag score.ScoreTag) int64 { 50 | return counter.Breakdown()[tag] 51 | } 52 | 53 | func DoneCounter() { 54 | doneCounterOnce.Do(func() { 55 | counter.Close() 56 | }) 57 | } 58 | -------------------------------------------------------------------------------- /bench/internal/benchscore/profit.go: -------------------------------------------------------------------------------- 1 | package benchscore 2 | 3 | import ( 4 | "sync/atomic" 5 | ) 6 | 7 | var profit uint64 8 | 9 | func AddTip(tip uint64) { 10 | atomic.AddUint64(&profit, tip) 11 | } 12 | 13 | // GetFinalProfit は、最終売上を返します 14 | // FIXME: finalcheck後にprofitをスコアに加算しないと駄目 15 | func GetTotalProfit() uint64 { 16 | return profit 17 | } 18 | -------------------------------------------------------------------------------- /bench/internal/config/benchmark.go: -------------------------------------------------------------------------------- 1 | package config 2 | 3 | import "time" 4 | 5 | // ベンチマーク走行時間タイムアウト 6 | const DefaultBenchmarkTimeout = 60 * time.Second 7 | 8 | // スパム離脱割合 9 | const TooManySpamThresholdPercentage = 30.0 10 | 11 | // 基本となる並列性 12 | // セマフォの重みに使われます 13 | const BaseParallelism = 1 14 | 15 | // 動的に並列度を上げる並列性 16 | // スコアに直結する視聴者シナリオなどのセマフォの重みに使われます 17 | const ChangableParallelism = 100 18 | 19 | // この数値だけは、最初のRegister, Login処理が保証されます 20 | // NOTE: このような保証がないと、登録が一切できず、ベンチ走行までシナリオが全く実行されないケースが出てしまいます 21 | const NumMustTryLogins = 10 22 | 23 | // HTTPクライアント(isucandar/agent) のタイムアウト 24 | const DefaultAgentTimeout = 20 * time.Second 25 | 26 | // POST /api/initialize 時のタイムアウト 27 | const InitializeAgentTimeout = 42 * time.Second 28 | 29 | // SearchLivestreamsのLIMITのデフォルト 30 | const NumSearchLivestreams = 50 31 | 32 | // NOTE: --enable-ssl オプションによって変更されます 33 | var ( 34 | HTTPScheme = "http" 35 | InsecureSkipVerify = true 36 | ) 37 | 38 | const BaseDomain = "u.isucon.dev" 39 | 40 | // 暇になってる接続のタイムアウト 41 | // NOTE: これを設定しないと、keepaliveで繋ぎっぱなしの接続が増え、Nginxでworker_connectionが不十分だというエラーログが出るようになる 42 | const ClientIdleConnTimeout = 5 * time.Second 43 | 44 | const AttackHTTPClientContextKey = "dns-attack-http-realip" 45 | -------------------------------------------------------------------------------- /bench/internal/config/config.go: -------------------------------------------------------------------------------- 1 | package config 2 | 3 | const ( 4 | // NOTE: あまり並列度高く長い時間ベンチさせると、ポートが枯渇する 5 | // FIXME: 2以上にすると、シナリオの実装上、ランダムに選ばれたlivestream_idが重複したworker fnが同時に走り、 6 | // 7 | // POST /livestream/:livestream_id/enter が重複した配信に対して行われ、 8 | // テーブルのUNIQUE制約(user_id-livestream_id)を侵す可能性がある 9 | // 対策としては、アルゴリズム側で必ず重複しないように調整するか、 10 | // worker parallelismを1にしつつ、視聴者のシミュレータをgoroutineで吐き出して並行性を担保する 11 | // とりあえず後者で対応 12 | // 13 | // DefaultBenchmarkerParallelism = 5 14 | // シナリオテストのタイムアウト[秒] 15 | // ScenarioTestTimeoutSeconds = 3 16 | ) 17 | 18 | var Language string = "unknown" 19 | -------------------------------------------------------------------------------- /bench/internal/config/finalcheck.go: -------------------------------------------------------------------------------- 1 | package config 2 | 3 | import "time" 4 | 5 | const FinalcheckTimeout = 10 * time.Second 6 | -------------------------------------------------------------------------------- /bench/internal/config/initialdata.go: -------------------------------------------------------------------------------- 1 | package config 2 | 3 | const InitialReactionCount = 1001 4 | const InitialNgWords = 14337 5 | -------------------------------------------------------------------------------- /bench/internal/config/reservation.go: -------------------------------------------------------------------------------- 1 | package config 2 | 3 | // 2024-04-01 01:00:00 4 | // NOTE: 2024-04-01 00:00:00 ~ 2024-04-01 01:00:00は初期データで予約済み 5 | const BaseAt = 1700874000 6 | 7 | // 同時配信枠数 8 | // NOTE: ベンチマーカー調整項目 9 | const NumSlots = 5 10 | 11 | // NOTE: 初期データ予約済みの1時間分を引く必要がある 12 | const NumHours = (24 * 365) - 1 13 | 14 | // この時間[h]を超えた配信枠は長時間配信とみなす 15 | const LongHourThreshold = 10 16 | -------------------------------------------------------------------------------- /bench/internal/config/supervise.go: -------------------------------------------------------------------------------- 1 | package config 2 | 3 | // NOTE: ベンチマーカー実行ログを当該パスに書き出す 4 | // 5 | // supervisorがそれを拾い、ポータルにPOSTする 6 | var StaffLogPath string = "/tmp/result.json" 7 | var ContestantLogPath string = "/tmp/staff.log" 8 | var ResultPath string = "/tmp/contestant.log" 9 | var FinalcheckPath string = "/tmp/finalcheck.json" 10 | -------------------------------------------------------------------------------- /bench/internal/config/webapp.go: -------------------------------------------------------------------------------- 1 | package config 2 | 3 | import ( 4 | "fmt" 5 | "net" 6 | ) 7 | 8 | var ( 9 | TargetBaseURL string = fmt.Sprintf("%s://pipe.%s:%d", HTTPScheme, BaseDomain, TargetPort) 10 | TargetNameserver string = "127.0.0.1" 11 | TargetWebapps []string = []string{} 12 | DNSPort int = 1053 13 | TargetPort int = 8080 14 | ) 15 | 16 | func IsWebappIP(ip net.IP) bool { 17 | for _, s := range TargetWebapps { 18 | if ip.String() == s { 19 | return true 20 | } 21 | } 22 | return false 23 | } 24 | -------------------------------------------------------------------------------- /bench/internal/pubsub/pubsub_test.go: -------------------------------------------------------------------------------- 1 | package pubsub 2 | 3 | import ( 4 | "context" 5 | "fmt" 6 | "testing" 7 | 8 | "github.com/stretchr/testify/assert" 9 | ) 10 | 11 | type Item struct{} 12 | 13 | func TestPubSub(t *testing.T) { 14 | pool := NewPubSub(10) 15 | go pool.Run(context.TODO()) 16 | 17 | pool.Publish(context.TODO(), &Item{}) 18 | pool.Publish(context.TODO(), &Item{}) 19 | pool.Publish(context.TODO(), &Item{}) 20 | pool.Publish(context.TODO(), &Item{}) 21 | pool.Publish(context.TODO(), &Item{}) 22 | 23 | v, err := pool.Subscribe(context.TODO()) 24 | assert.NoError(t, err) 25 | fmt.Println(v) 26 | } 27 | -------------------------------------------------------------------------------- /bench/internal/resolver/native.go: -------------------------------------------------------------------------------- 1 | package resolver 2 | 3 | import ( 4 | "context" 5 | "net" 6 | "strconv" 7 | "time" 8 | 9 | "github.com/isucon/isucon13/bench/internal/config" 10 | ) 11 | 12 | type NativeDNSResolver struct { 13 | Nameserver string 14 | Timeout time.Duration 15 | } 16 | 17 | func NewNativeDNSResolver() *NativeDNSResolver { 18 | return &NativeDNSResolver{ 19 | Nameserver: net.JoinHostPort(config.TargetNameserver, strconv.Itoa(config.DNSPort)), 20 | Timeout: 10000 * time.Millisecond, 21 | } 22 | } 23 | 24 | func (r *NativeDNSResolver) DialContext(ctx context.Context, network, address string) (net.Conn, error) { 25 | dialer := net.Dialer{ 26 | Timeout: r.Timeout, 27 | Resolver: &net.Resolver{ 28 | PreferGo: true, 29 | Dial: func(ctx context.Context, network, address string) (net.Conn, error) { 30 | dialer := net.Dialer{Timeout: r.Timeout} 31 | return dialer.DialContext(ctx, "udp", r.Nameserver) 32 | }, 33 | }, 34 | } 35 | return dialer.DialContext(ctx, network, address) 36 | } 37 | -------------------------------------------------------------------------------- /bench/internal/scheduler/commit_state.go: -------------------------------------------------------------------------------- 1 | package scheduler 2 | 3 | // 割当のコミット状態を管理 4 | type CommitState int 5 | 6 | const ( 7 | CommitState_None CommitState = iota 8 | CommitState_Inflight 9 | CommitState_Committed 10 | ) 11 | -------------------------------------------------------------------------------- /bench/internal/scheduler/images/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/1.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/10.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/10.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/100.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/100.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/101.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/101.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/102.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/102.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/103.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/103.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/104.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/104.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/105.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/105.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/106.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/106.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/107.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/107.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/108.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/108.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/109.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/109.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/11.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/11.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/110.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/110.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/111.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/111.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/112.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/112.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/113.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/113.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/114.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/114.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/115.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/115.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/116.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/116.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/117.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/117.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/118.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/118.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/119.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/119.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/12.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/12.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/120.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/120.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/121.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/121.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/122.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/122.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/123.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/123.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/124.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/124.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/125.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/125.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/126.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/126.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/127.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/127.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/128.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/128.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/129.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/129.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/13.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/13.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/130.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/130.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/131.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/131.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/132.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/132.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/133.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/133.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/134.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/134.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/135.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/135.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/136.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/136.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/137.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/137.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/138.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/138.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/139.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/139.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/14.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/14.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/140.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/140.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/141.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/141.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/142.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/142.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/143.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/143.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/144.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/144.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/145.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/145.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/146.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/146.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/147.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/147.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/148.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/148.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/149.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/149.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/15.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/15.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/150.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/150.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/151.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/151.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/152.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/152.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/153.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/153.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/154.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/154.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/155.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/155.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/156.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/156.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/157.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/157.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/158.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/158.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/159.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/159.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/16.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/16.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/160.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/160.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/161.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/161.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/162.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/162.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/163.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/163.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/164.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/164.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/165.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/165.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/166.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/166.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/167.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/167.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/168.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/168.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/169.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/169.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/17.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/17.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/170.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/170.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/171.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/171.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/172.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/172.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/173.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/173.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/174.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/174.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/175.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/175.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/176.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/176.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/177.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/177.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/178.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/178.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/179.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/179.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/18.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/18.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/180.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/180.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/181.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/181.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/182.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/182.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/183.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/183.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/184.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/184.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/185.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/185.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/186.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/186.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/187.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/187.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/188.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/188.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/189.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/189.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/19.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/19.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/190.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/190.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/2.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/20.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/20.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/21.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/21.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/22.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/22.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/23.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/23.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/24.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/24.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/25.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/25.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/26.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/26.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/27.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/27.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/28.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/28.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/29.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/29.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/3.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/30.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/30.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/31.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/31.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/32.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/32.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/33.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/33.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/34.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/34.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/35.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/35.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/36.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/36.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/37.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/37.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/38.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/38.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/39.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/39.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/4.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/40.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/40.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/41.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/41.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/42.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/42.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/43.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/43.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/44.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/44.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/45.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/45.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/46.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/46.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/47.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/47.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/48.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/48.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/49.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/49.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/5.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/50.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/50.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/51.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/51.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/52.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/52.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/53.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/53.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/54.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/54.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/55.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/55.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/56.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/56.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/57.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/57.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/58.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/58.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/59.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/59.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/6.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/60.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/60.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/61.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/61.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/62.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/62.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/63.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/63.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/64.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/64.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/65.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/65.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/66.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/66.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/67.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/67.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/68.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/68.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/69.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/69.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/7.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/70.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/70.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/71.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/71.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/72.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/72.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/73.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/73.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/74.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/74.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/75.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/75.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/76.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/76.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/77.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/77.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/78.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/78.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/79.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/79.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/8.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/80.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/80.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/81.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/81.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/82.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/82.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/83.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/83.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/84.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/84.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/85.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/85.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/86.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/86.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/87.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/87.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/88.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/88.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/89.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/89.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/9.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/9.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/90.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/90.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/91.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/91.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/92.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/92.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/93.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/93.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/94.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/94.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/95.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/95.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/96.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/96.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/97.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/97.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/98.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/98.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/images/99.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/internal/scheduler/images/99.jpg -------------------------------------------------------------------------------- /bench/internal/scheduler/initial.go: -------------------------------------------------------------------------------- 1 | package scheduler 2 | 3 | type InitialNgWord struct { 4 | UserID int64 5 | LivestreamID int64 6 | Word string 7 | } 8 | 9 | type InitialLivecomment struct { 10 | UserID int64 11 | LivestreamID int64 12 | Comment string 13 | } 14 | 15 | type InitialReaction struct { 16 | UserID int64 17 | LivestreamID int64 18 | EmojiName string 19 | } 20 | -------------------------------------------------------------------------------- /bench/isupipe/agent_option.go: -------------------------------------------------------------------------------- 1 | package isupipe 2 | 3 | import ( 4 | "net/http" 5 | 6 | "github.com/isucon/isucandar/agent" 7 | ) 8 | 9 | func withClient(c *http.Client) agent.AgentOption { 10 | return func(a *agent.Agent) error { 11 | a.HttpClient = c 12 | 13 | return nil 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /bench/isupipe/client_payment.go: -------------------------------------------------------------------------------- 1 | package isupipe 2 | 3 | import ( 4 | "context" 5 | "encoding/json" 6 | "io" 7 | "net/http" 8 | ) 9 | 10 | type PaymentResult struct { 11 | // NOTE: 売上0を許容 12 | TotalTip int64 `json:"total_tip"` 13 | } 14 | 15 | func (c *Client) GetPaymentResult(ctx context.Context) (*PaymentResult, error) { 16 | req, err := c.agent.NewRequest(http.MethodGet, "/api/payment", nil) 17 | if err != nil { 18 | return nil, err 19 | } 20 | 21 | resp, err := c.agent.Do(ctx, req) 22 | if err != nil { 23 | return nil, err 24 | } 25 | defer func() { 26 | io.Copy(io.Discard, resp.Body) 27 | resp.Body.Close() 28 | }() 29 | 30 | var paymentResp *PaymentResult 31 | if json.NewDecoder(resp.Body).Decode(&paymentResp); err != nil { 32 | return nil, err 33 | } 34 | 35 | if err := ValidateResponse(req, paymentResp); err != nil { 36 | return nil, err 37 | } 38 | 39 | return paymentResp, nil 40 | } 41 | -------------------------------------------------------------------------------- /bench/isupipe/client_payment_test.go: -------------------------------------------------------------------------------- 1 | package isupipe 2 | 3 | import ( 4 | "context" 5 | "testing" 6 | "time" 7 | 8 | "github.com/isucon/isucandar/agent" 9 | "github.com/isucon/isucon13/bench/internal/config" 10 | "github.com/isucon/isucon13/bench/internal/logger" 11 | "github.com/stretchr/testify/assert" 12 | ) 13 | 14 | // FIXME: 変動をテスト 15 | func TestPayment(t *testing.T) { 16 | ctx := context.Background() 17 | 18 | testLogger, err := logger.InitTestLogger() 19 | assert.NoError(t, err) 20 | 21 | client, err := NewClient( 22 | testLogger, 23 | agent.WithBaseURL(config.TargetBaseURL), 24 | agent.WithTimeout(3*time.Second), 25 | ) 26 | assert.NoError(t, err) 27 | 28 | result1, err := client.GetPaymentResult(ctx) 29 | assert.NoError(t, err) 30 | 31 | // 投げ銭投稿 32 | 33 | // 変動チェック 34 | _ = result1 35 | } 36 | -------------------------------------------------------------------------------- /bench/isupipe/client_reaction_test.go: -------------------------------------------------------------------------------- 1 | package isupipe 2 | -------------------------------------------------------------------------------- /bench/isupipe/client_test.go: -------------------------------------------------------------------------------- 1 | package isupipe 2 | 3 | import ( 4 | "context" 5 | "errors" 6 | "fmt" 7 | "net/http" 8 | "net/http/httptest" 9 | "testing" 10 | "time" 11 | 12 | "github.com/isucon/isucandar/agent" 13 | "github.com/isucon/isucon13/bench/internal/bencherror" 14 | "github.com/isucon/isucon13/bench/internal/logger" 15 | "github.com/stretchr/testify/assert" 16 | ) 17 | 18 | func TestClient_Timeout(t *testing.T) { 19 | ctx := context.Background() 20 | 21 | testLogger, err := logger.InitTestLogger() 22 | assert.NoError(t, err) 23 | 24 | h := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 25 | time.Sleep(500 * time.Millisecond) 26 | fmt.Fprintln(w, `{"tags": []}`) 27 | }) 28 | ts := httptest.NewServer(h) 29 | defer ts.Close() 30 | 31 | client, err := NewClient(testLogger, agent.WithBaseURL(ts.URL), agent.WithTimeout(1*time.Microsecond)) 32 | assert.NoError(t, err) 33 | 34 | // NOTE: 呼び出すエンドポイントは何でも良い 35 | // タグ取得がパラメータがなく簡単であるためこうしている 36 | _, err = client.GetTags(ctx) 37 | assert.True(t, errors.Is(err, bencherror.ErrTimeout)) 38 | } 39 | -------------------------------------------------------------------------------- /bench/isupipe/main_test.go: -------------------------------------------------------------------------------- 1 | package isupipe 2 | 3 | import ( 4 | "context" 5 | "log" 6 | "testing" 7 | "time" 8 | 9 | "github.com/isucon/isucandar/agent" 10 | "github.com/isucon/isucon13/bench/internal/bencherror" 11 | "github.com/isucon/isucon13/bench/internal/benchscore" 12 | "github.com/isucon/isucon13/bench/internal/config" 13 | "github.com/isucon/isucon13/bench/internal/logger" 14 | ) 15 | 16 | func TestMain(m *testing.M) { 17 | testLogger, err := logger.InitTestLogger() 18 | if err != nil { 19 | log.Fatalln(err) 20 | } 21 | 22 | client, err := NewClient( 23 | testLogger, 24 | agent.WithTimeout(1*time.Minute), 25 | ) 26 | if err != nil { 27 | log.Fatalln(err) 28 | } 29 | config.TargetWebapps = []string{"127.0.0.1"} 30 | if _, err := client.Initialize(context.Background()); err != nil { 31 | log.Fatalln(err) 32 | } 33 | 34 | ctx := context.Background() 35 | benchscore.InitCounter(ctx) 36 | bencherror.InitErrors(ctx) 37 | 38 | m.Run() 39 | } 40 | -------------------------------------------------------------------------------- /bench/scenario/attacker.go: -------------------------------------------------------------------------------- 1 | package scenario 2 | 3 | import ( 4 | "context" 5 | "net/http" 6 | 7 | "github.com/isucon/isucon13/bench/internal/attacker" 8 | "golang.org/x/time/rate" 9 | ) 10 | 11 | var maxAttackOnEachScenario = 100 12 | 13 | func DnsWaterTortureAttackScenario(ctx context.Context, httpClient *http.Client, loadLimiter *rate.Limiter) error { 14 | 15 | atk := attacker.NewDnsWaterTortureAttacker() 16 | for j := 0; j < maxAttackOnEachScenario; j++ { 17 | if err := loadLimiter.Wait(ctx); err == nil { 18 | atk.Attack(ctx, httpClient) 19 | } 20 | } 21 | 22 | return nil 23 | } 24 | -------------------------------------------------------------------------------- /bench/scenario/core_finalcheck.go: -------------------------------------------------------------------------------- 1 | package scenario 2 | 3 | import ( 4 | "context" 5 | "os" 6 | 7 | "github.com/isucon/isucandar/agent" 8 | "github.com/isucon/isucon13/bench/internal/config" 9 | "github.com/isucon/isucon13/bench/internal/resolver" 10 | "github.com/isucon/isucon13/bench/isupipe" 11 | "go.uber.org/zap" 12 | ) 13 | 14 | func FinalcheckScenario(ctx context.Context, contestantLogger *zap.Logger, dnsResolver *resolver.DNSResolver) error { 15 | 16 | client, err := isupipe.NewCustomResolverClient( 17 | contestantLogger, 18 | dnsResolver, 19 | agent.WithTimeout(config.FinalcheckTimeout), 20 | ) 21 | if err != nil { 22 | return err 23 | } 24 | 25 | // FIXME: ライブコメント存在チェック 26 | _ = client 27 | 28 | if err := os.WriteFile(config.FinalcheckPath, []byte("{}"), os.ModePerm); err != nil { 29 | return err 30 | } 31 | 32 | return nil 33 | } 34 | -------------------------------------------------------------------------------- /bench/scenario/core_pretest_dnsrecord.go: -------------------------------------------------------------------------------- 1 | package scenario 2 | 3 | import ( 4 | "context" 5 | "fmt" 6 | "math/rand" 7 | "strings" 8 | 9 | "github.com/isucon/isucon13/bench/internal/config" 10 | "github.com/isucon/isucon13/bench/internal/resolver" 11 | "github.com/najeira/randstr" 12 | ) 13 | 14 | func dnsRecordPretest(ctx context.Context, dnsResolver *resolver.DNSResolver) error { 15 | _, err := dnsResolver.Lookup(ctx, "udp", fmt.Sprintf("%s.%s", "pipe", config.BaseDomain)) 16 | if err != nil { 17 | return fmt.Errorf("名前解決エラー: %v", err) 18 | } 19 | for i := 0; i < 10; i++ { 20 | r := config.DefaultDNSRecord[rand.Intn(len(config.DefaultDNSRecord))] 21 | _, err := dnsResolver.Lookup(ctx, "udp", fmt.Sprintf("%s.%s", r, config.BaseDomain)) 22 | if err != nil { 23 | return fmt.Errorf("名前解決エラー: %v", err) 24 | } 25 | } 26 | // 存在しない名前で 27 | for i := 0; i < 3; i++ { 28 | r := strings.ToLower(randstr.String(16)) 29 | _, err = dnsResolver.Lookup(ctx, "udp", fmt.Sprintf("%s.%s", r, config.BaseDomain)) 30 | if err != nil && strings.Contains(err.Error(), "サーバーリストに含まれていません") { 31 | // is not in the server listの時だけerr。それ以外は無視できる 32 | return fmt.Errorf("名前解決エラー: %v", err) 33 | } 34 | } 35 | return nil 36 | } 37 | -------------------------------------------------------------------------------- /bench/scenario/core_pretest_initial.go: -------------------------------------------------------------------------------- 1 | package scenario 2 | 3 | import ( 4 | "context" 5 | "fmt" 6 | 7 | "github.com/isucon/isucandar/agent" 8 | "github.com/isucon/isucon13/bench/internal/config" 9 | "github.com/isucon/isucon13/bench/internal/resolver" 10 | "github.com/isucon/isucon13/bench/isupipe" 11 | "go.uber.org/zap" 12 | ) 13 | 14 | // 初期データpretest 15 | 16 | func normalInitialPaymentPretest(ctx context.Context, contestantLogger *zap.Logger, dnsResolver *resolver.DNSResolver) error { 17 | // 初期状態で0円であるか 18 | client, err := isupipe.NewCustomResolverClient( 19 | contestantLogger, 20 | dnsResolver, 21 | agent.WithTimeout(config.PretestTimeout), 22 | ) 23 | if err != nil { 24 | return err 25 | } 26 | 27 | result, err := client.GetPaymentResult(ctx) 28 | if err != nil { 29 | return err 30 | } 31 | 32 | if result.TotalTip != 0 { 33 | return fmt.Errorf("初期の売上は0ISUでなければなりません") 34 | } 35 | 36 | return nil 37 | } 38 | -------------------------------------------------------------------------------- /bench/scenario/testdata/NoImage.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isucon/isucon13/8f6afdc3603f0c661368de4659a7240862f59623/bench/scenario/testdata/NoImage.jpg -------------------------------------------------------------------------------- /development/Makefile: -------------------------------------------------------------------------------- 1 | up/%: 2 | sudo docker compose -f docker-compose-common.yml -f docker-compose-$*.yml up -d --build 3 | 4 | down/%: 5 | sudo docker compose -f docker-compose-common.yml -f docker-compose-$*.yml down --volumes 6 | 7 | 8 | -------------------------------------------------------------------------------- /development/docker-compose-go.yml: -------------------------------------------------------------------------------- 1 | version: '3.0' 2 | 3 | services: 4 | webapp: 5 | cpus: 2 6 | mem_limit: 4g 7 | build: 8 | context: ../webapp/go 9 | init: true 10 | working_dir: /home/isucon/webapp/go 11 | container_name: webapp 12 | volumes: 13 | - ../webapp/sql:/home/isucon/webapp/sql 14 | - ../webapp/pdns:/home/isucon/webapp/pdns 15 | - ../provisioning/ansible/roles/powerdns/files/pdns.conf:/etc/powerdns/pdns.conf:ro 16 | - ../provisioning/ansible/roles/powerdns/files/pdns.d/docker.conf:/etc/powerdns/pdns.d/docker.conf:ro 17 | - ../webapp/img:/home/isucon/webapp/img 18 | environment: 19 | ISUCON13_MYSQL_DIALCONFIG_ADDRESS: mysql 20 | ISUCON13_POWERDNS_HOST: powerdns 21 | ISUCON13_POWERDNS_SUBDOMAIN_ADDRESS: 127.0.0.1 22 | ISUCON13_POWERDNS_DISABLED: true 23 | ports: 24 | - "127.0.0.1:8080:8080" 25 | depends_on: 26 | mysql: 27 | condition: service_healthy 28 | -------------------------------------------------------------------------------- /development/docker-compose-node.yml: -------------------------------------------------------------------------------- 1 | version: "3.0" 2 | 3 | services: 4 | webapp: 5 | cpus: 2 6 | mem_limit: 4g 7 | build: 8 | context: ../webapp/node 9 | init: true 10 | working_dir: /home/isucon/webapp/node 11 | container_name: webapp 12 | volumes: 13 | - ../webapp/sql:/home/isucon/webapp/sql 14 | - ../webapp/pdns:/home/isucon/webapp/pdns 15 | - ../provisioning/ansible/roles/powerdns/files/pdns.conf:/etc/powerdns/pdns.conf:ro 16 | - ../provisioning/ansible/roles/powerdns/files/pdns.d/docker.conf:/etc/powerdns/pdns.d/docker.conf:ro 17 | - ../webapp/img:/home/isucon/webapp/img 18 | - ../webapp/node/src:/home/isucon/webapp/node/src 19 | environment: 20 | ISUCON13_MYSQL_DIALCONFIG_ADDRESS: mysql 21 | ISUCON13_POWERDNS_HOST: powerdns 22 | ISUCON13_POWERDNS_SUBDOMAIN_ADDRESS: 127.0.0.1 23 | ISUCON13_POWERDNS_DISABLED: true 24 | ports: 25 | - "127.0.0.1:8080:8080" 26 | depends_on: 27 | mysql: 28 | condition: service_healthy 29 | -------------------------------------------------------------------------------- /development/docker-compose-perl.yml: -------------------------------------------------------------------------------- 1 | version: '3.0' 2 | 3 | services: 4 | webapp: 5 | cpus: 2 6 | mem_limit: 4g 7 | build: 8 | context: ../webapp/perl 9 | init: true 10 | working_dir: /home/isucon/webapp/perl 11 | container_name: webapp 12 | volumes: 13 | - ../webapp/sql:/home/isucon/webapp/sql 14 | - ../webapp/pdns:/home/isucon/webapp/pdns 15 | - ../provisioning/ansible/roles/powerdns/files/pdns.conf:/etc/powerdns/pdns.conf:ro 16 | - ../provisioning/ansible/roles/powerdns/files/pdns.d/docker.conf:/etc/powerdns/pdns.d/docker.conf:ro 17 | - ../webapp/img:/home/isucon/webapp/img 18 | environment: 19 | ISUCON13_MYSQL_DIALCONFIG_ADDRESS: mysql 20 | ISUCON13_POWERDNS_HOST: powerdns 21 | ISUCON13_POWERDNS_SUBDOMAIN_ADDRESS: 127.0.0.1 22 | ISUCON13_POWERDNS_DISABLED: true 23 | ports: 24 | - "127.0.0.1:8080:8080" 25 | depends_on: 26 | mysql: 27 | condition: service_healthy 28 | -------------------------------------------------------------------------------- /development/docker-compose-php.yml: -------------------------------------------------------------------------------- 1 | version: '3.0' 2 | 3 | services: 4 | nginx: 5 | image: nginx:latest 6 | container_name: nginx 7 | volumes: 8 | - ./php/etc/nginx/conf.d:/etc/nginx/conf.d 9 | ports: 10 | - "127.0.0.1:8443:80" 11 | - "127.0.0.1:8080:80" 12 | depends_on: 13 | - webapp 14 | 15 | webapp: 16 | cpus: 2 17 | mem_limit: 4g 18 | build: 19 | context: ../webapp/php 20 | init: true 21 | working_dir: /home/isucon/webapp/php 22 | container_name: webapp 23 | volumes: 24 | - ./php/usr/local/etc/php-fpm.d/zz-docker.conf:/usr/local/etc/php-fpm.d/zz-docker.conf 25 | - ../webapp/sql:/home/isucon/webapp/sql 26 | - ../webapp/pdns:/home/isucon/webapp/pdns 27 | - ../provisioning/ansible/roles/powerdns/files/pdns.conf:/etc/powerdns/pdns.conf:ro 28 | - ../provisioning/ansible/roles/powerdns/files/pdns.d/docker.conf:/etc/powerdns/pdns.d/docker.conf:ro 29 | - ../webapp/img:/home/isucon/webapp/img 30 | environment: 31 | ISUCON13_MYSQL_DIALCONFIG_ADDRESS: mysql 32 | ISUCON13_POWERDNS_HOST: powerdns 33 | ISUCON13_POWERDNS_SUBDOMAIN_ADDRESS: 127.0.0.1 34 | ISUCON13_POWERDNS_DISABLED: true 35 | depends_on: 36 | mysql: 37 | condition: service_healthy 38 | -------------------------------------------------------------------------------- /development/docker-compose-python.yml: -------------------------------------------------------------------------------- 1 | version: "3.0" 2 | 3 | services: 4 | webapp: 5 | cpus: 2 6 | mem_limit: 4g 7 | build: 8 | context: ../webapp/python 9 | init: true 10 | working_dir: /home/isucon/webapp/python 11 | container_name: webapp 12 | volumes: 13 | - ../webapp/sql:/home/isucon/webapp/sql 14 | - ../webapp/pdns:/home/isucon/webapp/pdns 15 | - ../provisioning/ansible/roles/powerdns/files/pdns.conf:/etc/powerdns/pdns.conf:ro 16 | - ../provisioning/ansible/roles/powerdns/files/pdns.d/docker.conf:/etc/powerdns/pdns.d/docker.conf:ro 17 | - ../webapp/img:/home/isucon/webapp/img 18 | environment: 19 | ISUCON13_MYSQL_DIALCONFIG_ADDRESS: mysql 20 | ISUCON13_POWERDNS_HOST: powerdns 21 | ISUCON13_POWERDNS_SUBDOMAIN_ADDRESS: 127.0.0.1 22 | ISUCON13_POWERDNS_DISABLED: false 23 | ports: 24 | - "127.0.0.1:8080:8080" 25 | depends_on: 26 | mysql: 27 | condition: service_healthy 28 | -------------------------------------------------------------------------------- /development/docker-compose-ruby.yml: -------------------------------------------------------------------------------- 1 | version: '3.0' 2 | 3 | services: 4 | webapp: 5 | cpus: 2 6 | mem_limit: 4g 7 | build: 8 | context: ../webapp/ruby 9 | init: true 10 | working_dir: /home/isucon/webapp/ruby 11 | container_name: webapp 12 | volumes: 13 | - ../webapp/sql:/home/isucon/webapp/sql 14 | - ../webapp/pdns:/home/isucon/webapp/pdns 15 | - ../provisioning/ansible/roles/powerdns/files/pdns.conf:/etc/powerdns/pdns.conf:ro 16 | - ../provisioning/ansible/roles/powerdns/files/pdns.d/docker.conf:/etc/powerdns/pdns.d/docker.conf:ro 17 | - ../webapp/img:/home/isucon/webapp/img 18 | environment: 19 | ISUCON13_MYSQL_DIALCONFIG_ADDRESS: mysql 20 | ISUCON13_POWERDNS_HOST: powerdns 21 | ISUCON13_POWERDNS_SUBDOMAIN_ADDRESS: 127.0.0.1 22 | ports: 23 | - "127.0.0.1:8080:8080" 24 | depends_on: 25 | mysql: 26 | condition: service_healthy 27 | -------------------------------------------------------------------------------- /development/docker-compose-rust.yml: -------------------------------------------------------------------------------- 1 | version: '3.0' 2 | 3 | services: 4 | webapp: 5 | cpus: 2 6 | mem_limit: 4g 7 | build: 8 | context: ../webapp/rust 9 | init: true 10 | working_dir: /home/isucon/webapp/rust 11 | container_name: webapp 12 | volumes: 13 | - ../webapp/sql:/home/isucon/webapp/sql 14 | - ../webapp/pdns:/home/isucon/webapp/pdns 15 | - ../provisioning/ansible/roles/powerdns/files/pdns.conf:/etc/powerdns/pdns.conf:ro 16 | - ../provisioning/ansible/roles/powerdns/files/pdns.d/docker.conf:/etc/powerdns/pdns.d/docker.conf:ro 17 | - ../webapp/img:/home/isucon/webapp/img 18 | environment: 19 | ISUCON13_MYSQL_DIALCONFIG_ADDRESS: mysql 20 | ISUCON13_POWERDNS_HOST: powerdns 21 | ISUCON13_POWERDNS_SUBDOMAIN_ADDRESS: 127.0.0.1 22 | ports: 23 | - "127.0.0.1:8080:8080" 24 | depends_on: 25 | mysql: 26 | condition: service_healthy 27 | -------------------------------------------------------------------------------- /development/etc/nginx/conf.d/nginx.conf: -------------------------------------------------------------------------------- 1 | server { 2 | listen 80; 3 | 4 | client_max_body_size 10m; 5 | root /home/isucon/webapp/go/public/; 6 | 7 | location / { 8 | proxy_set_header Host $host; 9 | proxy_pass http://webapp:8080; 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /development/php/etc/nginx/conf.d/nginx.conf: -------------------------------------------------------------------------------- 1 | server { 2 | listen 80; 3 | 4 | client_max_body_size 10m; 5 | root /home/isucon/webapp/php/public/; 6 | 7 | location / { 8 | try_files $uri /index.php$is_args$args; 9 | } 10 | 11 | location = /index.php { 12 | include fastcgi_params; 13 | fastcgi_index index.php; 14 | fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 15 | fastcgi_pass webapp:8080; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /development/php/usr/local/etc/php-fpm.d/zz-docker.conf: -------------------------------------------------------------------------------- 1 | [global] 2 | daemonize = no 3 | 4 | [www] 5 | listen = 8080 6 | -------------------------------------------------------------------------------- /envcheck/.gitignore: -------------------------------------------------------------------------------- 1 | isucon-admin 2 | /isucon-env-checker/isucon-env-checker 3 | envcheck 4 | envcheck_darwin -------------------------------------------------------------------------------- /envcheck/Makefile: -------------------------------------------------------------------------------- 1 | DARWIN_TARGET_ENV=GOOS=darwin GOARCH=arm64 2 | LINUX_TARGET_ENV=GOOS=linux GOARCH=amd64 3 | 4 | BUILD=go build 5 | 6 | DESTDIR=. 7 | TAG=envcheck:latest 8 | 9 | .PHONY: build 10 | build: 11 | CGO_ENABLED=0 $(DARWIN_TARGET_ENV) $(BUILD) -o $(DESTDIR)/envcheck_darwin -ldflags "-s -w" 12 | CGO_ENABLED=0 $(LINUX_TARGET_ENV) $(BUILD) -o $(DESTDIR)/envcheck -ldflags "-s -w" 13 | cp -a envcheck ../provisioning/ansible/roles/envcheck/files/ 14 | -------------------------------------------------------------------------------- /envcheck/data.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "github.com/aws/aws-sdk-go/service/ec2" 5 | ) 6 | 7 | type Data struct { 8 | ExpectedAMIID string 9 | ExpectedAZID string 10 | 11 | InstanceVPCID string 12 | 13 | DescribeInstances []*ec2.DescribeInstancesOutput 14 | DescribeVolumes []*ec2.DescribeVolumesOutput 15 | DescribeNetworkInterfaces []*ec2.DescribeNetworkInterfacesOutput 16 | 17 | DescribeAvailabilityZones *ec2.DescribeAvailabilityZonesOutput 18 | } 19 | -------------------------------------------------------------------------------- /envcheck/go.mod: -------------------------------------------------------------------------------- 1 | module github.com/isucon/isucon13-portal/envcheck/isucon-env-checker 2 | 3 | go 1.18 4 | 5 | require github.com/aws/aws-sdk-go v1.44.19 6 | 7 | require github.com/jmespath/go-jmespath v0.4.0 // indirect 8 | -------------------------------------------------------------------------------- /envcheck/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "os" 6 | ) 7 | 8 | func main() { 9 | p, err := LoadPortalCredentials() 10 | if err != nil { 11 | fmt.Println("チェッカーの設定ファイルが読み込めませんでした") 12 | os.Exit(1) 13 | } 14 | 15 | var name string 16 | if len(os.Args) == 2 && os.Args[1] == "boot" { 17 | name = "contest-boot" 18 | } else { 19 | name = "contest-ssh" 20 | fmt.Println("SSH 接続が成功しました") 21 | } 22 | 23 | info, err := p.GetInfo(name) 24 | if err != nil { 25 | fmt.Printf("ポータルから情報の取得に失敗しました: %v\n", err) 26 | os.Exit(1) 27 | } 28 | 29 | fmt.Println("環境をチェックしています...") 30 | result, err := Check(CheckConfig{ 31 | Name: name, 32 | AMI: info.AMI, 33 | AZ: info.AZ, 34 | }) 35 | if err != nil { 36 | fmt.Printf("環境チェックに失敗しました: %v\n", err) 37 | os.Exit(1) 38 | } 39 | 40 | if err := p.SendResult(result); err != nil { 41 | fmt.Printf("チェック結果の送信に失敗しました: %v\n", err) 42 | os.Exit(1) 43 | } 44 | fmt.Println(result.Message) 45 | if !result.Passed { 46 | os.Exit(1) 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /frontend/.gitattributes: -------------------------------------------------------------------------------- 1 | .yarn/* linguist-generated=true 2 | yarn.lock linguist-generated=true 3 | src/api/apiClient.ts linguist-generated=true 4 | src/api/types.ts linguist-generated=true 5 | -------------------------------------------------------------------------------- /frontend/.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | dist 12 | dist-ssr 13 | *.local 14 | 15 | # Editor directories and files 16 | !.vscode/extensions.json 17 | .idea 18 | .DS_Store 19 | *.suo 20 | *.ntvs* 21 | *.njsproj 22 | *.sln 23 | *.sw? 24 | 25 | /.yarn/cache 26 | /.yarn/install-state.gz 27 | -------------------------------------------------------------------------------- /frontend/.prettierignore: -------------------------------------------------------------------------------- 1 | .yarn 2 | node_modules 3 | /dist/ 4 | -------------------------------------------------------------------------------- /frontend/.prettierrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "singleQuote": true 3 | } 4 | -------------------------------------------------------------------------------- /frontend/.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "editor.codeActionsOnSave": { 3 | "source.fixAll": true 4 | }, 5 | "editor.formatOnSave": true, 6 | "editor.defaultFormatter": "esbenp.prettier-vscode", 7 | "files.insertFinalNewline": true 8 | } 9 | -------------------------------------------------------------------------------- /frontend/.yarnrc.yml: -------------------------------------------------------------------------------- 1 | nodeLinker: node-modules 2 | -------------------------------------------------------------------------------- /frontend/Makefile: -------------------------------------------------------------------------------- 1 | .PHONY: all deps js_build hash build 2 | 3 | ROOT_DIR:=$(shell dirname $(realpath $(firstword $(MAKEFILE_LIST)))) 4 | 5 | all: deps build 6 | 7 | deps: 8 | corepack enable 9 | yarn 10 | 11 | js_build: 12 | yarn build 13 | 14 | hash: 15 | cd $(ROOT_DIR)/dist && sha256sum `find . -type f ` > $(ROOT_DIR)/../bench/assets/data/hash.txt 16 | 17 | build: js_build hash 18 | -------------------------------------------------------------------------------- /frontend/README.md: -------------------------------------------------------------------------------- 1 | # frontend 2 | 3 | ## How to build 4 | 5 | Requires Node.js and corepack 6 | 7 | ```bash 8 | corepack enable 9 | yarn 10 | yarn build 11 | tree dist 12 | ``` 13 | -------------------------------------------------------------------------------- /frontend/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 | 5 | 6 |