OmniAICreator/Qiita-1.07M huggingface dataset:
Kubernetes Monitoring with Prometheus & Grafana

## Install Prometheus & Grafana
```sh
kubectl create namespace monitoring

helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo add grafana https://grafana.github.io/helm-charts
helm repo update
helm install prometheus prometheus-community/prometheus --namespace monitoring
helm install grafana grafana/grafana --namespace monitoring
```
## Config Grafana

- Get password: 
```sh
kubectl get secret --namespace monitoring grafana -o jsonpath="{.data.admin-password}" | base64 --decode ; echo
```
- Port forward: 
```sh
kubectl --namespace monitoring port-forward deploy/grafana 3000
```
- open http://localhost:3000 in browser, login user: admin

- Add data source: http://prometheus-server.monitoring.svc.cluster.local

- Create Dashboard then get from: https://grafana.com/grafana/dashboards/

EOF
AWS Cloud WAN &  AWS Direct Connect SiteLink（個人学習まとめ）


## AWS Cloud WANとは
（一言でいうと）
　「企業がグローバルなWANを簡単に構築、管理、監視出来るようにするためのサービス」
　　→複雑なNW構成をシンプルにし、運用コストを削減することが可能

  https://aws.amazon.com/jp/blogs/news/introducing-aws-cloud-wan-preview/
  

##### 主要な特徴と利点
###### 1\. グローバルNWの迅速な構築
　数分でグローバルNWが構築可能
　AWSのバックボーンを利用して海外の拠点とも容易に接続が可能
 （今のGBB網が要らなくなる...!?）
 
###### 2\.統合管理と監視
　統合されたダッシュボードを通じて、NW全体の連携、監視、管理が可能
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3879433/0751ad59-82c6-a450-aeca-c52cd30d0d87.png)


 
###### 3\. セキュリティとセグメンテーション
　トラフィックをセグメント化することで、機密性の高いデータを通常のデータから分離し、セキュリティを強化

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3879433/5555e19e-c13c-0b55-077e-6eb87cef27a0.png)


（「サービス挿入」によって利用者がFWやIDS/IPMなどのアプライアンスを導入することも出来るみたい）
 
https://aws.amazon.com/jp/about-aws/whats-new/2024/06/aws-cloud-wan-service-insertion/
 
###### 4\. ポリシーベースの管理
　インテントベースの設定により、ポリシーツールを集約し、ネットワークの複雑さを軽減します。これにより、管理が簡素化され、運用効率が向上

 :::note info
インテントベースとは？
管理者がネットワークに求める「意図」からシステムが直接ネットワークを構成・管理する仕組み
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3879433/49e86e5e-0da9-21f8-c9b5-6135e55884d6.png)
https://www.netone.co.jp/knowledge-center/blog-column/20220905-1/
:::


## AWS Direct Connect SiteLinkとは
（一言でいうと）
「AWSバックボーンを活用した（グローバル）拠点間通信を可能にするサービス」

 :::note info
Cloud WANはサービスの名称
Direct Connect SiteLinkはDirect Connect（DX）の機能の１つ
:::

##### 主要な特徴と利点
###### 1\. 拠点間通信の効率化
DXロケーションをNWプロバイダーのPOPのように使用し、AWSバックボーン介して拠点間通信が可能
※VPCを介さずに直接通信

↓DXロケーション一覧↓

https://docs.aws.amazon.com/ja_jp/directconnect/latest/UserGuide/Colocation.html#cross-connect-us-east-2


###### 2\. コスト効率の向上
　初期費用が不要の従量課金制のため、国際MPLS通信コストを大幅に削減可能
 
:::note
MPLSとは？
IPアドレスの代わりにラベルを使用することで、通信ネットワーク全体のネットワークトラフィックをルーティングする手法
※ルーターがパケットごとに時間のかかるルートルックアップを実行する必要がなくなり、パケット転送を高速化することが可能

https://www.arubanetworks.com/ja/faq/what-is-mpls/
:::


#### グローバル拠点間の通信はCloud WAN？ DX SiteLink？
→DX SiteLinkが可能ならSiteLinkの方がVPCを介さず通信速度とコスト面でGood！
 　※アクセスタイプによって選ぶ

 * 各地域でアクセスタイプが異なる場合「Cloud WAN」
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3879433/2864b4e9-8397-2da8-95e3-af60bfb731a8.png)

* 両地域ともアクセスタイプが固定回線の場合「DX SiteLink」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3879433/510f4faf-e2a7-519a-d296-fafc3c2069d2.png)


:::note
アクセスタイプとは？
AWSへ接続するための接続方法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3879433/baf99f5c-6b71-578c-5767-8bd71fc5c79d.png)

:::

（公式のFAQだとこんな感じ）
Q: AWS Direct Connect SiteLink と AWS Cloud WAN は、いつ使い分ければよいですか?

```
ユースケースに応じて、どちらか一方、または両方を選択することができます。
Cloud WAN は、複数のリージョンにまたがる VPC のネットワークを作成し、管理することができます。
一方、AWS Direct Connect SiteLink は、DX ロケーション同士を接続し、
AWS リージョンを迂回してパフォーマンスを向上させます。
AWS Direct Connect は、将来的に Cloud WAN ネットワークで利用できるようになる
複数の接続オプションの 1 つです。
```
https://aws.amazon.com/jp/directconnect/faqs/

CloudWANとTGWの違いは以下の記事が分かりやすかったため割愛。

https://qiita.com/tonkatsu_oishi/items/63a003731202668c82b6
【UiPath】ヘッダーのカラムが不足しているCSVを読み込む

「ヘッダーのカラムが不足しているCSV」とは、つまるところヘッダーより多くの列を含む行が存在するCSVです。
例として以下のCSVでは、ヘッダーにあたる1行目が3つの列（A,B,C）なのに対し、3行目は4つの列（4,5,6,7）を含んでいます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/2f32068c-e90d-76ea-daa1-38c35cb0e808.png)

このようなCSVを「CSVを読み込み」アクティビティで読み込んだ場合、`インプット.csv の CSV ファイル形式は無効です。行 x は、ヘッダー行よりも値を多く含んでいます`と実行エラーになります。また、このエラーは「先頭行をヘッダーとする」プロパティのオンオフに関わらず発生します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/9ea90c79-7735-485b-b33f-6f7a722ae9ed.png)

「CSVを修正する」というのが真っ当なアプローチではありますが、時と場合によってはこのようなCSVを読み込まざるを得ない場合もあるでしょう。その際に使える方法を紹介します。



## 1．ExcelでCSVを保存し直してから読み込む

CSVを一度Excelで開いて保存すると、自動的に不足分のカラムが保管され、空白のカラム名が足されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/de3bdc38-ad07-ce92-9100-05c35520a512.png)

これを利用したのが、一度Excelで開いて保存してからCSVを読み込む以下のワークフローです。「CSVを読み込み」の前にExcelプロセススコープを配置し、開いて保存という動作だけを行わせます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/232070d1-3464-2fd8-5fe2-1fd328ccbf96.png)

実行結果です。
以下のように正常に読み込むことができました。なお、空白のカラム名に対しては"Column + 数字"という名前が連番で割り振られていきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/16516b5a-63c3-1eb9-7305-462a621c2425.png)


## 2．テキストで読み込みデータテーブルに変換する

こちらは「CSVを読み込み」を使わずに読み込むパターンです。
CSVをテキストデータとして読み込み、「テキストからデータテーブルを生成」でデータテーブルに変換します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/2401b782-bd3b-35e8-a868-3af9da37d8ec.png)

注意点として、「テキストからデータテーブルを生成」のプロパティは以下のように設定してください。

- 「列ヘッダーを使用」と「CSV解析」をオンに変更
- 「CSVを読み込み」と同様に全列をString型としたい場合は、「型を自動検出」をオフに変更

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/9a7fd8a4-cdaa-5336-8905-17aa6b44d9b0.png)

実行結果です。
こちらもCSVを一度Excelで開いて保存した場合と同様に、正常に読み込むことができました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/624441c5-9bfb-592a-9e38-6bd9092129ee.png)

## 動作環境
UiPath.System.Activities 24.10.3
生成AIとデータエンジニアリング：実践者が必要とするツール

