OmniAICreator/Qiita-1.07M huggingface dataset:
wslで、最小のカーネルをコンパイル その41

# 概要
wslで、kernel.elfのコンパイル、やってみた。
さらに、上のkernel見つけたので、コンパイルしてみた。
俺言語インタープリタを、移植してみた。
キー入力する機能を実装して、じゃんけん、やってみた。

# 写真

![スクリーンショット 2024-03-31 082731.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/02b6684b-d390-0e24-84bb-f78996608ce2.png)


# サンプルコード

```
void facto() {
	unsigned char cc;
	char ch;
	if (RD(Ptr) == '\0')
	{
		Val = 0;
		return;
	}
	if (getnm2())
		return;
	cc = RD(Ptr++);
	if (cc == '?')
	{
		putstr("> ");
		ch = api_getkey(1);
		if (ch == 0x31)
			Val = 1;
		else if (ch == 0x32)
			Val = 2;
		else if (ch == 0x33)
			Val = 3;
		else
			Val = 0;
	}
	else if (cc == '$')
	{
		Val = 55;
	}
	else if (cc == '!')
	{
		Val = _rand() % 3 + 1;
	}
	else
	{
		Ptr--;
		getvr2();
		Val = RD(Adr2);
		Ptr++;
	}
}

```

以上。
[Nest.js] class-validatorを使ってカスタムバリデーションを作成するには

## 概要
Nest.jsでバリデーションを行う際はdtoを作成し、class-validatorのデコレータを使って行うのが一般的です
しかし、class-validatorが提供しているデコレータだけでバリデーションできないケースがあるのでカスタムバリデーションを作成する方法について解説します

## 前提
- Nest.jsのアプリケーションを作成済み

## ディレクトリ構成
```
└── src
    ├── app.controller.ts
    ├── app.module.ts
    ├── app.service.ts
    ├── common
    │   └── validators.ts
    ├── main.ts
    └── user
        ├── dto
        │   └── verifyUser.dto.ts
        ├── user.controller.ts
        ├── user.module.ts
        └── user.service.ts
```

## dtoの作成
dtoを作成する際は以下のように例えばIsStringやMaxLengthなどのデコレータを使用するのが一般的です
今回は8桁の数字のみを許容するバリデーションを作成したいのですがclass-validatorが提供しているデコレータだけでは実現できません
そこで後述するカスタムバリデーションを作成して、デコレータとして適用します
その際は以下のようにValidateデコレータ内にIsEmployeeNumberクラスを引数として入れた状態で記載します

```dto/verifyUser.dto.ts
import { IsString, MaxLength, Validate } from 'class-validator';
import { ApiProperty } from '@nestjs/swagger';
import { IsEmployeeNumber } from '../../common/validators';

export class VerifyUserDto {
  @ApiProperty()
  @IsString()
  @Validate(IsEmployeeNumber)
  employee_number: string;

  @ApiProperty()
  @IsString()
  @MaxLength(255)
  password: string;
}

```

## カスタムバリデーションの作成
カスタムバリデーションを作成する際はValidatorConstraintInterface内にvalidateとdefaultMessageの処理を実装する形で作成します
validateメソッドに適用したいバリデーションを作成し、defaultMessage内にバリデーションエラー時のエラーメッセージを記載します

```common/validators.ts
import {
  ValidatorConstraint,
  ValidatorConstraintInterface,
} from 'class-validator';

@ValidatorConstraint({ name: 'isEmployeeNumber' })
export class IsEmployeeNumber implements ValidatorConstraintInterface {
  validate(text: string) {
    // 8桁の数字のみを許容する正規表現パターン
    const pattern = /^\d{8}$/;
    return typeof text === 'string' && pattern.test(text);
  }

  defaultMessage() {
    return '社員番号は8桁の数字でなければなりません';
  }
}

```

## 実際に実行してみよう！
今回は以下のように社員番号とパスワードを使ってユーザが一致するかどうかの簡単なAPIを作成しています
先ほど作成したバリデーションを適用するためにVerifyUserDtoを使用します

```user.controller.ts
import { Controller, HttpCode, HttpStatus } from '@nestjs/common';
import { ApiTags } from '@nestjs/swagger';
import { Post, Body } from '@nestjs/common';
import { UserService } from './user.service';
import { VerifyUserDto } from './dto/verifyUser.dto';

@ApiTags('users')
@Controller('users')
export class UserController {
  constructor(private readonly userService: UserService) {}
  
  @Post('verify_user')
  @HttpCode(HttpStatus.OK)
  verify_user(@Body() verifyUserDto: VerifyUserDto) {
    return this.userService.verify_user(verifyUserDto);
  }
}
```

以下のように8桁の数字以外を入力した状態でAPIを実行した際に作成したカスタムバリデーションが適用されたら成功です

![スクリーンショット 2024-03-30 21.53.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625980/6e4bfa8c-2275-e25f-dc52-bd7098f0aba4.png)

![スクリーンショット 2024-03-30 21.54.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625980/3c2efb75-fe75-2c7c-1861-37dc787e1823.png)

## 参考
https://github.com/typestack/class-validator?tab=readme-ov-file#custom-validation-classes

https://www.npmjs.com/package/class-validator#custom-validation-classes
Mac(M1)でrbenv install時に BUILD FAILEDになった場合の対処法

### 概要
`brew upgrade rbenv ruby-bild`してから、`rbenv install 3.1.4`をしたら、ruby 3.1.4 のインストールに失敗。
BUILD FAILEDのログは以下のような感じ。
```sh
# `rbenv install 3.1.4` build failure log
            
readline.c:1903:37: error: use of undeclared identifier 'username_completion_function'; did you mean 'rl_username_completion_function'?
                           rl_username_completion_function);
                           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                           rl_username_completion_function
readline.c:79:42: note: expanded from macro 'rl_username_completion_function'
# define rl_username_completion_function username_completion_function
                                         ^
/usr/local/opt/readline/include/readline/readline.h:494:14: note: 'rl_username_completion_function' declared here
extern char *rl_username_completion_function (const char *, int);
^
1 error generated.
```

### 原因
PCはARMなのに、x86_64用のHomebrewが入っているのがよくないらしい。
アーキテクチャの齟齬がエラーの原因では、と。

