OmniAICreator/Qiita-1.07M huggingface dataset:
EV3のカラーセンサーはク〇なのか

部活でロボットを作る過程で先輩や先生から「カラーセンサーは信用しないほうがいい」とか「EV3のカラーセンサーはク○だ」という話を何度も聞いてきました。外部でも同様のことを考えている人が多いように感じます。
ですが、LEGO社ともあろう企業がそんな半端なものを販売するのでしょうか?

# 結論
結論から言うと「**EV3のカラーセンサーはクソではない**」と私は考えています。
下で根拠を説明していきます。

# 根拠
まず「EV3のカラーセンサーはクソである」という風潮がどこから生まれているのか、を考えると「**色モードの色判定がガバガバ**」であることが挙げられます。これに関しては**紛うことなき事実**であり、EV3純正の色モードはクソです。ロボカップやWROでこれに困らない人はいないはずです。
そして、その解決策としてあるのが**RGB**と**HSV**です。これらの機能は、WROやロボカップの全国大会でスタンダードになりつつある気がします。

### RGB
RGBは赤(Red)・緑(Green)・青(Blue)で表される色空間です。詳しくは[こちらを参照](https://wa3.i-3-i.info/word11355.html)

### HSV
HSVは色相(Hue)・彩度(saturation)・明度(value)で表される色空間です。詳しくは[こちらを参照](https://www.peko-step.com/html/hsv.html)
また、HSVはRGBをもとに計算して得られます。[参照](https://www.peko-step.com/tool/hsvrgb.html#:~:text=%E5%A4%89%E6%8F%9B%E3%81%A8%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82-,RGB%E3%81%8B%E3%82%89HSV%E3%81%B8%E3%81%AE%E5%A4%89%E6%8F%9B%E8%A8%88%E7%AE%97%E5%BC%8F,-%E8%89%B2%E7%9B%B8%E3%82%92%E6%B1%82%E3%82%81%E3%82%8B)

---
こいつらを使うメリットは**色の範囲を自分で決められる**ことにあります。つまるところ、純正の色モードがクソなのはハードウェアではなく、ソフトウェア的な要因があるのだとということです。
これらを使うことで測定可能なオブジェクトとの距離も広がります。またHSVはRGBに比べて直感的にしきい値を指定することができます。

私も実際にWROでHSVを使いましたが、かなりの精度で色を判別することができました。

## HiTechnic社のカラーセンサー
では、EV3カラーセンサーの代案としてよく上がるHiTechnic社のカラーセンサーはどうなのか。私はHiTechnic社のカラーセンサーを扱ったことがないので何とも言えませんが、EV3のカラーセンサーよりも高性能なことは確かなので持っているなら使うべきでしょう。ただ「HiTechnic社のセンサーは壊れやすい」という噂を聞いたことがあるので予備は用意した方がいいかもしれません。※この噂が本当なのかに関して責任は持てません。また、1つ1つのセンサーが8,000円程度と高額なのもネックとなります。
ロボットの大会で上位になるのにHiTechnic社のセンサーが必須条件かと言えば、決してそんなことはないと思います。実際にロボカップの全国大会ではEV3を使うチームのほとんどが純正センサーを採用しています。ただし、RGBやHSVを扱うことは、HiTechnic社のセンサーを使うことに比べてやや難易度が高いです。それを考えればHiTechnic社のセンサーを買うのもありだとと思います。
Görli testnet からテストイーサリアムを受け取る方法

# はじめに
「[Truffle のチュートリアル ETHEREUM PET SHOP をやってみた](https://qiita.com/nekoharuyuki/items/d9dd7bf5b5154d259944#metamask%E3%81%A8%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF%E3%83%81%E3%82%A7%E3%83%BC%E3%83%B3%E3%82%92%E6%8E%A5%E7%B6%9A%E3%81%99%E3%82%8B)」で、ウェブ上に分散型アプリケーションを作成する方法をまとめましたが、[MetaMaskとブロックチェーンを接続する](https://qiita.com/nekoharuyuki/items/d9dd7bf5b5154d259944#metamask%E3%81%A8%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF%E3%83%81%E3%82%A7%E3%83%BC%E3%83%B3%E3%82%92%E6%8E%A5%E7%B6%9A%E3%81%99%E3%82%8B) 際に、 [Ganache](https://trufflesuite.com/docs/ganache/quickstart/) を利用してプライベートネットでETHの送金を行いました。

イーサリアムでトークンを作成するにはガス代としてETHが必要です。最終的にはメインネットでトークンを作成することが必要ですが、テストのためだけにメインネットの高額なガス代を支払うのは大変です。
そこで使えるのがテストネットです。テストネットではFuncet経由で無料でガス代を入手することができます。イーサリアムには複数のテストネットがあり、メインネットと同じウォレットアドレスを使用してトークンのやり取りのテストを行うことができます。

テストネットである [Görli Testnet Network](https://github.com/eth-clients/goerli) を [Metamask](https://metamask.io/) に追加し、 Test Ethereum を受け取る方法をまとめました。ちなみに、Görli は **ゲルリ** と読みます。

### 参考にしたサイト
Getting started with the Görli Testnet
URL : https://mudit.blog/getting-started-goerli-testnet/

https://mudit.blog/getting-started-goerli-testnet/

### 参考にした本
* [マスタリング・イーサリアム ―スマートコントラクトとDAppの構築](https://amzn.to/3xRzfF8)
* [SolidityとEthereumによる実践スマートコントラクト開発 ―Truffle Suiteを用いた開発の基礎からデプロイまで](https://amzn.to/3xRWFu5)
* [詳解 ビットコイン ―ゼロから設計する過程で学ぶデジタル通貨システム](https://amzn.to/3xqrGnC)
* [ブロックチェーン dapp＆ゲーム開発入門 Solidityによるイーサリアム分散アプリプログラミング](https://amzn.to/39o2IgD)

## 手順
1. Metamaskウォレットにログインし、ネットワークのドロップダウンをクリックします。
2. [ネットワークの追加]をクリックします。
![スクリーンショット 2022-08-31 9.23.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229633/4e87898e-e8e7-7ffb-eae1-5f271025e1d7.png)
3. 設定ページが表示されます。
![スクリーンショット 2022-08-31 9.19.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229633/28e0b121-0962-c69e-8826-dcc1cc9ba89c.png)
4. 左側のサイドバーで[ネットワーク]をクリックすると、利用可能なすべてのテストネットワークが表示されます。
5. Görli Testnet Network が表示されていない場合は、左側のサイドバーの「高度な設定」をクリックします。
6. 下にスクロールすると、[詳細設定]タブに[テストネットワークを表示する]オプションがあります。「オン」にするだけです。
![スクリーンショット 2022-08-31 9.18.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229633/338181bf-bd51-1b70-d637-9906dc1a8fca.png)
7. これらのステップを完了すると、ドロップダウンリストにカスタムネットワークが表示されます。
![スクリーンショット 2022-08-31 9.13.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229633/c366b215-81ff-ec1e-c93c-e181a53b711b.png)

### テストイーサリアムの受信

:::note warn
警告
2022年9月現在下記の方法ではFaucet出来なくなっています。
:::

1.次のWebサイトにアクセスします： https://faucet.goerli.mudit.blog/
TwitterまたはFacebookアカウントが必要です。

2.Metamaskアドレスをコピーして、下記のようにツイートへ貼り付けます。ツイートした後、URLをコピーします。

https://twitter.com/pirorororonn/status/1559002319534301185

3.ツイートのURLを https://faucet.goerli.mudit.blog/ に貼り付け、必要なテストETHの量を選択します。

4.トランザクションが確認されると、Metamaskウォレットの残高を確認できるようになります。

#### 最近試した方法

下記リンクへアクセスし、Metamaskアドレスを貼り付けてFaucetすることが出来ました。

https://goerlifaucet.com/
前にForkしてきたリポジトリが新しくなったので差分として自分のリポジトリに入れたい

# やりたいこと
- 前にForkしたリポジトリが更新されているので、自分のリモートリポジトリに同じ更新内容を入れたい。
- 更新内容（差分）を手元の枝に入れて、１変更として自分のリモートリポジトリにpushしたい。
- そしてmergeさせて差分を入れたい

# これ見てやった
- フォークしたリポジトリを最新化する方法(https://qiita.com/Nossa/items/ace2ab802adc85f86b20)


# 用語理解
- Forkとcloneって何が違うん
    - https://qiita.com/matsubox/items/09904e4c51e6bc267990

- 追跡ブランチ？
    - https://qiita.com/uasi/items/69368c17c79e99aaddbf


# やったコマンド
1. Fork元のリポジトリURLに"upstream"って名前つけてあげる
    ```
    $ git remote add upstream [http://最新の情報が入ってる他の人のリポジトリ（Fork元）] 
    ```

2. "upstream"ちゃんと設定できたか確認(設定されてないと４行出てこない) 
    ```
    $ git remote -v
    > origin ..
    > origin ..
    > upstream ..
    > upstream ..
    ```

3. "upstream"の最新情報を自分のリモート追跡ブランチに引き込む
    (多分さっきupstream作ったばっかりの人は、これやらなくても最新になってる気がする)
    ```
    $ git fetch upstream
    ```

4. 自分の手元の、差分を入れたい枝に移動
    ```
    $ cd なんちゃら/なんちゃら/入れたいbranch名
    ```
5. 枝に差分を入れる
    ``` 
    $ git merge upstream/master
    ```

6. **自分のリポジトリに**commitしてpush

7. おしまい

# 自分なり解釈

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731109/865d79d9-13e9-835d-a2ec-44685044b57b.jpeg">
VScode起動時にopenSSHが出る場合の対処

# 課題
* githubからsshクローンしたプロジェクトについて、VScodeを開くたびにopenSSHで鍵認証を求められるので、鬱陶しかった.
* 別PCでは発生しなかったので不思議だった.


# 原因
* git.autofetchがtrueになっていたのが原因だった→false
* VScodeを起動するたびにフェッチが実行され、鍵認証されていた

# 解決方法
* git.autofetchをfalseに変更（デフォルトはfalseなので、どこかでtrueに変更していた模様）
* ストレスなく作業できるようになった！
aws lightsailブログの立ち上げ手順（備忘録）

# 目的
* aws lightsailを使ったブログ開設手順を残す（ざっくり）
* いろいろと詰まったので、誰かの参考にはなりそう

# 手順
1. amazon lightsailを立ち上げる
1. 静的IPを設定
1. ドメインを取得（route 53利用）
1. route53のネームサーバー削除
1. route53のドメインの参照ネームサーバー変更
1. bncert-toolでhttps化
1. IP直打ち時のドメイン遷移を設定
1. メールサーバーの設定（gcp, WP Mail SMTP by WPForms利用）
1. wordpressのテンプレ探し
1. 投稿！！

# ハマったところ
### wordpressに古いプラグインを入れたら、ログインできなくなった
対応：FTPクライアントでpluginディレクトリを一時退避（ディレクトリ名を変更）し、ログイン. 上記プラグインを削除してから、戻した

### wordpressからメールが届かなかった
対応：メールサーバーの設定が必要だった（上記、WP Mail SMTP by WPForms利用）

# 情報の探し方
ひたすらググった.
lightsail + wordpressのブログ解説記事を漁りつつ、個々の課題についてはそれぞれの記事を漁った.

# 学び
* awsは手を動かさないと身につかない、、
* バックアップは大事、プラグインの導入前は特に
* 自分が引っ掛かったトラップは、誰かが解決している

以上、どなたかの参考になると幸いです.
Linuxでコマンド操作するときに覚えておきたいショートカットキー

コマンド操作するときに覚えておくと便利なコマンドをまとめます。

# カーソルの移動

## カーソルを行の先頭へ移動
* Ctrl + A

## カーソルを行の最後へ移動
* Ctrl + E

## カーソルを右側へ移動
* Ctrl + F

## カーソルを左側へ移動
* Ctrl + B

# 文字の削除

## カーソルされた文字を削除
* Ctrl + D

## カーソルの左側にある文字を削除
* Ctrl + H

## カーソルの左から行頭まで削除
* Ctrl +U

## カーソル文字含め、右から行末まで削除
* Ctrl + K

## 直前の１単語を削除
* Ctrl + W

## 直前に削除した文字を貼り付け
* Ctrl + Y

## ターミナルのクリア
* Ctrl + L
WSLを入れたWinに`pyenv-win`を入れると、WSLの`pyenv`が使えなくなったので

Pyenv 狂信者なので ←


## 問題

- WSLに `pyenv` を入れていた
- Windows で直接 python がやりたくなって、Windows (PowerShell) に `pyenv-win` を入れた
- WSL起動時に以下が出るようになって `pyenv` が使えなくなった

```shell
/mnt/c/Users/foobar/.pyenv/pyenv-win/bin/pyenv: 3: cygpath: not found
/mnt/c/Users/foobar/.pyenv/pyenv-win/bin/pyenv: 3: exec: cmd: not found
```

## 詳しく状況を調べてみる

- WSLで、`where` で `pyenv` がどこを指しているか確認
```shell
➜  ~ which pyenv
/mnt/c/Users/foobar/.pyenv/pyenv-win/bin/pyenv
```
- 本当は `/home/foobar/.pyenv/bin/pyenv` とかを指していてほしいのに `pyenv-win` に上書きされていた
- WSLで、`whereis` コマンドで `pyenv` 関係のコマンドを一覧してみる
```
➜  ~ whereis pyenv
pyenv: /mnt/c/Users/foobar/.pyenv/pyenv-win/bin/pyenv /mnt/c/Users/foobar/.pyenv/pyenv-win/bin/pyenv.bat /mnt/c/Users/foobar/.pyenv/pyenv-win/bin/pyenv.ps1
```

- `/usr/bin/pyenv` はなぜかないけど、`.bat` と `.ps1` があった。コマンドプロンプトでは `.bat`、PowerShellでは `.ps1` が使われるだろうけど1つ目はWSLにとって邪魔なだけで要らなそうな気がする
- 実際、PowerShell で `pyenv` コマンドがどこを指しているか確認してみると↑と一致。

```
PS C:\Users\foobar> (gcm pyenv).Definition
C:\Users\foobar\.pyenv\pyenv-win\bin\pyenv.ps1
PS C:\Users\foobar>
```

## 解決法 (もっといい方法募集)

- WSL で、 `which` で出てきたやつをどっかにやって、`/home/foobar/.pyenv/bin/pyenv` のシンボリックリンクを張りなおす

```
➜  mv /mnt/c/Users/foobar/.pyenv/pyenv-win/bin/pyenv /mnt/c/Users/stapr/.pyenv/pyenv-win/bin/_pyenv
➜  sudo ln -s /home/nm/.pyenv/bin/pyenv /usr/bin/pyenv
```

で、

おかえり！
![スクリーンショット 2022-09-11 134332.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188173/469e214d-6a30-bc22-b534-9f67ee0d9860.png)


PowerShellの法も問題なし！
![スクリーンショット 2022-09-11 134624.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188173/403873b8-39ff-116c-74bf-c38a421cdcfe.png)

## 以上！
DevOps Centerとは？


[パイプラインをセットアップしようとしていますが、追加されたサンドボックスが環境のドロップダウンに表示されません。 Prod Org のみが表示されます。ある種の設定がありませんか？](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000JdTkY)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/d4454d51-c45f-ff84-6c4e-75d659c2d1f7.png)


パイプラインのドロップダウン リストに環境が表示されない理由に気付きました。環境が開発者環境であることを確認したためです。実際のサンドボックス組織は開発者組織ですが、開発作業ではなく、統合とテストに使用することを目的としています。そのため、これらの組織を設定で開発者組織として指定することはできません。チェックマークは確認できません。チェックされていない場合、パイプライン セクションのドロップダウン リストに環境が表示されます。

上記回答は全く理解できない。何で解決したんだろうなぁ。日本語に訳しても???だ。

# もうすこしDevOps Center について調べてみる

[DevOps Center](https://tddprojects.atlassian.net/wiki/spaces/SF/pages/2441740432/DevOps+Center)
[DevOps Centerの設定方法と使い方](https://qiita.com/Keiji_otsubo/items/f184de61818a909a518f)

これは、DevOps Center への旅の始まりであり、現在は「無料」ツールとして提供されています (将来の機能強化には費用がかかる場合がありますが、基本は EE 以上のライセンスに含まれます)。

私は Pilot を使用してきましたが、これまでで最も困難だったのは、**Centre ではなく Center を入力することでした** なぜああ、なぜああ、なぜ彼らは世界中の聴衆に米国固有のスペルを使用するのですか? 省略形は DoCe です。

知らんがな、米語と英語の違い。どっちも分からん。

**もう変更セットはありません**
セットの変更には NO とだけ言ってください。変更セットを二度と使用しないことを使命としましょう!

**部分的なサンドボックスなし**
残念ながら、部分サンドボックスは開発用ではありません。望むものは何でも望むことができますが、Salesforce がそれらを役立つものにすることは決してありません。それらに対してソース追跡を行うことはできません。適切なデータをサンプリングできず、十分な制御ができません。これは Sandbox Seeding の問題につながりますが、私はまだ優れた解決策を見つけていません。Spanning Backup と Cloud Ally を試しましたが、どちらも比較的単純なデータ構造では機能しませんでした。Snowfakeryが多くの労力をかけてそれを実行できることは知っています。

**DevOps に凝る必要はありません**
DoCe について他の人が言っていることを信じないでください。
+ スクラッチ組織を使用する必要はありません
+ 完全な開発チームとドキュメント化された CI/CD プロセスは必要ありません。
+ 実際、完全な CI/CD プロセスが既にある場合は、それに固執する場合、DoCe は適していません。
+ 他のアドインや有料アプリをインストールする必要はありません。DoCe と連動するように開発されたアプリがありますが、それらは必要ありません。
+ 複雑なデプロイ プロセスは必要ありません。Sandbox から Prod に使用するだけで問題ありません。このページでお話しするのはこれだけです。

**ワークアイテム**
DoCe は、Jira のチケットのようなワーク アイテムから始まります。作業項目を作成して作業を行い、その作業項目に関連付けられた変更を取得してから、その作業項目をデプロイします。それ以外にもありますが、それが基本です。一度に複数のワークアイテムを展開できます。

残念ながら、作業項目は通常のカスタム オブジェクトとは異なり、カスタム フィールドを追加することはできず、通常のチケット システムとして使用することはできません。タイトル、説明、および所有者のみがあります。それはとても制限的です。したがって、チケット システムの URL を [説明] に貼り付けるだけです。

**ソース追跡**
(開発者) サンドボックスで変更を行うと、変更が追跡され、それらの変更を DoCe に取り込み、リンクされた組織 (本番など) に展開します。同時に、舞台裏で変更がコミットされ、Github に保存されます。これは非常に便利です。

変更は、サンドボックス内または直接 SFDX で行い、サンドボックスにアップロードして戻すことができます。DoCe は、作成された場所に関係なく、これらの変更を追跡します。

**Production**
はい、Prod で変更を行った場合、それらを逆マージして Sandbox に戻すことができます。私はまだこれを実際に試していません。
Sublime Textの便利な機能

WinとMacでどちらでも使用しているので忘れないように記載する

# 便利な機能のショートカット

## マルチセレクト
複数の文字列をインタラクティブに選択し、一度にまとめて編集することができます。

* OS X：⌘ + D
* Windows：Ctrl + D

## 矩形選択
矩形選択で複数行の更新ができます。

* OS X：alt を押しながら、左クリックしドラッグで選択。

* Windows：Shift を押しながら、右クリックしドラッグで選択。

## 選択文字列の前後をクォーテーションなどで囲う
マルチセレクトして最初と最後に”などで囲います。

* OS X：⌘ + ⇧ + L で行単位に選択が変わる
* Windows：Ctrl + Shift + L

## 行の削除
現在のカーソル位置の行を削除します。

* OS X：^ + ⇧ + K
* Windows：Ctrl + Shift + K

## 行の移動
現在のカーソル位置の行を行ごと上下に移動します。

* OS X：^ + ⌘ + ↑、^ + ⌘ + ↓
* Windows：Ctrl + Shift + ↑、Ctrl + Shift + ↓

## 行のコピー
現在のカーソル位置の行をそのまま下にコピーします。

* OS X：⌘ + ⇧ + D
* Windows：Ctrl + Shift + D

## コメントアウト・コメントイン

* OS X：⌘ + /
* Windows：Ctrl + /

## 大文字、小文字変換

* OS X：⌘ + K, ⌘ + U （大文字変換）　⌘ + K, ⌘ + L （小文字変換）
* Windows：Ctrl + K, Ctrl +U（大文字変換）　Ctrl + K, Ctrl +L（小文字変換）

## 履歴からペーストする

* OS X：⌘ + K,  ⌘ + V
* Windows：Ctrl + K,Ctrl + V

# 参考

https://dev.classmethod.jp/articles/sublime-text-2-shortcut/
https://www.sublimetext.com/docs/index.html
C# LINQ 複数要素をまとめた形で、ダブり落とし（重複排除、Distinct）


:::note info
複数要素をまとめた形で、ダブり落とし（重複排除、Distinct）
.net6で登場するDistinctByが使えない人向け
:::

・一度各要素を、繋いで一文(string)にする
・Distinct
・あらためて、Split&Parse



```c#:sample.cs
List<double[]> l1 = new List<double[]>();

l1.Add(new double[] { 4,12});
l1.Add(new double[] { 12,12});
l1.Add(new double[] { 6,10});
l1.Add(new double[] { 4,9});
l1.Add(new double[] { 11,9});
l1.Add(new double[] { 13,9});
l1.Add(new double[] { 7,5});
l1.Add(new double[] { 8,3});
l1.Add(new double[] { 6,2});

//以下重複分
l1.Add(new double[] { 4,12});
l1.Add(new double[] { 12,12});
l1.Add(new double[] { 6,10});
l1.Add(new double[] { 4,12});
l1.Add(new double[] { 4,12});

var l1_dis = l1
	.Select(p => string.Join("_",p))
	.Distinct()
	.Select(p => p.Split('_').Select(a => double.Parse(a)).ToArray())
	.ToArray();

foreach(var ll1_dis in l1_dis ){
	Console.WriteLine("ll1_dis: "+ string.Join(", ",ll1_dis) );
}
```


以下、結果（ダブり落としされている）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107418/16473a65-ef4b-d0fc-2846-6268296556a7.png)
シャトルランで流れる電子音をPythonで作成する

# はじめに
[20メートルシャトルラン](https://ja.wikipedia.org/wiki/20%E3%83%A1%E3%83%BC%E3%83%88%E3%83%AB%E3%82%B7%E3%83%A3%E3%83%88%E3%83%AB%E3%83%A9%E3%83%B3)とは一定時間、一定間隔で20m走り続ける体力測定の方法のひとつです。
最近の学校では持久走のかわりにこれをおこなっているようですが、私はやったことありません。
この測定時にタイミングを合わせるために電子音が流れますが、その電子音を作成します。
具体的には[シャトルランの楽譜を作ってみた](https://www.youtube.com/watch?v=M3AjjbbDrTU)のような音のようです。

# 方針
シャトルランでは１分間決められた速度で20m走を繰り返していきます。
そして１分間ごとにレベル（速度）が上がります。速度があがるのでレベル毎の走る回数も増えます。また、レベル毎に流れる電子音のBPMもあわせてあげる必要があります。
レベル毎の速度とBPMの関係は[20mシャトルランの速さ](https://newbal.wiki.fc2.com/wiki/20m%E3%82%B7%E3%83%A3%E3%83%88%E3%83%AB%E3%83%A9%E3%83%B3%E3%81%AE%E9%80%9F%E3%81%95)に記載の表のようになります。

電子音のデータは[music21](https://web.mit.edu/music21/)というライブラリを利用して作成します。
別途[MuseScore](https://musescore.org/ja)という楽譜作成ソフトのインストールが必要ですが、音楽には素人の私ような人間でも直感的なコードで簡単にMIDIデータや楽譜を作成してくれるとても便利なライブラリです。

# コード

いきなりですが、全体コードです。
```Python
from music21 import *
import math

# レベル開始時のメロディ
def add_start(s):
    c = chord.Chord([note.Note('C5'),note.Note('C6')], quarterLength=0.25)
    s.append(c)
    c = chord.Chord([note.Note('G4'),note.Note('G5')], quarterLength=0.25)
    s.append(c)
    c = chord.Chord([note.Note('D5'),note.Note('D6')], quarterLength=0.5)
    s.append(c)

# １走行中のメロディ
def add_run(s, is_up, is_end):

    # 音階の向き
    ns = [f'{c}4' for c in 'CDEFGAB'] + ['C5']
    if not is_up:
        ns.reverse()
    s.append([note.Note(n) for n in ns])

    # 最後以外は和音が入る
    if not is_end:
        c = chord.Chord([note.Note('C4'),note.Note('C3')])
        s.append(c)


s = stream.Stream()
s.append(meter.TimeSignature('9/4'))

st_cnt = 1   # 累積開始回
total_cnt = 0# 累積走行数
for i in range(19):

    # 走行速度 m/h
    if i == 0:
        v = 8000
    else:
        v = 9000 + 500*(i-1)

    # このレベルの回数
    loop_cnt = math.ceil( v/60 / 20) # 1min=60sec で20mを何回走れるか
    # ピッタリならさらに１回
    if divmod(v/60,20)[1] == 0:
        loop_cnt += 1

    ed_cnt = st_cnt + loop_cnt - 1 # 累積終了回
    bpm = 60 / 8000 * v
    print(f'Lv={i+1:2}, 回数={st_cnt:3}～{ed_cnt:3}({loop_cnt:2}), BPM={bpm:6.2f}, 走行速度={v/1000:4.1f}')
    st_cnt = ed_cnt + 1

    # MIDIデータの作成
    s.append(tempo.MetronomeMark(number=bpm))
    add_start(s)
    for i in range(loop_cnt):
        add_run(s, total_cnt%2==0, i == (loop_cnt-1))
        total_cnt += 1

s.write('midi', 'run.mid')
print('show')
s.show()
```
ざっくり説明すると、まずはレベル毎に走行回数とBPMを計算して求めます。
次に、指定のBPMで走行回数分だけ電子音データを作成していきます。
最後にできたデータをMIDI形式で出力し、ついでに楽譜表示します。
![temp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175214/d8604530-61c9-aaf2-ca0a-79f83e82ec29.png)


# 考察、その他
レベル開始時に流れる「ピロリ」というメロディや１走行終了後の和音の出現ルールが分からず苦労しました。楽譜をコードで書き出しては[シャトルランの楽譜を作ってみた](https://www.youtube.com/watch?v=M3AjjbbDrTU)の楽譜と照らし合わせながらなんとかコード化できました。
完全に正しいかは分かりませんが、[20メートルシャトルラン](https://ja.wikipedia.org/wiki/20%E3%83%A1%E3%83%BC%E3%83%88%E3%83%AB%E3%82%B7%E3%83%A3%E3%83%88%E3%83%AB%E3%83%A9%E3%83%B3)に記載されている累積時間と出力MIDIの再生時間は一致しているので問題ないかと思います。

ちなみに60分(レベル19まで)続けると、走行距離は1162回x20m=23.24km、最終速度は37.5km/sとなるようです。

元ネタ：[Python でシャトルランプログラムを作りたい！](https://teratail.com/questions/5lh6tfmftncd4i#reply-11eovfng34p6m8)
Amazon CloudWatch SyntheticsのCanaryグループを試す

# はじめに
最近のアップデートで、SyntheticsのCanaryをグルーピングできる機能が追加されていました。

https://aws.amazon.com/jp/about-aws/whats-new/2022/08/amazon-cloudwatch-synthetics-support-custom-canary-groups-group-level-availability-metrics/

気になるので試してみます。

Amazon CloudWatch Syntheticsとは：

https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries.html


# 試してみる
簡単ですが以下の構成で試してみます。

異なるリージョンに存在するCanaryもグルーピングできるそうなので、リージョンをまたがる形で作成します。

![qiita_synthetics.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675893/4ea17f15-0574-1360-d8ff-2852dd5c1214.png)

こういった検証の際には[App Runner][link-1]が楽で良いですね。

コンテナイメージには[ECR Public Gallery][link-2]のApacheコンテナを利用しました。
(public.ecr.aws/docker/library/httpd:latest)

## Canaryグループの作成
CanaryグループはSynstheticsのコンソールから作成できます。
![image_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675893/26f78e06-f5fb-3aea-722d-29b42650d7df.png)

「Create group」を選択後、グループに含めるCanaryの名前を検索し、追加します。
![image_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675893/b465f717-54cf-f188-322e-77e79bcd10be.png)

グループが作成されました。
(Slowest perfoemersの表記が少し気になりますね。)
![image_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675893/5697aead-7027-776e-678f-22ff75b9f082.png)

試しに、東京リージョンのコンテナを停止させると、グループの最終実行が「1/2失敗」となりました。
アラームも何個上がっているのかが一目でわかります。
![image_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675893/6ccee10a-8b57-ccce-7307-c610725b15a6.png)

ちなみにグループはグローバルリソースなので、作成したリージョン以外からも確認や編集ができます。

> グループはグローバルリソースです。グループを作成すると、グループをサポートするすべての AWS リージョンに渡って複製されます。これらのリージョンのいずれかから canary を追加することができ、これらのリージョンのすべてで表示できるようになります。グループ ARN 形式には作成されたリージョン名が反映されますが、グループはリージョンに制約されません。これは、複数のリージョンからの canary を同じグループに配置し、そのグループを使用して、それらすべての canary を単一のビューで表示および管理できることを意味します。

https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Groups.html

## まとめ
Synstheticsのアップデート、Canaryグループを試してみました。
複数のCanaryを使っている場合にコンソール上から管理がしやすくなると思います。
グループの作成自体は無料であり、既存Canaryもグループに追加できるので大量にCanaryを管理しているプロジェクトでは導入を検討しても良いかと思います。

<!---以下リンク--->
[link-1]:https://aws.amazon.com/jp/apprunner/
[link-2]:https://gallery.ecr.aws/
Java・Kotlin得意マンがRustの文字列の納得に時間を要した話

Javaを20年やってきた自分が、Javaの先入観からかRustで```String::from("hoge");```という書き方をすることに納得するまで時間を要したので整理。

## Java
文字列リテラル=```String```
```String```は固定長の文字列を扱うクラス。
+で連結できるが、インスタンスが保持している文字列に付け加えているわけではなく、新しいインスタンスが生成される。
Kotlinの場合は+演算子をオーバーロードしているが、起きていることはJavaと同じはず。

場合にもよるが、```String```を連結したい場合は```StringBuilder```を使うのが良いとされている。
※コンパイラがいい感じにしてくれるので、そこまで神経質にならなくても良いっぽい

## Rust
文字列リテラル=```&'static str```
メモリ上の不変の部分に存在している。

文字列の連結など、可変長の文字列を扱う場合は```String```。
```String```の参照はそのまま```&str```として扱うこともできる。
逆に、```&str```を```&String```扱いはできないので、```String::from```や```to_string```で変換（cloneして所有）する必要がある。


## 整理
書き方のせいであまり意識することはないが、Javaにおいても文字列リテラルのために確保されたメモリ領域を伸長して文字を追加したりはできない。
Rustにおける```String::from("hoge");```を、Javaの```new StringBuilder("hoge");```だと思えば特に変な話ではない。
【設計検討中】vmwareで作成したサーバ郡をマネージメントコンソールっぽくする

2022/09/17 更新

## 背景

VMWare Workstation 15 Playerで仮想サーバをローカルPCに構築しています。
しかしながら、VMware仮想マシン構成ファイル (.vmx)を毎回選択して起動するのに手間がかかるため、
AWSマネージメントコンソールのような画面をつくって、
サーバ起動・停止・サスペンド・ovfファイル取得操作をブラウザから可能にする機能を考えております。

## 設計
物理筐体：ごく一般のPC
（Windows10、CORE i5、メモリ8GB、外付けHDD1TB）
構成：
* イメージファイル：ovfファイル（awsでいうami）を作成
* サーバ:vmx、vmdkファイル等
起動方法：コマンドプロンプトからVMware 仮想マシン構成ファイルのフルパス (.vmx)で実施
デプロイ：ovftoolでインポート

　　　　参考：https://tech-mmmm.blogspot.com/2020/09/ovf-tool.html
実現方法：htmlファイルに実装させ、ファイル実行させるようにする。
（ただし、ファイル実行の場合ブラウザ側でセキュリティ違反で実行できない場合がある（というかほぼ有り）なので、どうするかは検討が必要。）

## 展望
ローカルPC内に完結させるが、他のPCへのデプロイやクラウドへの移行も視野に入れる。
古いPCがあるので、openstackを入れて、自身の作ったovaファイルを取り込みできたら嬉しい。


更新があり次第、アップデートさせていただきます。
Salesforce認定アドミニストレーター試験の公式練習問題を解説してみた-その020

こんにちは。本橋孝昭です。

Salesforce認定アドミニストレーター試験の公式練習問題があるのはご存じでしょうか。
Trailheadにフラッシュカードとして何度も解ける練習問題がございます。

今回はTrailhead
アドミニストレーター認定の準備: 構成、設定とオブジェクト
オブジェクトマネージャと Lightning アプリケーションビルダーの確認
　にある練習問題8問目をご紹介します。
https://trailhead.salesforce.com/ja/content/learn/modules/administrator-certification-prep-setup-and-objects/practice-user-setup

こちらの内容は動画でも公開しています

https://www.youtube.com/watch?v=i7YY4VeA0g8

オブジェクトマネージャと Lightning アプリケーションビルダーの確認
練習問題8問目はこちらです

![008.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/13db7228-c982-554f-4480-f6863d994619.png)



ページレイアウトの設定を特定のユーザのみ変更したい場合、どうするか　という問題ですね

正解はAでした
ページレイアウトを作成しレコードタイプを作成して特定のユーザに割り当てることで関連リストに表示する表示しない　の設定が可能です

Bが間違っている理由について
レコードを非公開に設定すると「すべてのユーザがレポートを表示」ができなくなるので間違いです

Cが間違っている理由について
レポートを作成したちころで今回の問題のように「特定のチームのみ関連リストに表示させる」という設定ができないので間違いです

Dが間違っている理由について
特定のユーザにオブジェクトのアクセス権を設定しても「すべてのユーザがレポートを表示」ができなくなるので間違いです

ここら辺。プロファイルとページレイアウトの関係は文章で表すと難しくなってしまいます

ぜひ解説動画をご確認ください

<iframe width="560" height="315" src="https://www.youtube.com/embed/i7YY4VeA0g8" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>



今日の内容はここまでです。
皆さん楽しく元気にSalesforceを学びましょう！
Dockerコンテナからホストにアクセスする（ホストのIPアドレス取得方法）for Linux

## 方法

`docker run` に `--add-host=host.docker.internal:host-gateway` オプションを付ける。

## 例

```bash
docker run -it --add-host=host.docker.internal:host-gateway python bash
```

コンテナ内にて、`cat /etc/hosts` で `host.docker.internal` が追加されていることが分かる。

```bash
cat /etc/hosts

127.0.0.1       localhost
::1     localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
192.168.65.2    host.docker.internal
172.17.0.3      c755951ee0f1
```
ネットワーク構築 #8 (時刻設定)

# 今回の内容
NTPサーバーと同期して、ルーターの時刻を設定する。
実施日:2022/09/10~2022/09/11

# 設定
```
###日本時間に合わせます。
R1(config)#clock timezone JST 9
R1(config)#exit
###NTPサーバーと同期の設定(preferが付いているものは同期が優先される)
R1(config)#ntp server 133.243.238.163 prefer
R1(config)#ntp server 133.243.238.164

R1#show calendar
15:19:47 JST Sat Sep 10 2022
###正しい時刻から約50分程時間が進んでいてズレています。

###NTPサーバーとの同期の状態を確認します。
R1#show ntp status
Clock is synchronized, stratum 2, reference is 133.243.238.16
nominal freq is 250.0000 Hz, actual freq is 249.8989 Hz, precision is 2**15
reference time is E6C6A852.B6539580 (15:08:18.712 JST Sat Sep 10 2022)
clock offset is -150.3905 msec, root delay is 3.53 msec
root dispersion is 169.70 msec, peer dispersion is 1.81 msec
loopfilter state is 'SPIK' (Spike), drift is 0.000404150 s/s
system poll interval is 64, last update was 245 sec ago.

R1#show ntp association
  address         ref clock       st   when   poll reach  delay  offset   disp
*~133.243.238.163 .NICT.           1     30     64    17  4.115 -14.866  2.650
+~133.243.238.164 .NICT.           1     12     64    17  3.401 -20.824  2.395
 * sys.peer, # selected, + candidate, - outlyer, x falseticker, ~ configured
### *がついているので、133.243.238.163と同期されていることが判ります。

###時刻確認のコマンドを間違えていた。
R1#show clock
15:39:37.264 JST Sat Sep 10 2022
###正しい時間が表示されました。
###R1#show calendarはハードウェアクロックであるため、NTPサーバーと同期をしても、表示される時間がルーター上に設定されている時刻を
###を表示しているため、NTPサーバーと時刻が一致しませんでした。

R1(config)#ntp update-calendar
###上記のコマンドを実行すると、NTPサーバーとハードウェアクロックが同期されるため、
###R1#show calendarを実行しても正しい時刻が表示されました。
```

# 他のルーターの設定
他のルーターもNTPサーバーと時刻同期をして、ルーター内の時刻を正しい時間に設定をしたい。
ただ、R1で設定したコマンドをルーター毎に実行するのも面倒であるため、手間の掛からない方法はないか。
①ntp broadcast
②ntp multicast
これらのコマンドを使用すれば、ピアに時刻同期が出来るようです。

①ntp broadcast⇒同一セグメント内での同期のみ(DHCPサーバーのようにip helper-addressのようなものは無し)、ルーター上で実行できない。
②ntp multicast⇒ルーター上で実行が出来ない、L3スイッチでのみ可能?

同じ設定をルーターの数だけ実行するのはやはり面倒ですが、ntp ?でコマンドを確認するとコマンド2つとも表示されなかったためユニキャストで台数分設定しました。

# 追記 2022/10/02
debug ip packet実行時に表示される時刻が日本時間になっていなかったため、日本時間表示の設定は以下が必要。
```
(config)# service timestamps log datetime msec localtime show-timezone
(config)# service timestamps debug datetime msec localtime show-timezone
(config)# clock timezone JST 9
```
今回はここまで。
heroku上のweb serviceをrenderに移行してみた

# Motivation
[twilioとSendGridとherokuでキャリアメール代替プッシュ通知](https://qiita.com/kamotsuru/items/358f0e6f3d68ba4fc322)など、いくつかのwebアプリサーバをherokuの無料サービスで動かしていたのですが、11末で終了となると言うことで、移行先を探して私の条件に合うrender.comに移行してみました。
render.comのfree planは同一アカウント内でトータル月750時間までのサーバ起動は無料で、15分アクセスがないとサーバがサスペンド状態になり、次のアクセスが来ると再起動に15秒かかります。多数接続がない、処理にリアルタイム性は不要な私の用には事足ります。

# 事前準備
- githubまたはgitlabのアカウントを作成(私の場合githubのアカウントを既に持っていたので、以下githubの例です。)
- render.comでアカウントを作成

# herokuのlocal repositoryをgithubのprivate repositoryにコピー
1. [GitHubで無料プライベートリポジトリを設定する方法](https://zenn.dev/gk12/articles/879f4763c0fa47)を参考にgithubでprivate repositoryを作成します。
2. 「2.cloneで空のローカルリポジトリを作る」で自分のローカル環境にローカルリポジトリをcloneし、herokuのローカルリポジトリの中にあるソース一式をコピーして、commit/pushします。この時、Procfileはheroku特有のものなので不要です。また、githubはデフォルトではmainブランチが作られるので、明示的に指定しない限りpush先はmasterではなくmainブランチです。
```
git push -u origin main
```

# renderとgithubのrepositoryを接続
初めて作る時がどうだったか失念しましたが、右上のNew +ボタンからWeb Serviceを選ぶとCreate a new Web Serviceの画面に遷移し、何もrepositoryがありません。
![createwebservice1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117100/fc51ec39-f740-fbca-2462-705ebc481ec0.png)




上右のGitHub +Connect accountを押すと、github側でrepositoryへのアクセス許可の画面が現れ、私はAll repositoriesへのアクセス許可にチェックし、installボタンを押しました。
![github.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117100/ec37f9c9-465d-716a-9844-6a731cb2e662.png)


すると、こんな感じでrender側からgithubのrepositoryに接続できるようになるのでrenderで立てたいweb serviceのrepositoryにConnectします。
![createwebservice2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117100/c290b0c1-4834-d839-8200-d106282a8cb0.png)

web serviceの情報を記載して一番下のCreate Web Serviceボタンで、repositoryのdeployが始まります。
また、[twilioとSendGridとherokuでキャリアメール代替プッシュ通知](https://qiita.com/kamotsuru/items/358f0e6f3d68ba4fc322)の通り、環境変数でtwilioのACCOUNT SID等を設定しているのですが、真ん中より下にあるAdd Environment Variableから環境変数が指定できます。
![createnewwebservice.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117100/315735eb-c61c-e48b-d4e1-3542064bf45e.png)

2,3分で、web serviceが立ち上がります。
![xstarted.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117100/de8c5414-f6a9-de1a-8595-d7c4dcec0d1a.png)

# ログと利用状況
処理時のコンソールログも当該web serviceのDashboardのLogsから見れます。
![log.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117100/fcf2de33-96c0-140e-6508-63e6cfe14ca8.png)

当月の利用時間はMetricsから見れます。CPUとMemoryの利用率が見えたり見えなかったり
![netrics.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117100/6095cbdf-cc11-f428-f0d0-89973f1e9b68.png)

# 最後に
非常に、簡単でした。
Ruby on Rails　link_toのパスの引数に.idって、いるの？いらないの？(自分用メモ)


# はじめに
Ruby on Railsのlink_toの読み方についてなんとなく理解したので
自分用メモとして投稿します。
(自分にしかわからない書き方となっていること、ご了承ください:bow:)

# link_toのパスの引数に.idって、いるの？いらないの？

#### link_toの記述方法
```
<%= link_to "表示したいテキスト", url又はパス %>
```
補足：link_toのHTTPメソッドは特に設定しなければGETになる。
　　　そのため、もし設定したい場合は下記のようにmethodオプションを設定すること
```
<%= link_to "表示したいテキスト", url又はパス, method: :HTTPメソッド %>
```



#### 今回のコード
```show.html.erb
<%= link_to "編集", edit_list_path(@list.id) %>
```
コードの意味：ブラウザに”編集”と表示させるよ。
　　　　　　　”編集”を押すとedit_list_path(@list.id)に飛ぶよ。

#### 疑問点。。。
対象のコントローラには`@list = List.find(params[:id])`と定義して、
Listモデル？テーブルの対象のidの情報をもってきている。
そのため、`link_to`のパスの記述で引数には`.id`いらないのでは？重複してない？


#### やってみよう！
`.id`を消してみた！
```show.html.erb
<%= link_to "編集", edit_list_path(@list) %>
```

#### 結果。。。
表示されるし、エラーも出ませんでした。
念のためメンターさんに質問したところ下記の回答が得られました。

#### メンターさんの回答
対象のコントローラには`@list = List.find(params[:id])`と定義しているので
Listテーブルの対象のidの情報の<font color=red>レコード全て</font>をもってきている。(今回の場合、idとtitleとbody)
対象のidのレコード全てを持ってきてはいるものの、<font color=red>どのidかということは`find(params[:id])`の記載で一応特定できるので、パスの引数に`.id`があってもなくてもいける</font>状態になる。
そのため、今回の事象についてはあってもなくても問題ないですが、`.id`を書く方が丁寧ではありますよね。

とのことです！

# 終わりに
まだまだ細かい点が理解できていないので少しずつでも解消していきたいと思います！
kintone の複数アプリへのレコード一括処理で、ルックアップが含まれたデータを同時に作成する

bulkRequest の API で、同時に複数のアプリに POST をする際の検証です。
アプリ 1 とアプリ 2 に対して POST を行う際に、アプリ 2 がアプリ　1 の名前などをルックアップとして持っている際にも 1 リクエストで完結できるのか確認をしました。
結論リクエストの body に含まれるデータの順番さえ気をつければ問題なく使用できました。

https://developer.cybozu.io/hc/ja/articles/201941814

下記はサンプルにあるコードを一部変更したもので、アプリ 1 とアプリ 2 に POST をするケースです。
アプリ 2 にはアプリ 1 の Name をルックアップとして持っています。

```json
{
    "requests": [
        {
            "method": "POST",
            "api": "/k/v1/record.json",
            "payload": {
                "app": 1,
                "record": {
                    "name": {
                        "value": "hoge"
                    }
                }
            }
        },
        {
            "method": "POST",
            "api": "/k/v1/record.json",
            "payload": {
                "app": 2,
                "record": {
                    "name": {
                        "value": "fuga"
                    },
                    "app1_name": {
                        "value": "hoge"
                    }
                }
            }
        }
    ]
}
```

この場合、アプリ 1 のデータが先に作成されるため、アプリ 2 の `app1_name.value = hoge` として指定をしてあげることで 1 リクエストで完結させられました。
もちろん、アプリ 2 のデータを先に指定するとエラーになります。
複数のアプリに同時に POST をする場合には、ルックアップをしていないアプリから順に作成して行くことで、1 つのリクエストで完結させることができそうです。
オブジェクト指向 とは

# 目的
- オブジェクト指向とは何かを抽象的に理解する

# オブジェクトの性質
- Ruby は全てものもがオブジェクトでできている
- オブジェクトは、いずれもなんらかの型（クラス）に属している
（"apple" は Stringクラス に属している）
- クラスによって別々のメソッドを持つ
（pry の ls で確認してみる）
- インスタンスはオブジェクトから実体化したオブジェクト
（"apple" は Stringクラス の インスタンス）

# オブジェクト指向とは
- クラスをもとにインスタンスを作る考え方
（hash = Hash.new <= ハッシュクラスから、そのメソッドが使えるインスタンスを生成）
- メリットは、同じ性質のものを簡単に作れること・コードの修正箇所が減ること
- インスタンス変数はインスタンス内で使いまわせる変数のこと
（@ をつける）


# 例
```ruby
#任意の名前が出力できるメソッド
# =>引数に名前を入れる

class Student
  def say_name
    puts @name
  end

  def say_name=(name)
    @name = name
  end

  def initialize(name)
    @name = name
  end

end

s1 = Student.new("太郎")
s2 = Student.new("二郎")
s1.say_name
s2.say_name



```
~実際の表示~
太郎
二郎
ヤマハルータのFQDN フィルター機能を外部へのサーバ公開に使うときは注意

# はじめに
自宅サーバの Let's encrypt 証明書の更新は certbot に任せていたはずなのに更新されてないよメールが飛んできたので、その対処をしたときのメモ。

# 切り分け
まず始めに自宅サーバで `tcpdump -i eth0 -n` を実行しながら `certbot renew` を実行してみる。
⇒何もパケットが飛んでこない。もちろん証明書更新は失敗。
⇒ルータのフィルタが原因か？でも前回の更新は成功して、そこからフィルタ設定変えてないよな？

フィルタをいったんガバガバにしてみる
【Before】
`ip filter 11000 pass * yourserver.example tcp * 80,443`
【After】
`ip filter 11000 pass * * tcp * 80,443`
⇒通った

念のため、外部サイトを使って名前解決結果と実アドレスが一致することを確認しておく。
http://www.cman.jp/network/support/nslookup.html
vs
`ip address show dev eth0`
⇒一致

これによって、使用しているヤマハルータのFQDNフィルター機能の仕様が原因では？と推察し、詳しく調べてみることにした。

# 原因
ヤマハルータのFQNフィルター機能は、ヤマハルータ自身がDNSリカーシブサーバとして解決し自身のDNSキャッシュに載っているFQDNについてのみ、動作する。
そのため、外部から特定のグローバルIPアドレス(yourserver.example)を持つサーバへの着信のみを許可したい場合に

```
ip filter 11000 pass * yourserver.example tcp * 80,443
```

と書いたとしても、yourserver.exmaple がヤマハルータ自身によって解決されDNSキャッシュされていない限り、
つまり、ヤマハルータ配下の他の端末によって yourserver.example の解決がリクエストされない限り pass しない。

# 対策
自宅サーバの cron にでも名前解決を突っ込んでおきましょう。

``` crontab
* * * * * dig yourserver.example >/dev/null
```

# 参照
[FQDN機能](http://www.rtpro.yamaha.co.jp/RT/docs/fqdn_filter/index.html#:~:text=ip%20host%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%AE%E8%A8%AD%E5%AE%9A%E5%80%A4%E3%80%81dns%20static%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%AE%E8%A8%AD%E5%AE%9A%E5%80%A4%E3%80%81DNS%E3%82%AD%E3%83%A3%E3%83%83%E3%82%B7%E3%83%A5%E3%81%AE%E9%A0%86%E3%81%A7%E6%A4%9C%E7%B4%A2%E3%81%97%E3%81%BE%E3%81%99%E3%80%82)
> ip hostコマンドの設定値、dns staticコマンドの設定値、DNSキャッシュの順で検索します。

いやこの仕様読み取れんだろ・・・
【PHP】ひらがな化APIを使ってみた

# 初めに
Excelにて漢字にふりがなをつけようとしたが、CSVをインポートしたデータやWEBページからコピペしたテキストには自動でふりがなが付かないことがわかった。そのため、代替手段として[gooラボ](https://labs.goo.ne.jp/)の[ひらがな化API ](https://labs.goo.ne.jp/api/jp/hiragana-translation/)を使用することにした。

:::note alert
[gooラボ API](https://help.goo.ne.jp/help/article/2852/)が2025年3月3日にサービス終了となりましたので、現在このコードは使えません。
代替サービスとして、Yahoo!の「ルビ振りAPI」があります。
:::

https://qiita.com/Tatsuki_Yo/items/5e6436f5723baf4c54f4

>[リファレンス](https://labs.goo.ne.jp/api/jp/hiragana-translation/)より引用
>ひらがな化APIはリクエストで送られた日本語文字列を、ひらがな もしくは カタカナ による記載に変換します。

## 環境
- Mac OS12.4(M1)
- PHP 8.1.2

## パラメータ
* app_id(必須項目) => 利用登録をし、取得する
* request_id => リクエストID、省略可
* sentence(必須項目) =>  解析対象テキスト
* output_type (必須項目) =>hiragana(ひらがな化) or katakana(カタカナ化)

本コードではparamsにてパラメータをセットしてください。
※事前に[利用登録](https://labs.goo.ne.jp/jp/apiregister/)を行い、app_idを取得すること。
※GETメソッドでは取得できないため、POSTメソッドを使用する必要がある

# コード
```PHP:hiragana_api.php
<?php

$url = "https://labs.goo.ne.jp/api/hiragana";
$params = array(
    'app_id' => '各自で取得したIDを入力してください',
    'sentence' => 'ここの漢字が変換されます',
    'output_type' => 'hiragana',
);
$params = json_encode($params); // json化
$header = array(
    "Content-Length: " . strlen($params),
    "Accept: application/json",
    "Content-Type: application/json",
);

$context = array(
    "http" => array(
        "method"  => 'POST',
        "header"  => implode("\r\n", $header),
        "content" => $params
    )
);
//APIを叩く
$json_response = file_get_contents($url, false, stream_context_create($context));
$array = json_decode($json_response, true);  //array変換

//出力例
print_r($json_response); // json結果
print_r($http_response_header); // header配列
print_r($array);  //JSONをarray変換
echo $array["converted"]  //変換結果のみ抽出

```

# レスポンス例
```JSON:response.json
{
    "converted": "ここの かんじが へんかんされます",
    "output_type": "hiragana",
    "request_id": "labs.goo.ne.jp\t1662859439\t0"
}
```

# 終わりに
このAPIを使用することで、自動でふりがなをつけることができた。精度はイマイチな部分もあるが、手動でするよりもはるかに工数が減らせるので、非常に有用なAPIだと思う。

gooラボAPIには他にも、[形態素解析API](https://labs.goo.ne.jp/api/jp/morphological-analysis/)や[時刻情報正規化API](https://labs.goo.ne.jp/api/jp/time-normalization)、[キーワード抽出API](https://labs.goo.ne.jp/api/jp/keyword-extraction/)、[固有表現抽出API](https://labs.goo.ne.jp/api/jp/named-entity-extraction/)など非常に有用なAPIが多くある、今後もさまざまなAPIを使ってみたいと思う。

#Twitterのツイート分析ができそう(ツイートを収集→各種APIでいつどこか分析→マーケティングなどで使用)

使用にあたっては[利用規約](https://labs.goo.ne.jp/jp/apiterm/)の範囲内、非商用でお使いください。詳細は[公式リファレンス](https://labs.goo.ne.jp/api/jp/hiragana-translation/)を読んでお使いください。

# 参考サイト
https://labs.goo.ne.jp/api/jp/hiragana-translation/

https://qooga.jb-jk.net/wp/execute-api-to-post-json-in-php/
連想配列の繰り返し処理

# 目的
-連想配列における繰り返し処理の方法を理解する

# ポイント
- ループごとにHash のキーが第一引数に、バリューが第二引数として渡される
- 配列の繰り返し処理とブロック内の書き方は変わらない
# 書き方の例
```ruby
scores = {japanese: 30, english: 20}


scores.each do |key, value|
  puts "#{key}の点数は#{value}です"
end

#scores.each {|k, v| puts "#{k}の点数は#{v}です"}


```
~実際の表示~
japaneseの点数は30です
englishの点数は20です


# 注意するポイント
- 第一引数、第二引数の変数は、なんでも良い



# 具体的な例
```ruby
#変数userの各要素の値を全て小文字に変換した内容を別のHashに代入
# => 各要素に同じ処理をするため、繰り返し処理を使う
# => downcase で小文字に変換
# => 連想配列の形で表示(.to_h)(map)
user = {first_name: "NakaTa", last_name: "DaIchi"}

result = user.map {|k,v| [k,v.downcase]}.to_h
#result = user.to_h{|k, v| [k, v.downcase]}  ペアごとに処理をしてくれるため、map を書かなくても良い
#result = user.transform_values{|v| v.downcase}  valueのみを変更するメソッドなので、key を省略できる
#result = user.transform_values(&:downcase)

p result

```
~実際の表示~
{:first_name=>"nakata", :last_name=>"daichi"}
Linux lsof、fuser、chageコマンドについて（自分用メモ

●lsofコマンド
特定のポートを使用しているプロセスなど、ローカルホストの様々なプロセス情報を表示。特定のポート番号を指定する場合は「lsof -i:ポート番号」
プロセス名を指定することもできる。その場合は、「-c プロセス名」オプションを付ける。

●fuserコマンド
ローカルホストのリソースを使用しているプロセスを検索し、情報を表示。lsofコマンドは情報を表示するだけだが、fuserコマンドでは表示だけではなく、検索したプロセスに対してシグナルを送ることができる。

fuser [オプション] 検索対象

・-k プロセスにSIGKILLを送信(kill)。送りたいシグナルを指定するには-kではなく[-シグナル名」とする。
・-m マウントされたファイルシステムを指定
・-n 検索する領域(名前空間)を指定(namespace)。file(ファイル名:デフォルト)、udp(UDPポート番号)、tcp(TCPポート番号)が指定できる
・-u 検索結果にユーザ名を追加(user)
・-v詳細な情報を表示(verbose)



●パスワードの有効期限に関する設定が可能なコマンドは、「chage」、「passwd」、「usermod」コマンド

●「chage」はパスワードの有効期限の設定に特化したコマンド（CHange password AGEの略）で、詳細な設定やその表示が可能です。
なお、パスワードの有効期限に関する情報は「/etc/shadow」ファイルに保存されます。

chage [オプション] ユーザ名

オプション
・オプションなし　対話モード（ユーザ名の指定は必要）
・-l　パスワードの有効期限に関する情報を表示(ls)
・-m パスワード変更の間隔の最短日数を指定(パスワードを変更できるようになるまでの日数)(minimun)
・-M パスワードが有効な最長日数を指定(何日ごとに必ずパスワードを変更させるか)
・-I パスワードの有効期限切れ後にアカウントがロックされるまでの日数を指定(Inactive)
・-W パスワードの有効期限が切れる前に警告を表示する日数を指定(有効期限の何日前から警告を行うか)
・-E ユーザアカウントの有効期限を指定

※-lオプション以外はrootユーザしか実行できない

■「passwd」コマンドでパスワードの最長有効日数を10日にする場合は「passwd -x 10 user1」

■「usermod」
-e（expire_date）
そのユーザアカウントが使用不能になる日付。 日付は YYYY-MM-DD という書式で指定する。
-f （inactive_days）
パスワードの使用期限が切れてからアカウントが永久に使用不能になるまでの日数。 0 にすると、 パスワードの期限が切れると同時にこのアカウントは使用不能になる。 -1 にするとこの機能が無効になる。デフォルト値は -1
プログラム開発はコピペだと思う５つの理由

コピペって聞こえが少し悪いのですが、開発環境がどんどん変化している状況の中、どしてもそうなると思うのでまとめてみました。逆にこれができると、開発もかなり楽しくなると思うんですよね。純粋に新しいもの好きになれます。

【理由】
1. 言語やフレームワークは増える一方なので記憶は厳しくなる一方です。「理解＆コピペ」が生きる道。
2. オンラインヘルプはコピペできるサンプルが充実、もはやコピペを推奨している？
3. TypeScriptのような型セーフな言語とVsCodeのような高機能IDEでリファクタリングがより簡単
4. 優秀なプロのコードはGithubに転がっている、コピペ能力がエンジニアの成長力に不可欠
5. 経営者が望むエンジニアの姿だと思うので

という感じです。順番に説明します。
##### 言語やフレームワークは増える一方で、記憶はムリ、理解してコピペできれば記憶力は最小

同じVueでもVue2とVue3は違いますし、TypeScriptで書くか書かないかで学習コストは変わってきます。それにNuxtjsやReact、Nextjs、Vercel、Tailwindcss、Material UIなどのCSS系フレームワーク。

とにかく身につけることが多すぎるので、記憶するのは現実的とは言えません。Netを見るプラットフォームがスマートグラスに変わると、これから数年のうちにもどんどん出てくることは間違いありません。

理解してコピペする技術は生きる道といっても過言ではないので。

#### ホームページではコピペできるサンプルの充実、もはやコピペを推奨している

nextjsやTailwindcssなどのホームページ、Quiita、GutHubなどあらゆるサイトにはクリップボードコピーアイコンが最初から搭載されています。

フレーズも数行のものが多く、コピペしやすいように編集に気を使っているものばかりです。それを見ながらコーディングするのに比べて、何倍も早くコードをテストできます。

いろんなプロジェクトを作るたびに、何度もコピペするしていると、ほぼ自分用のライブラリのような感覚になります。頭のリソースを最低限に抑えられるのです。
#### TypeScriptのような型セーフな言語とVsCodeのような高機能IDEでリファクタリングがより簡単

VsCodeの機能を使うと、InterfaceやTypeの定義が⌘ボタンを押してマウスオーバーするだけで参照できますし、⌘ボタン＋クリックで定義に飛んで、⌘＋「ー」で元に戻ったりできます。getDataという関数を作るとその関数を使っている部分を⇧F12で一覧表示させたり。

要は、VsCodeのようなIDEを使うと、人の書いたプロジェクトでさえ、高速に解読できるようになっているのです。おまけに名前を一括変換したり、フォルダの構造を変えてみたりなでも高速にできます。

コピペしたあとに、自分カスタマイズするのが、快適になるようにシステムは進化しています。

#### 優秀なプロのコードはGithubに転がっている、コピペ能力がエンジニアの成長力に不可欠

エンジニアは世界中におり、Githubでより世界を身近に感じられます。そして優秀なエンジニアが書くコードは、とてもスマートで汎用性があったりするものです。

Githubはエンジニアにとって宝の山であり、それを最も享受しようと思うと、コピペ能力はとても大事なのです。私はGithubでいいフレーズを見つけたら、自分に取り込むために、スニペット登録したりしています。

世界の他のエンジニアにも、いいエンジニアだと思ってもらえるように、Githubに上げるリポジトリのReadmeは英語で書くようになりました。
#### 経営者が望むエンジニアの姿だと思うので

私は会社を経営しています。今は一人でやっているのですが、人を雇う余裕ができたら、いいエンジニアを雇いたいと考えています。

経営する側からだと、欲しいエンジニアは

- 高速に開発して必ず期日を守る
- 新しい技術をすぐに取り込める
- いつも余力を持っているふう

というところであり、経験的には、そんなエンジニアはコピペ能力がめちゃ高いのではないのでしょうか？
Chrome拡張機能/uBlacklistの活用

## おーばーびゅー

Chromeの拡張機能、[uBlacklist](https://chrome.google.com/webstore/detail/ublacklist/pncfbmialoiaghdehhbnbhkkgmjanfhe)の基本的な使い方と、ちょっと応用した使い方について。

## uBlacklistとは？

Google検索などの検索結果で、自分にとって要らないサイトを表示させなくする機能を追加するChrome拡張機能。
検索結果にあふれる広告まみれ、中身は他所のコピペみたいなサイトはうんざりですよね？
そういうサイトをブラックリストに登録し、今後表示させなくすることが出来る。

## 基本的な使い方

### ①検索結果からブロックする

検索結果の右上に表示される「このサイトをブロックする」を押す。
※以下は一例
![uBlacklist導入後の検索結果](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823754/8ad7c75a-bcf3-0baf-7763-8da69a95a449.png)
ブラックリストに登録したサイトは、「このサイトのブロックを解除する」から解除もできるので、要るようになったら解除する。

### ②設定からブロックする

uBlacklistの設定画面を開き、テキストエリアにサイトのURLを貼り付ける。
このテキストエリアの中身=ブラックリストなので、①で登録したURLはここで確認出来る。
①だけで事足りるのでｄ、②は滅多に使わないかも…

## 応用的な使い方

uBlacklistでは、設定画面のテキストエリアで正規表現での指定ができる。
基本的には「要らないサイト>>>越えられない壁>>>要るサイト」なので、要らないサイトをブラックリストに登録よりも、要るサイトをホワイトリストに登録する方が効率的だったりする。
なので、正規表現を使って実現する。

### 正規表現の否定表現

正規表現で複数の文字列をテストするときは、括弧で囲ってバーティカルバーで区切る。
```javascript
/(hello|world)/
```
そこに「否定」を追加するには、キャレットを先頭に追加する。
```javascript
/^(hello|world)/
```

uBlacklistでは、「任意のパターンが含まれる」サイトをブロックするので、「任意のパターンの否定」を記述することで、それ以外のサイトを一括でブロック出来る。(表現ごちゃごちゃしてスマソ)

### サイトのURLを指定する

パターンに自分に居るサイトのURLを追加していく。
言わずもがなだけど、正規表現なので`.`は`\.`にしたりする。
また、トップレベルドメイン単位でグループ化(`/(abc|def)\.com/`)した方が、後で探しやすくなるのでオススメ。

## ブロックを通り抜けるサイトの対策

上記の記載だけだと、`github\.io`を通すようにすると`user-github.io`みたいなサイトが通ってしまう。
一方で、`^(.+:\/\/(github\.io))`としてしまうと、`user.github.io`のようなサイトまでブラックリストに登録してしまう。
そこで、正規表現を一工夫する。

### ①スキームの部分を指定する

ここはシンプルに`?!.+:\/\/`だけでOK。
```javascript
/^(?!.+:\/\/(github\.io)).*$/
```

### ②`user.github.io`みたいなのを対応する

`github.io`だけの場合と`user.github.io`の場合はホワイトリストに、`user-github.io`はブラックリストに登録したい。
そのため、①のパターンに`(.[a-z]+\.|)`を追加する。
これにより、パターンのテスト結果は以下のようになる。
|URL|正規表現|テスト結果|
|-|-|:-:|
|github.io|/^(?!.+:\/\/()(github\.io).*$/|false|
|user.github.io|/^(?!.+:\/\/(.[a-z]+\.)(github\.io).*$/|false|
|user-github.io|:-(|true|

### ③完成系

基本形は以下の通り。
```javascript
/^(?!.+:\/\/(.[a-z]+\.|)(github\.io)).*$/
```
自分はGoogleやmozilla、wikipediaなどが通るように以下で運用してる。
※投稿用に不適当なものは削除してあります
```javascript
/^(?!.+:\/\/(.[a-z]+\.|)((android|github|google|java|microsoft|office|oracle|qiita|stackoverflow|teratail|twitter|yoututbe)\.com|(github)\.io|((amazon|github|kuronekoyamato|otsuka|sagawa\-exp)\.co|(jma|mod)\.go|(post\.|)japanpost)\.jp|(pixiv)\.net|(mozilla|nodejs|pypi|python|wikipedia)\.org).*$/
```
Vim + vim-lsp で C ソースの #if 分岐に色付けする

このページでは、 Vim + vim-lsp を使って、 C 言語で書かれたソースコードのプリプロセッサ分岐に色付けを行う方法を紹介します。以下の動画のように有効になっている分岐以外はコメントと同じ色付けとなります。これは Semantic highlighting という機能によるものです。

![vim-semantic.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63649/8ff8b79c-dcab-64a1-fa8a-18c6b6f0db9c.gif)

↑ の動画が動いていない場合は、クリックすると再生されるはずです


## 設定方法

vim-lsp と clangd 11.0 以降をインストールして、 `g:lsp_semantic_enabled` を 1 にすると設定完了です。

### vim-lsp をインストール

https://github.com/prabirshrestha/vim-lsp

### clangd  11.0 以降をインストール

内部で使用する clangd は 11.0 以降が必要となります。以下から LLVM 15.0.0 などをダウンロードしてインストールして clangd に PATH を通してください。

https://github.com/llvm/llvm-project/releases/

vim-lsp-settings を使っている場合は、 C ソースを開いた状態で `:LspInstallServer` を実行すると良いです。ただし、 Windows で `:LspInstallServer` を使う場合は 497b535 (2022/09/11) 以降の vim-lsp-settings を使う必要があります。

https://github.com/mattn/vim-lsp-settings

### vimrc の設定

以下の設定を `.vimrc` などに追加してください。

```
let g:lsp_semantic_enabled = 1
```

## まとめ

以下で Semantic highlighting が有効になります。

* vim-lsp をインストール
* clangd 11.0 以降をインストール
* `g:lsp_semantic_enabled` を 1 にする

プリプロセッサ分岐の多い C ソースを読むときに、無効な分岐がグレーアウトされる、という理由で VSCode を使うケースもあったのですが、これで解決。
React 多言語対応を行った際の備忘録

### 今回は、Reactで、多言語対応を行った際、勉強したい内容を記載します。

## 利用するミドルウェア一覧
種類|概要
--|--
react-i18next|javascriptの多言語対応フレームワーク

今回は、i18nextを利用しています。他にも、「Format.JS」などのライブラリがありますが、実装サンプルなどを記載している情報が多かったので、i18nextを選択しています。

## 実装の流れ
以下の流れで実装を行っていきます。
① react-i18nextのインストール
② メッセージファイルの作成
③ 初期化
④ コンポーネントの実装
⑤ 動作検証


## 実装
### ①i18nextのインストール
以下のコマンドを実行します。
```
$ npm install react-i18next
```

### ②メッセージファイルの作成
先ずは、Reactプロジェクトのsrcフォルダの配下に、i18nフォルダを作成します。<br>この中にメッセージファイルを作成していきます。<br>メッセージファイルを作成していきます。メッセージファイルは、json形式で記載するため、ja.jsonというファイルを作成します。
以下は、日本語用のメッセージファイルとなります。
```ja.json
{
 "TEST":{
    "test":"テスト"
 },
 "language":{
    "ja":"日本語"
 }
}
```

次に、英語用のメッセージファイルを作成します。<br>変更点としては、青文字になっている個所のみとなります。
```en.json
{
 "TEST":{
    "test":"TEST"
 },
 "language":{
    "ja":"Japanese"
 }
}
```

### ③初期化

②で作成したメッセージファイルを読み込み、プロジェクト全体で、どのメッセージファイルを利用するか設定します。

```config.ts
import i18next from "i18next";
import { initReactI18next } from "react-i18next";

// メッセージファイルのimport
import translation_ja from "./ja.json";
import translation_en from "./en.json";

// 上記で読み込んだメッセージファイルを選択可能にする。
const resources = {
    ja: {
        translation: translation_ja
    },
    en: {
        translation: translation_en
    }
};

// 初期化処理
i18next.use(initReactI18next).init({
    resources,
    lng: "ja",
    interpolation: {
        escapeValue: false
    }
});

// 他のコンポーネントで利用するためのexport
export default i18next;
```

### ④ コンポーネントの実装
コンポーネントの実装となります。
```App.tsx
import React from 'react';
import './App.css';
import { useTranslation } from 'react-i18next';
import "./i18n/config";

function App() {
  const { t } = useTranslation();
  
  return (
    <div className="App">
      <label>{t("TEST.test")}</label>
      <br></br>
      <label>{t("language.ja")}</label>
    </div>
  );
}

export default App;

```

### ⑤ 動作検証
以下のコマンドを実行し、動作検証を行います。
```
$ npm start
```
実行すると、以下の様に、ja.jsonに記載した内容が表示されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196226/a42ee386-2a17-64f6-3bef-c059f221ed9f.png)

また、英語表記に変更したい場合は、config.ts内の以下の内容を変更すれば、英語表記に変更可能となります。
```config.ts
// 初期化処理
i18next.use(initReactI18next).init({
    resources,
    lng: "en",  //ja　→　enに変更
    interpolation: {
        escapeValue: false
    }
});
```

再度実行すると、以下の様に、英語表記に変わります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196226/615acb81-4bbf-14fe-e3f4-49e36c1ce11c.png)


今回は、ここまでとします。
次回は、Yupを利用したバリデーションの実装を行いたいと思います。
PostmanによるAPI検証・初級編

目次
- Postmanとは？
- 準備
- メソッド
- コレクション
- リクエストをまとめて実行
- おわりに

# Postmanとは?
Postmanとは、開発者がAPIを設計、構築、テスト、反復するためのAPIプラットフォームです。
Postmanを利用することで様々なAPIテストを実施することが可能です。
ここではPostmanの基本的な使い方などについて解説します。

# 準備
### Postmanの入手
- ダウンロードページ（ https://www.postman.com/ ）からダウンロードします。
Windows、Mac、Linuxの３種類から自身の環境にあったものを選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2841830/d65b236a-9716-1546-db4c-2f66c9553804.png)

### インストール
手順に従ってインストールするだけです。

（Postman起動画面）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2841830/4d7058f1-6149-50b7-ddfa-61ffb4b52f5e.png)

### APIを用意する
 APIは自身で作成したものやTwitterなどベンダーの開発したAPIを用意。

# メソッド
メソッドには以下の様なタイプがあります。
| メソッド    |リクエスト            　|
|:---------|:------------------|
| GET      |リソースを要求する     　|
| POST     |リソースの更新を送信する　|
| PUT      |データを送信する 　　　    |
| PATCH    |リソースを部分的に更新する|
| DELETE   |リソースを削除する     |
| ・・・      　　|            　　　　　　　　　　　　　　|　　

基本的に使用するのは上の５つくらいです。

### APIにリクエストを投げる
APIを実行するURLを入力し、メソッドを選択してSENDボタンを押します。
![スクリーンショット 2022-09-11 10.09.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2841830/be65e22b-5660-7dbb-8ad9-f58d45695b13.png)

下の例ではhttp://localhost:8080/employee/all というローカル環境のURLで実行しています。
これはGETメソッドでDBの全レコードを取得するAPIを実行したものです。
![スクリーンショット 2022-09-11 20.36.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2841830/d83b971c-7712-ac5d-d05d-bc9d9b58081a.png)
正常にAPIが実行されれば200 OKというレスポンスが返って来ます。


# コレクション
コレクションを作るとテストで実行するリクエストをまとめたりできるので
わかりやすく管理するためにも作成しておきましょう。

Collectionsを選択してNewで新規作成、Importで既に作成しているコレクションを取り込むことができます。
![スクリーンショット 2022-09-11 10.01.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2841830/d93070a2-5ef6-b406-d1a1-01329763e63c.png)
メニュー左のCollectionsからNewを押下すると新しいコレクションを追加できます。
![スクリーンショット 2022-09-11 10.06.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2841830/4385df85-2a29-37bf-33ef-ed71777bec22.png)

コレクションに名前をつけてフォルダの様にリクエストを管理できます。
後述する、リクエストをまとめて実行する際もコレクションを使うと便利です。

### BASE URLを指定する
コレクションにはBASE URLを指定することもできます。
APIを実行するURLのエンドポイントを予め登録することで、関連する複数のリクエストを作成する際にパラメーター部分だけ追加するなど編集が楽になります。
![スクリーンショット 2022-09-11 20.31.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2841830/8a228fba-3378-ae8b-1ae3-e693fb04a2e8.png)


### コレクションにリクエストを登録
コレクションを作成したら直下にリクエストを保存します。


# リクエストをまとめて実行
コレクションに保存したリクエストをまとめて実行することもできます。
コレクションを選択し、・・・ボタンを押してRun collectionを押すと実行するリクエスト一覧が表示されます。

![スクリーンショット 2022-07-31 23.04.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2841830/f25d5cec-03c4-c7d0-8e84-ef3cd7c20551.png)
チェックボックスをクリックして実行するリクエストを選択できます。
右側のRun コレクション名ボタンをクリックするとリクエストがAPIに投げられます。
![スクリーンショット 2022-07-31 23.05.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2841830/cd94e569-4347-3ab3-5abf-e5efe0ed9450.png)
各APIからのレスポンス結果が表示されます。
![スクリーンショット 2022-07-31 23.01.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2841830/2bb5e126-2c3b-ed29-9710-0780e6142605.png)



# おわりに
Postmanを使うと様々なAPIテストを実施することが出来て非常に便利です。
ここで紹介した以外にも便利な機能があるのでぜひ活用しましょう。