OmniAICreator/Qiita-1.07M huggingface dataset:
paizaラーニング問題集「マップの判定・縦横」を解き、改善した話

▼問題文のURL

https://paiza.jp/works/mondai/a_rank_level_up_problems/a_rank_snake_map_boss

▼改善の概要

[改善前]
マップの最初の行,最後の行,それ以外の行の3つに分け、さらに左端,右端,それ以外の3つに分けてコードを書きました。場合分け9つ(3×3)、コードは43行でした。

[改善後]
場合分け9つは冗長であったため、改善を行いました。結果、場合分けは上下左右の4つ、コードは23行で書くことができました。

1. 左の場合は、任意のマップの座標(j,i)において、iが0またはi-1が#のとき、題意の条件を満たすと考えます。右の場合は、iがW-1またはi+1が#のとき、題意の条件を満たすと考えます。上下も同様に考えます。

2. 上下左右すべて題意の条件を満たした場合は、マップの座標(j,i)を出力します。

▼改善前の私のコード

```py
H,W = map(int,input().split())

A = [list(input()) for i in range(H)]

for j in range(H):
    for i in range(W):
        # マップの最初の行
        if j == 0:
            # 左端
            if i == 0:
                if A[j+1][i] == "#" and A[j][i+1] == "#":
                    print(j,i)
            # 右端
            elif i == W-1:
                # 省略
            # それ以外
            else:
                # 省略      
        # 最後の行
        elif j == H-1:
                # 省略
        # それ以外の行
        else:
                # 省略
```
特定のフォルダ下にある全ての動画ファイル再起的に探索し再生時間を計測する


## 特定のフォルダ下にある全ての動画ファイル再起的に探索し再生時間を計測する

タイトルの通り、そう再生時間を示すことができるやつ。ffmpegが必要。

```python:main.py

import os
import subprocess
from tqdm import tqdm

def get_video_duration_ffprobe(video_path):
    """FFprobeを使用して動画の再生時間を取得（秒単位）"""
    try:
        result = subprocess.run(
            ["ffprobe", "-v", "error", "-show_entries",
             "format=duration", "-of",
             "default=noprint_wrappers=1:nokey=1", video_path],
            stdout=subprocess.PIPE,
            stderr=subprocess.PIPE,
            text=True,
            encoding='utf-8'
        )
        if result.returncode != 0:
            # コマンドが失敗した場合
            print(f"エラーが発生しました: {video_path} - {result.stderr.strip()}")
            return 0
        duration_str = result.stdout.strip()
        try:
            duration = float(duration_str)
        except ValueError:
            print(f"エラーが発生しました: {video_path} - 再生時間の取得に失敗しました")
            return 0
        return duration
    except Exception as e:
        print(f"例外が発生しました: {video_path} - {e}")
        return 0

def get_total_duration(directory):
    total_duration = 0  # 再生時間の合計を秒で保持
    video_extensions = ('.mp4', '.avi', '.mov', '.mkv', '.flv', '.ts')  # 対象とする動画ファイルの拡張子

    # フォルダ内のすべてのファイルを再帰的に探索
    video_files = []
    for root, dirs, files in os.walk(directory):
        for file in files:
            if file.lower().startswith('h_') and file.lower().endswith(video_extensions):
                video_files.append(os.path.join(root, file))

    # tqdmを使用してプログレスバーを表示
    for video_path in tqdm(video_files, desc="処理進行中", unit="ファイル"):
        total_duration += get_video_duration_ffprobe(video_path)

    return total_duration

# 使用例
directory_path = r"your_file_path"  # 対象のディレクトリパスを指定
total_duration_seconds = get_total_duration(directory_path)

# 時間、分、秒に変換
hours = int(total_duration_seconds // 3600)
minutes = int((total_duration_seconds % 3600) // 60)
seconds = int(total_duration_seconds % 60)


print(f"\n合計再生時間: {hours}時間{minutes}分{seconds}秒")


```
Macユーザー必見！SDカードの復活からデータ復旧までの完全ガイド

SDカードは、デジタルデバイスの欠かせない部品であり、重要なデータや思い出の詰まったファイルを保存する場所として広く利用されています。しかし、時にはSDカードが故障したり、データが消失したりすることがあります。幸いには、Macは特別なデータ復元手段を持っています。そのために、Macユーザーにとって、SDカードのトラブルが発生しても、MACユーザーしか使えない手段でSDカードのデータを復元できます。この記事では、Macユーザーが失われたSDデータを復活させる手順を詳しく解説します。

## SDカードの一般的な故障原因
SDカードが故障する主な原因は次のとおりです。物理的な損傷やファイルシステムの問題など、さまざまな要因が考えられます。
- ファイルシステムの破損
- ファイルの削除またはフォーマット
- 物理的な損傷（曲がり、折れ目、水没など）
しかし、MACユーザーであれば、ターミナル・タイムマシン・Disk Utilityなどの方法使えば、物理的な損傷でなければ、SDカードのデータを復元することも可能になります。以下は具体的な復元方法を紹介します。

## ターミナルを使ったSDカードの復活方法
ターミナルを使う方法は、一般的な方法と比べてやや高度な技術が必要ですが、特にファイルシステムの問題やカードの認識トラブルに効果的です。
- **ターミナルを開く**
 Applicationsフォルダからターミナルを開きます。これにより、コマンドラインインターフェースが表示されます。
<img src="https://ice.frostsky.com/2024/11/12/2def1b168d97a456cb93f70c1da9e5c4.png" alt="2def1b168d97a456cb93f70c1da9e5c4.png" border="0">

- **SDカードを特定する**
コマンドラインで以下のコマンドを入力して、SDカードを特定します。このコマンドにより、接続されているすべてのディスクとボリュームの一覧が表示されます。SDカードのデバイス名を見つけます。通常、デバイス名は「diskN」（Nは数字）の形式で表示されます。例えば、「disk2」のような名前です。
`diskutil list`

- **SDカードのアンマウント**
次に、以下のコマンドを入力してSDカードをアンマウントします。ここで、[SD_CARD]は実際のSDカードのデバイス名に置き換えます。
`1.bashCopy code`
`2.diskutil unmountDisk /dev/[SD_CARD]`
たとえば、SDカードのデバイス名が「disk2」であれば、次のように入力します。
`1.bashCopy code`
`2.diskutil unmountDisk /dev/disk2`
- **SDカードの修復:**
SDカードをアンマウントしたら、以下のコマンドを入力してSDカードを修復します。
`1.bashCopy code`
`2.sudo fsck_exfat -y /dev/[SD_CARD]`
このコマンドは、ExFATファイルシステムのSDカードを修復する場合に使用されます。もしSDカードが別のファイルシステム（例: FAT32やNTFS）を使用している場合は、該当するコマンドを使います。
- **修復の結果を確認:**
修復プロセスが完了したら、再度SDカードをマウントし、ファイルシステムの状態を確認します。以下のコマンドを入力して、SDカードをマウントします。
`1.bashCopy code`
`2.diskutil mount /dev/[SD_CARD]`

## Time Machineを使ったSDカードのデータの復活
Time Machineは、Macユーザーが簡単にバックアップを作成し、データを復元するための便利なツールです。ここでは、Time Machineを使用してSDカードのデータを復元する手順を詳しく説明します。
- 1.Time Machineを起動
Time Machineアイコンをクリックし、「Enter Time Machine」を選択します。
<img src="https://ice.frostsky.com/2024/11/12/667b92c5c20e327244832b1d1158096e.png" alt="667b92c5c20e327244832b1d1158096e.png" border="0">

- 2.復元したいバックアップの選択
Time Machine内で、復元したいバックアップの日付を選択します。過去のバックアップ状態が表示され、時間を遡ってファイルを選択することができます。
<img src="https://ice.frostsky.com/2024/11/12/146a0158011f12e247dac3ba50338f07.png" alt="146a0158011f12e247dac3ba50338f07.png" border="0">

- 3.データの復元
復元したいファイルやフォルダを選択し、"続ける"ボタンをクリックします。Time Machineは選択したファイルを元の場所に復元します。もし、元の場所にファイルが存在している場合は、上書きされますので注意してください。

- 4.復元が完了したか確認
データの復元が完了したら、復元したファイルが正常に動作するか確認します。必要に応じて、他のファイルやデータも復元してください。

## まとめ
この完全ガイドを参考にして、Macユーザーの皆さんが失われたデータを復活させ、SDカードのトラブルに効果的に対処できるようになることを願っています。
Tableauの費用対効果の説明のヒント　～説明編～

データ分析の費用対効果の説明は、特にユーザー会などでよく議論の的となり、苦労する点です。この記事では、Tableauを利用したデータ分析における費用対効果の説明方法について、自分なりに整理した考えをまとめます。やや当たり前の話も含みますが、これからデータ分析の導入効果を上手く伝えたい方のヒントになればと思います。

## 費用対効果の説明における基本的な考え方

まず、費用対効果を説明する際には「効果」の部分も**定量的に金額ベース**で表すことが重要です。しかし、データ分析の効果はインフラ投資のようにその影響をすぐには実感できない場合も多く、単純な金額換算が難しいこともあります。そのため、費用対効果の説明には以下の3つのアプローチが有効です。

## 方法1：費用の削減効果

### 説明のポイント
Tableauの導入によって**作業効率が向上**し、従来の業務にかかっていた人件費や時間を削減できる効果です。この方法は**定量化しやすい**ため、比較的説得力がありますが、効果が小さく見えがちです。

