OmniAICreator/Qiita-1.07M huggingface dataset:
いい加減Flutterに入門してみる (1)

# はじめに

Flutter やってみたいな、と思いつつ手をつけられてなかったので、年末の駆け込みで入門してみます。

普段はWebサービスを開発していますが、ネイティブアプリの開発は素人です。

# やること
公式(https://docs.flutter.dev/codelabs) で初心者向けに紹介されている Codelab があったのでそれをやってみます。


# Codelab の実施

以下の Codelab を進めていきます。
https://codelabs.developers.google.com/codelabs/flutter-codelab-first?hl=ja#0

本記事には個人的に実施したメモを残します。
個人の環境に依存する部分が多いため、実施される場合は codelab のページを直接ご参照ください。

## 1. はじめに

これから作るアプリの説明。ランダムで名前を生成するアプリのようです。

## 2. Flutter 環境をセットアップする

VisualStudio Code は既に入っているので、Flutter SDK をインストールします。

https://docs.flutter.dev

Mac で iOS 開発のため、以下の手順でセットアップ
https://docs.flutter.dev/get-started/install/macos/mobile-ios

### Rosetta 2 のインストール
Apple silicon の場合、Rosetta 2 が必要ということなのでインストール
```
sudo softwareupdate --install-rosetta --agree-to-license
```

### XCode のインストール
https://docs.flutter.dev/get-started/install/macos/mobile-ios#install-and-configure-xcode
https://apps.apple.com/us/app/xcode/id497799835?mt=12/

インストール後以下を実行
```
# コマンドラインで使うxcodeを設定
sudo sh -c 'xcode-select -s /Applications/Xcode.app/Contents/Developer && xcodebuild -runFirstLaunch'

# ライセンス同意
sudo xcodebuild -license
```

### Git のインストール
導入済みのため省略

### CocoaPods のインストール

Flutter Plugins をネイティブコードにビルドするために必要なようです。
https://cocoapods.org

```
# ruby: バージョン管理のインストール + セットアップ
brew install rbenv
eval "$(rbenv init - zsh)"
# rbenv install -l で最新バージョンを確認しインストール
# ruby: 本体のインストール
rbenv install 3.3.6
# ruby: 利用バージョンをセット
rbenv global 3.3.6

# cocoa podsのインストール
sudo gem install cocoapods
```

### VisualStudio Code の Flutterプラグイン インストール
https://marketplace.visualstudio.com/items?itemName=Dart-Code.flutter

### iOS デバイスを使うための設定

#### Apple ID と Apple Developer account の作成

https://docs.flutter.dev/get-started/install/macos/mobile-ios#create-your-apple-id-and-apple-developer-account

Apple ID はすでにあるため省略。
Apple Developer account も現時点では不要 (ストアに公開する場合は `$99` で加入する必要あり)

#### iPhone の Developer Mode を有効化

https://docs.flutter.dev/get-started/install/macos/mobile-ios#attach

1. Mac に iPhone を接続し、「Trust」をクリック
1. 設定から「Developer Mode」を有効にする

#### 開発用の証明書を有効化

https://docs.flutter.dev/get-started/install/macos/mobile-ios#enable-developer-code-signing-certificates

この辺りはプロジェクトがないとできないため、一旦スキップ


## 3. プロジェクトを作成する

https://codelabs.developers.google.com/codelabs/flutter-codelab-first?hl=ja#2

手順に沿ってプロジェクトを作成していきます。

変更箇所は PullRequest に残しています。
https://github.com/tgrhg/flutter_sample/pull/1

### flutter_sampleという名前で新規作成

変更箇所が分かるようにするため、この時点で変更前のプロジェクトをGitHubに上げる。
gitignoreも作ってくれているので、そのままpushでok
https://github.com/tgrhg/flutter_sample

### 必要な変更を加える

詳しくは追々みていくとして、現時点ではコピペ(アプリ名称は修正要)で作成します。

- `./pubspec.yaml` #アプリの基本情報
- `./analysis_options.yaml` #linterの設定等
- `./lib/main.dart` #アプリのコード


### 一度起動してみる

良かった。ちゃんと動いているようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3294382/db0aac5d-4e96-aee8-04b3-1516d81aab82.png)

# おわり

インストールまわりで結構時間が掛かってしまったため、続きは次回にしたいと思います。
次回で終わらせたい。