[Data Engineering and GenAI: The Tools Practitioners Need \| Databricks Blog](https://www.databricks.com/blog/data-engineering-and-genai-tools-practitioners-need)の翻訳です。

:::note warn
本書は著者が手動で翻訳したものであり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
:::

最近のMIT Tech Reviewのレポートでは、調査対象の企業の71%では、自身の生成AIモデルを構築しようとしているということが示されています。多くの企業では、彼ら自身の独自データをそれらのモデルで活用できるようにする取り組む際に、同様の困難な事実に直面しています: 世界におけるベストな生成AIモデルは、優れたデータなしには成功しないということです。

この現実は、膨大なデータを効率的に取り込む、あるいはストリーミングでき、高いデータ品質を保証する高信頼のデータイプラインの構築の重要性を強調しています。言い換えると、優れたデータエンジニアリングは、すべてのデータとAIに関する取り組み、特に生成AIにおいては重要なコンポーネントであるということです。

# コアとなる機能

データエンジニアにとっては、取り組みは3つの主要なタスクにまたがることになります:

- **取り込み:** 様々なソースからのデータ取得 - オンプレミスやクラウドストレージサービス、データベース、アプリケーションなど様々なものを一箇所に。
- **変換処理:** フィルタリング、標準化、クレンジング、集計処理を通じて生データを使える資産に。多くの場合、企業は処理の様々なステージを定義するためにメダリオンアーキテクチャ(ブロンズ、シルバー、ゴールド)を使うことでしょう。
- **オーケストレーション:** 取り込みや変換処理のスケジューリングや監視の処理、データパイプライン開発の他のパーツの監視や障害対応。

# AIへのシフト

AIに焦点が当たるようになって、これらの機能おいて以下のような新たな課題が生じています:

- **リアルタイムデータへの対応:** 多くの企業では情報を即座に処理する必要があります。これは、機械の健康状況を最適するためにAIを活用する製造業者や、不正な行動を止めようとする銀行や、お客様にパーソナライズされた提案をしたい小売業者であるかもしれません。これらのリアルタイムデータストリームの成長によって、データエンジニアによって対応する必要がある新たな資産が出現してきました。
- **データパイプラインのスケーリング:** データパイプラインが増加することでビジネスにおけるコストが増加します。障害が発生した際の監視やトラブルシュートに対する効果的な戦略なしには、内部チームはコスト低減とパフォーマンス改善に苦慮することになるでしょう。
- **データ品質の保証:** モデルに入力されるデータの品質は、出力の品質を決定することになります。企業においては、さらなるAIシステムを現実世界に提供するために必要とされる最終的なパフォーマンスを提供するために、高品質なデータセットが必要となります。
- **ガバナンスとセキュリティ:** 我々は毎日お客様から以下のようなことを聞いています: データはどこにでもある。そして、内部のチームは自分たちのユニークなプロセスのために、自分たちのビジネスに存在しているプロプライエタリなシステムにロックインされている情報を活用したいという要望が高まっている。これは、成長し続けているデータ領域を統合し、従業員がそれらの資産にアクセスできるようにするたために、ITリーダーへの新たな圧力を付け加えることになりました。

# プラットフォームのアプローチ

これらの広範かつ成長し続ける課題に対応できるようにするために、我々はデータインテリジェンスプラットフォームを構築しました。エンジニアリングチームにおける最も重要な機能には以下があります:

- **Delta Lake:** 非構造化データであろうが構造化であろうが。オープンソースストレージフォーマットは、企業でとりこうもとしている情報の種類がもはや問題でないことを意味しています。Delta Lakeによって、企業によるデータ品質の改善の助けとなり、外部のパートナーとの容易でセキュアな共有が可能になります。そして、HudiやIcebergの壁を打ち壊すDelta Lake UniFormによって、企業は自身の資産に対する緊密な制御を維持することができます。
- **Delta Live Tables:** エンジニアリングチームを支援するパワフルなETLフレームワークは、コストを削減するためにPythonとSQLの両方におけるストリーミングとバッチのワークロードの両方をシンプルにします。
- **Databricksワークフロー:** エンジニアリングチームに強化されたフロー制御の能力、ワークフローの実行を監視、可視化する高度な観測可能性、スマートなスケーリングと効率的なタスク実行のためのサーバレスコンピュートを提供するデータとAIのためのシンプルかつ信頼できるオーケストレーションソリューションです。
- **Unity Catalog:** Unity Catalogによって、データエンジニアリングとガバナンスチームは、権限管理、中央管理の監査、カラムレベルまでのデータリネージの自動追跡、プラットフォーム、クラウド、リージョン横断のデータ共有に対する単一のインタフェースによる企業横断のデータカタログのメリットを享受することができます。

どのようにしてあなたの企業のエンジニアリングチームを、AI時代における要件に適応させるのかを学ぶには、「[Big Book of Data Engineering](https://www.databricks.com/resources/ebook/big-book-of-data-engineering)」をチェックしてください。


### はじめてのDatabricks

[はじめてのDatabricks](https://qiita.com/taka_yayoi/items/8dc72d083edb879a5e5d)

### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
インポートされたjavax.servletは見つかりませんというエラー

EclipseでSpringBootでjavaファイルに以下をインポートしようとしてもうまくいきません
```
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
```


gradle.buildに、以下を追記して
```
dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    // javax.servletの依存関係を追加
    providedCompile 'javax.servlet:javax.servlet-api:4.0.1'
}
```
以下のコマンドで、gradleをリフレッシュしても解決しません
```
./gradlew build --refresh-dependencies
```

どのようにすればインポートできますか
システムクロックとハードクロックの違いについてまとめた備忘録

# 前置き

Linuxサーバを操作していた際に、時間が大幅にずれていたことがありました。
時刻を修正する際に、クロックについて調べたら2つのクロックがあり、違いについて具体的にイメージできなかったため備忘録としてまとめたものです。

# システムクロックとは
システムクロックは，Linuxが管理する時計です
特徴は以下です
```
・OSが稼働中に使用される時計
・メモリ上に保持され、OSによって時間が刻まれる
・システム起動時にハードウェアクロックから初期値を取得する
・ファイルのタイムスタンプなど、OSの各種機能で使用される
```

例： **date** コマンドで表示される時刻はシステムクロックの時刻です。 
```
# コマンド
date

#出力結果
2024年  9月  6日 金曜日 16:23:34 JST
```

# ハードクロックとは
ハードウェアクロックは、コンピュータのマザーボード上に搭載された物理的な時計です。
特徴は以下です
```
・PCの電源がOFFでも時刻を刻み続ける
・CMOS電池で駆動されるため、「CMOS時計」とも呼ばれる
・システム起動時にOSに時刻情報を提供する
```

例： BIOSの設定画面で確認できる時刻がハードウェアクロックの時刻です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/596363/67f24c21-5f5e-9bcd-54db-59b3283d7775.png)

# 具体的な動作の違い

**システム起動時**

```
ハードウェアクロック: 2024年9月6日 10:00:00
システムクロック: ハードウェアクロックから時刻を取得し、2024年9月6日 10:00:00に設定
```

**システム稼働中(1時間後)**

```
・ハードウェアクロック: 2024年9月6日 11:00:00 (独立して時を刻む)
・システムクロック: 2024年9月6日 11:00:00 (OSが管理)
```

**システムシャットダウン後**

```
ハードウェアクロック: 引き続き時を刻む
システムクロック: 消失 (次回起動時に再度ハードウェアクロックから時刻を取得)
```

両方の精度が高くないため、NTPサーバーを使用して定期的に正確な時刻に同期することが推奨されます！

# システムクロックとハードクロックの同期を自動化

Network Time Protocol (NTP)を使った同期が最も一般的で効果的。

## NTPデーモンのインストール:
多くのLinuxディストリビューションでは、ntpdまたはchronydがNTPデーモンとして使用されます。
まだインストールされていない場合は、パッケージマネージャーを使用してインストールします。

## NTPサービスの設定:
/etc/ntp.confまたは/etc/chrony.confファイルを編集して、使用するNTPサーバーを指定します。

## サービスの有効化と起動:
下記コマンド実行
```
sudo systemctl enable ntpd
sudo systemctl start ntpd
```
または
```
sudo systemctl enable chronyd
sudo systemctl start chronyd
```
これにより、システムクロックが定期的にNTPサーバーと同期されます

## ハードウェアクロックとの同期
システムクロックがNTPで同期された後、ハードウェアクロックとの同期を自動化するには以下を実行する

hwclockコマンドを定期的に実行するようにスケジュールします。例えば、cronジョブを使用する
```
sudo crontab -e
```
エディタ上に以下を追加
```
0 * * * * /sbin/hwclock --systohc
```
これにより、毎時0分にシステムクロックからハードウェアクロックへ時刻が同期されます!

または、システムの起動時と終了時にハードウェアクロックを更新するスクリプトを作成し、システムの起動/終了プロセスに組み込みます。

私の方でcron設定について別記事を書いています。
cronについて確認したい方は参考にどうぞ！


https://qiita.com/tacky0127/items/ec13bb057dd987cd67a7


# 補足
下記は同期における補足です

```
・ほとんどの現代のLinuxシステムでは、NTPサービスが既定で有効になってます。
　システムクロックとハードウェアクロックの同期が自動的に行われます。

・タイムゾーンの設定が正しいことを確認してください。
　これはUTCとローカル時間の変換に影響します。

・仮想マシンや一部のクラウド環境では、ハードウェアクロックへのアクセスが制限されている場合があります。
　そのような環境では、システムクロックの同期のみに焦点を当てる必要があります。
```
これらの方法を使用することで、システムクロックとハードウェアクロックの同期を効果的に自動化できます。

以上になります。お疲れ様ででした。
学習の参考になれば幸いです。
32BitサーバでSJIS→UTF-8(BOM付)→UTF-8(BOM無)変換のサンプルソース

32BitサーバでSJIS→UTF-8(BOM付)→UTF-8(BOM無)変換のサンプルソース

```SJIS_to_UTF8.vbs
Option Explicit

On Error Resume Next

' 定数定義
Const adCRLF = -1               '改行コードCRFL
Const adLF = 10                 '改行コードFL
Const adReadLine = -2           'ストリームから次の行を読み取り(LineSeparator指定)
Const adWriteLine = 1           '文字を改行付きで書き込む
Const adTypeBinary = 1          'バイナリモード
Const adTypeText = 2            'テキストモード
Const adSaveCreateOverWrite = 2 '指定したファイルが既に存在する場合、上書き

'変数定義
Dim objInput,objTemp,objOutput
Dim FILEPATH
Dim FILENAME
Dim INPUTFILE

'ファイル操作オブジェクト
Dim objFso

'引数を設定
FILEPATH = Wscript.Arguments(0)
FILENAME = Wscript.Arguments(1)

'変換対象ファイル名を設定
INPUTFILE= FILEPATH & "\" & FILENAME

'ファイル存在チェック
SET objFso = CreateObject("Scripting.FileSystemObject")

If objFso.FileExists(INPUTFILE) Then
else
    '処理を中断
    SET objFso = Nothing
    WScript.Quit 1
End If

'***********************************************
'SJIS→UTF-8(BOM付)
'***********************************************
'入力ファイルオブジェクトを開き、読込設定を行う
Set objInput = CreateObject("ADODB.Stream")
objInput.Open
objInput.Type = adTypeText
objInput.Charset = "Shift_JIS"
objInput.LineSeparator = adCRLF
objInput.LoadFromFile INPUTFILE

'Tempファイルオブジェクトを開き、書込み設定を行う
Set objTemp = CreateObject("ADODB.Stream")
objTemp.Open
objTemp.Type = adTypeText
objTemp.Charset = "UTF-8"
objTemp.LineSeparator = adLF

'入力ファイルの読込
Dim lineStr
Do Until objInput.EOS
    lineStr = objInput.ReadText(adReadLine)
    objTemp.WriteText lineStr, adWriteLine
Loop

'入力ファイルオブジェクトを閉じる
objInput.Close
Set objInput = Nothing

'***********************************************
'UTF-8(BOM付)→UTF-8(BOM無)
'***********************************************
'出力ファイルオブジェクトを開き、書込み設定を行う
Set objOutput = CreateObject("ADODB.Stream")
objOutput.Type = adTypeBinary
objOutput.Open

'ストリームの位置を先頭に戻す（Typeプロパティ変更のため）
objTemp.Position = 0

'バイナリモードに変える
objTemp.Type = adTypeBinary

'ストリームの位置を先頭3Byte(EF BB BF)の後ろに移動する
objTemp.Position = 3

'BOMなしのバイナリデータを出力ストリームへコピー
objTemp.CopyTo objOutput

'Tempファイルオブジェクトを閉じる
objTemp.Close
Set objTemp = Nothing

'バイナリの内容をファイルに保存（上書き）
objOutput.SaveTofile INPUTFILE, adSaveCreateOverWrite

'出力ファイルオブジェクトを閉じる
objOutput.Close
Set objOutput = Nothing

WScript.Quit 0
```

**【注意点】**
32Bitの古いWindowsServerなどでは、ファイルサイズが256MBを超える場合、UTF-8(BOM付)→UTF-8(BOM無)へ変換する際に、３バイト分ポジションをずらしたバイナリを下記のように一気に.Readすると、Dimの変数が、Long型の暗黙変換で、256MBの制限にひっかかってしまう。（0バイトとファイルが出力されてしまう。）

```
'入力ファイルの読込
Dim objOutput
objOutput = objTemp.Read(-1)
```

**（参考）Size プロパティ (ADO Stream) | Microsoft Learn**
https://learn.microsoft.com/ja-jp/office/vba/access/concepts/miscellaneous/size-property-ado-stream

**【解決策】**
暗黙変換されたLongに、バイナリを入れるのではなく、"ADODB.Stream"の出力ファイルオブジェクトに３バイト分ポジションをずらしたバイナリObjを.CopyToすることで、Long型の256MB制限にひっかかることなく、BOM無しファイルを出力する事ができる。

```
'BOMなしのバイナリデータを出力ストリームへコピー
objTemp.CopyTo objOutput
```
本当にあった怖い話～スタッシュしたファイルが消えた！？～

この夏いちばんゾッとしたお話🤐

## 🤡 はじまり

プロジェクトでGitを使っていて、変更をpushする前にリモートブランチをpullしようとしたところ競合が起きました。

でも大丈夫！慌てず騒がず最近覚えた「スタッシュ」機能を使うゥ！！

ということでローカルブランチの変更内容をスタッシュして、
リモートブランチをpullしてきて
その後さっきのスタッシュした変更内容を適用するっと🤗これでおっけー...?

あれれ、ローカルブランチで**今回新規作成したファイル**が消えている！！！
スタッシュされてないじゃん！！ひい、、、

## 👻原因

スタッシュするとき、新規作成したファイルをステージングしていなかったこと。

たったこれだけのことでした。

これを怠ると新規作成判定のファイルはスタッシュされず亡き者になってしまうようです。

削除したファイルはちゃんとスタッシュに入れてくれるのに、新規作成はだめなんですね🙄(未追跡のファイルだから)



## 🐱‍🏍解決方法

解決方法は

**<span style="color:red">新規作成ファイルをステージングしたのちスタッシュする**</span>

これだけです
たぶん基本の「き」なのですが、まったく知識不足でした


## 🍜 〆

スタッシュしたい内容の中に、変更ではなく新規作成(未追跡)のファイルがあるときは必ずステージングしましょう！！

ファイルが消えた...！？と結構ショッキングでした🚑

私はこの事件以降、スタッシュ前にステージングされているファイルを必ず確認するようになりました。(あたりまえ)

まだまだGitと仲良くなれないあ
ということで、皆さんもお気をつけて。。。

ちなみに私が人生で一番ぞっとしたのは、小学校１年生のとき
おばあちゃんの家で女の子の幽霊を見たことです(´・ω・)
家族のだれからも信じてもらえませんでした。悲しい。
<Cisco Packet Tracer> DHCPコマンド

自分への備忘録として作成。
## DHCPサーバへの設定
### アドレスプールの作成
DHCPサーバへの設定のために、アドレスプールを作成する。
以下のコマンドをグローバルコンフィグレーションモードで実行。
```
(config)#ip dhcp pool  <プール名>

例:
(config)#ip dhcp pool CCNApool
```
「プール名」にはアドレスプールを識別するために自由に名前を設定可能。
また、このコマンドを実行すると、DHCPコンフィグレーションモードに移行し、
プロンプトも(dhcp-config)#に切り替わる。


### 配布するIPアドレスの範囲を指定
ネットワークデバイスに配布するIPアドレスの範囲を指定。
**DHCPコンフィグレーションモード**で以下のコマンドを実行。
```
(dhcp-config)#network <ネットワークアドレス> <サブネットマスク or /プレフィックス>

例:
(dhcp-config)#network 192.168.1.0 255.255.255.0 (or /24)
```

### デフォルトゲートウェイ(DG)の指定
DHCPクライアントに自動でDGの設定を行う。
**DHCPコンフィグレーションモード**で以下のコマンドを実行。
```
(dhcp-config)#default-router <DGのIPアドレス>

例:
(dhcp-config)#default-router 192.168.1.254
```

### IPアドレスのリース期間の指定
DHCPクライアントに貸し出しされたIPアドレスにはリース期間(貸出期間)がある。
設定を省略した場合、リース期間はデフォルトの１日となる。
**DHCPコンフィグレーションモード**で以下のコマンドを実行。
```
(dhcp-config)#lease <日にち(day)> [<時間(hour)> [<分(minute)>]]

例:
(dhcp-config)#lease 10 12 30
↑の設定で、リース期間は１０日と１２時間と３０分となる
```

### DNSサーバの指定
DGと同様にDHCPクライアントにDNSサーバのIPアドレスを指定する。
アドレスは８つまで登録可能。
**DHCPコンフィグレーションモード**で以下のコマンドを実行。
```
(dhcp-config)#dns-server <DNSサーバのIPアドレス> [<DNSサーバのIPアドレス>...]

例:
(dhcp-config)#dns-server 192.168.1.253
```

### 貸出除外アドレスの指定
貸し出すIPアドレスの範囲を指定したように、貸し出さないアドレスまたはその範囲を指定することができる。
**グローバルコンフィグレーションモード**で以下のコマンドを実行。
```
(config)#ip dhcp excluded-address <開始アドレス> [<終了アドレス>]

例:
(config)#ip dhcp excluded-address 192.168.1.1 192.168.1.11
→192.168.1.1から192.168.1.11までを割り当てアドレスから除外。
```
※「終了アドレス」を省略した場合、「開始アドレス」のみ貸し出しから除外される。

## DHCPクライアントの設定
ネットワークデバイスと同様にルータのインターフェイスにもDHCPでIPアドレスを割り当てる場合、ルータでDHCPクライアントの設定を行う必要がある。
IPアドレスを割り当てたいインターフェイスの**インターフェイスコンフィグレーションモード**で以下のコマンドを実行。
```
(config)#interface fastethernet 0/1
(config-if)#ip address dhcp
```

## DHCPの確認
### アドレスプールの確認
DHCPサーバに設定したアドレスプールを確認するには、
特権モードで以下のコマンドを実行。
```
#show ip dhcp pool
```
このコマンドで、「現在貸し出し中のアドレス」「IPアドレスの範囲」「次に貸し出すアドレス」などが確認できる。

### IPアドレス割り当て状況の確認
特権モードで以下のコマンドを実行。
```
#show ip dhcp binding
```
このコマンドで、「貸し出したIPアドレスとMACアドレスの対応表」「貸し出し期限」などが確認できる。

## DHCPクライアントの確認
DHCPクライアントであるルータにどういったIPアドレスが割り当てられたかは、`show runninng-config`コマンドでは確認できない。
ip address dhcpと入力したコマンドが表示される。
よって、割り当てられたIPアドレスなどの情報は以下の３つのコマンドで確認できる。
```
・show ip interface brief
・show interfaces <インターフェイスの番号>
・show dhcp lease
```
`show ip interface brief`コマンドと`show interfaces`コマンドでは、
どのインターフェイスにどのIPアドレスが割り当てられたか確認できる。
加えて、`show interfaces`コマンドではサブネットマスクも確認できる。

show dhcp leaseコマンドではIPアドレスの情報に加えて、DHCPサーバのIPアドレスやリース期間なども確認できる。

## DHCPリレーエージェントの設定
設定するインターフェイスの**インターフェイスコンフィギュレーションモード**で以下のコマンドを実行。
```
(config-if)#ip helper-address <DHCPサーバのアドレス>

例:
(config)#interface fastethernet 0/1
(config-if)#ip helper-address 192.168.1.1
```
※ブロードキャスト(DHCP DISCOVER)が着信するインターフェイスに設定する。
UnoCSS: [暫定対処方法] UnoCSSを適用したら、デザインの横幅いっぱいが出来なくなった場合

:::note warn
UnoCSSの公式やGitHubを見ても元々メディアクエリのブレークポイントによって、max-widthが設定されるなんて書いてないので、一時的なものか私の設定（注意してみて見つからなかったのですが）かもしれません
:::
一応、誰かの参考になればとめも

# 環境
M1 Macbook Pro
React
TypeScript
UnoCSS 0.62.2


# 経緯
通常のCSSでまず作って、横幅いっぱいのデザインだったものが、UnoCSSを導入して、まだCSSを移行していない状態で、横幅いっぱいにならなくなった。
`w-full`、`w-screen`も効かず

なにやらメディアクエリで `max-width`が設定されている....？？？
（画面は[Udemyの講座](https://www.udemy.com/course/react-product-development/?couponCode=TW_REPLY_202409)のです）
![CleanShot 2024-09-06 at 16.48.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435274/d094dfcd-78f7-150c-bfce-f5d74ab8113b.png)

# 対処法
とりあえず横幅いっぱいにしたいdiv要素は「container」てクラス名を付けてるので、
```diff_typescript: uno.config.ts
import {
  defineConfig,
  presetAttributify,
  presetUno,
  transformerAttributifyJsx,
} from "unocss";

export default defineConfig({
+  shortcuts: {
+    container: "w-full",
+  },
  presets: [presetAttributify(), presetUno()],
  transformers: [transformerAttributifyJsx()],
});
```

で横幅いっぱいになりました。

適用後

![CleanShot 2024-09-06 at 16.53.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435274/ff27b6a1-67f2-25e4-0330-5bf0a3a034b9.png)

なんでしょうね。しばらくしたら直ってるかもしれません。ちょっとよく分からないです。
PowerVC 管理外操作による影響の注意とVLAN自動削除設定について

#### はじめに

PowerVCの運用上の注意点として、① PowerVC管理外操作による影響、②PowerVCがVLANを自動削除することがある、という2点について記載します。

<br>

<font color="Grey">(PowerVC が勝手にあれこれすることに懸念があることを何度か聞いており今回記載しました)</font>

<br>


----

#### 対象

IBM PowerVC : IBM Power の仮想化、プロビジョニング製品


https://www.ibm.com/jp-ja/products/powervc

https://qiita.com/c_u/items/41e87f5d0e0417c74395

----

#### ① PowerVC管理外操作による影響

下記のマニュアルにありますように、PowerVC 管理外でVM(Virtual Machine, 仮想マシン)停止を行うと、PowerVCが把握している仮想マシンの状態に戻そうとする動きをすることがあります。
<br>
つまり、HMC(Hardware Management Console, IBM Powerの管理コンポーネント)などで 仮想マシンの停止を実施したにもかかわらず、PowerVC側では起動状態で認識されているため、PowerVCからHMCに対して起動を実施することがある、ということです。

<br>


https://www.ibm.com/docs/ja/powervc-cloud/2.2.1?topic=administrator-limitations-when-managing-resources-outside-powervc

> PowerVCでリソースの管理を開始するときに、特定の操作をリソースに対して直接実行したい場合があります。 例えば、 PowerVCを使用して仮想マシンを管理しているが、別の方法を使用して仮想マシンを停止するとします。 この場合、 PowerVC は、仮想マシンが停止したことを通知されず、仮想マシンの更新された状況を即時に反映しない可能性があります。 PowerVC は通常、次回 PowerVC を使用してリソースを管理するときに、更新されたリソースを取得するためにそのリソースをポーリングします。 その結果、 PowerVC の仮想マシンの状態が仮想マシン自体の状態と同じになるまで、 PowerVC からの操作は失敗する可能性があります。

<br>
<br>

ただし、毎回同じようにPowerVC が起動させるような動きをするとは限らず、同じくPowerVCも停止状態を認識して状態を停止に変更させることもあり、タイミングや状況によって発生する内容が違う様子です。

<br>
<br>

PowerVC 管理のリソースをPowerVC管理外で削除すると、PowerVC内に削除されない残存定義が発生するということもあります。(製品サポートに消し方を聞かなければならずちょっと大変)

<br>
<br>


PowerVC管理のサーバーをPowerVC管理外で操作にはご注意ください、という注意喚起まで。




----

#### ②PowerVCがVLANを自動削除することがある

<br>

以前のバージョンのPowerVC で、LPM(Live Partition Mobility, 仮想マシンの筐体移動) を行うと、VLANが削除されている! ということが発生するケースがありました。


下記のTechnoteは PowerVC 1.3系(すでにEOS)の時代の内容ですが、VLAN 自動クリーンアップ設定の **"automated_powervm_vlan_cleanup"** がデフォルトで True (有効) でした。

https://www.ibm.com/support/pages/node/687597


> "automated_powervm_vlan_cleanup" sets True by default.

有効化されている場合、ある筐体から移動したVMが持っていたVLANが使われていない場合に、PowerVC が対象筐体/VIOS(Virtual I/O Server) の SEA(Shared Ethernet Adapter) からそのVLANを削除してしまう動きが発生します。


<br>
<br>

最近のPowerVC V2 系では、auto-pvmvlan-clnup の値が同じ設定にあたりますが、デフォルト設定値は "False" (無効)です。


```
# powervc-config compute auto-pvmvlan-clnup
Management Server : automated_powervm_vlan_cleanup = False
Server-xxxx-xxx-xxxxx : automated_powervm_vlan_cleanup = False
```

[PowerVC CLI コマンド](https://www.ibm.com/docs/ja/powervc-cloud/2.2.1?topic=cli-commands)
> powervc-config 
　　compute 
　　　auto-pvmvlan-clnup

> これが有効になっている場合、 PowerVC は、仮想マシンのマイグレーション後に VLAN を削除します。 -host パラメーターを使用してホスト名を指定すると、このアクションはそのホストに対してのみ行われます。 ホストを指定しない場合、このアクションはすべての登録済みホストに対して行われます。


最近のPowerVCではデフォルトでは自動的にVIOS のVLAN削除は実施されない設定となっています。

<br>

以上です。
Qiita初投稿 自己紹介とこれから何について書いていくか

## はじめに
文章を書くのが苦手なので何を書くか悩みますね。
まずQiitaを始めたきっかけを書きましょう。
きっかけは友人とゲーム開発を始めたことです。友人とは大学で出会って、趣味も似通っていて1回生のころからゲーム開発をやってみるかという話が出ていました。
いまは大学も2回生の夏休みを迎えて就活まであと1年という時期です。自由に使える時間も限られてくる中で、趣味とプログラミングの知識、あわよくば就活で使えるだけの実務経験のような何かが欲しかったのです。
趣味の比重が高いけど。趣味と仕事どっちもゲーム関連はきつい。
とにかくゲーム開発の軌跡として書いていきます、このQiita記事はその第1歩ということです。

## 自己紹介
長々と導入を書いたところで、ほかの方の初投稿を見ていると自己紹介をしている人が多いので私もしておきましょう。

関西の大学の情報系学科に通う2回生のとめです。(特に名前にこだわりはありません本名からとりました。ゲームアカウントとか大体これ。)
プログラミング経験は大学に入ってからJSを触ったのが初めてです。触ったことのある言語をリスト化しておきましょう。
* (HTML CSS)
↑
(エンジニアの方々にとってはプログラミング言語??だから書くか迷ったけど一応)
* JS
* C
* Python
* Lua
* C#

Luaが異質ですね。興味本位で触っていた時期があります。理解度はJSとC#が高めかな？Pythonはゲーム開発にシフトしたこともあってサークル活動でちょっと触ってみた程度です。基礎文法だけですね。

はじめにでも書きましたが、一応プログラミング経験は1年です。言語ごとの仕様を見るのがプログラミングをしていて面白いところですね。自分で言うのもなんですが大学から触ったにしては割とできている方なのではないでしょうか。とにかく書いていてたのしいです。
Qiitaでは主にC#について投稿していきますのでよろしくお願いいたします!

## これから何について書いていくのか
ここまで読んでくださる方はなかなかいないかもしれませんが、本題をやっと書きます。
さて、自己紹介で何となくわかる方も多いと思いますが、現在進行形でUnityを使って友人と共同開発という形でゲームを製作しています。

具体的なゲーム内容とかはあまり詳しくは書けませんが(友人のアイデアもあるので私の一存で発信するのは気が引けるため)、使用しているツール、アルゴリズム、アイデア、調べて分かったことなどを発信していければなと思います。
C#初学者ゆえの間違いやもっと効率的な書き方があるというコメントはドシドシ書いてくださるとうれしいです。

Qiitaに書くことで、自分の理解度のチェックや間違いの指摘をしてもらえる機会が増えればうれしいですし、Unity初学者の方とのつながりや自分のアイデアが広がればいいなと思っております。

## 最後に
保険をかけておきましょう。一応初学者です。C#の勉強を頑張ってはいますが、やっぱり理解できないものもあります。間違いとかはやさしーく教えてくれるとうれしいです。この記事見ていないと意味ないけど。

次の記事はUnity共同開発の課題を書きましょうかね。
* プロジェクトの共有
* ツール
* アクティビティ図
* クラス図
こんな内容を書くつもりです。よかったら見ていってください。
キャンペーンインフルエンス


+ [キャンペーンインフルエンス](https://help.salesforce.com/s/articleView?id=sf.campaign_influence_parent.htm&type=5)


# キャンペーンインフルエンス

+ [キャンペーンインフルエンスを手動で作成したいのですが、商談のインフルエンス関連リストに追加ボタンが出て来ません。](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000Pjsjy)

カスタムキャンペーンインフルエンスモデルをデフォルトモデルに設定したら、

新規ボタンが表示されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/61fa8ef7-a1ac-85fc-e642-2261e8250af4.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/2d3ab956-f0e2-6b78-8007-f470ac4a0164.png)

https://salesforce.stackexchange.com/questions/247377/add-to-campaign-button-missing-on-campaign-influence-related-list

カスタムキャンペーンインフルエンスモデル?

+ [カスタムキャンペーンインフルエンスモデルの作成](https://help.salesforce.com/s/articleView?id=sf.campaigns_influence_customizable_create_model.htm&type=5)

1. [設定] から、[クイック検索] ボックスに「インフルエンス」と入力し、[モデルの設定] をクリックします。
2. [新規属性モデル] をクリックします。
3. 名前、一意の名前、モデルの説明を入力します。
4. 関連リストにモデルのデータを表示するには、[デフォルトのモデル] を選択します。
5. ユーザーがインフルエンスレコードを作成または編集できないようにするには、[ロック済み] をクリックします。
6. [レコードの設定] ドロップダウンで、インフルエンスレコードをすべてのレコードで作成するか、収益属性が 0% よりも上回っているレコードでのみ作成するかを選択します。
7. 作業を保存します。


モデルが作成されたので、Apex トリガーを設定するか、API を使用してインフルエンスレコードを作成できます。

カスタムモデルがデフォルトに設定されている場合、ユーザーはインフルエンスレコードを商談の [キャンペーンインフルエンス] 関連リストから手動で作成できます。
【初心者向け】mapメソッドって何？

mapメソッドとは何なのか、どう使えばいいのかを簡単に紹介していきます。

# 基本的な用途
例えば、以下のような配列があるとします。
``` ruby
numbers = [1, 2, 3]
```
この配列に収められた数字を、それぞれ２倍にしてみましょう。
単純に考えれば、以下のようなコードが思い浮かぶかもしれません。
``` ruby
doubled_number = numbers * 2
pp doubled_number 
```
しかし、変数doubled_numberの返却値は以下の通りになります。
``` ruby
[1, 2, 3, 1, 2, 3]
```
数字ではなく、配列の中身そのものが２倍になってしまいました。
それではどうすればいいのか......。

こういう時こそmapメソッドの出番です。
基本的な使い方は以下の通りになります。
``` ruby
'配列'.map {|'配列内の個々の要素'| '指示したい処理内容'}
```

それでは早速、配列numbersの中に収められた数字をそれぞれ２倍にしてみましょう。
``` ruby
doubled_number = numbers.map {|num| num * 2}
# この場合、numには配列内の数字が一つずつ収められます。
# numはこの場で名づけた変数なので、他の英単語にも置き換えられます。

=>'返却値'
[2, 4, 6]
```
今度は成功しましたね！

# 指示したい処理内容が「単一のメソッド呼び出し」の場合
次は、to_sメソッドで配列numbersの各要素を文字列（String型）に変換する場合を考えていきます。
上記のやり方に従っていけば、以下のようなコードができあがるはずです。
``` ruby
numbers = [1, 2, 3]
number_str = numbers.map {|num| num.to_s}
pp number_str

=>'返却値'
["1", "2", "3"]
```
もちろん上記のコードでも処理の目的は達成できますが、処理内容が「単一のメソッド呼び出し」の場合は、コードをもっと短くすることができるんです。
基本的な使い方はこちら。
``` ruby
'配列'.map(&:'呼び出したいメソッド')
```
早速、配列numbersに当てはめてみましょう。
``` ruby
number_str = numbers.map(&:to_s)
pp number_str

=>'返却値'
["1", "2", "3"]
```
配列内の個々の要素をブロック内の変数に置き換える手間が省けましたね！

# 指示したい処理内容が長い場合
mapメソッドを使っていると、指示したい処理内容が長くなってしまう場面に遭遇します。
例えば、下記のコードの２行目は処理内容のコードが冗長になってしまい、ちょっと読みにくいですよね。
``` ruby
numbers = [1, 2, 3]
defined_numbers = numbers.map {|num| num > 2 ? "#{num * 100}は大きい" : "#{num * 10 }は小さい"}
pp defined_numbers

=>'返却値'
["10は小さい", "20は小さい", "300は大きい"]
```
こういうときは、do...endのブロックで処理内容を囲むのがおすすめです。
``` ruby
'配列'.map do |'配列内の個々の要素'| 
    '指示したい処理内容'
end
```
こちらの式も配列numbersに当てはめてみましょう。
``` ruby
defined_numbers = numbers.map do |num|
    num > 2 ? "#{num * 100}は大きい" : "#{num * 10 }は小さい"
end
pp defined_numbers

=>'返却値'
["10は小さい", "20は小さい", "300は大きい"]
```
改行が入ることで、指示したい処理内容が読みやすくなりました！
状況に応じて式の書き方を使い分けられれば、より読みやすく簡潔なコードを書くことができるようになります。
Wealth Management Company in Gurugram

Wealth Management
Attain your financial objectives through personalized investment portfolios tailored to your specific risk tolerance.

Wealth management can sometimes seem unexciting to the point that it's often the last thing on most people's minds. However, it's a crucial practice that should commence as soon as you receive your first paycheck

Let us help you understand in more detail.

What does wealth management entail?
Wealth management encompasses the strategic utilization of your financial resources to secure and enhance your financial well-being, ultimately aiming for financial freedom.

Ok, but what do you mean by financial freedom?
Financial freedom means no longer relying on your monthly paychecks. In other words, you have accumulated sufficient investments to sustain your lifestyle for the remainder of your life.

Sounds awesome, but can it really be done or is it just another jargon?
Certainly, it's an attainable goal. Achieving financial freedom demands meticulous planning supported by data and thorough research. This is where we step in. Our team comprises Chartered Accountants (CAs), Chartered Financial Analysts (CFAs), and MBA (finance) graduates with extensive experience in investment research spanning decades.

What all products will you be advising on?
We generally use a combination of the following products for wealth management. You may click on each product to understand about them in more detail.

Mutual Funds
Bonds
Corporate FDs
P2P investments
Startups
AIFs
PMS
What is the advantage of investing with you vs. others?
Here are some key advantages of investing with us:

Expertise: We are a team of highly qualified professionals with years of experience in investment research. Our advice is rooted in honesty and supported by thorough research.
Convenience: We offer a single dashboard to track all your investments, making it easier for you to stay updated on your financial portfolio.
Portfolio Rebalancing: We ensure that your investment portfolio is rebalanced at regular intervals, optimizing your returns and aligning with your financial goals.
Tax Efficiency: We prioritize tax efficiency in all investment decisions, ensuring that both contributions and withdrawals are made in the most tax-advantageous manner.
Our commitment to these ensures that your investments are managed with the utmost care and professionalism.
https://growthvine.in/wealth-management 
Contact us:

Physical Address: The Office Pass, 5th Floor, Tower C, Unitech Cyber Park, Sector — 39, Gurgaon — 122001

Phone number: +919354435518

Gmail: info@growthvine.in

Website: https://growthvine.in/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3879520/3f1a7f91-40d0-d49b-c481-8005f958fab8.png)
[動画カットだけ]簡易LosslessCutソフトのつかいかた

動画の一部をカットだけしたいときのソフトの使い方。

LosslessCut（ロスレスカット：無劣化）ソフトを窓の杜からダウンロード。
https://forest.watch.impress.co.jp/docs/serial/newstand2019/1223662.html

アプリ起動後、編集対象の動画を開く。

![タイトルなし.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2759593/4973d705-5db0-50a3-19bc-c7b6d0129212.png)

![タイトルなし１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2759593/798bbe43-7abb-fcbb-c399-7bb3adf63146.png)

トリム対象の開始（Iがショートカット）と終了（Oがショートカット）をクリックの後、
「Export」をクリックすればトリミング完了。

![タイトルなし２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2759593/c373a290-2438-24b1-6bdc-5a810817734c.png)

![タイトルな3２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2759593/b71f556d-afae-b934-355b-3429a9d1ee4f.png)

以上。
TypeScript練習環境を4ステップで。

:::note warn
npmコマンドを使用できる環境が前提です。
:::


## 0. 技術解説

### TypeScriptとは？

- JavaScriptへ変換して使用する中間言語
- 静的型付けとコンパイルチェックにより記述ミスを減らせる
- 大規模な開発にも向いている

## 1. npm初期化のセットアップ

### プロジェクト作成

```bash:ターミナル
mkdir project_name
```

### プロジェクトを開く

お好みのエディタでプロジェクトを開く。
以降の作業は、プロジェクト(project_name)をカレントディレクトリとする。

### npm初期化

```bash:ターミナル
npm init -y
```

## 2. TypeScriptのセットアップ

### typescriptライブラリのインストール

```bash:ターミナル
npm i -D typescript
```

### tsconfig初期化

```bash:ターミナル
npx tsc --init
```

## 3. ts-nodeのセットアップ

### ts-nodeライブラリのインストール

```bash:ターミナル
npm i -D ts-node
```

### 実行コマンドの記述

```diff:package.json
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
 +   "start": "ts-node src/main.ts"
  },
```

## 4. main.tsの記述

```typescript:src/main.ts
function main() {
  console.log('Hello World');
}
main();
```

## 実行

```bash:ターミナル
npm run start
```


## 最終ディレクトリ

```
project_name/
├── node_modules/
├── src/
│   └── main.ts
├── package-lock.json
├── package.json
└── tsconfig.json
```
実務未経験でエンジニア転職した話

この記事では自分のエンジニア転職を目指してから実際に実務未経験でエンジニア転職を成功させた数ヶ月間に関して記そうと思います。初めて記事を書くのでわかりづらいかもしれないですが、未経験でエンジニアを目指す人のお役に立てれば幸いです🙇
※ちなみにswiftエンジニア転職を目指しています

自己紹介
-
- 愛知県出身２４歳、国際系の大学卒
- プログラミングのプの字も触ったことがない
- パソコン苦手
- 勉強苦手
- 完全な異業種からの転職
- 資格やIT知識もなし

流れ
-
２０２４年の1月に前職を退職
　↓
２０２４年の2月に某プログラミングスクール入学
　↓
２０２４年の４月にポートフォリオ作成開始
　↓
２０２４年の７月にポートフォリオ完成し、Apple Storeにアプリを公開
　↓
２０２４年の７月の月末から転職活動開始
　↓
２０２４年の８月の月末に受託会社の内定を獲得

※この期間はアルバイトを少しやりながら貯金を崩す生活でした

応募企業
-
| カジュアル面談数 | 書類選考数 | 面接数 | 内定数 |
|:--|:--|:--|:--|
|　１５社　| １０社 | ６社 | １社 |

※内定をいただいた企業が第一希望だったため内定をいただいた際に他の応募していた企業は全て辞退しました。

自分は主にwantedlyを使い、転職活動をしていました。GreenやDoda、エンゲージ、某有名な転職サイトも少し使っていたのですが、自分が目指していたモバイルアプリエンジニアの求人が一番多くあったのとカジュアル面談で企業の人と話す機会から始められる点でwantedlyを使っていました。

※Webエンジニアを目指す人はモバイルエンジニアより求人が多いのでwantedlyじゃなくても少し受けられる会社が多いかも

エンジニア未経験の転職の現実
-
まず皆さんは求人を見ると思うのですが、本当に実務未経験募集が少ないです。そして自分の場合はswiftを使ったモバイル開発業務を探していたのでWeb系の求人よりも少なかったです。

実務未経験は不可・実務経験２年以上からという決まり文句ばかりで実務未経験はどうやってキャリアを始めればいいんですかと思いながら、暇さえあれば求人票を読みあさっていました。
カジュアル面談を応募しただけでも技術的にレベルが足りないとのことでお祈りメールもたくさん頂きましたし、返信が来ないことなんてザラにあるので諦めずに進むしかありませんでした。
>結論を言うと自分の学習してきた作品をGithubに公開し、そのURLを転職サイトの自分のプロフィールに貼って実務経験関係なしに応募することが大事です。

私も結果的に求人票に実務経験２年以上と書いてある企業に自分のポートフォリオや学習作品を見てもらい、そこが起点となり面談から始まり内定まで繋がりました。

転職活動の挫折
-
最初にwantedly経由で第一志望の企業を受けました。結果から言うと最終選考まで行けましたが落ちました。
よく就活で第一希望の企業に面接する前、面接慣れをするために他の企業をいくつか受けた方がいいと聞いていましたが、本当にその通りで最終面接の際に社長と技術責任者を目の前にして思ったことを綺麗にまとめられず、そこが原因で落ちてしまった気がします。

転職活動のポイント
-
- 転職活動の軸をしっかり持つ（自分の譲れない点ややりたいことを明確にする）
- 話すことに一貫性を持つ(嘘は絶対につかない）
- 面接時に少しでもいいから和やかな雰囲気を出す！

面接や面談をやるにあたって転職活動の軸は全ての企業から質問された。軸がその企業とマッチしないと企業側は絶対に採用しないと思うのでしっかりと軸を持つべき！

面接では質問に対して自分の答えたことがメモされるので１次面接で話したこととそれ以降で話したことが矛盾していると一気に採用率が落ちるので気をつけた方がいい

面接や面談をやっている中で自分が思った以上に人柄を大事にしている企業が多かった。緊張してしまうのもわかるが場数をこなすと少しずつ慣れてきて本当の自分が出せると思うので場数をこなす。、追加で相槌や笑顔は出したほうが印象は絶対に良くなるのでおすすめです✌️

※未経験でも技術的な質問や技術テストがあったりするのでその辺は自分で頑張るしかないと思います。

面接でアピールするといい点
-
- 学習意欲・学習継続
- 論理的な思考
- 面談時に人事やエンジニアの方と話した会話を面接で出していく
- 逆質問をたくさんしてアピール

やはりエンジニアは技術のキャッチアップが必要不可欠なのでエンジニアとしてやっていくには業務以外の時間も学習に割かなければならないと思います。実際に私はポートフォリオ作成後や転職活動中でも少しはコードに触れて新しいものを学習するようにしてました。面接時にそれを話題にすることもできるのでおすすめです。

2つ目の論理的な思考は社会で働く上でとても重要で、問題が起きた際にどう対処するかの道筋を考えれたり、相手の考えや自分の考えを正しく理解して意見を伝え合うといったコミュニケーション能力にも繋がるので論理的な思考を持っているのをガンガンにアピールしましょう。

面談や１次面接で話したことを再度話題として出すことで企業側はこの人がどれだけうちの会社のことを考えているのか伝わり好印象になると思うので、ぜひ使って欲しいテクニックです。

最後に
-
実務未経験からのエンジニア転職は正直に言うと難しいとは思いますが絶対に不可能ではないです。
SNSを見ているとものすごくできるエンジニアの方やわからないキーワードばかりで自信がなくなるかもしれないですが、こんなエンジニアと無縁の自分にもできたので自分を信じて進んでください。
メンターさんが諦めずにできることを少しずつ増やしていくことがとても重要と言っていました。プログラミングスクールに多額のお金を払って諦めていく人たちもいてその中でも諦めずに泥臭く進んだ結果、自分はエンジニア転職を無事成功することができました。
なので諦めずに自分の信じた道を歩み続けてください！！

### 現在エンジニア転職を目指している方たちの転職が上手くいくように心から祈っております。
エンジニア歴約10年(資格未取得者)が初級資格に挑む【1】

はじめまして。業界歴10年ほどになる自称ITエンジニアです。
様々な案件に参画してきましたがサーバーの保守運用をメインに対応してきました。

恥ずかしながら私、タイトルにもある通り業界歴が長い割にエンジニアとして資格を一切所有しておりません。


このたび業務の待機期間ということもあり、学習時間が確保できた状況なので

**・AWS クラウドプラクティショナー**
**・LinuCレベル1**

これらの資格取得を目指して勉強を行いたいと考えております。
案件配属までの待機期間がどれほどの長さになるかは不明ですが、
できるところまで学習を進め、資格取得までの日々の勉強記録を残してみます。

この記事が私と似たような境遇の方の参考になれば幸いです。

# 【まずなにをしよう。】
先にも挙げた通り、私自身が過去に資格取得をした経験がほぼないため
この手の __「勉強法」__ のノウハウが圧倒的に足りません。

そのため学習方法については以下の記事を参考にしたいと思います。

### AWSクラウドプラクティショナー
→ https://qiita.com/isomu_2012/items/b0d6d131446f88363d5d

テキストは上記の記事で紹介されていたものと同じものが我が家に放置されていたため、そちらを使用します。
https://www.amazon.co.jp/gp/aw/d/4815622744/?_encoding=UTF8&pd_rd_plhdr=t&aaxitk=d196b08550f3fc9923402e64981f4542&hsa_cr_id=0&qid=1703483695&sr=1-2-ac08f2b1-eb5b-4f1a-aa64-9e8f448c33ed&ref_=sbx_be_s_sparkle_mcd_asin_1_title&pd_rd_w=NPuNx&content-id=amzn1.sym.ea91fbda-5568-44df-b5b0-99202f731686%3Aamzn1.sym.ea91fbda-5568-44df-b5b0-99202f731686&pf_rd_p=ea91fbda-5568-44df-b5b0-99202f731686&pf_rd_r=F5FHTVZGN9YJA455XKBK&pd_rd_wg=KSSoz&pd_rd_r=ccc4d3d8-c370-498e-a18c-97d012e93b51

### LinuCレベル1
→ https://qiita.com/tr-matsui/items/24bd250d421b3f4191b7

こちらのテキストも我が家に放置されて埃をかぶっていたテキストを使用します。
https://www.amazon.co.jp/Linux%E6%95%99%E7%A7%91%E6%9B%B8-LinuC%E3%83%AC%E3%83%99%E3%83%AB1-Version-10-0%E5%AF%BE%E5%BF%9C-%E4%B8%AD%E5%B3%B6/dp/4798166162/ref=asc_df_4798166162/?tag=jpgo-22&linkCode=df0&hvadid=707442440817&hvpos=&hvnetw=g&hvrand=2028389124440756934&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=1009310&hvtargid=pla-921246373817&psc=1&mcid=bfa8cfef6abf3d46b8d690943d4b1e05&th=1&psc=1&gad_source=1


学習方法でも、テキストを読み込む→練習問題、過去問をやりこむ。
という手法がメインになっているようです。
そのため、まずはある程度テキストを読み込んでみようと思います。



# 【初日】
### AWSクラウドプラクティショナー
1章まで読み終えました。

以下は補足として記載があったAWS公式のドキュメントなど
Amazon Web Services の概要
https://docs.aws.amazon.com/whitepapers/latest/aws-overview/introduction.html?did=wp_card&trk=wp_card
AWS の料金体系
https://docs.aws.amazon.com/whitepapers/latest/how-aws-pricing-works/abstract-and-introduction.html
AWS サポートのプラン比較
https://aws.amazon.com/jp/premiumsupport/plans/


### LinuCレベル1
1章の途中まで読んだところで別件の対応などがあり中断。


### 初日を終えて思ったこと
午前午後で並行して2冊を読むようにしていましたが、切り替えが苦手なのか頭に入っている感覚が薄い気がしてきたため、
以降は一日単位でテキストを切り替えて読むように変更


##  【2日目(AWS)】
先日の反省から、AWSクラウドプラクティショナーのテキストを読み込む。
他タスクが多く発生していたため読む時間が多くは取れませんでしたが、
読んだ個所の理解度は前日より高い・・・気がします。

内容としてはテキストの2章途中まで完了


## 【3日目(LinuC)】
初日に中断したLinuCレベル1テキストの1章途中から再開

2章のファイル・ディレクトリの操作については業務でLinuxを使用していたこともあり
復習のような感覚で各コマンドの動作の理解を深めることができました。
改めて学習をすることで、業務で使用していなかったコマンドや
オプションの挙動などに目を向けるきっかけとなりました。

参考書だけだとtmux周りのイメージがつきづらかったため、以下のサイトを参考にして理解を深めました。
https://zenn.dev/azunasu/articles/25d9999ca0fb96
~~GUI周りの説明に関しては参考書上に画像が用意されているのに、なぜtmuxに関しては画像がなかったのか・・・？~~


## 【4日目(AWS)】
2章途中から再開して3章途中まで。

2章はAWSのクラウド概念についての説明の章でしたが、
以前から案件内でAWSに触っていた身の上で言うのもおかしな話ですが、
説明を読むことで今まで何気なく使用していた機能の理解が明確になった印象です。


# 

次週以降も引き続き資格取得に向けて学習を進めていきます。
お得に買い物をするための小技

ショッピングでお得に買い物をするためには、クーポンサイトで最新の割引情報を活用しましょう。例えば、クーポンプラットフォームのHotDealsを利用すると、リアルタイムでクーポンやプロモコード、セール情報、特別なオファーを手に入れることができ、金銭と時間を節約できます。10万以上のオンラインストアの中から最良の取引を探し、最もお得なショッピング体験を確保しましょう。

以下はHotDealsでクーポンを取得し、使用する手順です：

1.HotDealsのウェブサイト（www.hotdeals.com）にアクセスします。ホームページでは、衣料品、電子機器、家庭用品など、さまざまなカテゴリーのクーポンが表示されます。

2.興味のあるカテゴリーをブラウズし、購入したい商品を見つけます。商品横の「クーポンを取得」ボタンをクリックします。

3.ポップアップウィンドウで表示されたクーポンコードをコピーします。一部のクーポンはコード不要で、「今すぐ使用」ボタンをクリックするだけで適用できます。

4.購入したい商品のオンラインストアを開き、商品をショッピングカートに追加します。

5.チェックアウトページでクーポンコードを入力する場所を見つけ、コピーしたコードを貼り付けます。

6.「適用」ボタンをクリックし、クーポンが有効であれば価格が即座に割引されます。

7.支払いを完了します。

いくつかのコツ：
1.HotDealsで商品名を検索すると、さらに関連するクーポンが見つかります。
2.HotDealsのソーシャルメディアアカウントをフォローすると、独占クーポンが公開されることがあります。
3.HotDealsのメールニュースレターに登録すると、最新のクーポンが届きます。
4.クーポンを使用する前に、期限切れでないことや購入する商品に適用されるかを確認しましょう。
5.一部のクーポンには使用条件があり、最低購入額などの条件を満たす必要があります。

HotDealsでクーポンを取得し、オンラインストアで使用することで、ショッピングコストを大幅に削減できます。これらのクーポンをうまく活用して、オンラインショッピングをさらにお得にしましょう。
【MYSQL】Check the status of the database if this condition persists が出る

## エラーログ
```
[WARN] Database "dev-db-01" at 172.31.0.167:3306 became unavailable for access from 172.31.0.8. Check the status of the database if this condition persists.
```

## 原因
このエラーは、RDSプロキシがデータベースインスタンスに接続できない場合に発生します。

## 対処方法
1. RDSインスタンスの状態確認
   - AWS CLIまたはコンソールでRDSインスタンスの状態を確認:
   ```
   aws rds describe-db-instances --db-instance-identifier dev-db-01 --query 'DBInstances[0].DBInstanceStatus'
   ```

2. セキュリティグループの設定確認
   - RDSインスタンスとRDSプロキシのセキュリティグループを確認:
   ```
   resource "aws_security_group_rule" "rds_proxy_to_rds" {
     type                     = "ingress"
     from_port                = 3306
     to_port                  = 3306
     protocol                 = "tcp"
     source_security_group_id = aws_security_group.rds_proxy.id
     security_group_id        = aws_security_group.rds.id
   }
   ```

3. ネットワーク設定の確認
   - RDSインスタンス、RDSプロキシ、Lambda関数が同じVPCとサブネットにあることを確認
   - 必要に応じてVPCエンドポイントを設定

4. RDSプロキシのログ確認
   - デバッグログを有効にして詳細な情報を取得:
   ```
   resource "aws_db_proxy" "rds_proxy_db_dump" {
     # 他の設定...
     debug_logging = true
   }
   ```

これらの対処方法を順番に試すことで、多くの接続問題を解決できます。問題が解決しない場合は、AWS Supportに連絡するか、より詳細なログ分析が必要になる可能性があります。
【AWS】certificate verify failed: unable to get local issuer certificate (_ssl.c:1006)) が出る

## エラーログ
RDSプロキシにて

```
Database error: (2003, "Can't connect to MySQL server on 'dev-proxy-db-01.XXX.ap-northeast-1.rds.amazonaws.com' ([SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1006))")
```
が出る


## 原因
このエラーは、SSL証明書の検証に失敗した場合に発生します。

## 対処方法
1. 正しい証明書のダウンロードと使用
   - 最新のRDS証明書をダウンロード:
   ```
   wget https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem -O rds-ca-2019-root.pem
   ```
   - S3バケットに証明書をアップロード:
   ```
   resource "aws_s3_object" "rds_ca_cert" {
     bucket = aws_s3_bucket.lambda_bucket.bucket
     key    = "rds-ca-2019-root.pem"
     source = "${path.module}/rds-ca-2019-root.pem"
   }
   ```

2. Lambda関数コードの修正
   - SSL contextの設定を適切に行う:
   ```
   ssl_context = ssl.create_default_context(cafile=temp_cert_file.name)
   ssl_context.check_hostname = False
   ssl_context.verify_mode = ssl.CERT_REQUIRED
   ```

3. RDSプロキシの設定確認
   - `require_tls`が正しく設定されているか確認:
   ```
   resource "aws_db_proxy" "rds_proxy_db_dump" {
     # 他の設定...
     require_tls = true
   }
   ```
【MYSQL】Failed to connect to database: (1045, "Access denied for user が出る

## エラーログ
```
Failed to connect to database: (1045, "Access denied for user 'dev_admin'@'172.31.1.129' (using password: YES)")
```

## 原因
このエラーは、データベースユーザー名またはパスワードが正しくない場合に発生します。

## 対処方法
1. AWS Secrets Managerの確認
   - Secrets Managerに保存されているユーザー名とパスワードが正しいか確認
   - 必要に応じて、以下のようにTerraformコードを修正:
   ```
   resource "aws_secretsmanager_secret_version" "db_credential" {
     secret_id = aws_secretsmanager_secret.db_credential.id
     secret_string = jsonencode({
       username = "${var.environment}_${var.DB_USERNAME}"
       password = var.DB_PASSWORD
     })
   }
   ```

2. RDSインスタンスでのユーザー確認
   - RDSインスタンスに直接接続し、ユーザーが正しく作成されているか確認
   - 必要に応じて、以下のSQLコマンドでユーザーを作成または権限を付与:
   ```
   CREATE USER 'dev_admin'@'%' IDENTIFIED BY 'password';
   GRANT ALL PRIVILEGES ON *.* TO 'dev_admin'@'%';
   FLUSH PRIVILEGES;
   ```

3. Lambda関数の環境変数確認
   - Lambda関数の環境変数が正しく設定されているか確認
   - Terraformコードで以下のように設定されていることを確認:
   ```
   resource "aws_lambda_function" "db_dump" {
     # 他の設定...
     environment {
       variables = {
         RDS_USER     = "${var.environment}_${var.DB_USERNAME}"
         RDS_PASSWORD = var.DB_PASSWORD
         # 他の環境変数...
       }
     }
   }
   ```
Rails ネストした配列のJSONに対してStrong Parameterを適用する

Rails: Applying Strong Parameters to Nested Array JSON

フロントエンドで整形したJSONをRailsのエンドポイントで受け取る際に、Strong Parameterの設定で少しハマったので備忘録として記載

環境は以下
* Ruby 3.1
* Rails 6系

# Strong Parameterの中で配列を扱う（文字列の配列）

参考）https://blog.ryskit.com/entry/2024/01/13/020409

```json:requestのJSONの構造
{
  "user": {
    "stringArray": [
        "aaa",
        "bbb"
    ]
  }
}
```

この構造に対してStrong Parameterを適用する場合、以下のように記述する。
配列であることを明示するだけで良い。

```ruby:動作するStrong Parameter
params.require(:user).permit(stringArray: [])
```

# Strong Parameterの中で配列を扱う（オブジェクトの配列）

```json:requestのJSONの構造
{
  "user": {
    "objectArray": [
      { "id": 1,
        "value1": true,
        "value2": "aaa"
      },
      {
        "id": 2,
        "value1": false,
        "value2": "bbb"
      },
      {
        "id": 3,
        "value1": false,
        "value2": "ccc"
      },
      {
        "id": 4,
        "value1": true,
        "value2": "ddd"
      }
    ]
  }
}
```

この構造に対してStrong Parameterを適用する場合、以下のように記述する。
プリミティブな中身の配列と異なり、配列の中のkeyまで明示的に指定しないとエラーとなる。

```ruby:動作するStrong Parameter
params.require(:user).permit(objectArray: [:id, :value1, :value2])
```

```ruby:エラーとなるパターン
# 配列の中のkeyを指定していない以下ではエラーとなる
params.require(:user).permit(objectArray: [])
```

# 複数の配列を扱う
以下を参考
https://qiita.com/sayama0402/items/576345a1f7d37571f5a6
AWS BatchでHello World(Python)

## はじめに
AWS Batchを利用してHello Worldしたのでメモに残します。
とりあえず動かし方を知りたい人向けです。
ローカルの環境はWindows10です。


## PythonスクリプトとDockerファイルの作成
VSCを起動して作業場所を決めてください
その後、作業場所配下に次のスクリプトとDockerファイルを作成してください
~~~python:app.py
print("Hello from Fargate!")
~~~
~~~docker:Dockerfile
FROM python:3.8-slim

WORKDIR /usr/src/app

/usr/src/app
COPY . .

CMD ["python", "./app.py"]
~~~

## Amazon ECRへプッシュ
先ほどのスクリプトとDockerファイルをAmazon Elastic Container Registry(ECR)へ登録します。
これによって、ECSやAWS Batchから実行できるようになります。
### ECRでリポジトリを作成
- AmazonECR > プライベートリポジトリを選択し、`リポジトリを作成`を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88001/b5047c77-a237-999e-db01-a909278d9871.png)

- リポジトリ名を任意の名前に設定して`作成`を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88001/e9cae3b4-cacc-760b-734f-0ecede7146e0.png)

### リポジトリへDockerイメージをPush
- プライベートリポジトリの一覧から、今作成したリポジトリを選択し、`プッシュコマンドを表示`を選択
- VSC上で表示されたコマンドをコピペして実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88001/4ba683df-0a13-79ef-d6cc-dc03322dabd7.png)

## AWS Batchを設定
ここまででAWS上でDockerイメージを実行する準備が整いました。
ECSやAWS Batchから実行することが可能です。
### ジョブを定義
- AWS Batchのページへ移動し、ジョブ定義を作成を選択 
- オーケストレーションタイプは`Fargate`を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88001/d2ef9fac-8645-6c57-206b-ee986e713f7f.png)

- 名前は任意を設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88001/7744d8c2-ae2c-8da0-3f85-17f215476a0f.png)


- コンテナの設定　←　**ここ重要！！**
`イメージ`には先ほど作成したリポジトリのURIを入力
`コンドオプション`は**削除**
※削除しないとDockerfileに記載した`CMD ["python", "./app.py"]`が実行されませんでした

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88001/af95db94-9455-ef45-38a8-b6228856b203.png)

