OmniAICreator/Qiita-1.07M huggingface dataset:
Specification of Raw Data Stream, AUTOSAR 1098, R23-11, AP

Specification of Raw Data Stream, AUTOSAR 1098, R23-11, AP
https://www.autosar.org/fileadmin/standards/R23-11/AP/AUTOSAR_AP_SWS_RawDataStream.pdf


<この項は書きかけです。順次追記します。>
This article is not completed. I will add some words in order.

# Release Overviews
Classic Platform Release Overview, AUTOSAR No.0 ,R23-11, CP
https://qiita.com/kaizen_nagoya/items/8468435185e109189ead

Foundation Release Overview, AUTOSAR 781, R23-11, FO
https://qiita.com/kaizen_nagoya/items/f249bdb8c313d8bff883

Adaptive Platform Release Overview, AUTOSAR 782, R23-11, AP
https://qiita.com/kaizen_nagoya/items/13a104606a34fe24fcf7
# Terms
|terms(Acronyms and abbreviations)| Description|
|:--|:--|
IP|Internet Protocol
SOME/IP|Scalable service-Oriented MiddlewarE over IP
TCP|Transmission Control Protocol
UDP|User Datagram Protocol
E2E|End-to-end communication protection
TLS|Transport Layer Security
DTLS|Datagram Transport Layer Security


# Reference
[1] Glossary AUTOSAR_FO_TR_Glossary
https://www.autosar.org/fileadmin/standards/R23-11/FO/AUTOSAR_FO_TR_Glossary.pdf
[2] General Requirements specific to Adaptive Platform https://www.autosar.org/fileadmin/standards/R23-11/AP/AUTOSAR_AP_RS_General
[3] Requirements on Communication Management https://www.autosar.org/fileadmin/standards/R23-11/AP/AUTOSAR_AP_RS_CommunicationManagement
[4] Explanation of Adaptive Platform Software Architecture https://www.autosar.org/fileadmin/standards/R23-11/AP/AUTOSAR_AP_EXP_SWArchitecture
[5] Specification of Manifest https://www.autosar.org/fileadmin/standards/R23-11/AP/AUTOSAR_AP_TPS_ManifestSpecification
[6] Specification of Communication Management https://www.autosar.org/fileadmin/standards/R23-11/AP/AUTOSAR_AP_SWS_CommunicationManagement

# 補足資料（Additions）

2023 Countdown Calendar 主催・参加一覧
https://qiita.com/kaizen_nagoya/items/c4c2f08ac97f38d08543

CountDownCalendar月間　いいねをいただいた記事群　views　順
https://qiita.com/kaizen_nagoya/items/583c5cbc225dac23398a

＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞
This article is an individual impression based on the individual's experience. It has nothing to do with the organization or business to which I currently belong.

# 文書履歴(document history)
ver. 0.01 初稿 　20231218
### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
#### Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
【Python】jsonモジュールでエンコード・デコードするときの注意点２つ

# 概要
Pythonの`json.dumps()`と`json.loads()`について、注意点を2点整理してみました。
以下のコードをサンプルとして進めます。

```py
import json

#1
data = {}
data['sample_id'] = 'test'
sample_id = json.dumps(data['sample_id'])
print(data)
print(sample_id)

#2
data = {}
data['sample_id'] = 'test'
sample_id = data['sample_id']
print(data)
print(sample_id)
```

こちらを実行すると結果は以下の通り。

```
{'sample_id': 'test'}
"test"
{'sample_id': 'test'}
test
```

あれ、`#1`では`"test"`というようにダブルクオーテーションで囲まれているのに対して、`#2`では`test`というようにダブルクオーテーションがありません。

テストコードを書いているときに、プログラム側となぜか結果が異なるなぁ...と思っていたら理由は`json.dumps`にありました。

##  注意点1:JSON形式にエンコードしているかどうかで変わる

`#1`では、JSON形式の文字列に変換（=エンコード）しているのでダブルクォーテーションで囲まれた文字列が出力されます。（これはデフォルトの挙動。なぜ？というと...JSONの仕様がJavaScriptのオブジェクト表記を採用しているからでしょう）

一方、`#２`では、単純に文字列を別の変数にコピーしているので、ダブルクォーテーションは付与されません。

