OmniAICreator/Qiita-1.07M huggingface dataset:
Elixirの対話モードで条件（case/cond/if）の動作を確認してみた

# 概要
Elixirの対話モードで条件（case/cond/if）の動作を確認してみました。以下のページを参考にしました。

https://dev.to/gumi/elixir-05----casecondif-60o

# 対話モードで実行
以下のコマンドを実行しました。
```
$ iex
Erlang/OTP 24 [erts-12.2.1] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [jit]

Interactive Elixir (1.12.2) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> case {:ok, "hello world"} do
...(1)> {:ok, result} -> result
...(1)> {:error, error} -> error
...(1)> _ -> "others"
...(1)> end
"hello world"
iex(2)> case rem(1, 2) do
...(2)> 0 -> :even
...(2)> end
** (CaseClauseError) no case clause matching: 1

iex(2)> case rem(1, 2) do
...(2)> 0 -> :even
...(2)> 1 -> :odd
...(2)> _ -> :oddity
...(2)> end
:odd
iex(3)> x = 1
1
iex(4)> case 2 do
...(4)> ^x -> 1
...(4)> x -> x
...(4)> end
2
iex(5)> x
1
iex(6)> case 3 do
...(6)> 1 -> :one
...(6)> 2 -> :two
...(6)> n when is_integer(n) and n > 2 -> :larger_than_two
...(6)> _ -> :not_integer
...(6)> end
:larger_than_two
iex(7)> is_even? = fn
...(7)> n when rem(n, 2) == 0 -> true
...(7)> n when rem(n, 2) == 1 -> false
...(7)> _ -> :not_integer
...(7)> end
#Function<44.65746770/1 in :erl_eval.expr/5>
iex(8)> is_even?.(1)
false
iex(9)> is_even?.(2)
true
iex(10)> is_even?.(2.0)
:not_integer
iex(11)> rem(2.0, 2)
** (ArithmeticError) bad argument in arithmetic expression: rem(2.0, 2) 
    :erlang.rem(2.0, 2)
iex(11)> case func = fn
...(11)> x -> x
...(11)> x, y -> x + y
...(11)> end
** (CompileError) iex:11: undefined function case/1

iex(11)> cond do
...(11)> 1 > 2 -> false
...(11)> is_integer(1.0) -> false
...(11)> nil -> false
...(11)> [1, 2, 3] -> true
...(11)> true -> "実行されない"
...(11)> end
true
iex(12)> cond do
...(12)> 1 == 2 -> false
...(12)> end
** (CondClauseError) no cond clause evaluated to a truthy value

iex(12)> if true do
...(12)> "実行される"
...(12)> end
"実行される"
iex(13)> if !0 do
...(13)> true
...(13)> else
...(13)> false
...(13)> end
false
iex(14)> unless 0 do
...(14)> "実行されない"
...(14)> end
nil
iex(15)> if(0 < 1, do: 1 + 2)
3
iex(16)> if(false, do: :this, else: :that)
:that
iex(17)> if(false, [do: :this, else: :that])
:that
iex(18)> if(true, do: (
...(18)> x = 2
...(18)> x * x
...(18)> ))
4
iex(19)> if true do
...(19)> x = 2
...(19)> x * x
...(19)> end
4
iex(20)> is_number if true do
...(20)> x = 2
...(20)> end
** (CompileError) iex:20: undefined function is_number/2

iex(20)> is_number(
...(20)> if true do
...(20)> x = 2
...(20)> end
...(20)> )
warning: variable "x" is unused (there is a variable with the same name in the context, use the pin operator (^) to match on it or prefix this variable with underscore if it is not meant to be used)
  iex:22

true
iex(21)> 
```

# まとめ
何かの役に立てばと。
「単体テストの考え方/使い方」を読んで、オレオレ単体テストから卒業しよう

