OmniAICreator/Qiita-1.07M huggingface dataset:
The API operation 'GetItem' is missing required property 'body/(propertyname)'.

今回はPowerAutomateのワークフローで発生したエラーのトラブルシューティングです。

# Problem

PowerAutomateのワークフロー内にSharePointコネクターの「項目の取得」アクションが組み込まれている。
フローを実行したところ、次のようなエラーが発生した：

> アクション '項目の取得' に失敗しました: The API 'sharepointonline' returned an invalid response for workflow operation '項目の取得' of type 'OpenApiConnection'. Error details: 'The API operation 'GetItem' is missing required property 'body/(propertyname)'.'

あるいは：

> ResponseSwaggerSchemaValidationFailure
> The API 'sharepointonline' returned an invalid response for workflow operation '項目の取得' of type 'OpenApiConnection'. Error details: 'The API operation 'GetItem' is missing required property 'body/(propertyname)'.'

エラー発生の前、「項目の取得」のターゲットになるSharePointリストには入力必須の列を新たに追加していた。

# Solution

入力必須の列で未入力となっているものをすべて補完する。

今回の事象の原因はターゲットとなるSharePointリストのスキーマ（リストそのものや各列のメタデータ）の構造と実際にSharePointから返されるデータの構造の齟齬。スキーマでは必須項目となっているのに実データには当該の列が存在しないためエラーになってしまう。

SharePoint単体ではスキーマとデータのズレは問題にならない。スキーマで定められている必須項目を持っていないアイテムについては「注意が必要なアイテム」にリストアップされ、当該の列には「～が不足しています」と表示されるが、データの取得ができないわけではない：

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50571/34306e4c-81f3-3d0b-4e21-462a4bc91c29.png)

PowerAutomateのアクションのうちでも「複数の項目を取得」アクションは問題なく動作する。しかし「項目の取得」アクションではエラーになってしまう。
対策として実データに当該の列の内容を補ってやることで解決する。
【物体検出AI】物体検出AIとYOLOの特徴

# 物体検出AIの概要とYOLOの特徴

物体検出AIは画像やビデオの中で特定の物体を見つけ出し、その位置を特定する技術として監視カメラや自動運転車、医療画像解析などの分野で活用されています。物体検出AIにはいくつかの手法がありますが、その中でもYOLO（You Only Look Once）は特にリアルタイムに近い物体検出を可能としています。この記事では従来の手法と比較しながらYOLOの特徴に関して説明します。 

【YOLOを用いた検出例】
画像中の「人(person)」、「スマホ(cell phone)」、「車(car)」が検出されている
![priscilla-du-preez-7etIYqqw2jU-unsplash.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3809385/e5b310d9-5ce1-0b02-0605-b008db84c7ca.jpeg)


## 1. 従来の物体検出手法

YOLO以前に使用されていた主な物体検出手法には、スライディングウィンドウ法と領域提案法があります。

### スライディングウィンドウ法
- **手法**: 画像の左上から右下へと徐々に検出ウィンドウを移動させていき物体を検出します。その過程で物体と思われるものを発見した際はそれが何かを識別し、その後検出対象かを判断します。

### 領域提案法
- **手法**: まず画像内で物体が存在する可能性のある領域をセレクティブサーチ（画像内の特徴が似ているピクセルをまとめ領域を探す手法）で提案します。その後別のモデルでこれらの領域を分析し物体を識別します。代表的な例としてR-CNN、Fast R-CNNといった従来の手法が該当します。

## 2. YOLOのアプローチ

YOLOは上記の手法とは異なるアプローチを採用することでリアルタイムに近い速度で検出しています。

### 単一モデルと複数モデルの違い

YOLOは入力画像の物体の位置とクラスを同時に予測します。これに対して従来の手法は画像の多数の領域を個別に調べる作業、それぞれの領域で物体が存在するかどうかを判断する作業で別々のモデルを使用します。このような手法は段階ごとに処理が必要なため処理時間が長くなる傾向にあります。一方、YOLOは単一のモデルでこれらの処理を行うことができるため大幅な効率化を実現しています。

### 並列処理と逐次処理の違い

YOLOではまず最初に入力画像を一定のサイズで分割します。分割された各部分をグリッドセルと呼びます。このグリッドセルごとに処理が行われるため、GPUを利用して高速に並列処理を行うことができます。これに対し、従来の手法はスライディングウィンドウや領域提案手法を用いて候補領域を個別に逐次処理します。この処理効率の差によりYOLOはリアルタイムに近い検出を可能にしています。

## 4. 結論

YOLOが入力画像を高速に処理できるのは単一のモデルで一度に並列処理するアプローチを採用しているためです。これにより高速な物体検出を可能とし、リアルタイム性が求められる多くのアプリケーションに応用されています。

物体検出に興味がある、特にリアルタイムに近い速度での物体検出に興味がある方にとってYOLOは非常に有用なツールです。YOLOはオープンソースとして公開されており、誰でも試すことができるため一度触れてみてはいかがでしょうか。

---
AndroidでJsonを扱う

## AndroidでJsonを扱うための設定など

* プロジェクト
```build.gradle.kt
plugins {
    id("org.jetbrains.kotlin.plugin.serialization") version("2.0.20")
}
```

* モジュール
```build.gradle.kt
plugins {
    id("org.jetbrains.kotlin.plugin.serialization")
}

dependencies {
    implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.2")
}
```

* JSONに対応したデータクラス
```JsonData.kt
import kotlinx.serialization.Serializable

//Serializableアノテーション必要
@Serializable
data class JsonData(
    val id:String = "",
    val name:String = ""
)
```

* JSON→データ
```Sample(抜粋).kt
  //デコード
  val model:JsonData = Json.decodeFromString<JsonData>(jsonStr)

  val data : JsonData = JsonData()
  data.id = "0001"
  data.name = "テスト"
  //エンコード
  val jsonStr : String = Json.encodeToString(data)
```
IAM Identity Centerマルチアカウントのアクセス許可どこ？

# 概要
この記事は、IAM Identity Center管理のユーザーのアクセス管理について調べると許可セットがその役割を担っていると[公式サイト](https://docs.aws.amazon.com/singlesignon/latest/userguide/permissionsets.html)から読み取るも、前回の自分の記事

https://qiita.com/kota-done/items/c740e3180133608893c1

だと、そもそも許可セット作成するための**マルチアカウントのアクセス許可**が見当たらなかった。
その解決に取り組むも、時間がかなりかかったので、記事にしてしまおうという経緯である。

## 結論
リージョンを変えてIdentity Centerを作成しなおした。
us-east-1→ap-northeast-1

:::note warn
どのリージョンなら問題ないのかは検証していません。
:::

## 前回の状況
左の欄に<font color="red">「マルチアカウントのアクセス許可」</font>ないがな！

![スクリーンショット 2024-09-05 14.19.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3338426/04d018cf-275b-cb79-4e63-ff180a1552aa.png)

## 今回の対応後

![スクリーンショット 2024-09-12 12.48.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3338426/cb93f3f6-8c27-f696-a31d-cc2843294dbf.png)

### あとがき
教科書でBedrockを用いてのアプリ作成のハンズオンに取り組んでいるが、未だBedrockにアクセスする前の段階でかなり時間がかかっている。
教科書の著者に文句を言うのはお門違いだが、ハンズオンで案内しているCloud9がもはや新規利用できないのは困ったものである。
とりあえず、SDKでアクセスできるように取り組んでみようと思う。
Thonny をインストールして、ラズパイPicoをプログラミング

Raspberry Pi Pico のプログラミングにお勧めの、Thonny のインストールと、ラズパイPicoの準備について解説したいと思います。

## Thonny のインストール

Thonny は、Windows、Mac、Linuxにインストールすることができます。

#### Thonny 公式ページを開きます

https://thonny.org/


#### exeファイルをダウンロードします

Windows、Mac、Linux のいずれかにカーソルを合わせ、「recomennded for you（あなたにお勧め）」のリンクをクリックします


![スクリーンショット 2024-09-12 124015.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3665435/28e2e615-622c-1ead-79f4-dfc44d5d25e5.png)


#### ダウンロードした exe ファイルを実行します

[Next] --> [Next] --> [Next] --> [Install] とボタンをクリックすると、インストールがはじまります。
[Finish]ボタンをクリックしたら、インストール完了です。

## ラズパイPicoの準備

USBケーブル(micoro-B)で、ラズパイpicoをパソコンに接続してから、Thonny を起動します

![スクリーンショット 2024-09-12 125117.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3665435/02f995ed-a18a-ea7b-400f-b6baf318829b.png)


### MicroPythonがインストールされていない場合

ラズパイPicoの右下のハンバーガーメニューをクリックします。MicroPythonがインストールされていない場合は、以下のメニューがあらわれますので、「MicroPythonをインストール...」を選びます

![スクリーンショット 2024-09-12 125953.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3665435/ad967ca1-9906-7af9-f891-7c8556b85fbd.png)


「Rasberry Pi・Pico / Pico H」または、「Rasberry Pi・Pico W/ Pico WH」のいずれか、自分の使用するほうを選び、[インストール]ボタンをクリックします
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3665435/c1b3a612-b78c-1807-1e51-18e24930a0b8.png)

