EC2でS3をマウントする
前提
手順
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" unzip awscliv2.zip sudo ./aws/install
2.aws configureの実施
aws configure
3.fuse インストール
sudo yum install -y fuse
4.goofysインストール
sudo curl -L https://github.com/kahing/goofys/releases/latest/download/goofys -o /usr/local/bin/goofys sudo chmod a+x /usr/local/bin/goofys
5.再起動後もマウント設定
vi /home/ec2-user/.bash_profile /usr/local/bin/goofys bucket-XXX /home/ec2-user/###
参考
Cloud SQL インスタンスの起動と停止をスケジューリングする方法
やり方
基本的にここを参考にすればよい
開発費用の削減: Cloud SQL インスタンスの起動と停止をスケジュールする | Google Cloud Blog
変更しないといけないところ
- ランタイムをGo 1.16にする(これにしないとデプロイでエラー起きる)
工夫点
- Cloud Functionのデプロイの際に、指定するサービスアカウントを新規で用意した
- 上のサービスアカウントにはロールとして「Cloud Functions サービス エージェント」と「Cloud SQL 管理者」を付与した
今後の検証
- 公式では「Cloud SQL管理者」ロール与えてるけど、そこまで強い権限が本当にいるのか確かめたい
競プロの問題カテゴリ分け
各カテゴリごとに問題を記載
imos法
二次元累積和
- ARC025 Batcoder.jp
- 2007年 日本情報オリンピック春合宿OJ atcoder.jp
- ABC005 Datcoder.jp
- atcoder.jp
半分全列挙
決め打ち二分探索
bit全探索
ダイクストラ法
ベルマンフォード法
TSP
第11回日本情報オリンピック予選(オンライン) D
問題
考えたこと
以下のようなDP配列を考える。
dp[n][3][3] = 選び方の組み合わせ数
- 1番目の要素はn日目を表す
- 2番目の要素は選択するソースの種類
- 3番目の要素は何日連続でそのソースのパスタを選んでいるかの値
基本的にi-1日目のソースとi日目のソースの選び方は通り。 ただし、i日目のソースが既に決まっている場合通り、i-1日目が既に決まっている場合も同様。
DP漸化式の考察
i日目のソースが決まっていない場合
- jとkが異なる値つまり、前日に選んだソースと別のソースを選ぶ場合、i-1日目でソースkを選んだもののうちs日連続で選んだものを足す()
dp[i][j][1] += dp[i-1][k][s]
- jとkが同じ値つまり、前日に選んだソースと同じソースを選ぶ場合、i-1日目でソースjを選んだもののうち1日連続で選んだもののみ足す
dp[i][j][2] += dp[i-1][j][1]
i日目のソースが決まっている場合
i日目のソースの種類のことをここではsource[i]
とする。
source[i]
とkが異なる値つまり、前日に選んだソースがi日目のソースと違う場合、i-1日目でソースkを選んだもののうちs日連続で選んだものを足す()
dp[i][source[i]][1] += dp[i - 1][k][s];
source[i]
とkが同じ値つまり、前日に選んだソースがi日目のソースと同じ場合、i-1日目でソースsource[i]
を選んだもののうち1日連続で選んだものを足す
dp[i][source[i]][2] += dp[i - 1][source[i]][1];
ソースコード
#include <bits/stdc++.h> #define rep(i, n) for (int i = 0; i < (n); i++) #define rrep(i, n) for (int i = (n - 1); i >= 0; i--) #define ALL(v) v.begin(), v.end() using namespace std; using P = pair<int, int>; typedef long long ll; template<class T> inline bool chmax(T& a, T b) { if (a < b) { a = b; return 1; } return 0; } template<class T> inline bool chmin(T& a, T b) { if (a > b) { a = b; return 1; } return 0; } const int dx[4] = {1, 0, -1, 0}; const int dy[4] = {0, 1, 0, -1}; const int MOD = 10000; ll dp[120][3][3]; int main() { int n, k; cin >> n >> k; vector<int> source(n, -1); rep(i, k){ int a, b; cin >> a >> b; a--, b--; source[a] = b; } if(source[0]== -1){ rep(k, 3){ dp[0][k][1] = 1; } }else{ dp[0][source[0]][1] = 1; } for (int i = 1; i < n; i++){ if(source[i] == -1){ rep(j, 3){ rep(k, 3){ if(j == k){ dp[i][j][2] += dp[i - 1][k][1]; dp[i][j][2] %= MOD; }else{ rep(s, 3){ dp[i][j][1] += dp[i - 1][k][s]; dp[i][j][1] %= MOD; } } } } }else{ rep(k, 3){ if(source[i] == k){ dp[i][source[i]][2] += dp[i - 1][source[i]][1]; dp[i][source[i]][2] %= MOD; }else{ rep(s, 3){ dp[i][source[i]][1] += dp[i - 1][k][s]; dp[i][source[i]][1] %= MOD; } } } } } ll ans = 0; rep(i, 3){ rep(k, 3){ ans += dp[n - 1][i][k]; ans %= MOD; } } cout << ans << endl; }
AtCoder Grand Contest017 A
AGC017 A
https://atcoder.jp/contests/agc017/tasks/agc017_a
考えたこと
- 最終的に食べたビスケットの総数の余りが0であろうが1であろうが偶数個の入ったビスケットは結果に影響しない。
- ビスケットが偶数個入った袋のみを何個選ぼうが総計が偶数個にしかならない。
- ビスケットが奇数個入った袋を偶数個選ぶと、余りが0になり、奇数個選ぶと余りが1になる。
考察パート
- コーナーケース(ビスケットが奇数個入った袋が0)
これは のときは答えが0になる。 のときはとなる。
ビスケットが偶数個入った袋をa個、ビスケットが奇数個入った袋をb個とする。
今の段階で以下の式が成り立つ。
考えたことをまとめるとpの値によらずビスケットが偶数個入った袋はいくつ選んでも良い。pの値により
場合分けが必要になるのはビスケットが奇数個入った袋。
ビスケットが奇数個入った袋から奇数袋分選ぶことは以下の式で表すことが出来る。
ビスケットが奇数個入った袋から偶数袋分選ぶことは以下の式で表すことが出来る。
よってそれぞれの場合について解答は以下の計算式で求められる。
コーナーケース以外でなぜ解答がとなるのか
二項定理より以下の式が成り立つ。
……①
①にを代入すると以下の式が得られる
……②
また①にを代入すると以下の式が得られる
変形すると以下のようになる。
この式の左辺を右辺をとする。両辺にAを足すと以下のようになる。
①よりなので
同様にして両辺にAを足した場合、が得られ、以下のようになる。
最終結果
コーナーケースを除いた場合以下の式が成り立つことが分かる
ここでなので最終的にコーナーケースを除いた場合の求める数はとなる。
参考リンク
ISUCON9出た、また惨敗
目次
チーム紹介と結果
去年に引き続き、チーム「ニューウェーブ」でpikatenor、enoughと一緒にISUCON9に出ました。今年で出場は2回目で言語はRubyを選択。結果から言うとスコアはFailで2年連続惨敗でした。
各々やったこと
僕が把握している限りで以下のことをそれぞれがやりました。
enough N+1をひたすら直していく。
pikatenor 複数台構成やpuma周り、nginxの設定。その他なんでも。
hayaten0415 Ansible流すこと。alpとpt-query-digestの結果を解析してpikatenorと一緒にインフラ周り直す。
当日使用したAnsibleは以下のもので、これは去年osyoyuが作ったものをforkしてISUCON9と我々のチーム用に修正したものです。昨年のosyoyuに感謝。
成長点
・enoughがSinatraに慣れたことでアプリのコード改善をゴリゴリできるようになったこと
・alpとpt-query-digestを導入してなんとなく取り掛かるのではなく、明確に当たりをつけて取り掛かれるようになったこと
明確な敗因
・複数台構成にしたときのnginxの設定
・puma周りの知見不足
午前中にN+1クエリ潰して、itemsテーブルのフルスキャンを潰せたものの、午後くらいから複数台構成を始めたところから昨年同様詰まってしまいました。 nginx.confの設定を間違えていることに気づかずに結局終了してしまいました。ベストスコアは午前に3110出してそれ以降は駄目でした。
来年に向けて
明らかに実力不足なのはもちろん、準備も足りてないので来年は3人でしっかり準備して出場したいという気持ちが強いです。MySQL8.0へのアップグレードを事前準備で練習していたにも関わらず当日は日和ってやめてしまいました。もし来年もMySQLであれば十分準備して8.0アップグレードに挑みたいです。
去年と同じノリで監視用にnetdataを選択していましたが、もっとかっこいいダッシュボードを作りたいという気持ちが出てきたので来年の僕がいい感じにやってくれるでしょう。
自分から見たISUCONについて
ISUCONに参加することでチームメンバーの成長、または自分の成長を実感できるので自分にとってはこれほどの楽しさを感じる瞬間はISUCON以外ではそうそうないです。これは間違いなく運営の皆さんのおかげで楽しめているので、運営の方々にはとても感謝しています。本当にありがとうございます。
AWS認定ソリューションアーキテクト アソシエイトに合格した
目次
実務経験
今年の3月から仕事でAWSを使うようになり、CloudFormation(CFn)を主にやっていた。最近Terraformもやるようになった。
資格を取ろうと思った経緯
仕事でAWS環境でのインフラ構築やら、整備をやっていて、上長に「資格取ってみたら?」と言われたのでノリで受けた。あと、AWS Summitとかにある資格取得者しか入れないラウンジに行きたかった。
資格取得のための学習時間
2週間程度。一日2~3時間はやった。
実際に勉強した内容
1.以下の参考図書を読んだ
AWS認定資格試験テキスト AWS認定 ソリューションアーキテクト-アソシエイト
徹底攻略 AWS認定ソリューションアーキテクト-アソシエイト
AmazonWeb Services パターン別構築・運用ガイド
3番目の「AWS Web Services パターン別構築・運用ガイド」は仕事中これを読んでいたくらいなので業務にも役立ってお得。
2.Black beltがYoutubeに上がっているので出題範囲のサービスを大方見た
以下例
3.ホワイトペーパーを一通り読み込んだ
このリンクにある「AWS Well-Architected フレームワーク」はAWSの基本的な考え方が示してあるので、読んでおいたほうがよいかなと個人的には思う。
4.模擬試験を受けて、それの復習
実際に模擬試験を税込み2160円で受けられる。模擬試験で分からなかった部分の復習が資格を取る上では一番重要だと思う。これが一番効いた。
5.WEB問題集を解く
AWS WEB問題集で学習しよう | 赤本ではなく黒本の問題集から学習する方向け
このリンクのダイヤモンドプランで問題を300くらい解いた。正解の根拠となる公式ドキュメントのリンクが、どの問題でも貼られるのでそれも読み込んだ。
6.実際に手を動かす
全てに言えるかもしれないが、実際に構築して遊ぶのはAWSの感覚をつかむ上では大事だと感じた。
最後に
資格が取れたことよりも、AWSのサービスがどの技術を使ってできているかというのが分かるようになったのが一番良かった。以下例
・SAML2.0
・OpenID Connect
・LDAP
・BGP