### 具体例と説明方法
1件1件の効率化は少額でも、**頻度が高い業務**であれば大きなインパクトを生み出します。例えば、営業データの分析にかかっていた週数時間の作業が、Tableauにより数分で完了するようになれば、その分の人件費削減を効果として挙げられます。各部門にアンケートを行い、**業務内容ごとの削減効果**を記録しておくことで、数値として示しやすくなるでしょう。

### 注意点
単にコスト削減を狙うだけでなく、**どのように効率化されたか**を具体的に説明することで、導入効果の信頼性が高まります。例えば、経理部門の月次報告作成の自動化による作業削減など、事例をもとに効果を具体的に示すのが良いです。

## 方法2：売上機会の創出効果

### 説明のポイント
売上向上に寄与する効果は、マーケティングや営業活動の分析を通じて**新たな売上機会を創出**することです。この方法は特にマーケティング部門での活用が多く、営業活動での機会損失の把握や**勝率向上**、**単価向上**などで効果を算出しやすいです。

### 具体例と説明方法
例えば、過去の顧客データをTableauで分析することで、購買頻度や顧客単価が低下しているセグメントを特定し、ピンポイントで施策を打つことができます。この結果、ターゲティングの精度が向上し、売上がどの程度上がったかを算出することが可能です。**ROI（投資収益率）**として見せることも効果的です。

### 注意点
この手法は**全ての部門で活用できるわけではありません**。売上機会創出を数値で示すのが難しい部門も多いため、効果の説明が難しい場合は他のアプローチも組み合わせると良いでしょう。

## 方法3：新しい分析可能性の創出

### 説明のポイント
Tableau導入の効果として、**新たな視点でのデータ分析が可能になること**を挙げます。例えば、Tableauによって初めて経営判断に必要なデータが可視化されたり、人的資本や顧客満足度といった指標が一元的に確認できるようになる効果です。これにより、**将来的な投資やリスク対策**が可能になります。

### 具体例と説明方法
経営層向けに重要な指標が可視化され、判断スピードが向上した、人的資本をモニタリングするための指標が簡単に参照できるようになった、などが例として挙げられます。この効果は**直接的な金額換算が難しい**ものの、**将来的な意思決定の質を向上させる**重要な投資であると説明できます。

### 注意点
この方法は即時的な金銭効果ではなく、**長期的な投資価値**として説明するため、具体的な将来のメリットが想像できる事例を用意しておくと良いでしょう。

## まとめ

Tableauの費用対効果を説明するには、上記のようなコスト削減、売上機会の創出、新たな分析可能性という3つのアプローチが有効です。特にデータ分析の成果を定量化し、金額ベースで表すと説得力が増します。これらの視点を用い、Tableauがどのように業務効率化や収益改善に貢献するかを具体的に示すことで、関係者にも効果の実感を持ってもらいやすくなるでしょう。
Javascript オブジェクトの要素結合