### `json.loads()`でデコードするときに影響が出る
これがどんな点に影響が出るのか？というと、`json.loads()`を使ってPythonのデータ構造に変換するとき、つまり辞書型に戻す(=デコード）するときです。

`json.loads()`は、渡された文字列が JSON 形式でない場合にエラーが出るので、たとえば以下のコードで実行すると`#2`の一番最後の`print`文でエラーになります。

```py
import json

#1
data = {}
data["sample_id"] = "test"
sample_id = json.dumps(data["sample_id"])
print(data) 
print(sample_id) 

test = json.loads(sample_id)
print(test) 

#2
data = {}
data["sample_id"] = "test"
sample_id = data["sample_id"]
print(data) 
print(sample_id) 

test = json.loads(sample_id)
print(test) 
```

実行結果は以下の通り。

```
{'sample_id': 'test'}
"test"
test
{'sample_id': 'test'}
test
Traceback (most recent call last):
 ##略##
    raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
```

上述の通り、`json.dumps`を使っていない場合は単なる文字列なので、`JSONDecodeError`になります。
文字通り、デコードに失敗したエラー、ということがわかりますね。

`data`は結果も型も同じように出力されますが、エンコード・デコードの処理が入るのでJSON形式であるかどうかが大事になります。テストコードとか書くときなどは`print`結果だけ見ていると要注意だなと思いました。

## 注意点2：Noneとnull

最後に、エンコード・デコード時の`None`と`null`について。
以下のコードを叩いてみます。

```py
import json


dict_data = {"samples": {"key1": "value1", "key2": "value2", "key3": None}}

json_data = json.dumps(dict_data)
print(json_data)

dict_data = json.loads(json_data)
print(dict_data)
```

結果は以下。

```
{"samples": {"key1": "value1", "key2": "value2", "key3": null}}
{'samples': {'key1': 'value1', 'key2': 'value2', 'key3': None}}
```

`json.dumps()`関数は、JSON形式の文字列に変換するとき、Pythonの`None`値はJSONの`null`としてシリアライズされます。逆に、`json.loads()`関数は、Pythonオブジェクトに戻すとき、Pythonの`None`に変換されます。
ここもPythonでjsonを扱う際には要注意ポイントですね。
【備忘録】jupyterにvenv追加しようとしても切り替わらなくてハマった話

# TL;DR

~~~
cd /home/user/work_dir/
python3 -m venv venv_name
...etc...
docker run -d -v `pwd`:/WORK_DIR…
docker exec -it xxxx bash
~~~

していたのが原因

~~~
python3 -m venv venv_name
source venv_name/bin/activate
# 参照が書き換わっているかちゃんと確認
which python3
pip install ipython
ipython kernel install --user --name=venv_name  --display-name=foobar_name

~~~


kernelがきりかわらんっ！！って1時間ぐらい無駄にしました。
二度と同じバカをしないように…

## 原因


nvidia-docker 上にローカルフォルダをマウントし、jupyter入れて開発していた。

コンテナの外でvenv作ってコンテナ内で使っていたから。同じファイル・フォルダを示すパスが違う。

    　/home/user/work_dir/venv_name # 作ったとき
     /WORK/venv_name/               # venvに入りたかった時

activate時、＄PATHに入るべきパスが適切ではなく、その環境のpythonを見つけられていなかった。

 蛇：　スクリプトがベタで書いてある
~~~
$ cat venv/bin/activate
# This file must be used with "source bin/activate" *from bash*
# you cannot run it directly

deactivate () {
    # reset old environment variables
...etc...
VIRTUAL_ENV="/home/user/work_dir/venv_name"
...
~~~
稼働時間7時間かつ残業なしでインボイスの案件を含めて20ロボットを1か月で対応した。

## 1,はじめに
下記の企画に参加しています！

https://t.co/56WibbNlvz

本日は表題の通りに **「稼働時間7時間かつ残業なしでインボイスの案件を含めて20ロボットを1か月で対応した。」** です。

## 2,前提
本番稼働(テスト用端末)、自己の端末の2台、ディスプレイ2台を使用して、対応しました。
最大4画面で最低3画面で改修対応していました。

## 3,改修を早く行うコツ
:::note info
ログを入れて、Orchestratorで出力されたログからエラーで検討を付ける。
:::
どこでコケているのかを理解するために、全ロボットに一定の基準でロボットに入れる。
ログの入れ方(市民開発者向け)のコツは後日記事にします。

:::note 
優先度、テスト難易度、ロボット修正難易度を整理する。
:::
各ロボットに対して優先度(**高、低**)があるため、現場の方に確認をしながら改修順位をつけていました。
テスト難易度はテストに時間がかかりそうなものを**低**とそうでないものは**高**で分けました。
ロボット修正難易度は修正時間がかかりそうなものは**低**とそうでないものは**高**で分けました。
これら3つの優先度、テスト難易度、ロボット修正難易度で**高**に該当するものから対応していきました。

:::note alert
特にテストに時間がかかりそうなものは、テストケースに漏れがないかや仕様の確認でユーザーとMTGをする必要があります。
:::

:::note info
効率よく改修を行う。
:::
規模が大きい場合は、テストした部分だけ切り出して、テスト用xamlを作成して単体を行う。
また気になる箇所やテストしたいときだけ入れているアクティビティには「＊」をアクティビティ名に追加する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327229/176ae6fc-3df0-a55e-bf0a-184b142afa4e.png)

これらを行うことで時間短縮と不要なアクティビティの消し忘れミスを防ぐことができます。

:::note info
テストするときは「デバック」ではなく「実行」で行う。
:::
本番稼働はテストのみを行い、その裏で自己端末でロボットの修正を行う。
テストして得たい結果を得ることができたか？を覚えながら、自己端末で修正していました。
1ヵ月間これをして頭がパンクしそうで、甘いものを食べたり、ランニングしたりしないと体調管理が難しかったです。
当時にこれがあったらどれだけらくだったかと思いました。

https://qiita.com/thxUVER2012/items/589081656d474dda5e54

:::note info
改修後に改修内容の履歴を残す。
:::

これに工数をかけるのは勿体ないかもしれないですが、私はこれをすることによって、今回の事象をインプットができ、困ったときに辞典の役割をしてくれるため、工数がかかってもまとめています。
まとめるポイントとしては下記です。

:::note warn
(1)Orchestratorで出力されたログをエラーの前後がわかるようにスクショ
(2)ロボの改修前後をスクショ
(3)次の案があるときはそれを書き残す。
:::

これをすることによって、辞典のように使用し、問題の切り分けで過去に試したことは何か確認もできてよかったです。

:::note info
ロボの品質はどうあれ、開発を仕上げること
:::

ここからインボイス対応の話になります。
インボイスの対応を始めたのが初期稼働の2週間前で、場合分けによって計算処理が異なり、この計算処理を4ロボットでも適応できる共通部品の作成、さらに他のロボットの改修もあだあるため、明らかに時間が足りないと判断しました。
そこで、下記のように方針を立てました。

:::note warn
(1)場合分けによる計算処理をExcel関数で処理させる。
(2)現場では引数を使うことは禁止されていて、市民開発者が多いこともあり、共通部品化は簡単な形式で作成する。
:::
引数を使用できないのが辛く、ロボットによってアウトプット数が異なるため、その点の制御も大変でした。

さらにデータテーブルを範囲に書き込みにすると、たとえ空白でもExcel関数の上に空白で書き込んでしまい、Excel関数が消えてしまう事象が発生しました。

これはExcel関数がある列を除き、Excel関数が複数あったのでその分シートを用意しました。
書き込む手順は下記で解決しました。

:::note warn
例えば、A～H列があり、D列、G列にExcel関数があるとします。
(1)A～CまでをD列にExcel関数があるSheet1に書き込む
(2)A～C列をデータテーブル1にする。
(3)データテーブル1とE列をF列にExcel関数があるSheet2に書き込む
(4)Sheet2をデータテーブル2にする。
(5)データテーブル2とH列をアウトプットとなるSheet3に書き込む
:::

これでできたと思いきや、、、。
アウトプットはcsvなので、Excelではいけないです。
なので、Excel→csvに変換作業もありました。

:::note warn
これはF12キーで名前を付けて保存機能があったので、それで対応しました。
:::

これで完成し、約一週も早く仕上げることができ、初期稼働も問題なく正常終了しました。
この結果、現場から高く評価をいただくことができました。

## 4.おわりに
振り返ってみると柔軟に開発するスキルと保守運用スキルがついたと思いました！
この大変さがあったので、現在は外的要因でしかエラーが起きないです。
これを解消するのが次のタスクとなります。
我流アヒージョの作り方🦐

アヒージョとは:オリーブオイルとニンニクで食材を煮込むスペイン料理。一般的に素材は魚介類を中心に海老、牡蠣、イワシ、タラ、エスカルゴ、マッシュルーム、チキン、砂肝、野菜など多種多様で、熱が通った具材をそのまま食すのと併せ、バゲットをオリーブオイルに浸して食べるのが基本の食べ方となる。
作り方:
①素材の下ごしらえをする。
②ニンニクをスライスか微塵切りにする。
③小さく深めのフライパンかスキレットにオリーブオイルが底1cmくらい、ニンニク好きなだけ（2-4欠くらい）、鷹の爪（そのままでも荒切りでも可）、塩少々を入れ、火にかける(弱火)。ニンニクが少し色付いて油に匂いが移ったら、素材を入れる。
④具材を入れる。具材はなんでもいいが水気は切った方がいい。オススメはシーフードミックスを自然解凍後に昆布茶を軽くかけて下味つけたもの、砂肝、ネギを大きめに切ったもの、キノコ類、生卵（目玉焼きになる）などなど、煮込み料理なので割となんでも合う。
⑤具材に何となく火が通るまで弱火で10-15分ほど煮込む(この際具材の水分で水っぽくなるためフタはしめない)。目玉焼きを作りたい時のみ蓋をする。
⑥最後にアジシオか味の素で味を整える。ご飯や酒と合わせるならスーパーで売ってるアヒージョの素を入れるのもあり。
⑦日本酒、ワイン、ウイスキーやハイボール、レモンサワーなどと合わせていただく。お米に油ごと少しかけてもうまい。
⑧余った油は翌日にパスタと併せてペペロンチーノにすると美味い。(油に水分が移っているため翌日中に使うと良い、冷蔵しておくとなお良し。)

割と放置でできる上にいい酒のアテになるのでおすすめ✌️✌️✌️
ゲーム作成　Part 1

SQLiteを使ってEnemy(敵)のデータベースを作りました。
このデータベースの表テーブルは：
[id,name,atk,def,spd,exp,hp]
idはIDで、nameは敵の名前、atkは攻撃、defはディフェンス、spdは早さ、expは得られるエックスペリアンス、とhpはHPのことです。

![Screenshot 2023-12-18 at 20.33.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3648209/73702423-522e-5db8-3292-8875e7c9d90b.png)




その後、pythonでAPIを書きました。
ここのAPIは三つのMETHODがありますが、注目したいのは「#ENEMY API」。
このMETHODで、敵の名前をパラメーターとして使って、atk,def,spd,exp,hpのデータを得ます。

```python
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from typing import List, Dict, Any

import sqlite3

app = FastAPI()

class Word(BaseModel):
    player: str

def db_connection(database_name):
    try:
        conn = sqlite3.connect(database_name)
        return conn
    except sqlite3.Error as e:
        print(e)
        return None

@app.get("/save/player", response_model=List[str])
def get_player_names():
    conn = db_connection("savedata.sqlite")
    cursor = conn.cursor()
    
    cursor.execute("SELECT playername FROM savedata")
    player_names = cursor.fetchall()

    if not player_names:
        raise HTTPException(status_code=404, detail="No player names found")

    return [name[0] for name in player_names]

@app.get("/save/index", response_model=List[int])
def get_player_ids():
    conn = db_connection("savedata.sqlite")
    cursor = conn.cursor()
    
    cursor.execute("SELECT savefileindex FROM savedata")
    player_ids = cursor.fetchall()

    if not player_ids:
        raise HTTPException(status_code=404, detail="No player IDs found")

    return [id[0] for id in player_ids]


#ENEMY API

@app.get("/enemy/{param}/{enemy_name}", response_model=Any)
def get_enemy_param(param: str, enemy_name: str):
    conn2 = db_connection("enemy.sqlite")
    cursor2 = conn2.cursor()
    
    cursor2.execute(f"SELECT {param} FROM enemy WHERE name=?", (enemy_name,))
    enemy = cursor2.fetchall()

    if not enemy:
        raise HTTPException(status_code=404, detail=f"ERROR")

    return enemy[0][0]


if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="127.0.0.1", port=7070, debug=True)

```


このAPIでGdevelopで作った場面で表示します。
今のところはまだゲームの図鑑です。
写真などのビジュアルまだ作っていないです。

![Screenshot 2023-12-18 at 20.50.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3648209/6da74ea0-df3c-16df-5168-e976eeb5fbb0.png)


今のところはデータベースとAPIとゲームエンジンが正常に動作できます。
明日からレベル１/エリア１の場面やゲームプレイを作ります。
ファイルを探すよ、"Finder"

[Symfony Component Advent Calendar 2023](https://qiita.com/advent-calendar/2023/symfony-component)の21日目の記事です。


## ファイルを探すよ、"Finder"

[Finder](https://symfony.com/doc/current/components/finder.html)は、ファイルやディレクトリを探すコンポーネントです。Symfony以外でも使えます。

### インストール

```shell
composer require symfony/finder
```

### 使い方

```php
use Symfony\Component\Finder\Finder;

$finder = new Finder();

// /var/www/html/assets/内の*.jsを探す
$finder->files()->in('/var/www/html/assets')->name("*.js");

// 探した結果があるか確かめる
if ($finder->hasResults()) {
    ...
}

// 探した結果をループで回す
foreach ($finder as $file) {
    $path = $file->getRealPath(); // 絶対パス
}
```

`Finder`オブジェクトを作成し、指定した条件のメソッドを実行することで検索します。
結果は`Finder`オブジェクト自体で、ループで回すことができます。

:::note
ループで回せるのは、Finderがこうなってるから
```php
class Finder implements \IteratorAggregate, \Countable
```
:::

### 検索条件

検索条件は主に以下のようなものがあり、複数繋げることができます。

| メソッド | 内容 | 引数例 |
|---|---|---|
| files() | ファイルのみを検索 | |
| directories() | ディレクトリのみを検索 | |
| name() | ファイル名で検索 | '*.php', '/\.php$/', ['*.php', '*.twig'] |
| notName() | ファイル名を除外 | '*.php', ['*.php', '*.twig'] |
| contains() | ファイルの内容で検索 | 'hoge', '/hoge/' |
| path() | パスで検索 | 'assets/img' |
| notPath() | パスを除外 | '/assets/img' |
| size() | ファイルサイズで検索 | '< 1.5M', '>= 1K' |
| date() | ファイルの更新日時で検索 | '>= 2023-12-01' |
| depth() | ディレクトリの深さを指定 | '== 0', '< 3' |

```php
// 例
$finder
    ->files() // ファイルで
    ->in('/var/www/') // /var/wwwの
    ->depth('< 5') // ディレクトリの深さは5未満で
    ->name('*.js') // ファイル名が*.jsで
    ->size('< 1K') // 1K未満で
    ->date('>= 2023-12-01') // 2023/12/01以降に更新されたファイル
;

```

### 外部ストレージ

`in()`メソッドは、URLタイプのプロトコル（`ftp://`, 'file://`など）で検索することもできます。
登録すれば、外部ストレージもアクセスできます。

```php
$s3Client = new S3Client();
$s3Client->registerStreamWrapper(); // `s3://` 登録

$finder->in('s3://bucker-name')->name('*.csv');
```

## まとめ
今回は`Finder`でした。ファイル検索が捗るのでぜひ使ってみてほしいです。
Qiitaアドベントカレンダー完走のためにやったこと・すれば良かったこと

# はじめに
　次の記事で1人アドベントカレンダー完走（25記事）を達成するので、今までに記事を書く上で、
1. 完走のためにやったこと
2. 完走のためにすれば良かったこと

 をまとめました。

# Qiitaアドベントカレンダー完走のためにやったこと

## 1. 構成のテンプレートを作った

　「はじめに」「記事のタイトル」「まとめ」など、H1タグレベルでmarkdownするタイトルをあらかじめ決めておきました。これを決めておくことで、「あれ？　記事の出だしって前回どんな感じで書いていたっけ？」と読み返す手間が減らせました。
 
 　WordPressサイトなどで記事を書くときもこのやり方です。全くの白紙に書こうとすると手が止まってしまいますが、余白を埋めていく形なら、始める心理的ハードルが下がって良いです。

 ### 個人的にとても勇気をいただいた記事

  https://qiita.com/Sicut_study/items/9b20ac5ded003cb6d55a

 :::note info
　ちなみに、以下二つから、色々な方の記事作成術が読めるのでオススメです！

* [タグ：アウトプット](https://qiita.com/tags/%e3%82%a2%e3%82%a6%e3%83%88%e3%83%97%e3%83%83%e3%83%88)
* [「アウトプットの心構え」カレンダー](https://qiita.com/advent-calendar/2023/output)
:::

## 2. Markdown記法を勉強した

　基本的には公式の記事を参照しながらの執筆でした。HTMLで書いていたこともあるので、意外とすんなり受け入れられました。（むしろHTMLよりめちゃくちゃ楽！）

https://qiita.com/Qiita/items/c686397e4a0f4f11683d

## 3. Qiita先人の記事を読み込んだ

　ランキングに載っている記事を最初に読んでしまって感動しつつも圧倒されました。何も書けなくなってしまいそうだったので、まずは「初心者」タグを巡って、最初のころにみんなどんな記事を書いているのかを参考にしました。（まれに「本当に初心者？」と思うものもありましたが…）

 　こういう流れで書くんだな、とかmarkdownを使いこなしている記事などが特に参考になりました。みなさん、アウトプットの仕方もいろいろありますね。

## 4. 個人カレンダーを作って、全部の日付で参加表明した

　本当にやるんだ、と自分に言い聞かせること・ネタ出しの結果をまとめて書いておきました。一人完走カレンダーなので、Qiitaさんから一日3通のリマインド通知が最初はとてもしんどかったです笑　今は若干、目覚まし時計のスヌーズ機能みたいな扱いになっています。でもお知らせしてもらえるのはありがたい！
 
 　また、全然記事にできなさそうなネタもたくさんあったのですが、「この時の自分はこんなことに関心があったんだな」と振り返ることができました。

## 5. 周囲に25記事書くと宣言した

　実際、これが一番効いた気がします。資格試験もこっそり勉強して合格だけ報告する…の流れが大きかったのですが、今回ばかりは一人ではモチベーションを保つのは無理そうだなと思ってやめました。

 　「記事書いた？」「まだ投稿されてないけど」などリマインドしてもらったおかげで、「もう辛いからやめよう」という気持ちに負けずに頑張れました。日付を守れたのは最初だけでしたけど笑

# Qiitaアドベントカレンダー完走のためにすれば良かったこと

## 1.  事前にある程度プログラミングの勉強を進めておけば良かった

　アドベントカレンダーの期間が始まる前にPythonの勉強を始めていて、「自分でちょっとしたアプリを開発してその記事を書いてみたいな」と漠然と思っていました。が、案の定、体調不良だったり別のやることに振り回されて、全然進まず…。

 Qiitaのプログラミング記事に憧れはあるので、今後は学んだことをアウトプット（開発）することに使いたいと思います。

## 2.　ネタを出した時にある程度構成を考えておけば良かった

　カレンダーに記事内容を先に投稿していたものの、そこから実際の記事へ移行するのが大変でした。アイデアが新鮮なうちに、大まかな構成と参考リンクなどをまとめておけば良かったです。

## 3.　記事貯金をしていなかった

　本当はある程度の記事貯金をして、手直しをしながら新しい記事を書く予定だったのですが、全く貯金できずじまいで12月1日を迎えました。やらなきゃいけないけど、まだ時間あるしいっか、と後回しにしてしまう夏休みの宿題状態ですね。

　急いで書いた記事でクオリティを保つのはかなり難しい&Qiita初心者の自分には荷が重すぎました。


# まとめ

　アウトプットの機会を自分に課すことで、今までにない経験ができました。また、「記事にできないかな」という視線でニュースや情報を眺めると、普段いかに自分が面白いことを見逃しているのかに気付かされました。

 　個人完走アドベントカレンダーはあと1日。最後までお付き合いいただけると嬉しいです😊
wingetのlocale設定


# 対策
- winget settingsでconfigを編集して優先ロケールを設定する
```json
{
    "$schema": "https://aka.ms/winget-settings.schema.json",

    // For documentation on these settings, see: https://aka.ms/winget-settings
    // "source": {
    //    "autoUpdateIntervalInMinutes": 5
    // },
    "installBehavior": {
        "preferences": {
            "locale": ["ja-JP", "en-US"]
        }
    }
}
```

## 現象と対策
1. wingetでThunderbirdがインストールしたら文字が読めない
1. wingetでパッケージを調査するとlocaleがチェコ語になってる
1. --locale指定でインストールパッケージが変わることを確認
1. ロケールリストに日本語、英語を指定する

### wingetログ(関係ないところは省略）
```powershell
> winget show --exact --id Mozilla.Thunderbird
インストーラー:
  インストーラーのロケール: cs-CZ

> winget show --id Mozilla.Thunderbird        --exact --locale ja-JP
 インストーラー:
  該当するインストーラーが見つかりません。詳細については、ログを参照してください。

> winget show --id Mozilla.Thunderbird        --exact --locale en-US
インストーラー:
  インストーラーのロケール: en-US

> winget settings
PS C:\Users\admin> winget show --id Mozilla.Thunderbird        --exact
見つかりました Mozilla Thunderbird [Mozilla.Thunderbird]
...
インストーラー:
  インストーラーの種類: exe
  インストーラーのロケール: en-US
  インストーラーの URL: https://download-installer.cdn.mozilla.net/pub/thunderbird/releases/115.5.2/win64/en-US/Thunderbird%20Setup%20115.5.2.exe
  インストーラーの SHA256: 55e7bf796c887204e021e46399b02a011ab8e9298866ba288fa385dd2e814264```
AWS Cloud Practitioner対策8 - データベース

# はじめに
AWS Cloud Practitionerの対策として自分用に執筆しています。

:::note warn
この記事はAWS・執筆学びたての初心者が執筆しています。間違いがあるかもしれませんので、ぜひ各項目にある**参考文献**も確認してください。また、誤りがあればコメントで教えていただけると幸いです。
:::

## RDS
Relational Database Service。マネージドサービスで、クラウド内にリレーショナルデータベースをセットアップ、運用する。

### サポート
 - MySQL
 - Amazon Aurora
 - Microsoft SQL Server
 - PostgreSQL
 - MariaDB
 - Oracle

### リードレプリカ
 - 非同期レプリケーション機能
 - 必要に応じてマスターに昇格可能

### RDSの使用の適切、不適切
 - 適切
     - 複雑なトランザクションや複雑なクエリ
     - 中から高程度のクエリまたは書き込み速度で、最大30,000IOPS
     - 単一のワーカーノード、シャード
     - 高い耐久性
 - 不適切
     - 超高速の読み書き、書き込み速度
     - 大きいデータサイズ、高いスループットリクエストのシャーディング
     - NoSQLデータベースが処理できるシンプルなGET, PUTのリクエストやクエリ
     - RDBMSのカスタマイズ

RDSの使用ができない場合は、DynamoDBなどのNoSQLデータベースソリューションを使用する、EC2インスタンスでリレーションデータベースエンジンを実行するなどを検討する。

### 料金
 - DB購入タイプ
     - オンデマンドインスタンス
     - リザーブドインスタンス
 - DBインスタンスの数
 - プロビジョニング済みストレージ
     - 無料
     - 有料（GB/月）
 - 追加ストレージ
     - 有料（GB/月）

 - リクエスト
 - デプロイタイプ・ストレージと入出力の料金はデプロイ先によって異なる
 - データ転送
     - 受信データ転送は無料
     - 送信データ転送は段階的に課金

## DynamoDB
NoSQLデータベースサービス。キーバリューストアデータベース。事実上無制限のストレージで、項目ごとに異なる属性を設定可能。数十万のリクエストへのスケーリングに優れている。

テーブル、項目、属性がDynamoDBの主要なコンポーネント
プライマリキー（パーティションキー、ソートキー）をサポート

SSDでのみ実行される。
モバイル、ウェブ、ゲーム、広告技術、IoTアプリケーションに最適。

## Redshift
マネージドサービスのデータウェアハウス。データ分析のためのデータベース。
 - 並列処理アーキテクチャ
 - オートメーションとスケーリング
 - 互換性
 - 暗号化機能

## Amazon Aurora
MySQL, PostgreSQLと互換性のあるリレーショナルデータベース。マネージドサービスで、プロビジョニング、バッチの適用、バックアップ、リカバリ、障害検知、修復などの時間のかかるタスクを自動化する。

可用性が高く、高速な分散型ストレージサブシステムが備わっている。従量課金制。

最大15個のリードレプリカを利用できる。自動フェイルオーバー機能がある。

### RDSとの違い
MySQLやPostgreSQLを使用して高性能なデータベースを構築する場合はAmazon Auroraを、幅広いデータベースエンジンを使用する場合や、最新のデータベースエンジンを使う場合はAmazon RDSを利用する。
AWS Cloud Practitioner対策7 - ストレージ

# はじめに
AWS Cloud Practitionerの対策として自分用に執筆しています。

:::note warn
この記事はAWS・執筆学びたての初心者が執筆しています。間違いがあるかもしれませんので、ぜひ各項目にある**参考文献**も確認してください。また、誤りがあればコメントで教えていただけると幸いです。
:::

## ストレージオプション
 - ブロックストレージ
     - ファイルを分割したブロックの一部を更新
 - オブジェクトストレージ
     - ファイル全体を更新

## EBS
Elastic Block Strage。永続的なブロックストレージボリュームで、EC2インスタンスと組み合わせて使用できる。不揮発性なので電源を切ってもデータを保存することができる。

ストレージボリュームを個別に作成し、EC2インスタンスにアタッチできる。ボリュームはアベイラビリティーゾーンで自動的にレプリケートされる。スナップショットを使用してS3に自動的にバックアップが可能。

### ボリュームタイプ
 - ソリッドステートドライブ
     - 汎用
     - プロビジョンドIOPS
 - ハードディスクドライブ
     - スループット最適化
     - コールド

### 特徴
EBSスナップショットをS3に保存する場合に、その月に保存するデータ量に応じて料金が追加される（GB単位）

EC2インスタンスとEBSとの間での通信時に暗号化されるが、追加料金はかからない。

キャパシティーの拡張や別のタイプに変更することが可能。

## S3
Simple Strage Service。オブジェクトストレージ。
バケットと呼ばれるリソースにデータがオブジェクトとして保存される。

 - 事実上無制限のストレージ（一つのオブジェクトに対して最大5TB）
 - 99.999999999%の耐久性
 - バケット及びオブジェクトへのきめ細かいアクセス制御

S3のデータは複数の地理的なリージョンに自動的に複製され、冗長性が確保されます。

Amazon S3はクロスリージョンレプリケーションなどを使用して、データを複数の地理的なリージョンに自動的に複製し、冗長性を確保します。S3では、同一リージョンにある複数のアベイラビリティゾーン内のすべてのオブジェクトをレプリケートします。

### ストレージクラス
 - Amazon S3 標準
     - アクセス頻度の高いデータ向け
 - Amazon S3 Intelligen-Tiering
     - アクセス頻度が予測できないデータ向け
 - Amazon S3 標準 - 低頻度アクセス（Amazon S3 標準-IA)
     - アクセス頻度の低いデータ向け
 - Amazon S3 1ゾーン - 低頻度アクセス（Amazon S3 1ゾーン-IA）
     - アクセス頻度が低いデータ向け
 - Amazon S3 Glacier
     - アーカイブデータ向け
 - Amazon S3 Glacier Deep Archive
     - アーカイブデータ向け

### バケットのURL
 1. リージョンでバケットを作成する
 2. 必要な数のオブジェクトをバケットにアップロードする

### アクセス
コンソール、AWS CLI、SDKからアクセスできる。RESTベースのエンドポイントを使用して直接アクセスすることも可能

### 料金
利用した分のみの支払い
 - 1ヶ月あたりのGB
 - 他リージョンへのデータ送信（POST）
 - PUT, COPY, POST, LIST, GETリクエストの数

## EFS
Elastic File System。クラウドで利用できるファイルストレージ。ビッグデータと分析、メディア処理ワークフロー、コンテンツ管理、ウェブ配信、ホームディレクトリに最適。
PB規模の低レイテンシーシステム。
数千個のEC2インスタンスから同時にアクセスできる。
実際に指定したストレージに対してのみ支払いが発生する。

 - マウントターゲット
     - サブネットID
     - セキュリティグループ
     - ファイルシステムごとに1つ以上
     - VPCサブネット内に作成
     - アベイラビリティーゾーンごとに1つ
     - 同一VPC内に限る
 - タグ
     - キーと値のペア

## S3 Glacier
安全性と耐久性に優れた、極めて低コストのデータアーカイブサービス。
 - オブジェクトに対する耐久性は99.999999999%。
 - SSLまたはTLSを使用して、配送中及び保管中のデータを暗号化
 - ボールトロック機能でポリシーをロックし、コンプライアンス順守。
 - 長期アーカイブに最適な、極めて低コストな設計。
     - アーカイブへのアクセスに関するオプション（迅速、標準、大容量）

### 用語
 - アーカイブ
     - 保存する写真、動画、ファイルなどのオブジェクト。S3 Glacierにおけるストレージの基本単位。各アーカイブには一意のIDが設定され、説明の追加も可能。
 - ボールト
     - アーカイブを保存するコンテナ。ボールト名およびボールトを置くリージョンを指定する。
 - ボールトアクセスポリシー
     - ボールトに保存されているデータにアクセス可能なユーザーと、ユーザーが実行できるオペレーションを決定する。

### ライフサイクルポリシー
Amazon S3 標準
↓（30日後）
Amazon S3 標準・低頻度アクセス
↓（60日後）
Amazon S3 Glacier
↓（365日後）
削除

### ストレージの比較
|  | Amazon S3 | Amazon S3 Glacier |
|:-:|:-:|:-:|
| データボリューム | 無制限 | 無制限 |
| 平均レイテンシー | ミリ秒 | 分/時間 |
| アイテムのサイズ | 最大5TB | 最大40TB |
| 1ヶ月あたりのGB単位のコスト | 高コスト | 低コスト |
| 課金対象のリクエスト | PUT, COPY, POST, LIST, GET | アップロードと取り出し |
| 取り出し料金 | リクエスト単位 | リクエストおよびGB単位 |
AWS Cloud Practitioner対策6 - コンピューティング

# はじめに
AWS Cloud Practitionerの対策として自分用に執筆しています。

:::note warn
この記事はAWS・執筆学びたての初心者が執筆しています。間違いがあるかもしれませんので、ぜひ各項目にある**参考文献**も確認してください。また、誤りがあればコメントで教えていただけると幸いです。
:::

## EC2
サイズ変更が可能な仮想マシンを提供する。
IaaSなので柔軟性が高い。OSや起動するサーバーのサイズやリソース機能を選択する。

### インスタンス

 1. オンデマンドインスタンス 
	- 長期契約を必要とせず、低料金で、最も高い柔軟性を備える
	- 短期的な、急増する、または予測不可能なワークロード
	- アプリケーション開発やテストを行う場合に適する
 2. スポットインスタンス
	- 大幅な割引で大きな規模に対応
	- 非常に低いコンピューティング料金で実行可能なアプリケーション
 3. リザーブインスタンス
	- 予測可能または安定した状態にある場合に適する。
	- 一定した状態、または使用料が予測可能なワークロード
	- ユーザーが料金を前払いすることでインスタンス料金を削減可能
 4. 占有ホスト
	- EC2で実行するソフトウェアライセンスに制限がある、ほかのデプロイオプションを使用できないなどの特定のコンプライアンスや規制要件がある場合に利用する。
	- 機密性が高いワークロード

### コスト最適化
1. 最適なサイズ
2. 伸縮性
3. 最適な料金モデル
4. ストレージの選択肢の最適化

## EC2 Auto Scaling
EC2インスタンスを自動的に起動または終了する条件を定義できるようにすることで、アプリケーションの可用性をサポートします。


## ECR
Elastic Container Registry
Dockerイメージの保存と取得
フルマネージド型のDockerコンテナレジストリ。ECSと統合されているので、ECS上で実行されるアプリケーションのコンテナイメージを保存、実行、管理できる。

## ECS
Elastic Container Service(ECS)
Dockerをサポートするコンテナ調整サービス

### 詳細
非常にスケーラブルで高速なコンテナ管理サービス
#### 利点
・Dockerコンテナの実行を調整
・コンテナで実行される全ノードの維持とスケーリング
・インフラストラクチャ立ち上げの複雑さを排除

#### 機能
起動：何万もの数のDockerコンテナを数秒で起動
モニタリング：コンテナのデプロイをモニタリング
管理：コンテナを実行するクラスターの状態を管理
スケジュール：組み込みのスケジューラまたはサードパーティーのスケジューラを使用してコンテナをスケジュール

## VMware Cloud on AWS
カスタムハードウェアなしでハイブリッドクラウドをプロビジョニングする

## Elastic Beanstalk
ウェブアプリケーションを簡単に実行および管理する方法。
PaaS。迅速なデプロイを容易にする。OS,アプリケーションサーバー、その他のインフラはAWSが管理する。


## Lambda
サーバーレスコンピューティングソリューション。使用したコンピューティング時間に対してのみ料金が発生する。
サーバーのプロビジョニングや管理をsることなく、コードを実行することができるようになる。サーバーを運用するより低コストで大きぼなスケーラビリティを実現できる。
単一のLambda関数の最大メモリ割り当ては3008MB。最大実行時間は15分。

## EKS
Elastic Kubernetes Service
AWSで管理されたKubernetesを実行する
AWSでKubernetesを実行可能
認定Kubernetes準拠
Linux およびWindowsコンテナをサポート
#### 用途
コンピューティングインスタンスのクラスターを管理する
Kubernetesによって調整されたコンテナをそれらのインスタンスで実行する

## Lightsail
アプリケーションやウェブサイトを構築するための使いやすいサービスを提供

## Batch
あらゆる規模でバッチジョブを実行するためのツールを提供

## Fargate
コンテナを実行する手段を提供し、サーバーやクラスターを管理する必要性を減らす

## Outposts
選択したAWSサービスを、オンプレミスで実行する方法を提供

## Serverless Application Repository
サーバーレスアプリケーションを検出、デプロイ、公開する方法を提供


## コンテナベースのサービス
ECS, EKS, Fargate, ECR。単一のOSで複数のワークロードを実行できる。
AWS Cloud Practitioner対策4 - クラウドのセキュリティ

# はじめに
AWS Cloud Practitionerの対策として自分用に執筆しています。

:::note warn
この記事はAWS・執筆学びたての初心者が執筆しています。間違いがあるかもしれませんので、ぜひ各項目にある**参考文献**も確認してください。また、誤りがあればコメントで教えていただけると幸いです。
:::

## 責任共有モデル
AWSとユーザーの間で責任を共有する。

### AWSの責任
 - データセンターの物理的セキュリティ
 - ハードウェア及びソフトウェアのインフラストラクチャ
 - ネットワークインフラストラクチャ
 - 仮想化インフラストラクチャ

### ユーザーの責任
 - EC2インスタンスのOSのバッチの適用やメンテナンス
 - アプリケーション（パスワードやロールベースのアクセスなど）
 - セキュリティグループの設定
 - ファイアウォール
 - ネットワーク設定
 - アカウント管理

## IAM
Identity and Access Management。各サービスへのアクセスを制御する。AWSアカウントのリソースを起動、構成、管理、終了するためのアクセス権限を一元管理するツール。

### 基本コンポーネント
 - IAMユーザー
 - IAMグループ
 - IAMポリシー
 - IAMロール

### アクセス権を取得するための認証
 - プログラムによるアクセス
 - AWSマネジメントコンソールからのアクセス

### IAM MFA
ユーザー名とパスワードに加えて、一意の認証コードが要求される（多要素認証）

## 新しいAWSアカウントの保護
必要な場合を除き、AWSアカウントのルートユーザーを使用しない。
 - ルートユーザーはAWSサポートプランの変更ができる。
 - できるだけ早く、アカウントのルートユーザーの使用を停止し、IAMユーザーを使用する。
 - MFAを有効にする
 - AWS CloudTrailを使用する（ユーザーアクティビティを追跡する）
 - 90日を超えるログを有効にし、指定されたイベントアラートを有効にするには、証跡を作成する。
 - AWSのコストを使用状況レポートなどの請求レポートを有効にする
 - アクセスキーはセキュリティ上の理由から使用しない

## アカウントの保護
### AWS Organizations
サービスコントロールポリシー(SCP)により、アカウントを一元管理できる。
IAMアクセス許可ポリシーに似ている。SCPによりアクセス許可が付与されることはない。SCPでは組織の最大アクセス許可を指定する。

AWS Key Management Service
 - 暗号化キーを作成及び管理
 - サービス全体及びアプリケーションでの暗号化の使用を制御
 - CloudTrailとの統合により、全てのキーの使用状況をログに記録

Cognito
 - ウェブ及びモバイルアプリケーションに、ユーザーのサインアップ、サインイン、アクセスコントロールを追加する

Shield
 - DDoSから保護するマネージドサービス
 - アプリケーションを保護
 - 常時稼働の検出と児童インライン緩和を提供
 - アプリケーションのダウンタイムとレイテンシーを最小限に抑えるために使用

## データの保護
暗号化ではシークレットキーによってデータを暗号化するため、データが読み取り不能になる。KMSでシークレットキーを管理可能

保留中のデータは物理的に保存されたデータを指す。
配送中のデータはネットワーク経由で移動中のデータを指す。

AWS Certificate Manager
サービスや内部接続リソースで使用されるSSL、TLS証明書をプロビジョニング、管理、デプロイできるサービス。

### S3データへのアクセス制御のツール・オプション
 - Amazon S3 ブロックパブリックアクセス機能
 - IAMポリシー
 - バケットポリシー
 - アクセスコントロールリスト
 - AWS Trusted Advisor

## コンプライアンスを確保するための取り組み
### AWS Config
AWSリソースの設定を診断、監査、評価する
設定の継続的モニタリングに使用する
記録された設定と理想的な設定を自動的に評価売る
設定変更を確認する
詳細な設定履歴を表示する
コンプライアンスの監査とセキュリティ分析を簡素化する

### AWS Artifact
コンプライアンス関連情報のリソースをオンデマンドでダウンロード

## WAF
ウェブアプリケーションのセキュリティ保護

## Inspector
セキュリティ評価と脆弱性診断

## GuardDuty
セキュリティイベントと異常なアクティビティを監視する。DDoS攻撃を検知する。しかし検出のみで、shieldのように防ぐことはできない。
AWS Cloud Practitioner対策3 - AWSグローバルインフラストラクチャの概要

# はじめに
AWS Cloud Practitionerの対策として自分用に執筆しています。

:::note warn
この記事はAWS・執筆学びたての初心者が執筆しています。間違いがあるかもしれませんので、ぜひ各項目にある**参考文献**も確認してください。また、誤りがあればコメントで教えていただけると幸いです。
:::

## リージョン
リージョンは地理的なエリアのこと
 - リージョン間のデータのレプリケーションはユーザーが制御
 - リージョン間の通信にはAWSのバックボーンネットワークのインフラを使用
 - リージョンは3つ以上のアベイラビリティーゾーンで構成

## アベイラビリティーゾーン
1つ以上のデータセンターから構成される。
障害の隔離のために設計されている。
AWSはアベイラビリティーゾーン間でのデータとリソースのレプリケーションを推奨している。

## データセンター
セキュリティ重視の設計。50000～80000台の物理サーバーがある。ユーザーはデータセンターを指定することができない（場所が公開されていない）。

## リージョンの選択
最適なリージョンを選択する際に考慮すること
 - データのガバナンス、法的要件
 - 顧客に対する近接性（レイテンシー）
 - リージョン内で利用できるサービス
 - 料金

## POP（Point of Presence）
エッジロケーションとリージョン別エッジキャッシュで形成され、リクエストをルーティングする最適な方法を特定する。
Amazon CloudFront（CDN）とAmazon Route 53（DNS）で利用されている。

## AWSのインフラの特徴
 - 伸縮性とスケーラビリティ
 - 耐障害性
 - 高可用性
AWS Cloud Practitioner対策2 - クラウドエコノミクスと請求

# はじめに
AWS Cloud Practitionerの対策として自分用に執筆しています。

:::note warn
この記事はAWS・執筆学びたての初心者が執筆しています。間違いがあるかもしれませんので、ぜひ各項目にある**参考文献**も確認してください。また、誤りがあればコメントで教えていただけると幸いです。
:::

## 料金モデル
 - コンピューティング
 - ストレージ
 - アウトバウンドデータ転送

の3つによりコストが決まる。

## 支払い方法
 - 従量課金制
 - 予約して支払いを削減
 - 使用料の増加とAWSの拡大に応じて支払いを削減

### 予約して支払いを削減
最大75%節約
オプション
 - 全額前払いのリザーブドインスタンス(AURI)
     - 最大の割引
 - 一部前払いのリザーブドインスタンス(PURI)
     - 低い割引
 - 前払い無のリザーブドインスタンス(NURI)
     - 少額の割引

### 使うほど安くなる段階料金制
使用量の増加に伴うコスト削減

### AWSの拡大に伴い支払いをさらに削減
現在のリソースが、追加料金なしで、将来さらに高性能なリソースで置き換わる

### AWS無料利用枠
 - AWSアカウントにサインアップする
 - 10分間のチュートリアルで学ぶ
 - AWSで構築を開始する

1年間無料

## 無料で使用できるもの
 - Amazon VPC
 - Elastic Beanstalk
 - Auto Scaling
 - AWS CloudFormation
 - AWS IAM

## 総保有コスト（TCO）
システムの直接コスト及び間接コストの把握に役立つ財務予測

 - インフラ環境全体または特定のワークロードを運用するコストを、オンプレとAWSで比較する。
 - 予算を立て、クラウドに移行するためのビジネスケースを作成する。

データセンター管理に伴うコスト
 - サーバーコスト
 - ストレージコスト
 - ネットワークコスト
 - IT人件費

 - 直接コスト
     - サーバーの運用に伴う直接費
     - 電源、フロアスペース、ストレージ、それらリソースの管理に伴うIT運用）
 - 間接コスト
     - サーバーの運用に伴う間接費
     - ネットワーク、ストレージインフラなど

### AWS料金見積もりツール
 - AWSサービスの毎月のコストを予測する
 - コストを削減する余地を特定する
 - ソリューションを構築する前にモデル化する
 - 価値ポイントと見積もりの計算方法を確認する
 - 利用可能なインスタンスタイプとニーズに見合う契約条件を調べる

### その他の利点

ハード上の利点
 - コンピューティング、ストレージ、NW、SECの費用の削減
 - ハード、ソフトウェアの購入費の削減
 - 運用コスト、バックアップ及び災害対策の削減
 - オペレーション担当者の削減

ソフト上の利点
 - サービスおよびアプリケーションを再利用し、同じクラウドサービスを使用してソリューションを定義
 - デベロッパーの生産性の向上
 - 顧客満足度の向上
 - 俊敏なビジネスプロセスにより、当たらな機会に滑訳対処可能
 - 世界的な展開に向けて拡大可能

## Organizations
アカウント管理サービス。複数のAWSアカウントを組織としてまとめて一元管理できる。

一括請求やアカウントの管理機能がある。

利点
 - 複数のAWSアカウントのアクセスポリシーの一元管理
 - AWSのサービスへのアクセス制御
 - AWSアカウントの作成と管理の自動化
 - 複数のAWSアカウントをまとめた一括請求

セキュリティ
 - IAMでアクセス制御
 - IAMポリシーを使用してAWSサービスへのアクセスの制御
 - SCPを使用して組織単位の個人やグループアカウントに対してAWSサービスへのアクセスの制御

Organizationsはルートを最上位とした上下逆のツリー階層。

### 用語
OU：組織単位。ルート内のアカウントのコンテナ。

### Billing and Cost Management
AWSの請求書の支払い、使用料のモニタリング、コストの計上に使用するサービス。今後のコストと使用状況の変化を予測して把握できるので、事前に計画を立てることができる。

コストと利用状況データの傾向とAWS実装の使用状況を理解して、最適化の機会を特定できる。

### ダッシュボード
直近1ヶ月間のAWSで発生した費用の状況を表示したり、サービスの支出の割合を見れたり、傾向がわかったりする。

### Cost Explorer
時間に経過に伴うAWSのコストと使用状況を可視化し、理解し、管理できる。

 - コストのグラフの表示
 - 過去13か月間のコストデータの表示
 - 今後3か月間に発生するコストの予測
 - 時間経過に伴うAWSリソースのコストの発生パターンの発見と、コストの問題領域の特定
 - 最も使用しているサービスの特定
 - どのアベイラビリティーゾーンのトラフィックが多いか、どの関連AWSアカウントが使用されているかといったメトリクスの確認

### Budgets
Cost Explorerによるコストの可視化を使用して、予算の状態を表示し、推定コストを予測する。

その月の予算を超過した場合や、推定コストが予算を超えた場合に通知を受け取ることも可能。予算は月、四半期、年単位で追跡できる。アラートはEmailやAmazon SNS経由で送信できる。

### Budgets と CostExplorer の違い
Budgetsは自分で予算を定め、コストや使用料が予算を超えた時にアラートを発信する
CostExplororはリソースの使用料と料金を可視化し、確認・分析する。

### Cost and Usage Report
1つの場所でAWSのコストと使用状況に関する包括的な情報を管理できる。アカウントとユーザーが毎時間または毎日使用する各サービスカテゴリの項目別使用状況と、勢配分の目的で有効化した税金が一覧表示できる。

## テクニカルサポート
サポートプラン
 - ベーシックサポート
     - リソースセンターへのアクセス、Service Health Dashboard、製品FAQ、ディスカッションフォーラム、ヘルスチェックのサポート
 - デベロッパーサポート
     - AWSでの初期開発のサポート
 - ビジネスサポート
     - 本番ワークロードを実行するお客様
 - エンタープライズサポート
     - ビジネスワークロード及びミッションクリティカルなワークロードを実行するお客様

### TAM
Technical Account Manager。エンタープライズカスタマー向けに提供されるサービス。戦術的なテクニカルサポートを提供する。

## Marketplace
独立系ソフトウェアベンダーが販売している何千ものソフトウェアを閲覧できるデジタルカタログ
sveltejsで静的ファイルを出力

# 議事概要
sveltejsを触ってみて、静的ファイルを出力する。

# 構築
```shell
npm create svelte@latest my-app
cd my-app
npm install
npm run dev -- --open
```


# 静的ファイルを出力

➀静的ファイルをビルドする為に以下を入れる
```shell
npm install -D @sveltejs/adapter-static
```

➁+page.jsを編集
```+page.js
// since there's no dynamic data here, we can prerender
// it so that it gets served as a static asset in production
export const prerender = true;
+ export const trailingSlash = 'always';
```

➂svelte.config.jsを編集
```svelte.config.js
- import adapter from '@sveltejs/adapter-auto';
+ import adapter from '@sveltejs/adapter-static';

/** @type {import('@sveltejs/kit').Config} */
const config = {
	kit: {
		// adapter-auto only supports some environments, see https://kit.svelte.dev/docs/adapter-auto for a list.
		// If your environment is not supported or you settled on a specific environment, switch out the adapter.
		// See https://kit.svelte.dev/docs/adapters for more information about adapters.
-		adapter: adapter()
+		adapter: adapter({
+    		pages: 'build',
+			assets: 'build',
+			fallback: 'index.html',
+			precompress: false,
+			strict: true
		})
	}
};

export default config;
```

➃以下コマンドで、buildフォルダに静的ファイルが出力される。
```shell
npm run build
```


# 参考
<a href="https://svelte.jp/" target="_blank">https://svelte.jp/</a>
<a href="https://zenn.dev/fkumnk/books/2f83061e36c18d/viewer/3a6348" target="_blank">https://zenn.dev/fkumnk/books/2f83061e36c18d/viewer/3a6348</a>
スマートフォンで文字列をアプリへコピー＆ペーストする方法（FUKUTAKA編）

#

[ここをクリックすると他の技術投稿の目次に行きます](https://qiita.com/FUKUTAKA7938/items/2312362e44dbcecd11ca)

## スマートフォンで文字列をアプリへコピー＆ペーストする方法（FUKUTAKA編）

### あくまでも私のやり方です。ご注意をお願いします。

コピーしたい文字を長押しをし、青いバー（私が持ってるものが青いです。なので、他機種では違う色かもしれません。）のポチっと下に出たアイコンを左右に動かし文字列を範囲指定します。

すると「コピー」の項目が出るので、「コピー」を選択、コピーさせたいアプリへ移動し、コピーしたい場所で、クリックしてカーソルを出し、そのカーソルを長押しして「貼り付け」を選択する。

すると文字列コピーができます。

ここまでは、Google 検索とほぼ一緒です。


追加情報と考察です。

コピーさせてたいアプリというのは、例えばブラウザの文字列からテキストエディッタやメールなどできます。その逆も可能です。

また、電子版教科書などの文字列などを辞書アプリの検索欄にコピーすることも可能かと想像ができます。（あくまでも電子版教科書と辞書アプリでは想像です。私は学生ではないのでもっていません。

これが可能であれば、いちいち文字入力しないですむかと思いますし、漢字の読みがなや意味を調べるのに手間がかからないかと思います。あと、ネットで調べるのもありですよね笑）

文字列になったものであれば、アプリ間で文字列のコピーをすることが可能です。
外国語のgoogle翻訳もこの方法で可能です。

これは、PDFでもほぼ可能（何が不可能かというと、画像データでできた画像や文字列は無理です。）

つまり、IT技術の文字列データや数値関係は、簡単にコピーできます。

ただし、アプリ上で、著作権関係で範囲選択やコピーを不可能にしたものもありますので、
なんでもコピーできるとは限りません。このあたりは、コピーしたいものを思いついたら
試してみてください。

iPhoneでもipad、android、タブレットでそれぞれ同じ方法で可能なはずです。
(私はiphoneとipadは持っていないので試してませんが、同じようなものなので可能かと思います。)

＊＊注意＊＊
もし、コピーされたくない文字列データがありましたら、著作者はセキュリティをおかけください。

やり方等は、使用アプリで変わると思いますので、そちらの方へお問い合わせください。

ではでは\(_ _)/

#

[ここをクリックすると他の技術投稿の目次に行きます](https://qiita.com/FUKUTAKA7938/items/2312362e44dbcecd11ca)
Dataverseファイル列のファイルをPower Automateで扱う

こんにちは。今回は、Dataverseファイル列のファイルを扱うときの方法についてご紹介します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/2ede4e33-6410-7982-2cfd-58e5dcc737c6.png" width=50%>

# 前提
今回はDataverseにテストテーブルを用意し、ファイル列（「filetest」）を作成します。
ファイル列のデータは直接今回作成したテストテーブルに保存されるのではなく、**標準テーブルの「FileAttachments」に保存**されます。

::: note
標準テーブルとは
Dataverseがある環境を作成した時に自動的に作られるテーブル。
https://learn.microsoft.com/ja-jp/power-apps/maker/data-platform/types-of-entities
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/940e5904-fb93-efdc-e4e2-4b74ba5a6fcd.png)


ファイル列を作成すると標準テーブルの「FileAttachments」とのリレーションが作成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/5a94ae9a-7b05-7757-5df6-683bda2b69d7.png)



# フロー
ではPower Automateのフローの中でこの列に保存されたファイルを扱っていきたい時にはどのようにしたらいいでしょうか？

## 全体
今回は以下の画像のような流れでフローを組み、承認フローの中でファイルを添付するというアクションを行いたいと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/51b7fa99-11fa-9923-9c82-b6ecb19d137f.png)

## トリガー
①「行が追加、変更または削除された場合」
今回は行が追加されたときの、その新規行のファイルデータをこの後のアクションで扱っていきたいと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/6aa7f654-7393-bd43-1c8d-dcf5db8b8d87.png)


## ファイル列のコンテンツを取得する方法
ファイル列のコンテンツを取得するために、Dataverseの
②「**ファイルまたは画像をダウンロードする**」アクションを使用します。

項目の設定は以下のように行います。
テーブル名：ファイル列があるテーブルの名前
行ID：ファイル列があるテーブルの一意識別子（今回はトリガーの動的なコンテンツを使用）
列名：ファイル列の名前

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/009871a5-1af6-7c31-ea3a-529b345a776a.png)

::: note warn
「ファイルまたは画像をダウンロードする」アクションはコンテンツのみ取得するため、別で名前やファイルサイズを取得したい場合は、追加のアクションが必要。（後述）
:::

## ファイルの名前を取りたい場合
ファイルの詳細情報を取得したい場合は、実際にファイルを保存しているテーブルを参照しに行きます。
リレーションのIDから、「FileAttachments」テーブルの値を取得するために
③「行を一覧にする」アクションを設定します。

項目の設定は以下のように行います。
テーブル名：FileAttachments
行フィルター：
```
fileattachmentid eq '@{triggerOutputs()?['body/ファイル列名']}'
```
「fileattachmentid」が**FileAttachmentsテーブルのGUIDを保存する列名**です。
テストテーブルで追加した行のファイルを指定したいため、今回はテストテーブルのファイル列の動的なコンテンツで挿入します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/789dcf97-4999-8d8a-1c37-18f032327b2e.png)


## ファイルの利用方法
今回は取得したファイルの情報を承認アクションの中で使用します。

④承認アクション
今回は承認の種類として、「開始して承認を待機」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/48642c42-94a1-b4a2-cbe6-8083211193a1.png)

以下のように項目を設定します。
添付ファイル 名前 - 1（Attachments Name - 1）：「行を一覧にする」で取得した「ファイル名」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/dda308d9-d9e1-8055-6607-dc59916dd418.png)
添付ファイル コンテンツ - 1（Attachments Content - 1）：「ファイルまたは画像をダウンロードする」で取得した「ファイルまたは画像のコンテンツ」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/cb0ec1a2-9e90-debc-b453-19c51044826b.png)


# 実行結果
モデル駆動型アプリでフォームを作成し、以下のように添ファイル列にファイルをアップロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/978e5a3a-d5f5-9400-2dd7-1d965ed0bebd.png)

承認アクションの中で、pdfファイルを添付することができました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/a3f4dfaf-a5fa-dc2f-2e06-aa3f72b48f18.png)
BigQuery Remote Functionsを使ってmicroCMSのデータをBigQueryに転送する

microCMSで管理されているデータをBigQuery Remote Functionsを使ってBigQueryにデータ連携してみます。
基本的な考え方は以下のブログで紹介しているので、まずはこちらをごらんください。

https://techblog.zozo.com/entry/bq-kintone

# 読み出し用のPython関数
今回はPythonを使ってCloud Functionsで動く関数を作ってみます。
microCMSには様々な言語・フレームワーク用のSDKがあるようですが、Python用のものはないので、requestsライブラリでREST APIを叩いてみます。

https://microcms.io/features/sdk

以下の関数をCloud Functionsにデプロイし、BigQueryから読み出すためのconnectorなどもデプロイします。
詳細な方法は冒頭で紹介したブログ記事を参照ください。

```py
import os
import logging

import functions_framework
import requests
import flask

def read_microcms_records(api_endpoint, api_key, batch_size=100):
    microcms_subdomain = 'microCMSのサブドメインを入れる'
    microcms_domain = f'{microcms_subdomain}.microcms.io'
    api_endpoint = f"https://{microcms_domain}/api/v1/{api_endpoint}"
    headers = {
        "Content-Type": "application/json",
        "X-MICROCMS-API-KEY": api_key,
    }

    raw_records = []

    offset = 0
    while True:
        params = {"limit": batch_size, "offset": offset}
        logging.info(f"GET: {api_endpoint} {params}")
        result = requests.get(api_endpoint, headers=headers, params=params)

        if result.status_code == 200:
            response = result.json()
            raw_records.extend(response['contents'])
            total_count = response['totalCount']

            logging.info(f"total count is {total_count}")
            logging.info(f"{len(raw_records)} rows fetched")

            offset += batch_size
            if total_count == len(raw_records):
                break
        else:
            logging.error(result.status_code)
            raise RuntimeError(f"Error while reading microCMS records: {result.status_code}")
            break

    return raw_records

@functions_framework.http
def read_microcms(request):
    api_key = os.environ['MICROCMS_API_KEY']
    try:
        request_json = request.get_json()
        calls = request_json['calls']
        if len(calls) != 1:
            raise RuntimeError("this function must be call in scalar subquery!")

        api_endpoint = calls[0][0]
        records = read_microcms_records(api_endpoint, api_key)
        return_value = [records]

        return flask.make_response(flask.jsonify({"replies": return_value}))
    except Exception as e:
        return flask.make_response(flask.jsonify( {"errorMessage": str(e)}), 400)
```

あとは、以下のようなSELECT文を実行すればmicroCMSのデータをBigQueryで読み取ることができます。

```sql
SELECT `プロジェクトID.データセット名.read_microcms(<APIのエンドポイント>)`
```
【Figma】Figmaでサクッと作るスライドアニメーション

## はじめに
みなさん、スライドは何で作っていますか？

最近は、オフラインのイベントでLTをやったり聞いたりすることが多いですが、
Figmaでスライドを作っている人が増えてきた印象があります。

しかし、Figmaでスライドを見せながらも、スマートアニメーションやスライドアニメーションを駆使していそうな発表は少なかったように感じます。

そのため、この記事ではFigmaでサクッと作れるスライドアニメーションをいくつか紹介しようと思います。

## スライドアニメーション サンプル
以下のファイルで紹介するスライドアニメーションを作っているのでぜひ一緒にご覧ください。

<iframe style="border: 1px solid rgba(0, 0, 0, 0.1);" width="800" height="450" src="https://www.figma.com/embed?embed_host=share&url=https%3A%2F%2Fwww.figma.com%2Fproto%2FHNYOMlLjNX5izHzhoKbU6B%2FSlide-Animation%3Fpage-id%3D0%253A1%26type%3Ddesign%26node-id%3D4-48%26viewport%3D523%252C-17%252C0.09%26t%3DePAVadl3V8ww8xnC-1%26scaling%3Dcontain%26starting-point-node-id%3D4%253A29%26show-proto-sidebar%3D1%26mode%3Ddesign" allowfullscreen></iframe>

https://www.figma.com/community/file/1318529981325907960/slide-animation

## スライドアニメーション　設定方法
### ⚪︎ Dissolve
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/be2105da-09c5-7df9-7845-fb233c4e7a77.png)
スライド1からスライド2への遷移する時に `Dissolve` を設定するとDissolveアニメーションをさせることができます。時間やタイミングは、自由に設定してください。

### ⚪︎ Drop
![スクリーンショット 2023-12-17 18.24.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/d546bde8-3f34-46a2-3fc4-11d31d14cded.png)
スライド1からスライド2への遷移する時に `Move in` の `↓下方向` を設定し、イージングをBouncyを設定することで、Dropアニメーションをさせることができます。時間やタイミングは、自由に設定してください。

### ⚪︎ Push
![スクリーンショット 2023-12-17 18.38.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/b6b6827d-1baa-2965-1058-a0e4b185b146.png)
スライド1からスライド2への遷移する時に `Push` の `←左方向` を設定することで、Pushアニメーションをさせることができます。時間やタイミングは、自由に設定してください。

### ⚪︎ Push Fade
![スクリーンショット 2023-12-17 18.39.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/def6d083-5c39-708d-57e1-f3894675663e.png)
スライド1からスライド2への遷移する時に `smart animate` で、両方のスライドを x軸のマイナス方向にスライドさせることで、Push Fadeアニメーションをさせることができます。時間やタイミングは、自由に設定してください。

### ⚪︎ Move in
![スクリーンショット 2023-12-17 18.40.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/9cfea5b1-3374-4420-fb82-56a9c9e2291c.png)
スライド1からスライド2への遷移する時に `Move in` の `←左方向` を設定することで、Move inアニメーションをさせることができます。時間やタイミングは、自由に設定してください。

### ⚪︎ Reveal
![スクリーンショット 2023-12-17 18.40.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/5639bd68-f742-631f-6102-5a459f4f1368.png)
スライド1からスライド2への遷移する時に `Move out` の `←左方向` を設定することで、Revealアニメーションをさせることができます。時間やタイミングは、自由に設定してください。

## まとめ
この記事では、Figmaを使ったスライドアニメーションを紹介しました。

「smart animate」をゴリゴリに使ったスライドを作るには時間がかかりますが、これくらいの設定でサクッと作れるアニメーションにしておくと、スライドのクオリティが上がっていくので設定しておくことをお勧めしておきます。

ただ、スライドの作り途中でスライドアニメーションを作ってしまうと、修正が二度手間、三度手間になって大変になるので、スライド内容・発表内容がFixした後にやるのをおすすめします。

---

最後まで読んでくださってありがとうございます！

普段はデザインやフロントエンドを中心にQiitaに記事を投稿しているので、ぜひQiitaのフォローとX(Twitter)のフォローをお願いします。

https://twitter.com/degudegu2510
VL53L0X測距センサーのオフセットとクロストーク

VL53L0X測距センサーは、その小型ながら高い精度と柔軟性で、様々なアプリケーションに使用されています。しかし、センサーの正確な使用には、オフセットとクロストークの理解が不可欠です。

## VL53L0X測距センサーについて

VL53L0XはSTMicroelectronicsによって開発された、先進的な光学式距離測定センサーです。このセンサーの主な特徴は以下の通りです。

- **測定範囲**: 30mmから2mまでの範囲をカバーし、様々な用途での使用に適しています。
- **分解能**: 1mmの分解能を持ち、非常に精密な距離測定が可能です。
- **測定精度**: 測定精度は±3%で、信頼性の高い測定結果を提供します。
- **測定速度**: 最大60Hzの測定速度により、高速な距離測定が可能です。
- **インターフェース**: I2Cインターフェースを採用しており、様々なマイクロコントローラやシステムとの統合が容易です。
- **光源**: VCSEL (Vertical Cavity Surface Emitting Laser)を光源として使用し、940nmの非可視赤外線を利用します。
- **サイズ**: 小型でコンパクトなサイズ（4.4mm x 2.4mm x 1.0mm）を実現しており、限られたスペースにも組み込むことが可能です。
- **消費電力**: 低消費電力設計により、バッテリー駆動のデバイスにも適しています。
- **用途の多様性**: 小型ロボット、ドローン、スマートフォン、IoTデバイスなど、多岐にわたるアプリケーションに適用可能です。

これらの特徴により、VL53L0Xは多用途に対応し、高精度かつ高速な距離測定を実現するための理想的な選択肢となります。

## オフセットについて
オフセットは、センサーの測定値と実際の距離との差を指します。これは、センサーの特性、環境条件、ターゲットの特性によって異なります。VL53L0Xは工場出荷時にキャリブレーションされていますが、使用環境に応じた再キャリブレーションが推奨されます。

## クロストークについて
クロストークは、センサーから発せられた光が意図しない物体に反射されて戻ってくることで生じる誤測定です。これは、複数のセンサーを近接して使用する場合や、反射率の高い物体が近くにある場合に顕著です。

## カバーウィンドウの仕様と影響
VL53L0Xの性能を最大限に引き出すためには、適切なカバーウィンドウの選定が重要です。カバーウィンドウはセンサーを保護すると同時に、センサーの性能に大きな影響を与えます。

### カバーウィンドウの基本仕様
カバーウィンドウは、940nmの波長に対して高い透過率を持つ透明または半透明の素材である必要があります。また、低反射率の材質が望ましいです。

### カバーウィンドウの影響
カバーウィンドウの材質と厚さは、センサーからの光の透過率に影響を及ぼし、結果として測定精度に影響します。また、カバーウィンドウが他の物体やセンサーからの反射光を受けることでクロストークが発生する可能性があります。

### 推奨事項
適切なカバーウィンドウの選定と、反射を減らすための表面処理（ARコーティング）が推奨されます。また、センサーの使用環境と測定距離に応じたカバーウィンドウの厚さの選定が重要です。

### ARコーティング（アンチリフレクションコーティング）について

ARコーティング（アンチリフレクションコーティング）は、光学機器やセンサーの表面に施される特殊な薄膜コーティングです。このコーティングは、光の反射を減少させ、透過率を高めることを目的としています。VL53L0X測距センサーにおいても、ARコーティングは重要な役割を果たします。

## ARコーティングの主な特徴
- **反射低減**: コーティングにより、センサーの表面での光の反射が大幅に減少します。これにより、センサーの精度と性能が向上します。
- **透過率向上**: 光の透過率が高まることで、センサーが発する光の損失が減り、より正確な距離測定が可能になります。
- **多層構造**: 多くのARコーティングは、複数の異なる屈折率を持つ薄膜を重ねることで、広範囲の波長に対して効果的に反射を減少させます。

### VL53L0XにおけるARコーティングの重要性
- **クロストークの減少**: センサーのカバーウィンドウにARコーティングを施すことで、クロストークが減少し、より正確な測定が可能になります。
- **センサー性能の最適化**: ARコーティングは、センサーの全体的な性能を最適化し、特に低照度環境や複雑な背景が存在する場面での測定精度を高めます。

ARコーティングは、VL53L0X測距センサーのような光学機器の性能を向上させるための重要な技術であり、正確な測定と高い信頼性を実現するために広く利用されています。

## 参考文献
[VL53L0Xデータシート](https://www.st.com/content/ccc/resource/technical/document/datasheet/group3/b2/1e/33/77/c6/92/47/6b/DM00279086/files/DM00279086.pdf/jcr:content/translations/en.DM00279086.pdf)
[VL53L0Xカバーウィンドウガイドライン](https://www.st.com/content/ccc/resource/technical/document/application_note/group0/9d/93/be/33/13/be/46/19/DM00326504/files/DM00326504.pdf/jcr:content/translations/en.DM00326504.pdf)

この記事では、VL53L0X測距センサーの効果的な利用について、オフセット、クロストーク、カバーウィンドウの観点から解説しました。これらの要素を適切に理解し、管理することで、センサーの性能を最大限に活用することが可能です。
git の初期設定（メモ）


```bash
# 基本的な設定
## 自分の情報
git config --global user.name "User Name"
git config --global user.email "user.name@example.com"

## エイリアス
git config --global alias.co "checkout"
git config --global alias.b  "branch"
git config --global alias.bd "branch -d"
git config --global alias.f  "fetch -p"
git config --global alias.s  "status"
git config --global alias.log1  "log --oneline --graph"
git config --global alias.log2  "log --graph --date-order -C -M --pretty=format:'%C(bold blue)%h%C(reset) %C(green)%ad%C(reset) %s %C(green)[%an]%C(reset) %C(yellow)%d%C(reset)' --date=format:'%Y-%m-%d %H:%M'"
git config --global alias.log3  "log2 --all"
git config --global alias.reset-commit  "reset --soft HEAD^"

# ローカルブランチでマージ済みのものを削除
git config --global alias.localprune  '!f() { git branch --merged | grep -v \* | xargs git branch -d; }; f'

# 改行コードの自動変換をOFF
git config --global core.autocrlf false

# push したときに自分のいるブランチを自動認識
git config --global push.default current

# config の内容を確認（grep の引数を渡せる）
git config --global alias.configrep  '!f() { git config --show-origin -l | grep "$@"; }; f'

# commit の editor デフォルトを vi に（WSL2などで）
git config --global core.editor "vi"

# https で clone している場合でも自動的に ssh として remote 登録するように
git config --global url.git@github.com:.insteadOf https://github.com/

# ssh で git に繋ぐ際に訳（セキュリティ理由など）あって https で繋ぐ必要がある場合
vi ~/.ssh/config
# 末尾に下記追加
# ------------
Host github.com
    Hostname ssh.github.com
    Port 443
    User git
# ------------

# WSL2 で gitbash のようなプロンプトに
curl -o ~/.git-prompt.sh https://raw.githubusercontent.com/git/git/master/contrib/completion/git-prompt.sh

# プロンプトにブランチ名表示するように
vi ~/.bashrc
# 末尾に下記追加
# ------------
source ~/.git-prompt.sh
GIT_PS1_SHOWCOLORHINTS=true
PROMPT_COMMAND="__git_ps1 '\[\033[01;34m\]\w\[\033[00m\]' ' \\\$ '"
# ------------
```
どっちを使う！？「Auth::user()->id」と「Auth::id()」の使い分け

## はじめに
GPT4にコードレビューをしてもらっていたところ、タイトルのような指摘を受けたので、少しいろいろと調べてみました。

## 問題
```php: 訂正を勧められた箇所（〇〇.blade.php）
@section('content') 
    @if (Auth::user()->id == $user->id)
        // 中略（自分のプロフィールを表示する処理）
    @endif
@endsection
```
自分のプロフィールを表示する前に、ログインしているユーザとアクセスしようとしているユーザが同じか認証しようとしていたところです。

## 解決策

```php: 訂正後
@section('content')
    @if(Auth::id() == $user->id)
        // 中略（自分のプロフィールを表示する処理）
    @endif
@endsection
```
単体でみると微々たる差かもしれませんが、他人が読むコードとなると、少しでもシンプルな方が良いとは思います。

そして実質的な意味は同じでも、未ログイン時にアクセスを試みると、挙動が異なります。

### Auth::user()->idの場合

Auth::user()はログインしているユーザのインスタンスを返すので、未ログイン時にはnullを返します。

そのため未ログイン時の場合は、nullオブジェクトからidプロパティを取得しようとすることになるので、エラーが発生します。

```terminal: エラー
Error: Trying to get property 'id' of non-object
```

これはアプリケーションが予期せぬ状態でクラッシュする原因となります。

### Auth::id()の場合
対してAuth::id()は未ログイン時にnullを返す点では同じですが、こちらは直接ログインユーザのidを返します。

ログイン時はログインユーザのidを、未ログイン時はnullを返すだけなので、エラーが起こる心配はありません。（nullの場合の処理を行う必要性はあります）

そのため、単にユーザのidを取得したいというケースであれば、Auth::id()の方が適切だと考えられます。

### それではいつ「Auth::user()->」を使うのか
Auth::user()->は完全なモデルインスタンスを返すので、id以外の他の属性（年齢や職業など）に同時にアクセスしたいときに便利です。

```php: 
$user = Auth::user();
if ($user) {
    age = $user->age;
    occupation = $user->occupation;
    // 他の情報にもアクセスする時
    }
```

## まとめ
idのみを取得したいときにはAuth::id()を、他の情報も取得したいときにはAuth::user()->を使用したいと思います。