OmniAICreator/Qiita-1.07M huggingface dataset:
AWSのCloudWatchで請求アラームを作成してみる

# 概要
無料枠を個人で利用しているため、想定外の請求防止のためにCloudWatchで請求アラームを作成します。

# 手順
- CloudWatchの画面を開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367069/18db821e-c7a0-83f2-773d-84f7b36ce5af.png)

- リージョンをバージニア北部にする![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367069/23942073-2084-52e0-aeb8-33d05e0c8263.png)
- すべてのアラーム → アラームの作成 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367069/571e2e98-301d-de2b-9430-169aed07c545.png)
- メトリクスの選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367069/91367dcd-b60f-280c-bb9b-009dd83b5b22.png)
- 「請求」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367069/8f15ed3d-50c6-a66f-d5c7-6e1b2a02ed78.png)
- 「概算合計請求額」を選択し、「メトリクスの選択」を押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367069/907a5ea2-af1f-3da2-6cd0-460853ab4d2c.png)
- EstimatedCargesのチェックボックスを選択![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367069/bf3552a8-3f50-7f2e-7b5c-9f1f3ff34220.png)
- ここは何もせず![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367069/9c02f4f9-1fec-1166-94a2-dbeb25caad93.png)
- しきい値に値を設定し、「次へ」を選択![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367069/4862d430-bf78-3e8e-b78a-c00df59d7217.png)
- SNSトピックを設定する![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367069/fad71d23-0604-365b-2ec5-5db01447446e.png)

- 「次へ」を選択![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367069/ca5e6023-17a8-488f-4026-d3a1683b4f20.png)
- アラームの名前と説明を記入し、「次へ」を選択![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367069/cad158d6-f415-40a5-f746-48342ef975b6.png)
- プレビュー画面で確認し、問題がなければ「アラームの作成」を選択![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367069/a95a8257-4cc4-e949-7814-954a7e753150.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367069/7038f5d8-8d3f-1fa0-c1c6-0955945966ed.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367069/a67d6cd6-5160-71ed-a8f8-aa2c008075e6.png)

# 参考
[シナリオ: CloudWatch で予想請求額をモニタリングする](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/gs_monitor_estimated_charges_with_cloudwatch.html#gs_creating_billing_alarm)
Goを触る②


[こちら](https://qiita.com/iskn19/items/a603e7a56283df819965#%E5%A4%89%E6%95%B0)の続き

# 変数
関数はfuncで定義

```go
func add(hoge int, fuga int) int {
    return hoge + fuga
}
```
```｛``` 前の型で戻り値の型を宣言
```return``` で戻り値を設定

戻り値が複数の場合は型名は ```(,) ```で設定する必要がある

```go
func addMinus(x int, y int) (int, int) {
    return x + y, x - y
}
```
ブランク変数を使って必要な値のみ取得する
```go
package main
import "fmt"

func main() {
	var a string 
 	_ , a = hoge("sss","sssssss")
	fmt.Println(a)
}
func hoge(x string, y string) (string, string) {
    return x + y, x + y + y
}
```

# 構造体
Goではクラス(class)の代わりに 構造体(struct) を使用する
```go
type Person struct {
    name string
    age int
}
```
クラスに紐付けられたメソッドは
関数名の前に (thisに相当する変数 *構造体名) をつけて定義
```go

package main
import "fmt"

func main() {
    var p1 Person
    p1.SetPerson("hoge", 10)
	var name = p1.GetName()
	fmt.Println(name)
}
// 
type Person struct {
    name string
    age int
}
// setter
func (p *Person) SetPerson(name string, age int) {
    p.name = name
    p.age = age
}
// getter
func (p *Person) GetName() string {
    return p.name
}
```
構造体のメンバの内、大文字で始まるものはパッケージ外からアクセス可能、小文字で始まるものはパッケージ外からアクセス不可　　


# ゴルーチン
ゴルーチンはGo言語における並行処理を行うもの 
関数の前に go キーワードを追加する
```go
go hoge(x,y,z)
```
上記でメインの処理を実行しながら、並行して関数 hoge() を実行できる

# チャネル
チャネルはゴルーチン間でデータを受け渡すために設計されたGo言語特有のデータ構造
チャネルは定義方法が２つあり
### makeを使わずに定義
```go
// 双方向
var ch chan int

// 受信専用
var ch <-chan int

// 送信専用
var ch chan<- int
```

### makeを使って定義
```go
// バッファサイズ指定なし = バッファサイズ0
ch := make(chan int)

// バッファサイズ指定あり
ch := make(chan int, int)
```

```<-```を用いて送信と受信を行うことが可能
```go
package main
import "fmt"

func main() {
	ch := make(chan int)
	go count(ch)
	x := <-ch
	fmt.Println(x)
}

func count(ch chan int) {
	ch <- 100
}
```
# まとめ
ゴルーチン処理がなかなか複雑でもうちょっと詰めていこうと思います。
NumPy で欠損値等を除く時は np.ma.masked_where が便利

# 要素削除の問題点

NumPyで欠損値や外れ値を除く時どうしてますか？多くの人が単純にその要素を配列から削除していると思います。例えば`nan`を除くなら以下のような感じ。

```python:これでもいいが...
a = np.array([3, 4, np.nan, 8, np.nan])
a = a[~np.isnan(a)]
print(a) # [3. 4. 8.]
print(a.mean()) # 5.0
```

この方法でもいいのですが、よくある問題として要素を削除するとそれが元のデータの何番目だったのか分からなくなるということがあります。例えば値を除いて分析した後にこの最大値を取るものを個別に見てみたいとか思っても、消している要素があるのでそれが元のデータ上では何番目になるのかわかりません。

# Masked Array
そんな時に便利なのがmasked arrayです。masked arrayはNumPyに元から入っている機能です。masked arrayは普通のndarrayとマスクを一つにした型で、個々の要素についてマスクするかしないかを決められます。そしてマスクした要素はndarrayに存在はしますが、あらゆる計算から除外されます。

例えば上の例をmasked arrayを使って書き直したのが以下です。

```python:maske arrayを使う
a = np.array([3, 4, np.nan, 8, np.nan])
print(a.mean()) # nan
a = np.ma.masked_where(np.isnan(a), a)
print(a) # [3.0 4.0 -- 8.0 --]
print(a.mean()) # 5.0
```

`np.ma.masked_where`関数でmasked arrayを作っています。第一引数がマスクのbool型ndarray、第二引数がマスクされる元のndarrayです。上記のようにmasked arrayではマスクされた要素は`--`で表されており、`a.mean()`では計算から外されています.

Masked arrayでは要素を消している訳ではないので加工前と後の対応関係がわからなくなるということがありません。

# もっと例を見る

行列で`-1`を含む行全体をマスクしたい時。

```python
a = np.array([
    [0, 1, -1],
    [3, 3, 9],
    [1, 4, 6],
    [-1, 5, -1],
])
a = np.ma.mask_rows(np.ma.masked_where(a == -1, a))
print(a)
# [[-- -- --]
#  [3 3 9]
#  [1 4 6]
#  [-- -- --]]
print(a.sum(axis=1)) # [-- 15 11 --]
```

Masked arrayのスカラー倍は同じ場所がマスクされたmasked arrayを返す。行列積はエラーになる模様（正確なマスク伝搬の仕組みは理解してない...）。

```python
a = np.ma.masked_where([False, True, False, True], [0, 1, 2, 3])
print(2 * a) # [0 -- 4 --]
print(a @ np.array([[1], [1], [1], [1]])) # ValueError: could not broadcast where mask from shape (4,4) into shape (1,)
```

`nan`と`inf`を両方マスクしたいとき、`np.ma.masked_invalid`関数がショートカットとして使える。
```python
a = np.array([ 0,  1, np.nan, np.inf, -np.inf])
print(np.ma.masked_invalid(a)) # [0.0 1.0 -- -- --]
```

# あとがき
masked arrayはNumPy標準の機能なのに知名度が低いと思います。まあ私も何番目か分からなくなるのを防ぐ以外のメリットが思いつかないので、利用価値が低いのでしょう。でもこの機能があること知っていればそのような特定の場面でとても便利に使えると思います。

# 参考
[https://numpy.org/doc/stable/reference/maskedarray.html](https://numpy.org/doc/stable/reference/maskedarray.html)
ハンズオンの概要

# 環境
* Windows Server 2022
* プロセッサ	AMD Ryzen 5 3600 6-Core Processor                 3.60 GHz
* 実装 RAM	4.00 GB

* システムの種類	64 ビット オペレーティング システム、* x64 ベース プロセッサ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758644/2d9d71f4-b2f5-c8cd-540b-824685a87db0.png)

# VirtualBoxインストール
以下のサイトからVirtualBoxをダウンロードし、ローカルのPCにインストールする。
https://www.virtualbox.org/

# WindowsServer 2022のダウンロード
「WindowsServer 2022 評価版」とかGoogleで検索して、ダウンロードする。

# 仮想マシン作成
仮想マシン＞新規をクリック。以下の項目を設定し、作成をクリックする。
* 名前：WindowsServer2022_1(任意)
* バージョン：WindowsServer2019(2022が無いため)
* メモリ：　4096MB(デフォルトは2048)
* ハードディスク：[仮想ハードディスクを作成する]
* ハードディスクのタイプ：VDI
    * VDI(VitrualBox Disk Images)：VirtualBoxのデフォルトのディスクフォーマット。
    * VHD(Virtual Hard Disk)：MicrosoftのHyper-V用のディスクフォーマット。利点としては、物理ディスク内のvhdファイルから物理マシンをブートすることができる。
    * VMDK(Virtual Machine Disk)：VMwareのディスクフォーマット。差分バックアップをとることができるためバックアップの効率が優れている。
* 物理ハードディスクにあるストレージ：可変サイズ
使用した分だけ物理ハードディスクの領域を消費する。固定より遅いらしい。
* ファイルのサイズ：50GB(デフォルトは50GB)
可変サイズの上限値。

# 仮想マシンの設定
作成した仮想マシンを右クリックし、設定をクリックする。
## ネットワークの設定
ネットワーク＞アダプター1のタブを選択し割り当てを変更する。
* 割り当て：ブリッジアダプター
ローカルPCと同じNW上に仮想マシンがあるイメージ。以下の画像でいうホストOSとサーバ01が同じ場所にあるということ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758644/2d9d71f4-b2f5-c8cd-540b-824685a87db0.png)

## ストレージの設定
仮想マシンのDVDが空になっているのを、インストールしたWindowsServerのisoファイルを選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758644/c23fccf9-4aab-b019-3007-92729d1dc741.png)

