OmniAICreator/Qiita-1.07M huggingface dataset:
【学習メモ】AWS Well-Architected

<h1>AWS Well-Architectedの五つの原則</h1>
Umedyの講座に基づいて、書いた学習メモです。
<span>
・オペレーショナルエクセレンス（Operational Excellence）
・セキュリティ（Security）
・信頼性（Reliability）
・パフォーマンス効率（Performance Efficiency）
・コスト最適化（Cost Optimization）
<cite>Reference:<a href=""https://aws.amazon.com/jp/architecture/well-architected/?wa-lens-whitepapers.sort-by=item.additionalFields.sortDate&wa-lens-whitepapers.sort-order=desc>AWS Well-Architected</cite>
</span>

<h2>設計原則：オペレーショナルエクセレンス</h2>
<span>
運用上の優秀性とは計画変更が起こった場合や予期せぬイベントの発生時において、自動化された運用実務及び文書化されテストされレビューされた手順があること。

★設計事項：
・コードに基づく運用実施
・ビジネスも苦的に沿った運用手順
・定期的かつ小規模で増加的な変更実施
・予期せぬイベントへの応答テスト
・運用イベントと障害からの学習
・運用手順を最新のものに保持すること

★基本対応領域＆主要サービス：
①準備：CloudFormation、Codeシリーズ、Runbook、Playbook
②運用：System Manager、Service Catalog、CloudTrail、AWS Artifact、AWS GuardDuty、CloudWatch、AWS Config、API Gateway
③進化：改善に時間とリソースを割り当て、運用の有効性と効率性を向上させる
</span>

<h2>設計原則：セキュリティ</h2>
<span>
AWS内のデータ／システム／アセットの保護とモニタリングによりセキュリティを高める。

★設計事項：
・全てのレイヤーでのセキュリティを適用
・アクセス追跡・モニタリングを確実な実施
・条件ドリブンのアラートをトリガーとしてセキュリティイベントへの応答を自動化
・AWS責任共有モデルに基づく対象範囲の保護に集中する
・セキュリティのベストプラクティスの自動化

★基本対応領域＆主要サービス：
①データ保護：ELB、EBS、S3、RDS、KMS
②権限管理：IAM、MFA
③インフラ保護：VPC
④検出制御：CloudTrail、CloudWatch、AWS GuardDuty、Amazon Inspector
</span>

<h2>設計原則：信頼性</h2>
<span>
障害による中断・停止と障害復旧による影響を軽減するインフラを構成する。
（このメモを書いた時、丁度地震が起きました😅）

★設計事項：
・インフラストラクチャサービスの障害復旧の自動化など軽減設計
・復旧手順のテストによる検証
・需要変化に応じた水平方向へのスケーラビリティによる高可用性の確保
・キャパシティの推測をやめる
・モニタリングと自動化を進める

★基本対応領域＆主要サービス：
　①基盤：IAM、VPC、AutoScaling、ELB、CloudFormation
　②変更管理：CloudTrail、AWS Config
　③障害管理：CloudWatch
</span>

<h2>設計原則：パフォーマンス効率</h2>
<span>
システム要件のリソース最適化によるインフラ効率化。

★設計事項：
・システム要件を満たすためにコンピューティングリソースを効率化する
・システム要件やAWSサービスの進化に応じてAWSインフラの効率化を推進する

★基本対応領域＆主要サービス：
　①コンピューティング：Auto Scaling、Lamda
　②ストレージ：EBS、S3、Glacier、EFS
　③データベース：RDS、DynamoDB、ElasticSearch、Aurora、Redshift
　④容量と時間のトレードオフ：CloudFront、Elastic Cache
</span>

<h2>設計原則：コスト最適化</h2>
<span>
不必要なリソースの削減や最適な料金選択によりコスト削減。

★設計事項：
・不必要なリソース削減
・透明性のある費用賦課
・マネージド型サービスの利用によるコスト削減
・固定の償却コストを変動コストへと転換
・スケールによるコストメリット
・データセンターへの投資不要化

★基本対応領域＆主要サービス：
　①需要と供給の一致：Auto Scaling
　②コスト効率の高いリソース：EC2購入方式、Trusted Advisor
　③支出の認識：Cloud Watch、見積もりツール
　④継続した最適化：AWS最新情報、Trusted Advisor
</span>
RailsとVue.jsでメールアドレスが登録済みか判定する方法

こんばんは
アロハな男、やすのりです！

今日は会員制のWebアプリ等でよく見かける『このメールアドレスは登録済みです。』みたいな表示を`Rails`と`Vue.js`を使って実装しちゃいましょう！
やり方さえわかれば、`Vue.js`じゃなくても`Ajax`を使えばできると思います！
※今回はRailsをAPIモードで使用しています。
※全てのコードを記述すると長くなるので、多少変更し必要最低限だけ記載します。

