# isucon11 initでメソッドに対してfuncを紐づける HTTPmethod+routeの名前 (例: e.POST("/api/auth", postAuthenticeation)) ## conditionについて post conditoinにisuから投げられる このpost操作は遅延する可能性があり、競技側もこれを許容している そのため、逆にこの操作をできるだけ速くすることで得点アップが狙える GET /api/condition/:jia_isu_uuid GET /api/isu/:jia_isu_uuid/graph この操作が叩かれたときに、グラフの状態が完璧なほど加点される グラフのデータポイントは 1 時間単位 ### 当日のグラフ 当日のグラフ とは、仮想時間における現在時刻 (仮想現在時刻) が例えば 2021-08-19 01:13:30 であるとき、 2021-08-19 00:00:00 を datetime に指定して得られる、2021-08-19 の 日毎グラフ です ### 完成したグラフ 当日以外のグラフ(当日のグラフ ではない 日毎グラフ)は、 完成したグラフ(後述)のみ加点の対象になります。 確認仮想時間が12時かどうかが重要になる 当日の12時を過ぎると前日のグラフは完成したことになる 任意の 日毎グラフ(G)、G の前日の 日毎グラフ(G-1)、G の前々日の 日毎グラフ(G-2)を考えます。次の 2 つの条件をチェックします。 G の 12 時以降のデータポイントいずれかにデータがある時、 G-1 以前の 日毎グラフ は全て 完成したグラフ とみなされる。 G の 0~11 時のデータポイントいずれかにデータがある時、 G-2 以前の 日毎グラフ は全て 完成したグラフ とみなされる。 また、このチェックの際は G のうち 未来 のデータポイントは無視されます。 ## func getSession ここで出てくるsessions.Sessionは以下 https://pkg.go.dev/github.com/gorilla/sessions?utm_source=godoc#Session ``` type Session struct { // The ID of the session, generated by stores. It should not be used for // user data. ID string // Values contains the user-data for the session. Values map[interface{}]interface{} Options *Options IsNew bool // contains filtered or unexported fields } ``` ## func getUserIDFromSession ここでUserIDを取ってる ユーザーIDは一意(ふつうたぶん)なのに dbで無駄に取ってそう ## func getJIAServiceURL `jia_service_url`という`name`を持つデータをSELECT allで取得 その後`url`データを返す ## func postInitialize マニュアルに書いてあったところのやつ INSERTが使われている ``` 参考実装では、初期化処理(POST /initialize)においてデータベースを初期状態に戻します。 以下のコマンドでもデータベースを初期状態に戻すことができます。 ~isucon/webapp/sql/init.sh 初期化処理は用意された環境内で、ベンチマーカーが要求する範囲の整合性を担保します。 サーバーサイドで処理の変更・データ構造の変更などを行う場合、この処理が行っている内容を漏れなく提供してください。 ``` ## postAuthentication token分離したあとに検証 user idを取得して、それに対してINSERTをする IGNOREをつけてsign up処理と同時にしている その後Save ## postSignout サインアウト処理 ## func getMe サインインしている自分自身の情報を取得 getUserIDFromSessionでIDを取った後に、GetMeResponse structのキーとして使い値を取得 ## func getIsuList (結構大事そう) isuからSELECT allで user idが一致するものを取り出し、isuのidをdescでソート そのあとにisu_conditionからuuidが一致しているものをisuList回取り出す それぞれのクエリで取り出された値は構造体に格納される ## func postIsu (結構大事そう) isuを登録 imageが登録されればそれを使うし、登録されていなかったらデフォルトイメージを使う その後DBにisuをINSERT activateするためのJSONとhttpリクエストを発行 返ってきたresponseをunmarshalし、その値を使ってDBをupdate 最後に登録したisuを取得するDBを叩いて終了(commit) ## getIsuID, getIsuIcon 似たような実装 取るやつが全部なのかIconなのかだけ SELECT allでisuを検索 ## isu_association_config 一回だけ更新される 別にDBにもっておく必要はなさそう