OmniAICreator/Qiita-1.07M huggingface dataset:
Git入門：ブランチとマージの基本

Gitのブランチとマージは、複数の開発者が同時に作業する際に非常に重要です。この記事では、ブランチの作成、切り替え、マージの基本について記述します。

### 目次

1. ブランチの基本
2. ブランチの作成と切り替え
3. ブランチのマージ
4. ブランチの削除

### 1. ブランチの基本

ブランチは、独立して作業するための機能です。新しい機能の開発やバグ修正など、メインのコードベースから分岐して作業することができます。

### 2. ブランチの作成と切り替え

### ブランチの作成

新しいブランチを作成するには、以下のコマンドを使用します。

```bash
git branch <ブランチ名>
```

例：

```bash
git branch feature-xyz
```

### ブランチの切り替え

作成したブランチに切り替えるには、以下のコマンドを使用します。

```bash
git checkout <ブランチ名>
```

例：

```bash
git checkout feature-xyz
```

ブランチを作成して同時に切り替えるには、`-b`オプションを使用します。

```bash
git checkout -b feature-xyz
```

### 3. ブランチのマージ

ブランチの作業をメインのブランチに統合するために、マージを行います。まず、統合先のブランチに切り替えます。

```bash
git checkout main
```

次に、マージするブランチを指定してマージを行います。

```bash
git merge <ブランチ名>
```

例：

```bash
git merge feature-xyz
```

### 4. ブランチの削除

マージが完了し、不要になったブランチを削除するには、以下のコマンドを使用します。

```bash
git branch -d <ブランチ名>
```

例：

```bash
git branch -d feature-xyz
```

### まとめ

この記事では、Gitのブランチとマージの基本について記述しました。ブランチを使用することで、独立して作業し、メインのコードベースに影響を与えずに新しい機能やバグ修正を行うことができます。
顧客が本当に必要だったもの (Tree Swing Cartoon)を深堀りしてみる

![tree-swing-cartoon.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1078393/53afc54c-21c8-69fa-804c-015f9de9e5b5.png)

| 英語                                      | 日本語                           |
|-------------------------------------------|----------------------------------|
| How the customer explained it             | 顧客が説明した要件                |
| How the project leader understood it      | プロジェクトリーダーの理解         |
| How the analyst designed it               | アナリストのデザイン             |
| How the programmer wrote it               | プログラマのコード                |
| How the business consultant described it  | 営業の表現、約束                 |
| How the project was documented            | プロジェクトの書類                |
| What operations installed                 | 実装された運用                    |
| How the customer was billed               | 顧客への請求金額                  |
| How it was supported                      | 得られたサポート                  |
| What the customer really needed           | 顧客が本当に必要だった物          |

## 顧客のニーズと現実のギャップ
「Tree Swing Cartoon」で注目すべき点は、プロジェクトに関わる各関係者がそれぞれ異なるイメージを持っていることが描かれており、プロジェクトの難しさを表していることです。営業担当、エンジニア、デザイナー、それぞれの視点や解釈の違いが、最終的な成果物にどれほど大きな影響を与えるかを示しています。さらに、顧客自身もプロジェクトの初期段階と完了時で異なる期待を抱くことが多いのです。このようなギャップがプロジェクトの成功を阻む大きな要因となります。
ではプロジェクトを失敗させないためにどのような施策を打てば良いのでしょうか。
私は2点の事を心がけるようにしております。

1. コミュニケーションを密に取る
1. プロトタイプの作成

### 1.コミュニケーションを密に取る
プロジェクトの成功には、関係者全員が同じ理解を共有することが不可欠です。そのために私は、頻繁なコミュニケーションが必要だと考えてます。
以下の点に注意して、円滑なコミュニケーションを図るといいでしょう。

#### 定例ミーティングの開催
定期的なミーティングや進捗報告を行うことで、チーム全員が最新の情報を共有できます。

#### 風通しの良い空気作り
コミュニケーションがしやすい環境を作ることが重要です。これにより、意見交換が活発になり、チームの連携が強化されます。
特に顧客とのコミュニケーションは重要です。早期にフィードバックを取り入れることで、プロジェクトの方向性を柔軟に修正し、最終的な成果物が顧客の期待に沿ったものになると考えます。

### 2.プロトタイプの作成
プロトタイプの作成は、プロジェクトの成功において重要な役割を果たします。プロトタイプは、最終製品の一部を早期に視覚化するツールであり、具体的なイメージの共有に大きな効果があります。これを通じて、顧客や関係者が具体的なイメージを持ちやすくなり、全員が同じゴールを共有しやすくなります。

また、プロトタイプを使用することで、実際の使用感や機能を早期に確認することができます。これにより、顧客の期待や要望を正確に把握することができ、プロジェクトの方向性を適切に設定できます。さらに、顧客がプロトタイプを手に取って確認できることで、プロジェクトの方向性が明確になり、後々の変更を減らすことができます。

これらのメリットを活用することで、プロジェクトの成功確率が大幅に向上すると信じています。プロトタイプの作成を通じて、顧客の満足度を高め、円滑なプロジェクト進行を目指しましょう。

## まとめ
「Tree Swing Cartoon」は、プロジェクトにおけるコミュニケーションの重要性と、顧客のニーズを正確に把握することの難しさを示しています。
このギャップを埋めるためには、密なコミュニケーションとプロトタイプの活用が鍵となります。
これにより、顧客が本当に必要としているものを提供し、プロジェクトの成功を実現することができるでしょう。
プロジェクトの初期段階からこれらのアプローチを取り入れることで、関係者全員が同じ目標に向かって協力し、成果物が期待通りのものとなるように導くことができると私は考えます。前向きな姿勢でコミュニケーションとプロトタイプを活用し、プロジェクトを成功へと導きましょう！

## 参考情報
https://en.wikipedia.org/wiki/Tree_swing_cartoon

https://www.psychoscape.net/linux/2007/20070204.html

https://medium.com/@thx2001r/the-project-cartoon-root-cause-5e82e404ec8a
Git入門：バージョン管理システムの基本

Gitは、ソフトウェア開発において最も広く使用されている分散型バージョン管理システムです。コードの変更履歴を管理し、複数の開発者が同時にプロジェクトに取り組む際に非常に便利です。この記事では、Gitの基本概念と主要なコマンドについて記述します。

### 目次

1. Gitとは？
2. Gitの基本概念
3. Gitの基本コマンド
4. GitHubを使用したリモートリポジトリの管理
5. 実践的な使用例

### 1. Gitとは？

Gitは、ソースコードのバージョン管理を行うためのツールです。Linus Torvaldsによって2005年に開発され、現在では多くのプロジェクトで標準的に使用されています。Gitを使用することで、以下のことが可能になります。

- コードの変更履歴を記録する
- 複数の開発者が同時に作業できるようにする
- コードのバージョンを簡単に管理できる
- 過去のバージョンに戻ることができる

### 2. Gitの基本概念

### リポジトリ

リポジトリは、Gitが管理するプロジェクトのディレクトリです。リポジトリには、プロジェクトのすべてのファイルとその変更履歴が含まれます。

### コミット

コミットは、リポジトリ内のファイルのスナップショットを保存する操作です。各コミットには、変更内容を説明するメッセージが含まれます。

### ブランチ

ブランチは、変更履歴の分岐です。ブランチを使用することで、開発者は独立して作業を進めることができます。最も一般的なブランチは、`main`（以前は`master`と呼ばれていました）です。

### マージ

マージは、異なるブランチの変更を統合する操作です。開発者が別々のブランチで作業した後、それらの変更を統合するために使用します。

### 3. Gitの基本コマンド

### リポジトリの作成

新しいリポジトリを作成するには、以下のコマンドを使用します。

```bash
git init
```

### ファイルのステージング

ファイルをステージングエリアに追加するには、以下のコマンドを使用します。

```bash
git add <ファイル名>
```

すべてのファイルを追加するには、以下のコマンドを使用します。

```bash
git add .
```

### コミット

ステージングエリアに追加されたファイルをコミットするには、以下のコマンドを使用します。

```bash
git commit -m "コミットメッセージ"
```

### リモートリポジトリの追加

リモートリポジトリを追加するには、以下のコマンドを使用します。

```bash
git remote add origin <リモートリポジトリのURL>
```

### プッシュ

ローカルリポジトリの変更をリモートリポジトリにプッシュするには、以下のコマンドを使用します。

```bash
git push origin <ブランチ名>
```

### プル

リモートリポジトリの変更をローカルリポジトリにプルするには、以下のコマンドを使用します。

```bash
git pull origin <ブランチ名>
```

### ブランチの作成とチェックアウト

新しいブランチを作成してそのブランチに切り替えるには、以下のコマンドを使用します。

```bash
git checkout -b <ブランチ名>
```

### 4. GitHubを使用したリモートリポジトリの管理

GitHubは、Gitリポジトリをホスティングするサービスです。リモートリポジトリを作成し、他の開発者と共有するために使用します。

### リモートリポジトリの作成

1. GitHubにサインインし、新しいリポジトリを作成します。
2. リポジトリのURLをコピーし、以下のコマンドでローカルリポジトリにリモートリポジトリを追加します。

```bash
git remote add origin <リポジトリのURL>
```