### ジョブの送信（AWS Batchを実行）
- AWS Batch > ジョブから`新しいジョブを送信`を選択
- ジョブの名前を入力後、ジョブ定義を選択してジョブを作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88001/3b0e034d-813e-bb3c-1cda-b4d1ac794eaa.png)


- 作成したジョブが実行される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88001/bd627bff-c448-4c08-3fda-3b460d8dec83.png)

- 実行完了するとステータスが`Succeeded`となる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88001/f337f0c6-3693-9ef2-45ec-b7977629f336.png)

- 画面下部のログストリームから、CloudWatchのログを表示
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88001/b2c86632-970e-4bc1-5561-dedcc0c805fd.png)

### 動きました！！

## さいごに
細かい話は置いておいて、まずは動かすだけの手順をメモとして残しました。
作成したジョブを定期実行させたりなどは、次の機会に試します。
【Python】依存関係でコンフリクトするなら仮想環境を使う

# モジュールインストールの際にコンフリクト
形態素解析を行う為
```
pip install spacy
```
を行った際、下記エラー

```
ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.
awsebcli 3.20.10 requires colorama<0.4.4,>=0.2.5, but you have colorama 0.4.6 which is incompatible.
```
cloloramaというモジュールが他のパッケージで使われているバージョンと合わない為依存関係のコンフリクトになっているという警告です。

