OmniAICreator/Qiita-1.07M huggingface dataset:
自然言語処理について【E資格対策】

# <font color="#1e90ff">**WordEmbedding**</font>
単語を数値のベクトルとして表現する方法のこと。
代表的な手法として、Word2Vecがある。
### Word2Vec
2013年にGoogleが開発した単語表現の手法で、単語の意味を表現する「単語ベクトル」を作成することができる。コサイン類似度を算出すれば、2つの単語がどれくらい近いのかが算出できる。

cosθ = (A・B) / |A|・|B| 

# <font color="#1e90ff">**Transformer**</font>
Transformerとは、自己注意力（Self-Attention）という機構を用いたニューラルネットワークのアーキテクチャのこと。自己注意力とは、入力された系列の各要素が他の要素とどの程度関連しているかを計算する仕組み。Transformerは、エンコーダとデコーダという二つの部分から構成され、エンコーダは入力系列をベクトルに変換し、デコーダはベクトルから出力系列を生成する。Tr機械翻訳や文章生成などの系列変換（Sequence-to-Sequence）のタスクに適している。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3700895/05b0d2c9-8238-877a-8d9b-f8970aaad407.png)
https://zero2one.jp/ai-word/transformer/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3700895/21501642-6e5c-2143-bb6b-0b7c73750105.png)
https://udemy.benesse.co.jp/data-science/transformer.html

# <font color="#1e90ff">**BERT**</font>
BERTとは、Bidirectional Encoder Representations from Transformersの略で、Transformerのエンコーダのみを用いた言語表現モデルのこと。
**BERTは、大規模なテキストコーパスから事前学習を行い、マスクされた単語の予測や文の連続性の判定という二つのタスクを解く。**
この事前学習により、BERTは文脈に応じた単語や文の特徴を捉えることができる。**事前学習後、BERTは出力層を追加するだけで様々な自然言語処理のタスクにファインチューニングできます。** BERTは、自然言語理解や質問応答などのタスクで高い性能を発揮したらしい。


# <font color="#1e90ff">**GPT-n**</font>
GPT-nとは、Generative Pre-trained Transformerの略で、Transformerのデコーダのみを用いた言語生成モデルのこと。GPT-nは、<font color="#1e90ff">**大規模なテキストコーパスから事前学習を行い、左から右に向かって単語を予測する言語モデルを構築する。**
</font>この事前学習により、GPT-nは一般的な言語知識や文法を習得することができます。事前学習後、GPT-nは様々な自然言語処理のタスクに**ゼロショット**や**ファインチューニング**できます。GPT-nは、文章生成やテキスト要約などのタスクで高い性能を発揮します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3700895/e2eb0013-4a1a-b870-8e9b-038f0d2330df.png)



# <font color="#1e90ff">**参考ページ**</font>

https://udemy.benesse.co.jp/data-science/transformer.html
半年でAtcoder茶色を目指す！

# 初めに
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3702257/5fd3e74d-aefb-4958-b97b-d280a843ea2a.png)

2023年の9月、長期インターンに参加したいと考えていたのですが、Webテストのコーディングが全然できず、選考落ちしたため、Atcoderを始めました。
2024年3月までに入茶することを目標としていたのですが、2月10日に入茶できました。
kaggle（機械学習のコンペティション）をメイン、Atcoderをサブとして行っていました。

# 自己紹介
- 医療工学系の学部のD大学2年生（2024年4月から3年生）
- **数学苦手**(これのせいで医学部を諦めた)
- 授業ではC#とArduinoの経験（基礎レベルの授業）
- プログラミング歴2年半
- Atcoder茶色
- Kaggler（メダルなし）


# 競プロを経験して
競プロを始めるまでは、本で機械学習を勉強したり、自動ログインアプリを作ったりしていました。そのため競プロも少しできると思っていたのですが、実際に競プロ始めて見たところ実力はクソ雑魚でした。
Atcoder Beginner Contest（ABC）では初めはA問題しか解けませんでしたが、今は何とかC問題まで解けるようになりました。
競プロを経験してから実感として、実装したいと思うプログラムをある程度作れるようになりました（計算量は無視）。


