OmniAICreator/Qiita-1.07M huggingface dataset:
DRV8825 ドライバを搭載した 2x 17HS19-2004S1 ステッピング モーター用の電源は何ですか

こんにちは！

これと同様のトピックがここにいくつかあることは知っていますが、残念ながら、それらのどれにも私が探している答えは含まれていませんでした。

Arduino で 2 つのステッピング モーターを制御するプロジェクトがあります。
モーター_bb
モーター_bb
1367×2337 190KB
明らかに、Arduino 専用の別の 9V 1A 電源が存在しますが、それを回路図に含めるのを忘れていました。

ステッピング モーターは 17HS19-2004S1 20、モーター ドライバーは Pololu DRV8825 30 です。
https://www.oyostepper.it/goods-50-Motore-passo-passo-Nema-17-bipolare-18-gradi-59Ncm-2A-42x48mm-4-fili-compatibile-con-stampante-3DCNC.html
https://www.pololu.com/product/2133

モータードライバーにはヒートシンクが付いているので、各モーターに約 1.7A の電流を供給できるようにしたいと考えています (可能な限り最大のトルクは必要ありません)。
![uploading...0]()


ここでよくわからないのは、モーターにどのような電源が必要になるかということです。
これまでに計算したものは次のとおりです。
モーターのデータシートには次のように書かれています。
アンペア/位相: 2.00
抵抗/位相(オーム): 1.4 ±10%

これは、各ドライバーが供給しなければならない電力が約 5.6 ワットであることを意味します。
12V 電源を使用したいと考えており、同じ電源から両方のモーター ドライバーに電力を供給できるように、どのくらいの電流を供給できる必要があるかを計算しようとしています。
2x 5.6 ワットを供給する 12V 電源は 1 アンペア弱を供給する必要があるため、理論的には 12V 2A 電源で完全に問題ありません。

モーターあたり 2.0A ではなく 1.7A で計算全体を行うと、明らかにさらに小さくなります。

私の計算は正しいでしょうか、それとも何か足りないものや間違っているものはありますか?
また、一部のフォーラムでは、これらの計算に必要な電圧よりもはるかに高い電圧の電源を使用することを推奨しているという内容も読みましたが、その理由がよくわかりません。 12V で大丈夫ですか、それとも 24V (またはそれ以上) の電源を探す必要がありますか?

また、多少関連する質問です。 Pololu DRV8825 のドキュメントでは、ボードの近くのモーター電源の VCC と GND の間に少なくとも 47µF の電解コンデンサを配置することを推奨しています。 100µF 25V の電解コンデンサがいくつか手元にありますので、これを使用する予定です。 私が作成した回路図に示されているように、それらの 1 つを使用しても問題ありませんか、それとも DRV8825 ボードごとに 1 つ必要ですか?

ありがとう！
TinkerToolsのインストールで詰まった話（Tinker Molecular Modeling）

# TinkerToolsのインストールガイド：Cygwin、WSL、Dockerを使った方法

TinkerToolsは化学計算を行うためのパワフルなツールセットです。しかし、そのインストール方法は多少複雑で、特に日本語の情報が少ないため、ここに私の経験を基にした手順を共有します。

## 環境設定について

Windowsユーザーであれば、CygwinやWSL(Windows Subsystem for Linux)を利用することが一般的です。私は両方の方法でTinkerToolsをインストールした経験がありますが、ここではそれぞれの方法と、さらにDockerを使った方法も紹介します。

## Cygwinでのインストール

### Step 1: Cygwinのインストール

Cygwinは、Windows上でLinux風の環境を提供するツールです。以下のサイトからダウンロードして、セットアップを行ってください。

https://www.cygwin.com/

![Cygwinのダウンロードページ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456646/a0dc9b57-99ef-4c18-997d-879002d974bd.png)

### Step 2: 必要なパッケージのインストール

CygwinでTinkerToolsをビルドするために必要なパッケージをインストールします。
Step 3でつまづきましたが、FFTW関連のパッケージを全部入れたらとりあえず動きました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456646/d900b280-147a-cc58-8174-2ddc5882265d.png)


### Step 3: TinkerToolsのビルド

CygwinTerminalを **管理者権限** で実行してください。GitHubからTinkerToolsのリポジトリをクローンし、以下のコマンドを実行してビルドします。
（ルートディレクトリにしている理由は、ユーザ名にLinuxだと扱えない文字が入ることを防ぐためです。）

```bash
cd /
git clone git@github.com:TinkerTools/tinker.git
cd tinker/source
cp ../make/Makefile .
make
```

### Step 4: 環境変数の設定

Cygwinを一度閉じてもう一度開き直してください（今回は管理者権限による起動をする必要はありません）。
そうしたら以下のコマンドを入力して、環境変数を設定します。そうするとコマンドが使えるようになっているはずです。
```bash
echo "export PATH=$PATH:/tinker/source" >> ~/.bashrc
source ~/.bashrc
```

## WSLでのインストール

WSL(Windows Subsystem for Linux)を使用する方法もあります。こちらは、特にWindows 10以降のOSで推奨される方法です。

### Step 1: WSLのセットアップ

WSLのセットアップ方法はOSによって異なるため、公式のガイドを参照してください。

### Step 2: 必要なパッケージのインストール

Ubuntuなどのディストリビューションを使っている場合は、aptを使用して以下のコマンドで必要なパッケージをインストールします。

```bash
sudo apt update && apt upgrade -y
sudo apt install -y git make vim gfortran libfftw3-dev libfftw3-mpi-dev
```

### Step 3: TinkerToolsのビルド

GitHubからクローンし、ビルドを行います。管理者権限が必要な場合は適宜sudoを使ってください。

```bash
cd /
git clone https://github.com/TinkerTools/tinker.git
cd tinker/source
cp ../make/Makefile .
make
```

### Step 4:
最後に環境変数を設定します。
```bash
echo "export PATH=$PATH:/tinker/source" >> ~/.bashrc
source ~/.bashrc
```

これでコマンドが使えるようになっているはずです。

## Dockerによる環境構築

Dockerを使用すると、環境依存の問題を避けることができます。以下のコマンドでTinkerToolsが構築されたDockerコンテナを起動できます。

```bash
docker run -it sugimochi/tinker
```

ローカル環境のディレクトリをコンテナにマウントするには、以下のようにします。パスは**絶対パス**でお願いします。

```bash
docker run -it -v <ローカル環境のパス>:<コンテナ環境のパス> sugimochi/tinker
```

## 公開リンク

Docker環境の構築については、DockerHubとGitHubに情報を公開していますので、ご自由にご利用ください。


### GitHub Gist

https://gist.github.com/sugimochi97/c5d89eec986dfbd4399e8524f2201738

### DockerHub
https://hub.docker.com/repository/docker/sugimochi/tinker/general

# 参考サイト

### TinkerTools リポジトリ
https://github.com/TinkerTools/tinker
定時帰る術-GPTってなんだろうにしたかったけど、やはりわかん

まずはみんなさんGPTって何だと思う？（chatgptは別）

GPTの略称はGUID パーティションテーブルってRHEL公式HPにのっている。
名前が超わかりやすいと思って、パーティションテーブルだけで、具体的なファイルシステムがext4なのかxfsなのかはどうでもいいわけ。
設計思想もすごいなぁと思いつつ




## 実際みてみよう
「gdisk -l /dev/sda」の結果から見ていきましょう
(分かりやすいようにテーブル化にしたけど。。。面倒くさいから二度とやりません)
| Number | Start (sector) | End (sector) | Size | Code | Name |
|:-:|:-:|:-:|:-:|:-:|:-:|
|x   |  0 |  2047 |   1MiB |   |   |
|  1 |  2048 |1050623|  512.0 MiB | EF00  | EFI System Partition  |
|  2 |  1050624 | 3358719  | 1.1 GiB  | 8300  |   |
|  3 |  3358720 |  626835455 |  297.3 GiB | 8300  |   |
|  4 | 626835456  |  629143551 | 1.1 GiB  | 8300  |   |
|  x |  629143552 | 629145600  | 1MiB  |   |   |

# 前提：
①HDD容量：300GB
②LVMは使用しない
③OSインストールする際に、gptで300GBすべて使えるようにする


# セクタ計算式：300 * 1024(KB) * 1024(MB) * 1024(GB) / 512=629145600

# 開始位置と終了位置
御覧の通り開始終了位置はセクタサイズである
開始位置が「2048」になっていて、最後の終了位置が「629145600」じゃないのがおかしいと思う方もいるでしょう。
川口の推測ですが、表示されていないだけで、実際は↓ではないかと
sdaの前後にパーティションテーブルが隠され、1MiBで占用されてると思われる。


# パーミッション作成
なんかgdiskはfdisk、partedより使いやすいきがする

開始位置は勝手に計算してくれるし、終了位置は「+5G」にみたいな感じで指定できるので、親切なと思う。
例：
[root@localhost ~]# gdisk /dev/sdb
GPT fdisk (gdisk) version 1.0.3

Partition table scan:
  MBR: not present
  BSD: not present
  APM: not present
  GPT: not present

Creating new GPT entries.

