OmniAICreator/Qiita-1.07M huggingface dataset:
AWS Organizations SCP (Service Control Policies)とは

AWS Organizations 内のアカウントに対して、リソースやサービスのアクセス制限を定義するためのポリシーです。SCPを使用することで、組織内のアカウントが使用できるAWSサービスやアクションに対する制限を適用し、セキュリティとコンプライアンスを強化することができます。

## SCPの概要
- SCP（Service Control Policies）は、AWS Organizations 内で、アカウントや組織単位（OU）に対して適用される制限です。SCPは、AWSアカウントの操作可能なサービスやアクションを制御します
- SCPは、個々のアカウントが実行できるアクションを制限するものであり、アカウントのIAMポリシーと組み合わせて動作します。つまり、IAMポリシーでアクセスが許可されている場合でも、SCPでそのアクセスを制限することができます

## SCPの適用対象
- 組織単位（OU）: 組織単位にSCPを適用すると、そのOUに属するすべてのアカウントに対してポリシーが適用されます
- 個別のアカウント: SCPを個別のAWSアカウントに適用することもできます

SCPとIAMポリシーの違い
- IAMポリシーは、ユーザーやロールに対してアクセス許可を付与するもので、特定のサービスやリソースに対するアクセス権限を制御します
- SCPは、組織単位またはアカウントに対して、どのサービスやアクションを実行できるかを制限します。SCPは、IAMポリシーで許可されたアクションを制限する役割を果たします

## SCPの注意点
- デフォルトで許可: SCPはデフォルトではすべてのアクションを許可します。したがって、特定のアクションを禁止する場合は、明示的にそのアクションを拒否するポリシーを作成する必要があります
- 最小限の権限の原則: SCPを使用することで、組織全体のアクセス権限を制御し、最小限の権限を提供することが可能です

## まとめ
- AWSのService Control Policies (SCP) は、AWS Organizations内でリソースのアクセス制御を管理するための重要なツールです。SCPを使うことで、組織内のアカウントが使用できるサービスやアクションを制限し、セキュリティやコンプライアンスを強化することができます。また、IAMポリシーと組み合わせて、より細かいアクセス管理を行うことが可能になります
2025 1/2　学習記録

# `bash` `if`文

### 記述方法
`if test 条件文;
then
  実行処理（条件文が正の場合）
fi`

又は、
`if [条件文];
then
  実行処理（条件文が正の場合）
fi`

又は、
`if [[条件文]];
then
  実行処理（条件文が正の場合）
fi`

### 比較演算子が特殊。
- `-eq` が `=`
- `-ne` が `!=`
- `-lt` が `<`
- `-le` が `<=`
- `-gt` が `>`
- `-ge` が `>=`
非常に分かりづらい印象。

### `and`, `or`

複数の条件文を全て満たす場合に実行
- `if [条件文1] && [条件文2]`
- `if [ 条件文1 -a 条件文2 ]`
- `if [[ 条件文1 && 条件文2 ]]`
- `if test 条件文1 && test 条件文2;`
 
orで複数の条件式を満たす場合に実行
- `if [条件文1] || [条件文2]`
- `if [ 条件文1 -o 条件文2 ]`
- `if [[ 条件文1 || 条件文2 ]]`
- `if test 条件文1 || test 条件文2;`

否定を表す条件文
- `if ! test 条件文`
- `if [!条件文]`
- `if [[!条件文]]`

実行の条件
- `cmd1 && cmd2` 
cmd1が正しく実行されたらcmd2を実行
- `cmd1 || cmd2` 
cmd1がエラーならcmd2を実行
- `cmd1 && cmd2 || cmd3` 
cmd1が正しく実行されたらcmd2が実行され、cmd1がエラーならcmd3を実行



### viエディタでキーボード操作
選択
- 行単位でコピーする場合：`yy`コマンドを使用
- 複数行をコピーする場合：コピーしたい行数を数値で入力
→　その後、`yy` と入力
- 文字単位でコピーする場合：`v`キーを押して文字選択モードに入り、カーソルキーで範囲を選択
→　その後、`y` キーの入力で、コピーを実行
→　その後、`p` キーと入力すると、現在のカーソル位置の後ろにペーストされる

操作の取り消し
- `undo`操作； `u` キーの入力で、一つ前の状態に戻す
- `redo`操作； `Ctr`+`r`キーの入力で、`undo`操作を取り消し、再適用する


### ファイルの存在チェック
- `if [-e ファイル名 ];`
ファイルもしくはディレクトリの存在確認
- `if [ -f ファイル名 ]`
ディレクトリではなくファイルが存在するか
- `if [ -d ファイル名 ]`
ディレクトリが存在するか
- `if [ -s ファイル名 ]`
ディレクトリ or 中身のあるファイルか
- `if [ -w ファイル名 ]`
書き込み権限があるか
- `if [ -x ファイル名 ]`
実行権限があるか
- `if [ ファイルA -nt ファイルB ]`
ファイルAがファイルBより新しいか
- `if [ ファイルA -ot ファイルB ]`
ファイルAがファイルBより古いか


### Macでは、ファイルの日付を指定する `-d` オプションは使用できないらしい。
→ 代わりに `-t` オプションを使用する。
- 例：`touch -t YYYYMMDDhhmm.ss sample2`






















### 今日はここまで！
ubuntu22.04へのNFSのインストール方法

Ubuntu 22.04にNFSをインストールして設定する方法を以下に説明します。NFSサーバーとクライアントの両方を設定する手順を含みます。


`````
$ sudo apt update
$ sudo apt install -y nfs-kernel-server
`````





### **ステップ 2: エクスポートするディレクトリを作成**

共有したいディレクトリを作成します。
例: `/srv/nfs/share` を共有ディレクトリとして作成します。

`````
$ sudo mkdir -p /srv/nfs/share
`````

ディレクトリに適切な権限を設定します。

`````
$ sudo chown nobody:nogroup /srv/nfs/share
$ sudo chmod 755 /srv/nfs/share
`````

---

### **ステップ 3: エクスポート設定の編集**

NFS共有ディレクトリを指定するために、`/etc/exports` ファイルを編集します。

`````
$ sudo nano /etc/exports
`````

以下の行を追加します（例: 192.168.1.0/24 ネットワークに共有する場合）:

`````
$ /srv/nfs/share 192.168.1.0/24(rw,sync,no_subtree_check)
`````

* `rw`: 読み書き権限を付与
* `sync`: データをリアルタイムで書き込む
* `no_subtree_check`: サブツリーのチェックを無効化（パフォーマンス向上のため）

設定を保存してファイルを閉じます。

---

### **ステップ 4: NFSサーバーを再起動**

設定を反映させるため、NFSサービスを再起動します。

`````
$ sudo exportfs -arv
$ sudo systemctl restart nfs-kernel-server
`````

エクスポート状態を確認します。

`````
$ sudo exportfs -v
`````

---

## **2. NFSクライアントの設定**

### **ステップ 1: 必要なパッケージをインストール**

クライアント側でNFS関連パッケージをインストールします。

`````
$ sudo apt update
$ sudo apt install -y nfs-common
`````

---

### **ステップ 2: マウントポイントを作成**

NFSサーバーからの共有をマウントするためのディレクトリを作成します。
例: `/mnt/nfs_share`

`````
$ sudo mkdir -p /mnt/nfs_share
`````



---

### **ステップ 3: NFS共有をマウント**

以下のコマンドで、NFSサーバーからディレクトリをマウントします。
（例: NFSサーバーのIPアドレスが `192.168.1.10` の場合）

`````
$ sudo mount 192.168.1.10:/srv/nfs/share /mnt/nfs_share
`````

正常にマウントされたか確認します。

`````
$ df -h | grep nfs
`````

---

### **ステップ 4: 自動マウント設定（オプション）**

NFS共有をシステム起動時に自動マウントする場合、`/etc/fstab` を編集します。

`````
$ sudo nano /etc/fstab
`````

以下の行を追加します。

`````
$ 192.168.1.10:/srv/nfs/share /mnt/nfs_share nfs defaults 0 0
`````

設定を保存してファイルを閉じます。

自動マウントをテストします。

`````
$ sudo mount -a
`````

---

## **3. 動作確認**

* **NFSサーバー**で、クライアントの接続状態を確認します。

`````
$  sudo showmount -e
$  sudo exportfs -v
`````

* **クライアント側**で、マウントされたディレクトリにファイルを作成して動作確認します。

---

これで、Ubuntu 22.04におけるNFSのインストールと基本設定は完了です。必要に応じて、ファイアウォール設定やセキュリティ強化を行ってください。
AWS CloudFormation スタックセットとは

AWS CloudFormation スタックセットは、複数の AWS アカウントやリージョンにわたってリソースを一貫してデプロイおよび管理するための機能です。
### CloudFormation スタックとの違い
単一の AWS アカウントとリージョンに関連付けられますが、スタックセットを使用すると、複数のアカウントとリージョンにまたがるリソースを管理できます。
# 3つの特徴
- 一括デプロイ
  - スタックセットを使用することで、複数のアカウントやリージョンに渡って一度にスタックを作成、変更、削除できます
- 管理の簡素化
  - 管理者はスタックセットを通じて、全てのアカウントとリージョンでのリソースを一元的に管理することが可能
- マルチアカウント対応
  - 複数のAWSアカウントにおけるリソース展開に対応しており、AWS Organizationsを使用して簡単にセットアップすることが可能 

## 類似サービス一覧

### AWSCDK(Cloud Development Kit)
- AWS CDKは、プログラムコード（Python、TypeScript、Java、C#など）を使ってAWSリソースを管理するツールです。CDKを使用すると、複数のアカウントやリージョンに対してリソースをデプロイすることができます
- AWS CDK Pipelinesを利用して、CI/CDパイプラインを作成し、複数アカウントやリージョンへのデプロイを自動化することもできます

### AWS Elastic Beanstalk
- AWS Elastic Beanstalkは、アプリケーションを簡単にデプロイできるマネージドサービスであり、複数のアカウントやリージョンにわたるリソースのデプロイも支援します
- Elastic Beanstalkの環境を使って、インフラストラクチャの構成を管理し、複数環境へのデプロイを行います