[単体テストの考え方/使い方](https://www.amazon.co.jp/%E5%8D%98%E4%BD%93%E3%83%86%E3%82%B9%E3%83%88%E3%81%AE%E8%80%83%E3%81%88%E6%96%B9-%E4%BD%BF%E3%81%84%E6%96%B9-Vladimir-Khorikov-ebook/dp/B0BLTG8Z9K/ref=sr_1_1?crid=1J82NE7VA2M69&keywords=%E5%8D%98%E4%BD%93%E3%83%86%E3%82%B9%E3%83%88%E3%81%AE%E8%80%83%E3%81%88%E6%96%B9%2F%E4%BD%BF%E3%81%84%E6%96%B9&qid=1687673165&sprefix=%E5%8D%98%E4%BD%93%E3%83%86%E3%82%B9%E3%83%88%E3%81%AE%2Caps%2C220&sr=8-1)を読んでみました。

良い単体テストとはなにか？を定めて、どのような単体テストを書けばよいかを説明した良本でした。
関数型アーキテクチャーがなぜ単体テストで優れているのかの説明も興味深かった。

個人的に気になったトピックを箇条書きにしておきます。内容については、本を読んでください。

- 単体テストには、古典派とロンドン派があるが、この本では一貫して古典派を推奨。ロンドン派は、ダメな例的なかわいそうな扱い。
- ロンドン派には細かい粒度でテストできる良さがあるが、著者の言う、よい単体テストではない。
- コード網羅率や分木網羅率はテストコードの質が良いことの指標にはならない。
- リグレッションに対する保護、リファクタリングへの耐性、迅速なフィードバックを同時には満たせない。二つを満たすと三つめが満たせない。
- 出力値ベース・テストは、状態ベース、コミュニケーションベースのテストよりも、リグレッションに対する保護、リファクタリングへの耐性、を低コストで実現できる。
- 関数型アーキテクチャーに移行することは、出力値ベース・テストを行いやすくできる。
- 観測可能な振る舞いと実装の詳細を区別すること。
- ヘキサゴナル・アーキテクチャー（外側がアプリケーションサービス層、外部アプリケーションとやり取りをする。コントローラ。中側が、ドメイン層（ビジネスロジック）。関数アーキテクチャの関数になる部分。
- 単体テストでは、ドメイン・モデル/アルゴリズムをテストする。統合テストでは、コントローラをテストする。
- 統合テストは、単体テストよりも保守コストが高い。ハッピーパスと単体テストでテストできない異常ケースを行う。
- モックに置き換える依存は、管理下にない依存

関係ありそうなQiitaの記事

https://qiita.com/YUM_3/items/b7c1cd1be9da92625143

https://qiita.com/YUM_3/items/86f2e852f25de046d44c

https://qiita.com/little_hand_s/items/ebb4284afeea0e8cc752

https://qiita.com/usamiki/items/38c8363b55efa8489839
Laravel 本番環境で自作コマンドを実行するときに確認メッセージを表示させる

## 本番環境で自作コマンド実行時に確認メッセージを表示させたい

本番環境でマイグレーションを実行しようとすると本番環境で本当に実行して良いかの確認メッセージが表示されます。

```
$ php artisan migrate

                          APPLICATION IN PRODUCTION.

  Do you really wish to run this command? (yes/no) [no]
```

これと同じことを自作のコマンドに追加します。

## 環境

- PHP: 8.2.7
- Laravel: 10.13.5

## 実装

```shell-session
$ php artisan make:command SampleCommand
```

```php:app/Console/Commands/SampleCommand.php
<?php

declare(strict_types=1);

namespace App\Console\Commands;

use Illuminate\Console\Command;
use Illuminate\Console\ConfirmableTrait;

final class SampleCommand extends Command
{
    use ConfirmableTrait;

    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'app:sample-command
        {--force : Force the operation to run when in production}
    ';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Command description';

    public function handle(): int
    {
        if (! $this->confirmToProceed()) {
            $this->comment('Stop sample command');

            return self::FAILURE;
        }

        $this->info('Execute sample command');

        return self::SUCCESS;
    }
}
```

- `use ConfirmableTrait;` 確認メッセージを表示するためのトレイト
- `{--force : xxx}` forceオプションの受け取り
- `$this->confirmToProceed()` 確認メッセージを表示

この3点を実装すれば確認メッセージを表示できます。

## 使い方

```shell-session
$ php artisan tinker --execute="echo config('app.env')"
production
```

`production` 環境の時にコマンドを実行すると下記のように確認メッセージが表示されます。

```shell-session
$ php artisan app:sample-command

                          APPLICATION IN PRODUCTION.
  Do you really wish to run this command? (yes/no) [no]
❯ n


   WARN  Command canceled.

Stop sample command
```

`--force` オプションを渡すと確認メッセージを表示することなくコマンドを実行できます。

```shell-session
$ php artisan app:sample-command --force
Execute sample command
```
GPT関数呼び出すの2：ArrayとObjectsのような高度な出力制御

# 前回の概要

## GPTの新機能の説明
GPTの関数呼び出し(function calling)で、文章からSQL文を生成

https://qiita.com/leolui2013/items/f5e4e26b4e098ff3528b

### ユーザープロンプト

```python
prompt_user = '''
2023年5月31日に、商品価格が1,000円以上の売上を出してください
'''
```

### アウトプット

```
{'month': 5, 'day': 31, 'price': 1000}
```

前回は数字だけの生成ができましたけど、実際はいろいろの形も生成できます。

# 今回の概要

より活用できるように、今回は数字・文字列の出力と、Array・Objectsと合わせて出力したいと思います。

## 文章から名前と年齢を出力、ただし1個ではなく、リストで返す

### イメージ

このような文章から

```
司会は３年連続の俳優、大泉洋（４９）と初司会の女優、橋本環奈（２３）、そして桑子真帆アナウンサー（３５）が務める。
また、嵐・櫻井翔（４０）が新設のスペシャルナビゲーターに就任した。
```

このような出力にしたい

```
大泉洋, 49
橋本環奈, 23
桑子真帆, 35
櫻井翔, 40
```

### 関数

```python
prompt_function = [
    {
        "name": "get_name_and_age",
        "description": "get name and age from people",
        "parameters": {
            "type": "object",
            "properties": {
                "peopleInfo": {
                    # Array型の出力を指定
                    "type": "array",
                    "description": "An array of objects representing key and values",
                    # さらにObjects型の出力を指定
                    "items": {
                        # 名前（文字列）の出力
                        "name": {
                            "type": "string",
                            "description": "name of the person"
                        },
                        # 年齢（数字）の出力
                        "age": {
                            "type": "integer",
                            "description": "age of the person"
                        }
                    }
                }
            },
            # 出力の指定は"name"と"age"
            "required": ["name", "age"],
        },
    }
]
```

少し複雑だけど、これで関数の定義ができました。

### ユーザープロンプト
```python
prompt_user = '''
こちらの情報から名前と年齢をテーブルで出してください

司会は３年連続の俳優、大泉洋（４９）と初司会の女優、橋本環奈（２３）、そして桑子真帆アナウンサー（３５）が務める。
また、嵐・櫻井翔（４０）が新設のスペシャルナビゲーターに就任した。
'''
```

### 実行してみる

```python
import openai
import json

response = openai.ChatCompletion.create(
    model="gpt-3.5-turbo-0613",
    messages=[
        {"role": "user", "content": prompt_user},
    ],
    functions=prompt_function,
    function_call="auto",
)

for i in json.loads(response["choices"][0]["message"]["function_call"]["arguments"])["peopleInfo"]:
    print(i)
```

### アウトプット結果

```python
{'name': '大泉洋', 'age': 49}
{'name': '橋本環奈', 'age': 23}
{'name': '桑子真帆', 'age': 35}
{'name': '櫻井翔', 'age': 40}
```

無事変換と出力できます。

## 予想外のアウトプット結果

少し指示の部分を編集してみました。

```python
prompt_user = '''
こちらの情報から役職を除いた名前と年齢をテーブルで出してください

総裁の菅義偉は71歳、
幹事長の二階俊博は81歳、
総務会長の佐藤勉は68歳、
政調会長の下村博文は66歳、
選挙対策委員長の山口泰明は71歳です。
'''
```

実行してみたら、

```python
import openai
import json

response = openai.ChatCompletion.create(
    model="gpt-3.5-turbo-0613",
    messages=[
        {"role": "user", "content": prompt_user},
    ],
    functions=prompt_function,
    function_call="auto",
)
```

アウトプット結果

```python
{'役職': '総裁', '名前': '菅義偉', '年齢': 71}
{'役職': '幹事長', '名前': '二階俊博', '年齢': 81}
{'役職': '総務会長', '名前': '佐藤勉', '年齢': 68}
{'役職': '政調会長', '名前': '下村博文', '年齢': 66}
{'役職': '選挙対策委員長', '名前': '山口泰明', '年齢': 71}
```

定義していなかった「役職」が出てきました。しかもObjectsのキーも英語の名前ではなくて日本語になっています。

悪い結果とは言えないけど、気をつけてつか言わないといけないですね。
[AtCoder] Beginners Selection - ABC081A - Placing Marbles [Elixir Livebook]

## はじめに

AtCoder の Beginners Selection コンテスト ABC081A - Placing Marbles 問題を Elixir Livebook で回答しました

実装したノートブックはこちら

https://github.com/RyoWakabayashi/elixir-learning/tree/main/livebooks/atcoder/abc081/abc081_a

## 問題

https://atcoder.jp/contests/abs/tasks/abc081_a

## 入出力例

以下のようになれば OK です

```elixir
"""
101
"""
|> Main.solve()
|> then(&(&1 == 2))
```

```elixir
"""
000
"""
|> Main.solve()
|> then(&(&1 == 0))
```

## 回答１

```elixir
defmodule Main do
  def main do
    :stdio
    |> IO.read(:all)
    |> solve()
    |> IO.puts()
  end

  def solve(input) do
    input
    |> String.trim()
    |> String.codepoints()
    |> Enum.map(&String.to_integer/1)
    |> Enum.sum()
  end
end
```

1文字ずつ数値化し、合計しました

実行時間は 512 ms でした

## 回答２

```elixir
  def solve(input) do
    input
    |> String.trim()
    |> count()
  end

  def count("000"), do: 0

  def count("111"), do: 3

  def count("001"), do: 1

  def count("010"), do: 1

  def count("100"), do: 1

  def count(_), do: 2
```

パターンが限られているので網羅しました

実行時間は 336 ms でした

## 回答3

```elixir
  def solve(input) do
    input
    |> String.trim()
    |> String.replace("0", "")
    |> String.length()
  end
```

`0` を除いた文字列の長さにしました

実行結果は 538 ms でした

## 回答4

```elixir
  def solve(input) do
    input
    |> String.trim()
    |> String.to_integer(2)
    |> count
  end

  def count(0), do: 0

  def count(7), do: 3

  def count(1), do: 1

  def count(2), do: 1

  def count(4), do: 1

  def count(_), do: 2
end
```

2進数として読んでみました

実行時間は 337 ms でした

## まとめ

パターンが少ない場合は、単純に網羅してしまえば速いですね

やはり文字列操作は遅いです
Serverlessアーキテクチャと付き合うときの所感

# これなに
いちアーキテクト兼プログラマ兼インフラエンジニアのサーバレスと付き合うときの特に初回のめんどうくささお気持ち表明。
2023年の中頃の定点観測、AWSの話。

# Serverlessの現状

サーバレス・・その最大のメリットといえば何も考えなくても可用性やキャパシティが確保されること。
VPCレスであるため可用性を確保するための面倒な手続きをやらなくてよい、かつその維持のためのコストを払わなくてすむ。
しかも使わなければタダか、それに近いコストになる。
後述のIaCと組み合わせると環境の量産がコスト安く気軽にできるため、いつでもまっさらな邪魔されない環境で検証、機能追加の実験ができる。

デメリットとしてはとっつきにくい、実装や機能上の制約がどこかしらにある、方式を確立するまでPoCなどががめんどくさい。
いろいろなサービスが絡まっている場合はなおのこと。
幸いチュートリアルや事例はたくさんあるので、下記の手順でPoCをやるとスムーズです
まだ出くわしたことがないけれどログがあまりでないのでAWSの障害時にトレースが非常に難しくなるんじゃないかと思う。
そしてその制約は大規模開発の足を引っ張ることになる場合もあるため、まだEC2, ECS, k8sの中で動くプログラムほどの利便性は確保できていないように感じる。

希望的な側面では、サーバレスをカバーするフレームワーク群やIaCが充実してきていて、そこに乗っかれると幸せ、かもしれない。

# 導入の手順こうするといいんじゃないかな？

1. まず最初にチュートリアルどおりにやってみて、動く状態のお手本を手元に確保する
1. お手本をもとにインフラ、設定を構築してやりたいようにカスタマイズする。
1. カスタマイズした環境でPoCする
1. 環境の量産をなんらかのIaC（terraform, CDK, CDKTF）に執筆する。
1. IaCで作った環境がworkするようになったらチュートリアル及びお手本環境を削除
1. IaCで環境を量産する。prodとかstgとかdevとか

# 私の持っている駒

下記のどれで執筆するのが妥当かをPoCしながら見極めながら、最終的にどれを使うかを判断していく。

* cdkの実装運用テク
    * ↑やってると自然と身につくCloudFormationのtemplate
* cdktfの実装運用テク
    * ↑やってると自然と身につくterraform
    * たまに落とし穴のようにバグっているところがあるからcdkよりは不完全
* Serverless Fwamework
    * Lambda使うとき便利＆CloudFormationのtemplateを埋め込めるのでインフラの執筆も可能、痒いところに手が届くかもしれないプラグインもそこそこ充実


ついでにこれらをgithub actionsでデプロイできるようにして、本番のインフラは絶対にコードの支配下に置くことを徹底する。AWS Consoleで設定をいじることを一切なくす。


# 自動化していないところ

ただしすべてを自動化はできていない、人間が手で準備ところもある。
ACMとかRoute53のHostedZone作るところとかSecretManagerにクレデンシャルぶちこむところとか。

ドメイン取得〜Route53に登録〜CMで証明書の作成、SecretManagerにCredentialsを自動作成（パスワードの自動ジェネレート）も。

やれるのかもしれないけれど、今はまだ早いかなー

Web3とかDAOのテンプレートみたいなのはもうほぼ自動で作れるようになっていると思う。

という雑感でした。
stablediffusion controlnet openpose でポーズ指定

# controlNetとは？

参考写真と同様のポーズを取らせることが可能

参考
https://freeblog-video.com/stable-diffusion_controlnet_openpose/


# サンプル

元画像
![00078-906081855.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31338/18f3e181-b2f3-cb44-5b4e-8390ce7190fc.png)

ポーズを取らせる
![00077-906081855.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31338/34cdc3f4-8742-f7c1-fb0d-da28939c24f6.png)


# stablediffusion のアップデート

「stable-diffusion-webui」を右クリックして出てくるメニューから、「ターミナルで開く」を選択し、ターミナルを開く



以下のコマンド

```
git pull
```

この時、フォルダ内のモデルや出力画像等は勝手には消えないので、移動せずに実行してOK

# controlenetをインスコ

まずは、以下をインスコ

```
pip install opencv-python
pip install prettytable
```

Extensionsから以下をインスコ
https://github.com/Mikubill/sd-webui-controlnet.git

extentions に
sd-webui-controlnet

があれば成功。

# safetensorsを追加

https://huggingface.co/comfyanonymous/ControlNet-v1-1_fp16_safetensors/tree/main

```
control_v11p_sd15_canny_fp16.safetensors
```

を探しインスコ

『stable-diffusion-webui』→『extensions』→『sd-webui-controlnet』→『models』の中に放り込む

再起動


# ポーズを指定

pinginfoより sendtotxt2img

controlenet に ポーズを参考にしたい画像をアップ。

Enableにチェックを入れる
control type で openposeを選択

これで生成できるかな。

ただ、どうだろ。
cvitaiで好きなpngを拾ってきてガチャ回したほうがよいかな。
vimの超基本操作

## はじめに 
今回はvimについて学んだので、初めてvimを触る方でも分かるvim初心者向けの記事を作成しました！
これからvimを使ってみたいという方や以前使っていたけど忘れて復習したい方など、ぜひ活用していただけたら嬉しい限りです。
ではやっていきましょう！


## そもそもvimとは
vimはLinuxの`テキストエディタ`のことでターミナル（コマンドプロンプト）上でファイルの操作やコードの編集ができる便利なツールのことです。
vimの大きな特徴としては
- `マウスなし`で操作できる
- いくつかの`モードを切り替えて`操作する
があります。


## 基本コマンド
### カーソル移動
vimではマウスなしで操作するため、カーソルは次の4つのコマンドで移動する
| コマンド |動作  |
|:-:|:-:|
|  `h` | 左へ移動  |
|  `j` |  下へ移動  |
|  `k` | 上へ移動  |
|  `l` |  右へ移動 |



### モード
| モード  | 機能 |
|:-:|:-:|
| `NORMAL`モード |  コマンド入力モード　カーソルの移動、テキストのコピー・カット・ペースト、他のモードへの移行 |
| `INSERT`モード  | 文字入力モード　　テキストの入力・編集  |
|`VISUAL`モード |  文字選択モード　　テキストの選択 |

::: note 
現在のモードは画面の左下に--INSERT--などという形で表示されています！
:::




### ファイル操作
| コマンド | 操作 |
|:-:|:-:|
| `ノーマルモード(command+esc)→ :q! → <ENTER>`  | 強制終了  |
|  `ノーマルモード(command+esc)→ :wq → <ENTER>` |  保存して終了 |


### 挿入・追加
| コマンド | 動作 |
|:-:|:-:|
| `i`| テキストの挿入  |
|   `A` |テキストの追加   |


### 削除コマンド
| コマンド | 動作 |
|:-:|:-:|
|    `x`| 一文字削除 |
|`dw`| 単語の末尾まで削除 |
|`d$` |行の末尾まで削除 |
|`dd` |行全体の削除 |

### 取り消しコマンド
| コマンド | 動作 |
|:-:|:-:|
|  `u` |  最後の動作を取り消す（一個前に戻る） |
|  `U` |  行全体の変更を取り消す |

### ファイルの先頭と最後尾へのぶっ飛びコマンド
| コマンド | 動作 |
|:-:|:-:|
|  `gg` |  ファイルの先頭へ移動 |
| `G(commanキー+g)`  |  ファイルの最下行へ移動 |


### コピペコマンド
| 　コマンド　 | 動作 |
|:-:|:-:|
|   `y`| （`v`でVISUALモードにしてから）カーソル移動し協調表示されたテキストをコピー  |
|  `p` |  ペースト |

## 最後に
今回はvimの基本コマンドを扱いましたが、vimにはその他にもたくさん便利なコマンドがあります。
vimtutorでは実際に手を動かしながら学べおすすめですので、ぜひ使ってみてください！
vimが使えるPC(Macなど)のターミナルで`vimtutor`とコマンドを入力すれば起動できます！
ご一読いただけたら幸いです。
Next.js 13 + Tailwind CSSでGoogle Fontsを使おう

Next.js 13 + Tailwind CSSでGoogle Fontsを使う方法を簡単にまとめます。

## Google Fontsのインポート方法とその使い方

### 【基礎】とりあえずフォントを適用してみる

Next.jsでGoogle Fontsを使うには、`next/font/google`からフォントをインポートします。

任意のファイルに以下を追加。
ここでは、utiles/font.ts（js）というフォントをまとめておくファイルを作りました。

```react:utiles/font.ts
import { Noto_Sans_JP } from "next/font/google";
```

可変フォント (Variable fonts) の利用推奨なので、ここのページに載っているフォントを使いましょう。

https://fonts.google.com/variablefonts

続けて以下を追加します。

```react:utiles/font.ts
export const notojp = Noto_Sans_JP({
  weight: ["400", "700"],
  subsets: ["latin"],
  display: "swap",
});
```

これで、weightが400と700のNoto Sans JPを用意できました。
subsetsとdisplayは、表示を高速化するものなので恐らく必須です。


まとめると以下のようになります。

```react:utiles/font.ts
import { Noto_Sans_JP } from "next/font/google";

export const notojp = Noto_Sans_JP({
  weight: ["400", "700"],
  subsets: ["latin"],
  display: "swap",
});
```

クラスに割り当てるときは、上で作った変数をファイル内でimportして使用します。

この時、`.className`を付けないと読み込めないので注意です。

```react:app/About.tsx
import { notojp } from "../utiles/font.ts"

const About = () => {
  return <h1 className={notojp.className}>こんにちは！</h1>;
};

export default About;
```

### 【応用１】同ブロックでTailwind CSSを追加したい

Google Fontsの使い方はわかりました。

では、このh1に**Tailwind CSSを一緒に使いたい場合**はどうしましょう。
そんな時は、テンプレートリテラルを使います。

```react
<h1 className={`${notojp.className} text-5xl text-bold`}>こんにちは！</h1>
```

こんな感じで、Tailwind CSSでもGoogle Fontsと組み合わせて使うことができるようになりました。

### 【応用２】Tailwind CSSのようにクラス + プロパティで書きたい

毎回、テンプレートリテラルを書くのが面倒という方もいるかもしれません。
Tailwind CSSのようにクラス + プロパティでそのまま書けたら便利ですよね。

Tailwind CSSにはCSSを自分好みにカスタマイズできる機能があります。
そんな時に使うのが`tailwind.config.js`です。

Tailwind CSSをインストールすれば、自動でファイルが作られていると思います。
ない場合はルート直下に作ってください。

ここのextendでfont-familyのCSSを拡張させます。

```react:tailwind.config.js
module.exports = {
  content: [
    './src/**/*.{js,ts,jsx,tsx,mdx}',
  ],
  theme: {
    extend: {
	  fontFamily: {
		notojp: ['var(--font-notojp)'],
	  },
    },
  },
  plugins: [],
}
```
`font.ts`に`variable`を書き加えます。

```react:utiles/font.ts
import { Noto_Sans_JP } from "next/font/google";

export const notojp = Noto_Sans_JP({
  weight: ["400", "700"],
  subsets: ["latin"],
+ variable: "--font-notojp",
  display: "swap",
});
```

さらに、実際にフォントを使用したい箇所より前に`${notojp.variable}`を記載し、variableを使用することを明示しなければいけませんが、一番簡単なのは`layout.tsx`のhtmlタグに含めることです。

```react:layout.tsx
import "@/app/globals.css";
import { notojp } from "@/utiles/fonts";

export default function RootLayout({children,}: {children: React.ReactNode;}) {
  return (
    <html lang="ja-JP" className={`${notojp.variable}`}>
      <body>{children}</body>
    </html>
  );
}

```

こうしておけば、ほかのファイルで特にフォントをインポートをする必要がなく、プロパティの記載のみでを自由に使うことができます。

```react:app/About.tsx
const About = () => {
  return <h1 className="font-notojp text-5xl text-bold">こんにちは！</h1>;
};

export default About;
```
【Sier営業×資格勉強】営業が「Python 3 エンジニア認定基礎試験」受験してみた【不合格体験記】

はじめに：sierで営業3年目。主に新規顧客開拓を任せられているが、
　　　　　新規開拓はなかなか難しい…。
　　　　　営業力向上のためにも、まずは勉強して実力をつけ、
　　　　　ブログでアウトプットしていく予定。　　　　　

受験の動機：顧客との会話の際、最低限の開発の知識がないと話についていけない。


例：SQLが～、デグレが～
　　
　　(知識が無い場合)　  (デグレってなに…？ 営業に関系ある用語…？(思考停止)):cold_sweat:
　　(知識がある場合)　この人材なら回帰テストの経験も豊富なので、大丈夫です！:smiley:


例：こういうスキルの人材が必要なんだけど…
　　　　　
　　(知識が無い場合)  　分かりました！(※言われた事を鵜呑みにする):grinning:
　　(知識がある場合)　こういうスキルを持った人材もいいんじゃないですか？:smirk:
　　　
pythonはランキング上位の開発言語のため、勉強しておいて損はない。
~~あと転職する時に役立つかと思って…ｹﾞﾌﾝｹﾞﾌﾝ~~

勉強方法：①Jmoocによる「Python入門」の受講

　Jmoocとは、Udemyのような様々な勉強の動画コンテンツが受講できるもので、
　主に無料で受けられる。

　こちらの動画では、初歩的な文法から簡単なプログラム実装までを勉強できる。
  

感想:正直、舐めすぎていた…。
　　 python認定基礎試験の合格率と、「基礎的な部分をマスターしていれば合格できる」という体験談から、「文法周りをマスターすれば余裕で合格できるだろう」という
謎の自信を持ち、いざ試験3日前に過去問を解いたところ、
「math.pi」や「例外処理」の部分で撃沈…。まぁ3日前に過去問解いてるのが悪いんだけど。

Jmoocの動画は 基本的に分かりやすいけど、たまに説明が不十分な項目がある。
オブジェクト指向なんかは特にそうで、動画時間が5分くらいなので、余裕で出来ると
計画を立てていたら、実際は自分でいろいろインターネットで調べて勉強する必要があり、結局5分の動画の部分を5時間くらいかけて勉強することになり、完全に計画が狂った…

また来月受験するため、今度こそ合格したい:weary:
CNNのプーリング処理を理解する。(備忘録)

CNNってなんやねん。
プーリングってなんやねん。畳み込みってなんやねん。
よし、勉強しよ。

## 今回やること
CNNの際の処理に、画像の特徴量を抜きとる処理に「畳み込み」と「プーリング」がある。
今回はim2colアルゴリズムを使ってプーリングについて学習したので、備忘録として残しておく


## CNNとは
簡単にいうと画像認識タスクに用いられる、深層学習アルゴリズム。
写真から特徴量を抜き取って、画像のものがなんなのか判別するタスク。
主に「畳み込み層」「プーリング層」「全結合層」「出力層」からなる。


## プーリングとは
画像のピクセルにフィルターをかけていき、そのフィルターの範囲の最大値を取得して、特徴量を生成する。(元画像から特徴を抜き出して、画像を圧縮するイメージ)

4✖️4の画像に2✖️2のフィルターを右端から1マスずつずらしながらローラー作戦のように、対象4マスの中の最大値を取得していく。
(今回は最大値を取得するが、平均値とか、いろんな取得方法があるらしい)

```
[[ 1, 2, 3, 4           
   5, 6, 7, 8
   9,10,11,12
  13,14,15,16]]

↓

[[ 6,  7,  8
  10, 11, 12
  14, 15, 16]]
```



## コードで実装

### 必要なライブラリとデータをインポート
```python:python
import numpy as np
import matplotlib.pyplot as plt 
from sklearn import datasets
```

### データを読み込み
データを読み込んで、今回試しに写真一枚だけプーリングを行ってみる。
```python:python
digits = datasets.load_digits() # データをロード
print(digits.data.shape) # 読み込んだデータの形を表示

image = digits.data[2].reshape(8, 8) # 2枚目の写真を整形して、表示 
plt.imshow(image, cmap="gray")
plt.show() 
```


### im2colアルゴリズムを定義
```python:python
def im2col(img, filter_h, filter_w, output_h, output_w, stride):  # 入力画像、プーリングの高さ、幅、出力画像の高さ、幅、ストライド

    cols = np.zeros((filter_h*filter_w, output_h*output_w)) # outputの配列のサイズ
    for h in range(output_h):
        h_limit = stride*h + filter_h  # h:プーリングの上端、h_limit:プーリングの下端
        for w in range(output_w):
            w_limit = stride*w + filter_w  # w:プーリングの左端、w_limit:プーリングの右端
            cols[:, h*output_w+w] = img[stride*h:h_lim, stride*w:w_lim].reshape(-1)

    return cols
```


### maxプーリング
定義したim2colを使って画像を行列計算をしやすいように変形した後、maxプーリング行います。
その後画像を表示する。

```python:python
img_h, img_w = image.shape  # 入力画像の高さ、幅
pool = 2  # プーリング領域のサイズ

output_h = img_h//pool  # 出力画像の高さ
output_w = img_w//pool  # 出力画像の幅

cols = im2col(image, pool, pool, output_h, output_w, pool)
image_output = np.max(cols, axis=0)  # Maxプーリング
image_output = image_output.reshape(output_h, output_w) # プーリングした後、画像の形に変形

plt.imshow(image_output, cmap="gray") # 画像を表示
plt.show() 
```



## 終わりに
今回はCNNのプーリングをコートで実装してみました。
ライブラリを用いれば、簡単に実装できることをコードで書くと、深く理解できた気がします。
今後も学習楽しみます。


ps.
今日からカーソルキーを使わずに、Ctrl+f,b,p,nの練習しながら記事書いてみました。
慣れなくて苦労してます。。。ww
データサイエンスのための微分積分 第31-第36回 中間値の定理と導関数の応用

:::note info
本記事は数学講座[4 中間値の定理と導関数の応用](https://www.matongxue.com/lessons/612/parts/1043)を勉強して投稿したメモです。詳細は元の素晴らしい講座のページをチェックしてください。
:::

# :sunny:纏め

# 第31回 微分中間値定理

# 第32回 ロピタルの定理

# 第33回 テイラーの定理

# 第34回 関数の単調性と凸凹性

# 第35回 関数の極値と最大値

# 第36回 曲率

# 参照
ブロックチェーンの基本知識

<h1>ブロックチェーン</h1>
<p>皆さんはブロックチェーンという技術を知っているかな？
少し前に話題になったビットコインとかの暗号資産に使われている技術なんだ</p>
<p>今回はブロックチェーンについての基本知識などをまとめていきます。
基本的には研究を行うための僕自身のアウトプットを行う記事ですので、間違いなどがあればご指摘いただければと思います。</p>
<h4>ブロックチェーンの概念</h4>
<p>皆さんが銀行を利用して送金を行うときに相手に届いているか、金額は間違っていないかなどを心配したことはありますか？</p>
<p>まずないよね</p>
<p>なぜ安心して送金ができるのかというと、銀行がちゃんと相手に届けてくれるという信頼があるから！お金のやり取りを銀行が公平に確実に処理してくれる。これを中央集権型のシステムといいます。利用者は手数料を支払う代わりに確実に送金ができる！</p>
<p>でもこれが銀行を介さずにできたらすごくないですか？そこで登場するのがブロックチェーンです！</p>
この技術は送金をいつ誰に行ったかをユーザーみんなで監視するシステムです。これがあれば銀行が確認をする必要がなくなるってわけだね。
<p>これがブロックチェーンの大きな特徴で"サーバーがいらないシステム"ができるんだ</p>
<h3>1つ1つの取引情報をブロックとして何個もつなげているものをブロックチェーンと呼んでいます。</h3>
    <p>ブロックチェーンを全員が持っていることによってみんなで取引を見張ることができるってことだね。</p>
<h2>ブロックの作成</h2>
さて、ブロックチェーンのことを少し理解してくれたかな？
<p>ここで一つ疑問が生まれたはず！</P>
<h3>誰でも勝手に取引情報を書き込んでいいのか？</h3>
<p>そんなことができたら僕は大金持ちになれるね。もちろんそんなことはなくて</p>
ちゃんとした仕組みがあるんです。ブロックチェーンの具体的な仕組みは、また今度書くね。
とりあえず今回の記事ではブロックチェーンはユーザーのみんなでデータのやり取りを見張る方法なんだなって思ってくれれば大丈夫です。
ブロックチェーンについては以下のように分けて説明していきます。
<ul>
<li>ブロックの作成・マイニングとは</li>
<li>デジタル署名・ハッシュ化について</li>
<li>マークルツリーとは</li>
<li>ブロックチェーンの活用方法</li>
<li>実際にブロックチェーンを作ってみよう</li>
</ul>
<p>お楽しみに！</p>
VBA学習②

色々勉強になりました。

```
Sub result()

'データの最終行を取得
  Dim maxRow As Long
  maxRow = Cells(Rows.Count, 1).End(xlUp).Row
  
  '重複しているデータを削除
  Range("A1:C" & maxRow).RemoveDuplicates (Array(2, 3))
  

'sheet1という名前のシートをコピーして一番右に追加する。
ThisWorkbook.Sheets("sheet1").Copy After:=Sheets(Sheets.Count)
 
'追加したシートがActiveになっているので、ActiveSheetを通じて名前を設定する。
ActiveSheet.Name = "aaa"

' ステップ１：C列をA列に移動
ThisWorkbook.Worksheets("aaa").Columns("C:C").Select
Selection.Cut
ThisWorkbook.Worksheets("aaa").Columns("A:A").Select
Selection.Insert Shift:=xlToRight

' ステップ１：C列をA列に移動
ThisWorkbook.Worksheets("aaa").Columns("C:C").Select
Selection.Cut
ThisWorkbook.Worksheets("aaa").Columns("B:B").Select
Selection.Insert Shift:=xlToRight

'C列を重複削除
Columns("C").RemoveDuplicates _
    Columns:=1, _
    Header:=xlNo   '見出しなし



End Sub
```
今週のKDDIグループの愉快なQiitaまとめ（6/17〜）

Qiita Engineer Festa 2023、めちゃ盛り上がってますね！
みなさん楽しくアウトプットしていますか？

https://qiita.com/official-campaigns/engineer-festa/2023

KDDIグループ各社でも有志が技術記事の発信に励んでいます！
そんな愉快な仲間たちの今週の記事を紹介します。



# KDDI株式会社

https://qiita.com/organizations/kddi

### @youtoy さん

https://qiita.com/youtoy/items/545cb81fd3188e63f8aa

### @sakue_103 さん

https://qiita.com/sakue_103/items/8da30f7982694732a2b3

https://qiita.com/sakue_103/items/d733ee832d880f2686b9

### @mksamba さん

https://qiita.com/mksamba/items/479935466a62727648a8



# KDDIアジャイル開発センター株式会社

https://qiita.com/organizations/kddiagile

### @tonnsama さん

https://qiita.com/tonnsama/items/af4ec31e35471220c8a2

### @MiyuWaka725 さん

https://qiita.com/MiyuWaka725/items/8209d4b6fbbbc8389258

### @TakehiroKATO さん

https://qiita.com/TakehiroKATO/items/f8ac420b439851f0c219

### @koito_yuhei さん

https://qiita.com/koito_yuhei/items/553f34f4a06df22b47fc

### @s3kzk さん

https://qiita.com/s3kzk/items/721798b4f101e48a3f0d

### @tsuno0821 さん

https://qiita.com/tsuno0821/items/7ca5e0471fbb7feba67a

### @minorun365

https://qiita.com/minorun365/items/090bb3045fe054694559

https://qiita.com/minorun365/items/410b2039fabcd6b333bf

https://qiita.com/minorun365/items/f7203c0c58fe8545ada5

https://qiita.com/minorun365/items/081fc560e08f0197a7a8

https://qiita.com/minorun365/items/e29b6f431470171ad46d

https://qiita.com/minorun365/items/25185594ac85d03f5459

https://qiita.com/minorun365/items/9d1cdf24d90e1b23c5c9

https://qiita.com/minorun365/items/c58cd5bb4f1dc6b57582



# アイレット株式会社 （cloudpack）

https://qiita.com/organizations/cloudpack


### @matsukatsu さん

https://qiita.com/matsukatsu/items/d50be4e1190d836cdd84



# 株式会社 ARISE analytics

https://qiita.com/organizations/ariseanalytics


### @tsukemono さん

https://qiita.com/tsukemono/items/67a4194aae3b2bebcba8

https://qiita.com/tsukemono/items/28d030652081af392af9

### @sergicalsix さん

https://qiita.com/sergicalsix/items/3dbbe6c7eec61ff4aaba

https://qiita.com/sergicalsix/items/38009e67ef95b70242d7

### @t_serizawa さん

https://qiita.com/t_serizawa/items/a2ced4441da714b3076f




# KDDI Group Developer Community (KGDC)

https://qiita.com/organizations/kgdc


### @ymd65536 さん

https://qiita.com/ymd65536/items/4b1c9ddf0b1280d39883

https://qiita.com/ymd65536/items/c74ddceab9f810e17e7b

https://qiita.com/ymd65536/items/11ea2e58a45049995e93
UE4でフォーカス制御可能なボタンを作る

# ボタンのイベントを制御したい。

※以下、個人的な方法です。

UnrealEngine4を触り始めた時はImageを使ったりしていましたが、
ReleaseとかHoverとかフォーカスの事を考えたりすると、ボタンでイベント制御しないといけないという思いに至りました。

## まずボタンのサブクラス（BP）を作成する。

プロジェクト用にカスタマイズされたボタンを作成します。
プロジェクトに依存する必要な機能をそこに記載します。
移行する可能性のある汎用的なボタンを作るなら、
Button->汎用ボタンBP->プロジェクトボタンBP
という感じで作成します。

## ボタンのラッパーUserWidgetを作成する。

このラッパーUserWidgetをラッパーボタンとでもします。
参考にした記事：

https://forums.unrealengine.com/t/how-do-you-check-if-a-button-is-focused-or-not-with-blueprint/649945/8

ラッパーボタンにCanvasPanelがあれば、削除してボタンウィジェットを配置します。
動的に作成する場合は、変数にボタンクラスをスポーン変数として設定し、PreConstructで作成するとかでしょうか？（未確認なので、分かりませんが）
このラッパーボタンをボタンの代わりに使用します。

中身のボタンのIsFocusableを外して、このラッパーUserWidgetのIsFocusableをオンにして、フォーカスがこのラッパーボタンに向くようにします。

## イベント処理

OnAddedToFocusPath
OnRemovedFromFocusPath
・フォーカスが当たった時、外れた時に処理を行う。ここでUIの外観の変更や他オブジェクトへの通知をするなど考えられます。

中身のボタンのOnClicked、OnPressedなどを、ラッパーボタンに同等のOnClickedなどを作っておき、そのまま流します。もちろんイベントディスパッチャーに通知するとか何か処理してもOKですが。
ラッパーボタンを作成する事でプロジェクト内のボタンを共通化でき、変更に対して柔軟になります。

## キー処理

以下はShiftを伴うキー処理をしています。
例えば、Shift＋Tabでフォーカスを1つ戻す挙動を制御する場合です。


OnKeyDown

![shift1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128851/c04e4519-0265-ccf5-cce2-71c8dad9095c.png)

InKeyEvent->GetKeyを調べて、Shiftが入力されていた場合、グローバルなどこかにフラグを持たせてオンにします。その後、Unhandledを返せば、Shift＋Tabで、Shiftが先に押された場合、TabをOnKeyDownで再び処理しようとするので、そこでTabが入力されているか、グローバルなShiftフラグのチェックをして、フォーカス移動処理を行います。

![shift2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128851/adefa8fa-9401-02e5-a866-049cc2fa584c.png)

キーが離された時に、グローバルなフラグのチェックを外します。

まだまだ分からない事が多いので、作っては直しの繰り返しです。
Go言語に触れてみよう

今回は、Go言語の実行確認の方法を記述してまいります。

Go言語は、ターミナル上で```go run ファイル名```と入力するとそのファイルの**main**という関数を実行してくれます。

それでは一例として```println()```を使用してターミナル上に指定した文字を出してみましょう。
※```prinitln()```の()の中に文字を入れてください()内に入れた文字が出力結果として表示されます。

### 例：
```Golang:main.go
package main

// main関数から実行される
func main() {
	// 「Hello, 世界」と出力
	println("Hello, 世界")
}
```

```Terminal:ファイル実行
go run main.go
```

```Terminal:実行結果
Hello, 世界
```

実行結果が　```Hello, 世界```と表示されたら成功です。

### main.goファイル内の説明

#### println()について
printlnというのは、Go言語が用意してくれている命令の一つでパソコンにprintlnの()内に入っている、値をターミナル上に表示してくださいとGoが命令をしてくれます。

println以外にもGo言語には様々な命令を持っているので興味のある方は、一度見てみると楽しいかもしれません。

[Go言語スタンダードパッケージ(Google Translate使用推奨)](https://pkg.go.dev/std)

#### 文字列について
今回表示した```Hello, 世界```は、<b>文字列</b>というものです。
文字列をプログラム内で記述するには、文字列部分を<b>ダブルクォーテーション("")</b>で囲ってあげる必要があります。

ダブルクォーテーションで囲うことによりプログラムがダブルクォーテーション部分で囲った部分を文字列と認識してくれます。

---
これらの処理を経てコンピュータは、ターミナル上に値を表示してくれます。
それではこちらを参考にして```main.go```の問題を解いてください。
[AtCoder] Beginners Selection - PracticeA [Elixir Livebook]

## はじめに

AtCoder の Beginners Selection コンテスト PracticeA 問題を Elixir Livebook で回答しました

実装したノートブックはこちら

https://github.com/RyoWakabayashi/elixir-learning/tree/main/livebooks/atcoder/abs/practice_1

## 問題

https://atcoder.jp/contests/abs/tasks/practice_1

## 入出力例

以下のようになれば OK です

```elixir
"""
1
2 3
test
"""
|> Main.solve()
|> then(&(&1 == "6 test"))
```

```elixir
"""
72
128 256
myonmyon
"""
|> Main.solve()
|> then(&(&1 == "456 myonmyon"))
```

## 回答１

```elixir
defmodule Main do
  def main do
    :stdio
    |> IO.read(:all)
    |> solve()
    |> IO.puts()
  end

  defp split_lines(lines) do
    lines
    |> String.trim()
    |> String.split("\n")
  end

  defp split_words(words) do
    String.split(words, " ")
  end

  def solve(input) do
    [[a], [b, c], [s]] =
      input
      |> split_lines()
      |> Enum.map(&split_words/1)

    sum =
      [a, b, c]
      |> Enum.map(&String.to_integer/1)
      |> Enum.sum()

    "#{sum} #{s}"
  end
end
```

単純に全行を読み込んで分割し、以下の形式になっていることを前提として `[[a], [b, c], [s]]` で受け取ります

```elixir
"""
a
b c
s
"""
```

実行時間は 488 ms でした

## 回答２

```elixir
...
  def solve(input) do
    [s | numbers] =
      input
      |> split_lines()
      |> Enum.map(&split_words/1)
      |> List.flatten()
      |> Enum.reverse()

    sum =
      numbers
      |> Enum.map(&String.to_integer/1)
      |> Enum.sum()

    "#{sum} #{s}"
  end
...
```

最後の要素だけが文字列なので、 `Enum.reverse()` で逆転させてから先頭を取り出し、それ以外を数値化して合計しました

実行時間は 339 ms でした

## 回答3

```elixir
  def solve(input) do
    [a, b, c, s] =
      input
      |> split_lines()
      |> Enum.map(&split_words/1)
      |> List.flatten()
      |> Enum.with_index()
      |> Enum.map(fn {word, index} ->
        case index do
          3 ->
            word
          _ ->
            String.to_integer(word)
        end
      end)

    "#{a + b + c} #{s}"
  end
```

0番目から2番目は数値化し、3番目は文字のままにしました

実行時間は 339 ms でした

## まとめ

回答２がいい感じだと思います
初めてのMarkdown

# Qiita投稿の練習
Markdownの記法を色々を使ったページを作成してMarkdownの練習をします。

## Markdownとは
### マークアップ言語の一つ #らしい
マーク"アップ"言語なのにMark"down"とはこれは如何に


改行は3つ以上入れても出力には影響しなさそう？
⇒改行で整理しながらかけるのはありがたいですね。
<br>

<b>"\<br>"とか"\<b>"とか一部のタグはHTMLと共通して使えるっぽいです</b>

## #の数で見出しの高さ決めれるのはすごく楽
# コード書くときの癖でコメントアウトしようとして一番大きい見出しになってしまうのは慣れていくしかなさそうですね

## プレビュー見ながら記事書けるのは神
学生時代、htmlでホームページを作ってたときはいちいち
`[記載]→[プレビュー]→[記載]→[プレビュー]`
と画面遷移がめんどくさかった思い出があるので、見ながら書けるQiitaさん一生ついていきます。

## コードブロックの中にもいろんな記法が
これは勉強していく必要がありそうですが、コードブロックにも色々な書き方が出来るらしいです。例えばdiff
```diff_markdown
- お願い猪足升
+ お願いいたします
```
diffを記載するときに色々diff_markdownとかdiff_pythonとか出てきますが、この違いについてはよくわかってません（まだ調べもしてません）。

## なんにせよとにかく使ってみる
少し触っただけでも、htmlとは比較にならないくらい扱いやすい記法だと感じましたので、なれるためにもとにかく使ってみたいと思います。
個人用Steamアプリ（Non-Steamアプリ）のロゴ設定

# Steamに自作ゲームを追加したい。

Windows用のゲームをローカルのSteamに登録したい。
なぜ、そんな事を・・・というのも、SteamLinkを使って、リモートで自作ゲームのゲームパッド動作をテストしたいので、そうしてます。
追記：23/11/23
SteamLinkでBigPictureを解除したら、リモートデスクトップのような事ができたので、SteamInputをそのまま使えないか調査中ですが、解除してもゲームパッドの入力は受け付けないように見えました。

## ロゴ設定

SteamLinkで開くと分かりますが、以下のようなBigPicture？の画像がありません。Steam標準機能では見当たりませんでした。

![steam1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128851/fc461485-65b4-f0f6-3342-cd6901b1a7c9.png)
![steam2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128851/27065a23-cba2-b447-719a-9f5383eca9d1.png)

色々探したら、見つかりました。

https://steamcommunity.com/app/353380/discussions/0/451850213950960086/?ctp=2

どうやら、特定の場所に画像を配置するだけで良いみたいです。




![steam1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128851/2c81aa6e-a813-efef-865c-57f77f4f03be.png)

C:¥Program Files(x86)¥Steam¥userdata¥(ユーザーID？)¥config¥grid
(ID)_hero.png：Steamアプリで追加可能。~~1920x620px~~
(ID)_logo.png：Steamアプリで追加可能。~~640x267px~~
(ID).jpg：Steamアプリで多分、追加不可能。~~460x215px~~
(ID)p.jpg：Steamアプリで多分、追加不可能。~~600x900px~~

（修正）サイズは参考値です。

流れとしては、Steamアプリからロゴを追加すれば、ここにheroかlogoの画像が生成されるので、そのIDを使って画像を追加すればOKだと思います。
標準であったら、ごめんなさい。
モールス信号タイピングゲームを作った


## 追記
* [2024/5/8](##-20240508:長押しするとガイドが突破してしまう)
  * 長押しするとガイドが突破するとのコメントをいただいたので修正とその原因を追記

#動機
* Vue3系とCompositon APIの練習
* モールスの受信側はアプリやwebであったが、送信側は自分が思ってるようのものがなかったため
  * `・`と`-`のボタンが分かれているものはあったが、一つのボタンを押す長さで`・`と`-`を出し分けたかった

# つくったもの・デモ
ここから遊べます→https://suechon.github.io/learn_morse_code/

* PC版
![pc_gif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236151/ecddbeb2-ace8-39bc-6f89-34bfbb88f9aa.gif)
SPACEキーの短押し長押しで動きます

* 携帯版
![mobile_gif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236151/f1002d9a-b663-debe-ed4d-06011bbfa856.gif)
ボタンの短押し長押しで動きます

## 環境
* Vue3
* Vuetify3
* Vite


## 技術的な話
### 携帯のタッチ判定
vueでは@{event}でイベント発火できるのでそれを使って実装してましたが、これだとラグがあったので、jsのeventListener使いました。

* ダメだったほう
```vuejs
 <button
   v-wave
   class="btn-circle"
  @touchstart="btnPush"
  @touchend="btnUp">
    <v-icon size="x-large">mdi-waveform</v-icon>
 </button>
```

* よかったほう

```vuejs
<script setpu>
const touch = document.getElementsByClassName("btn-circle");

onMounted(() => {
  touch.addEventListener("touchstart", () => {
      // 押したときの処置
    });
  touch.addEventListener("touchend", () => {
      // 離したときの処理
    });
}
</script>
<template>
  <button v-wave class="btn-circle">
    <v-icon size="x-large">mdi-waveform</v-icon>
  </button>
</template>

```

### 短(ドット)・長(ダッシュ)の判定
何ミリ秒以上押したら長で判定するよう判定してますが、気分や慣れによって判定が微妙なときがありました
なので長短判定のガイドをいれて思ったように判定されないストレスを軽減させました

* ゲージが白の時に離せば短
![dot.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236151/76828771-f4a8-c335-d332-e65f099acae2.gif)

* ゲージが青の時に離せば長
![dash.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236151/a9e639ae-22b2-0e94-1656-5e6b5e6288e0.gif)


### Github Pagesへのデプロイ
Vue3ではGithub Pagesへのリリース初めてだったのでこちらを参考にしました。
大変簡単でよかったです
[Vite + Vue3のプロジェクトをGithub Pagesを使って5分でデプロイする](https://qiita.com/yutoun/items/d61595530f3384e7e3ee)


## 感想
Vue3系とCompositon APIの練習目的もあったのでなんとなく使えるようになってよかったです
小さいものだと作りながらコンポーネント分けるのがめんどくさいな～～とおもってだらだら書いてるので気が向いたら清書したいです


# 追記
## 20240508:長押しするとガイドが突破してしまう
[コメント内容](https://qiita.com/Sue_chan/items/2b58e4ee2105de1ef88b#comment-28181835e87db9999783)

### 原因
1. setIntervalを複数起動していた
`キーを押す→setIntervalが呼ばれる→キーを離す→clearIntervalが呼ばれる`を想定していたが、キーを速く押すなどするとclearIntervalが呼ばれる前にsetIntervalが起動し、多重に実行されていた
2. 複数起動しているときclearIntervalをしても一番最近起動したsetIntervalにのみ適用される
そのため、最初に起動したsetIntervalは残り続け、ガイドの限界を突破していた

### 修正
setIntervalを実行する前にclearIntervalを行って2重での起動を行わないようにする
``` diff
const pushCommon = () => {
  // 2重で起動しないようにする
+  clearInterval(interval.value);

  interval.value = setInterval(() => {
    if (barWidth.value >= 200) {
      clearInterval(interval.value);
      return;
    }
    bar.value.classList.remove("blue");
    barWidth.value += 2;
    bar.value.style.width = barWidth.value + "px";
    if (barWidth.value >= blueBarSize) {
      bar.value.classList.add("blue");
    }
  }, 1);
};
```
## 参考にしたサイト
[ITガイド:JavaScript: タイマーの多重起動を防止する方法](https://step-learn.com/article/javascript/065-timer-multi.html)
[Qiita:clearIntervalが効かない時](https://qiita.com/mimoe/items/629f535ffbd9e78db83b)
【メモ】VSCodeの、特定の文字列を認識させる設定

プロジェクト特有の文字列を記述すると、VSCodeに波線で表示されてしまうことがあります。
それの回避策を下記に記述します。

手動で、ルートディレクトリに`.vscode/settings.json`を作成

```json:.vscode/settings.json
{
    "cSpell.words": [
        "aaa",
        "bbb",
        "ccc",
    ]
}
```

これで、VSCodeの波線が消えます。
SAP認定資格取得の取り組み手順

SAP資格取得（ABAP）の取り組み手順の一例について以下に記載します。

### 手順１：「SAPとは何か」について理解する。 
一例ですが
https://it-biz.online/sap/overview/#toc1　　 
等を参考にしていただければ、初心者でも理解できる内容になっております

### 手順２：会社の業務について理解する 
SAPは基幹業務であるため、「財務」「営業・販売」「製造」「人事」「総務」の役割について理解すべきです。 
一番理解しやすい書籍として、
「世界一わかりやすいSAPの教科書 入門編」
が一番理解しやすいと思われます。
https://www.amazon.co.jp/%E4%B8%96%E7%95%8C%E4%B8%80%E3%82%8F%E3%81%8B%E3%82%8A%E3%82%84%E3%81%99%E3%81%84SAP%E3%81%AE%E6%95%99%E7%A7%91%E6%9B%B8-%E5%85%A5%E9%96%80%E7%B7%A8-%E3%81%A8%E3%81%8F/dp/4798065196/ref=rvi_sccl_34/358-9897464-4279721?pd_rd_w=m9go1&content-id=amzn1.sym.a4dc92d7-7100-437e-b3e3-2349e8298523&pf_rd_p=a4dc92d7-7100-437e-b3e3-2349e8298523&pf_rd_r=38NSFWMJPMWRKGVEXVWF&pd_rd_wg=CiA9A&pd_rd_r=348b5403-5dee-4739-a645-42ffa1c3bb4a&pd_rd_i=4798065196&psc=1
 
### 手順３：SAPの各モジュールについて理解する。
この内容についても、
「世界一わかりやすいSAPの教科書 入門編」
が一番理解しやすいと思われます。

### 手順４：SAP S4 HANA トライアル環境を構築する 
私は、
https://cal.sap.com/console/tenant_0QT4U9MGJAOW#/instances　 
のstart your 30day trial を利用しました。 

### 手順５：SAP S4 HANA トライアル環境を利用する 
私は、
デモシナリオの例(品質管理を伴うサプライヤからの入庫プロセス) 
https://assets.cdn.sap.com/sapcom/docs/2019/07/10786c8d-5a7d-0010-87a3-c30de2ffd8ff.pdf 
を試しました。
 

### 手順６：Kindle 問題集を購入し、1日5問程度解いてみる。 
同じ問題を1週間で5回（5日で25問覚えるので、それを100回）繰り返してください。 
可能であれば、すぐ（忘れないうち）に受験してください。

皆様の成功を記念いたします。
わかりにくいプログラミング用語を神的な覚え方で覚えちゃう

::: note
これアレ（良記事）よ。はっきり言うて。おーん。
:::

# さあいくぞ
おれは真剣だぞ
## 🐶①「false=０」の覚え方
⇒ フォルス
⇒ フォォォォ！！！！
⇒ Foooooooooo↑↑
⇒ OOOOOOO0000000
### <font color="red"><b>よってfalse = 0</b></font> 
<br>
王道中の王道の覚え方。
<br><br>

## 🐶②「justify-content: center」と「align-items: center」
どっちを使えば正しく要素が整列するのか分からんですよね？？

そんな時はコレ。

### <font color="red"><b>「align-items: center」＝ 🍡だんご三兄弟🍡 </b></font>

特別に画像で説明してやるぜ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1311883/37831465-f7be-04af-819d-7d03fdb8d1a4.png)

「flex-direction: colmun」の場合も同様

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1311883/b4fc9557-a786-69c5-3892-d4be9a3f8e38.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1311883/fddcc150-229b-32ac-2767-294b90512b81.png)



## 🐶③論理積「A&&B」=「AかつB」の覚え方
正確には論理積と呼ぶ

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Logical_AND

### AかつBが「&&」

### <font color="red"><b>エビカツ安藤</b></font>🦐

エビ🦐（AB）・カツ🍤（かつ）・安藤👩（アンド）
<br><br>
もはや「意味が分かれば怖い話」の域。
<br>
<br>
<br>

## 🐶④論理和「A || B」=「AまたはB」の覚え方

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Logical_OR

「または」のことです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1311883/fb1a82a8-51c9-62dd-a2c0-60be23fd125b.png)

### あ～～！！😲そういうことか！！Σ（・□・；）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1311883/a59986d3-1f8f-11ab-e592-833fa5986d37.png)

即落ち二コマ漫画。

## 🐶⑤三項演算子の記号「?」「:」どっちが先か

### <font color="red">「三項」</font>なので常識的に考えて、<font color="red">「３」っぽい方が先</font>

### よって、 <font color="red"><b>？が先</b></font>

（よく見たら３と？似とる） 

<br>
<br>

## 🐶⑥「HTTPステータス500＝サーバーエラー」の覚え方

500
⇒ ごおお
⇒ ゴー
⇒ Go
⇒ <font color="red"><b>Goはサーバーサイド言語</b></font> 

https://go.dev/

### <font color="red"><b>つまり500はサーバーエラー</b></font> 
真面目に言ってマウス。ホリネズミだけに。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1311883/7db25161-bae3-8a1b-545c-164bd9d5f838.png)

https://go.dev/blog/gopher

<br><br>

## 🐶⑦エンコードとデコード

encodeの「en」は<b>「〜にする」</b>という意味を持ってます。

これは英語に共通してます。
### 例）
① enable to 動詞 = ～すること可能にする
　※「できる」ではないので要注意
② enrich　= ～を豊富にする
　※「豊富になる」ではないので要注意

ということで、<font color="red"><b>encode = 「コードにする」</b></font>という意味。
例えばBase64エンコードなら<font color="red"><b>「Base64のコードにする」</b></font>という意味でございます。

デコードはその逆です。


<br><br>
#### 最後だけ割とちゃんとした覚え方でエライ。
<br>

# まとめ
<font color="red"><b>エビカツ安藤</b></font>🦐がいっちゃん好き。
だんご三兄弟だけはガチで使える。
chatgptのbing検索機能（今更）

検索するだけでしょ...って思ってたけど、最新の情報ピックアップしてくれるの便利...!!

ChatGptログイン → 左下のアカウントをクリック → Settings → Beta Ffeatures → Browse with Bing オン

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2713217/9ed0237b-61ce-607b-cf47-24cf4a4c9f84.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2713217/56a7d6b7-2d30-72d4-8c30-7daaa78791de.png)
Windows10でSSHサーバーを利用する方法

# 概要

普段はLinuxしか使わないおじさんがWindows10にSSHサーバーをインストールする必要があり困った話。

やりたいこと：
```
・Windows10へSSHのインストール
・外部からWindows10に接続する
```

# 解決方法

PowerShellを管理者権限で開きましょ。

## OpenSSHがインストールされているか確認する

```powershell
Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH*'
```

インストールされていない場合には以下のような出力があります。
その場合、両方ともインストールしてやってください。
```
Name  : OpenSSH.Client~~~~0.0.1.0
State : NotPresent

Name  : OpenSSH.Server~~~~0.0.1.0
State : NotPresent
```

クライアントをインストールする場合以下のコマンドを入力してください。
```powershell
Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0
```

サーバーをインストールする場合以下のコマンドを入力してください。
```powershell
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
```

こちらの画面でもまたインストール可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1523062/13f0959a-be91-6958-15c2-51dab1bee2a6.png)


## SSHサーバーを起動させる

以下のコマンドでSSHサーバーを起動させて、自動起動を有効化します。

```powershell
Start-Service sshd
Set-Service -Name sshd -StartupType 'Automatic'
```

以下のコマンドでファイアウォールの設定をします。

```powershell
# Confirm the Firewall rule is configured. It should be created automatically by setup. Run the following to verify
if (!(Get-NetFirewallRule -Name "OpenSSH-Server-In-TCP" -ErrorAction SilentlyContinue | Select-Object Name, Enabled)) {
    Write-Output "Firewall Rule 'OpenSSH-Server-In-TCP' does not exist, creating it..."
    New-NetFirewallRule -Name 'OpenSSH-Server-In-TCP' -DisplayName 'OpenSSH Server (sshd)' -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22
} else {
    Write-Output "Firewall rule 'OpenSSH-Server-In-TCP' has been created and exists."
}
```

## 接続テスト

```powershell
ssh username@servername
```

（何かがうまくいかない場合は管理者権限で実行することをお勧めします。）

# まとめ

Windows10にSSHサーバーをインストールして、接続するなんてことをしました。
ありがたいマイクロソフトドキュメント。

## 参考

https://learn.microsoft.com/ja-jp/windows-server/administration/openssh/openssh_install_firstuse
配列とハッシュとインスタンスの使い分け　まとめ

配列（Array）、ハッシュ（Hash）、およびインスタンス（Instance）は、Rubyにおけるデータの構造を表現するための異なる手段です。それぞれの使い分けについて。

<h2>配列（Array）</h2>

配列は、要素を順序付けて格納するために使用されます。要素は、0から始まるインデックスを使用してアクセスされます。
要素の順序が重要であり、順番にアクセスする必要がある場合に使用されます。
配列は、同じ種類のデータや異なる種類のデータを混在させて格納することができます。

```ruby
fruits = ["apple", "banana", "orange"]
puts fruits[0] # "apple" を取得
```

<h2>ハッシュ（Hash）</h2>

ハッシュは、キーと値のペアを関連付けるために使用されます。各キーは一意であり、値をキーを使用して取得します。
要素の順序が重要ではなく、キーに基づいてアクセスする必要がある場合に使用されます。
ハッシュは、異なる種類のデータを関連付けるために使用されることがあります。

```ruby
person = {
  "name" => "John",
  "age" => 25,
  "city" => "Tokyo"
}
puts person["name"] # "John" を取得
```
<h2>インスタンス（Instance）</h2>

インスタンスは、クラスから生成されたオブジェクトを表します。クラスは、特定の属性（変数）と振る舞い（メソッド）を持つオブジェクトの設計図です。
オブジェクト指向プログラミングにおいて、クラスを元に複数のインスタンスを生成し、それぞれのインスタンスが独自の状態を持つことができます。
オブジェクトの属性や振る舞いが重要であり、そのオブジェクトが持つデータや操作に注目する場合に使用されます。

```ruby
class Person
  attr_accessor :name, :age, :city
end

person = Person.new
person.name = "John"
person.age = 25
person.city = "Tokyo"
puts person.name # "John" を取得
```


**使い分けのポイント**

配列は要素の順序が重要であり、順番にアクセスする必要がある場合に適しています。
ハッシュは要素の順序が重要ではなく、キーに基づいてアクセスする必要がある場合に適しています。
インスタンスは、オブジェクトの属性と振る舞いが重要であり、個々のオブジェクトの状態を表現するために使用されます。
これらのデータ構造を使い分けることで、データを効果的に管理できます。
【Spring Security】URLごとのアクセス制御

Spring Securityでアクセス制御を書く機会があったので、備忘録として残します。
# 例
```java:WebSecurityConfig.java
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity httpSecurity) throws Exception {
	httpSecurity.authorizeHttpRequests(authorize -> authorize
            // 一般的な静的ファイルパス（"/css/**"など）に対し、非ログインでのアクセスを許可
            .requestMatchers(PathRequest.toStaticResources().atCommonLocations()).permitAll()
            // "/hoge"と"/fuga"に対し、非ログインでのアクセスを許可
			.requestMatchers("/hoge", "/fuga").permitAll()
            // "/admin/"が先頭に付くパスすべてに対し、ROLE_ADMINの権限を持つユーザーのみのアクセスを許可
			.requestMatchers("/admin/**").hasRole("ADMIN")
            // 上記で指定していないパスについては、ログイン済みならアクセスを許可
			.anyRequest().authenticated()
		);

	return http.build();
}
```
- **requestMatchers()**
アクセス制御を設定したいパスを指定する。
- **permitAll()**
認証されていない状態でも、対象パスへのアクセスを許可する。
-  **hasRole()**
指定した権限を持つ場合のみ、対象パスへのアクセスを許可する。
引数に渡した文字列の先頭に、"ROLE_"をくっつけた文字列を権限としてアクセス制御を行うので注意。（上記の例では、"ADMIN"を引数に渡しているため、"ROLE_ADMIN"の権限を持つユーザーのみアクセスを許可す）
- **anyRequest()**
requestMatchers()で指定していないパスを対象とする。
- **authenticated()**
認証されている場合のみ、対象パスへのアクセスを許可する。
***
参考になれば幸いです。

# 参考文献
・【Spring Security】認証・認可の基礎
https://b1san-blog.com/post/spring/spring-sec-auth/
App Runner とは

# この記事について
この記事はAWS SAP 取得に向けた勉強のために「AWS Black Belt Online Seminar CON243 App Runner 入門」の内容を整理したものです。

# App Runner とは
> インフラやAWSについての経験がなくても、コンテナ化されたウェブアプリケーションやAPIを簡単かつ迅速にAWS上で動かせるサービス


# フルマネージドインフラストラクチャ
- インフラ構築・運用が不要なので、アプリケーションの開発と運用に集中できる
    - App Runnerがインフラの構築と運用をしてくれる
    - 利用者からはインフラは見えず、コンテナインスタンスだけが見える

# 自動デプロイ
- ソースコード/ソースイメージの変更を検知し、自動でダウンタイムなくデプロイ

# オートスケール
- トラフィックサイズに応じてオートスケール
- 利用者は閾値とコンテナの最小/最大数を決めるだけで良い

# ログとメトリクス
- ログとメトリクスを自動で収集
- App Runnerコンソールから確認できる

# セキュリティ
- TLS（HTTPS）を自動で設定
- 各コンテナは独立した環境で実行される

# 環境変数
- アプリケーション設定値を環境変数で管理できる

# カスタムドメイン
- 任意のカスタムドメインを設定可能

# 感想
Amplify などインフラの知識が不要でもアプリケーションをAWS上で動かせるサービスが多く出てきている。
インフラ専門だけではやっていけないのだろうか。

# 参考
AWS Black Belt Online Seminar CON243
App Runner 入門
https://pages.awscloud.com/rs/112-TZM-766/images/202112_AWS_Black_Belt_AWS_CON243_App_Runner_Introduction.pdf
ruby　” と’ の使い分け　まとめ

Rubyでは、ダブルクォート（"）とシングルクォート（'）の両方が文字列を表すために使用されます。それぞれの使い分けについて説明します。

ダブルクォート（"）:

ダブルクォートで囲まれた文字列は、変数の展開や特殊文字のエスケープなど、より多くの機能を持ちます。
変数や式を文字列内で評価したい場合、ダブルクォートを使用します。
特殊文字（例：改行を表す\nやタブを表す\tなど）をエスケープしたい場合も、ダブルクォートを使用します。
ex)

```ruby
name = "John"
age = 25
puts "My name is #{name} and I'm #{age} years old."

My name is John and I'm 25 years old.
```

シングルクォート（'）:

シングルクォートで囲まれた文字列は、そのままの形で表現されます。変数の展開や特殊文字のエスケープは行われません。
文字列内で特殊文字や変数展開が必要ない場合、またはエスケープ文字を使いたくない場合に使用します。
ex)