Command (? for help): p
Disk /dev/sdb: 20971520 sectors, 10.0 GiB
Model: VBOX HARDDISK
Sector size (logical/physical): 512/512 bytes
Disk identifier (GUID): 7B6B64FF-F2C3-47E7-9941-3029FF41458B
Partition table holds up to 128 entries
Main partition table begins at sector 2 and ends at sector 33
First usable sector is 34, last usable sector is 20971486
Partitions will be aligned on 2048-sector boundaries
Total free space is 20971453 sectors (10.0 GiB)
Number  Start (sector)    End (sector)  Size       Code  Name

Command (? for help): **n**
Partition number (1-128, default 1):
First sector (34-20971486, default = 2048) or {+-}size{KMGTP}:
Last sector (2048-20971486, default = 20971486) or {+-}size{KMGTP}: **+2048M**
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300):
Changed type of partition to 'Linux filesystem'

Command (? for help):**p**
Disk /dev/sdb: 20971520 sectors, 10.0 GiB
Model: VBOX HARDDISK
Sector size (logical/physical): 512/512 bytes
Disk identifier (GUID): 7B6B64FF-F2C3-47E7-9941-3029FF41458B
Partition table holds up to 128 entries
Main partition table begins at sector 2 and ends at sector 33
First usable sector is 34, last usable sector is 20971486
Partitions will be aligned on 2048-sector boundaries
Total free space is 16777149 sectors (8.0 GiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048         4196351   2.0 GiB     8300  Linux filesystem

# 最後
誤操作しないよう、隠されているのが理解はできるけど、なんか表示させる手段がないよう
（どこかにバックアップして、hexdumpで確認していく記事が多く見られるけど、説明とのっている結果が全然違うのもあって、すごいなぁと思って。自分と同じく適当にやっていることヤツもいるんだなぁ）
ということでもし簡単に確認できる方法があったら、まだ投稿しようとおもっている。面白そうだから。
#3【勉強メモ】エヴァンス本からざっくり理解するDDD

## 目標
・ふわっとした理解のDDDについて[エヴァンス本](https://www.amazon.co.jp/%E3%82%A8%E3%83%AA%E3%83%83%E3%82%AF%E3%83%BB%E3%82%A8%E3%83%B4%E3%82%A1%E3%83%B3%E3%82%B9%E3%81%AE%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E9%A7%86%E5%8B%95%E8%A8%AD%E8%A8%88-Architects%E2%80%99Archive-%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E9%96%8B%E7%99%BA%E3%81%AE%E5%AE%9F%E8%B7%B5-%E3%82%A8%E3%83%AA%E3%83%83%E3%82%AF%E3%83%BB%E3%82%A8%E3%83%B4%E3%82%A1%E3%83%B3%E3%82%B9/dp/4798121967/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=17W0M5YAY0R9Z&dib=eyJ2IjoiMSJ9.qtIEGNumTF4Fq3OG4r7BcgPPpMccQaiAMFjoQiYsRfAUl2LJ3kucBAwXJG1pE1-9MMyozf_R6XnUk8kwhpkIPyRMzsu94DrC82a2cWHXn2TDjembTcFwG0z4uuYeu7EY_VF_p_KcGaJhu-sFQP2IfF8BXdAN9RWcUsZLGOA8hIhkuAKrptA3cagpPrF5ZoxXjjZ9ctVxNzHN-qanc6enklCzFiHeCY1UpXho238Cgd4eMsXlRTbQ5u_T9ZSbUOj5EOjKzf1jx0xSJbTwFJrRetDuJaorGcsbbNpAuJkvNAs.F3zE4YfUXPLj7DRzsSV4wM07EgTKoLqmpU491uMjIhw&dib_tag=se&keywords=%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E9%A7%86%E5%8B%95%E8%A8%AD%E8%A8%88&qid=1710421495&sprefix=%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E9%A7%86%E5%8B%95%E8%A8%AD%E8%A8%88%2Caps%2C279&sr=8-1)を通して体系的に学習する
・各章の要約をアウトプットすることで知識を定着させる

## 前回の記事
第2章の内容は以下でまとめています。

https://qiita.com/kotemendo2819/items/c990d60210259f2ad44a

## 【第３章】モデルと実装を結びつける
### `モデル駆動設計`
分析モデルと設計を結び付け、両目的に応用できる単一モデルをもとに設計すること。
その結びつきがなければモデルにほとんど価値はなくなる。ユビキタス言語を用いる。

### `モデリングパラダイムとツールによるサポート`
##### ・オブジェクト指向プログラミング
モデリングパラダイムに基づいて概念的なオブジェクトモデルを実装に落とし込むことができる。

### `骨格を見せる：なぜモデルがユーザーにとって重要なのか?`
モデルがユーザー活動に関係するドメインを反映していることで、
ユーザーの誤解を招くようなモデルを排除し設計の骨格をはっきりとさらけ出すことができるから。

### `実践的モデラ`
モデルに貢献する人(≒コードの変更に対して責任を負う人)は誰でも、一定時間コードに触れ
コードを通してモデルを表現することを習得しなければならない。
⇨知識豊かなモデルを開発するため

## 【まとめ】
DDD文脈でのオブジェクト指向の位置付けや、コードを学ぶ重要性を学ぶことができた。
第1部は全3章とコンパクトで全体的なDDDの概念を中心に解説されていた。
次章以降の第２部ではこの概念をつかったより具体的な設計手法を学んでいく。

https://qiita.com/kotemendo2819/items/4ec669c809ceccef0bf6

参考になったらいいねやコメントおまちしています！！
Spring Boot で作ったアプリをフリー枠で Web に公開（Render利用）

Spring Boot で作ったアプリをフリー枠で Web に公開したいと思い調べてみた
Render （ https://render.com/ ）というクラウドサービスが見つかったので簡易的にやった時のメモを記載する
Heroku の無料枠がなくなってからなかなか見つからなかったので代替になるかも．．．
やったことの大枠は以下の感じ

- SpringBoot の簡易アプリを Github にリポジトリ登録
    - Dockerfile を直下におく
- Render から Github 連携して公開

# SpringBoot の簡易アプリを Github にリポジトリ登録
作成したアプリは本当に簡易なやつです．．．
https://github.com/sueasen/springboot-demo2

Render でデプロイした時に動くように Dockerfile をプロジェクト直下に置いてます

```Dockerfile:Dockerfile
FROM maven:3-eclipse-temurin-17 AS build
COPY ./ /home/app
RUN cd /home/app && mvn clean package -Dmaven.test.skip=true
FROM eclipse-temurin:17-alpine
COPY --from=build /home/app/target/springboot-demo2-0.0.1-SNAPSHOT.jar /usr/local/lib/demo.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "/usr/local/lib/demo.jar"]
```

# Render から Github 連携して公開

- Render にアクセス・ログイン（アカウントは Github 連携で作ると楽そう）
    https://render.com/

- Get Start For Free をクリック    
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51758/8c790325-e1c7-79ea-7dd7-468aef2b05df.png)

- New Web Service をクリック    
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51758/eec606be-d551-8a14-f16a-6321af6bc4fe.png)

- Github のリポジトリ接続
    Public のやつならリポジトリの URL 入力すればOK
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51758/39a13de4-c7e5-ae5f-b672-d7910c91787c.png)

- 設定で Instance Type を Free にして Create Web Service をクリック
    フリーだと512MB(RAM), 0.1CPU
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51758/194c7191-8460-80e9-81a7-6567916b0e37.png)

- ビルド始まるので終わるのをまつ！
    ステータスが Live になれば終了
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51758/9876e687-3e9d-76c7-f479-869a82357bdf.png)

- リンクをクリックしてWebアプリ開けばOK
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51758/b96eeac8-334a-e61b-4ec9-0721b709c922.png)
IstioをInjectするとDocker in Dockerでネットワークに繋がらなくなる

# はじめに

# 問題

以下のコマンドでDinDでコンテナを立てて、外部のネットワークにアクセスするようにｓていました