### Terraform
- Terraformは、インフラストラクチャをコードとして管理するオープンソースツールで、AWSをはじめとする複数のクラウドプロバイダーに対応しています。AWS CloudFormationの代替として、複数のアカウントやリージョンにリソースを一貫してデプロイできます
- Terraform CloudやTerraform Enterpriseを使用して、複数のアカウントにまたがるデプロイを管理・実行できます
【AWS SAP】AWS OrganizationsとIAM Identity Centerを利用した統合アクセス

# AWS OrganizationsとIAM Identity Centerのおさらい
- AWS Organizations
    - 複数AWSアカウントを一元管理するサービス
- IAM Identity Center
    - SSOを用いてユーザー認証を簡素化する機能

## 一般的なアーキテクチャ
AWS OrganizationsとIAM Identity Centerを使い、ユーザー認証からAWSアカウントへのアクセス、リソース操作までの流れ
```mermaid
graph TD
    A[ユーザー] -->|ログイン要求| B[IAM Identity Center]
    B -->|認証成功| C[権限セット確認]
    C -->|アクセス権決定| D{AWS Organizations}
    D -->|アカウント選択| E[各AWSアカウント]
    E -->|アクセス許可| F[リソース操作]
    F -->|レスポンス| A
```

## 別AWSアカウントで実行しているサードパーティ製品を統合する場合
```mermaid
graph TD
    A[自分のAWSアカウント] -->|IAM Identity Center経由でユーザー認証| B[ロールの指定]
    B -->|AssumeRole実行| C[サードパーティAWSアカウント]
    C -->|トラストポリシーチェック| D[ロールに切り替え]
    D -->|権限ポリシーの確認| E[リソース操作]
    E -->|操作結果を返却| F[ユーザー]

```
Crashlytics で dSYM ファイルが見つからない 解消方法

