OmniAICreator/Qiita-1.07M huggingface dataset:
無料公開されている企業の研修資料がすごい

私は文系の大学を卒業し、エンジニア未経験として入社しました。
入社時、最初に苦労したのは、何から学べば良いかが分からないという事です。

幸いにも自社では手厚い技術研修がありましたので、自分の中でこれから仕事をしていきたい分野だったり、深めていきたい分野という指針を定める事ができました。

ただ、現在、入社時を振り返るともう少しエンジニアとしての基礎の部分を学べば良かったなと感じる事がありますので、当時の自分へこれだけは見とけ！と紹介したくなるような技術を体系的に学べる企業の研修資料をご紹介します。

読者の方も私と同じように思わないためにも、少しでもみなさんのお力になれれば幸いです。

(昨今、様々な技術書が発売されていますが、今回は敢えて企業の技術研修資料をご紹介するといった観点でこのQiita記事を書いています。)

# GMOペパボ株式会社
最初にご紹介するのは「GMOペパボ株式会社」の新人研修資料です。


>深さより広さを重視。
>Webサービスを開発する際に必要となる技術の引き出しを増やす。

GMOペパボでは研修の目的として上記引用のように掲げている事もあり、1つの技術を深く学ばさせるのではなく、幅広い分野を学ぶことができます。

https://tech.pepabo.com/2022/12/02/newbie-training-2022/

こちらのサイト内では、フロントエンド研修/コンテナ研修/機械学習研修などと資料が分けられて作成されており、研修の目的や構成も記載されているので、作成した方の思いを感じられながら勉強する事ができます。

# 株式会社リクルート
次にご紹介するのは「株式会社リクルート」のエンジニアコース新人研修の資料になります。

こちらの資料は、クラウドエンジニア向けとなってしまうのですが、AWSとは？から始まり、実際にハンズオンで手を動かしながら学べる内容となっています。

また、1サービス1サービスについて図なども交えながら説明が進んでいくので、AWS初心者の私が見ても分かりやすい内容となっています。


https://blog.recruit.co.jp/rtc/2021/08/20/recruit-bootcamp-2021/

追記：
2022年度版の資料ですと、ハンズオンでWebアプリケーションを作成する内容となっていますので、ソフトエンジニア向けの資料となっています。

https://blog.recruit.co.jp/rtc/2022/09/09/recruit-bootcamp-2022/

# 株式会社MIXI
最後にご紹介するのは「株式会社MIXI」の技術研修資料です。

こちらの資料は、アプリ開発やデータベースだけでなく、Git研修もあり、エンジニアとしての基礎知識を網羅しているのではないかと感じられるぐらいの研修内容となっています。

また、研修動画も掲載されており、文字だけでは伝わりづらい内容も動画を視聴すれば理解が進むと思います。

https://mixi-developers.mixi.co.jp/22-technical-training-5fc362a9dc41

# おわりに
今回、ご紹介させていただいた以外にも多くの企業で無料公開されている資料がありました。そこには社員さんのアツい思いも記載されていたりと、どれも研修意欲が増す内容ばかりでした。

他の企業さんはどのような研修を行っているのか気になった方もぜひ調べてみると、新しい発見があるかもしれません。
【Unity】Apex Legendsライクなキャラクターコントローラー作ってみた。


# 概要
Apex Legendsの動作に似せたキャラクターコントローラーをUnityで作ってみました。
今回は作成する経緯も含めて色々紹介したいと思います。

# 追記
まぁまぁな量のバグが見つかっています。コードは参考程度にご覧ください。

## ソースコード
https://github.com/AtsuAtsu0120/Unity-CharacterController-likeApex

# 経緯
## Apexを3000時間プレイした。
Apexのキャラクターコントローラーってすごいと思っていて、移動してるだけで楽しく感じますよね。
これを使ったゲームを自分でも作ってみたい！ということでUnityで作ろうと思いました。
## 某会社のインターンに落ちた。
また、DOTSでうつつを抜かしていたら、ゲームループ（GameObject使うやつ）の知識や技術を貯めるのをすっかりしていませんでした。
ゲームループにわかはDOTSをやらずにゲームループをもっと勉強すべきだと思ったのでキャラクターコントローラーを作ることにしました。
## 開発中
### キャラクターコントローラーなんもわからん
キャラクターコントローラーを自作したことがなかったので設計思想などもよくわからず、とりあえずソースファイル１個でいいか！という形で作り始めました。
しかし、一通り作ったあたりでバグ取りが全くできないぐらいのソースになってしまいバグ取りや開発を断念しました。
### 有限ステートマシンとの出会い
色々調べてみると、有限ステートマシン（以下FSM）という考え方に出会いました。
ちょうど、ピュアなC#とMonoBehaviourの連携に興味があったので楽しそう！！！！ということもあり、保守性も上がると思ったので移行することに。
### FSMの考え方
FSMの作り方は人によって大きく異なるようで私も私が好きな感じに作ってみようという方針で作ることにしました。
DOTSをずっとやってたのもあって、メモリフレンドリーなステートマシンにしたいなと思って、インスタンスを毎回作る形にしました。まぁこれが実際にメモリフレンドリーなのかは怪しいところですが…
また、汎用性の高いステートマシンの議論が結構行われていますが、今回は初めてということもあって度外視して作りました。
# 技術仕様
今回は、視点と動作を別々に分けて２つのステートを管理することでキャラクターの動作を実現してみました。
これがFSMとして正しいのかは知りません。
## 実装した機能
### 動作
 - 通常の動き
     - 前方方向のみ最大速度が高い
 - ジャンプ
 - しゃがみ
 - ダッシュ
 - 壁のぼり
 - 壁ジャンプ
 - エアストレイフ（Rasストレイフ）
     - タップストレイフはなし。
     - わたしがあんまりすきじゃないから…

### 視点
 - しゃがみ時のカメラが下がる動き
 - 壁のぼり時の横方向のカメラの制限（バグがあるかも）
### アニメーション
今回は実装していませんが、ステートマシンにしてあるのでそこまで実装は大変ではないと思います。
少し後にしっかり行いたいと思います。
### InputSystem
今回はInputSystemを用いて実装しました。
私はInputSystem信者なのでもう大好きです。ほかの制作物のほとんどもInputSystemで実装しています。
## 実装の反省点
旧来のステートマシンを用いない方法からコピペで移行したこともあってコードが汚かったり、速度の設定項目が完全に埋め込まれていて変更するのが少し大変だったりしたことが反省点です。
ここに関しては、少しずつ直して整えていきたいと思っています。

また、私の苦手とすることでずっと克服をしたいと思っているのですが、ソースファイル名やクラス名、変数名などの設定が苦手であまりうまく設定できなかったなと思っています。
# さいごに
需要があるかは分かりませんが、ご自由にお使いください。
また、アドバイスあればぜひお知らせください。

今後しばらくはDOTS及びECSから離れてゲームループのアーキテクスチャやリーダブルコードなど基礎を固めていきたいと思います。
【vim】玄人になれるやさしいvim入門

こちらに移動しました。

https://note.alhinc.jp/n/n489305295df4