### MicroPythonが既にインストールされている場合

MicroPythonが既にインストールされている場合は、ラズパイPicoの右下のハンバーガーメニューをクリックすると、以下のような項目が表示されます。「MicroPython(Rasberry Pi Pico)・Board CDC」で始まる項目を選びます

![スクリーンショット 2024-09-12 131512.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3665435/17bb0fdf-29f9-5e49-82d9-ae4a685150af.png)

これでThonny のインストールと、ラズパイPicoへの接続が完了です。

## プログラミングは、以下を参考に

https://qiita.com/j-code-org/items/d3707f8162cd3fc72281

https://qiita.com/j-code-org/items/143957c5c7dd91e1f873

https://qiita.com/j-code-org/items/797dfe24c2b907504db1
n8n で Slack からスタンプを集計してStrapiに保存する方法

## 概要
n8n を使って、Slackからスタンプを集計して、そのデータをStrapiに自動で保存する仕組みを作成しましたので紹介します。ちなみに、これを使って制作したのがこちらの記事で紹介した Slackスタンプ集計サイネージ です。

https://qiita.com/NKM_DAS_IS/items/98278377f90b666dae67

## n8n
n8nはオープンソースの自動化ツールです。ノーコードで自動化処理を作成できます。今回は、以下の手順を自動化しました。
- 毎日0時に
- Slackから24時間以内に投稿されたメッセージのリアクションで押されたスタンプの種類と数を集計し
- Strapiに集計結果を保存する

#### 実際の画面
上記の手順を実際にn8nで構成した画面がこちらです。

![スクリーンショット 2024-09-12 13.46.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704872/e2e17b65-cbf5-5002-fffe-c4300a4a5c5e.png)

ひとつひとつのノードについて解説していきます。

 #### Schedule Trigger
 Cron形式で毎日0時にトリガーが発火するように設定しています。
 
 ![スクリーンショット 2024-09-12 13.48.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704872/b1fa74ee-317d-2179-ef7c-2fa3b3977a22.png)

### Date & Time
現時刻より「24時間前」の時刻を計算します
![スクリーンショット 2024-09-12 13.51.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704872/9749e111-9ca1-6755-5655-ac183c802838.png)

### UTS
計算された時刻をUnixTimestampに変換します

![スクリーンショット 2024-09-12 13.53.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704872/edd7ad22-d846-e705-5d89-6ccd227e9f1c.png)


### Channel List
Codeノードを使って、JSONを手入力します。JSONの中身は、スタンプを集計したいSlackチャンネルのチャンネルIDです。

### Create Json
再度Codeノードを使って、Slack APIのリクエストに使用するJSONを作成します。中身はさきほどのChannel ListとUSTで作成したタイムスタンプを組み合わせたものです。

### GET Slack message
HTTP Requestノードを使って、Slackからメッセージを取得します。
Slackの認証には、Slack Appを使用しています。

![スクリーンショット 2024-09-12 14.00.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704872/78db2a16-da33-6305-3837-3da58a965b3a.png)

### Message List
Slackから取得したJSONデータより、メッセージだけを抽出して整形します。

### Count Stamps
メッセージのデータから、押されたスタンプを集計します。

![スクリーンショット 2024-09-12 14.09.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704872/bc9aa108-17d0-64f1-40f0-bffa3a5d6f9e.png)

### POST Strapi
HTTP Requestノードを使って、Strapiに集計データを送信します。StrapiにはJSONデータをそのまま保存しています。

![スクリーンショット 2024-09-12 14.12.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704872/e1afc270-4893-13d3-a6ba-0590d39d6c27.png)

### まとめ
今回は、n8n を使って、Slackからスタンプを集計して、そのデータをStrapiに自動で保存する仕組みをご紹介しました。
また、n8nをAmazon Lightsail にセルフホスティングした記事もこちらにまとめていますので、よかったご参照ください。

https://qiita.com/NKM_DAS_IS/items/3853c96f1cb460757eda
AndroidのWebViewでAngularからアプリへデータを渡す

## AndroidのWebViewでAngularで作成したWebページからアプリへデータを渡す

* Angular側のソース

以下を宣言する
```top.component.ts
declare global {
  interface Window {
    android: any;
  }
}
```

アプリへデータを渡す箇所(抜粋)
```top.component.ts
let model : TicketModel = new TicketModel();
model.id = "00001";
model.name = "テスト";
let jsonStr : string = JSON.stringify(model);
window.android.showMessage(jsonStr);
```

TicketModelクラスは以下の通り
```ticket.model.ts
export class TicketModel {
  id? : string;
  name? : string;
}
```

* Android側のソース
　(activiti_main.xmlにWebViewを定義し、idをwebViewとしているものとする)

```MainActivity.kt
class MainActivity : AppCompatActivity() {
  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    val webView :WebView = findViewById(R.id.webView)
    webView.setWebViewClient(WebViewClient());
    webView.getSettings().javaScriptEnabled = true;
    webView.getSettings().allowFileAccess = true;

    //http://localhostにアクセスできるよう設定
    WebView.setWebContentsDebuggingEnabled(true);

    val webAppInterface = WebAppInterface(this@MainActivity)
    webView.addJavascriptInterface(webAppInterface, "android");

    //localhostで起動したAngularを表示する
    webView.loadUrl("http://localhost:4200")
  }
}
```

Angularからのデータを受け取る
```WebAppInterface.kt
class WebAppInterface(private val context:Context) {
  @JavascriptInterface
  fun showMessage(message:String):String {
    //JSON形式の文字列で受けてデコードする
    val model:TicketModel = Json.decodeFromString<TicketModel>(message)

    //受け取ったデータをToastで表示
    Toast.makeText(context, model.id + ":" + model.name, Toast.LENGTH_LONG).show();
    return message;
  }
}
```

TicketModelクラスは以下の通り
```TicketModel.kt
@Serializable
data class TicketModel(
    val id:String = "",
    val name:String = ""
)
```
Copilot in Wordの書き換え機能がちょっとアップデートされている

Copilot in Wordの書き換え機能が少しアップデートされています。
ドキュメント編集画面上で出てくるCopilotが少し進化していました。

## 一部書き換え機能について
これまでのCopilot in Wordは一部の書き換えを行うときも全体を再生成する必要がありましたが、一部書き換えが可能となっております。書き換えたい部分をハイライトして指定してから左側のCopilotボタンを押すと…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629241/de60f4ca-1af5-d5cd-2511-0d3f78e60d92.png)

「プロンプトを書き込みます」
「自動書き換え」
「表として視覚化」がでてきます

### 「プロンプトを書き込みます」
プロンプトを打つ部分が出てくるため適当に入れて生成すると…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629241/8efb13d8-888c-94ad-3f40-e983cbf298a3.png)

オリジナルの文章の下に生成された新しい文章が出てきます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629241/df628d89-b2da-ce2c-7fc8-8924b60061af.png)

「保持する」を押すとオリジナルが残ったまま新しい生成後の文章がでてきます。消してくれてもいいのに…。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629241/3a5d011c-f35f-f5a2-e5d4-24e527cc13d3.png)

### 「自動書き換え」
こちらはプロンプトなしで書き換えを行ってくれます。
何度か試してみましたが、3種類くらい出してくれるようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629241/0e38e03f-f8cd-7a5a-1052-df63b93eb9bb.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629241/7a4c367f-0d26-6bee-1f6f-18845154d213.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629241/bc6ad15f-67ae-dba0-c7bb-816a65bbe085.png)

気に入ったものを選んで、置き換えを押すとオリジナル文章が消され、新しいものに置き換わります（さっきのやつはそのまま残るのに…）

### 「表として視覚化」
文章をテーブル化してくれる機能です。

例えばこんな文章があったとすると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629241/5adc3e2c-0063-8c38-4589-5c6640c3bb98.png)

こんな感じで返してくれます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629241/f6a32852-928d-89b0-0f48-e1328098e54f.png)

連続した内容でも
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629241/de82c008-efe2-6520-03aa-807a7088e283.png)

すぐにテーブルにして返してくれます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629241/9524bcf2-5661-5220-a253-df8fec647a00.png)

めっちゃ便利！
Japan Azure Podに、CDGCがやってきた！！！

