OmniAICreator/Qiita-1.07M huggingface dataset:
エレキ素人が何か考える（その４：フォトカプラとトランジスタ）

# フォトカプラとトランジスタとの組み合わせ
今回はフォトカプラとトランジスタとを組み合わせしてみた。

## フォトカプラ
入力部と出力部とが電気的に絶縁しているのが特徴。この点では、[その２](https://qiita.com/infinite1oop/items/b611974fa752555ffe1b)で紹介したリレーと似ている。ここでは、秋月電子で20円で購入した[TLP785](https://akizukidenshi.com/catalog/g/gI-07554/)を使う。

## トランジスタ
[その１](https://qiita.com/infinite1oop/items/0079873305c5402b82a2)と同じNPNトランジスタ2N3904を利用。ここでは、トランジスタのスイッチング機能を用いる。

## やること：LEDの消灯
### まずはフォトカプラなし（トランジスタのみ）
ボタン（タクトスイッチ）を押したらLEDが消灯する回路を考える（押されていないときはLEDが点灯）。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/854e5d7a-2e57-0c70-5f19-b8c02426b7e0.jpeg", width=70%>
上図のトランジスタピンは、左から、エミッタ、ベース、コレクタとなっている。コレクタにLEDと220ohmとが、ベースに10Kohmの抵抗、ボタンと電源との間に10Kohmの抵抗が接続されている。

#### 実験
ボタンを押していないときは、LEDが点灯する。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/e222388d-8050-57ab-993e-4c6e43853d59.jpeg", width=40%>
押しているときは、LEDが消灯し、トランジスタがスイッチングとして機能している。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/a45eeb0c-ad79-ae1a-f6cf-92b88ead81c2.jpeg", width=40%>

### フォトカプラとトランジスタとを組み合わせ
で、ここからが本題。ボタンの代わりに、フォトカプラを利用してOn/Offを制御する。回路は次のようなもの。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/eaf3ea1d-2203-96ca-c83a-37d266883996.jpeg", width=70%>
上図の左に見える白い部品がフォトカプラである（用いた部番とは異なるが）。Arduinoのピン7とフォトカプラとの間には、10Kohmの抵抗が接続されている。あとの部品は先ほどの図と同じ。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/1a8ec961-964e-ba15-3bb6-34e0afdc75e2.png", width=100%>


#### ソースコード
```c++
#define PIN 7

void setup() {
  pinMode(PIN, OUTPUT);
}

void loop() {
  digitalWrite(PIN, LOW);
  delay(3000);
  digitalWrite(PIN, HIGH);
  delay(1000);
}
```

自明なので、説明省略。

#### 実験
GPIO Low時、LEDは点灯。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/b929780f-b65a-1a2c-ad14-c4e85d3f27e3.jpeg", width=40%>

GPIO High時、LEDは消灯。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/f3d5b8b5-f2c6-3948-69a6-63df5f8c7cb3.jpeg", width=40%>

成功。
私が開発をするときに意識していること

この記事はエイチーム引越し侍 / エイチームコネクトの社員による、Ateam Hikkoshi samurai Inc.× Ateam Connect Inc. Advent Calendar 2021 4日目の記事です。

## はじめに
私のチームでは1年ほど、生産性向上や不具合発生抑えるための取り組みを行ってきました
その中で開発をする際に強く意識するようになったことがいくつかあります
私が普段意識していることを少し共有できればと思います

## 手を動かす前に一度落ち着いて設計を行う
いきなり手を動かすのではなく、まずは設計をおこないます
何を実現する必要があるのか、どうすれば実現できるのか、既存に影響しないかなどを考慮し、設計を終えた後にコードを書いていきます

いきなりコードを書き始めると、大きな手戻りが発生してしまう可能性もあります
確かにやってみないとわからない部分はありますが、ある程度は書き始める前の設計でカバーできると思っています

## チーム内で設計の相談を行う
設計がある程度終わり、実装方針が決まったらチームのメンバーに設計の相談を行っています
どうしても一人で設計を行うと抜け漏れが発生してしまいます
メンバーの負担は若干増えますが、説明する過程で問題に気がついたり、抜け漏れに気がつくことで手戻りがなくなればやって損はないと考えています
コードレビュー前に設計や仕様の共有を行うのも有効です
レビューはどうしても時間がかかってしまいますが、事前に要点を伝えておくことで効率的に行うことができます

## 困ったらペアプロをする
ペアプロは賛否両論あるかもしれませんが、ときには誰かの力を借りるのも大切だと思っています
複数の目が入ることで問題にも気が付きやすいですし、他者の意見がはいることで自分では想像しなかったアイデアが出てくることもあります
他人がコーディングしている様子から学べることも多いので、ペアプロは積極的に行っています

## 可読性と保守性を意識する
基本的には作って終わりということはなく、私たちは書いたコードを保守していく必要があります
また、自分が書いたコードを読むのは自分以外の他人です
そのため可読性と保守性の高いコードを書くために大きく3つのことを意識しています

1. 重複をなくす
1. 1つの関数に多くの機能を持たせない
1. 品質の低い部分をそれ以上汚さない

### 1.重複をなくす
いわゆるDRY原則のことです
同じ処理が増えてしまうと修正がとにかく大変です
保守しやすいように共通化できるコードをは共通化していきます

### 2.　1つの関数に多くの機能を持たせない
役割ごとに関数を分割しておきます
関数が小さくなるとメリットが多いです

1. 1つ1つが単純になるため、保守がしやすい
1. 命名と機能を一致させやすい
1. 再利用しやすい

など

### 3. 品質の低い部分をそれ以上汚さない
コードの品質が低い部分を改修するときにそれ以上品質を落とさないことは重要です
意識していないと「ここは既に品質が低いから多少汚しても良いか」となってしまいます
工数的な問題などでリファクタまでは難しかったとしても、それ以上汚すことは避けるべきだと考えています

## まとめ
開発者それぞれで意識していることは違うと思いますが、私が普段意識していることを書き出してみました
誰かの参考になれば幸いです

## 次回
Ateam Hikkoshi samurai Inc.× Ateam Connect Inc. Advent Calendar 2021 4日目の記事は以上です。
読んでくださった方、ありがとうございます。参考になれば幸いです。
明日は @namiita です。ご期待ください！！
shotcutのタイムラインに動画を追加する

# 目的
前回記事[「Pythonとffmpegで動画の無音部分をカットする」](https://qiita.com/igapon1/items/3faa83fc8af1543bc672)により、たくさん動画を作ったので、shotcutのタイムラインに追加する処理を作ってみた。

# 背景
前々回記事[「shotcutで動画作ってyoutube投稿してみた」](https://qiita.com/igapon1/items/5486f187d7751af2ddd5)、前回記事に引き続き、shotcutのmltファイルを直接加工して、動画を追加するpythonコードを作ってみた。

# 環境

- Windows10 バージョン21H1(OSビルド19043.1348)
 - Python3.9.1
 - Shotcut 21.10.31

# セットアップ
以下の記事のセットアップを参照のこと。
前回記事[「Pythonとffmpegで動画の無音部分をカットする」](https://qiita.com/igapon1/items/3faa83fc8af1543bc672)
前々回記事[「shotcutで動画作ってyoutube投稿してみた」](https://qiita.com/igapon1/items/5486f187d7751af2ddd5)

# 使い方
[GitHub](https://github.com/igapon50/training/releases/tag/1.3.0)からSource code(zip)をダウンロードして、展開する。
展開したパスを「c:\Git\traning\」として、加工前の動画ファイルが「c:\Git\traning\python\Movie\test.mov」なら以下のコマンドを実行する。

```
cd c:\Git\traning\python\Movie
python movieCutter.py c:\Git\traning\python\Movie\test.mov
```
すると、「\*_part\*.mov」な分割ファイルが生成されるので、以下のようなスクリプトを書いて実行すると、プレイリストに分割ファイルが追加され、test1.mltに保存される。

```python:テストコード：プレイリストに動画追加
from shotcutHelper import *
# カレントフォルダ以下で「*_part*.mov」を再起検索して、
# 見つけたファイルをトラックmail_binに追加して、保存する
app = ShotcutHelper('./せんちゃんネル/テンプレート.mlt')
movies = glob.glob('./**/*_part*.mov', recursive=True)
app.add_movies('main_bin', movies)
app.save_xml('./せんちゃんネル/test1.mlt')
```
（プレイリストのIDは'main_bin'である）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201344/646d7888-3664-4ccf-f440-f040d5706070.png)
↓　追加された
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201344/08383521-4fa2-ebc3-f7fd-d5ca397d3e5e.png)


また、以下のようなスクリプトを書いて実行すると、タイムラインに分割ファイルが追加され、test2.mltに保存される。

```python:テストコード：タイムラインに動画追加
from shotcutHelper import *
# カレントフォルダ以下で「*_part*.mov」を再起検索して、
# 見つけたファイルをトラックplaylist0に追加して、保存する
app = ShotcutHelper('./せんちゃんネル/テンプレート.mlt')
movies = glob.glob('./**/*_part*.mov', recursive=True)
app.add_movies('playlist0', movies)
app.save_xml('./せんちゃんネル/test2.mlt')
```
（ただし、存在する動画トラックのIDが'playlist0'とする）
shotcutのタイムラインのV1のIDは、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201344/7b56a153-559d-f1e4-723a-715c64a29c8d.png)
mltファイルを直接開くと、以下の赤線の様にID="playlist0"であることが確認できる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201344/bba283e5-94f7-56c7-cd46-9f8f5894431c.png)
↓　タイムラインに追加された（二つ目のCloudsは、隙間がないように前詰めされたようだ）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201344/4fa76c89-0aa3-18a1-796a-cbb27c1d550e.png)

# おわりに
やっていることは、ただのxml編集なので、難しいところはなかった。
トラックの追加とテロップの追加もそのうち挑戦してみたい。

# 関連リンク
## 参考サイト
[Pythonの順序付き辞書OrderedDictの使い方](https://note.nkmk.me/python-collections-ordereddict/)
[Python 日付フォーマット チートシート](https://python.civic-apps.com/date-format/)
## ドキュメント
[MLT XML Annotations](https://shotcut.org/notes/mltxml-annotations/)
neosでlogix その14

#概要

niosでlogixやってみる。
GET Stringノード、使ってみた。

#写真

![2021-12-03 23.04.32.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/26f1b50e-5181-fb74-1573-dbd493f27ed1.jpeg)


#GET String

```
Inputs
 	Impulse	Request
 	Uri	URL
Outputs
 	Impulse	OnSent
 	Impulse	OnResponse
 	Impulse	OnError
 	String	Content
 	HttpStatusCode	StatusCode
```

以上。
neosでlogix その13

#概要

niosでlogixやってみる。
通信する場合は、ドメイン毎に許可が必要らしい。
Request Host Accessノード、使ってみた。

#写真

![2021-12-03 22.39.58.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/187e4961-1864-6ba4-5a13-546315f63f28.jpeg)


#Request Host Access

```
Inputs
 	Impulse	Request
 	String	Host
 	String	Reason
Outputs
 	Impulse	OnDenied
 	Impulse	OnGranted

```

以上。
Raspberry PiにugeekのAOIDE KAZOOをセットアップ

### fbcp-ili9341の入手 ###
fbcp-ili9341はfbcpの高速版で、SPI接続の各LCD用に個別にビルドして使うのだけど、既にビルド済みのものがあるのでそれを使う。

```
$ git clone https://github.com/u-geek/AOIDE_KAZOO.git
$ sudo cp AOIDE_KAZOO/packages/fbcp-ili9341 /usr/local/bin/
```

### /boot/config.txt ###

```/boot/config.txt
# Uncomment some or all of these to enable the optional hardware interfaces
dtparam=i2c_arm=on
dtparam=i2s=on
#dtparam=spi=on

#dtparam=audio=on

# Enable DRM VC4 V3D driver
#dtoverlay=vc4-kms-v3d
```
dtoverlay=vc4-kms-v3dを無効にしておかないとfbcpがエラー終了する。

```/boot/config.txt
# AOIDE KAZOO
hdmi_group=2
hdmi_mode=87
hdmi_cvt=240 240 60 1 0 0 0
hdmi_force_hotplug=1
dtoverlay=hifiberry-dacplus
dtoverlay=gpio-ir,gpio_pin=4
dtoverlay=gpio-ir-tx,gpio_pin=17
```
ここまででsudo rebootして、

```
$ sudo fbcp-ili9341
bcm_host_get_peripheral_address: 0x3f000000, bcm_host_get_peripheral_size: 16777216, bcm_host_get_sdram_address: 0xc0000000
BCM core speed: current: 400000000hz, max turbo: 400000000hz. SPI CDIV: 6, SPI max frequency: 66666667hz
Allocated DMA channel 7
Allocated DMA channel 1
Enabling DMA channels Tx:7 and Rx:1
DMA hardware register file is at ptr: 0x75b7d000, using DMA TX channel: 7 and DMA RX channel: 1
DMA hardware TX channel register file is at ptr: 0x75b7d700, DMA RX channel register file is at ptr: 0x75b7d100
Resetting DMA channels for use
DMA all set up
Initializing display
Resetting display at reset GPIO pin 27
InitSPI done
Relevant source display area size with overscan cropped away: 240x240.
Source GPU display is 240x240. Output SPI display is 240x240 with a drawable area of 240x240. Applying scaling factor horiz=1.00x & vert=1.00x, xOffset: 0, yOffset: 0, scaledWidth: 240, scaledHeight: 240
Creating dispmanX resource of size 240x240 (aspect ratio=1.000000).
GPU grab rectangle is offset x=0,y=0, size w=240xh=240, aspect ratio=1.000000
All initialized, now running main loop...
```
画面に何か映ってれば（デスクトップ画面が映ってれば）成功。

### Audio ###
```
$ aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: sndrpihifiberry [snd_rpi_hifiberry_dacplus], device 0: HiFiBerry DAC+ HiFi pcm512x-hifi-0 [HiFiBerry DAC+ HiFi pcm512x-hifi-0]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
```
となっていればとりあえずOKのはず。
【UiPath】TwilioでSMSを送信する

# はじめに

この投稿は、RPAツール「UiPath」での 実装例 について記事です。
今回は、電話・SMSのプラットフォーム「twilio」のAPIを使用して、指定の電話番号にSMSを送信します。

https://cloudapi.kddi-web.com/magazine/twilio-lesson/what-is-twilio-of-the-communication-api


UiPath Adventカレンダーの 4日目 の記事でもあります。

https://qiita.com/advent-calendar/2021/uipath

# UiPathでTwilio

UiPathマーケットプレイスには「カスタムアクティビティ」として、Twilio系のアプリが公開されており、それを使用することもできます。

https://marketplace.uipath.com/ja/listings/twilio

ですが「使い方がよくわからない(TдT)」のと、「Twilio自体がAPIで提供されていて、WEBリクエストで普通に呼び出せる」ので、例のように「InvokeCode（コード呼び出し）」でやってみます。

# Twilio側の準備

Twilioアカウントの作成、電話番号登録はネット上に情報が沢山あるので、割愛します。

https://qiita.com/sys_zero/items/e1c1fe2ef1dad8a0a0e1


今回はTwilioの「Messaging API」を使用しますが、パラメータとして

- accountID
- authToken
- messagingServiceSID（Fromパラメータに電話番号を指定する形でも可）

を使用するので、それぞれ以下のように取得します

＜accountID・authToken＞
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154139/bcb2c580-a0c1-dc26-f053-1ffd92b024bf.png)

＜messagingServiceSID＞
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154139/58def10f-f5f5-dac9-32de-e1f8ce0a4011.png)

# UiPath側の準備

HTTP Request アクティビティでも出来そうな気もしますが、エラーハンドリングなどしっかりしたいので、InvokeCode（コード呼び出し）アクティビティを使用して、Twillio のAPIを呼び出してみます。

https://docs.uipath.com/activities/lang-ja/docs/http-client

InvokeCode（コード呼び出し）アクティビティで、以下のように指定します。
上記で取得したTwilioの「accountID・authToken・messagingServiceSID」を使用して、指定の電話番号にメッセージを送信するコードです。

``` VB
'// 引数
'// - in_accountID
'// - in_authToken
'// - in_messagingServiceSID
'// - in_to
'// - in_text
'// - out_error
'// - out_result

Try
    Dim wc As New Net.WebClient
    '// URL
    Dim reqUrl As String = String.Format("https://api.twilio.com/2010-04-01/Accounts/{0}/Messages.json", in_accountID)
    out_result &= String.Format("[url]{0}", reqUrl)
    '// パラメータ
    Dim param As New System.Collections.Specialized.NameValueCollection
    param("To") = in_to
    param("MessagingServiceSid") = in_messagingServiceSID
    param("Body") = in_text
    out_result &= String.Join(" ", param.AllKeys.Select(Function(k As String) "[" & k & "]" & param(k)))
    '// basic認証
    wc.Credentials = New System.Net.NetworkCredential(in_accountID, in_authToken)
    '// 送信
    Dim res As Byte() = wc.UploadValues(reqUrl, "POST", param)
    out_result &= String.Format("[response]{0}", System.Text.Encoding.ASCII.GetString(res))
Catch ex As Exception
    out_error = ex.Message
End Try
```

ポイントは「ベーシック認証」であることです。それ以外は普通のPOST形式のAPIリクエストです。
送信すると以下のようにSMSが送信されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154139/7dd0f7ea-c23a-69cb-4d54-47a26360ceae.png)

# 終わりに

いかがでしたでしょうか。実装時に役立てば幸いです。
この記事が参考になったら、 LGTMをお願いします。閲覧ありがとうございました。
Blender 2.93 の設定を 3.0 に持ってくるのにやったこと

# Blender3.0リリース

Blenderの3.0が12/3にリリースされました。
ちょっと使ってみたので、その紹介をします。

環境はmacOSです。管理者権限のユーザーで実行しています。

## インストール

まずは、2.93を残しておくために下記を実行しています。

```bash
mv /Applications/Blender.app/ /Applications/Blender.2.93.app/
```

https://www.blender.org/ の「Download Blender」を押してインストーラーをダウンロードしてインストールします。

3.0も下記のようにフォルダを変更します。

```bash
mv /Applications/Blender.app/ /Applications/Blender.3.00.app/
```

アプリケーションのフォルダを開いて、Blender.3.00を起動しましょう。

![スクリーンショット 2021-12-04 7.43.50.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13955/3dabc661-959c-cb25-dd41-ff55291d10e3.jpeg)

新しい[スプラッシュスクリーン](https://cloud.blender.org/p/gallery/617933e9b7b35ce1e1c01066)ですね。
「Load 2.93 Settings」を押します。

- 2.93の設定を引き継いでくれました。
- 新規作成時のデフォルトも引き継いでくれました。
- アドオンも2.93のものがインストールされてました。

下記のようにエイリアスを設定します。

```bash
alias blender=/Applications/Blender.3.00.app/Contents/MacOS/Blender
alias blender_pip="/Applications/Blender.3.00.app/Contents/Resources/3.0/python/bin/python3.9 -m pip"
```

blenderのPythonのライブラリーは自前で作業が必要のようです。上記で作成した`blender_pip`で必要なライブラリーをインストールします。

行った移行作業はここまでです。簡単でした。

## ちょっと使ってみる。

UIは若干違うところもありますが、2.93と同じように使えました。
macOSだと日本語入力できませんでしたが、一部は日本語入力できるようになってますね。

適当なモデルでCyclesのレンダリング時間をはかってみました。

![スクリーンショット 2021-12-04 8.09.54.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13955/26c487e3-5765-4c59-19ad-d3c70dfcec69.jpeg)

上が2.93で下が3.0です。1.4倍くらい速くなってます。
とはいえ、思ったとおりにレンダリングできないモデルもあったので、しばらく2.93を使い続けようと思います。

また、3.0以降のロードマップについては、「[Blender3のロードマップを皆で読もう！ - Youtube](https://youtu.be/to4qkYs83m0)」が参考になりました。

## 追記

[Asset Demo Bundles](https://www.blender.org/download/demo-files/)から、アセットブラウザーのサンプル（Cube Diorama）とポーズライブラリーのサンプル（Ellie Pose Library）をダウンロードできます。

「Cube Diorama」は、そのまま開いて実行できました。
「Ellie Pose Library」は、そのままだと実行できませんでしたが、下記のようにしたらできました。

- 先にBlenderを起動する。
- 編集メニューのプリファレンスのアドオンで「pose」で検索して出てくる「Animation: Pose Library」をチェックする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13955/88345b5d-4671-b1f0-25db-5ae551e47efa.png)

- Blenderの「開く」で`ellie_animation.blend`を選んで開く。ただし、右上の歯車アイコンの設定で「UIをロード」のチェックを外しておく。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13955/4b273b57-46d8-b696-449e-825043fa44db.png)

- ビューポートの画面を分割して、片方の画面のエディタータイプからアセットブラウザーを選ぶ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13955/44fb2dab-63ff-1cdf-67c0-9b175ee67bba.png)

- 好きなポーズを選んでポーズライブラリーの適用を押す。

それでは、よきBlenderライフを。
T-DASHのOPENβ版で改善したらよいと思う箇所３点

株式会社バルテスが提供するテスト自動化ツール、T-DASH（OPENβ版）を複数回にわたり触っています。今日で5回目です。過去4回で機能について一通り触ってきたため、せっかくなのでこうしたら更に使いやすいなと感じた改善点をフィードバックしてみようと思います。

## 記事の補足
### 本記事で利用したシステムのバージョン情報
- T-DASH：0.1.004b
- PC：Windows 10 Home 20H2
- ブラウザ：Chrome 96

### アドベントカレンダー2021
この記事はQiita Advent Calendar 2021の[T-DASHを使ってみた！【PR】T-DASH](https://qiita.com/advent-calendar/2021/tdash)の6日目の記事です。

### T-DASHについて触ってきた過去の履歴
- [T-DASHのOPENβ申込からテストツールの起動まで実施したら、とてもハードルが低かった](https://qiita.com/84zume/items/5051531c1d82139b4267)
- [T-DASHのサンプルアプリで自動テストを実行して結果を見てみた](https://qiita.com/84zume/items/3a23d6c435dd418e98b2)
- [T-DASHで基本的なテスト（テストシナリオ、テストケース、テスト手順、画面定義）を書いてみた](https://qiita.com/84zume/items/c5f5f82e2c6da1a5c1f5)
- [T-DASHのテスト手順作成画面をじっくり見てみた](https://qiita.com/84zume/items/e3631bd3cea510b21d78)

## こうなったら良いのになフィードバック
タイトルで出オチ感があるものもありますが、3点あげてみます。ちなみに、T-DASHの現立ち位置の範囲で自分なりにスコープは絞ってみました。（例えば、「エクスポート機能に他のテスト管理ツールとの連携しやすいフォーマットで出してほしい」とか、「テスト実行を多ノードで並列的に実行できるようにしてほしい」とか、そういったやや高度な利用用途のモノは省きました）

### その1. テストを途中で中断する機能が欲しい
いちど自動テストを開始すると、テストを停止する機能が無いようです。中断する機能が欲しいです。（誤って実行時間が長いテストシナリオを実行してしまった場合、終わるのを待つのがかったるいので…）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34410/3bfba494-f5b6-f05c-4db7-38fe011fd9f2.png)

### その2. 動作セットは変数化出来てほしい
前回のポストで動作セットを触ってみました。操作や検証をまとめて定義できる機能はとても助かります。ただ、一部の設定値を外だししたい場合もあるため、変数化ができるとうれしいなぁと。下記のスクショは「ログイン操作」に関する動作セットですが、IDとパスワードを外部化できれば、汎用性が増して嬉しい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34410/473526fe-0390-b6f7-4655-70a67bfa8861.png)

### その3. 画面定義の操作性が直感的でない
画面定義画面は改善の余地が多そうです。要素をスプレッド状の画面で表示しているため、できれば、スプレッド内に編集機能が備わっている方が良いと思っています。要素名を新しく追加する際に「要素名を入力」テキストボックスをどうやって利用するのか直感的には分からなかったためです。（せめて、「要素名を入力」テキストボックスの右横に「追加」ボタンでもあると良かったかも）

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34410/a0ff6ca9-bddf-94d6-c0c9-bf8f948c7af0.png" width=60%>

## 最後に
T-DASHのOPENβ版を触って改善してほしいなと思った点を（重箱の隅をつついているようですがｗ）あげてみました。より良いツールに育っていくよう応援しております～！
フォルダ内の最新ファイルの特定

## はじめに
　2021/11/20(土)に参加した、[PBIJP Power Query 秘密特訓「虎の穴」炎の復活編 #9 - connpass](https://powerbi.connpass.com/event/230370/)の私の発表について、フィードバックを受けた内容等について記します

## 発表の概要
　勉強中のPower Queryのビデオコース、[Power Query Academy - Skillwave Training](https://skillwave.training/shop/power-query-academy-full/)から、

**フォルダ内にある同形式のCSVから、最新の1ファイルの内容を読み取る**

についてやってみた。

**最新のファイルにフィルターで絞った後、Contentカラム以外を削除して中身を取り出し、パスとファイル名のハードコードを避ける**

という注意点を学んだ、ということを、バッドケース、ベターケースの操作動画を見せながら、学んだことを説明しました。

## 最新のファイルの取り出し

フォルダにファイルがたくさんあるとき、最新のソートして、一番を上にある最新をクリックすると...　とすると、パスとファイル名がハードコードされるステップになる。

それを避ける例として、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/917d76b1-2e84-ad78-77a2-138d2af78800.png)

こちらで最新1行にする。Content列のみにする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/86a9c90e-8c90-a918-afcd-10375cad9054.png)

そして中身を展開する。

## フォルダーの中の何でファイルを特定するのか（キーが何か）

　かがたさん（ @PowerBIxyz ）から、こちらの方法でも、ファイルとパスではなく**別なものでハードコードされている、それをよく理解することが大事**、とアドバイスがあり、いろいろな表現を試すことをやりました。

## 何がキーとなっているか → Table.Keys

 ステップを1つ追加して（fxを押して記述）、Table.Keysを使うことで、何がキーに使われているのかが確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/99925407-0c68-d335-20c6-f488e24618b8.png)

こちらのリストのRecordはポインタです。クリックして中身を見ると、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/614ef31d-fc29-fb45-7217-3172a86f022f.png)

となり、プライマリー（Primary）キーが、Columsでセットされいます。Cloumsをクリックして中身を見ると、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/87b954e6-7553-a1ef-0f78-779b6c3d88b8.png)

となっています。この内容は、ある1行を特定するのに、フォルダーのパスと名前をもってして、プライマリーキーと特定している、ということです。

Content列のみにして、Binaryをクリックして中身を見るということは、パスと名前が削除されているときに、プライマリーは別ものを使うので

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/92950717-6f08-f831-d023-2da23c7f9dd2.png)

となっているように、カーリーブラケットで囲まれる**0行目**をプライマリーキーとして使う、使い方をしていることになります。

言い方を変えると、

- Keyが存在するとき、そのKeyを使う
- 存在しないときは、行を特定するユニークキーが提供されている

ということです。プライマリーキーを削除することで、別な行の特定の仕方が得られる、んですね。

## 応用

この考え方を分かっていると、最新にソートされている中で、

最新より一つ前のものは、= #"Removed Columns"{**1**}[Content]

と指定すればよい、といったことができます。

さらに他の類似例では、最新の3つのファイルを読み込む、といったときは、

**= Table.FirstN(Source,3)**

とするなど、M言語が作られる動作や意味が解っていると、やりたいことがよりできるようになる、と教わりました。

## おわりに
　自分が学んだ内容（インプット）を、発表（アウトプット）してみると、何がわかってわかっていなかったのか、そして熟達された方のアドバイスで、より深まることができます。ありがたい限りです。
Raspberry Piのapt-get upgradeでvlcが壊れてるエラーが出る問題の対処

### 問題 ###
Raspbian Bullseyeになってからか、初回セットアップ時のapt-get upgradeでエラーが出るようになった。vlcが壊れてるらしい。vlcなんて使わないのだけど、これのせいでupgradeができない。

まずはupdate。

```
$ sudo apt-get update
Hit:1 http://raspbian.raspberrypi.org/raspbian bullseye InRelease
Hit:2 http://archive.raspberrypi.org/debian bullseye InRelease
Reading package lists... Done
```
ここまではOK。次、upgrade。

```
$ sudo apt-get upgrade
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
Calculating upgrade... Done
Some packages could not be installed. This may mean that you have
requested an impossible situation or if you are using the unstable
distribution that some required packages have not yet been created
or been moved out of Incoming.
The following information may help to resolve the situation:

The following packages have unmet dependencies:
 vlc-bin : Depends: libvlc-bin (= 3.0.16-1+rpi1+rpt1) but 3.0.16-1+rpi1+rpt2 is to be installed
 vlc-plugin-skins2 : Depends: vlc-plugin-qt (= 3.0.16-1+rpi1+rpt2) but 3.0.16-1+rpi1+rpt1 is to be installed
E: Broken packages
```
エラーが出てる。

### 解決方法 ###
dist-upgradeを先にする。

```
$ sudo apt-get dist-upgrade
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
Calculating upgrade... Done
The following package was automatically installed and is no longer required:
  libfuse2
Use 'sudo apt autoremove' to remove it.
The following NEW packages will be installed:
  libbasicusageenvironment1 libgroupsock8 liblivemedia77 libusageenvironment3

<snip>

Setting up raspberrypi-ui-mods (1.20211123) ...
Processing triggers for initramfs-tools (0.140) ...
Processing triggers for libvlc-bin:armhf (3.0.16-1+rpi1+rpt2) ...
Processing triggers for libc-bin (2.31-13+rpt2+rpi1+deb11u2) ...
```
iOSのアクセスガイド(Guided Access)下で実行中のアプリが落ちたときの挙動を調べる

## 概要

iOSには、[アクセスガイド(Guided Access)](https://support.apple.com/ja-jp/HT202612)の機能があり、動かせるアプリを1つに制限することができます。

このエントリでは、筆者が「アクセスガイドを有効にしているときにアプリが落ちた場合はどのような挙動になるのか」がふと気になり、実験してみた内容を紹介します。

## ご注意

- ご自身でも実験される場合には、アクセスガイドについて[Appleのサイトの説明](https://support.apple.com/ja-jp/HT202612)をよく理解した上で取り組まれてください。特に、アクセスガイドをパスワード付きで設定した上で、パスワードを忘れてしまうと解除ができなくなります。ご注意下さい。
- アクセスガイドを理解しないで使用すると大変なことになる場合があるので注意してください。
- アクセスガイドを理解しないで使用すると大変なことになる場合があるので注意してください。(大切なことなので2回繰り返しました)

## 前提

本エントリでは、下記を使用しています。

- iPhone 13 mini / iOS 15.1.1
- Xcode 13.1
- Mac Book Air (Apple Silicon) / macOS Monterey (12.0.1)

## 準備

### 実験用アプリのコードを書く

こういった見た目の実験用アプリを書きました。

![スクリーンショット 2021-12-04 7.20.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65002/4f2a184a-ab35-b5cd-73ac-347b99eb5443.png)

主なコードは下記の通りです。(SwiftUIだと、短いコードで書けていいですね。)
いちおう、[GitHubにも置いてあります](https://github.com/hrkt/TerminateSelf)が、XcodeでSwiftUIの新規プロジェクトを作ってコピペをすれば動くはずです。

```swift
struct ContentView: View {
    var body: some View {
        VStack {
            VStack {
                Text("🦁Terminate self by ...👻")
                    .padding()
                Button("☠️calling abort()", action: {
                    abort()
                }).padding()
                .accentColor(Color.white)
                .background(Color.red)
                .cornerRadius(10)
                .shadow(color: Color.pink, radius: 5, x: 0, y: 5)
                Button("🍽consuming much memory", action: {
                    var buf:[UInt8] = []
                    buf.reserveCapacity(Int.max)
                 }).padding()
                .accentColor(Color.white)
                .background(Color.red)
                .cornerRadius(10)
                .shadow(color: Color.pink, radius: 5, x: 0, y: 5)
            }
        }
    }
}
```

### シミュレータでアプリを実験

Xcodeで動作対象をシミュレータにしてアプリを起動し、「Calling abort()」ボタンを押すと、SIGABRTのシグナルでアプリが停止します（下図）。期待通りです。

![スクリーンショット 2021-12-04 7.25.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65002/2647387f-a71e-dd83-cb9d-ec599d40e522.png)

### 実機でアプリを確認

Xcodeで動作対象を実機iPhoneにしてアプリを一度動かした後、iPhoneからLightningケーブルを外します。アプリを起動し、「calling abort()」ボタンを押すと、アプリが落ち、ホームスクリーンに戻ります。期待通りです。

## 実験

### アクセスガイドを有効にする

Appleの[アクセスガイド(Guided Access)](https://support.apple.com/ja-jp/HT202612)のサイトをよく読み、設定します。

_(再掲)アクセスガイドを理解しないで使用すると大変なことになる場合があるので注意してください。_

### 実験用アプリをアクセスガイド下で動かしてみる

準備のところで作ったアプリを動作させます。

アプリを開始してからアクセスガイドを開始し、「calling abort()」ボタンを2回ほど押して、それぞれアプリがまた前面で動き出している様子が下図です。

![ezgif.com-gif-maker-2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65002/15f2c7a6-03c5-9e31-f02d-d3eca001574e.gif)

## おわりに

このエントリでは、アクセスガイドを有効にしているときにアプリが落ちた場合はどのような挙動になるのかについて、実験してみた内容を紹介しました。

想像した通りではありましたが、実際に確認できて満足しました。
STM32G031で4ピンから「hello...」をシリアル出力2(VSC,cubeid)HAL

目的
シリアルのテスト(STM32G031J6M6)
シリアルの半二重方式で設定してみました。
なぜかcubemxのdisco-stm32g0316では、usart2が
表示されないので似たような物をチョイスしてみました。


x 過去ログをみよ->

x ----重要---- OBで4ピンをGPIOにする　わからない人は、やらない方がよい
x 動けば正義:創造主は神:細かい事を気にするな
x cubemxはstm32g031f6px
x vscは、nucleo-g031

stm32g031_pa2_usart2_1内をいろいろコピー


https://os.mbed.com/users/caa45040/code/f303_h_p1/




![o_con125.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/1ba2aa96-7242-98d6-ed42-7421d090c253.jpeg)




![o_con124.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/69281246-5f12-b002-483d-743a09731a15.jpeg)



![AB9C3B1C-757A-4912-9D0E-96C07DD0BA6F.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/d3e2c16b-96f0-04f8-e099-fd7742897c80.jpeg)


![o_con126.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/9db8531a-2818-0166-c6b7-7b1d3223d29f.jpeg)




![o_con127.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/9bc60ad4-200d-fc84-0d84-16b6bfc9a3df.jpeg)






![o_con128.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/504ad44a-24e2-464a-6e53-e4f2ca17b460.jpeg)



![o_con129.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/0bff32f0-31d0-9807-6a4f-219bdee418f1.jpeg)





主なプログラム　main内のwhile内



```c++

 
        HAL_UART_Transmit(&huart2, (uint8_t *)"hello world\r\n", 13, 10);
 
        HAL_Delay(500);
 


```
日本語でMarkdownを楽に書くための設定

## その1 : Google imeを導入する
まずGoogle IMEをダウンロードしてインストールしてください。
https://www.google.co.jp/ime/
以下でGoogle IMEの設定を変更することで、Markdownの日本語入力を格段に楽にする事ができます。
またMacの標準IMEよりも予測変換が優れているので、Markdownを使用するしないに関わらずおすすめです。

## その2 : IME設定を変更する
これだけでMarkdownが恐ろしく捗ります。
IMEをクリックし、そこから環境設定に進みます。
![Screenshot 2021-12-03 at 22.46.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/811158/933ddb76-ae9e-1c7b-c0ce-305fdd997f42.png)

### 必須設定1 : スペースの入力を半角化
環境設定で「スペースの入力」を半角にします。  
こうすることで日本語モードでもスペースが全て半角で入力されます。
![Screenshot 2021-12-03 at 22.50.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/811158/3416f6d1-6c6c-f994-1389-203e3f481b0d.png)

### 必須設定2 : 記号の入力を半角化
「入力補助」画面中の下段にある、全角半角の入力設定を変えていきます。
ここで設定を変えた記号は、日本語モードでも全て半角で入力されます。
赤いチェックマークは半角化必須です。
推奨の項目についても基本好みがなければ変えておいたほうが便利です。
(全角数字とか全く使わないのは私だけでしょうか?)
![Screenshot 2021-12-03 at 22.58.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/811158/ce456818-f62f-4fdf-5970-0b396cc55ec2.png)  
![Screenshot 2021-12-03 at 23.17.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/811158/9fddb5e2-520f-de0a-17ab-4d26bdeef548.png)

## まとめ
これらの設定を変えるだけで、余計な変換や全角/半角の切り替えが必要なくなるので、マークダウンでの日本語入力が格段に楽になります。  
まだ設定していない人は是非試してみてください。
「20年弱開発をやっていて一番嬉しかった瞬間」

平日深夜や土日、Slackにふと良質な雑談スレッドが生まれることがあります。
Twitterでも土日の投稿は比較的ゆるゆるでリラックスして読めるものが多いのでは、しらんけど、等などと思いますが、今日は「20年弱開発をやっていて一番嬉しかった瞬間」について書いてみます。


## Long, long ago.

こんなことをふと思い出した。

- 昔(まあ2000年代の内くらいの思い出)は、ひと機能担当したら機能の全決定権を支配できた。
- 今の製品に関わり始めた頃は少なくとも新卒1年目からその機能の最終決定権は開発担当にあった。
- その弊害としていびつな便利機能が個人に依存し、雨後の筍状態だった。
    - だが、開発はその頃が一番勉強になった。すぐフィードバックももらえた。

## 問題提起

- 今も「決めてよい」は変わらない。
- 1機能だろうが全部を自分で決めてよいという体験は非常に有り難い。
- 開発担当が周りの有識者と上手く協力しながら作りたいものを作る、の大枠は変わっていない。
    - しかし、
        - 既存機能が既に揃いすぎていることで描ける領域が狭まっているかもしれない。
        - 製品自体がもうほぼ完成形。
    - 失敗していい環境・空気を若いメンバーにも作ってあげられているかと言うと自信がなくなる...
    - うっかりすると全然決断できない状態になっていたりする。

## どうする

- **「20年弱開発をやっていて一番嬉しかった瞬間」**。
    - [＊この辺](https://qiita.com/e99h2121/items/5eefe618e97ba0e6df70#%E5%A4%A7%E4%BB%95%E4%BA%8B)
    - とあるお客様に「システムが起動しないです」と呼びだされ、自分の足でエンドユーザーさんの画面を見て
`「。。それ。。起動してます。。。画面最小化してます。。。」`
とみずから答えて「お客様の自社製品をお土産に頂いて帰ってきた」経験。
    - サザエさん的牧歌的体験になってしまうがそれが一番嬉しかった。
- そんな経験提供させてあげられているだろうか。。
- 製品企画、設計、開発、テスト、出荷、導入、トラシュー、全部やって感謝されて御礼の品まで貰ったらそりゃ嬉しい楽しい。
- そういうこを今疑似体験するとしたらどうすると楽しいのだろう。。:thinking:


## Now.

- 「開発をやっていて一番嬉しかった瞬間」を収集してみても良いかも。
- 自分の場合はそうだったけれど、でも今もそれが正解とは限らない、とも思っている。
- 自由な妄想をしてみたい。
- サブ単位でそれこそこっそりリファクタしちゃおうぜとか一旦舵切ってみたら楽しそう。個人の意見
- 将来的な理想図
    - [＊この辺](https://qiita.com/e99h2121/items/2e992ba08be2ad324124#%E3%82%AB%E3%82%BF%E3%83%AD%E3%82%B0%E3%81%A8%E3%81%AF)
    - ... を誰しも自由に書いていいなら一度自由に書いてみたら良いのでは。



以上です～。
エンジニア歴約10年を振り返って大事に思ったこと

# はじめに
　いろいろ失敗したことを簡単にさらけ出していきたいと思いますので、なにかの糧になれば幸いです。
　エンジニアのスタートがまったくの初心者で勉強ができるタイプでもなかったので
　レベルが低いかもしれませんがよろしくお願いしますｍｍ

# エンジニアになる前のスペック
　・エンジニアとは全く関係ない専門学校卒
　・勉強はできるタイプではない
　・ほぼ独学でツールを使ってHTMLのwebサイトを2～3個作成していた
　・IPとかLinuxとかの予備知識なし
　・人とはあまりしゃべりたくない・・・
　・気合だけはあった

# 0年目
　webサイト作成経験からまずは派遣でwebサイトのテスターの仕事をスタート
　半年契約だが成果に応じて契約継続となるが私は選ばれず、
　経験は同じくらいの自分より年下のテスターが業務継続となった
　その子がやっていたことを振り返ってみると・・・

　・テストの質問は基本チャットでテストリーダにするが
　　テスターの中で唯一対面でも質問を行っていた
　・会議の場でも理解できないことは質問していた
　・テストリーダーは忙しいが遠慮しないで質問を投げていた

　当時はテストリーダー忙しいのにそんな時間取っていいの？と思ってましたが
　いまとなっては理解しないまま業務を進められるほうが怖いですね。。
　それもありきっとテスト品質も高く、契約が継続になったのだと思います。

# 0.5年目
　テスターの契約が切れてwebサイト作成を目指したかったが
　まだまだ厳しく初心者OKのネットワーク切替の作業者で仕事をいただく
　ここで初めてIPとかLinuxとかを知る
　10カ月目に人数削減のため私だけ離脱・・・
　理由はチーム内でスキルが一番低かったことになるが
　振り返るとこの時離脱した理由も浮き彫りになりました。。

　・覚えることが多すぎてパンクしていたので理解しないまま業務を行っていた
　・気づいたら時間が経っていて、ちょっとでも難しいことはできる振りをして
　　簡単な業務へ逃げていた

　ただ得たものもありました。
　・自身を気に入ってもらえて助けてくれた
　・周りの趣味など(ゲームやタバコなど)に合わせることで関係性を築いた
　若干よろしくないのも混ざってますが笑
　仲良くなる＝仕事がやりやすくなることを知りました

# 1～2年目
　上記の通りなのでスキルが身についてないにも関わらず、
　ネットワーク作業員の経験からネットワーク機器の検証環境を構築することになりました。
　幸運なことにネットワークに詳しい方もいましたが
　一人称で構築作業を行うことが出てきました。
　なのでものすごく壁にぶつかりました。
　そこで思った大事なことです。

　・基本が漏れてることがあるのでマニュアルをしっかり読む
　・構築できない要因になるのでエラーを放っておかない
　・レビュー者が有職者でも完璧ではないので信じすぎない
　・うまく行かない時は切り分けを行う
　
　構築したものでうまく通信することができず、
　切り分けも上手でないので解決にだいぶ時間を費やしました。
　ネットワーク機器の設定をレビューいただいたのですが設定誤りがあったのと、
　他担当のサーバの設定が誤っていたことが原因だったのですが
　初構築で自信がないのも相まって、筋が通っているならきちんと相談する必要があったかと思います。

# 3～4年目
　だんだんスキルもついてきたのですがおごりも出てきました笑
　
　・プライドを捨てる
　・基本に立ち返る
　・メモを取る
　・いまの仕事のやり方がベストではない場合があるので視野を広げる

　少し構築経験もしてきて謎のプライドが出てきましたね。
　そういうものは犬にでも食わしておきましょう。
　割と基本的なこともありますがおごりが出てくると忘れがちになるので気を付けましょう笑

# 5～8年目
　リーダになることができ、だんだんと下にメンバーが増えてきました。

　・雑談からのコミュニケーション、ユーモア
　・自身の知ったことは共有をしっかり行う
　・課題の関係者は漏れなく巻き込む
　・牙を研ぎ続ける

　お客様など対会社の方はよいしょしてきた私ですが
　メンバーがついたのは初めてで雑談からのコミュニケーションができてませんでした。。
　コミュニケーションができてれば上記はクリアできるかと思います。
　また、できる後輩が追い上げてくるので牙を研ぐ意識をしないと追い抜かれていく危機感を覚えました笑
　
# 9～10年目
　コロナ過で大変なこともありましたがまだまだ学ぶことは多いと感じます。

　・直接会ったときは立ち話でもいいのでコミュニケーションを取る、たまには会う場を作る
　・話したことない人の話を聞く
　・環境を変えてチャレンジしてみる

　いまの環境に満足せず、常に変化していくことが大切ですね。

# おわりに
　技術は変化し続けるので、自身も変化し続けないとあっという間に置いていかれると思います。
　人としゃべりたくない私でしたが、変化することで対応できてきたところはあるので
　変化を恐れずチャレンジしていただければと思います！！
T-DASHのテスト手順作成画面をじっくり見てみた

株式会社バルテスが提供するテスト自動化ツール、T-DASH（OPENβ版）を複数回にわたり触っています。今日で4回目です。このツールの特徴の1つは「ノーコード」、「日本語で」テスト手順を作成できることがあげられます。これを**キーワード駆動テスト**というようです。このキーワード駆動テストを実現するうえで大事な機能が「テスト手順エディタ」なわけですが、どんな機能が備わっているかをじっくり見てみたいと思います。（あと面白そうなものは動かしてみる）

### キーワード駆動テストとは
T-DASHはいわゆる「キーワード駆動テスト」を採用したテストツールになります。キーワード駆動テストは、ISO/IEC/IEEE 29119 part5で規定されている技法です。おおざっぱに言うと、テストスクリプトにテストに関わる全ての情報を簡易な方法（スクリプトのテンプレートの様式）で記述し、必要な要素やパラメータを提供したうえで、ツールがその記述を解釈し自動的にテストを実行する、方式です。

## 記事の補足
### 本記事で利用したシステムのバージョン情報
- T-DASH：0.1.004b
- PC：Windows 10 Home 20H2
- ブラウザ：Chrome 96

### アドベントカレンダー2021
この記事はQiita Advent Calendar 2021の[T-DASHを使ってみた！【PR】T-DASH](https://qiita.com/advent-calendar/2021/tdash)の5日目の記事です。

### T-DASHについて触ってきた過去の履歴
- [T-DASHのOPENβ申込からテストツールの起動まで実施したら、とてもハードルが低かった](https://qiita.com/84zume/items/5051531c1d82139b4267)
- [T-DASHのサンプルアプリで自動テストを実行して結果を見てみた](https://qiita.com/84zume/items/3a23d6c435dd418e98b2)
- [T-DASHで基本的なテスト（テストシナリオ、テストケース、テスト手順、画面定義）を書いてみた](https://qiita.com/84zume/items/c5f5f82e2c6da1a5c1f5)

## テスト手順エディタ
### 概観
テスト手順エディタは外観としては、下記のイメージです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34410/1292d66d-9da1-438e-3c22-575905c23e63.png)

画面、左にテストキーワードが並んでいて、画面右側にテスト手順を記述するマトリクス状のエディタが配置されています。設定値以外はすべてマウス操作で直感的に操作をすることができます。

### テストキーワードにはどんな要素があるのか
画面左のテストキーワードは下記の要素がそろっているようです。

- ブラウザ制御
- 入力操作
- マウス操作
- 選択操作
- 特殊操作
- テキスト検証
- 表示・非表示検証
- 選択状態検証
- URL検証
- 動作（これは本メニュー上のカテゴリ）
- 動作セット
- 画面

ブラウザ制御～特殊操作は、テスト対象アプリを自動的に操作するために必要なテストキーワードです。テキスト検証～URL検証は、操作の結果テスト対象アプリが期待通りに挙動（画面表示など）をしたかを検証する用途のテストキーワードです。動作セットは、動作の塊を定義できる機能です。例えば「ログイン動作」のように画面表示、値入力、ボタンクリックなど複数の操作が連携するものをひとまとまりにして登録することができます。

一通り見ましたが、特別なものはなさそうです。イメージがつくものがほとんど。ただどんな挙動をするか気になった「スクリーンショットを保存する」と「動作セット」については動かしてみようと思います。

### 特殊操作：スクリーンショットを保存する
テスト手順エディタで、テスト手順に「スクリーンショットを保存する」を追加し、ファイル名として「スクショ1」を定義してみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34410/e17845f6-e1dc-95b5-540f-71d316c4f916.png)

実際にテストを実行します。テスト実行後にテストレポートを開くと、取得したスクリーンショットが閲覧可能となりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34410/748f0238-5ad5-ccb4-d809-32bf1787f088.png)

### 動作セット
続いて、動作セットです。動作セットは複数の操作や検証をひとまとまりに定義できる機能のようです。左側メニューの「動作定義」→「動作セット」で定義可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34410/06ec92ba-c8e6-1f61-c9ef-e50dcc9fd6da.png)


「テスト手順」エディタと同じエディタによって、動作セットを定義可能です。この機能を利用してマウスでぽちぽち定義できます。なお、動作セットで利用する設定値の変数化はできないようですね。（変数化できた方が良さそう）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34410/841f702c-7f33-cc84-19fb-8c35ed8cb8dd.png)

実際にテストケースで利用する際には、動作セットを選択するだけで良いです。これで動作セットに定義している操作の塊や検証の塊を実行可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34410/e4e3f1a5-5a30-b23c-42b4-e6383280b786.png)

サンプル的に「ログイン動作」を動作セットとして作成しましたが、典型的な活用パターンですね。また画面に表示されている項目を一律で確認したいという検証パターンもよく使うと思います。なお、すでに定義済みのテスト手順を動作セットにくくりだすことも可能で、テスト手順エディタ内で動作セット化したいステップを選択の上「動作セットを作成」ボタンをクリックすると、その場で動作セットを作成できます。

## 感想
今回のポストではT-DASHのスクリプト駆動テストを実現する肝である「テスト手順エディタ」をじっくりみてみました。搭載済みのスクリプトは直感的に分かるものばかりです。一部どんな動きをするのかな？と疑問に思った「スクリーンショットを保存する」と「動作セット」について実際に動かしてみました。

触っていると、ここはこんな改善してほしいなぁっていうポイントがいくつかあったので、次のポストではこんなふうになったらよいなの改善点を書いてみようと思います。
Spring5.3 × WebLogic14cでJSFライブラリ関連でWebアプリケーションの起動に失敗した話

# 事象 サーバー起動時にWebアプリケーションの起動に失敗する

WebLogic14cをはじめて使った中でドハマリしたので、備忘録です。
過去にWebLogic11g、12cは使用したことがあります。

Spring5.3でWebアプリケーションを実装し、WebLogic14cへデプロイした際にこんなエラーに遭遇してしまいました。

```
javax.faces.FacesException: Unable to find CDI BeanManager
```

## 原因① JSFライブラリが不足していた

エラーの内容についていろいろと調べてみると、JSFライブラリが関連することがわかりました。
アプリケーション側でJSFライブラリは使用していないので、APサーバー側の依存によるものだと思います。
はじめはWebLogicに内包されているJSFライブラリではなく、Mavenセントラルリポジトリに公開されているものを使用してデプロイしたのですが、以下のような別のエラーに遭遇しました。

```
java.lang.ClassCastException: class com.sun.faces.vendor.WebContainerInjectionProvider cannot be cast to class com.sun.faces.spi.InjectionProvider
```

WebLogicのドキュメントを確認したところ、内包されているJSFライブラリをデプロイ・参照できるように設定する必要がありそうでした。
そのため、内包されているJSFライブラリ以外はWebLogicに対する互換性がないのでは？と考えました。

## 原因② weblogic.xmlに記載のクラスローダーの読み込み順序設定に問題があった

weblogic.xmlではクラスローダーの読み込み順序を設定して制御することができるのですが、今回の場合ではこの設定がうまくできていませんでした。
具体的には以下のような設定をして、デプロイしたWebアプリケーションを優先して読み込むようにしていました。

```xml
<wls:prefer-web-inf-classes>true</wls:prefer-web-inf-classes>
```

## 対処① WebLogicに内包されたJSFライブラリをデプロイ

内包されているライブラリは`${weblogic_home}\wlserver\modules`に配置されていて、その中の`glassfish.jsf.jar`を使用します。
このファイルをコピーして以下のディレクトリに配置する必要があります。

```
${weblogic_home}\user_projects\domains\${domain_name}\lib
```

ドメインディレクトリごとのlibフォルダに配置することで、サーバー起動時にデプロイされるようになります。
また、上記で配置した内包されているもの以外でJSFライブラリ(`javax.faces~.jar`等)がデプロイすると重複してエラーになるため注意が必要です。

※`${weblogic_home}`はWebLogicのインストールディレクトリ、`${domain_name}`はドメインごとのディレクトリとして適宜読み替えてください

## 対処② JSFライブラリが優先して読み込まれるようにクラスローダーの読み込み順序設定を変更

原因②の`wls:prefer-web-inf-classes`はデフォルトがfalseのため、削除します。
以下のようにパッケージ名を指定する形でクラスローダーの読み込み順序を設定し、JSFライブラリが優先して読み込まれるようにします。

```xml
<prefer-application-packages>
	<package-name>javax.faces.*</package-name>
	<package-name>com.sun.faces.*</package-name>
	<package-name>com.bea.faces.*</package-name>
</prefer-application-packages>
 <wls:prefer-application-resources>
    <wls:resource-name>javax.faces.*</wls:resource-name>
    <wls:resource-name>com.sun.faces.*</wls:resource-name>
    <wls:resource-name>com.bea.faces.*</wls:resource-name>
    <wls:resource-name>META-INF/services/com.sun.faces.*</wls:resource-name>
</wls:prefer-application-resources>
```

## 総括

対処①・②を行うことで問題なくデプロイおよびアプリケーションの起動が成功するようになりました。
この件に限らずサーバー依存の問題は解決するまでに結構ヒヤヒヤしますね。
WebLogic14c自体の情報が意外と少なくて、調べるのに少し苦労したのでお困りの方の参考になれば幸いです。

## 追記

根本原因としてはWebLogicのバグだったことがわかりました。
https://support.oracle.com/knowledge/Middleware/2785976_1.html

Oracleサポートアカウントをお持ちの方は、パッチを適用することでエラーが解消されるようです。

## 参考

https://qiita.com/opengl-8080/items/4bbaf674a8f09e3675c6

https://qiita.com/ponsuke0531/items/074b459f5d5b7c69282c

https://docs.oracle.com/cd/F32751_01/weblogic-server/14.1.1.0/wbapp/configurejsfandjtsl.html#GUID-E86D6F5A-2273-4DB3-BF03-6650FD50AD2F

https://stackoverflow.com/questions/12898076/how-to-deploy-a-jsf-2-1-webapp-in-oracle-weblogic-12-1/12901236
スプライン(非線形回帰モデル) vol.3

#前回記事
https://qiita.com/yudaiyamashita/items/8419b4a8db3f37c0ae6e
#参考本

多変量解析入門 -線形から非線形へ-　小西貞則著

#基底展開法
基底関数に基づく回帰関数を導入し、線形回帰、多項式回帰、スプライン、B-スプライン回帰、動径基底関数などによるモデルの想定、推定、評価、という一連のモデリングのプロセスを統一的に整理する。

#基底関数展開

$p$次元説明変数ベクトル$\boldsymbol x$と目的変数$Y$に対して、現象の真の構造
$E[Y[\boldsymbol x]] =u(\boldsymbol x)$を近似する回帰関数として、基底関数と呼ばれる既知の関数$b_0(\boldsymbol x)\equiv 1, b_1(\boldsymbol x), b_2(\boldsymbol x)\cdots b_m(\boldsymbol x)$の線形結合に基づくモデル

$$b(\boldsymbol w; \boldsymbol x)=\sum_j \omega_jx_j$$

重み$\boldsymbol \omega= (\omega_0, \omega_1, \omega_2, \cdots)^T$

これらは今まで述べてきた自然3次スプラインやＢ-スプライン、ガウス型基底関数に基づくモデルを上の様に表せる。

# モデルの推定

観測されたデータ$\{(\boldsymbol x_i, y_i); i = 1, 2, \cdots, n \}$に対して、基底展開法に基づくモデル

$$y_i = \sum_{j= 0}^m \omega_j b_j(\boldsymbol x_i) + \epsilon _i , i= 1,2, \cdots,n$$
の当てはめを考える。ここで誤差項$\epsilon_i$は互いに無相関で、$E[\epsilon_i] = 0$, $E[\epsilon_i^2]=\sigma^2$とする。

この回帰モデルを与えるｎ個の式は、次のように表せる。

$$\begin{pmatrix}
y_1 \\\
y_2 \\\
\vdots \\\
y_n
\end{pmatrix} =
\begin{pmatrix}
1 && b_1(\boldsymbol x_1)  && b_2(\boldsymbol x_1) && \cdots && b_m(\boldsymbol x_1) \\\
1 && b_1(\boldsymbol x_2)  && b_2(\boldsymbol x_2) && \cdots && b_m(\boldsymbol x_2) \\\
\vdots && \vdots  && \vdots && \cdots && \vdots
\vdots \\\
1 && b_1(\boldsymbol x_n)  && b_2(\boldsymbol x_n) && \cdots && b_m(\boldsymbol x_n) \\\
\end{pmatrix}
\begin{pmatrix}
\omega_1 \\\
\omega_2 \\\
\vdots \\\
\omega_n
\end{pmatrix}
+
\begin{pmatrix}
\epsilon_1 \\\
\epsilon_2 \\\
\vdots \\\
\epsilon_n
\end{pmatrix}$$

つまりは
$$\boldsymbol y = B\boldsymbol　\omega +\boldsymbol　\epsilon$$
$\boldsymbol y$は、目的変数ベクトル、観測値ベクトル、$B$は基底関数からなる基底関数行列, $\boldsymbol　\omega$は重みベクトル, $\boldsymbol　\epsilon$誤差ベクトル

#　最小2乗法

https://qiita.com/yudaiyamashita/items/dffc1faee61a34df6fa7

これまでにやった通り

重みベクトル$\boldsymbol　\omega$の最小2乗推定量$S$の

$$S = \boldsymbol \epsilon^T \boldsymbol　\epsilon$$
を最小とする推定値は$\boldsymbol　\omega$で偏微分して0となる値
$$\hat{\boldsymbol \omega}= (B^TB)^{-1}B^T\boldsymbol y$$
である。
これでウエイトを置きなおした回帰式が求まる。
残りはこのページの見やすさを考え、割愛する。上記のリンク先の式の変数を置きなおせばよい。

#最尤法

これもこれまでと同様。
次のガウス型非線形回帰モデルを想定する。
$$\boldsymbol y = B\boldsymbol　\omega +\boldsymbol　\epsilon, \boldsymbol \epsilon ~ N_n(\boldsymbol 0, \sigma^2 I_n)$$

この後も割愛する。

#その他のモデル

とある非線形モデルが、基底関数$b_i(x_i), \hspace{1em}i = 1,2, ..., n$の重みベクトルをそれぞれの係数とした線形和でかける。

次に有限個の説明変数を除いて、目的変数と説明変数の間に、線形回帰モデルが考えられるとする。

つまり非線形と線形に分けて考えられる、入り混じったモデルを考える。こういったモデルが一番目にすることが多い。

セミパラメトリックモデルといわれている。

詳細は文献を参照されたい。
モデルの評価はAIC基準で評価する。

# 次回
正則化など。
PowerBIのかんたんなレポート作成手順

##はじめに
Power BIを使って
 生データからレポートを作成し
　・スライサーのON/OFFで複数の表やグラフの値が連動される　→　データ理解が深まる
　・追加分のデータをフォルダに保存したら
　　手動でレポートを修正をすることなく値が更新される　→　データ更新時間が短縮される

こんなレポートを作りたい！と思った、
Power BIをインストールしたての方に向けて
私が作成するならこんな手順という説明資料をつくりました。

使用するデータ
・3つの商品の販売数、電話問合せ数、電話率をレポート化

操作が初めての方にもわかりやすいように、最初から最後まで
すべての手順を記載したファイルをリンク先に保存しました。

お時間あればダウンロードして見てみてください。ちょっと長めです。

[手順書などファイル一式　(リンク先)][link-1]
[link-1]:http://bianchi7555.main.jp/power-bi/

　　・手順書  (PowerPoint)
　　・生データ(Excel)
　　・Power BI の完成ファイル (拡張子は.pbix ←これ単品でも閲覧できます)

##条件
１．商品ごとの販売数、電話問合せ数、累計の電話率
２．時間軸は月もしくは週単位
３．「指定フォルダ」に「ファイルを1つ追加」（１か月分の追加データを）
　　保存するだけで更新ボタンを押せばデータが反映される

#スライサーON/OFFで複数の表やグラフの値が連動される
　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2350540/a697870e-5fb0-d614-b4db-d6bcbdf85491.png)
#フォルダにファイル追加後にデータ更新される
　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2350540/670b07cc-659a-ebd6-3926-89e350513919.png)
　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2350540/2c71ed19-ecc8-a0d1-e88d-6466dcb43fa6.png)
各件数、累計件数、累計率
　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2350540/b34fe655-0472-d971-217b-02312345628e.png)
　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2350540/e7babdd4-c846-6e4b-2ebf-fe915dc5cd5f.png)