# 仮想マシンを起動
ハードディスクから起動するか、DVDドライブから起動か選ぶ画面で、DVDドライブを選択して起動する。

# WindowsServer2022 インストール
* キーボードとかを日本語で設定し、インストールする。
* プロタクトキーの入力を求められるが、評価版なので[プロダクトキーがありません]を選択して回避。
* OSの選択では、[WindowsServer 2022 Datacenter(デスクトップエクスペリエンス)]を選択する。
    * デスクトップエクスペリエンスは、普通のGUI。
    * スタンダードとデータセンターの違い
    機能の違いはあまり無く、ライセンスの違い？
    https://docs.microsoft.com/ja-jp/windows-server/get-started/editions-comparison-windows-server-2019
* インストールの種類：最初から作成する場合、カスタム。

# WindowsServer2022 設定
VirtualBoxからWindowsServerを触るのはタイムラグがでかいので、RDPでアクセスできるように設定をする。
* IPv6を使わないので無効化
* IPv4のプロパティでアドレスをローカルPCと同じサブネットで任意のアドレスに設定する。
* DNSサーバをRouterにする。もしくは8.8.8.8

# 設定の確認
コマンドプロンプトでIPアドレスが設定されていることとインターネットにアクセスできることを確認する。
```cmd
ipconfig
ping 8.8.8.8
```

# リモートデスクトップ接続
「コントロールパネル＞システム＞リモートアクセスの許可＞このコンピューターへのリモート接続を許可する」を選択する。

# リモートデスクトップ接続してみる
WindowsServer 2022 にActiveDirectoryをインストールする

# 環境
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758644/bda4befc-d834-7d6e-26ad-30e66f3e157f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758644/ecec2518-c500-936c-c61d-dc3527014bf1.png)

# 概要
サーバ01にADインストールをする

# 役割と機能の追加
ここでソフトウェアのインストールとかできる。
1. サーバマネージャで[管理]>[役割と機能の追加]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758644/0e455ac7-03f4-4aa8-46ca-95fdbff05f76.png)

2. インストールオプション
下記を選択してインストール
インストールの種類：役割ベースまたは機能ベースのインストール
サーバの選択：[サーバプールのサーバを選択]で自サーバを選択
　　　　　　　要は自分自身のオプションを追加するようなイメージ
サーバの役割：Active Directoryドメインサービス
機能：（デフォルト）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758644/08df8c59-6873-f7b0-cd6b-6a94f368967d.png)

# ドメインコントローラへ昇格
インストールしただけだと警告が出る。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758644/1034b1b0-9137-600a-275a-d6459f65e2a7.png)
[MySQL5.6] バルクアップデート（ELT/FIELD）でnullが登録される

速度改善のためにバルクアップデート使いますよね。
`ELT/FIELD`句を使ったバルクアップデートが便利ですが、使い方には要注意です。

# 結論
`WHERE`のid指定と`ELT/FIELD`のid指定は同じ数でないといけない。
差分更新ができない。

# テストケース
進級にあたってクラス名を変更したい。
ただしIDが3の生徒はクラス名が変わらないとします。

##### ■生徒テーブル
|ID  |クラス名  |
|---|---|
|1  | 1-Aクラス |
|2  | 1-Bクラス |
|3  | 1-Cクラス |
|4  | 1-Dクラス |
|5  | 1-Eクラス |

```sql
-- 3番目のレコードだけ更新をスキップしようとした場合
UPDATE `students`
SET `class` = ELT(FIELD(id, 1, 2, 4, 5), '2-Aクラス', '2-Bクラス', '2-Dクラス', '2-Eクラス'),
WHERE `id` IN (1, 2, 3, 4, 5);
```

##### ■結果
|ID  |クラス名  |
|---|---|
|1  | 2-Aクラス |
|2  | 2-Bクラス |
|3  | null |
|4  | 2-Dクラス |
|5  | 2-Eクラス |

### ！？！？！？！？

## 「WHERE句のid指定数」よりも「ELT/FIELDのid指定数」が少ない場合
`ELT/FIELD`で指定が漏れたものに関してはnullで更新される。


## 「WHERE句のid指定数」よりも「ELT/FIELDのid指定数」が多い場合
`WHERE`を基準に実行されるため、更新されない。
特に問題ない
DAZNの期限をギフトコードで延長する

# DAZNのギフトコード
なんかややこしいのでメモ

# 手順
1. https://www.dazn.com/ja-JP/home
1. ログイン
1. ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297216/b28df171-8107-dcee-9115-684749acf570.png)
続行
1. ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297216/f253f5ff-6910-b60e-badc-edec23316dd1.png)
下部の`コードを利用する`
1. コード入力する
1. ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297216/0a2282a0-91cf-0c80-0e7f-b59a11c54653.png)
スタートする
1. ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297216/a1bab35d-e77c-96fd-9e37-a8e316ca035b.png)
1. ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297216/6371d3ad-7f3b-1f07-3085-ce02f0287495.png)
oracle vss writer サービスを開始できません 0x80070005


oracle vss writer サービスが停止しているために、バックアップが失敗。

以下のVSSライターサービスを起動させる必要があるようだ。
・OracleVSSWriterHRMORCL
・OracleVssWriterORACLE

しかし、「サービス」から開始しようとすると、エラーがでて開始できない。

エラー0x80070005「アクセスが拒否されました」


【解決】
「サービス」から以下のサービスを見つけ、右クリックし、プロパティを開きます。
・OracleVSSWriterHRMORCL
・OracleVssWriterORACLE
![サービス.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206656/ca298cf8-83c0-a6d2-3acd-5ff8325e7cdc.png)


ログオンのタブで「ローカルシステムアカウント」を選択し、閉じる。
![Oracleプロパティ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206656/96a3a2aa-6997-f149-08b5-ff0995568240.png)

⇒実行できた！
AndroidでのJava→Kotlin移行時に起動すると異常終了するようになった場合の対処法

## Javaファイル右クリック → Convert Java File to Kotlin File

このままだと変換は無事終了するが、起動時に以下のエラーが出て異常終了してしまう。

```
Caused by: java.lang.ClassNotFoundException: Didn't find class "com.xxxxx.xxxxxxx.XxxXxxxxx" on path: DexPathList[[zip file
```

## javaディレクトリ右クリック → Convert Java File to Kotlin File

こちらだと、以下の確認ダイアログが表示される。
```
Kotlin is not configured in the project
You will have to configure Kotlin in project before performing a conversion.
```

```OK, configure Kotlin in the project```を選ぶと、```build.gradle```や```app/build.gradle```にも```dependencies```などの必要な設定が自動的に追加される。

```compileSdkVersion```を上げるよう指示があれば、それに従う。

これで異常終了することは無くなる。
App Store Connect の 2ファクタ認証に失敗する場合

## 原因

全角入力になっています。

## 直し方

半角入力に切り替えます。

## まとめ

Apple ID とパスワードを入力し直しても、
2ファクタ認証に失敗することってありますよね。
電話でもSMSでも、何回慎重に入力しても失敗してしまいます。

そんなときは、おそらく日本語の全角入力になっています。
入力すると正しく数字が表示されるので気が付きにくいのですが、
全角数字と半角数字は異なるため認証に失敗します。

落ち着いて半角に切り替えて、入力しなおせば認証に成功するでしょう。
javascriptでobjectをjson（文字列）にする

単純に `JSON.stringify` で良いじゃんっていう記事が多いけどできないことがあったので別解。

```js
const obj = {a: 2, b: 3, c: 5, d:{"x":200,"v":300,"z":800}};
const json = JSON.stringify(Object.fromEntries(Object.entries(obj)));
//{"a":2,"b":3,"c":5,"d":{"x":200,"v":300,"z":800}}
JSON.parse(json).d.v;
//300
```


`toSource` とかも出てきたので非推奨で廃止済みなので論外。
AWS Builders Online 感想(7/14) 




時間が3枠あるのは参加しやすくて助かります。
19時枠に参加しました。