# 概要
お待たせしました、ついにインフォマティカのJapan Azure Podに、SaaS型データカタログの[CDGC](https://qiita.com/masatoshimada-max/items/871e08ee20ed5f129cf8)がリリースされました！

日本国内でも、2023年からJapan AWS PodではCDGCを利用することができるようになっており、多くのお客様にご利用頂いていますが、Azureについては残念ながらまだ未リリースでした。

すぐに使ってみたい・試してみたい という方は、下記のブログの手順を参考に設定を進めてください。

https://qiita.com/tmasudaf23/private/10939d21bcb3cb64c353

# そもそも、CDGCとは？
Cloud Data Governace and Catalogの略である [CDGC](https://www.informatica.com/jp/products/data-governance/cloud-data-governance-and-catalog.html)は、SaaS型データカタログとして提供され、クラウド・オンプレミスを問わず、またインフォマティカ製品やそれ以外も問わず、様々な種類のシステムをデータカタログ化することができ、データ活用やデータ・ガバナンスの強化に有効なサービスです。

下記の記事も参照下さい。

https://qiita.com/masatoshimada-max/items/871e08ee20ed5f129cf8

https://qiita.com/tags/cdgc

# Japan Azure Podのラウンチの何が嬉しいのか、どんな課題を解決できそうか？
下記のようなメリットがあります。

- 既存Japan Azure Podユーザーの方は、Pod(地域・クラウド種別ごとのサーバ環境)を使い分ける必要なし
<BR>    従来までは、Japan Azure Podユーザーは、Japan AWS PodのCDGCを利用する必要があり、AWS Podの契約やそれに伴う別途のSecure Agentの用意が必要でしたが、今後そういった冗長の構成は不要となり、すっきりしたアーキテクチャを取って頂くことが可能となります。
<P>



# CDGCは、Azure / Microsoft社のどんなサービスをカタログ化できるのか？

CDGCでは、以下のAzure、もしくは Microsoft社のサービス・製品に対して、スキャナーと呼ばれるメタデータ取得用のコネクタを用意しております。
Qiita記事やYoutube動画へのリンクも貼っているのでご確認下さい。

- Microsoft Azure Analysis Services
- [Microsoft Azure Blob Storage](https://www.youtube.com/watch?v=qIMPC6n-Nm4)
- [Microsoft Azure Cosmos DB using JDBC](https://qiita.com/tmasudaf23/items/5f5dd69f37a6c0451d0b)
- [Microsoft Azure Data Factory](https://qiita.com/tmasudaf23/items/5ac5af194005c38f2dbd)
- [Microsoft Azure Data Lake Storage Gen2](https://qiita.com/tmasudaf23/items/1548c53f3634e1ee2bca)
- [Microsoft Azure SQL Server](https://www.youtube.com/watch?v=hOFMTaof64E)
- [Microsoft Azure Synapse](https://qiita.com/tmasudaf23/items/9d5bcf8b66919dc1e0cb)
- Microsoft Azure SQL Server Script
- Microsoft Azure Synapse Script
- Microsoft Dynamics CRM using JDBC
- [Microsoft Fabric Data Warehouse](https://www.youtube.com/watch?v=8BGZ7CzkyyA)
- [Microsoft Fabric Data Lakehouse](https://www.youtube.com/watch?v=GD52OO4sUxU)
- [Microsoft Fabric OneLake](https://www.youtube.com/watch?v=GzACaGHYwCw)
- [Microsoft OneDrive](https://www.youtube.com/watch?v=BDeTBlsDwcw)
- [Microsoft Power BI](https://www.youtube.com/watch?v=Ds0N3lxgu_4)
- Microsoft Purview
- Microsoft SharePoint Online
- [Microsoft SQL Server](https://qiita.com/tmasudaf23/items/45add1b3b298e2aae8ea)
- Microsoft SQL Server Analysis Services
- Microsoft SQL Server Integration Services
- Microsoft SQL Server Reporting Services
- Microsoft SQL Server Script

# まとめ
Japan Azure Podに、CDGCがリリースされ、より効率的な構成が取れるようになりました。
既にJapan Azure Podの契約をお持ちのお客様は、[こちらの記事](https://qiita.com/tmasudaf23/items/10939d21bcb3cb64c353)を参考にデプロイ処理を実施して頂き、新規のお客様は弊社営業、もしくは下記の問い合わせフォームにご相談下さい。

https://www.informatica.com/jp/contact-us.html
157日目 VSCの便利な拡張機能を教える社畜M

## ♠はじめに
こんにちは、社畜Mだぜ。
プログラム関連の作業している人は使ったことがあるであろうVSCode、そのままでも使えるが拡張機能を入れればより使いやすくなる。

**だが！！！**

拡張機能はあまりにも多く似たようなものがある、そこで今回俺がどの作業でも利用できるVSCodeの拡張機能をTOP5で紹介していくぜ。
あくまでもこれは俺個人の感想だからそこはよろしく頼むぜ！
さぁ、行くぜ！！！

**デュエル！**
## ♠VSCodeとは
まずはVSCodeのおさらいだぜ、VSCodeとはMicrosoftが開発した無料のオープンソースのコードエディタで、多くのプログラミング言語に対応しており、軽量で高速な動作が特徴だぜ。
こいつは拡張機能を追加することで機能をカスタマイズできるため、開発者は自分のニーズに合わせた作業環境を構築できるぜ。これにより、より効率的な作業が可能…日本語にも対応してるからほんと便利だよな！

## ♠社畜Mがおすすめする拡張機能TOP5
それじゃあ本題に入るぜ！行くぜ俺のターン！

### ♥第五位「Prettier - Code formatter」
まず第五位！Prettier - Code formatterだぜ。
こいつはコード内のフォーマットを自動的に整えてくれる拡張機能だぜ。一貫したスタイルを保つことで、コードの可読性を向上させ、チーム開発におけるコーディング規約の維持の役に立つだろうぜ。例えば、VSCodeで縦一列にコードを打つとする。正直見にくいよな、たがPrettierがある場合保存すれば自動的にきれいにしてくれるぜ、こんな風にな！
 ```before.ts
 a = [1, 
      2,
      3]
```
 ```after.ts
 a = [1, 2, 3]
```
コードはあくまで例であるため細かいのは気にしないでくれ。


### ♥第四位「Error Lens」
次に第四位！Error Lensだぜ
こいつは、エラーや警告をインラインで表示することで、問題箇所を迅速に特定できるようにするぜ。これにより、デバッグの効率が大幅に向上。特に、複雑なプロジェクトではエラーメッセージがコンソールに埋もれてしまいがちだが、Error Lensを使うとエラーの場所がハイライトされエラーの内容が行末に表示されるぜ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766505/b88009d2-2d82-dbf1-03ee-363ac7236375.png)
※引用元https://atsum.in/vscode/error-lens/

### ♥第三位「IntelliCode」
第三位！IntelliCode！
IntelliCodeは、AIを活用してコンテキストに応じたコード補完を提供する。使用頻度の高いコードパターンを学習し、適切な補完候補を提示することで、コーディングの速度と正確性を向上させる。例えば、TypeScriptを使った開発では、IntelliCodeがよく使われるメソッドや関数の提案を行い、手動で入力する手間を省いてくれるぜ。


### ♥第二位「Material Icon Theme」
第二位！Material Icon Theme！
Material Icon Themeは、ファイルやフォルダに視覚的なアイコンを追加し、プロジェクトの構造を分かりやすくするぜ。これにより、開発環境の視認性が向上し、効率的な作業が可能。プロジェクトが大きくなるとファイルやフォルダが増えるが、アイコンが追加されることで探しているファイルを直感的に見つけることができるようになるぜ。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766505/3b4aa1c1-1968-c670-6f3f-59c52476a85b.png" alt="Sample Image" width="200" height="100">
※引用元https://aaronyoung.dev/blog/2021-01-24-vscode-fonts-and-themes/


### ♥第一位「GitLens — Git supercharged」
そして第一位！GitLens — Git supercharged！
GitLensは、Gitの機能を強化し、コードの履歴や変更を簡単に追跡できるようにするぜ。コミット履歴やブランチの比較、ブレームビューなど、Git操作を効率化するための多くの機能を提供しする。例えば、特定のコードが誰によって、いつ変更されたのかを素早く確認できるため、コードレビューやバグ修正がスムーズに行えるぜ。


## ♠まとめ
今回はVSCodeをより使いやすくするための拡張機能を紹介してきたぜ。これらの拡張機能を活用することで、コーディングの効率と正確性が向上し、作業環境がさらに快適になること間違いなしだ。特に、直感的な操作や視認性の向上、エラーの迅速な対応が可能となるため、初心者からベテランまで幅広い開発者におすすめだぜ。

## ♠おまけ
今回の社会人が知っておいた方がいいビジネスマナーはこいつだ！
「**メールは簡潔でわかりやすく**」だぜ。

最近はチャット等の機能が発達してきてるがそれでもビジネスメールの書き方は学んでおいて損はないぜ。ビジネスメールの重要なポイントは３つ。
**・件名に内容を要約する**
**・1文を簡潔にする**
**・情報量に応じて箇条書きを行う**
これが重要だと思うぜ。
例としていい例と悪い例を書いていくぜ。
<br>
まずはいい例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766505/b3bec214-9cc0-1f41-c0bc-7be62cf63404.png)

次に悪い例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766505/b594822a-8316-9bf4-0482-d6641b9f05c5.png)

全然見やすさが違うよな？
こんな風に読み手に配慮したメールはできるできないだとやっぱり違うぜ。
覚えておくんだな！

<br>

今回はここまでだぜ！！！
**ターンエンド**
How to install fluxgym for building Flux LoRA

私は従前、LoRA自作には余り関心がなく、昨年上半期に一度業務内作業の一環として自作した程度(※しかも実用に耐える精度にならず)でしたが、Flux1の描画能力や、他人様が作成したLoRAの表現力などを見て、そろそろ本格的にLoRA自作に踏み込んでみるか…と考えるに至りました。

ただ、RTX4070 12GBクラスのGPUでそれが可能なのか…という根本的な疑問もあり、しばし情勢を観察していましたが、さすがに世界は広いと言うべきか、Flux1そのものの需要の高さと言うべきか、想像以上にあっさりと12GB VRAMクラスのGPUでも完走できそうなLoRA作成プログラムが登場しましたので、早速インストールしました。

今現在、この原稿を書きつつ稼働中なので、使用方法については後述するとして、とりあえずインフラ周りのインストール方法について解説します。

…というか、わざわざ解説する必要も感じない位「超絶簡単(=GitHubの解説を読んで下さい、以上…で終わる話)」なのですが、一応書いておきます。

当初は、日本人にもおなじみKohya SS氏の鉄板プログラム「https://github.com/kohya-ss/sd-scripts」
をKohya's GUIで使用する予定で、以下の現時点最も詳細解説と思われる動画(加えて、とてもゆっくり話してくれるので聞き取りやすい)をじっくり視聴していた処ですが、
https://youtu.be/nySGu12Y05k?si=rMc83Ob4jBh3GB6O

kohya-ss氏ご本人もリポストしていたリポジトリにより、超絶シンプルなGUI環境でsd-scriptsを動作させてLoRAを作成できることがわかりました。

sd-scriptをベースにインターフェイスをGUI化したプログラムに、これまた有名なKohya's GUIがありますが、それよりシンプルなGUIを実現した「fluxgym」です。
https://github.com/cocktailpeanut/fluxgym?tab=readme-ov-file

名前の通りFlux専用の様ですが。

早速、解説動画もアップされていたので、じっくり腰を据えて導入...と思ったら、拍子抜けするほど簡単でした。特にKohya's-GUIが結構色々制約が多いことに比べれば圧倒的に。
https://youtu.be/1DyfPhIkX78?si=_WiM0Zzuz8Ju7Pw_

何なら、ここで解説を書く必要も感じないくらい簡単です。上のリポジトリのインストール手順を読んで下さい、以上…でもいい位です。

それでは身も蓋もなく、そもそも当記事の存在理由自体が消失するので、一応書いておきます。

まず、任意の場所に以下の通り、git cloneを行います。

```
git clone https://github.com/cocktailpeanut/fluxgym
cd fluxgym
git clone -b sd3 https://github.com/kohya-ss/sd-scripts
```

次に、これまた毎度おなじみ仮想環境構築です。解説ではvenvではなくenvとしているので、その通りにします。

```
python -m venv env
env\Scripts\activate
```

ここで私は少し手順を変えて、Pytorch関連ライブラリーを先にインストールします。pipの更新も同時にやっておくとよいでしょう。

```
pip install xformers
pip uninstall torch
pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu124
```

xformersを入れる以上は、一応triton2.1.0も入れておきます。詳細は、以下の記事を参照してください。
https://note.com/198619891990/n/n65cdffc0ca07

Pytorchの次に、sd-scriptsの為に必要なPythonライブラリーのインストールを行います。

```
cd sd-scripts
pip install -r requirements.txt
```

次に、fluxgym自体の為のPythonライブラリーをインストールします。

```
cd ..
pip install -r requirements.txt
```

次は、Flux1のベースモデルとclipモデルをダウンロードする訳ですが、上のリポジトリ内にリンクも保存場所も記述されているので、その通りにすればよいだけです。
(本当に解説が至れり尽くせりなので、やはり当記事の必要自体が希薄です)

起動コマンドは以下です。当然、仮想環境をアクティベートした状態でです。この部分は、自分でバッチファイルを作って自動化すべきですね。
```
python app.py
```

後は、WebUIのアドレスを開いて操作するだけです。何と、その手順迄リポジトリに動画化されています。ここまで至れり尽くせりのプログラムは久々に見ました。
![タイトルなし.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3661150/50f3a13c-fc73-442a-7625-9d9acc45bb11.png)
Allow GitHub Actions to create and approve pull requestsのグレーアウトを解消する方法

GitHub ActionsのワークフローからPRを作成したい場合、GitHubの`Allow GitHub Actions to create and approve pull requests`設定をONにする必要があるのですが、なぜかグレーアウト(非活性)になっていて困ったので解消法を共有します。

![スクリーンショット 2024-09-12 13.36.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/11b48c24-c16a-dc67-c280-d796f20cd526.png)

## 解消法
GitHub EnterpriseやOrganizationの加入状況によって、設定画面が変わります。
`YOUR_ORG`には自分の参加するOrganization名、`YOUR_REPO`にはワークフローを実行するRepository名を記載します。

1. GitHub Enterpriseを使用している場合
https://github.com/enterprises/YOUR_ORG/settings/actions

2. GitHub Organizationを使用している場合
https://github.com/organizations/YOUR_ORG/settings/actions

3. GitHub EnterpriseもOrganizationも使用していない場合
https://github.com/YOUR_ORG/YOUR_REPO/settings/actions

私の場合はGitHub Enterpriseを使用していたので、`https://github.com/YOUR_ORG/YOUR_REPO/settings/actions`からオプションを有効化しました。
![スクリーンショット 2024-09-12 13.37.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/28d15ea5-dc81-c548-0736-ad0c6fe12621.png)
wslでmanim その14

# 概要
wslでmanimやってみた。
練習問題やってみた。

# 練習問題
3dグラフを書け。

# 成果物

![Test_ManimCE_v0.18.1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/6f0d5a93-1d07-c56c-59e4-44765472cc53.gif)


# サンプルコード

```

from manim import *

class ThreeDSurface(Surface):
	def __init__(self, ** kwargs):
		kwargs = {
			"u_range": [-1.5, 1.5],
			"v_range": [-1.5, 1.5],
			"checkerboard_colors": [GREEN, BLUE],
			"fill_opacity": 0.5
		}
		Surface.__init__(self, self.func, ** kwargs)
	def func(self, x, y):
		return np.array([x, y, x ** 2 + y ** 2])

class Test(ThreeDScene):
	def construct(self):
		self.set_camera_orientation(phi = 75 * DEGREES, theta = 30 * DEGREES)
		axes = ThreeDAxes()
		self.add(axes)
		surface = ThreeDSurface()
		self.add(surface)
		d = Dot(np.array([0, 0, 0]), color = YELLOW)
		self.add(d)
		self.wait()
		self.move_camera(phi = 45 * DEGREES, theta = 30 * DEGREES)
		self.begin_ambient_camera_rotation()
		self.wait(9)




```

以上。
wslでmanim その13

# 概要
wslでmanimやってみた。
練習問題やってみた。

# 練習問題
3dグラフを書け。

# 成果物

![test_ManimCE_v0.18.1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/8b4b91db-d624-ccca-dcaf-baafbecd7318.gif)


# サンプルコード

```


from manim import *

class test(ThreeDScene):
	def construct(self):
		self.set_camera_orientation(phi = 75 * DEGREES, theta = 30 * DEGREES)
		axes = ThreeDAxes()
		self.add(axes)
		w = 1
		surface_01 = Surface(lambda u, v: v * complex_to_R3(np.exp(1j * w * u)), u_range = [0, TAU], v_range = [1, 3], checkerboard_colors = None, fill_color = BLUE_B, fill_opacity = 0.8, stroke_color = BLUE_A, resolution = (60, 10))
		self.add(surface_01)
		self.wait()
		self.remove(surface_01)
		surface_02 = Surface(lambda u, v: v * complex_to_R3(np.exp(1j * w * u)) + OUT * u / PI * 2, u_range = [0, TAU], v_range = [1, 3], checkerboard_colors = None, fill_color = BLUE_D, fill_opacity = 0.8, stroke_color = BLUE_A, resolution = (60, 10))
		self.add(surface_02)
		self.wait()
		self.remove(surface_02)
		r = 2
		w = 4
		circle = ParametricFunction(lambda t: r * complex_to_R3(np.exp(1j * w * t)), t_range = (0, TAU * 1.5), color = RED, stroke_width = 8)
		self.add(circle)
		self.wait()
		self.remove(circle)
		spiral_line = ParametricFunction(lambda t: r * complex_to_R3(np.exp(1j * w * t)) + OUT * t, t_range = (0, TAU * 1.5), color = PINK, stroke_width = 8)
		self.add(spiral_line)
		self.wait()
		self.remove(spiral_line)
		theta = PI / 4
		curve_02 = lambda y: np.array([1, y, y * np.tan(theta)])
		w = 2
		surface_func_02 = lambda u, v: complex_to_R3(complex(*curve_02(v)[0:2]) * np.exp(1j * w * u)) + curve_02(v)[-1] * OUT
		surface_by_rotate_02 = Surface(surface_func_02, u_range = [0, TAU], v_range = [2, 2], checkerboard_colors = None, fill_color = BLUE, fill_opacity = 0.8, stroke_color = WHITE, stroke_width = 2.5)
		self.add(surface_by_rotate_02)
		self.wait()
		self.remove(surface_by_rotate_02)
		line_func = lambda y: np.array([1, y, y * np.tan(theta)])
		surface_func = lambda u, v: complex_to_R3(complex(*line_func(v)[0:2]) * np.exp(1j * u)) + line_func(v)[-1] * OUT
		surface_by_rotate = Surface(surface_func, u_range = [0, TAU], v_range = [-2, 2],)
		self.add(surface_by_rotate)
		self.wait()
		self.remove(surface_by_rotate)
		c_func = lambda y: np.array([1, y, y * np.sin(theta)])
		surface_func = lambda u, v: complex_to_R3(np.exp(1j * u)) + c_func(v)[-1] * OUT
		surface_c = Surface(surface_func, u_range = [0, TAU], v_range = [-2, 2],)
		self.add(surface_c)
		self.wait()
		self.remove(surface_c)





```

以上。
wslでmanim その12

# 概要
wslでmanimやってみた。
練習問題やってみた。

# 練習問題
3dグラフを書け。

# 成果物

![test_ManimCE_v0.18.1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/00923764-d764-9169-3851-7361e1e67b6e.gif)


# サンプルコード

```

from manim import *

class dSurface(Surface):
	def __init__(self, **kwargs):
		kwargs = {
			"u_range": [-1.5, 1.5],
			"v_range": [-1.5, 1.5],
			"checkerboard_colors": [GREEN, BLUE],
			"fill_opacity": 0.5
		}
		Surface.__init__(self, self.func, **kwargs)
	def func(self, x, y):
		return np.array([x, y, x**2 + y**2])

class test(ThreeDScene):
	def construct(self):
		self.set_camera_orientation(phi = 75 * DEGREES, theta = 30 * DEGREES)
		axes = ThreeDAxes()
		self.add(axes)
		surface = dSurface()
		self.add(surface)
		self.move_camera(phi = 45 * DEGREES, theta = 30 * DEGREES)
		self.wait()
		self.begin_ambient_camera_rotation()
		self.wait()
		self.remove(surface)
		sphere = Surface(lambda u, v: np.array([1.5 * np.cos(u) * np.cos(v), 1.5 * np.cos(u) * np.sin(v), 1.5 * np.sin(u)]), v_range = [0, TAU], u_range = [-PI / 2, PI / 2], checkerboard_colors = [RED_D, RED_E], resolution = (15, 32))
		self.add(sphere)
		self.wait()
		self.remove(sphere)
		cylinder = Surface(lambda u, v: np.array([np.cos(TAU * v), np.sin(TAU * v), 1.0 * (1 - u)]), resolution = (6, 32))
		self.add(cylinder)
		self.wait()
		self.remove(cylinder)
		w = 1
		surface_01 = Surface(lambda u, v: v * complex_to_R3(np.exp(1j * w * u)), u_range = [0, TAU], v_range = [1, 3], checkerboard_colors = None, fill_color = BLUE_B, fill_opacity = 0.8, stroke_color = BLUE_A, resolution = (60, 10))
		self.add(surface_01)
		self.wait()
		self.remove(surface_01)
		surface_02 = Surface(lambda u, v: v * complex_to_R3(np.exp(1j * w * u)) + OUT * u / PI * 2, u_range = [0, TAU], v_range = [1, 3], checkerboard_colors = None, fill_color = BLUE_D, fill_opacity = 0.8, stroke_color = BLUE_A, resolution = (60, 10))
		self.add(surface_02)
		self.wait()
		self.remove(surface_02)
		surface = Surface(lambda u, v: np.array([u, v, np.sin(u ** 2 + v ** 2)]), u_range = [-4, 4], v_range = [-4, 4], resolution = (120, 120))
		self.add(surface)
		self.wait()
		self.remove(sphere)






```

以上。
wslでmanim その11

# 概要
wslでmanimやってみた。
練習問題やってみた。

# 練習問題
3dグラフを書け。

# 成果物

![test_ManimCE_v0.18.1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/8817ca1c-adc7-5b5c-4147-913fe6fdeff7.gif)


# サンプルコード

```

from manim import *

class DSurface(Surface):
	def __init__(self, **kwargs):
		kwargs = {
			"u_range": [-1.5, 1.5],
			"v_range": [-1.5, 1.5],
			"checkerboard_colors": [GREEN, BLUE],
			"fill_opacity": 0.5
		}
		Surface.__init__(self, self.func, **kwargs)
	def func(self, x, y):
		return np.array([x, y, x ** 2 + y ** 2])

class test(ThreeDScene):
	def construct(self):
		sphere = Surface(lambda u, v: np.array([1.5 * np.cos(u) * np.cos(v), 1.5 * np.cos(u) * np.sin(v), 1.5 * np.sin(u)]), v_range = [0, TAU], u_range = [-PI / 2, PI / 2], checkerboard_colors = [RED_D, RED_E], resolution = (15, 32))
		def param_plane(u, v):
			x = u
			y = v
			z = 0
			return np.array([x, y, z])
		plane = Surface(param_plane, resolution = (22, 22), v_range = [-2, +2], u_range = [-2, +2], )
		def param_gauss(u, v):
			x = u
			y = v
			d = np.sqrt(x * x + y * y)
			sigma, mu = 0.4, 0.0
			z = np.exp(-((d - mu) ** 2 / (2.0 * sigma ** 2)))
			return np.array([x, y, z])
		gauss_plane = Surface(param_gauss, resolution = (22, 22), v_range = [-2, +2], u_range = [-2, +2], )
		cylinder = Surface(lambda u, v: np.array([np.cos(TAU * v), np.sin(TAU * v), 1.0 * (1 - u)]), resolution = (6, 32))
		surface = DSurface()
		axes = ThreeDAxes()
		self.set_camera_orientation(phi = 75 * DEGREES, theta = 30 * DEGREES)
		self.add(axes)
		self.add(sphere)
		self.wait()
		self.remove(sphere)
		self.add(plane)
		self.wait()
		self.remove(plane)
		self.add(gauss_plane)
		self.wait()
		self.remove(gauss_plane)
		self.add(cylinder)
		self.wait()
		self.remove(cylinder)
		self.add(surface)
		self.wait()





```

以上。
wslでmanim その10

# 概要
wslでmanimやってみた。
練習問題やってみた。

# 練習問題
3dグラフを書け。

# 成果物



![test_ManimCE_v0.18.1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/fb0f011b-bfe7-de28-a97b-0e6081176514.gif)

# サンプルコード

```


from manim import *

class test(ThreeDScene):
	def construct(self):
		sphere = Sphere()
		cube = Cube()
		prism = Prism()
		cylinder = Surface(lambda u, v: np.array([np.cos(TAU * v), np.sin(TAU * v), 1.0 * (1 - u)]), resolution = (6, 32))
		axes = ThreeDAxes()
		self.set_camera_orientation(phi = 75 * DEGREES, theta = 30 * DEGREES)
		self.add(axes)
		#self.play(ShowCreation(cube))
		self.add(cube)
		self.wait()
		self.remove(cube)
		#self.play(ShowCreation(sphere))
		self.add(sphere)
		self.wait()
		self.remove(sphere)
		#self.play(ShowCreation(prism))
		self.add(prism)
		self.wait()
		self.remove(prism)
		#self.play(ShowCreation(cylinder))
		self.add(cylinder)
		self.wait()




```

以上。
投稿 52 cookie 2024/08/21

本日の勉強時間　0.5H

    cookieはクライアント側で保存できる、少量のテキストのこと。
    サーバーがクライアントに対して任意のテキストを保存できる。

    （基本的にはサーバーはサーバーはクライアント側のファイルを読み書きすることは許可されていない　←ネットにアクセスするだけで、手元のファイルが書き換えられてしまうことになってしまう）
Flatt Security 2024 サマーインターンシップ体験記

# はじめに

8/26 ~ 30にかけて株式会社Flatt Securityのサマーインターンシップに参加させて頂きました。
今回はそこで私が体験した事とそこから学んだ事について話します。

# 会社概要

株式会社Flatt Securityはセキュリティ会社で、学習プラットフォームKENROや自動診断ツールのShisho Cloudを提供しています。
自動診断ツールに加えて、セキュリティのプロフェッショナルが実際のプロダクトに脆弱性が無いかを確認する脆弱性診断サービスも提供しています。
Flatt Securityではプロダクトのソースコードを見ながら診断を行うホワイトボックス診断が特徴となっています。

# 1日目

1日目は会社説明とFlatt Securityが提供しているトレーニング教材を用いた脆弱性についての学習を行いました。
教材のコンテンツには様々な項目がありましたが、1日目はXSSとCSRFの項目を行いました。
CSRFの部分では罠サイトの作成時になぜか罠サイト側でCORSを有効にしていたせいで詰まっていた覚えがあります。
罠サイト側でfetchを使用していた際にもヘッダ情報を記述し忘れるなど凡ミスが目立った1日でした。
コンテンツ自体は面白いものばかりでした。

# 2日目

2日目はXSSとCSRFの診断形式の問題を解き、余った時間でSQLインジェクションとOSコマンドインジェクションのコンテンツも行いました。
2日目になると環境にも慣れてきて、凡ミスも減ってきました。
XSSの診断形式の問題だけ、少し工夫しないとXSSに繋げられないようになっており、いつものCTFをやる感覚で楽しく解法を探していました。

# 3日目

3日目からは診断業務体験が始まりました。
診断対象としてWebサイトとそのソースコードが与えられました。
Webサイトはdockerを利用し、自身のPCに構築したものを使用しました。
CTFを趣味で行なっていたので、ソースコードを見ながらの診断は慣れていると思っていたのですが
ここでCTFと診断業務の違いを知ることになりました。
診断を行う前にはWebサイトが正常に動作しているか確認を行うのですが、私はこの作業は初めてだったので1日のうち半分以上をここに使ってしまいました。
最終的にはクライアントが直接操作するような機能に絞り、動作確認を行うことにしました。
残った時間でWebサイトを操作し、怪しそうな箇所があればソースコードと睨めっこしながら攻撃手法を考えるという方法で診断を行いました。
この日の最後にようやく１つ脆弱性を見つけることができました。

# 4日目

4日目は診断業務の続きを行いました。
この日は1日中ソースコードと睨めっこしていました。
CTFを趣味でやっているのでソースコードを見て、攻撃方法を考えるのには慣れていました。
そのおかげでこの日は3つ脆弱性を見つけることができました。
かなりソースコードの量が多いので、CTFでソースコードを読むのに慣れていなかったら脆弱性は見つけられなかったかもしれません。
それとこの日は、もう１つのCTFと診断業務の違いを知った日でもありました。
CTFでは対象に脆弱性が必ず存在しているという前提がありますが、診断業務ではそうとは限らないという事です。
ですが、攻撃を組み立てる考え方の部分は共通しているので、1箇所に集中して脆弱性を探すあまり沼にハマらないようにすれば、後はCTFと同じ流れで脆弱性を見つけることができました。

# 5日目

最終日が私にとって一番学びの多い日となりました。
この日は3~4日目で発見した脆弱性を報告する報告書作成を行いました。
報告書を作成する際には、開発者の方が実際に脆弱性を修正してくれる内容にすることを心掛けながら取り組みました。
PoCに使用するコードや修正版のコードを記述するようにもしました。
CTFでPoCコードを書くのには慣れていたので、スムーズに行くと思っていたのですが、実際には少し違いました。
なぜなら開発者の方が一番実行しやすいコードにする必要があったからです。
Flatt Securityでは、原則PoCコードはブラウザの開発者モードで実行可能なJavaScriptで記述するようにしていました。
私は普段PythonでPoCコードを書いていたのですが、それを実行するにはPythonの実行環境が必要です。
コードに外部ライブラリを使用している場合は、それをインストールする必要もあります。
なので私もJavaScriptでコードを書いたのですが、fetch関数でファイルを扱う方法が分からず苦戦しました。
ですがこのやり方の方が実行環境の構築をする必要が無いので、コードの実行が容易だと思いました。
他にも、参考資料はIPAやPortSwiggerなどの信用できる機関から引用すると良いと学びました。

# さいごに

私は今回のサマーインターンに向けてOAuth<sup>1</sup>やS3<sup>2</sup>の攻撃手法を調査し、準備してきました。
ですが、CTFと診断業務の違いを痛感する結果となりました。
開発者が実際に脆弱性を修正することが重要だということは自分でも理解していたつもりでしたが
実際の業務体験を通して、開発者にもわかりやすい報告書を作成することが大変だということを学びました。
サポートしてくださったメンターの方々と話している中でも、開発者が実際に脆弱性を修正してくれることの重要性が伝わってきました。
最終的には、お客様に信頼してもらえる脆弱性診断士を目指しますが
今後は、まずはCTFでwriteupを書く際にPoCコードをJavaScriptで作成するところから始めていきます。
最後にこの場を借りてFlatt Securityの方々に感謝を伝えたいと思います。
今回は貴重な学びの機会を提供していただき、誠にありがとうございました。

1: https://blog.flatt.tech/entry/s3_security
2: https://blog.flatt.tech/entry/oidc_security_gitlab_casestudy
【ローカル5G】 free5GCとリアルgNBでiPhone接続を試す。③

* * *
※本記事は2024年9月9日時点の内容です。
この記事は私がfree5GCとリアルgNB(ローカル5G用小型基地局= Small Cell）を使ってiPhone接続を試す機会があり、その過程をまとめたものです。
free5GCのインストールについては基本的には全てfree5GCプロジェクトのWEBサイトを参考に進めました。

https://free5gc.org/

インストールしたバージョンは以下の通りです。
OS　: 　Ubuntu 20.04.6 LTS
Linux Kernerl　:　5.4.0-193-generic
free5GC　:　v3.4.2
<br>
過去記事はこちら
[① Ubuntuインストール編](https://qiita.com/Takashi_Eifuku/items/133b26da9013f35cdf68 "【ローカル5G】 free5GCとリアルgNBでiPhone接続を試す。①")
[② free5GCインストール編](https://qiita.com/Takashi_Eifuku/items/c13b8ecb499f1a3b3c38 "【ローカル5G】 free5GCとリアルgNBでiPhone接続を試す。②")
* * *
<br>

# free5GC config編集
以下ディレクトリにある設定ファイルを環境に合わせてconfigファイルを編集しました。
```
/root/free5gc/config
```
```
root@free5gc:~/free5gc/config# ls -l
total 100
-rw-r--r-- 1 root root  6715 Sep  6 06:41 amfcfg.yaml
-rw-r--r-- 1 root root  1503 Sep  6 06:41 ausfcfg.yaml
-rw-r--r-- 1 root root  1786 Sep  6 06:42 chfcfg.yaml
drwxr-xr-x 2 root root  4096 Sep  6 05:47 multiAMF
drwxr-xr-x 2 root root  4096 Sep  4 09:07 multiUPF
-rw-r--r-- 1 root root  2966 Sep  4 09:07 n3iwfcfg.test.yaml
-rw-r--r-- 1 root root  3003 Sep  6 04:31 n3iwfcfg.yaml
-rw-r--r-- 1 root root  1295 Sep  6 06:37 nrfcfg.yaml
-rw-r--r-- 1 root root 23605 Sep  6 06:53 nssfcfg.yaml
-rw-r--r-- 1 root root  2102 Sep  6 06:37 pcfcfg.yaml
-rw-r--r-- 1 root root  5143 Sep  6 06:38 smfcfg.yaml
-rw-r--r-- 1 root root  1778 Sep  6 06:38 udmcfg.yaml
-rw-r--r-- 1 root root   945 Sep  6 06:38 udrcfg.yaml
-rw-r--r-- 1 root root  1991 Sep  4 09:07 uerouting.yaml
-rw-r--r-- 1 root root  1042 Sep  5 05:25 upfcfg.testulcl.yaml
-rw-r--r-- 1 root root  1042 Sep  4 09:07 upfcfg.test.yaml
-rw-r--r-- 1 root root  1182 Sep  6 06:38 upfcfg.yaml
-rw-r--r-- 1 root root   892 Sep  4 09:07 webuicfg.yaml
```

各機能ごとにconfigファイルが分かれていて、それぞれに編集しました。
尚、インデントがずれるとconfigファイルを読み込みの際にエラーが発生するので編集時には注意が必要です。編集前にファイルのバックアップを取っておいたほうがよさそうです。
<br>
設定ファイルで変更した箇所は以下の通りです。
- PLMN (MCC / MNC)　※MCC=999, MNC=002 に変更
- TAC　※000001に変更
- S-NSSAI (sst / sd)　※sst=1, sd=000001 に変更
- IP Address関連
- SUCI Profile

:::note warn
PLMN 999 002は「ローカル5G自営用PLMN」として指定されており、総務省に端末設備識別番号申請書を提出してIMSIの払い出しを受ける必要があります。
:::
<br>
【各ファイルの変更点】

| Config file | 変更箇所  |
|:-:|:-|
|  amfcfg.yaml | - ngapIpList IP (N2): 172.16.60.2 に変更。<br>- plmnId: MCC=999, MNC=002に変更。<br>- tac: 000001に変更。<br>- snssai: sst=1, sd=000001に変更 |
|  ausfcfg.yaml |- plmnId: MCC=999, MNC=002に変更。 |
| nrfcfg.yaml  |- plmnId: MCC=999, MNC=002に変更。    |
| nssfcfg.yaml | - plmnId: MCC=999, MNC=002に変更。 <br>　※restrictedSnssaiList や mappingListFromPlmn 以外を変更。<br>- snssai: sst=1, sd=000001に変更。<br>- smfSetList: 「SetId:1」以外はコメントアウト。<br>- tai: 複数あるtaiも1つを残してコメントアウト。   |
|  smfcfg.yaml | - plmnId: MCC=999, MNC=002に変更。<br>- snssai: sst=1, sd=000001に変更。<br>- endpoints IP (N3 or N9 IP): 172.16.60.2 に変更。  |
| udmcfg.yaml  | - SuciProfile: ※内容は別記事で説明予定  |
| upfcfg.yaml  | - gtpu > ifList IP: 172.16.60.2 に変更。  |

上記以外のconfigファイルはデフォルトのままで進めました。

これで設定変更完了しました。

次記事でSIMとSUCIプロファイルについて準備した過程をまとめる予定です。

https://qiita.com/Takashi_Eifuku/items/b92d5e1cb87e985dcf73
投稿 51 ヘッダー情報 2024/08/20

本日の勉強時間　0.5H

ヘッダー情報とは、
クライアントからサーバーに送られる情報のうち、不可視の内部的情報。

例：
クライアント（ブラウザ）の種類
私用する言語
リンク元のページ
GoogleマップをWebページに埋め込む方法

## アジェンダ

GoogleマップをWebページに埋め込む方法について備忘録的に簡単いまとめます。

## Googleマップの埋め込みコード取得
まず、Googleマップの埋め込みたい場所を開き、次の手順でコードを取得します。

1. Googleマップを開き、目的の場所を検索
2. 画面左上の「共有」ボタンをクリック
3. 「地図を埋め込む」タブを選択
4. 「HTMLをコピー」をクリックしてコードを取得

このコードは `<iframe>` タグで提供されます。例えば、次のようなコードになります：
```html
<iframe 
  src="https://www.google.com/maps/embed?pb=..." 
  width="600" 
  height="450" 
  style="border:0;" 
  allowfullscreen="" 
  loading="lazy" 
  referrerpolicy="no-referrer-when-downgrade">
</iframe>
```

あとはこのタグをHTMLファイルに貼り付けるだけで完了です。

## 参考
- [【CSS】Googleマップの埋め込み方法とレスポンシブについて解説 | ZeroPlus Media](https://zero-plus.io/media/css-google-map/)
Windows11 Home(24H2)でファイル共有のトラブル

最近、Windows11 HomeのPCをセットアップしていたら、24H2がプリインストールされていてちょっと嫌な予感がしていたのですが、ファイル共有で謎の現象に遭遇したので記録しておきます。

### まずはローカルアカウントで初期セットアップ
Windows11は基本的にMicrosoftアカウントでセットアップするように仕向けられていて、ローカルアカウントで使いたい場合、かなりの手間隙をかけねばならない仕様となっています。
ということで、[こちらの記事](https://atmarkit.itmedia.co.jp/ait/articles/2210/21/news023.html "@IT")を参考にいきなりローカルアカウントで初期セットアップを行います。

### NASのゲスト共有フォルダを開く
次にいろいろインストールするため、NASの共有フォルダ（ゲスト共有）を開くのですが、ここで23H2までとは違う挙動が発生します。いつもはサクッと開くのに今回は結構時間がかかるんです。
とはいえ、少し待つと普通に共有フォルダが開きます。いつもの通り必要なアプリなどをインストールしてセットアップ完了となります。

### 数日して共有フォルダが開けなくなったという連絡が
エクスプローラーのアドレスバーに共有フォルダのアドレスを入力すると、
> ネットワークエラー
> XXXXにアクセスできません
> エラーコード：0x80004005
> エラーを特定できません

というヤバい感じのエラーダイアログが表示されます。嫌な予感が的中したようです。
いろいろやってみたのですが、一旦この状態になってしまうとPCのリセットで初期化しても一向に繋がりません。どうやら、初期セットアップ後にWindowsUpdateなどでパッチが当たるタイミングでこうなってしまうみたいです。
### 解決策は？
数日間、23H2以前のPCとファイル共有に関係しそうな設定を比較してみたりした結果、とりあえず以下で解決となりました。

レジストリエディタで
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\LanManWorkstation\Parameters
を開きます。おそらく右側のペインに
RequireSecuritySignature
という値の名前が存在しないと思います。
> 値の名前: RequireSecuritySignature
> 値のデータ: 0　DWORD(32ビット)値

を作成します。

なお、これは Windows11 Home エディションの場合です。
Proエディションでは違っているかもしれません。
このやり方はセキュリティ的にどうなんだという話もあるかもしれません。とりあえずは自己責任にてお願いします。

それにしてもWindowsって年々使いづらくなっていく気がするのは気のせいでしょうか？

ご参考になれば幸いです。
【ChatGPT＋Code Interpreter】で画像内のパネルに画像を貼ります（改訂版）


　どうも、カーブミラーです。

　今回は、昨日の「画像内のパネルに画像を貼ります」、その改訂版になります。

:::note info
本記事は、ChatGPT（有料版）
で行なっております。画像は
あります。　あしからず。
:::

　まずは、ニュースです。

　というか
　　気付き、ですね。

　MS CopilotのDesignerですが、
　　横長の画像も作成できます。

　やり方は、
　　正方形での作成のあと
　　　四つのどれかをタップし、
　　　　共有・ダウンロード・💬の
　　　　　💬をタップし、
　　　　　　“サイズの変更”で
　　　　　　　正方形か横長を選ぶと
　　　　　　　　再描画されます。

　けっして、
　　正方形の画像を
　　　横長にしたものには
　　　　なりません。
　　　　　ご注意を。
***
　さて、本題です。

　今回は、
　　昨日（2024/09/11）の記事の
　　　改訂版です。
[【ChatGPT＋Code Interpreter】で画像内のパネルに画像を貼ります。](https://qiita.com/kabumira/items/eaa260b66c12bd7384c9)

　昨日のは、
　　パネルから
　　　画像がはみ出して
　　　　しまっていました。

　さすがに
　　それは自分がイヤなので
　　　さらに調整しました。

　いや、調整は
　　ChatGPTさんが
　　　したんですけどね😅

　まずは
　　出来上がりをどうぞ。
![output_image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/b186cc40-66bb-f25d-3422-5d5e2fc4e64f.png)

　ようやく
　　パネルに画像がプリントしてある
　　　ような見た目になりました😸
***
　手順は
　❶GPT-4oであることを確認
　❷ふたつの画像をアップロードして
　　　下記Promptを送信
```Text:画像読み込みPrompt（改良）
最初の画像を元画像とします。
二番目の画像を組み込み画像とします。
勝手な判断はしないでください。
```
　❸下記Promptを送信
```Text:画像内のパネルに画像を組み込むPrompt（改訂版）
### 画像内の白色領域に別の画像を組み込むための処理手順

#### 使用ライブラリ：
- Pillow
- SciPy

#### 処理の詳細：

1. **画像の読み込み**：
   - Pillowを使用して、元画像と組み込み画像をRGB形式で読み込みます。

2. **白色の定義**：
   - 「白色」は、RGB値がそれぞれ210以上のピクセルとして定義します。

3. **白色領域の検出**：
   - SciPyを使用して、連続した白色ピクセルの領域を検出します。

4. **最も大きな白色領域の選択**：
   - 検出された白色領域の中で、ピクセル数が最も多い領域を選択します。

5. **組み込み画像のリサイズ**：
   - Pillowを使用し、アスペクト比を保持しながら、白色領域に収まるように組み込み画像をリサイズします。余裕を持たせるために、白色領域の90%の大きさに縮小します。

6. **画像の描画**：
   - リサイズされた組み込み画像を、白色領域の中央に配置し、元画像に貼り付けます。

7. **二重描画の防止**：
   - 元画像に画像を描画する際は、一度だけ描画されるようにします。

8. **結果の保存**：
   - 組み込み画像が正しく配置された元画像を保存します。
```
　❹ダウンロードリンクが表示

　これで、
　　出来上がります。

　画像読み込みPromptを
　　変更したのは、
　　　ChatGPTさんが勝手に
　　　　推測してパネルに
　　　　　画像を入れてしまったため。

　入ってくれてれば
　　文句ないんですがねぇ。
　　　入っていないんですよぉ😅

　まぁ、
　　それはともかく、
　　　本処理についてです。

　パネルを白色領域と
　　しているわけですが、
　　　実はCode Interpreter上では
　　　　検出が少し大きめなんですね。

　それで昨日は
　　はみ出していたわけです。

　で、ChatGPTさんと
　　たくさんやり取りを
　　　しまして。

　結果、
　　5で、“白色領域の90%に縮小”
　　6で、“白色領域の中央に配置”
　　　となったわけです。

　めでたしめでたし😸

　みなさんの
　　作品制作の糧に
　　　なれば、幸いです。

　今回は、ここまで。
Kotlinのfactoryってなに？

# factoryとは
- Kotlinにおけるインスタンス生成方法の1つ
- インスタンスの生成で、```single```または```factory```を使う
参考サイト：

https://naokirin.hatenablog.com/entry/2019/01/27/052830

# ```single```と```factory```の使い分け
- ```single```と```factory```をどうやって使い分けるかはアプリの設計に関係してくる
   - 一般的なAndroidアプリでは、以下の観点で使い分けられるケースが多い（あくまで一例）
      - Repositoryクラスのように**決まった対象のDBへアクセスする必要があり、かつ、アクセスする際に、一貫性を保つ必要があるケース**
→  <font color="red">single（Singleton）</font>
      - HttpClientクラスのような**決まった設定値を全てのアプリで使い回すケース**
→  <font color="red">single（Singleton）</font>
      - UseCaseのような**画面（ViewModel）で必要になる度に生成された方がメモリのコストなどでメリットになるケース**
→  <font color="LawnGreen">factory</font>

# UseCaseが「メモリコスト」より、「生成コスト」の方がコストが低い理由

（UseCaseは、一度生成してから全てのアプリで使い回す「メモリコスト」よりも、必要になったらその都度生成する「生成コスト」の方がコストが低い）
- 「一度生成してから全てのアプリで使い回す」のは、マルチスレッド環境だと、確実にインスタンスが1つになることを保証するためにロックを使う必要がある
そのため、意外とコストが大きい
- UseCAseは、ステートを持っていないため、インスタンスを作るコストが低い

という背景があるカモ

## メモリコストが高くなる理由の補足
> - 「一度生成してから全てのアプリで使い回す」のは、マルチスレッド環境だと、確実にインスタンスが1つになることを保証するためにロックを使う必要がある

複数のスレッドで同時にインスタンスが使われてしまうのを防ぐには、ロック（DBが同時にデータを弄れないようにロックをするイメージ）をすることが必要
（DBのロックと意味合いは同じ）

スレッドを意識しなければ、
```kotlin:
override fun get(context: InstanceContext):T{
    if(!isCrated(context)){
        value = creat(context)
    }

    return getValue()
}
```
でいいハズ・・・
しかし、実際のコードを見ると、```synchronized```で囲んでややこしいことをしている
そして、最終的には[synchronized](https://github.com/JetBrains/kotlin/blob/037b3697ed635a52c283da7b2bf6ecd0961ce8f4/libraries/stdlib/jvm/src/kotlin/util/Synchronized.kt#L17)にたどり着く
Looker Studio用 計算フィールド用クエリ文早見表

# 概要

Looker Studioで計算フィールドを使って新しい項目を作る機会が多いので、
コピペして使えるように個人用ですがクエリ早見表を作成しました。

※コードを見やすくするためにSQL形式の表示を使用しています。

### フィールドが null ではないレコードをカウントする

```sql
SUM(CASE WHEN field_name IS NOT NULL THEN 1 ELSE 0 END)
```

### DISTINCT（重複を排除した）レコード数をカウントする

```sql
COUNT(DISTINCT field_name)
```

### フィールドが null ではなく、フィールドに特定の文言を含むレコードをカウントする

```sql
SUM(CASE
        WHEN field_name IS NOT NULL
        AND REGEXP_CONTAINS(field_name, 'search_term')
    THEN 1
    ELSE 0
END)
```

### AND を使って条件を追加する

```sql
SUM(CASE
        WHEN field_name IS NOT NULL
        AND REGEXP_CONTAINS(field_name, 'search_term')
        AND REGEXP_CONTAINS(field_name, 'another_term')
    THEN 1
    ELSE 0
END)
```

### NOTを使って特定の文言を含まないレコードをカウントする

```sql
SUM(CASE
        WHEN field_name IS NOT NULL
        AND NOT REGEXP_CONTAINS(field_name, 'search_term')
    THEN 1
    ELSE 0
END)
```

### 特定の値を持つフィールドと別のフィールドに特定の文言を含むレコードをカウントする

```sql
SUM(CASE 
        WHEN field_name = 'specific_value' 
             AND REGEXP_CONTAINS(other_field, 'term1|term2')
        THEN 1 
        ELSE 0 
    END) 
```

### 特定の条件に対するフィールドの合計を取得し、全体に対する割合を計算する

```sql
SUM(CASE 
        WHEN condition_field = 'specific_value'
        THEN target_field
        ELSE 0
    END) / SUM(target_field)
```

### フィールドが null ではないものを対象に、かつ特定の文字列「term1」、「term2」、「term3」がそれぞれ含まれていないレコードの割合を求める

```sql
IF(
    SUM(CASE WHEN field_name IS NOT NULL THEN 1 ELSE 0 END) = 0,
    0,
    SUM(
        CASE
            WHEN field_name IS NOT NULL
              AND NOT REGEXP_CONTAINS(field_name, 'term1')
              AND NOT REGEXP_CONTAINS(field_name, 'term2')
              AND NOT REGEXP_CONTAINS(field_name, 'term3')
            THEN 1
            ELSE 0
        END
    ) / SUM(CASE WHEN field_name IS NOT NULL THEN 1 ELSE 0 END)
)
```

### 特定のフィールドが特定の範囲にあるレコードをカウントする

```sql
SUM(CASE 
        WHEN field_name >= lower_bound AND field_name <= upper_bound
        THEN 1
        ELSE 0
    END)
```
Raspberry Pi 4 model B で Golangを使う

# Raspberry Pi でGolangを使えるようにする

Golang公式からlinuxのarm64をダウンロード
```
wget https://go.dev/dl/go1.23.1.linux-arm64.tar.gz
sudo tar -C /usr/local -xzf go1.23.1.linux-arm64.tar.gz
rm -rf go1.23.1.linux-arm64.tar.gz
```

```
# /usr/local/go/配下にgoがインストールされる
ls /usr/local/go/

# パスを通す
nano ~/.bashrc
export PATH=$PATH:/usr/local/go/bin
source ~/.bashrc
go version

# 適当なディレクトリで
go mod init go-sample
touch main.go
nano main.go
```
```
package main

   import {
      "fmt"
   }

   func main() {
      fmt.Println("Hello")
   }
```

## 実行
```
# go run で実行
go run main.go
go run .

# mainという実行ファイルを作成し、実行ファイルで実行
go build -o main 
./main
```

# Lチカ(LEDチカチカ)を行う

![写真.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504414/3a213fb5-1b9f-ebdf-ad53-54050201c8f0.png)

![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504414/901dfbbd-6e62-0cdf-9455-3c705285f289.png)


![名称未設定ファイル_drawio_-_draw_io.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504414/66f32617-505e-b132-b19a-eb4797a1dd18.png)


---

periph.io のすべてのコマンドラインツールとライブラリを最新のバージョンでインストール
```
go get -u periph.io/x/cmd/...
go mod tidy
```

0.5秒ごとにLEDを点滅させるプログラムをmain.goに記述
```
package main

import (
    "log"
    "os"
    "os/signal"
    "syscall"
    "time"

    "periph.io/x/conn/v3/gpio"
    "periph.io/x/host/v3"
    "periph.io/x/host/v3/rpi"
)

func main() {
    // ハードウェアの初期化
    if _, err := host.Init(); err != nil {
        log.Fatal(err)
    }

    // GPIO4 (P1_7) のピンを取得
    pin := rpi.P1_7
    if pin == nil {
        log.Fatal("GPIO ピンが見つかりません")
    }

    // 終了時に LED を消灯するためのチャネル
    stop := make(chan os.Signal, 1)
    signal.Notify(stop, syscall.SIGINT, syscall.SIGTERM)

    // 500ミリ秒ごとに LED を点滅させる
    t := time.NewTicker(500 * time.Millisecond)
    go func() {
        for l := gpio.Low; ; l = !l {
            if err := pin.Out(l); err != nil {
                log.Fatal(err)
            }
            <-t.C
        }
    }()

    // SIGINT または SIGTERM シグナルを受け取るまで待機
    <-stop

    // プログラム終了時に LED を消灯
    log.Println("プログラムを終了します。LEDを消灯します...")
    pin.Out(gpio.Low) // LED を消灯
    t.Stop()          // タイマーを停止
}
```

## 実行
```
go run main.go
```
終了は Ctrl + C
git switchとgit checkoutって何が違うの？

## はじめに
gitコマンドでブランチを切り替える時、僕はgit switchを使うのですが、最近git　checkoutでもブランチを切り替えることができると知って、どういうふうに使い分ければいいのか疑問に思ったので調べてまとめてみました。

## checkout restore switch 
git checkout, restore, switchコマンドができた経緯としては、git checkoutコマンドの機能が多いことにより、git restore,git switchに機能を分けるという経緯から生まれました。

では細かい機能について見ていきます。

## git switch
ブランチを切り替えるためのコマンドです。

https://git-scm.com/docs/git-switch

既存のブランチに切り替える場合
 ```
 git switch <branch>
 ```
 新しいブランチを作成し、かつ切り替える場合
 ```
 git switch -c <branch>
 ```

 同じ名前のブランチがある場合に、上書きして切り替える場合
 ```
git switch -C <branch>
 ```


## git restore 
ファイルを元に戻すためのコマンドです。

https://git-scm.com/docs/git-restore

ファイルの内容を変更したが、addまではしていない場合
```
git restore <file>
```
ファイルの内容を変更し、addはしたが、commitはしていない場合
```
git restore --staged <file>
git restore <file>
```
一つ目のコマンドで、ファイルをステージング前の状態に戻し、
二つ目のコマンドで、ファイルを変更前の状態に戻します



## git checkout
ブランチを切り替える、ファイルを元に戻す、過去のファイルの状態を復元するという3つの機能があります。

https://git-scm.com/docs/git-checkout

既存のブランチに切り替える場合
 ```
 git checkout <branch>
 ```
 新しいブランチを作成し、かつ切り替える場合
 ```
 git checkout -b <branch>
 ```

 コミットとファイルのパスを指定し、特定のファイルを復元する
 ```
 git checkout <commit> <file>
 ```

 addしていない変更をとり消す
 ```
git checkout <file>
 ```

 ## 最後に
 checkoutにこんなにも色々な機能があるなんて驚きました。確かにこんなに機能があるなら、switchとrestoreに分けられた方が、使いやすいなと思います。
 結局ブランチを変更する際には、checkoutとswitchのどちらでも良さそうです。