[![Image from Gyazo](https://i.gyazo.com/431906588bf28ae4e5d35af527a55c05.gif)](https://gyazo.com/9c5df29795912effdc40361203a39673)

#結論
Railsのコードが、

```ruby:routes.rb
  namespace :api do
    scope :v1 do
      post '/auth/check_email', to: 'users#is_registerd?'
    end
  end
```
```ruby:users_controller.rb
  def is_registerd?
    @user = User.is_exists?(params[:email])
    render json: @user
  end
```
こうで、Vue.jsのコードが、

```javascript:user.js
  isRegisterd({}, email) {
    return axios.post('/api/v1/auth/check_email', {
      email: email,
    })
    .then(response => {
      if (response.data) {
        this.errorMessage = 'すでに登録されているメールアドレスです';
      };
    });
  }
```
と、なります！

それでは、順番に見ていきましょう！

# Railsのコード
さて、それではまずは`Rails`のコードから見ていきましょう。

```ruby:routes.rb
  namespace :api do
    scope :v1 do
      get '/auth/check_email', to: 'users#is_registerd?'
    end
  end
```
最初にルーティングですが、Railsが最初からサポートしてくれる`resources`では作成されない、**メールアドレスが登録済みか確認するためだけ**の新しいアクションが必要になるため、直接HTTPメソッドや希望のパスやアクションを定義したいコントローラーを記述しちゃいましょう！
※`api`や`v1`はAPIモードでは通例のようなものになっているので今回は説明を省きます！

そうすると出来上がるのが以下のようなルーティングです。

![ddd09f462e635474ac49c71ce8d11e98.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/699622/3901bbe8-74ff-6d2f-6a32-da840b7f3f34.jpeg)

さぁ、これでアクションへの道筋は出来上がりました。
では次に実際にメールアドレスを確認するアクションを定義しちゃいましょう。

```ruby:users_controller.rb
  def is_registerd?
    @user = User.is_exists?(params[:email])
    render json: @user
  end
```
それがこちら！

ここではリクエストで送られてきたパラメーターの中から`:email`を抜き出しUserモデル内にメールアドレスが存在しているかどうかを確認します。

その後、メールアドレスが既にUserモデル内にあれば`true`を、無ければ`false`を返します。

そして、その真偽値をjson形式でフロント側へレスポンスとして返して終了です！

# Vue.jsのコード
それでは次は`Vue.js`のコードを見ていきましょう。

```javascript:user.js
  isRegisterd({}, email) {
    return axios.post('/api/v1/auth/check_email', {
      email: email,
    })
    .then(response => {
      if (response.data) {
        this.errorMessage = 'すでに登録されているメールアドレスです';
      };
    });
  }
```
Vue.jsのコードもそこまで難しくありませんね。

`isRegisterd関数`の第2引数にメールアドレスの情報を渡すことで関数内で使用することができます。
そして関数内で`Ajax`処理をしてくれる`Axios`を使用し、第１引数に先ほどRailsで定義した`アクションへのパス`を記述し、第２引数に`email`というパラメーター名にメールアドレスの情報を格納してリクエストを送るように記述します。

そして最後に、レスポンスとして返却された値が`true`つまり、すでに登録されているメールアドレスなら`すでに登録されているメールアドレスです`という文をエラーメッセージに格納させます。

あとはそれをVue.js側で表示させてやれば、

冒頭のような表示を実装することができるようになります！

# まとめ
いかがでしたか？
意外とコード自体は単純で簡単かと思います！
この記事についてのアドバイスや修正点等、コメントどしどし歓迎しています！！
【Godot】Line2Dを使ったトレイルの実装方法

# 概要
この記事では `Line2D` を使用して以下のようなトレイルを実装する方法を解説します
![shot.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43772/0d082849-43c6-55e2-a4aa-fa5d55a9879a.gif)

# シーンの作成
まずはNode2Dのシーンを作成します。

# Line2Dの追加
次に `Line2D` を追加します。
これは複雑な線を描画するためのノードです。
![Godot_Engine_-_TestLayer_-_Main_tscn____.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43772/add79c06-33a5-2687-d266-d96d79f7ade7.png)

# トレイルをするスクリプトの作成
シーンノード(Node2D)にスクリプトをアタッチして以下のように記述します。

```gd:Main.gd
extends Node2D

# トレイルの軌道の最大数
const MAX_TRAIL_POINT = 32

# Line2Dを取得
onready var line = $Line2D

# マウスの軌道
var points = Array()

func _process(delta: float) -> void:
	# マウスの座標を取得
	var pos = get_viewport().get_mouse_position()
	
	# 軌道のリストに追加
	points.append(pos)
	
	if points.size() > MAX_TRAIL_POINT:
		# 軌道の最大数を超えたら最後に追加した座標を削除
		points.pop_front()
	
	# line2dのポイントリストを削除	
	line.clear_points()
	
	# line2dのポイントリストに追加
	for p in points:
		line.add_point(p)
```

実行すると、以下のようにマウスの座標を追いかけるような軌道で線が描画されます。
![shot.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43772/a4b2098c-63ac-0145-e23a-aa982535f48e.gif)

# 線の見た目の調整
## 終端の線を細くする
これだと線が残っているだけで今ひとつな見た目なので、終端になるほど線が細くなるようにします。

Line2Dノードを選択し、インスペクタの `Width Curve > [空]` をクリックし、「新規Curve」を選びます。
![Godot_Engine_-_TestLayer_-_Main_tscn.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43772/664b3a2f-dfdd-2fe3-370f-9223a898a5d4.png)

そして表示されたカーブの部分をクリックし、グラフが上昇するようにポイントを追加します。
![shot.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43772/96bfda11-018b-0069-2a81-b0ba56fa04ac.gif)

実行して確認すると軌道の終端が細くなります。
![shot.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43772/9c215a0a-d9b7-3904-6189-9c4dd5f77760.gif)

## 軌道の色にグラデーションを適用する
終端になるほどアルファ値が低くなって徐々に消えていく感じにします。
Line2Dのインスペクタの `Fill > Gradient > [空]` をクリックして、「新規Gradient」を選びます。
![Godot_Engine_-_TestLayer_-_Main_tscn.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43772/ad3287ee-fea6-3620-ce95-0d17de91a97b.png)

そして、Gradientの項目をクリックしてグラデーションを表示して、「`Colors > PoolColorArray`」をクリックし、0番目の色（黒い色）を  `(R,G,B,A) = (255, 255, 255, 0)` にして、白の透過色にします。
![shot.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43772/e7611bff-bd13-9d50-d685-e4201da488e7.gif)

実行すると、終端が透過するトレイルの描画が実装できます。
![shot.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43772/0d082849-43c6-55e2-a4aa-fa5d55a9879a.gif)

# 参考

* [GODOT DOCS » Godot API » Line2D](https://docs.godotengine.org/ja/stable/classes/class_line2d.html?highlight=line2d)
* [DRAW TRAJECTORY - Godot Recipes](http://kidscancode.org/godot_recipes/2d/2d_draw_trajectory/)
* [line2d to make a trail : goes everywhere... (Godot Engine - Q&A)](https://godotengine.org/qa/71677/line2d-to-make-a-trail-goes-everywhere)
MacBig Sur環境でのXcode、CLTについて<続編>

環境 macOS BigSur Version 11.2.1

↓こんにちは。以前にこの記事を書かせていただきました。

・[MacBig Sur環境でのXcode、CLTについて](https://qiita.com/mattsershaw/items/b304ed50869f5d221463)

定期的に開催の週末勉強会に参加させていただき、前回の記事同様Visual Studio Codeでの作業が終わりGithubにコミットしようとすると、ソース管理の画面で「リポジトリを初期化する」の表示。以前にコミットしたプロジェクトだったのに、、嫌の予感がする。いつもならソース管理のアイコンの上にコミットしていないファイルの数が表示されているのに。試しに

```
$ git init
```

を実行すると、

##またかよ!

```
xcrun: error: invalid active developer path
(/Library/Developer/CommandLineTools), missing xcrun at:
/Library/Developer/CommandLineTools/usr/bin/xcrun
```

またですか。CommandLineToolsが有効でないの表示。しかし今回は前回の記事でも宣言した通りXcodeをアップデートしていない。前回の作業から特に変更したものはないはずなのに。

```
$ brew --config
```

にてバージョン確認すると、

```
macOS: 11.2.1-x86_64
CLT: N/A
Xcode: 12.4
```

##CLTがN/A??

・[Downloads for Apple Developers](https://developer.apple.com/downloads/index.action)

え? これはどういうことなんだ。とりあえず一時的にでも修復させたいので、またDownloads for Apple Developersにお世話になり、自分が持っているXcodeの12.4と同じCLT 12.4を持ってくる。

```
macOS: 11.2.1-x86_64
CLT: 12.4.0.0.1.1610135815
Xcode: 12.4
```

これでインストール完了。Visual Studio Codeを再起動して確認してみる。

##復活!!!

ソース管理の画面にもしっかりコミットしてないファイルの数字が表示され、いつもの通りに戻った! もちろん嬉しいが、また近いうちに同じ現象が起こる可能性が高いと考えると憂鬱。Xcodeをアンインストールで入れ直せばこのバグも直るのだろうか、、時間がある時にやってみよう。時間がある時? 時間は作るものだ。とりあえずコミットしてきます。
Docker に対応した Amazon Web Services (AWS) EC2 インスタンスを作成の備忘録（Windows10）

# はじめに
Dockerに対応したAWS EC2インスタンスを作成する際に躓いたところとその対応について記載しています。
作成手順のページは下記リンクです。Udemyなどで公開されている講座などでも同様の手順かと思います。
[Amazon Web Services (AWS) EC2 の例](https://docs.docker.jp/machine/examples/aws.html)

# 前提環境
- Windows10 Home
- Docker for Windows
- Windows PowerShellで環境構築
- PowerShell上でdocker-machineコマンドが使える

以下では接続先のEC2名はaws-sandboxとしています。
使用している環境に応じて読み替えてください。

# 躓いたところ
ホストをアクティブにする際の下記コマンド実行ができませんでした。
これは当然でevalコマンド自体はLinuxなどで使用可能であり、Windowsでは使用できないためです。

```
eval $(docker-machine env aws-sandbox)
```

# 解決策
下記コマンドで同様の操作が可能です。

```
& docker-machine env aws-sandbox | Invoke-Expression
```
もともとevalコマンドに対応するWindows のコマンドはInvoke-Expressionコマンドです。このコマンドを応用して操作を実現しています。

ちなみに、下記コマンドを実行するとdocker側が環境変数と併記して各環境に応じた推奨コマンドをコメントで提示してくれます。（先に言ってほしかった...）

```
docker-machine env aws-sandbox
```

# おわり
個人的に躓いたところを記載しました。Windows10HomeでDocker for Windowsが使えるようになったため、意外とこういったところで躓く人が多くなる気がします。ご参考になれば嬉しいです。
Power Apps で 2地点間の直線距離計算 (With関数利用)

# 異なる2地点の緯度経度から距離を求めるには

非常に簡単に2地点間の緯度経度から距離を求める方法として、ヒュベニ(Hubeny)の公式 が知られています。
この方法では、以下の式で2地点間の距離が与えられます。

```math
\mbox{Distance} =\sqrt{(Dy \cdot M)^2+(Dx \cdot N \cdot \cos{P})^2}

```
ここで`Dx, Dy, M, N, P`はそれぞれ以下の式で定義されます。

```math
\begin{align}
Dx &= \mbox{Longitude2} - \mbox{Longitude1}\\
Dy &= \mbox{Latitude2} - \mbox{Latitude1}\\
M &= \frac{Rx(1-E^2)}{(1-E^2 \sin^2(P))^{3/2}}\\
N &= \frac{Rx}{\sqrt{(1-E^2 \sin^2(P))}}\\
P &= \frac{\mbox{Latitude2} + \mbox{Latitude1}}{2}
\end{align}
```
あとは定数の`Rx, Ry, E`ですがそれぞれ赤道半径、極半径、離心率で、世界測地系では以下のとおり与えられています。

```math
\begin{align}
Rx &= 6378137.000000 \quad \mbox{(m)}\\
Ry &= 6356752.314245 \quad\mbox{(m)}\\
E &= \sqrt{1-\frac{Ry^2}{Rx^2}}
\end{align}
```

# Power Apps 上での表現
これを Power Apps で評価するには、以下のような式をラベルコントロールなどに設定してください。

```csharp
With(
    {
        rLat1: Radians(Lat1),
        rLat2: Radians(Lat2),
        rLong1: Radians(Long1),
        rLong2: Radians(Long2),
        Rx: 6378137.000,//Equatorial radius in unit of meter
        Ry: 6356752.314 //Polar radius in unit of meter 
    },
    With(
        {
            Dx: rLong2 - rLong1, //Difference of two longitudes
            Dy: rLat2 - rLat1, //Difference of two latitudes
            P: (rLat2 + rLat1) / 2, //Average of latitudes
            E: Sqrt(1 - Ry ^ 2/(Rx ^ 2)) //Eccentricity
        },
        With(
            {
                M: Rx * (1 - E^2) / (1 - (E * Sin(P))^2) ^ 1.5,
                N: Rx / Sqrt(1 - (E * Sin(P))^2)
            },
            Sqrt((Dy * M) ^ 2 + (Dx * N * Cos(P)) ^ 2)
        )
    )
)
```

ここでは [With関数](https://docs.microsoft.com/ja-jp/powerapps/maker/canvas-apps/functions/function-with) を利用して、式の評価を見やすくしています。
With関数を使うと、コンテキスト変数やグローバル変数を使わずに式の中だけで有効な"一時変数"のようなものを定義・利用することができます。
また、With関数は入れ子にすることもできて、段階的に式を評価していくようなケースで有効です。

今回のケースでは緯度経度をラジアン単位に直した数が何度も出てくるので、最初のWith関数でラジアンに直した緯度経度のペアと、赤道半径・極半径を定義しています。
次のWith関数では、最初に定義した緯度経度ペアとRx,Ryを使って、差分や平均、離心率を計算しています。

最後のWithで`M,N`といった式を評価し、もともとの距離の定義式に代入しています。

この計算と、新しいマップコントロールを利用して、簡単な検算アプリを作ってみました。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Power Appsで2地点の緯度経度から距離を計算する式が綺麗にかけたので、新しいマップコントロールを使って試してみた。<br><br>東京-名古屋間260kmくらいだから計算は合っているな。 <a href="https://t.co/D4vUmx0XY5">pic.twitter.com/D4vUmx0XY5</a></p>&mdash; Hiro (@mofumofu_dance) <a href="https://twitter.com/mofumofu_dance/status/1360583536009334790?ref_src=twsrc%5Etfw">February 13, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# おわり
With関数を使うと冗長な表現を回避して、式をすっきりさせることができます。
距離の計算は一番簡単といってもそこそこ面倒なわけですが、そういうケースで役立つかなと思います。
あとは変数使いたくないときとか。
Dart と Flutter 用の Code-Server  を VPS で

VPS上にCode-server を、立ち上げて
Flutter For Web の 開発してみた..

VSCode Plugin も 使えます!!



## VPS 上に Code-server を立ち上げる


```
$ apt-get update
$ curl -fsSL https://code-server.dev/install.sh | sh
$ systemctl enable --now code-server@root
// Created symlink /etc/systemd/system/default.target.wants/code-server@root.service → /lib/systemd/system/code-server@.service.
```

## パスワードの設定とか (Optional) 

```
$ vi /root/.config/code-server/config.yaml
```

```
bind-addr: 0.0.0.0:8080
auth: password
password: MyFlutter-0213f
cert: false                                                     
```

```
$ systemctl restart code-server@root
```

![Screen Shot 2021-02-14 at 0.00.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54192/86a88c3c-056d-ad75-4bf1-8dca24b7abab.png)



# Flutter を インストール

https://flutter.dev/docs/get-started/install/linux

```
$ apt-get install curl -y
$ apt-get install git -y
$ apt-get install unzip -y
$ apt-get install zip -y
$ git clone https://github.com/flutter/flutter.git
$ export PATH="$PATH:`pwd`/flutter/bin"
$ flutter doctor
```

# Flutter Web を 設定

https://flutter.dev/docs/get-started/web

```
$ flutter channel beta
$ flutter upgrade
$ flutter config --enable-web
$ flutter devices
```


# サンプルを試してみよう

```
$ flutter create myapp
$ cd myapp
$ flutter build web
$ flutter run -d web-server  --web-port=18080 --web-hostname=0.0.0.0
```

![Screen Shot 2021-02-13 at 21.34.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54192/bb011c9e-08f1-e905-bcba-0ab905dc0cbd.png)



# PS 

以下でも書いてます

https://dev.to/kyorohiro/code-server-with-flutter-web-at-vps-11mg

Conoha の 4GBプランを試しました
快適です
https://www.conoha.jp/vps/?btn_id=header_vps
Herokuでデプロイ

#WHY
デプロイすることも多くなり、手順を覚えるためのアウトプットの一環として書いていきます。
herokuでデプロイするにはまずアカウント作成とクレカ登録が必要ですがそこは省きます。

-----
##CLIのインストール
ターミナルで<b>CLI</b>をインストールしていく。<br>インストール後に「heroku --version」と打ち込み、バージョンが表示されれば成功。

```
brew tap heroku/brew && brew install heroku

heroku --version
```
##ログイン
以下のコードを入力することでログインできる。<br>指示に従い、アカウント情報を入力する。

```
heroku login --interactive
  => Enter your Heroku credentials.
  => Email:
  => Password:
```

##heroku create
デプロイしたディレクトリまで移動し、
Heroku上に公開するためのアプリケーションを作成する。続けてアプリ名を記入し、Heroku上でのアプリケーション名を決めることができる。
また、create後は<b>git config --list | grep heroku</b>で<b>fatal: not in a git directory</b>以外が表示されれば成功。

```
cd ~/アプリケーションのディレクトリへ
pwd

heroku create アプリケーション名

git config --list | grep heroku
```

##ClearDBアドオン
MySQLを使うためのツール。ClearDBというデータベースサービスが提供しているアドオンで、これを追加することで、HerokuでMySQLを使用できるようになる。

```
heroku addons:add cleardb
```

##その他設定の変更
Ruby on Railsを使う場合は、MySQLに対応するGemについて考慮する必要があり、
・ClearDBデータベースのURLを変数heroku_cleardbに格納
・データベースのURLを再設定
をしなければならない

```
heroku_cleardb=`heroku config:get CLEARDB_DATABASE_URL`

heroku config:set DATABASE_URL=mysql2${heroku_cleardb:5}
```

##heroku config
Heroku上に、<b>環境変数</b>として<b>master.key</b>の値を設置しなければならない。<br>これは外部に漏らしたくない情報を扱う<b>credentials.yml.encファイル</b>の暗号文を複合することができる<b>master.keyファイル</b>がデフォルトではGitに管理されないため。
Heroku上で環境変数の参照・追加・削除等をする<b>heroku configコマンド</b>を使用する。
また、<b>heroku config</b>で<b>環境変数</b>を確認することができる。

```
heroku config:set RAILS_MASTER_KEY=`cat config/master.key`

heroku config
```

##Stack
デプロイされたアプリケーションを読み取り正常に稼働させるための動作環境。
デフォルトのStackは「Heroku-20」
Rubyのバージョン2.6.5が動作するStackは「Heroku-18」

```
heroku stack:set heroku-18 -a アプリケーション名
```

##プッシュ
Herokuへコミットをプッシュすることで、Herokuにアプリケーションの情報を追加できる。

```
git push heroku master
```

##heroku run
マイグレートをしないとherokuのデータベースにはマイグレーションの情報が反映されていない。
<b>rails db:migrate</b>であれば<b>heroku run rails db:migrate</b>と記述。

```
heroku run rails db:migrate
```

##heroku apps:info
公開されたアプリケーションの詳細を見ることができ、webURLなどを確認することができる。

```
heroku apps:info
```

##再度プッシュする場合
<b>コードに変更が生じて再度プッシュを行う場合</b>は次の３つのコードを順番に行う。

```
git add .

git commit -m "後から見てわかりやすいコミット名"

git push heroku master
```

###ファイルの変更が特にない場合
<b>環境変数だけ本番環境に反映させたい場合</b>などは以下の通りにする。

```
git commit --allow-empty -m "空のcommit"

git push heroku master
```
--------
herokuにはherokuのDBがあるということや、Gitとは違うherokuのプッシュがあるということを忘れずにこれからもデプロイしていこうと思います！
Powershellでpecoをショートカットキーで呼び出す

ここに書くまでもない程簡単にできたけど、意外とドンピシャの記事は見つからなかったので書き記しておく。
PowerShell 7.1.2で確認。

- Ctrl+Tで$HOME\\.snippetsに配置したワンライナー集をpeco
- Ctrl+Shift+Tでプロンプト上の1行を.snippetsに追加
- Ctrl+Rでコマンド履歴をpeco

```Microsoft.PowerShell_profile.ps1
Set-PSReadLineKeyHandler -Key Ctrl+t -BriefDescription "snipetts" -LongDescription "peco .snippets" -ScriptBlock {
    $snipet = Get-Content $HOME\.snippets | peco

    [Microsoft.PowerShell.PSConsoleReadLine]::ClearScreen()
    [Microsoft.PowerShell.PSConsoleReadLine]::RevertLine()
    if($snipet -eq $null){return}
    [Microsoft.PowerShell.PSConsoleReadLine]::Insert($snipet)
}

Set-PSReadLineKeyHandler -Key Ctrl+Shift+t -BriefDescription SaveInHistory -LongDescription "Add line to .snippets" -ScriptBlock {
    param($key, $arg)

    $line = $null
    $cursor = $null
    [Microsoft.PowerShell.PSConsoleReadLine]::GetBufferState([ref]$line, [ref]$cursor)
    if($cursor -eq 0){return}
    Add-Content $HOME\.snippets $line
    [Microsoft.PowerShell.PSConsoleReadLine]::RevertLine()
}
Set-PSReadLineKeyHandler -Key Ctrl+r -BriefDescription History -LongDescription 'peco history' -ScriptBlock {
    $hist = @(Get-Content $(Get-PSReadLineOption).HistorySavePath)
    $command = ($hist)[$hist.length..0] | peco

    [Microsoft.PowerShell.PSConsoleReadLine]::ClearScreen()
    [Microsoft.PowerShell.PSConsoleReadLine]::RevertLine()
    if($command -eq $null){return}
    [Microsoft.PowerShell.PSConsoleReadLine]::Insert($command)
}
```

日本語が混じると微妙な感じになるけど、使い道としてそんなに混じることは無いので妥協した。
AWS無料枠学習における「うっかり課金」を避ける

# はじめに
一人でも多くの方が[AWS無料枠](https://aws.amazon.com/jp/free/)における「うっかり課金」を回避されますように。

# うっかり課金とは
AWSには無料枠があり、クラウドサービスを触れてみたいと思ったときに気軽に始められるのがとても魅力的です。しかし気づいたら課金が発生していたと「うっかり課金」してしまうの落とし穴があるのです。

# Elastic Load Balancer
EC2はとても太っ腹で750時間/月の無料枠があります。24h*31=744なので、24時間つけっぱなしで運用も可能。しかもEC2のメニューにあるELBではAZをまたぐロードバランサを気軽に試すことができて、クラウドの醍醐味を感じました。
しかし、**ELBに無料枠はありません**。たくさん作ったEC2だけ消して安心していたら2週間で1000円くらい課金が発生していました。ELBはお試しが終わったらすぐに消しましょう！

## Elastic IP Address
EC2などを作成する際にElastic IPを取得してもお金はかかりません。全人類の有限な財産であるな静的なIPアドレスを無料で提供する大盤振る舞い。
しかし使い終わっても**解放しないで放置された静的IPアドレスは課金が始まる**のです。利用しなくなったIPアドレスは解放しましょう！

## Route 53
そもそも本サービスに無料枠のようなものはありません。ホストゾーンを作成して忘れていたら課金が発生して気づいたというわけです。

## NAT Gateway
インターネット接続できないプライベートサブネットを作ったら、外部から遮断された安全なネットワーク。しかし一時的にインターネットが必要になったらNAT Gatewayがお手軽に解決してくれます。yum updateが済んだらすぐに消す。しかし、お手軽なものは消し忘れのリスクと常に背中合わせなのです。

## エンドポイント
この投稿から1年以上建って久々にやってしまった失敗です。プライベートなネットワークからAWSのサービスにアクセスすることのできるエンドポイントは、セキュリティと利便性を両立してくれます。その代償はコスト。チリが積もって山になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/940466/c1e90502-a6db-927a-5bd6-80f97c42d1be.png)

## KMS
S3などの暗号化に利用されるキーはデフォルトで設定されているAWS管理型とカスタマー管理型(CMK)があります。そしてCMKには1USD/月の管理費が発生します。利用しなくなったCMKは利用しなくなったら削除すべきなのですが、万が一CMKで暗号化したものが残っていた場合、永久に複合することができなくなるのです。
そうなると気軽に削除するわけにもいかなくなるので、CMKの無効化という選択肢があります。CMKは無効化すると利用できなくなるのですが、必要になったら再度有効化することが可能という便利なオプションです。
しかし、**CMKは無効化しても費用が掛かります**。

https://repost.aws/ja/knowledge-center/kms-key-charges

:::note info
いつでも有効にできる無効化は、実質有効と同じである(ニーチェ)
:::


# おわりに
Amazonは「[地球上で最もお客様を大切にする企業](https://aws.amazon.com/jp/careers/culture/)」なので **Billing**という機能の中で、課金に気づくことができるアラームを用意してくれています。クレジット番号を預けている我々はここを設定して注意を払うことで、意図せぬ出費を増加する前段階でキャッチし、蛇口を締めることができるのです。そして「うっかり課金」してしまったとしても「私はAWSの未来に出資した」と前向きに考えることで心の平穏を手に入れることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/940466/4cc83a8b-0d62-7252-78fd-4278b7751a2b.png)

# 参考文献

https://qiita.com/t-kudo9/items/61fb0e3fc8a42a1ee928

https://qiita.com/T-iju/items/06717d27582b0a457b3b
管理者権限付与後、本番環境にrails db:seedをするまで（Active Storageも含む）

#はじめに
管理者権限の付与方法については以下記事に記載しております。

https://qiita.com/narimiya/items/8d21b18db9c75b1dde2d

#前提
●管理者権限機能は実装済み

●usersテーブルの情報

```XXX_devise_create_users.rb

〜省略〜

      t.string  :email,                null: false, default: ""
      t.string  :encrypted_password,   null: false, default: ""
      t.string  :nickname,             null: false
      t.text    :occupation,           null: false
      t.text    :position,             null: false
      t.date    :birth_day,            null: false
      t.integer :sex_id,               null: false
      t.boolean :admin,                default: false

〜省略〜

```


#バージョン
rubyのバージョン　ruby-2.6.5
Railsのバージョン Rails:6.0.0

#gemについて
・gem 'devise'
・gem 'rails_admin', '~> 2.0.0.beta'
・gem 'cancancan'

#記事の内容
管理者についての情報をseeds.rbに記述し、本番環境にてseeds.rbの内容を
反映するまでの手順を述べています。

#実装の全体像

●ローカル環境
①seeds.rbの記述
②rails db:seedの実行

●gitにてマージ

●本番環境
④デプロイ
⑤heroku run rails db:seedの実行

#実装の手順
##①seeds.rbの記述

Active Storageでimageカラムを取り込んでいるので、usersテーブルにimageカラムをattachする。
※seeds.rb内の一番下の記述
（なお画像についてはimageカラムと定義している。）

```db.seeds.rb

user = User.create!(email: "admin@example.jp",
  password:  "abcd1234",
  password_confirmation: "abcd1234",
  nickname:  "管理者",
  occupation: "管理者",
  position: "管理者",
  birth_day: "2000-10-10",
  sex_id: "2",
  admin: true)

  user.image.attach(io: File.open(Rails.root.join("app/assets/images/homekatajiten.png")), filename: "homekatajiten.png")

```

##②rails db:seedの実行
rails db:seedを実行して初期データを投入する。

```
$ rails db:seed
```

##③デプロイ

```
$ git push heroku master
```

##④heroku run rails db:seedの実行
本番環境にもlocal同様の初期データを投入する。

```
$ heroku run rails db:seed
```

#確認

最後は反映されているか確認を行う。

```
$ heroku open
```

実行できていれば管理者アカウントでログイン後、(本番環境URL)/adminで以下のような画面になっていれば成功です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1052793/e77fd044-37c1-bca4-48ff-031667224298.png)

以上です。
崩れないレイアウトの作り方

#レイアウトの基本

今回は自分自身が学習し始めになかなか理解できなかったpxとvhの違いについて解説します。
一言でいうと、pxは固定値、vhは「viewport height」の略称で、相対的な高さを表します。
これだけ聞いても「どういうこと？」と思う方も多いと思います。
今回は高さ・・・つまりheightを例に紹介します。

```css
height: 100px;
```
このようにすると100pxは固定値なので![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1038944/ce035291-c0a6-b9d0-2224-92838648ce1d.png)

今回の場合色をつけている部分になります。
ブラウザのサイズを変更しても100pxの幅は絶対に崩れません。

試しに

```css
height: 200px;
```
こうすると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1038944/360e7ad0-7dc0-7314-6fd4-fa5bee088c1c.png)

200pxが固定値として
ブラウザのサイズを変更しても200pxの幅は絶対に崩れません。

以上がpxについてです。

続いてvhについてですが、

```css
height: 100vh;
```
このようにして確認してみると![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1038944/5f27760b-5cea-dcb2-00cb-1d3a475e7b58.png)

ご覧のように画面全体に対して相対的に適用される。今回の場合100vhにしたので画面全面に適用されます。
この相対的の意味がわかりやすいように、画面を小さくしてみます。もちろんコードは一切いじりません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1038944/5011aa66-35f1-af0d-aebb-931de6e07d4b.png)
すると画面自体は小さくなりましたが、画面全体に適用されているのが確認できると思います。

最後に

```css
height: 50vh;
```
こちらを確認してみましょう。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1038944/22661762-42c3-0943-c4cd-9d25368168e3.png)

このように画面全体に対して相対的に50vhなのでちょうど半分にのみ適用されます。


最後にまとめですが、
pxは固定値
vhは相対的な値
実際にビューをいじってみるとわかりやすいと思います！
MediaWikiの<head>に任意の内容を挿入するHeadScriptエクステンションを指定したページのみに適用する方法

MediaWiki において `<head>` 要素に `<script>` などを仕込むためには [HeadScript エクステンション](https://www.mediawiki.org/wiki/Extension:HeadScript)を利用するとよいのですが、LocalSettings.php にそのまま指定すると、すべてのページの `<head>` に書き込まれます。

しかし自分は任意のページだけに仕込みたいスクリプトがあったので、設定仕分ける方法をまとめておきます。

参考にしたのは MediaWiki の Support desk にあったこの [Topic "How can I add the code into the \<head>"](https://www.mediawiki.org/wiki/Topic:Unn6ubkgl5ppj467) です。

# 環境
* MediaWiki 1.35.1
* HeadScript 1.1.1

# 方法
`LocalSettings.php` の中に `wfLoadExtension( 'HeadScript' );` の後、以下のような形で書き込む。

```php:LocalSettings.php
if (
    ($_SERVER['REQUEST_URI'] == '/wiki/'.rawurlencode('メインページ')) ||
    ($_SERVER['REQUEST_URI'] == '/wiki/'.rawurlencode('yourWiki').':'.rawurlencode('プライバシー・ポリシー')) ||
    ($_SERVER['REQUEST_URI'] == '/wiki/'.rawurlencode('サンプル記事')) ||
    false
)
{
    $wgHeadScriptCode = <<<'START_END_MARKER'
<!-- head に書きたい何かいい感じのこと -->
<script>XXXXXX</script>
START_END_MARKER;
} else {
    $wgHeadScriptCode = <<<'START_END_MARKER'
<!-- その他のページに head に書きたい何かいい感じのことがあれば -->
<script>XXXXXX</script>
START_END_MARKER;
}
```

シンプルに `if` を使って分けているだけです。

# 細かい説明
簡単に内容について説明をいれます。

## 条件式
```php
($_SERVER['REQUEST_URI'] == '/wiki/'.rawurlencode('メインページ')) ||
false
```

`_SERVER['REQUEST_URI']` からアクセス先の URI を取得できるので、それを文字列比較することで任意のページかどうかの判断をしています。

日本語タイトルの記事ページも多いので `rawurlencode` を使って URL エンコードを施し、 `.` 演算子を使って文字列結合しています。

私はアドレスを `https://xxxxx_wiki.org/wiki/XXXXXX` になるように設定しているのでこのような感じですが、何も設定していないと `https://xxxxx_wiki.org/index.php?title=XXXXXX` このようなアドレスのはずなので適宜書き換える必要があると思われます。

最後に `|| false` しているのは私の趣味で、Vim を使って行ごとにコピペして編集することが多いので、`||` が常に末尾にあってもいいように工夫しているだけです。

## $wgHeadScriptCode の書き分け
[HeadScript エクステンション](https://www.mediawiki.org/wiki/Extension:HeadScript) の説明にあるように `<head>` に設定したい内容は `START_END_MARKER` の間に書き込みます。
 
私の場合は基本的には全てのページに Google Analytics のコードを載せたいのですが、一部の充実した記事にのみ Google Analytics に加えて Google Adsense のコードも加えたかったので、それぞれ書き換えています。

```php
{
    $wgHeadScriptCode = <<<'START_END_MARKER'
<!-- Google Adsense のコード -->
<!-- Google Analytics のコード -->
START_END_MARKER;
} else {
    $wgHeadScriptCode = <<<'START_END_MARKER'
<!-- Google Analytics のコード -->
START_END_MARKER;
}
```

# 参考資料
* [Topic "How can I add the code into the \<head>" - MediaWiki Support Desk](https://www.mediawiki.org/wiki/Topic:Unn6ubkgl5ppj467)
JAVAのデータ型や変数について

#はじめに
今回はJAVAのデータ型や変数について書いていきたいと思います。
##変数
変数はデータを入れる箱になります。データを入れたり、出したりできます。
変数名をつけて、データ型を定義する必要があります。
クラス変数とかインスタンス変数とかあったりするのですが、今回は割愛します。

```java:定義の仕方
// 基本型
int num = 0; 
char character = 'a';
// 参照型
String hello = "helloWorld";
int[] numList = {1,2,3};
```


##【データ型】基本型(プリミティブ型)と参照型

###基本型(プリミティブ型)
| データ型名| 入る値 |
|:-:|:-:|
| byte  | 8ビット整数  |
| short  | 16ビット整数  |
| int  | 32ビット整数  |
| long  |  64ビット整数 |
| float  |  32ビット単精度浮動小数点数 |
| double  | 64ビット倍精度浮動小数点数　  |
| boolean  |  true か false |
| char  | 16ビットUnicode文字  |
javaには8種類の基本型が存在します。
数字を扱うデータ型でもいろんな種類があるのですが、使うメモリ数が違ってくるので大きければいいというわけではなく
適切なデータ型を定義する必要があります。

###参照型
基本型とは違い、値そのものを保持するのではなく、値が置いてある場所を保持します。
例えば「配列」や文字列を扱う「string」が参照型にあたります。

###基本型と参照型の違い

```java:違い
// 基本型
int num1 = 1; 
int num2 = num1;
num1++;
// num1の値は2　num2の値は1 

// 参照型
int[] num1 = {1};
int[] num2 = num1;
num1[0]++;
// num1[0]の値は2　num2[0]の値は2
```
基本型の方は値を入れているので、num2 = num1 はnum1の中の値1をnum2に入れているとなり、num1++しただけなら
num2の方は変わることはありません。
ですが、参照型の方はnum2 = num1は値ではなくデータの場所を渡しているのでnum2とnum1は同じ場所の値を見ていることになるのです。
その為、num1++した場合、同じ場所を見ているnum2も2が返ってくるのです。

###ラッパークラス
　基本型は値を入れているだけで、値に対する操作をするメソッドがありません。
　そこで基本データ型をオブジェクトとして扱えるようにするラッパークラスが存在するのです

| データ型| ラッパークラス |
|:-:|:-:|
| byte  | Byte  |
| short  | Short  |
| int  | Integer  |
| long  |  Long |
| float  |  Float |
| double  | Double |
| boolean  |  Boolean |
| char  | Character  |

```java:ラッパークラス
int num = 0;
Integer num2 = new Integer(num);
// 下記でも可能
Integer num3 = num;
```
ジェネリクスで使えない時とかに使うようです。
(List<T>やOptinoal<T>等に基本型は使えない)
##まとめ
いかがだったでしょうか！
今回はJAVAのデータ型、変数についてまとめてみました。
たまに参照型使って沼にハマることがあるので覚えときましょう！

ご覧いただきありがとうございました。
【AWS】未経験からAWS認定6冠達成までのまとめ

SIer2年目、オンプレインフラ設計(パブクラ未経験)者が、半年でAWS認定6冠できるまでの道のりをつらつらと書いていきます。

過去合格記は以下をご覧ください。
[【AWS】クラウドプラクティショナー(CLF)合格記](https://qiita.com/nnydtmg157/items/6c66a23d6b4c544cfcb2)
[【AWS】ソリューションアーキテクト-アソシエイト(SAA)合格記](https://qiita.com/nnydtmg157/items/5705410a0b31f1d5a89d)
[【AWS】SysOpsアドミニストレーター-アソシエイト(SOA)合格記](https://qiita.com/nnydtmg157/items/ba86af83ae400bbcb82b)
[【AWS】Developer-アソシエイト(DVA)合格記](https://qiita.com/nnydtmg157/items/b75384e15c70d1bb6775)
[【AWS】ソリューションアーキテクト – プロフェッショナル(SAP)合格記](https://qiita.com/nnydtmg157/items/c9dbae1f70d2dcd3fcfe)
[【AWS】DevOps エンジニア – プロフェッショナル(DOP)合格記](https://qiita.com/nnydtmg157/items/4db05103d3dd1eebfc58)

#取得資格
まずは、各試験について取得日と点数をまとめます。
こう見るとほとんどギリギリで取ってましたね。。。ほんと、よく取れました(笑)

|日付|資格|点数|
|:---|:---|:---|
|2020-06-27|AWS Certified Cloud Practitioner(CLF-C01)|755|
|2020-07-26|AWS Certified Solutions Architect - Associate(SAA-C02)|725|
|2020-08-10|AWS Certified SysOps Administrator - Associate(SOA-C01)|731|
|2020-08-29|AWS Certified Developer - Associate(DVA-C01)|829|
|2020-09-11|AWS Certified Solutions Architect - Professional(SAP-C01)|819|
|2020-09-26|AWS Certified DevOps Engineer - Professional(DOP-C01)|762|

全体的な感想をまず述べておくと、全体を通して同じ範囲が深さが変わって出題されるので、SAPやDOPを目指すのであれば、連続して学習することをおススメします。
あとは、各試験で主に意識するべきポイントが変わるので、その部分を押さえておけば問題ないと思います。
基本的にベストプラクティスがあり、その次にコスト効率なのか耐障害性なのかといった要件が入ってきます。まずは、ベストプラクティスを理解するところから始めましょう。

#勉強方法
勉強方法については、いろいろな方法があると思います。ご自身に合った方法で続けられるものを選んでください。
基本的には以下の9つの組み合わせかなと思います。

1. AWS公式のホワイトペーパーを読み込む。
2. AWS公式のBlackBeltを読み込む。
3. 模擬問題集を解く。
4. Udemyで問題集を解く。
5. Web問題集で問題を解く。
6. 無料ハンズオンを受講する。(サービスには課金されるので注意)
7. 公式研修を受講する。(高額ですので余裕があればぜひ)
8. AWS認定公式動画を見る。
9. 先人の知恵を授かる。

1と2はAWSが公式に出しているベストプラクティス集のようなものです。これだけで合格したという方もいらっしゃいます。(私には無理でした。。。)

3はAWS公式模擬試験です。問題数は少ないですが、実際の試験のレベル感や内容を把握するのには十分です。回答が表示されませんので、各問題をスクショしてあとから見直しができるようしておきましょう。

4と5は問題を実際に解いて理解していけるので、試験の練習も兼ねてできるので良いです。
4のUdemyは試験1回分通して問題を解く必要があり、私のように一問ずつ確認して進めたい人には合わないかもしれません。
5は過去記事でも紹介している、[AWS WEB問題集で学習しよう](https://aws.koiwaclub.com/)を利用しました。こちらは1問ごとに解説を確認でき、1セット7問なので隙間時間に気軽に勉強できました。(こちらのサイト関係者ではありませんので、ご安心ください笑)

あとは実際にサービスに触れるという点で、6と7を活用してみてください。特に6はかなり優秀で受講自体は無料です。ただし、構築したサービスには課金されますので、ご注意ください。受講が終わり次第サービスを止めることを忘れないでください、結構高額になったりします。。。

8の動画もおススメです。各動画に数問ずつ問題もありますので、これだけでも対策としてはかなりのレベルまで上げられると思います。

最後に数多の先人が受験記録をアップしていますので、その方々の記事を読むこともどんな点につまずいたのかなどがわかるので良いです。

様々な方法がありますので、ご自身に合った方法で頑張ってください！

#最後に
AWSは頻繁にサービスが新しくなり、試験のベストプラクティスと今のベストプラクティスが異なることがありますので、試験がいつのものなのかを把握しておくことも大事です。
試験自体は問題文から要件を汲み取って、選択肢の中で満たすものを選択するので、今と違うということでパニックならないように注意してください。

ためになるようなならないような内容になってしまいました。。。ここまで読んでいただきありがとうございます。
12冠目指して頑張ろうと思います。無事取得出来次第、アップしていきたいと思います。
そうだ、SQLを勉強しよう⑨

#はじめに
まるでExcelの表計算だった集計関数についてまとめます。

##集計関数の特徴
- 結果は必ず、1行になります。
- 検索対象全行に対して、1回だけ集計処理を行います。
- SELECT文にしか使うことができません。
- NULLの扱い方が、集計関数によって少し違う。←ここ大事！

##記述方法

```sql
SUM(列) --=>合計
MAX(列) -- =>最大値
MIN(列) -- =>最小値
AVG(列) -- =>平均値
COUNT(列) -- =>NULL以外の値が入っている行数
COUNT(列) -- =>検索結果の行数 ←シンプルに何行あるか知りたい場合はこっちが便利。
```


##NULLの扱いが違うことによる注意点
###SUM関数
単純に合計値なので、NULLが無視されていようが、0として扱われようが違いがないので、特に注意する点はありません。
###MAX関数
最大値を知ろうとしているくらいなので、
NULLもしくは、0が最大となることは少ないと思うので、あまり気にすることはないかと思います。
全行NULLだと、NULLが返ってきます。（いや、全行NULLの列の最大値を求めようとする状況とは！？笑）

しかし、
問題は次からです。

###MIN関数
NULLの行は無視されます。
つまり、値が0のつもりで、空白にしていた場合、
その行の値ではなく、0より大きくて一番小さい値が出力される可能性があります。

###AVG関数
NULLの行は無視されます。
つまり、平均の出し方は、
『合計÷個数』
ですが、
その個数にカウントされないということです。
明らかに、意図しない結果を生みます。

###COUNT関数
NULLの行は無視されます。
つまり、シンプルに行数を数えて欲しい場合は、

```sql
COUNT(*)
```
とする。

---

###そもそも、NULLとは
- なにも格納されていない、未定義であるということ。
- 0や空白文字とも異なる。

そもそも、何にも入っていないということ。

---
じゃあ、どうするか。
一つ一つ手作業でNULLの欄に0と入力するのは、とても億劫です。

##NULLを0に置き換えてほしい
CALESCE関数を使います。

```sql
AVG(COALESCE(列名, 0))
```
これで、NULLが格納されていた場合、0を代わりに入れてくれます。


##別名をつける
一つに集約して結果が出力されるということは、列に別名を付けた方がわかりやすいことが多いと思います。
そのようなときに、出力の結果の列の名前を付ける記述があります。




```sql
-- 記述方法
列名 AZ 別名
```

列名に限らず、テーブルにも別名を付けることができます。

##まとめ


|関数名|機能|
|---|---|
|SUM|各行の値の合計値を求めます|
|MAX|各行の値の最大値を求めます|
|MIN|各行の値の最小値を求めます|
|AVG|各行の値の平均値を求めます|
|COUNT|行数を数えます|

- NULLが格納されている可能性がある場合は、COALESCE関数を使って、0に置き換えてもらう。
- 出力結果が１行になるため、列の名前を別に命名した方が、見やすい。


##最後に
NULLと0で出力結果に大きな違いが生まれるのは、
正直怖いと思いました。
NULLと0は似て非なる物と捉えることが大切です。

具体的な場面だと…
「テストの平均点を出すときに、受けていない人は割る数に含めないけど、0点の人は割る数に含める」みたいなことで、
結果を大きく左右するだろうな。
具体的な状況を考えると、
「20人のクラス2クラスあります。1組は10人が100点で、10人が0点でした。2組は、風邪で10人が休みましたが、残りの10人は、100点でした。
平均点の計算は…
1組：(100×10)+(0×10)÷20=50点
2組：(100×10)÷10=100点
2組の方が平均点が高いから、優秀！？」

こんな計算で、2組が絶賛されていたら、反抗したくなりますね。笑
平均値や行数を出力するときは、特に注意が必要そうです。
Lambdaでメッセージを編集してSNS Publishする一例

# Lambdaのコード

　ヒアドキュメントと変数、`json.dumps`を利用した一例です。
　SecurityHubの通知を例にして作成しています。

```py:lambda_function
from __future__ import print_function
import json
import boto3
import os

sns = boto3.client("sns")
def lambda_handler(event, context):
    message = event["detail"]["findings"][0]
    msg = """
    Security Hubにより検知した違反内容
    セキュリティ基準コントロール:{standards_control_arn}
    タイトル:{title}
    説明:{description}
    セキュリティステータス:{status}
    重要度:{severity}
    修復手順:{remediation_text}({remedeation_url})
    
    対象リソース
    {resources}
    
    詳細
    --
    {detail}
    """.format(standards_control_arn=message["ProductFields"]["StandardsControlArn"], \
    title=message["Title"],\
    description=message["Description"], \
    status=message["Compliance"]["Status"], \
    severity=message["Severity"]["Label"],\
    remediation_text=message["Remediation"]["Recommendation"]["Text"], \
    remedeation_url=message["Remediation"]["Recommendation"]["Url"],\
    resources=json.dumps(message["Resources"], indent=4), \
    detail=json.dumps(event, indent=4))
    
    response = sns.publish(
        TopicArn=os.environ.get("sns_arn"),
        Subject="テスト",
        Message=msg
    )
    return response
```
Google Homeのホスト名の取得方法

# 背景
Google HomeのIPアドレスは、```arp -a```コマンドで分かるが、
プライベートIPアドレスが動的に欲しいなと思ったら、ホスト名が分からず、ちょっとハマったので備忘録。

# ホスト名とは
例えば、ラズパイなら、ホスト名は、raspberrypi.localになっているので、raspberrypi.localを名前解決すれば、動的なIPアドレスを得られる。しかし、ホスト名がわからないと、動的にIPアドレスを得られない。

# ホスト名の取得方法
[こちらの記事](https://qiita.com/tinoue@github/items/ecb8b6211bee686a75e8)を参考にしたら、簡単にできた。



```sh
pi@raspberrypi:~ $ sudo apt -y install avahi-utils
...
pi@raspberrypi:~ $ avahi-browse -at
+  wlan0 IPv6 _____________________MacBook Pro              _companion-link._tcp local
+  wlan0 IPv4 _____________________MacBook Pro              _companion-link._tcp local
+  wlan0 IPv4 57XXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX          _googlezone._tcp     local
+  wlan0 IPv4 Google-Nest-Mini-57XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX _googlecast._tcp     local
+  wlan0 IPv4 googlerpc                                     _googlerpc._tcp      local
```
となる。57XXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX.localがホスト名である。
```ping 57XXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX.local```が成功することで確認できる。

そういうわけで、名前解決するプログラムも完成して、問題も解決した。

```js
const googlehome = require('google-home-notifier')
const dns = require("dns")
const language = 'ja';

const msg = process.argv[2]
googlehome.device('Google-Home', language);
dns.lookup('57XXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX.local', (err, address, family) => {
    console.log('Device Google-Home at %j (IPv%s)', address, family);
    googlehome.ip(address);
    try {
        googlehome.notify(msg, function(res) {
            console.log(res);
        });
    } catch(err) {
        console.log(err);
    }
});
```
PowerDNS Authoritative Nameserver の Docs を翻訳してみた

翻訳したドキュメント
PowerDNS Authoritative Nameserver
https://doc.powerdns.com/authoritative/

最終的には英文を書けるようになりたい。

# PowerDNS Authoritative Nameserver
PowerDNS 権威ネームサーバ

The PowerDNS Authoritative Server is a versatile nameserver which supports a large number of backends. These backends can either be plain zone files or be more dynamic in nature.

PowerDNS Authoritative Nameserver は多数のバックエンドをサポートする多用途のネームサーバです。
バックエンドはプレーンゾーンファイルでも、より動的な性質のものも使用可能です。

versatile = 多用途の
which
a large number of = たくさんの
either = どちらか一方の
nature = 性質

PowerDNS has the concepts of ‘backends’. A backend is a datastore that the server will consult that contains DNS records (and some metadata). The backends range from database backends (MySQL, PostgreSQL) and BIND zone files to co-processes and JSON API’s.

PowerDNS には「バックエンド」の概念があります。バックエンドは、サーバが参照するデータストアであり、DNSレコード（および一部のメタデータ）が含まれます。バックエンドは、データベースバックエンド（MySQL, PostgreSQL）や、BINDゾーンファイル、co-processes, JSON API まで多岐にわたります。

複数の that
consult = 意見を聞く(=参照する)

Multiple backends can be enabled in the configuration by using the launch option. Each backend can be configured separately.

起動オプションを使用して、複数のバックエンド構成にすることができます。各バックエンドは個別に構成できます。

See the backend documentation for more information.

詳細については[バックエンド](https://doc.powerdns.com/authoritative/backends/index.html)のドキュメントを参照してください。

more information = 詳細情報
See = 


# Installing PowerDNS
PowerDNS のインストール
eclipseを使ってSpringBootでHello World


##流れ##

* eclipseのインストール
* SpringBootプロジェクトの作成
* Hello Worldを表示


##eclipseのインストール##
eclipseをここからインストールします
→https://mergedoc.osdn.jp/
リンクを開いたら、バージョンやOSなどを選択して、インストールします。
今回は、Eclipse2020　→　Java Windows64bit Full Editionを選択し、Downloadをクリックしました。

ダウンロードが完了したら、解凍します。
zipファイルの解凍には、7-Zipを使用してください。
今回は、Cドライブ直下に解答しました。

pleiadesというフォルダが作成されます。
これでeclipseのインストールは完了です。

eclipseを起動してみます。
pleiades\eclipse\eclipse.exeを起動します。
(ショートカットをデスクトップ等に作成しておくと便利です)
起動すると、ワークスペースのディレクトリ—選択という画面が表示されます。
このワークスペースの中に、ソースファイルなどを作成していきます。
今回は、変更せず、「../workspace」のまま、起動しました。

起動すると、Eclipseの開発画面が立ち上がります。
Eclipseの開発準備はこれで完了です。

##SpringBootプロジェクトの作成##

eclipseの開発画面が開けたら、左上にある「ファイル(F)」から
「ファイル(F)」→「新規(N)」→「プロジェクト(R)...」と順にクリックし、
プロジェクトを作成していきます。

ウィザードを選択の画面では、「Spring スターター・プロジェクト」を選択します。
選択すると、設定変更画面が表示されます。
名前やパッケージ名、使用する言語、ビルドツールなどが選択できます。

今回は、名前やパッケージ名等は、初期値のままで作成します。
「型」というところが、ビルドツールです。今回は、Mavenにします。
Mavenは「pom.xml」ファイルを使用して管理します。
今回は、パッケージングも「Jar」のままにします。
![設定画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506867/5456cfe6-8374-f4d2-1349-26e1c4698019.png)

「次へ(N)」をクリックします。

ライブラリの依存関係を追加します。
あとからpom.xmlを編集する事でも追加できます。
今回は、「Spring Web」、「Thymeleaf」を追加します。
Spring Webはwebアプリケーションを作る場合に必要です。
Thymeleafはテンプレートエンジンです。※なしでやってみたら「Whitelabel Error Page」が表示されました。
とりあえず、今はこの2つで進めてみてください。

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506867/d2fec9cf-ea3d-a7c7-d4b0-b4789ec095fa.png)
※自分が最初はじめた時は、他の依存関係等、無駄に色々調べたりして、
苦労した記憶があるので、まずは「Web」選択して完了して動かしてみたほうが良いと思います。
他の依存関係は、必要になった時にまた調べたら良いです。

これでSpringBootプロジェクトの作成ができました。

##Hello Worldを表示##
画面にHello Worldを表示させていきます。
全体の流れは以下の様です。
1. HTMLの作成
2. Controllerクラスの作成
3. 実行

**HTMLの作成をします。**
src\main\resourcesの直下のtemplatesを右クリックし
「新規(W)」→「その他(O)...」と進み、HTMLファイルを作成します。
HTMLファイルを編集します。今回は、「Hello World」を書き込みます。

```html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Hello</title>
</head>
<body>
  <h1>Hello World</h1>
</body>
</html>
```
**Controllerクラスの作成をします**
src\main\java\com\example下のdemoを右クリックし、
「新規(W)」→「クラス」と進み、Java クラスを作成します。
(src\main\java→com.example.demoと表記されているかも)

今回は、名前に「HelloController」と入力し、作成しました。
HelloControllerを編集します。

```Java
package com.example.demo;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class HelloController {

	@RequestMapping(value="/")
	public String index() {
		return "index";
	}
}
```
returnには、表示するHTMLファイルの名前を指定します。
RequestMappingのvalueがURLで指定する値です。

**実行します**
プロジェクトを右クリックし、（今回では、demo[boot]と表示されてる箇所）
「実行(R)」→「Spring Boot アプリケーション」をクリックし、実行します。

コンソールにエラーが表示されなければ実行成功です。
ブラウザを開き、以下のURLを入力します。
「http://localhost:8080/」

Hello Worldが表示されたら成功です。
**eclipseを使ってSpringBootでHello Worldを表示させることができました**
数値の小数点以下以外をカンマ区切りにする

この記事を書く数時間前、数値をカンマ区切りにしたいと思って手っ取り早くQiitaで手法を調べて使用したところ、「小数点以下を3桁までしか表示しない（`toLocaleString`）」や「小数点以下の数列もカンマで区切ってしまう（正規表現）」など、小数点以下について考慮していないものばかりでちょっと面喰いました。

```js:なんてこった.js
var n = 123456789.01234;

function separate(num){
    return String(num).replace( /(\d)(?=(\d\d\d)+(?!\d))/g, '$1,');
}

separate(n);
// "123,456,789.01,234"

n.toLocaleString();
// "123,456,789.012"
```

カンマ区切りをするようなものは大きな数値であることが殆どなので、小数点以下を考慮する必要があまりないのでしょうね。ですがいずれにせよ、私の場合は考慮したかったので、以下のように正規表現を書き換えてみました。

```js:これでどうだ.js
const comma = num => isNaN(num) || String(Number(num)).replace(/(?<!\.\d*?)(\d)(?=(\d{3})+(?!\d))/g, '$1,');

comma(n);
// "123,456,789.01234"
```

否定後読みによってピリオドが前方に無いことを確認させています。また数値に見えて数値でない文字列（`123.456.789`など）をはじくため、`isNaN`で数値かどうかのチェックもしています。

「これで完璧！」と思いきや、一つ問題が。

**SafariとIEでは否定後読みが（というよりは後読み系が）できません**。

IEは別にどうでもいいとして、Safari未サポートは問題ですね。

ですので、否定後読みを無理矢理できるようにする裏ワザ（[Javascriptでの正規表現の後読みの代替](https://qiita.com/yumarule/items/a37520974e39b25b7a6f#%E5%90%A6%E5%AE%9A%E5%BE%8C%E8%AA%AD%E3%81%BF%E3%81%AE%E4%BB%A3%E6%9B%BF-%E3%81%9D%E3%81%AE2) - @yumarule さん）か、あるいは愚直にピリオド以下を取り外して実数部分をカンマ区切りした後に結合させるかのどちらかをしなければいけません。

```js:これにて一件落着.js
/*
  文字をsplitで配列に変換し、reverseで反転させてjoinで結合する。
  すると、Safari・IEでも使える否定先読みで問題を解決できる。
  再度反転させればできあがり。
*/
const comma_2 = num => isNaN(num) || String(Number(num)).split('').reverse().join('').replace(/(\d{3})(?!\d*?\.|$)/g, '$1,').split('').reverse().join('');

comma_2(n);
// "123,456,789.01234"

/*
  ピリオド以下を一度取り外す
*/
const comma_3 = num => {
  var a = String(Number(num)).split('.');
  return isNaN(num) || a[0].replace(/(\d)(?=(\d{3})+(?!\d))/g, '$1,') + (a[1] ? '.' + a[1] : '');
};

comma_3(n);
// "123,456,789.01234"
```

こんな具合ですね。

Safariでも後読み実装されないかな…。

----

> **追記:** 
@il9437 さんが正規表現ではなく`toLocaleString`で書いたものをコメント欄の方にご提示くださいました。`comma_3`のような形式の関数ですが、こちらは非常に直感的で分かりやすいものとなっています。ぜひご確認ください。
[PHP]半角英数のみのファイルの文字コードを変換しようとしてハマったので備忘録

文字コードを変換するコードを書いていて、表題の通り、ハマりましたので、備忘録として書いておきます。

## 環境
* OS: Amazon Linux2
* PHP: 7.4.14

## 詳細
UTF-8のファイルをもとに、SJISでファイル出力するコードを書きました（確認用のコードも含めてます）。

```php:convertEncoding.php
$data_org = file_get_contents('./files/utf8_sample.csv');
echo "変換前の文字コード：".mb_detect_encoding($data_org,"UTF-8, ASCII, SJIS")."\n";
file_put_contents('./files/sjis_sample.csv',  mb_convert_encoding($data_org, "SJIS"), FILE_APPEND | LOCK_EX);
$data_conv = file_get_contents('./files/sjis_sample.csv');
echo "変換後の文字コード：".mb_detect_encoding($data_conv,"UTF-8, ASCII, SJIS")."\n";
```

### 半角英数のみのファイルを用いた場合
変換前のファイルの内容は以下の通り。文字コードはUTF-8です。

```csvs:utf8_sample.csv
id,sex,age,amount,category
00000003,m,31,00002001,food
00000003,m,31,00007569,clothes
00000012,f,24,00001482,clothes
00000013,m,41,00012349,other
00000016,f,53,00001297,book
00000016,f,53,00005264,food
```

で、変換前のファイルを所定の場所に置き、PHPファイルを実行すると、以下のような結果に。

```:コンソール出力結果
$ php fileEncoding.php
変換前の文字コード：UTF-8
変換後の文字コード：UTF-8
```

ん? 変換されてない?

調べていくうちに、半角英数の場合は、どの文字コードでも（今回の比較対象：JIS, SJIS, EUC, UTF-8, UTF-16）、同じ文字数字の組み合わせになることが判明（当たり前っちゃ当たり前な気もしますが）。

[Unicode対応 文字コード表](http://ash.jp/code/unitbl1.htm)

辺りを見ると、一目瞭然！

文字エンコーディングを検出する関数[mb_detect_encoding](https://www.php.net/manual/ja/function.mb-detect-encoding.php)では、第2引数に指定した文字エンコーディングをリストを先頭から順番に一致するものがないか検索するようなので、試しに、convertEncoding.phpのmb_detect_encodingの第2引数の順序を変えてみるとコンソール出力結果は、以下のようになりました。

```:ASCIIを先頭にした場合
$ php fileEncoding.php
変換前の文字コード：ASCII
変換後の文字コード：ASCII
```
```:SJISを先頭にした場合
$ php fileEncoding.php
変換前の文字コード：SJIS
変換後の文字コード：SJIS
```
変換対象が半角英数の場合は、どの文字エンコーディングでも、表現が共通しているから、第2引数の先頭に指定したものに合致すると見なされるわけですね。

ちなみに、nkfコマンドで文字コードの確認をすると以下の通りに。

```:nkfコマンドの実行結果
# 変換前のファイル
$ nkf --guess ./files/utf8_sample.csv
ASCII (CRLF)
# 変換後のファイル
$ nkf --guess ./files/utf8_sample.csv
ASCII (CRLF)
```
UTF-8も、SJISもASCIIの拡張だからかな・・?

### 日本語入りのファイルを用いた場合
原因が分かったところで、変換前のファイルの一部を日本語にしてみます。今回も、文字コードはUTF-8です。

```csvs:utf8_sample.csv
id,sex,age,amount,category
00000003,m,31,00002001,食品
00000003,m,31,00007569,衣類
00000012,f,24,00001482,衣類
00000013,m,41,00012349,その他
00000016,f,53,00001297,本
00000016,f,53,00005264,食品
```

再度、convertEncoding.phpを実行！

```:コンソール出力結果
$ php fileEncoding.php
変換前の文字コード：UTF-8
変換後の文字コード：SJIS
```
今度はうまくいきました！

nkfコマンドでも確認してみると・・・

```:nkfコマンドの実行結果
$ nkf --guess ./files/utf8_sample.csv
UTF-8 (CRLF)
# 変換後のファイル
$ nkf --guess ./files/utf8_sample.csv
Shift_JIS (CRLF)
```

こちらも想定通り！！


## 結論
* 文字コードを正しく理解する！
* 文字コード変換するなら、対象の言語を用いる！<br>

につきますね。

## 参考
* [ASCII, S-JIS, UTF-8 | Qiita](https://qiita.com/icechikin/items/1729b6482c997f4d3833)
* [新人さんに知ってほしい「文字コードのお話」| Qiita](https://qiita.com/yuji38kwmt/items/b3a7820b4d3b544da4ff)
もうシェルスクリプトでif文の書き方を迷わないための逆引きレシピ

# if文

書き方

```bash
if [ 条件式 ]; then
  処理
elif [ 条件式 ]; then
  処理
else
  処理
fi
```

具体例

```bash
if [ $NUM -eq 0 ]; then  # $NUMが0と一致した場合
  echo "Succeed"
elif [ $NUM -eq 1 ]; then  # $NUMが1と一致した場合
  echo "Cleared"
else
  echo "Failed"
fi
```

注意点

- `[`の直後と`]`の直前には半角スペースが必要
- testコマンドの略式なので，testコマンドでも同様に書き換え可能

# 条件式の書き方

## 文字列の比較

文字列の比較には `=` や `!=` を使う．

```bash
if [ $STR = "sunny" ]; then
  echo "Succeed"
elif [ $STR != "rainy" ]; then
  echo "Cleared"
else
  echo "Failed"
fi
```

## 数値の比較

数値の比較には `-eq` や `-ne` を使う．

| Python | シェルスクリプト |
| --- | --- |
| == | -eq |
| >= | -ge |
| > | -gt |
| != | -ne |

```bash
if [ $NUM -eq 0 ]; then
  echo "NUM == 0"
elif [ $NUM -gt 10 ]; then
  echo "NUM > 10"
fi
```

`gt` はgreater thanなので，逆向きの演算子として `-lt` や `-le` がある．

## 論理演算(AND/OR/NOT)

論理演算子は以下がサポートされている．

| Python | シェルスクリプト |
| --- | --- |
| and | && |
| or | &#124;&#124; |
| not | ! |

```bash
if [ $NUM -eq 0 ] && [ $STR = "foo" ]; then
  echo "NUM == 0 and STR == foo"
elif [ $NUM -gt 10 ] || [ ! $FLAG ]; then
  echo "NUM > 10 or not FLAG"
fi
```

**2021-08-16 追記**

`-a`や`-o`は非推奨でした．`&&`や`||`の利用が推奨されている．

[シェルスクリプトの [ -a (AND) と -o (OR) ] は非推奨だかんね - Qiita](https://qiita.com/ko1nksm/items/6201b2ce47f4d6126521)

## 変数が定義済みか

文字列(変数 `STR`)の長さが**0(空)である場合**にTRUE → `-z`

```bash
if [ -z "$STR" ]; then
  echo "Zero"
fi
```

文字列(変数 `STR`)の長さが**0(空)でない場合**にTRUE → `-n`

```bash
if [ -n "$STR" ]; then
  echo "Nonzero"
fi
```

## 正規表現による比較

exprコマンドで正規表現の比較ができる．

ただし，exprコマンドは拡張正規表現が使えない．例えば， `(Apple|Orange)` は扱えない．bashやzshは後述の方法を使ったほうがよい．

```bash
if expr "123-4567" : "^[0-9]\{3\}-[0-9]\{4\}"; then
  echo "True"
else
  echo "False"
fi
```

bashやzshであれば `[[ $target =~ REGEX ]]` のように書くことで正規表現で比較できる．

[シェルスクリプトでの正規表現を使ったバリデーション - unhurried](https://unhurried.hatenablog.com/entry/shell_regex_validation)

## ファイル/ディレクトリの存在

ファイルまたはディレクトリ `dat`が存在する場合にTRUE → `-e`

```bash
if [ -e "dat" ]; then
  echo "Existing"
fi
```

ファイル `1.txt` が存在する場合にTRUE → `-f`

```bash
if [ -f "1.txt" ]; then
  echo "Existing file"
fi
```

ディレクトリ `samples` が存在する場合にTRUE → `-d`

```bash
if [ -d "samples" ]; then
  echo "Existing dir"
fi
```

## コマンドの実行結果

コマンドを `if` コマンドの後ろに直接記述すればよい．

```bash
if mkdir sample; then
    echo "Successed"
else
    echo "Failed"
fi
```

`$?`を使えば直前のコマンドの実行結果を確認できる．

```bash
mkdir sample  # 直前のコマンド
if [ $? -eq 0 ]; then
  echo "OK"
else
  echo "NG"
fi
```

ワンライナーで書く方法もある．

```bash
mkdir sample && echo "OK" || echo "NG"
```

複数ならべる時はカッコをつければよい．

```bash
mkdir sample && (echo "OK1" && echo "OK2") || (echo "NG1" && echo "NG2")
```

中括弧でも同様にかける．

```bash
mkdir sample && {
  echo "OK1"
  echo "OK2"
} || {
  echo "NG1"
  echo "NG2"
}
```

# 参考URL

- [シェルスクリプトの if は3分で簡単にマスターできる #Bash - Qiita](https://qiita.com/ko1nksm/items/42ce398c17b1b55d216b)
- [シェルスクリプトでの変数定義 - Qiita](https://qiita.com/tdrk/items/cc2995fd74e659ea948f)
- [if 文と test コマンド | UNIX & Linux コマンド・シェルスクリプト リファレンス](https://shellscript.sunone.me/if_and_test.html)
- [シェルスクリプト（bash）のif文やwhile文で使う演算子について - Qiita](https://qiita.com/egawa_kun/items/196cd354c0d8e4e0fefc)
AWS 認定クラウドプラクティショナーに合格したお話

はじめに
-
私が試験を受ける際に使用した教材や試験のポイントを簡潔にまとめてみました。

主な対象者
-
・クラウドプラクティショナーを受験する方
・一度受験したが合格できなかった方

使用した教材
-
・AWS認定資格試験テキスト AWS認定 クラウドプラクティショナー
   [ AWS認定 クラウドプラクティショナー](https://www.amazon.co.jp/AWS%E8%AA%8D%E5%AE%9A%E8%B3%87%E6%A0%BC%E8%A9%A6%E9%A8%93%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88-AWS%E8%AA%8D%E5%AE%9A-%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E3%83%97%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%BC-%E5%B1%B1%E4%B8%8B-%E5%85%89%E6%B4%8B/dp/4797397403/ref=sr_1_1?adgrpid=112883073061&dchild=1&hvadid=492569283323&hvdev=c&hvqmt=b&hvtargid=kwd-574411356434&hydadcr=26606_10279519&jp-ad-ap=0&keywords=aws+%E3%83%97%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%BC&qid=1613221735&sr=8-1&tag=yahhyd-22)
・この問題だけで合格可能！AWS認定クラウドプラクテショナー模擬試験問題集(Udemy)

やったこと
-
・まずは上記の教材を一読して全体の概要を掴み、サービスの名前やアーキテクチャの概要を理解していきました。
・次にUdemyの模擬試験問題集を正答率80%を超えるまで繰り返し解きました。（平均して3回ずつくらい）
・模擬試験を解き終わったあともう一度教材を読み直し試験に望みました。


試験で意識するべきポイント！！！
-
*試験を受ける上で抑えておいたほうが良いポイントを下記に示します。*

1. AWSの責任範囲とユーザーの責任範囲の違いについて（OSのアップデートは誰がやるのかなど）
2. EC2インスタンスの特徴（リザーブド・オンデマンド）
3. RDSの利点（→結構でますしっかり抑えましょう！）
4. CloudWatchとCloudTrailとCloudFrontは出ると思います。
5. ベーシックプラン、開発者、エンタープライズプランの違いを理解する。（ベーシックではできなくて開発者ではできることなど）
6. クラウドアーキテクチャの設計原理
7. Well-Architectedフレームワーク（信頼性の柱とは何かなど）
8. IAMの理解
9. クラウドのメリット（迅速に対応できるなど）
10. アベイラビリティゾーンとエッジロケーションの違いについて
11. コスト見積もりの違いについて
12. アジリティとは何かについて
13. シングルサインオンのサービスについて

ポイントを列挙してみました。
他にも教材に出てくるサービスの概要は理解しておきましょう。
このサービスは〇〇をすると言えるまで覚えましょう。

以上、クラウドプラクティショナー試験を受験する上でのポイントをまとめてみました。ご参考までに。