#追加データを指定フォルダに保存しデータ反映させる手順
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2350540/73ec4ebb-b3fd-d2ea-45a0-3ca18b598473.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2350540/10925dde-52e3-88e9-91ae-4e43dc617b6c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2350540/0f49006d-590a-6740-d88b-12f7695a7dce.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2350540/05e36929-f248-39f8-9bbe-9d3135756f46.png)
指定フォルダに追加したデータが反映された「Call_data」テーブルが作成される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2350540/30c04d0a-5a6c-fa3e-48be-bc51577e3a7b.png)

#累計の計算方法
　・メジャー（計算式）
　　　累計販売数 = 
　　　　VAR _current_date = MAX( ‘日付’[Date] )
　　　　RETURN
　　　　CALCULATE(
　　　　　　SUM(‘Sale_data’[販売数]),
　　　　　　‘日付’[Date] <= _current_date
　　　　)
　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2350540/5fc01956-f41c-e3d2-75ba-9a9bdf2b00c2.png)

##最後に
Power BI勉強会の加賀田さん、清水さん、石川さんのオンライン勉強会や書籍から
参照させていただいた内容です。ありがとうございます。
【SwiftUI】チャットアプリのような動的な高さの TextEditor を実装する

# やりたいこと
チャットアプリで使われるような動的な高さの TextEditor を実装する。