1. 初回のプッシュを行います。

```bash
git push -u origin main
```

### 5. 実践的な使用例

以下は、Gitの基本的な使用例です。

1. 新しいプロジェクトを作成します。

```bash
mkdir myproject
cd myproject
git init
```

1. ファイルを作成し、ステージングエリアに追加します。

```bash
echo "# My Project" > README.md
git add README.md
```

1. ファイルをコミットします。

```bash
git commit -m "Initial commit"
```

1. GitHubにリモートリポジトリを作成し、ローカルリポジトリに追加します。

```bash
git remote add origin <リポジトリのURL>
```

1. 初回のプッシュを行います。

```bash
git push -u origin main
```

### まとめ

この記事では、Gitの基本概念と主要なコマンドについて記述しました。Gitを使用することで、コードの変更履歴を管理し、複数の開発者が同時に作業できるようになります。初めてGitを使用する際には、基本的なコマンドを理解し、実践的な使用例を参考にしながら進めていくと良いでしょう。GitHubを利用することで、リモートリポジトリを簡単に管理し、プロジェクトを効率的に進めることができます。
Pythonで、日時の差を計算するプログラムコードを作ってみた

### 前置き
今日は、Pythonを使って、ユーザーが2つの日付と時間を入力したら、その時間の差は、何日何時間何分何秒差ですと出力されるプログラムコードの作成に着手しました。

1日は、24時間、1440分、86400秒です。
理由：1日＝24時間、1時間＝60分、1分＝60秒
時間を分に変換するにはその値に60を掛けて、
分を秒に変換するにはその値に60を掛けるからです。

### プログラムコード
``` python
from datetime import datetime

def calculate_datetime_difference(start_datetime_str, end_datetime_str):
    try:
        format_str = "%Y-%m-%d %H:%M:%S"
        # 時間文字列をdatetimeオブジェクトに変換する
        start_datetime = datetime.strptime(start_datetime_str, format_str)
        end_datetime = datetime.strptime(end_datetime_str, format_str)

        # 時間の差を計算する
        difference = end_datetime - start_datetime

        # 差を日、時間、分、秒に変換する
        days = difference.days
        seconds = difference.seconds
        hours = seconds // 3600
        minutes = (seconds % 3600) // 60
        remaining_seconds = seconds % 60

        return days, hours, minutes, remaining_seconds
    except ValueError:
        return None, None, None, None

# 時間を入力として受け取る
start_datetime_str = input("開始日時を「年-月-日 時:分:秒」の形式で入力してください (例: 2024-07-07 13:30:00): ")
end_datetime_str = input("終了日時を同様に入力してください: ")

# 時間の差を計算する
days, hours, minutes, seconds = calculate_datetime_difference(start_datetime_str, end_datetime_str)

# 結果を出力する
if days is not None and hours is not None and minutes is not None and seconds is not None:
    print(f"日時の差は {days}日 {hours}時間 {minutes}分 {seconds}秒 です。")
else:
    print("日時の形式が正しくありません。日時を「年-月-日 時:分:秒」の形式で正確に入力してください。")
```

### プログラムコードの説明
このプログラムでは、開始日時と終了日時の差を計算し、日、時間、分、秒に変換して正確な差を表示します。日時の形式が正しくない場合はエラーメッセージを表示します。

### 出力結果
``` python
開始日時を「年-月-日 時:分:秒」の形式で入力してください (例: 2024-07-07 12:30:00): 2024-07-05 12:37:37
終了日時を同様に入力してください: 2024-07-08 17:17:17
日時の差は 3日 4時間 39分 40秒 です。
開始日時を「年-月-日 時:分:秒」の形式で入力してください (例: 2024-07-07 12:30:00): 2024-07-07 19:27:36
終了日時を同様に入力してください: 2024-07-09 10:00:07
日時の差は 1日 14時間 32分 31秒 です。
開始日時を「年-月-日 時:分:秒」の形式で入力してください (例: 2024-07-07 12:30:00): 2024-07-06 21:00:00
終了日時を同様に入力してください: 2024-07-11 11:00:00
日時の差は 4日 14時間 0分 0秒 です。
開始日時を「年-月-日 時:分:秒」の形式で入力してください (例: 2024-07-07 12:30:00): 2024-07-08 15:20:00
終了日時を同様に入力してください: 2024-08-16 12:30:00
日時の差は 38日 21時間 10分 0秒 です。
開始日時を「年-月-日 時:分:秒」の形式で入力してください (例: 2024-07-07 12:30:00): 2024-07-09 14:40:00
終了日時を同様に入力してください: 2024-07-16 16:00:00
日時の差は 7日 1時間 20分 0秒 です。
```
### 出力結果の検証
**1**つめの出力：2024-07-08 - 2024-07-05 = 3日
17:17:17 - 12:37:37 = 16:77:17 - 12:37:37 = 4:39:40
よって、2つの日時の差は、**3日、4時間39分40秒**

**2**つめの出力：2024-07-09 - 2024-07-07 = 2日
10:00:07 - 19:27:36 = 34:00:07 - 19:27:36 = 14:32:31
しかし、2日後は7月9日の19:27:36になるので、差は1日
よって、2つの日時の差は、**1日、14時間32分31秒**

**3**つ目の入力：2024-07-11 - 2024-07-06 = 5日
11:00:00 - 21:00:00 = 35:00:00 - 21:00:00 = 14:00:00
同じく、5日後は7月11日の21:00:00になるので、差は4日
よって、2つの日時の差は、**4日、14時間0分0秒**

**4**つ目の入力：2024-08-16 - 2024-07-08 = 2024-07-47 - 2024-07-08 = 39
12:30:00 - 15:20:00 = 36:30:00 - 15:20:00 = 21:10:00
同じく、39日後は8月16日の15:20:00になるので、差は38日
よって、2つの日時の差は、**38日、21時間10分0秒**

**5**つ目の入力：2024-07-16 - 2024-07-07 = 9日
16:00:00 - 14:40:00 = 15:60:00 - 14:40:00 = 1:20:00
この場合なら、9日後は7月16日の14:40:00で、16:00:00はもう経過しています。
よって、2つの日時の差は、**9日、1時間20分0秒**

### 終わりに
皆さんも時間がある時に、このプログラムコードを参考にして、2つの日付と時間の差を計算してみたらいかがでしょうか。
Missing School

Students with complex attendance and health challenges  shouldn't be left behind. Missing School addresses the learning and social isolation impacts faced by children who miss school because of critical or chronic illness and treatment, such as anxiety, arthritis, cancer, cystic fibrosis, diabetes, heart conditions, injury, ME/CFS, mental illness and rare diseases. <a href="https://missingschool.org.au">Missing School</a> supports children who miss school, their families and their teachers through awareness, resources, capacity building, training, technology, and significant research.

Since 2017, Missing School's Australia-wide telepresence technology service means these kids can see their classmates, have the ability to connect into their classrooms, and have fun with friends.
「Jetpack Compose の基本」のメモ#8 ~状態を維持する~ 

### [10. 状態を維持する](https://developer.android.com/codelabs/jetpack-compose-basics?hl=ja#9)
#### rememberとrememberSaveable
+ remember
    + コンポジションが再作成された場合にリセットされても問題ない状態に対して使用する
+ rememberSaveable
    + アプリを再起動しても保持したい状態に対して使用する

### [11. リストをアニメーション化する](https://developer.android.com/codelabs/jetpack-compose-basics?hl=ja#10)
+ animateDpAsState はコンポーザブルではなく、Jetpack Compose が提供する関数
+ 指定したターゲット値 (Dp 値) に向かってアニメーションする State<Dp> オブジェクトを返す
+ State<Dp> オブジェクトは、指定されたターゲット値を監視し、変更があればアニメーションを開始する
+ Modifier.padding()の引数に対して指定する

### [12. アプリのスタイルとテーマを設定する](https://developer.android.com/codelabs/jetpack-compose-basics?hl=ja#11)
+ ダークモードのサポートなどの適切なデフォルト値はすでに設定されている
#### BasicsCodelabTheme と MaterialTheme
+ MaterialTheme は、マテリアル デザイン仕様のスタイル設定の原則を反映したコンポーズ可能な関数
+ BasicsCodelabTheme は MaterialTheme を内部的にラップするので、MyApp はテーマで定義されているプロパティでスタイル設定できる
```Kotlin
BasicsCodelabTheme {
        MyApp(modifier = Modifier.fillMaxSize())
    }
```
+ `MyApp(modifier = Modifier.fillMaxSize())` が content 引数として `BasicsCodelabTheme` に渡される
+ `MyApp(modifier = Modifier.fillMaxSize()))` が、そのまま `MaterialTheme` の content 引数に渡される
+ `MaterialTheme` は、渡された content (つまり MyApp) を自身のコンテンツとして扱い、`colorScheme` や `typography` などのスタイル設定を適用する
+ `MyApp` が `MaterialTheme` でラップされているので、`MaterialTheme.typography.headlineMedium` を使用することができる

#### Previewでダークモードを使用する
+ @Preview アノテーションで UI_MODE_NIGHT_YES を指定

#### アプリのテーマカラー
+ デフォルトの色は ui/theme フォルダ内のファイルColor.kt で定義されている
Wordpressサイトのバックアップをsystemdを用いて自動化した件