### 解決策
- [手っ取り早い方法](https://github.com/rbenv/ruby-build/discussions/1853#discussioncomment-5269893)：エラーを黙らせてインストール（↓ `arch -x86_64`いらないかも？）
    `RUBY_CFLAGS="-Wno-error=implicit-function-declaration"  arch -x86_64 rbenv install 3.1.4`

<br>

- [正攻法](https://github.com/rbenv/ruby-build/discussions/1853#discussioncomment-8213073)
    1. 現状の確認
        - `which -a brew` → `/usr/local/bin/brew`
        - `brew config` → `macOS: 13.6.3-x86_64`     　となっているのを確認
        <br>
    2. Homebrewの[アンインストール](https://github.com/homebrew/install#uninstall-homebrew)
        ```sh
        sudo NONINTERACTIVE=1 /bin/bash -c "$(curl -fsSLhttps://raw.githubusercontent.com/Homebrew/install/HEAD/uninstall.sh)"
        ```
        <br>
    3. Homebrewの[再インストール](https://brew.sh/)
        ```sh
        /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
        ```
        <br>
    4. 結果を確認
        - `which -a brew` → `/opt/homebrew/bin/brew`
        - `brew config` → `macOS: 13.6.3-x86_64`       　　　となっているのを確認　:tada: 
        <br>
    5. `rbenv install 3.1.4`　成功 :sparkles: 
  


### 参考
- [手っ取り早い方法](https://github.com/rbenv/ruby-build/discussions/1853#discussioncomment-5269893)
- [正攻法](https://github.com/rbenv/ruby-build/discussions/1853#discussioncomment-8213073)
pio(platform.io)でM5Stack ATOM Liteに書き込む

Arduino IDEで書き込む方法がメジャーだけど遅いので、pioで書き込んでみた。

# とりあえずプロジェクトの作成
ボードはM5Stack ATOMとかドンピシャなのがあったはず

# M5Stack ATOM用のライブラリを入れる
pioのHomeにLibrariesってとこがあるのでそこにいってM5 ATOMと検索
出てきたやつをさっき作ったプロジェクトにインストール
ネットの記事ではここまでしか書いてなかったけどこのままだとFastLED.hも入れろ!みたいなエラーが出るので
M5 ATOMライブラリを入れたときと同様、pioHome,LibrariesといってFastLEDと検索、さっき作ったプロジェクトにインストールする
# うまく行っていればplatform.iniが次のようになっているはず
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3758601/0b75b022-b244-2fc4-4c37-7858cadbf90d.png)
直接こういうふうに書いても行けるかも?

次のリンクでは画像付きでライブラリのインストール方法が解説されているので参考にすると良いかも
[PlatformIO IDE for VSCode へのArduinoライブラリのインストール](http://kunsen.net/2018/07/29/post-709/)

# ボタンを押すとLEDが白から青になるサンプルプロジェクト
```
#include <M5Atom.h>

CRGB dispColor(uint8_t r, uint8_t g, uint8_t b) {
  return (CRGB)((r << 16) | (g << 8) | b);
}

void setup() {
    // 本体初期化（UART有効, I2C無効, LED有効）
  M5.begin(true, false, true);
  // LED全消灯（赤, 緑, 青）
  M5.dis.drawpix(0, dispColor(0, 0, 0));
}

void loop() {
  M5.update();  //本体のボタン状態更新

  if (M5.Btn.isPressed()) {         //ボタンが押されていれば
    M5.dis.drawpix(0, dispColor(0, 0, 255)); //LED（指定色）
  } else {                        //ボタンが押されてなければ
    M5.dis.drawpix(0, dispColor(20, 20, 20));    //LED（白）
  }
  delay(100);   //100ms待機  
}
```
M5Stack ATOM Liteの上のボタンを押している間だけ青になるはず!

# M5Stack BASICでもpioで書き込める
ボードはM5stack-core-esp32にする
M5Stackライブラリが有るので先ほどと同様の手順でいれる
デフォルトのmain.cppには
``` c++
#include <Arduino.h>
```
みたいな行が追加されているが、削除しても動いた
つまりArduino IDEに書いていたプログラムのまんまで大丈夫!
# M5StackでPS4Controller.hを用いたプロジェクトを作る場合
新たにPS4_Controller_Hostというライブラリを追加し
プロジェクトの最初に以下のように書くとArduinoIDEで動いたプログラムが動くようになる。
```c++
#include <PS4Controller.h>
#include <Wire.h>
#include <SPI.h>
#include <FS.h>
#include <SPIFFS.h>
#include <SD.h>
#include <HTTPClient.h>
```
JavaScript で文字列を Shift_JIS に変換

## Encoding API

[TextEncoder](https://developer.mozilla.org/ja/docs/Web/API/TextEncoder) で変換すれば… **`utf-8` のみ** …だと？…((((；ﾟДﾟ)))))))  

> ### TextEncoder: encoding プロパティ
> 
> 持つことができる値は `utf-8` のみです。  
> 

https://developer.mozilla.org/ja/docs/Web/API/TextEncoder/encoding  

[TextDecoder](https://developer.mozilla.org/ja/docs/Web/API/TextDecoder) で逆変換はできるのに… (´・ω・｀)  

> ### TextDecoder: encoding プロパティ
> 
> 日本語の古いマルチバイトエンコーディング: `euc-jp`, `iso-2022-jp`, `shift-jis`  
> …  

https://developer.mozilla.org/ja/docs/Web/API/TextDecoder/encoding  

## Decoder があれば Encoder もできる！

```js
const table = { '\u00a5': 0x5c, '\u203e': 0x7e, '\u301c': 0x8160 };

const decoder = new TextDecoder('shift-jis');

for (let i = 0x81; i <= 0xfc; i++) {
    if (i <= 0x84 || i >= 0x87 && i <= 0x9f || i >= 0xe0 && i <= 0xea || i >= 0xed && i <= 0xee || i >= 0xfa) {
        for (let j = 0x40; j <= 0xfc; j++) {
            const c = decoder.decode(new Uint8Array([i, j]));
            if (c.length === 1 && c !== '\ufffd' && !table[c]) {
                table[c] = i << 8 | j;
            }
        }
    }
}

function encode(content) {
    let buffer = [];
    for (let i = 0; i < content.length; i++) {
        const c = content.codePointAt(i);
        if (c > 0xffff) {
            i++;
        }
        if (c < 0x80) {
            buffer.push(c);
        }
        else if (c >= 0xff61 && c <= 0xff9f) {
            buffer.push(c - 0xfec0);
        }
        else {
            const d = table[String.fromCodePoint(c)] || 0x3f;
            if (d > 0xff) {
                buffer.push(d >> 8 & 0xff, d & 0xff);
            }
            else {
                buffer.push(d);
            }
        }
    }
    return Uint8Array.from(buffer);
};
```

## いくぞ！ 9, 3, 2, ダァーッ！

```js
const shiftjis = encode('JavaScript で文字列を Shift_JIS に変換');

console.log(shiftjis);
// Uint8Array(38) [74, 97, 118, 97, 83, 99, 114, 105, 112, 116, 32, 130, 197, 149, 182, 142, 154, 151, 241, 130, 240, 32, 83, 104, 105, 102, 116, 95, 74, 73, 83, 32, 130, 201, 149, 207, 138, 183, buffer: ArrayBuffer(38), byteLength: 38, byteOffset: 0, length: 38, Symbol(Symbol.toStringTag): 'Uint8Array']

console.log(decoder.decode(shiftjis));
// JavaScript で文字列を Shift_JIS に変換
```

ではまた！
wslで、最小のカーネルをコンパイル その40

# 概要
wslで、kernel.elfのコンパイル、やってみた。
さらに、上のkernel見つけたので、コンパイルしてみた。
俺言語インタープリタを、移植してみた。
キー入力する機能を実装して、じゃんけん、やってみる。
構想編

# 方針

- 数字キー１から９を入力
- 「?」で、キー入力
- 「!」で、乱数1,2,3

# じゃんけんのサンプルコード

```
10 ?="1 2 3 "
20 b=?
30 a=!
40 #=a=1*80
50 #=a=2*120
60 #=a=3*160
70 #=10
80 #=b=1*200
90 #=b=2*240
100 #=b=3*220
110 #=10
120 #=b=1*220
130 #=b=2*200
140 #=b=3*240
150 #=10
160 #=b=1*240
170 #=b=2*220
180 #=b=3*200
190 #=10
200 ?="aiko"
210 #=10
220 ?="kati"
230 #=10
240 ?="make"
250 #=10



```
wslで、最小のカーネルをコンパイル その39

# 概要
wslで、kernel.elfのコンパイル、やってみた。
さらに、上のkernel見つけたので、コンパイルしてみた。
コンソールが小さいので、大きくしてみた。

# 写真

![スクリーンショット 2024-03-30 172010.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/e4b66cfc-4430-c3e2-6913-d004037db5a8.png)

# サンプルコード

```
struct SHEET * open_console(struct SHTCTL * shtctl, unsigned int memtotal) {
	struct MEMMAN * memman = (struct MEMMAN *) MEMMAN_ADDR;
	struct SHEET * sht;
	unsigned char * buf;
	sht = sheet_alloc(shtctl);
	buf = (unsigned char *) memman_alloc_4k(memman, 512 * 365);
	sheet_setbuf(sht, buf, 512, 365, -1);
	make_window8(buf, 512, 365, "console", 0);
	make_textbox8(sht, 8, 28, 496, 328, COL8_000000);
	sht->task = open_constask(sht, memtotal);
	sht->flags |= 0x20;
	return sht;
}


void cons_newline(struct CONSOLE * cons) {
	int x,
		y;
	struct SHEET * sheet = cons->sht;
	struct TASK * task = task_now();
	if (cons->cur_y < 28 + 320)
		cons->cur_y += 16;
	else
	{
		if (cons->sht != 0)
		{
			for (y = 28; y < 28 + 320; y++)
			{
				for (x = 8; x < 8 + 480; x++)
					sheet->buf[x + y * sheet->bxsize] = sheet->buf[x + (y + 16) * sheet->bxsize];
			}
			for (y = 28 + 320; y < 28 + 336; y++)
			{
				for (x = 8; x < 8 + 480; x++)
					sheet->buf[x + y * sheet->bxsize] = COL8_000000;
			}
			sheet_refresh(sheet, 8, 28, 8 + 480, 28 + 336);
		}
	}
	cons->cur_x = 8;
	if (task->langmode == 1 && task->langbyte1 != 0)
		cons->cur_x += 8;
}
```

以上。
wslで、最小のカーネルをコンパイル その38

# 概要
wslで、kernel.elfのコンパイル、やってみた。
乱数、見つけたので、実験してみた。

# サンプルコード

```
#include <stdio.h>

#define RAND_INIT 	99
#define _UINT_MAX 	4294967295

unsigned int __last_rand = RAND_INIT;

void _rand_seed(unsigned int x) {
	__last_rand = x;
}
unsigned int rand() {
	static unsigned int a = 0x41c64e6d;
	static unsigned int b = 0x6073;
	__last_rand = (a * __last_rand + b) % (_UINT_MAX / 2);
	return __last_rand;
}

int main(void) {
    printf("%d \n", rand() % 3);
    printf("%d \n", rand() % 3);
    printf("%d \n", rand() % 3);
    printf("%d \n", rand() % 3);
    printf("%d \n", rand() % 3);
    printf("%d \n", rand() % 3);
    printf("%d \n", rand() % 3);
    int i = 0;
	while (i < 4)
	{
		if (rand() % 2 == 0)
		{
			printf("zun ");
			i++;
		}
		else
		{
			printf("doko ");
			i = 0;
		}
	}
	printf("doko kiyosi!!");

    return 0;
}

```

# 実行結果

```
0 
2 
2 
0 
0 
1 
1 
doko doko zun zun doko zun doko zun doko doko doko zun zun doko zun doko doko doko zun zun zun doko doko doko zun doko zun doko zun doko zun zun zun zun doko kiyosi!!


```


以上。
for文の種類と使い分け

JavaScriptにはfor文に種類があるので種類と使い方をまとめます。

#### for文
```js
const object = [1, 2, 3];

for (let i = 0; i < object.length; i++) {
  console.log(object[i]);
}
// 1
// 2
// 3
```
基本のfor文。みなさんも知ってるやつです。


#### for/of文
```js
const object = { a: 1, b: 2, c: 3 };

for (const element of Object.keys(object)) {
  console.log(element);
}
// "a"
// "b"
// "c"

for (const element of Object.values(object)) {
  console.log(element);
}
// 1
// 2
// 3

for (const element of Object.entries(object)) {
  console.log(element);
}
// ['0', 1]
// ['1', 2]
// ['2', 3]
```
配列、オブジェクト、文字列、セット、マップなどいろいろ使用できます。Object.entries()を利用した書き方が使用しやすい。

#### for/in文
```js
const object = { a: 1, b: 2, c: 3 };

for (const property in object) {
  console.log(`${property}: ${object[property]}`);
}
// "a: 1"
// "b: 2"
// "c: 3"
```

for/of文はES6から追加されたけど、JavaScriptの初期の頃からありました。オブジェクトで使用できるけど、下記の参考にもある通り想定した動きをしない場合があるので、for/in文ではなくObject.keys()を使用したfor/of文で処理します。

#### forEachメソッド
```js
const object = [1, 2, 3];

object.forEach((element, index, array) => {
  console.log(`${index} : ${element}`)
  console.log(`${array}`)
})

// 0 : 1
// 1,2,3
// 1 : 2
// 1,2,3
// 2 : 3
// 1,2,3
```
配列でbreakやcontinueを使用しない場合はこちらを使います。現在の値、インデックス、配列が取れて使いやすい。for/of文よりもシンプルに書けるかな。

#### 参考

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/for

https://zenn.dev/yuki__k/articles/d06f1cfef74b36

https://camp.trainocate.co.jp/magazine/javascript-foreach/
M5stack StampS3を買ったのでI2Cで遊ぶ。(予備実験)(ESP32-S3)


x 世の中、舐めていた。ごめんなさい。(1.27mmハープピッチ)

x いろいろ、失敗したので、もう一度、仕切り直すので、お時間が掛ります。(20240331)



目的
I2Cのテスト
===完成(202404010636)

![o_coq008.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/510a7ede-0f65-d6be-6e7e-ece70827b4b1.jpeg)


![o_coq009.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/1d3a28bb-7d5b-7c0f-77d2-54094fdb7a6b.jpeg)


結果　へんな液晶は、0x80に送られた文字をそのまま表示する。オリジナルハードです。(よろぴく)

![o_coq010.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/159c0b87-7da2-5965-0ac2-b1b96d15913d.jpeg)

プログラム

```c++


//GPIO_I2C_A_M5S3_1


//インクルド
#include <Arduino.h>
#include <Wire.h>


//初期化
void setup() {

  Wire.begin();  //I2Cの初期化

} //setup


//メインループ
void loop() {

  //一文字転送
  Wire.beginTransmission( (0x80) >> 1 );
  Wire.write('A');
  Wire.endTransmission();
  delay(1);

  delay(1000); //1秒待つ

} //loop


```
M5stack StampS3を買ったので信号を引き出して遊ぶ。(部品一覧)(ESP32-S3)


x 世の中、舐めていた。ごめんなさい。(1.27mmハープピッチ)

目的
マイコンから各種の信号を取り出す

いろいろ1
昨日(20240330)、光起ビルの発表会に行ってきた。
いろいろ2
ESP32で中国ど、アップ。
なんか、大手企業や政府?で中国製品のボイコットが
進んでいて、中国が西側OSの不使用を決めたので、(自主制裁対象)ESP32も対象でネット炎上。えーーー、なに、使えばええんやーーーーーしらん。
いつも言っているがアクセスの半分は、中国、残りの半分は、欧米(ロシア、ハンガリー、ローマ等)、国内は、数件
採用理由は、安い、速い、うまい。
中国の半導体が気に入らないなら、もっと、いいものを出せばいいんや。(何の事)
一般消費者なのでくわしい事は、しりません。あしからず。(売っていて、安かったら買うだけ)
STM32なら2000円から3000円で約10倍高い。国内は、めちゃくちゃだから10年後にあるかわからない。
最低、10年は、作ってほしい。(お願いします。(絶対に買わないけど!!))
ぜんぜん、状況が把握できない。別ログに切り直す。(自己解決、発注者の好み(政府?))(何の事?)
KX-7000を考える。

https://qiita.com/caa45040/items/93c6146bbd2e27b2ca61


完成(写真)

![o_coq007.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/1c0b098c-e909-598d-6678-822fb3c55d9d.jpeg)




M5stack StampS3 (本体)

![o_coq003.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/0e326eed-eb36-0076-4b24-3c9b831d94bd.jpeg)


1.27mmの基板

![o_coq004.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/9bd9f46e-b9ab-49f0-0598-990b33d1e17b.jpeg)


1.27mmのソケット

![o_coq005.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/785c42f9-800c-759d-bc1a-a566074b2894.jpeg)


1.27mmのヘッダー

![o_coq006.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/fdfd0c1e-0c81-3ee1-8777-e7ddab03d930.jpeg)
PythonコマンドでWindows Storeが立ち上がってしまう

pyenvで環境構築しようとした際、pythonコマンドでpython interpreterの代わりにwindows storeが立ち上がってしまい解決に時間がかかった。
結論としては、環境変数 Path の読み込み順を確認すべきということがわかった。

## whereコマンドでpython実行ファイルの場所を確認
```$ where python```
最初は以下のようになっている。WindowsAppsが一番最初に来ていることがわかる。
```
C:\Users\....\AppData\Local\Microsoft\WindowsApps\python.exe
C:\Users\....\.pyenv\pyenv-win\shims\python
C:\Users\....\.pyenv\pyenv-win\shims\python.bat
```
環境変数 Path で順序をpyenvが先に来るようにしてやれば良い。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344034/64e3740f-20f1-b682-302c-16606b95b913.png)

whereで再度確認すると順序が変わっている。ほんとにこれだけのこと...
```
C:\Users\....\.pyenv\pyenv-win\shims\python
C:\Users\....\.pyenv\pyenv-win\shims\python.bat
C:\Users\....\AppData\Local\Microsoft\WindowsApps\python.exe
```
jakarta.persistenceパッケージを使用していないのにjava.lang.NoClassDefFoundError: jakarta/persistence/EntityManagerが見つからないエラーが出たときの対処方法

<h1>結論:HibernateとSpring Bootを使うときはバージョンに気を付けよう！！</h1>


<h1>解決方法</h1>

```xml:pom.xml
	<dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <!-- この部分を削除<version>6.1.1.Final</version> -->
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
```

POMファイルからHibernateの明示的なバージョン指定を削除し、spring-boot-starter-data-jpaに含まれるバージョンを使用するようにした。

<h1>エラー内容</h1>

```
Caused by: java.lang.NoClassDefFoundError: jakarta/persistence/EntityManager
    at org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter.<init>(HibernateJpaVendorAdapter.java:74)
```

<h1>経緯</h1>
spring bootで開発中に
jakarta.persistenceパッケージを使用していないのにjakarta/persistence/EntityManagerが見つからないとのエラーが出てしまう。

<h1>原因</h1>
Hibernateがバージョンによってはjakarta.persistence.EntityManagerを使用しているようで、

一方Spring Boot 2.7.11のspring-boot-starter-data-jpaの依存関係に含まれるHibernateのバージョンは、javax.persistence.EntityManagerを使用していたためのようだ。
ランダムな名前のディレクトリを作る方法

# なにこれ

ちょっとした作業をするのにディレクトリを作りたいが、適当な名前が思い浮かばない時にランダムな名前をつける方法です。

## シェルスクリプト

ランダムな名前のディレクトリを直下に作り、そのディレクトリに移動するスクリプトです。
シェルスクリプトとして呼び出すときは `. random_dir.sh` のように呼び出してください。
そうしないとディレクトリを移動できません。シェルスクリプトは通常、子プロセスとして起動され、その実行が終了するとプロセスが終了し、親プロセスには影響を与えないからです。

```random_dir.sh
RAND_DIR_NAME=`head -c 4 /dev/random | sha256sum | awk '{print $1}' | cut -c 1-5`;
mkdir $RAND_DIR_NAME
cd $RAND_DIR_NAME
```

このスクリプトでは、`/dev/random`から取り出した乱数のハッシュ値を基にした名前のディレクトリを作成します。
ディレクトリ名を、ハッシュ値の最初の5文字を`cut -c 1-5`で取り出して作っているのは見やすさとタイプしやすさのためです。


## mktemp コマンド

上記のシェルスクリプトを書いた後に検索して知ったのですが、こういうケースのためのコマンドもあるようです。
上のスクリプトはかぶりを考慮していないので大量に作りたいときはこっちを使うと良いと思います。
下のコマンドで適当なディレクトリやファイルを作成できます。

```sh
# Xの数の文字数のランダムな名前のディレクトリを作るコマンド
mktemp -d xxxxxx

# ランダムな名前の .ts ファイルを作る
mktemp XXXXXX.ts
```
Azure ユーザーにおすすめしたい ブラウザ拡張機能✨

こんにちは、アーキテクトのやまぱんです。
補足コメントや質問、<font color="red">**いいね、拡散**</font>、是非お願いします🥺！
間違ってたら<font color="red">**優しく**</font>教えてください！

今回は Azure ユーザーにおすすめしたい拡張機能をまとめてみたいと思います！！


⚡⚡⚡⚡⚡⚡ 令和最新版 ⚡⚡⚡⚡⚡⚡⚡
⚡Azure ユーザー なら 入れたい 拡張機能一覧　⚡
⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡

## 1. JA/EN Url Toggler
MS Learn を見てると一応英語版も見てみるかな～？って思うときありますよね、そういう時に役立ちます。
MS Learn の言語、英語と日本語とをワンクリックで切り替えられます！！

https://chromewebstore.google.com/detail/jaen-url-toggler/cojobaphcadfijmiiopiklfpompmljgm

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/dd6d129f-d602-0ee4-dc62-8265be1d4eef.png)


## 2. Text Blurrer
メールアドレスとか Subscription ID 等の指定文字列にぼかしを入れることができる！！
一部界隈では **「ぶるぁああああ」** と呼ばれている。
 Azure Portal でなくても有効です、画面共有とか、一部シークレット情報を隠して画面ショットを取りたい時とかに便利です。

https://chromewebstore.google.com/detail/text-blurrer/mbikojdgkmpjfackcmiliemgmkdkbbcl

こんな風に ”指定した文字列(サービス)" を隠せます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/2bff8db1-8033-3381-82ae-a67c8fc4c973.png)


## 3.Azure Portal Plus
デプロイ完了時に通知を出したり、タブの favicon を開いてるリソースのアイコンに変えてくれたり複数タブで Azure Portal を開いてるとき便利な機能が複数あります！

https://chromewebstore.google.com/detail/azure-portal-plus/jkcphnjnffinkpflgnpcjagggmjmakdg

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/83ee60cc-c620-36a5-42ed-0c0bc317b7e5.png)

+ コピー補完機能 (**2024/05 追記**)
各リソースの　リソース名、リソースID、Azure CLI / Azure PowerShell での引数コピペ機能！！

これは便利✨
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/8623eace-f761-58c3-7690-68d42e40d559.png)

## 4.JP Learn Microsoft.com Update Checker
英語版が更新日時を日本語版でも表示してくれます！
基本的に英語版がすぐに更新されるので大変ありがたい！！

https://chromewebstore.google.com/detail/jp-learn-microsoftcom-upd/addjjinolilbffnlnfbaglljhngjminl?hl=ja&authuser=0

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/7dc0fd00-af38-212c-0ebc-1811036f9ec3.png)


## 5.Amazing Icon Downloader
Azure の図を作ってるときに、このリソースのアイコンどこだっけ？みたいになると思います。
こんな風にAzure Portal から直接 svg をダウンロードすることができます。✨

https://chrome.google.com/webstore/detail/amazing-icon-downloader/kllljifcjfleikiipbkdcgllbllahaob/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/7c6da029-ed01-6587-0619-a307ef2040a4.png)

::: note
拡張機能ではないですが、このページから Azure の全サービス(とそのアイコン)を確認することができます。

https://portal.azure.com/#allservices/category/All


また下記の記事でもアイコンまわり参考になりそうです

https://qiita.com/akihiro_suto/items/6987b9b3d0f82dca8ef9

:::

## 関連・参考

https://qiita.com/akihiro_suto/items/6987b9b3d0f82dca8ef9

## あとがき👆
もし他に、便利なツールがあったら教えてください👆
よくわからんけどエディターと同じ値でActorのRotationをSetしたいよ～(とにかくBlueprint上で簡単に考えたい話)

普段3Dで同人ゲームを作っている**にーあい**です。

3Dで作ってるのは純粋にそっちの方が簡単だからです。2Dって難しくないですか？

# BlueprintでActorを回転させたい
まず始めに、今回の話は基本的に検索すれば出ます。
新規性も特にないので単に備忘録です。

みなさんはゲームを作っていて、Editor上で配置したオブジェクトってどうやって回転させてますか？

普通はGizmoでくるくるするか、Editorのトランスフォームをいじいじすると思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3754903/34fdcc38-534b-45a5-27e6-76c2c68160ca.png)足元のこれが**Gizmo**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3754903/fb4d3c98-a12c-da46-9835-298e5c59b566.png)

Editorで回転させるにしても、Gizmoがそうであるように3つのパラメーターで実現可能になってます。



<br/>

さて、BlueprintでActorを回転させようと思えばこのノードを使いますよね

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3754903/1c330996-21e2-2ba8-e11f-0ac568d86bec.png)