```
$ docker run -it deno:latest bash
$ curl google.com
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/0aa27584-7921-dc02-9fde-1b77d2797741.png)

これはうまくいっていました
このあと、`Istio`をサイドカーとして導入することにしました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/23b531b2-d733-963b-e0c5-282686753620.png)

するとなぜか通信ができなくなってしまいました

# 解決方法

docker runのときに`--network host`をつけることで通信できるようになりました

```
$ docker run --network host -it denoland/deno:latest bash
```

# おわりに

詳しい方の勘所がすばらしくて助かりました
よく起きそうな話なので注意がひつようです
WebGL で色を操りたいときに頭の中で考えていること

## この記事の概要

WebGL は CSS ではできないような複雑な色の表現ができます。
しかし、その自由度ゆえに思い通りの色を出すのが難しいとも言えそうです。

私も最初は大苦戦したのですが、この記事にあるような仕組みを想像できるようになってからは多少マシになりました。
大した実力ではありませんが、自分の備忘録を兼ねて投稿します。

## 白黒 - 単一の値

いきなりフルカラーで考えると難しいので、分かりやすいように白黒で原理を説明します。

ある白黒の分布があり、そこに単一の数値を加算または減算する場合は次のようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214677/89ff9766-ce0a-c195-53aa-5dd02338398d.png)

すべてのピクセルに対して一様に値を足します。
計算の結果、1 より大きな値になっても 1 のまま（真っ白）、0 より小さな値になっても 0 のまま（真っ黒）の見た目です。

---

次に、単一の値を乗算または除算する場合です。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214677/d30c0b23-9afd-0576-074c-fbcfa6053bf3.png)

仕組みは先ほどと同様です。

## 白黒 - 複数の値

色の操作をしたいときは、今描画されている色に対して、ベット作ったノイズやらグラデーションやらを合成するときが多いです。

つまり、ピクセルごとに加算したり乗算したりの値が変わります。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214677/890c6154-0084-825d-a2ee-fa569fdb1a0f.png)

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214677/ccfe0743-a981-06fb-56f2-5841728f6a81.png)

1px ずつすべての結果を予想するのは難しいですが、`画面の中心にいくほど赤みを強めたい` など大まかな変化のルールを言語化して、それにあわせて合成する色や計算方法を選ぶ必要があります。

## カラー

白黒で理屈を理解した上で、フルカラーを考えます。

RGB すべての値に同じ値を足したり掛けたりすることもありますが、それだと色相を変化させることはできません。

今ある色を RGB で分解したものを想像して、それぞれに対してどのように処理するかを考える必要があります。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214677/cc65b1c5-09dd-84d5-6157-7dc2b6c05d7b.png)

上記の図はそれぞれの色成分に、個別で単一の値を合成しています。
もちろん、複数の値を合成してピクセルごとに加工することもできます。

## 最後に

慣れないうちは、とりあえず値を足したり掛けたりして、それっぽい見た目が出力されるまでひたすら運試しみたいな取り組み方をしていました。

一様な色やグラデーション、各種ノイズなどを個別に考え、レイヤーごとに合成するようなイメージで考えるようにしたら多少は狙った色が出せるようになりました。

少しでも参考になれば幸いです。
laravel10での独自ヘルパ関数

Geminiや検索で色々ヘルパー関数を独自で作るにはどうすればいいか調べていたが、composer.jsonの編集無し、AppServiceProvider.phpの編集もせずに割と簡単に行くことがわかったので誰かの役に立つかもしれないので書いておく

<ul>
<li>appフォルダの中にHelperフォルダを作る</li>
<li>その中にファイルを作る(ここではhelper.php)</li>
</ul>

helper.php
```
namespace App\Helpers;

function sayHello(){
    echo 'Hello World!';
}
```
これをviewやcontrollerファイルで呼び出す際は名前空間とともに記載すれば作動した
```
App\Helpers\sayHello()
```
これで動く

相当時間掛かって調べていたが、composer.jsonを編集する必要無いのが楽
Apacheとは

### はじめに
業務でApacheを使用しているが、Apacheについて理解が浅かったため記事を作成する。
今回調べてApacheが理解できていなかったというより、そもそもサーバーについてしっかりと理解できていなかったことが分かった。

### 結論
Apacheとはwebサーバーにインストールされているソフトウェアのことで、webブラウザから来たリクエストに対して処理を行いその結果を返すもの。

### サーバーとは
サーバーとは元々は、普段自分たちが使用しているpcとなんら変わりはなく、Apacheなどのなにかしらのサーバーのソフトウェアがインストールされることで、サーバーと呼ばれるものになる。

### ホームページが表示される流れ
ホームページを見ようとすると、まずWebブラウザからホームページのファイルが置いてあるコンピュータ（Webサーバ）に対して指定のページを求めるリクエストが投げられる。
それに対し、WebサーバからWebブラウザに指定されたページのファイルパスが返される。
受け取ったWebブラウザは、そのパスに置かれているページを表示する。
そこで、リクエストを受け取りページのパスを返す仕事をしているのがwebサーバーのソフトウェア、つまりApache。

### まとめ
Apacheとはサーバーにインストールされているソフトウェアのこと。
また、そのApacheなどのサーバソフトウェアがインストールされていないと、そもそもサーバーと呼ばれるものにならない。

[参考サイト]
・https://wa3.i-3-i.info/word12465.html
ECSからTimestreamのデータを読み出す

# はじめに

ECS 上で動かしている Next.js から Timestream のデータを読み出すのに、認証周りでいろいろと苦労したので成果をここに残します。

当初は個人のアクセスキーを使っていたのですが、これだと自分ひとりしか使えないので困っていましたが、コンテナに適切なタスクロールを付与することで解決できました。

Next.js に限らず ECS 上から JavaScript(TypeScript) で Timestream にアクセスする場合には、同じような設定でいけるのではないかと思います。

# 環境

- Next.js (TypeScript) + AWS SDK for JavaScript v3
- Amazon ECS
- Amazon Timestream

# Next.js から Timestream の呼び出し

今回は Route Handlers 内に実装しました。

`fromContainerMetadata` が、コンテナ内の特殊な URI から ACCESS_KEY_ID や SECRET_ACCESS_KEY 等を取得しているようで、Client Components では動かせません。

サンプルコードなのでエラーハンドリング等は省略しています。

```typescript
import { NextResponse } from 'next/server'
import { TimestreamQueryClient, QueryCommand } from '@aws-sdk/client-timestream-query'
import { fromContainerMetadata } from '@aws-sdk/credential-providers'

const query = 'SELECT * from "DB"."Table" LIMIT 10'

