OmniAICreator/Qiita-1.07M huggingface dataset:
bashだけでメール（smtp 25）を送るスクリプト

リハビリテスト記事

## 必要なコマンドセット

`bash`と`cut`だけ

## スクリプト

```bash
#!/bin/bash -eux
 
_waitStatus(){
  while true;do
    read status <&3
    if [[ "$1" == "$(echo "$status" | cut -d' ' -f1)" ]];then
       break
    fi
  done
}

exec 3<> /dev/tcp/${MAILSERVERADDR}/25

_waitStatus 220

echo "HELO ${MAILSERVER}" >&3
_waitStatus 250

echo "MAIL FROM: <${MAILFROM}>" >&3
_waitStatus 250
 
echo "RCPT TO: <$1>" >&3
_waitStatus 250
 
echo "DATA" >&3
_waitStatus 354
 
echo "From: ${MAILFROM}" >&3
echo "Subject: $2" >&3
echo "" >&3
echo "$3" >&3
echo "." >&3

exec 3<&-
```

## HowTo

下記のように実行する

```shell-session
$ export MAILSERVER=example.com
$ export MAILFROM=anya@example.com
$ export MAILSERVERADDR=smtp.example.com
$ ./sendmail.sh "rubbish@anya.jp" "Hello my bro!" "This is test mail at $(date)."
```

以上
paizaの問題をPowerShellで解いてみた 野球の審判 (paizaランク C 相当)

この記事はpaizaのプログラミング問題をPowerShellで解いてみようという試みの記事です。

## paizaのプログラミング問題とは？
ブラウザ上でコードを書いて実行できる、無料プログラミング練習問題集です。

- 難易度別に問題を選ぶ
- 問題文を読んで、解答コードを書く
- 提出するとテストケースが実行されて結果をわかる
- 正解・不正解だけではなく、解答コード例や解説も見ることができるので、プログラミングの習得から復習まで活用できます

## こんな人におすすめ
- プログラミングスキルの腕試しをしたい方
- プログラミングのスキルアップしたい方
- 新しい言語にチャレンジをしたい方

通常は問題をc言語やJavaなどで解くのですがPowerShellで解いてみます。

## 問題
野球の審判 (paizaランク C 相当)

https://paiza.jp/works/mondai/c_rank_skillcheck_archive/umpire

野球の各打者はストライクが 3 つたまるとアウトとなり、ボールが 4 つたまるとフォアボールとなります。
アウトあるいはフォアボールになると、この打者の番は終了します。

あなたはストライクとボールを判定してコールする審判です。
その場の状況に合わせて適切なコールを出しましょう。

【コール一覧】
ストライクが 1 〜 2 つたまったとき → "strike!"
ストライクが 3 つたまったとき → "out!"
ボールが 1 〜 3 つたまったとき → "ball!"
ボールが 4 つたまったとき → "fourball!"
#### 入力される値
入力は、以下のフォーマットで与えられます。

N
s_1
s_2
...
s_n

1 行目に合計の投球数を表す整数 N が与えられます。
続く N 行のうち i 行目 (1 ≦ i ≦ N) に i 番目の投球の結果を表す文字列 s_i が与えられます。i 番目の投球がストライクであれば s_i は "strike"、ボールであれば "ball" となります。
入力は合計で N + 1 行からなり、入力値最終行の末尾に改行が１つ入ります。


#### 期待する出力
各投球に対する適切なコールを以下の形で出力してください。

c_1
c_2
...
c_N

期待する出力は N 行からなります。
N 行のうちの i 行目 (1 ≦ i ≦ N) に問題文の条件に即して打者へのコールを表す文字列 c_i を "strike!", "ball!", "out!", "fourball!" のいずれかで出力してください。
出力の N 行目の末尾に改行を 1 つ入れ、余計な文字、空行を含んではいけません。


## コード:

~~~
$n = [int](read-host)  # 投球数
$pitching = @() # 投球リスト
for($i=0;$i -lt $n;$i++){
	$pitching+=(read-host)
}
# ストライクとボールのカウントを宣言
$cnt_strike = 0
$cnt_ball = 0

# 各投球結果を判定
foreach($p in $pitching) {
	if($p -eq "strike"){
		$cnt_strike += 1
		if($cnt_strike -eq 3){
			write-host "out!"
			break
		} else {
			write-host "strike!"
		}
	} elseif($p -eq "ball") {
		$cnt_ball += 1
		if($cnt_ball -eq 4) {
			write-host "fourball!"
			break
		} else {
			write-host "ball!"
		}
	}
}

~~~

### コード解説
~~~
$n = [int](read-host)  # 投球数
$pitching = @() # 投球リスト
for($i=0;$i -lt $n;$i++){
	$pitching+=(read-host)
}
~~~
標準入力から投球数と投球リストを受け取ります

~~~
$cnt_strike = 0
$cnt_ball = 0
~~~
ストライクとボールのカウントを宣言
~~~
foreach($p in $pitching) {
	if($p -eq "ball") {
		$cnt_ball += 1
		if($cnt_ball -eq 4) {
			write-host "fourball!"
			$cnt_ball=0
			break
		} else {
			write-host "ball!"
		}
	} elseif($p -eq "strike"){
		$cnt_strike += 1
		if($cnt_strike -eq 3){
			write-host "out!"
			$cnt_strike = 0
			break
		} else {
			write-host "strike!"
		}
	}
}
~~~
投球結果を判定
ボール４個でフォアボール
ストライク３個でアウト


## 終わりに
noteにPowerShellのサンプルコードの記事を書いています。そっちも見てね

[PowerShellまとめ](https://note.com/mahalo_/m/m421b17a881c8)

https://note.com/mahalo_/m/m421b17a881c8
秒速dockerインストール2024夏版

```
#秒速dockerインストール 2024夏版
#raspberry pi 対応

#dockerインストール
curl https://get.docker.com | sh
sudo usermod -aG docker $USER
sudo reboot

#docker composeインストール
#実行権限付与までOKっぽい
sudo apt install docker-compose-plugin
docker compose version

#おわり

```
Raspberry Pi 4に載せたKubernetesでamd64のイメージを展開できない

# 背景

Podのimageにamd64用のイメージを指定すると、

```
exec /usr/bin/sh: exec format error
```

というエラーが出て起動できません😢

# 解決策

`qemu-user-static`をインストールしましょう👍

```
sudo apt-get install -y qemu-user-static
```
【C++】AtCoderで学んだ超基本的アルゴリズムの備忘録（随時更新）

##### 切り上げ

```main.c
#include <bits/stdc++.h>
using namespace std;

int main() {
  int a, b; cin >> a >> b;
  cout << (a + b + 1) / 2 << endl;
}
```

##### k桁目の値

```main.c
#include <bits/stdc++.h>
using namespace std;

int main() {
  int n, k; cin >> n >> k;
  cout << n / (int)pow(10, k - 1) % 10 << endl;
}

```

##### 各桁の値の和

①再帰関数

```main.c
#include <bits/stdc++.h>
using namespace std;

int sum_of_digits(int n) {
  if (n < 10) return n;
  return digit_sum(n / 10) + (n % 10);
}

int main() {
  int n; cin >> n;
  cout << sum_of_digits(n) << endl;
}
```

②while文

```main.c
#include <bits/stdc++.h>
using namespace std;

int main() {
  int n; cin >> n;

  int sum = 0;
  while(n) {
    sum += n % 10;
    n /= 10;
  }

  cout << sum << endl;
}
```

##### 数値の回文の形成

```main.c
#include <bits/stdc++.h>
using namespace std;

int reverse(int n, int rev) {
  if (n == 0) return rev;
  return reverse(n / 10, rev * 10 + n % 10);
}

int main() {
  int n; cin >> n;
  cout << reverse(n, 0) << endl;
}
```
VSCode拡張機能Prettier ESLintが効かなくて困ったメモ

## 概要
VSCodeで触っているTypeScriptのプロジェクトにESLintとPrettierを入れたく、拡張機能をインストールしました。
保存時のフォーマットが動かず戸惑ったので、メモとして残します。
（同事象の解決記事はいくつか拝見しましたが、同じ拡張機能を使っている記事が見当たらなかったので）

※変なことをしていたり、定石と違う点がありましたら、コメントいただけると喜びます。

## 前提条件

* TypeScriptプロジェクト

| ソフトウェア | バージョン |
|:-:|:-:|
| VSCode  | 1.92.0  |
| rvest.vs-code-prettier-eslint  | 6.0.0  |  
| @typescript-eslint/parser | 8.0.0 |
| eslint | 8.57.0 |
| eslint-config-prettier | 9.1.0 |
| prettier | 3.1.0 |
| prettier-eslint | 16.1.2 |
| typescript | 4.4.4 |

## 何が起こったか
### 再現手順

1. 拡張機能の説明のとおり、下記を準備
    1. 依存関係のインストール
    1. prettierの設定ファイル作成
    1. eslintの設定ファイル作成
    1. ワークスペース設定
1. VSCode上でソースファイルを保存

### 事象
ソースコードがフォーマットされない
（TypeScriptも、JavaScriptも、Jsonも）

### 補足
1. ESLint、prettierはそれぞれnpxコマンドで実行可能（＝各設定のせいではない）
1. 今回参照した拡張機能の説明
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3692010/3af9a0a0-ce57-de77-be6e-127b41a3df08.png)

## 原因
VSCodeのデフォルトのフォーマッタ設定が効いていないように見えました。
それがなぜ起こるのかは、よくわかりませんでした。
何か抑止する設定を入れてしまっているのか、VSCode本体のバグなのか。
原因にお心当たりのある方のコメントいただけると喜びます。