回転はやはりパラメータ三つであらわせるようですが、Vector3とは違ってRotation型の入力になっています。

基本的に用意する値は三つなのでVector3です。じゃけんRotatorに変換しましょうねって検索かけると、見たこともない変換ノードがいっぱい出てきてしまうから困ります。

そして、ほんの少し試した中だとfromXとfromZで変換すれば、Actorはそんなわけない角度でくるくる回るようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3754903/799e171b-c423-b473-10e2-17268b683411.png)

しかし、正解はこのいずれでもなく**MakeRotator**なのです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3754903/588b848f-7cc2-172e-b22e-64f197d660b9.png)

※MakeRotノードの全てを調べたわけではないので、この中にはもしかするとこれと同じような動作をするものがあるかもしれません。

MakeRotatorであれば、Editor上と同じ値を渡せばEditorと同じ回転の状態が得られます。

# この方法でのデメリット(クォータニオンが本当はいいらしいって話)
一応、このままだと本当に価値のない備忘録になってしまうので、回転にまつわるちょっとした話を書き残しておきます。私自身このあたりの話を完全に理解しているわけではないので間違いも多くあると思います。

皆さんはクォータニオン(Quaternion)って聞いたことがありますか。
私のように一度Unityを触ったことがあるとか、姿勢制御系やってる人とか、回転にまつわる話とかをする際には出てくる言葉です。