export const GET = async () => {
  const timestreamClient = new TimestreamQueryClient({
    region: 'ap-northeast-1',
    credentials: fromContainerMetadata(),
  })

  const data = await timestreamClient.send(new QueryCommand({ QueryString: query }))

  return NextResponse.json({ data })
}
```


# ロール作成

ECS のコンテナが Timestream にアクセスする権限を付けたロールを作成します。

IAM で「ロールを作成」を選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1814940/36758da5-bede-28b5-71c7-f46adfabeec8.png)

ユースケースで Elastic Container Service Task を選び、次へをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1814940/f02e5bc4-52b1-21cb-7a13-5d14ee5d843a.png)

許可ポリシーで自分に合わせたポリシーを選びます。
私の場合ここではポリシーは選ばず、この後インラインポリシーで厳しい制限を付けたポリシーを作成しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1814940/3c213582-bcdf-7b08-aa2d-99191674dc26.png)

好きな名前を付けて次へ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1814940/1f1aab6c-6f5d-72cc-284e-e339036e8c1f.png)

## インラインポリシー

もっと細かくカスタマイズしたポリシーを作るためにインラインポリシーを作成します。

作成したロールを開き、「許可を追加」から「インラインポリシーを作成」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1814940/a9649fe0-0669-4250-4063-aa9a75454d5e.png)

「アクションをフィルタリング」に Timestream と入力して、Timestream のアクションに絞り込みます。
今回は Select だけを行えればよかったので、`DescribeEndpoints` と `Select` にチェックを入れます。
またデータベースやテーブルも限定したかったので、リソースは「特定」を選び、データベースとテーブルを指す ARN を入力しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1814940/b3237b42-50da-ecd7-6335-3ca4c39b02bc.png)

分かりやすいポリシー名を付けて作成。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1814940/a0a94c30-c366-7bba-7dd4-cb4d038b1d65.png)

# タスク定義

ECS のタスク定義で、タスクロールの値に先ほど作成したロールを当てはめます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1814940/7d52c170-68b5-75a9-f891-f0677385306d.png)

----

参考: https://zenn.dev/luma/articles/bd3c59b3d7682d
#2【勉強メモ】エヴァンス本からざっくり理解するDDD

## 目標
・ふわっとした理解のDDDについて[エヴァンス本](https://www.amazon.co.jp/%E3%82%A8%E3%83%AA%E3%83%83%E3%82%AF%E3%83%BB%E3%82%A8%E3%83%B4%E3%82%A1%E3%83%B3%E3%82%B9%E3%81%AE%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E9%A7%86%E5%8B%95%E8%A8%AD%E8%A8%88-Architects%E2%80%99Archive-%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E9%96%8B%E7%99%BA%E3%81%AE%E5%AE%9F%E8%B7%B5-%E3%82%A8%E3%83%AA%E3%83%83%E3%82%AF%E3%83%BB%E3%82%A8%E3%83%B4%E3%82%A1%E3%83%B3%E3%82%B9/dp/4798121967/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=17W0M5YAY0R9Z&dib=eyJ2IjoiMSJ9.qtIEGNumTF4Fq3OG4r7BcgPPpMccQaiAMFjoQiYsRfAUl2LJ3kucBAwXJG1pE1-9MMyozf_R6XnUk8kwhpkIPyRMzsu94DrC82a2cWHXn2TDjembTcFwG0z4uuYeu7EY_VF_p_KcGaJhu-sFQP2IfF8BXdAN9RWcUsZLGOA8hIhkuAKrptA3cagpPrF5ZoxXjjZ9ctVxNzHN-qanc6enklCzFiHeCY1UpXho238Cgd4eMsXlRTbQ5u_T9ZSbUOj5EOjKzf1jx0xSJbTwFJrRetDuJaorGcsbbNpAuJkvNAs.F3zE4YfUXPLj7DRzsSV4wM07EgTKoLqmpU491uMjIhw&dib_tag=se&keywords=%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E9%A7%86%E5%8B%95%E8%A8%AD%E8%A8%88&qid=1710421495&sprefix=%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E9%A7%86%E5%8B%95%E8%A8%AD%E8%A8%88%2Caps%2C279&sr=8-1)を通して体系的に学習する
・各章の要約をアウトプットすることで知識を定着させる

## 前回の記事
第1章の内容は以下でまとめています。

https://qiita.com/kotemendo2819/items/9d1bdfd4b3408b0c4ec2

## 【第２章】コミュニケーションと言語の使い方
##### ・ユビキタス言語
ドメインモデルを元にした共通言語。
ユビキタス言語への献身がチームのコミュニケーションをソフトウェアの実装と結び付け役立つモデルの開発につながる。

### `声に出してモデリングする`
ユビキタス言語ベースのシナリオや会話を通して、もし単語や文法の違和感を感じればそれをモデルに反映できる。

### `1つのチームに1つの言語`
言語の仕切りをドメインエキスパートとエンジニアの間に置くのではなく、
ユビキタス言語を用いることで相互理解が深まり、モデル概念に磨きがかかる。

### `ドメインと図`
シンプルなUML図によって、オブジェクトの関係性や名前をチームに共有しながら対話を進めることができる。
しかし本質的なオブジェクトの理解はコードにおいて捉えなければならない。(モデルとコードが結びついているため)

### `書かれた設計ドキュメント`
ドキュメントではコードや会話の補助をすることに焦点をあて、最小限に留めなければならない。

### `実行可能な基盤`
ユビキタス言語を用いたモデリングによって変更が加えられたメソッドは、
メソッド名や変数名等もふるまいと矛盾しない宣言に修正しなければならない。

### `説明のためのモデル`
ドメインに関する一般的な知識についての学習目的であれば、ソフトウェア設計と関係しない別種のモデルを通して
コミュニケーションをとることは有効である。
例)スコープが限られたドメインを例にすることでモデルをわかりやすく伝えることがでる。

## 【まとめ】
ユビキタス言語ベースでのコミュニケーションがモデルやソフトウェア設計にどのような有効性を与えるか、
またユビキタス言語をうまく活用する方法について学ぶことができた。
第３章ではモデルと実装を結びつけについて理解していく。

https://qiita.com/kotemendo2819/items/4b476034ba358077b6ae

参考になったらいいねやコメントおまちしています！！
Db2 on Windowsで別ユーザーでCREATE DBをする

Db2 on Windowsを導入し、その際にdb2adminというローカルユーザーが作りました。しかしながら、WindowsにログインしているADユーザーには、CREATE DBの権限がありませんでした。

```
C:\Program Files\IBM\SQLLIB\BIN>db2 "CREATE DATABASE BLUDB ON C:  USING CODESET UTF-8 TERRITORY JP COLLATE USING IDENTITY"
SQL1092N  このユーザー ID には要求されたコマンドまたは操作を実行する権限がないため、要求されたコマンドまたは操作が失敗しました。 ユーザー ID: "ADUSER1"。
```

また、テストをしたパソコンではローカルユーザーでのログインが禁止されていたため、db2adminではOSにログインができませんでした。そのため、db2adminで「DB2のコマンド・ウィンドウ」を起動する必要がありました。



「DB2のコマンド・ウィンドウ-管理者」を右クリックし、「詳細」＿「ファイルの場所を開く」で開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/92e9c5a3-38c0-7b14-042b-f18ce5f08e85.png)

「DB2のコマンド・ウィンドウ-管理者」をシフトキーを押しながら右クリックし、「別のユーザーとして実行」を選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/23bc142d-6d83-bb3a-f1d9-cc252d3fed95.png)

ユーザーとパスワードを入力して「db2admin」でログインします。ローカルユーザーなので「.\db2admin」でユーザー名を指定してログインします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/fa733169-cd50-a01c-d089-f88b41691418.png)

db2adminとして動作しているコマンドウィンドウなので「CREATE DB」が可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/e0eef529-eac4-4477-6839-17a0bbc6c624.png)


# 参考にした記事

Db2 Community EditionをWindows 10に導入してSAMPLEデータベース作成でハマった話 #db2 - Qiita 
https://qiita.com/tsunogai/items/c374650cb6f183385d68

runasというコマンドを使うという方法が紹介されていました。

# テスト環境
* Db2　11.5
* Windows 11
【Power Apps】Dataverse 大量のレコードを一括削除する方法

# 概要
テストデータや不要になった大量のデータを一括で削除したい時に便利な方法。
スケジュール設定も可能なので、定期的に自動実行を行い不要なデータを減らすことで容量管理にも役立ちます。

# 方法
**(1) Power Apps のページ、右上の歯車 [設定] > [詳細設定] をクリック**

**(2) タイトルにある [設定] のシェブロンを開き、[データ管理] > [レコードの一括削除] をクリック**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3719434/f078427c-4920-1157-2733-da49d1e94959.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3719434/9279e9cf-ecb3-4715-54ed-26694015ce10.png)

  
**(3) [新規] をクリックすると一括削除ウィザードの画面が開くので [次へ] をクリック**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3719434/c008163e-e2b4-c76b-3fee-bdcd4268c232.png)

**(4) [検索：] から削除対象のテーブルを選択**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3719434/8299f9bf-3f78-9397-8a8d-147d6a1de571.png)

**(5) 検索条件の指定**

条件設定をしたい場合は、[選択] をクリックし条件設定後、[次へ] をクリック
全行削除したい場合はそのまま下の [次へ] > [OK] をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3719434/04cf2ff6-ef56-b47a-fbed-26aa7fe8a017.png)

:::note info
レコードのプレビューで検索条件に一致したレコードの確認が行えます
検索条件を入力せずにプレビュー実行した場合は全行が抽出されます
:::

**(6) オプションの選択**
"名前"と"一括削除ジョブの開始時刻"は設定必須
ジョブの実行間隔(任意設定)は`7・30・90・180・365日`から選択可能

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3719434/6b31c672-e1aa-997e-2b0c-5ea6118699f4.png)

**(7) 最終確認と送信**
最後に設定した内容が確認表示されるので、問題なければ [送信] をクリック
設定時刻になると一括削除ジョブが実行されます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3719434/f112487e-48a2-b448-c246-f5e16ffc0771.png)
---
GitHubでCODEOWNERSを設定して強制的にレビュー文化を作ろう

# GitHubでCODEOWNERSを設定して強制的にレビュー文化を作ろう

## 目標

GitHubで`CODEOWNERS`を設定してチーム開発において強制的にレビュー文化を作ろう。

## CODEOWNERSの概要

> CODEOWNERS ファイルを使い、リポジトリ中のコードに対して責任を負う個人あるいは Team を指定できます。

引用：https://docs.github.com/ja/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/about-code-owners#example-of-a-codeowners-file

## 参考

https://docs.github.com/ja/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/about-code-owners

## 設定方法

リポジトリに`.github`ディレクトリを作成してその下に`CODEOWNERS`というファイルを追加するだけ。

```bash
.github/
├── CODEOWNERS # これを追加
├── PULL_REQUEST_TEMPLATE.md
└── workflows
    └── auto-assign-author.yml
```

正しく指定できていると、`GitHub`から該当ファイルを見ると成功アラートのようなものが表示される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1262857/60689aea-8509-cc7d-7bf3-405454ba4e7c.png)


### CODEOWNERS

例えば、リポジトリ内のすべてのファイル変更に対して`CODEOWNERS`を指定するには次のように記述する。

```
# ref <https://docs.github.com/ja/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/about-code-owners>

* @kattakaha
```

ほかにもすべての`go`ファイルに関して指定する場合は

```
*.go @kattakaha
```

などで指定できる。もちろん、特定ディレクトリ配下のみに`CODEOWNERS`を指定することも可能。

`CODEOWNERS`の設定ファイルの記述方法に関して、詳しくは[公式ページ](https://docs.github.com/ja/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/about-code-owners#example-of-a-codeowners-file)をご覧ください。

## 作用

`CODEOWNERS`を設定すると、チームのメンバーがPull Requestを作成したときに自動的に指定された`CODEOWNERS`に対してレビューが要求されるようにできる。
Pythonで「文字列の全体がパターンとマッチするか調べる(Pattern.fullmatch)」の動作を確認してみた

# 概要

Pythonで「文字列の全体がパターンとマッチするか調べる(Pattern.fullmatch)」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/python/regex/index6.html

# 実装

以下のファイルを作成しました。
```sample.py
import re

def checkMatch(msg, pat):
    pattern = re.compile(pat)
    result = pattern.fullmatch(msg)
    if result :
        print(result.group(0))
    else :
        print('Don\'t matched')

checkMatch('東京都港区赤坂', r'東.*区')
checkMatch('東京都港区赤坂', r'東.*坂')

import re

def checkMatch(msg, pattern, start, end):
    result = pattern.fullmatch(msg, start, end)
    if result :
        print(result.group(0))
    else :
        print('Don\'t matched')

msg = '東京都港区赤坂'
pattern = re.compile(r'港区')

checkMatch(msg, pattern, 0, 5)
checkMatch(msg, pattern, 3, 5)
```

以下のコマンドを実行しました。
```
$ python3 sample.py 
Don't matched
東京都港区赤坂
Don't matched
港区
```

# まとめ

何かの役に立てばと。
Pythonで「文字列の先頭位置からパターンとマッチするか調べる(Pattern.match)」の動作を確認してみた

# 概要

Pythonで「文字列の先頭位置からパターンとマッチするか調べる(Pattern.match)」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/python/regex/index5.html

# 実装

以下のファイルを作成しました。
```sample.py
import re

def checkMatch(msg, pat):
    pattern = re.compile(pat)
    result = pattern.match(msg)
    if result :
        print(result.group(0))
    else :
        print('Don\'t matched')

checkMatch('東京都港区赤坂', r'東京.')
checkMatch('東京都港区赤坂', r'港.')

import re

def checkMatch(msg, pattern, start, end):
    result = pattern.match(msg, start, end)
    if result :
        print(result.group(0))
    else :
        print('Don\'t matched')