ちなみに4年ほど前にSAA所持していますが、実務経験はなし。
趣味で触ったりイベント参加する程度のAWS力です。

自分以外の感想はTwitterで`#AWSBuilders`で検索するといっぱいあります。



# 感想

## いちばんはじめに押さえておきたい！初学者向け AWS キーワード Top 10 〜一気に解説編〜
`欲しかったのは AWS App Runner でした 〜とあるウェブアプリを AWS 上でいい感じに公開する話〜`
と迷いましたが、久々なのでこっちに。

最後のコツが一番ためになると思いました。


- AZ
  - AZ設置のポリシーの詳細までは知りませんでした。
- Blackbelt
  - 初学者ながら新入社員に「何勉強すればいいですか？」と聞かれるたびにBlackbeltをみてほしいと言っていたので、こういう場で案内してもらえると助かる。
  - 併せて案内している[AWS 初学者向けの勉強方法 6 ステップ！2022 年版！](https://aws.amazon.com/jp/blogs/news/2022-aws-beginner-learning/)も最後に紹介されていました。
- VPC
- STS・IAM
  - 業務でしか利用したことがない人だと、自分でIAMを管理するのではなく払い出してもらう場合のみという人もいて、「AWSは使ってるけどIAM使ったことがない」という人がいるのは最近得た知見です。
  - IAMユーザー（人観点）の説明だけでなく、IAMロール＋STS（サービス観点）の説明もあり、混乱しそうな点の開設が助かります。
- 結果整合性
  - S3については2020/12から考え方変わった、という案内のようです。
  - 難しいですが、過去資料などを見る際は気を付けてねという意味合いが強そうです。
  - DynamoDBは元から今の結果整合性なので認識合っていてほっとしました。
- 責任共有モデル
- CCoE
  - 組織の話なので初学者には厳しいような…
  - CCoEを立ち上げる時には相談してね！で笑ってしまいました。
- エッジロケーション
  - 最近CDN（cloudflare）で障害とかあったよなぁとか。
  - ネットワークもイントラとかばっかりやってると意識しないワードなので、いいと思います。
- リージョン


- 学習のコツ
  -    InputとOutputの繰り返しが鉄板の勉強法！



## みんなコンテナどんな風に使ってる？ 〜すぐに使えるコンテナレシピ〜
コンテナ・仮想化すら未経験の古代人なので。

- コンテナとは？
  - コンピューター仮想化、コンテナとは何ぞや？からスタートしているのがいいですね。
    - 仮想化ハイパーバイザの仕組み、初めて考えてみたかも。
  - レジストリをWeb上で探すという発想がなかったのですが、探せばあるそうな…
- コンテナレシピ
  - 品質向上
    - 配布・実行・デプロイなどのあいまいな言葉の解説も助かりました。
  - ダウンタイムの少ないシステム
    - ブルーグリーンデプロイメント
      - 新旧の一括切り替え
      - 切り戻し重視
    - ローリングアップデート
      - 順次アップデート
      - コスト重視
  - 類似環境の複製・評価
    - OS・ライブラリバージョンの差分確認
      - 別ベンダ作成のものを利用しなければならないはめっちゃ納得しました。
      - EKS Anywhere、いつの間にか増えてた？
  - インフラの管理工数削減
    - Fargateの紹介がメインでした。
      - 使ってみたいFargateですが、腰が重くいまだ使ってません。
  - セキュリティリスク削減
    - 管理者アクセス
    - 本番環境に誰も管理者アクセスさせない？？？？
      - 初めて知った考え方なのでびっくりしました。
      - ログなどは外部で保存。
      - コンテナそのものはなんかあったら作り直す
      - なので安全
      - Fargateはこの方式とのこと。
- 失敗事例
  - 物理サーバのように扱う
    - OSのバージョンアップ・パッチとか当てちゃう
    - この場合は新しいイメージを使う
  - オンプレをそのままコンテナ化
    - コンテナが苦手な分野など。
      - ICカードリーダーなどのHW利用するもの。



## AWS Control Tower で始める はじめての AWSアカウント管理 

個人用・会社用・それぞれの各PJ用…と使い分けたりしているとIAM管理マジムリ…ってなるので。
出始めにちょっと調べただけでしたが、すごい便利そうなので現行環境破棄してControl Towerで作りなおすことをまじめに検討してます。

- アカウントの実現すること
  - セキュリティ分離
  - リソース分離
  - 課金の分離
    - これが一番いいよね。
- アカウント展開
  - 現在はマルチアカウント構成が推奨されている
  - VPC管理からアカウント管理に遷移してきた
  - 前振り長くなりました！で笑いました。
- Control Tower
  - プリセット提供なんてあったの？
  - ユースケース
    - これから利用する人
    - 既に複数運用してる人
  - 提供機能
    - SSO
      - なにこの画面、しらない…Control Towerからだとこんな感じなの？
      - アカウントのパスワード毎回忘れて調べてるもんな…
      - 機能そのものはAWS SSOの機能をControl Towerが有効化しているよう
  - ログ収集機能
    - 監査目的よりの機能。
    - アカウント外にログ保存できるのは便利。
    - 機能はCloud trailのものです。
  - ガードレール
    - 初学者がリスクのある操作がわからない…
      - チェックリスト渡すわけではなくて、操作の禁止・設定の監視を行う。
    - Config、Organizationosの機能
  - アカウント作成
    - 新規作成できるの？？？？！！！
      - 今のアカウント破棄して０から作り直そうかな…
      - Servcie catalog、Cloudformation の機能
        - これをここまでセットアップするのはだいぶ大変では…
用件定義の正しさを取るのか、開発効率（コスパ）を求めるのか。

# 効率よりも正しくあるべき
理想、「効率よりも正しくあるべき」は理想である。

## 最速の開発、最高のコスパは 理想と真逆。
> 営業やマーケサイドから XX をやってほしいと言われ
> その場で仕様を考え、ざっとインパクトを出した上で開発着手

おそらくこれは最速で、最もコスパの良い開発方法だろう。
小さな開発チームにおいて、このように開発が進むことが多くある

## コスパのために犠牲にしていること
上記の開発手法はコスパが非常に高い。
無駄が一切なく、必要最低限の工数で理想的なプロダクトを最短で作れる。

### コスパとのトレードオフは必ず存在する
何もかもが`必要最低限`なので考慮出来て居ない事は当然ある。

- 意思決定者の不在（営業と実装担当者2名で決めるので事業としての判断ではない）
- リスク、ハレーション、社内連携ミス
- インパクト考慮、KPI未策定、蓋然性検討
- 計測方法、撤退基準、改善プラン、今後の展望

## 正しさをどこまで求めるのか
チームとしてどこまで正しくあるべきなのかは明確に定義しなければならない。

### 【定義すべきもの】
* 用件定義をどこまで詰めるのか
* 用件定義の不足情報や詰め、リスク考慮をチームとして行う状態を作るか
* 施策の「やる、やらない」を誰が何時、どのように決めるのか


## 私のチームで一旦やってみようと思う流れ
* 用件定義は背景、作りたいもの、デザイン、計測方法、KPIをセットで。
* チーム全体で定義した要件を検討し、問題がないことを確認
* 施策の実施可否は開発、マーケ、営業のリーダー3人の合意で決定とする

## エンジニアの怠慢では？
もちろん初めはセールスサイド、マーケサイドからなぜここまで細かく用件定義してあげないといけないんだ。
エンジニアの怠慢だと言われるかも知れない。


## エンジニアが決めすぎ問題
今までエンジニアがよしなに全てを考えて確認して、開発をしすぎていたのだ。

エンジニアが営業、マーケ、カスタマーサポートの面で問題ないか一人一人に確認しに奔走し
エンジニアがやるやらないの判断をする

あまりにもリスクが高い、それは避けよう。
LPIC201合格までの過程

# はじめに
先日、LPIC201を合格しました。
その際の学習時間や方法について、こちらで紹介させていただきます。

# この記事の対象者
・LPICを受験予定もしくは受けようと考えている方
・業務でLINUXに携わる機会がある方
・LPICレベル1を既に取得済みの方

# 筆者のレベル
約1年ほど前にLPICレベル1(101,102)を合格済みで
職場ではLINUX環境下での作業をたまに行うことがある程度です。

# 試験の概要
[ピアソンVUEサイト](https://www.pearsonvue.co.jp/Clients/LPI.aspx)

試験方式：CBT方式

試験会場/日程：任意で選択可能
受験料：16,500円(税込)
合否発表：即時
試験時間：90分
出題数：60問
出題方式：多肢選択、記述の混合
合格点：6割程度

# 試験結果
合格ラインは500点で、私は今回600点をとることができました。
満点が800点であったため、単純計算でいくと正答率62.5%以上で合格、
60問中38問とれていればよいということになります。

# 学習方法
今回は、Ping-t という学習サイトのみで臨みました。
実のところ、私は過去に2回201を受けて不合格となっており
学習時の意識を改め、Ping-t で勉強する際に問題の解説をしっかり読み込むに注力しました。

Ping-t では基本的な知識に加えて、少し応用が入ったような模擬問題を通して
学習することができますが、問題自体の難易度はやはり本番の方が難しいように思います。
模擬問題の質問と答えにプラスして、その解説も合わせて学習していくことで
知識が体系化され、本番の試験で応用問題にも正答できるようになっていきます。

まとめると、基礎的な知識を体系的に理解することが合格への近道になるかと思います。

# 最後に
ここまでつらつらと持論を展開してきましたが、かくいう私も2回この試験を落としており
あまり人にアドバイスできる立場というわけではありません。
(ちなみに2回落とした理由は単に勉強不足が原因です…)

しかし、この記事が少しでも皆さんのお役に立てれば
不合格になって水の泡となった受験料も成仏することができます。
何卒宜しくお願い致します。
VisualStudio Version 17.3.0 Preview 2.0にアップデートしたらMAUIがエラーは吐くようになった

# MAUIがビルドできなくなった備忘録

VisualStudio Version 17.3.0 Preview 2.0にアップデートしたらMAUIで Maccatalyst ワークロードをインストールしてくださいとのエラーが出てビルド出来なくなりました。

# 対処
workloadをインストールしたらビルドできるようになりました。
そのコマンドは下記の通り

```
dotnet workload install maui
```

早くPreview版ではないバージョンでMAUIが開発できるようになることを祈りつつ。。
Accessでコンボボックスに勝手な値を入力されないように制御

# 概要

こういうコンボボックスがある…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/66fb74b3-2cbc-04d7-cb95-8cbba2f22751.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/12b75003-cd69-ba1d-3a8e-afeb5d6426c6.png)

 ↓ こんなふううに、されないようにしたい。（規定の選択肢以外はダメよ）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/de2e1a72-436e-5b09-3ec0-9e3f769ec3d5.png)