# 移動先について
本記事は、現在(2023/12/23)私の所属する[ALH株式会社](https://www.alhinc.jp/)が公開している、[こちら](https://note.alhinc.jp/all)のnote記事に移行することになりました。

ストックされている方は大変お手数ですが、上記リンクから参照ください。
Snowflakeで地理空間系関数(ST_*）をJOINの条件に利用すると激重になる件の解決方法

# はじめに
データウェアハウスのSnowflakeでは地理空間データ型もサポートされており、様々な地理空間系の解析を行うことができます。

今回は、テーブル結合で地理空間系関数を利用した際に、処理時間が想定以上に掛かってしまった事象とその対応策について紹介します！

# 発生したトラブル
以下のように、ジオメトリを持っているログデータにメッシュコードテーブルを外部結合するクエリを実行した際に、想定以上に処理に時間がかかってしまいました。
感覚としては、PostGISで実行すると約10秒程度で完了するはずの処理が、Snowflakeでは5分程度かかってしまうイメージです。

```sql
-- 処理が遅くなってしまった際のクエリのイメージ
SELECT
    log_id,
    log_time,
    mc.code as mesh_code,
    g.geom
FROM
    gps_log g
    LEFT JOIN mesh mc ON st_within(g.geom, mc.geom) --メッシュコードのテーブルを外部結合
;
```

この件について、Snowflakeのサポートに問い合わせさせていただいたところ、下記のとおり回答をいただきました。
>　現状、ST_ から始まる​地理空間関数を結合条件に使用した場合の最適化が内部結合 (INNER JOIN) にのみ適用される。
>　外部結合 (OUTER JOIN)、準結合 (Semi-join)、アンチ結合 (Anti-join) については、現在実装中。

※2023年5月2日時点で回答いただいた内容であることにご留意ください。

# 対応策
今回の対応策は単純に「外部結合で地理空間関数を使わない」です！
今回実行したクエリでは、LEFT JOINでログデータのテーブルの情報は全て残す形でデータを抽出したいので、以下の流れでデータ抽出する流れに変更しました。

1. "INNER JOIN"で（内部結合で！）、ログテーブルとメッシュコードテーブルを結合して抽出した結果をWITH句で保持する。
2. メッシュコードテーブルとJOINされなかったレコードをログテーブルから抽出する。
3. １と2のデータをユニオンする。

```sql
-- 改善版のクエリのイメージ
WITH within_logs as (
    SELECT
        log_id,
        log_time,
        mc.code as mesh_code,
        g.geom
    FROM
        gps_log g
        JOIN mesh mc ON st_within(g.geom, mc.geom) -- INNER JOINに変更
    ),
    without_logs as (
        SELECT
        log_id,
        log_time,
        -- mc.code as mesh_code,　メッシュコードテーブルをJOINしないためselectしない
        geom
    FROM
        gps_log g
    WHERE
        g.log_id not in (select log_id from within_logs) -- JOINされなかったレコードのみを選択
)
SELECT
    log_id,
    log_time,
    mesh_code,
    geom
FROM
    within_logs
UNION ALL
SELECT
    log_id,
    log_time,
    null as mesh_code,
    geom
FROM
    without_logs
;
```

かなり冗長なクエリになってしまっていますが、速度は改善されました！！！
もう少しスマートな方法があればコメントでご教授いただけると嬉しいです🙇‍♂️
【Elasticsearch】シャードとレプリカの調整方法

Elasticsearchのパフォーマンスと可用性を最適化するためには、シャードとレプリカの数を適切に調整することが重要です。この記事では、シャードとレプリカの数を調整する方法を説明します。

## 1. 現在の設定を確認する

まず、現在のインデックス設定を確認します。以下のコマンドを使用して、特定のインデックス（ここでは`your_index`）の設定を取得できます：

```bash
GET /your_index/_settings
```

このコマンドのレスポンスには、シャード数（`number_of_shards`）とレプリカ数（`number_of_replicas`）が含まれます。

## 2. 新しい設定を適用する

次に、新しいシャード数やレプリカ数を設定します。ただし、既存のインデックスのシャード数を直接変更することはできません。シャード数を変更するには、新しいインデックスを作成するか、既存のインデックスを再インデックスする必要があります。

一方、レプリカ数は既存のインデックスで直接変更できます。以下のコマンドを使用して、特定のインデックス（ここでは`your_index`）のレプリカ数を変更できます：

```bash
PUT /your_index/_settings
{
  "index" : {
    "number_of_replicas" : new_number_of_replicas
  }
}
```

ここで、`new_number_of_replicas`を新しいレプリカ数に置き換えます。

これらの操作を行う前に、Elasticsearchのドキュメンテーションを読んで、シャードとレプリカの概念を理解し、それらがクラスタのパフォーマンスと可用性にどのように影響するかを理解しておくことが重要です。また、これらの変更はクラスタのリソース使用に影響を与える可能性があるため、慎重に行ってください。

## レプリカの効果とデメリット

レプリカを増やすことによる主な効果とデメリットは以下の通りです：

### 効果：

1. **読み取り性能の向上**: レプリカはデータのコピーを保持するため、読み取りクエリ（検索など）は複数のレプリカ間で分散することができます。これにより、読み取り性能が向上します。

2. **可用性の向上**: レプリカは主シャードのフェイルオーバーとして機能します。主シャードがダウンした場合、レプリカが主シャードとして昇格し、データの可用性を維持します。

### デメリット：

1. **書き込み性能の低下**: レプリカの数を増やすと、書き込み操作（インデックス作成、更新、削除）の際に同期する必要があるデータの量が増えます。これにより、書き込み性能が低下する可能性があります。

2. **ストレージ使用量の増加**: レプリカはデータのコピーを保持するため、レプリカの数を増やすとストレージ使用量が増えます。

3. **ネットワークトラフィックの増加**: レプリカの数を増やすと、シャード間で同期する必要があるデータの量が増え、結果としてネットワークトラフィックが増加します。

これらの効果とデメリットを考慮に入れて、適切なレプリカ数を設定することが重要です。また、レプリカ数の設定はクラスタのワークロードやリソースによって異なるため、定期的にパフォーマンスを監視し、必要に応じて調整することが推奨されます。

Elasticsearchのレプリカは、データの冗長性と可用性を確保し、読み取り性能を向上させるための重要な機能です。しかし、レプリカの数を増やすことは、書き込み性能の低下、ストレージ使用量の増加、ネットワークトラフィックの増加といったデメリットをもたらす可能性があるため、注意が必要です。適切なバランスを見つけることが、Elasticsearchクラスタのパフォーマンスと可用性を最適化する鍵となります。
AWS Hands-on for Beginners 手を動かしなら学ぶ Analytics サービス入門 を補足していく

## 目的
本資料は [ハンズオン資料 | AWS クラウドサービス活用資料集](https://aws.amazon.com/jp/events/aws-event-resource/hands-on/) 通称 AWS Hands-on for Beginners 内の「手を動かしながら学ぶ Analytics サービス入門」に録画されている時点(2021/01/15)から仕様や UI が変更されており、いくつか躓く点が出てきているので、それを補足していく。

## 対象者
- AWS Hands-on for Beginners 手を動かしなら学ぶ Analytics サービス入門 をこれから進めようとしている方

## 進め方

チャプターごとに躓くポイントをピックアップして、回避していきます。
動画の中でボタンの位置指定などで異なる部分があるが進行に影響しない変更点についてはフォローはしません。

### 03 Amazon Redshift クラスターのセットアップ

1. 無料トライアルの選択がなくなっているが、クラスターサイズの上の選択肢を選択し、任意の種類を選択します。(選択の翻訳に誤りがあるがここではスルーします。)
    ![Screen Shot 2023-06-19 at 16.06.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147300/d44b85f4-db9c-3cf8-ac80-3e39fa0c6cde.png)
1. 本編にサンプルデータのロードの項目が存在しないが、選択しない。
    - あとのチャプターで対応するため。 
1. データベース名の指定項目が存在しないが、問題ない。


### 04 Amazon Redshift クラスターへのデータロード

1. クエリエディタは v2 ではなく、無印版を利用する。
    - 以降のチャプターでも、全て無印版を利用していきます。

### 07 Amazon QuickSight のセットアップ

1. QuickSight アカウントの作成画面での選択方法が異なるが選択肢はデフォルト選択のままでよい。

2. VPC 接続追加画面で表示される実行ロールにポリシーが足りないエラー出るので、ポリシーを追加する。
    a. IAM ロール設定画面に遷移して、「aws-quicksight-service-role-v0」を検索し、選択します。
    b. 「許可の追加」ボタンを押下して、「インラインポリシーを作成」を選択します。
    c. JSON のタブを選択し、以下の JSON 文字列を入力して、「ポリシーの確認」を押下します。
    ```json
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "ec2:CreateNetworkInterface",
                    "ec2:ModifyNetworkInterfaceAttribute",
                    "ec2:DeleteNetworkInterface",
                    "ec2:DescribeSubnets",
                    "ec2:DescribeSecurityGroups"
                ],
                "Resource": "*"
            }
        ]
    }
    ```
    d. 確認画面で確認して、任意の名前を入れて、「ポリシーの作成」を押下します。
3. マルチアベイラビリティーゾーンが必須になったので、2個以上のサブネットを選択します。
4. QuickSight のデータセット作成時に複数のデータベース選択が出来ないので、「date」,「users」,「sales」の順番にデータセットを作成し、保存を繰り返す。
NCMBのC#（Xamarin/MAUI） SDKがソーシャル認証に対応しました

ニフクラ mobile backend（NCMB）では公式として各種フレームワーク、環境向けにSDKを提供しています。その1つにUnityがあります。Unity向けに開発を行う際にはC#を利用しますが、このUnity用SDKは.NET環境では利用できません。

[そこでコミュニティSDKとしてXamarinやMAUI、.NET](http://xn--sdkxamarin-263ivb5dxgkt99brryj6modtuse.net/) 2.0でも動作するC# SDKを開発しています。今回のバージョンアップ（1.1.0）でソーシャル認証に対応したので使い方を解説します。

[NuGet Gallery | NCMBClient 1.1.0](https://www.nuget.org/packages/NCMBClient/)

## NCMBをインストール

任意のプロジェクトをVisual Studioで開きます。

![https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/9c51cd20-c9f4-a00b-804a-ed7db410ccd0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/9c51cd20-c9f4-a00b-804a-ed7db410ccd0.png)

そしてプロジェクトを右クリックして、NuGetパッケージの管理を選択します。

![https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/61392119-a472-9d33-101d-970f016fc2cf.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/61392119-a472-9d33-101d-970f016fc2cf.png)

出てきたウィンドウで、NCMBClientを検索します。執筆時点での最新版は1.0.0です。これを追加します。

![https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/f06df07c-f55d-1e0e-65b2-de79c779cc80.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/f06df07c-f55d-1e0e-65b2-de79c779cc80.png)

## NCMBをインポートする

`MainPage.xaml.cs` を開きます。そして、namespaceの下でNCMBClientをインポートします。

```
namespace MyMauiApp;
using NCMBClient;

```

クラスの初期化時にNCMBも初期化します。キーは[ニフクラ mobile backend](https://mbaas.nifcloud.com/)より取得してください。

```
public MainPage()
{
	InitializeComponent();
	new NCMB("YOUR_APPLICATION_KEY", "YOUR_CLIENT_KEY");
}

```

# ソーシャル認証の使い方

ソーシャル認証は以下の4つがあります。

- Twitter
- Facebook
- Google
- Apple

あと、追加で匿名認証（ID、パスワード不要な認証）にも対応しています。

## Twitter

Twitterは必要な情報が多いので注意してください。

```csharp
var user = await NCMBUser.SignUpWithTwitter(id, screenName, oauthConsumerKey, consumerSecret, oauthToken, oauthTokenSecret);
```

## Facebook

Facebookはアクセストークンと有効期限が必要です。有効期限はDateTime型です。

```csharp
var user = await NCMBUser.SignUpWithFacebook(id, accessToken, expirationDate);
```

## Google

Googleはもう少しシンプルです。

```csharp
var user = await NCMBUser.SignUpWithGoogle(id, accessToken);
```

## Apple

Appleもシンプルです。Sign in with Appleを使う場合には[NuGet Gallery \| AppleAuth\.NET 1\.0\.6](https://www.nuget.org/packages/AppleAuth.NET)などが良さそうです。

```csharp

var user = await NCMBUser.SignUpWithApple(id, accessToken, clientId);
```

## 匿名認証

匿名認証はデフォルトでは引数不要です。ただし、UUIDを自分で指定することもできます。

```csharp
var user = await NCMBUser.SignUpWithAnonymous();
// または
var user = await NCMBUser.SignUpWithAnonymous(uuid);
```

# 他の認証方式

これ以外にもID・パスワードやメールアドレス・パスワード認証も利用できます。

```csharp
var user = await NCMBUser.Login(userId, password);
var user = await NCMBUser.LoginWithMailAddress(mailAddress, password);
```

# 注意点

ソーシャル認証ではユーザー登録とログインは同じものとして扱われます。特に登録してからログインを別途行う、といった必要はありません。

## まとめ

C# SDKはXamarinで使えばiOSやAndroidはもちろん、Linux/macOS/Windowsアプリも開発できます。.NET環境であればWebやCLI開発でも利用できます。ぜひ皆さんのアプリ、Webアプリ開発に利用してください。

[NuGet Gallery | NCMBClient 1.1.0](https://www.nuget.org/packages/NCMBClient/)
Mermaid Markdownでシーケンス図を作成してみた

# はじめに
こんにちは。
前回、Mermaid Markdownの1つであるフロー図の書き方を記事にしました。
よかったら前回記事も見ていただけますと幸いです。

https://qiita.com/duora0406/items/fce45aeb0bb9c726e14a

Mermaid Markdownを使うと色々な図形が書けます。今回はシーケンス図の書き方をまとめてみました。
【注意】Markdown記法でシーケンス図を書く方法をまとめた記事であり、シーケンス図の説明やお作法については記載していないためご注意ください。

# 環境準備
前回記事と同様に今回も環境準備に関する詳しい記載は割愛します。
色々な方法がありますが、VSCodeをインストールし、拡張機能「Markdown Preview Mermaid Support」をインストールするのが一番手っ取り早いかと思います。

# 基本形
~~~
```mermaid
ここにMermaid記法を記入する。
```
~~~

# コード例
~~~ 
```mermaid
%% コンビニのやりとり
sequenceDiagram
    autonumber
    actor お客さん
    actor 店員さん
    participant レジ
    お客さん->>店員さん: 肉まん3つください。
　　店員さん-->>お客さん: 450円になります。
　　お客さん->>店員さん: これでお願いします。
    Note left of 店員さん: 1000円払う　　
    店員さん->>レジ: お金を入れる
    Note right of 店員さん: 1000円
    レジ-->>レジ: 計算する
    Note over レジ: 1000-450=550
　　レジ->>店員さん: おつりが出る
    Note right of 店員さん: 550円
　　店員さん->>お客さん: 550円のお返しです。
```
~~~ 

# 出力結果
```mermaid
%% コンビニのやりとり
sequenceDiagram
    autonumber
    actor o as お客さん
    actor t as 店員さん
    participant レジ
    o->>t: 肉まん3つください。
　　t-->>o: 450円になります。
　　o->>t: これでお願いします。
    Note left of t: 1000円払う　　
    t->>+レジ: お金を入れる
    Note right of t: 1000円
    レジ-->>レジ: 計算する
    Note over レジ: 1000-450=550
　　レジ-->>-t: おつりが出る
    Note right of t: 550円
　　t-->>o: 550円のお返しです。
```

# オプションまとめ
コードの記載内容によってフロー図の向き、図形、矢印など変えることができます。

## 線の種類
各ノードをどのように記載するかで線の種類を変えられます。
~~~
```mermaid
sequenceDiagram
    ノードA->>ノードB: コメント
            ↑
         ここの「->>」を編集する。
```
~~~

### オプションまとめ
|コード  |種類  |
|------|-----|
|A->B  |実線  |
|A-->B  |点線  |
|A->>B  |実線 矢印 |
|A-->>B |点線 矢印 |
|A-xB  |十字がある実線 矢印 |
|A--xB |十字がある点線 矢印 |
|A-)B  |実線 開いた矢印 |
|A--)B  |点線 開いた矢印 |

### 出力例
```mermaid
sequenceDiagram
    ノードA->ノードB: 実線
    ノードA-->ノードB: 点線
    ノードA->>ノードB: 実線 矢印
    ノードA-->>ノードB: 点線 矢印
    ノードA-xノードB: 十字がある実線 矢印
    ノードA--xノードB: 十字がある点線 矢印
    ノードA-)ノードB: 実線 開いた矢印
    ノードA--)ノードB: 点線 開いた矢印
``` 

## 注釈の追記と位置
注釈の位置を設定できます。注釈は「Note」で追記できます。
~~~
```mermaid
sequenceDiagram
participant ノードA
    Note left of ノードA: 左側
           ↑
         ここの「left of」を編集する。
```
~~~

### オプションまとめ
|コード  |種類  |
|------|-----|
|right of  |右側 |
|left of |左側 |
|over |真ん中 |

### 出力例
```mermaid
sequenceDiagram
participant ノードA
    Note left of ノードA: 左側
    Note right of ノードA: 右側
    Note over ノードA: 真ん中
``` 

## その他
その他のオプションまとめです。
出力例は冒頭の「出力結果」を参照ください。

### オプションまとめ
|コード  |種類  |
|------|-----|
|autonumber |自動的に番号を採番 |
|Note |注釈 |
|actor |オブジェクトを人型で表す |
|%% コメント |コード内にコメントを追記 |
|識別子 as オブジェクト名 |オブジェクト名を識別子で記載 |
|+,- |+から-のオブジェクトの間に実行仕様をつける |


# おわりに
最後まで読んでいただきありがとうございました。
フロー図よりも複雑なオプションが多かった印象です。今までシーケンス図を作成する機会がなかったので、よい勉強になりました。
ExcelやPowerPointでこのような図を作った時と比べて、mermaidなら図の位置をうまく調整してくれるのでとてもラクですね。
gitのalias に設定してある一番長いコマンドの意味を調べてみた。

## はじめに
最近、自分が設定しているgitのaliasの中で一番長いコマンドってなんだろうと思うことがあったので、実際にコマンドと意味を調べてみました。

aliasは、コマンドの別名を付ける機能で、コマンドの入力量を減らしたり、覚えやすいコマンド名に置き換えるために利用します。


## 実際に登録してあったalias
私の環境では`~/.gitconfig`に設定しているので、包み隠さずに晒します。

```config
st = status -sb
sta = status
sh = show
so = remote show origin
ft = fetch
up = pull --rebase
rbm = rebase master
ad = add
ci = commit
cam = commit -a --amend
co = checkout
cb = checkout -b
cm = checkout master
# branch関連
br = branch
ba = branch -a
bm = branch --merged
bn = branch --no-merged
bo = branch -r
# log関連
wc = whatchanged
ls = log --stat
lp = log -p
la = log --pretty=\"format:%ad %h (%an): %s\" --date=short
lr = log origin
oneline = log --pretty=oneline
ranking = shortlog -s -n --no-merges
# tree表示
logg = log --graph --date=short --abbrev-commit --pretty=format:'%Cgreen%h %cd %Cblue%cn %Creset%s'
loga = log --graph --all --date=short --abbrev-commit --pretty=format:'%Cgreen%h %cd %Cblue%cn %Creset%s %Cred%d%Creset'
# diff関連
df = diff
dif = diff
dm = diff master
dw = diff --color-words
dc = diff --cached
# grep関連
gr = grep
gn = grep -n
sm = submodule
smupdate = submodule foreach "git checkout master; git pull origin master"
show-graph = log --graph --abbrev-commit --pretty=oneline
```
よく使うものは限られているので使っていないコマンドも多かったです。
(入社当時に、先輩に言われるがままコピーしたのを思い出しました)

当時は呪文としか思っておらず、あまり細かい意味やオプションまで調べようとはしていなかったので、今回は一番長いコマンドに絞って分解して行こうと思います。
※ちゃんと理解した上で当時から使えているのがベストだと思います。。



## 一番長そうなコマンド
リストの中で、圧倒的に長いコマンドは下記でした。
一つ一つ分解して意味を調べていきます。
```config
log --graph --all --date=short --abbrev-commit --pretty=format:'%Cgreen%h %cd %Cblue%cn %Creset%s %Cred%d%Creset'
```

### git log 
Gitでコミットした履歴を確認することができます。
リポジトリに対してコミットした、今までの履歴を表示してくれます。
ここから先のオプションは`git log`実行時を前提に意味を記載していきます。

### --graph
ブランチやマージの履歴をツリー形式で表示します。
このオプションによってブランチの分岐やマージ状況がわかりやすくなります。
`–oneline,–format`オプションなどを様々なオプションを組み合わせることが可能。

### --all
全てのブランチを表示する

### --date=short
日付の表示フォーマットを変更できる。
表示フォーマットは、用意されたオプションもしくは任意のフォーマットが設定できる。
今回のオプションである`short`は時刻を表示しません。

### --abbrev-commit
コミットのハッシュ全体ではなく最初の数文字のみを表示する

### --pretty
オプションを指定することによってログの出力形式をカスタマイズすることができます。
指定できるフォーマットに関してはこちらをご覧ください。
https://git-scm.com/docs/pretty-formats

#### 今回--prettyオプションで使用しているformat

|オプション|内容| 例|
|------------:|:------------|:------------|
|%h       |コミットのハッシュ (短縮版) |1a2s3d4f4c |
|%cd      | コミットした日付(形式は--date=オプションに従う) | 2023-06-14 |
|%cn      | コミットした人の名前 | yamada taro |
|%s       | 件名 |Merge pull request #12345 from qiita/qiita-test
|%d       | 参照名(ref name) |(HEAD -> master)|



## まとめ
一通り調べてみて、今回調べたコマンドの命令内容をざっくり日本語で説明してみると。。。

```config
log --graph --all --date=short --abbrev-commit --pretty=format:'%Cgreen%h %cd %Cblue%cn %Creset%s %Cred%d%Creset'
```

**今までのコミット履歴をブランチやマージの履歴等がわかりやすいようにツリー形式で表示してください。**
**表示情報は、コミットのハッシュ(短縮版)・コミットした日付(時刻はいらない)・コミットした人の名前・件名・参照名で、僕の指定した文字色(黄緑赤)を使ってください**

みたいな感じになります！

これで胸を張ってgit のaliasを使用できそうです！！
(`--abbrev-commit` は --pretty=format で短縮系のハッシュを指定しているので、必要なさそうでした！)
監視におけるFalse Negative(偽陰性)とFalse Positive(偽陽性)について

株式会社インディバースの代表、エンジニアのDAIです。
監視において、「見逃しと誤検知の問題」にちょうど取り掛かっているのですが、
良い資料がネットに見当たらなかったので、社内共有用もかねてのメモです。

## TL;DR

- 監視において、エラーの見逃しと誤検知を放っておくと, プロダクションのコードに対してのバグ混入率が増える
- その結果、サービスの信頼性が落ち、サービス自体の運営が厳しくなる
- 監視における見逃しと誤検知の問題に対して、どういう対処をすべきかについて解説します

## 見逃しと誤検知

- 見逃し = False Negative = 偽陰性
- 誤検知 = False Positive = 偽陽性

##  監視におけるFalse Negativeとは

- 仕様が間違っているものに対して、監視ではokを出してしまっている状態
- つまり、「エラーを見逃している状態」

## 緊急地震速報に例えると

- 大きめの地震が起こっていたのに-> 何か問題が起こった時に
- 緊急地震速報がならず、地震が来たことに気づかない -> 気付かないので
- 津波が来ているのに、逃げ遅れる -> 対応できない

## False Negativeの例

- データのインポート処理のロジックをスケジューラーで動かしていた。データがインポートされていると思っていたが、静かにジョブが死んでいた。
- その結果エラーは通知されておらず、プロダクションのコードに影響が起こっていたことに気づかなかった
- 結果、顧客の環境で重大なエラーが起こっていた

## 監視におけるFalse Negativeが多い開発組織では何が起きるか

- クリティカルなエラーが起こっていても、誰も気づけない
- その結果プロダクションのコードに重大なエラーが入る
- その結果顧客が解約する
- サービスの存続ができなくなる

## False Negativeに対する対応方針

- エラーの握りつぶしを極力止めるようにして、エラーが発生したらちゃんとraiseされるようにする

```ruby
# NG
def Parent

end

def Child < Parent
   def execute 
   
   # NG 雑に全てのエラーを握りつぶすと、予想外のエラーが通知されない
   rescue StandardError => e
      Rails.logger.debug(e)
   end
end

# GOOD

def Parent

end

def Child < Parent
   def execute 
   
   # OK 想定されるエラーのみrescueして対応する
   # それ以外のエラーはちゃんとraiseされるようにする
   rescue ArgumentError => e
      # 引数間違っていた時の対応処理
   end
end
```

- 親クラスで、キャッチできなかったエラーは全部拾って、監視システムに投げられる体制にする(raiseされたエラーが監視システムへ飛ばされる状態を作る


```ruby
# NG

def Parent

end

def Child < Parent
   def execute 

   # NG 
   # 想定されないエラーが起こった時に、エラーが監視システムに通知されない   
   rescue ArgumentError => e
      # 引数間違っていた時の対応処理
   end
end
```

```ruby
# NG

def Parent

end

def Child < Parent
   def execute 

   rescue ArgumentError => e
      # 引数間違っていた時の対応処理

   # NG 
   # 子クラスで実装すると、毎回エラーをraiseする処理作らないといけないので面倒くさい
   rescue StandardError => e
      Sentry.capture_exception(e) if Rails.env.production?
   end
end
```

```ruby
# OK

def Parent
   # 親クラスで子クラスの拾いきれなかったエラーはまとめて監視システムへ通知する ※Sentryは監視ツール
   rescue_from StandardError => notify_error_to_sentry(e)

   def notify_error_to_sentry(e)
      Sentry.capture_exception(e) if Rails.env.production?
   end
end

def Child < Parent
   def execute 

   rescue ArgumentError => e
      # 引数間違っていた時の対応処理
   end
end
```

## False Positive(偽陽性）とは

- 仕様は合っているのに、監視ではNGを出している状態
- 間違っていない問題に対して、エラーだと認識して誤検知している状態

## 緊急地震速報に例えると

- 全く地震が起こってないのに、緊急地震速報が毎日流れているような状態で、いざ大きい地震が起こった時
- 誤検知だと判断して無視するので　
- 津波が来ているのに逃げ遅れる

## 監視におけるFalse Positiveの例

- 外部サービスにスクレイピングしてCSVを取得するスクリプトで、csvが存在しない場合はcsvをダウンロードしないのだが、その仕様を想定せずSeleniumでdom指定した結果、エラーがraiseされた
- CSVが存在しないときにダウンロードできないというビジネス的な仕様としては正しいが、エラーがraiseされ続けている状態になる

## 監視におけるFalse Positiveを放っておくと

- エラーが毎日通知される
- その結果、他の重要なエラー通知を見逃す
- 重要なエラーが出ているのに、気づけないため、プロダクションコードにクリティカルなエラーが混入する

## 監視におけるFalse Positiveに対する対応方針

- 既にアラートが出ているエラーに対するエラーハンドリング、もしくは修正を行い、新規のエラーがない状態にする
- 即時での修正が難しい場合、最低限起票しておいて、対応方針を決めておく

## 最後に

Railsエンジニアを採用中です！
Wantedlyからカジュアル面談よろしくお願いします！

https://www.wantedly.com/companies/company_3324552
コントローラの共通化(concerns)

## はじめに
ポートフォリオや簡単なアプリだと共通するコントローラの処理は、 `Application .controller.rb` などにまとめてしまうのが楽だと思います。しかし、規模が大きくなり、共通する処理全てを `Application .controller.rb`に記述してしまうと、誰も読みたくなくなるcontrollerが完成です。
今回は `controllers/concerns` というディレクトリに処理をまとめる機会があったので、自分のメモ用として、書き残したいと思います。

## 前提
今回は、company, company_userという2つのモデルが存在し、それぞれのコントローラ( `companies_controller.rb`, `company_users_controller.rb`)で全く同じ「create」アクションを使用しているという設定で書きます。
```ruby:companies_controller.rb
class CompaniesController < ApplicationController
 
 def create
   #共通化した処理
 end

end
```
```ruby:company_users_controller.rb
class CompanyUsersController < ApplicationController
    
 def create
  #共通化した処理
 end

end
```

## concernsの作成 
`controllers/`配下に`concerns`というディレクトリを作成します。（既にある場合は、作成する必要はありません。）
そのconcernsのディレクトリ内に共通化するコントローラのフォルダを作成します。今回は、`common_create_actions.rb`とします。実際に共通する中身を書いていく際に、注意する点がいくつかあります。それは、①moduleで宣言すること、②extendすることです。
```ruby:common_create_actions.rb
# ①moduleで宣言する (ファイル名と一致させる）
module CommonCreateActions
  # ②絶対に必要
  extend ActiveSupport::Concern

  def create
    #省略
  end

end
```

## これで完成！...ではない！
もちろん外部で作成したファイルなのだから、そのファイルの処理(module)を使わせてください！と宣言(include)しなければならない。使いたい側のファイルで、
```ruby:companies_controller.rb
class CompaniesController < ApplicationController
 include CommonCreateAction   #使わせてください！！(include)
end
```
```ruby:company_users_controller.rb
class CompanyUsersController < ApplicationController
 include CommonCreateAction   #使わせてください！！(include)
end
```

## まとめ（これで呼び出せていたら完成！）
アクションを丸ごとconcernsにということはあまりないと思いますが、今回はたまたまあったので、まとめました。
本来ならactionの一部をconcernsで処理！のように使うことが多いと思いますが、まだまだ共通化しているところを見抜くのが得意ではないので、しっかり使いこなせるようにしていきたいです！
VSCodeのカラーピッカーが機能しない

# はじめに
プログラミング学習中の[@kat_log](https://twitter.com/kat__log "Twitter")と申します。

VSCodeでカラーコードなど色を入力した際に表示されるカラーピッカーが表示されない問題が発生していたのですが、解決したため共有です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1455073/1011637a-ec89-76a5-63bc-057b851ef386.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1455073/e6bb1b7a-8490-5013-62e2-2b85ce13ffb7.png)

# 結論
**PostCSS Language Support**という拡張機能を無効化すると解決しました!

https://marketplace.visualstudio.com/items?itemName=csstools.postcss

:::note warn
2020年から更新されていないようで、レビューにも同じ症状が報告されており、無効化というかアンインストールで良さそうです
:::

# 治らない場合
- VSCodeの設定にて`"editor.colorDecorators": true`になっているか確認する
  - 参考: https://localhost8888.net/visual-studio-code/170/ 
- 他の拡張機能の影響
- VSCodeのアンインストール＆再インストール
などが考えられます…🙇

# おまけ
VSCodeの挙動がおかしい時、今回のような拡張機能の影響が考えられるのですが、
「一時的に全ての拡張機能をオフ」にしてVSCodeを起動するコマンドのご紹介です

`code --disable-extensions`

(PCにシェルコマンドのパスを通す必要があります!)

https://qiita.com/kat_log/items/81f0aecf5522e44e99dc

# おわりに
お読みいただきありがとうございました!
どなたかの参考になれば嬉しいです。
Windows10の起動時に自動的にアプリを実行する方法

# はじめに
Windows10を立ち上げたときに予定表やメーラーなどを必ず開くのでその設定の備忘録。

# 方法
Windowsロゴキー＋Rを押し，「shell:startup」と入力しOK
C:...\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startupが開かれる
ここに立ち上げたいアプリのショートカットをペースト

# 参考文献
https://support.microsoft.com/ja-jp/windows/windows-10-%E3%81%AE%E8%B5%B7%E5%8B%95%E6%99%82%E3%81%AB%E8%87%AA%E5%8B%95%E7%9A%84%E3%81%AB%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B%E3%82%A2%E3%83%97%E3%83%AA%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B-150da165-dcd9-7230-517b-cf3c295d89dd
Ubuntu20.04でPython3.9→3.10のアップデートに失敗する

## TL;DR

* `sudo add-apt-repository ppa:deadsnakes/ppa`が`ModuleNotFoundError: No module named 'apt_pkg'`で失敗する人は`/usr/bin/python`, `/usr/bin/python3`のシンボリックリンクを書き換えていないか、`alias`を張っていないか確認、元に戻すことで解決するかも

## 現象の前提

* `Ubuntu20.04` on `Windows10/WSL2`
* `python3.8`→`3.9`へのアップデート済み

```
# sudo apt update
# sudo apt install python3.9
```

## 現象

`3.9`→`3.10`にしようとしてリポジトリを追加しようとすると以下のエラーが発生

```
# sudo add-apt-repository ppa:deadsnakes/ppa
Traceback (most recent call last):
  File "/usr/bin/add-apt-repository", line 12, in <module>
    from softwareproperties.SoftwareProperties import SoftwareProperties, shortcut_handler
  File "/usr/lib/python3/dist-packages/softwareproperties/SoftwareProperties.py", line 28, in <module>
    import apt_pkg
ModuleNotFoundError: No module named 'apt_pkg'
```

原因は簡単で、`python3.9`にしたときに、`python`だけで起動してほしくて

```
$ sudo rm /usr/bin/python3
$ ln -s /usr/bin/python3.9 /usr/bin/python3
```

と勝手にシンボリックリンクを書き直していたからです。`add-apt-repository`が参照している`python3`の向き先が変わってしまいました。

`/usr/bin/*`はよほどのことがなければいじるな、という当たり前の原因でした。`alias python /usr/bin/python3.9`のような設定をしている人も同様の現象が起こるかもです。

シンボリックリンクを

```
$ sudo rm /usr/bin/python3
$ ln -s /usr/bin/python3.8 /usr/bin/python3
```

と戻してやると再現しなくなりました。その後、

```
$ sudo add-apt-repository ppa:deadsnakes/ppa
$ sudo apt install python3.10
```

でインストール完了。

## （番外編）venvの作成に失敗する

以下のようになった。

```
$ python -m venv .venv
Error: Command '['/home/canada/work/contec/.venv/bin/python3.10', '-m', 'ensurepip', '--upgrade', '--default-pip']' returned non-zero exit status 1.
```

以下のように`python-3.10-venv`をインストールすれば解決する

```
$ sudo apt install python3.10-venv
```
そのサイトはSSGなのかSSRなのか

# 概要
今ホットなデジタル庁の便乗記事です

https://www.digital.go.jp/

デジタル庁のホームページなのですが確かに爆速です。このサイトがSSGでレンダリングされているのかSSRでレンダリングされているのか気になって調べてみました
SSGか、SSRかの見分け方ってやつです

# 結果
全部のページは見ていないのですが少なくともトップページはSSGっぽいです
ぱっと見ユーザとのインタラクションがリンクしか無さそうなのでSSGかなぁとは思っていたのですが確証に変わりました🎉

# 解説
とりあえず似た質問の調査です

https://stackoverflow.com/questions/72746949/it-is-possible-to-check-if-website-use-ssg-or-ssr

> I have seen two properties related to `SSG and ISR` technique that are `__N_SSG` and `isFallBack`.
For `SSR` I have'nt seen specific properties but if `__N_SSG` and isFallBack were missing , there is a high chance that rendering technique is `SSR`

`__N_SSG`フラグがどうこう言っているのでここに当たりをつけて関連を調べてみますと、公式のissueで質問されていました

https://github.com/vercel/next.js/discussions/12558

かいつまんで言うと、SSGでレンダリングされていることを伝えるためのプライベートなプロパティだからあってるっちゃあってるけど公開している訳じゃないし参照はしないで〜でした

今回の目的はデジタル庁がSSGかどうなのか知れればいいんでなりふり構わずこれを使います

## どこのプロパティで出てくるのか実際にビルドして見てみる
実装は端折りますが、以下のようなコードを書いて`SSG`と`SSR`でビルドして実際に見てみます
Next.jsは13系です
<details>
<summary>コード</summary>

```ssg.tsx
function SSGPage({ data }: any) {
  return (
    <div>
      <h1>{data}</h1>
      <Link href={"/ssr"}>to SSR</Link>
    </div>
  );
};

export async function getStaticProps() {
  const data = "SSG Page";

  return {
    props: {
      data,
    },
  };
}

export default SSGPage;
```

```ssr.tsx
function SSRPage({ data }: any) {
  return (
    <div>
      <h1>{data}</h1>
      <Link href={"/ssg"}>to SSG</Link>
    </div>
  );
};

export async function getServerSideProps() {
  const data = "SSR Page";

  return {
    props: {
      data,
    },
  };
}

export default SSRPage;
```

</details>

SSGとSSRでレンダリングされるコードを書いたので、`next start`して`http://localhost:3000`を確認します

|SSG|SSR|
|-|-|
|![ssgpage.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518001/5000bb3b-4209-3062-1b30-0f6eaf777f7c.png)|![ssrpage.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518001/cb07dac6-7369-5094-bdb0-29403c86d896.png)|

サーバーサイドから返ってきたhtmlファイルを確認すると、赤四角で囲ったところに先ほどの`__N_SSG`プロパティを見つけられました
また、SSRの方も`__N_SSP`(Server Side Props)プロパティを見つけられました

## デジタル庁でいざ確認
![QuickTime movie.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518001/80bb56ec-3546-c798-6da2-d2b76c5e0665.gif)

ちっちゃくてすみません。。。
先ほどと同じpropsを渡していそうなところの行に同じ`__N_SSG: true`を見つけましたので、SSGなのではと思います

# おまけ
[公式リポジトリ](https://github.com/vercel/next.js)で如何にもここら辺の制御してるだろうなって箇所見つけたので共有
https://github.com/vercel/next.js/blob/831f58a70ca7b3fb5648398db3a1162f2a4151f9/packages/next-swc/crates/next-transform-strip-page-exports/src/lib.rs#L42-L51%EF%BC%89
大文字、小文字、大文字小文字変換

文字列の大文字、小文字、大文字・小文字反転プログラムを***ruby***
で実装しました


```Ruby
# 文字列の大文字、小文字、反転
# 2023/6/22 Create

str = "Nogizaka46"
ans = ""

# 出力関数
def output(msg)
  puts msg
end

ans = str.downcase
output(ans)

ans = str.upcase
output(ans)

ans = str.swapcase
output(ans)
```

出力結果はこちらです

![ans1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1055346/f0375b63-47e3-0d8c-e574-fce85f08243f.jpeg)
VirtualBox + Windows Server

# イメージファイルの入手
[Windows Server 2019 | Microsoft Evaluation Center](https://www.microsoft.com/ja-jp/evalcenter/download-windows-server-2019)からイメージファイルをダウンロード
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2846175/97a6f3d6-722b-4847-4577-1d35a65aaab7.png)
# 仮想マシンの設定
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2846175/e5ba35b7-f47a-99ae-8a8d-86ee5da7798e.png)
| 項目 | 値 |
|:-|:-|
| 名前  | 任意(ここではwindows server Datacenter)  |
| Folder  | デフォルト  |
| ISO Image  | 未選択  |
| Edition  | 未選択  |
| タイプ  | Microsoft Windows  |
| バージョン  | Other Windows (64-bit)  |

上記の状態で次へ
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2846175/acdc0fcf-6cc3-012c-6d3f-f89f9c6b308e.png)
メモリの設定
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2846175/8d204ee9-9296-01d5-f8f4-30fc2fa2a3dc.png)
ストレージの設定
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2846175/0b492d29-35ff-9602-2a8d-1046eea0cfbe.png)
確認画面
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2846175/312b4265-3490-c83c-c791-09480327fa03.png)
設定が完了したら起動
![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2846175/37af9a4a-e53d-a0de-464a-3f8ef966c5ec.png)
起動後にイメージファイルを選択します。
![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2846175/bf353bd4-af92-e476-d100-b79b61119949.png)
待機しているとインストールの設定画面が表示されます。

---後で追加---
安全なウェブサイトの作り方に学ぶセッション管理

「安全なウェブサイトの作り方」 1.4セッション管理のまとめと補足。
セッションIDにまつわるセキュリティ問題の概観や復習にどうぞ。

https://www.ipa.go.jp/security/vuln/websecurity/ug65p900000196e2-att/000017316.pdf

# 前提

## セッションとは

ステートレスなHTTP通信を基礎とするウェブアプリケーションにおいて、ユーザーとアプリケーションとのやり取りを補完するための仕組み。

## セッションIDとは

ユーザーがログインを行うと、サーバーはセッションIDを発行し、ユーザーとセッションIDを紐付けて記憶する。
また、ログインに対するレスポンスとしてセッションIDを返し、通常はユーザーのブラウザのCookieに保管される。

次にそのユーザーがサーバーに対して別のリクエストを行った際、セッションIDが一緒にサーバーに送信される。
そうすることで、サーバーはセッションIDからどのユーザーなのかを識別することができる。

つまり、セッションIDを用いることで毎度ログインせずにサーバーとのやり取りを行うことができるようになる。

## セッションIDとセキュリティ

サーバーは「セッションIDが`abcde`の人は、ユーザーID`12345`の人だ」という紐付けをしているので、
セッションIDが第三者に盗まれるとなりすましができることになる。

セッションIDが盗まれることを`セッションハイジャック`と呼ぶ。
これを防ぎましょうというのが本題。

# セッション・ハイジャックの手口

防ぐためには相手の手口を知ることから。

## 手口1 : セッションIDの推測

セッションIDが連番や一定の規則をもとに作成されるようになっている場合は容易に推測が可能。

例えば、自分で2つアカウントを作成し、1つ目のセッションIDが`12345`、２つ目が`12346`であれば、`12344`の人も`12347`の人もいるはずだ、という推測が立つ。

## 手口2 : セッションIDの盗用

暗号化されていない通信（HTTPS化されていないサイトや、暗号化されていない公衆無線LANでの通信）が傍受されたり、
またXSSなどによってセッションIDが盗まれる危険性がある。

## 手口3 : セッションIDが固定されていることを利用する

:::note warn
安全なウェブサイトの作り方では「セッションIDの固定化」というタイトルで紹介されているが、個人的には「ウェブアプリケーション側がセッションIDを固定化していることを逆手に取った手口」という言い方の方が理解しやすいと思っているので上記のように言い換えている。
:::

具体的な手口としては下記のようになる。

1. 犯人はまず自分でウェブアプリケーションにログインし、自分のセッションIDを得る。
1. 何らかの方法(後述)で、第三者（Aさん）に自分のセッションIDを用いてログインするように仕向ける。
1. 第三者(Aさん)はそのセッションIDを用いてログインする。
1. サーバー側は、「このセッションIDは今ログインしたAさんが送ってきたんだからAさんのものなんだね〜」と認識する。
1. セッションIDを知っている犯人は、Aさんになりすますことに成功。

3のログインした時点で新しいセッションIDを発行していればこの攻撃は成立しないが、固定してしまっているために発生する。

### 何らかの方法とは？

1. URLにセッションIDを埋め込んだリンクを踏ませる
    - セッションIDがURLのパラメータとして管理されている場合、`http://example.com/login?sessionid=ABC`といったリンクを踏ませることで可能。
1. XSS
    - セッションIDがCookieで管理されている場合、`<script>document.cookie="sessionid=ABC"; </script>`といったスクリプトを埋め込んでそれを第三者のブラウザで実行させることで可能。
1. HTTPヘッダインジェクション
    - 同じくセッションIDがCookieで管理されている場合、Set-Cookieヘッダを挿入することで利用者にCookieを強制することが可能。

※ セッション固定化攻撃については下記のサイトを参考にさせていただいてます。

https://www.ubsecure.jp/blog/session_fixation


# 対策

## セッションIDを推測困難なものにする

規則的に生成するのではなく、ランダムに生成されるよう予測できないようにしましょう。
また、フレームワークやライブラリがセッション管理の機能を提供しているのであればそれに則るようにしましょう。

## セッションIDをURLパラメータに指定しない

ブラウザのReferer送信機能によってセッションIDがついたURLが送信されてしまうことがある。

セッションIDはCookieかhiddenパラメータに保存しよう。
(hiddenパラメータは書き換え可能なので個人的にはCookieがベターと思う)

なお、phpのsession.use_trans_sid = 1のようにCookieが無効化されている場合自動的にURLパラメータにセッションIDを含める機能もあるが非推奨である。

## Cookieにsecure属性を加える

secure属性を加えるとHTTPS通信でしかCookieを利用できなくなる。
HTTP通信だと盗聴の可能性があるので、必ずsecure属性を加えましょう。

また、Ruby on Railsの`config.force_ssl = true`などのようにSSL通信を強制させ、暗号化されていない無線LANでのアクセスなどを禁止し盗聴対策することができるでのこちらもやっておきましょう。

## ログイン成功後に新しいセッションIDを発行しよう

固定化攻撃を防ぐため、ユーザーごとに固定のセッションIDを持つのはやめ、
ログインの度にセッションIDを新規発行し、既存のセッションIDは無効になるようにしましょう。

## Cookieに有効期限を設定しましょう

有効期限が長いほど盗まれる可能性は上がります。適切な期間を設定しましょう。

## XSS対策

ユーザーからの入力値をサニタイジングするなど、基本的なXSS対策を行いましょう。
PS-Edge(PowerShell+WebView2+WPF)用の基本ファイルセット

github にダウンロードして初期設定用のバッチを実行するだけで、
PowerShell+WebView2 を実行できるファイル群をアップロードしました。

* tkmry/PS-Edge_StarterKit
  https://github.com/tkmry/PS-Edge_StarterKit

# ■ 環境
下記環境にて動作を確認しています。

* Windows 10 Pro 21H2
* Windows 11 Home 21H2


# ■ 使い方

リポジトリ先から [Code]->[Download Zip] でファイルをダウンロードする。
展開後下記のファイルを順次実行する。

```bat:
init.bat
boot.bat
```

* init.bat
  PowerShell が WebView2 を実行するためにライブラリを取得し適切な場所(スクリプトフォルダのlibフォルダ)に配置します。
* boot.bat
  `PS-Edge_Default.ps1` を Window 非表示で起動します。

なお Windows 11 では標準コンソールを Windows Terminal に変更すると、
Window 非表示に対応していないため、少し邪魔かもしれません。

# ■ ファイル概要

```:PS-Edge_StarterKit
+ boot.bat  …  PS-Edge 起動用バッチファイル
+ init.bat  …  WebView2ライブラリ取得バッチ
+ LICENSE  …  MIT LICENSE
+ page01.html  …  WebView2 で初期に表示するページ
+ PS-Edge_Default.ps1  …  本体ファイル
+ README.md  …  Github でリポジトリトップで記載する内容
+ ui01.xaml  …  PowerShell による WPF で画面を構築する用の XAML ファイル
+ ilb  …  WebView2 ライブラリ(dll)の格納先。init.batで取得可能
+ data  …  WebView2 クライアントのデータ管理場所
```

# ■ 起動サンプル画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124578/219d09a8-bd44-d5bc-f5a6-3ed03cb2c3ec.png)

# ■ コード内の重要なポイント

他の記事にも記載している部分もあるため、ご存知の範囲については読み飛ばしてください。

## ◇ 1. WebView2 の DLL 読み込み
```powershell
[void][reflection.assembly]::LoadFile($libWebView2Wpf)
[void][reflection.assembly]::LoadFile($libWebView2Core)
```
DLL の読み込みは Add-Type ではなく reflection.assembly の LoadFile を利用する。

## ◇ 2. XAML による Window 構築
```powershell
[xml]$xaml  = (Get-Content (Join-Path $PSScriptRoot "ui01.xaml"))
$nodeReader = (New-Object System.XML.XmlNodeReader $xaml)
$window     = [Windows.Markup.XamlReader]::Load($nodeReader)
```
Window や WebView2 の埋め込み(レイアウト)は XAML にて作成する。

## ◇ 3. PowrShell <-> WebView2 のメッセージング処理
```powershell: PS-Edge_Default.ps1 (PowerShell側)
# メッセージの送信
$window.add_LocationChanged({
    param($event)
    $webview.CoreWebView2.PostWebMessageAsJson((@{xPos=$event.Left; yPos=$event.Top} | ConvertTo-Json))  # JSON データ用サンプル行
})

# メッセージの受信
$webview.add_WebMessageReceived({
    param($webview, $message)
    $json = ($message.WebMessageAsJson | ConvertFrom-Json)
    $window.Title = $json.PageTitle
})
```
PowerShell からメッセージ送信する際には JSON データ形式ではなく文字列形式で送信している。JSON 形式で送信する場合は `PostWebMessageAsJSON` を利用する。

```javascript:page01.html (JavaScript側)
# メッセージ送信側
document.querySelector('#submitTitle').addEventListener('click', () => {
  window.chrome.webview.postMessage({PageTitle: document.querySelector('#inputTitle').value});
});

# メッセージ受信側
window.chrome.webview.addEventListener('message', function(event) {
  document.querySelector('#xPos').innerText = event.data.xPos;
  document.querySelector('#yPos').innerText = event.data.yPos;
});
```
メッセージングについて JavaScript 側のイベントリスナは受信データが `event.data` に格納されている。
メッセージの受信は設定した関数のみ起動されメッセージの送信側では受信側の関数を選べないので、複雑な処理を行う場合は data の中に目印用の値を入れて分岐するのが良さそうです。

# ■ おわりに
11か月前(2022年7月ごろ？)に下書きに入れていたようですが、公開するのを忘れていました。
今でも動作する事を確認し、個人的にも便利だったので記事として公開いたします。
ESP32のTXDは弱い

# TL;DR
- ESP32-WROOM-32EのTXDピンは駆動能力に劣る
- UART使うなら別のピンを指定するとトラブルを避けられる

# GPIO1として
SSD1306なOLEDディスプレイの電源を物理的な位置の関係からTX==GPIO1から取った
まともな動作が困難な程度には電流不足
別のピンを使うことで解決した

https://twitter.com/mcbeeringi/status/1637474601356890119?s=61


# UARTのTXとして
Ender3に[ESP3D](http://esp3d.io)を導入した時の話

ESP3DはESP32/8266のファームウェア
これを導入するとほぼ全ての3DプリンタをWiFiから制御できるようになる
プリンタ本体のファームウェアの書き換えは必要ない
cpuに繋がるUARTを引き出してESPに繋げて半ば乗っ取るような形で通信させる
(USB OTG付きのESP32ならUSBにさすだけで済むので引き出す必要ない?)


マザーボードv4.2.2のcpu(gd32f303)とUSBシリアル(ch340g)の間からUARTの線を引き出してESP32に繋げた

https://twitter.com/mcbeeringi/status/1671276140743528448?s=61

ESP32は正常に動いているがプリンタは完全にESP32を無視
コマンドを送っても反応がない

- 引き出した線がダメなのでは
→手持ちのシリアル変換と引き出した線で操作できる事を確認

https://twitter.com/mcbeeringi/status/1671493661518106624?s=61

- ESP32のピンが死んでいるのでは
→別の板に変えても動かなかった
→pcでコンソールを見るとちゃんとコマンド吐いてる
→書き込みができるのでそんなはずがない

ESP32とPCが繋がっている状態に引き出した線を繋ぐとPCからもESP32の吐くコマンドが見えなくなった
電流不足を疑ってお城を繋げた

https://twitter.com/mcbeeringi/status/1671564656241152000?s=61

TXはプルアップされているもの
他の機器の通信に割り込んで乗っ取るには、乗っ取られる側のTXのプルアップをも処理できる駆動能力が必要

別のピン(0)を使うことで解決した

# どうして
データシートの最後の方に表IO_MUXがある

https://www.espressif.com/sites/default/files/documentation/esp32_datasheet_en.pdf#page64

esp32にはpower domainという概念がある

power domainは3つあり
全てのピンはいずれか1つのpower domainに繋がれていて
同じpower domainに繋がれているピンは電流を共有している模様

問題のTXピンはVDD_3P3_CPUに繋がっていて
これが原因なのかそうでないのかは確かめていないので分からない

HIGHが40mAに対してLOWは28mAと書いてあるが絶対うそ

何か分かったら追記します
全数調査と標本調査

# 全数調査と標本調査

全数調査:調査対象全体(＝母集団)を調査する方法。調査の精度が高いが、多大な労力がかかる。
標本調査:調査対象全体から一部を取り出した部分集合(＝標本)を調査する方法。調査の精度は下がるが、労力が下がる。

何かの統計調査を行う際、全数調査の労力が大きい場合に、標本調査が威力を発揮する。
標本調査では、標本が母集団のなるべく正しい縮図(＝忠実に再現された模型)になっていなければならない。
すなわち、標本に属する要素が特別なものに偏らないように選ぶ必要がある。
標本に属する要素が特別なものに偏らないように選ぶ方法として「無作為抽出」がある。

無作為抽出:母集団の各要素を等しい確率で抽出し、それを標本とする抽出方法。

復元抽出と非復元抽出

復元抽出:毎回元に戻しながら次のものを一個ずつ取り出す、非破壊的な抽出方法。
非復元抽出:取り出したものを元に戻さずそのまま続けて取り出す、破壊的な抽出方法。

大きさ$N$の母集団を考える。
ある変量$x$が全部で$m$種類の異なる値$x_1, x_2, \dots, x_m$を取り、
各値を持つ要素数をそれぞれ、$f_1, f_2, \dots, f_m$とする。
すなわち、$f_1 + f_2 + \dots + f_m = N$が成り立つ。
この母集団からの無作為な選択、及び無作為抽出を考えるとき、その確率分布は以下のようになるはずである。

@@@表を挿入@@@

変量$x$に対応する確率変数を$X$とすると、$X$の確率分布、平均、分散をそれぞれ母集団分布、母平均、母分散と呼ぶ。

ここで、この母集団から大きさ$n$の標本を無作為抽出することを考える。
我々の目標は、母集団の特徴をできるだけ忠実に反映した縮小模型を作ることである。

非復元抽出によって標本を作ることを考える。
非復元抽出は要素を取り出す度に少しずつ母集団を変形させるので、
毎回少しずつ異なる母集団から無作為抽出する事になる。
すなわち、母集団から$n$回非復元的に取り出すことを考えると、その度に変形しゆく$n$種類の母集団$S,S’,\dots$から無作為抽出することになる。
対して復元抽出の場合は、毎回全く同じ母集団$S$から大きさ1の標本を無作為に抽出するという試行を$n$回繰り返すことになる。
より母集団に近い標本を得る、という目的に適った方法は、復元抽出と思われる。
したがって、復元抽出によって大きさ$n$の標本を抽出したとき、
標本の各要素の変量$x$について、その確率変数を$X_1,X_2,\dots,X_n$とすると、
「$X_1,X_2,\dots,X_n$は、それぞれが母集団分布に従う互いに独立な確率変数である」と言える。

ただし、作りたい標本の大きさ$n$に対して母集団の大きさ$N$が十分大きい場合、
非復元的に取り出したとしても、母集団の変形の度合いが小さいため、近似的に同じ1つの母集団$S$から無作為抽出していると見なすことができ、
復元抽出との差が小さくなる。よって非復元抽出でも精度の良い標本を作ることができる。
コード自動生成アプリGPT-Engineer 動かしてみる

本日このようなツイートを見つけて衝撃が走りました。

https://twitter.com/rowancheung/status/1670829363137499137?s=20

最終目標のPromptを入れたらそのコードの全体像を生成してくれるGPT-Engineerというアプリのようです。

Tutorialも公開されていたので実際に触ってみました。参考にしたサイトの通りにやるとすこし詰まったため、まとめを残しておきます、参考になれば幸いです。

# 手順

## 参考サイト

手順はここを参考にしてます。

https://semicolon.dev/gpt4/how-to-install-gpt-engineer-pc

## 1. リポジトリをクローン

こちらの本家のサイトからリポジトリをクローンしてきます。

https://github.com/AntonOsika/gpt-engineer/tree/main

```bash
git clone https://github.com/Anton0sika/gpt-engineer.git
```

## 2. 必要なライブラリのインストール

cloneしたリポジトリに移動し、必要なライブラリのインストールを行います。

```bash
cd gpt-engineer
pip install -r requirements.txt
```

## 3. APIのKeyを登録する

**For Windows (Command Prompt):**

```bash
set OPENAI_API_KEY=OpenAI-GPT-4-API-key
```

**For Windows (PowerShell):**

```bash
$env:OPENAI_API_KEY="OpenAI-GPT-4-API-key"
```

**For Linux/macOS:**

```bash
export OPENAI_API_KEY=OpenAI-GPT-4-API-key
```

## 4. main_promptの内容を変更する

`gpt-engineer/projects/example`

の中にmain_promptがありこの中のPromptを変更します。

初期のものではシンプルすぎるのである程度変更を行います。

今回は、Snake Gameを作成してもらいます。

```bash
We  are writing snake in python. MVC components split in separate files. Keyboard control.Make food pellet orange. Always have 2 food pellets on the screen at any time. Make pellets move, by changing position every 5 seconds in any of the 8 directions, by 1 cell. Make the game grid 50 by 50 cells. Display score in upper right corner. Snake eating 1 pellet adds 100 to the score.
```

## 5. コードの生成

```bash
//gpt-engineerの階層まで移動

python -m gpt_engineer.main example
```

これを実行することで、コードの生成が始まります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3352230/8b40128b-8a77-af4c-219b-c476038ae990.png)


実行してしばらく経つと、Promptにおいて、不明瞭な点について質問がされるため、答えてあげてください。

具体的には、操作方法やルールについて問われます。

その後以下のような生成が始まります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3352230/3637e26f-6b29-b9f3-ccee-01b91cc323b3.png)

アプリ設計の概要を書いてます。

また、必要なライブラリをインストールするための、requirements.txtを生成し、ゲームのコードを作ってくれます。

最終的に、requirements.txtを勝手にインストールしてくれて、アプリを起動してくれます。


![ezgif.com-video-to-gif (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3352230/bb7ed26e-94e5-ef4d-163e-aa8b51b16d6e.gif)


実際に、操作できて遊べるゲームができました。

生成物は、projects/example/workspaceの中に生成されます。

run.sh を起動すると再度アプリを起動できます。

## まとめ

正直ビビりました。でも、対話でPromptを洗練させていき、共通認識を高めていけば一瞬でこのレベルのものが作れるのは少し心躍るものがありますね。もっと使っていこうと思います。面白い使い方があったら教えてください！


いいね、ブックマーク、フォローしていただけると勉強の励みになりますので是非お願いします。😉

追伸　--
Twitterで日々の学習風景を投稿してます。

@Ren_yello
SonarQubeでPHPの解析を始めるとき最初に読む資料

# 1.概念、設計思想、用語を理解する
## concepts（公式ドキュメント）
https://docs.sonarsource.com/sonarqube/latest/user-guide/concepts/

公式ドキュメント内の主要な用語、概念のリスト。（約10分）

### conceptsに対する補足、注釈
- 資料中、Analyzerに該当する製品がSonarScanner。
- 資料中、Serverに該当する製品がSonarQube。


## SonarQubeの静的解析を構成する概念について
https://qiita.com/gunso/items/503c938070f61198872a

主要概念の関係、管理画面を見るときに理解の助けとなる要約的な資料。（約10分）

## JTF2021 D12 『SonarQube をより有効活用する』
https://www.youtube.com/watch?v=h636shlPPtM

SonarQubeが生まれた背景、どう活かしていくか、についての発表（約20分）

## まとめ
- Rule、Issue、QualityProfileの関係について理解する
- Issueの種類と重要度を把握する
- 開発者全員が品質意識を持ち、開発プロセスの中に品質チェックを組み込む


# 2.実際に使ってみる

## Try out SonarQube（公式ドキュメント）
https://docs.sonarsource.com/sonarqube/latest/try-out-sonarqube/

## Try out SonarQubeに関する補足
- 手元にDocker環境がある場合、Dockerが楽。
- この資料で説明されているのはSonarQube（ConceptsにおけるServer）のみである点に注意。
- conceptsの項目で説明されている通り、解析はAnalyzerにあたるSonarScannerが行うので、解析を行う環境に別途インストールが必要（後述）
- 実際の運用では共用サーバーにSonarQubeを建てる方がよい
- CommunityEditionでは、解析対象のブランチが1つしか選べない
 
## SonarScanner（公式ドキュメント）
https://docs.sonarsource.com/sonarqube/latest/analyzing-source-code/scanners/sonarscanner/




# 3.プロジェクトにあわせて設定のカスタマイズを行う
## Analysis parameters（公式ドキュメント）
https://docs.sonarqube.org/latest/analyzing-source-code/analysis-parameters/

解析パラメータについて。特に、資料中のSettingHierarchyはよく理解しておくこと。

### 補足
- 解析パラメータは4箇所で設定できるが、このうちProject analysis parametersが扱いやすそう。
※sonar-project.properties というファイルの形でリポジトリ管理できるため
- 特定のIssueを無効化するなどの微調整を行う際にも利用する（後述）

## PHP test coverage（SonarQube公式ドキュメント）
https://docs.sonarqube.org/latest/analyzing-source-code/test-coverage/php-test-coverage/

PHPのテストカバレッジについて。
SonarQubeはカバレッジレポート生成機能を持たないため、サードパーティ製のパッケージ（ほとんどの場合PHPUnit？）が生成したカバレッジレポートをインポートして、SonarQube上で利用する。

## The XML Configuration File（PHPUnit公式ドキュメント）
https://docs.phpunit.de/en/9.6/configuration.html#the-report-element

- phpunitが出力するカバレッジレポートをSonarQubeにインポートする際、phpunit側の設定としてxml出力を定義しておくと楽。
 
```phpunit.xml
    <!-- 例 -->
    <coverage processUncoveredFiles="true">
        <include>
            <directory suffix=".php">./app</directory>
        </include>
        <report>
            <clover outputFile="clover.xml"/>
        </report>
    </coverage>
``` 


## Importing third-party issues（公式ドキュメント）
https://docs.sonarsource.com/sonarqube/latest/analyzing-source-code/importing-external-issues/importing-third-party-issues/

Issueのインポートについて。PHPStanが出力する形式に標準対応している。


> Comma-delimited list of paths to PHPStan reports. Reports should be generated in the PHPStan JSON Output Format (use the PHPStan analyse command with the option --error-format=json).

## Importing issues from SARIF reports（公式ドキュメント）
https://docs.sonarsource.com/sonarqube/latest/analyzing-source-code/importing-external-issues/importing-issues-from-sarif-reports/

- 既にSonarQube以外のツールを使って解析をやっている場合、それらの解析結果をSonarQube上のIssueとして取り込みたい場合があるかもしれない。SARIF形式での出力をサポートしているツール、パッケージであればSonarQubeにインポート可能。(※phpstanの結果インポートはSonarCube側でインポートがサポートされている)
- 2023-06-20調査した範囲では、対応状況は以下。
PHPMD 〇
PHPCS ☓
【Mac】コマンドでフォルダを統合する方法

## フォルダを統合する方法

次のコマンドを実行するとフォルダを統合できます。

```terminal
ditto 統合するフォルダ... 統合先フォルダ
```

以下のように実行すると`sample`フォルダの内容が`example`フォルダに統合されます。

```terminal
ditto sample example
```

同名のファイルが存在する場合には、`sample`フォルダ内のもので上書きされます。

複数のフォルダを統合することもできます。

```terminal
ditto sample1 sample2 example
```

上記のように実行すると`sample1`と`sample2`が`example`に統合されます。
同名のファイルが存在する場合には最後に記述したフォルダ内のもので上書きされます。

`-V`オプションをつけるとCopyのログを表示できます。

```terminal
diito -V 統合するフォルダ... 統合先フォルダ
```
【Xcode】コードを折りたたむ方法

# はじめに
コードが長くなると、見にくくなってしまうことがあります。そんなときは、コードを折りたたむことで見やすくできます。この記事では、Xcodeでコードを折りたたむ方法を紹介します。

# 手順
## 設定を開く
ショートカットキー`command + ,`で設定を開きます。

## 設定を変更する
`Text Editing` > `Folding`の`Code folding ribbon`をチェックします。

![スクリーンショット 2023-06-21 23.50.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366249/f3001889-32dd-eb8e-00da-07a38f56b95a.png)

## コードを折りたたむ
コードの左側のバーをクリックすると、コードを折り畳めます。
![スクリーンショット 2023-06-22 0.05.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366249/dc95c936-c499-7f71-3ab5-8dc8db4030e5.png)


# おわりに
快適にコーディングできるようになっているはずです。SwiftUIとの相性も良いと思います。
Ansibleのmountモジュールを使ってEFSをマウントしてみた

検証環境
---
コントロールノード・・・RHバージョン8.6にインストールしたansible 2.9.25を使っています
ターゲットノード　・・・RHバージョン8.6

検証内容
---
マウントポイントを作成し、以下内容でEFSをマウントする

|マウントポイント|マウントデバイス|fsの種類|マウントオプション|
|---|---|---|---|
|/home/ec2-user/efs_mount|EFS |nfs4|4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport,_netdev|


playbook
---
|オプション|説明|
|---|---|
|*path|マウントポイントのパス|
|src|pathにマウントするデバイス|
|fstype|fsの種類|
|opts|マウントオプション|
|*state|mounted・・・デバイスをマウントし、fstabを変更する<br>unmounted ・・・fstabを変更せずにデバイスをアンマウントする|

※は必須項目

```
- name: create efs mount point
  file: 
   dest: "/home/ec2-user/efs_mount"
   state: directory

- name: mount efs volume
  mount:
   path: "/home/ec2-user/efs_mount"
   src: "fs-xxxxx.efs.ap-northeast-1.amazonaws.com:/"
   fstype: "nfs4"
   opts: "4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport,_netdev"
   state: mounted
```

実行結果
---
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3482362/a58a3a25-ca4e-e907-98bc-f0875915539b.png)

◇ポイント
/etc/fstabに定義が追加される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3482362/ba0273d0-55f8-ec45-71ac-03013a0ee6b8.png)


参考サイト
---
https://docs.ansible.com/ansible/latest/collections/ansible/posix/mount_module.html