msg = '東京都港区赤坂'
pattern = re.compile(r'港区')

checkMatch(msg, pattern, 0, 7)
checkMatch(msg, pattern, 3, 7)
```

以下のコマンドを実行しました。
```
$ python3 sample.py 
東京都
Don't matched
Don't matched
港区
```

# まとめ

何かの役に立てばと。
Guix の初期インストールで uid と shell を変更する

# はじめに

Guix をインストールしては削除を繰り返して、概ね仕組みがわかってきたので、いろいろ試す。
最近の Linux のディストリビューションはユーザを作成すると uid が 1001 から始まるものが多いが昔のシステムは 501 のものも多く、アップデート、アップデートで生きながらえさせてきたので uid を 501 にしたかった。
ついでに、シェルを最初から zsh にする。

# ユーザの uid とシェルを変更する

インストールの最後の config.scm の確認時に編集して以下のように変更する

```diff
--- config.scm.orig     2024-03-15 17:43:21.149610892 +0900
+++ config.scm  2024-03-15 17:43:44.439990988 +0900
@@ -9,7 +9,7 @@

 ;; Indicate which modules to import to access the variables
 ;; used in this configuration.
-(use-modules (gnu))
+(use-modules (gnu)(gnu packages shells))
 (use-service-modules cups desktop networking ssh xorg)

 (operating-system
@@ -23,6 +23,8 @@
                   (name "foo")
                   (comment "foo")
                   (group "users")
+                  (uid 501)
+                  (shell (file-append zsh "/bin/zsh"))
                   (home-directory "/home/foo")
                   (supplementary-groups '("wheel" "netdev" "audio" "video")))
                 %base-user-accounts))
```
Reactにおけるフォーム送信のハンドリングとページ再読み込みの防止

ウェブアプリケーションでは、フォーム送信は基本的なユーザーインタラクションの一つです。従来のフォーム送信プロセスがページの再読み込みを引き起こすことは、特にシングルページアプリケーション(SPA)では望ましくありません。

本記事では、Reactでフォーム送信イベントをハンドルし、不要なページ再読み込みを防止する方法、そしてReact Hook Formを使用した実装方法について説明します。

## 関数コンポーネントによる実装
関数コンポーネントを使用してフォーム送信イベントをハンドルし、デフォルトの送信アクションをキャンセルする基本的な方法は以下の通りです。

```tsx
import React from 'react';

function MyForm() {
  const handleSubmit = (event) => {
    event.preventDefault(); // ページの再読み込みを防止
    // ここにフォーム送信時のカスタム処理を記述
  };

  return (
    <form onSubmit={handleSubmit}>
      <input type="text" name="username" />
      <button type="submit">送信</button>
    </form>
  );
}

export default MyForm;
```
このコードでは、フォームの送信ボタンが押された際に`handleSubmit`関数がトリガーされ、`event.preventDefault()`を呼び出してページの再読み込みを防止します。

## React Hook Formを使用した実装
React Hook Formは、フォームのバリデーションや送信処理を簡単にするためのライブラリです。

React Hook Formを使用したフォームの送信処理は、以下のようになります。

```tsx
import React from 'react';
import { useForm } from 'react-hook-form';

function MyForm() {
  const { register, handleSubmit } = useForm();

  const onSubmit = data => {
    console.log(data); // フォームのデータを処理
  };

  return (
    <form onSubmit={handleSubmit(onSubmit)}>
      <input name="username" ref={register} />
      <button type="submit">送信</button>
    </form>
  );
}

export default MyForm;
```

この例では、`useForm`フックから得られる`handleSubmit`をフォームの`onSubmit`プロパティに渡しています。

`handleSubmit`は、フォーム送信イベントをハンドルし、内部で`event.preventDefault()`を呼び出してページの再読み込みを防ぎます。

さらに、バリデーションが成功した場合にのみ`onSubmit`コールバックを実行します。

## まとめ
`event.preventDefault()`を適切に活用することで、Reactアプリケーションにおけるフォーム送信時のページ再読み込みを効果的に防止できます。

React Hook Formを使用すると、フォームのバリデーションと送信処理が簡単かつ効率的になり、開発者はフォームの送信ロジックにより集中できるようになります。

これらの方法は、シングルページアプリケーションのユーザーエクスペリエンスを向上させるのに貢献します。
Cannot find name "MediaStreamTrackProcessor" "MediaStreamTrackGenerator" というエラーがでて困った時の対処方法

# TL;DR;
TypeScriptの使用するときにMediaStreamTrackProcessorがないよ、と言われて込まったときは@types/dom-mediacapture-transformを追加する

# 現状(2024.3)
2024年3月時点ではMediaStreamTrackProcessorはWorking Draftの段階で、それを使うかどうかって話なのですが、Chromeでは実装されてるので使ってみたいところです
しかしまだDraftでもあってTypeScriptに取りこまれたわけではないので、以下のコードを書くとエラーになります
```typescript
const main = async() => {
    let videoProcessor:MediaStreamTrackProcessor<VideoFrame>;
    let audioProcessor:MediaStreamTrackProcessor<AudioData>;
    const stream = await navigator.mediaDevices.getUserMedia({
        video: true,
        audio: true,
    });
    videoProcessor = new MediaStreamTrackProcessor({track: stream.getVideoTracks()[0]})
    audioProcessor = new MediaStreamTrackProcessor({track: stream.getAudioTracks()[0]})
}

main()
```

エラー
```
src/main.ts:3:24 - error TS2304: Cannot find name 'MediaStreamTrackProcessor'.
。。。
```
定義がないということです。定義書けばいいということですが、辛いです
定義どこかにないのっていうのも探すの辛かったです、というのが、この記事の趣旨です

https://www.w3.org/TR/mediacapture-transform/

# 解決法
型定義モジュールを追加しましょう
```
$ yarn add --dev @types/dom-mediacapture-transform 
```
依存するwebcodecsの定義もいれてくれます、よかったですね!
https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/dom-mediacapture-transform

# まとめ
MediaStreamTrackProcessorとMediaStreamTrackGeneratorをTypeScriptで使用するためには型定義のモジュールが必要になります
DraftとはいえGoogleがいれてきてるので近い将来の利用頻度も増えるとは思います
今のうちから利用したい!という時の解決になることもあるかもしれないので、記事にしました
(for me)

過去を考えるとJavaScriptでStream使うのかっていうのは時代を感じざるをえません
Goで重複削除したスライスを作成する

Go の slice で、重複をする項目を除外したい時があり、その実装をしたので方法を書き留めます。

# int 型のスライスで重複している値を削除する

map を用いて重複の削除を行います。

map の key に slice の値を設定し、value に bool を設定します。
同じ key の場合は上書きで値が更新されるため、一度 true を設定することで、それ以後重複を除いた新たな slice に追加しなければ、重複除外が可能です。

```golang
package main

import "fmt"

func deleteDuplicate(slice []int64) []int64 {
	uniqueCheck := make(map[int64]bool)
	newSlice := []int64{}

	for _, i := range slice {
		// 重複している場合uniqueCheck[i]の値はtrueのためスキップされる
		if !uniqueCheck[i] {
			uniqueCheck[i] = true
			// 1度目のkey設定のときのみ重複除外用のsliceに追加する
			newSlice = append(newSlice, i)
		}
	}

	return newSlice
}

func main() {
	slice := []int64{1, 3, 5, 7, 7, 2, 3, 9, 6, 5, 9, 10, 1000, 3, 8}
	fmt.Printf("%+v", deleteDuplicate(slice)) // [1 3 5 7 2 9 6 10 1000 8]
}
```

## bool の代わりに空の構造体を使用する

bool 値の代わりに、空の構造体 struct{}を使用すると、余分なメモリを確保せずに実装が可能です。

```golang
package main

import "fmt"

func deleteDuplicate(slice []int64) []int64 {
	uniqueCheck := make(map[int64]struct{})
	newSlice := []int64{}

	for _, i := range slice {
		// uniqueChec[i]でmap内でkey(i)の存在チェックを行う
		if _, exists := uniqueCheck[i]; !exists {
			uniqueCheck[i] = struct{}{}
			newSlice = append(newSlice, i)
		}
	}

	return newSlice
}

