EC2でS3をマウントする

前提

  • EC2ではAmazon Linux2を利用
  • EC2へsshで入っている

手順

1.AWS CLIをインストール

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法

二次元累積和

半分全列挙

決め打ち二分探索

bit全探索

ダイクストラ

ベルマンフォード法

TSP

第11回日本情報オリンピック予選(オンライン) D

問題

atcoder.jp

考えたこと

以下のようなDP配列を考える。

dp[n][3][3] = 選び方の組み合わせ数
  • 1番目の要素はn日目を表す
  • 2番目の要素は選択するソースの種類
  • 3番目の要素は何日連続でそのソースのパスタを選んでいるかの値

基本的にi-1日目のソースとi日目のソースの選び方は3 * 3 = 9通り。 ただし、i日目のソースが既に決まっている場合3 * 1 = 3通り、i-1日目が既に決まっている場合も同様。

DP漸化式の考察

i日目のソースが決まっていない場合

  • jとkが異なる値つまり、前日に選んだソースと別のソースを選ぶ場合、i-1日目でソースkを選んだもののうちs日連続で選んだものを足す(s \leqq 2)
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日連続で選んだものを足す(s \leqq 2)
 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)
    これは p= 1のときは答えが0になる。 p= 0のときは 2^ nとなる。

ビスケットが偶数個入った袋をa個、ビスケットが奇数個入った袋をb個とする。
今の段階で以下の式が成り立つ。
a+b=n

考えたことをまとめるとpの値によらずビスケットが偶数個入った袋はいくつ選んでも良い。pの値により 場合分けが必要になるのはビスケットが奇数個入った袋。

  • ビスケットが奇数個入った袋から奇数袋分選ぶことは以下の式で表すことが出来る。
     _b C_1 + _b C_3 + _b C_5 + _b C_7 + _b C_9 + _b C_{11} + ....+

  • ビスケットが奇数個入った袋から偶数袋分選ぶことは以下の式で表すことが出来る。
     _b C_0 + _b C_2 + _b C_4 + _b C_6 + _b C_8 + _b C_{10} + ....+

よってそれぞれの場合について解答は以下の計算式で求められる。  2 ^ a  \times( _b C_1 + _b C_3 + _b C_5 + _b C_7 + _b C_9 + _b C_{11} + ....+  )

 2 ^ a  \times( _b C_0 + _b C_2 + _b C_4 + _b C_6 + _b C_8 + _b C_{10} + ....+   )

コーナーケース以外でなぜ解答が2 ^ {n-1}となるのか

二項定理より以下の式が成り立つ。
 _n C_0 + _n C_1x + _n C_2x ^2 +.... + _n C_nx ^ n  = (1+x) ^ n   ……①

①にx=1を代入すると以下の式が得られる
 _n C_0 + _n C_1 + _n C_2 +.... + _n C_n  = 2 ^ n  ……②

また①にx=-1を代入すると以下の式が得られる
 _n C_0 - _n C_1 + _n C_2 - _n C_3 + ....+ (-1) ^ n _n C_n  =  0
変形すると以下のようになる。
 _n C_0  + _n C_2 + _n C_4 +  ....  =  _n C_1 + _n C_3  + _n C_5 + ....

この式の左辺を A右辺を Bとする。両辺にAを足すと以下のようになる。
 A + B  =  B + B
①より A + B  =  2 ^ nなので B  =  2 ^ {n-1}
同様にして両辺にAを足した場合、 A  =  2 ^ {n-1}が得られ、以下のようになる。
 _n C_0  + _n C_2 + _n C_4 +  ....  =  _n C_1 + _n C_3  + _n C_5 + .... = 2 ^ {n-1}

終結

コーナーケースを除いた場合以下の式が成り立つことが分かる
 2 ^ a  \times( 2 ^ {b-1} )

ここでa+b=nなので最終的にコーナーケースを除いた場合の求める数は2 ^ {n-1}となる。

参考リンク

http://izumi-math.jp/I_Yanagita/binomial_theorem1.pdf

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に感謝。

github.com

 

 

成長点

・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に上がっているので出題範囲のサービスを大方見た

以下例

www.youtube.com

 

www.youtube.com

 

3.ホワイトペーパーを一通り読み込んだ

aws.amazon.com

このリンクにある「AWS Well-Architected フレームワーク」はAWSの基本的な考え方が示してあるので、読んでおいたほうがよいかなと個人的には思う。

 

4.模擬試験を受けて、それの復習

実際に模擬試験を税込み2160円で受けられる。模擬試験で分からなかった部分の復習が資格を取る上では一番重要だと思う。これが一番効いた。

 

5.WEB問題集を解く

AWS WEB問題集で学習しよう | 赤本ではなく黒本の問題集から学習する方向け

 このリンクのダイヤモンドプランで問題を300くらい解いた。正解の根拠となる公式ドキュメントのリンクが、どの問題でも貼られるのでそれも読み込んだ。

 

6.実際に手を動かす

全てに言えるかもしれないが、実際に構築して遊ぶのはAWSの感覚をつかむ上では大事だと感じた。

 

最後に

資格が取れたことよりも、AWSのサービスがどの技術を使ってできているかというのが分かるようになったのが一番良かった。以下例

・SAML2.0

OpenID Connect

LDAP

・BGP