## 動いた設定
prettierにフォーマットしてほしい言語の"editor.defaultFormatter"を追記しました。
※editor.formatOnSaveは書いても書かなくても動作に変化ありませんでした

``` json:settings.json
{
  "editor.defaultFormatter": "rvest.vs-code-prettier-eslint",
  "editor.formatOnType": false, // required
  "editor.formatOnPaste": true, // optional
  "editor.formatOnSave": true, // optional
  "editor.formatOnSaveMode": "file", // required to format on save
  "files.autoSave": "onFocusChange", // optional but recommended
  "vs-code-prettier-eslint.prettierLast": false, // set as "true" to run 'prettier' last not first
  "[javascript]": {
    "editor.defaultFormatter": "rvest.vs-code-prettier-eslint"
  },
  "[typescript]": {
    "editor.defaultFormatter": "rvest.vs-code-prettier-eslint"
  },
  "[json]": {
    "editor.defaultFormatter": "rvest.vs-code-prettier-eslint"
  },
  "[html]": {
    "editor.defaultFormatter": "rvest.vs-code-prettier-eslint"
  },
  "[css]": {
    "editor.defaultFormatter": "rvest.vs-code-prettier-eslint"
  },
  "[scss]": {
    "editor.defaultFormatter": "rvest.vs-code-prettier-eslint"
  }
}

```

GUIから設定を見た時の図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3692010/de0ed5ae-dc53-08b0-a5a3-0ca782a7e8f1.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3692010/ca173f73-fd98-637a-5e2e-fb2b5a8f492f.png)

※Eslint > Format:Enableにある「Enables ESLint as a formatter.」は、チェックを入れてもいれなくても動作に変化ありませんでした

## オマケ
ESLint設定（フラットコンフィグ）
``` javascript:eslint.config.js
import eslint from "@eslint/js";
import eslintConfigPrettier from "eslint-config-prettier";
import typescript from "@typescript-eslint/parser";
import globals from "globals";

export default [
  {
    files: ["**/*.js", "**/*.mjs", "**/*.ts", "**/*.cts", "**/*.mts"],
    languageOptions: {
      sorceType: "modules",
      globals: { ...globals.node, ...globals.browser },
      parser: typescript,
    },
  },
  eslint.configs.recommended,
  eslintConfigPrettier,
];
```

prettier設定
``` json:.prettierrc.json
{
  "printWidth": 120
}
```
cscの作法 その517

# 概要
cscの作法、調べてみた。
wpf見つけたので、msbuildでコンパイルしてみた。

# 参考にしたページ

https://qiita.com/imanani/items/b5f014f76eb1d347cdca


# 環境
windows11

# ビルドを書く

```

<Project DefaultTargets='Build' xmlns='http://schemas.microsoft.com/developer/msbuild/2003'>
	<PropertyGroup>
		<Configuration>Debug</Configuration>
		<Platform>AnyCPU</Platform>
			<RootNamespace>helloEyes</RootNamespace>
			<AssemblyName>helloEyes</AssemblyName>
		<OutputPath>.\bin\Debug\</OutputPath>
	</PropertyGroup>
	<ItemGroup>
		<Reference Include="System" />
		<Reference Include="System.Data" />
		<Reference Include="System.Xml" />
		<Reference Include="Microsoft.CSharp" />
		<Reference Include="System.Core" />
		<Reference Include="System.Xml.Linq" />
		<Reference Include="System.Data.DataSetExtensions" />
		<Reference Include="System.Net.Http" />
		<Reference Include="System.Xaml">
			<RequiredTargetFramework>4.0</RequiredTargetFramework>
		</Reference>
		<Reference Include="WindowsBase" />
		<Reference Include="PresentationCore" />
		<Reference Include="PresentationFramework" />
	</ItemGroup>
	<ItemGroup>
		<ApplicationDefinition Include="App.xaml">
			<Generator>MSBuild:Compile</Generator>
			<SubType>Designer</SubType>
		</ApplicationDefinition>
		<Page Include="MainWindow.xaml">
			<Generator>MSBuild:Compile</Generator>
			<SubType>Designer</SubType>
		</Page>
		<Compile Include="App.xaml.cs">
			<DependentUpon>App.xaml</DependentUpon>
			<SubType>Code</SubType>
		</Compile>
		<Compile Include="MainWindow.xaml.cs">
			<DependentUpon>MainWindow.xaml</DependentUpon>
			<SubType>Code</SubType>
		</Compile>
	</ItemGroup>
	<ItemGroup>
		<Compile Include="Properties\AssemblyInfo.cs">
			<SubType>Code</SubType>
		</Compile>
		<Compile Include="Properties\Resources.Designer.cs">
			<AutoGen>True</AutoGen>
			<DesignTime>True</DesignTime>
			<DependentUpon>Resources.resx</DependentUpon>
		</Compile>
		<Compile Include="Properties\Settings.Designer.cs">
			<AutoGen>True</AutoGen>
			<DependentUpon>Settings.settings</DependentUpon>
			<DesignTimeSharedInput>True</DesignTimeSharedInput>
		</Compile>
		<EmbeddedResource Include="Properties\Resources.resx">
			<Generator>ResXFileCodeGenerator</Generator>
			<LastGenOutput>Resources.Designer.cs</LastGenOutput>
		</EmbeddedResource>
		<None Include="Properties\Settings.settings">
			<Generator>SettingsSingleFileGenerator</Generator>
			<LastGenOutput>Settings.Designer.cs</LastGenOutput>
		</None>
	</ItemGroup>
	<ItemGroup>
		<None Include="App.config" />
	</ItemGroup>
	<ItemGroup>
		<Resource Include="logo.png" />
	</ItemGroup>
	<Import Project='$(MSBuildBinPath)\Microsoft.CSharp.targets' />
	<Import Project='$(MSBuildBinPath)\Microsoft.WinFX.targets' />
</Project>


```

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/3dcf14dc-ef6c-04d7-c260-c0b2d750dcc8.png)



以上。
投稿 34 RFP 2024/08/03

本日の勉強時間　0.5H


RFPは「Request For Proposal」の頭文字を取ったもので、「提案依頼書」とも呼ばれます。情報システムの導入や業務委託をおこなうにあたり、ベンダーに対して具体的な提案を依頼する文書のこと。
双極幾何学ってなんですか？


# はじめに

# 双極幾何学とは？

双極幾何学は数学の一分野で、特に幾何学と代数学の交わる領域に位置します。この理論は、通常の幾何学的な図形や空間を、2つの極（ポイント）を基準にして表現し解析する方法を提供します。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348593/7eae1fb6-43fc-1476-fa24-a92f26f1c870.png)


### 主な特徴：

- 2つの固定点（極）を基準にして、空間や図形を表現する
    - 従来のユークリッド座標系ではなく、独自の座標系を使用する
- 複素数平面との関連が深く、複素関数論にも応用される
    - 円や球面の性質を研究する上で特に有用

## ユークリッド幾何学との違い

ユークリッド幾何学は平面上の幾何学で、曲率がゼロの幾何学とも言えます。無限に広がる平面空間を扱います。
一方で、「双曲幾何学」では、曲率が負の空間を扱います。

## 双曲線（Hyperbola）とは
双曲線は、平面上の2つの固定点（焦点）からの距離の差が一定である点の軌跡として定義される二次曲線です。

## 双曲空間とは
双曲空間とは直線が双曲線のようになる空間です。そもそも今目の前に見えている空間がまっすぐだからって、それが永遠にまっすぐ続くとは限らない訳です。地球だって丸いし。地表にある直線は惑星スケールで見ればすべて正円（正確には回転楕円体）なので、地球はすべての直線が円になる空間であると言えます。反対に、すべての直線が双曲線になってしまう空間があってもよいはずです。

|空間の種類|三角形の内角の和|平行でない直線|平行な直線*|
|---|---|---|---|
|平面(ユークリッド座標系)|=180度|1点で交わる|交わらない|
|球面|＞180度|2点で交わる|交わらない|
|双曲面|＜180度|1点で交わるか交わらない|交わらない|


球面では線が曲がっていて、三角形が「膨らんで」見えます。
平面では私たちが慣れ親しんだユークリッド幾何学の特徴が見られます。
双曲面では線が「内側に曲がって」おり、三角形が「縮んで」見えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348593/8d03fce0-fe70-e1e3-4868-39fd46a16f31.png)


次の図は、ユークリッド平面の格子座標が双曲空間でどのように見えるかを表現しています。

左側（ユークリッド格子）：
- 通常の直交座標系を示しています。
- 縦線と横線が等間隔で直線的に配置されています。


右側（双曲格子）：
- ユークリッド格子が双曲空間に変換された様子を示しています。
- 縦線（青色）は中心に向かって湾曲した双曲線になっています。
- 横線（赤色）も上に凸の双曲線になっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348593/014bf5bf-3d1f-c1ca-b09c-a42bab9bd12f.png)


# 発展のきっかけ

### 複雑な幾何学的問題の解決需要:
17世紀から18世紀にかけて、数学者たちは既存の幾何学的手法では解決が困難な問題に直面していました。例えば、カッシーニが研究した卵形線（カッシーニ楕円）のような複雑な曲線の性質を理解するには、新しいアプローチが必要でした。

### 複素数理論の発展:
オイラーやガウスによる複素数理論の発展は、平面上の点を二つの実数の組として表現する新しい方法を提供しました。これは双極座標系の概念形成に重要な役割を果たしました。