正直、クォータニオンってよくわかんないし面倒ですよねって言ったらたぶん数学屋さんには怒られます。実際有用の極みみたいなやつなので、虚数を既に学んだ人(中学生とかで学びましたっけ……？)ならちょっと足を延ばせば複素数とその発展としてちょろっとやってみる価値は大いにあります。

クォータニオンは、めちゃくちゃ大雑把な理解のために間違ったことを言うと、Vector4みたいなものです。
Quaterの名前から推察できる通り、クォータニオンは4つのパラメータを持つ値です。

そのx,y,z,wはそれぞれ(x,y,z)でその空間でのベクトル、wはそのベクトルを軸に回した時の回転量を意味しています。

実はものをくるくる回転させるとき、私たちがEditorでGizmoをくるくるするように3方向の値を弄らなくても、ある軸で回せば任意の回った状態が作れるのです。

そのため、クォータニオンがあればわざわざ3回回転の計算をしなくてもいいということになります。

これがクォータニオンを使うメリットで、計算量が減るという恩恵が得られます。つまりBlueprintいじってるときには大差ないように見えて、実際には処理が軽くなるということ。

念のため補足をしておくと、クォータニオンの回転は複素数の掛け算が回転に関係していたあれをさらに発展させた感じなので、そこを意識しながら調べるとわかりやすいかもしれません。

……と、とりあえずクォータニオンの宣伝はしておきました。お目汚し失礼しました。

# さいごに
でも、EventTickに突っ込むとかよほどのことがない限りはわかりやすさの方が大事だと思うので、これからも3軸でくるくるします