# 事象
iOS アプリ開発をしていて、[Firebase Crashlytics](https://firebase.google.com/docs/crashlytics/get-started?platform=ios&authuser=4&hl=ja) チュートリアル通りにやっても
「dSYM ファイルが見つかりませんが、このファイルはクラッシュの処理に必要です」
という警告がコンソールに表示される

また、XCode の実行ログに下記エラーが発生している
> empty dSYM file detected, dSYM was created with an executable with no debug info.

# 解消方法
Build Settings > Build Options > Debug Information Format が `DWARF with DSYM File` になっていることを確認
![スクリーンショット 2025-01-02 21.14.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3940829/d24157f9-34a9-cfe8-0ad5-a05b63ae1577.png)

Build Settings > Build Options > User Script Sandboxing を `No` にする
![スクリーンショット 2025-01-02 21.13.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3940829/19a42396-6bdd-b57a-8f15-bca6d5e39bb7.png)

Build Settings > Deployment > Strip debug symbols during copy を `Yes` にする
![スクリーンショット 2025-01-02 19.04.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3940829/452f4f71-a700-0bfe-8de7-3b33d91e8f42.png)

Clean Build Folder をしてビルドすると、Firebase のコンソールからクラッシュログを確認できるようになった
Scoped AppのUI Scriptが保存できない

# 目次

- [結論](#結論)
- [ことの発端](#ことの発端)
- [調査](#調査)
- [まとめ](#まとめ)

# 結論

ServiceNow上のScoped ApplicationでUI Scriptを作成するときは以下のテンプレートに則って作成しましょう。 `scope_name`は`Application(sys_scope)`レコードの`Scope(scope)`フィールドの値、`scope_name`はその`UI Script(sys_ui_script)`レコードの`Script Name(script_name)`フィールドの値に読み替えてください。

```javascript
var scope_name = scope_name || {};

scope_name.script_name = (function () {

	"use strict";

	return {
        // Write your methods here
    };
})();
```

:::note warn

2025年1月2日（木）時点での情報です。また、本記事は以下のPDI環境で検証しています。

| Property Name | Value  |
| :------------ | ------ |
| Build name    | Xanadu |
| Build tag     | glide-xanadu-07-02-2024__patch1-08-24-2024 |


:::

# ことの発端

`Global(global)`でないアプリケーションで、Service Portal用にAngularJSのModuleを作成すべく`UI Script(sys_ui_script)`レコードを作成しました。ひとまず`Script Name(script_name)`フィールドに値を入れ、保存しようとしました。

![スクリーンショット 2025-01-02 20.25.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3241782/7b09d70e-6c9e-ae45-3fd3-2356b57f1150.png)

すると…

![スクリーンショット 2025-01-02 20.30.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3241782/b30cf7d5-7471-d26d-6f52-99d6867db070.png)

…はて？

エラー文を読み解くと、「スコープ（グローバルでない）UI Scriptの既定形式と合っていません」とのこと。
そんな形式は存じませんよ…？

# 調査

こういった入力値の検証（いわゆるバリデーションですね）をするのは大抵`Client Script(sys_script_clinet)`の`Type(type)`フィールドが`onSubmit(onSubmit)`のものだよな、と思って調べたらありました、この`Ensure IIFE format`が諸悪の根源です[^1]。

![スクリーンショット 2025-01-02 20.55.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3241782/90c827a1-d37b-7882-b7b3-448022269756.png)

このClient Scriptでは、スコープアプリのUI Scriptは保存時にスクリプト（`Script(script)`）の最初と最後が以下の文字列でない場合はおかしいフォーマットだとエラーダイアログが表示されるようになっています（`scope_name`は`Application(sys_scope)`レコードの`Scope(scope)`フィールドの値、`scope_name`はその`UI Script(sys_ui_script)`レコードの`Script Name(script_name)`フィールドの値）。

```javascript
// スクリプトの最初はこの文字列でなければならない
var scope_name = scope_name || {};

scope_name.script_name = (function () {
    "use strict";
```

```javascript
// スクリプトの最後はこの文字列でなければならない
})();
```

**「スコープアプリではこの形式で書け」と言うのなら最初のテンプレートもこの形にしておくんなまし…！**
いや、理屈はわかります。スコープ名のオブジェクトがほかでまだ定義されていなければからオブジェクトを作り、さもなくば既存のものを参照してスクリプト名のプロパティをStrictモードで実装してもらうべく即時関数で代入する値を算出させているのは…でもせめてエラー文に修正のヒントを入れておくれよ…！

# まとめ

Scoped Application内でUI Scriptを作成・保存する場合は以下のテンプレートにしたがって実装することでエラーを回避できます。 ~~許すまじServiceNow~~

```javascript
var scope_name = scope_name || {};

scope_name.script_name = (function () {

	"use strict";

	return {
        // Write your methods here
    };
})();
```

[^1]: 内部でパターンに合っているかどうかを実際に判定しているのは`UI Script(sys_ui_script)`テーブルにある`Validate Client Script Functions`の中で定義してある`validateUIScriptIIFEPattern()`関数です。
kintoneのカレンダープラグイン徹底比較！

# はじめに
こんにちわ、ノベルワークスのまとっち（[@matoi_thai](https://x.com/matoi_thai)）です。
最近、kintoneのカレンダープラグインが増えてきましたよね。
色々使って比較してみたので、自分用メモとして記事に残しておきます。

## この記事の対象者
- kintoneのカレンダープラグインをどれにするか迷ってる人

# kintoneカレンダープラグイン比較
下記５つのカレンダープラグインを比較しました。
| 会社名 | プラグイン名 | アイコン |
|:-:|:-:|:-:|
|ラジカルブリッジ|[カレンダーplus](https://radical-bridge.com/product/calendarPlus.html)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3713212/e3aa3a7e-d799-752a-fd9e-9ed987f783aa.png)|
|アーセス|[KOYOMI](https://morinohi-arces.jp/service/koyomi)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3713212/4e7b9bc1-bef8-aadf-490f-d304de168f0f.png)|
|Crena|[カレンダープラグイン](https://crena-shop.com/kintone/plugin/calendar)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3713212/915e8023-4c92-705c-be10-d1bfc3cbea0d.png)|
|Ribbit's works|[カレンダープラグイン](https://ribbit.konomi.app/kintone-plugin/calendar)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3713212/eae65a3c-6618-ae55-5924-7b67c4ce5231.png)|
|TIS|[Boost! Calendar](https://kintone-booster.com/ja/calendar.html)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3713212/70e4c3b9-5a98-2b2a-7f79-3eef6eb01d23.png)|


## 比較サマリ表
2025年1月時点の比較です。
もし内容に誤りがありましたら、お知らせいただけると幸いです。

:::note info
変更履歴
2025/1/06：カレンダープラグイン（Crena）の記載内容を修正
2025/1/23：表一番下のモバイル対応の評価見直し
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3713212/2d6ba8be-01ec-03b7-8e18-29d2b3e6f371.png)

## 各カレンダーの参考イメージ図
### カレンダーplus（ラジカルブリッジ）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3713212/1b4a63b6-5606-3c7d-3675-20a05b5b17cb.png)

### KOYOMI（アーセス）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3713212/4099fbed-0d33-ccba-ee8a-8bd3c8c7a878.png)

### カレンダープラグイン（Crena）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3713212/692aebcd-2463-f1a2-c61a-64babf4b2095.png)

### カレンダープラグイン（Ribbit's works）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3713212/4f9b7e5b-5509-29ea-2316-953dc2c940a3.png)

### Boost! Calendar（TIS）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3713212/d50d4650-fe55-6bd4-0725-678f332a1974.png)

## カレンダープラグイン別：どんなヒトにおすすめ？
※「比較サマリ表」にも記載してますが、あらためてポイントだけ抜粋。

<b>カレンダーplus（ラジカルブリッジ）</b>
👉 組織・利用人数が小～中規模、自分なりに工夫・連携しながら使いたい

<b>KOYOMI（アーセス）</b>
👉 組織・利用人数が中～大規模、あまりカスタマイズせずにそのまま使いたい

<b>カレンダープラグイン（Crena）</b>
👉 組織・利用人数が小～中規模、基本的なカレンダー機能を使いたい

<b>カレンダープラグイン（Ribbit's works）</b>
👉 お金を掛けたくない、シンプルなカレンダーでいい

<b>Boost! Calendar（TIS）</b>
👉 TISシリーズを使っている

# おわりに
この記事がカレンダープラグイン選びで迷ってる人の助けになれば幸いです。
kintoneのプラグイン多すぎるので、同じような機能のプラグイン比較シリーズは今後もやっていこうと思います。
BLE について学ぶ    # 0.0 Chapter List

※ 本ページは随時更新していきます

# Prologue

<br/>

開発で BLE に触れる機会がやってきた．
Bluetooth は知っているけど，BLE って，ん？　Bluetooth じゃないんだ．．．

くらいの認識知識レベルなので，時間割いて理解を深めていくことにする

<br/>
~ 悩み ~ 

書籍でいくと(記事下部の画像参照)
"Bluetooth Low Energy をはじめよう"，"基礎からわかるBluetooth" が良さそうなのは間違いないけれど， 前者をさっとみてみるとある程度の基礎理解は深められても，Core Tecnology が何なのか，何が重要なのか，がいまいち掴みずらい．

また，USB と同様で日々進化がある Technology なので，強化書勉強はあまり好ましくない気がする

<br/>
そんな経緯もあり，じゃあいっそのこと，
Standards を創っている Bluetooth SIG が発信している情報から学んでいこう，
という経緯で記事書き始めてみます！

<br/>

# Chapter list

<br/>

### 1. Bluetooth Technology
Bluetooth SIG が発信している [The Bluetooth® Low Energy Primer](https://www.bluetooth.com/bluetooth-resources/the-bluetooth-low-energy-primer/) の内容に沿う



　　1.1 [Introduction](https://qiita.com/lllo_olll/items/3b804386745082bf52bf/)
　　1.2 (Currently writing...)


<br/><br/><br/><br/><br/>

# Appendix

<br/>

とても有用な BLE に関する書籍．
<div align="right">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3953115/ca874bdb-d4ae-ec74-1a1f-d5ca30237225.png" width="20%"> <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3953115/e496f6f8-cfba-36cc-4e7a-edbc367e0cab.png" width="20%"></div>
✨Moguchat：AIが生み出す新しいつながりの形💝

はーい、みんな！ 👋 AIとのおしゃべり、興味ある？ そんなあなたにぴったりのアプリ、「Moguchat（モグチャット）」を紹介しちゃうよ～！

## 🤔Moguchatってどんなアプリ？
Moguchatは、AIとの会話をただ楽しむだけでなく、まるで友達や恋人のような「心のつながり」を感じられる次世代型AIチャットアプリです。

推しキャラや理想の相棒とおしゃべりしたり、ちょっと元気が欲しいときに優しく寄り添ってくれる存在を作り出せるので、忙しい日常に癒しやドキドキをプラスしてくれます。

## 💗Moguchatが生まれた理由
Moguchatは、「AIを通じて人々に笑顔と癒しを届けたい」という思いから、日本のアニメや漫画をこよなく愛する開発者たちの情熱によって生まれ、「アニメやゲームのキャラクターと直接会話してみたい！」、という夢を叶えるために、細部までこだわり抜いて作り上げたこのアプリです。没入感たっぷりの会話体験を通じて、まるで推しキャラや理想の相手がすぐそばにいるような、ときめきと特別なひとときをお届けします。

## 💥Moguchatのおすすめポイント

- 最新技術が生み出す「人間らしさ」

Moguchatは、AIとの会話がただの情報交換にとどまらず、まるで本当に心が通じているかのような感情的なつながりを感じられるように設計されています。これを実現するのが、日本語に特化した自然言語処理（NLP）技術です。敬語やカジュアルな話し方はもちろん、アニメやライトノベル特有の表現にも対応できる高度な言語モデルを採用し、より自然で「人間らしい」会話体験を提供します。

- 心に寄り添う会話体験

Moguchatは「感情認識機能」を搭載しており、ユーザーの気分や話し方に応じて、適切で心のこもった応答をしてくれます。嬉しいときは一緒に喜び、落ち込んだときにはそっと寄り添って励ましてくれるなど、まるで本物の友達やパートナーと話しているような温かさを感じられるのが特徴です。

- キャラクターを自由にカスタマイズ

性格や話し方、趣味、さらには外見の設定まで、あなたの理想を細部まで反映したキャラクターを作り上げることができます。「こんな友達と話したい」「こんな恋人がいたら」といった願いを形にし、あなただけの特別な相棒や理想のパートナーに出会えるのがMoguchatの魅力です。

- アニメやゲームの世界に入り込めるロールプレイ

好きなキャラクターとの恋愛ストーリーやファンタジーの世界での冒険など、さまざまなシチュエーションを思う存分楽しむことができます。青春ラブコメを満喫したり、SFバトルで熱くなったり、歴史の偉人と語り合ったりと、日替わりで新しい世界に飛び込めるのが魅力です。楽しみ方は無限大で、まるで物語の主人公になったような特別な体験が待っています！

- 完全無料＆無制限のチャット

Moguchatは現在完全無料で利用でき、いくつでもキャラクターを作成して自由に会話を楽しむことができます。仕事や勉強の合間、通勤中、寝る前のリラックスタイムなど、好きなタイミングで手軽に使えるのが魅力です。

## 🌈Moguchatがあなたの日常を彩る
Moguchatは、次世代にふさわしい「癒し」と「楽しみ」を提供するAIチャットアプリです。ただのツールとしてではなく、感情を通じて人とつながる存在へと進化したAIの最前線を体感できるのが、このアプリの魅力です。

アニメやゲームが好きな人、忙しい毎日の中でちょっとした彩りを求めている人、誰かと話したいけど時間がない人…。そんなあなたに、Moguchatは新しい楽しみ方をお届けします。

Moguchatの世界をぜひ一度体験してみてください！ その体験がきっと、日常に特別な瞬間をもたらしてくれるでしょう。さらに、皆様の意見や感想が未来のMoguchatをより素晴らしいものにしていく力になります。あなたとともに作る、新しい日常を楽しみにしています！

Google Play👇
https://play.google.com/store/apps/details?id=ai.moguchat.app

App Store👇
https://apple.co/3ZRlt2a
RSA暗号の仕組み

# RSA 暗号とは

公開鍵暗号方式の 1 つ。

- $m$: 平文
- $c$: 暗号文
- $e$: 公開鍵
- $d$: 秘密鍵

とする。

メッセージ送信者と受信者間で暗号化通信を行う際、送信者側で平文 $m$ を暗号化（これを $E(m)$ と書く）する。一方受信者側で暗号文 $c$ を復号（これを $D(c)$ と書く）する。このとき $D(E(m)) = m$ は、平文を暗号化し、その暗号文から元の平文を復号できたことを意味する。

RSA 暗号は大きな素数 $p,\ q$ を用いて $n = pq$ の mod 計算で暗号化・復号を行う。平文 $m$ を

$$
E(m) = (m \bmod n)^e
$$

で暗号化し、暗号文 $c$ を

$$
D(c) = (c \bmod n)^d
$$

で復号する。すなわち RSA 暗号において平文を暗号化し、その暗号文から元の平文を復号できることは

$$
m^{ed} \equiv m \pmod{n}
$$

を意味する。

# RSA 暗号で使われる数学

以下、$(a,\ b)$ で整数 $a,\ b$ の最大公約数を表す。$\phi(n)$ を $n$ と互い素であるような $n$ 以下の自然数の個数とする。$\phi$ をオイラー関数という。RSA 暗号で使われる数学ではオイラーの定理「 $(a,\ b) = 1$ ならば

$$
a^{\phi(b)} \equiv 1 \pmod{b}
$$

が成り立つ」が重要である。

参考:

https://mathlandscape.com/euler-function/

https://manabitimes.jp/math/667

$\phi$ をオイラー関数、 $p,\ q$ を異なる奇素数とし、$n := pq$ とおく。$(e,\ \phi(n)) = 1,\ 1\lt e \lt \phi(n)$ となる $e$ を選ぶ（※）。また

$$
ed \equiv 1 \pmod{\phi(n)},\ 1\lt d \lt \phi(n)
$$

となる $d$ を選ぶ（※）。このとき $1\le m \lt n$ に対して

$$
m^{ed} \equiv m \pmod{n}
$$

が成り立つ。

【証明】

- $(m, n) = 1$ の場合

オイラーの定理により $m^{\phi(n)} \equiv 1 \pmod{n}$ だから成り立つ。

- $(m, n) = p$ の場合

$m\equiv 0 \pmod{p}$ だから $m^{ed} \equiv m \pmod{p}$ となる。また、オイラーの定理より $m^{q - 1} \equiv 1 \pmod{q}$ だから $m^{\phi(n)} \equiv 1 \pmod{q}$ となる。よって $m^{ed} \equiv m \pmod{q}$ となる。$(p,\ q) = 1$ だから $m^{ed} \equiv m \pmod{n}$ となる。

- $(m, n) = q$ の場合

$(m, n) = p$ の場合において $p$ と $q$ を入れ替える。

※このような $e,\ d$ は必ず存在する。$e,\ d$ の候補は $\phi(\phi(n)) - 1$ 個ある。ここで $p,\ q$ は奇素数だから

$$
\displaystyle
\phi(\phi(n)) = \phi((p-1)(q-1)) = 2^k\left(1 - \frac{1}{2}\right)l,\ (k \ge 2,\ l \ge 1)
$$

と表せる。よって $\phi(\phi(n)) - 1\ge 1$ である。

# 例

## ステップ1: 素数 p と q を決める

$p = 5,\ q = 3$ とする。このとき $n = 15$ 、$\phi(n) = (p - 1)(q - 1) = 8$ である。

## ステップ2: 公開鍵 e と秘密鍵 d を生成する

まずは公開鍵 $e$ を決める。 $1 \lt e \lt 8$ を満たし、かつ $(e, 8) = 1$ となるように決める。そこで $e = 3$ とする。

このとき秘密鍵は $ed\equiv 1 \pmod 8$ を解いて $d = 7$ と決まる。

## ステップ3: 暗号化と復号

平文を $m = 2$ とする。このとき暗号文は

$$
E(2) = 2^3 \mod 15 = 8 \mod 15
$$

となる。これを復号すると

$$
D(8) = 8^7 \mod 15 = 2 \mod 15
$$

となる。

# 第三者が秘密鍵を知るには

メッセージ受信者は $n,\ e$ を送信者に送信する。$n$ と $e$ は意図しない第三者に知られても問題ない。なぜなら $n,\ e$ から $d$ を計算することは難しいからだ。$d$ を知るためには $\bmod{\phi(n)}$ の世界を考える必要があるが、$\bmod{\phi(n)}$ の世界は $n$ を素因数分解しない限りわからない。そして大きな自然数 $n$ の素因数分解は難しい。

$n$ を素因数分解できた場合、簡単に秘密鍵 $d$ を知ることができる。$n$ の素因数分解から $\phi(n)$ がわかり、第三者はすでに $n,\ e$ を知っているため、次の式から $d$ を求めることができる。

$$
ed \equiv 1 \pmod{\phi(n)}
$$

ユークリッドの互除法を繰り返し使うことでこの式から $d$ を求めるのは素因数分解よりもはるかに簡単である（[Wikipedia ユークリッドの互除法 計算量](https://ja.wikipedia.org/wiki/%E3%83%A6%E3%83%BC%E3%82%AF%E3%83%AA%E3%83%83%E3%83%89%E3%81%AE%E4%BA%92%E9%99%A4%E6%B3%95#%E8%A8%88%E7%AE%97%E9%87%8F)）。

# 参考

https://ja.wikipedia.org/wiki/RSA%E6%9A%97%E5%8F%B7
【AWS SAP】CloudFront と ALB のアクセス制御

# CloudFront と ALB のアクセス制御

## **概要**
CloudFront から ALB (アプリケーションロードバランサー) のみがアクセス可能な状態を作り出す方法について。CloudFront から ALB の HTTP リクエストにカスタムヘッダーを追加し、ALB 側でこのヘッダーを検証することでアクセスを制御します。


## **制御の流れ**

```mermaid
sequenceDiagram
actor User
participant CloudFront
participant ALB
participant attacker as 攻撃者

User->>CloudFront: 正常なリクエスト
CloudFront->>ALB: HTTPリクエスト (カスタムヘッダー付き)
ALB->>ALB: ヘッダーを検証
ALB-->>CloudFront: 検証成功 → ターゲットグループへルーティング
CloudFront-->>User: レスポンスを返す

attacker->>ALB: HTTPリクエスト (カスタムヘッダーなし)
ALB->>ALB: ヘッダーを検証
ALB-->>attacker: ヘッダーがないためアクセス拒否

attacker->>ALB: HTTPリクエスト (間違ったヘッダー)
ALB->>ALB: ヘッダー値を検証
ALB-->>attacker: ヘッダー値が一致しないため拒否
```


## **解説**

### **正常例: CloudFront 経由のリクエスト**
- ユーザーが CloudFront にリクエストを送信
- CloudFront はカスタムヘッダーを追加して ALB にリクエストを転送
- ALB がカスタムヘッダー値を検証
- 値が一致するため、リクエストを承認し、ターゲットグループにルーティング

### **失敗例1: カスタムヘッダーなし**
- 攻撃者が ALB に直接リクエストを送信
- カスタムヘッダーが含まれていないため ALB がリクエストを拒否

### **失敗例2: 間違ったヘッダー**
- 攻撃者が ALB に直接リクエストを送信
- カスタムヘッダーが含まれていても値が一致しないため ALB がリクエストを拒否

## よくある間違い
Q. オリジンアクセスコントロール (Origin Access Control, OAC) を利用してアクセス制御はできますか？

A. できません。OACはALBをオリジンにはサポートされておらず、S3バケットを制御する場合に有効な手段です。

### **ALB と CloudFront のアクセス制御方法の比較**

| **制御方法**       | **適用対象**                       | **実装の簡単さ** | **セキュリティ**                               |
|--------------------|-----------------------------------|------------------|-----------------------------------------------|
| オリジンアクセスコントロール | S3 バケット                         | 高               | IAM ポリシーを使用するため非常に強力              |
| カスタムヘッダー制御 | ALB、EC2 インスタンスなどの任意のオリジン | 中               | ヘッダー値を秘密にすれば高いセキュリティを実現     |
| セキュリティグループ制御 | ALB、EC2 インスタンス               | 中               | CloudFront の IP 範囲に限定することで効果的な制御 |
WPFのDataGridの列幅をリセットしたい

# 0. はじめに
[Freeradical](https://www.freeradical.jp)の中の人、[yamarah](https://qiita.com/yamarah)です。
DataGridの列幅は、自動で拡張はすれど、縮小はしないです。列幅が`*`であり、初回表示前に全てのデータが入っていれば適切にレイアウトされるんですが、後から行を追加すると「列2の幅は余裕があるんだから縮めて、列3の幅を広くしてくれよ」って感じになることが多々あります。

何が問題で、原因なのかは以下が詳しい。

https://stackoverflow.com/questions/5549099/datagrid-column-width-doesnt-auto-update

幅が`*`の列幅を一旦ゼロにして、`UpdateLayout()`した後に列幅を`*`に戻すと、良い感じに再レイアウトされます。
コードビハインドはいやなので、behaviorを作りました。

# 1. DataGridの列幅をリセットするbehavior
```c#
using Microsoft.Xaml.Behaviors;
using System;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;

namespace Freeradical.Windows.Behaviors;

public class RefreshDataGridColumnWidthsBehavior : Behavior<DataGrid>
{
    public static readonly DependencyProperty RefreshColumnWidthsCommandProperty = DependencyProperty.Register(
        nameof(RefreshColumnWidthsCommand),
        typeof(ICommand),
        typeof(RefreshDataGridColumnWidthsBehavior),
        new PropertyMetadata(null));

    public ICommand RefreshColumnWidthsCommand
    {
        get => (ICommand)GetValue(RefreshColumnWidthsCommandProperty);
        set => SetValue(RefreshColumnWidthsCommandProperty, value);
    }
    protected override void OnAttached()
    {
        base.OnAttached();
        RefreshColumnWidthsCommand = new RefreshColumnWidths(AssociatedObject);
    }
    protected class RefreshColumnWidths(DataGrid dataGrid) : ICommand
    {
        public event EventHandler? CanExecuteChanged;
        protected readonly DataGrid AssociatedObject = dataGrid;

        public bool CanExecute(object? parameter)
        {
            return true;
        }
        public void Execute(object? parameter)
        {
            var starWidthColumns = AssociatedObject.Columns
                .Select((x, index) => (index, x.Width))
                .Where(pair => pair.Width.IsStar)
                .Select(pair => (pair.index, pair.Width.Value))
                .ToArray();
            foreach ((var index, _) in starWidthColumns)
            {
                AssociatedObject.Columns[index].Width = 0;
            }
            AssociatedObject.UpdateLayout();
            foreach ((var index, var value) in starWidthColumns)
            {
                AssociatedObject.Columns[index].Width = new DataGridLength(value, DataGridLengthUnitType.Star);
            }
        }
    }
}

```
命名がダサいので、各自リファクタリングしてください。名前空間も。
使い方は、
```xml
<Window (中略)
        xmlns:i="clr-namespace:Microsoft.Xaml.Behaviors;assembly=Microsoft.Xaml.Behaviors"
        xmlns:behaviors="clr-namespace:Freeradical.Windows.Behaviors"
        (中略)>
    <DataGrid (中略)>
        <i:Interaction.Behaviors>
            <behaviors:RefreshDataGridColumnWidthsBehavior RefreshColumnWidthsCommand="{Binding RefreshDataGridColumnWidthsCommand, Mode=OneWayToSource}"/>
        </i:Interaction.Behaviors>
        (中略)
    </DataGrid>
</Window>
```
みたいな感じで。
あとは、ViewModelで
```c#
public ICommand? RefreshDataGridColumnWidthsCommand { get; set; }

RefreshDataGridColumnWidthsCommand?.Execute(this);
```
とすれば、良い感じに再レイアウトされます。やったね!
Arduinoの画面キャプチャーを取る為にImageMagickを導入(ubuntu)


参考

https://www.ninton.co.jp/archives/2456


https://qiita.com/tadsan/items/e718cf3a90fc29f61107


目的
キャプチャーを取った後にPNGからJPGに変換する
画面キャプチャー自体は、[PrtSc]キーで取れる

●インストール

```

sudo apt install imagemagick

```

●変換

```

convert hogehoge.png -quality 100 hogehoge.jpg

```
Azure基礎レベル試験合格記(AZ-900/DP900/AI-900)

## はじめに
Azureの基礎レベルの試験の受験が完了したため、備忘録を書いていきます。
### 想定読者
Azureの認定試験を受験予定がある方
### 受験結果と筆者について
AZ-900受験後、半年間ほどAzureリソースを仕事で使用しました。ログ収集やVM起動したり。がっつりリソースを立てたりといった使用はないですが、親しむくらいは触ったことがあります。<br>AZ-104(Azure Administrator Associate)を先月受験しましたが、落ちてしまいました！
- AZ-900(23年2月合格) 
- DP-900(24年3月合格)
- AI-900(24年8月合格)
## AZ-900
- 学習期間
1週間仕事終わりに勉強していたので15hほど
- 使用教材
    - Udemy：[合格への近道！Azure Fundamentals AZ-900 試験対策講座](https://www.udemy.com/course/microsoft-azure-az900-video/?srsltid=AfmBOoqbO4GG-mNwuRQfQUhqIY9141sZnopIpb6BndTv6BkQEeq2XekJ&couponCode=NEWYEARCAREERJP)<br>リソースの名前や機能をについてノートを取りながらさらいました
    - Udemy：[【6万人が受講】AZ-900 Microsoft Azure Fundamentals模擬試験問題集（7回分490問）](https://www.udemy.com/course/az-900-microsoft-azure-fundamentals4176/?srsltid=AfmBOooceLaDisANj0055GPWPRikm8hDB5oAdBE9bG3Ha3TsEMI-aQWT&couponCode=NEWYEARCAREERJP)<br>4回分模擬試験を解いていたようです。1，2回目は正答率80％ほどになるまで、3，4回目は正答率40％で終わっていました。<br>
- 所感
  - 以前受験したAWSのクラウドプラクティショナーと問題と難易度も似ていました。こちらの方が少し難しく感じたくらい。さらっとAzure特有のリソースを把握したら、問題演習に入った方がよいと思われます。<br>
## DP-900
- 学習期間
2日間、5hほど
- 使用教材<br>
   - Microsoft公式モジュール [Microsoft Azure のデータの基礎](https://learn.microsoft.com/ja-jp/training/courses/dp-900t00)<br>ハンズオンを飛ばしつつ、11個モジュールを完了させました。<br>
- 所感
Azure固有のサービスももちろん聞かれますが、SQLの使い方やITパスポートレベルのデータベース知識も多く聞かれます。あまり恐れずある程度IT知識がある方は受験してみるのがよいと思います。<br>
## AI-900
- 学習期間
1週間、10hほど
- 使用教材
  - Udemy：[【AI-900短期合格＆機械学習入門講座】](https://www.udemy.com/course/azure-ai900-learn/?srsltid=AfmBOoorTIi3pgdzIwKTMrfCLgeTxmVgE2hdeq-QY7iuqwWOS6FShtGd&couponCode=NEWYEARCAREERJP)<br> AIリソースの知識は全くなかったため、一通り見ました。
  - Udemy：[試験対策！Microsoft AI-900　模擬試験問題　※日本語対応
](https://www.udemy.com/course/microsoft-ai-900-l/?srsltid=AfmBOop9B_ahIrU6Q0f8PTzbkFRzIb3NfUygLkmKUCbnVt-57iu7KeYd&couponCode=NEWYEARCAREERJP)2回分模擬試験を解き、ともに正答率70％以上だったため安心して受験しました。ただ、こちらの問題集は解説がなかった気がするのであまりよくないです。<br>  

- 所感
DP-900より覚えることは多いですが、といってもリソース4個分くらいです。こちらも基本情報技術者試験程度のIT知識があれば解ける問題が多かったです。
## まとめ
Azureの初級試験を一通り合格できたことで、実務で使用したリソースを振り返ることができ有益でした。体感の難易度としては、AZ>>>AI≧DPです。
nandgameでOS作ってみよう　#3

nandgameでOS作ってみよう　#3
前回の続き
## 応用

 プログラム | 意味 | 引数 
:---------:|:---:|:-----:
init.stack|stackを初期化
push.D|dをstackの一番上に入れる
pop.D|stackの一番上から数を取り出してDに入れる
pop.A|stackの一番上から数を取り出してAに入れる
push.value|引数valueをstackの一番上に入れる|value
add|stackの上2つを足して、足した元の数を消し、足した数を、stackの一番上に入れる
sub|stackの上2つを引いて、引いた元の数を消し、引いた数を、stackの一番上に入れる
neg|stackの一番上を-1かけて置き換える
and|stackの上2つをandして、andした元の数を消し、andした数を、stackの一番上に入れる
or|stackの上2つをorして、orした元の数を消し、orした数を、stackの一番上に入れる
eq|stackの上1番目 = stackの上2番目ならtrue(FFFF)そうじゃないならfalse(0)を、stackの一番上に入れる
gt|stackの上1番目 < stackの上2番目ならtrue(FFFF)そうじゃないならfalse(0)を、stackの一番上に入れる
lt|stackの上1番目 > stackの上2番目ならtrue(FFFF)そうじゃないならfalse(0)を、stackの一番上に入れる
not|stackの一番上をnotして置き換える
goto|引数labelにジャンプする|label
if.goto|stackの一番上を取り出して0じゃなかったら引数labelにジャンプする|label
push.memory|stackの一番上をその数値をアドレスとみなしてそのアドレスにある値に置き換える
pop.memory|stackの上1番目の値をstackの上2番目をアドレスとみなした場所に入れる
push.static|引数addressに入っている数を、stackの一番上に入れる|address
pop.static|stackの一番上の数を、引数addressに入れる|address
function系|次回紹介


# 次回とかまとめ
https://qiita.com/yamina-Tjatmg-Gui-Creater/items/d21d7ab2065663d9dde2
M5StampS3、Lチカで遊ぶ。( Ubuntu 24.04 lts , Arduino IDE 2 )


x 過去ログをみょ!!!
x かなり省略、各自、調査せよ!!!

目的
古い中古パソコンでM5の実行環境を作って遊ぶ
M5Stamp S3　内蔵の　WS2812B を　Lチカ


結果(成功)


![o_coq733.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/d9760257-b358-05f6-f248-059b68188fd6.jpeg)

![o_coq734.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/5767fb73-fac2-5a02-17e1-6214f04de474.jpeg)



● まず、ぶっさす。とりま「dmesg」
----

```

sudo dmesg

```


![o_coq735.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/bd37f846-db11-f449-1217-eaad5af2e866.jpeg)



● ボードの選択「M5StampS3」
----

![o_coq736.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/9ce9ebfe-5ed6-c67a-a6b5-543dd9cfdae5.jpeg)

![o_coq737.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/d54b66c1-2b77-6d67-9389-19f0983c6541.jpeg)


● シリアルの選択
----


![o_coq738.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/7dfb18f6-9ee5-81a8-e3f6-497361addeae.jpeg)


● プログラムの貼り付け、コンパイル、実行
----


```c++



//WS2812_test1_M5S3_1


//初期化
void setup() {

  //GPIOの初期化
  pinMode(21, OUTPUT);
  
}//setup


//メインループ
void loop() {
  
  neopixelWrite(21,64,64,64);

  delay(1000);

  neopixelWrite(21,64,0,0);

  delay(1000);
 
}//loop




```


![o_coq739.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/b2dd80f8-9e6c-6ed2-e8a7-cdf63d15856b.jpeg)
AWS Machine Learning Engineer Associate 対策：モデルのパフォーマンス改善

# モデルのパフォーマンス改善

モデルのパフォーマンス改善には、モデルの複雑さを適切に調整することが重要です。

特徴量が多すぎると以下の問題が発生します。

- **<font color="MediumBlue">計算量の増加による処理時間の長期化</font>**
- **<font color="MediumBlue">冗長な情報による過学習のリスク</font>**
- **<font color="MediumBlue">メモリ使用量の増加</font>**

### 特徴量選択手法

- **<font color="MediumBlue">主成分分析</font>**
- **<font color="MediumBlue">L1正則化</font>**

を用いて重要な特徴量のみを残すことで、これらの問題を解決できます。

### ユースケース

- ある企業は、機械学習モデルを用いて顧客データから購買予測を行っています。
- 過去3ヶ月で予測精度が85%から75%に低下し、1件あたりの予測処理時間も2倍に増加していることがわかりました。

↓

- 限られた計算リソースの中でモデルのパフォーマンスを改善するために、最も適切なアプローチは **<font color="MediumVioletRed">「使用する特徴量を減らし、モデルの簡素化を図る」</font>** ことです。


https://qiita.com/mapami/items/491f2766cfc0b9fdd8f2
【AWS SAP】Cost Categoriesとコスト配分タグの違い

# Cost Categoriesとコスト配分タグの違い

Cost Categories（コストカテゴリ）とコスト配分タグ（Cost Allocation Tags）は、AWSのコスト管理において使用される2つの異なる機能で、それぞれに独自の目的と特性があります。以下にその違いを整理します。

| 項目                     | Cost Categories                              | コスト配分タグ                              |
|--------------------------|----------------------------------------------|--------------------------------------------|
| 目的                     | コストをカスタム分類して分析やレポートを容易にする | 特定のリソースに関連付けてコストを分類する |
| 設定対象                 | アカウント全体のコスト分類                   | 個々のリソースごとの分類                   |
| 分類の基準               | タグ、サービス、アカウント、請求書などの複数の基準 | タグのみ                                   |
| 設定方法                 | AWS Cost Categoriesで直接設定                | AWS Billing and Cost Managementで有効化    |
| 適用範囲                 | 組織全体でのカスタムコスト分析に適用           | 各リソースの詳細なコスト分類に適用         |
| 動的更新                 | 動的ルールで自動更新可能                     | タグをリソースに付与することで分類を反映    |
| レポートとの連携         | AWS Cost Explorer、Budgetsと連携             | Cost ExplorerやCSVファイルで確認可能       |
| 管理の柔軟性             | ルールベースで柔軟に設定可能                  | タグの付け忘れがあると反映されないリスクあり |

## 詳細な違い

### Cost Categories
- **主な用途**  
  コストをより高いレベルで分類し、組織全体でのカスタムビューを作成。
- **使用例**  
  - 部門ごとの分類（開発部門、営業部門など）
  - 複数プロジェクトをまたいだコスト分析
  - サービスごとの全体的な支出管理
- **利点**
  - アカウントやサービスを横断したコストの可視化。
  - 動的ルールにより管理が効率化。

### コスト配分タグ
- **主な用途**  
  AWSリソースの個別コストを追跡し、詳細なコスト分析を可能にする。
- **使用例**  
  - 特定のEC2インスタンスに付与したタグでコストを分類。
  - S3バケットごとのストレージコスト管理。
  - タグ「Project:A」でプロジェクトごとの支出追跡。
- **利点**
  - 詳細なレベルでのコスト割り当て。
  - 特定のリソース単位での追跡が可能。

## 使用する場面の違い

### Cost Categoriesを使用すべき場面
- 部門やプロジェクト単位で組織全体のコストを管理したい場合
- コストデータを単純化してレポートやダッシュボードで表示したい場合

### コスト配分タグを使用すべき場面
- 特定のリソースや環境（例えば開発環境や本番環境）のコストを正確に追跡したい場合
- リソースごとの詳細なコスト分析を必要とする場合

## 組み合わせた運用の例

両方の機能を組み合わせることで、より効率的なコスト管理が可能です。

1. **コスト配分タグでリソースを分類**  
   各リソースに「Environment: Dev」や「Project: A」などのタグを付与。
2. **Cost Categoriesで高レベルな分類を作成**  
   「開発環境」「営業部門」などのカテゴリを作成し、複数タグをまとめる。
3. **Cost Explorerで分析**  
   カテゴリ別の月次レポートを確認しつつ、タグ別に詳細を分析。
議事録の残し方

# はじめに
議事録に関する記事を一本残そうと思う。

というのも、一口に議事録と言っても割と適当な議事録を書く人が多い。
私もそうだが、割と自己流で議事録を作成している人は多いのではなかろうか？

TeamsやZoomなどのオンラインでのMTGであれば、
ツールのAI機能を使って議事録を取ったり、
または有料だが議事録を要約してくれるサービスなんかもある。

今後はこういうAI関連のツールを使って議事録を簡単に確実に取る機会が多いとは思うが、
対面でのMTGをする場合も多いし、プロジェクトのルールによってはAIを使うことは禁止！なんてこともある。。

そのため、一度議事録の書き方について多少なりとも学んだ結果を残そうと思う。

# 議事録の必要事項
必要事項は以下。

・会議名（タイトル）、日時、場所、参加者
　→まずは基本事項

・アジェンダ（議題やMTG内容）
　→次にMTGの内容。
 
:::note information
アジェンダの内容に沿って議事録を起こすときに、
5W1H（誰が、いつ、何を、なぜ、どこで、どのように）を
意識して記載すること（特に"誰が"と"なぜ"の部分）。

さらに、一言一句頑張って議事録を取る人がいるが、そうではなく会議のキーとなる発言のみをかいつまんで要約した内容を議事録としてまとめる。
:::


・決定事項・確認事項（アクション）
　→何が決まって、何のアクションが必要かを記載

・次回の会議
　→次回の会議が必要であれば記載する

# 議事録のテンプレ
色々調べた結果を複合したテンプレを作ってみた。
アジェンダについては、MTG前に作成して関係者に事前に展開するのも全然ありで、
その場合は以下テンプレの一部のみを切り取って使用すれば良い。

===========
会議名:
日時: yyyy年mm月dd日
場所:
参加者: ○○・△△・□□・▽▽

アジェンダ・議題
•議題1：xxx
　• 概要・討議ポイント
　• 意見・疑問
　• 決定事項
　• 担当者と期限

配布資料：
• 資料1：
• 資料2：

決定事項・アクション
• 決定事項1：
• 決定事項2：
• アクション1：
• アクション2：
 
次回の会議
• 日時：
• 議題：

===========

# 議事録を展開するタイミング
MTGを実施したその日の内に議事録を関係者に展開しよう。
スピードは大事で、次の日になると鮮度が落ちる（2-3日後に議事録展開されてもね）。
可能な限り早めに展開しましょ。

# 終わりに
一口に議事録と言っても、いろんな書き方があり、状況によってはもっと簡易的な書き方で関係者に展開すること（=共通認識を持ってもらうこと）を最優先とする場合もある。

今回提示したテンプレをベースとし、状況によって必要な箇所だけを使えば良いと思う。


以上
MacでGitの複数アカウント（個人用・業務用）を管理する方法


Gitを使うとき、個人用アカウントと業務用アカウントを使い分ける必要があることはよくあります。特に、Mac上でこれを実現するには、適切な設定が必要です。本記事では、個人用と業務用フォルダを分け、それぞれのGit設定とSSH認証を適用する手順を詳しく解説します。

<br>

## 1. `.gitconfig` の設定

`~/.gitconfig` ファイルにフォルダごとの設定を適用します。以下のように記述してください。

```bash
[user]  # グローバル設定
    email = user@email.com
    name = username

[includeIf "gitdir:~/Documents/personal/"]  # 個人用フォルダ設定
    path = ~/.gitconfig-personal

[includeIf "gitdir:~/Documents/company/"]  # 業務用フォルダ設定
    path = ~/.gitconfig-company
```

上記の設定は次を意味します：

- ~/Documents/personal/ 以下のフォルダでは ~/.gitconfig-personal の設定を使用。
- ~/Documents/company/ 以下のフォルダでは ~/.gitconfig-company の設定を使用。

<br>

## 2. フォルダ別のアカウント情報設定

それぞれのフォルダで使用するGit設定ファイルを作成します。

<b>個人用</b>

`$ vi ~/.gitconfig-personal`

```bash
[user]
    name = MyGitHubName
    email = MyGitHubEmail
```

<b>業務用</b>

`$ vi ~/.gitconfig-company`

```bash
[user]
    name = MyCompanyGitHubName
    email = MyCompanyGitHubEmail
```

これで、個人用フォルダと業務用フォルダで異なる名前とメールアドレスが適用されます。

<b>確認コマンド</b>

`$ git config user.name`

	⚠️ git init 済みのフォルダでのみ設定が適用されます。それ以外の場合は、グローバル設定が優先されます。

## 3. SSH認証の設定

<b>SSHキーの生成</b>

個人用と業務用でそれぞれSSHキーを生成します。

<br>

<b>個人用キー生成</b>：

`$ ssh-keygen -t ed25519 -C "MyPersonalEmail@naver.com" -f "~/.ssh/id_ed25519-personal"`

<b>業務用キー生成</b>：

`$ ssh-keygen -t ed25519 -C "MyCompanyEmail@naver.com" -f "~/.ssh/id_ed25519-company"`

<br>

コマンド実行後、以下のようなファイルが生成されます：

-	~/.ssh/id_ed25519-personal と ~/.ssh/id_ed25519-personal.pub
-	~/.ssh/id_ed25519-company と ~/.ssh/id_ed25519-company.pub

<br>

<b>SSH設定ファイルの編集</b>

`~/.ssh/config` ファイルに以下を追加します。

```bash
Host github-personal.com
    HostName github.com
    User git
    AddKeysToAgent yes
    UseKeychain yes
    IdentityFile ~/.ssh/id_ed25519-personal

Host github-company.com
    HostName github.com
    User git
    AddKeysToAgent yes
    UseKeychain yes
    IdentityFile ~/.ssh/id_ed25519-company
```

<br>

## 4. 動作確認

<b>クローンテスト</b>

それぞれのアカウントでGitリポジトリをクローンします。

<br>

<b>個人用リポジトリのクローン</b>：

`$ git clone git@github-personal.com:[username]/[repository-name].git`

<b>業務用リポジトリのクローン</b>：

`$ git clone git@github-company.com:[username]/[repository-name].git`

	⚠️ Permission denied (publickey) エラーが出た場合、以下の方法で解決してください。

<br>

<b>SSHキーの登録</b>

GitHubにSSHキーを登録します。

1.	個人用キーを表示： <br>
    `$ cat ~/.ssh/id_ed25519-personal.pub`
2.	表示されたキーをコピーして、`GitHub` → `Settings` → `SSH and GPG keys` → `New SSH Key` に追加します。
3.	同様に業務用キーも登録します。

<br>

## 5. まとめ

これで、1台のMacで個人用と業務用のアカウントをスムーズに管理できるようになりました。~/.gitconfig の設定により、各フォルダで適切なユーザー情報が自動的に適用されます。また、SSH認証を完了することで、アカウントの衝突を避けつつ快適に作業ができます。

参考になりましたか？フィードバックや質問があればコメントで教えてください！ 😊
個人的 Termux 初期設定


## 初期
```bash
# pkg アップデート
> pkg update
> pkg upgrade -y
# git インストール
> pkg install git -y
```

## ストレージ権限付与

```bash
> termux-setup-storage
```

## fish & fisher

```bash
# fish
> pkg install fish
# デフォルトシェルの切り替え
> chsh -s fish
```

```bash
# fisher
> curl -sL https://raw.githubusercontent.com/jorgebucaran/fisher/main/functions/fisher.fish | source && fisher install jorgebucaran/fisher
```

```bash
# テーマ導入(bobthefish)
> fisher install oh-my-fish/theme-bobthefish
```

```bash
# 文字化け対策にフォント追加

# 手動でお気に入りのフォントを単体ダウンロードしてもいい
# ~/fonts 配下にフォントファイルが生成される
> git clone https://github.com/powerline/fonts.git --depth=1

# termuxのfontを変更 (ProFont)
> mv ./fonts/ProFont/'ProFont For Powerline.ttf' ~/.termux/font.ttf
# 設定を再読み込み
> termux-reload-settings
```

## その他

外見変更でneofetchを表示させたかったので
[termux-fish](https://github.com/msn-05/termux-fish)を使用した。
しかしこれを先に導入するとfishのバージョンが低くfisher起動につまずいたので、やらない方がいい

### プログラム置き場のシンボリックリンク

```bash
> ln -s ~/storage/shared/program ~/program

> ls
>> /storage /program
```

### Acode Editor - AcodeX-Terminal plugin

```bash
> curl -sL https://raw.githubusercontent.com/bajrangCoder/acode-plugin-acodex/main/installServer.sh | bash
> cd $HOME && mkdir -p .gyp && echo "{'variables': {'android_ndk_path': ''}}" > .gyp/include.gypi
```
【IoTから→ハーバリウム・プロモータへ】

こんにちは！小池克幸です(#^^#)
豊島区で"IGO商会株式会社"で経営をしています。

これまでは、IoT分野やコンサルタントが主だった内容だったのですが、
2021年11/18の法人化を機に、プロモーターとして活動しております。

"ハーバリウムマルシェ"や"フェス"のプロデュース、
"SEコミュニティ"などの支援からIoT開発のプロモートも手掛けております。

世の中に、チャレンジする楽しさやワクワク、可能性と向き合うことの大切さ等をどんどん発信していきます(*^▽^*)

https://lit.link/stlin


最近では"マルシェ"への出店と合わせて、オンラインでですが
ショップの方も経営しております(^^♪
もともと格闘技や"アウトドア"が好きだったのが功を奏して、今では自然と戯れることをテーマにワークショップも開催してます。
芸能人の方とも一緒に"プロモート"活動をさせていただくようになって非常に感謝です＾＾

ぜひ見てみてね♬

https://www.bushfunny.online/


【自己紹介兼ねてですが、経歴と僕の目指すもの】

好きなことは体を動かすこと。
格闘技のサロンとかもよくいきます！
お笑いのフットボールアワーさんとかも大好きです!(^^)!


24歳から立ち上げをして、今3年目で法人設立しました。
出身が茨城県で、新社会人まで東京に全く出てきていませんでしたが、就職活動を機に池袋や埼玉の方に出てきて、文系からIT系に就職しました。

採用面接の方はなかなかに鬼門でした(笑)


当時、残業が深夜2時までだったところを必死に変えたく、
今のメンターの草分さんに出会い、自分自身がどうなっていきたいのか？
何に一番燃えているのか？自分が成し遂げる上で、自分が与えられる前に与える存在であるのか？
大切なことをたくさん学ばせていただきました。
僕の人生のテーマの一つが「感動」を与えること♬
リスペクトしている偉人は、「吉田松陰」。

愛読書は「誇りをもって生きる」
一昔前の本なので、中古だと50円で安くなっててびっくりしたのはいい思い出。ぜひ読んでみてほしいです✨✨

https://www.amazon.co.jp/dp/4799103164?tag=s4728pk3-22&linkCode=ogi&th=1&psc=1

父親も自営業で、年収6000万以上稼いおり大尊敬！
しかし、大体2代目社長やお笑い芸人さんなども「親の七光り」と自分でレッテルを張ってしまうことが多い中、
父やメンターの名前ではなく自分自身の人生として挑戦していくこと、しっかりと自分自身の将来に向けて向き合っていただいたメンターに感謝しかありません。

これからは、自分自身の目標や夢はもちろん、たくさんの人の力になっていくために尽力していきます(≧▽≦)✨✨

僕のビジョンは、
「すべての人が夢や目標に挑戦でき、達成していける仕事と場所を創る」
こと。

可能性に蓋をせず、好きなもの、望んでいるものを望んでいると口にし続け合う人生をご縁をもってつながることのできたすべての人、仲間とともに成し遂げ続けていきます！
Record Producerでの添付ファイル確認機能の実装方法

ServiceNowのサービスポータルで、ユーザーがフォームを送信する際に添付ファイルの有無を確認する機能について考えたことはありますか？
Catalog Client Scriptでは、サーバー側の情報（例えば、レコードのsys_id）を利用できないため、フォーム送信時点での添付ファイル確認は困難です。
この記事では、Record Producerスクリプトを使用して、添付ファイルが正しくアップロードされているかをサーバー側で検証する方法を解説します。
## 問題点
Service Portalのカタログで、添付ファイルが必須の場合、そのファイルが正しくアップロードされているかを確認したい。しかし、レコードID（sys_id）はフォーム送信の時点ではまだ作成されておらず、クライアント側では確認が難しい。現在の手法では、添付ファイルが欠落している状態でフォームが送信されるリスクを完全には排除できません。
## 解決方法
この課題を解決するには、サーバー側スクリプトを使用します。具体的には、フォームが送信された後、sys_attachmentテーブルを参照して、添付ファイルの存在を確認します。この確認は、フォームデータがデータベースに保存される直前に実行されるため、送信内容の整合性を確保するのに役立ちます。また、添付ファイルが存在しない場合には、エラーメッセージを表示して送信処理を停止させることが可能です。
以下は、Record Producerスクリプトで添付ファイルを確認するコードの例です。
![Screenshot 2025-01-02 at 5.53.47 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3975900/c7c3ad3b-ce9b-9b1f-8af9-a073562e721e.png)
![Screenshot 2025-01-02 at 5.59.48 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3975900/cc1f3172-ec94-390e-0ef6-da0df6558b5a.png)

コードのポイント解説
1. GlideRecordを使用した添付ファイル確認
sys_attachmentテーブルを検索し、レコードのsys_idと一致する添付ファイルが存在するかを確認します。これにより、添付ファイルの不足を防ぐことができます。
2. エラーメッセージの表示とAbort
添付ファイルが見つからない場合は、gs.addErrorMessage()を使用してエラーメッセージを表示します。同時に、current.setAbortAction(true)を使用することでフォーム送信をキャンセルし、画面を次に進めず同じ画面に留まる処理を行います。
## まとめ
Record producerスクリプトを利用すれば、フォーム送信時に添付ファイルの確認をサーバー側で行うことが可能です。この方法により、データの整合性を高め、ユーザーエクスペリエンスを向上させることができます。この記事を参考にして、ぜひ自分のServiceNow環境で試してみてください！
競プロ日記#25/01/01

# アルゴ式-[英小文字の種類数](https://algo-method.com/tasks/236)
- for文をcharの'a'から'z'で回すというテクニック

# アルゴ式-[同じ文字列](https://algo-method.com/tasks/260)
```
for (int i = 0;i< N;i++){
    for (int j = i + 1;j < N;j++){
        
    }
}
```
のiを0からN-1、jをi + 1からN-1までループさせる手法で同じ文字列の判定もできる
Node.jsのストリーム処理における「MaxListenersExceededWarning」の原因と解決方法

Node.jsでストリーム処理を行っているときに、以下のような警告が表示されることがあります。

```
(node:25604) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 finish listeners added to [Transform]. MaxListeners is 10. Use emitter.setMaxListeners() to increase limit

```

この警告は、ストリームで使用している `Transform` ストリームが `finish` イベントのリスナーを10個以上追加したことが原因です。通常、Node.jsの `EventEmitter`（`Transform` はそのサブクラス）はリスナーが10個以上追加されると警告を出す仕様になっています。この警告が出る理由とその解決方法について説明します。

## 原因

`MaxListenersExceededWarning` の警告が出る原因は、`Transform` ストリームを使い回しているためです。`Transform` ストリームは、内部でイベント（特に `finish` イベント）を発火させますが、インスタンスを使い回すことでそのリスナーが複数回追加されてしまいます。これにより、10個以上のリスナーが追加され、警告が発生します。

### 具体的な例

以下のコードでは、`Transform` ストリームのインスタンス `basicTransform` を使い回しています。`await pipeline()` の中で再利用すると、`finish` イベントに対するリスナーが積み重なり、警告が発生します。

### 問題のコード

```tsx
// データ変換のためのTransformストリームを定義
const basicTransform = new Transform({
    // オブジェクトモードを有効にして、オブジェクトの読み書きを可能にする
    objectMode: true,
    // 各チャンクを変換するための関数
    transform(chunk, _encoding, callback) {
        // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
        const data = evolve(chunk, {
            status: changeApplicationStatus,
            // ...
        });

        callback(null, data);
    },
});

```

このコードでは `basicTransform` を一度作成し、それを複数回使い回しています。これが原因で、`finish` イベントにリスナーが追加されていきます。

## 解決方法

### 1. `Transform` ストリームを毎回インスタンス化する

`Transform` ストリームのインスタンスを使い回さず、毎回新しいインスタンスを作成することで、リスナーの積み重ねを防ぎます。この方法を採用すると、ストリームごとにリスナーが適切に管理され、警告が発生しません。

### 修正後のコード

```tsx
// Transformストリームのインスタンスを毎回作成する関数
const basicTransformFactory = (): Transform => {
    return new Transform({
        // オブジェクトモードを有効にして、オブジェクトの読み書きを可能にする
        objectMode: true,
        // 各チャンクを変換するための関数
        transform(chunk, _encoding, callback) {
            // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
            const data = evolve(chunk, {
                status: changeApplicationStatus,
	              // ...
            });

            callback(null, data);
        },
    });
};

export { basicTransformFactory };

```

この修正により、`basicTransformFactory` を呼び出すたびに新しい `Transform` インスタンスが作成されるので、リスナーの重複がなくなります。

### 2. `removeAllListeners` の使用

もし、どうしても同じ `Transform` ストリームを使い回さなければならない場合は、ストリームを使用した後に `removeAllListeners` を呼び出して、不要なリスナーを手動で削除することができます。ただし、これはあまり推奨されません。適切なインスタンス管理が重要です。

上手く削除できない場合があります。

```tsx
basicTransform.removeAllListeners();
```

## 最後に

ストリームの使い回しによる `MaxListenersExceededWarning` の警告を避けるためには、`Transform` ストリームをインスタンス化する際に毎回新しいものを生成するようにしましょう。この方法により、リスナーの重複を防ぎ、ストリームの挙動を安定させることができます。
MacでOllamaが動かなかったので調べた結果ESETがブロックしていました

# 2025年 Mac mini (M4)を買ってきました
これまでずっとMacbook Air M1を使用していましたが、メモリが8GB、SSDが256GBという標準的な構成です。
ある程度使う分には良かったのですが、Docker使って、IntelliJ Idea使って、Ollama使ってとやっていると、パフォーマンスに限界を感じるようになっていました。
たまにもっさりすることもあれば、カーソルがずっとクルクルしてたり・・・
最近M4のMac miniが出たのと、Macbookもシェルモードでしか使っていなかったので、デスクトップでも問題ないと思い、一念発起してMac mini(M4)を買ってきました。

# Ollamaをインストール
[Ollama](https://ollama.com/)を公式からダウンロードしてOllama.appを起動するだけなので、特に問題なく起動したはずです。メニューバーにもOllmaのアイコンが表示されているので問題ないはずです。

https://ollama.com/
# could not connect to a running Ollama instance
ターミナルからollamaコマンドを実行したところ、Warningが表示されて接続できません。
以下のような原因を想定して、色々と調べました。
- Ollamaのバージョンの問題？
- ダウンロードしたファイルが壊れてた？
Githubを見ると、たまに同じような状況の方がいて質問していたので、それを読んだりしましたが、なかなか解決できません。
```terminal
cat ~/.ollama/logs/server.log
```
これでOllamaのログを見ましたが、問題なく動いているようでした。

困り果てて、ふと思いついたことがありました。

# もしかしたらファイアウォール？
ファイアウォールで接続が遮断されているのではと考えました。
ESETというセキュリティーソフトを使用しているのですが、ESETのネットワーク保護を無効にして見ました。
```terminal
ollama -v
ollama version is 0.5.4
```

当たりでした‼️
ESETは軽快で使いやすいので以前のMacbook Airでも使用していました。
Macbookではこの問題は起きなかったのですが、もしかしたら新しいMacOS対応で設定等が変わったのかもしれません。
確か2024年にSequoiaが出た時に、ESETがすぐに対応できず1ヶ月以上バージョンアップができないという問題がありました。

https://eset-support.canon-its.jp/faq/show/30227?site_domain=default

ネットワーク周りの対応が大変だったみたいです。
確証はありませんが、この影響だったのかもしれません。
実際にESETのログを見たらブロックされていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/956246/da6989b2-4a79-cb6a-6f17-08847ab92881.png)

# ESETのアプリケーションルール設定
以下のように受信・送信を許可しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/956246/d59a347f-304b-2294-774d-cbf9d1ad39ef.png)
これでOK。Ollamaを確認すると

```terminal
ollama -v
ollama version is 0.5.4
ollama run llama3.2
pulling manifest 
pulling dde5aa3fc5ff... 100% ▕████████████████████████████████████████████████████████████████████████████████▏ 2.0 GB                         
pulling 966de95ca8a6... 100% ▕████████████████████████████████████████████████████████████████████████████████▏ 1.4 KB                         
pulling fcc5a6bec9da... 100% ▕████████████████████████████████████████████████████████████████████████████████▏ 7.7 KB                         
pulling a70ff7e570d9... 100% ▕████████████████████████████████████████████████████████████████████████████████▏ 6.0 KB                         
pulling 56bb8bd477a5... 100% ▕████████████████████████████████████████████████████████████████████████████████▏   96 B                         
pulling 34bb5ab01051... 100% ▕████████████████████████████████████████████████████████████████████████████████▏  561 B                         
verifying sha256 digest 
writing manifest 
success 
>>> hello
Hello! How can I assist you today?

```

無事に使用できるようになりました。
pnpm add と pnpm installの違い

### 1. **新しいパッケージを追加したい場合**

`pnpm add <prj>` を使うべきです。

- **理由**: パッケージを新しくインストールして、`package.json` の `dependencies` または `devDependencies` に追加するためには、このコマンドを使います。
- **例**:
    - 開発用のパッケージを追加したい場合:
        
        ```bash
        pnpm add <package-name> -D
        
        ```
        
    - 通常の依存関係として追加したい場合:
        
        ```bash
        pnpm add <package-name>
        
        ```
        

### 2. **既存の依存関係をインストールしたい場合**

`pnpm install` を使うべきです。

- **理由**: プロジェクトに既に `package.json` と `pnpm-lock.yaml` があり、それに基づいて必要なパッケージをインストールしたい場合に使います。`pnpm install` は依存関係を再インストールする際にも便利です。
- **例**:
    - 新しいマシンでプロジェクトをセットアップするときや、依存関係が壊れたとき:
        
        ```bash
        pnpm install
        
        ```
        

### 3. **特定のパッケージをインストールして依存関係に追加しない場合**

`pnpm install <prj>` を使いたい場合もありますが、通常、`pnpm add <prj>` とほぼ同じ動作をします。ただし、`pnpm install` はプロジェクト全体の依存関係のインストールや更新を行うことが多いので、パッケージを追加したいだけなら `pnpm add` を使う方が意図に合います。

---

### 結論:

- 新しいパッケージを追加したいなら `pnpm add`。
- プロジェクトの依存関係をインストール（または再インストール）したいなら `pnpm install`。

通常の開発フローでは、`pnpm add` を使って依存関係を追加し、`pnpm install` は既存の依存関係をセットアップするときに使うのが一般的です。
【ポータブルスキル】私が考えるパワポドキュメント作成ポイント

いつも記事を読んでいただきありがとうございます！
モブエンジニア（[@mob-engineer](https://qiita.com/mob_engineer))です！

今回は技術紹介に関する記事ではないですが、**パワポドキュメント作成ポイント**について、私が考えるポイントを記事にしてみました。

5分ほどで読める分量ですので、年末年始の気休めに読んでいただけますと幸いです。

:::note info
今回紹介するパワポドキュメント作成ポイントは私の実体験から得たポイントとなります。そのため、教科書的な内容となっていないことはご了承ください。
:::

# 目次
- **読者層**
- **伝えたいこと**
- **その１：目的を考えてみる**
- **その２：伝える道筋を考えてみる**
- **その３：文章だけで伝わるかチェックする**
- **その４：良いパワポドキュメントを参考にする**
- **その５：外部へアウトプットしフィードバックを得る**

## 読者層

次のような悩みを抱えている方に読んでいただければありがたいと思います。

- **パワポドキュメント作成に何かしらの悩み・抵抗感を感じている方**
- **いきなりパワポ作成から入ってしまい、目的のない資料を作ってしまっている方**
- **パワポ職人として業務に携わっている方**

## 伝えたいこと

本記事を通じて伝えたいことは**パワポドキュメント作成≠目的**でないということです。
何を言っているかと思われる方がいらっしゃるかと思いますが、実際、パワポドキュメント作成を行っていくと、**レビューに対する修正**や**パワポドキュメントへ装飾を入れる**ことに注力してしまい、**パワポドキュメント作成が目的になってしまう**場面が多くあるかと思います。

実際、私自身も直近まで、**パワポドキュメント作成できればゴール**と思っていました。

そのうえで、パワポドキュメント作成するだけで、聞き手にメッセージは伝えることが出来るのでしょうか？
もちろん、**もちろん、きれいにパワポドキュメント作成すれば、相手へメッセージを伝えやすくなる**と思いますが、その前に**メッセージ性**と**ストーリー**をきちんと定めておかないと、**資料はきれいだが、何を伝えたいかよくわからない資料**が生まれるといった悲劇につながると思います。

まとめると、パワポドキュメント作成の目的は、**パワポドキュメント作成**ではなく**メッセージ性・ストーリーを明確にする**だと考えています。そのうえで、私個人が感じる、目的達成のポイントをいくつか示してい見たいと思います。

## その１：目的を考えてみる

当たり前のことかもしれませんが、一番抜け落ちやすいかと思います。
例えば、パワポドキュメント資料作成の目的が**幹部陣への新規事業説明**の場合、幹部視点であれば、**新規事業の詳細情報**より**新規事業を通じた将来像**に関心が集まるかと思います。
そのような、**幹部陣への新規事業説明のプレゼン**で**事業の詳細説明**に力を入れたところで、**この事業を通じて何を行いたいのかさっぱり分からない**といった判断を下される場合があるかと思います。

もっと、身近な例で示すと、**技術選定時の説明資料**があるかと思います。その場合、**調査した技術に関する情報をまとめる**のも大切かと思いますが、**なぜ、その技術選定を行ったのかという背景**の方が重要になってくると思います。

まずは、**パワポドキュメントを作成する目的**から考えてみることで、**この資料を通じて何を実現したいのか**が見えてくるかと思います。

## その２：伝える道筋を考えてみる

その１のポイントにも繋がってくると思いますが、伝える道筋がぐちゃぐちゃだと、**相手に対して正しく目的を伝えられない**可能性が非常に高くなります。

そのうえで、伝える道筋を可視化するためのヒントとして、**資料作成前に目次を作成する**ことがあります。私個人も、ブログ・資料を作成する前に、目次を作成し、**どのような流れで文章を執筆していくか**可視化させてから本文を執筆しております。

また、目次を作成することで、**文章量が多くなってきたときに、今どの部分を執筆しているのか確認するための目星**にもなります。

言っていることは簡単なことかもしれませんが、**伝える道筋を考えてみる**ことを心掛けてみると、相手にとって**何を伝えたいか分かる資料**を作成できるかと思います。

## その３：文章だけで伝わるかチェックする

テクニックよりのポイントですが、**ワード・メモ帳などのツール**を用いて、文章で執筆して相手に伝わるか確認してみることをおススメします。

**目的が決まった、道筋が決まった、いざパワポドキュメント作成しよう**とすると、大体失敗してしまいます。理由として様々ありますが、**パワーポイントの特性として前後関係をごまかしやすい**といった点があるからだと私は考えています。

そのため、パワポドキュメントをいきなり作成せずに、文章として見える化させてから、前後関係をチェックすることをおススメします。（ブログもいい案かもしれませんね）

## その４：良いパワポドキュメントを参考にする

世の中には多くのパワポ作成術のドキュメントがありますが、やはり、現場で利用されている良いパワーポイントドキュメントを見ることが一番の成長につながると思います。

個人的には、**Speaker Deck**などのパワポ共有サービス、**Ted**などのプレゼン配信などをチェックすることをおススメします。

また、外部イベントへ参加してみて、**この人のプレゼン資料読みやすいな**と思ったら、積極的に真似してみるのもいいかと思います。

## その５：外部へアウトプットしフィードバックを得る

ここまで、いくつかポイントを示しましたが、いきなりパワポドキュメント作成が上手になるわけではありません。世の中では、技術コミュニティがごまんとありますので、LT登壇などを通じて、アウトプットし、参加者からフィードバックを得ながら、パワポドキュメントの品質を向上させていくことをおススメします。

もちろん、社内向けの資料であれば、先輩社員やそのプロダクトにあまり関わっていない方へ資料レビューを依頼し、フィードバックを得ることも良い案だと思います。

### さいごに

ざっと、私が考えるパワポドキュメント作成ポイントをまとめてみました。
もちろん、パワポドキュメント作成のポイントは上記以外にもあると思いますが、大枠は外していないと思います。

本記事が読者のパワポドキュメント作成の悩み解決につながることを期待しております。
最後まで、記事を読んでいただきありがとうございました！