func main() {
	slice := []int64{1, 3, 5, 7, 7, 2, 3, 9, 6, 5, 9, 10, 1000, 3, 8}
	fmt.Printf("%+v", deleteDuplicate(slice)) // [1 3 5 7 2 9 6 10 1000 8]
}
```

# 参考

- [Go の slice で重複を削除する](https://ema-hiro.hatenablog.com/entry/20170712/1499785693)
【ServiceNow】Now Assist④～ライセンス～

# はじめに
Now Assistについて、
[<font color="Blue">【ServiceNow】Now Assist①～Generative AI全体像～</font>](https://qiita.com/Nanase_Ariyama/private/b6370fa046f075c26830 "【ServiceNow】Now Assist①～Generative AI全体像～")
[<font color="Blue">【ServiceNow】Now Assist②～導入してできること(エンドユーザ/エージェント向け)～</font>](https://qiita.com/Nanase_Ariyama/private/c86acd49f58e4fd59bde "【ServiceNow】Now Assist②～導入してできること（エンドユーザ / エージェント向け）～")
[<font color="Blue">【ServiceNow】Now Assist③～導入してできること（開発者向け）～</font>](https://qiita.com/Nanase_Ariyama/private/19dcb5b32b53a108a2a0 "【ServiceNow】Now Assist③～導入してできること（開発者向け）～")
と、シリーズでまとめた記事も最後の記事となりました。

最後の記事となる本記事では、Now Assistを導入するために必要な**ライセンス**についてまとめていきたいと思います。

# ライセンス
#### エンドユーザ・エージェント向け機能の導入
※[<font color="Blue">【ServiceNow】Now Assist②～導入してできること(エンドユーザ/エージェント向け)～</font>](https://qiita.com/Nanase_Ariyama/private/c86acd49f58e4fd59bde "【ServiceNow】Now Assist②～導入してできること（エンドユーザ / エージェント向け）～")で紹介した機能

**■ITSMでNow Assistを使用する場合**
ITSM Professional か ITSM Enterpriseを契約の上で、
ITSM Professional Plus か ITSM Enterprise Plusのライセンス購入が必要となります。

**■CSMでNow Assistを使用する場合**
CSM Professional か CSM Enterpriseを契約の上で、
CSM Professional Plus か CSM Enterprise Plusのライセンス購入が必要となります。

**■HRSDでNow Assistを使用する場合**
HRSD Professional か HRSD Enterpriseを契約の上で、
HRSD Professional Plus か HRSD Enterprise Plusのライセンス購入が必要となります。

:::note warn
ITSMとHRSDの両方を使用している場合、
どちらもProfessional Plus あるいは Enterprise Plus に合わせる必要があります。
:::

#### 開発者向け機能の導入
※[<font color="Blue">【ServiceNow】Now Assist③～導入してできること（開発者向け）～</font>](https://qiita.com/Nanase_Ariyama/private/19dcb5b32b53a108a2a0 "【ServiceNow】Now Assist③～導入してできること（開発者向け）～")で紹介した機能

**Creator Plus**というライセンスの購入が必要になります。

:::note warn
開発者１ユーザごとにライセンスの購入が必要です。
:::

# おわりに
Now Assistシリーズ最後となる本記事では、Now Assist導入のためのライセンスについてまとめました。
本記事から閲覧したという方は、是非最初の記事から目を通していただければと思います。

今年の秋頃には日本語対応するようですし、今後も生成AIに関する機能拡張がされるとのことなので、引き続きチェックしていけたらと思います。楽しみですね。

＜これまでの記事＞
[<font color="Blue">【ServiceNow】Now Assist①～Generative AI全体像～</font>](https://qiita.com/Nanase_Ariyama/private/b6370fa046f075c26830 "【ServiceNow】Now Assist①～Generative AI全体像～")
[<font color="Blue">【ServiceNow】Now Assist②～導入してできること(エンドユーザ/エージェント向け)～</font>](https://qiita.com/Nanase_Ariyama/private/c86acd49f58e4fd59bde "【ServiceNow】Now Assist②～導入してできること（エンドユーザ / エージェント向け）～")
[<font color="Blue">【ServiceNow】Now Assist③～導入してできること（開発者向け）～</font>](https://qiita.com/Nanase_Ariyama/private/19dcb5b32b53a108a2a0 "【ServiceNow】Now Assist③～導入してできること（開発者向け）～")
APNGの再生タイミングを任意で行う

`gif` でも `Lottie` でもなく、 `apng` で実装。

1つ目を再生→数秒終了したままの1つ目を表示→1つ目を非表示＆2つ目を再生 
のような動きを繰り返し行うようにしたい…。

まず最初に「再生タイミング」と「終了タイミング」ってどうするのか、というところから考えて、 `js` で制御はできないのか、と試すことに。

## apng-canvas.js

https://github.com/davidmz/apng-canvas

以前使用していた `apng-canvas.js`、`APNG非対応ブラウザ`[^1]で表示する際に使用していました。
それもあって、一度こちらで対応してみようとしたのですが、再生→停止→再度再生できるようにはならず。
`APNG.parseBuffer` の項目にあった `rewind()` を使って、`APNG` のアニメーション終了に合わせて再度再生を行おうと思ったのですが、止まる位置にズレが多く、また終了タイミングもうまく取れなかったため、別の方法はないかと探すことになりました。


※一度だけアニメーションを動かすだけの場合であればこちらで大丈夫かと思います。
確か`npmパッケージ`登録がされていないプラグインになるので、`cdn`で読み込む必要があります。

## apng-js

https://github.com/davidmz/apng-js

上で記述した `apng-canvas` を作成された方が、別のプラグインも作成されていました。
こちらだと再生・一時停止・停止など、`apng` をコントロールできるイベントが多く、思った通りの動きはできそうでした。

README に記述してある通りにまずは書いてみました。
```javascript:index.js
import parseAPNG from 'apng-js';

const img = 'xxx.png'
const apng = parseAPNG(img);
```
エラーが出てしまい、動きません。
<a href="https://github.com/davidmz/apng-js?tab=readme-ov-file#parseapngbuf-arraybuffer-apngerror">README</a> を見ると、 `parseAPNG` の引数は画像のURLなどではなく、画像のバイナリデータを入れる、とのことです。バイナリデータ…？

https://ja.javascript.info/arraybuffer-binary-arrays

いろいろな記事を参考にしつつ、以下のように書いてみました。

```javascript:index.js
import apngJs from 'apng-js/lib/index.js'

const parseAPNG = apngJs.default;

const getImgBuffer = (url) =>
	new Promise(async (resolve) => {
		const blob = await fetch(url).then((res) => res.blob());
		const reader = new FileReader();
		reader.readAsArrayBuffer(blob);
		reader.onload = () => {
			resolve(reader.result);
		};
	}
);

async function createAPNGPlayer(_target, _options = {}) {
  const imgBuffer = await getImgBuffer(_target.src);
	const apng = parseAPNG(imgBuffer);
	Object.keys(_options).forEach((key) => {
		apng[key] = _options[key];
	});

	await apng.createImages();
 
    // 画像のバイナリデータを利用し、canvas に反映させるため、canvas は必須
    // JS で作成しなくても、html に書いてあるものを使っても良い
    const ctx = document.createElement('canvas');

	ctx.width = apng.width
	ctx.height = apng.height
 
    _target.appendChild(ctx);

    const player = await apng.getPlayer(ctx.getContext('2d'));
	return player;
}

(async () => {

    // 1つ目
    const img = document.querySelector('.img');
	const apng = await createAPNGPlayer(img);

    // 2つ目
    const img2 = document.querySelector('.img2');
	const apng2 = await createAPNGPlayer(img2);

    // apng の再生
    apng.play();

    apng.on('end', () => {
        apng.stop();
        apng2.play();
    });

    apng2.on('end', () => {
        apng2.stop();
        apng.play();
    });

})();
```

これで最初に希望していた動きを実装することができました。
あとは再生してみて適宜 `settimeout`などを挟んで調節して終わります。

`apng` をこうやって扱うこと自体、そこまでなさそうではあります。
ですが、条件が色々と重なった結果使うこともあるかなと思い、記事に残しておきます。~~もしかしたら自分もすっきり忘れたころに見ながら対応するかもしれない。~~



## 参考にさせていただいた記事

https://juejin.cn/post/6983583063049666568

https://www.zhangxinxu.com/study/202109/apng-pause-stop-play-demo.php

https://qiita.com/soarflat/items/1a9613e023200bbebcb3


[^1]:2024年3月15日現在、主要なブラウザは apng に対応しています。
https://caniuse.com/?search=apng
マイグレーション、DB周りの便利なコマンド集

## はじめに
スクールの課題で、タスク管理アプリを作成しているときにマイグレーションファイルに記載している内容が、`$ rails db:migrate`してもschemaファイルに反映されないことがあり、マイグレーションの復習も兼ねてアウトプットします。修正や追加等ありましたら、コメントいただけるとありがたいです。

## 環境
・MacBookAir 13インチ M1(2020)
・OS：Sonoma 14.3
・メモリ：16GB
・Rails： version 6.1.7.6

## マイグレーションとは？

データベースの中にテーブルを作成するするために必要なもの。マイグレーションファイルを使用してデータベーススキーマに変更を反映させる仕組みです。RailsのマイグレーションファイルはRubyのプログラムで書き実行します。

**テーブルの作成**、**カラムを追加・削除**、**インデックスの追加**、**スキーマに対するあらゆる変更**は、都度マイグレーションファイルを作成してスキーマに反映するという流れをとる。したがって、データベーススキーマの変遷の歴史がマイグレーションファイルとして残ります。

※この仕組みの長所は、データベーススキーマの状態を任意の地点まで戻せる点です。例えば、アプリケーションのコードに変更を加えた後、何らかの事情でコードをある地点まで戻したい時、その途中でデータベーススキーマへの変更が行われていたとしても、マイグレーションファイルを参照して、任意の地点まで元に戻すことができます。
作り方は大きく２種類あります。

### 1. `rails g model`コマンドでモデルを作成
```ruby
rails g model [model名] [属性名1:データ型1] [属性名2:データ型2] ... 
```

このコマンドでモデルを作成すると、対応するマイグレーションファイルが一緒に生成されます。例えば、String型のname属性, Integer型のage属性を持つUserモデルを作成したい場合は、`$ rails g model user name:string age:integer`となります。モデルを作成する時、対応するテーブルが必要なことがあらかじめ分かっている場合は、この方法でマイグレーションファイルを作成すると楽。

### 2. `rails g migrate`コマンドでマイグレーションファイルだけを単独で作成
```ruby
rails g migrate [マイグレーションクラス名]
```
モデルを作成したあとでテーブルを作成する場合や、テーブル作成以外のマイグレーションファイルが必要な場合はこちらを使うことになります。


## マイグレーションを実行
```ruby
$ rails db:migrate
== 20200713120627 CreateUsers: migrating ======================================
-- create_table(:users)
  -> 0.0203s