# 入茶までにやったこと
- [競技プログラミングの鉄則 ~アルゴリズム力と思考力を高める77の技術](https://www.amazon.co.jp/%E7%AB%B6%E6%8A%80%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%81%AE%E9%89%84%E5%89%87-%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E5%8A%9B%E3%81%A8%E6%80%9D%E8%80%83%E5%8A%9B%E3%82%92%E9%AB%98%E3%82%81%E3%82%8B77%E3%81%AE%E6%8A%80%E8%A1%93-Compass-Books%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E7%B1%B3%E7%94%B0/dp/483997750X)（アフェリエイトではないです）
- [競プロ典型90問](https://atcoder.jp/contests/typical90)（入茶には必要ないかも）
- ライブラリの習得

正直、ほぼ競技プログラミングの鉄則しか勉強していませんが、毎週コンテストに参加し、復習をすることで入茶しました。

# コンテストに取り組む前に
- 標準入力・標準出力の方法を知る
- [ライブラリ](https://qiita.com/Kentaro_okumura/items/5b95b767a2e691cd5482)を使いこなせるようになる
- A問題、B問題を各5問くらい解き、感覚をつかみ、C問題は解説、正解者のコードを見て理解できるようにする

コンテストに取り組む前までに、B問題まで解けるレベルになっていた方が良いとは思いますが、とりあえず参加するのも手だと思います。
実際に難しいのは、問題を解くことよりも、毎週土曜日の21:00~コンテストに参加することだと思います。
これさえ出来れば時間がかかったとしてもいつかは入茶できると思います。

# 小テク（非推奨）
~~コンテストの問題をChatGPTを聞くという方法もあります。**（非推奨）**
感覚的にA問題はだいたい解ける、B問題は例外条件が難しいと解けない、C問題は解けても計算量でアウト、D問題は解けないという感じです。しかし、これはAtcoderの社長がおっしゃっている通り、非推奨です。
単純に実力がつかないので、コピペはやめておいた方がいいと思います。
上手い使い方をあるとすれば、**途中の処理でどうすればいいかわかるが、実装経験がないためコードを書けない、ライブラリを知らないという時に特定の処理を聞く**のが良いと思います。
もしChatGPTだけで入茶したとしても、緑以上になることは出来ないので、普通に解くのが上を目指すのに最短ルートだと思います。~~
現在は、ルールが改定されています。以下から確認してください。
https://atcoder.jp/posts/1347

# 最後に
~~4回生になるまでに、入緑とkaggle銅メダルを目指したいと思います！~~
4回生になった今、インターンが忙しく、競プロ、kaggleは全然参加できていません。競プロに関してはかなり実力が落ちてしまったかも...
ssh接続を楽にする設定

- sshコマンドで毎回ポート番号などを指定するのは面倒
- 楽にするために、SSHのconfigファイルで設定

### SSHローカルポートフォワーディング

```bash
## 通常のSSHコマンドでのローカルポートフォワーディング
ssh -L [ローカルポート]:[宛先ホスト]:[宛先ポート] [ユーザー名]@[ホスト名またはIPアドレス]
```
- この設定を`.ssh/config` にて記述

</br>


```text
Host [ホスト名またはIPアドレス]
    LocalForward [ローカルポート番号] [リモートホスト名またはIPアドレス]:[リモートポート番号]
```

- これで、 `$ssh  [ホスト名またはIPアドレス]` のコマンドでよくなる

- 例えば、ローカルポート8080をリモートホストのポート80にフォワードさせる設定を `.ssh/config` に記述

```text
Host my-remote-server
    HostName example.com
    Port 22
    User myusername
    LocalForward 8080 localhost:80
```

- 下記を実行するだけでポートフォワーディングが自動で設定できる
```bash
$ ssh my-remote-server
```
操作分類とそのログ目安

- カーソル操作
    - マウス操作やキーボード操作
    - 多大なノイズとなる為、通常はデバッグ用のログにすら残さないデータ
    - ログの保存期間目安はテンポラリーあるいは長くて24時間
- 画面操作
    - そのソフトウェア自体の起動・終了、画面遷移、ポップアップ(メニューやダイアログ)の表示を及び閉じる操作
    - デバッグ用のログに含めるべきデータ
    - ログの保存期間目安は1週間
- データ操作
    - 主データや設定の作成、更新、削除あるいは、何かの実行を行う操作
    - 通常、必ずログに残すべきデータ
    - ログの保存期間目安は1年

( 転載元: https://twitter.com/wraith13/status/1756634289943560680 )
AIキャラクター実況をStyle-Bert-VITS2とVMagicMirrorで始めよう


AI技術の進歩により、誰でも簡単に自分のバーチャルキャラクターを作成し、リアルタイムで実況や配信を行うことが可能になりました。この記事では、AI音声合成技術のStyle-Bert-VITS2と、バーチャルキャラクター操作ツールのVMagicMirrorを使って、あなた自身のAIキャラクター実況を始める方法を初心者向けに解説します。

## 仮想オーディオデバイス「VB-CABLE」の設定

実況や配信の環境構築の第一歩として、仮想オーディオデバイス「VB-CABLE」の設定から始めます。VB-CABLEは、異なるアプリケーション間でオーディオ信号を送受信するための仮想オーディオケーブルです。以下の手順で設定を行いましょう。

![](https://hamaruki.com/wp-content/uploads/2024/02/AIキャラクター実況をStyle-Bert-VITS2とVMagicMirrorで始めよう.png)

公式ウェブサイトからソフトウェアをダウンロードし、インストールします。

https://vb-audio.com/Cable/

インストール後、システムのサウンド設定で「VB-CABLE」を出力および入力デバイスとして選択します。



ブラウザや録音アプリのオーディオ出力設定を「VB-CABLE」に変更し、疎通確認を行います。
詳しい手順は下記のサイトがおすすめです。

https://www.monoists.com/entry/how-to-use-vb-cable

## VMagicMirrorでのマイク設定変更

次に、バーチャルキャラクターを動かすためのVMagicMirrorの設定を行います。
VMagicMirrorは特に難しい設定をせずにリップシンクできるのでおすすめです。

https://baku-dreameater.booth.pm/items/1272298

特に重要なのがマイク設定です。VMagicMirrorを使ってキャラクターに自分の声を反映させるためには、マイク設定を正しく構成する必要があります。

![file](https://hamaruki.com/wp-content/uploads/2024/02/image-1707635345100.png)

VMagicMirrorを起動し、「配信」メニューから「リップシンク」を開きます。
マイクの入力デバイスとして「VB-CABLE」を選択し、設定を保存します。
これにより、VB-CABLE経由で送られてくるオーディオ信号をVMagicMirrorがキャプチャし、バーチャルキャラクターが音声に合わせてリップシンクするようになります。

## Style-Bert-VITS2で感情豊かなmp3音声を作成


最後に、Style-Bert-VITS2を使って、入力テキストから感情豊かな音声を生成します。
構成図はこちら

![](https://hamaruki.com/wp-content/uploads/2024/02/AIキャラクター実況をStyle-Bert-VITS2とVMagicMirrorで始めよう-1.png)

Style-Bert-VITS2は、テキストから人間のような自然な感情を含んだ音声を生成することができるAI音声合成技術です。ここでは、簡単な使い方を紹介します。

詳しい解説はこちら

https://hamaruki.com/i-tried-playing-pokellmon-with-ai-style-bert-vits2/

Style-Bert-VITS2のウェブサイトまたはアプリケーションを開きます。
![file](https://hamaruki.com/wp-content/uploads/2024/02/image-1707635483024.png)


音声に変換したいテキストを入力し、希望する感情や発話スタイルを選択します。

ChatGPT4に生成してもらったニューススクリプト

>みなさん、こんにちは！ニュースタイムです。
本日は、大規模言語モデル（エルエルエム）の最新の進展についてお伝えします。「モア エージェント イズ オール ユー ニード」という論文がこの分野に新たな光を投げかけています。

>大規模言語モデルの性能は、単純なサンプリングと投票方法を用いることで、生成されるエージェントの数に比例して向上することを発見しました。
驚くべきことに、この方法は既存の複雑な手法と併用してエルエルエムをさらに強化でき、その効果はタスクの難易度に関連しています。

>研究チームは、エルエルエムのベンチマークにわたる広範な実験を行い、この発見の実証と、その発生を促進する特性の研究を行いました。
結果は、タスクの難易度が高まるにつれて、エージェントの数を増やすことの効果が顕著になることを示しています。

>この興味深い研究についてもっと知りたい方は、論文のコードが公開されています。
オンラインで詳細を確認し、この分野の最前線に触れてみてください。

>大規模言語モデルの可能性はまだまだ拡がりを見せています。
今日のニュースでした。引き続き、最新の科学技術ニュースにご注目ください。
それでは、またお会いしましょう！


「合成」ボタンをクリックすると、入力されたテキストからmp3フォーマットの音声ファイルが生成されます。
生成された音声ファイルは、実況や配信で背景音楽として使用したり、キャラクターの声として利用することができます。

## デモ動画

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


## まとめ
Style-Bert-VITS2とVMagicMirrorを組み合わせることで、あなた自身のバーチャルキャラクター実況を簡単に始めることができます。この記事で紹介したステップを参考に、仮想オーディオデバイスの設定、VMagicMirrorでのマイク設定変更、感情豊かな音声の生成に挑戦してみてください。AI技術を活用した新しい形のコミュニケーションを楽しんでみましょう。
分散処理について【E資格対策】

# <font color="#1e90ff">**モデル並列**</font>
1つのモデルを分割して、各プロセスに割り当てて学習します。各プロセスは、モデルの一部分を計算し、必要に応じて他のプロセスと通信します。モデル並列は、一つのプロセスに載りきらない大きなモデルを学習できるようにします。

# <font color="#1e90ff">**データ並列**</font>
モデルのコピーをたくさん作って、それぞれのモデルに別のデータをぶち込んで学習させる。
で、、学習後にそれぞれが更新したパラメータを平均化して、同期させる。
データ並列は、バッチサイズをプロセス数倍にできるので、学習を高速化できる。
ArchLinux: VirtualBox をインストール

## VirtualBox のインストール

```bash
sudo pacman -S virtualbox virtualbox-host-modules-arch  virtualbox-guest-iso
```

ユーザーを、グループ　vboxusers に加える

```bash
sudo gpasswd -a uchida vboxusers
```

インストールされたバージョン
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/c0d1a244-be9b-7fd5-0e0b-02f6f5fdaee9.png)

## Host のネットワーク設定を変更する

>これは、Guest から　ping を打った時に、　次のようになる問題を解決するために行います。

```text
$ ping -c 3 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=57 time=14.4 ms
64 bytes from 8.8.8.8: icmp_seq=1 ttl=56 time=14.4 ms (DUP!)
64 bytes from 8.8.8.8: icmp_seq=2 ttl=57 time=13.5 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=56 time=13.5 ms (DUP!)
64 bytes from 8.8.8.8: icmp_seq=3 ttl=57 time=13.3 ms
```

IP フォワードの設定の確認

```text
$ sudo cat /proc/sys/net/ipv4/ip_forward
1
```

設定変更

```bash
sudo sysctl -w net.ipv4.ip_forward=0
```

IP フォワードの設定の確認

```text
$ sudo cat /proc/sys/net/ipv4/ip_forward
0
```

 ## Ubuntu 23.10 を VirtualBox にインストール

 ISO イメージをダウンロード

 ```text
 ubuntu-23.10.1-desktop-amd64.iso
 ```

インストールした状態

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/36e2c096-5859-19d4-3a08-7b5813f9c373.png)

ネットワークの設定変更

NAT を BridgedAdapter に変更する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/d3852fd6-26ba-1962-0fe1-e69e9c37bbe0.png)

Guest に ssh-server のインストール

```bash
sudo apt install openssh-server
```

Guest の ssh サーバーの起動

```bash
sudo systemctl start ssh
```

Guest の IP アドレスを確認

```text
$ ip addr
（省略）
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:9c:83:b1 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.8/24 brd 192.168.1.255 scope global dynamic noprefixroute enp0s3
（省略）
```

Host から　ping で確認

```bash
ping -c 3 192.168.1.8
```

Host から　ssh 接続

```bash
ssh 192.168.1.8
```
    
## Zorin 16.3 をインストール

ダウンロードした ISO

```text
Zorin-OS-16.3-Lite-64-bit.iso
```

インストールした状態

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/a328d381-77ae-95f6-034a-98c80828b02e.png)

ネットワークの設定変更

NAT を BridgedAdapter に変更する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/b58c21d8-5f2c-6415-9c88-6608eae43c90.png)
5分で読める自作シェルの作り方

# 5分で読める自作シェルの作り方

シェルはユーザーからのコマンドを受け取り、それを実行するためのインターフェースです。LinuxやUnix系のOSで一般的に使用されるbashやzshなどが有名ですが、ここではC言語を使用して簡単な自作シェルを作る方法を解説します。この入門記事を通じて、シェルの基本的な構造と動作原理を理解し、自分だけのシェルを作成する第一歩を踏み出しましょう。

## 基本構成

自作シェルの開発には、以下のステップが含まれます：

1. **入力の読み取り**：ユーザーからの入力を受け取ります。
2. **コマンドの解析（パース）**：入力されたコマンドラインをコマンドとその引数に分割します。
3. **コマンドの実行**：解析したコマンドを実行します。
4. **プロセスの終了を待つ**：コマンドが外部プログラムである場合、その終了を待ちます。
5. **繰り返し**：ユーザーがシェルを終了するまで、上記のステップを繰り返します。

## 実装

### 入力の読み取り

```c
char *read_line(void) {
    char *line = NULL;
    size_t bufsize = 0;
    getline(&line, &bufsize, stdin);
    return line;
}
```

### コマンドの解析

```c
char **split_line(char *line) {
    int bufsize = 64, position = 0;
    char **tokens = malloc(bufsize * sizeof(char*));
    char *token;

    token = strtok(line, " \t\r\n\a");
    while (token != NULL) {
        tokens[position++] = token;
        token = strtok(NULL, " \t\r\n\a");
    }
    tokens[position] = NULL;
    return tokens;
}
```

### コマンドの実行

```c
int execute(char **args) {
    pid_t pid, wpid;
    int status;

    pid = fork();
    if (pid == 0) {
        if (execvp(args[0], args) == -1) {
            perror("exec");
        }
        exit(EXIT_FAILURE);
    } else if (pid < 0) {
        perror("fork");
    } else {
        do {
            wpid = waitpid(pid, &status, WUNTRACED);
        } while (!WIFEXITED(status) && !WIFSIGNALED(status));
    }

    return 1;
}
```

### メインループ

```c
void loop(void) {
    char *line;
    char **args;
    int status;

    do {
        printf("> ");
        line = read_line();
        args = split_line(line);
        status = execute(args);

        free(line);
        free(args);
    } while (status);
}

int main(void) {
    loop();
    return EXIT_SUCCESS;
}
```

## 使用例

- プログラムをコンパイルし、実行します
    ```zsh
    gcc -o myshell myshell.c && ./myshell
    ```
- プロンプトが表示されたら、各種コマンド（例：`ls`, `cd directory_name`, `cat file.txt`）を入力して実行します。
    ```zsh
    ls
    => file1 dirA ...
    ```

## まとめ

この記事では、C言語を用いて基本的な自作シェルを作成する方法を紹介しました。シェルプログラミングは、OSのプロセス管理やユーザーインターフェースの基礎を学ぶ絶好の機会です。ここで紹介したコードはシェルの基本的な骨組みを提供しますが、さらに高度な機能（リダイレクト、パイプライン、シグナルハンドリングなど）を追加することで、より強力で柔軟なシェルを開発することが可能です。
SSD1306用の全画面データを作って遊ぶ。(水平走査線)


目的
OLEDのテスト


●128x64のビットマップ(BMP)を作る

https://qiita.com/caa45040/items/574231109a31cb6c55eb


![o_cop940.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/0829d1e5-c686-a883-6731-93788f4e78be.jpeg)


---------------------------------------------

●データを変換する


https://javl.github.io/image2cpp/


![o_cop941.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/32f0a60d-e17c-4b45-44ed-3524a0a2d215.jpeg)


![o_cop945.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/871986ea-dff2-b446-50ca-9e67fd8c8b07.jpeg)




![o_cop943.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/652c2570-f3d0-7bfc-6293-29d2a5bda5b1.jpeg)

1,2が示すボタンを押す。


-------------------------------------------------------

●テキストデータを張り付けて編集する

![o_cop944.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/37f7957e-ff15-12fa-b4d3-3644bf7a24b3.jpeg)
Pythonのコード書き方まとめ

仕事でpythonを書くことになったので、調べて分かった内容を下記に記載する。
ほぼ事前知識が無い状態から始めたので、おかしな記載がいくつかあるかもしれない。

他に分かったことがあれば追記していこうと思う。

## とりあえず
- インデントを揃えないとコンパイルエラーになる
- pythonは動的型付け言語のため、型を指定しなくても値の取得などが可能。

## 型の指定方法

`変数名: 型`
型ヒントとpythonでは呼ばれる。

## uuid
import uuidでインポートする。

https://docs.python.org/ja/3/library/uuid.html

https://dev.classmethod.jp/articles/how-generate-uuid-python-uuid4/

使える関数が複数あり、`uuid4()`がランダムに一意IDを作るものになる。

## import の仕方
基本は import パッケージ名 で取り込む。

```py
# uuidパッケージをインポートする
import uuid

# uuidパッケージの特定メソッド(uuid4)をインポートする
from uuid import uuid4

# uuidパッケージの特定メソッド(uuid4)をインポートし、名前をrandom_uuidとして扱う
from uuid import uuid4 as random_uuid
```

## 型の種類

https://kino-code.com/python_introductory-and-applied05/

https://dot-blog.jp/news/python-object-type/

```
str: 文字列
int: 数値
float: 浮動小数
bool: 真偽値、True or Falseの2種類
list: List型。
tuple: タプル型
dict: 辞書型。
```

## int
Python2には固定長整数のint型と可変長整数のlong型があったが、Python3には可変長整数のint型（Python2のlong型相当）しかない。

https://note.nkmk.me/python-int-max-value/

### タプル

固定のキーマップを作ろうと思った時に使うかもしれない。

https://blog.codecamp.jp/python-tuple

### 辞書型

マップに近い形で使うことができる。

https://utokyo-ipp.github.io/3/3-1.html

## null指定
Pythonでは`None`
判定は `is None` で行う。

<!--
## 初期化について

## 静的解析
いろいろあるけどflake8
-->


## voidの扱い
pythonではvoidは記載しない。
returnが無い場合は暗黙的に、`None`が返される。

## 関数で値を返す場合
基本的には`return 〇〇`で指定したものが返却される。
型ヒントとして`def 関数名() -> 返却される型`

## Nullがあり得る場合の型ヒント
1．`Optional`をつけるか
2．`型 | None = None`で指定する

## if の記載の仕方

```py
if 判定文:
    処理
elif 判定文:
    処理
else:
    処理
```

## docString
javadocのように、関数や変数などの説明用の書式。
下記などが参考になる。

https://qiita.com/flcn-x/items/393c6f1f1e1e5abec906

色んなスタイルの記載法があるが、おおよそは概要と引数など関数で扱うパラメータ・リターン値などの内容。

多く呼ばれるクラスには確実に書いておいた方がいいと思う

```py
def 関数名
""" 概要

    Args:
        引数：引数の説明
    Returns:
        戻り値：戻り値の説明
    Raises:
        例外：起こりえる例外の説明
"""
```



## try~catchの記載の仕方
例外については以下のようにtry句の中に、エラーが起こりうる処理を記載し
`except`以降に例外が発生した処理を記載する。
例外は複数指定することができ、`()`で例外クラスを括ることでまとめることができる。
例外を補足した後は、例外を握りつぶさないようにthrowし直すことが体感多い。
else`に関しては、エラーが起こらなかった場合に行う処理を記載し
finallyには必ず最後に行う処理を記載する。
```py
try:
    処理
except 例外クラス1 as ex:
    例外処理
    pass
except (例外クラス2, 例外クラス3) as ex:
    例外処理
    raise ex
else:
    エラーが起こらなかった場合の処理
finally:
    どんな場合でも絶対に行う処理
```
JUnitとは

# JUnitとは
JUnitとは、Javaで単体テスト（※１）を実施するためのテスティングフレームワークです。
Javaに限らず、各言語に対してこのような単体テストのテスティングフレームワークが存在しており、総称して「xUnit」と呼ばれています。
JUnitは、Javaに対応したxUnitであることから「JUnit」と呼ばれています。

（※１）単体テストとは、プログラムを構成する最小単位となる「モジュール（※２）」の機能が正しく動作しているかを確認するテストのことです。
（※２）モジュール：関数やメソッドなどのコードのまとまり。


# Junitを使うメリット
JUnitは、ソフトウェアとして稼働するプログラムに対し、「プログラムが正しく動くのかを確認するテスト用のプログラム（テストコード）」を作ります。作成したテストプログラムは、一度作ればいつでも再実行可能となるため、「何度も同じテストを実施することが可能」になります。
この「同じテストを繰り返し実施する」という操作は、大規模開発において非常に有用です。
また、プログラムの修正を行った場合には、そのプログラムだけでなく、他のプログラムにも修正の影響が出ていないかを確認する「回帰テスト（リグレッションテスト）」を実施します。
JUnitを使うことで単体テストが自動で実施可能であり、もし他のプログラムに影響を及ぼしている場合にはそのテストが失敗します。そのため、「ほかのプログラムに影響を及ぼしている」ことをすぐに検知できるのです。
もちろん、すべての影響範囲をJUnitで確認することはできません。しかし、回帰テストにかける工数を削減することが可能であるため、最終的に品質の高いソフトウェアができあがるのです。


# 参考サイト
https://camp.trainocate.co.jp/magazine/whats-junit/
MySQLである長さのインデックス付きのtextを複数UPDATEすると「Undo log record is too big.」エラーになる

## 概要
MySQLのUPDATE文でエラー（Error: 1713 SQLSTATE: HY000 (ER_UNDO_RECORD_TOO_BIG)）が発生するという話。
特別特殊なことをしていないのにエラーになるので、ちょっと面食らいます。
発生条件もちょっと特殊だし。

## 条件
MySQL 5.7系(Aurora2も含む）、8.0系（Aurora3も含む）、8.3系
ROW_FORMAT=DYNAMIC （COMPACTは問題なし）
型=text、mediumtext （longtextは検証していません）
アップデートする前の文字列の長さ= length=7500前後。length=1000、10000は問題なし

## 再現

以下は、「あいう 」(utf8で3バイト、3バイト、3バイト、1バイト）で10バイト×750回の繰り返しで7500バイトのデータ例です。

```sql
CREATE DATABASE test_db CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

CREATE TABLE `test` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `txt1` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci,
  `txt2` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci,
  PRIMARY KEY (`id`),
  KEY `idx_txt1` (`txt1`(191)),
  KEY `idx_txt2` (`txt2`(191))
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC;

INSERT INTO
  `test` (
    `txt1`,
    `txt2`
  )
VALUES
  (
    repeat('あいう ', 750),
    repeat('あいう ', 750)
  );

UPDATE
  `test`
SET
  `txt1` = 'test',
  `txt2` = 'test'
WHERE
  `id` = 1;
```

ここで「Undo log record is too big.」エラーが発生します。

## 回避策
複数アップデートするとエラーになる
　↓
1つずつアップデートすればエラーにならない

```sql
UPDATE
  `test`
SET
  `txt1` = 'test'
WHERE
  `id` = 1;

UPDATE
  `test`
SET
  `txt2` = 'test'
WHERE
  `id` = 1;
```

ワークアラウンド（回避策）としてはとてつもなくダルいですが、現時点ではこれしか回避方法がないようです。

## 似たような事例が公式バグリストに上がっている

[Bug #88150	'Undo log record is too big.' error occurring in very narrow range of str length](https://bugs.mysql.com/bug.php?id=88150)

上記は文字列の長さが3962〜4030の場合、と書いてあります。
違いと言えば、バージョンが違うため、innodb_file_formatが「Antelope」であること、今回はMySQL8系は固定で「Barracuda」になっています。
また、ROW_FORMATが「COMPACT」に対して、今回は「DYNAMIC」となっています。（MySQL8で「COMPACT」の場合はエラーは出ませんでした）

こちら、2017年10月に投稿されたものです。もう6年半になりますが、「Status:	Verified」のままで、修正されておりません。こちらはMySQL5.5〜5.7までが対象となっています。
まさか、2024年になって、MySQL8.0（最新版の8.0.36)、8.3（最新版の8.3.0）になっても同じようなエラーが続いているとは…。

## 再現条件の確認

エラーになる、ならないの境界が割と謎です。
超ざっくり言えば、両方7000〜8000バイトだとエラーになる確率が高いです。

| length(txt1) | length(txt2) | 結果 |
|:-:|:-:|:-:|
| 7300 | 7300 | ⭕ |
| 7400 | 7400 | ❌ |
| 7500 | 7500 | ❌ |
| 7600 | 7600 | ❌ |
| 7700 | 7700 | ❌ |
| 7800 | 7800 | ❌ |
| 7900 | 7900 | ❌ |
| 8000 | 8000 | ❌ |
| 8100 | 8100 | ⭕ |
| 7300 | 8000 | ⭕ |
| 8000 | 7300 | ⭕ |
| 7400 | 8100 | ❌ |
| 8100 | 7400 | ❌ |
| 100 | 15400 | ⭕ |
| 100 | 7700 | ⭕ |
| 7000 | 7700 | ⭕ |
| 7700 | 100 | ⭕ |
bigqueryのコンソール上で既存のテーブルにレコードを追加したい

# 結論
以下のようにすることで追加できる
```
INSERT `project.dataset.product` (sku, description, quantity, price)
SELECT *
FROM UNNEST([
    ('GCH635354', 'Chair', 4, 345.7),
    ('GRD828822', 'Gardening', 2,9.5),
    ('ABC123456', 'Furniture', 3, 36.3),
    ('TBL535522', 'Table', 6, 878.4),
    ('CHR762222', 'Chair', 4, 435.6)
]);
```
参考: [BigQuery 特集: データ操作（DML）](https://cloud.google.com/blog/ja/products/data-analytics/bigquery-explained-data-manipulation-dml#:~:text=INSERT%EF%BC%88SELECT%20%E3%82%B9%E3%83%86%E3%83%BC%E3%83%88%E3%83%A1%E3%83%B3%E3%83%88%E3%82%92%E4%BD%BF%E7%94%A8%EF%BC%89)
# UNNESTは何をしているか
- 配列を作成して、個別の要素を行として扱えるようにしている。
サポーターズ主催の技育CAMPに参加しての感想(企業賞受賞！) ①

---
<font color="orange">サポーターズ</font>主催の技育CAMPに参加しての感想 ①
---

**目次**
- [1. 技育CAMPとは](#1-技育campとは)
- [2. 取り組んだ内容](#2-取り組んだ内容)
- [3. Github、スライド共有](#3-githubスライド共有)
- [4. おわりに](#4-おわりに)

## 1. 技育CAMPとは

　技育CAMPは、技術への一歩を踏み出す学生のためのスキルアッププラットフォームです。

　エンジニアを志す学生へハッカソンとアカデミア（技術勉強会）を通して継続的なインプットとアウトプットの場を提供するスキルアップ支援プラットフォームです。

　未来の「技」術者を「育」てる活動、からきているそうです。

 >参考 
[公式HP 技育CAMP](https://talent.supporterz.jp/geekcamp/)

## 2. 取り組んだ内容

　私たちは鍵の開閉を検知し、通知する
『鍵の観測者（オブザーバー）』を作成しました。

　外にいるとき、鍵がかかっているかどうか不安になったとき、ラインの通知でその鍵の情報がわかる。そういったものになっております。
 
## 3. Github、スライド共有

　以下が今回作成したスライド、Githubです。

　ハードは紹介できないですが、スライドの画像、動画にて参考にしていただけると助かります。
 [Google スライド](https://docs.google.com/presentation/d/1zu3n9gjhj_1GBCUROkzS_RxIX3tsZfjRJEbrq4FQ9b0/edit#slide=id.p)

 [Github①　ラズパイ側](https://github.com/kknowk/SDK)
 [Github②　サーバー側](https://github.com/kaaaaakun/render-line-bot-trial.git)

## 4. おわりに

　初めてハッカソンに参加しましたが、努力が実り、また素敵な仲間たちと協力し完成まで漕ぎ着けたのが嬉しかったです！

　次回の②は具体的な内容、コード説明ができればと思います！
ユニットテスト（単体テスト）とは

# ユニットテスト（単体テスト）とは
ユニットテストとは、システム開発における工程のひとつで、
**プログラムを構成する最小単位となる「モジュール（※１）」の機能が正しく動作しているかを確認するテストのことです。**
多くの場合、コーディングを行ったプログラマ自身が担当します。

（※１）モジュール：関数やメソッドなどのコードのまとまり。

ユニットテストでは、主にホワイトボックステストを実施します。
ホワイトボックステストは、個々のモジュール中の命令文や条件判定「if-else文」といった論理的な構成とその組み合わせや、入出力のデータパターンによるエラーを発見することを目的としたテストです。「モジュール内で実行されうる処理を確認するテスト」という事になります。
このテストはバグを早期に発見することが可能です。ここでバグを出し切って、後工程につなげるという意識が重要になります。

# 単体テストのやり方
単体テストを実施するやり方には、デバッグ実行やログ出力で確認する方法やフレームワークを使用する方法などがあります。

フレームワークを使用する場合、まず「テストケース」と「テスト用プログラム」を作成します。テストケースとは、開発中のシステムに合わせて検証するポイントをまとめたドキュメントのことです。
そして、テストケースを作成した後はその内容に従ってテスト用のプログラムを作成します。
ほとんどのプログラミング言語でテスト用のフレームワークが用意されているため、それを利用して作成することが一般的です。例えば、Javaであれば**JUnit**、C/C++言語であればCppUnit、PHPであればPHPUnitがあります。
【React】Framer Motionのメリット・デメリットをまとめてみる

![70574400-9e6a-11e9-8708-22d4bf4c3322.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1819316/b95331cd-87f8-7829-71c5-09a433688f3b.png)

最近はReactの勢いがすごいですね。
そんなReactでアニメーションを導入するとき、多くの開発者はFramer Motionの記事を目にすると思います。
今回はFramer Motionのメリット・デメリットを筆者の開発体験を元にまとめてみます。

# メリット
## シンプルで簡単
Framer Motionを使うと、ピュアなCSSよりも**簡単にアニメーションを導入できます**。
例えば、以下のようなアニメーションも簡単に導入できます。

![a.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1819316/71f35b1c-e11a-2a61-ab96-f801230ee490.gif)

```typescript
export default function Example(props) {
    return (
        <div>
            <motion.div
                style={{
                    width: 150,
                    height: 150,
                    borderRadius: 30,
                    backgroundColor: "#fff",
                    cursor: "pointer",
                }}
                whileTap={{ rotate: 90, scale: 0.75 }}
            />
        </div>
    )
}
```
ピュアなCSSで実現しようとすると、keyframesを調整しないといけなかったりとなかなか大変だと思います、、
というように、tsxファイルにちょこっとコードを書くだけでアニメーションができるので**とても便利**です。

## 幅広いオプションと柔軟性
Framer Motionには様々なオプションが用意されています。

例えば、
- イージング
- アニメーション期間
- タップ時のアニメーション
- ホバー時のアニメーション
- 初回レンダー時アニメーションのオン/オフ
- CSSでのアニメーション制御のオン/オフ

など多くのオプションがあり、自分好みにカスタマイズできます。

これらのオプションを使って、実際にアニメーションを作ってみました。

https://x.com/ducker_tech/status/1742131674136379625?s=20

ソースコードは[Framer Motion Examples](https://framer-motion.site)にてチェックしてみてください！
これ以外のアニメーションも紹介していますよ。

## アニメーション付きページ遷移
この記事では詳しく説明しませんが、Framer MotionのAnimation Presenceを使えば、
アニメーション付きのページ遷移をラクに実装できます。
詳しいことに関しては、下記の記事などを参照してみてください。

https://qiita.com/arrow2nd/items/b16385cf22c567fbbf33

https://www.framer.com/motion/examples/#react-router-6-page-transitions

# デメリット
## SSR非対応
Framer MotionはJavaScriptライブラリです。そのため、Framer MotionのアニメーションコンポーネントはReact Server Component内では使えません。（motion.divなど）
SSR非対応ということは、**SEO面で不利になったり、Adsenseの審査が通らなかったりします**。
なぜなら、JavaScriptが読み込まれた後にレンダリングされるからです。
Next.jsはデフォルトがSSRなので、開発の際には注意が必要です。

## パッケージサイズが大きい
Framer Motionのパッケージサイズは**2.3MB**もあります。
同じようなアニメーションライブラリである react-springは僅か**55.1KB**です。
ビルドサイズやパフォーマンスに少なからず影響することを知っておきましょう。
ただ、Framer Motionは**Lazy Loadingをサポートしている**ので
パフォーマンス改善の余地はあります。

# 結論
Framer Motionが適している状況としては、
- Google Adsenseを導入しない
- SEOをそこまで気にしない（＝ブログには向かない）
- SSRにこだわらない

といったところでしょうか。

もし、Framer Motionに興味がある方は[Framer Motion Examples](https://framer-motion.site)で
サンプルアニメーションをチェックしてみてくださいね！

https://x.com/ducker_tech/status/1756509827294191925?s=20
最適化アルゴリズムについて【E資格対策】

# 最適化アルゴリズムとは
今回は、ディープラーニングで最適な重みパラメータを見つけるための最適化アルゴリズムについて説明します。この分野はマジでE資格でよく出るよ。

有名なのは以下の5つ。特にモメンタムはE資格に死ぬほど出題されるで。

・確率的勾配降下法(SGD)
・モメンタム
・Adagrad
・RMSProp
・Adam


# 確率的勾配降下法
ランダムに取り出したデータを用いて、パラメータを更新していく勾配降下法。

■更新式
```math
W_{t+1} = W_t 　- 　η \frac{\partial L}{\partial W_t} 
```

■イメージ図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3700895/84b57b70-7c42-409b-baae-54c9c55fe7e5.png)
https://kunassy.com/oprimizer/


# モメンタム
SGDの進化形。Momentunでは、αvtすなわち、「現在の速度に0以上1未満の係数をかけたもの」を、次の時刻の速度に足し合わせる。これは、物理学で言う”慣性“の導入に相当する。

##### 更新式
```math
W_{t+1} = α・v_t 　- 　η \frac{\partial L}{\partial W_t} 
```

##### Q. 慣性を導入すると、何が起こるか。
以下のようなイメージです。
・現在の速度が大きいとき、外力を受けない限り、次の時刻における速度も大きいまま。
・現在の速度が小さいとき、外力を受けない限り、次の時刻における速度も小さいまま。


# Adagrad
SGDの進化形。
「学習が進むにつれて、学習係数を小さくしていく」というアイデアを盛り込んだアルゴリズムのこと。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3700895/6a40edd2-e010-c097-8f80-a49b944953e5.png)

# RMSProp
Adagradの進化形。AdaGradに移動平均を導入したアルゴリズムのこと。

##### 更新式
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3700895/fe08db69-de15-8f88-c7a3-7ae699ed4d54.png)


##### Q. なんで移動平均を導入したのか？何がよくなるん？

まず、AdaGradは、パラメータごとに学習率を調整することで最適化を効率的に行うアルゴリズムです。AdaGradでは、過去の勾配の二乗の和を使って、学習率を小さくしていきます。これは、勾配が大きいパラメータは学習率を小さくし、勾配が小さいパラメータは学習率を大きくするという効果があります。しかし、AdaGradの問題は、学習が進むにつれて学習率が小さくなりすぎてしまうということです。学習率が小さくなりすぎると、最適な値に近づけなくなってしまいます。

RMSPropは、AdaGradの問題を解決するために、勾配の二乗の移動平均を使って学習率を調整するアルゴリズムです。移動平均とは、時系列データの変動をならすために、ある期間のデータの平均を計算して新しいデータとすることです。RMSPropでは、過去の勾配の二乗の和ではなく、過去の勾配の二乗の移動平均を使って、学習率を小さくしていきます。これにより、過去の勾配の影響を減らし、最新の勾配に応じて学習率を適切に保つことができます。つまり、移動平均を導入すると、学習率の減衰を抑えて、最適化の収束を早めることができるということです。

# Adam
Adamとは、モメンタムとRMSPropという二つの最適化アルゴリズムを組み合わせたものです。モメンタムは、過去の勾配の方向に加速度をつけてパラメータを更新する方法です。RMSPropは、勾配の大きさに応じて学習率を調整する方法です。Adamでは、これらの2つを組み合わせて、より効率的にパラメータを最適化する。

##### 更新式
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3700895/8ee4bb97-92f2-0723-8749-2ee601908a03.png)



▽E(Wt)：t回目の勾配
mt​：t回目のモーメンタム
vt​：t回目の勾配の二乗和
m^t​：mt​​のバイアス補正した値
v^t：vt​のバイアス補正した値、
θt：t回目のパラメータ
α：学習率
β1​、β2​：減衰率
ϵ：ゼロ除算を防ぐための微小な値

##### 更新式の解説

<①式について>
これはモメンタムの更新式。過去のモーメンタムmt−に減衰率β1​をかけて、現在の勾配▽E(Wt)に(1−β1)​をかけたものを足している。これにより、勾配の方向に加速度がつく。
β1​は、過去の勾配の影響力を調整するパラメータで、一般には0.9程度に設定されるらしい。

<②式について>
これはRMSPropの更新式。過去の勾配の二乗和vtに減衰率β2​をかけて、現在の勾配の二乗▽E(Wt)^2に(1−β2)​をかけたものを足している。これにより、勾配の大きさに応じて学習率が調整される。
β2​は、過去の勾配の影響力を調整するパラメータで、一般には0.999程度に設定されるらしい。

<③式、④式について>
バイアス補正の式です。mt​とvt​は、減衰率β1​とβ2​によって割り引かれた勾配の(二乗の)和であるため、初めの頃は値が小さくなってしまいます。これでは効率的に学習が進められないため、β1t​とβ2t​で割って値を拡大します。β1t​とβ2t​は指数的に0に近づくため、更新が進むにつれてこの補正の影響が薄れていきます。

<⑤式について>
これはパラメータの更新式です。現在のパラメータθt​から、学習率αとバイアス補正したモーメンタムm^t​と勾配の二乗和v^t​の平方根の逆数をかけたものを引きます。これにより、モーメンタムの方向に加速しながら、勾配の大きさに応じて学習率が調整されます。αは、学習の速さを調整するパラメータで、一般には0.001程度に設定されます。ϵは、ゼロ除算を防ぐための微小な値で、一般には10^−8程度に設定されます。



# 参考文献
本記事は、以下のページと、AVILENの『全人類がわかるE資格講座』のテキスト・動画を参考にして作成しております。

https://kunassy.com/oprimizer/

https://zero2one.jp/ai-word/adam/
時系列データ分析の強化と落とし穴: ラグ特徴量と移動平均特徴量の使い方

# はじめに
時系列データを用いた予測モデルの構築では、過去の情報を利用して未来を予測することが一般的です。この過程で、ラグ特徴量や移動平均特徴量をデータに追加することは、予測モデルの性能を向上させる有効な手段です。しかし、これらの特徴量を導入する際には、データリークのリスクを避けるために注意が必要です。この記事では、ラグ特徴量と移動平均特徴量の生成方法、それらが予測モデルに与える影響、そしてデータリークを防ぐための注意点について解説します。

## サンプルデータの作成
分析の基礎となるサンプルデータを生成しましょう。ここでは、ある商品の10日間の売上データを想定します。
```
import pandas as pd

data = {
    'date': pd.date_range(start='2024-01-01', periods=10, freq='D'),
    'sales': [200, 220, 250, 270, 300, 310, 330, 350, 370, 390]
}
df = pd.DataFrame(data)
```
![スクリーンショット 2024-02-11 18.07.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3364428/300dc0bb-599a-e2c9-f6ba-99381bd12688.png)
## ラグ特徴量の追加
ラグ特徴量は、過去のデータポイントを現在の観測値に関連付ける手法です。これにより、モデルが過去の情報を活用して予測を行うのを助けます。
```
# 1日前の売上をラグ特徴量として追加
df['sales_lag_1'] = df['sales'].shift(1)
```
![スクリーンショット 2024-02-11 18.08.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3364428/1d8f87f2-e42a-0366-874e-a5ef86b082b5.png)

## 移動平均特徴量の追加
移動平均特徴量は、過去N日間のデータポイントの平均を現在の観測値に追加することで、データの短期的なトレンドや季節性を捉えます。
```
# 過去3日間の売上の移動平均を特徴量として追加
df['sales_moving_average_3'] = df['sales'].rolling(window=3).mean()
```
![スクリーンショット 2024-02-11 18.10.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3364428/3280bee3-0dbb-c410-0535-6071c6196e72.png)

## データリークのリスクと注意点
特に時系列分析において、未来の情報が誤って訓練データに含まれることは「データリーク」と呼ばれ、モデルが現実の状況よりも過大に良い性能を示す原因となります。ラグ特徴量や移動平均特徴量を生成する際には、将来のデータを使用しないように注意が必要です。例えば、未来の売上データを用いてラグ特徴量や移動平均特徴量を計算すると、モデルは実際には入手不可能な情報を使って学習してしまいます。

## 対策
「正しいデータ分割」
時系列分析では、機械学習モデルの学習時、データを時間に沿って順序正しく分割し、未来のデータが訓練データセットに含まれないように気を付けます。

「適切な特徴量選択」
モデル訓練時に日付を確認し、未来の情報を含まない特徴量のみを使用することが重要です。
## まとめ
ラグ特徴量と移動平均特徴量は、時系列データ分析における強力なツールですが、それらを使用する際にはデータリークのリスクを避けるための注意が必要です。正しく特徴量を生成し、適切にデータを扱うことで、これらの特徴量はモデルの予測精度を大幅に向上させることができます。時系列分析の精度を高めつつ、データの誤用を防ぐためには、これらのガイドラインに注意してデータの準備と分析を行うことが鍵となります。
VSCodeでPrettierが効かない

# VSCodeでVSCodeが効かない
- 拡張機能は有効
- Format on Saveも設定している
## 確認
- ターミナルのOUTPUTでPretiterを選択し、下記メッセージが表示されていれば、以下の方法で解決します。
```
Require config set to true and no config present. Skipping file.
```
## 解決
- 設定の「Prettier: Require Config」のチェックを外す
- このチェックが入っていると、.prettierrcファイルがない場合にPrettierが効かなくなる。
- .prettierrcを書かない場合には、Require Configをfalseにしておく。

## 参考
- https://github.com/prettier/prettier-vscode/issues/1257
Webエンジニアになって一年経ったので、改めて自分のキャリアについて考える。

# 始めに
2023年に都内の受託企業に入り、Webエンジニアになった柊と申します。
この度Webエンジニアになって一年経ち、
ちょうどWebエンジニア生活の振り返りを行いたいと思っていたところ、
ちょうど良いテーマでの記事投稿キャンペーンを見付けたので、
今後の自分のキャリアについて考えてみようと思います。

# スペック
- プログラミングスクールRUNTEQで9ヶ月学び、Ruby on RailsでWebアプリを作成
→詳しくはこちらの[記事](https://qiita.com/hiiragi_en17/items/721174747da020cd84f5)を参照してください
- 受託企業の会社に入り、Laravelの自社案件にアサインされる
- つい最近Pythonの自社案件にアサインされ、FastAPIを学び始める

# 入社したての頃の反省
まずは言語がRailsからLaravelに変わったため、
言語のキャッチアップから始まりました。
会社に入れたことに安堵してしまい、入社前にキャッチアップを怠ったため、
擬似プロジェクトについていけず、上の人を失望させる結果になってしまいました。
言い訳をすると京都から東京に引っ越しがあり、
しかもその前に体調を崩してしまいろくに時間が取れなかったのが背景にあります。
ただこれは完全なる言い訳です。
入社する前にできるだけのことをしておいた方が良いという教訓を身をもって体験しました。

# 案件での活動
自社案件にアサインされ、少しずつLaravelがわかるようになってきてから、
業務が楽しいと思えるようになったと感じました。
専門知識が必要な案件だったため、ドメイン知識の調査や設計などに追われ、
そんなにコードを書けない日も続き、その時は自分の成長が感じられず、落ち込んでいた日もありました。
しかし後から考えると、貴重な体験をさせて頂けたなと思います。
普通ならそんなにすぐには関わることができない、
上流工程に携わることができましたので。
案件内はメンバーにも恵まれ、楽しく開発をすることができたのも大きかったです。
よく飲み会を行ったり、プライベートで案件メンバーと遊びに行ったりもしました。

# 社内での活動
技術的にはまだまだひよっこですが、
自分が学んだことを周りにも還元したり、
組織にナレッジとして蓄積したりする、
ギバーなマインドセットを心がけるようにしていました。
社内では、部署ごとの技術共有チャンネルがあり、
そこで定期的に発信を行うようにしていました。
またチームの定例では企画を行い、ファシリテーターを行ったり、
部署で輪読会の企画を行ったりもしました。
また会社のLT会に誘われ登壇を行ったりもしました。
そういった社内への還元を進んで行ったことは、
上長からも誉めていただくことが多かったため、
今後も積極的に行っていきたいなと思いっております。

# 社外での活動
他のエンジニアの方の話も聞きたかったため、
オフラインのイベントにも参加するようにしていました。
もくもく会、交流会、LT会など、多種多様なイベントに参加しました。
ただスクールでの主催や、社内では企画したことがあっても、
まだ社外イベントでの企画やLT登壇などは行ったことがないため、
そういうことができるようになりたいなとも思っています。

# これまでのキャリアの考え方
元々私はそんなに技術を好きだとは言えない人間のため、
マネジメントの方に行くしかないと考えていました。
勉強するのが楽しくない訳ではないですが、寝食を忘れるほどではない。
そんな”本当に技術が好き”な人に技術力が敵うわけがない、
そう考えると技術を極めて、テックリードの道に進む方は最初から考えられない。
将来自分の価値を見出すにはマネジメントの方に進むしかない、
面接でもそういう風に言わざるを得ない時期がありました。
しかしいつしか本当にその道に行こうと考えるようになりました。
その要因としては、今の会社での過ごし方にあったと思います。

# 今の会社の状況
今の会社にいる人はみんなとても性格が良く、更に優秀な人が多く、
上長の人達に私はとてもお世話になりました。
私たちのことを考えて、アサイン先を考えてくれたり、
悩みがあったら気軽に相談させてもらえたり。
勉強会の企画も積極的に後押しして頂ける。
本当に尊敬しています。
しかし、今Webエンジニアが成長できる機会である、
勉強会の企画などが出来なくっており
上長の人達も憂き目に遭っています。
一番性格が良い人達ばかり、酷い目にあっている。
優しくて優秀な人達程、搾取される状況になっています。
私はそういった状況がとても嫌だなと感じました。
その為、
将来的にはそういう人を守れるWebエンジニアになりたいと考えるようになりました。

# 今後どうなりたいか
今の私にはまだまだ力がありません。
技術的にも、ソフトスキル的にも。
まずは以下のようなことを固めていきたいと考えております。

## 技術面
### バックエンド言語を一つ極める
現在は、Laravelを業務で一番書いたため、
それを極めていければ良いなと考えております。
が、別にこれはなんでも良いと思っています。
バッグエンドが結構好きなので、そのまま一番強くなりたいなと感じております。
 
### フロントもある程度できるようにする
バックエンドをやる際に、フロントのことがわからないと、
意外に実装ができないんだなとこの一年で痛感したため、
最近はReactを自己学習しております。
ゆくゆくは、案件等でReactを書けるようになりたいと考えております。

### インフラの知識も学ぶ
やはりバックエンドはインフラとも密接に結びついているため、
この知識の理解はどこかで必要になると思います。
ただ先にフロントを書いてみたいなとも思っていますので、
優先度は低めです。

個人的には、Webエンジニアの上に立つ人間が、
技術的にあまりにも弱いと、誰もついてきてくれないと思っております。
そのため、自己学習は今後もマストで必要だと考えております。

## ソフトスキル
### 自己否定癖を止める
ソフトスキルというかなんというかなんですが。
正直ソフトスキルもまだまだ揃っていない段階なんですけど、
一番はこの悪癖をやめたいと思っています。
こんな人についていきたいと思われるわけがないので。
正直まずは技術だなと思っているので、
ソフトスキルに関しては、
今やっている積極的なイベントの参加や、
コミュニティへの還元作業を続けていき、
その都度色々な情報を仕入れてアップデートしたいなと思っています。

そしてそういったことを、今の会社でできるのかどうか。
そこを含めて、今後のことについて考えていきたいなと思っております。

# まとめ
今回の記事は、正直キャリア戦略とか、
そういった類のものでなく、単なる自己表明になってしまいました。
そんなに強くないWebエンジニア2年目の考え方が、誰かの参考になれば幸いです。
それでは拙い文章でしたが、最後までお読みいただきありがとうございました。
K最近傍法（KNN）による欠損値補完の手法

# はじめに
データ分析の欠損値を補完する方法の一つとして、K最近傍法（KNN）を用いる手法があります。この手法では、欠損値を補完するために、そのデータポイントに最も近いK個のデータポイントを利用します。以下では、KNNを用いて欠損値を補完する方法について詳しく説明します。

## 1. 欠損値を含む列の特定
まず始めに、データセット内で欠損値が含まれる列を特定します。この段階では、データセット内で欠損値を補完する必要がある列を把握することが目的です。
```
import pandas as pd

# データの読み込み
train_data = pd.read_csv('train.csv')
test_data = pd.read_csv('test.csv')

# 欠損値を含む列のリストを作成
missing_columns_train = train_data.columns[train_data.isnull().any()].tolist()
missing_columns_test = test_data.columns[test_data.isnull().any()].tolist()

print("欠損値のある列（トレーニングデータ）:", missing_columns_train)
print("欠損値のある列（テストデータ）:", missing_columns_test)
```
## 2. KNNによる欠損値の補完
次に、KNNを使用して欠損値を補完します。KNNImputerを使用することで、欠損値を近傍のデータポイントから補完することができます。
```
from sklearn.impute import KNNImputer

# KNNImputerのインスタンス化
imputer = KNNImputer(n_neighbors=5, weights='uniform', metric='nan_euclidean')

# 欠損値を含む列のみを抽出
train_missing = train_data[missing_columns_train]
test_missing = test_data[missing_columns_test]

# トレーニングデータセットの欠損値を補完
train_imputed = pd.DataFrame(imputer.fit_transform(train_missing), columns=missing_columns_train)

# テストデータセットの欠損値を補完
test_imputed = pd.DataFrame(imputer.transform(test_missing), columns=missing_columns_test)
```
# 3. 注意点と適用範囲
計算負荷: 
KNNは、全データポイントとの距離を計算する必要があるため、計算負荷が高い場合があります。大規模なデータセットや高次元のデータでは注意が必要です。

適切なKの選択: 
KNNの性能は、近傍点の数(K)の選択に依存します。適切なKの値を選択することが重要です。

欠損値のパターン: 
KNNは、欠損値のパターンに敏感です。ランダムな欠損値には効果的ですが、特定のパターンがある場合には注意が必要です。

これらの手順を経て、K最近傍法を使用して欠損値を補完することで、データセットの品質を向上させ、機械学習モデルの性能を向上させることができます。
AWSの課金状況

## AWSの課金状況を確認する

### 何も使っていないはずなのに、AWSの請求が15$を超えそう・・
EC2も起動していないし、特段何かをつくった記憶はない。さて、なんだろうと時が過ぎるとまた請求がひどくなりそう。
#### Billing&CostManagementで確認する
[こちら](https://us-east-1.console.aws.amazon.com/billing/home#/bills)から確認できる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733402/42f10c61-f241-ac3a-54a5-e7de37617417.png)

請求と支払い請求書のところへ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733402/7f4ebce8-ea3b-8c61-6087-04c6ef4edf3a.png)


なんとNATGatewayをそのままにしていたことが原因だったようです
一時間当たり0.062$といっても、236時間起動させておくと14.63$になってしまうとは
#### コストの原因だと分かったNAT Gatewayを消す

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733402/f259fbeb-81ec-97e7-3f63-37455753c3e0.png)

これで課金は止まるはずです。
BERTを用いて日本語文章の重要度を取得

**最後に今回使用したプログラムをまとめて記載しています。**

# Mac(Intel)環境の構築

BERT(文脈解析)だけでは日本語の理解をするには難しい場合があるため、Mecebを用いて形態素解析をし、その結果を文脈解析をすることで精度をあげることにする。

初めにmecabを実行するための環境を作るために下記を実行。
```console
$ brew install mecab
$ brew install mecab-ipadic
$ pip install mecab-python
```

BERTで用いる環境を構築するために下記を実行。
``` console
$ pip install transformers
$ pip install fugashi 
$ pip install ipadic
```

mecabで形態素解析のプログラムを作成する。
簡単なので一気に示す。
```mecab_words.py
import MeCab

print("テキストを入力してください。")
text = input()
wakati = MeCab.Tagger('-Owakati')
print(wakati.parse(text))
```
 
## 初めに必要なライブラリをインポート
``` vector_words.py
from transformers import BertJapaneseTokenizer, BertModel
import torch
```

# BERTのトークナイザーとモデルを準備
``` vector_words.py
model_name = 'cl-tohoku/bert-base-japanese'
tokenizer = BertJapaneseTokenizer.from_pretrained(model_name)
model = BertModel.from_pretrained(model_name)
```

# 分析したいテキストの入力を待機
``` vector_words.py
print("テキストを入力してください、")
text = input()
```

# テキストをトークン化
``` vector_words.py
inputs = tokenizer(text, return_tensors='pt', padding=True, truncation=True)
```

# BERTモデルで特徴ベクトルを取得
``` vector_words.py
with torch.no_grad():
    outputs = model(**inputs, output_attentions=True)
    attention = outputs.attentions
```

# 最初のレイヤーのAttentionを平均化して各トークンの重要度を求める
``` vector_words.py
avg_attention = torch.stack(tuple(attention[-1])).mean(dim=1).squeeze(0)
token_importance = avg_attention.sum(dim=0)
```

# 重要度の高い順にトークンと重要度を表示
``` vector_words.py
decoded_tokens = tokenizer.convert_ids_to_tokens(inputs['input_ids'][0].tolist())
token_importance_list = list(zip(decoded_tokens, token_importance.tolist()))

sorted_token_importance = sorted(token_importance_list, key=lambda x: x[1], reverse=True)
for token, importance in sorted_token_importance:
    print(f"Token: {token.ljust(15)} Importance: {importance:.4f}")
```

# まとめ
``` vector_words.py
from transformers import BertJapaneseTokenizer, BertModel
import torch

model_name = 'cl-tohoku/bert-base-japanese'
tokenizer = BertJapaneseTokenizer.from_pretrained(model_name)
model = BertModel.from_pretrained(model_name)

print("テキストを入力してください、")
text = input()

inputs = tokenizer(text, return_tensors='pt', padding=True, truncation=True)

with torch.no_grad():
    outputs = model(**inputs, output_attentions=True)
    attention = outputs.attentions

avg_attention = torch.stack(tuple(attention[-1])).mean(dim=1).squeeze(0)
token_importance = avg_attention.sum(dim=0)

decoded_tokens = tokenizer.convert_ids_to_tokens(inputs['input_ids'][0].tolist())
token_importance_list = list(zip(decoded_tokens, token_importance.tolist()))

sorted_token_importance = sorted(token_importance_list, key=lambda x: x[1], reverse=True)
for token, importance in sorted_token_importance:
    print(f"Token: {token.ljust(15)} Importance: {importance:.4f}")
```
# 参考文献
https://qiita.com/paulxll/items/72a2bea9b1d1486ca751
Gradleを用いたJava開発記事まとめ

GradleとKotlinを利用したJavaアプリのソースコードの例をいくつか見つけました。以下のリンクを参考にしてみてください。
Gradle x JavaをKotlinに浮気させる #Java: GradleとKotlinでSpring Bootアプリケーションを作成する方法を紹介しています。
なんとなく使わないGradle: Gradleの基礎とモダンなプラクティスについて解説しています。
GradleとIntelliJで始めるKotlin (プロジェクト作成編) #Kotlin: GradleとIntelliJでKotlinプロジェクトを作成する手順を説明しています。
これらの記事は、GradleとKotlinの組み合わせに関する有益な情報を提供してくれると思います。もし、もっと具体的なソースコードを見たい場合は、GitHubでキーワードを検索してみてください。

GradleとKotlinを利用したJavaアプリのソースコードをGitHubから検索すると、以下のような結果が得られます。

- [gradle/gradle](^3^): Gradleは、JavaやKotlinなどのさまざまな言語やプラットフォームに対応した柔軟で高速な自動化ツールです。このリポジトリでは、Gradleのソースコードやドキュメント、イシュー、プルリクエストなどを見ることができます。
- [Building and testing Java with Gradle](^4^): GitHubのドキュメントには、Gradleを使ってJavaプロジェクトをビルドやテストする方法についてのガイドがあります。GitHub Actionsを使ってGradleのワークフローを自動化する方法も紹介されています。
- [kotlin-gradle](^1^)と[kotlin-application](^2^): これらはGitHubのトピックです。kotlin-gradleは、GradleとKotlinでカスタムなGradleプラグインを作成する方法や、GradleとIntelliJでKotlinプロジェクトを作成する方法などに関するリポジトリを集めています。kotlin-applicationは、Kotlinで作られたさまざまなAndroidアプリやWebアプリなどのリポジトリを集めています。

これらのリンクは、GradleとKotlinを使ったJavaアプリの開発に役立つと思います。もし、もっと詳細な情報や例を探したい場合は、GitHubで自分で検索してみてください。.

Source: Conversation with Bing, 2/11/2024
(1) GitHub - gradle/gradle: Adaptable, fast automation for all. https://github.com/gradle/gradle.
(2) Building and testing Java with Gradle - GitHub Docs. https://docs.github.com/actions/guides/building-and-testing-java-with-gradle.
(3) kotlin-gradle · GitHub Topics · GitHub. https://github.com/topics/kotlin-gradle.
(4) kotlin-application · GitHub Topics · GitHub. https://github.com/topics/kotlin-application.
(5) Shutterstock. https://shutterstock.com/image-photo/preview_1000-1671806992.
【Palworld】専用サーバーのバックアップからローカルのDockerへデータを移動させる手順

# 手順

1. バックアップを取得する
    SSHでバックアップを取得する。サーバー管理者が自分自身ではない場合は管理者に依頼し、ギガファイル便等で送ってもらう

2. Dockerをインストール
    ここからDocker Desktopをインストール
    https://docs.docker.jp/desktop/toc.html

3. palworld-server-dockerをダウンロード
    ここからダウンロード or クローン
    https://github.com/thijsvanloef/palworld-server-docker

4. バックアップデータを展開
    palworld-server-docker\palworldにバックアップデータを展開

5. コンテナの起動
    コマンドプロンプト or ターミナル or WSLでpalworld-server-dockerのフォルダに入り、
    `docker-compose up -d`を実行

6. palworldで入る
    自身のIPv4アドレス:8211と、パスワード(デフォルトはworldofpals)で入室
    パスワードはdocker-compose.ymlの「SERVER_PASSWORD=worldofpals」から変更可能


# 感想

Dockerも使わずローカルプレイ用環境に移動させる方法を知りたい
[Markdown]マークダウン記法

# マークダウン記法とは
テキストをシンプルかつ読みやすい形式で記述できる軽量マークアップ言語の一つ
テキストエディタで簡単に記述できる

# 特徴
- 読みやすく、書きやすい
- シンプルで汎用性が高く、多くのツールやプラットフォームでサポートされている
- .mdの拡張子でファイル保存できる

# 用途
- ウェブ記事（Qiitaやnoteなど）
- ブログ（WordPress）
- ノートアプリ（NotionやObsidianなど）
- READMEファイル（GitHubやGitLabなど）

## 見出し
`#`の数が多いほど小さくなる
```
# 見出しレベル1
## 見出しレベル2
### 見出しレベル3
#### 見出しレベル4
##### 見出しレベル5
###### 見出しレベル6
```
<details>
<summary>例</summary>

# 見出しレベル1
## 見出しレベル2
### 見出しレベル3
#### 見出しレベル4
##### 見出しレベル5
###### 見出しレベル6
</details>

## リスト
### 箇条書きリスト
`-`のあとに`スペース`
`-`の前に`スペース2個以上`を記述すると入れ子になる
```
- 項目1
  - 項目1-2
- 項目2
  - 項目2-1
  - 項目2-2
```
<details>
<summary>例</summary>

- 項目1
  - 項目1-2
- 項目2
  - 項目2-1
  - 項目2-2
</details>

### 番号付きリスト
`1.`のあとに`スペース`
`1.`の前に`スペース3個以上`を記述すると入れ子になる
```
1. 項目1
   1. 項目1-2
2. 項目2
   1. 2-1
   2. 2-2 
```
<details>
<summary>例</summary>

1. 項目1
   1. 項目1-2
2. 項目2
   1. 2-1
   2. 2-2 
</details>

## 強調
太字
```
**太字になります**
```
<details>
<summary>例</summary>

**太字になります**
</details>

斜体
```
*斜体になります*
```
<details>
<summary>例</summary>

*斜体になります*
</details>

## コード
### インラインコード
```
`$markdown`
```
<details>
<summary>例</summary>

`$markdown`
</details>

### コードブロック
頭の` ``` `の後に言語を指定すると、文字に色が付き見やすくなる 
```
    ``` php
    if (!$isMarkdown) {
        return false
    }
    ```
```
<details>
<summary>例</summary>

``` php
if (!$isMarkdown) {
    return false
}
```
</details>

## 引用
```
> これは引用です。
> これも引用です。
```
<details>
<summary>例</summary>

> これは引用です。
> これも引用です。
</details>

## 水平線
```
---
```
<details>
<summary>例</summary>

---
</details>

## テーブル
```
| ヘッダー1 | ヘッダー2 | ヘッダー3 |
| --------- | --------- | --------- |
| 内容1     | 内容2     | 内容3     |
| 内容a     | 内容b     | 内容c     |
```
<details>
<summary>例</summary>

| ヘッダー1 | ヘッダー2 | ヘッダー3 |
| --------- | --------- | --------- |
| 内容1     | 内容2     | 内容3     |
| 内容a     | 内容b     | 内容c     |
</details>

## リンク
```
[リンクテキスト](URL)
```
<details>
<summary>例</summary>

[リンクテキスト](URL)
</details>

## 画像
```
![代替テキスト](画像URL)
```
<details>
<summary>例</summary>

![代替テキスト](画像URL)
</details>

## チェックリスト
```
- [x] 完了タスク
- [ ] 未完了タスク
```
<details>
<summary>例</summary>

- [x] 完了タスク
- [ ] 未完了タスク
</details>

## 展開
```
<details>
  <summary>クリック</summary>
  ここの内容が展開される
</details>
```
<details>
<summary>例</summary>

<details>
  <summary>展開</summary>
  ここの内容が展開される
</details>
</details>

## note, message
:::note warn
記述は各サービスによって異なります
:::

### Qiita
#### 補足
```
:::note info
マークダウンはHTMLタグも使用できます。
:::
```
<details>
<summary>例</summary>

:::note info
マークダウンはHTMLタグも使用できます。
:::
</details>

#### 注意
```
:::note warning
下記は必ずお読みください
:::
```
<details>
<summary>例</summary>

:::note warn
下記は必ずお読みください
:::
</details>

#### 警告
```
:::note alert
下記の内容は悪用しないでください
:::
```
<details>
<summary>例</summary>

:::note alert
下記の内容は悪用しないでください
:::
</details>

### GitHub
#### 補足
```
> [!NOTE]
> マークダウンはHTMLタグも使用できます。
```

#### 注意
```
> [!WARNING]  
> 下記は必ずお読みください
```

#### 警告
```
> [!WARNING] 
> 下記の内容は悪用しないでください
```
Reactのコーディングミスではまった件

# 概要
Reactのコードを書いていて、最適化しようとしてReact.memoを使ったところ、エラーが出てしまいました。memoの使い方を間違えたのかと四苦八苦して解決した際の現象を記事化しました。

# React.memoとは
> memo を使うことで、props が変更されていない場合にコンポーネントの再レンダーをスキップできます。

[memo - 公式サイト](https://ja.react.dev/reference/react/memo)

変更前のデータをキャッシュしているので、最適化されます。
コードとしては以下となります。
``` react
const MemoizedComponent = memo(SomeComponent, arePropsEqual?)
``` 

※memoの後ろをカッコで囲う必要あり

# エラーコードとメッセージ

``` react
const TaskList = memo({ taskList }: Props) => {
  return (
    <div>
      {taskList.map((task) => (
        <div
          key={task.id}
          style={{
            width: "300px",
            margin: "auto",
            background: "lavender",
          }}
        >
          <p>タイトル: {task.title}</p>
          <p>担当: {task.assignee}</p>
        </div>
      ))}
    </div>
  );
};
```

``` sh 
TS2322: Type '{ taskList: Task[]; }' is not assignable to type 'IntrinsicAttributes & object'.
  Property 'taskList' does not exist on type 'IntrinsicAttributes & object'.
    79 |         リセット
    80 |       </button>
  > 81 |       <TaskList taskList={taskList} />
```

# はまった点
- エラーメッセージからコンポーネント呼び出し元で、エラーが発生しているようなので、Propsの渡し方がミスったのかと思ったのですが、どこにも異常が有る訳でも無く...
- 試しに ``` const TaskList = memo({ taskList }: Props) => { ``` を ``` const TaskList = ({ taskList }: Props) => { ``` とmemoの記載を削除したらエラーが解消される。
- しかし、React.memoを使って最適化しようとしているので、何がおかしいのかと四苦八苦しました。

# エラー原因
- 上記[React.memoとは]にも書きましたがmemoの後ろでコンポーネントはカッコで囲う仕様となっています。
- しかし、カッコで囲い忘れていた為でした。正しいコードは次項[正しいコード]となります。

# 正しいコード

``` react
const TaskList = memo(({ taskList }: Props) => {
  return (
    <div>
      {taskList.map((task) => (
        <div
          key={task.id}
          style={{
            width: "300px",
            margin: "auto",
            background: "lavender",
          }}
        >
          <p>タイトル: {task.title}</p>
          <p>担当: {task.assignee}</p>
        </div>
      ))}
    </div>
  );
});
```

# エラー解析にあたって
- ESLint、Prettierは入れていましたが、細かい所まで追ってみるとヒントは出てきました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235774/b7056d6f-9e08-248f-17eb-1893138a1192.png)

- PROBLEMSタブを確認すると、memoの箇所で以下のエラーメッセージが出ていました。
    - No overload matches this call.
- エラー解析時は、落ち着いて、エラーメッセージは最後まで読んで解決に当るべきだと思いました。
rex0220 計算式プラグイン 年度計算

計算式プラグインで、年度計算を行ってみます。

# 概要

年度開始日が月の途中の年度計算を行います。

- 年度開始日が 3月21日
- 年度判定として、前年度・当年度・翌年度・翌々年度を設定

![2024-02-11_16h05_13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/247f04e7-4577-0f0c-5bef-b41b3b7bc0bf.png)

# 操作例
2024-02-11 に操作

![2024-02-11_16h08_20.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/0d91ea98-3c9b-c349-2c07-5fc185902249.gif)

# プラグイン設定

- 年度： 日付の年から年度開始日前は、-1 する
- 年度判定： 当日の年度を計算してから比較

![2024-02-11_16h11_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/6da08778-0288-7df2-cffa-2ff49b772e5b.png)

```.JS
// 年度 NUMBER
IF(日付,
  DATE_FORMAT(日付,"YYYY")
   - IF(DATE_FORMAT(日付,"MM-DD")>="03-21",0,1)
)

// 年度判定 SINGLE_LINE_TEXT
LET(年度開始月日,"03-21",
  当日年度, DATE_FORMAT("TODAY","YYYY")
     - IF(DATE_FORMAT("TODAY","MM-DD")>=年度開始月日,0,1),
  差分, 年度-当日年度,
  IFS(
    年度="","日付未選択",
    差分<-1, "前年度より前",
    差分=-1,"前年度",
    差分=0,"当年度",
    差分=1,"翌年度",
    差分=2,"翌々年度",
    "＋3年度以降"
  )
)

```
YAPC::Hiroshima 2024と35歳定年説

こんにちは。Kaneyasuです。

2月10日、YAPC::Hiroshima 2024がありました。

https://yapcjapan.org/2024hiroshima/

今回は生まれて初めてボランティアスタッフとして参加させていただきました。
いつも各地の勉強会にお邪魔して無料で喋らせていただいているので何かしたいなと思いまして。

まずトータルの感想としては、広島のITイベントでこんなに人集まるんだとビビりました。
平和公園の隣の建物でITイベントって実現可能なんですね。
あそこ公的なイベントするところかと思ってました。（地元民なのによく知らない。）
凄いものを見させていただきました。

# 当日ボランティアの内容

私は、当日ボランティアでこんなことやらせていただきました。

- 会場準備
- 受付ヘルプ
- 質問者へのマイクパス係
- セッションの合間の掃除
- お片付け

受付業務をやったのは初めてでした。
はるか昔にレジ打ちのバイトしてた記憶が蘇りちょっと楽しかったです。
受付はQRコードを読む形式だったんですが、アレ結構読み取りエラー出ますね💦
コンビニみたいな専用の機械だったらまた違うんでしょうが、私の型落ちスマホだと25％ぐらいの確率でエラー出てちょいちょい焦りました。
今日からはより優しい気持ちでレジ待ちをしようと思います。

楽しくもあり疲れました・・・。
言うても当日だけのボランティアなんですよね。
コアスタッフの皆様本当にお疲れ様でした。

# 視聴したセッション

https://fortee.jp/yapc-hiroshima-2024/proposal/55b3bec2-a04d-47a7-a4a1-efebf68acd39

https://fortee.jp/yapc-hiroshima-2024/proposal/698f07ca-55e8-401f-ad3b-40a811662127

作業をしていてあまり見れなかったのですが、この2つはしっかり視聴させていただきました。
前者は同年代？のエンジニアとして、後者は今の若い人本当に凄いなという目線でした。
学生の方があえてPerlに挑戦するという温故知新？の心意気と、登壇までやってのける行動力に危機感すら覚えます💦

なんて思ったんですけど、当日の雑談の中で最近の企業、若者に求めるものが多すぎみたいな話を聞いて、よくないなと思いました。
育てるのを完全に放棄するような余裕のない社会にしてはいけないなぁと思った次第です。

# 35歳定年説

本当にゆっくり聞けたのは夕方のトークセッションで、35歳定年説の話題が一番共感を持ちました。
35歳定年説、ありましたねそういうの。
私35歳を超えちゃいましたけど、全然元気にエンジニアやってるので当てはまらなくてよかったなと思います。

トークセッションにおいては、35歳定年説はその方が都合がいい人達が流した嘘？という話がありました。
その節はありえたと私も思います。
でもまあ、私の実感としては35歳って子育てが忙しかったり、親が弱ってきたりして人生で大きな変化が起きる時期なので、その時期に自分の時間がなくなるのを機にコード書かなくなってしまうのはあり得る話で、そう言う意味では35歳定年説はまんざら嘘ではなかったのかなと思います。
実際私も35歳頃はかなり悩んでいた思い出はあります。
その後、子供が少し大きくなった頃また情熱が湧き上がり今にいたります。

35歳ごろまでエンジニアするといろんな景色が見えてきます。
SIerならシステム開発や仕事の全体像が見えている時期かなと思います。
若い頃はこれやって意味あるのかな？と思うことも意味が見出せるようになるので、勉強のモチベーションも作りやすくなります（個人の感想です）。
なので、仮に35歳ぐらいになってちょっとしんどいなって思っても、完全にやめちゃうんじゃなくて、いつか戻るかもという気持ちは持っていてもいいんじゃないかなと思います。

自分自身は、今後もこれからの人のためにも年取ってもエンジニアできるんだぞと示し続けたいなあーと思います。
トークセッションに出てたような一つのロールモデルであり続けるってやつですね。

以上、いろんな世代から刺激をいただいたYAPC::Hiroshima 2024でした。
ANSI エスケープシーケンス

忘れては調べてを繰り返しているので、
ANSIエスケープシーケンスについてまとめる。

## 参考
まとめるまでもなく、以下にまとまっていた。
https://gist.github.com/fnky/458719343aabd01cfb17a3a4f7296797