# 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にもっておく必要はなさそう