[![Image from Gyazo](https://i.gyazo.com/c71ab0d56b11a8ad0216229594abfb26.gif)](https://gyazo.com/c71ab0d56b11a8ad0216229594abfb26)

# 実装
多少ハッキーな気もしますが、SwiftUI のみで実装しました。

```swift
struct DynamicHeightTextEditor: View {
    @Binding var text: String
    let placeholder: String
    let maxHeight: CGFloat
    
    var body: some View {
        ZStack(alignment: .leading) {
            // プレースホルダー
            if text.isEmpty {
                Text(placeholder)
                    .foregroundColor(.gray)
                    .padding(.leading, 5)
            }
            
            // テキストエディター
            HStack {
                Text(text.isEmpty ? " " : text)
                Spacer(minLength: 0)
            }
            .allowsHitTesting(false)
            .foregroundColor(.clear)
            .padding(.horizontal, 5)
            .padding(.vertical, 10)
            .background(TextEditor(text: $text).offset(y: 1.8))
        }
        .padding(.horizontal, 10)
        .frame(maxHeight: maxHeight) // テキストエディタの最大サイズを設定する
        .fixedSize(horizontal: false, vertical: true) // テキストエディタの最大サイズを設定する
        .background(Color.white) // テキストエディタの背景色
        .mask(RoundedRectangle(cornerRadius: 18).padding(.vertical, 3))
        .background(RoundedRectangle(cornerRadius: 18).stroke(lineWidth: 1).padding(.vertical, 3))
        .onAppear {
            UITextView.appearance().backgroundColor = .clear // TextEditor の背景色を clear にする
        }
        .onDisappear {
            UITextView.appearance().backgroundColor = nil
        }
    }
}
```

これを使えば、上記の GIF は以下のように実装できます。

```swift
struct ContentView: View {
    @State var text = ""
    
    var body: some View {
        VStack {
            Spacer()
            HStack {
                Image(systemName: "camera")
                DynamicHeightTextEditor(text: $text, placeholder: "Aa", maxHeight: 200)
                    .font(.system(size: 18))
            }
            .padding(.horizontal, 10)
            .padding(.vertical, 10)
            .background(Color.gray.opacity(0.5))
        }
    }
}
```

# 解説
テキストエディタ部分は以下のような実装になっています。

```swift
// テキストエディター
HStack {
    Text(text.isEmpty ? " " : text) // サイズ決定用のテキスト
    Spacer(minLength: 0)
}
.allowsHitTesting(false) // サイズ決定用のテキストに触れられなくする
.foregroundColor(.clear) // サイズ決定用のテキストを見えなくする
.padding(.horizontal, 5)
.padding(.vertical, 10)
.background(TextEditor(text: $text).offset(y: 1.8))

```
`TextEditor` は入力内容に関わらず `Spacer` のように広がってしまいます。
というわけで、入力されたテキストに合わせてサイズを決定する必要があります。
ここで、入力された内容を `Text` で表示させ、そのサイズに合わせて `TextEditor` を設置することにしました。

`Text` の `background` として `TextEditor` を設置することでサイズが合わせます。
`Text` が空のときも1文字分の高さが欲しいので空文字を入れておきます。
`padding` や `offset` はテキストとテキストエディタの文字の位置を合わせる調節用です。
`allowsHitTesting(false)` を入れることで、サイズ決定用のテキストによりテキストエディタに触れられなくなるのを防止しています。
p5.jsの関数まとめ part.3 lerpColor() ~ 赤と青の間の色は本当に紫なのか ~

この記事は Qiita p5js アドベントカレンダー4日目の記事です。

## これはなに
書籍[『Generative Design with p5.js』P_1_2_1_01](https://editor.p5js.org/generative-design/sketches/P_1_2_1_01)に登場する関数について理解を深める記事です。
今回は`lerpColor()`です。

## lerpColor()
### リファレンスより
> Blends two colors to find a third color somewhere between them. The amt parameter is the amount to interpolate between the two values where 0.0 is equal to the first color, 0.1 is very near the first color, 0.5 is halfway in between, etc. An amount below 0 will be treated as 0. Likewise, amounts above 1 will be capped at 1. This is different from the behavior of lerp(), but necessary because otherwise numbers outside the range will produce strange and unexpected colors.
> The way that colors are interpolated depends on the current color mode.

> 2つの色をブレンドして、それらの間のどこかにある3番目の色を見つけます。amtパラメータは、2つの値の間を補間する量です。0.0は最初の色と同じ、0.1は最初の色に非常に近い、0.5はその中間、といった具合です。これはLERP()の動作とは異なりますが、範囲外の数値を入力すると奇妙で予期しない色になってしまうので必要です。
> 色の補間方法は、現在のカラーモードに依存します。（DeepL翻訳）


第一引数と第二引数をブレンドした色を、新しいcolorオブジェクトとして返す関数です。
第三引数でどっちの色に寄せていくかを指定できます。
ほぼリファレンスのままですがそういうことです。

### Type
```typescript
lerpColor(c1: Color, c2: Color, amt: number): Color;
```
- c1 始まりの色
- c2 終わりの色
- ブレンドした返り値をc1とc2のどちらに寄せるかを0~1の間で指定する

お？`Color型`ってなんだ？
と思い調べたところ、p5にはColorというクラスがあるようで。
またcolor関数があり、v1, v2, v3はr, g, b。そしてalpha（オプション）を渡すとColor型が返る。

```typescript
color(v1: number, v2: number, v3: number, alpha?: number): Color;
```

下記を出力してみると

```typescript
console.log(color(25, 24, 100))

=> {mode: "hsb", maxes: Object, _array: Array(4), levels: Array(4), toString: ƒ ()…}
```
`hsb`はカラーモードのことです。
つまりcolor()を使うことで色の情報を持ったオブジェクト(Colorのインスタンス)が扱えるようになるわけですね。
これは色指定ができる関数にそのままあてることができます。

```typescript
// 同じ結果
const sampleColor = color(25, 500, 100)
fill(sampleColor)
fill(25, 500, 100)
```

### 試してみる
今回は**「赤と青の間の色は本当に紫なのか」**を検証してみます。
まずは以下のようにして赤と青の正方形を用意します。

```typescript
function setup() {
  createCanvas(800, 800);
  colorMode(RGB);
  noStroke(); // 枠線を隠す
}

function draw() {  
  const color1 = color(255, 0, 0)
  const color2 = color(0, 0, 255)
  
  // 赤の正方形
  fill(color1)
  rect(50, 50, 50, 50)
  // 青の正方形
  fill(color2)
  rect(150, 50, 50, 50)
}
```
![スクリーンショット 2021-12-04 2.40.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/358229/5e5c0578-bf2d-3af5-5726-173b8b6512ad.png)


そして赤と青の中間をlerpColorで取得し、３つ目の正方形に色を当ててみます。

```typescript
function draw() {  
  const color1 = color(255, 0, 0)
  const color2 = color(0, 0, 255)
  // 追加 赤と青の中間色を取得
  const color3 = lerpColor(color1, color2, 0.5)
  
  fill(color1)
  rect(50, 50, 50, 50)
  fill(color2)
  rect(150, 50, 50, 50)
  // 追加
  fill(color3)
  rect(100, 100, 50, 50)
}
```
![スクリーンショット 2021-12-04 2.43.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/358229/ffbabbad-4250-ecd6-78d1-2ae7fd13d6b7.png)


**紫だ！！**
以上。

## どんな時に使えそうか
雰囲気を統一したい時にも一役買いそうな関数だと思いました。
白〜グレー〜黒の中で色が変化するモノトーンなアートを作りたい。
そんな時には引数に白と黒を渡し、amtをrandom(0, 1)にしてlerpColorを使うことでシックなグラデーションを表現できると思います。

```typescript
// 白
const color1 = color(255, 255, 255)
// 黒
const color2 = color(0, 0, 0)
// 白~黒のグラデーションがフレームごとに変化する
const color3 = lerpColor(color1, color2, random(0, 1))
```
移動しながらコスチュームを変更する

キャラクターが歩く時など、スプライトのコスチュームを変更してアニメーションさせたい時があります。ただ、Scratch 3.0ではフレームレートが30FPS（＝１秒間に30回書き換える）と仕様が決まっているので、何も工夫せずにコスチュームを変更するとせかせかとしたアニメーションになってしまいます。
そこで、画面書き換えの何回かに１回だけコスチュームを書き換えるようにしてみましょう。これで、少ないコスチュームでもそれなりに見られるアニメーション効果が出せます。

<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75307/612cc17b-c334-22ee-f734-5d52b8fe5d9d.png">

サンプルプロジェクト

https://scratch.mit.edu/projects/611247305

![スクリーンショット](https://cdn2.scratch.mit.edu/get_image/project/611247305_480x320.png)