学習備忘録
```aa.js
const Asan = {
  name: 'hoge',
  age: 25,
  weight: 60
};

const fullDate = [Asan['name'], Asan['age'], Asan['weight']];
// これだと['hoge', 25, 60]という配列が代入される

const fullDate = [Asan['name'], Asan['age'], Asan['weight']].join();
// これだと'hoge,25,60'という文字列が代入される。
// なおjoin()はﾃﾞﾌｫﾙﾄでカンマ区切りになる。join(',')と同じ意味。
UnrealEngineのRuntimeでStaticMeshのScreenSizeを変更する

UnrealEngineのRuntimeでStaticMeshのScreenSizeを動的に変更することができたので調査した内容をメモしておきます。

# 環境

UE5.3.2

# RuntimeでScreenSizeを変えたい理由

DatasmithRuntimeを利用してRuntimeで3Dデータの表示を行っているのですが、Twinmotionのモデルを読み込むと木や人のモデルのLODがすぐに切り替わってしまって荒いモデルが見えてしまうので、動的にScreenSizeを変更する方法を調査していました。

以下の木のモデルだとLOD3のScreenSizeが0.421875という大きい値になっておりすぐにこのモデルが見えてしまいます。
![2024-11-07_13h40_58 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16768/2821f4eb-119c-bc39-e4e0-9c2740aa39c6.png)

# ScreenSizeを変える方法

以下のサンプルコードのような形で変更できるみたいです。

```cpp
void UMyUtils::SetLOD(UStaticMesh* Mesh)
{
	int32 NumLODs = Mesh->GetNumLODs();
	
	if (NumLODs >= 4) 
	{
#if WITH_EDITORONLY_DATA
        // StaicMeshEidotr用の変更
		Mesh->bAutoComputeLODScreenSize = false;
#endif

#if WITH_EDITOR
        // StaticMeshEditor用の変更
		Mesh->GetSourceModel(0).ScreenSize = 0.5;
		Mesh->GetSourceModel(1).ScreenSize = 0.1;
		Mesh->GetSourceModel(2).ScreenSize = 0.05;
		Mesh->GetSourceModel(3).ScreenSize = 0.002;
#endif
		Mesh->GetRenderData()->ScreenSize[0] = 0.5;
		Mesh->GetRenderData()->ScreenSize[1] = 0.1;
		Mesh->GetRenderData()->ScreenSize[2] = 0.05;
		Mesh->GetRenderData()->ScreenSize[3] = 0.002;

		// 変更したStaticMeshに対してStaticMeshComponentへの描画の反映
		{
			FStaticMeshComponentRecreateRenderStateContext ReregisterContext(Mesh, false);
			Mesh->Modify();
		}
  }
```

StaticMeshEditorの変更だけだとUI上の値しか変更されないようで実際の動作には影響を及ぼさないみたいです。
StaticMeshのRenderDataに対してScreenSizeを変更して、StaticMeshComponentに描画の反映をする必要があるみたいです。

# 参照したコード

StaticMeshEditorのScreenSizeを変更した際の処理を参照しました。

https://github.com/EpicGames/UnrealEngine/blob/5.3/Engine/Source/Editor/StaticMeshEditor/Private/StaticMeshEditorTools.cpp#L4151-L4209
dockerコンテナが突然立ち上がらなくなった

普段WSL2上でDocker Desktopを実行しているのですがある日
いつものようにdockerコンテナを立ち上げようとしたところ、突然の下記エラー
```
Status 400: failed to create task for container: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: error during container init: error mounting \"/run/desktop/mnt/host/wsl/docker-desktop-bind-mounts/Ubuntu-20.04/797229c15083f74ce99ba51a1c9a02f9daa82bd038b3763bb45445317f708510\" to rootfs at \"/docker-entrypoint-initdb.d/init.sql\": mount /run/desktop/mnt/host/wsl/docker-desktop-bind-mounts/Ubuntu-20.04/797229c15083f74ce99ba51a1c9a02f9daa82bd038b3763bb45445317f708510:/docker-entrypoint-initdb.d/init.sql (via /proc/self/fd/6), flags: 0x5000: not a directory: unknown: Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type
```

原因ですがdocker desktopの設定のResourcesの「Enables integration with additional distros:」のチェックが外れていました。あとはUbuntu-20.04にもチェックを入れてapply&Restartで問題なく立ち上がりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2841649/e9ffb348-855b-a009-efac-8fb69ee5d08b.png)
install MariaDB on RockyLinux 9.0

# install

```
dnf install mariadb-server.x86_64
```

## config

文字コードをUTF-8にする

```/etc/my.cnf.d/mariadb-server.cnf
[server]
character-set-server  = utf8mb4
collation-server      = utf8mb4_bin
```

# start

```
systemctl restart mariadb
```

# inital setting

```
mysql_secure_installation
```

# check

```
mariadb

> status
```

```output
MariaDB [(none)]> status
--------------
mariadb  Ver 15.1 Distrib 10.5.22-MariaDB, for Linux (x86_64) using  EditLine wrapper

Connection id:          13
Current database:
Current user:           root@localhost
SSL:                    Not in use
Current pager:          stdout
Using outfile:          ''
Using delimiter:        ;
Server:                 MariaDB
Server version:         10.5.22-MariaDB MariaDB Server
Protocol version:       10
Connection:             Localhost via UNIX socket
Server characterset:    utf8mb4
Db     characterset:    utf8mb4
Client characterset:    utf8
Conn.  characterset:    utf8
UNIX socket:            /var/lib/mysql/mysql.sock
Uptime:                 6 min 4 sec

Threads: 1  Questions: 24  Slow queries: 0  Opens: 20  Open tables: 13  Queries per second avg: 0.065
--------------
```

# login config

```~/.my.cnf
[client_other]
host='<your-db-host>'
port='<your-db-port>'
socket='<your-db-socket>'
database='<your-db-name>'
user='<your-db-user>'
password='<your-db-password>'
```

ユーザ名やDB名はシングルクォートで括らなくても大丈夫だったが、passwordだけはシングルクォートで括るのが無難と思われる

## login to DB

```
mariadb --defaults-group-suffix=_other
```

参考

https://mariadb.com/kb/en/configuring-mariadb-with-option-files/#custom-option-group-suffixes

https://dev.mysql.com/doc/refman/8.0/ja/mysql-command-options.html#option_mysql_defaults-group-suffix

https://stackoverflow.com/questions/49109592/where-store-password-login-path-in-mariadb-equivalent-for-mysql-config-editor
PHP におけるデータベース接続作業前のif文による安全性チェック

# 背景
仕事でPHPを使った業務システムを開発している。
フレームワークを用いたデータベース操作のコード。
# code
```php:API use CodeIgniter3
if (!empty($has_recode_id) && !empty($has_recode_id->recode_id)) {
	$this->db->trans_rollback();
	return ['status' => false, 'error_code' => Error_list::_CODE_E_FAILURE];
// 最初のチェック：$has_recode_id が null でないことを確認. クエリ結果が存在するかを確認.
// 2番目のチェック：$has_recode_id->recode_id が存在し、null でないことを確認. 値が存在するかを確認.
```
# なぜ 二つのif文でチェックするのか？
- 最初の !empty() で、クエリ結果自体が存在するかを確認
- 2番目の !empty() で、実際の recode_id の値が存在するかを確認
- このような二重チェックは、「Null安全性」のパターン
- データベースクエリの結果を安全に処理するために重要
- 最初のチェックを省略すると、存在しないオブジェクトのプロパティにアクセスしようとして、PHPエラー（Undefined property）が発生する可能性がある
HP Wolf security Update Serviceがアンインストールできない


ただいまWindows11にバージョンアップ中で、

**hp security update service は使用中です 削除する場合はまず他のアプリケーションをアンインストールしてください。hp assess annd respond**

というアラートが出てアンインストールできません。

対処法

>https://support.microsoft.com/ja-jp/windows/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%BE%E3%81%9F%E3%81%AF%E5%89%8A%E9%99%A4%E3%81%8C%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF%E3%81%95%E3%82%8C%E3%82%8B%E5%95%8F%E9%A1%8C%E3%82%92%E8%A7%A3%E6%B1%BA%E3%81%99%E3%82%8B-cca7d1b6-65a9-3d98-426b-e9f927e1eb4d

![スクリーンショット 2024-11-12 110859.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960935/d8c67687-0d3e-bc7c-f070-bb19f1631c5a.png)

トラブルシューティングツールをダウンロードします。
![スクリーンショット 2024-11-12 111518.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960935/bab4d5f7-533b-83bc-f079-1c66c5640153.png)

「次へ」
![スクリーンショット 2024-11-12 111054.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960935/92f48f09-b264-9f64-cb00-2f9effc95b2e.png)

![スクリーンショット 2024-11-12 111102.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960935/915e288e-5dbb-9aa7-8023-f8a59ffaa891.png)
今回はアンインストールの問題なので「アンインストール」を選択
![スクリーンショット 2024-11-12 111110.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960935/428ccb5b-3edc-bae2-4fb2-3a45aec0677c.png)
そのまま放置
![スクリーンショット 2024-11-12 111117.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960935/7560c4bf-ee86-c5c0-d27e-d20ac885ebce.png)
(画像はHP Wolf securityですが)HP Wolf security Update serviceを選択
![スクリーンショット 2024-11-12 111130.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960935/f60ab7f6-9a35-e2ec-2ef3-96ae9dafdbbe.png)
→アンインストールを試行するを選択
![スクリーンショット 2024-11-12 111137.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960935/04a7922a-07f0-8a5c-8dc8-9608681e64b0.png)
![スクリーンショット 2024-11-12 110337.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960935/02770804-566c-a3a9-1ab1-0ba2ca925e0f.png)
これで解決
[Unity][RoboCup] CrossView開発日記 #1

# CrossViewとは
こちらの記事をご覧ください。

https://qiita.com/suzuki_nene/items/cbdb701622a738f1b2ee

# はじめに
Unityは、2016年頃に少し触ったことがあったのですが、本格的に開発しようと思ったのは今回が初めてだったので、まずは「3Dモデルとアニメーション操作」から実装を学びました。

# 余談
ちなみに、2016年頃に～というのは、当時、ネットワークカメラで撮影した映像を人物検出のエンジンに食わせて、画面の中に人が何人いるか等を検出するシステムのお仕事に関わっていました。

その時、テスト用の映像として「人が歩き回る映像をUnityで作成しませんか？」という提案をお客さんにしたことがありました。

以下は、その時のサンプル動画です。

![Test01Rec03_Trim.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/843818/94debbe9-8ffb-9cbf-1ebb-9b02965fc6dd.gif)

簡単なゲート的なものを人が通過するような場面を想定して作ってみました。
Unity的には、NavMeshで自動で歩かせているだけの単純な実装です。

# Football_1
最初の実装は、
- サッカーフィールドのテクスチャを用意し、Sceneを構築する。
- Unity Asset Storeから、FREEの3Dモデルをダウンロードする。
- モデルデータは、忘れずに"Humanoid"型に設定しておく。
    - Avatorデータも自動生成するように設定しておく。
- NavMeshで、フィールド上を周回するように実装する。
- 宇宙飛行士の3Dモデルの三人称視点でカメラ制御させる。

こんな感じ。
![Football_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/843818/c64eac7e-2160-a649-e7b0-6c6470f06cfd.png)

次に、
- Adobe Mixamoから、サッカー系のAnimationデータをいくつかダウンロードする。
    - Animationデータも、忘れずに"Humanoid"型に設定しておく。
    - Trigger系として使用するものは、LoopTime=OFFにする。
- AnimatorControllerを新規作成し、用意した変数の値によって状態遷移させる。
    - 初期状態は、Idle(軽く揺れながら立った状態のアニメーション)とする。
    - Bool型変数(Dash,Back,Catching)で、走ったり、後ずさりしたりと遷移させる。
    - Trigger型変数(Pass,Tackle,Catch,etc)で、1-Shotアニメーションを発動させる。
- 各3Dモデルに、作成したAnimatorControllerを適用する。
    - ApplyRootMotion=OFFにする。

![Football_1_AnimatorController.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/843818/276b3c4c-a576-11c9-e03b-9f15b6bba7b4.png)

さらに、
- AnimatorControllerにて、IK=ONにする。
- OnAnimatorIK()を実装したScriptを、各3Dモデルにアタッチする。
- OnAnimatorIK()では、Animator.SetLookAtWeight()およびSetLookAtPosition()で顔の向きを設定し、常に宇宙飛行士の方を向くようにする。

# 参考サイト
- https://kabaunity.com/animation-person/
- https://xr-hub.com/archives/10203
- https://ekifurulab.com/anystate/#toc10
- https://light11.hatenadiary.com/entry/2019/04/18/003100
- https://qiita.com/moe65/items/b40387f71514de0979df

# WebGL version

https://suzukinene.github.io/FootballWeb/Football_1/

操作方法は次の通り。
- WASDキー、または矢印キーで、宇宙飛行士を操作できます。
- マウスカーソルの移動で、宇宙飛行士の視線を動かせます。
- 次のキー操作でアニメーションを切り替えることができます。（GoalKeeper用の場合）
- Bool系
    - 8：Dash
    - 5：Idle
    - 2：Back
    - 1：Idle(Catching)
- Trigger系
    - 7：Kick
    - 9：Tackle
    - 4：Dive Left
    - 6：Dive Right
    - 0：Catch

※Bool系は、一旦Idleに戻ってから別の状態に遷移させます。
※Trigger系は、Back状態では反応しないようにしています。

以上です。
初心者向け理解しておきたいTableauのよくあるミス

Tableauは直感的な操作で強力なデータ可視化ができるツールですが、初心者にとってはつまずきやすいポイントや、誤解されがちな部分もいくつかあります。私自身もこれらのポイントでつまずいた経験があり、事前に知っておけば対処もしやすいと感じたので、Tableau初心者にとって理解しておくべき「よくあるミス」をまとめました。この記事が、トラブル発生時に原因の特定や解決の手助けになればと思います。

## よくあるミス1：Tableau DesktopとTableau Onlineの違いに注意

### ポイント
Tableauにはデスクトップアプリである**Tableau Desktop**と、ブラウザで操作する**Tableau Online**の2つの使用環境があります。この2つは、UIやボタン配置が異なるため、初心者の方が**操作に戸惑う原因**になることが多いです。

### ミス例
多くのTableau操作解説記事やチュートリアルは、**Tableau Desktop**を前提としているため、オンライン環境（ブラウザ版）で同様の操作をしようとしても「説明通りのボタンが見つからない！」という事態がよく起こります。例えば、ブラウザ版には一部の機能が表示されなかったり、設定項目が異なる位置にあるため、同じように操作できないことがあるのです。

### 対策
操作をする際には、自分が**どの環境で操作しているか**を意識し、チュートリアルや解説記事に記載されている画面と合わない場合は、「もしかして、デスクトップ版前提の操作かも？」と疑ってみると良いでしょう。

## よくあるミス2：フィルタの効果範囲とLOD計算の注意点

### ポイント
Tableauでは、ビジュアライゼーションに**フィルタを適用**して、表示されるデータを絞り込むことができます。しかし、初心者の方にとっては、**フィルタの範囲が意図通りに適用されていない**と感じることがあるかもしれません。特に、Level of Detail（LOD）計算を利用する際には注意が必要です。

### ミス例
Tableauのフィルタ設定は、ビジュアライゼーションの表示内容にのみ影響する場合があり、集計に使用する**LOD計算にはフィルタが適用されない**ことがあるため、意図しない数値が表示されることがあります。例えば、売上の合計や平均を求める際に、フィルタ条件で特定の製品のみを含むつもりが、LOD計算の結果にはそのフィルタが反映されず、計算結果に不整合が生じることがあるのです。

### 対策
LOD計算の詳細な設定方法については別記事で解説するとして、ここでは「フィルタ設定が計算に影響しないこともある」ことを知っておくと良いでしょう。フィルタの効果範囲や、適用されない場面に備え、計算に必要な条件をLOD計算内で設定しておくことが重要です。

## よくあるミス3：結合条件のデフォルト動作に注意

### ポイント
Tableauでは複数のデータソースを**結合**して使用することができますが、その際の**結合条件**については、初心者にとって少し混乱を招きやすい仕様があります。

### ミス例
Tableauで2つのデータソースを結合する際、結合条件に一致しないレコードがある場合、**デフォルトでは一致しないレコードは表示されません**。例えば、1つ目のテーブルに「商品A,100」と「商品B,200」、2つ目のテーブルに「商品A, 日本産」というデータがあった場合、**「商品B」のレコードは表示されなくなります**。

### 対策
結合を行う際には、**どのデータが結合条件に含まれているか**を把握し、結果としてどのレコードが含まれないのかを確認することが大切です。全てのデータを表示したい場合は、結合条件の見直しや、異なる結合方法（左結合や外部結合など）を使用することも検討しましょう。

## よくあるミス4：抽出データの更新忘れ

### ポイント
データ量が多い場合や頻繁にデータの更新が行われる場合、**Tableauのデータソースを「抽出」に設定**することでパフォーマンスを向上させることがあります。しかし、初心者の方にとって、この「抽出データ」が**最新状態でないまま利用される**ことが原因で、意図しない結果を得ることがあるのです。

### ミス例
例えば、最新の売上データに基づいてビジュアライゼーションを作成するつもりが、抽出データが古いために**実際のデータと異なるレポート**が生成されることがあります。抽出データは設定によって定期的に更新される場合もありますが、頻繁な更新が必要な場合には適切に設定しておかないと、分析結果がずれてしまいます。

### 対策
抽出データを使用する場合は、定期的に手動で更新するか、更新のスケジュール設定を確認しましょう。リアルタイム性が求められるデータ分析には、データソースを「Live接続」にしておくことも有効な対策です。

## まとめ
Tableauには初心者にとってつまずきやすいポイントがいくつかありますが、これらをあらかじめ知っておくだけでも、原因不明のトラブルに悩まされることが減るでしょう。本記事で紹介したよくあるミスや対策を参考に、Tableauの弱点を把握し、トラブルシューティングや操作に役立てていただければ幸いです。
【応答なし】タスクマネージャーの「プロセス」タブからタスクの終了ができない時【Windows10】

#### 結論
タスクマネージャーの「詳細」タブから該当のアプリケーションを右クリックし、タスクの終了を選択する。



#### この記事を書くに至った経緯
Excelがフリーズ。マシン再起動（魔法）が不可の状態だったためタスクを殺そうと思ったらいつもの場所から殺せず少々はまったため記録。



#### 気になった点
EXCEL.EXEが二つ起動していた。これが原因？
セールスから社内プロダクト開発部へ異動してよかったの話

# はじめに
私はダイレクト出版にセールスライターとして就職し、3年弱、主にメルマガやセールスページのライティングをしていました。WEBセールスに必要なエディトリアルデザインや動画編集、ランディングページなどの制作をする中で、「形のあるものを作ることが好きだなあ」という思いが強くなり、社内のプロダクト企画開発部への異動を決意しました。

完全初心者ですし、周りからは「急にどうした！？」と不思議がられることもしばしば。ちゃんとやっていけるのか不安もあったのですが、今では日々楽しくお仕事をしています。異動して半年ほど経った今、元セールスとして感じていることを書き出してみました。

# 事業部経験があってよかったと感じること
### ユーザーの気持ち、開発内容の需要がよくわかる
プロダクト企画開発部（以下プロ企）では、セールスやカスタマーサポートの方が使う社内システムと、お客様にコンテンツを提供するためのアプリを主に開発しています。つまり自分も毎日業務で使っていたもの。社員からの要望リストを見て「あ〜それ欲しいよ〜ほんとに分かる！」を感じることができます。共感しながら開発できるので、作業にならず、要件の理解もあんまり困らないかなと感じています。

### 元同僚がみんな現役ユーザー。本音も聞ける
今まで毎日一緒にお仕事していた仲間がユーザーとして意見をくれるので、「要望をあげるほどでもないんだけど、これがあると地味に嬉しいな〜」といった、小さな要望や本音も聞きやすいです。飲みに行った時やランチの会話で、意外と画期的なアイデアをいただいたり。事業部にいなかったら、（人見知りということもあり）ラフな会話にたどり着くまでにもっと時間がかかっていたと思います。繋がりのありがたさと、直接話すことでしか得られない解決スピードの速さ・解像度の高さをすごく感じます。

### 「こうなってたのか〜！」システムの裏側に感動の日々
商品登録、売上計算、メール配信、検索処理…。毎日当たり前のように使っていた機能でも、その裏側がどうなっているかなんて、1ミリも考えたことがありませんでした。でも中を覗いてみると、全ての画面の裏には緻密なコードが存在していたんです...本当に感動しました。感覚的に操作していた画面の「裏側」が見えるのは、シンプルにめちゃくちゃ面白い。点と点が繋がっていく感覚です。

また、ボタンや項目ラベル一つに至るまで、たくさんの案からベストなものを絞り込み、練りに練られた結果なんだということもプロ企のミーティングで初めて知り、さらに感動しました。


### （レビューの精神的苦痛（?）が少ない）
ライティングにも方程式や教科書、古来のデータがありますし、レビューからの学びも多く、基本的には納得ばかりなのですが、どうしても感性に依存する面があると思っていて、、、自分なりに「いいな」と思って生み出した文章の細かい表現にレビューや修正が入ると、なんとも言えない悔しさ・もやもやを感じることも正直ありました。

一方で、コードはどこまでも論理的に話し合えるのがほんとに素晴らしい魅力だと思います。基本、絶対的な正解があるし、書き方の好みはあるにしても、読みやすさや効率性といった明確な根拠があるので納得感が大きい。「なるほど！」「絶対そっちの方がいい！」と白黒はっきりしている感覚を得やすいと思います。

### 社内普及のことを考えやすい
ユーザーだった頃には知らなかったページや機能を発見することもあり、リリースノートはどのように作れば見やすいかな？ちゃんと目を通してもらえるかな？ヘルプページをどのように広めればいいかな？など、普及についても考えるようになりました。...まだまだ模索中ですが、コード勉強中でもこうしたことを考えているのは、ユーザーだった経験が繋がっているのかなと感じています。


# 大変なこと
### 言わずもがな、勉強
元々理系だったのとフロント言語には若干触れていたので、拒否感はなかったのですが、やはり新しいことを一気に学ぶのは大変だな〜と感じます。

### 戦力になりきれない不安
プロモーションを打っていた日々から、急にお勉強タイムに。お給料をいただきながら現場で勉強ができることに感謝しつつも、皆さんの時間を割いてもらっていることや、まだ戦力になりきれていないことへの焦りを感じることもあります。とはいえ、早く戦力になるぞ〜！というモチベーションにも繋がっていますし、ちょっとずつできることが増えてきて、この不安も減ってきているかなと感じます。

### セールス隊がめっちゃ売ってると、ちょっとだけ寂しい
セールスチームが楽しそうにプロモーションの企画をしていたり、大きなイベントを成功させている様子を見ると、「あ〜私もその場に立ち会えたらな」と寂しさを感じることも正直あります。でも、純粋に嬉しい気持ちも大きいですし、もっと売りやすい環境を作りたい！というモチベーションにもつながっています。こうした成果を側で感じられるのは、ありがたいことだなと思います。


以上、セールスライターからエンジニアへ転向して感じていることを書き出してみました。

## ps
私自身、学生時代から、医学部保健学科→アパレル業界→投資部門セールスライター→エンジニアと気の赴くままに方向転換をしてきましたが（赴き過ぎ）、とにかく、どんなキャリアチェンジであっても、異業種の経験はどこかで必ず繋がり、役立つはずだと、私は思います。（そう思いたい）

## pps
異動を快く応援してくれて、新しいことにチャレンジさせてくれる会社の環境にも、とっても感謝しています。
Excel in Pythonを使ってみた②

### ■エクセルをPythonを使って操作してみる

### PythonでExcelを操作するための環境構築方法
Pythonは、公式サイトからインストールして環境構築ができます。
公式サイトからPythonをインストールする場合の環境構築方法は、以下の通りです。

    ⓵Pythonの公式サイトにアクセスする
    ⓶Pythonの最新版パッケージをダウンロードする
    ⓷ダウンロードしたPythonをウィザード（表示される質問に答えながら設定を進める方法）に従って
    インストールする
    ⓸コマンドラインツールからPythonが正常にインストールされているかどうかを確認する

>https://www.python.org/downloads/
上記ダウンロードサイトです。

![スクリーンショット 2024-11-08 165949.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960935/94134267-e785-b6cf-7399-2f7df9e493ea.png)

![スクリーンショット 2024-11-08 170006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960935/9129b796-d7da-ee38-1763-9ad9f2c0f852.png)

流れに任せていけばインストールは完了します。

### ■PythonでExcelを操作してみよう！

PythonでExcelを操作するにはどんな方法がある？
使用できるPythonのライブラリについては１がopenpyxl
openpyxlってどんなツール？


| 具体的にできること | 
|:-|
|ゼロからExcelワークブックの作成|
|既存ワークブックの読み込みや書き込み|
|ワークシートの読み書き|
|ワークシートのコピーや削除|
|書式の変更や罫線を引くこと|
|セルのマージや分割|
|セキュリティやシートの保護|
|画像やグラフ、コメントの挿入|
|ピボットテーブルや印刷の設定|

### ■次にコードをコピーして動かしてみよう

![スクリーンショット 2024-11-08 171925.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960935/f1fd88a3-d42e-b07e-bb2d-203e38b3d52a.png)

```make_example.py
import openpyxl

# 新しいワークブックを作成
wb = openpyxl.Workbook()
ws = wb.active

# A1セルに「Hello」を設定
ws['A1'] = 'Hello'

# ワークブックを保存
wb.save('example.xlsx')
```

上をコピーしてテキストに貼り、拡張子を[py]にして保存してみよう。

### ■pyファイルをダブルクリックしてみて

どうなりました？

１．Excelファイルができた？
![スクリーンショット 2024-11-08 172518.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960935/51f22a10-beca-14af-4ffd-b4773cb1a61f.png)

２．A1セルに「Hello」と記述がある。

![スクリーンショット 2024-11-08 172849.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960935/9010fe55-4b68-b910-cc53-e833566f97bb.png)

上記２点であれば正解です。

### 解説
import openpyxl→でopenpyxlライブラリーをインポートしています。
SQLをきちんと勉強しよう：CASE式の基本編

「SQLをきちんと勉強しよう」の第一弾です。

普段、業務ではRuby on Raisを主に使用しています。
そのため、簡単なデータベース操作はActiveRecordで実現できてしまいます。

でもやっぱりActiveRecordでは表現できない処理をSQLでしたい時もあるので、きちんと生SQLを使いこなせるように勉強していきたいなと感じました。

今回の記事では、CASE式の基本的な使い方をまとめました。

CASE式は、SELECT句やORDER BY句など、さまざまな場所で使用できるため、使いこなせるとSQLの表現の幅が広がります。



## CASE式の基本

CASE式には
- 単純CASE式
- 検索CASE式

の2種類があります。

```sql
-- 単純CASE式
SELECT CASE result
			WHEN '1' THEN '合格'
            WHEN '0' THEN '不合格'
            ELSE 'その他' END AS result_text
       FROM Test;

-- 検索CASE式
SELECT CASE 
	WHEN result = '0' THEN '◯'
	WHEN result = '1' THEN '×'
	ELSE 'その他' END AS result_text
    FROM Test;
```
単純CASE式ではTRUE条件しか判定できません。
一方で検索CASE式ではそれ以外の条件も判定できるので、自由度が高くなります。

### CASE式の評価ルール
CASE式は、真になる条件が見つかった段階で評価を打ち切り、後続は無視されます。
そのため、WHEN句は排他的に記述するのが望ましいです。

例えば以下のように書くと、二つ目のWHEN句は絶対に評価されません。

```sql
SELECT CASE 
	WHEN result IN ('0', '1') THEN 'A'
	WHEN result IN('0') THEN 'B'
	ELSE 'C' END AS result_text
	FROM Test;
```

### 返却するデータ型を統一する
各分岐で返却するデータ型は、整合性を担保するために統一する必要があります。
以下のように、分岐ごとに違う型を返却するのはNGです。

```sql
SELECT CASE 
	WHEN result = '0' THEN '◯'
	WHEN result = '1' THEN 1
	ELSE 'その他' END AS result_text
	FROM Test;
```

### ELSE句は必ず書く
ELSE句を省略すると、`ELSE NULL`と同じ扱いになります。
ELSE句を省略してもエラーにはなりません。
しかし、意図しない挙動を生む可能性があるため、ELSE句は明示する方が良いです。

## WHERE句やORDER BY句でCASE式を使う
CASE式はSELECT句だけでなく、WHERE句やORDER BY句などにも使用できます。
これにより、特定の条件に基づいてフィルタリングやソートを行うことが可能です。

### WHERE句での使用例
次の例では、statusが'active'のときにcustomer_idが特定範囲内にある行のみを取得します。
```sql
SELECT * FROM Customers
WHERE CASE 
        WHEN status = 'active' THEN customer_id BETWEEN 100 AND 200
        ELSE customer_id IS NOT NULL
      END;
```

### ORDER BY句での使用例
ORDER BY句での使用により、特定の条件でソート順を変えられます。例えば、優先的にソートしたい条件を指定できます。

```sql
コードをコピーする
SELECT * FROM Products
ORDER BY CASE 
           WHEN stock_status = 'in_stock' THEN 1
           WHEN stock_status = 'low_stock' THEN 2
           ELSE 3
         END;
```         
在庫がある商品が最優先で並び、その次に在庫が少ない商品、最後に在庫がない商品が表示されるようにソートされます。

## まとめ
今回の記事では、SQLのCASE式の基本的な使い方を紹介しました。

CASE式を活用することで、データの条件分岐をSQL内で直接行えるため、集計や分類といった複雑な処理も1つのクエリで行えるようになります。

次回は応用編として、CASE式を使って、テーブル同士のマッチングやUPDATE内での条件分岐の書き方を紹介しようと思います！
`pandas.Series.unique`は`pandas.Series`ではなく`numpy.ndarray`を返す

# 環境
* Python 3.12.4
* pandas 2.2.3

# 内容


`pandas.Series`オブジェクトから、ソートされた一意な値のlistを取得する関数を書きました。

```python
def get_sorted_unique_values(ser: pandas.Series) -> list[float]:
    ser.unique().sort_values().to_list()
```

実行すると、以下のエラーが発生しました。

```
E       AttributeError: 'numpy.ndarray' object has no attribute 'sort_values'
```

[pandas.Series.unique](https://pandas.pydata.org/docs/reference/api/pandas.Series.unique.html) は`pandas.Sereis`を返すことを期待していましたが、実際は numpy array を返しました。

>The unique values returned as a NumPy array.



`pandas.Series`の世界でコードを書くならば、`pandas.Series.drop_duplicates`を使った方が良いようです。

> Series.drop_duplicates : Return Series with duplicate values removed.
> unique : Top-level unique method for any 1-d array-like object.
> Index.unique : Return Index with unique values from an Index object.

# 参考サイト
https://github.com/pandas-dev/pandas/issues/1923#issuecomment-398217427

もともと`unique`があって、あとからSeriesを返す`drop_duplicated`ができたようです。
cscの作法 その532

# 概要
cscの作法、調べてみた。
練習問題やってみた。

# 練習問題
buttonに画像を使え。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/358c8230-8bcb-ede2-2f8f-356cfac8afa2.png)


# サンプルコード

```

using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;

namespace App
{
	public partial class Form1: Form {
		Button button1;
		public Form1() {
			Text = "button";
			ClientSize = new Size(400, 400);
			button1 = new Button();
			button1.Location = new Point(50, 50);
			button1.Size = new Size(250, 50);
			button1.Click += new EventHandler(button1_Click);
			button1.Image = Image.FromFile("cat8.png");
			this.Controls.Add(button1);
		}
		private void button1_Click(object sender, EventArgs e) {
			Console.WriteLine("ok0");
		}
		[STAThread]
		public static void Main() {
			Application.Run(new Form1());
		}
	}
}





```

以上
macOS Sequoia へ任意のバージョンのPythonをインストールする方法

## この記事でできること
- macOS用パッケージマネージャであるHomebrewのインストール
- pythonを任意のバージョンを指定してインストール
- pythonのバージョン管理パッケージであるpyenvのインストール

## 下準備
まずはじめに、MacOS用パッケージマネージャのHomebrewのインストールを行います。
#### 手順
・ターミナルを開く
・以下のコマンドを入力
~~~ 
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh
~~~
・バージョン確認
~~~
brew -v
~~~
・無事にインストールできている場合は、以下のようにバージョンが出るはず
~~~
-> Homebrew 4.4.5
~~~

・これでHomebrewのインストールが完了


## pythonのインストール
pythonのバージョンを指定してインストールします

### 手順
・インストールしたいバージョンをチェック
・以下のコマンドでインストール
~~~
brew install python@X.X.X
~~~
*ただしX.X.Xにインストールしたいバージョンを入れてください

・バージョンを指定せず、@以降を入れなかった場合最新のバージョンがインストールされます。

・バージョンを確認
~~~
python --version
~~~
*返りがなかった場合以下
~~~
python3 --version
~~~

## バージョン管理ソフトのインストール
異なるバージョンを管理する必要がある場合は管理ソフトをインストールします

### 手順
・pyenvをインストール
~~~
brew install pyenv
~~~
・バージョンを確認
~~~
pyenv -v
~~~
・pyenvを用いて別バージョンをインストール
~~~
pyenv install X.X.X
~~~

・pythonのバージョンをチェンジ
~~~
pyenv global X.X.X
~~~

・pythonのバージョンを確認
~~~
python --version
~~~
もしくは以下
~~~
python3 --version
~~~
・ここでバージョンが変わっていればOK

## バージョンが変わっていない場合
パスが通っていない場合があるのでパスを通します

### 手順
・以下のコマンドでパスを通す(3行ともそれぞれ行ってください)
~~~
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zprofile
~~~
~~~
echo 'export PATH="$PYENV_ROOT/shims:$PATH"' >> ~/.zprofile
~~~
~~~
echo 'eval "$(pyenv init -)"' >> ~/.zprofile
~~~

・ターミナルを再起動
・再起動したターミナルで以下を実行してバージョンを確認
~~~
python --version
~~~
もしくは以下
~~~
python3 --version
~~~

## 最後に
自分で実行した際のメモですので、さらに詳しい内容は別記事を参照してください。
doubleをintにキャストするとちょっと小さくなる

元のデータが整数で、それを割ったり掛けたりする時に計算精度を保つためにdoubleとかfloatにして計算結果を整数に戻すことってよくありますよね？
(私はあります)

で、その時に元の整数よりどうしても1だけ小さくなったりしませんか？

```C#:Sample.cs
int a = 10;
double b = a / 3.0;
double c = b * 3.0;
int d = (int)c;    // => これ、9だったりする (概念だけのテキトーコードだからホントかどうかは知らん)
```

なんでか？
答えは公式ドキュメントの中にあります。

https://learn.microsoft.com/ja-jp/dotnet/csharp/language-reference/builtin-types/numeric-conversions#explicit-numeric-conversions

> `double` または `float` 値を整数型に変換するとき、この値は 0 方向に最も近い整数値に丸められます。 結果的に生成される整数値が変換先の型の範囲外になる場合、結果はオーバーフロー チェック コンテキストによって変わります。 チェック済みコンテキストの場合、OverflowException がスローされます。未チェック コンテキストの場合、結果は変換先の型の不特定な値になります。

はい、 **「0方向に最も近い整数値に丸められます」** と書いてありますね。

なので、主に正の整数だった場合は表題のように「どうしても1小さくなる」という現象になって現れます。

学術系計算とかビット系演算するときはしれっと見落として長い時間首をかしげることになるので注意しましょう。
レコードタイプが原因でアクションが表示されない


+ [ページレイアウト: 連絡先ビューのアクションとしてメールとカレンダーのみがあります](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX000000OVnH)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/7854e280-96cd-664e-1eb3-74d023948d99.png)

:::note
Here's a summary of my case:

I was assisted by a Salesforce advisor.

The missing pieces were the Global Actions, the Record Type, and assigning it to a specific Record Type. It can't be set to Master.

That solved the issue.

私のケースの概要は次のとおりです。

Salesforce アドバイザーからサポートを受けました。

欠けている部分は、グローバルアクション、レコードタイプ、および特定のレコードタイプへの割り当てです。マスターに設定することはできません。

それで問題は解決しました。
:::

# グローバルアクションとレコードタイプ

+ [New Event button disappeared after new record type being created](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007aisMRSAY)

:::note
Global Actions work great until you create a record type for it's target object.  Global Actions & Quick Actions both have to be record type specific. 

Their default state is to referene the -Master- record type, so if you created a new record type, you have to edit your global 'New Event' action and identify which event record type you would like that global action to use (even if you only have one, if its not -Master-, you have to define it in your actions). 

https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000A92A2SAJ

グローバル アクションは、ターゲット オブジェクトのレコード タイプを作成するまではうまく機能します。グローバル アクションとクイック アクションはどちらもレコード タイプ固有である必要があります。

デフォルトの状態では -Master- レコード タイプを参照するため、新しいレコード タイプを作成した場合は、グローバル '新しいイベント' アクションを編集し、そのグローバル アクションで使用するイベント レコード タイプを特定する必要があります (たとえ1 つしかありません。それが -Master- でない場合は、アクションで定義する必要があります)。
:::

+ [作成したレコード タイプにメール ボタンを追加できないようです。](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007iffEu)


# [クイックアクションとレコードタイプ](https://help.salesforce.com/s/articleView?id=sf.actions_and_record_types.htm&type=5)

組織でレコードタイプを使用すると、ユーザーのクイックアクションの可用性に影響を与える可能性があります。

ユーザーが特定のレコードタイプにアクセスできない場合、そのレコードタイプに割り当てられているアクションは使用できません。たとえば、アクションが混在するページレイアウトがあるとします。レコードタイプが割り当てられていないものと、レコードタイプAに割り当てられているものがあります。レコードタイプAにアクセスできないユーザーは、ページにアクセスしたときに割り当てられていないアクションのみを表示します。

**デフォルトのグローバルアクション：特殊なケース**
組織にデフォルトのグローバルアクションがあり、レコードタイプを使用している場合、ユーザーはページレイアウトに割り当てられているすべてのデフォルトアクションを表示できない可能性があります。

デフォルトのグローバルアクションは、ほとんどのプロファイルからアクセスできないマスターレコードタイプに割り当てられます。その結果、レコードタイプが構成されているターゲットオブジェクトに関連付けられているマスターレコードタイプのデフォルトのグローバルアクションは、ほとんどのユーザーが使用できません。この問題を修正するには、これらのオブジェクトに関連付けられているデフォルトのグローバルアクションを編集し、それらを別のレコードタイプに再割り当てします。

たとえば、新しい連絡先のデフォルトのグローバルアクションでは、ターゲットオブジェクトとして連絡先があります。Contactオブジェクトにレコードタイプを設定し、NewContactのデフォルトのグローバルオブジェクトをページレイアウトに追加するとします。そのページレイアウトに基づいてレコードにアクセスするユーザーには、アクションがデフォルトでマスターレコードタイプに割り当てられているため、新しい連絡先アクションは表示されません。新規連絡先のデフォルトのグローバルアクションを編集し、それをマスター以外のレコードタイプに割り当てると、割り当てられたレコードタイプにアクセスできるすべてのユーザーがそのアクションを利用できるようになります。

+ [CampaignのCampaignMemberRecordTypeIdの不思議な挙動](https://qiita.com/Keiji_otsubo/items/9cf1273a6df24cab62f3)
+ [クイックアクションとレコードタイプ2](https://qiita.com/Keiji_otsubo/items/6871c511ac350fe6b72d)
iOSではposition:absolute;を適用した要素がタブバーに重なることがある

```css:position
.parent {
  position: relative;
  width: 100vw;
  height: 100vh;
}

.child {
  position: absolute;
  bottom: 50px;
}
```
のように、親要素を画面いっぱいに広げた状態で子要素にposition: absolute;を指定すると、
iOSで子要素がタブバーに被った、ということがありました。
(Androidではタブバーが画面上側にあるので問題なし)

それにより、
「iOSでは子要素とタブバーが重ならないように表示してほしい」
という指摘を受けたため、その解決方法を記載します。

# 解決方法
<b>position:fixed;を使って、画面幅を基準に要素の位置を決定する。</b>

親要素を画面いっぱいに広げる場合は、子要素にposition: fixed;を指定することで解決しました。

position: fixed;を指定すると、view port(ブラウザの表示領域)を基準に要素の位置を決められるようになります。
このview portにタブバー（ツールバー）は含まれないため、タブバーと被る事なく子要素を表示することができました。

簡単な話ではありましたが、実機での表示も意識した開発が必要ですね。ブラウザの検証機能でモバイル表示を確認できる機能がありますが、それだけではわからないことがたくさんあります。
（特にSafariは実機確認しないとわからないバグが多い笑）

また余談ですが、タブバーのURL部分の左隣にある「あ」から「ツールバーを非表示」を押せば、タブバーを含めたツールバーが非表示になるようです（知らなかった）。
参考：https://rishuntrading.co.jp/blog/programing/iphone_tabbar/
PHPにおける単体テストとシステムテストのベストプラクティスな組み合わせ


PHPプロジェクトにおける単体テスト（UT）とシステムテスト（ST）のベストプラクティスな組み合わせについて解説します。

## PHPUnit+Codeception
- **概要:** 
  - PHPUnitは単体テストに特化したフレームワークであり、Codeceptionは機能テストやシステムテスト、受け入れテストを統合的にサポートします
- **単体テスト（UT）:** 
  - PHPUnitを使用して、クラスやメソッド単位でのテストを実施します
- **システムテスト（ST）:** 
  - Codeceptionを活用し、ユーザーの操作シナリオに基づいたテストを行います
- **利点:** 
  - 両者は互換性が高く、テストの統一管理が容易です

## PHPUnit+Behat
- **概要:** 
  - PHPUnitで単体テストを行い、Behatで受け入れテストやシステムテストを実施する組み合わせです
- **単体テスト（UT）:** 
  - PHPUnitを用いて、各ユニットの動作確認を行います
- **システムテスト（ST）:** 
  - Behatを使用し、Gherkin記法でシナリオを記述し、自然言語ベースでのテストを実施します
- **利点:** 
  - エンドユーザー視点でのテストが可能で、非エンジニアとの協働が容易です

## Pest+Codeception
- **概要:** 
  - Pestのシンプルな構文で単体テストを行い、Codeceptionの柔軟な機能でシステムテストを実施する組み合わせです
- **単体テスト（UT）:** 
  - Pestを使用して、簡潔で可読性の高いテストコードを作成します
- **システムテスト（ST）:** 
  - Codeceptionを活用し、Webアプリケーションのシナリオテストを直感的に行います
- **利点:** 
  - テストコードのメンテナンスが容易で、テストの高速化が期待できます

## PHPSpec+Behat
- **概要:** 
  - PHPSpecとBehatを組み合わせることで、BDD（振る舞い駆動開発）に基づいたテストを実現します
- **単体テスト（UT）:** 
  - PHPSpecを用いて、クラスの振る舞いを仕様通りに実装されているか検証します
- **システムテスト（ST）:** 
  - Behatを使用し、エンドユーザー視点でのシステムテストを実施します
- **利点:** 
  - BDDの流れでテスト設計が可能で、ドキュメントとしての役割も果たします

## 選定基準のポイント:

### 小規模・軽量なプロジェクト
  - [**Pest + Codeception**](#phpunitcodeception)の組み合わせが適しています
### エンドユーザー視点の仕様に基づいた開発
  - [**PHPSpec + Behat**](#phpunitbehat)の組み合わせが効果的です
### 多機能で柔軟なテストが求められる場合
  - [**PHPUnit + Codeception**](#pestcodeception)の組み合わせが推奨されます
### BDDのドキュメントとしての価値を重視
  - [**PHPUnit + Behat**](#phpspecbehat)の組み合わせが適しています
---
- PHPプロジェクトにおいて、単体テスト（UT）とシステムテスト（ST）を最適なフレームワークで組み合わせることは、**UTはコードの正確性を確認し、STはエンドユーザー視点での動作を保証します。** 各フレームワーク（PHPUnit, Codeception, Behat, Pestなど）の特徴を活かした選定により、**テストの効果を最大化し、テストの保守性も向上させることが可能です。**
- テスト設計は、変更への対応力と開発速度の向上にもつながるため、**プロジェクトのニーズに合った組み合わせを意識したテストスイートを構築することが重要です。**
--- 

## 参考

- UT
    - [PHPUnit](https://phpunit.de/index.html)
    - [PHPSpec](https://phpspec.net/en/stable/)
    - [Pest](https://pestphp.com/)
- ST
    - [Codeception](https://codeception.com/)
    - [Behat](https://docs.behat.org/en/latest/)
atcoder記録(2024.11.12)

# キーワード
input, list sum

# 問題
https://atcoder.jp/contests/practice/tasks/practice_1

高橋君はデータの加工が行いたいです。

整数 
a,b,cと、文字列 
s が与えられます。 
a+b+c の計算結果と、文字列 
s を並べて表示しなさい。

制約
1≤a,b,c≤1,000
1≤∣s∣≤100
入力
入力は以下の形式で与えられる。

a
b 
c
s
出力
a+b+c と 
s を空白区切りで 
1 行に出力せよ。

# 回答
```
A = int(input())
B = list(map(int, input().split()))
C = input()

total = A + sum(B)

print(total, C)
```

# 参考
https://qiita.com/jamjamjam/items/e066b8c7bc85487c0785
子どもと一緒に学べる！Markdown AIで作る植物調べページ

# Markdown AIで植物おしえてボードを作ろう！

こんにちは！今回は「Markdown AI」を使って、植物を調べるための簡単なページ「植物おしえてボード」を作成してみました。
実は、私はエンジニアとして働きながら、理科の教員免許も持っています。これにより、理科の授業で使えるようなツールや教材を作成したいという考えに至りました。Markdown AIを活用したページ作成は、子供たちが楽しみながら学べる内容にぴったりだと思い、実際にどのように使えるかを試してみた次第です。

このページは、小学生でもわかりやすく植物の特徴を入力して名前を調べるためのボードです。
Markdownを使ったことがない人でも簡単にページが作れる「Markdown AI」を紹介しつつ、完成したページの使い方や活用方法をご紹介します。

## Markdown AIって何？

「Markdown AI」は、Markdownを使って誰でも簡単にウェブページを作れるAIツールです。文章を書くだけで自動的にスタイリングしてくれるので、デザインの知識がなくても見た目のいいページを作ることができます。

## 「植物おしえてボード」の作り方

今回は以下の要素を使ってページを作成しました。

1. **見出し** - 「植物おしえてボード」として、タイトルをつけました。
2. **説明文** - 「植物を見つけて名前を調べてみよう！」というわかりやすいキャッチコピーを追加。
3. **入力欄** - 子供でも使いやすいように「植物の特徴を入力してください」と指示。
4. **ボタン** - 「同定する」ボタンで、入力した特徴に基づいて植物を調べられるようにしました。

![スクリーンショット 2024-11-12 8.51.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524128/0d3e9d19-91df-691b-1919-7dd41107c96b.png)

[植物おしえてボード](https://mdown.ai/content/6c9c12d9-7ba0-4027-8eb5-295d4f7b39a1)

## Markdown AIでの作成手順

### ステップ1：タイトルと説明文を作成

まず、見出し（`#`）を使って「植物おしえてボード」というタイトルをつけます。その下に簡単な説明文を追加しました。

```markdown
### 植物おしえてボード
植物を見つけて名前を調べてみよう！
```

### ステップ2：入力欄とボタンを作成
次に、Markdownで入力欄やボタンを追加しました。
Markdown AIではこのようなシンプルなコードで、綺麗に見える入力欄やボタンが自動で生成されます。

```markdown
#### 特徴を入力する

**特徴の例**

- 葉のつき方: 対生、互生、輪生
- 花の色: 白、黄色、ピンク
- 葉脈の種類: 網状脈、平行脈
- 樹皮の質感: 滑らか、ざらざら
```

### ステップ3：AIの用意
create modelのページで回答用のAIを作成します。
今回はgpt-4を使用し、プロンプトは次の内容にしました。

:::note info
提供された植物の特徴をもとに植物の同定を行ってほしい。回答は同定された植物の名前、特徴の順でしてほしい。
:::

**参考**

https://qiita.com/mdown_ai_jpn/items/d3e281565c876a0bd64f#%E5%AE%9F%E9%9A%9B%E3%81%AB%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%88%E3%81%86ai%E5%88%B6%E4%BD%9C%E6%89%8B%E9%A0%86

### ステップ4：AIの導入
insertボタンを押してAIを使用するためのコードを挿入します。

 **参考**

https://qiita.com/mdown_ai_jpn/items/d3e281565c876a0bd64f#%E5%AE%9F%E9%9A%9B%E3%81%AB%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%88%E3%81%86ai%E5%AE%9F%E8%A3%85%E6%89%8B%E9%A0%86

### ステップ5：確認して公開！
作成が完了したらプレビュー機能で見た目を確認し、公開するだけです！Markdown AIが自動的にスタイリングしてくれるので、見た目を気にする必要はありません。

# 子供や初心者にもオススメ
この「植物おしえてボード」は、学校の自由研究にもピッタリです。
授業で学んだ植物の特徴を使って同定できるようにすると、より面白いかもしれません。
実際に見つけた植物の特徴を入力して、名前や種類を調べる楽しさを体験できます。
また、Markdown AIを使うことで、デザインやコーディングの知識がなくても簡単にこのようなページが作成できるので、ぜひ試してみてください！

# 最後に
Markdown AIのおかげで、初心者でも見た目の良いウェブページが簡単に作れるようになりました。
今後はこのページの特徴の入力方法をボタンでできるようにすると利便性が増しそうなので、そのような改良を加えていきたいと考えています。
みなさんもMarkdown AIを使って、自分だけのウェブページを作ってみてください！

https://mdown.ai/
コマンドクエリ分離に関するメモ

## 概要

この記事はコマンドクエリ分離(以下CQS)に関する[Mark Seemann氏のブログポスト](https://blog.ploeh.dk/2014/08/11/cqs-versus-server-generated-ids/)と[脳におさまるコードの書き方](https://www.amazon.co.jp/%E8%84%B3%E3%81%AB%E5%8F%8E%E3%81%BE%E3%82%8B%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E6%9B%B8%E3%81%8D%E6%96%B9-%E2%80%95%E8%A4%87%E9%9B%91%E3%81%95%E3%82%92%E9%81%BF%E3%81%91%E6%8C%81%E7%B6%9A%E5%8F%AF%E8%83%BD%E3%81%AB%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AE%E7%B5%8C%E9%A8%93%E5%89%87%E3%81%A8%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF-Mark-Seemann/dp/4814400799/ref=sr_1_1?crid=UANIARW8JMI2&dib=eyJ2IjoiMSJ9.ebORzbz9JOCXyEsNfU4mW0pulcQQpVbC9WutiqwGtCrCxpthoMKTSt4ktfAuGOJ4JeooR-q2-G40JD_P4aba62sIxB9W36tnu7ShiBfLtd8qd4f4JStcksmnH4c7rpy56LouarSAp6Yek8CLRvFJ6EPWzLMwJZX2CmDrKtKIlZX1EEiPDI_X9ov3mCd7f4hSHhpx62tl9E-FnbG6-W2H5y_HO1bfSfPFuVffC4BWJM_4wu7kW47QgczFaE1VGT-SHZIcKvcUKmG7ROg2aLEObe8rgZ15aSycP0k9SxbgGJU.k6QyD4teRVjxlY0jJEQ9i5V9EqqhDXAxPm9yblXogek&dib_tag=se&keywords=%E8%84%B3%E3%81%AB%E3%81%8A%E3%81%95%E3%81%BE%E3%82%8B%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E6%9B%B8%E3%81%8D%E6%96%B9&qid=1731284759&sprefix=%E8%84%B3%E3%81%AB%E3%81%8A%E3%81%95%E3%81%BE%E3%82%8B%2Caps%2C164&sr=8-1)の内容を筆者が日本語で拾い読みしたメモです。特に断りのない限り、内容はこれらのソースからの引用ないし要約です。以下ではCQSの概要とコード例に触れた後、副作用が伴うCreateメソッドにおいて戻り値を使わずにIDを呼び出し側へ知らせる方法を提案しています。

## CQSの目的

メソッドのシグネチャから、APIの意図を理解しやすくすること。

## CQSの概要

CQSはコマンドクエリ分離の略で、副作用を持つか持たないかでメソッドを分離しようとします。その名の通り、**コマンド**と呼ばれる副作用を持つメソッドと**クエリ**と呼ばれる副作用を持たないメソッドを関数のシグネチャレベルで明確に区別しようとするアーキテクチャパターンになります。

### コマンド

コマンドは以下のように副作用を持つメソッドで、戻り値を持ってはいけません。つまり戻り値の型はvoidになります。

```cpp
void SendEmail(T address,U body)
```

### クエリ

クエリは以下のように副作用を持たないメソッドで、戻り値を持ちます。

```cpp
Email ViewEmail(T id)
```

## 何が嬉しいか

筆者の意見として、開発者がメソッドを使うときに副作用があるかどうかは重要な関心ごとです。副作用のあるメソッドは外部の状態を変更する場合があるので、それに依存するロジックへの影響が発生しうるからです。コマンドとクエリを分離すると、この副作用があるかどうかが関数のシグネチャを見るだけで簡単に認識できます。

## CQS違反を克服する一例

CQSとは「副作用を持つなら戻り値を持つな、戻り値を持つなら副作用をなくせ」というルールだといえそうです。

ここで以下のようなDBにCreateし、DBがauto incrementで生成したIDを返す関数を考えてみましょう。副作用があるので戻り値を持ってはいけませんが、この関数は戻り値を持っているのでCQSに違反しています。さて、どうすればいいでしょうか？

```cs
public interface IRepository<T>
{
    int Create(T item);
 
    // other members
}
```

最も簡単な解決策は以下のように、IDを関数の引数に含めてしまうことです。こうすれば呼び出し側はIDを知りつつ、CQSを守ることができます。

```csharp
public interface IRepository<T>
{
    void Create(Guid id, T item);
 
    // other members
}
```

なお、CQSもあくまで関数のアーキテクチャパターンの1つであって常にCQSに従えということでは当然ありません。APIの意図をより短時間で把握できるようになるというメリットと、例えばAPIの使いにくさなどのデメリットのトレードオフは常に発生します。Mark Seemann氏はCQS違反を克服する一例を紹介した理由について「選択肢を知らないのと知った上で採用しないのは別物で、選択肢を知っておくのは重要な設計スキルだからだ」と述べています。

## 筆者の感想

関数のシグネチャを見れば副作用があるかどうかが分かるというのは、一定readabilityに寄与するとは思う。ただこの記事でも触れたDBへINSERTするケースでは、一意なIDの払い出しをアプリケーション側でやらなければいけなくなるので規模にもよるものの責務が混ざるのが気持ち悪いかもしれない。そして「良い名前をつける」「単一責務で疎結合なコードを書く」「クラス内・パッケージ内では関数の仕事の粒度を揃える」などのよく知られたreadabilityのためのプラクティスで十分読みやすくならないのか、とも思った。個人的には関数に良い名前がついていればCQSにこだわらなくても良くね？と思ってしまった。

## メモ

CQSとよく似たCQRSは全くの別物である。CQRSはCQSを拡張したアーキテクチャパターンである。
【Mantine】Vite で Mantine を利用する

# はじめに
この記事では、Vite 環境で Mantine を利用する手順を記載します。

https://vite.dev/

https://mantine.dev/

Next.js App Router での利用手順は別の記事に記載しています。

https://qiita.com/Yasushi-Mo/items/3167fb2392e2e557d24b

# 開発環境
開発環境は以下の通りです。

- Windows 11
- React 18.3.1
- TypeScript 5.5.2
- Vite 5.4.10
- @mantine/core 7.13.5
- @mantine/hooks 7.13.5
- PostCSS 8.4.47

# プロジェクトファイルの作成
以下のコマンドでプロジェクトファイルを作成します。

```powershell
npm create vite@latest
```

作成途中で3問質問があります。
今回は以下の内容を回答しています。

```
√ Project name: ... mantine-vite-ts
√ Select a framework: » React
√ Select a variant: » TypeScript
```

プロジェクトファイルが作成されたら以下のコマンドを実行して、ローカルサーバーを起動します。

```powershell
cd mantine-vite-ts
npm install
npm run dev
```

ローカルサーバー起動後、ターミナルに表示される URL へアクセスすると、以下の画面が表示されます。

http://localhost:5173/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318188/4c981a4a-c4cb-81aa-fb31-515873eed1be.png)

# Mantine のインストール
Mantine の利用に必要な dependencies（パッケージ）をインストールします。

```powershell
npm install @mantine/core @mantine/hooks
```

# PostCSS のインストールと設定
PostCSS に関連する dependencies（パッケージ）をインストールします。

```powershell
npm install --save-dev postcss postcss-preset-mantine postcss-simple-vars
```

以下の内容の `postcss.config.cjs` をアプリケーションのルートディレクトリに作成します。

```postcss.config.cjs
module.exports = {
  plugins: {
    "postcss-preset-mantine": {},
    "postcss-simple-vars": {
      variables: {
        "mantine-breakpoint-xs": "36em",
        "mantine-breakpoint-sm": "48em",
        "mantine-breakpoint-md": "62em",
        "mantine-breakpoint-lg": "75em",
        "mantine-breakpoint-xl": "88em",
      },
    },
  },
};

```

# Mantine の利用設定
アプリケーションのルートコンポーネントで以下を追加することで、Mantine が利用できるようになります。

1. `@mantine/core/styles.css` のインポート
1. `MantineProvider`

```App.tsx
import { Button, Center, MantineProvider } from "@mantine/core";
import { useState } from "react";
// Import styles of packages that you've installed.
// All packages except `@mantine/hooks` require styles imports
import "@mantine/core/styles.css";

function App() {
  const [count, setCount] = useState(0);

  return (
    <MantineProvider>
      <Center w={1080}>
        <Button onClick={() => setCount((count) => count + 1)}>
          count is {count}
        </Button>
      </Center>
    </MantineProvider>
  );
}

export default App;

```

動作確認をします。
Mantine の Button コンポーネントの表示を確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318188/e0d710d0-7ed5-c21e-59b6-8992fcb89fdf.png)


# 参考
- [Usage with Vite](https://mantine.dev/guides/vite/)
Mac mini M4に将棋AIを導入してみた（NNUE系、DL系）

はじめまして
普段はフリーのwebエンジニアをやっていますshutaです。

最近Mac mini M4を購入したのですがせっかくスペックが上がったので趣味の将棋のAIを導入してみました。
今回はその手順について書かせていただこうと思います。

# 筆者について
将棋ウォーズ六段
最新のAIについての知識はほぼゼロなのでご了承ください。

# NNUE系とDL系
現在、将棋AIの評価関数はNNUE系とDL系の2つに分かれるようです。
NNUE系はニューラルネットワーク、DL系はディープラーニングで学習した評価関数とのことで、
DL系の方が読める局面は少なくなり、その分人間の思考により近く正確に局面を読むことができるようになるようです。
今回はそのどちらも導入してみます。

# NNUE系の導入
まず、gitからやねうら王をcloneします。
```
$ git clone git@github.com:yaneurao/YaneuraOu.git
```

MakeFileを編集します。
YaneuraOu/source/MakeFileを開き、TARGET_CPUを変更してください。
```diff
- TARGET_CPU = AVX2
+ #TARGET_CPU = AVX2
+ TARGET_CPU = APPLEM1
```

MakeFileの編集はこれだけで大丈夫なはずです。
最後にビルドします。
```
$ cd YaneuraOu/source
$ make
```
これで/source内にYaneuraOu-by-gccというファイルができていればOKです
このファイルを適当なディレクトリ内に移動させます。
```
├── YaneuraOu-by-gcc
├── eval
└── book
```
後々使うのでeval、bookというフォルダも作成しておきます。

まずはこの状態で将棋所にエンジン登録してみましょう。
将棋所で対局->エンジン登録からディレクトリに移動させたYaneuraOu-by-gccを登録します。

これで対局開始してみます

![https___qiita-image-store.s3.ap-northeast-1.amazonaws.com_0_304831_0a738cad-6005-6cbc-0e19-6c4c2e050c62.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304831/5aae7c34-c753-a97e-0610-7be7e372f6ab.png)

eval内に評価関数ファイルがないので動きませんでした。

今回使用させていただいたやねうら王は探索エンジンのみで、評価関数ファイルは別で用意する必要があります。

フリーで公開されている評価関数はいくつもあり、有名なところだと水匠（https://github.com/yaneurao/YaneuraOu/releases/tag/suisho5 ）などがあります。

今回は筆者の志向でqhapaq(https://github.com/qhapaq-49/qhapaq-bin/releases/tag/tagtest )を導入します。

js26.7zをインストール、解凍してeval/nn.binをYaneuraOu-by-gccと同じディレクトリのeval以下に配置します。

```
├── YaneuraOu-by-gcc
├── eval
│   └──nn.bin
└── book
```

評価関数ファイルを配置後、対局開始することができました。

![スクリーンショット 2024-11-12 7.51.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304831/0350d6ac-1c81-3623-51d8-e6dfce0210d3.png)


book以下のディレクトリですが、定跡ファイルを配置することでAIに指定した定跡で指してもらうことができます。
私は振り飛車の研究がしたいので公開されている振り飛車の定跡ファイルを読み込ませています
https://github.com/32hiko/HoneyWaffleBook/releases

bookフォルダ内に定跡ファイルを置いた後はエンジン設定でファイルの指定をします。
```
├── YaneuraOu-by-gcc
├── eval
│   └──nn.bin
└── book
    └──user_book2.db
```
![スクリーンショット 2024-11-12 8.29.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304831/84f61ce5-f528-55f1-48fd-d71a7e96fd70.png)


これで振り飛車を指してくれるようになりました。

# DL系の導入
DL系の場合もやねうら王からビルド可能です。

MakeFileを編集し、YANEURAOU_EDITIONを変更します。
```diff
- YANEURAOU_EDITION = YANEURAOU_ENGINE_NNUE
+ YANEURAOU_EDITION = YANEURAOU_ENGINE_DEEP_COREML
```
NNUE系と同じようにビルド後、フォルダを作成しファイルを配置します。
```
├── YaneuraOu-by-gcc
├── eval
└── book
    └──user_book2.db
```
mac上で使用できるDL系評価関数が公開されているので使用させていただきます
https://github.com/select766/FukauraOu-CoreML/releases/tag/coreml-sample-20220613

こちらでDlShogiResnet10SwishBatch.mlmodelをダウンロードし、eval以下に配置後、DNN_Model1に「DlShogiResnet10SwishBatch.mlmodel」を指定
![スクリーンショット 2024-11-12 8.17.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304831/72ba2a7b-fa8d-fb83-bee0-e51734b0faf3.png)
これで設定完了。対局できるようになりました。

# 最後に
公開されているソフトを組み合わせて簡単に将棋AIを導入することができました。
試しに対局してみましたがあまりに自然な強さで、このようなものが無料公開されているとは大変驚きです。
開発された方々に感謝申し上げます。