coloramaのモジュールをダウングレードして対応するも下記エラー

```
ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.
wasabi 1.1.3 requires colorama>=0.4.6; sys_platform == "win32" and python_version >= "3.7", but you have colorama 0.4.3 which is incompatible.
```
やはりバージョンが合わないみたいなので仮想環境を作って依存関係を分離する方法で解決します。

# 仮想環境作成

Terminalで下記を実行。
開発環境を作ります。

```
python -m venv myenv
```
下記コマンドで仮想環境をアクティブにします。
VScodeのTerminalでうまくいかなかった場合、管理者権限でPowerShellを使って行う必要があるかもしれません。

```
myenv\Scripts\activate
```
このあと好きなモジュールをインストールしてください
```
pip install colorama
```

など
[Terraform][google provider]IAMまとめ

# 前提
- GCPのIAMの概要を理解していること。
ポリシー、バインディング、ロール、プリンシパルなどの用語の意味を知っていないと、TerraformのIAM系 `resource`の仕様を理解できない(参考: [[GCP]IAM概要まとめ](https://qiita.com/WisteriaWave/items/a52661732abbd56a889d))

- google provider v5.36.0時点の話。

# 概要
GCPのリソースごとに、`google_<リソース名>_iam_xxx` というTerraformでの`resource`の仕様が定義されている。
xxxの部分は、以下の3つのいずれかの文字列が当てはまる。
- policy
- binding
- member

# resource
## google_<リソース名>_iam_policy
対象リソースのポリシー設定(= 全てのバインディング設定)を、ガチッと正確に記述するときに使う。
対象リソースに紐づけるポリシーの設定を `google_iam_policy` data source で定義(binding.role, binding.membersの組み合わせ)して、`google_<リソース名>_iam_policy` resource の policy_data で参照する形で記述する。
```
resource "google_<リソース名>_iam_policy" "sample" {
    ...
    policy_data = data.google_iam_policy.<ポリシー名>
}
 
 
data "google_iam_policy" "<ポリシー名>" {
    # バインディング設定1
    binding {
        # ロール
        role = "roles/..."
 
        # ロールを与えるメンバー
        members = [
           ...
        ]
    }
 
    ...
 
    # バインディング設定N
    binding {
        # ロール
        role = "roles/..."
 
        # ロールを与えるメンバー
        members = [
            ...
        ]
    }
}
```

### 注意点
権威的であり、Terraform外で対象リソースに対してポリシーが設定されていた場合に`terraform apply`すると、Terraformで記述したポリシー設定に完全に置き換わってしまう。

## google_<リソース名>_iam_binding
対象リソースの1つのバインディング設定(1ロール: Nプリンシパル)をガチッと正確に記述するときに使う。
`google_<リソース名>_iam_binding` resource に role, membersを定義する形で記述する。

```
resource "google_<リソース名>_iam_binding" "sample" {
    ...
 
    # ロール
    role = "roles/..."
 
    # ロールを与えるメンバー
    members = [
        ...
    ]
}
```

### 注意点
権威的であり、Terraform外で対象リソースに対してポリシーが設定されていた場合に`terraform apply`すると、そのポリシー内のいずれかのバインディング設定に含まれるロールがTerraformで記述したbindingのロールと被った場合、元々のバインディング設定はTerraformで定義したものに完全に置き換わってしまう。


## `google_<リソース名>_iam_member`
対象リソースを操作する1プリンシパルのバインディング設定を記述するときに使う。
`google_<リソース名>_iam_member` resource に role, memberを定義する形で記述する。
要するにiam_bindingと似たような形の記述(違いは`members`か`member`か)方法になる。

```
resource "google_<リソース名>_iam_member" "sample" {
    ...
 
    # ロール
    role = "roles/..."
 
    # ロールを与えるメンバー
    member = ...
}
```
被権威的であり対象のプリンシパルにロールを追加する方向だけに作用する。
すなわち、Terraform外で対象リソースにポリシーが設定されていた場合に`terraform apply`しても、既存のポリシーに含まれている各プリンシパルのアクセス権限が剥奪されてしまうことはない。


## 所感: policy, binding, memberのどれを使うか
3つの内 google_<リソース名>_iam_policy と google_<リソース名>_iam_binding は、権威的である。
すなわち、すでに設定されているバインディングをTerraformの設定どおりに修正してしまい、意図しないアクセス権の剥奪が起こり得る。

https://kaito-two.hatenablog.com/entry/2020/08/30/120000

で述べられているが、明確な意図やメリットがない限りは `google_<リソース名>_iam_member`を使って設定するのが無難そうである。

また、これに関連して https://cloud.google.com/docs/terraform/best-practices-for-terraform?hl=ja#iam　に

> Google Cloud によって自動的に管理されるロールが削除されたり、一部のサービスの機能が停止する可能性があります。
> これを防ぐには、google_*_iam_member リソースを直接使用するか、Google の IAM モジュールを使用することをおすすめします。

とある。しかし、[Google の IAM モジュール](https://github.com/terraform-google-modules/terraform-google-iam)は、スター数が186と極めて少ない(2024/07/16時点)。
さらに、一部のGCPサービスしか対応していない。
このモジュールを使うのは、現時点ではあまり得策ではなさそうである。

# 参考

https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/google_project_iam

https://kaito-two.hatenablog.com/entry/2020/08/30/120000