[つづき](https://qiita.com/grhg/items/365c7a1f9c84dbeeb0ca)
【Visual Studio】debugモードとreleaseモードで挙動が違う場合に確認すること【C#】

# 概要
Visual Studio 2019でC#を使用して開発を行っている際に、デバッグモードとリリースモードで挙動が異なる現象がありましたので、備忘録として残しておきます。

# 対応1：「コードの最適化」の設定を疑う
Visual Studioにはコードの最適化という機能があるそうで、コンパイル時にコードを微修正してくれる機能だそうです。この設定はVisual Studio 2019だと以下から設定を変更できました。
`ソリューションエクスプローラのプロジェクトを右クリック > 「「プロパティ」を選択 > 左側の「ビルド」タブを選択 > 「全般」の中にある「最適化コード」のチェックボックス`
この設定がデバッグモードではチェックが外れており、リリースモードではチェックが付いていると、挙動の違いが起こる可能性があるらしいです。なのでリリースモードでもチェックを外してあげると、デバッグモードと同じように挙動するかもしれません。

# 対応2：「データヒント」の表示タイミングを疑う
厳密にはデバッグモードとリリースモードの違いというより、同じデバッグモードでも、とある変数 (プロパティ) のデータヒントを表示したかどうかで、その後の処理の挙動が変わるということがありました。
データヒントというのはVisual Studioのデバッグモードでブレイクポイントで特定の処理でストップした際、変数やプロパティ名をマウスオーバーするとその中身の値が確認できる機能です。
少し昔に発生したのでしっかりと覚えていないのですが、特定の場所にブレイクポイントを貼っていて、その場所でとまった際にデータヒントを使用して特定のプロパティの中身を確認していたのですが、そのデータヒントを表示するかどうかでその後の処理が変わっていました。その時は確かデータヒントを使用すると、その後の処理も想定通りの挙動となっており、使用しないと想定外の挙動 (エラー) になっていました。
最初はリリースモードで動作確認していた際に想定外の箇所でエラーになっていたことで気が付いたと思います。その特定のプロパティは実装中の処理にすごく関係が深いプロパティだったため、デバッグ中は無意識ですが必ずデータヒントを表示して中身を確認していたかなと思います。

あまり検索してもヒットしないのでここからは推測ですが、データヒントでプロパティの値を確認する際、プロパティの値を評価して表示させていると思われます。
※プロパティのGetterを走らせてからデータヒントに値を表示させているイメージ？
なので、例えばGetterの中身が複雑になっておりその時に応じて値が変わってしまう場合だと、特定の処理の前に、
- データヒントでプロパティのGetterを走らせてから処理を行う
- プロパティのGetterを走らせずに処理を行う

とデータヒントを表示するかどうかがその後の処理に影響して、挙動に差異が生じてしまうのかなと思われました。
上記の場合はもちろんデータヒントを表示せずに処理が走る方が正規のモジュールの動きなので、修正する必要があります。
今回の場合は、単に修正だけだとエラーが出る部分の直前にコードでも一度プロパティのGetterを呼び出しておく対応を行うとエラーはでませんでしたが、そもそもGetterの中身が複雑になりすぎていたので、その部分の改修も行いました。

# 終わりに
debugモードとreleaseモードで挙動が違う場合に、上記以外に当てはまることがあった場合はまた追記していこうと思います。
api key

```
from constructs import Construct
from cdktf import TerraformStack
from imports.aws import ApiGatewayUsagePlan, ApiGatewayUsagePlanKey

class MyApiGatewayStack(TerraformStack):
    def __init__(self, scope: Construct, id: str):
        super().__init__(scope, id)

        # 定义 API Keys 和 Usage Plan 配置
        usage_plan_configs = {
            "plan1": {
                "key_id": "key-id-1",  # 替换为实际 API Key ID
                "rate_limit": 5,
                "burst_limit": 10,
                "quota_limit": 1000,
                "quota_period": "MONTH"
            },
            "plan2": {
                "key_id": "key-id-2",  # 替换为实际 API Key ID
                "rate_limit": 10,
                "burst_limit": 20,
                "quota_limit": 2000,
                "quota_period": "MONTH"
            }
        }

        # 用于存储创建的 Usage Plans
        usage_plans = {}

        # 循环创建 Usage Plans 和绑定 API Key
        for plan_name, config in usage_plan_configs.items():
            # 创建 Usage Plan
            usage_plan = ApiGatewayUsagePlan(self, f"{plan_name}_usage_plan",
                name=plan_name,
                throttle={
                    "rate_limit": config["rate_limit"],
                    "burst_limit": config["burst_limit"]
                },
                quota={
                    "limit": config["quota_limit"],
                    "period": config["quota_period"]
                }
            )
            usage_plans[plan_name] = usage_plan

            # 创建 Usage Plan Key (绑定 API Key)
            ApiGatewayUsagePlanKey(self, f"{plan_name}_usage_plan_key",
                key_id=config["key_id"],
                key_type="API_KEY",
                usage_plan_id=usage_plan.id
            )

        # 输出 Usage Plans 的 ID（可选）
        for plan_name, usage_plan in usage_plans.items():
            print(f"Created Usage Plan: {plan_name} with ID: {usage_plan.id}")
```
mysqlclientのインストールで、fatal error: 'mysql.h' file not foundに詰まりまくった

pythonでmysqlclientをインストールしようとした時の備忘録

## ```fatal error: 'mysql.h' file not found```
`pip install mysqlclient`をしようとしたら以下のエラーが出た
```
src/MySQLdb/_mysql.c:29:10: fatal error: 'mysql.h' file not found
      #include "mysql.h"
               ^~~~~~~~~
      1 error generated.
      error: command '/usr/bin/gcc' failed with exit code 1
      [end of output]
  
  note: This error originates from a subprocess, and is likely not a problem with pip.
  ERROR: Failed building wheel for mysqlclient
Failed to build mysqlclient
ERROR: ERROR: Failed to build installable wheels for some pyproject.toml based projects (mysqlclient)
```

### やったこと
まず、xcodeがなかったのでインストールしました。
私はこちらからダウンロードしました。
https://developer.apple.com/jp/xcode/resources/
```
$ brew link mysql
Warning: Already linked: /usr/local/Cellar/mysql/9.0.1_7
To relink, run:
  brew unlink mysql && brew link mysql
```
```
$ brew install mysql pkg-config
==> Downloading https://formulae.brew.sh/api/formula.jws.json
############################################################################################################################################################################################################################ 100.0%
==> Downloading https://formulae.brew.sh/api/cask.jws.json
############################################################################################################################################################################################################################ 100.0%
Warning: mysql 9.0.1_7 is already installed and up-to-date.
...
```
```
$ export MYSQLCLIENT_LDFLAGS=$(pkg-config --libs mysqlclient)
$ export MYSQLCLIENT_CFLAGS=$(pkg-config --cflags mysqlclient)
$ pip install mysqlclient
Collecting mysqlclient
  Using cached mysqlclient-2.2.6.tar.gz (91 kB)
...
```
```
$ brew uninstall mysql-client
Uninstalling /usr/local/Cellar/mysql-client/9.0.1... (120 files, 124.6MB)
```
```
$ brew install mysql-client@8.0                                                
==> Downloading https://formulae.brew.sh/api/formula.jws.json

==> Downloading https://formulae.brew.sh/api/cask.jws.json

Warning: mysql-client@8.0 8.0.40 is already installed and up-to-date.
To reinstall 8.0.40, run:
  brew reinstall mysql-client@8.0
...
```
ここでdjangoを実行しようとすると、
```
raise ImproperlyConfigured(
django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module.
Did you install mysqlclient?
```
このエラーが出てきたが、mysqlclient=2.2.4はインストール済み。
mysqlclientのバージョンを古いのにダウングレードしました。
```
$ pip uninstall mysqlclient
Found existing installation: mysqlclient 2.2.4
Uninstalling mysqlclient-2.2.4:
...
```
```
$ pip install mysqlclient==2.0.1 --no-cache-dir
Collecting mysqlclient==2.0.1
  Downloading mysqlclient-2.0.1.tar.gz (87 kB)
  Preparing metadata (setup.py) ... done
...
```
これでインストールできてdjangoも実行できました。
vscodeで使ったThemeをVisualStudioでつかいたい！！

### 皆さんはVisualStudioを使っていて、初期Theme飽きたーと思うことはありませんか？
そこでThemeが充実しているVScodeからVisualStudioに向けてThemeをエクスポートできるプログラムがあったので紹介します！


https://github.com/microsoft/theme-converter-for-vs

これを用いることでVScodeの格好いいThemeを用いてVisualStudioを使うことができます！
ぜひお試しください！
Webフレーム初挑戦でお世話になったUdemy教材

## はじめに
私は、今年の4月から株式会社Fusicで新卒エンジニアとして働き始めました。  
普段は、Laravelを使ったバックエンド開発と、Reactを使ったフロントエンド開発をメインに担当しています。  

実は、Webフレームワークに触れたのは入社後が初めてで、それまで大学ではAndroidアプリ開発や、組み込みシステム関連の大会に参加していました。
バックエンドやフレームワークの知識はゼロに近い状態からのスタートでした。

新人研修では、Laravelを使った記事投稿アプリを開発しましたが、最初はこんな感じでした：
- 「初フレームワーク！わけわからん！」
- 「Laravel11が出たばっかり！？」

そんな右も左も分からない状況の中で、とても助けられたのがUdemyのコースです。  
今回の記事では、お世話になったUdemyのコース紹介と、その良さについてお伝えします。


## コースの紹介
【しっかり身につける】PHP基礎の学習後に見てほしいLaravel入門(Laravel11対応)

https://www.udemy.com/course/laravel9/?couponCode=24T4MT120424

このコースは、タイトルの「Laravel11対応」に惹かれて即購入しました。  
初心者向けの構成で、特に以下の順序で学べる点が印象的でした：
1. **ルーティング**：まずはURLから処理への流れを理解
2. **ビュー**：ブラウザに表示する部分を作成
3. **コントローラ**：ルーティングとビューの橋渡しを学ぶ
4. **リクエスト**：フォームデータの処理やバリデーションに進む

この順序のおかげで、シンプルな部分から始めて徐々に複雑な内容を学べたため、初心者の私にも非常に分かりやすかったです。

また、Laravelだけでなく、他のフレームワークにも応用が利く基礎が学べるので、「フレームワーク初挑戦」の方にもおすすめです。

## Udemyのいいところ
何かを学ぶ上で、最近では「書籍」「サブスク」「動画」「記事」など、学習コンテンツは多岐にわたります。  
私は以前、「書籍」や「記事」をメインに活用していましたが、Udemyのコースに出会ってからは「ざっくり学びたいとき」に動画を活用するようになりました。  

特に良いと思った点を以下にまとめます：

1. **基礎からしっかり学べる**  
   - コースによっては、非常に細かい部分までカバーされており、1つのコースを終えると「学習の基盤ができたぞ！」と実感できます

2. **バージョンアップに対応していることが多い**  
   - フレームワークのバージョンアップは意外と頻繁で、Laravel10から11への変更も例外ではありません
   - 書籍だと内容が古くなりがちですが、Udemyのコースはバージョンアップ対応のものも多く、「環境構築すらできない」という事態を避けられます 
   - 実際、私も別のコースですが、セール中に購入してしばらく放置していたものを、3年後に掘り出して学習に活用した経験があります。古いコースでもしっかりと学べる内容が多く、思わぬところで役に立つのがUdemyの魅力の一つだと感じました！

3. **コスパが良い**  
   - セール期間中であれば、1コースで書籍1冊程度の価格で購入できます。「つんでみー」と言って友達と笑いながらコースを買いだめしていた学生時代が懐かしいです（笑）

Udemyは、初心者の方から経験者まで幅広く活用できるので、ぜひ試してみてほしいです！

## 終わりに
今回紹介したUdemyのコースは、私にとってフレームワーク学習の大きな助けとなりました。
初心者の方でも安心して取り組める内容で、Laravelだけでなく他のフレームワークにも応用が利く点が魅力です。

学びの方法は人それぞれですが、もし「何から始めたら良いか分からない」という方がいれば、Udemyのコースをぜひ試してみてください。
私自身もまだまだ成長中ですが、これからも学びを続けていきたいと思います。
AWS:ControlTower管理下でConfigオーバーライドを制御する

これはTDCソフト株式会社アドベントカレンダー2024 の4日目の記事です。

# 背景
顧客環境においてAWS Control TowerでAWSアカウントを管理しているのですが、あるアカウントにおいてAWS Configのコストが高騰していることがありました。
原因は、AWS Batch on Fargateで構成されているジョブにおいて、大量のジョブを並行実行する負荷試験を実施した結果、ネットワークインターフェースに関するイベントがAWS Configに記録され続けたというものでした。

本来であれば、対象のAWSアカウントのAWS Configの設定で特定のリソースタイプを除外することが可能です。
参考: https://docs.aws.amazon.com/ja_jp/config/latest/developerguide/select-resources-excluding.html

しかし、コンプライアンスの観点から、個別のアカウントでAWS Configを編集することを無効にしているため、別の方法で実現する必要がありました。

# 実現方法
以下のブログを参考にさせてもらいました
- https://aws.amazon.com/jp/blogs/news/customize-aws-config-resource-tracking-in-aws-control-tower-environment/
- https://zenn.dev/septeni_japan/articles/e5396eeb30b388

AWS Configの設定を除外することは、Security Hubでも検知されなくなることから、セキュリティ上の観点からリスクを伴います。
今回の対応は、コスト高騰を防ぐための期間限定の暫定的対処という位置付けにしています。
参考のリンクはCloudFormationで実施していますが、今回はTerraformでリソースの作成を行いました。

# 構成
作成した構成は以下となります
![aws_config_override (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50168/4eaddbb4-25b5-bfb2-68fa-be8902592df5.png)

作成したLambda関数は実現方法のAWS公式ブログにもある`AWSControlTowerExecution` ロールを利用します。強い権限のロールであることから、マスタアカウントへのアクセス権の管理なども含め十分ご注意いただくことをお勧めします。

## 実現の流れ

### 事前準備

事前に以下の手順を実施しておく

1. マスタアカウトにおいてパラメータストアの初期構築(Terraformで管理）
1. マスタアカウトにおいてOverride設定用のLambdaをデプロイ(Terraformで管理）

### オーバーライドを実施する場合
1. マスタアカウトにて、設定を有効にするアカウントIDと除外したいリソースタイプをパラメータストアに格納しておきます。(Terraformで管理）
1. 二重チェックの意味で、マネジメントコンソールからLambdaのテスト画面で対象アカウントを指定して関数を実行(子アカウント)

### オーバーライドを止める場合
1. マスタアカウトにて、設定を無効にするアカウントIDと除外したいリソースタイプをパラメータストアから削除しておきます。(Terraformで管理）
1. 二重チェックの意味で、マネジメントコンソールからLambdaのテスト画面で無効にする対象アカウントを指定して関数を実行(子アカウント)


# まとめ
上記の対応で子アカウント上のAWS Configのオーバーライドを設定することができました。
繰返しになりますが、Configのオーバーライドはセキュリティリスクを伴うため、オーバーライドをしないような運用対処が可能であれば（今回ではAWS Batchの並列実行の回数を少なくする）、そちらを実施いただくことを推奨します。

# 注意事項
- こちらの対応はあくまで一例であり、読者の方が本構成を利用する際はセキュリティ上のリスクを十分に把握された上、読者の方の責任で実施をお願いいたします。
useraddとadduserの呪い

毎度、ググっても出てこない小ネタを取り扱っております。
本記事は個人的な見解であり、筆者の所属するいかなる団体にも関係ございません。

# 0. はじめに

いつもユーザーを追加するときに間違えてコマンドを打ってしまって「あちゃー」と思うのがuseraddではないでしょうか。

adduserと打ちたいのにuseraddの方が頭に残っていてユーザーを追加すると思い出すのが、useraddですよね(そうです、これを読んだあなたも、もうuseraddの呪縛から離れられません。オレと同じに呪われるが良い)

# 1. とはいえいつもいつも失敗するのも恥ずかしいので対策を考えた

まずは、ChatGPT-4に話を聞いてもらいます(なぜ？？)

```
Linuxで、よくいつもuseraddとadduserを間違えてしまうのですが、何かいい方法はありませんか？
```

ChatGPT-4の答え(いつもお世話になっております)
```
Linuxで `useradd` と `adduser` を混同されるとのことですね。両者の違いを理解し、混乱を避ける方法をご紹介します。

1. **コマンドの違いを理解する**:
   - **`useradd`**: 低レベルのシステムコマンドで、ユーザーを追加するための基本的な機能を提供します。しかし、ホームディレクトリの作成や初期設定ファイルのコピーなど、一部の設定は自動的に行われません。
   - **`adduser`**: 高レベルのスクリプトで、`useradd` を内部で使用し、対話的にユーザーを作成します。ホームディレクトリの作成、シェルの設定、パスワードの設定などを自動的に行います。

2. **覚えやすい方法を使う**:
   - **名称の順序で覚える**: `adduser` は「ユーザーを追加する」という英語の順序そのままです。一方、`useradd` は逆になっています。
   - **語呂合わせ**: 「ユーザーを追加する」だから `adduser` と覚える。

3. **エイリアスを設定する**:
   - シェルの設定ファイル（例: `~/.bashrc`）に以下を追加して、よく使うコマンドに統一します。
     ```bash
     alias useradd='adduser'
     ```
     これで `useradd` を入力しても `adduser` が実行されます。

4. **使うコマンドを統一する**:
   - 常に `adduser` を使用するように習慣づけると、混乱が減ります。

5. **ヘルプやマニュアルを活用する**:
   - コマンドを使用する前に `man useradd` や `man adduser` で確認する習慣をつける。

これらの方法を試してみて、混乱を減らせるか確認してみてください。何か他にご質問やお手伝いできることがあれば、お知らせください。
```

なるほどですね。useraddの方が古い歴史をもっているので私がミスってしまうのも当然ということです。

# 2. Aliasを作る

ChatGPTさんにオススメされた .bashrcにaliasを書くことにしましょう。

```file:.bashrc
alias useradd='adduser'
```

ログインし直して、`sudo useradd`してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/7fa70c96-913b-d82c-e08a-b4702437c5a4.png)

あれ？adduserでは聞かれるはずのインタラクティブなUIが聞かれません。

こういうのが出るはず。。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/46f6ff10-3407-a757-3fc3-b3e1b3b70c6a.png)

※アカウントは登録されていました。

# 3. ChatGPTさんに解決を求める

```
alias useradd='adduser' 
を追加してみましたが、通常のadduserで表示されるインタラクティブなパスワード設定画面などが出てきません。
```

## 3.2 以下、ChatGPTさんの回答
---


.bashrcにエイリアスを追加した場合、そのエイリアスはそのユーザーのシェルセッションにのみ適用されます。sudoを使用すると、多くの設定で環境変数やエイリアスが引き継がれないため、新しく作成されたエイリアスが認識されません。

ご不便をおかけして申し訳ありません。`alias useradd='adduser'` を設定しても、期待通りのインタラクティブなパスワード設定画面が表示されないとのことですね。これはいくつかの理由が考えられます。

### **問題の原因**

1. **エイリアスの適用範囲の制限**:
   - **`sudo` コマンド使用時のエイリアスの非適用**: `sudo useradd` と入力した場合、エイリアスは適用されません。これは、`sudo` は新しいシェル環境でコマンドを実行するため、現在のユーザーのエイリアスが引き継がれないためです。

2. **エイリアスよりもフルパスが優先される**:
   - システムによっては、`/usr/sbin/useradd` のようにフルパスでコマンドが呼び出される場合があり、その場合エイリアスは無視されます。

3. **シェルスクリプト内でのエイリアスの非適用**:
   - エイリアスは対話型シェルでのみ有効で、シェルスクリプト内ではデフォルトでは有効になりません。

### **解決策**

以下の方法を試してみてください。

#### **1. シェル関数を使用する**

エイリアスの代わりに、シェル関数を定義すると問題が解決する場合があります。

```bash
# ~/.bashrc または ~/.zshrc に追加
useradd() {
   sudo bash -c 'adduser "$@"'
}
```

この関数は `useradd` コマンドを呼び出すと、自動的に `adduser` を実行します。関数はエイリアスよりも柔軟で、`sudo` を使用する場合でも機能する可能性があります。


# 3. 採用した方法

以下を.bashrcに追加しました。

```bash
# ~/.bashrc または ~/.zshrc に追加
useradd() {
   sudo bash -c 'adduser "$@"'
}
```

# 4. まとめ

ホント困るわ。。

# 5. 参考

Ubuntuユーザ追加とsudo権限付与。ユーザ/グループ操作まとめ \| WWWクリエイターズ 
https://www-creators.com/archives/241

useradd / adduser \#UNIX \- Qiita 
https://qiita.com/amedama/items/f45677cd944c42cde839
Microsoft 365 CopilotとMicrosoft Copilotでのエンタープライズ データ保護

**使っているクラウドなどの小ネタ Advent Calendar 2024 18日目**


チャット履歴はMicrosoftのシステムには保存されず、モデルの学習にも利用されないみたいですが、まずはヘルプから...

+ [Microsoft 365 CopilotとMicrosoft Copilotでのエンタープライズ データ保護](https://learn.microsoft.com/ja-jp/copilot/microsoft-365/enterprise-data-protection)

Microsoft 365 CopilotとMicrosoft Copilotは、Microsoft 365 の商用オファリングで利用可能なのと同じエンタープライズ条項を提供します[2] 。

Microsoft 365 CopilotとMicrosoft Copilotの使用には、プロンプト (ユーザーが入力) と応答 (Copilot によって生成されたコンテンツ) が含まれます。 EDP を使用すると、プロンプトと応答は、Exchange のメールと SharePoint のファイルに関して、お客様から広く信頼されている同じ契約条件とコミットメントによって保護されます。

+ **お客様のデータをセキュリティで保護します。** 保存時と転送中の 暗号化 、厳格な物理的なセキュリティ制御、テナント間のデータ 分離 を使用してデータを保護します。

+ **データはプライベートです。** お客様の指示に従う場合を除き、お客様のデータは使用されません。 プライバシーに対する当社のコミットメントには、GDPR、ISO/IEC 27018、およびデータ保護補遺のサポートが含まれます。

+ **データはプライベートです。** お客様の指示に従う場合を除き、お客様のデータは使用されません。 プライバシーに対する当社のコミットメントには、GDPR、ISO/IEC 27018、およびデータ保護補遺のサポートが含まれます。

+ **AI のセキュリティと著作権のリスクから保護されています。** 有害なコンテンツや迅速な注入など、AI に焦点を当てたリスクから保護するのに役立ちます。 コンテンツの著作権に関する懸念事項については、 保護された素材の検出 と 顧客著作権コミットメントを提供します。 

+ **データは基礎モデルのトレーニングには使用されません。** Microsoft Copilotは、ユーザーのコンテキストを使用して関連する応答を作成します。 Microsoft 365 Copilotでは、Microsoft Graph データも使用されます。 Microsoft Graph を通じてアクセスされる他の Copilot オファー、プロンプト、応答、データと一致することは、 基盤モデルのトレーニングには使用されません。

--------------------


+ [Microsoft Copilot (旧Bing Chat Enterprise / 商用データ保護を備えたCopilot) の2024年9月下旬のアップデート内容を整理してみた](https://sasami-axis.hatenablog.com/entry/2024/10/04/205055)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/64459825-ca5d-5cbb-f470-8d46f3d41494.png)

+ [【最新】Copilotは商用利用可能！各プランで注意すべきポイントを解説](https://shift-ai.co.jp/blog/6352/)
DOMPurifyを使ったsanitizeの実装を簡単にまとめてみた

:::note info
この記事はZOZO Advent Calendar 2024 シリーズ7の4日目の記事です。
:::

## はじめに
先日初めてDOMPurifyを用いたサニタイズの実装をしました
せっかくなので今回はそれについて簡単にまとめようと思います

## サニタイズとは
サニタイズとは、ユーザーが入力したデータや外部から取得したデータを表示する際、不正なスクリプトや危険な文字列を無害化する処理を指します
特にフロントエンドではクロスサイトスクリプティング（XSS）などのセキュリティリスクを防ぐ目的で実装されたりします

## DOMPurify
### DOMPurifyとは
DOMPurifyとはHTMLやSVGなどのコンテンツをサニタイズするために使用されるJavaScriptライブラリです

https://github.com/cure53/DOMPurify

非常に高速なサニタイズを提供し、大量のデータを処理する際にも優れたパフォーマンスを発揮するため、数あるサニタイズライブラリの中でも高い人気を誇っています

https://npm-compare.com/ja-JP/dompurify,insane,sanitize-html,xss-filters


### 使い方
今回はReactで使用する例を紹介したいと思います

１. ライブラリのインストールします(今回はnpm経由)

```
npm install dompurify
```

２. インストールしたDOMPurifyをインポートしDOMPurifyの`sanitize`関数にサニタイズしたいHTMLを渡す
```react
import DOMPurify from 'dompurify';

const clean = DOMPurify.sanitize('<b>hello there</b>');
```

以上で基本的なサニタイズは実現できます


### 実例
今回は以下のようなHTMLを元に実例を見ていきたいと思います

```
`<div style="color: red;"><p>サニタイズデモ</p><script>alert('scriptタグを用いたXSS');</script></div>`
```

以下のようなコードでサニタイズなしで表示するとscriptタグなどもそのまま埋め込まれているのが確認できます
```react
function App() {
  // サニタイズ前のHTML
  const html = `<div style="color: red;"><p>サニタイズデモ</p><script>alert('scriptタグを用いたXSS');</script></div>`;

  return (
    <>
      <div dangerouslySetInnerHTML={{ __html: html }} />
    </>
  );
}
```
![スクリーンショット 2024-12-04 3.30.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1602210/b61bfb47-9042-8e7f-a665-bc7d3af2ab92.png)

これでは悪意のあるスクリプトが入っていた際に、情報漏洩などのリスクを伴ってしまいます
そこでDOMPurifyを用いてサニタイズを実装してみます

すると、scriptタグが切り取られているのが確認できると思います

```react
function App() {
  // サニタイズ前のHTML
  const html = `<div style="color: red;"><p>サニタイズデモ</p><script>alert('scriptタグを用いたXSS');</script></div>`;

  // サニタイズ後のHTML
  const cleanHTML = DOMPurify.sanitize(html);

  return (
    <>
      <div dangerouslySetInnerHTML={{ __html: cleanHTML }} />
    </>
  );
}
```
![スクリーンショット 2024-12-04 3.34.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1602210/e56caceb-7fa2-bd56-7b99-ddb1c0568fc6.png)


ちなみに、`sanitize`関数の第二引数にて細かい設定を追加することもできます
以下ではstyle属性も取り除くように設定を追加し、実際に取り除かれているのが確認できます

```react
const cleanHTML = DOMPurify.sanitize(html, { FORBID_ATTR: ["style"] });
```

![スクリーンショット 2024-12-04 3.38.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1602210/0e5ca234-137b-10e6-7a20-5c769c7bf704.png)

他にもDOMPurifyのリポジトリの[README](https://github.com/cure53/DOMPurify?tab=readme-ov-file#can-i-configure-dompurify)に設定回りついても書いてあるので興味ある方は覗いてみてください



## おわり
今回はDOMPurifyを用いたサニタイズの実装について簡単にまとめてみました
引き続きDOMPurifyやセキュリティ周りついての知見を増やし、機会があればアウトプットもしていきたいと思います！

内容やソースコードに間違い等ありましたらご指摘いただけますと学びになり大変幸いです。
ここまで読んでいただきましてありがとうございました！
茶色が話す　僕の競プロ アホミス集!!

# この記事を書いた経緯
面白いネタなので、折角だからアドベントカレンダーで、消費しようと思いました。

# 初めに
$$
みなさん アホミスは、本当に危険です
$$$$
皆さん気をつけましょう
$$

まあ普通に僕が、競プロでやっちまったアホミスを紹介します。
あとこの記事に書かれているミス集は、すべて本番でやってしまいました。(どうにかしたほうがいいぞ)

やっぱりコードを早く書こうとすると、バグは出ますけど、僕のミスは提出言語ミスったり本当にアホなミスもあるので温かい目で御覧ください

問題ごとにまとめてあります。

# [ABC362-A](https://atcoder.jp/contests/abc362/tasks/abc362_a)での出来事
はA問題だぞと言われても、その頃まだ灰色だったので、ご了承
あのときは、本当にショックでした。
初めての2完をなんとint型に、変換を忘れただけで、取り逃がしてしまったのですw。
そのあとB問題はACしたのですが、翌日解説を見たら、int型に変換を忘れただけ、ということに気づきショックでした

提出コード
```py
l = input().split(' ')

t = input()

if t == 'Red':
    del l[0]

    print(min(l))
elif t == 'Green':
    del l[1]

    print(min(l))
elif t == 'Blue':
    del l[2]

    print(min(l))
```

# [ABC374-C](https://atcoder.jp/contests/abc374/tasks/abc374_c)での出来事
これは、提出言語の問題でした。
その頃cythonを使っていたのですが、cythonは基本的な動作は、早いのですが、forループなどは、遅いです
その弊害でpypyで、提出すれば、ACできるのにTLE
結局　その頃サブとして使っていたRustでACしたけど　結構タイムロスしてしまいました。

その後のDも考察ミスって、permutationとbit全探索で解けるのに、4完の機会を逃してしいました。

# [ABC379-B](https://atcoder.jp/contests/abc379/tasks/abc379_b)での出来事
これはトラウマです。
簡単な貪欲で解けるのに、インデックス調整ミスって4ペナ食らった。
あのときは最悪でした。
結局ACしたのですが、順位表を照会したら、4ペナ食らってなければ、perfは30ぐらいがってたらしく、萎えました

# [ABC380-D](https://atcoder.jp/contests/abc380/tasks/abc380_d)での出来事
これは考察ミスです。
popcountだけでACできるのに、最後の方popcount使うアイデアを思いついたのに、変な方向に考察が行ってしまって、結局ACできませんでした。
僕は先入観が強いのでこういう考察系は、ACできる解法を思いつけばいいですけど、変な方向に行くと、戻ってこないことが多いので、そこを改善したいです。

# [ABC382-D](https://atcoder.jp/contests/abc382/tasks/abc382_d)での出来事
これは提出言語ミスりました。
最初pythonで書いたのですが、pypyの再帰関数が遅い可能性が、あるので、C++で提出してTLEしたのですが、その後pypyで提出しようとしたら、提出言語がC++のまま もちろんCEになり　pypyで提出したら普通にACしました

# 最後に
どうでしたか
僕のアホミスの酷い有様を
まあそこまでメンタルはボロボロじゃないですけど、やっちまったとは毎回思います
長々と見ていただきありがとうございます。
未経験からGoogle Cloud認定資格Associate Cloud Engineer(ACE)を一週間で合格する方法

## ACEに一週間で合格することは可能か

タイトルの通り、Google Cloud認定資格Associate Cloud Engineerに一週間で合格する事は可能なのでしょうか。先に答えを言うと、「可能」です。

私の場合、Google Cloudの知識は勉強開始前でゼロに等しいものでした。普段はAWSを使用しているため、クラウドに関する基本的な知識はある程度持っていましたが。。。

今回は、そんなGoogle Cloud未経験の私が一週間でAssociate Cloud Engineer資格を取得した方法を伝授していきたいと思います。勉強期間は一週間である必要はありませんが、勉強方法は参考になると思いますのでぜひ最後までご覧ください。

## 勉強方法

私が実践した勉強方法はいたってシンプルです。特別なことは何もしていないので、真似しやすいのではないかと思います。

実際に私が実践した勉強方法はこちら↓
- 試験概要の把握
- 知識のインプット
- **大量の**アウトプット

ポイントは、とにかく大量にアウトプットを行うという点です。
それぞれ具体的に見ていきましょう。


### 概要把握

まずは、試験の概要を把握します。
この際のポイントとしては
- どのような形式のテストなのか
- どれくらい点数を取ればいいのか
- 出題範囲
- 傾向
ざっくりこんな感じです。

どれも資格取得においては基本的な項目ですね。
こちらは公式ドキュメントなどを活用して情報収集していきましょう。傾向に関しては、問題演習をしながらつかめていく部分もあるので、それほど重きを置かなくても大丈夫です。

### 基本的な知識のインプット

次に、基本的な知識のインプットを行いましょう。
重箱の隅をつつくような問題に関する知識まで覚える必要はありませんが、基本的な知識は確実に覚えましょう。
ここでのポイントは、「とりあえず範囲を一周する」です。

人間は、初めて覚えたことの半分以上を忘れてしまう生き物です。そのため、完全に覚えてから次の範囲を学習しようという姿勢では、いつまでたっても覚えられません。
まずは試験範囲を一周して、半分くらい理解することを心掛けてください。
必要に応じて何週も試験範囲を学習する方が、結果として効率的かつ時間がかかりません。


インプット方法ですが、私はUdemyの講座を受講しました。
テキストベースよりも頭に入ってきやすく、通勤電車の中など隙間時間でも学習できるのでお勧めです。
私は2倍速で再生していましたが、慣れれば意外と早く感じません。


### 過去問題を使ったアウトプット

こちらが私の勉強方法で最大の特徴となるかもしれません。
それは、「とにかくアウトプットに時間を割く」という点です。通常の勉強方法では、インプットにある程度の時間をかけ、その後問題演習などでアウトプットを行うのが一般的かもしれません。

しかし、私の経験上これはあまり効率的とは言えません。
その理由は先ほども少し触れた、「人間は忘れる生き物である」という点に関係します。
どんなにインプットに時間を割いても、アウトプットを行わなければ定着しません。
「勉強を教えることで自分自身の勉強にもなる」というのも、このことに関係するのではないでしょうか。
アウトプットに多くの時間を割きましょう。

具体的にはどうするのか、こちらは簡単です。
過去問題などを活用して、とにかく問題を解きまくりましょう。
もちろん、ただ説いて答えあわせをするだけでは意味がありません。答え合わせの後、解説まで丁寧に読み込みましょう。こうすることで、知識のアウトプット→間違えた部分の知識の再インプット→問題を通したアウトプットのサイクルが自動的に回りだします。
私の経験上、いかにインプットとアウトプットのサイクルを回すかがカギになります。


## まとめ

いかがでしたでしょうか。
これが、私が一週間で合格した勉強方法となります。
もちろん、勉強方法や勉強期間は人それぞれです。ですが、基本的な資格取得の流れは大体この通りなのではないかと考えています。効率的に学習している人ほど、アウトプットに多くの時間を割いている印象です。

試行錯誤しながら、自分なりの学習方法を模索してみてくださいね。


## おまけ

今回の一週間の学習時間をまとめてみたので参考にしてください。

- 概要把握：1時間程度
- 知識のインプット：4日間(一日当たり2時間程度)
- アウトプット：2日間(一日あたり4時間強)
合計学習時間：20時間程度
「AmazonサービスAPIアクセスに予定されている変更」というメールが来た

# 経緯
SP-APIの認証きれるからちゃんとしてねとメール来た
→LWA認証だけした
→けど、IAM使った対応もちゃんとやってねと。

# やること①IAM確認
1. AWSにログイン
1. IAMの管理画面に遷移
1. ユーザーを選ぶ
1. まんなかあたりのアクセスキーを確認
1. ステータスがactiveであること確認
1. アクセスキー把握
1. ※シークレットキーを忘れたなら再発行する必要あり


# やること②LWA認証
こっちだけやっちゃったけど再度。

1. セラーセントラルログイン
1. アプリとサービス＞アプリの開発をクリック
1. 通したいアプリを選ぶ（or新規作成）
1. LWA認証情報の「表示」をクリック
    1. クライアントIDが出てくる→コピー①
    1. クライアント機密情報▼を押す→表示されたシークレットキーをコピー②
1. アプリの編集▼を押す
    1. 承認　を押す
    1. 「認可の追加」のアプリを承認を押す→リフレッシュトークンをコピー③

# 実装
開発環境が変わってしまったので、colabで一から立て直そうと奮闘。
だがしかし。

ずーっと認証エラー…
LWA認証はとおるんだけど、実際にカテゴリとかのsp-api使おうとすると

```
エラーが発生しました: 403
{
  "errors": [
    {
      "code": "Unauthorized",
      "message": "Access to requested resource is denied.",
      "details": "Access token is missing in the request header."
    }
  ]
}
```
のレスポンス…

メールには「今日中やらないと失効するよ！」って書いてあるけど…1日戦って無理だったんだよ…

# 結論
昔の自分すごいな…
Cursorのルール設定で実現する！チーム開発の一貫性を保つための.cursorrulesファイル活用術

## 概要

AIエディタ Cursorには2つのルール設定があります。

1つは設定内のもので、すべてのプロジェクトと対話に適用されます。

もう1つはプロジェクトのルートディレクトリにある`.cursorrules`で、現在のプロジェクトに適用されます。

### Rules for AI と .cursorrules

- **Rules for AI**: Cursorの設定画面で設定します。詳細は[こちら](https://qiita.com/tichise/items/751d7a6c01a4d74b766c)を参考にしてください。
- **.cursorrules**: 作成後、リポジトリのルート直下に配置します。

### Rules for AI 設定 と .cursorrules ファイル の違い

| 項目 | Rules for AI | .cursorrules |
| --- | --- | --- |
| 対象 | 文体や参考情報 | コーディング規約や選定技術 |
| 範囲 | ユーザーごとの設定 | プロジェクトまたはチーム全体 |
| 設定場所 | Cursor内での設定 | リポジトリのルートディレクトリ |
| ルール | ユーザーごとのルール | プロジェクト全体のルール |

このように、Rules for AIと.cursorrulesはそれぞれ異なる目的と範囲を持っています。プロジェクトに応じて適切なルールを選択しましょう。

## .cursorrulesファイルの利点

.cursorrulesは、Cursor AIの体験を向上させるための強力な機能です。以下は、.cursorrulesを使用する理由です。

- **カスタマイズされたAIの動作**: .cursorrulesファイルは、AIの応答をプロジェクトの特定のニーズに合わせて調整し、より関連性の高い正確なコード提案を保証します。
- **一貫性**: コーディング標準やベストプラクティスを.cursorrulesファイルに定義することで、AIがプロジェクトのスタイルガイドラインに沿ったコードを生成することを確実にします。
- **コンテキストの認識**: プロジェクトに関する重要なコンテキスト（一般的に使用されるメソッド、アーキテクチャの決定、特定のライブラリなど）をAIに提供することで、より情報に基づいたコード生成が可能になります。
- **生産性の向上**: 明確に定義されたルールにより、AIは手動編集が少なくて済むコードを生成でき、開発プロセスを加速します。
- **チームの整合性**: チームプロジェクトの場合、共有の.cursorrulesファイルにより、すべてのチームメンバーが一貫したAI支援を受けられ、コーディングプラクティスの統一が促進されます。
- **プロジェクト特有の知識**: プロジェクトの構造、依存関係、または独自の要件に関する情報を含めることで、AIがより正確で関連性の高い提案を提供できるようになります。

プロジェクトのルートディレクトリに.cursorrulesファイルを作成することで、これらの利点を活用し、Cursor AIでのコーディング体験を向上させることができます。

## 良い.cursorrulesの書き方を調べる方法

[PatrickJS/awesome-cursorrules: 📄 A curated list of awesome .cursorrules files](https://github.com/PatrickJS/awesome-cursorrules/tree/main)

が参考になります。このリポジトリは、Cursorのルールをカスタマイズした例を集めたリポジトリです。

## 参考ドキュメント

- [基本設定 – Cursor 使用ドキュメント](https://cursor.document.top/ja/tips/usage/basic-setting/)
- [Cursor - Build Software Faster](https://docs.cursor.com/context/rules-for-ai)
SSH接続に対するエラーを、サーバ全体で行う

# 概要
手元のPCやサーバから、NW機器などにログインしようとした際、セキュリティエラーにより拒否される場合がある。`no matching key exchange method found`など。

その場合、ユーザ配下の`.ssh/config`を基本的に操作することで解決させたりするが、この場合はそれぞれのユーザ毎にしか適応されない。これを、このサーバを使用する全ユーザで適応させるようにしたい。

## 解決策
以下の、openssh.configファイル自身を変更する。
```
/etc/crypto-policies/back-ends/openssh.config
```

### 対応例

#### no matching key exchange method found. Their offer: diffie-hellman-group1-sha1

`openssh.config`の`KexAlgorithms`に`diffie-hellman-group1-sha1`の設定を追加する。
```
sudo vi  /etc/crypto-policies/back-ends/openssh.config
```

```:記載内容
KexAlgorithms diffie-hellman-group1-sha1
```
#### no matching host key type found. Their offer: rsa-sha2-512
同じようにopenssh.configを編集して記載する。
```:記載内容
HostKeyAlgorithms ssh-rsa,ssh-dss,rsa-sha2-512
```

このように、ssh.configは、.sshは以下のconfigと同じように適応できるが、サーバ全体にユーザーに機能させることが可能。
■ 02.Quality Assurance（品質保証、QA）の考え方について

# ■ Quality Assurance（品質保証、QA）の考え方とは？

# ・<font color="#00bfff">**基本的な考え方**</font>
<br>
製品やサービスがユーザーに提供される前に品質を確認するだけでなく、

開発プロセスそのものが

本来品質に含まれるものが設計されているかを重視する考え方です。

<br>

# ■ QAの主要な考え方とは？

<br>

　-> <INS><font color="#66cdaa">予防重視のアプローチ：</font></INS>
 　　問題が発生してから修正するのではなく、
 　　問題が起きないように「予防」することを重視します。
 　　
 　　そのため、開発初期段階からテスト設計や品質基準の設定、
 　　リスクアセスメントを行い、潜在的なリスクや問題を排除することが基本です。
<br>
　-> <INS><font color="#66cdaa">プロセス中心の品質管理：</font></INS>
 　 「良いプロダクトは良いプロセスから生まれる」という考えから、
 　　製品やサービスの品質は、開発プロセス全体の品質管理によって大きく影響される為、
 　　下記のプロセス自体の品質改善等を重視します。
   
 　　・開発フロー
 　　・テスト手法
 　　・フィードバックサイクル
<br>
　-> <INS><font color="#66cdaa">顧客視点での品質基準：</font></INS>
 　　単に技術的な基準だけでなく、最終的なユーザーが期待する品質にフォーカスします。
 　　顧客満足度が高くなる品質を目指し、顧客の期待やニーズを満たす為に、
 　　下記の様々な品質特性を確認します。
   
 　　・機能性
 　　・信頼性
 　　・使いやすさ
 　　・安全性
<br>
　-> <INS><font color="#66cdaa">継続的改善（PDCAサイクル）：</font></INS>
 　　QAには、繰り返す「PDCAサイクル」が含まれています。
 　　
 　　・Plan（計画）
 　　・Do（実行）
 　　・Check（評価）
 　　・Act（改善）

   　<INS><font color="#00bfff">■ 継続的改善（PDCAサイクル）の具体例についてはこちら</font></INS>
 　　https://qiita.com/aokimakiko/items/ed9823a8e2cfbd58c0d7
   
 　　これは品質を一度達成して終わりではなく、
 　　継続的に評価・改善を続けるという考え方です。
<br>
　-> <INS><font color="#66cdaa">全員参加型の品質保証：</font></INS>
 　　QAは、専任のQAチームだけの責任ではなく、チーム全員が関与すべきプロセスです。
   
 　　・開発者
 　　・デザイナー
 　　・プロダクトマネージャーなど
 　　
 　　全ての関係者が品質を意識して作業にあたることで、
 　　製品全体のクオリティが向上します。
<br>

# ■ まとめ：QAの考え方のメリット

　-> 製品の安定性や信頼性が向上し、製品の質を上げることに貢献できる
 
　-> バグ修正や手戻りが減り、コスト削減が期待できる
 
　-> 早い段階で問題が発見され、開発の効率化に貢献できる
 
　-> 品質改善が組織全体に広がり、企業としての信頼性が高まる
 
<br>

<INS>QAの考え方を実践することは、組織が提供する製品・サービスの価値を高め、
長期的な顧客満足や信頼構築に貢献するために不可欠だと思います。
<br>

<INS><font color="#00bfff">「■ 03.Quality Assurance（品質保証、QA）に必要なスキルについて」へ続く</font></INS>
https://qiita.com/aokimakiko/items/e065810d62840555a501
Windowsアプリケーションのインストール日を含めた一覧を取得

## 1. はじめに
PCを移行したり，クリーンインストールしたりするときに以前のインストール状態を確認するためには，インストールされているアプリ一覧を取得しておく必要があります．
設定やコントロールパネルなどからみることができますが，内容を保存するためにはスクロールしながら写真を何回も取るなど面倒です．
テキストファイルとして出力する方法を共有します．

## 2. 結果
以下のような内容が記載されたtxtファイルを出力します．
```InstalledAppsWithDate.txt
Name                                                           Version          InstallDate       
----                                                           -------          -----------       
Microsoft Teams Meeting Add-in for Microsoft Office            1.24.28402       2024/11/19 0:00:00
Webex                                                          42.11.0.24187    2022/12/02 0:00:00
Fritzing                                                       1.0.2.0          2024/05/19 0:00:00
Office 16 Click-to-Run Extensibility Component                 16.0.18129.20100 2024/11/01 0:00:00
Office 16 Click-to-Run Localization Component                  16.0.18129.20100 2024/11/01 0:00:00
Office 16 Click-to-Run Licensing Component                     16.0.18129.20158 2024/11/18 0:00:00
NI LabVIEW Runtime Interop 2024 (64-bit)                       24.10.49442      2024/08/14 0:00:00
...
```

## 3. コマンド
```
Get-WmiObject -Class Win32_Product | Select-Object Name, Version, @{Name="InstallDate";Expression={[datetime]::ParseExact($_.InstallDate, 'yyyyMMdd', $null)}} | Out-File "C:\Users\$USERNAME\Desktop\InstalledAppsWithDate.txt"
```
$USERNAMEの部分を変更してください．
10秒ちょっと待つと先ほどの結果が得られます．

## 参考文献
[1] Atsushi Nakamura, Zenn, "Powershellでインストールされているアプリケーションとバージョンのリストを取得する", 

https://zenn.dev/nuits_jp/articles/get-applications-by-powershell

[2] itoby, FC2ブログ, "PSでインストールされているソフトウェア一覧をtxtに吐き出す。

https://sugarandmilk.jp/blog-entry-337.html#google_vignette
一瞬で理解する改行コード

# はじめに
株式会社LITALICOの@iwafsです。
業務で改行コードの処理を行うことが度々あるのですが、
毎度検索している気がするのでこの機会に改行コード・改行文字についてまとめてみました。

# 結論
改行コードまたは改行文字とは、コンピュータ上で改行を表す制御文字のことです。
全部で3種類あり、OSによってコードが異なります。

| コード | 正称 | 意味 | OS | エスケープ<br>シーケンス |ASCII|
|:-:|:-|:-|:-:|:-:|:-:|
|**CRLF**| Carriage Return<br>Line Feed|行頭復帰かつ改行| **Windows** |**\r\n**|0x0A<br>0x0D|
|**CR**| Carriage Return|行頭復帰| **macOS 9以前** |**\r**|0x0A|
|**LF**| Line Feed|改行| **Unix系**,<br>**macOS X以降**,<br>**iOS**,<br>**Android** |**\n**|0x0D|

# 改行コードの由来
改行コードのCR（Carriage Return：キャリッジリターン）やLF（Line Feed：ラインフィード）はタイプライターの改行動作が由来です。
タイプライターを使用して文章を書く際は、この2つの動作で改行を行っていました。

- CR：ロール紙を挟み込むキャリッジを行の先頭へ戻す
- LF：ロール紙を回して1行送る

<img width=300 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3950001/3d6f1774-f0c7-fd9d-ad97-81e0be46bdff.png">

# OSによって改行コードが異なる理由
諸説あるそうですがOSの成り立ちや設計哲学が異なるため改行コードも異なり、
そのまま慣習的に別々の改行コードを採用しているようです。

ちなみにmacOSのバージョンによって改行コードが異なるのは、
macOS 9からmacOS Xへバージョンアップする際にUnixベースのOSへ移行したからです。

<img width=300 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3950001/62f0daf8-0f2a-03dd-78e8-825be74c2880.png">


# 改行コードの差異による問題
異なるOS間でファイルのやりとりを行うと、改行コードの違いによって改行が無視されたりコンパイルエラーが発生することがあります。
この場合、各種エディタやターミナルから改行コードの変換を行うことができます。

 :::note warn
改行コードがCRの場合の変換方法は、macOS 9以前しか使われていないため省略します。
:::


### Visual Studio Codeで変換する場合

1. 現在の改行コード表示部をクリックします
    <img width=600 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3950001/3a506cd9-4068-f834-6cf5-1d8a6848632a.png">
1. 変換したい改行コードを選択します
    <img width=600 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3950001/9d51de96-8772-8a5c-457a-a39af8c8c073.png">
1. 改行コードが変換されたことを確認します
    <img width=600 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3950001/b69ac88f-5762-5897-8546-a7c7ce2cbf05.png">


### ターミナルで変換する場合
1. 以下コマンドを実行して現在の改行コードを確認します
    ```bash
    $ file hoge.txt
    ```
1. 改行コードがCRLFまたはCRの場合はその旨が表示され、LFの場合は何も表示されません
    ```bash
    hoge.txt: Unicode text, UTF-8 text, with CRLF line terminators # CRLF
    hoge.txt: Unicode text, UTF-8 text, with CR line terminators   # CR
    hoge.txt: Unicode text, UTF-8 text                             # LF
    ```
1. dos2unixコマンドをインストールします
    ```bash
    brew install dos2unix
    ```
1. 以下コマンドを実行して改行コードを変換します（`unix2dos`は`dos2unix`パッケージに含まれています）
    ```bash
    # CRLF -> LF
    $ dos2unix hoge.txt
    # LF -> CRLF
    $ unix2dos hoge.txt
    ```
1. 変換後の改行コードを確認します
    ```bash
    $ file hoge.txt
    ```

# おわりに
普段意識することが少ない改行コードですが、異なるOS間でのファイルのやりとりを行う際には、その違いによって問題が生じることがあります。
改行コードの違いを理解して、適切にファイル管理していきましょう！
独り善がりな技術選定はやめたい🙇‍♂️

# はじめに

この話は数年前(かなり前⁈)のことです。

ある日、上司から「次の案件で業務向けWebアプリの技術選定をやってみないか？」と言われ、

私「はい、よろこんで！」と即答。

(案件チームは5人で納期は短めの小規模のもので、筆者(当時入社一年目)は初めての技術選定)

当時、私の会社では、フロントエンドでよく用いられる技術はjQuery95%、Vanillaのjavascript5%といった感じだったので、

私は、せっかく任せてもらったので今まで案件で採用していない技術を採用してみようと思い、

ライブラリの豊富さと公式ドキュメントの読みやすさ、パフォーマンスなどの点からReactに挑戦することにしました。

いざ、PGのコーディングフェーズがスタートすると、、

思いのほか、進捗が上がらず、学習コストがかかってしまっていた。

(私とリーダーは経験者、その他のメンバーは未経験)

納期も短めのこともあり、みんなで協力プレーでどうにか乗り切った。

(予定納期より若干遅延した🙇‍♂️)

# 失敗と学び

## 技術選定の理由が身勝手すぎた。

「今まで案件で採用していない技術」、「モダン」だからはあまりにも身勝手な理由だった。

(当時React、Vueが盛り上がっていて、正直なところ、実務経験を積みたかった。)

## ユーザー視点で考える

ユーザーには、レガシィ、モダン、難しい、簡単、な技術を用いたかどうかは関係ない。

ただモダンや、最新技術だから、使ってみたいから、でなく、ユーザーにとってどんなメリットがあるのかを考えて

選定すべきだった。

## チームメンバーの特徴の把握

メンバーみんなの学習速度は同じではないし、プライベートで学習できる人もいれば、育児や介護などに追われ、学習できない人もいる。

私は「プロダクトや技術」が好きだから、趣味で技術的な学習は楽しいが、

IT企業に勤めているからといってみんなが「プロダクトや技術」が好きではないと思っている。(会社規模や雰囲気にもよるかも)

なので、フレームワークなどの学習コストがかかりがちな技術を新たに導入する際は、

チームメンバーの構成や特徴の考えて、

業務中で学習が完結するかどうかなども加味して、学習コストを考慮するようにしている。


# おわりに

今考えてみると、どれも当たり前のことが出来てなくて

当時の自分に喝を入れたいぐらいだが、

失敗から学んだおかげで、今があると思うので

同じ過ちを繰り返さないよう、常に気を引き締めていきたい。
子育てと自己のスキルアップの両立について

※この記事はNTTコムウェア Advent Calendar 2024 9日目の記事です。
https://qiita.com/advent-calendar/2024/nttcomware

## 自己紹介

NTTコムウェアの伊藤です。社内では、開発プロジェクト向けに品質向上に関する技術支援を行っており、特に探索的テストというテスト技法を活用した支援を行っています。

2023年4月から産休育休を取得し、2024年2月からフルタイムで復帰しています。

## 前書き

育休から復帰したほとんどの方は仕事と家事育児の両立について一度は悩まれるのではないでしょうか？

特に、エンジニアとして働いている場合、仕事の時間だけで技術的なスキルの習得までをカバーすることは難しい状況に置かれることもあり、かといって以前のようにスキルアップの時間を確保するのが難しくなっていることに不安を感じる方も多いと思います。

今回は、自身が育休から復帰後の3ヶ月間(2024年3月初旬～2024年6月初旬)で、2つ資格を取得した経験をもとに、**家事や育児と自身のスキルアップを両立**させるために、心にとめておく必要があると感じたことについて話したいと思います。

仕事と育児の両立の大変さは人それぞれだと思います。仕事内容、子供の性格、人数、自身や家族の働き方など、大変さにつながる要素も様々ですし、その大変さをどう感じるかも人それぞれです。一つの経験談として読んでもらえればと思います。

この記事では、取得した資格ならではのノウハウについては書いていません。

## 取得した資格

| 資格名 | 試験日 | 申込日|試験形式 | 会場 | 学習期間と学習時間 | 
| --- | --- | --- |--- | --- | --- |
| AWS Certified Machine Learning - Specialty | 2024/3月末 |2024/2月末 |PC(テストセンター) | 自宅 or テストセンター会場 | 3月初旬から3月末35h程度 | 
| JCSQE(初級) | 2024/6/8 | 2024/4月初旬 |マークシート形式 | 近隣の受験会場 | 4月中旬から6月初旬45h程度 | 

## 考えたこと

### 計画を立てる際には、悲観的な要素は考慮し、楽観的な要素は考慮しない

* 悲観的な要素
  * 進捗を遅滞、停止させる要素
    * 子供や家族(自分含む)の病気
    * 予期せぬ家事・育児の負担増など
* 楽観的な要素
  * 進捗を捗らせる要素
    * 期限の直前にまとまった時間が取れる
    * 長期休暇がある
    * xxのタスクが終わる分、時間が取れるなど

初めからなんだか悲しい話になりましたが、要は**子育て中ならではのリスクを考慮し、十分なバッファーを積んでおこう**、という話です。

悲観的な要素については、主に家族の病気が大きなリスクになります。家族全員健康に何ヶ月も過ごせると考えるのは(少なくとも自分の場合は)楽観的な考えだと思っています。自分だけが風邪をひいてもだいたい2-3日で治り、すぐに復帰できますが、家族が順番に風邪をひいていった場合だと、2週間以上何も手をつけられない可能性もあります。

逆に楽観的な要素については、子供のいる生活ならではの予想外のことで簡単に無くなってしまうので、元々考慮に入れず、時間がとれた場合は「ボーナスステージ」くらいの心構えがいいと思います。あと、楽観的な要素に長期休暇を入れていますが、むしろ子育て中は、以前と異なり長期休暇にまとまった時間が取れないこともあります。

ざっくりと1日あたり学習にあてられる時間と、だいたい予想される総学習時間から学習に必要な日数を割り出しておき、そのとき算出される学習期間の**2倍程度**余裕をもつと自分はちょうどいいくらいでした。

### 期限やマイルストーンを決める

忙しいと、期限のないタスクは後回しにされがちで、なかなか着手されません。特に小さい子供に関するタスクは、たいてい優先順位は「**高**」になりますし、期限も「**今すぐ、むしろタスクが発生した時点で期限切れ**」のようなタスクが多いので、この中に混じった期限の無いタスクはなかなか着手されません。

最初に期限やマイルストーンを決めてしまうことで、タスクの優先順位が上がり、時間を有効活用(ある意味無理矢理ともいう)できるようになります。
例えば資格取得などだと、受験日を最初に決めてしまい、申し込んでしまう方が捗ります。最近はCBTなどで自由に受験日を決めることができ、便利ですが、「**いつでも受験できるから準備ができたら申し込めばいい**」というスタンスでいると、永遠に受験日はやってこない、ということが起こる可能性があります。
逆にいうと、期限や達成内容、マイルストーンを決めづらい内容についてはなかなか進めるのが難しいです。何かスキルアップを始める際には**期限やマイルストーンが決めやすいもの**をまずは選ぶと良いと思います。

### 取り組みやすいものから始める

前述した、マイルストーンの話でもありますが、スキルアップについて子育て中に取り組みやすいもの/取り組みにくいもの、は確実に存在します。まずは**何をしたいかではなく、何ができるか**、から考えるのもいいと思います。
取り組みやすいものから始め、徐々に難しいものギアチェンジすると挫折がなくスムーズにいく気がします。

| 取り組みやすいもの | 備考 | 
| --- | --- |
| すきま時間にできる | まとまった時間をとることが難しいため。特に、**急に中断でき、中断しても復帰しやすい**ものが望ましい | 
| 自身が既に持っている知識を活用できる | 全く新しいことを始めるには想像以上にエネルギーが必要なため。うまくいかないことも多い。そのストレスを受容できる余裕があるか | 
| 学習方法が確立されている | 例えば学習プラットフォームが既に確立されているものなどは、それを進めていけばある程度のスキル獲得は保障されているので取り組みやすい | 
| 受動的に実施できる | 能動的に実施するものは、中断すると復帰しにくいため。例えば読書とイベント聴講(録画)だと、イベント聴講(録画)の方が取り組みやすい | 

### それでも難しければ一旦やめてみる

どのようにスキルアップを達成するか、ということについて考えてきましたが、一定期間休止する、というのも選択肢の一つだと思います。どうしてもまとまった時間を確保するのは難しく、限られた時間内でやれることは限られてきます。

一旦休んで、余裕ができた時に向けた充電期間として捉えるのも一つの前向きなアプローチと言えるのではないでしょうか。
CloudFront + S3 で静的サイトを配信したい

# 結論

- https://aws.amazon.com/jp/amplify/hosting/
    - こういうのがあるので，使わないかもだけど，供養のため記事にします

# 静的サイトを配信したくなることがある

とはいえ，S3 だけだと，ちょっと嫌な場合がある
cache して欲しいとかそういう．
で，CloudFront を使おうとするけど，key にいい感じでアクセスさせたい．

```plantuml

!define AWSPuml https://raw.githubusercontent.com/awslabs/aws-icons-for-plantuml/v14.0/dist
!include AWSPuml/AWSCommon.puml

!include AWSPuml/General/Users.puml

!include AWSPuml/Groups/AWSCloud.puml
!include AWSPuml/NetworkingContentDelivery/CloudFront.puml
!include AWSPuml/Storage/SimpleStorageService.puml
!include AWSPuml/Compute/LambdaLambdaFunction.puml

!procedure $stepnum($number) 
<back:royalblue><color:white><b> $number </b></color></back>
!endprocedure

rectangle "$UsersIMG()\nユーザ" as users

AWSCloudGroup(cloud) {
      rectangle "$CloudFrontIMG()\nAmazon CloudFront" as cloudfront
      rectangle "$SimpleStorageServiceIMG()\nAmazon S3バケット" as s31
      rectangle "$LambdaLambdaFunctionIMG()\nCloudFunctions\nwith index.html" as lambda1
      rectangle "$LambdaLambdaFunctionIMG()\nLambda@Edge\nrewrite 404" as lambda2
}

cloudfront<-l-users: $stepnum("1")
cloudfront-d->lambda1: $stepnum("2")
cloudfront-r->s31: $stepnum("3")
cloudfront-d->lambda2: $stepnum("4")
```

- Lambda
    - `〜/` でアクセスされたのを `〜/index.html` とかにしてくれる
    - key が無い場合に S3 のエラーになるのを 404 にしてくれる

感じで，それなりに上手くいきます．

## Refs

https://dev.classmethod.jp/articles/cloudfront-functions-index-docum/

https://dev.classmethod.jp/articles/tsnote-lambdaedge-response-origin-errorpage/

https://dev.classmethod.jp/articles/amplify-amazon-s3-static-website-hosting/
【AWS re:Invent2024 | Gamified learning】3D 仮想脱出ゲーム(AI) セッションに参加してみた

# はじめに
本日、re:Invent Day2です！

若干の疲労感と時差ボケ:sleepy:は感じていますが、セッションや展示はどれもワクワクするものばかりで疲れを忘れられる瞬間が多くとても充実しています:muscle:

さて、今回はセッションタイプに”Gamified learning”という楽しそうな項目を発見し、その中でも気になった「AWS escape room: Exam prep for Certified AI Practitioner」に参加しましたのでセッションの概要とその感想をシェアしたいと思います！

# セッション概要

3D 仮想脱出ゲームをプレイしながら、AWS 認定 AI プラクティショナーに必要な知識を学ぶことができます。脱出ゲームはステージが６個あり、問題を解きながら先に進みます。それをすべてクリアしたタイムで競うワークショップでした:sunglasses:

セッション ID: GHJ101
タイトル：AWS escape room: Exam prep for Certified AI Practitioner
所要時間：3h
レベル：100
セッション概要(抜粋)：
>Prepare for the AWS Certified AI Practitioner exam by playing a 3D virtual escape room game. Select an avatar, enter a narrative-driven world, and solve a series of interactive puzzles, exam-style questions, and hands-on labs to leave locked rooms. Compete against others to escape first! You must bring a laptop with a Chrome, Firefox, or Edge browser to participate. Headphones are recommended but optional.

私はAIFを取得していますが机上の勉強のみで実際にサービスを触っていなかったので、これをきっかけによりサービス理解を深めたいと思っていましたのでこのセッションに参加しました:fist:

# どんなゲームセッションだったのか

このゲームではアバターを選択し、試験形式の質問、実践ラボを解いて、鍵のかかった部屋から脱出します！・・とても楽しそうですよね:hugging:

わたしはこのアバターにしました！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3550351/a1b5d216-432e-3dc4-44d9-65614293d771.png)

いざ、キリンのCloudiaとともに出発です！:rocket:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3550351/50009831-0ea0-bf9c-42c9-88c68fe8e159.png)

様々な部屋がステージになっており楽しみながら取り組むことができましたがとにかく時間がないので実際の問題と実践ラボの問題は必死になりすぎてキャプチャが取れていないのです:sob:

唯一途中で面白い3Dとしてキャプチャしていたのが以下です。これはカフェテリアエリアがステージになっていた問題の背景キャプチャです:hamburger:このような３D映像とともに進んで行くので飽きることはなかったです笑

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3550351/5a1803d3-6331-ff5a-dc4c-f1c1c581e3bd.png)


 # 無事脱出できた？脱出ゲームの所感

結果は・・・ **脱出失敗**:scream::scream::scream::scream:
悔しすぎます、、もう一度トライしたいくらいです...

 浅はかだった参加前の私は、以下のように思っていました:innocent:

:woman_tone2:「レベルも100だからきっと脱出できる」
:woman_tone2:「所要時間3h?!長すぎる、きっと早く終えられるだろうな」

4問/6問中はクリアできましたが残り2つを完了しようと思うと、きっとクリアには1時間以上必要で今の私のレベルでは3hで到底終えられない量の問題数でした。

試験問題形式のクイズはサクサクとクリア出来ましたが実践ラボで躓く部分が多かった為クリアできなかったのではないかと思っています。

実践ラボでは実際に生成AIサービスを学びながら触ることができました。特に、BedrockのGuardrailやナレッジベースといった機能を触ることができたのは、良い経験でした。

机上の知識だけでなく、触ってみることでよりサービスに対する理解が深まることを肌で感じましたし、資格取得をきっかけにゲーミングセッションにチャレンジすることができた事は自己成長にも繋がりました。

会期中はセルフスペースラボでもサービスを体験できるのでそちらにも行ってみようと思います！

 # さいごに

ゲーミングセッションでは、Gameday等と同様に参加者同士で教え合うような場面もありますので交流の場としても最適だなと思いました！制限時間があるにも関わらず、優しく教えて頂いた席の近かった皆さんに感謝感激なセッションでした:relaxed:

 AIFについて興味がある方は以下の公式サイトからご確認ください！

https://aws.amazon.com/jp/certification/certified-ai-practitioner/
最初の壁で学んだこと～Schoo新卒プロダクトマネージャーのリアル～

　この記事は[Schoo Advent Calendar 2024](https://qiita.com/advent-calendar/2024/schoo)の11日目の記事になります。

　みなさんこんにちは！株式会社Schoo 新卒1年目の南上です！
　意気込んで入社し、気がつけば2025年も目前。自身の成長や誰かの役に立つといった「喜び・楽しみ」だけではなく「苦悩」する場面など多くの経験ができました。この記事では新卒のプロダクトマネージャーとしてこれまでぶち当たった壁とそこかから得た学びをお伝えしたいと思います！

:::note info
**Schooのプロダクトマネージャー**
「世の中から卒業をなくす」をMissionに、環境や場所にとらわれることなく、学びを通じてすべての人が未来を切り開くことができる社会を作ることを目指してプロダクト作りを日々行っている
:::

# 教育業界にインパクトを与えるサービスを提供したい！
　私は、高校受験に向けた学生指導を経験してきました。幅広い学力層、個性豊かな子どもたちがいる中で「現在の教育は本当に子どもたち一人一人に適した"学び"なのだろうか？」
一方的な指導や非効率で昔ながらの働き方をアップデートできていない環境にモヤモヤした気持ちを抱えるようになりました。

### 「世の中から卒業をなくす」
　このMissionを掲げるSchooを見つけたとき、モヤモヤしていたことを"私×Schoo"で解決できると思いました。人々に"学び続ける場"を提供することを通じ、大人も子どもも未来に向けてアップデートし続けることで"持続可能性のある学び場"を実現できるのではないかと考えるようになりました。
内定をいただき入社して数カ月経った今でも、その想いを持ち続けています。

# ぶち当たる壁を乗り越える日々
　入社後3週間の新卒研修の最終日の配属発表。プロダクト企画部門配属でプロダクトマネージャーになってほしいと言われました。当時プロダクトマネージャーという職種の理解がほとんどなかったので予想外の配属先でした。ただ、「世の中から卒業をなくす」というMission実現のためにプロダクトを通じて関われることに大きなワクワク感を抱き、新米プロダクトマネージャーとして業務をスタートさせました。
### "仕組み"を理解する
　配属されてから、日々のミーティングで一番感じたことは「全然分からない！」でした。もともと開発知識がほぼゼロの状態だったので、耳にする言葉は初対面のものばかりで全く頭に入らないこともありました。
　「全然分からない！」理由は"仕組み"を理解できていなかったからです。当時の私は、モグラたたきのように出てくる単語に対してすべて調べて知識を増やそうとしていました。単語を知って話を理解したつもりになっており、本質を見抜けていなかったのです。しかも時間もかかる。「まずは"仕組み"を理解しよう！」上司との1on1の中でアドバイスをいただきました。そのアドバイスによって、新しい話題が出たときには、その話題が挙がっている背景や関係するステークホルダーなど、まずは大枠を捉えようと先輩に質問していきました。これにより、「全然分からない！」という状況はほとんどなくなり、「大体は分かっているから、あとは細かい単語を調べよう！」という状態に持ち込むことができています。

### "なぜ"やるのか？
　7月、初めて企画する場面が訪れました。それは、WEB版とアプリ版で異なっている仕様を改修するというものでした。プロダクト理解の一環で、異なっている仕様を発見したため、私は「統一しましょう！」と解決策ばかり周囲の方に提案していました。しかし、その解決策で合意が得られるどころか、議論を進めることすら全然できておらず自分語りと少しの質問タイムで終わることが多かったのです。
　"なぜ"やるのか？ということが全く伝えられていなかったことが理由でした。WEB版とアプリ版での仕様差分によって「お客様が何に困っているのか？」「困っている原因は何なのか？」、自分の中で整理できておらず、それに対する共通の認識を持たないまま、解決策を提案していたのです。プロダクトマネージャーはエンジニアやデザイナーはもちろん、あらゆるステークホルダーと協働していく必要があります。協働のためには、単に「やる！」ということだけでなく"なぜ"やるのか？を伝えていくことが大事であると学びました。実践を重ねるごとに、周囲の方とのコミュニケーションがスムーズになり、対話しながら物事を前に進められるようになっていきました。

# まとめ
　新卒プロダクトマネージャーとしてぶち当たった壁とその乗り越え方についてお伝えしてきました。似たような環境で働く方、新卒育成に携わる方、プロダクトマネージャーに興味を持っている方に少しでも参考になっていればとても嬉しく思います！
　Schooは「世の中から卒業をなくす」をMissionに掲げています。その実現のためにも、まずは私自身が学び続けたいと思っています！その過程での学びは今後も発信してまいります。お付き合いいただきありがとうございました！


 ## 
 Schooでは一緒に働く仲間を募集しています！

https://corp.schoo.jp/careers/graduates

https://corp.schoo.jp/careers
AWSの300USDのクレジットもらえた ~先月請求には適用されないのね~



## AWSで300USDのクレジットが貰えるメールが来た

AWSアカウントを開設して数週間後、「お客様へのご案内です。今すぐ 300 USD の AWS クレジットを申請する」という件名のスパムメール！？が。
。。。調べると本物らしい。知らなかった。。。

メールが届く条件があるのかな？
11/7に9:45くらいにアカウント開設で、11/28 10:09に上記メール。三週間？
使用状況は下記な感じ
![chrome_CSzMwQfs0R.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3916302/6774ce1f-d185-5bac-0560-b6744cd97eec.png)
ほとんどちゃんと使ってなくて、Fargateで 2インスタンスをちょいちょい立ち上げる程度

## 申請してみた
主な申請内容は下記の通り。多分ほぼ真実。

- 構築内容について、詳しくお聞かせください:
ローコードプラットフォームをベースに稼働する業務アプリ開発
- プロジェクトの目的:
開発およびテスト
- 導入予定時期:
1～3 か月以内
- 想定予算:
月額 50 USD 未満
- 構築内容:
ビジネスアプリケーション – その他
 
- 会社情報: - 従業員数:
1～19 人

- 私は以下の目的でこのフォームへ登録しています。:
ビジネス目的

### 結果

12/4 0:32 AWSよりおめでとうございますメールが到着！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3916302/af043944-d07c-d6c4-7aa7-815d81133926.png)

11月分の請求が来てたのでそれに充てられるかなと期待してたけど、

https://repost.aws/ja/knowledge-center/aws-promotional-credit

>現在の請求サイクルが終了した後に、アカウントにコードを追加した。請求サイクルは毎月 1 日に開始します。プロモーションクレジットの開始日を確認してください。(暦月のクレジット開始日に使用量に対してクレジットが適用されます)。

これに該当するので来月から使用することになると理解。
実際のクレジット適用額は、`請求`→タブ：`削減額`で見られるとあり、11月の請求にはなにも表示されてなかったのでその通りだな、と。
Workato：WorkatoからSlackリストへ新規レコードを追加する

# はじめに

2024/6/6にSlackリストがリリースされ、Slack上でタスク管理等様々な情報の管理が行えるようになりました。

しかし、2024/12/4時点においてはSlackリストに対応するREST APIは存在せず、APIを利用して外部からSlackリストへレコードを追加する方法が存在しません。

# WebhookによるSlackリストへのレコード追加

Slackリストは前述の通りREST APIは存在しませんが、幸いなことにSlackワークフローのWebhookトリガーを介して、Slackリストへレコードを追加することが可能です。

今回は、SlackワークフローのWebhookトリガーを利用して、WorkatoからSlackリストへレコードを追加する方法について説明します。

# 手順
## Slackの設定

１．次のようなSlackワークフローを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/6dfffc0b-42a0-698d-580a-9787c3c59497.png)


２．「Webhookを使って開始する」を選択し、連携したい項目をデータ変数に定義します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/afa3692d-9c4d-8934-12c4-7cb1d55910fa.png)

３．「リストアイテムを追加する」を選択し、Webhookのデータ変数と値のマッピングを行います。

なお、日付など一部の項目はデータ変数の連携に対応していません。

# WebhookによるSlackリストへのレコード追加

Slackリストは前述の通りREST APIは存在しませんが、幸いなことにSlackワークフローのWebhookトリガーを介して、Slackリストへレコードを追加することが可能です。

今回は、SlackワークフローのWebhookトリガーを利用して、WorkatoからSlackリストへレコードを追加する方法について説明します。

# 手順
## Slackの設定

１．次のようなSlackワークフローを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/6dfffc0b-42a0-698d-580a-9787c3c59497.png)


２．「Webhookを使って開始する」を選択し、連携したい項目をデータ変数に定義します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/afa3692d-9c4d-8934-12c4-7cb1d55910fa.png)

３．「リストアイテムを追加する」を選択し、リストの選択、ならびにWebhookのデータ変数と値のマッピングを行います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/485c2fbf-aa79-1866-b3f7-a7310c342ca3.png)

なお、日付など一部の項目はデータ変数の連携に対応していません。（次のようなメッセージが表示され、連携可能な項目が無い旨表示されます）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/d3f1a704-29d2-8b3c-0583-08be571583ec.png)


４．「完了」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/fe2c3f15-3ced-cf61-ef48-be4a585c31f3.png)

５．必要な設定を行い、「公開する」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/5147787f-a303-a1c3-a4f3-e161035def84.png)

## Workatoの設定

１．次のようなレシピを作成します。

なお、Step1はSlackリストへレコード追加する際のトリガー（どのようなきっかけでSlackリストへレコードを追加するか）、Step2はSlackリストへ連携するアプリケーションを選択・設定してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/2fb17d12-03d2-79e7-ec20-8ce19237347b.png)

なお、今回はテスト用に次の値をSlackリストへ連携します。
（この値はStep2のVariables by Workatoで定義しています）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/ad19c8d6-aacf-fdd8-fd58-4487516b9d50.png)

２．HTTPコネクタに対して認証無しのコネクションを設定し、接続します。（以下の通り設定くだｓ）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/67acf907-d107-4c9f-ba8b-fc47660bce67.png)

３．Requestに対して、次のような設定を行います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/16e697df-2b2a-d145-5455-61abef863934.png)

- Method：POSTを選択
- Request URL：Slackワークフローから発行されたWebhook URLをセットする
- Request body：JSON形式のテキストをセットする、連携元アプリの戻り値のデータピルもここでセットする

４．レシピを保存して、開始します。

# 実行結果

このレシピを実行し、実行が成功すると、Workatoから連携された値がSlackリストの対応する項目へセットされます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/973b5dd1-345b-c4d3-28b6-13df5af2c32f.png)