== 20200713120627 CreateUsers: migrated (0.0204s) =============================
```

## DBやマイグレーション周りの便利なコマンド集
### マイグレーションがどこまで進んでいるか確認

```ruby
$ rails db:version
#versionを確認する。
#　例：Current version: 20171112122350
#　version: 20171112122350実行している場合↑

$ rails db:migrate:status
#migrationの適用状態を表示
```

### **ロールバック**

```ruby
$ rails db:rollback  
#1つ前のファイルの状態まで戻す。

$ rails db:rollback STEP=○

#現在地を含めた○個前までなかったことにしてくれる
#つまり○+1個前のファイルまで実行された状態
```


```ruby
rake db:migrate VERSION=0
#最初のバージョン（０）に戻す場合。VERSIONを指定するとその件数分、戻す。

rails db:migrate:down VERSION=20221003050833
#VERSIONに指定されたmigrationをdownにする
```


```ruby
$ rails db:abort_if_pending_migrations
#どのファイルが作られていないか知りたい時。
```

### マイグレーションファイルを作成

```ruby
$ rails db:migrate

$ rails db:migrate:up VERSION=20221003050833
#VERSIONに指定されたmigrationをupにする
```


### 番外編(**rails db:reset、rails db:migrate:reset、rails db:setup etc..**
)
```ruby
$ rails db:reset
```
新しくテーブルを作り直して、さらにシードファイルも読み込んでダミーデータも作ってくれる。新しくテーブルを作り直すので、既存のデータは全て消えて新たにシードファイルを元に作り直す。db:drop、db:create、db:schema:load、db:seedをまとめて実行するコマンド。


```ruby
$ rails db:migrate:reset
```
新たにテーブルを作り直すので、テーブルのデータはもちろん全部消える。※ここは、`$ rails db:reset`と同じ。
シードファイルは読み込まないので、新しいダミーデータは生成されない。（$ rails db:seedは自分で実行する必要がある）
rails db:drop、rails db:create、rails db:migrateをまとめて実行するコマンド。


```ruby
$ rails db:setup
```
アプリケーションのDB周りの初期設定をしてくれる。以下３つのコマンドを実行してくれる。
1. $ rails db:create
2. $ rails db:schema:load
3. $ rails db:seed


```ruby
$ db:drop
```
DBを削除する。
Git Checkoutでローカルの変更が全部ぶっ飛んだ時の対応

## VSCodeを使っている場合の解決策
誰もが少なくとも一回は経験したであろうGitの誤操作でデータぶっ飛ぶ問題、VSCode利用者のための最強の解決策を見つけてしまったかもしれません。

半月ほど前から初めてチーム開発を始め、Gitを勉強しながらコーディングし続ける日々の中、その出来事は起こりました。

チームメンバーの一人のプルリクエストでマージコンフリクトが発生し、解決しなければならない！すかさずGitHub Desktopをダウンロードしブランチを切り替えるがマージコンフリクトのエディタが見つからない。さあここでVSCodeを開いて、彼のブランチをcheckoutする。ローカルの変更をスタッシュ？何だそれ？ポチッ。
あれ？何かがおかしいぞ。ん？今日作ったはずのチャット画面が消えている。もしやこれは…

てなシチュエーションです。調べてみると、Gitはコミットした地点に巻き戻すことはできるが、コミットしていなかったらもう復元不可、ただしVSCodeユーザーには抗う術が与えられています。Git Checkoutと関連して記事が書かれていないので、備忘録も兼ねて今回共有することにしました。

解決策はとてもシンプルで、VSCodeのコマンドパレットで、**Local History: Find Entry to Restore**というコマンドを実行するだけです。

![Screenshot 2024-03-15 at 16.03.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3104453/99c3792e-b35e-c2ca-7632-08ab16cd969c.png)

これを実行したら、ファイルの検索画面が出てくるので、復元したいファイル名を検索しましょう。


![Screenshot 2024-03-15 at 16.15.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3104453/04f661a5-a435-5833-24e8-e7b65fd49827.png)

復元したいファイル名が出てきたらそれを選択してエンター、もしくはクリックしてください。

![Screenshot 2024-03-15 at 16.17.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3104453/fa70ea20-17ed-2cf0-fe46-d7b1fdcd0d4d.png)

こっから復元したいセーブ日時を選ぶと、右に現在のファイル、左に選択したセーブ日時のファイルが表示されます。

![Screenshot 2024-03-15 at 16.19.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3104453/9ffcd227-7d46-3071-66cf-eed917b4fd1b.png)

いつもVSCodeに助けられてばかりですね。もうNeoVimに乗り換えようとか言うのやめます。
MLOpsとは何か、なぜ必要なのか？

ビジネスは、景気の浮き沈みを乗り越えながら進めていかなくてはなりません。こうした様々な状況に対応できるAI戦略を構築するには、本番環境でのモデルの展開、モニタリング、再トレーニングのためのシステムが必要です。戦略の転換や環境の変化に即座に対応するために、新しいモデルを迅速に導入、テスト、トレーニング、実装できることが重要となります。これが MLOpsです。あらためて、MLOpsを定義してみます。MLOpsとは何でしょうか？

![figure-climbing-ladder.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1196881/46170964-d3d1-03d1-a718-982396c6fd15.jpeg)

## MLOpsとは何か、なぜ必要なのか？
モデルベースの機械学習とAIは、すべての大企業で急速に主流になりつつあるテクノロジーです。そのメリットを最大限に享受するためには、モデルを本番稼動させる必要がありますが、それを大規模に実施すれば新たな課題が生じます。MLOpsを定義するには、既存のDevOpsや[DataOps](https://www.dataiku.com/product/key-capabilities/dataops/)の専門知識だけでは不十分だと理解する必要があります。

そこで、機械学習のライフサイクル管理の標準化と合理化である[MLOps}(https://www.dataiku.com/product/key-capabilities/mlops/)の出番です。MLOpsは、ライフサイクルから摩擦を取り除くことを目的としています。「MLOpsとは何か」という問いに対する答えは、単にDevOpsを機械学習に適用したもの、という単純なものにはなりません。実際に、機械学習のライフサイクルを大規模に管理することが困難である主な理由は3つあります：

1: DevOpsとは対照的に、AIツールの状況は非常に断片化されており、常に変化している。
2: AIを大規模に運用することはチームスポーツですが、すべての人が同じ言語を話すわけではない。3: 機械学習のライフサイクルには、ビジネス、データサイエンス、ITの各チームの人々が関わっている。しかし、それぞれのチームやメンバーは同じツールを使っておらず、同じ基本スキルを共有していない場合が多い。

(ほとんどの）データサイエンティストは、ソフトウェアエンジニアでもデータエンジニアでもない。ほとんどの場合、モデルの構築と評価に特化しており、モデルの展開と保守の専門家とは限らない。しかし、多くの場合、データサイエンティストが行っている。


## 効率的な機械学習運用の構築
強力な機械学習の運用を構築する機械学習モデルの管理プログラムは、次のような疑問に答えることを目的としています：

- モデルを開発・選択する際、どのようなパフォーマンス指標を測定するのか？モデルが堅牢で、バイアスがなく、安全であることをどのように確認するか？
- モデルの性能は、ビジネスでどのレベルまで許容可能か？
- 本番の機械学習モデルのパフォーマンスとメンテナンスに誰が責任を持つかを定義しているか？
- モデル・ドリフト（モデル性能の劣化）を考慮した機械学習モデルの更新はどのように行うのか？アラートが来たときに、モデルを簡単に再学習させることができるか？
- デプロイするモデルや機械学習プロジェクトの信頼性を高めるには？
- めまぐるしく変化するAI環境におけるビジネスニーズに対応するため、機械学習プロジェクトを迅速に展開するにはどうすればよいか？
- モデルの劣化や予期せぬ異常なデータや予測を検出するために、長期にわたってモデルをどのように監視するのか？
- モデルはどのように監査され、開発チーム以外の人にも説明できるようになっているか？
- AIのライフサイクルに沿って、モデルやプロジェクトをどのように文書化しているか？

これらの質問は、機械学習モデルのライフサイクルの範囲に及びます。これらの回答はデータサイエンティストだけでなく、企業全体の人々を巻き込むことになります。これは、MLOpsが単なるツールやテクニックの話ではないことを示しています。MLOpsとは、分断を取り払ってコラボレーションを促進することで、継続的で再現可能かつ摩擦のないAIライフサイクルを軸に、機械学習プロジェクトで、効果的なチームワークを可能にすることです。データサイエンスと機械学習を効率的に拡張し、[Everyday AI](https://www.dataiku.com/everyday-ai/)を実現するだけでなく、ビジネスにリスクを与えない方法で行います。

![Screenshot 2024-02-28 at 2.13.01 PM.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1196881/653430ba-2b30-cbed-9fe6-f9a6bf34e9c2.jpeg)


適切な[MLOpsプラクティス](https://blog.dataiku.com/the-7-myths-of-mlops)を実施せずにデータサイエンスを導入しようとするチームは、特に今日の予測不可能で前例がなく絶えず変化する環境において、モデルの品質と継続性の問題に直面するでしょう。また、MLOpsのプラクティスを導入していないチームは、品質の低下よりもさらに悪いことに、ビジネスに実際に悪影響を与えるモデル（例えば、偏った予測を行い、会社に悪い影響を与えるモデル）を導入してしまうリスクがあります。


## MLOpsプロセスから摩擦を取り除く
MLOpsプロセスから摩擦を取り除き、モデルのプロセスを信頼し、アジャイルで統制されたものにし、最終的にモデルとアナリティクスからより多くの価値をより迅速に提供できるようにするにはどうすればよいでしょうか？[この25分](https://content.dataiku.com/removing-friction-mlops)の動画でその方法を学べます。

原文: [What Is MLOps?](https://blog.dataiku.com/what-is-mlops-why-does-it-matter)
Blazor サーバー側アプリからプログラムでログアウト

# アプリケーションテンプレートのデフォルトログアウトメニュー項目の問題
認証を実装する Blazor サーバー側アプリを作成するとき、既定のアプリケーションテンプレートのサイド メニューには、ユーザーがサインアウトできるようにするログアウト メニュー項目があります。

デフォルトのログアウトのメニュー項目は、サーバー側で適切なサインアウトをさせるため必要な **POST** リクエストをユーザーが送信できるようにする送信ボタンを備えたフォームで実装されています：
```html
    <form action="Account/Logout" method="post">
        <AntiforgeryToken />
        <input type="hidden" name="ReturnUrl" value="@currentUrl" />
        <button type="submit" class="nav-link">
            <span class="bi bi-arrow-bar-left-nav-menu" aria-hidden="true"></span> Logout
        </button>
    </form>