## X/Twitterも見てね！！！！！
→[X/Twitter(@2iStudio048)](https://twitter.com/2iStudio048)
教師あり学習とは

## はじめに
世の中の情報処理をおこなうシステムは、大半が **入力** に対して **出力** を求めるものです。
極端な解釈かもしれませんが、このイメージで問題ないと思います。

システムのイメージ：
>（入力）⇒（システム）⇒（出力）

## 簡単な例
##### 税込価格の計算システム
単純なシステムの例として、税抜価格から税込価格を計算するシステムを考えてみます。
ここでの **入力** は **税抜価格** 、**出力** は **税込価格** となります。

（再掲）システムのイメージ：
>（入力）⇒（システム）⇒（出力）

イメージに当てはめると、ここでのシステムは 
**与えられた入力（税抜価格）に 1.1 を掛けて出力（税込価格）を求める**
というものになります。
>（税抜価格）⇒（1.1倍）⇒（税込価格）

## 教師あり学習
ここから本題に入ります。
先ほどの税込価格計算システムでは、税率が 10% であると知っていたため、簡単に税込価格を求めることができました。

では、**税率を知らない状態で税込価格を計算する** にはどうすればよいでしょうか。

税込価格を推定するために用いられる方法が、**教師あり学習** という方法です。

### 教師あり学習の方法
教師あり学習は **入力** と **出力** のデータを大量に用意して、**もっともらしい結果が得られるシステム** を作るというものです。

**入力** と **出力** のペアデータを **訓練データ** といいます。
訓練データの **出力** 部分はとくに、**教師** とよばれます。

### 学習の例
先ほどの税込価格計算システムを、教師あり学習で再現してみましょう。
訓練データとして **税抜価格** と **税込価格** を与えて、税率を推定します。

（訓練データの例）
1. 入力：100, 出力：110
2. 入力：500, 出力：550
3. 入力：550, 出力：605

訓練データを観察すると、入力に対して出力は1.1倍の値となっています。つまり、**訓練データから推定される、もっともらしい税率は 1.1 倍である** といえます。
実際の教師あり学習ではこれより多くの訓練データ（万単位）で学習をおこないます。

**推定の対象（ここでは税率）をパラメータとよびます。**

##### いろいろなシステム
###### 画像の認識

<img width=300 alt="apple_image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3566695/f47c3be0-3b71-7133-6a22-bb4fc7a9f6d8.png">

入力：手書き数字の画像
出力：0 ~ 9 の数字

###### 音声の認識
入力：音の波形
出力：子音, 母音

###### 自動運転
入力：周囲の画像, 現在の速度, ...
出力：ハンドルの角度, 適切な速度

## まとめ
教師あり学習は、訓練データから、もっともらしい結果を求めるようなシステムを作るという方法でした。とてもざっくりしてますが、大体このようなイメージで問題ないかと思います。
浦島太郎の為のJavaScript周り整理メモ

## はじめに

ちょこちょこJavaScript周りは追っていたが、変化が目まぐるしく追いつけていなかった。
業務で使うに当たり、ざっくり把握し直したのでメモ。

## 言語周り

### 標準仕様: 実装状況はブラウザなど実行環境に依る
- CommonJS: requireで読み込むやつ
- ECMAScript: importで読み込むやつ。こっちが標準になっていく

### 型付け
- TypeScript: 結局JSに変換して実装するので後付けという立ち位置

## 実行環境周り

### エンジン
- V8: Node.jsやChromeで使われている
- JavaScriptCore: WebkitなどAppleで使われている？

### ランタイム
- Node.js
- Deno: npmの反省から生まれる。パッケージ管理機能込み。Rust製
- Bun: 早い。Node.jsの置き換えを狙う。Zig製

### パッケージマネージャー: どれか一つを選ぶ。bundler的なやつ
- npm (+ npx): 大きなプロジェクトなどだと遅さが問題になる？
- yarn
- pnpm

### バージョン管理
- Volta
- Proto: bunも使える
- nvm
- asdf: Node.js以外でもRubyなどで使用可能

## パッケージ周り: gem的なやつ

### フロントエンド

- React
- Next.js: React拡張
- Vue.js
- Nuxt.js: Vue.js拡張
- Svelte
- SvelteKit: Svelte拡張
- AngularJS
- Hono
- HonoX: Hono + Vite拡張

### バックエンド

- Express.js
- Fastify: Express.jsより早い
- NestJS: Express.js or Fastify拡張。Angularを参考にしている

### モジュールハンドラ: フロントエンド向けでファイルまとめたり

- Webpack: 古くなってきて、すごい後発が乱立してきた
- esbuild
- Vite
- Turbopack

### テスト

- Jest
- Vitest: Jest互換
- Mocha
- Selemium: ブラウザベースのE2Eテストフレームワーク
- Cypress: 同上

### 他

- nodemon: ホットリロードしてくれる
- Forever: Express.jsのプロセスマネージャー。SystemD的な
- PM2: 同上
GraphQLアンチだった自分が、心変わりした訳 (でもやっぱり無理だったw)

## 概要
### 要約
API設計の経験を通してGraqhQLに対してのイメージが変わったので、
その思考過程をまとめる。

### 対象読者
- GraphQL学びたい人
- GraphQLのメリットがわからない
- GraphQLアンチの人
- BFFでよくねとか思ってる人
- BFFとGraphQLで迷っている
- なんかよくわからないけどGraphQL学んでる人

### 免責事項
この記事はあくまで筆者の感想をまとめたもので、試算や検証をしていないので事実と異なることを述べている可能性があります。


## なぜアンチだったのか
GraphQLを学ぶ気になれなかった理由は、メリットがわからなかったこれに尽きる。それまでは密結合になるのはマイクロサービス化などが視野に入ってくる段階だと思っていた。そのため、その段階でテストの難しさをデメリットとしてあげる人が多いGraphQLを導入するくらいならBFFを作成した方がいいと思っていた。よっってそれまでは、アプリが複雑化することもないだろうしFEで結合して貰えばいいのではくらいに思っていた。しかしながら立ち上げ初期でも後述する要求の食い違いがすでに存在しうることを実体験として知るにつれて、考えが変化していった。


## きっかけ
### FEとBEの要求の違いから生じる歪みを感じた体験
フロントエンドとバックエンドが別々のチームで開発されているプロジェクトのAPI定義をするようなった。
これまで画面はテンプレートエンジンでしか書いたことなかったので、初めてRESTで結合するアプリケーションを担当し、以下のような共存し難い要求が存在することに気がついた。

- FrontEndの要求
    - 関連するデータはなるべくまとめて欲しい
        - これはユーザビリティから起因する、極めて重要な要求だ
        - これを無視するとエンジニアよがりな使い手を無視したアプリケーションになってしまう
- BackEndの要求
    - データを疎結合にしたい
        - APIであってもなるべくデータを疎結合にしたい
        - というのも別にIF層だけ連結させて、アプリケーション層やドメイン層を疎結合にするだけでもいいのだが、そうすると技術力がよほど高い集団以外だとかなりの設計コストが嵩むようになる可能性がある

今回の設計ではバックエンドが上記の歪みを受け入れる形で、アプリケーションを実装したのだが、いまでもこれは正しい選択だったのか大いに悩んでいる。
免罪符としてどうするのが良かったのかを、各アプローチのトレードオフを分析しながら考えていく。


## 歪みを生まないためのアプローチ
自分が思いつく限り、以下のアプローチで両者の要求を共存させることが可能だと考える。

1. RestAPIのインターフェース層で吸収する
1. GraphQLを導入する
1. 自前でBFFを実装する
1. クラウドの機能を使用してBFFを立ち上げる

これからそれぞれのアプローチで考えうるトレードオフについて考察しする。

### RestAPIのインターフェース層で吸収する
このアプローチでは、バックエンドのリクエストを受けるインターフェース層はデータの結合を許容し、そこから疎結合に実装されたユースケース層へ適切なリクエストを分岐し、その結果を結合してクライアントへレスポンスを返却する手法である。このアプローチでは以下のトレードオフが存在すると考える。

- メリット
    - 慣れ親しんだRestAPIを使用することができる
    - 追加コストなしで実現できる
- デメリット
    - 設計コストの肥大化
        - インターフェースの定義とユースケース層以降実装で、データ型の定義が異なるようになり、その部分の設計意図をメンバーに把握してもらうための工数が必要になる
        - 工数がどのくらい肥大するかメンバーの習熟度によって異なる
    - ファットコントローラーへの懸念
        - インターフェース層でハンドリングする処理が出てきてしまうため、ドメイン知識が一部IF層に流出してしまう懸念は拭えない
        - またアプリケーションが習熟するにあたり、実装が複雑になる可能性も大いにある

### GraphQLを導入する
タイトル通りの実装である。この場合のトレードオフは以下のようになるだろう。

- メリット
    - モダンなアーキテクチャを実装する満足感
    - 追加コストなしで実現できる
- デメリット
    - 学習コスト
    - インターフェーステストへの課題

### 自前でBFFを実装する
こちらもそのまま。この場合のトレードオフは以下のようになるだろう。

- メリット
    - 慣れ親しんだRestAPIを使用することができる
- デメリット
    - 追加のインフラコストがかかる
        - 耐障害性を考えてスケーリングとかすると、結構いきそう（試算はしてない）
    - 実装コストが跳ね上がる
    - 学習コストも跳ね上がりそう
        - 仮にFEで実装・管理する場合、FEの負担が重くなりそう
        - 逆だとするとFEは柔軟な仕様変更という恩恵が受けられない


### クラウドの機能を使用してBFFを立ち上げる
こちらもそのまま。この場合のトレードオフは以下のようになるだろう。

- メリット
    - 慣れ親しんだRestAPIを使用することができる
- デメリット
    - 追加コストが発生する
        - 自前構築よりはマシ？
    - クラウドベンダーへの依存が強まる
        - これにより為替の影響が大きくなったり、ベンダーの都合で費用が嵩むリスクは当然増える
        - 昨今のIT貿易赤字やら、オンプレ回帰やらのトレンドを鑑みると少し慎重になる気持ちもある


## まとめ
こうしてみると、やはりGraphQLというのはそこまで悪くない選択肢のように思えてくる。
もちろんプロジェクトの資金状況や、会社ないしビジネスのフェーズや要望によって左右されるだろうが、現状筆者は以下のような判断基準で選定を行うかもしれない（機会と権限があれば）。


- 資金力があるプロジェクト
    - クラウドが利用できる
        - クラウドの機能を使用してBFFを立ち上げる
    - オンプレ
        - GraphQLの導入 
- 技術力があるチームのプロジェクト
    1. GraphQLの導入
    1. RestAPIのインターフェース層で吸収する
    1. クラウドの機能を使用してBFFを立ち上げる
- 普通のプロジェクト
    - GraphQLの導入
    - そのまま突き進む
    - 継続開発なら自前BFFもありかも


色々悩んでいる最中なので網羅性がないのはご容赦いただきたい。

## 追記
指摘されて改めて調べてみたらGraphQLで完全に実装を切り分けるのは難しそう......
Queryは結合を受け入れて、Commandはきっちり分けるとかが無難なアプローチになりそう
AtCoder Beginner Contest 347 C問題 解説

ArCoderの問題の解き方を自分用に記録する。
難しいなあ...。

### 問題
https://atcoder.jp/contests/abc347/tasks/abc347_c


### 考え方
今日を0日目として何日目に予定があるのか週ごとでまとめる。
理由は休みが1日目であった場合、8日目、15日目も同じく休みとなる規則性があるため。平日であっても同じ。
例えば以下は予定Dが1日目、2日目、8日目にあると仮定した場合を表にしたもの。
 <table>
    <tr>
      <td>0</td>
      <td>1</td>
      <td>2</td>
      <td>3</td>
      <td>4</td>
      <td>5</td>
      <td>6</td>
    </tr>
    <tr>
      <td>-</td>
      <td>☆</td>
      <td>☆</td>
      <td>-</td>
      <td>-</td>
      <td>-</td>
      <td>-</td>
    </tr>
    <tr>
      <td>7</td>
      <td>8</td>
      <td>9</td>
      <td>10</td>
      <td>11</td>
      <td>12</td>
      <td>13</td>
    </tr>
    <tr>
      <td>-</td>
      <td>☆</td>
      <td>-</td>
      <td>-</td>
      <td>-</td>
      <td>-</td>
      <td>-</td>
    </tr>
 </table>
 <br>
 この週の予定が問題に記載されている休みと平日の規則にあてはまっているかを確認してあげれば良い。
 <br>
 1日目が休みであるか平日であるかという規則は8日目にも適用されるため、7日目以降を0〜6日目にそろえる。
 <br>
 <table>
    <tr>
      <td>0</td>
      <td>1</td>
      <td>2</td>
      <td>3</td>
      <td>4</td>
      <td>5</td>
      <td>6</td>
    </tr>
    <tr>
      <td>-</td>
      <td>☆</td>
      <td>☆</td>
      <td>-</td>
      <td>-</td>
      <td>-</td>
      <td>-</td>
    </tr>
    <tr>
      <td>0</td>
      <td>1</td>
      <td>2</td>
      <td>3</td>
      <td>4</td>
      <td>5</td>
      <td>6</td>
    </tr>
    <tr>
      <td>-</td>
      <td>☆</td>
      <td>-</td>
      <td>-</td>
      <td>-</td>
      <td>-</td>
      <td>-</td>
    </tr>
 </table>
 <br>


### サンプルコード
- setで重複削除しようとすると実行時エラーになる原因は不明
- 二分探索を使うと良いみたい
- 以下のコードでは`D[0]`もD`[i]`として使いたいので2週目の最初の予定`D[0]+A+B`を追加している
```python
N, A, B = map(int, input().split())
D = list(map(int, input().split()))
D = [i%(A+B) for i in D]
D.sort()
D.append(D[0]+A+B)
for i in range(1, N+1):
    if D[i]-D[i-1] > B:
        print("Yes")
        exit()
print("No")
 ```
Dart List型の使い方

# Dartのコレクション型 Listの使用方法

Dart言語におけるコレクション型には、List、Set、Queue、Mapの4種類があります。
今回はListの使用方法について説明します。

## 目次
- [List型について](#List型について)
- [使用方法](#使用方法)
- [主なメソッド](#主なメソッド)

## List型について
List型は順序付けられた要素のコレクションです。重複する要素を持つことができます。

### 使用方法
Listの宣言方法は以下になります。


```dart
List<String> fruitsNames = ['apple', 'banana', 'grape'];

fruitsNames.add('orange');

print(fruitsNames); // 出力結果：[apple, banana, grape, orange]

List<データの型> 変数名 = [データ内容1, データ内容2, データ内容3]; の形式でリストを初期化できます。
```
## 主なメソッド
・```add(element):``` 特定の値をリストの最後に追加します。
```
List<String> fruits = ['apple', 'grape'];
fruits.add('banana'); // 'banana' をリストの最後に追加します。
print(fruits); // 出力: ['apple', 'grape', 'banana']
```

・``` remove(fruits):```リストから特定の値を削除します
```　remove(fruits):リストから特定の値を削除します。
List<String> fruits = ['apple', 'banana', 'grape'];
bool result = fruits.remove('banana');
print(fruits); // 出力: ['apple', 'grape']
print(result); // 出力: true
 ```
```removeAt(index): ```指定したインデックスにある要素をリストから削除します。


```
void main() {
  List<String> fruits = ['apple', 'banana', 'grape'];
String removedFruit = fruits.removeAt(1); // 'banana'が削除されます。
print(fruits); // 出力: ['apple', 'grape']
print(removedFruit); // 出力: banana
}
```
```indexOf(element): ```特定の値を検索し、そのインデックスを返します。
```
List<String> fruits = ['apple', 'banana', 'grape'];
int index = fruits.indexOf('banana'); // 'banana'のインデックスを検索します。
print(index); // 出力: 1
```

```insert(index, element): ```指定したインデックスに要素を挿入します。
```
List<String> fruits = ['apple', 'grape'];
fruits.insert(1, 'banana'); // インデックス1の位置に'banana'を挿入します。
print(fruits); // 出力: ['apple', 'banana', 'grape']
```
Mavenのライフサイクル、フェーズ、プラグイン、ゴールの関係

ここでは、Mavenビルドツールのコマンドの意味を理解するうえで重要となる、ライフサイクル、フェーズ、プラグイン、ゴールの関係についてまとめます。
なお、執筆にあたっては以下の公式リファレンスを参考にしているので、項目ごとに詳細を知りたい場合は併せて参照をお願いします。
https://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html

# ライフサイクルとフェーズ
まず、**ライフサイクル**は以下の3種類があります。
* Default
* Clean
* Site

そして、それぞれの**ライフサイクル**は複数の**フェーズ**で成り立っています。
例えば、`mvn compile`などでよく使うcompileというのは**フェーズ**の一種で、これはDefault**ライフサイクル**の中にあります。

コマンドで**フェーズ**を指定して実行したときは、その**フェーズ**を含む**ライフサイクル**の、始めの**フェーズ**から、指定した**フェーズ**までが順次実行されます。
つまり、もし`mvn install`コマンドを叩いたときは、installフェーズだけが実行されるのではなく、その前のcompileフェーズやtestフェーズも実行されるということです。

# プラグインとゴール
ここまでの説明だけだと、Mavenが提供するコンパイルやテストなどの各機能はフェーズとして定義されているように感じるかもしれませんが、まだ続きがあります。
Mavenには**プラグイン**という概念があって、**プラグイン**の中には1つ以上の**ゴール**が含まれます。
この関係は、ものすごくざっくり言うと、便利な機能をまとめたサービス（**プラグイン**）があって、その中の実際の各機能に相当するのが**ゴール**といった感じです。
そして、Mavenの各機能はすべてこの**プラグイン**の**ゴール**として定義されています。

例えば、Compilerという**プラグイン**がありますが、この中にはcompileとtestCompileという2つの**ゴール**があります。
compileはメインコードのソースコードをコンパイルし、testCompileはテストコードのほうをコンパイルする機能ですね。

# ライフサイクルのフェーズと、プラグインのゴールの関係
「Mavenの各機能はすべてこのプラグインのゴールとして定義されています。」と言いました。
ではなぜ、先述の`mvn install`などのコマンドでは、フェーズを指定するだけで機能の実行ができるのでしょうか。
それは、ライフサイクルのフェーズに、プラグインのゴールが紐づけられているからです。
これは、デフォルトで紐づけられているものもあるし、pomファイル上で設定することもできます。
例えば、Cleanライフサイクルのcleanフェーズには、cleanプラグインのcleanゴールが初めから紐づいています。

コマンドを叩くときは、フェーズではなく、プラグインのゴールを直接指定することもできます。
フェーズを指定したときとは異なり、この場合は、ライフサイクル内の順番を無視して該当のゴール（機能）だけを単独で実行できます。

# コマンドで見た時の違い
最後に、フェーズを指定するときと、プラグインのゴールを直接指定するときの違いをコマンドで確認しておきます。

`mvn compile`としたときは、compile**フェーズ**を指定しています。
つまり、Defaultライフサイクルの初めから、compileフェーズが指し示す機能までが順次実行されます。

`mvn compiler:compile`としたときは、compiler**プラグイン**のcompile**ゴール**を直接指定しています。（このように、`プラグイン名:ゴール名`という書き方をします。）
この場合は、ライフサイクルに関係なく、compilerプラグインのcompileゴールの機能のみが単独で実行されます。

# まとめ
いかがだったでしょうか。
普段叩いているコマンドの意味を理解するうえで、少しでもお役に立てれば幸いです

:::note warn
※このアカウントで発信する内容はあくまで私個人の意見であり、現在所属する会社の公式見解を示すものではありません。
:::
【Aflred】時計.appをalfredで簡単に操作するワークフロー

# QuickTimer for Alfred

このワークフローは、Alfred上でmacOS標準の時計.appを直接タイマー設定をしたり、ストップウォッチを操作できます。こういうワークフローないかな〜と探したらなかったため、作ってみました。

![workflow_img.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727397/adb6ad09-15cb-320f-0521-14636b102070.png)



## 機能紹介

### タイマー

キーワードは標準で`t`。これを先頭に記述して、スペース開けで時間フォーマットを入力すると、タイマーがセットできます。フォーマットは以下のように自由度高めで入力できます。基本は（時間→`h`、分→`m`、秒→`s`）といった単位で時間指定します。

| 説明             | コマンド例       | 設定されるタイマー |
|----------------|-------------|--------------|
| 単位の指定         | `t 1h30m10s` | 1時間30分10秒   |
| 任意の単位指定         | `t 1h30s` | 1時間30秒   |
| 単位を省略した場合    | `t 30`      | 30分（分に設定される）         |
| 小数点で時間指定     | `t 1.5h`    | 1時間30分      |
| 自動変換          | `t 100`      | 1時間40分      |

### ストップウォッチ

swコマンドを使って、ストップウォッチの開始、停止、ラップ、リセットが行えます。

| 説明                | コマンド     |
|-------------------|-----------|
| ストップウォッチを開始    | `sw start` |
| ストップウォッチを停止    | `sw stop`  |
| 現在の時間をラップ | `sw lap`   |
| ストップウォッチをリセット  | `sw reset` |

## インストール

セットアップは、Alfred.appのワークフローとShortcuts.appのファイル両方をインストールする必要があります。インストールは以下の手順に従ってください。

1. リンクからファイルをダウンロードします。
    * [ワークフローファイル（Alfred.app）](https://drive.google.com/file/d/1fnuA0FZil6gpE0rP6EzXCpz0r9p_jqX6/view)
    * [ショートカットファイル（Shortcuts.app）](https://www.icloud.com/shortcuts/fd67768dcab24ea2ab13d58f7e93d751)
2. ダウンロード後、それぞれファイルをダブルクリックしてAlfredとShortcuts.appにインポートします。画面のプロンプトに従ってセットアップを完了させましょう。
3. 試しにalfredで`t 3`と入力してみましょう。３分タイマーがセットされたらOKです。


---

使い勝手は結構良い感じです。
標準タイマー使っている人は少ないかもしれませんが、ぜひ試してみてください。
IntelliJで空のプロジェクトを作成してからHelloWorldを実行するまで

## 環境
- Windows 11
- IntelliJ 2023.3.6

## 新規プロジェクトの作成
今回は「空のプロジェクト」を選んで作成します。
![image1-0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759729/9f4880e6-c866-d8e8-0b27-02e8ff02567a.png)

## srcディレクトリの作成
作成したプロジェクトの直下に`src`ディレクトリを作成します。
![image1-0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759729/df608cbc-927b-0bf1-8cc8-41c64ea4bd5d.png)

## プロジェクト設定の変更
IntelliJのメニューから「ファイル」→「プロジェクト構造」を選択してプロジェクト構造ウインドウを開きます。
![image1-0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759729/62d769b2-f7e0-7364-93e4-c5a3877a2068.png)

「SDK」で使用するJDKのバージョンを選びます。
「OK」を押して設定画面を閉じます。

もう一度先ほどと同じ手順でプロジェクト構造を開き、「モジュール」を選択します。
最初に作成したディレクトリ`src`を選択して、上にある「ソース（ソースルートとしてディレクトリをマークする）」を選択します。
![image1-0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759729/a0d4c0cf-9ef8-655a-e4ab-40a5e395464a.png)

これにより`src`がソースフォルダのルートになりました。
「OK」を押して設定画面を閉じます。

## HelloWorldクラスの作成と実行
プロジェクトの`src`を右クリックし、「新規」→「Javaクラス」でJavaクラスを作成します。
```java:HelloWorld.java
public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, World!");
    }
}
```
右上の方にある再生ボタン（'HelloWorld.java'の実行）を押します。
コンソールに`Hello, World!`が表示されたら完了です。
M2 Mac でHomebrewをインストールする方法

```terminal
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

(echo; echo 'eval "$(/opt/homebrew/bin/brew shellenv)"') >> /Users/username/.zprofile

eval "$(/opt/homebrew/bin/brew shellenv)"

rbenv global 3.0.0
```
【初心者】Reactチュートリアル三目並べの理解度を100％にできた理由


１プレッシャー
何のためにやるかわからない。
言われたからる状態。

２
新しい言語を学ぶプロセスを学ぶ１５１。実験台感覚、ゲーム感覚

3
定量的な判断。感覚的にでも理解度を数値化した。
「何%理解できたか？」

４
お互い進捗管理しながらやる。
モクモクやるタイム。
お互い１、２周したぐらいしたところから、輪読しながら、理解度を高めながら、現場で深掘りながらやった。


５
意味不明
→過去経験でギリ理解（３０％）
→とりあえず反復
何度も文章の上滑りを反復する。文章撫でているだけ。文章磨いているだけ。

→外を取り入れる
自分の観点だけでは理解できない。外の表現をインプットする。
「Reactを初め言語だと思ってが、ライブラリだった」
「<>で囲む理由がわからなかったが、慣習であり、エラーになる」
上滑り状態だったから疑問にすら上がらなかったところにヒビが入っていく。

→単語暗記
例：コンポーネント：UIの部品を表す再利用可能なコード

→単語暗記の連結で文章暗記
例：UI：ユーザーインターフェース（利用者が見るアプリデザイン）
例：コンポーネント：ユーザーインターフェース（利用者が見るアプリデザイン）の部品を表す再利用可能なコード

→文章の連結で概念を理解

→概念がイメージ可能
例：コンポーネント＝レンタルビデオ。


６
もはや、チュートリアルの流れも暗記してくる。
チュートリアルの全体像が見えて、ここでこの内容を伝える意図が見えてくる。
違和感を明確に言語できる
A→B
日本語（SOV）→英語(SVO)

#### 脳のシナプスが書き変わり始める気持ちよさ。

→バックグラウンドは上から下でコード見れば理解できたが、フロントエンドは一枚写真でとらえる。このギャップ・違和感の言語化が気持ちいい。
→お互い新言語で交流していることの気持ちよさ。知的な矜持・プライド・自信感
→シンプルに読めるようになっていく。

７
Reactチュートリアル三目並べの理解度を１００％に出来たー！気持ちー！
知ってたらドヤれるかも？【バグの由来】、【PC問題に再起動で解決する理由】

# 概要
初めましての方は初めまして。
情報系大学を卒業後、インフラエンジニアを務めています、itohです。

情報系の大学を出ていたり、エンジニアをやっていたりすると、
ふとした時に、パソコンの基本的な操作とか何気ない疑問などを友人や家族から聞かれたりすることがあったりします。そんな時に役に立つかもしれない知識のいくつかを、ハッとした時に語れるようにここに残しておこうと思います。


（技術的にはあんまり役に立たないかもしれません。）
見ていて「へー、そうなんだ」ぐらいに思っていただければ幸いです。

# PC、ソフトの不具合を「バグ」と呼ぶ由来

**結論。`初期に作られたコンピュータの不具合の一つに、PC内に蛾が入り込む事例があったから。`**

パソコンに限らず、ゲームとかアプリとかのソフトウェアで不具合がある時、それを「バグ」と呼んだりします。
そのバグを直すことを「デバッグ」と呼びます。

これ、なんでバグと呼ぶのか、考えたことがありますでしょうか。これには諸説ありますが、大きな由来があります。


1947年9月9日にハーバード大学にて使用されていたコンピュータ、`Harvard MarkII`内に蛾が入り込むという事象があり、コンピュータが動かなくなる事例がありました。
なぜ入り込んだのかというと、、
当時はCPU内のトランジスタの代わりに真空管を使用していました。真空管は現在のCPUと比較して膨大に熱と光を発生させます。
また、真空管を用いてコンピュータを構築すると巨大になってしまうため、虫が入り込む隙間もあったことでしょう。。
```
重さは 25 ショート トン (23 t) で、占有床面積は 4,000 平方フィート (370 平方メートル) 以上でした。
```
wikiになりますが、参考です。

https://en.wikipedia.org/wiki/Harvard_Mark_II

実際にバグの原因として蛾が貼り付けられた写真も存在します。参考サイト2件目のgigazine。虫が苦手な方は注意。。

このバグを発見したのはプログラミング言語「COBOL」の開発者である、グレース・ホッパーさんという方です。


### 参考サイト

https://business.ntt-east.co.jp/bizdrive/word/bug.html#:~:text=%E3%83%90%E3%82%B0%E3%81%A8%E3%81%84%E3%81%86%E7%94%A8%E8%AA%9E%E3%81%AE%E7%94%B1%E6%9D%A5,%E3%81%9F%E3%81%A8%E3%81%84%E3%81%86%E8%AA%AC%E3%82%82%E3%81%82%E3%82%8B%E3%80%82


虫が苦手な方は注意。。

https://gigazine.net/news/20120910-first-computer-bug/


# なぜPCでトラブルが発生した時に再起動を試すと解決することがあるのか？
これは、ハードウェア上の理由と、ソフトウェア上の理由で二つあります。

**結論**
- ハードウェア上の理由
    - 　`エラーにより解放できなかったメモリ領域を強制的に解放できるから。`
-  ソフトウェア上の理由
    - `最初に起動した際には、プログラムは設計者の想定通りの状態になっているから。`

### ハードウェア上の理由
ハードウェア上の理由ですが、パソコンがアプリケーションの不具合やソフトウェアの不具合などにより、パソコン上のメモリ領域を解放できなくなることがあったりします。いわゆる
- メモリリーク、
- デフラグ
といった不具合に対しての一時対応になり、回復する可能性があるということです。


### ソフトウェア上の理由

プログラムの起動後、クリックや書き込みだけでなく、ウェブアプリであればブラウザの戻る・進むボタンや更新ボタンを押す、放置するなど、さまざまな操作を行います。
こうした操作を通してプログラムは元のプログラマーの意図とは異なる状態になることがあり、エラーやクラッシュ、フリーズが発生してしまうことがあります。

そういった時に、
`一度電源をオフにして再度オンにする`という操作はプログラムの状態をリセットし、当初のプログラマーの意図通りの状態に戻すという事を行なっています。


## 参考サイト

https://jpdsi.github.io/blog/internet-explorer-microsoft-edge/HighMemoryUsage/

https://gigazine.net/news/20240330-how-reset-works-well/
#5 Storyboard 電子書籍アプリ

今回の課題は、これまでに教わった内容を使って電子書籍を作成することです。

ChatGPTを使用してストーリーと画像のアイデアを出してもらいました。制作過程でAIが生成した画像が時にストーリーの内容と異なることがありましたが、全体としては課題完成の効率を大幅に向上させてくれました。

最初のページでは、Tab bar controllerとTable Viewを画像やラベルと組み合わせて使用しました。

![1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3703986/abd35a53-951a-fa45-0801-2b3ac5d183c3.gif)

次に、ボタンと組み合わせたイラストを使って読書ページに入ります。また、上部のタイトルも変更しました。

![2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3703986/3948cd94-cd41-810c-3c65-4b74f206b218.gif)

その後、ストーリーの内容に合わせてScrollViewを使用し、一度に複数のイラストを楽しむことができます。

![3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3703986/8413468d-5d4a-ca2b-fe34-13791405cb58.gif)

ナビゲーションバーに➕の記号を追加し、将来的にはお気に入り機能の開発を希望しています。

![4.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3703986/6862d7f0-2e68-373a-6241-db0639a0d3c0.gif)

https://github.com/liyoway/-?source=post_page-----4110eee82290--------------------------------
iOSアプリ開発証明書の更新をXcodeで行う

# iOSアプリ開発の証明書をXcodeで更新する方法

<br>
2025年3月更新


以前はMacのキーチェーンアクセスなどを開く方法で更新していましたが、今はXcode上で簡単にできます。
キーチェーンアクセスを用いた方法はこちらに書いてあります。

細かく書きましたが、かなり大変だなと思います。

https://sunny10side.com/distribution-certificate/

<br>

<br>

# Xcodeで更新する手順
![SettingP.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1344207/3d9fa37e-ac56-d16c-8656-30bcfd2beeeb.png)
Xcodeのメニューから「Settings...」を選択します。

<br>

![AccountsP.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1344207/7abb15c3-c82b-6362-e6e1-03e5f8d4106a.png)

Accounts画面を開いて『Manage Certificates...』をクリックしてください。

<br>

![CredentialsP.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1344207/55d9db84-535b-b3e5-dd88-2d2873bbb384.png)
この時は『Mac Installer Distribution』の証明書期限が切れていたので赤バツが表示されてます。
なんの証明書が切れているのかすぐ分かるので便利だと思います。
あとは左下の『+』の画面を開いて更新したい証明書を選択します。

<br>

![Mac Installer Distribution.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1344207/666e6e8e-b1ff-d837-7626-4f43e96bc8ca.png)
更新する証明書を選択して『Done』をクリックして下さい。
これでApple Developerの証明書画面を開いて反映されてるか確認して下さい。

<br>

## 追記
以前はあったDistribution Managedという証明書なのですが現在は統合されているみたいです。

![スクリーンショット 2025-03-26 17.21.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1344207/37c89c1f-5c2c-46e9-88fd-0815c73d0653.png)

![スクリーンショット 2025-03-26 17.59.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1344207/43334103-09a6-4307-87ec-fad2cacee331.png)
詳細画面を開いても現在は「Revoke」しか選択できません。
現在は「Apple Distribution」に統合されていると思います。

![スクリーンショット 2025-03-26 18.09.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1344207/79390632-5516-4b86-9284-d39aac2adddc.png)

こちらを更新すれば特に問題ないでしょう。
以前のようにキーチェーンからのややこしい更新はないです。
Xcodeから更新できます。
「Download」のボタンがないのは証明書がどこかに統合されているという理解で良いと思います。
シリアルポートのノイズによりGRUBのカウントダウンが停止してLinuxが起動しない問題

# 何が起きたか
Linux (Red Hat Enterprise Linux) が POST 後の GRUB で停止する
* 複数台で発生
* OS 再起動したら最後、 OS が起動しないのでとても困る
* OS 再起動のたびに機械室へ出かけて直付けコンソールからエンターキーを押してあげないといけない

# 期待した動作
POST 後の GRUB メニューで 5 カウントダウン後に OS が自動起動する

# 原因
シリアルケーブルからのノイズの影響により、GRUB がシリアルポートからの入力信号を検知し、カウントダウンがキャンセルされたため

# 発生条件
サーバーのシリアルポート側にケーブルが接続され、かつ対向装置が未接続の場合（再現性有り）

（発生環境）
1. HPE ProLiant DL360 Gen11 （サーバー）
1. Red Hat Enterprise Linux 6.8　（Linux OS）
1. 太洋通信工業株式会社 NS-490 (DB9-RJ45変換コネクタ)　*1
1. Seiko SmartCS NS-2250　（コンソールサーバー）

*1: SmartCS/SmartCSmini シリアル接続機器一覧　にてHPサーバー旧機種動作確認済の記載あり
https://www.seiko-sol.co.jp/wp-content/uploads/2016/02/SmartCS_Connectionlist.pdf

（接続構成）
1+2---( LAN ケーブル約 30 メートル)---　3

# 解決方法
以下のいずれかを実施する。
1. キッティングの間はシリアルポートから LAN ケーブルを外す
1. コンソールサーバーにケーブルを接続する　#本運用時の接続構成
1. GRUB の Config 変更によりカウントダウンを無効化する

# 補足情報
* GRUB の Config 変更によりカウントダウンを無効化すれば、本事象は発生しない。
* サーバーのキッティング中だったため、コンソールサーバー側を未接続にしていた。接続したあとは本事象は発生していない。
* HPE サポートへ問い合わせたが、類似事例なしとのこと。
* Red Hat サポートによると、GRUB のカウントダウンがキャンセルされるのは、キーボード等からの入力があった場合とのこと。
rtx830　l2tp ipsec 接続

# やりたいこと
rtx830のl2tp ipsecでVPN接続
l2tp ipsecとは？
https://www.rtpro.yamaha.co.jp/RT/docs/l2tp_ipsec/index.html#outline
IPAがだしてるやつ。こういうのも見た方がいいよなあ～と思いながらみない。
https://www.ipa.go.jp/security/crypto/guideline/gmcbt80000005ufv-att/ipa-cryptrec-gl-3001-3.0.1.pdf

# 実現方法
pppoe接続。
ipv6プラス　ipv4 over ipv6　ipoe接続だとipv4アドレスを共有している契約だからネットボランチDNSでドメイン登録できなかった。
共有じゃなかったらできるのかは不明。
ヤマハのソフト使わないでwindowsの標準機能を使用してVPN接続
https://network.yamaha.com/products/software_service/yms-vpn8-license/index

⚫︎結果
rtx830のl2tp ipsecでVPN接続できた
pppoe接続が優先順位1でipoe接続が順位2
ip route default gateway pp 1 filter 500000 gateway tunnel 2
こんな感じのコマンドが登録されていた
ヤマハのソフト使わないでwindowsの標準機能を使用


# NW環境
[RTX830]----l2tp ipsec----[iphone]

# 設定


# その他
windows標準機能のVPN接続はサポートしてない。
https://www.rtpro.yamaha.co.jp/RT/docs/l2tp_ipsec/index.html#checked_client
※Microsoft社製Windows OSのL2TP/IPsec接続はサポートしません。

# 参考記事
○rtx830 vpn設定方法　v6プラス　ipoe接続だとネットボランンチ登録できなかった…PPPoE接続にしたら登録できた。
https://network.yamaha.com/setting/router_firewall/vpn/vpn_client/vpn-smartphone-setup-rtx1210

○PPPoE接続とIPoE接続
⚫︎pppoe
•概要
昔からあるインターネット接続方法。

•デメリット
ネットする時にネットワーク終端装置（ONUとかモデム）を経由するからアクセスが多いと通信速度が遅くなる可能性がある。高速道路料金所で車が溜まっていくように通信が貯まってしまうらしい。
ipv6対応サイトには通信できないが、なんか追加すると通信できる
以下引用
https://www.nttpc.co.jp/column/network/pppoe_ipoe.html
"ただし、PPPoE方式では「IPv6トンネル対応アダプター」やIPv6 PPPoE接続機能に対応した市販機器などを追加することによりIPv6方式のWebサイトにも接続可能です。"

⚫︎ipoe
•概要
ネットワーク終端装置（ONUとかモデム）を経由しないで通信する。

•デメリット
ipv4にのみ対応しているwebサイトには接続できない。
ipv4 over ipv6を使うとipv4対応のwebサイトにも接続できる。


○IPv6(IPoE)のまとめ　これすごいわかりやすいこれ
https://internet-manual.net/flets-ipv6-ipoe-connect-services/#toc14

○pppoe接続とipoe接続の併用
https://note.com/noblehero0521/n/n1fe57aca52c9
vpn接続はpppoe接続、lanの端末はipoe接続で分けれる？

○vpnはpppoe、lanの通信はipoeで分けれそう
https://blog.arthur1.dev/entry/2022/06/21/201016

○L2TP/IPsecを使用したリモートアクセス : Web GUI設定
https://network.yamaha.com/setting/router_firewall/vpn/vpn_client/vpn-smartphone-setup-rtx1210

○ネットボランチdnsについて
https://network.yamaha.com/knowledge/netvolantedns

○win11のビルトインのクライアント機能でipsec接続
https://sanuki-tech.net/and-more/2021/0829/


○ipoe ipv6プラス　ipv4 over ipv6 固定でipv4アドレスをもらうのでnetボランチdnsもできるっぽい
https://www.jpix.ad.jp/service/?p=3447

○ipv6プラス　ipv4 over ipv6 シェアでipv4アドレス使う
。これ使ってるからipoe接続した時に使いたいポートとか etボランチdnsとか使えない
https://gmobb.jp/service/gmohikari/?utm_source=toku2bb&utm_medium=service&utm_content=popular

○回線速度テスト
https://fast.com/ja/#

○ipoe接続ってセッション数ってあるの？ない！pppoeで使ってる認証機関を通らない。
https://help.iijmio.jp/answer/6110e231d12d3b001af1da83/#:~:text=IPoE接続にはセッション,数による制限はありません%E3%80%82

○ipv6使っているかテスト
https://test-ipv6.com/index.html.ja_JP

○pppoeとipoe接続を同時に使う場合の設定。いつかやる…いつか…
https://note.com/ks_ronronchi/n/nbf649ac2a8ea
https://qiita.com/hxbdy625/items/d9765e517e4322f0552e

○rtx830関連
技術資料
http://www.rtpro.yamaha.co.jp/RT/docs/#rt_fw
コマンドリファレンス
http://www.rtpro.yamaha.co.jp/RT/manual/rt-common/index.html
動作確認済みIPv6接続サービス
http://www.rtpro.yamaha.co.jp/RT/docs/ipoe_46/available_ipoe_46.html
v6プラスでインターネット接続
https://network.yamaha.com/setting/router_firewall/ipv6/v6plus