# やり方

まず前提として、コンボボックスには制御するプロパティが無い。

イベントで制御が必要。

## キー入力時

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/3d1aff95-f7a9-c3e6-df57-0c240f789551.png)

```vb
Private Sub cmb_tester_KeyPress(KeyAscii As Integer)
    KeyAscii = 0
End Sub
```

## キークリック時

『キー入力時』だけだと全角入力ができてしまう。
なので『キークリック時』でも制御が必要。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/042f4943-f114-7711-1a33-b6e85ed1afd6.png)

```vb
Private Sub cmb_tester_KeyDown(KeyCode As Integer, Shift As Integer)
    KeyCode = 0
End Sub
```

## 『入力チェック』と『値リストの編集の許可』

こうなるように。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/0dff28b0-1db1-30a8-04cd-7c091f5aa23a.png)

# 参考サイトさん

https://tsware.jp/tips/tips_655.htm

# バージョン

Windows 10 Pro 21H2 OSビルド 19045.2311
Microsoft Access for Microsoft 365 MSO (バージョン 2211 ビルド 16.0.15831.20098) 32 ビット
ノーマルモードでエンターを押すと改行が入るようにしたい

## TL;DR
ノーマルモードでエンターを押すと改行が入るようにする。
```~/.vimrc
"ノーマルモードのままEnterを押して改行を挿入する
nnoremap <CR> A<Return><Esc>^k
```

ちなみに`<CR>`はEnterのこと。素直に左から読んでいけばいい。最後の`^k`はよくわからない。
「Enter押して→Aして→改行挿入→Esc」