### 物理現象の数学的記述の必要性:
特に19世紀に入ると、電磁気学や流体力学などの分野で、円筒形や球形の対称性を持つ問題を扱う必要が増えました。これらの問題は、双極座標系を用いることで効率的に解析できることが分かりました。

## Pythonライブラリ

| ライブラリ名 | 概要 |
|------------|------|
| [bigraphs](https://www.geeksforgeeks.org/bipartite-graphs-in-python/) | bipartite-graphs（双極グラフ）の作成と操作を簡単に行う |
| [HyperSphere](https://github.com/ninamiolane/geomstats) | 双極幾何学を含む高次元球面幾何学を扱う |
| [PoincareMaps](https://github.com/facebookresearch/PoincareMaps) | ポアンカレ双曲平面モデルを用いた双極幾何学的なマッピングを行う |
| [PyGeodesy](https://github.com/mrJean1/PyGeodesy) | 双極幾何学を含む測地学計算を扱う|
| [PyVoronoi](https://github.com/Voxel8/pyvoronoi) | 双極幾何学における領域分割のためのボロノイ図生成 |
[PyTorch] MLPを用いた単純な回帰問題

# 記事の内容
MLPを用いた単純な回帰モデル
モデル:MLP ( PyTorch )

# スクリプト
```d01_Pytorch_MLP_Simple_Regression.ipynb
import torch
import torch.nn as nn
import torch.optim as optim
import matplotlib.pyplot as plt
torch.manual_seed(0)

# データの生成
data_size = 5000
x = torch.randn(data_size, 1)  # 正規分布に従う乱数
y = 2 * x + 3 + torch.randn(data_size, 1) * 0  # 動作確認のためノイズは0にしているがノイズを追加をしても問題なく動作した。

# データを学習用と検証用に分割
train_size = int(0.8 * len(x))
x_train, x_vali = torch.split(x, [train_size, len(x) - train_size])
y_train_act, y_vali_act = torch.split(y, [train_size, len(y) - train_size])

# MLPモデルの定義
class MLP(nn.Module):
    def __init__(self):
        super(MLP, self).__init__()
        self.fc1 = nn.Linear(1, 64)
        self.fc2 = nn.Linear(64, 64)
        self.fc3 = nn.Linear(64, 1)
    
    def forward(self, x):
        x = torch.relu(self.fc1(x))
        x = torch.relu(self.fc2(x))
        x = self.fc3(x)
        return x

# モデルのインスタンス化
model = MLP()
criterion = nn.MSELoss()
optimizer = optim.Adam(model.parameters(), lr=0.01)

# モデルの学習
num_epochs = 500
for epoch in range(num_epochs):
    model.train()
    optimizer.zero_grad()
    outputs = model(x_train)
    loss = criterion(outputs, y_train_act)
    loss.backward()
    optimizer.step()
    
    if (epoch+1) % 100 == 0:
        print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item():.4f}')

# 学習用データと検証用データの予測
model.eval()
with torch.no_grad():
    y_train_pred = model(x_train)
    y_vali_pred = model(x_vali)

# 予測結果のプロット
plt.figure(figsize=(5, 5))
plt.scatter( y_train_act.numpy(), y_train_pred.numpy(), label='Train Data')
plt.scatter( y_vali_act.numpy(), y_vali_pred.numpy(), label='Vali Data')
plt.plot([-10, 10], [-10, 10], color='gray', label='1:1 line')
plt.title('Prediction result')
plt.xlabel('Y act')
plt.ylabel('Y pred')
plt.grid(True, linestyle='dotted')
plt.legend()

plt.show()
```

# スクリプト実行結果
![出力例.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111514/d728f5df-740c-1752-4663-3fb8ac5923d6.png)
GMOとくとくBBのドコモ光にASUSルーターで接続する

# 2025/04/23の近況

2025/04/23のファームウェアアップデート（ASUS GT-BE98 Firmware version 3.0.0.6.102_37838）で、「Support 10G Hikari Cross (v6plus and OCN Virtual Connect)」が出ました。
朗報！！？と思いきや、実は私のところではこの方式ではまだ接続出来ていません。

下記の記事は前提として、過去のファームウェアであ3.0.0.6.102_36911-g68656a3_1207-g0fc42_BB0Bを使っています。

# 結論
IPv6の接続タイプを「ネイティブ」にする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280394/db4efa34-6d5f-39e0-f7a3-b8bce0ffbb03.png)


# 経緯など
10G回線引きたい！フル活用したい！となった時に10Gポートが２つあり、手持ち機器とメッシュが組めるASUSのGT-BE98を購入したのですが、これがどうも上手く繋がらない。下記のサイトでは「対象機種につきましては、株式会社JPIXホームページでご確認ください。」と記載があるので、JPIXを見てみると最新のGT-BE98は掲載されていないが、ASUSルーターは普通に使えそうなのは確認。最新ルーターなんやし、繋がらない訳ないじゃろ！！と楽観視してました。

https://help.gmobb.jp/app/answers/detail/a_id/018578
https://www.jpix.ad.jp/service/?p=3565


一般的にはv6プラスは昔ながらのPPPoEのようなID/Pass設定などなどは不要で、繋げて少し待てば即接続！という気軽さを売りにしているので、ASUSルーターも例に漏れず「WAN接続タイプ」を「IPv6プラス」として設定すればOKのハズでした。
しかし、下記のようなログが出てくるのみで全然繋がらず。

```
Aug  4 07:34:02 [MAP-E]: v6plus starts.
Aug  4 07:34:02 rc_service: v6plusd 347:notify_rc start_rdisc6
Aug  4 07:34:03 rc_service: v6plusd 347:notify_rc start_dhcp6c
Aug  4 07:34:17 rc_service: cfg_server 2362:notify_rc update_nbr
Aug  4 07:34:32 [MAP-E]: The map rule has exist. Reconfirm after 2 min.


Aug  4 07:34:40 rc_service: v6plusd 347:notify_rc stop_aae
Aug  4 07:34:40 rc_service: waitting "stop_mastiff" via v6plusd ...
Aug  4 07:34:41 rc_service: v6plusd 347:notify_rc start_mastiff
Aug  4 07:34:41 rc_service: waitting "stop_aae" via v6plusd ...


Aug  4 07:37:33 [MAP-E]: Checking scenario...
```

最終的にはIPv6の接続タイプを「ネイティブ」にすることで割とサクッと接続できたのでありました。めでたしめでたし。
こういうの調べても全然記事出てこないし、価格.comの口コミで「なんかよく分からんけど色々やったら繋がった」系記事しかなくて辛かったので、そういう人に届いたら嬉しみ。
あと、ASUSサポートさん、「ASUS製品は光10Gが対応できかねます。」って言ってたけど繋がったよ！
TextMeshProがアサインできない！

徹夜あけでアホになっていたとはいえ紛らわしかったのでメモ

# ことの経緯
スクリプトでカウントした回数をゲーム内で表示するようにしたかったので，その辺で転がっているチュートリアル記事を見ながらこんな感じのコードを書いた．
```Controller.cs
public class Controller : MonoBehaviour
{
    public TextMeshProUGUI countText;
    
    //うんたら
}
```
が，インスペクタの`Count Text`にヒエラルキーで作った`Text(TMP)`をアサインしたかったが弾かれてしまう．
![スクリーンショット 2024-08-04 6.36.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3809718/7bf77fe3-2be4-11eb-3872-60d462a77c04.png)

で，散々調べてもよくわからなかったのでこの日は諦めて寝たのだけど，次の日に原因を理解．

# 原因
**3D ObjectのTextMeshPro** と **UIのTextMeshPro** を混同していたことが原因だった．

右クリック > 3D Object > Text - TextMeshProで作った`Text(TMP)`を見ると，`TextMeshPro - Text`コンポーネントと`TextMeshPro Mesh`コンポーネントがあるのに対し，
![スクリーンショット 2024-08-04 6.53.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3809718/42671d49-fb7c-dfeb-a72a-97918f379edb.png)
右クリック > UI > Text - TextMeshProで作った`Text(TMP)`には`TextMeshPro - Text(UI)`コンポーネントのみついている．
![スクリーンショット 2024-08-04 6.52.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3809718/cd0c0337-c7c4-ea50-5243-28aed309cdc2.png)

つまり，コード上で**UIのTextMeshPro**を宣言しているのに，**3D ObjectのTextMeshPro**をアサインしようとしていたから弾かれていたということ．

# 解決法
そういうわけで型を揃えてやれば問題なくアサインできた．
```Controller.cs
public class Controller : MonoBehaviour
{
    public TextMeshPro countText;
    
    //うんたら
}
```
![スクリーンショット 2024-08-04 7.09.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3809718/489633cf-a233-e563-915f-df5369c66ed6.png)

コードでは`TextMeshProUGUI`のままオブジェクトを作り直してもいいはず．

***

アサインできなかったら最初に疑うのは型間違いだろうけど，初心者にはめちゃ紛らわしかったです．
徹夜は注意散漫になるのでなるべくやめましょう．
Babelを使ってJestでESMを読み込めるようにする

# はじめに
Jestでテスト実行時に**ESMを読み込めるようにBabelの設定を行いました。**


# Babel設定

**Babelをインストール**
```
npm install --save-dev @babel/preset-env babel-jest
```
**`babel.config.js`を作成**
```js:js
module.exports = {
  presets: [
    ["next/babel"],  // Next.jsのコードを変換
    [
      "@babel/preset-env",
      {
        targets: {
          node: "current",
        },
      },
    ],
    "@babel/preset-typescript",  // TypeScriptのコードを変換
  ],
};
```

**`jest.config.ts`に設定を追加**
```ts:ts
import type { Config } from "jest";
import nextJest from "next/jest.js";

const createJestConfig = nextJest({
  dir: "./",
});

const config: Config = {
  preset: "ts-jest/presets/default-esm",  // TypeScriptとESMを使う設定
  globals: {
    "ts-jest": {
      tsconfig: "tsconfig.json",
      useESM: true,
    },
  },
  coverageProvider: "v8",
  testEnvironment: "jsdom",
  transform: {
    "^.+\\.(ts|tsx|js|jsx)$": "babel-jest",  // Babelでコードを変換
  },
};

export default createJestConfig(config);
```

# 参考

https://babeljs.io/setup#installation
Gemini Pro いつの間にやらロールプレイがうまくなってる。 

Gemini Proが0801で良くなったという話を聞いて、ロールプレイで話をしてみたが、いつの間にやら、賢くなってた。

確認してみたら、アップデート前からよかったみたいだ。
### Gemini Pro
```
こんにちは

Model
…こんにちは。
（警戒心を隠しきれない様子で、少し身を引いて、あなたを見つめている。）

User
あなたの名前は？

Model
…ルナ。
（短く、低い声で答える。まだあなたを警戒している様子。）
```
### Gemini Flash
これが、いままで持っていたAIの反応
```
こんにちは

Model
1.4s
こんにちは！私はルナです。😊 何かお困りですか？ それとも、ただお話ししたい気分ですか？ 😄
```

Flashさんも、ロールプレイについて、説明したら、それっぽくしてくれた。GeminiのPromptの理解力が強いのだろう。さすがに、暇ないけど、十分・おままごとやチャット相手になるね。

これだけ説明文があったら、感情検出や映像化も楽だろうし将来が楽しみだね。
イベントを解除する

ボタンイベントを解除するには`isClickable = false`を使用する。下記コードはボタンイベントを一度だけ実行できる。

```kotlin
binding.homeButton.setOnClickListener {
    Toast.makeText(requireContext(), "ボタンが押されました", Toast.LENGTH_SHORT).show()

    binding.homeButton.isClickable = false
}
```

下記のコードは5回ボタンを押すと解除される。条件次第で特定の処理を行えば解除するようにもできる。
```kotlin
var i = 0
binding.homeButton.setOnClickListener {
    i++
    Toast.makeText(requireContext(), "ボタンが押されました", Toast.LENGTH_SHORT).show()

    if (i == 5) {
        binding.homeButton.isClickable = false
    }
}
```

`isClickable = false`以外にもリスナーをnullに設定する方法もある。これはイベント処理はされないが、ボタンクリックのエフェクトは残る。
```kotlin
binding.homeButton.setOnClickListener(null)
```

#### 参考

https://codenote.net/posts/2054/
映像関係のなんかを作ろうと構想妄想してるメモ

言語処理100本ノックの続きを差し置いて先月かその前辺りから映像関係のなんかを作ろうと構想妄想し一昨日ぐらいから下調べしてるんだけど、その簡単なメモ。
最近はやりの画像に点を打って立体的にとらえて何たらみたいな事みたいなことは全然しない、基礎的な事しかやらない構想だけど、そもそも映像関係とか難しそうだしそもそもアプリケーションとしてなんか完成させた事がない気もするし無理かも。

・MP4
mp4はmpeg、jpegH、H.26x等々のコーデックにより作られた映像画像ファイルや音声ファイルをまとめて格納するためのコンテナ

・fMP4（fragmented MP4）
映像画像を細かく分割して格納したやつ。
MP4のフォーマットのままfMP4にするハイブリッドをやってる人達も居るみたい。
ネット配信用。プログレッシブダウンロードで映像が順次生成される状況でも使えるようにしたMP4
htmlではmp4-DASHなどとしHTTPリクエストAcceptで映像をもらってくるっぽい。


・プリコンパイル、JITコンパイル、インタプリタ
プリコンパイル：
    cなど、アプリケーション自体が軽くなる
JITコンパイル：
    javascriptなど、実は最も高速という疑惑、メモリは食うらしい
    javaはプリコンパイルして実行時はJIT?
インタプリタ：
    pythonなど。流行ってるから早いのかと思ってたら最も遅い疑惑


・映像関係(computer vision)のライブラリ
openCV(microsoft,OSS,定番らしい
fastcv(qualcom
javaCV
androidCV
などなど

スマホ向けを意識してるやつのほうが軽くて速そうな先入観


・ffmpeg
これを使って映像をなんかできるみたい。定番らしい
ウィキぺによればlibavと分裂しセキュリティ問題で優位に立ったらしい

セキュリティを重要視してるのはいい事だなぁ…



20250101追記
この記事の投稿時2024年の8月からffmpegをとりあえずそのままconfigureしてmakeするが失敗し続けてたのに今日になって何故かコンパイルが通ったっていうメモ。なぜだろう
DVD FlickでDVDを作成すると、冒頭と最後がカクつく

# DVD FlickでDVDを作ると、動画の最初と最後がカクつく
[DVD Flick](https://www.dvdflick.net/download.php)は便利だ。無料でDVDのオーサリングができて、メニュー付きのDVDが作れる。
ただしどういうわけか、結婚式用のDVDを作っていたら、動画の最初と最後がカクつくというか、再生がゆっくりになるような現象が起きてしまった。

# 解決策
DVD Flick内の動画変換(エンコード)機能を使用するとこの現象が発生するように見えている。
よって別ソフト(Adobe Premiere Pro)で動画変換を行い、DVD Flickはあくまでオーサリング(メニュー作成とフォルダ構築)の用途に絞ることで、正常に再生できるDVDのイメージファイルを作成することができた。

## 用意するもの
[Adobe Premiere Pro](https://www.adobe.com/jp/products/premiere.html)
[DVD Flick](https://www.dvdflick.net/download.php)
[ImgBurn](https://www.imgburn.com/index.php?act=download)

## Premiere Proの手順
この手順を踏むことで、DVD Flick側の動画変換機能を迂回することができる
1. 動画ファイルを用意する。(Powerpointから書き出した動画ファイルは別要因でカクつく恐れがあるので、[こちらの記事](https://qiita.com/huzisuke/items/9aa641681a4881282926)に従って29.97fpsに変換すること)
2. 新規シーケンスの作成で、DSLR 30fpsを作成する
3. 作成したシーケンスに手順1の動画ファイルを貼り付ける
4. 「書き出し」タブ → 形式「MPEG2-DVD」
5. 「ビデオ」 → 「フィールドオーダー」を「プログレッシブ」に変更(式場にあるレベルのDVDプレーヤーならプログレッシブに対応してるはず。画質が綺麗。)
6. 同じく「ビデオ」 → 「縦横比」を「ワイドスクリーン 16:9」に変更(縦長で書き出して、DVD Flickでもとに戻します)
6. 「マルチプレクサー」→「基本設定」→「マルチプレクス」を「DVD」に変更 (映像と音を同一ファイルで書き出します)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426263/e078f1f2-31f9-f352-8ca5-d4871d843505.png)
5. 書き出し
 
## DVD Flickの手順
1. 起動
1. 画面上部「Project Settings」→ 「Video」タブ → 「Advanced」ボタン → 「Copy MPEG-2 streams」のチェクを入れる → 「Accept」
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426263/36c76153-4765-f6fa-a44d-f25391147ddd.png)
1. 「Burning」タブ → 「Burn project to disc」にチェックを入れる → Accept
1. 前章で書き出した動画ファイルをドラッグ&ドロップ
4. 追加されたトラックをダブルクリック
4. 「General」タブ → 「Target aspect ratio」を 「Widescreesn (16:9)」に変更
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426263/fd45606b-977d-bad7-e1d4-906d49dafe87.png)
4. 「Video sources」タブ → 「pixcel aspect ratio」を 「16:9」 に変更
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426263/18225595-3b9e-4124-5e43-f2e755fa6bb9.png)
4. 「Accept」をクリック
4. (メニューを追加する場合)画面上部 「Menu Settings」でお好きなメニューを選択
4. 画面下部の書き出し先フォルダを指定
4. 画面上部の「Create DVD」をクリック

## ImgBurnの手順
1. 起動する
1. 「Write image file to disc」をクリック
1. 「Source」→ 「Browse for a file」(フォルダに虫眼鏡アイコン) → DVD Flickで作成したISOファイルを選択
1. 左下の書き込み開始ボタン

# 終わりに
上記手順を踏むことで、冒頭と最後のカクつきが解消されたDVDが出来上がるはずである。
Javascript Tips

# loadイベントとは

[こちら](https://developer.mozilla.org/ja/docs/Web/API/Window/load_event)より
> load イベントは、ページ全体が、スタイルシートや画像などのすべての依存するリソースを含めて読み込まれたときに発生します。

とあるが、以下のhtmlの場合loadイベントが発火するときは
* 静的にhtmlで記載したタグのツリー構築完了
* イメージタグのURL先から画面読み込み完了
* <font color="Salmon">動的に追加される要素のツリー構築が完了してるかは未保障</font>

と思われる。loadイベント発火時に要素取れなかったりするので・・・

```html
<!DOCTYPE html>
<html lang="ja">
<head>
	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<title>Document</title>
</head>
<body>
	<h1>タイトル</h1>
	<img src="xxx">
	<p>vvvv</p>
	<script>※body以下に要素(タグ)を動的に生成するよ！</script>
</body>
</html>
```

MutationObserver使ってしっかりDOMの変化を監視するのが吉
WSL2にインストールしたtinygoでtinygo monitorをraspberry pi picoで実行

# WSL2にインストールしたtinygoでtinygo monitorを実行

どうしてもWSL2でtinygoを動かして、
rapberry pi pico相手に `tinygo monitor`を実行したかった。

備忘録としてメモをまとめる。

## 実行環境
- Windows 11
- WSL2 Ubuntu 22.04LTS
- golang 1.22.5
- tinygo 0.32.0

## 手順
### 1. golang, tinygoをインストール
### 2. ソースコードを作成
今回は下記 `sample.go`

```golang
package main

import "time"

func main() {
	for {
		println("hello world!")
		time.Sleep(time.Second)
	}
}
```

### 3.モジュール解決

`go mod init sample`
`go mod tidy`

### 4. コンパイル
`tinygo build -target=pico -o ./sample.uf2 ./sample.go`

### 5. rapberry pi picoにsample.uf2を書き込み
- PCにraspberry pi picoをBOOTSELを押しながら、書き込みモードでUSB接続
- エクスプローラーから先ほどコンパイルした「sample.uf2」をコピペ
    - エクスプローラーが自動でとじられる。

### 6. PC側にusbipdをインストール
https://learn.microsoft.com/ja-jp/windows/wsl/connect-usb

### 7. WSL2にシリアルポートをアタッチ
- 管理者権限でpowershellを起動
- USBシリアルデバイスとなっているデバイスを下記要領で探して、WSL2にアタッチする。

```powershell
PS C:\WINDOWS\system32> usbipd list
Connected:
BUSID  VID:PID    DEVICE                                                        STATE
4-2    2e8a:000a  USB シリアル デバイス (COM3)                                  Shared

PS C:\WINDOWS\system32> usbipd attach --wsl --busid  4-2
※BUSIDは読み替えること

```

### 8. WSL2側でシリアルデバイスを使えるようにする

```bash
※シリアルデバイスとして、扱われているか確認する。
ls -ltr /dev/ttyACM0 
crw-rw-rw- 1 root dialout 166, 0 Aug  4 02:54 /dev/ttyACM0

sudo chmod 777 /dev/ttyACM0

```

### 9. tinygo monitor
うまくいけば「hello world!」を確認できる

```bash
$ tinygo monitor -target=pico -baudrate=9600
Connected to /dev/ttyACM0. Press Ctrl-C to exit.
hello world!
hello world!
hello world!
```

### 備考
終わるときはpowershellでデタッチ

```powershell
 usbipd unbind --busid 4-2
 ※BUSIDは読み替え(4-2の箇所)
```

---
Powerpointの動画出力が30.30fpsとなり、DVDに焼くとカクつく

# パワーポイントの動画はなぜか30.30fpsで書き出される
結婚式で映す動画をパワポで作成していたところ、MP4ファイルのフレームレートが30.30fpsとなっていることに気づいた。
細かい説明は省くが、こういう時の動画ファイルは __本来29.97fpsとなっているべきである__。
PCでの再生は問題ないが、式場用のDVDに焼くとフレームレートが正しく処理されず映像のカクつきが発生した。
ぜったいPowerpointのバグだと思うが、4年ほど前から[指摘](https://answers.microsoft.com/ja-jp/msoffice/forum/all/powerpoint%E3%81%A7%E3%82%A8%E3%82%AF%E3%82%B9/79db76b1-114a-4d3d-ad37-607197554cf2)されていても直ってないので、Microsoftには期待せず自力で直す方法をここに書くことにした。
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426263/7b0f1f82-7eb4-c381-08b3-26e06d6eeb30.png)
_映像業界にいても30.30fpsは聞いたことのない数字..._

# 解決策
[Davinci Resolve](https://www.blackmagicdesign.com/jp/products/davinciresolve) という動画編集ソフトに動画を読み込み、29.97fpsで動画を書き出すことで映像がカクつくことなくDVDにすることができた。

## 手順
1. [Davinci Resolve](https://www.blackmagicdesign.com/jp/products/davinciresolve)をダウンロード・インストール (今回の内容なら無料版でOK)
2. 起動 → 「新規プロジェクト」
3. ウィンドウ上部「ファイル」 → 「新規タイムライン」 → 左下「プロジェクト設定を使用」のチェックを外す → 「フォーマット」タブ → 「タイムラインフレームレート」を "29.97" → 「作成」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426263/23827853-4b35-09ea-a854-1cf162ac2f5c.png)
4. 「タイムライン」ページ(画面下の横棒が3本重なったアイコン)をクリックし、Powerpointで書き出した動画ファイルをタイムライン上にドラッグ&ドロップする
  ※注意: 手順3を飛ばして手順4を実施すると、自動で30.30fpsのタイムラインが出来上がり、正しくフレームレートの変換ができなくなる

5. 「デリバー」ページ(画面下のロケットマーク)をクリックし、画面左上のファイル名や保存先を設定する
6. 画面左下「レンダーキューに追加」→ 画面右「すべてレンダー」

これで正しく29.97fpsとして書き出される

# DVDに焼く
この状態でお店に依頼してもいいし、フリーのDVDオーサリングソフトを使用しても良い。
DVD Flickを使用する場合は工夫するポイントがあったので、別記事に書くこととする

# 試したこと
## 直接DVD FlickでDVD作成
Powerointで書き出した動画をDVD Flickに読み込ませてDVDに焼いてみたが、うまくいかなかった。
DVD Flick(Ver 1.3.0.7)はエンコードもしくはオーサリングがうまくいっていないようで、DVD Flickに直接MP4を読み込ませてオーサリングをすると、動画の冒頭と最後がカクつく現象が確認された。(VOBファイルを直接再生した場合は問題ないのに、IFOファイルから再生するとカクつくのが謎ポイント)
解決策としては、何らかの方法であらかじめDVD形式の動画ファイル(mpeg2形式)を用意し、DVD Flick内のエンコーダーを使用しないでオーサリングすると、この冒頭と最後のカクつきが解消された。
ただし、Davinci Resolveはmpeg2形式の書き出しはできず、Premiere Proはmpeg2形式の書き出しはできるものの、30.30fps→29.97fpsのフレームレート変換が正しくできないことがわかった。

## Premiere Proでフレームレート変換
Adobe Premiere Proでフレームレート変換を試したが、うまくカクつきは解消されなかった。
やったことは、新規シーケンスで29.97fpsのシーケンスを作成し、そこにPowerpointの30.30fpsの動画を乗せて書き出す。
実装で学ぶフルスタックWeb開発 「4-2-2 フロントエンドからバックエンドのAPIを呼び出す」のエラー対応メモ

# 経緯
最近「[実装で学ぶフルスタックWeb開発 エンジニアの視野と知識を広げる「一気通貫」型ハンズオン](https://www.shoeisha.co.jp/book/detail/9784798179834)」という本で勉強をしています。
※第2版です。

途中までしか読んでいないものの、とてもいい本で勉強になります。
ただ、本日「4-2-2 フロントエンドからバックエンドのAPIを呼び出す」の部分で嵌ってしまいましたので、ここに対応メモを残しておきます。

# エラー内容
初回レンダリング後にNext.jsのフロントエンドからDjangoのバックエンドのAPIが呼び出され、「hello」の後の表示が変わるはずが、画像のようにエラーになり、表示が変わらない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3852913/7d72aa76-4e0c-8ce4-b291-8af34d8f6252.png)

# 原因と対処
### ポートの指定をする
フロントエンドはlocalhost:3000で動作しているのに対し、バックエンドはloalhost:8000で動作しています。
フロントエンドから単にAPIを呼び出すと、localhost:3000にアクセスしてしまいエラーになりますので、アクセスするポートを明示的に指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3852913/983bea37-098a-47ac-0fc5-98c5a8bce0ec.png)

フロントエンドのhello_backend/page.tsx でaxiosをインポートした次の行で設定をすればよいです。
```javascript:page.tsx
import axios from 'axios';
axios.defaults.baseURL = 'http://localhost:8000' //これを追加！
```
※Copilotに聞いたところ、axiosのインスタンスを作ってそっちの設定を変える方法もあるらしいです。

### CORS設定を変える
上記によってHTTP応答のステータスは200 OKとなりますが、実際にはコンテンツを読み込むことができず依然としてエラーのままになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3852913/526b6f46-f2ef-ab21-f1bc-5db4c8062648.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3852913/a678384f-ac89-cf63-f264-15831f2bd793.png)

これは、CORS（Cross Origin Resource Sharing）設定が原因です。
※Cross Origin Resource Sharing とは、別オリジンからのコンテンツを利用するかどうか決めたりします。　これがないと意図せず無関係のサーバにデータを送らせるような処理を実行してしまったりと、XSS（クロスサイトスクリプティング）やCSRF（クロスサイトリクエストフォージェリ）に弱くなってしまったりするそうです。

※今回は同じlocalhostに対するアクセスですが、アクセスするポートが違うので別オリジン扱いとなります。

対処法としては、以下をすればよいです。
(1) CORS関係のライブラリを入れる。
```bash
pip install django-cors-headers
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3852913/097602ff-5961-0515-684f-2384b64606a8.png)

(2) Djangoの設定ファイル（base.py）でライブラリをインストールしてミドルウェアとして指定するように追記する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3852913/0d7b0d28-03e1-ddbc-c04f-03f944495e06.png)
```javascript:base.py
INSTALLED_APPS = [
    'corsheaders',
    //～中略～
]

MIDDLEWARE = [
    "corsheaders.middleware.CorsMiddleware",
    //以下略
```

(3) 同じくbase.pyでCORSの設定変更をするように追記する。
```javascript:base.py
CORS_ALLOWED_ORIGINS = [
    "http://localhost:3000",
]
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3852913/8a6c2ee0-ae19-4e88-fed2-b5698232509e.png)

以上で動作するようになります！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3852913/690d420a-4345-51c7-e4b8-e66d19eb495b.png)

# 感想
Qiita 初投稿でしたので大変でした。。
間違いなどありましたらフィードバックもらえると嬉しいです。

# 参考リンク
https://www.cfxlog.com/django-drf-corsheaders/
テーブルから列を規則的に並べ替える

# はじめに
ExcelドカタCH さんのYouTubeチャンネルにて上げられていた下記動画のネタをワークシート関数のみで実装してみた記事です。

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

元データとなる人名リストは ChatGPT に頼んで作ってもらいました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8721/78cd21ae-f1d5-4024-f23c-a6aa7cea2049.png)

元データを格納したテーブルから、5行ごとに改列、4列ごとに改ページした表を作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8721/bd5c0dcd-1e38-eec7-0424-824529110358.png)

# 元データから行・列番号を作成する
元データから以下のようなテーブルを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8721/d536e80c-5694-a039-5b63-14f493c10af2.png)


元データから0始まりのインデックスを作成します。

```
[B1]
=MIN(テーブル1[index])

[index]
=IFERROR(VALUE(TEXTBEFORE([@列1], ".")), "")

[0index]
=[@index]-$B$1
```

5行ごとに改列して、4列ごとに改ページするような数列を計算します。
```
[D1]
5
[row]
=MOD([@0index], $D$1)

[E1]
4
[col]
=LET(_quo, QUOTIENT([@0index], $D$1), MOD(_quo, $E$1))

[F1]
=$D$1*$E$1
[page]
=QUOTIENT([@0index], $F$1)
```

`page, row, col` から `key` を、元データからよみがなを取り除いて `value` を作成します。
```
[key]
=[@page]&","&[@row]&","&[@col]

[value]
=LET(_tb, TEXTBEFORE([@列1], "("), TRIM(_tb))
```

# 規則的に並べ替えた表を作成
`key` を並べた表を作成、それを使ってテーブルから `value` を取ってくることで、テーブルで計算した規則通りに並べ替えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8721/e42e95b3-07db-4630-b39e-e3e0e2f04e10.png)

`page` と  `row` をそれぞれ並べたスピルを作成します。
２つのスピルの全組み合わせ（直積）を作成するため、TOCOL, TOROW を利用して文字列結合を行います。
```
[J3]
=LET(_uni, UNIQUE(テーブル1[page]), _flt, FILTER(_uni, NOT(ISERROR(_uni))), TOCOL(SORT(_flt)))

[K3]
=LET(_uni, UNIQUE(テーブル1[row]), _flt, FILTER(_uni, NOT(ISERROR(_uni))), TOCOL(SORT(_flt)))

[L3]
=TOCOL(TOCOL(J3#) & "," & TOROW(K3#))
```

行方向に `col` を並べたスピルを作成します。
行と列のスピルから文字列結合して `key` を並べた表を作成します。
```
[M2]
=LET(_uni, UNIQUE(テーブル1[col]), _flt, FILTER(_uni, NOT(ISERROR(_uni))), TOROW(SORT(_flt)))

[M4]
=L3# & "," & M2#
```

`key` のスピルから元テーブルの `value` をXLOOKUPします。
```
[R3]
=XLOOKUP(M3#, テーブル1[key], テーブル1[value], "-")
```

下記のように、改列パラメータを変えたり、途中データを削除しても、問題なく表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8721/8a587772-b6b2-c484-50d4-d7db8afbe4d9.png)
元美容師が職業訓練校で作成したDjango/HTMLポートフォリオをDjango/Reactで作り直してみる。Part.1

# 元美容師エンジニアが挑む、美容室予約システムのフルリニューアル計画

## はじめに

こんにちは。22歳から30歳まで美容師として働き、30歳を機にSES企業へ転職しました。現在は転職して1年になりますが、現場ではテスターとしての毎日を過ごしており、なかなか開発案件には入ることができず苦労しております。ただ現場とは別で最近自社のReact開発に携わる機会をいただきました。そんな中で転職前に通っていた職業訓練校で作成したDjangoアプリを思い出し、もう一度Reactを使って作り直そうと思いました。

## プロジェクトの背景

### このままでいいのか...
SES企業に転職し、テスターとしての毎日を過ごすなかで、開発に手を付ける機会も減ってしまいました。また自身に胸を張って提出できるポートフォリオがないことも引け目に感じていました。そんなタイミングで今回運良く自社でのReact開発に携わらせていただき、これをきっかけに新しくポートフォリオを作り直そうと決心しました！


### 既存のDjangoアプリ

SES企業への転職前、職業訓練校でDjangoを学び、そこで作成した美容室予約システムがあります。基本的な予約機能は実装されていましたが、こちらはフロントはHTMLだけで作成している為見栄えが悪く、レスポンシブデザインにも未対応という突貫工事で作成したアプリです。
また当時デプロイをしようとAWS等で試行錯誤をしていましたが、結局デプロイできないまま、転職をし、そのまま放置して産廃物のようにPCのプロジェクトフォルダに眠っていましたw

既存Djangoアプリのスクショ
![](https://storage.googleapis.com/zenn-user-upload/0ce204a88deb-20240803.png)
![](https://storage.googleapis.com/zenn-user-upload/34731693c72d-20240803.png)
![](https://storage.googleapis.com/zenn-user-upload/2dd904df4ed7-20240803.png)
![](https://storage.googleapis.com/zenn-user-upload/31c4d972aaa4-20240803.png)![](https://storage.googleapis.com/zenn-user-upload/29f09860a112-20240803.png)
![](https://storage.googleapis.com/zenn-user-upload/1c6082748600-20240803.png)

詳しい機能についてはここでは記載せず今後の実装で記事しようと思いますw


### なぜこのアプリを作ったか・美容業界での経験から感じた課題

7年間の美容師経験の中で、全国の美容室オーナーさんや美容師さんとコミュニケーションを取る機会が多くありました。そこで感じた2つの大きな課題がありました：

1. オーナー：「席が空いているので有効活用したい」
2. 美容師：「もっと好きな場所で好きな時間に自由に働きたい」

これらの声を聞き、技術で解決できないかと考え、当時このアプリを作成しようと思いました。

## プロジェクト概要

「SalonLink」と名付けたこのプロジェクトは、美容室の空き席を貸し出したいオーナーと美容師をマッチングするプラットフォームです。

## 機能の見直しと要件定義

既存のアプリを見直し、以下のような機能を定義しました

### 主要機能

1. ユーザー管理システム（サロンオーナー/美容師）
2. サロン管理機能（オーナー向け）
3. 予約システム（美容師向け）
4. カレンダー機能
5. 通知システム

### 新規追加したい機能

- チャット機能：サロンオーナーと予約をした美容師とのあいだでアプリ内でコミュケーションをとれるようなチャット機能を追加したい
- レスポンシブデザイン：既存の状態ではモバイル対応がなかったため、レスポンシブデザインへの対応も追加したい

## 使用予定の技術スタック

今回のリニューアルでは、以下の技術スタックを採用する予定です。

### フロントエンド

- React (TypeScript): 現状はHTMLのみで開発していたため、よりモダンなフロントエンドを作成するために現在自社で携わらせていただいているReactを選択しました

### バックエンド

- Django: もちろんDjangoです！ただ今回はフロントはReactで作成するため、Djangoはバックエンド側でのAPI作成がメインとなります

### その他

- Docker ：こちらずっと使ってみたいけどよくわからずに触れてこなかったので今回挑戦します！
- GitHub : こちらもなんとなくで使っているものランキング上位ですね。今回の経験のなかでしっかりとGithubについての知識を深めていきます

また、このプロジェクトの進捗や学んだことを、Qiitaで連載記事として共有していくことでアウトプット経験も積めたらと思っております

## まとめ

美容師としての経験とエンジニアとしてのスキルを融合させ、業界の課題解決(という名のポートフォリオ作成w)に挑戦します。このプロジェクトを通じて、技術的なスキルアップはもちろん、課題解決能力やアウトプット能力も伸ばしていきたいと考えています。

皆様からのフィードバックやアドバイスもどんどんお待ちしています！

一緒により良いサービスを作り上げていけたら嬉しいです！

次回は、Dockerを使った環境構築やGithubでのリポジトリ作成に挑戦するので、そちらを記事に書けたらなと思います。お読みいただきありがとうございました。
数値の比較（bc もしくは awk コマンド）

こんにちは。
bc もしくは awk コマンドを使い、数値の比較を行いました。

```console
$ inequality="2.0 > 1.0"
$ [ $(echo $inequality | bc) -eq 1 ] && echo $inequality
$ awk "BEGIN{exit ! ($inequality)}" && echo $inequality
2.0 > 1.0
```

なお整数同士の比較ならば、もっと率直となります：
```console
$ [ 2 -gt 1 ] && echo "2 > 1"
2 > 1
```
[Unity] クラス名を変更してもSerializeReferenceの参照が消えないようにする

## 結論
クラスに`UnityEngine.Scripting.APIUpdating.MovedFrom`属性を付与してから改名すればよさそう。

## 使用例
### 名前空間・アセンブリが変わらない場合
```
[UnityEngine.Scripting.APIUpdating.MovedFrom(true, sourceClassName: "HogeClass")]
```
`sourceClassName`に改名前のクラス名を指定する。

### 名前空間・アセンブリが変わる場合
```
[UnityEngine.Scripting.APIUpdating.MovedFrom(true, "HogeNamespace", "Assembly-Hoge", "HogeClass")]
```
同様に`sourceNamespace`や`sourceAssembly`に改名前の名称を指定すればOK。

## 参考
https://qiita.com/ruccho_vector/items/aaa976a09de6b2965501
[Python]システム同定用入力信号の生成

# 記事の内容
Pythonでシステム同定用入力信号の生成を行うサンプルスクリプト
作成する信号：ステップ入力、Chirp、白色ノイズ

# 参考情報
<a href="https://www.jstage.jst.go.jp/article/jacc/65/0/65_928/_pdf/-char/ja">積分器を含む非線形システム同定のための離散値入力信号</a>
<a href="https://www.jstage.jst.go.jp/article/sicetr/55/3/55_172/_pdf">機械学習によるディーゼルエンジン吸排気系の実時間MPC設計</a>

# サンプルスクリプト
```ruby:qiita.rb
import numpy as np
import matplotlib.pyplot as plt

# 入力信号の生成（入力信号:ステップ入力)
duration = 1  # 信号の継続時間 (秒)
sampling_rate = 1000  # サンプリングレート (Hz)
t = np.linspace(0, duration, int(sampling_rate * duration), endpoint=False)
step_time = 0.1 #ステップ時刻
step_signal = np.zeros_like(t)
step_signal[int(step_time  * sampling_rate):] = 1
#グラフ表示
plt.figure(figsize=(20, 8))
plt.plot(t, step_signal, label="step_signal")
plt.xlabel("t (s)")
plt.ylabel("Signal [-]")
plt.title("Randam signal")
plt.legend()
plt.grid(True)
plt.show()

# Chirp信号の生成
frequency_start = 10  # チャープ信号の開始周波数 (Hz)
frequency_end = 100 # チャープ信号の終了周波数 (Hz)
chirp_signal = np.sin(2 * np.pi * np.cumsum(np.linspace(frequency_start, frequency_end, len(t)) / sampling_rate))
# グラフ表示
plt.figure(figsize=(20, 8))
plt.plot(t, chirp_signal, label="chrip_signal")
plt.xlabel("t (s)")
plt.ylabel("Signal [-]")
plt.title("Signal")
plt.legend()
plt.grid(True)
plt.show()

# 白色ノイズの生成
duration = 1  # 信号の継続時間 (秒)
sampling_rate = 1000  # サンプリングレート (Hz)
t = np.linspace(0, duration, int(sampling_rate * duration), endpoint=False)
A = 1.0    # 振幅
white_noise_signal = 2*A*(np.random.rand(round(sampling_rate*duration))-0.5)
#グラフ表示
plt.figure(figsize=(20, 8))
plt.plot(t, white_noise_signal, label="white_noise")
plt.xlabel("t (s)")
plt.ylabel("Signal [-]")
plt.title("Signal")
plt.legend()
plt.grid(True)
plt.show()
```
# 実行結果
![出力例.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111514/11d410bf-06ad-0f0d-be63-d1633de0cd7e.png)
systemctl.serviceの自作と反映

## 概要
- ステージング環境用にAmazonLinux 2023に移動したが、pythonのFastAPIとphp のque workerのプロセス管理のために、systemctlを利用しようと考えた


## 設定内容
:::note warn
fastapiとしていますが、名称に関しては自由に置き換えてください
:::

```sh
sudo vim /etc/systemd/system/fastapi.service
```

```conf:/etc/systemd/system/fastapi.service
[Unit]
# サービスの説明
Description=FastAPI
# ネットワークが利用可能になった後にこのサービスを開始する
After=network.target

[Service]
# このサービスを実行するユーザー
User=ec2-user
# アプリケーションの作業ディレクトリ
WorkingDirectory=/home/ec2-user/python
# 実行するコマンド（仮想環境のPythonを使用してアプリケーションを起動）
ExecStart=/home/ec2-user/python/venv/bin/python /home/ec2-user/python/app.py

# プロセスが終了したら常に再起動する
Restart=always
# 再起動の間に10秒待機する
RestartSec=10

# 短時間での過剰な再起動を防ぐための制限
# 5分間（300秒）に最大5回まで再起動を試みる
StartLimitBurst=5
StartLimitIntervalSec=300

# 標準出力と標準エラー出力をジャーナルに送る
StandardOutput=journal
StandardError=journal

[Install]
# マルチユーザーモードで起動時に、このサービスを自動的に開始する
WantedBy=multi-user.target
```

## 設定の反映
```sh
# systemdにサービスファイルの変更を認識させる
sudo systemctl daemon-reload
# サービスを起動する
sudo systemctl start fastapi
# システム起動時に自動的にサービスを開始するように設定
sudo systemctl enable fastapi
# ステータスの確認
sudo systemctl status fastapi
```

## ざつまとめ
簡単にプロセス管理ができるので、結構ありと感じた
【GitHub】リポジトリを複製する方法

ターミナルで以下のコマンドを実行し、複製元のリポジトリをクローンします。

```terminal
git clone --bare https://github.com/UserName/old-repo.git
```

複製先のリポジトリを作成し、以下のコマンドを実行します。

```terminal
$ cd old-repo.git
$ git push --mirror https://github.com/UserName/new-repo.git
```

不要なファイルを削除します。

```terminal
cd ..
rm -rf old-repo.git
```
【副業】LP制作で収入を得るまで_3日目


3日目
以下の教材で学習します。
[①ノーコードで超速WEB制作　STUDIO学習完全パック（初級編・中級編・上級編）](https://www.udemy.com/course/studio-complete-pack/)

## ボックスで編集できる機能
### 角丸
![スクリーンショット (22).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3838275/ec324be0-1fa6-0417-bf80-c3c96dcad541.png)

方法１　ボックスの数値から選ぶ(画像参照)
方法２　ボックスの角をつかんでドラッグ

Point
50%に設定すると綺麗な円になる

### 透明度
ボックスメニューの不透明度から(画像参照)
1～0で設定する
0に近づくほど透明になる

Point
中の子要素も透明度が適用されることに注意
背景色など一部分の透明度を変えたいときは、塗りの色部分(RGBA)に透明度を設定する
あとは、アニメーションのホバーなどにもよく使われる

### カラー(単色)
![スクリーンショット (24).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3838275/649ab2fb-9b36-7551-e163-5742634c074b.png)

ボックスメニューの塗りから(画像参照)
色の変更方法
1.色のバーから
2.HEXコードを設定する(白なら#FFFFFF)
3.HEXコード右にある矢印からRGBAを設定する
4.カラーパレット

Point
同じ色を使いまわしたいとき＋で色を記憶できる

### カラー(グラデーション)
切り替えでグラデーション用の塗りになる
グラデーションの配分や向きも設定できる

### 枠線
![スクリーンショット (23).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3838275/364241af-a225-e835-6aea-338ba07ccc73.png)
全体に対して枠線をつけるときは左を選択し、個別に対しては右を選択

### シャドウ
![スクリーンショット (25).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3838275/d978ef38-2529-888c-6196-70733d0fe241.png)
X：横のずれ
Y：縦のずれ
Blur(ブラー)：ぼかし度
Spread(スプレッド)：広がり
Inset：影を内側に配置

Point
ボックスをドラッグしても影の配置を変更可能
ロックあり：XとYとBlurが変更
ロックなし：XとYが変更

### テキストの編集
![スクリーンショット (26).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3838275/e34ba904-f3c4-3cae-4c16-489d79b640de.png)
左のメニューからTを選ぶ
ドラッグドロップでもテキスト追加できる

### 画像の追加と編集
![スクリーンショット (27).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3838275/63682410-450a-c4f1-1c8b-e47cd1eb4233.png)
画像を挿入すると新しく画像タブができる

明るさ: 画像の明るさを調整
コントラスト: 明るい部分と暗い部分の差を調整
鮮やかさ: 色の鮮やかさや彩度を調整
モノクロ: 画像を白黒に変換
セピア: 画像に古びた茶色っぽいフィルターをかける
ぼかし: 画像をぼかして、シャープさを減少させる

配置：画像の表示箇所の高さを調整する
リピート：ボックス内を同じ画像で埋め尽くすことができる


サイズ
cover：横幅が最大になるように設定される
contain：立幅が収まるように横幅が調整される
px：指定した横幅のピクセルになるように調整される
%：pxのパーセント版

画像のboxをimgする
画像の縦横比を保ったまま、画像サイズを変更できる

Point
画像は、「画像のBox」と「画像自体」が別々の大きさとして扱われる
imgにすると画像の編集ができなくなる
→画像の上に文字などを置けなくなる

### アイコンの追加と編集
アイコンのメニューが追加され、サイズと色が編集できる

### グルーピング
要素をまとめる
まとめたい要素を`shift`で選択して、`ctr + g`
この操作により「まとめた要素」に対して「一つ親の要素」ができる

### 相対的配置(position: relative;)
定義
サイズの変更や他のボックスの位置の変更によって自分自身も影響されて
要素の幅や位置が変更してくれるような配置の設定

机の上のノートを少し動かすと、机の上にノートが置いてあったと思うイメージ

### 固定配置(position: fixed;)
![スクリーンショット (28).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3838275/3d34f6ec-53fd-d2c1-bf55-2dc8e0b68b3d.png)
定義
画面のスクロールに関係なく、ずっと固定して配置される
→ヘッダーなど

壁にポスターを貼る。部屋の中で移動してもポスターは動かないイメージ

### 絶対的配置(position: absolute;)
画面に対して固定するのが固定配置で、
任意のボックスに対して固定するのが、絶対的配置

箱にシールを貼る。箱を動かしたらシールは箱と一緒に動くイメージ

### 重ね順(z-index)
配置の横で設定できる(画像参照)

Point
ヘッダーは４や５に設定しておくと後で編集が楽
### プロジェクトの公開
右上から
独自ドメインを取得する際は、お名前ドットコムなどの別作業が必要になる

---
編集時間：3時間
【趣味エンジニア】MongoDB with mongoose の基礎

# mongoDBのインストール
### 今回は、mongodb-communityをhomebrewでインストールする
まずは、homebrewでmongodbのフォーミュラ(formula)をダウンロード
```
brew tap mongodb/brew
```

### mongodb-communityをインストール 
```
brew install mongodb-community
```

# MongoDBへの接続
```
brew services start mongodb-community //起動
brew services stop mongodb-community //停止
brew services restart mongodb-community //再起動
```

## データベースへのアクセス
```javascript:app.js
//mongoDBへアクセス
const mongoose = require('mongoose');

//connect mongoDB by mongoose
mongoose.connect( dbConfig.url,
    {
    
    })
    .then(() => {
        console.log('MongoDBコネクションOK！！');
    })
    .catch(err => {
        console.log('MongoDBコネクションエラー！！！');
        console.log(err);
        process.exit();
    });
```

# スキーマの作成 / モデルの作成
```javascript:models / user.js
//このスキーマの作成はMongoDBの機能ではなく、mongooseの機能。
const { Schema } = mongoose;

//スキーマの作成
const userSchema = new Schema({
    username: {
        type: String,
        required: true,
        unique: true
    },
    password: {
        type: String,
        required: true,
        unique: true
    },
    email: {
        type: String,
        required: true,
        unique: true
    },
    ingredients: {
        type: [],
        default: undefined
    }
});

//モデル作成
module.exports.User = mongoose.model('User', userSchema);
```
***
ここまでで、databaseにはまだデータは作られていない。これを使ってNewでインスタンス(instance)を作成し、MongoDBへのデータの保存、取得、編集、削除などを行う。
***


```javascript:app.js
const { User } = require('./models/user'); //User - Models

//データベースを新たに作成時など作成。
const user = new User({ email, username, ingredients: defaultIngredients });
```

## データを扱うプログラム
CRUD - C
```javascript
const newUser = new User({ email, username, ingredients: defaultIngredients });
newUser.save();
```

CRUD - R
```javascript
const getUser1 = User.findOne();
const getUser2 = User.findById();
const getUser3 = User.findOne();
```

CRUD - U
```javascript
await User.findByIdAndUpdate();
```
CRUD - D
```javascript
await User.deleteOne({------});
await User.deleteMany({------});
```
WindowsでのPythonスクリプト実行時のUTF-8問題と解決策

## 問題の根本

WindowsでのPythonスクリプト実行時、システムのデフォルトエンコーディング（多くの場合Shift-JIS）とUTF-8で書かれたスクリプトとの間で不一致が発生し、文字化けや実行エラーを引き起こします。

## 解決策：UTF-8 Mode (PEP 540)

Python 3.7で導入されたUTF-8 Modeは、この問題に対する主要な解決策です。

### 主な特徴

1. Pythonのデフォルトエンコーディングをシステム設定に関わらずUTF-8に設定
2. ファイルシステムエンコーディングは変更されない
3. 新しく開かれるファイルのデフォルトエンコーディングがUTF-8になる

### 有効化方法

- 環境変数 `PYTHONUTF8=1` を設定
- コマンドライン引数 `-X utf8` を使用

## 影響

1. Pythonスクリプトファイル（.py）: すべてUTF-8として読み込まれる
2. コンパイル済みライブラリ（.pyc, .pyd, .so）: UTF-8 Modeの影響を受けない
3. 外部ファイルの読み書き: 明示的なエンコーディング指定が必要

## 結論

1. UTF-8 Modeは、WindowsでのPythonスクリプト実行時のエンコーディング問題を大幅に軽減します。
2. ほとんどの場合、Pythonスクリプト（ライブラリスクリプトを含む）のエンコーディング不一致は解決されます。
3. コンパイル済みライブラリや外部ファイルの扱いには依然として注意が必要です。
4. 可能な限りすべてのスクリプトをUTF-8で保存し、UTF-8 Modeを有効にして実行することが推奨されます。
C_TS422_2021 SAP Certified Application Associate SAP S/4HANA Production Planning and Manufacturing対策（70/100）

【70日目】
トピック 8：SAPS/4HANAの製造指図（2/15）

#### ※申し訳ございませんが、飛ばしてしまっておりました。

≪問題70≫
計画手配から製造指図を登録しようとしています。どの方法を使用できますか。
（２つ選択）
□部分変換
□個別発行
□一括変換
□複合変換

≪解答≫
■部分変換
□個別発行
■一括変換
□複合変換

≪解説≫
◆計画手配は、資材所要量計画で登録され、製造指図に変換されます。計画手配から製造指図への変換は、一括変換、個別変換、または部分変換を使用できます。一括変換は、バックグラウンド処理で実行できます。
◆計画手配を製造指図に変換する際に、従属所要量（構成品目）および能力所要量が新しい製造指図に再割り当てされます。従属所要量は入出庫予定明細になります。
◆計画手配から製造指図への変換には、一括変換、個別変換、または部分変換の3つの方法がありますが、問題70の選択肢では「個別発行」があり、これは計画手配から製造指図への変換方法とは異なります。
◆問題の選択肢には「部分変換」と「一括変換」が含まれており、これらは計画手配から製造指図への変換方法として正しいものです。一方、「個別発行」は通常、製造指図に関連する具体的な実行アクションを指すものであり、計画手配の変換方法としては該当しません。
C_TS422_2021 SAP Certified Application Associate SAP S/4HANA Production Planning and Manufacturing対策（83/100）

【83日目】
トピック 8：SAPS/4HANAの製造指図（15/15）

≪問題83≫
製造指図では、以下のどの自動化オプションまたは一括処理を使用できますか。
（２つ選択）
□製造指図を技術的完了に自動設定する製造計画プロファイルを使用できる。
□製造指図のPPマスタデータを読み込む一括処理を使用できる。
□確認を通じてリワーク指図を自動生成するトリガポイントを使用できる。
□製造指図を技術的完了に設定する一括処理を使用できる。

≪解答≫
□製造指図を技術的完了に自動設定する製造計画プロファイルを使用できる。
□製造指図のPPマスタデータを読み込む一括処理を使用できる。
■確認を通じてリワーク指図を自動生成するトリガポイントを使用できる。
■製造指図を技術的完了に設定する一括処理を使用できる。

≪解説≫
◆複数の製造指図を自動的または同時に処理する必要がある場合があります。このために、自動化オプションや一括処理機能を使用することができます。
◆主な一括処理機能は以下のとおりです。
（1）日程計画
（2）原価計算
（3）発行
（4）現場帳票の印刷
（5）品目利用可能在庫確認
（6）能力所要量の登録
（7）確認
（8）技術的完了
（9）ユーザステータスの設定/削除
◆主な自動化オプションは以下のとおりです。
（1）確認時にトリガポイントを使用して、リワーク製造指図を登録する。
（2）確認時にトリガポイントを使用して、作業を発行する。
（3）発行時に製造計画プロファイルを使用して、指図を印刷する。
（4）確認時に品目マスタ、作業区、または作業手順を使用して、出庫転記を行う（バックフラッシュ）。
（5）確認時に製造計画プロファイルを使用して、入庫転記を行う。
（6）登録時に特殊調達を使用して、多段階一括指図を登録する。
ABC365参加記録　by Python

# リアルタイムに解けた問題

## [A - Leap Year](https://atcoder.jp/contests/abc365/tasks/abc365_a)

### 問題文
1583以上2023以下の整数$Y$が与えられます。
西暦$Y$年の日数を求めてください。
なお、制約の範囲内では西暦$Y$年の日数は以下の通りです。
- $Y$が4の倍数でない年は365日
- $Y$が4の倍数で、かつ100の倍数でない年は366日
- $Y$が100の倍数で、かつ400の倍数でない年は365日
- $Y$が400の倍数である年は366日


### 制約
- $Y$は1583以上2023以下の整数


### アルゴリズム
制約の通りにif文を作成。

### ソースコード
``` python
Y = int(input())

if Y % 400 == 0:
  print(366)
elif Y % 100 == 0 and Y % 400 != 0:
  print(365)
elif Y % 4 == 0 and Y % 100 != 0:
  print(366)
elif Y % 4 != 0:
  print(365)
```

## [問題名](問題URL)

### 問題文
長さ$N$の整数列$A = (A_{1}, ....A_{N})$が与えられます。ここで、$A_{1}, A_{2},....A_{N}$は相異なります。
$A$の中で二番目に大きい要素は$A$の何番目の要素でしょうか。

### 制約
- $2 \leq N \leq 100$
- $1 \leq A_{i} \leq 10^{9}$
- $A_{1}, A_{2},....A_{N}$は相異なる
- 入力される数値は全て整数

### アルゴリズム
for文とif文を組み合わせて地道に数える。

### ソースコード
``` python
N = int(input())

A = list(map(int, input().split()))

first = -1
first_num = -1
second = -1
second_num = -1

for i in range(N):
  if first == -1:
    first = A[i]
    first_num = i
  elif A[i] < first and second == -1:
    second = A[i]
    second_num = i
  elif A[i] > first:
    second = first
    second_num = first_num
    first = A[i]
    first_num = i
  elif A[i] < first and A[i] > second:
    second = A[i]
    second_num = i
  else:
    continue

print(second_num + 1)


```