```ruby
Copy code
name = 'John'
age = 25
puts 'My name is ' + name + ' and I\'m ' + age.to_s + ' years old.'
出力:

My name is John and I'm 25 years old.
```
**注意点**

ダブルクォート内では、変数や式を#{}で囲むことで展開されますが、シングルクォート内では展開されません。
特殊文字をエスケープする場合には、シングルクォートではバックスラッシュ（\）を使ってエスケープする必要があります。
これらのルールに従って、適切にダブルクォートとシングルクォートを使い分けることができます。

**エスケープ文字って何**
エスケープ文字は、プログラミング言語において特別な意味を持つ文字やシーケンスを表現するために使用される特殊な文字です。エスケープ文字はバックスラッシュ（\）と組み合わせて使用されます。

エスケープ文字の例としてよく使用されるものは以下の通りです

**ダブルクォート（"）やシングルクォート（'）のエスケープ**

文字列内にダブルクォートやシングルクォート自体を含めたい場合に使用します。
例えば、文字列内にダブルクォートを含めたい場合は \"、シングルクォートを含めたい場合は \' という具体的なエスケープ文字列を使用します。
改行やタブなどの特殊文字のエスケープ

文字列内に改行やタブといった特殊文字を表現したい場合に使用します。
例えば、改行を表現する場合は \n、タブを表現する場合は \t というエスケープ文字列を使用します。
以下に具体例を示します