# はじめに
CDSLでは，過去に論文要約サイトというWordpressのサイトを運営していました．私はこのサイトの作成の一部に携わったのですが，その時に任された作業として，バックアップの自動化をしてほしいというものがありました．この時，自動化にsystemdというものを使用したので，その流れを記録しておこうと思います．

# systemdって何？
皆さんはsystemdというものを聞いたことありますか？私は今回バックアップの自動化を任せてもらうまで，聞いたことがありませんでした．
sysytemdというのは，[systemdとは - 意味をわかりやすく - IT用語辞典 e-Words](https://e-words.jp/w/systemd.html)によると，
> Linuxの起動時の処理やシステム管理を行う様々な機能を実装したソフトウェア群

だそうです．まあこれがいるおかげで私たちはLinuxを快適に使うことができるということですね．

# どうやって自動化したのか
## 1. 自動化対象の用意
まず，自動化したい対象を用意します．今回私が自動化したのは，バックアップを行う，backup.shというシェルスクリプトでした．
## 2. .timerの作成
次に，.timerというものを作ります．作成する位置としては，`/etc/systemd/system`の直下に作成します．`/etc/systemd/system/XXX.timer`という感じです．コマンドとしては，`/etc/systemd/system`に移動後に
```
sudo vim XXX.timer
```
で作成します．
中身はこんな感じです．私は，XXXの部分をauto_backupとしました．
```auto_backup.timer
[Unit]
Description=auto backup timer for CDSL Paper Review

[Timer]
OnCalendar=0:00
Unit=auto-backup.service

[Install]
WantedBy=timers.target
```
[Unit]のDescriptionには，この.timerの説明を入れます．

[Timer]のOnCalenderでは，実行間隔の指定をし，Unitでは，後ほど作成する.serviceを指定します．

[Install]のWantedByには，timers.targetと指定することで，タイマーとしてジョブを起動するようにすることができます．
## 3. .serviceの作成
次に.serviceというものを作成します．位置や作成方法は.timerと同じです．
```auto_backup.service
[Unit]
Description=auto backup Service for CDSL Paper Review
ConditionPathExists=/home/cdsl/backup

[Service]
Type=oneshot
ExecStart=/home/cdsl/backup/backup.sh
Restart=no

[Install]
WantedBy=multi-user.target
```
[Unit]に書いてあるDescriptionは.timerの時と同じです．ConditionPathExistsには，実行したいシェルスクリプトが入っているディレクトリを記述しています．

[Service]のTypeには，oneshotと指定することで，ExecStartに指定したものが実行されたら成功であるとします．ExecStartには，実行するシェルスクリプトを指定します．Restartはnoと指定し，プロセスの再起動を行わないようにします．

[Install]のWantedByには，multi-user.targetと指定します．これは，通常の起動でGUIがない場合でも有効にします．
## 4. 最後の仕上げ
最後に，これらを有効化していきます

まずはデーモンの再起動をします．
```
sudo systemctl daemon-reload
```
タイマーを有効化＆スタートします．
```
sudo systemctl enable auto_backup.timer
sudo systemctl start auto_backup.timer
```
これで完了です！
最後にちゃんと有効化できたかどうか確認します．
```
systemctl list-timers
```
有効化できていたら，自分の設定した.timerと.serviceがあるはずです．
# 終わりに
今回紹介したのは，systemdによって実行ファイルを定期実行させるものでした．用途によっては.timerや.serviceの設定が変わってくると思います．
今後何か自動化する必要があるということがありましたら，この記事を思い出してもらえるといいな～と思います．
# 参考にしたサイト
[Linuxでsystemdを使ってタイマーを設定する方法](https://tutorials.tinkink.net/ja/linux/how-to-set-timer-with-systemd.html)
[Systemd入門(4) - serviceタイプUnitの設定ファイル - めもめも](https://enakai00.hatenablog.com/entry/20130917/1379374797)
[systemdでプロセス自動再起動 | 晴耕雨読](https://tex2e.github.io/blog/linux/systemd-restart-config)
【C#5.0】平均値より大きい？小さい？

# はじめに
Windows11に標準で搭載されているC#(ver5.0)コンパイラで配列の要素の合計、平均、配列の要素の値は平均より大きい？小さい？を調査するプログラムを実装しました。

## 問題
>実行例に習い、以下のプログラムを作りなさい。
>（１）長さ5のint型の配列を作成する。
>（２）（１）の各要素に、1から10までの乱数を代入する。
>（３）配列の内容をすべて表示する。
>（４）配列の値の合計値と、平均値を表示する。
>（５）平均値よりも大きい数を表示する
>（６）平均値よりも小さい数を表示する。

という問題です。

## 実行結果例
画像の結果が一例です。

![rei.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1055346/c080d88d-5b88-59cc-fbe8-eba0e79c1bc7.jpeg)

## 実装したプログラムコード

```C#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace prob57
{
    class prob57
    {
        public static void Main(string[] args){
            Random rnd = new Random();
            int num = 5;
            int[] array1 = new int[num];
            for(int i=0;i<num;i++){
                array1[i] = rnd.Next(1,10);
                Console.Write("{0} ",array1[i] );
            }
            Console.WriteLine();
            Console.WriteLine();
            int sum1 = array1.Sum();
            double avg = array1.Average();
            Console.WriteLine("配列の合計値は:{0}",sum1);
            Console.WriteLine("配列の平均値は:{0}",avg);
            string oavg = "";
            string uavg = "";
            foreach(int number in array1){
                if (number > avg){
                    oavg = oavg + Convert.ToString(number) + " ";
                } else if (number < avg) {
                    uavg = uavg + Convert.ToString(number) + " ";
                }
            }
            Console.WriteLine("平均より大きい数は:{0}",oavg);
            Console.WriteLine("平均より小さい数は:{0}",uavg); 
            
        }
    }    
}
```

## 実行結果

![result.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1055346/a240052b-a599-1b09-eb74-fb8f34959dca.jpeg)


# 最後に
pythonでもやってみよっと。
NPMとpackage.jsonの基本

この記事ではNode.jsのパッケージマネージャであるNPM（Node Package Manager）と、NPMの設定ファイルである`package.json`について解説します。

## そもそもNPM is 何

ザックリいうとNPM（Node Package Manager）はNode.jsのパッケージ管理を担当してくれるツール。

例えばReactやVue、またサーバーサイドのExpressなどのライブラリやフレームワークをインストールする際に使います。

これらのライブラリやフレームワークは複数のファイルやディレクトリで構成されているため、それらを一括でダウンロードして管理してくれるパッケージ管理を行ってくれるのがNPMです。

Pythonではpip、Rubyではgem、PHPではcomposerなど、他の言語にもパッケージ管理ツールは存在するので他の言語で使ってた方はそんなものだと思ってもらえると。

## 基本的な使い方

### 初期化

初期構築は誰かが行ってくれていることが多いですが、自分で行う場合は以下のコマンドで初期化します。

```bash
$ npm init
```

このコマンドを実行すると、対話形式で`package.json`を作成するための情報を入力することができます。

### パッケージのインストール

package.jsonがあるディレクトリで以下のコマンドを実行すると、`package.json`に記載されているパッケージをインストールします。

```bash
$ npm install
```

一方で上記のコマンドではpackage.lock.jsonが生成されるため、実際には以下のコマンドを使うことが多いです。

```bash
$ npm ci
```

### パッケージの追加

プロジェクトに新たにパッケージを追加する場合は以下のコマンドを実行します。

```bash
$ npm install -save <package-name>
```

このコマンドでは商用環境で使うパッケージの場合は`-save`オプションをつけます。

テストやモックの作成、lintなどの開発環境でのみ使うパッケージの場合は`-save-dev`オプションをつけましょう。

```bash
$ npm install -save-dev <package-name>
```

このオプションを追加すると、`package.json`の`dependencies`ではなく`devDependencies`にパッケージが追加されます。

### パッケージのアップデート

パッケージのアップデートは以下のコマンドで行います。

```bash
$ npm update
```

### スクリプトの実行

`package.json`にスクリプトを記述しておくと、以下のコマンドでスクリプトを実行することができます。

```bash
$ npm run <script-name>
```

package.jsonに記載するスクリプトの例を以下に示します。

```json
{
  "scripts": {
    "start": "node index.js",
    "test": "jest"
  }
}
```

この場合、`npm run start`で`node index.js`が実行され、`npm run test`で`jest`が実行されます。

### スクリプトのちょっとしたテクニック

npmのスクリプトにはpost, preというプレフィックスがあります。

例えば、`start`スクリプトの前に`prestart`スクリプトを実行したい場合は以下のように記述します。

```json
{
  "scripts": {
    "prestart": "echo 'prestart'",
    "start": "node index.js"
  }
}
```

この場合、`npm run start`を実行すると、まず`prestart`スクリプトが実行され、その後`start`スクリプトが実行されます。

同様に、`post`プレフィックスを使うことで、スクリプトの後に処理を追加することもできます。
ARM3rd、Qiitaでweb3テックブログを始動：最新技術と実践知識を発信

ARM3rd株式会社がQiitaのOrganization機能を活用してテックブログを開始することをお知らせいたします。

当社は、web3技術の開発およびコンサルティングを提供するスタートアップとして、最新のブロックチェーン技術や分散型アプリケーション（dApps）開発に関する知見を共有してまいります。

このテックブログでは、以下のような内容を中心に発信していく予定です：

- web3技術の最新トレンドと分析
- スマートコントラクト開発のベストプラクティス
- dApps開発における課題と解決策
- ブロックチェーン技術の企業導入事例
- web3スタートアップのエコシステムについての洞察

当社のメンバーには、複数のweb3スタートアップでCTOやプロダクトオーナー、事業責任者を務めた経験を持つ専門家が在籍しています。その豊富な経験と専門知識を活かし、実践的で価値ある情報を発信してまいります。

Qiitaを通じて、エンジニアコミュニティとの交流を深め、web3技術の普及と発展に貢献できることを楽しみにしています。ぜひ、ARM3rd株式会社のOrganizationをフォローいただき、今後の投稿にご期待ください。

web3の開発やプロジェクトマネジメント、ファイナンスに関するご相談も随時受け付けております。お気軽にお問い合わせください。

ARM3rd株式会社一同、皆様との活発な交流を心よりお待ちしております。

---

:::note info
【ARM3rd とは】
ARM3rdはweb3企業のための頼れるパートナーです。開発からデザイン、マーケティング、ビジネス支援、営業、採用まであらゆるニーズに応え、web3プロジェクトを強力にサポートします。　

【ケイパビリティ】
1. Web3 Protocol Groth - L1/L2チェーンやプロトコルの成長を促進するため、マーケティング戦略の立案、dAppsユースケースの増加、コミュニティ構築、技術サポートなどあらゆる施策を実行
1. Developer Marketing - L1/L2チェーンやweb3プロトコルのweb3プロトコルの開発者向けマーケティング戦略の立案・実行
1. For Web3 Startups- web3スタートアップの経営戦略や組織整備、グロースまであらゆる支援を提供
1. Web3 Enterprise Solution - エンタープライズのweb3プロジェクトの企画/開発/運用保守まで一気通貫で伴走
1. Web3 Finance事業 - web3事業のM&Aや資金調達に向けた支援
1. NFT Studio - 5000万~1億円のNFTセールを10回以上成功させた実績を持つエキスパートチームが、NFTプロジェクトをトータルサポート

【Social Links】
- [会社資料](deck.arm3rd.com)
- [X(旧 Twitter))](https://twitter.com/BunzzDev)
- [Discord Community](https://t.co/6hHgssJdvW)
- [Youtube](https://www.youtube.com/@bunzzdev)
- [Instagram](https://www.instagram.com/bunzzdev/)

【お問合せ】
web3 開発・コンサルティングのご相談はこちらから 👉[Google Form](https://forms.gle/6Q68STeUzYif7mgz8)
:::
Blazor WebAssemblyアプリをHTTPSへリダイレクトさせる

Blazor WebAssemblyを公開したはいいけど、httpでアクセスしてくる人にhttpsへリダイレクトさせるのに結構苦労したので、ここにメモを残しておきます。

前提
- WindowsServer
- IIS
- Blazor WebAssemblyが既にサーバーで実行できている
- SSL認証は既にできている

ここでの要点は３つ
1\. IISのURL書き換えを設定
2\. web.configをプロジェクトに加える
3\. index.htmlに追記する

特に、3の「index.htmlに追記する」ことが書かれてある資料になかなかたどり着けず苦労しました。

# １，IISのURL書き換えを設定
IISマネージャーにリダイレクトしてもらうためのURL書き換えのルールを追加します。
「[【Windows Server】IIS10でhttpのリクエストをhttpsにリダイレクトする設定](https://www.depthbomb.net/?p=6102#toc5)」を参考にさせてもらいました。ありがとうございます。
IISマネージャーを操作してルールを追加する方法は上記のサイトを見てもらえればいいかと思いますが、将来、自分がやる時には手っ取り早く済ませたいので**web.configに直接追記**する内容を挙げておきます。
（プライベートIPアドレス）のところは各自の環境に合わせてください。
この設定の存在意義については、上に紹介させていただきましたサイトに書いてあります。非常にありがたいです。

```xml:web.config
<!-- この内容を<rules>内に追加する -->
<rule name="HTTPSリダイレクト" stopProcessing="true">
    <match url=".*" />
    <conditions>
        <add input="{HTTPS}" pattern="^OFF$" />
        <add input="{HTTP_HOST}" pattern="^localhost$" negate="true" />
        <add input="{HTTP_HOST}" pattern="^127.0.0.1$" negate="true" />
        <add input="{HTTP_HOST}" pattern="^（プライベートIPアドレス）$" negate="true" />
    </conditions>
    <action type="Redirect" url="https://{HTTP_HOST}{REQUEST_URI}" appendQueryString="false" />
</rule>
```
なお、web.configはサイトを配置してるフォルダ内にあります。

# ２，web.configをプロジェクトに加える
IIS側のweb.configをいじったところで、VisualStudioでデプロイするたびに上書きされて設定が消えてしまいます。
その為、デプロイ時に使ってもらうweb.configファイルを上記の設定内容にしてもらうよういくつか設定が必要になります。
[こちら](https://github.com/dotnet/AspNetCore.Docs/issues/17617)を参考にさせてもらいました。
まずは、サーバー側に出来上がっておりますweb.config（先ほど内容を追記したやつ）を**プロジェクトフォルダ内にコピー**します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3555422/cbdfb807-a730-b118-2f1f-0e84053676b0.png)
プロジェクトフォルダのルートにコピー

<br>
そうしましたら、次にプロジェクトファイルに下記の内容を追記します。

```xml: プロジェクト.csproj
<PropertyGroup>
    <!-- 他の設定が含まれている -->
    <IsTransformWebConfigDisabled>true</IsTransformWebConfigDisabled> <!-- 追記 -->
</PropertyGroup>

<!-- 以下を丸ごと追記 -->
<Target Name="CopyWebConfigOnPublish" AfterTargets="Publish">
	<Copy SourceFiles="web.config" DestinationFolder="$(PublishDir)" />
</Target>
```

これで、配置されるファイルに改良されたweb.configを使ってもらえるようになります。


# ３，index.htmlに追記する
こちらは、ChatGPT様に教えてもらいました。ありがとうございます。
プロジェクトの **wwwroot** ディレクトリにあるindex.htmlです。

```html:index.html
<head>
    <!-- ここにメタタグを追加します -->
    <meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests">
</head>
```

<br>

以上でhttpsへのリダイレクトが実装出来ます。
めでたしめでたし。
Docker コマンドをMakefileで短いコマンドで実行しよう

dockerのコマンドって長いと思いませんか？また複数のコマンドを1つのコマンドで同時に実行できるといいですよね．実はMakefileは非常に奥が深いが，ここでは簡単な使い方を紹介する．

詳しいMakefileの説明は以下の記事から
[鋭意製作中]

# Makefileのルール
Makefileに含まれる情報は，以下の通りである．

 - 変数の定義(変数，自動変数，暗黙の変数，特殊変数)
 - ルール
 - 他のMakefileを取得するための情報，デバッグ情報などなど

```md:Makefileの文法
ターゲット:前提条件
  コマンド
```

# 実際の例
Djangoプロジェクトであることを仮定する．`docker-compose.yml`にはプロジェクトを立ち上げるための`python manage.py runserver`が実行できるようになっているとする．

```makefile
run:
    docker-compose up -d

run/migration: run
    docker-compose exec -T web python manage.py makemigrations
    docker-compose exec -T web python manage.py migrate

stop:
    docker-compose stop

down:
    docker-compose down
```
これをプロジェクトのルートに作成して，ルートにおいて以下のコマンドを実行する．
```bash
make run
```
これで`docker compose -d`が実行されるため，`python manage.py runserver`が実行されサーバーが立ち上げる．
また，
```bash
make run/migration
```
これは**前提条件として`run`を使用している**のでサーバーの軌道からマイグレーションまで一回で行うことができる．
これでdjangoプロジェクトにおいて以下のコマンドを実行するのでマイグレーションを行うことができる．
```
python manage.py makemigration
python manage.py migrate
```

また，
```
make stop
```
これで`docker compose stop`ができる．

```
make down
```
これで`docker compose down`ができる．



このように自分でルールとコマンドを作成すれば様々なコマンドを`make hogehoge`の形で実行することができる．今回は簡単な例にしたが，プロキシを使用している場合など，実行コマンドが長かったり，実行に複数のコマンドを使用する際に非常に有用である．
AI/BI Genieスペースの信頼できるアセット(trusted assets)の活用

こちらの新機能です。

https://docs.databricks.com/ja/genie/trusted-assets.html

# AI/BI Genieとは

https://www.databricks.com/jp/product/ai-bi/genie

> AI/BI Genie は、ビジネスチームが自然言語でデータと対話するための会話型エクスペリエンスです。Genie は、組織特有のビジネス用語やデータに合わせた生成 AI を活用し、ユーザーからのフィードバックから継続的に学習します。これにより、経験豊富な同僚に質問するのと同じように質問し、企業のデータから直接的で関連性のある正確な回答を取得できます。

要は、Genieでは生成AIを活用することで日本語でデータ分析を行えるようになります。

# 信頼できるアセットとは

背後では生成AI(LLM)が動いているので、プロンプトが重要です。Ginieに指示(instruction)という形でシステムプロンプトを定義することができますが、これ以外にも以下のようなオプションがあります。

- [SQLサンプル](https://docs.databricks.com/ja/genie/index.html#provide-instructions)
- [信頼できるアセット](https://docs.databricks.com/ja/genie/trusted-assets.html)(**New!**)

マニュアルの日本語が微妙(後で直しておきます)ですが、以下のような説明となっています。

> 信頼できるアセット(trusted assets)は、予想されるユーザーからの特定の質問に回答するために作成できる[ユーザー定義のテーブル関数](https://docs.databricks.com/ja/sql/language-manual/sql-ref-syntax-ddl-create-sql-function.html#create-a-sql-table-function)です。これを活用することで、一般的な質問に答えるためのれしぽとして機能する、検証済みのパラメーター化されたSQL関数を定義できます。ユーザーによって信頼できるアセットが呼び出されるような質問をすると、レスポンスにはその旨が表示され、結果の正確性をさらに保証することができます。

# 信頼できるアセットとSQLサンプルの違い

この機能を見た時には、自分もこちらの疑問を持ちました。[こちら](https://docs.databricks.com/ja/sql/language-manual/sql-ref-syntax-ddl-create-sql-function.html#create-a-sql-table-function)に書いてありますが、自分は以下のように理解しました。

| 信頼できるアセット | SQLサンプル |
|:--|:--|
| <ul><li>該当する質問が来た際には定義されたテーブル関数を実行<li>頻繁に繰り返される質問に対して実行されることで、レスポンスの信頼性を向上</ul>  | <ul><li>Genieに文脈を与えるために指定(このような質問の際にはこのようなSQLを生成してね)<li>必ずしも指定されたSQLが実行されるわけではない</ul>  |

# ウォークスルー

[こちら](https://qiita.com/taka_yayoi/items/b7ca4df53000afe9ba02)でも使った日本のCOVID-19感染者数のデータでGenieスペースを作ります。

**Instructions**にアクセスすると、一番下に**Trusted Assets**が追加されています。
![Screenshot 2024-07-08 at 14.54.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/1f683311-697b-dc17-c8a7-789bb58e1d62.png)

よくある質問として`都道府県の数は？`と聞かれることを想定します。そのまま聞いてもSQLを実行してはくれるのですが、自明な質問なのでここで使ってみます。

関数を作成します。

```sql
CREATE
OR REPLACE FUNCTION takaakiyayoi_catalog.japan_covid_analysis.total_prefectures (
) RETURNS TABLE
COMMENT '都道府県の数に関する質問に対応
 質問例: "日本の都道府県の数は？", "都道府県は何個"'
RETURN
  SELECT 47 AS total_prefectures;
```

もっと複雑な関数もかけますが、今回は初めてということで。
![Screenshot 2024-07-08 at 14.57.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/e23c632c-0672-ebb3-3b44-cade0934b1a3.png)

この関数を信頼できるアセットとして登録します。
![Screenshot 2024-07-08 at 14.57.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/2315594d-6bc5-cfbc-229c-f3650a4e1014.png)
![Screenshot 2024-07-08 at 14.58.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/45f832fd-e949-ec75-8578-34206d6d54f6.png)

以下のような質問をします。

> 都道府県の数は？

期待した通り関数が呼び出されます。
![Screenshot 2024-07-08 at 14.59.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/91725211-9ea4-2e05-cf8c-e40b29be2a65.png)

ご活用ください！

### はじめてのDatabricks

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

### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
AWSのElasticsearch（OpenSearch）でPoint in time（PIT）が使えるのはOpenSearch 2.5からです

# AWSのElasticsearchでPITが使えない...？🤔

とあるプロジェクトでAWSのElasticsearchを使っていて、データ件数が多くなってきたためPoint in time（以降、PIT）を使いたいタイミングがありました。

[Point in time API | Elasticsearch Guide [8.14] | Elastic](https://www.elastic.co/guide/en/elasticsearch/reference/current/point-in-time-api.html)

手元のElasticsearchのバージョンがやや古かったため、ドキュメントを調べたところ7.10よりPITが導入されていることが確認できました。

[Point in time API | Elasticsearch Guide [7.10] | Elastic](https://www.elastic.co/guide/en/elasticsearch/reference/7.10/point-in-time-api.html)

ところが、7.10よりは新しいバージョンだったため実装・実行をしたのですが、エラーになりPITを使うことができませんでした。

# ElasticsearchでPITが使えるのはElastic 社独自の拡張機能群であるX-Packを導入しているから

そもそも、同じElasticsearchという名称ではあれど、Elastic社が運営するElasticsearchとAWSが運営するElasicSearchは同じOSSから派生した基本的には別モノのサービスです。
私が見ていたのはElastic社運営のElasticsearchのドキュメントでした。

※このあたりは約3年前にはいろんな話が出ていまいしたね。。。（記事の例：[AWSブログ](https://aws.amazon.com/jp/blogs/news/aws-policy-for-elasticsearch-licence-change/)）

そもそも違うものであり、その違いの一つとしてElasic社運営のElasticsearchにはX-Packという拡張機能が搭載されていますが、AWSのElasticSearchにはこれがありません。

[Set up X-Pack | Elasticsearch Guide [7.10] | Elastic](https://www.elastic.co/guide/en/elasticsearch/reference/7.10/setup-xpack.html)

Elsatic社のリリースノートをよく見ると、PITはX-Packにて導入されていることがわかりました。

> Introduce point in time APIs in x-pack basic #61062 (issues: #26472, #46523)

[Elasticsearch version 7.10.0 | Elasticsearch Guide [7.10] | Elastic](https://www.elastic.co/guide/en/elasticsearch/reference/7.10/release-notes-7.10.0.html)

これがAWSのElasticsearchではPITを使えない理由でした。

# AWSでPITが使えるのはOpenSearch 2.5から

では、AWSではPITが使えないかというとそんなことはありません。
AWS側でも対応が行われてOpenSearch 2.5以上であれば使えるとされています。

> PIT は、 OpenSearch バージョン 2.5 を実行しているドメインで使用できます。

[Amazon OpenSearch Service でのポイントインタイム検索 - Amazon OpenSearch サービス](https://docs.aws.amazon.com/ja_jp/opensearch-service/latest/developerguide/pit.html)

サポートされているオペレーションのドキュメントでも、2.5以降において `/_search/point_in_time` 等が使えることが書かれています。

[Amazon OpenSearch Service でサポートされているオペレーション - Amazon OpenSearch サービス](https://docs.aws.amazon.com/ja_jp/opensearch-service/latest/developerguide/supported-operations.html#version_opensearch_2.5)

以上です！AWSのElasticsearch（OpenSearch）でPITを使いたかったらOpenSearch 2.5以降を使いましょう！
pemキーを紛失した際の再発行方法とECSインスタンスに接続する方法

# 概要
 現在進行中の案件(2024/07/08)で、負荷試験を行う為に過去に使用したEC2インスタンスを利用する必要がありました。しかし、公開鍵および秘密鍵が存在しない為、サーバーに接続できないという問題が発生しました。この問題を解決しないとデプロイが行えず、検証が進められません。そこで、表題にも記載した通り、`pem`キーを紛失した際の再発行方法とECSインスタンスに接続する方法で負荷試験が行える環境を作成したので、その方法について備忘録も兼ねて記載します。

# 事前準備
- EC2インスタンスが立ち上がっている

# 手順
## pemキー作成
pemキーを下記の画像の設定にて作成する

![キーペア作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/664659/623a8bbc-4853-2af5-7f6c-22276548e6d5.png)


## ローカル環境にpemキーの設置と公開鍵の取得
- `pem`キーを`.ssh`ディレクトリーに設置
(コマンドで行う場合は、下記のコマンドを実行する)
```sh
mv ~/.pemが設置されている場所のファイルパス/your-key.pem ~/.ssh/
```

- `.ssh`ディレクトリに移動
```shell
cd ~/.ssh
```

- `pem`の権限を変更する
```
 chmod 400 your-key.pem
```

- 既存の`.pem`ファイルから公開鍵を抽出

```ssh
ssh-keygen -y -f ~/.ssh/your-key.pem

# 表示内容
# 下記の内容を控えておく
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQ...W6q5P7
```
- `ssh-keygen` : SSH鍵ペア（秘密鍵と公開鍵）を生成する為のコマンド
- `-y` : 秘密鍵から公開鍵を出力するv
- `-f ~/.ssh/your-key.pem` : 鍵ファイルの名前と保存場所を指定
- `~` : ホームディレクトリを示す


## EC2にユーザーデータを設定
- EC2の詳細画面から[ユーザーデータを編集]の画面を開く
<font color="red">※ EC2を事前に停止しておく</font>

![ec2の詳細画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/664659/b9bb108c-fb1f-0357-8d4e-49c0bf5cacf4.png)


- テンプレートを貼った後、[**name**]と[**ssh-authorized-key**]を埋めて保存する
（ユーザーデータに貼り付けるフォーマットは、下記に記載)


![ユーザーデータを編集.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/664659/a88ac3ea-ecc3-1542-b2f6-4e81d404f838.png)

```tex
Content-Type: multipart/mixed; boundary="//"
MIME-Version: 1.0

--//
Content-Type: text/cloud-config; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="cloud-config.txt"

#cloud-config
cloud_final_modules:
- [users-groups, once]
users:
  - name: 任意の名前(EC2で使用出来るユーザーに限る)
    ssh-authorized-keys:
    - 公開鍵を記載
```

## EC2にアクセス出来る様にする為の設定
- `ssh`コマンドにて、`EC2`インスタンスに接続する
```
# 構文
ssh -i "pemキー" ユーザー名@ec2-IPアドレス.リージョン.compute.amazonaws.com

＃入力例
ssh -i "your-key.pem" ec2-user@ec2-00-000-00-00.ap-northeast-1.compute.amazonaws.com
```

- ログインさせたいユーザのディレクトリに移動し、`.ssh`の中身を確認する
```sh
cd /home/ユーザー名/
cd .ssh/

# .sshまで一気に移動
cd /home/ユーザー名/.ssh


# 全てのファイルとディレクトリを表示
ls -a 

# ls : ディレクトリの内容をリスト表示
# -a : 全てのファイルとディレクトリを表示(隠しファイルも含める)
```


- `authorized_keys`にローカル環境で生成した公開鍵の中身を貼り付ける
※ 末尾にpemキーの名前を書く事で、何の公開鍵かわかる為、オススメ
※ 別の公開鍵が既に登録されている場合は、改行して新しく生成した公開鍵を貼り付ける
```sh
vim authorized_keys

# 生成した公開鍵を貼り付ける
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQ...W6q5P7　your-key-comment # ←　pemキーの名前を書いておく
```

- `EC2`から抜ける ([**control**] + [**c**]でも可能)
```sh
exit
```

- `EC2`インスタンスを停止
- [**ユーザーデータを編集**]の画面で登録した**ユーザーデータ**の内容を消去して保存する
- 再度、`EC2`を起動して、`ssh`コマンドを使用して、ログインしたいユーザで`EC2`にアクセスする
```sh
# 構文
ssh -i "pemキー" ユーザー名@ec2-IPアドレス.リージョン.compute.amazonaws.com
```


# 参考資料
- [[AWS公式] 最初の起動後に SSH キーペアを紛失した場合、Amazon EC2 インスタンスに接続する方法を教えてください](https://repost.aws/ja/knowledge-center/user-data-replace-key-pair-ec2)
- [キーペアを紛失または削除してしまい EC2 インスタンスに接続出来なくなった際の復旧方法](https://blog.serverworks.co.jp/how-to-connect-to-an-ec2-instance-that-has-lost-its-key-pair)
- [EC2のキーペアを紛失した時の簡単な対処法](https://qiita.com/bambis13s/items/d9470a671776013bc5bb)


# まとめ
色々と手間が多いですが、EC2を使った何らかの作業を行うと、`Linux`について詳しくなれたので、満足しております。この調子て、`Linux`の知識や知見を増やしていきたいです。
Open Searchでmapper_parsing_exceptionが発生した。

# はじめに
開発でOpen Searchを使っているのですが、その中で引っかかった内容があったためブログ記事にまとめます。

# 発生した事象
AppSyncでOpenSearchを使用したときに取得できるデータとできないデータがありました。
ログを調査したところ以下のようなエラーが発生していました。

```
"status": 400,
        "error": {
            "type": "mapper_parsing_exception",
            "reason": "failed to parse field [salesEndDate] of type [date] in document with id '3a31a493-0dd3-495d-a5e1-cbcab96e0798'. Preview of field's value: '2025/07/02'",
```

DBの日にちデータを`2025/07/02`としていたためエラーが発生していました。
日付をOpensearchが認識する形式に変換する必要があります。

```
2025/07/02 →　 2025-07-02
```
日にちのデータを「/」で持つことは多いと思うので意外な落とし穴にご注意ください！
今話題のOrbStack とは

## 概要
[公式](https://docs.orbstack.dev/)より
### OrbStackとは
OrbStack は、macOS 上でコンテナと Linux マシンを実行するための高速、軽量、シンプルな方法です。Docker Desktop や WSL に代わる強力な代替手段であり、すべてが 1 つの使いやすいアプリにまとめられています。

### OrbStackを選ぶ理由
OrbStack を選ぶ理由
⚡️超高速。2秒で起動し、ネットワークとファイル システムが最適化され、x86 エミュレーションが高速です。
💨超軽量。CPUとディスクの使用率が低く、バッテリーに優しく、少ないメモリで動作するネイティブ Swift アプリです。
🍰非常にシンプル。自動ドメイン名と移行、CLI およびコンテナ/イメージ/ボリューム ファイル アクセス、VPN および SSH サポート。
⚙️パワフル。Dockerコンテナ、Kubernetes、Linux ディストリビューションを実行します。メニュー バーからコンテナをすばやく管理します。ボリュームとイメージ ファイルを調べます。

### 料金
OrbStack はベータ版ではなくなり、有料製品になりました。フリーランス、ビジネス、商用での使用にはライセンスを購入する必要があります。

- 個人使用: 無料

- ビジネスおよび商用利用:ユーザーあたり月額 8 ドル

## インストール手順
[OrbStack をダウンロード](https://orbstack.dev/download)して開きます。インストールする必要はありません。

コマンドでもインストール可能
```shell
brew install orbstack
```

## 利用方法
```shell
docker run -p 80:80 docker/getting-started
```
デジタル庁で公開さているデザインテンプレートが便利✨

タイトル通り、デジタル庁が公開しているFigmaのデザインテンプレートが便利かつとても勉強になる内容なので紹介します！
特にWebデザイナーの方、フロント開発に関わっている方は無料ですので、一度見てほしいです！

# 公開されているテンプレート
2種類のテンプレートが公開されています。

## デジタル庁デザインシステムv1.4.3
こちらはこの後紹介するものの後方互換のために公開されているものです。

https://www.figma.com/community/file/1255349027535859598/v1-4-3

中身を開いてい見ると、デザインシステムとはなんぞやについて書かれた利用手引きやマイナンバーカード関連でよく見たものが記載されていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273072/63444974-7bc8-fdd7-698d-609b9bc05e6b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273072/286f3bd9-273d-15ce-a9ea-cb4f585dbda8.png)

他にも、各コンポーネントはこういう設計をした方がいいなど、本に書かれているような内容が無料で読めます。すごい...

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273072/1dfa4a85-f881-fd0b-914b-f9a16aaec1d5.png)

## デジタル庁デザインシステムv2.0.1

こちらは2024年7月3日に最新Versionが公開されました。

https://www.figma.com/community/file/1377880368787735577/v2-0-1

中を開いてみると1.4.3よりもすっきりとした内容になっています。
より必要なものに絞ってリリースした印象ですね。

v1.4.3のパンくずリスト
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273072/bba8a738-053a-2890-b14c-9cc33e6b8d9e.png)

v2.0.1のパンくずリスト
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273072/0a684100-2fc6-3682-15fe-13a9133340d7.png)

主に削減したものは使用や設計原則についての概要部分です。
せっかく読み応えがあったのに...。どこへいったのか？
実は各コンポーネントの上にガイドラインを見るとあるのですがこちらを押下することで、該当項目の概要を見ることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273072/16e39619-0ae3-3ce4-5ef0-e8d3550b8828.png)

実際のボタン画面のガイドラインはこちら

https://design.digital.go.jp/components/button/?tab=accessibility

とてもすっきりしていて、かつHP上で閲覧できるようになったので読みやすくなっています。とてもありがたいですね✨

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273072/f6212ff8-9286-0ead-48a2-9050d9d600da.png)

ただし、まだ多くのコンポーネントが準備中なのですべて反映されるまではしばらくかかりそうですね...

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273072/7babd292-d5b4-b041-c0be-0501974a1e3d.png)

# 感想

UI勉強のためにデザイン本、どれがいいか悩んで買うより、まずはこれ見て勉強くらい詳細に書かれていました。
今後、まだまだアップデートされていきそうですね。
Figma自体も無料で扱えるものになるので少しづつ触っていきます！
【Unity InputSystem】Scaleでのスティックの感度調節で視点がガクガクする

## 視点が何かガクガクする！
InputSyttemのScaleをいじって視点の感度調整をしようとしたらなんかガクガクする。
## 原因はゲームパッドがデスクトップ上でカーソルと連動して動いていたからでした
Steamの設定でゲームパッドがデスクトップ上でも認識されて入力デバイスとして機能していました。OFFにしたら視点ガクガクが治りました。
CloudShell VPC environment構築手順（VPC内でCloudShellの起動）

CloudShellがVPC内に建てられるようになったので試してみました。

## 概要
### CloudShellとは
AWS Management Console（ブラウザ）からアクセスできるコマンドライン環境。料金は無料(※1)で1GBのストレージが使用可能。
※1 [データ送受信料金](https://aws.amazon.com/jp/ec2/pricing/on-demand/#Data_Transfer)は別途発生。

### CloudShell VPC environmentとは
通常のCloudShellはAWSのマネージド環境で起動するため、セキュリティグループの設定でIP制限やソースにSGIDを指定している場合は通信が不可能となる。
一方CloudShell VPC environmentでは自身のVPC、Subnet内にてCloudShellの起動でき、セキュリティグループも指定が可能となる。

## 構築手順
1. 通常通りCloudShellを起動
![001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298070/7278293c-b5f9-1ed1-2824-b7fc376bf436.png)
2. [＋]ボタンか[アクション▼]を選択
![002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298070/8aefc009-9c00-671a-1f8c-d262d8710ced.png)
3. [Create VPC environment(max 2)]を選択
![003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298070/e94937af-f6c6-80b6-cc81-33988d590713.png)
4. CloudShellを起動するVPC,Subnet,SecurityGroupを指定して[Create]を選択
SecurityGroupは5つまで選択が可能

![005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298070/21d1173a-5a64-abae-5c94-795d94b12485.png)
20-30秒ほどで起動する
![006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298070/c3f2658f-fd39-019b-7e38-dec181d8bccf.png)
![007.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298070/0b820f7c-dc2d-2429-b87e-d7f3dd4439a6.png)

## 削除手順
1. [アクション▼]から[AWS CloudShell環境を削除]を選択
![008.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298070/9a88d6d3-aee7-ee18-040b-ce7c8672b508.png)
2. 確認にdeleteと入力して[削除]を選択
![009.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298070/dfd15f50-4f48-1f8e-66c5-18e17ab576c3.png)


## 備考
1. 1つのVPCで起動できるCloudShellは2つまで
![3つ目エラー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298070/cfbffd18-e182-28db-1037-651481f41098.png)
2. 同じSubnetには1つしか作成ができない
![同じSubnetエラー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298070/9757b632-cd66-75d7-96c2-2ee0cf9c977d.png)
ESP32のWiFiやBluetoothのMACアドレスを調べる方法

今回は少し時間を取らされた事があったのでメモ

よくESP32のMACアドレスを調査する方法で以下のプログラムが紹介されている。
```C
void setup(void) {
  Serial.begin(115200);
  Serial.println("-----------------");
  uint8_t macBT[6];
  esp_read_mac(macBT, ESP_MAC_BT);
  Serial.printf("%02X:%02X:%02X:%02X:%02X:%02X\r\n", macBT[0], macBT[1], macBT[2], macBT[3], macBT[4], macBT[5]);
}

void loop() {
  delay(1000);
}
```

しかしこれを実行すると以下のエラーとなる。
```
'ESP_MAC_BT' was not declared in this scope'ESP_MAC_BT' was not declared in this scope
```

どうもESP_MAC_BTがいつのころか定義されないようになっているみたいだ。
今後は以下のプログラムで確認した方が良さそうだ。

```C

#include "esp_mac.h"  // required - exposes esp_mac_type_t values

void setup() {

  Serial.begin(115200);
  while (!Serial) {
    delay(100);
  }

  Serial.println("Interface\t\t\t\t\t\tMAC address (6 bytes, 4 universally administered, default)");

  Serial.print("Wi-Fi Station (using 'esp_efuse_mac_get_default')\t");
  Serial.println(getDefaultMacAddress());

  Serial.print("WiFi Station (using 'esp_read_mac')\t\t\t");
  Serial.println(getInterfaceMacAddress(ESP_MAC_WIFI_STA));

  Serial.print("WiFi Soft-AP (using 'esp_read_mac')\t\t\t");
  Serial.println(getInterfaceMacAddress(ESP_MAC_WIFI_SOFTAP));

  Serial.print("Bluetooth (using 'esp_read_mac')\t\t\t");
  Serial.println(getInterfaceMacAddress(ESP_MAC_BT));

  Serial.print("Ethernet (using 'esp_read_mac')\t\t\t\t");
  Serial.println(getInterfaceMacAddress(ESP_MAC_ETH));
}

void loop() { /* Nothing in loop */ }

String getDefaultMacAddress() {

  String mac = "";

  unsigned char mac_base[6] = {0};

  if (esp_efuse_mac_get_default(mac_base) == ESP_OK) {
    char buffer[18];  // 6*2 characters for hex + 5 characters for colons + 1 character for null terminator
    sprintf(buffer, "%02X:%02X:%02X:%02X:%02X:%02X", mac_base[0], mac_base[1], mac_base[2], mac_base[3], mac_base[4], mac_base[5]);
    mac = buffer;
  }

  return mac;
}

String getInterfaceMacAddress(esp_mac_type_t interface) {

  String mac = "";

  unsigned char mac_base[6] = {0};

  if (esp_read_mac(mac_base, interface) == ESP_OK) {
    char buffer[18];  // 6*2 characters for hex + 5 characters for colons + 1 character for null terminator
    sprintf(buffer, "%02X:%02X:%02X:%02X:%02X:%02X", mac_base[0], mac_base[1], mac_base[2], mac_base[3], mac_base[4], mac_base[5]);
    mac = buffer;
  }

  return mac;
}

```
AWS IoT Coreについて調べてみた

# はじめに
こんにちは。開発部のMです。今回は「AWS IoT Core」についてご紹介します。

# AWS IoT Coreとは
簡単に言うと「IoTデバイスとAWS上に構築されたアプリケーション、AWSの各種サービスとの連携を簡単かつセキュアに行うマネージド型クラウドサービス」です。

# IoTCoreで提供されている主な機能
IoTCoreで提供されている主な機能の分類は下記となります。
* IoTデバイスとAWSとの接続、メッセージ送受信
* IoTデバイスからのデータ収集・処理
* IoTデバイスの運用・管理

###  IoTデバイスとAWSとの接続、メッセージ送受信
#### IoTデバイスとAWSとの接続
デバイスゲートウェイを用いてIoTデバイスからAWS IoTへの通信をセキュアかつ効率的に行うことができます。

####  AWS IoT Core メッセージングサービス
メッセージブローカーを用いてIoTデバイスとAWS IoTアプリケーションが相互に安全にメッセージを発行および受信することができます。
通信プロトコルはMQTTを直接使用するかMQTT over WebSocketを使用してパブリッシュおよびサブスクライブ(メーリングリストのような1対*へのメッセージ送信)、HTTPなどが使用できます。
※詳細は[こちら](https://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/protocols.html "AWS IoT Core メッセージングサービス")参照

### IoTデバイスからのデータ収集・処理
ルールエンジンを用いるとSQLベースの言語を使用して、メッセージペイロードからデータを選択し、データを処理して、他のサービス(Amazon Simple Storage Service(Amazon S3)、Amazon DynamoDB、AWS Lambdaなど)にデータを送信できます。
具体的にはDynamoDB テーブルを挿入、更新、または照会したり、Rulesエンジンで定義した式に基づいてLambda関数を呼び出したりできます。
※詳細は[こちら](https://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/iot-rules.html "IoTデバイスからのデータ収集・処理")参照

### IoTデバイスの運用・管理
Device Shadowサービスを用いてデバイスの状態を維持し、デバイスがオンラインであるかどうかにかかわらず、アプリケーションがデバイスと通信できるようにできます。
デバイスがオフラインの場合、Device Shadowサービスは接続されたアプリケーションのためにデータを管理します。デバイスが再接続すると、Device Shadowサービス内のシャドウの状態と同期します。デバイスは、常に接続されていない可能性のあるアプリケーションやその他のデバイスで使用できるように、現在の状態をシャドウに発行することもできます。
※詳細は[こちら](https://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/iot-device-shadows.html "IoTデバイスの運用・管理")参照

# 最後に
AWS IoT Coreを利用するとIoTを利用したシステムに必要不可欠なデバイスの接続、メッセージのルーティング、デバイスからのデータ収集や運用管理を一括で行うことができます。デバイスから取得したデータをAWSの他のサービスへ簡単に連携できるのもメリットと言えます。IoTを利用したシステムを気軽に利用したいと言う方にはピッタリのサービスです。

はつかぜ株式会社では、IT学習や業務に役立つ情報を定期的にお届けしていきたいと思っています。
システム開発のお問い合わせ・ご相談はこちら
https://www.hatsukaze.co.jp/inquire/
【簡単スケジュール設定】90日以上に1回、フロー実行する時【Power automate】

## 手を加える必要があるフローのスケジュール設定の話

Power automateにはクラウド操作の都合上なのか…
色々な制限があります…:angel_tone1:

例えば半年に１回フロー実行を行いたい時などは、
PowerAutomateの特性上フローが実行されず90日間過ぎると
フロー自体が無効化されてしまうため、
下記のスケジュール実行トリガーを半年に1回設定するだけではだめなのです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3111714/07104b86-a506-018a-63d4-ba75d158145e.png)

詳しくは下記の記事を参照ください。

https://jpdynamicscrm.github.io/blog/powerautomate/how-to-avoid-flow-expiration/

ではどうしたらいいのかというとまず、実行日を確定してあげて、

①フローを毎日実行
②今日の日付を取得
③条件のアクションを１つ追加
④②の今日の日付と実際の実行日(MM/dd)が合致していたら後続のフローへ
⑤そうでなければフロー終了

といったフローにしてあげると、
簡単に90日以上に1回スケジュール実行する時用のフローの出来上がりです！

## 実際のフロー見本

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3111714/fe3b120a-f8a2-98cc-8c7f-cf0ae99365e1.png)

```ruby:作成アクションの中身(今日)
formatDateTime(addHours(utcNow(),9),'MM/dd')
#フローをRunした日付のフォーマットをMM/ddに変更しているだけ
```

年に2回など複数実行日があるときは、条件アクションのAndをOrにして
追加ボタンをクリック、そこに実行日を追加してあげてください。

## 注意
スケジュールはこれで大丈夫ですが
コネクタも90日以上過ぎると接続が切れるので90日以上に1回のフローにめったに使わないコネクタを使用しないように注意しましょう(または定期的に、そのめったに使わないコネクタを利用するようにするかのどちらか)。

https://jpdynamicscrm.github.io/blog/powerautomate/Invalid-Connection/


短いですが、今日はこれで終わりです:wave_tone4:
Microsoft Fabric の Warehouse の所有権の引き継ぎをノートブックで実行する

## はじめに

https://learn.microsoft.com/en-us/fabric/data-warehouse/change-ownership#take-ownership-of-warehouse

により所有権を変更したいが、power shell は面倒なのでFabric ノートブック

所有権の概念はメリットがよくわからないんで本当になんとかしてほしい・・・

なお、現在このAPIで変更できるのはwarehouse のみ

:::note warn

2024/07/08時点の情報です。

:::


## コード


```python:python

import requests  

def fabric_item_take_over(workspace_id,item_type,item_id):

    pbi_token = notebookutils.credentials.getToken("pbi")
    base_path = "https://api.powerbi.com/v1.0/myorg"

    url = f"{base_path}/groups/{workspace_id}/{item_type}/{item_id}/takeover"

    result = requests.post(url,headers = {"authorization": "Bearer " + pbi_token}, data={})
    return result
   
items = [  
    {  
        "workspace_id": "URLから確認",  
        "item_id": "URLから確認",  
        "item_type": "datawarehouses"  
    }
]  
  

result = []  
  
for item in items:  
    response = fabric_item_take_over(item["workspace_id"], item["item_type"], item["item_id"])  
    result.append(response.json())  
  
print(result)  


```

workspace_id,item_idはURLから確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/a45de160-0155-7ee9-50bc-3c9f45086b70.png)


## 実行確認

このウェアハウスの所有者を変えたい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/afa80834-52d7-0285-000a-1efe05f062ec.png)

ノートブック実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/46c2e101-7a31-6b09-346f-30f40f812199.png)


結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/59b34d3c-a99d-1dee-c89d-bd3e56d091fc.png)
postgresql で shared buffer hash table corrupted が発生した 

ローカルでの開発に `docker compose` を利用していて、 `postgres` コンテナに大量データを追加していくと`SELECT` を発行した時にエラーが出るようになった。
```log
ActiveRecord::StatementInvalid: PG::InternalError: ERROR:  shared buffer hash table corrupted (ActiveRecord::StatementInvalid)
```

コンテナを再起動したりするとエラーにならない場合もある。
メモリ関連の値を変更すれば解消できるのではないかと考え、値を変更してみた。


※ 以下の対応で設定したメモリの値を適当なので、本番等では [PostgreSQLのメモリ管理を考える](https://katsusand.dev/posts/postgresql-memory/) を参考に計算する必要がある。

## 対応1 `shared_buffers` のサイズを増やす

現状のcomposeの設定内容と `shared_buffers` のサイズ。
```yaml:compose.yaml
  db:
    image: postgis/postgis:12-3.1-alpine
    ...
    volumes:
      - db:/var/lib/postgresql/data:cached
```
```bash
❯ docker compose exec -i db psql -c 'show shared_buffers;'
 shared_buffers
----------------
 128MB
(1 row)
```

まずはこのdocker イメージで利用している設定ファイルをコピーする。

```bash
docker compose run -i --rm db cat /var/lib/postgresql/data/postgresql.conf > conf/postgresql.conf
```

`shared_buffers` をとりあえず倍に増やしてvolumeにマウントする。

```diff:config/postgresql.conf
- shared_buffers = 128MB                  # min 128kB
+ shared_buffers = 256MB                  # min 128kB
```
```diff:compose.yaml
    volumes:
      - db:/var/lib/postgresql/data:cached
+      - ./config/postgresql.conf:/var/lib/postgresql/data/postgresql.conf
```

再びデータを追加していくと同様のエラーが発生する。

## 対応2 `work_mem` `maintenance_work_mem`を増やす
追加で以下の変更を行う。

```diff:config/postgresql.conf
- #work_mem = 4MB                         # min 64kB
- #maintenance_work_mem = 64MB            # min 1MB
+ work_mem = 64MB                         # min 64kB
+ maintenance_work_mem = 128MB            # min 1MB
```

今度はエラーの内容が少しだけ変わった。
```
ActiveRecord::StatementInvalid: PG::InternalError: ERROR:  shared buffer hash table corrupted (ActiveRecord::StatementInvalid)
CONTEXT:  parallel worker
```

なぜ並列実行されていて失敗してしまうのか根本原因がわからないが、並列実行を行わないように変更する。
```diff:config/postgresql.conf
- #max_parallel_maintenance_workers = 2   # taken from max_parallel_workers
+ max_parallel_workers_per_gather = 0    # taken from max_parallel_workers
```

一応これでデータは登録できた。
最終的には、 `1,146,532件` を登録できた。
その後、`max_parallel_workers_per_gather = 2` に戻しても特にエラーは出なかった。

## まとめ

ローカルでの開発向けに、メモリ数、並列実行するを変更することでデータを投入することができた。
本番稼働を見据えて、CPUの数やコンテナに割り当てるメモリ数から postgres側のメモリを計算しておく必要がある。
VSCodeでラズベリーパイ(raspberry pi)にssh接続するとVSCodeサーバーのダウンロード繰り返し続ける

## 事象
***現在Version:1.92.0以降では解消済み***

VS Code バージョン: コード 1.90.0でラズベリーパイにssh接続しようとするとダウンロードを何度も続けて先に進めない。
 - raspberry pi3
 - raspberry pi4

Version:1.91.0でも本事象は起きる。

## 追記
2024/07/10：Version:1.92.0-insiderで本事象は改善済み。
2024/08/02: Version:1.92.0で本事象は改善済み。

pi3,pi4共に接続可能となっている。

## 対処
- VS Code バージョン: コード 1.89.1にダウングレードする
- 自動でアップグレードしない様に以下設定を一時的に変更する
    - ```Ctrl+,```で設定を開く
    - ```Update:Mode```を```none```に変更する

## 詳細
- 詳細は以下を参照

https://github.com/microsoft/vscode/issues/214462
【kintone】サブテーブルの行増減を禁止する方法

# 結論
サブテーブルの行増減を禁止したい場合は以下の方法があります。
**①カスタマイズにて実装する**
**②対応するプラグインを導入する**

:::note warn
kintoneの標準機能では実装することができません。
:::

# ①カスタマイズにて実装する
サブテーブルの+/-を非表示にするカスタマイズの例です。
以下のcustomize.jsを導入すれば編集時に最上部のサブテーブルの行増減を禁止します。
```js:customize.js
(function () {
  // 編集表示時にevent実行
  kintone.events.on("app.record.edit.show", (event) => {
    // 対象サブテーブルのDOMを取得する。
    const subtable = document.getElementsByClassName("subtable-row-gaia")[0]

    // <tbody>DOMを取得する
    const tbody = subtable.getElementsByTagName("tbody")[0];

    // 対象サブテーブルのアクションボタンのDOMを取得する。
    const rows = tbody.getElementsByClassName("subtable-operation-gaia");

    // 一行ずつスタイルを変更してアクションボタンを非表示にする。
    for (let i = 0; i < rows.length; i++) {
      rows[i].style.display = "none";
    }
  });
})();
```
## 実行例
画面最上部のサブテーブルの行増減が禁止(+/-ボタンを非表示)にします。
![行増減禁止例.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850653/a28069d7-f3fa-1d69-d28a-4cc36a5ba2bf.png)

:::note info
【対象サブテーブルを変更する方法】
下記行の[0]の部分を変更することで対象サブテーブルを変更できます。
const subtable = document.getElementsByClassName("subtable-row-gaia")[0];

例)「document.getElementsByClassName("subtable-row-gaia")[1]」とする場合は上から2番目のテーブルを対象とすることができます。
:::

# ②対応するプラグインを導入する
[ステータス別サブテーブル制御プラグイン](https://qiita.com/idepenjin/items/691aa6de25d30a0300b0)を導入することで実現可能です。
本プラグインにより特定のステータス時にサブテーブルの行増減を禁止にすることができます。
![特定の条件で行増減を禁止にする.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850653/e1c1959e-f67d-e699-03a9-8ac1182bacf8.png)

# 留意事項
サブテーブルの行増減を禁止するにはDOM操作が必要になります。
DOM操作はkintoneのアップデートで予告なく変更される場合があります。
https://cybozu.dev/ja/id/6a3e8e4cfa544930dea12c84/#coding-id-class

# プラグイン販売元
紹介したプラグインは以下にて購入できます。
[ステータス別サブテーブル制御プラグイン](https://idepenshop.stores.jp/items/66816acfce75b20a6273ba47)

他にもプラグインを紹介していますので興味があればご確認ください。
[イデペンショップ](https://idepenshop.stores.jp/)