## 背景
「o」とか「O」とかで、改行を挿入できるが、その後に挿入モードになるのが気に入らない。挿入モードになって便利ではあるが、「改行だけ」入れたいときは、いちいち「Esc」を押してノーマルモードになるのは面倒。
> 参考 :[Vimの操作 – 改行の挿入・削除方法【デフォルトの改行コードの指定も】](https://howpon.com/21122)



以下の参考を少し自分好みに修正した。
> 参考 : [Vim ノーマルモードでエンターを押すと改行する設定にしたい](https://k-koh.hatenablog.com/entry/2020/11/14/094113)
MariaDB を 10.3 から 10.5 にする

バックアップ取得
```
# mysqldump --all-databases -uroot -p > mysql_all_databases_YYMMDD.sql
```

サービス停止
```
# systemctl stop mariadb
```

現在のプログラムを削除
```
# yum remove mariadb
```
レポジトリファイルの書き換え
```
# vim /etc/yum.repos.d/mariadb.repo
```
  10.3 を 10.5 に編集

```
# MariaDB 10.5 CentOS repository list
# http://downloads.mariadb.org/mariadb/repositories/
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.5/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
```

10.5 の依存パッケージをインストール
```
# yum install socat
```

サーバプログラムのインストール
```
# yum install mariadb mariadb-server
# systemctl enable mariadb
# systemctl start mariadb
# mysql_upgrade -uroot -p --force
```


確認
```
# mariadb --version
```
Python 3のデバッグ環境構築（Visual Studio Code + Windows 10 with Poetry）


# 概要

* 以下のデバッグ環境を構築する。
    * Windows 10 
    * Python
        * Poetry

# 前提条件

* Python 3 インストール済
* Visual Studio Code インストール済
* Visual Studio Code の操作について習熟していること。

# 環境

* Windows 10 21H2
* [Python 3](https://www.python.org/) 3.10.5
    * [Poetry](https://python-poetry.org/) 1.1.14
* [Visual Studio Code](https://azure.microsoft.com/ja-jp/products/visual-studio-code/) 1.69.1
    * [Python](https://marketplace.visualstudio.com/items?itemName=ms-python.python) v2022.10.1
    * [Python Poetry](https://marketplace.visualstudio.com/items?itemName=zeshuaro.vscode-python-poetry) 0.1.3

# 環境構築

## `Poetry`インストール

* コマンドラインで以下を実行。

```PowerShell
pip install poetry
```

## プロジェクト作成及び移動

* コマンドラインで以下を実行。

```PowerShell
poetry new foo-project --src
cd foo-project
```

## Visual Studio Code用設定

### portry設定修正

* デフォルトの設定のままだと`Visual Studio Code`が仮想環境を認識しないため以下の設定を行う。
* 仮想環境をプロジェクト配下へ生成するよう設定。

```PowerShell
poetry config virtualenvs.create true --local
```

### 拡張機能追加

* 必要であれば、`Python`をインストールする
* `Python Poetry`をインストールする

## pytest失敗対応

* `poetry`で作成されたプロジェクトの`pytest`バージョンが5.4.3のため`pytest`に失敗する。
* コマンドラインで以下を実行。

```
poetry add -D pytest@latest
```

* 以下のように表示されれば成功。

```
================================================= test session starts =================================================
platform win32 -- Python 3.10.5, pytest-7.1.2, pluggy-1.0.0
rootdir: D:\vcs\gitlab\foo-project
collected 1 item

tests\test_foo_project.py .                                                                                      [100%]

================================================== 1 passed in 0.02s ==================================================
```

* [Bump python from 3.9-slim->3.10.5-slim, pytest 5.2.2->7.1.2](https://github.com/OrcaCollective/OpenOversight/pull/154)

## 仮想環境へライブラリインストール

* コマンドラインで以下を実行。

```
poetry install
```

## コマンドライン動作確認

* コマンドラインで以下を実行。

```
poetry run pytest
```

## Visual Studio Code動作確認

* Visual Studio Codeを起動

* 以下のようなサンプルプログラムを作成してブレイクポイントを設定する。

![mainpy - foo-project - Visual Studio Code_2022-7-15_13-13-37_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113377/f5856805-8c62-2b9b-f0d8-396045b88c3e.png)
![mainpy - foo-project - Visual Studio Code_2022-7-15_13-13-50_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113377/63febebe-e57f-d1f7-2049-6356740cee89.png)


* `実行`→`デバッグの開始`を行いブレイクポイントで止まることを確認。
![mainpy - foo-project - Visual Studio Code_2022-7-15_13-14-19_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113377/8a5d76a7-9e2e-cc32-4907-c4cbae4ac3f6.png)


お疲れ様でした。

## 感想

* 一昔前は`Visual Studio Code`で`launch.json`を書かないと動かなかったが、今はプラグインと設定のみになったので楽になりましたねー。
* `poetry`使い始めたら、`pyenv`使わなくなりました。プロジェクトごとにバージョン管理できるのでいいですね。
MySQL, MariaDB - JSONデータ型を用いたSQL, DMLの無難な書き方

MySQLでは、SQLやDMLでJSONデータ型を扱う場合に、複数の記法が可能です。
私は、MySQLとMariaDBのいずれでも解釈可能という観点から、JSON_EXTRACTなどのJSON関数を用いるようにしています。
## 理由
JSON関数を用いない記法は、MariaDBでは解釈不可となる場合があります。このため、JSON関数を用いています。
## 実行例
最初はMySQLです。
~~~
hoge@localhost C:\Users\hoge>mysql -u hoge -p
mysql: Unknown OS character set 'cp0'.
mysql: Switching to the default character set 'utf8mb4'.
Enter password: ********
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.29 MySQL Community Server - GPL

Copyright (c) 2000, 2022, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> use hoge
Database changed
mysql> SELECT *
    ->  FROM generalj
    ->  WHERE `json`->'$.devid' = 'hmi'
    ->          AND `json`->'$.production' = '00000001'
    ->          AND `json`->'$.part' = '007'
    ->          AND `json`->'$.machine' = 'AToM'
    ->  AND `json`->'$.command' = 'start'
    ->  ORDER BY timeinsert DESC;
Empty set (0.04 sec)

mysql> SELECT *  
    ->  FROM generalj  
    ->  WHERE JSON_EXTRACT(json, '$.devid') = 'hmi'
    ->          AND JSON_EXTRACT(json, '$.production') = '00000001'
    ->          AND JSON_EXTRACT(json, '$.part') = '007'  
    ->          AND JSON_EXTRACT(json, '$.machine') = 'AToM'
    ->          AND JSON_EXTRACT(json, '$.command') = 'start'  
    ->  ORDER BY timeinsert DESC;
Empty set (0.00 sec) 

mysql>
~~~
いずれも、検索結果がゼロ件ですが合っています。問題ではありません。
次はMariaDBです。
~~~
$ mysql -u hoge -p
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 28867
Server version: 10.5.8-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> use hoge
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
MariaDB [hoge]> SELECT * 
    -> FROM generalj 
    -> WHERE `json`->'$.devid' = 'hmi' 
    -> AND `json`->'$.production' = '00000001' 
    -> AND `json`->'$.part' = '007' 
    -> AND `json`->'$.machine' = 'AToM' 
    -> AND `json`->'$.command' = 'start' 
    -> ORDER BY timeinsert DESC;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '>'$.devid' = 'hmi' 
AND `json`->'$.production' = '00000001' 
AND `json`->'$.p...' at line 3

MariaDB [hoge]> SELECT * 
    -> FROM generalj 
    -> WHERE JSON_EXTRACT(json, '$.devid') = 'hmi' 
    -> AND JSON_EXTRACT(json, '$.production') = '00000001' 
    -> AND JSON_EXTRACT(json, '$.part') = '007' 
    -> AND JSON_EXTRACT(json, '$.machine') = 'AToM' 
    -> AND JSON_EXTRACT(json, '$.command') = 'start' 
    -> ORDER BY timeinsert DESC;
Empty set (0.003 sec)
MariaDB [hoge]>
~~~
MySQLでは通用する「JSON関数を使わない記法」が、MariaDBではエラーとなります。
## 注意
上記実行例は、各DBMSのバージョンに応じて異なるかもしれません。
Linuxサーバー(Debian)にssh接続しようとする間に詰まった「Permission denied (publickey)」の対応

## 背景
さくらのレンタルサーバーで作成した学習用のLinuxサーバー(Debian)に、ローカルのPCからSSH接続をしようとしました。
ある程度の設定ができたつもりでいましたが、接続の際に下記のエラーが出て詰まりました。

```console
Permission denied (publickey)
```

やっと解消できたので、ここに纏めます。

間違い等ありましたら、ご指導の程よろしくお願いいたします。

## 結論
1. ファイルやディレクトリのファイルパーミッションを <font color="red">強い権限にしすぎていた</font>（盲点でした。広げすぎてもダメっぽい。)
2. `.ssh`関連のファイルを、<font color="red">接続したいユーザーではなく</font>rootユーザーのホームディレクトリにおいていた
3. sshd_configに、重複してはいけない記述を重複させていた（RSAAuthentication yes）

これらの問題が同時に起こっており、解決に時間がかかった次第です。
下記に対応した経緯をご説明します。

## それぞれの経緯と解説

### 1. ファイルの権限について
最終的には、この問題に対応して接続できるようになりました。

ssh接続をする際に、`.ssh`ディレクトリや、接続を許可する公開鍵を登録しておくファイルである`authorized_keys`のファイルパーミッションを変更する必要があるのは知っていたのですが、一番権限が強ければ接続できるだろうと思い、学習用のテストサーバーだったこともあり`chmod 777`で設定していました。

どうやらこれがいけなかったらしく、最終的に...
- `.ssh`は700
- `authorized_keys`は600


を設定したところ、無事に接続できました。

■ 参考にさせていただいた記事
[公開鍵でSSH接続できないときに見るところ](http://pixelbeat.jp/ssh-trouble-shooting/)

そもそも777で設定しない、権限の範囲が広ければ包括的に解決できるという思い込みをなくすことを学んで反省しました。

### 2. `.ssh`を接続したいユーザーのホームディレクトリではない場所に作成していた
今回のLinuxサーバーの場合、rootユーザーのホームディレクトリは`~`に該当する場所で、他のユーザーの場所は`/home/ユーザー名`でした。正直これがよくわかっておらず、`.ssh`は1箇所だけにあると誤解しており、rootユーザーで作成していました。

ローカルからログインしたいユーザーにログインユーザーを切り替えて、`.ssh`ディレクトリを作成し、「1. 」の公開鍵や設定ファイルを配置しました。

### 3. サーバー側の設定ファイル「sshd_config」で重複の記述エラー
重複の記述を何かに書くとエラーが起こるという経験はあったのですが、今回引き起こしたエラーの概要は以下になります。

`sshd_config`の

```
RSAAuthentication yes
PubkeyAuthentication yes
```
こちらを両方Yesにして「コメントアウトを解除して」いました。

どうやら`RSAAuthentication yes`を解除する必要はなかったらしく、コメントアウトをしたら解決しました。

こちらはDebian側のログを見た時に`Deprecated option RSAAuthentication`という記載があったので気づきました。

※ Debian側の認証関連のログは、`var/log/auth.log`で確認できます。

■ 参考にさせていただいた記事
[sshd_config に RSAAuthentication no を設定する必要はもうない](https://qiita.com/mogya/items/7f4a765a22e7e881dae5)
[“Deprecated option RSAAuthentication” とメッセージが出たら
](https://dacelo.space/linux/entry-1274.html)

以上、3つの問題を対応したところ接続ができました。
最後に、解決までに行ったことを1つ記載します。

### 解決方法（初知り&オススメです）
エラーに気付いた方法としては、ローカルから下記のコマンドを入力しました。

```console
ssh -vvv 接続したいユーザー名@アドレス 
```
こちらのコマンドを実行すると、進行中のデバッグメッセージが表示されます。
ssh接続が失敗して`Permission denied (publickey)`となった場合に、どこでエラーになっているのかを調べるきっかけになりました。

ぜひやってみてください。どなたかの参考になれば嬉しいです。
エンジニアのペアプログラミングとペアワークについて

## 本記事の目的
筆者は現在プログラミングスクールDIVE_INTO_CODEに通っており
現場で必須なコミュニケーション能力を育む目的で
ペアプログラミングとペア学習の時間が設けられている。

しかし、私個人として

1.現場のペアプログラミングって具体的になぜやっているのか?
2.ペアを組む意義?

という疑問が生じたため調査を実施し整理することにしたため
本記事の執筆に至った。

## 対象読者
1.DIVE_INTO_CODOに通学中、または入校を検討している方
2.エンジニア未経験でエンジニアへの転職を検討している方

## 歴史的背景
### Githubの進化
Githubのプルリクエスト機能が発達した影響で、
細分化したタスク分割で業務可能な状態に進化した反面、
習熟者がコードレビューに追われるという問題が生じてきた。

この問題を抜本的に解決するためにペアプログラミングを取り入れる企業が増えてきている。
※[こちらの企業は基本ペアで業務しているようです](https://hatenanews.com/articles/2021/05/26/103000)

私が理解したところでは、
❌習熟者は管轄作業者のプルリクエストが来たら、レビューする
Lこの形式では、修正がとても多かった

⭕️習熟者はなるべく管轄作業者のオブザーバーとなる
Lとすることで、短期的には修正が減らせ、長期的には作業者の習熟度向上になる

と理解しました。

### エンジニアは自然と実施する
エンジニアであれば詰まった際や技術議論の過程で
自然とペアプログラミング形式で業務することが多々ある。


#### 具体例
・パターンA
一人ではどうもできなくなり、
同僚に相談した際、状況を説明するために相談者はドライバーとなり状況を説明し
同僚は画面をみて一緒に考える(オブザーバーになる)。

・パターンB
新しい技術を試していて実装を同僚と相談する際、
片方がドライバー、片方がオブザーバーとなり議論する。

といった動作が自然に起きる業務である。

## スクールでのペアプロ時に心がけるべきこと
1.最初に実装要件についてコンセンサスを取るレベルまでコミュニケーションを取ること
2.ドライバーは何をやるか宣言してから動作すること
3.ドライバーは悩んだらすぐにオブザーバーに相談し頭を借りること
4.オブザーバーは一挙手一投足見逃さないよう心がけること

## スクールでのペア学習時に心がけること
1.わからなくなったらペアに聞く
2.聞かれた側は一緒に考える
※積極的にペアプロ状況を発生させる

## 最後に
やはり、エンジニアという業界は
学習方法や業務方法どれをとっても時代の先端を進んでいると実感した！


## 参考
>[@morry_48さんの記事](https://qiita.com/morry_48/items/6e395e87860a4f56070f)

上記の参考記事がとても分かりやすかったので是非一読して下さい！
【Xcode】SwiftPlaygroundsのプロジェクトをXcodeで作る

# はじめに
個人的にはiOSアプリ開発の敷居が高いと感じています。
Macを買わないと始められないというのは大きいですが、
それ以外にXcodeの使い方が難しいというのもあると思います。

しかし、iPadOS 15.2からSwiftPlaygroundsでiOSアプリを作成できるようになりました。

https://qiita.com/SNQ-2001/items/000fc93f8f5e5e5c1d5e

実際にiPadでアプリを作成からリリースまでやってみました。
簡略化されすぎてできない事が多いのも事実ですが、
Swiftに始めて触れるという初心者の方にはXcodeという難関がないのでとても良いと思います。

SwiftPlaygroundsでは以下のようなプロジェクトが作成されます。
![スクリーンショット 2022-07-15 12.43.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/4021b4e4-e42e-39e2-483f-d3569b392e05.png)
実はこのプロジェクトはXcodeでも作成が可能です。
Build Settingsをいじらないと修正できないようなエラーが発生しないので初心者には嬉しい限りです。

今回はこのプロジェクトの作成方法を紹介します。

# 方法
「Create a new Xcode project」を選択します。
![スクリーンショット 2022-07-15 12.50.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/803d9625-ee74-6f65-4766-d864760212e6.png)

① 「iOS」を選択します。
② 「Swift Playgrounds App」を選択します。
③ 「Next」を選択します。
![スクリーンショット 2022-07-15 12.52.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/073643a3-ea21-c91b-b96e-989298ae0f95.png)

① 「App Name」を入力します。
② 「Next」を選択します。
![スクリーンショット 2022-07-15 12.56.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/3c72beb8-c5ca-9552-6219-3a8c21a9873d.png)

保存先を決めて「Next」を選択します。
![スクリーンショット 2022-07-15 12.59.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/628b57ae-497f-56f9-62f4-7b5a15b2712f.png)

これでプロジェクトの作成は完了です。
通常のプロジェクトにあるInfo、Build Settins、Build Phasesなど難しそうな項目はありません。
ほぼコードを書くだけでOKです。
アプリアイコンも1枚で全サイズ対応できます。
![スクリーンショット 2022-07-15 13.00.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/d4bdd583-338c-0441-241c-21318d22656b.png)

# おわり
SwiftPlaygroundsのプロジェクトで作成したアプリを途中で通常のプロジェクトに変更はできるのでしょうか？
できそうなら尚良いですね
Flutterで画像表示でクラッシュする時の対応

## こんな時に参考になるかも
- ListViewやColumn、Rowなどで、Imageを複数表示したい。
- 画像表示でシミュレーターが `Lost connection to device` で落ちる
- 実機で画像のある画面をスクロールするとクラッシュする


## 解決に向けて試すこと
1. [ListView](https://api.flutter.dev/flutter/widgets/ListView-class.html) で画面表示部分だけ画像読み込みされるようにする
    - 10件くらい表示すると概ね落ちます。
    - １画面に表示される３件程度にすると概ね表示できます。(SizedBoxなどで事前に高さを確保すること）
    - ColumnやRowは要素を全て生成してしまうので、利用している場合は、ListViewなどに切り替えすると良いです。
1. [flutter_image_compress](https://pub.dev/packages/flutter_image_compress) で縮小して表示
    - ３MB を 100KB 以下までリサイズすると、３０件くらい表示しても耐えられます。

    ```dart
      FlutterImageCompress.compressWithList(data,
        quality: 70, minWidth: 500, minHeight: 500)
    ```

1. [cached_network_image](https://pub.dev/packages/cached_network_image) でキャッシュされるようにする


## 原因

<h3>メモリが足りない。</h3>

スマホで撮影した写真は、とても高画質で 3MB 程度あるのが普通なので、これを大量に表示すると、メモリ利用が急激に上がりクラッシュする。

## 余談

私の作成しているアプリでは、リサイズが一番効果ありました。
スマホで撮った写真をアプリ内表示することは、結構あるケースなので一覧表示する場合は、サイズを調整してから表示することをお勧めします。
AWS環境でGPUサーバーを安く、安全に使うためにやったこと

## 前提

この記事は[Cloud CIRCUS Meetup #1【2022/5/25（水）】 - connpass](https://startialab.connpass.com/event/237357/)に登壇した際のスライドを転記したものになります。


## 本記事の目的
GPUを使ってサービスを運用する場合、費用的に都合が合わないことが多いです。
もし予算に余裕があるとしてもコスト削減は価格競争力にも繋がるので参考になるかと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2698674/f338dbb8-62dc-2e33-16a4-853b3935604f.png)
そこで性能を担保しつつ(安全に)、サーバー費用を下げる(安く)に弊社で実施した対策についてご紹介します。

## MOSYA
理解を促すための事例ですが、弊社の3Dモデル作成サービスである「MOSYA」を提供しています。
リクエストごとにGPU処理が行われるので、リクエストに比例して費用が増加してしまいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2698674/193a3d62-2b27-303c-947f-255cec8a488b.png)


## 安く
### 1. 必要なサーバースペックを確認
当たり前のことではありますが、処理にフィットしたサーバースペックを選びましょう。
費用に対して実際処理パフォーマンスが改善されるのか確認するのがポイントです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2698674/3eb2a790-e257-bd9e-0866-9363eca607bd.png)

### 2. 安いインスタンスを使う
SPOTインスタンスを使えば非常に安い料金でインスタンスが使用できます。
( AWS G3シリーズは大体70%安い )
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2698674/b160ece6-5e02-3da8-d3d7-4b0acc1441d8.png)
SPOTインスタンスはクラウド上未使用状態のインスタンスを使用する仕組みになりまして、
リージョン内のインスタンス使用量増える場合、インスタンスが終了される可能性があるので終了に対するシステムの対策が必要になります。

### 3. GPUが必要なタスクを分ける
GPUで処理を行う場合でも一部CPUを使って処理できるところもあるかと思います。(データの準備など)
CPUで処理が可能な部分はCPUで処理をするようにしましょう。

効果として以下が期待できます。
1. GPUの処理量が減る
2. CPU処理の間GPUのウォーミングアップができる(エラーがある場合はGPUを立ち上げないこともできる)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2698674/5774564c-f253-782d-ea75-ae41bd1794ba.png)

実装方法としてはQueueを使用しCPUとGPUの処理を分けることが理想かと思います。
弊社ではタスクを連続的に処理するために状態管理方を採用しております。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2698674/64ab3605-6864-9771-551c-3c59948860bf.png)

## 安全に
### 1.予測されない処理の停止に対応
GPU処理は一般的な処理に比べ処理量や処理時間が長く、再実行コストが高めになります。
なので再実行時でも処理を途中から継続できるようにし、手戻りを少なくする必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2698674/31bb0d13-f3ae-f210-4099-ad073f043aaf.png)

### 2.インスタンスプールを確保する
SPOTインスタンスにより、インスタンスが使用できない場合、
他のタイプを代わりに使ってサーバー数を維持することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2698674/05283917-5ca8-6ebc-8d4b-36a551055de2.png)
もし特定インスタンスを常時起動させる必要があったり、少しでもサーバーの不在状態を作りたくないのであれば一部のインスタンスはOnDemandを使うこともいいと思います。



### 3.問題がないかモンタリングする
インフラからアプリケーションまで問題が散財しているので、問題の監視対策と改善が必要になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2698674/d824392f-ee4b-2999-22d2-1780059d0131.png)


## まとめ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2698674/41946b22-2eca-2d81-6fa8-4f8f0465ab57.png)


## 最後に
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2698674/057e00c1-59b6-2c60-a5e5-8f3a5e236388.png)
GeoPandasのインストールとSpyderの設定

"Pythonでシェープファイルを扱えるGeopandasをインストールできたハズなのに、モジュールが見つからないと言われる…どうすれば使えるの?!"

…というPython初心者がエディタのSpyderで動かせるところまでたどり着いたので、記事を書きました。なお本記事は2022/07/15時点の情報ですのでご留意ください。

同様の記事がたくさんありますので、もしほかの記事でダメだった方や、インストールできたけど起動できないよという方の参考になれば幸いです。

## GeoPandasのインストールでぶつかったトラブル
1. コマンドプロンプトの「pip install」では関連ライブラリが見つからないのでインストールできないと言われる
1. miniconda3経由でも既存の環境で競合するらしくインストールできない
1. インストール先とSpyderの仮想環境がリンクしていないらしく「そのようなモジュールが見つかりません」と言われる

## インストールに必要だったこと
+ conda-forge channnelにインストール方法を統一する！
+ 仮想環境を新規で作る！
+ 仮想環境にチャンネルを追加する設定をする！
+ 仮想環境にSpyderを新しくインストールする！

# インストール手順
公式サイトに掲載されていた「conda-forge channnelを使ってインストールする方法」を使いました。
【GeoPandas公式サイト インストール手順】
https://geopandas.org/en/stable/getting_started/install.html


1. miniconda3をインストールします
1. miniconda3（Anaconda Prompt）を立ち上げて（コマンドプロンプトの様な画面が立ち上がります）、以下のコマンドを入力します。
`conda install --channel conda-forge geopandas`
1. 新しい仮想環境を作成し、そこにGeoPandasをインストールします。以下のコマンドをminiconda3(Anaconda Prompt）に1行ずつ入力していきます。例では仮想環境名が「geo_env」となっていますが、任意の名前に設定可能です。
`conda create -n geo_env` # 仮想環境"geo_env"を作る
`conda activate geo_env` # 仮想環境を起動する
`conda config --env --add channels conda-forge`
`conda config --env --set channel_priority strict`
`conda install python=3 geopandas`
これで仮想環境にGeoPandasがインストールされました。
1. 続いて仮想環境にエディタのSpyderをインストールします。さきほど開いていたminiconda3（Anaconda Prompt）に次の1行を入力します。
`conda install spyder`
【注意】もし、miniconda3（Anaconda Prompt）を閉じてしまっていたら、もう一度起動して、<b>仮想環境を立ち上げてから</b> Spyderをインストールします。仮想環境の起動には`conda activate geo_env`を入力します。※仮想環境の名前は「geo_env」ではなく先ほど作成した任意のものを入れます。

1. インストールが完了したら、miniconda3（Anaconda Prompt）に`spyder`と入力し、Spyderを立ち上げます。
1. これでGeoPandasが使えるSpyderが設定・起動できました。

# 謝辞
Spyderの仮想環境へのインストールはこちらの記事を参考にさせていただきました。ありがとうございました！
<b>超初心者向けPython入門講座</b>
https://work-life-enj.com/spyder-virtual-environment/
PostgreSQLの基本中の基本コマンド

# はじめに
日常、よく使うpostgreSQLのコマンドをメモしました。
下記のコマンドをわかれば、一応仕事ができると思います。

# postsqlの基本コマンド

## ログイン/ログアウト
ログイン

```
$ psql -U ユーザ
```


ログアウト

```
# ¥q
```

## データベース操作
データベース一覧を表示

```
# ¥l
```

データベースを新規作成

```
# create database 新規データベース名;
```
データベースを削除

```
# drop database データベース名;
```
データベースに操作

```
# ¥c データベース名;
```

## テーブル操作
テーブル一覧を表示
```
# ¥dt
```

テーブルを作成
```
# create table 新規テーブル名;
```
テーブルを削除
```
# drop table テーブル名;
```

## データ操作
データを新規追加
```
# INSERT INTO テーブル名(列名1, 列名2)　VALUES （　値１, 値2）;
```
データを削除
```
# DELETE FROM テーブル名 WHERE 条件；
```
データを編集
```
# UPDATE テーブル名　SET 列名=値　WHERE 条件；
```
データを検索
```
# SELECT * FROM テーブル名　WHERE 条件；
or
# SELECT 列名　FROM テーブル名　WHERE 条件；
```

# dumpについて

## dump取得
```
$ pg_dump -U ユーザー名　-d データベース名　> ダンプ名.dump
```

## dump導入
```
$ psql -U ユーザー名 -d データベース名 < ダンプ名.dump
```
ASP.NET Core 3.1以降で無効化されたRazorランタイムコンパイルを有効にする

ASP.NET Core 3.1以降では、Razor（つまりcshtml）のランタイムコンパイル機能が無効となっている。
これまではcshtmlをちょっと変えただけの場合、サイト全体を再発行せずとも該当のcshtmlだけを発行すれば動いたのだが、今はエラーになってしまう。

これは正直面倒だが、Startup.csでservices.AddRazorRuntimeCompilation() を呼び出すと有効化される、とのことだった。

```C#:Startup.cs
	services
	    .AddControllersWithViews()
	    .AddRazorRuntimeCompilation()
	;
```

しかし、上記だけでは有効にならない。

というか、有効になっているようだが、実行時に「cshtmlで参照しているモデルクラスへの参照が見つからない」という趣旨のエラーが出ている模様。
cshtmlをroslynがリアルタイムコンパイルしようとして、依存DLLが見つからずに失敗する、という状況のようだ。

いろいろ調べてみたが、ASP.NET Coreのバージョンによっていろいろと違いがあるようで、何が有効で何が有効でないかよくわからない。
なので、最終的に動作した設定をここに書き留めておく。

行ったのは、.csproj または pubxml に以下の設定を加えることである。
TargetFrameworkはnet5.0となっている。

```xml:.csproj又は.pubxml
<PropertyGroup>
    <RazorCompileOnBuild>false</RazorCompileOnBuild>
    <RazorCompileOnPublish>false</RazorCompileOnPublish>
    <MvcRazorExcludeRefAssembliesFromPublish>false</MvcRazorExcludeRefAssembliesFromPublish>
    <CopyRefAssembliesToPublishDirectory>true</CopyRefAssembliesToPublishDirectory>
	<CopyRazorGenerateFilesToPublishDirectory>true</CopyRazorGenerateFilesToPublishDirectory>
    <EnableDefaultRazorGenerateItems>true</EnableDefaultRazorGenerateItems>
	<EnableDefaultRazorComponentItems>true</EnableDefaultRazorComponentItems>
</PropertyGroup>
```

恐らく一部は古い設定で現在は無効となっている可能性がある。
よくわからない状態で放置するのは好きではないのだが、あまり時間をかけてもいられないので一旦これにて。

尚、Razorランタイムコンパイル機能が規定で無効化されたのは処理速度改善の一環のようなので、本番環境に適用する際にはメリット・デメリットを考えてよく検討されたい。

これは愚痴になるが、ASP.NET Core はただでさえASP.NET無印の頃の情報と混在してわけがわからないのに、ASP.NET Core自体も1.0/2.0/3.0/3.1/5.0/6.0の情報が混在してカオス化している。Microsoftも手を焼いているものと思われるが、ASP.NET Coreはとても使いやすくて便利なフレームワークと思うので、バージョン毎のドキュメントの分離をお願いしたい。やっと見つけた情報が、よく見たら古いバージョンだったり新しすぎるバージョンだったりした時の徒労感はもう味わいたくない。

# 追記 2023/3：この話をChatGPT-4に聞いてみた結果

Razorランタイムコンパイルを有効にするために、以下のpubxml設定を行ってください。

```xml:ビルド時にRazorビューのコンパイルを無効にします
<RazorCompileOnBuild>false</RazorCompileOnBuild>
```

```xml:パブリッシュ時にRazorビューのコンパイルを無効にします
<RazorCompileOnPublish>false</RazorCompileOnPublish>
```

```xml:パブリッシュ時にRazorビューを発行ディレクトリにコピーします(ASP.NET Core MVC 3.x以降で使用)
<CopyRazorGenerateFilesToPublishDirectory>true</CopyRazorGenerateFilesToPublishDirectory>
```

```xml:参照アセンブリを発行ディレクトリに含める(ASP.NET Core MVC 3.x 以降の場合)
<CopyRefAssembliesToPublishDirectory>true</CopyRefAssembliesToPublishDirectory>
```

```xml:参照アセンブリを発行ディレクトリに含める(ASP.NET Core MVC 2.x の場合)
<MvcRazorExcludeRefAssembliesFromPublish>false</MvcRazorExcludeRefAssembliesFromPublish>
```

これらの設定を行うことで、Razorランタイムコンパイルが有効になります。ただし、ランタイムコンパイルを有効にすると、パフォーマンスに影響があることに注意してください。通常、開発環境でのみランタイムコンパイルを使用し、本番環境ではビューを事前にコンパイルすることが推奨されます。
Classが理解できない、難しい人のために

## この記事を書いた理由
私はエンジニアの学習を始め、一通り文法を勉強しましたが
Classの意味が本当にわからなかったです。
わからない原因をずーっと考えていましたが、自分なりの答えにやっと辿り着きました。
それは『Classの概念がなぜ必要かわからない』というところでした。
## 覚えておいた方が良い前提条件
Classの説明に関してはあらゆるところで見ると思います。
よく見るのが
Classとはモノの設計書です。
Classとは概念です。
Classはインスタンスを生成してから使います、、
そしてこんな設計図をみます、、
![スクリーンショット 2022-07-15 11.25.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/714631/a74d3795-ce77-41f6-5134-865cafda26bb.png)

こんなこと書かれてあーなるほどね。そう理解する人はごく少数だと思います

そこで、知っておくべきこととして大事なことですが
＊アプリケーションは何百ものソースコードの集合体で出来ている
＊簡単なアプリケーションでも約３万文字はくだらない、、、

## 無限にあるソースコードの中にvar name = '坂本';と書くじさつ行為

そんな膨大なソースコードの中に
var name = '坂本'とかいたらどうなるでしょうか？
→nameという変数が以前に使われているのかどうかもわからない
→nameという変数が抽象的すぎてわからない
## 以前使ったかどうか、変数、関数が何を表しているかどうかわからない
ということになります。

そこで
『GIANTSの坂本』といえば、あー坂本勇人か！（野球ネタですみません）とわかるはずです。
＊2022年現在、坂本勇人選手はGIANTSに二人いますw
ところが変数名を
var giantsKeyplayerName = '坂本';
とかにすると、今度は

あれ？前回どんな変数名を付けたんだっけ、、？という現象になります

なので例えば
各チームの中に、キープレイヤーがいるとしたら
keyplayerというクラスの中に
＊giants
＊tigers
＊swallows
＊carp
＊baystars
＊dragons
というクラスを作っておくと
var giantsKeyplayerName = '坂本';
みたいな野暮ったい変数を毎回使わず
keyplayer.giants = '坂本';というスッキリした書き方にできる訳です
＊＊細かい書き方はそのうち書き足します。
## まとめ
まとめると、『ソースコードが多くなればなるほど、整理整頓をしないと、開発者がわからなくなるよ！
（ましてやチーム開発でこれをやられると嫌われますw）

ここに書いてあるのはあくまでClassのごく一部の事しか書いておりません。
なのでとっかかりだけ書きました。
＊ちなみにベイスターズファンです、、
ビット操作とマスクパターン

# ビット操作とマスクパターン
論理演算を用いると、このようなビット操作も簡単に行うことが出来るのです。

## 気づき
2の補数をどうやって表現するのか？
反転させて１を足す。
NOT回路とOR回路を思い浮かぶ。

## ビットを反転させる。
排他的論理和(EOR,XOR)を用いる。
２つの入力が等しい場合は0を、異なっている場合は1を出力
これを用いる。
反転させたいビット列の```反転させたい位置に1を入れたビット列```(```マスクパターン```)を作る。
１を入れたビット列と反転させたいビット列を```足す```
するとビット列を反転させることができる。

## 例
```00000011```のビット列を反転させたい。
EOR/XORを意識してマスクパターンを作成。
```11111111```になる。
両者を足すと```11111100```になる。

## 特定のビットを取り出す
ビットを取り出すには論理積(AND)を用いる。
ビットマスクをを作成させる。

### 例
```01101011```から後ろ４ビットを取り出す。
その際に後ろ４ビットが残るようにAND回路を意識してマスクパターンを作成させる。
そうして```00001111```になる。
両者を足すと```00001011```になる。

### 気づき
特定のビットを取りだせて何がいいのだろうか？
半加算器と全加算器

加算器には、下位からの桁上がりを考慮しない半加算器と、それも考慮する全加算器とがある。

## 気づき
２進数の計算処理を行う仕組みに触れるのか。
なんか今までの２進数の計算は違ったのか。また足し算、引き算、掛け算、割り算を学んできたが...。
とりあえず勉強してみよう。

# 半加算器は、どんな理屈でできているのか？
入力ABと出力SCがある。
出力SCの役割はSは１桁目Cは２桁目（桁上がり）を表す。
仮に入力Aが１Bが０の場合、　Sは１、Cは０を表す。
1 + 0 = 1
どちらも1の入力の場合はSは０、Cは１を表す。
1 + 1 = 10

# 全加算器は、どんな理屈でできている？
繰り上がってくる可能性に対応している。
なので入力出力は2対２で後から繰り上がり分が足されるためにもう一度半加算器を使う。
一つの桁で繰り上がりは2度同時に起きないためにOR回路にして完成。

1+1=10（半加算器）になる。しかし　繰り上がり分１（もう一つの入力）がSと足されて１(0+1の半加算器)になる。一つ目のCと２つ目のCが足されてもう2度繰り上がるのは困るのでORで一度だけにする。

## 気づき
半加算器と全加算器の構造がわかった。
説明は下手だけど。
より上手く書けるように頑張ろう。
RESTful APIをドラえもんを使って解説してみた

# はじめに
初心者向けです。
RESTfulAPIについてざっくりした大枠の理解をする為の記事です。
プログラムの詳細な書き方などは記載しません　各プログラムにおける詳細な書き方はググりましょう。
初心者が備忘録として書いています。
間違っていたらご指摘いただけるとありがたいです。

## RESTful APIとは　
結論から先に書くとJavaやPython、Htmlなどの色々な異なる言語間で情報のやりとりをできるようにするための仕組みです。

誤解を恐れずあえて一言で書くとRESTful APIとは　どちらも食べる必要のある**翻訳こんにゃくです**

どういう事でしょうか？
以下AWSからの引用です(https://aws.amazon.com/jp/what-is/restful-api/#:~:text=RESTful%20API%20%E3%81%AF%E3%80%812%20%E3%81%A4%E3%81%AE,%E9%80%9A%E4%BF%A1%E3%81%99%E3%82%8B%E5%BF%85%E8%A6%81%E3%81%8C%E3%81%82%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82)
>RESTful API は、2 つのコンピュータシステムがインターネットを介して安全に情報を交換するために使用するインターフェイスです。

なるほどわかりそうでわからん😊

ドラえもんを使ってもう少し具体化して考えてみましょう。
今回RESTfulAPIの説明の為にドラえもんにはタイムマシンで原始時代に行ってもらいます。

登場人物はとりあえず二人です。
一人は**Javaを話すドラえもん**です。
もう一人は**Pythonを話す原始人**です。

JavaではPythonのコードが送られて来てもエラーになるしPythonはJavaのコードが送られてきてもエラーになります。
![説明1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609727/2b28f024-b753-ba62-0ce1-2fdbd2ecfc3e.jpeg)

ドラえもんも原始人も
『**ちょっと何言ってるのか分かんないっす**』となりますね。

そこで登場するのが**翻訳こんにゃく**(**RESTful API**)です。
原作だと翻訳こんにゃくを食べるとお互いの話す言葉が分かるようになりますね。細かい話ですが、ここで言う翻訳こんにゃくはお互いが持っていないとダメって点が違います

RESTful APIでも同じです。

ドラえもんが話すJavaや原始人が話すPythonから送られてくる情報をRESTを使って翻訳して（例えば、JSON形式に変換して）会話をできるようにします。
![説明2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609727/aa6982ad-7a56-eea5-ec5a-28ce6d42a7d0.jpeg)

## RESTについて
先程の説明の終わりにRESTを使って翻訳するといいました。
ではRESTとは何でしょうか？
RESTは以下の4つの原則を有する設計思想の事です。
<ul>
<li> 統一インターフェース
<li>アドレス可能性
<li>接続性
<li>ステートレス性
</ul>
なるほどわからんって事で説明していきます

### 統一インターフェース
統一インターフェースとは簡単に言うと通信のやりとりにHTTP通信を使ってJSON形式でデータのやり取りをしましょうねって事です。
先程のドラえもんと原始人の会話はJSON形式に一旦変換されて行われる事になります。

### アドレス可能性
ここは悔しいのですが、ドラえもんと原始人の例からは離れ、PC、サーバー間でのやり取りだと考えます。世界中にあるPCとサーバーのどこにアクセスしたらいいかわからないですよね？
そのためにアドレス(URI)をデータにくっつける事でデータを送ったりもらったりできるようにする必要があるのです。

### 接続性
接続性とは　情報の内部に別の情報のリンクを含める事ができる事を言う。
先程のドラえもんの例だと道を聞いたあとさっきの**あの道の話**やねんけどなって続けれるようにできるって事ですね😊

### ステートレス性
ステートレスとは一回のやり取り完結で行われる。
先程のドラえもんと原始人のやり取りだと道の話を終えた後に**別の話をするとき**,
一回の会話（セッション）で終わりなので、ドラえもんは道をまた聞かないし、原始人は道順をまた返さないって事ですね😊（もう一回教えてって言えば別ですが）

つまりRESTって情報伝達するときの決まりごとはこうですよねってまとめてるだけの事だったんだ！！

## おまけ
APIとは　RESTful APIとREST APIって違う？

#### APIとは
これは名前の通りなのですがApplication Programming Interface　つまりアプリ同士をつなぐものって意味ですね
アプリ連携って言ったほうがわかりやすいですね。
RESTful APIとかのWEBを使ったAPI　とか　PC内部のソフトウェア間での連携も含まれる言い方です。

#### RESTful APIと　REST APIって違う？
違いはないです。

## 一言でまとめ
<ul>
<li>RESTful API は　アプリ間の情報伝達を簡単にしてくれるもの
<li>RESTは　情報伝達の決まり事を決めるもの
</ul>
AWSマネジメントコンソールからS3バケットを作成してみる

# 前提・注意事項
バケット作成に必要な設定内容は、要件に応じて適宜検討・設定する必要があります。本記事はあくまでの参考情報としてとらえてください。
# 手順
- S3を選択して「バケットを作成」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367069/82b7ea50-f8ac-a96d-2744-d324f1aaea0a.png)
- バケット名、リージョンを選択
オブジェクト単位でアクセスを指定することができるアクセスコントロールリスト(ACL)は無効のまま
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367069/a18ea4f3-a08c-36e2-6a7d-9e852d94541f.png)
- パブリックアクセス設定はデフォルト(非公開)のまま
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367069/7ebca62e-93b9-903d-dd86-3f4441e50466.png)
- バージ二ング設定はデフォルト(無効にする)のまま
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367069/8ea57499-84f2-7e24-b868-adace78ab9e2.png)
- 暗号化は有効にして、SSE-S3を選択
オブジェクトロックは無効のままにしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367069/1bf06325-b838-b35e-5a10-2177f78cdc2b.png)
- 「バケットを作成」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367069/cd0b215f-b6c5-5e34-00a7-718e49eda556.png)
- 確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367069/465f31ae-83c9-8df4-4d31-bca40f0c79f7.png)
不要なファイルがgitの管理下に置かれていたので削除した。

## 前提
新しいプロジェクトに参加した際に管理する必要のないファイルがgitの管理下に置かれていたので削除した。

## gitignoreを作成

今後の変更がgitに監視されないようにgitignoreに管理下から外したいファイルを記述します。

これで次回以降の変更が監視されなくなります。

gitignoreの作成には次のサイトが便利。

[gitignore.io](https://www.toptal.com/developers/gitignore)

## 履歴を削除する

これまでの履歴も必要がないので削除します。

```
git rm --cached [ファイル名]
```


## 参考文献

https://zenn.dev/wtkn25/articles/django-gitignore

https://qiita.com/megu_ma/items/a438a71c84145f14d04e