```ruby

puts "This is a double-quoted string with a \"double quote\" inside."
puts 'This is a single-quoted string with a \'single quote\' inside.'

puts "This string has a line break\nin the middle."
puts "This string has a tab\tcharacter."

This is a double-quoted string with a "double quote" inside.
This is a single-quoted string with a 'single quote' inside.

This string has a line break
in the middle.
This string has a tab    character.
```
上記のコードでは、エスケープ文字を使用することで、文字列内に特殊な文字や引用符を含めることができます。

エスケープ文字は、文字列の中で特定の文字をそのまま表現するために使用される便利なツールです。
OSアップデートなどで【zsh: command not found】出た場合の対処法

# はじめに
先日MacをVenturaにアップデートしたら、コンソールでひたすら【zsh: command not found】で怒られるようになりました。
この対処法を備忘録的にまとめておこうと思います。

# 対処法
結論からお伝えすると、バージョンアップにより通すべきパスが変わっています。
その為、パスを通す必要があります。

ユーザー名のディレクトリ直下に以下ファイルが存在しているはずです。
もしない場合は、以下を実行して作成してください。

```
touch .zshrc 
```

すでに設定ファイルが存在している場合は、以下を実行し編集します。

```
open ~/.zshrc 
```
通すべきパスは以下です、そのまま以下を追記します。

```
export PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
```
追記が完了したら、以下を実行し設定を反映したら完了です。

```
source ~/.zshrc
```
もし上記で反映されない場合は、ターミナルを再起動してみると良いと思います。
これでnot foundで怒られることはなくなると思います。

# さいごに
OSアップデートしたら何も実行できなくなったので一瞬焦りました、、、