```

### 問題
問題のは、UI コンポーネント フレームワークを使用してアプリを構築するとき、ボタンコンポーネントがメニューコンポーネントの中で正常に表示されない(たとえば、メニュー項目の中にボタンが全幅ではなくまたは中央揃えではない)またはまったく表示されません！

## プログラムでログアウト
ログアウトをプログラムで実装する解決策は、**JavaScript** を使用して **HTML** フォームを送信することです。

1. まず、生成されたページ上の **JavaScript** と対話できるようにするために、ページに **JavaScript** ランタイム インターフェイスを挿入する必要があります：
    ```csharp
    @inject IJSRuntime JsRuntime
    ```
2. **HTML** フォームはそのままでまた使用しますが、ボタンを外します：
    ```html
    <form action="Account/Logout" method="post" id="logoutForm">
        <AntiforgeryToken />
        <input type="hidden" name="ReturnUrl" value="@currentUrl" />
    </form>
    ```
3. ログアウトをトリガーするために **Blazor** コードから呼び出す **JavaScript** 関数を作成します：
    ```html
    <script>
        window.triggerLogout = () => document.getElementById('logoutForm').submit();
    </script>
    ```
4. **Razor** ページのコード セクションで、ランタイムを使用して **JavaScript** 関数を呼び出す **C#** 関数を作成します：
    ```csharp
    @code {
        // ...
        private async void TriggerLogout() => await JsRuntime.InvokeAsync<object>("triggerLogout");
    }
    ```
5. **Razor** ページから **C#** 関数を呼び出します。

それだけです。
Salesforce認定アドミニストレーターを受験することになったから過去問を解いてアウトプットしていこうと思う。Q101 ~ Q110

## Q101. 取引先に対して各人が貢献した努力のレベルに基づいて, 商談チームメンバーにクレジットを与えたい. どの機能を使用すればよいか？

A. リストビュー
B. キュー
C. 商談分割
D. ステージ

解答: C
### 解説
商談の収益や予想収益をメンバー間で分配し, それぞれの貢献度に応じてクレジットを割り当てたい場合に商談分割を使用する.

## Q102. ユーザーを無効にできない理由を2つ挙げてください.

A. ユーザーはカスタマーコミュニティ管理者
B. ユーザーは, ワークフローの電子メールアラートの受信者
C. ユーザーは, 進行中の商談の所有者
D. ユーザーアカウントは凍結されている

解答: A, B
### 解説
ユーザーを無効にするには, 考慮すべき条件がある. 特に, システム上で重要な役割を担っていたり, 特定のプロセスに不可欠なユーザーを無効にすることは, 制限される場合がある. このような背景から, AとBが解答になる.
Aのユーザーが無効にされると, コミュニティのメンバー管理やコンテンツの公開など, コミュニティの運営に支障が出てしまう.
Bのユーザーが無効にされると, 電子メールアラートの自動化されたプロセスに障害が生じる可能性がある. もし, Bのユーザーを無効にしたいなら,　適切な受信者への変更が必要.

CやDも, ユーザーを無効にすることはできるが, 今回の設問では2つを選ぶことに限定されているので,　この中でも特に考慮すべき条件のあるAとBが適切ということになると思う.

-- メールアラート設定 --
https://daigirin.com/email-alert/

## Q103. SalesforceMobileアプリを, 会社の固有の画像と配色で構成したい. 管理者はどのブランドオプションのセットを使用すればよいか？

A. 個々のページの色, 複数の読み込みページのロゴ
B. ページのロゴ, ブランドの色, ページの色を読み込む
C. タブの色, アクションの色, ページのロゴの読み込み
D. ページの色, アクションの色, ページのロゴを読み込む

解答: D
### 解説
AとBではアクションの色について触れていなくて, Cではページの色に触れていない. A~Dの中で, より包括的なのはDである.

-- Salesforce モバイルアプリケーションのブランド設定のカスタマイズ 公式ヘルプ --
https://help.salesforce.com/s/articleView?id=sf.salesforce_app_customize_branding.htm&type=5

## Q104: 複数のキャンペーンレコードを1つの商談に関連づけるにはどうすればよい？

解答: キャンペーンインフルエンスを商談の関連リストに表示する
### 解説
キャンペーンを用いたマーケティング施策を導入する際, 商談とキャンペーンを紐づけて作業を円滑にするために, キャンペーンインフルエンスを活用する.

-- キャンペーンインフルエンスについて　ーー
https://daigirin.com/function_marketing_campaign-influence/

## Q105. マーケティングチームのためにレコードをインポートした. 管理者は一部のレコードがデータローダでインポートされていないことに気づいた. 管理者は, 失敗することなくデータをインポートするために何をするべきか？

解答: インポートを実行する前に, 検証ルールを非アクティブ化する
### 解説
検証ルールを設定したにも関わらず, それを非アクティブにしてデータを保存したいというシナリオには, 一時的なビジネスプロセスの変更や緊急のデータ修正などがある. しかし, 基本的には検証ルールの非アクティブかは行わない, または慎重に行う必要がある. というのも, データの整合性や品質を維持するために検証ルールを使用するからである.

## Q106. Salesforce for Outlookを使用する際、入力規則が適用されるのはいつ？

解答: レコードが保存されるたび, いつも
### 解説
入力規則が適用されるのは, OutlookからSalesforceにレコードを同期(保存)する時. 

## Q107. どのマーケティング活動が商談を獲得するのに役立っているかを知りたい. 管理者は何を構成すればよいですか？

解答: キャンペーンインフルエンス

### 解説
キャンペーンとは, それぞれのマーケティング活動によって発生した見込み客の連絡先や反応, 商談数と結果, 獲得できたセールスパイプランなどを詳細に追跡するためのツールである.

キャンペーンインフルエンスとは, 商談獲得に貢献しているマーケティング活動を追跡・分析するための機能.

-- キャンペーン --
https://www.ccc.seraku.co.jp/service/columns/salesforce/02/95/

## Q108. ナレッジの2つの機能とは何？

A. ナレッジは新しい記事ごとにソリューションを自動的に作成する.
B. ナレッジはデータカテゴリーとロールを使用して, 記事を特定のユーザーに表示する.
C. ナレッジにより, 組織はパートナーポータルユーザーと記事を共有できる.
D. ナレッジはすべてのデータカテゴリーにわたって単一の記事タイプのみを許可する.

解答: B, C
### 解説
Salesforceナレッジは、個人が持っている有益な知識や事例を集約し, 必要な時に必要な場所で共有することが出来るオブジェクトのこと.

Bについて, 記事の可視性とアクセス制御を細かく管理するためにデータカテゴリーとユーザーロールを活用する. これによって組織は特定の記事を適切なユーザーグループにのみ公開することができるようになる.

Cについて, Salesforceナレッジでは組織内だけでなく, パートナーポータルやカスタマーポータルのユーザーともナレッジ記事を共有することができる. これは, パートナーや顧客に対して重要なトラブルシューティングガイドを提供するために特に有効である. 

## Q109. 管理者はレポートフォルダを共有できない. その理由は？

解答: フォルダは非公開
### 解説
非公開フォルダーのレポートやダッシュボードは, どのような時でも作成者以外には表示されない.

## Q110. 管理者は顧客が問題について電話をかけた時にサービス担当者が同じ一覧の質問をするのに役立つ画面フローを作成した. この画面はケースから見えるはずです. 画面フローはどのように分散する必要がありますか？

解答: ライトニングページ
### 解説
管理者が作成した画面フローをライトニングページに埋め込むという方法が効果的である. このアプローチによってサービス担当者はケースを扱う際に必要な情報や手順を素早く参照できるようになる.