OmniAICreator/Qiita-1.07M huggingface dataset:
GoとPHPでの並行処理の違い

## はじめに

並行処理に特化しているとされるGoとウェブアプリの開発によく使われるPHPで並行処理の実現方法がどう違うのかまとめる。

### GoとPHPの並行処理における比較

| 比較項目         | Go                                    | PHP                                                     |
|------------------|---------------------------------------|---------------------------------------------------------|
| 基本設計         | 並行処理が言語レベルで組み込まれている | 並行処理は追加の拡張やライブラリを使う必要がある。         |
| プロセス         | 各リクエストは同じプロセスで処理される | 各リクエストは違うプロセスで処理される。        |
| 軽量性           | ゴルーチンは軽量で数千～数百万の並行タスクを処理可能。 | マルチプロセスはリソースを多く消費し、スレッドベースは限定的。 |
| 実装の簡潔さ     | シンプルな構文で並行処理を記述可能       | マルチプロセスやイベントループベースで複雑なコードになる場合が多い。 |
| スケジューリング   | Goランタイムが自動でゴルーチンをスケジュール | プロセスやスレッドのスケジューリングはOS任せ。           |
| 主な用途         | 並行処理が頻繁に必要で、高い性能を求めるアプリケーション（例：リアルタイム通信、マイクロサービス） | ウェブアプリケーションの開発。並行処理は補助的な役割で、イベントループライブラリを利用して解決可能。 |

### Goの並行処理の例

Goでは軽量スレッド（ゴルーチン）を使うため、簡潔なコードで高性能な並行処理が可能。

```Go
package main

import (
	"fmt"
	"time"
)

func task(name string) {
	for i := 1; i <= 5; i++ {
		fmt.Println(name, i)
		time.Sleep(500 * time.Millisecond)
	}
}

func main() {
	go task("Task A")
	go task("Task B")
	task("Main Task")
}
```

#### Goで平行処理を実現する際の注意点

複数のgoroutineから同じメモリ（変数）へ同時にアクセスする（そのうち1つは書き込みである）ことで、予期しないエラーの原因になる。この状態のことをRace Conditionという。

以下コードはnet/httpを使用したHTTPサーバで各リクエストがメモリ空間を共有することを確認する例。 
リクエストハンドラ内の変数cは全てのリクエストにおいて同じメモリ上のデータを指す。 したがって、アクセスのたびに変数cがインクリメントされる。

複数のリクエストが同時に発生した場合、変数cへ同時アクセスが発生し、Race Conditionになり、予期しないエラーが発生する可能性がある。


```Go
package main

import (
	"fmt"
	"log"
	"net/http"
)

var c int

func main() {
	http.HandleFunc("/count", func(w http.ResponseWriter, r *http.Request) {
		// リクエスト毎に別のgoroutineで実行される
		// 複数のリクエストによって同時に書き込みが発生する可能があり、cが意図しない状態の場合がある
		c++
		fmt.Fprintf(w, "count: %d, address: %v", c, &c)
	})

	log.Fatal(http.ListenAndServe(":8080", nil))
}
```

### PHPの並行処理の例

PHPは主に同期的な動作を想定して設計されていて、並行処理を実現するためには追加の拡張や工夫が必要。

**マルチプロセス**

pcntl_fork() を使用してプロセスをフォーク。
PHPはプロセスベースの動作が一般的で、スレッドを直接扱うことは少ない。

```php
<?php
function task($name) {
    for ($i = 1; $i <= 5; $i++) {
        echo "$name $i\n";
        sleep(1);
    }
}

$pid = pcntl_fork();

if ($pid == -1) {
    die("Fork failed");
} elseif ($pid == 0) {
    // 子プロセス
    task("Child Process");
} else {
    // 親プロセス
    task("Parent Process");
    pcntl_wait($status); // 子プロセスの終了を待機
}
```

**非同期ライブラリ**

・非同期I/O操作（例: HTTPリクエスト、ファイル操作）に適している。
・プロセスやスレッドを生成せずに、シングルスレッド内で複数のタスクを処理。
・パフォーマンスが高く、Webサーバーのバックエンドで利用されることが多い。

```php
<?php
require 'vendor/autoload.php';

$loop = React\EventLoop\Factory::create();

$loop->addTimer(1, function () {
    echo "Task 1 complete\n";
});

$loop->addTimer(2, function () {
    echo "Task 2 complete\n";
});

$loop->run();
```
numpyの勉強記録2

連投すみません。
もう１つ自分の学習用メモを。

# 【Python】`()`と`[]`の使い分けについて

Exersicesにおいて次のようなNumPyの5x5行列から下記の行列を抽出せよという問題がありました。

```python
import numpy as np
mat = np.arange(1, 26).reshape(5, 5)

array([[12, 13, 14, 15],
       [17, 18, 19, 20],
       [22, 23, 24, 25]])
```
最初
mat(2:, 1:) と書いてしまってエラーが出たのですが
いま( )と[ ]の使い分けが分からない。

# これまたチャッピー先生への質問と回答。

Q:pythonにおいて()と[]の使い分けは何ですか？

A：
Pythonでは()と[]は用途が異なります。

()の用途
関数の呼び出し: 例: mat.reshape(5, 5)
タプルの作成: 例: (2, 1)
[]の用途
インデックス指定やスライス: 例: mat[2:, 1:]
リストや配列の作成: 例: [1, 2, 3]
Javaのsealedクラスについて(JavaSE17Silverレベル)



:::note info
JavaSE17のSliverの学習で覚えにくいところを自分用にSAを作成
:::

## sealedクラス

final修飾子で継承できないクラスを定義することで不用意にサブクラスが継承されることは防ぐことができる。

<details><summary>finalの懸念点</summary>

(上に空行が必要)

```text
SuperClassを継承しサブクラスAとBを作成する際にfinalで修飾することでサブクラスAとBを継承したサブクラスを作ることを防ぐとことはできる。
しかし新たにSuperClassを継承したCクラスを作成することができてしまい、Cクラスにfinalをつけ忘れるとCクラスを継承したD、E、、、クラスを無限に増殖することができてしまう。
```
</details>

この状況を防ぐためにJava17からsealed classが登場した。
<details><summary>宣言は以下の通り</summary>

(上に空行が必要)

```java
public sealed class SuperClass permits A, B {
// something code
}
```
</details>

上記のクラスAとBは`final`、`sealed`、`non-sealed`のいずれかで修飾しなければコンパイルエラーになる。
上記それぞれの修飾子について説明しなさい。

<details><summary>final</summary>

(上に空行が必要)

```text
それ以上継承できないクラスを作成する。
```
</details>

<details><summary>sealed</summary>

(上に空行が必要)

```text
さらに継承できるクラスをpermits以下で指定する必要がある。
```
</details>

<details><summary>non-sealed</summary>

(上に空行が必要)

```text
継承できるクラスに制限を設けない。。
```
</details>


## sealed interface
<details><summary>sealed interfaceについて簡単に説明しなさい。</summary>

(上に空行が必要)

```text
sealed interfaceはsealed classと同様に使う。
使い方は同じで継承するinterfaceや実現するclassを制限することができる。
permitsで指定されたクラスやインターフェイスはsealed classと同様に`final`、`sealed`、`non-sealed`のいずれかで修飾される必要がある。
```
</details>

extends、implements、permitsはこの順番で記述しなければならい。
tmuxを遂に導入した

# 筆者について

```
name → Koki Teramoto
age → 18
language → ja_JP, en_US
```

# 本編

今日は共通テストでしたね！かくいう僕も受けていたのですが、とりあえずあのヒス構文ばあちゃんにはびっくりでした（）ここ数日は少し体調崩していたりGentoo LinuxをインストールしようとしてMacが落ちるなんてことをしてたらいつの間にかQiitaを書く日が少し空いてしまっていました。

https://x.com/_0_terarin_0_/status/1880145391192297517

ということで、今回はGentooでなんか色々ビルドしてる間に暇つぶしでやってたtmuxをインストールしていきたいと思います。

## tmuxとは

https://github.com/tmux/tmux/wiki

> tmuxはターミナルの多重化ソフトウェアです。複数のプログラム間を一つのターミナル内で切り替えたり、プログラムを分離したり（バックグランドで起動し続けます）、あるいは別のターミナルにつなげたりします。

なお、筆者の合ってるかわからん意訳なのでお気をつけください。ぜひ原文をご覧あれ。

## インストール

```bash
brew install tmux
```

## 使い方

`tmux`でプログラム入ります。そうすると、下にセッションが表示されます。

こっから色々コマンド使えます。

### 新しいセッションの作成

![Screenshot 2025-01-18 at 22.20.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583428/2457a71c-dd20-2175-3a95-7482b05c4580.png)

`Ctl +B`の後に `C` を押すと新しいセッションを起動できます。

### セッションの表示

![Screenshot 2025-01-18 at 22.23.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583428/2b3e971f-7f76-cd26-1487-aa77881f3f0f.png)

`Ctl +B`の後に `W` を押すとセッションを表示できます。

### セッションの横分割

![Screenshot 2025-01-18 at 22.23.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583428/21e0b31b-a08f-2225-d109-6e3b92211fb5.png)

`Ctl +B`の後に `%` を押すと新しいセッションを起動できます。

### セッションの縦分割

![Screenshot 2025-01-18 at 22.23.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583428/8c3fa40d-e193-1a7b-0ea8-fc4dba7ed4c8.png)

`Ctl +B`の後に `"` を押すと新しいセッションを起動できます。

これぐらいでしょうか。

# 最後に

これをSSHでうまいこと活用すればSSHが切断されてももう一度セッションに入ることができます。不安定なインターネット環境でSSHを使う時は確かに有効かもしれませんね！（よし、明日の２日目の準備だ）
hinemous

## hinemousがJavaで作られているので、Javaで学習のために読んでみる

## ping監視に関して

### ping監視がどのように実施されているか確認してみた。

https://github.com/hinemos/hinemos/blob/master/HinemosManager/src_ping/com/clustercontrol/ping/util/ReachAddress.java#L99

http://criticalbreak5.seesaa.net/article/414178749.html

```
// Reachability のチェック ICMP が使用される
				boolean isReachable;
				// isReachableがスレッドセーフではないため、同期
				synchronized (m_syncObj) {
					start = HinemosTime.currentTimeMillis();
					isReachable = address.isReachable(m_timeout);
					end = HinemosTime.currentTimeMillis();
				}

```

勝手にping実行しているんだろうって思っていたことが恥ずかしい。。。



Javaはpingコマンドは不要なんだ。

https://www.javainthebox.net/laboratory/J2SE1.5/TinyTips/Reachability/Reachability.html
Numpyを学びました

セクション5：Python for Data Analysis Numpyを視聴しました。

配列を自動生成するコードでどこまでの数が作成されるかの感覚が分からない

①np.arange(0,<font color="red">10</font>) 
　array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

②np.arange(0,<font color="red">11</font>,2)
　array([ 0,  2,  4,  6,  8, 10])

③np.linspace(0,<font color="red">10</font>,3)
　array([  0.,   5.,  10.])

それぞれ赤文字の部分がどの数までを出力するかを指示してると思うのですが
①、②のケースでは10まであるいは11までと指示してその１つ手前の数まで実際は出力されるので、あぁ１つ手前の数字まで出てくるんだなと思ってると
③のケースでは10までと指示して10まで出ている

| メソッド         | 第2引数の意味        | 含まれるか？   | 説明                                                                 |
|------------------|----------------------|---------------|----------------------------------------------------------------------|
| `np.arange`      | 終了値 (含まない)   | 含まれない    | 開始値から「終了値未満」まで指定されたステップで値を生成する           |
| `np.linspace`    | 終了値 (含む)       | 含まれる      | 開始値から終了値までを指定された要素数で等間隔に分割する               |

なぜ仕様が違う？
np.arange は整数値や浮動小数点数を一定のステップで生成するため、終了値を含めない方が多くの場合便利です（例えばループの範囲指定など）。
np.linspace は範囲を等間隔で分割する用途に特化しており、開始値と終了値を含める方が期待されるケースが多いです。


# 上記を受けてチャッピー先生への追加質問

終了値を含むか含まないかは丸暗記するしかないのでしょうか？
初めて使用するコードでどこまで含まれるかを判断する方法や根本的な原則はありますか？

# NumPy 配列生成メソッドの終了値の扱いを判断する方法

NumPyで`np.arange`や`np.linspace`を使う際、「終了値が含まれるか」を迷うことがありますが、以下のポイントを押さえると判断しやすくなります。

---

## 判断の原則

### 1. 用途で判断する
- **範囲やステップに着目するメソッド**  
  → 終了値は含まれないことが多い。  
  - 例: `np.arange`, `range`  
  - **理由:** 「開始値から終了値未満まで」の方がループや範囲指定に便利。

- **要素数や等間隔分割に着目するメソッド**  
  → 終了値が含まれることが多い。  
  - 例: `np.linspace`  
  - **理由:** 開始値と終了値を含む方が直感的。

---

### 2. Python設計の共通ルール
- **終了値は基本的に「含まれない (半開区間)」設計**が多い。  
  - 例: `range`, `np.arange`  
- **例外:** 等間隔分割など、両端を含める方が自然な場合。

---

### 3. 実際に試して確認
終了値が不明な場合は、少量の値で挙動を確認すると良いです。

```python
import numpy as np

# np.arange の例
print(np.arange(0, 5))  # [0, 1, 2, 3, 4]

# np.linspace の例
print(np.linspace(0, 10, 3))  # [ 0.  5. 10.]
```
ゴルーチン、チャネル【Go】

### ゴルーチン

goroutine (ゴルーチン)は、Goのランタイムに管理される軽量なスレッド。

```
go f(x, y, z)
```
と書くことで新しいgoroutineが実行される。

```Go
package main

import (
	"fmt"
	"time"
)

func say(s string) {
	for i := 0; i < 5; i++ {
		time.Sleep(100 * time.Millisecond)
		fmt.Println(s)
	}
}

func main() {
	go say("world")
	say("hello")
}
// hello
// world
// world
// hello
// hello
// world
// world
// hello
// hello
```

### チャネル

チャネル( Channel )型は、チャネルオペレータの ```<-``` を用いて値の送受信ができる通り道。
通常、片方が準備できるまで送受信はブロックされる。

```
ch <- v    // v をチャネル ch へ送信する
v := <-ch  // ch から受信した変数を v へ割り当てる
```

チャネルは使う前に以下のように生成する。

```
ch := make(chan int)
```


```Go
package main

import "fmt"

func sum(s []int, c chan int) {
	sum := 0
	for _, v := range s {
		sum += v
	}
	c <- sum // send sum to c
}

func main() {
	s := []int{7, 2, 8, -9, 4, 0}

	c := make(chan int)
	go sum(s[:len(s)/2], c)
	go sum(s[len(s)/2:], c)
	x, y := <-c, <-c // receive from c

	fmt.Println(x, y, x+y)
}
// -5 17 12
```

#### バッファ

make の２つ目の引数にバッファの長さを指定できる

```Go
package main

import "fmt"

func main() {
	ch := make(chan int, 2)
	ch <- 1
	ch <- 2
	fmt.Println(<-ch)
	fmt.Println(<-ch)
}
// 1
// 2
```
Elasticsearch・Kibanaを学習するサイトと教材

こんにちは。
チームでElasticsearchを使用しているため、どんな学習教材があるか調べてみました。



## Elasticsearchとは？

Elasticsearchは以下のような特徴を持つ強力な検索エンジンです

- 高速な全文検索機能
- スケーラブルな分散システム
- リアルタイムデータ分析
- 柔軟なドキュメント管理
- 豊富なAPI群



## 学習リソース紹介

### 1. Udemy

#### 日本語動画
https://www.udemy.com/course/elastic-search/?referralCode=F0B81F4912623FA350E8

日本語の動画が1本だけありました。基礎的なことの確認には良さそうです。

#### 英語動画
https://www.udemy.com/course/elasticsearch-complete-guide/


### 2. 公式ドキュメント
ざっと読みました。

- [Elastic公式ドキュメント（日本語）](https://www.elastic.co/guide/jp/index.html)
- [Getting Started Guide](https://www.elastic.co/guide/en/elasticsearch/reference/current/getting-started.html)

### 3. その他の記事

- [はじめてのElasticsearch](https://qiita.com/nskydiving/items/1c2dc4e0b9c98d164329)
- [Elasticsearch とは何か?](https://aws.amazon.com/jp/what-is/elasticsearch/)

### 4. 書籍
日本語書籍もいくつかありました

#### Elasticsearch実践ガイド

https://aws.amazon.com/jp/what-is/elasticsearch/

#### Elastic Stack実践ガイド[Elasticsearch/Kibana編] 

https://amzn.asia/d/3Y2AJKR
IBMのメインフレームの教材が良かった

[IBM Z Xplore](https://www.ibm.com/z/resources/zxplore)というオンライン教材に取り組みました。この教材では、JCL、REXX、COBOLといったメインフレーム技術に触れることができるようになっています。初心者でもスムーズに始められる工夫が多く、学習のモチベーションを保ちながら進められる内容になっていました。

## IBM Z Xploreの良かった点

- 無料で利用可能
    - メインフレームの学習は、環境構築やツールのコストが課題になりがちですが、そのハードルが低く抑えられています。

- VS Codeで実機アクセス
    - IBM Z Xploreでは、VS Codeを使用して実際のメインフレームにアクセスします。これにより、TSOの操作に不慣れな人でも安心して学習に集中できる環境が整っています。例えば、簡単なJCLのジョブを実行したり、COBOLプログラムをコンパイルして実行する課題も直感的に進められました。

- オープンバッジが取得可能
    - 各コースを修了すると、スキルを証明するオープンバッジがもらえます。このバッジは履歴書やLinkedInでのプロフィールに記載できるので、学習の成果を形として残せるのが魅力的です。

メインフレームの担当になった方は、取り組んでみてはいかがでしょうか。
IAM Identity Centerを使ってみた

# はじめに
Spring Boot から Spring Cloud AWS を利用して Parameter Store の設定情報を参照したい。
という所で、接続方法を見たら何パターンか発見。

ローカルからは、~/.aws/credentials で良いかな。と思い、以前の記憶を辿ってIAMユーザを作ろうと思ったら、AWSの画面上で IAM Identity Center を進められたのでそちらでユーザを作成。

IAM Identity Center を使ってよかったと思った事をを残しますので、ご参考になれば幸いです。

# 良かった点
### 有効期限を設定できる
以前からアクセスキーが気づかず流出したらどうしよう。という心配がありました。

IAM Identity Centerで作成したユーザのKEYは、有効期限が設定できるので大分安心です。

分単位で最小15分の設定が可能のようでした。（その１）
試しに15分設定をしてみたが、実際にアクセス不可になったのは大体1時間程度後でした。

何故だろう？と調べてみて、以下の情報をみたら2つの有効期限があることを発見。

https://dev.classmethod.jp/articles/aws-iam-identity-center-has-2-sessions-access-portal-and-iam-role/

試しに、もう1つを2時間に変えてみたら、2時間程度でアクセス不可になりました！（その２）
もう１つは時間単位で最小1時間でした。

### 有効期限の設定方法
#### その１
設定 → 認証 → セッション設定 → 設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206526/4ee4a380-9d7b-f26d-61e3-e315fbdb3ed3.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206526/70460fca-6c4f-d750-17db-199b10d317d2.png)

#### その２
許可セット → 許可セット名 → 全般設定
※ 画像の許可セット名のdeveloperは任意の名称です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206526/12454d1c-1cf6-87df-be0e-ac03a01b793b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206526/0afba0a0-c5bb-e219-07ac-55b4a5d67cc7.png)


# 参考資料
https://docs.aws.amazon.com/ja_jp/singlesignon/latest/userguide/user-session-duration-how-to-configure.html

https://github.com/awspring/spring-cloud-aws?tab=readme-ov-file

https://docs.awspring.io/spring-cloud-aws/docs/3.2.1/reference/html/index.html

https://docs.awspring.io/spring-cloud-aws/docs/3.2.1/reference/html/index.html#spring-cloud-aws-parameter-store

https://dev.classmethod.jp/articles/aws-iam-identity-center-has-2-sessions-access-portal-and-iam-role/
【GitHub】新規リポジトリの作成方法

# 記事概要
GitHubで新規リポジトリを作成する方法をまとめる。

# 前提
- GitHubアカウントは作成済みである
- GitHub DesktopをPCにインストール済みである
- GitHubに登録するアプリケーションは作成済みである

# 手順1(事前準備)
ディレクトリの情報を記録する隠しファイル(.DS_Store)をGitの管理対象外にする

1. ターミナル.appで下記コマンドを実行する
    ```
    % git config --global core.excludesfile
    ```
    1. 結果が`/ホームディレクトリパス/.gitignore_global`の場合は手順2へ進む
    1. 結果が上記以外の場合は次ステップへ進む
1. VSCodeで「Command + O」からホームディレクトリを開く
    - .gitignore_globalファイルが存在するディレクトリ配下は、隠しファイルをGitの管理対象外とする
    - ホームディレクトリに隠しファイルを配置すると、PC内のアプリは全てGitの管理対象外になる
    - 外付けHDDなどでアプリを作成する場合、ホームディレクトリ配下ではないので注意が必要である
1. ファイル`.gitignore_global`を新規作成する
1. 上記で作成したファイルに、`.DS_Store`と記述する
1. ターミナル.appで下記コマンドを実行する
    ```
    # ホームディレクトリに移動
    % cd ~
    
    # 隠しファイル".DS_Store"をGitHubの管理対象外にする
    % git config --global core.excludesfile ~/.gitignore_global
    
    # 隠しファイル".DS_Store"をGitHubの管理対象外にできたことを確認
    % git config --global core.excludesfile
    # => /ホームディレクトリパス/.gitignore_global
    ```

# 手順2(.DS_Storeファイルを管理対象外に変更)
ディレクトリの情報を記録する隠しファイル(.DS_Store)をGitの管理対象外にする

1. VSCodeでアプリを開く
1. アプリ直下にある`.gitignore`ファイルの一番下の行に、`.Ds_Store`と追記する
    ```
    # (# Ignore master key for decrypting credentials and more.)の最終行に追記
    
    # Ignore master key for decrypting credentials and more.
    # 中略
    .Ds_Store
    ```

# 手順3(リポジトリ情報の再作成)

1. アプリケーションの作成方法を確認する
    1. クローンしたアプリケーションの場合は次ステップへ進む
    1. クローンしたアプリケーションでない場合は手順4へ進む
1. ターミナル.appで下記コマンドを実行する
    ```
    # アプリのディレクトリにいることを確認
    % pwd
    /~/[アプリ名]
    
    # ディレクトリが存在することを確認
    % ls -a | grep .git
    .git
    .gitignore
    
    # .gitを強制削除
    % rm -rf .git
    
    # .gitが存在しないことを確認
    % ls -a | grep .git
    .gitignore
    
    # ローカルリポジトリの作成
    % git init
    ```

# 手順4(ローカルリポジトリの作成)
1. GitHub Desktopを開く
1. 「Add Existing Repository...」をクリックする
    - 初回作成時
        - GitHubアプリのTOP画面の左下にある「Add Existing Repository...」をクリック
    - 初回以降
        - 左上の「Current Repository」をクリック
        - 「Add」をクリック
        - 「Add Existing Repository...」をクリック
1. GitHubで管理したいアプリのディレクトリを選択する
    - Local Pathは、/~/[アプリ名]となること
    - 下記エラーが表示される場合
        [![Image from Gyazo](https://i.gyazo.com/7990710e5b8407d1dca5681165691fff.png)](https://gyazo.com/7990710e5b8407d1dca5681165691fff)
        1. `create a repository`をクリックする
        1. 設定を変更せず、`Create Repository`をクリックする
            - 「Name」にはアプリ名を記述
            [![Image from Gyazo](https://i.gyazo.com/a3f054f49b995f4096d0a5ef8b6f0520.png)](https://gyazo.com/a3f054f49b995f4096d0a5ef8b6f0520)

# 手順5(初回コミット)
1. 自動で「Initial commit」が行われるため、手動実行は不要である
    - 自動実行されない場合
        1. 「Summary」に`Initial commit`と記述してコミットする
    - 「History」タブにて、初回記録を確認できる

# 手動6(リモートリポジトリの作成)
1. 「Publish repository」をクリックする
1. 「Keep this code private」のチェックを外す
    - 「Keep this code private」にチェックが入っていると非公開になる
    - 「Name」にはアプリ名を記述
    [![Image from Gyazo](https://i.gyazo.com/3f9b818fee8c5b4b6d4d5679b2b2f2b4.png)](https://gyazo.com/3f9b818fee8c5b4b6d4d5679b2b2f2b4)
1. 「Publish Repository」をクリックする
1. リモートリポジトリが作成できているか、[GitHubサイト](https://github.com/)で確認
    「Repositories」に表示されていればOK
今週の学習記録（2025/1/12～2025/1/18）

## 🔍 学習内容
- **学習テーマ**: HTMl css, JavaScript, Git
- **使用した教材**: CodeLesson, Qiitaなど

## ✏️ 学んだこと
### 主なポイント
- flexBox, Gridレイアウトを使用した要素の配置
- Gitの基礎コマンド、プルリクエストの作成
- JavaScript基礎

## 💡 学び・反省点
### 学び
- 分割代入使用することでオブジェクトの複数のプロパティに値を代入することができる
- スプレッド構文を使用することで、配列やオブジェクトを展開することができる。
- splice(開始地点, 削除する個数, 通過する要素n)
- mapは新しい配列を返すが、forEachは処理を実行するだけで配列は返さない。
- vscode上でブランチ作成やマージが簡単にできる。
- then,catchを使用することで成功時、失敗時の処理を管理することができる。

### 反省点
- 前回同様、毎日の学習は継続できたが、学習時間をもう少し増やしたかった。


## 📆 次週の予定
### 目標
- JavaScript基礎を完了させる

### 行動計画
- 通退勤時間も積極的に学習する。
- 帰宅時にダラダラせずさっさと学習を始める。
- 休日だからといって昼近くまで寝ない。

## 🏄‍♂️所感
　今週からJavaScriptの学習を本格的に始めました。基礎文法は知っていたのでスプレッド構文や配列のメソッドなどJS独自の記法を学習しました。
　来週でJavaScriptの基礎を完了させ、TypeScript等の学習に入りたいと思います。
【Unity初心者】Unityでネットゲームを作りたい【6】ゲームの流れを考え直さないとダメだ


https://qiita.com/ysyss5500/items/4aeb23639a8cf3d67376

### ゲームの流れを考え直さないとダメだ
ログイン時にJsonを配列で使えるようにしても、他では意味なさげ
voidで関数書いてるから他で参照できない
多分やりようがありそうだけど、今の私には無理
ログインはログインにして、他で何とかしないとかな...

初心に帰り、今までやってきたことから流れを考えフローチャートにしてみた
###### 構想したおおまかなゲームの流れ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3979014/28a18b9e-0bae-04e0-84ac-7f9a81d2ba7e.png)

Json保存は一連の文字列でおｋ
他で読み込んだ時に、Unityで使える形に変更して使う

まだ間違ってる気がする...

問題は、メイン画面時にプレイヤデータを表示できるか
表示するテキストにプレイヤデータを毎回取得する処理をしなければならないかも
Json保存したところから読み込めばおｋかな...

今まで苦労したことは勉強になったからそれで良しとする

←前  [【Unity初心者】Unityでネットゲームを作りたい【5】PlayFabからプレイヤーデータ(Json)・タイトルデータ(Json)をログイン（新規も）時に取得して配列に設置後、どこでも使えるようにしたい](https://qiita.com/ysyss5500/items/9d76c18c054f8a6881f3)

[【Unity初心者】Unityでネットゲームを作りたい【7】PlayFabから読み取ったデータをゲーム内にJsonで保存する～画面に名前を表示してみる](https://qiita.com/ysyss5500/items/ad9a61aeb3fd758b4797)　次→


https://qiita.com/ysyss5500/items/4aeb23639a8cf3d67376
検索AIエージェント　Feloがすごい

検索AIエージェント　Feloを使ってみた
![スクリーンショット 2025-01-18 210609.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3921190/70e9eaba-4726-ae60-94b4-644a452ec35e.png)
2025年はAIエージェント元年と呼ばれ、ソフトバンクの孫さんも３年以内にAIのエージェントが一人一人につくような時代となるといっていることも注目されてます。

![スクリーンショット 2025-01-18 205636.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3921190/a8ffcb64-e24c-ad9e-b084-1aafdd8fd504.png)
検索AIエージェントの「検索代理」機能を使用しました。
![スクリーンショット 2025-01-18 205655.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3921190/12eeffb5-eeca-eb24-863e-c8845b11a653.png)
ほぼプロンプトを書かずに、こういった検索に使用するテンプレートが用意されているのも使いやすいポイントです。（自分のテンプレートを作成することもできます。）（ポイント１）
![スクリーンショット 2025-01-18 205724.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3921190/802ad87f-f046-1d04-a0e2-227448d82637.png)
今回は、私の興味のある「プログラム医療機器」についてエージェントに調べてもらいました。
![スクリーンショット 2025-01-18 205816.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3921190/e95b6430-a595-2889-c203-168133eb893f.png)
普通の文章生成AIのように調べた情報とまとめてくれるだけでなく、そのソース（どこの文章か、まで！）も教えてくれます。（ポイント２）
![スクリーンショット 2025-01-18 205832.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3921190/db539f24-38d0-1ee8-285f-6d908340607d.png)
生成した文章からマインドマップを作成したり、Notionに保存することができる点も使いやすさの工夫が見られます。（ポイント３）
![スクリーンショット 2025-01-18 205846.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3921190/7ccac475-72dc-f82b-829a-5a0e6287e258.png)
それだけでなく、調べた内容をプレゼンテーション資料にまとめる機能もあります！！（ポイント４）
![スクリーンショット 2025-01-18 210002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3921190/3bfbf128-7af7-17c8-718c-b02e3788755f.png)
このように情報を全速力で読んでくれます。
![スクリーンショット 2025-01-18 210011.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3921190/82671bbd-1a7b-a656-4526-59e164f9f810.png)
あとは次へを押して
![スクリーンショット 2025-01-18 210028.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3921190/6f33bc4b-ac38-41ca-f082-4d5ced4bf24e.png)
かっこいいテンプレートから好きなものを選んで待つだけ。
![スクリーンショット 2025-01-18 210224.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3921190/06d60d9e-9162-aec5-4d2d-88a98195e2f8.png)
![スクリーンショット 2025-01-18 210254.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3921190/e2755f93-1468-e9fe-5eb0-22ffc700654a.png)
これはAIが作成したものそのままのものですが、自分で微調整することもできます。Canvaと連携することができる点もポイントです。（ポイント６）

まとめ
Feloの機能と６つの嬉しいポイントを記載しました。
Feloは、新しい分野について知りたいときや、ある分野の調査資料を作成したいとき、マーケットの市場調査などを圧倒的な速さと質で行うことができます。

調べたものをソース付きでまとめてプレゼン資料まで作成したい大学生や、企業について正しい方法で分析したい就活生、新商品や市場について体系的に理解したい社会人の方などにかなり役に立ちそうです。
Laravel Artisan – `php artisan about` の出力まとめ

`php artisan about` コマンドは、Laravelアプリケーションの基本情報や環境設定を一覧表示します。以下に、その出力結果を解説つきでまとめます。

---

## **環境情報**

| 項目                  | 値                         | 解説                                  |
|-----------------------|----------------------------|---------------------------------------|
| Application Name      | Laravel                    | アプリケーション名。`config/app.php` の `name` 設定から取得されます。 |
| Laravel Version       | 11.38.2                   | 現在のLaravelフレームワークのバージョン。 |
| PHP Version           | 8.2.26                    | サーバーで使用されているPHPのバージョン。 |
| Composer Version      | 2.8.3                     | プロジェクトの依存管理ツールComposerのバージョン。 |
| Environment           | local                     | 現在のアプリケーション環境（例: `local`, `production`）。`APP_ENV` で指定。 |
| Debug Mode            | ENABLED                   | デバッグモードの有効/無効。`APP_DEBUG` の値で制御。 |
| URL                   | localhost                 | アプリケーションのベースURL。`APP_URL` で設定。 |
| Maintenance Mode      | OFF                       | メンテナンスモードの状態。`php artisan down` や `up` で制御可能。 |
| Timezone              | Asia/Tokyo                | アプリケーションで設定されているタイムゾーン。`config/app.php` の `timezone` から取得。 |
| Locale                | ja                        | アプリケーションの言語設定。`config/app.php` の `locale` から取得。 |

---

## **キャッシュ情報**

| キャッシュ項目       | 状態                       | 解説                                  |
|----------------------|----------------------------|---------------------------------------|
| Config               | NOT CACHED                | 設定キャッシュの状態。`php artisan config:cache` でキャッシュ化可能。 |
| Events               | NOT CACHED                | イベントとリスナーのキャッシュ状態。`php artisan event:cache` でキャッシュ可能。 |
| Routes               | NOT CACHED                | ルート情報のキャッシュ状態。`php artisan route:cache` でキャッシュ可能。 |
| Views                | CACHED                    | ビューのキャッシュ状態。`php artisan view:cache` でキャッシュ化されたことを示す。 |

---

## **ドライバ情報**

| ドライバ             | 設定                       | 解説                                  |
|----------------------|----------------------------|---------------------------------------|
| Broadcasting         | log                       | ブロードキャスト（リアルタイム通知）のドライバ設定。`config/broadcasting.php` で管理。 |
| Cache                | database                  | キャッシュストレージの設定。`config/cache.php` で管理。 |
| Database             | mysql                     | 使用しているデータベース接続。`config/database.php` の `default` 設定から取得。 |
| Logs                 | stack / single            | ログストレージの設定。`config/logging.php` で管理。 |
| Mail                 | log                       | メール送信ドライバの設定。`config/mail.php` で管理。 |
| Queue                | database                  | キューストレージの設定。`config/queue.php` で管理。 |
| Session              | database                  | セッションストレージの設定。`config/session.php` で管理。 |

---

## **Livewire情報**

| 項目                 | バージョン                 | 解説                                  |
|----------------------|----------------------------|---------------------------------------|
| Livewire             | v3.5.18                   | Laravelのリアクティブコンポーネントフレームワークのバージョン。`composer.json` から取得。 |

---

このコマンドを使うことで、アプリケーションの構成や状態を簡単に確認できます。開発やデバッグ作業の効率化に役立ててください！
プロキシサーバを作成してみる (docker使用)

## はじめに
本記事はインフラ未経験者がとりあえずサーバー立ててみよう！と思い、アウトプットがてら作成した記事です。
そこまで深い情報は掲載されておりませんのであしからず。

※本記事で行った作業はdockerが使用できる環境にあることが前提となります。

## プロキシサーバーとは
↓参考文献です。
[プロキシサーバーとは？使用上のメリットと4つの注意点](https://jp.norton.com/blog/privacy/proxy-server)

## 手順1 (サーバー作成準備)
クライアント + 2台のサーバーが必要なので docker で作成していきます。

※今回 debian で作成するので以下を実行
```ruby:コマンドプロンプト
docker pull debian
```

ここからはコマンドプロンプトを3枚開いて作業します。

以下を実行
```ruby:クライアント (CMD1)
docker run -it --name client debian /bin/bash
```

※ローカルのポートは空いているポートなら何でもよいです。今回は(8080)を使用
```ruby:WEBサーバー (CMD2)
docker run -it --name web -p 8080:80 debian /bin/bash
```


※今回 Squid で作成するのでデフォルトのポート(3128)を指定しています。ローカルは空いていれば...(以下略)
参考：[デフォルトでは、Squid プロキシーサービスは、すべてのネットワークインターフェイスの 3128 ポートをリッスンします。](https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/7/html/networking_guide/configuring-the-squid-service-to-listen-on-a-specific-port-or-ip-address#configuring-the-squid-service-to-listen-on-a-specific-port-or-IP-address)
```ruby:プロキシサーバー (CMD3)
docker run -it --name proxy -p 3128:3128 debian /bin/bash
```

## 手順2 (WEBサーバー作成)
apache をインストールします。
```ruby:WEBサーバー (CMD2)
#パッケージリスト更新
apt-get update
#apacheインストール
apt-get install apache2
#起動確認 Starting Apache... がでれば成功
/etc/init.d/apache2 start
```
localhost:8080にアクセスして確かめます。
以下が表示されればOK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3897239/506fe280-70fc-7d59-3a0f-809cd5881af5.png)

## 手順3 (プロキシサーバーの作成)
Squid をインストールします。
```ruby:プロキシサーバー (CMD3)
#パッケージリスト更新
apt-get update
#Squidインストール
apt-get install Squid
#エディタインストール 今回vim
apt-get install vim
#起動確認 Starting Squid... がでれば成功
/etc/init.d/squid start
```
Squidの設定を変更します。
```ruby:/etc/squid/squid.conf
#vi /etc/squid/squid.confを実行して編集
# /http_access deny allで検索して対象行を探す

#編集前
http_access deny all
#編集後
http_access allow all
```
設定変更したので Squid を再起動
```ruby:プロキシサーバー (CMD3)
/etc/init.d/squid restart
```

## 手順4 (プロキシ経由でWebサーバーへアクセス)
```ruby:クライアント (CMD1)
#curlをインストール
apt-get install curl

# ➀プロキシ経由で接続
curl -s http://[コンテナ:WEBのIP]:80 -x http://[コンテナ:proxyのIP] | grep "<title>"
#結果は以下になればOK
#<title>Apache2 Debian Default Page: It works</title>

# ➁直接接続
curl -s http://[コンテナ:WEBのIP]:80 | grep "<title>"

# ※コンテナに割り当てられているIPアドレスは以下で出力されるJSONの"IPAddress"で確認できます。
docker inspect -f "{{json .NetworkSettings.Networks}}" [コンテナ名]
```
WEBサーバーのアクセスログを確認してみる。
プロキシサーバーからのIPとクライアントPCのIPが記載されているはず
```ruby:WEBサーバー (CMD2)
#最新の5行を取得
tail -n 5 /var/log/apache2/access.log
```
web、clientのIPが記載されていればOK
例：筆者の環境でのログ(一部抜粋)　
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3897239/25fba659-3b73-8dc8-abcc-f212493a872d.png)

以上で基本的なところは終了です。

## 終わりに
プロキシサーバの設定(アクセス制限等)を変更するには「/etc/squid/squid.conf」を触ればよいそう。
参考：[Squidのプロキシサーバ設定は、すべて/etc/squid/squid.confファイル内で行います。](https://www.novell.com/ja-jp/documentation/sles11/book_sle_admin/data/sec_squid_configfile.html)

本記事はここまでなので気になる方は是非。
ChatGPTタスクにエンジニア生活を変えるだけのインパクトを感じた話

ChatGPTタスクがリリースされたので、さっそく使ってみた系の記事です。

手前味噌にはなりますが、リリースされた翌日に使ってみた感想を自サイトに投稿しておりますので、使い方であったり細かい仕様は、以下の記事を参照してください。

https://ar-aca.tech/posts/chatgpt-task-beta-review/

こちらの記事は、少し使ってみて、ChatGPTタスクが、エンジニアとしての習慣を変えるような、かなりインパクトのあるサービスだと感じたので、改めて投稿しました。

では、さっそくどのように活用しているのかを紹介したいと思います。

# プログラミング学習の習慣化に活用
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490265/448d7f7c-2689-cca0-d3e1-dc8020158484.png)
毎朝、こんな感じで提案してきてくれます。

英語で提案してきていますが、これは私が英語の勉強も一緒に出来ていいなあと思っているからで日本語で提案してって頼んだら日本語でも提案してきてくれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490265/cb0763da-74be-98be-9568-bf18a61af1a3.png)


素晴らしいのは、これまでの私とのやり取りのメモリを参照し、getWeeklyProgress functionを最適化しませんか？などと提案してきてくれるところです。

また朝活って何をやるのかを考えることにコストを使ったりするので、これしませんか？ってメニュー考えてくれるのはとても嬉しいですね。もちろん、その通りじゃなくてもいいので、そのあたりも柔軟です。

さらに学習した内容をレビューしてくれたり、毎日の報告を積み重ねることで、より精度の高い学習プランを提案してくれるようになります。

# 1日の終わりにリマインドしてくれる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490265/577f43ec-3517-7d8d-3da2-f1d25a5b5169.png)

私の場合は今日の作業をpushし忘れることがあるので、リマインダーを設定していたのですが、今はChatGPTタスクだけに任せています。

何が良いって同じチームのメンバー感があっていいなあと思っています。

またタスクが終わっていない場合は、同じチャット画面から相談できますので、次からはどうしたらいいか聞いて、その改善施策もタスクに組み込んだりできるのがとても良いです。

# まとめ
いかがだったでしょうか？私としては、かなりインパクトのあるサービスだと感じて、日々活用しています。

他にも良い使い方は無数にあると思うので、みなさんのおすすめのChatGPTタスクの活用方法などありましたら、ぜひ、コメントで教えてください。
#13.使用したKubernetesのコマンド

# はじめに
私がKubernetesを学習している際に使用したコマンドをまとめてみました。
※あくまで私がKubernetesの環境を構築する際に使用したコマンドになります。

かなり使った★★★ 
まあまあ使った★★
あまり使わない★


### ★★★

- Podの適用（Podの作成の役割も担う）
```
kubectl apply -f {yamlファイル名}
```
- Podの内容確認
```
kubectl describe pod {Pod名} -n　{namespace名}
```
- Podのログ確認
```
kubectl logs {Pod名} -n {namespace名}
```

- Podの状態確認
```
kubectl -n {namespace名} get ingress,secret,service,deployment,statefulset,pod,pvc
```
※指定するサービス名やコンポーネント名は適宜変更できます。
- Pod内の環境に接続（Pod内で最初に定義されたコンテナに接続）
```
kubectl exec -it {Pod名} -n {namespace名} -- /bin/bash
```

- Pod内の環境に接続（指定したコンテナに接続）
```
kubectl exec -it {Pod名} -n {namespace名} -c {コンテナ名} -- /bin/bash
```
- Podのログ確認
```
kubectl -n {namespace名} log {Pod名}
```
### ★★

- Podの削除
```
kubectl delete pod {Pod名} -n {namespace名} 
```
- pvcの削除
```
kubectl delete pvc {pvc名} -n {namespace名}
```
これらのコマンドを本番環境で使用する事はあまりないと思いますが、
学習中に誤った設定や不備が原因で不要なデータが保持されることがあったため、
これらの削除コマンドを多用していました。
また、Podの削除は```replica set```を設定することで、オートヒーリング機能によるPodの再起動として使用していました。

### ★
- ネームスペースの作成
```
kubectl create namespace {namespace名}
```
- ネームスペースの削除
```
kubectl delete namespace {namespace名}
```
- sercretファイル読み込み確認
```
kubectl describe secret {secret名} -n {namespace名}
```
- sc（StorageClass）の確認
 ```
 kubectl get sc
```
KubernetesがPVを自動的に作成する際に、上記のscが必要になります。

PVCでscにボリュームの作成を申し込み⇒PVC（Podが必要としているボリュームの情報）を基にsc（scはボリュームを作成する際の方法や設定）がPV作成するイメージ。

デフォルトはノード（ホストマシン）から必要分のボリュームを作成します。

# まとめ
まとめてみると使用したKubernetesのコマンドの種類は多くはなかったのですが、
Kubernetesは動作の際に確認するサービスやコンポーネントが多いうえに、確認結果の表示形式も異なるので、
確認コマンドを使用する際は、確認観点を明確にしておくことが重要です。
さらに、Kubernetesでは多くの便利なコマンドが提供されており、詳細が気になる方は公式ドキュメントを確認するとよいかもしれないです。


■参考リンク

https://kubernetes.io/ja/docs/reference/kubectl/
PlatformIOでUnknown board ID 'm5stack-cores3' が出た場合

# エラー内容
PlatformIOで、M5Stack CoreS3 SEを使用しようと思ったら、以下のエラーが発生しました。

`
UnknownBoard: Unknown board ID 'm5stack-cores3'
`

・実際にエラーが発生した画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21408/6580060a-de4f-96eb-9c49-077605d9598b.png)

# 対応方法
「Platforms」の「Espressif 32」のバージョンを上げる！
自分の場合は、「6.1.0」→「6.9.0」にアップしました。これだけです。
普段全然意識したことがなかったので、困った人がいたら参考まで。
「Updates」より、インストールされている環境のアップデートが出来るので、こちらで対応できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21408/b3719df9-b8a9-65c3-4843-51b2ebb2a998.png)

# その他
最初は、platform.iniのboard設定が間違っているのかと思い、いろいろ調べていたのですが、実際にはこちらでした。

# 参考リンク
尚、その他のモジュールでも過去に同様なことが発生して、記事にしてくれている方がいたので、比較的スムーズにトラブルシューティングすることができました。感謝！

https://qiita.com/hamukun8686/items/e3666e1a6db60e36c2f9

https://qiita.com/tichise/items/54def94e70134742e73a
Databricksクラスター作成画面のリニューアル

以前からクラスター作成画面の**シンプルなフォーム**の存在には気づいていましたが、最近になって**シンプルなフォーム**がデフォルトでオンになっていることに気づきました。

![Screenshot 2025-01-18 at 19.56.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/b7d8747d-19f1-41b2-63d9-88bfa6686f43.png)

名前の通り、指定する内容が簡略されたフォームとなっています。旧来の作成画面とのマッピングは以下の通りです。

![Screenshot 2025-01-18 at 20.53.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/9e321094-141c-4cfa-c92f-2218a084e25f.png)


大きな変更点は以下の通りです。

| 項目 | 従来 | (新)シンプルなフォーム |
|:--|:--|:--|
| Databricksランタイム  | MLか非MLかを選択してランタイムを選択  | **機械学習**のチェックでMLランタイムか否かを選択  |
|  Driverノードのスペック | デフォルトはワーカーノードと同じ  | 選択項目は**高度なパフォーマンス**の下に。デフォルトは自動でワーカーノードと同じVMが選択される  |
| マルチノードかシングルノードか  | ラジオボタンで選択  | ワーカータイプ右側の**シングルノード**チェックボックスで選択  |
| 自動停止  |  **非アクティブ時間が...** で指定 | 指定場所が**高度なパフォーマンス**の下に移動  |
| アクセスモード  | **アクセスモード**で選択  | **Advanced**配下で指定。デフォルトはクラスター構成に基づいて自動でアクセスモードを選択する**自動**に  |

これまでにも「MLランタイムを選択するのを忘れた」という声を伺っていましたので、ランタイム選択の改善は個人的にも嬉しいです。それ以外の部分に関しても、デフォルトで最適な設定を自動で最選択するという考え方で再設計されたと私は認識しています。

シンプルなフォームをオフにすることで従来の画面に戻すことも可能です。

![Screenshot 2025-01-18 at 20.26.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/bf2c0126-2be7-c94d-4d49-0c265f930f1c.png)

### はじめてのDatabricks

[はじめてのDatabricks](https://qiita.com/taka_yayoi/items/8dc72d083edb879a5e5d)

### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
【初心者がかく】動的計画法（株価の変動）【競技プログラミング】

## はじめに

私は本当に動的計画法（を含む競技プログラミング）が苦手で...

とりあえず株価の変動だけでも頑張り，ちゃんと理解できた気がするので書き殴る！
おバカな人向けです！

## 設定

- 株価のリスト prices が与えられる（例：`prices = [3, 2, 6, 5, 0, 3]`）
- 株を買う（1回）→売る（1回）の操作を1回の取引とする
- 最大 k回の取引 をして得られる利益を最大化する方法を考える

## コード

実際のコードは以下です．まだ理解しなくて良い．空間計算量が良いverは[リンク先](https://qiita.com/grouse324/items/a5c3fd585affcecadb61)を参照してください．

```py
def calcurate_max_profit(prices: list[int], k: int) -> int:
    n = len(prices)
    # DPテーブルの初期化
    dp = [[0] * n for _ in range(k + 1)]
    for j in range(k):
        maxDiff = -prices[0]
        for i in range(1, n):
            dp[i][j] = max(dp[i - 1][j], maxDiff + prices[i])
            maxDiff = max(maxDiff, dp[i][j - 1] - prices[i])

    return dp[-1][k]
```

## 考え方

- `dp`: `i`日目に`j`回目の"売り"が完了している場合の最大利益
    - 0日目なら全部0！
- `maxDiff`: `i`日目に`j`回目の"買い"が完了している場合の最大利益
    - 例えば，基本的に`j=1`（1回しか買えない場合）の時は負

### むずいポイント

#### `dp`

**初期値**：

全て0で埋める

**更新**：

- `i`日目に株を売らない場合
    - `dp[i][j] = dp[i-1][j]`
    - ここは理解できる
- `i`日目に株を売る場合
    - `dp[i][j] = maxDiff + prices[i]`
        - これはむずい
        - つまり，"買い"に対して`prices[i]`で売るので加算する
        - 例えば`maxDiff`が`-2`で，その時の株価が`10`なら，`dp[i][j]=8`

すなわち，`dp[i][j] = max(dp[i-1][j], maxDiff + prices[i])`

#### `maxDiff`

**初期値**：

`maxDiff = -prices[0]`

つまり，初日で買った場合を初期値とする

**更新**：

- これまでの株価のほうが安い場合
    - `maxDiff = maxDiff`
- 今日（`i`日目）の株価のほうが安い場合
    - `maxDiff = dp[i][j-1] - prices[i]`
        - 前回（`j-1`回目）の"売り"までで，今日までの最大利益から，今日の株価を引く
            - 買うからね

すなわち，`maxDiff = max(maxDiff, dp[i][j-1] - prices[i])`

## まとめ

動的計画法はむずい！！

これでも理解できなかったら，`[3, 0, 5, 7, 4]`みたいなリストで実際に更新してみると理解できるかも

頑張りましょう；；
ファイルやディレクトリを検索し、フルパスを変数に格納する【Windows】


## 初投稿
未経験から半年が経ち、案件が変わったら忘れそうなのでアウトプットもしていこうと思い始めました。まだまだ下流工程なので、単体テストの証跡撮り等の効率化したものぐらいしかアウトプットはないですが、小出しで忘れないようにしていこうと思います。

プログラミング言語もいくつか触ったことがあるくらいで、特徴も何も分からないぺーぺーですが、Windows標準搭載のPowershellがとっつきやすくて作ってます。（上司には「これはbatchファイルの方が処理軽いよ～」等アドバイス受けつつ少しずつ成長しています。）

### 作成の経緯
今回のものはプロセスを立ち上げる際にフルパスを書いたのにユーザーによっては違うところに格納していてうまくスクリプトが機能しないことがあったので作成しました。

<br>

## 対象のあるフォルダを検索し変数に格納する
今回はWinShot類のあるフォルダ(今回はws153a)を検索かけてフルパスを格納します。
エラー出力を飛ばしているのは、Cドライブ直下等から検索をかけるとシステム系のファイルで権限ないもののエラーが大量に吐かれるためです。
<br>
~~~
#c:/配下のディレクトリをws153aをキーワードに再帰的に検索し、フルパスを$WSPathに格納する
$WSPath = Get-ChildItem -Path c:/ -Filter ws153a -Directory -Recurse 2>$null `
|Convert-Path
~~~

`-Filter`の後ろを変更することで、よく使うもののパスを検索可能です。
（※ファイル検索時は`-Directory`を消します。）
自分がよく検索するのは`ttermpro.exe`、`chrome.exe`等です。
`explorer.exe`もプロセスを立ち上げる際によく使いますが、こちらはこれで検索すると複数結果が返ってきますし、標準搭載で場所が分かるので直接指定した方が早いです。
`-Path`の後ろは絞れる方が早く検索できます。`c:/`等だと範囲が広いため少し時間がかかります。
<br>

:::note warn
#### 注意
あるあるですが、スクリプト実行時は`Get-ExecutionPolicy`が`Restricted`になっていると実行できなかったりします。
管理者として以下を実行すること設定変更ができます。
~~~
#RemoteSignedにポリシーを変更
Set-ExecutionPolicy RemoteSigned
~~~
:::
<br>
Winshotの複数の結果が返ってきてしまった場合の対処は以下を参考にしてください。最終行の一行前までで止めることで一意になります。

https://qiita.com/kokiengine/items/63e4effadec4c2408b8d
個人的な備忘録：忘れかけていたWindowsコマンドプロンプトの基本をアウトプットしてみた

## はじめに
今回は、Windowsのコマンドプロンプトで使用できるコマンドをいくつかご紹介します。

:::note info
**この記事の内容は、自分の備忘録としてまとめたものですので、ご了承ください。**
:::

***コマンド操作を積極的に活用したい方は、今回ご紹介するコマンドをぜひ参考にしてみてください。***

## 書こうと思ったきっかけ
これまでWindowsパソコンを使うことが多かったのですが、最近はずっとMacBookを使っています。

:::note warn
***MacBookのコマンド操作はスムーズに行えるものの、久しぶりにWindowsのコマンドプロンプトを使ったところ、多くのコマンドを忘れていることに気づきました。***
:::

そのため、今回の記事としてコマンドをまとめてアウトプットしようと思いました。

## 実際に忘れかけていたコマンドを整理してみた

### ファイルを表示するコマンド: `dir`

ディレクトリ内のファイルやフォルダを一覧表示するには、`dir` コマンドを使用します。

#### 基本的な使い方

```cmd
dir
```

このコマンドを実行すると、現在のディレクトリ内に存在するファイルやフォルダが一覧表示されます。

#### オプション付きでの使い方

`dir` コマンドは、オプションを指定することで表示方法をカスタマイズできます。

| オプション | 説明                                                                  |
|------------|-----------------------------------------------------------------------|
| `/p`       | 1ページずつ表示します（内容が多い場合に便利）。                        |
| `/s`       | サブフォルダ内も含めてすべてのファイルを表示します。                    |
| `/a`       | 隠しファイルやシステムファイルも表示します。                            |
| `/o`       | 表示を並べ替えます（例: `/o:n` で名前順に表示）。                      |

##### 例: サブディレクトリ内も含めて隠しファイルを表示

以下のコマンドを実行すると、隠しファイルを含むすべてのファイルがサブディレクトリも含めて一覧表示されます。

```cmd
dir /a /s
```

### フルパスで表示: `tree`

ファイルやフォルダの階層構造を視覚的に表示するには、`tree` コマンドを使用します。

以下のコマンドを実行すると、現在のディレクトリ内のフォルダ階層構造がツリー形式で表示されます。

#### 基本的な使い方

```cmd
tree
```

#### オプション付きでの使い方

`tree` コマンドは、オプションを指定することで表示内容を変更できます。

| オプション | 説明                            |
|------------|---------------------------------|
| `/f`       | ファイルも含めて表示します。    |
| `/a`       | テキストベースで描画します。    |

##### 例: ファイルも含めて階層構造を表示

以下のコマンドを実行すると、フォルダに加え、その中に含まれるファイルもすべて階層構造として表示されます。

```cmd
tree /f
```

### コマンドプロンプトで確認: `whoami`

現在ログインしているユーザー名を確認するには、`whoami` コマンドを使用します。

**使用方法**

- コマンドプロンプトを開きます。

- 以下のコマンドを入力して実行します：

```cmd
whoami
```

このコマンドを実行すると、現在ログインしているユーザーの「ドメイン名\ユーザー名」の形式で結果が表示されます。

**出力例:**

```cmd
DESKTOP-XXXXXXX\YourUserName
```

結果には、コンピュータ名（DESKTOP-XXXXXXX）とユーザー名（YourUserName）が表示されます。

***ユーザー名だけを確認したい場合は、結果の後半部分（YourUserName）を確認してください。***

## まとめ
最後までお読みいただき、ありがとうございました。今回は、基本的な内容を中心にまとめてみました。

:::note warn
***この記事が、誰かの参考や記録の助けになれば幸いです。***
:::


**今後も、このような基礎的な情報を積極的にアウトプットすることで、自身の知識を整理し、振り返るきっかけを作っていきたいと思います。**
Rails バリデーション チートシート

# Rails バリデーション チートシート

Railsで使用するバリデーションを、網羅してテーブル形式でまとめました。
公式ドキュメントでは検索性が低かったので、一覧確認できるように独自作成しました。
開発時にご活用ください。

| バリデーション名                | 説明                                                                                       |
|---------------------------------|--------------------------------------------------------------------------------------------|
| `presence`                      | 属性が空でないことを検証します。                                                           |
| `absence`                       | 属性が空であることを検証します。                                                           |
| `confirmation`                  | 対応する確認用属性（例: `password_confirmation`）と一致することを検証します。              |
| `format`                        | 属性の値が指定した正規表現にマッチすることを検証します。                                   |
| `inclusion`                     | 属性の値が指定したリストに含まれていることを検証します。                                   |
| `exclusion`                     | 属性の値が指定したリストに含まれていないことを検証します。                                 |
| `length`                        | 属性の長さを検証します。オプションには `minimum`、`maximum`、`is`、`in` などがあります。    |
| `numericality`                  | 属性が数値であることを検証します。オプションには `only_integer`、`greater_than`、`less_than` などがあります。 |
| `uniqueness`                    | 属性の値が一意であることを検証します。                                                       |
| `acceptance`                    | チェックボックスが承認されていることを検証します。<br>（例: 利用規約の同意）。                   |
| `validates_associated`          | 関連付けられたオブジェクトのバリデーションを実行します。                                   |
| `validates_with`                | カスタムバリデーションクラスを使用します。                                                 |
| `validate`                      | 独自のバリデーションメソッドを定義します。                                                 |
| `allow_nil`                     | 属性が `nil` の場合にバリデーションをスキップします。                                     |
| `allow_blank`                   | 属性が`falsy（nil, ""）`の場合にバリデーションをスキップします。                                     |
| `message`                       | バリデーション失敗時のカスタムエラーメッセージを指定します。                               |
| `if`                            | 指定した条件が真の場合にのみバリデーションを実行します。メソッド名やプロックを指定可能です。  |
| `unless`                        | 指定した条件が偽の場合にのみバリデーションを実行します。メソッド名やプロックを指定可能です。|
| `on`                            | 特定のアクション（例: `:create`, `:update`）時にのみバリデーションを実行します。          |
| `scope`                         | 一意性検証時にスコープを設定します<br>（例: `scope: :account_id`）                         |
| `case_sensitive`                | 大文字小文字を区別するかどうかを設定します。|
| `multiple_of`                   | 数値が指定した値の倍数であることを検証します。|
| `greater_than_or_equal_to`      | 数値が指定した値以上であることを検証します。                                  |
| `less_than_or_equal_to`         | 数値が指定した値以下であることを検証します。                               |

# 参考
https://railsguides.jp/active_record_validations.html

以上です！
記載漏れや間違いがあればコメントください🙏
[Microsoft] ASP.NET Core 8.0におけるDateTimeのJSONシリアライズ結果

# はじめに

C# / .NET における日付・時刻の扱いは、いつもいつも悩ましいです。

これは DateTime 型を JSON シリアライズしたとき、どういう結果になるかのまとめです。

# 環境

* .NET 8.0.45
* Microsoft.AspNetCore.Mvc.NewtonsoftJson 8.0.12

Newtonsoft.Json の設定は、以下のようにしました。

* 書式: ISO-8601
* 付与するタイムゾーン: UTC


# TL;DR;

2025年6月4日12時00分をJSONシリアライズした結果です。
シリアライズ時になんからの変換が入ることはなく、元のDateTimeインスタンスを値そのままになりました。

| システムタイムゾーン| 指定したDateTimeKind | 結果|
|:-|:-|:-|
| UTC | Unspecified | "2025-06-04T12:00:00Z" |
| UTC | UTC | "2025-06-04T12:00:00Z" |
| UTC | Local | "2025-06-04T12:00:00Z" |
| Asia/Kamchatka | Unspecifed | "2025-06-04T12:00:00Z" |
| Asia/Kamchatka | UTC | "2025-06-04T12:00:00Z" |
| Asia/Kamchatka | Local | "2025-06-04T00:00:00Z" |

Asia/Kamchatka（カムチャッカ）は、UTC+12:00 となるタイムゾーンです。

# 検証に使ったコード


```csharp:Program.cs
using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json;

var builder = WebApplication.CreateSlimBuilder(args);
builder.Services
    .AddControllers()
    .AddNewtonsoftJson(options =>
    {
        options.SerializerSettings.DateFormatHandling = DateFormatHandling.IsoDateFormat;
        options.SerializerSettings.DateTimeZoneHandling = DateTimeZoneHandling.Utc;
    });

var app = builder.Build();
app.MapControllers();
app.Run();

[ApiController]
[Route("/")]
public class HomeController : ControllerBase
{
    [HttpGet]
    public IActionResult Index() => Ok(new
    {
        TimeZone = TimeZoneInfo.Local.ToString(),
        DateTime = new DateTime(2025, 6, 4, 12, 0, 0),
        DateTimeInUtc = new DateTime(2025, 6, 4, 12, 0, 0, DateTimeKind.Utc),
        DateTimeInLocal = new DateTime(2025, 6, 4, 12, 0, 0, DateTimeKind.Local),
    });
}

```
#0018（2024/01/18）TTL（Time to Live）とは？

# TTL（Time to Live）とは？

**TTL（Time to Live）** は、ネットワークやDNSにおいてデータの有効期限を指定するための値です。この値は、パケットやキャッシュデータがどれだけの時間（またはホップ数）有効であるかを示します。

---

## **1. TTLの基本的な役割**

### **ネットワークにおけるTTL**
- **目的**:
  - ループ防止：パケットが無限にネットワークを回り続けることを防ぐ。
- **仕組み**:
  - パケットがルーターを通過するたびにTTL値が1減少します。
  - TTL値が0になると、パケットは破棄されます。
- **例**:
  - IPヘッダーにTTLフィールドが含まれており、通常はデフォルト値が64、128、または255に設定されます。

### **DNSにおけるTTL**
- **目的**:
  - DNSキャッシュの有効期間を指定し、トラフィックを削減しつつ、可用性を向上。
- **仕組み**:
  - DNSクライアントやDNSサーバーが、キャッシュデータを一定期間保持する時間を指定します。
  - TTLが切れると、新しいクエリを実行して最新のデータを取得します。
- **例**:
  - レコードに設定されたTTL値が300秒（5分）であれば、DNSキャッシュは5分間有効。

---

## **2. TTLの単位**
- **秒（Seconds）** で指定されます。
  - ネットワークとDNSの両方で共通の単位。

---

## **3. TTLの調整と影響**

### **DNSでのTTL値の調整**
- **短いTTL値**:
  - 変更が頻繁にあるリソースに適用。
  - 例: CDNや動的なロードバランシング。
- **長いTTL値**:
  - 変更が少ないリソースに適用。
  - 例: 静的なウェブサイトや安定したサービス。

### **ネットワークでのTTLの調整**
- 通常はシステムやアプリケーションでデフォルト値が設定されており、手動で変更するケースは少ない。

---

## **4. TTLのユースケース**

### **ネットワーク**
- **トラブルシューティング**:
  - ツール（例: `traceroute`）で使用。
  - TTLを利用して経路上のルーターを特定。

### **DNS**
- **キャッシュの最適化**:
  - DNSリクエスト数を削減して、パフォーマンスを向上。
- **変更の即時反映**:
  - TTLを短く設定し、レコード変更の反映速度を向上。

---

## **5. TTLの例**

### **DNSレコードでのTTL設定**
```plaintext
example.com.  300  IN  A  192.0.2.1
Rubyで引数が多い時のコード設計と、デフォルト値の使い方について

引数が多い時のコード設計についてと、
デフォルト値の使い方について。

状況によって最適に使い分けたい。

# 引数が多い時のコード設計について
1. キーワード引数を使う方法
1. ハッシュ引数を使う方法
1. 値オブジェクトを作る方法

「オブジェクト指向設計実践ガイド」や「オブジェクト設計スタイルガイド」を読む限り、疎結合で変更に強くなる3の方法が良さそうに感じる。値オブジェクトのクラスにバリデーションを儲けたり、共通利用したり、テスト書きやすかったりもする。型がある言語の方が受ける恩恵は大きい。
ただしIDEのコード補完等の恩恵が受けづらくなったり、人によっては可読性が低くなったり。パラメータの中身がわかりづらいので、yard等書いたほうが良さそう。

1は増減等変更に弱いが、行数が少なくて済み、引数が明示的で直感的に理解しやすく、2はさらに行数が少なくて済むが、呼び出し側の引数指定が多い。



## キーワード引数を使う方法
```rb
class HogeService
  def initialize(name:, address:, age:, sex:, dob:)
    @name = name
    @address = address
    @age = age
    @sex = sex
    @dob = dob
  end

  def call
    # 何らかの処理
    # @name、@address などを利用
  end
end

HogeService.new(name: 'taro', address: 'tokyo', age: 20, sex: 'M', dob: '2000-01-01')
```


## ハッシュ引数を使う方法その1
```rb
class HogeService
  def initialize(**params)
    @params = params
  end

  def call
    # 何らかの処理
    # @params[:name]、@params[:address] などを利用
  end
end

HogeService.new(name: 'taro', address: 'tokyo', age: 20, sex: 'M', dob: '2000-01-01')
```

## ハッシュ引数を使う方法その2
```rb
class HogeService
  def initialize(name:, address:, age:, sex:, dob:)
    @name = name
    @address = address
    @age = age
    @sex = sex
    @dob = dob
  end

  def call
    # 何らかの処理
    # @name、@address などを利用
  end
end

  hash = {name: 'taro', address: 'tokyo', age: 20, sex: 'M', dob: '2000-01-01'}
  HogeService.new(**hash)
```

## 値オブジェクトを作る方法
```rb
class UserParams
  attr_reader :name, :address, :age, :sex, :dob

  def initialize(name:, address:, age:, sex:, dob:)
    @name = name
    @address = address
    @age = age
    @sex = sex
    @dob = dob
  end
end

class HogeService
  def initialize(user_params)
    @user_params = user_params
  end

  def call
    # 何らかの処理
    # @user_params[:name], @user_params[:address] などを利用
  end  
end

params = UserParams.new(name: 'taro', address: 'tokyo', age: 20, sex: 'M', dob: '2000-01-01')
HogeService.new(params)
```

# デフォルト値について

1. クラス内でデフォルト値を設定する方法
1. 呼び出し側でデフォルト値を設定する方法


オライリーの「オブジェクト設計スタイルガイド」には以下のように書いてあり、2推し
> オブジェクトが必要とする設定値は、常にクラスのユーザーが提供するようにしましょう

理由としては、
- デフォルト値を知るには、そのクラスのコードを読む必要があること
- デフォルト値が変更された際にそれを利用している側に影響があるから


## クラス内でデフォルト値を設定
```rb
class HogeService
  def initialize(name:, address:, age: 20, sex: 'M', dob: '2000-01-01')
    @name = name
    @address = address
    @age = age
    @sex = sex
    @dob = dob
  end
end

HogeService.new(name: 'taro', address: 'tokyo')
```

メリット
- 呼び出し側の負担を減らせる。可読性向上
- デフォルト値の一元管理ができる


```rb
class HogeService
  def initialize(params)
    @params = params
  end

  def call
    # 何らかの処理
  end
end

user_params = {
  name: 'taro',
  address: 'tokyo',
  age: 20,
  sex: 'M',
  dob: '2000-01-01'
}
HogeService.new(user_params).call
```

メリット
- 呼び出し側でデフォルト値を管理すれば、変更の影響を 特定の呼び出し元 のみに抑えられる
- 呼び出し側の文脈に応じて適切なデフォルト値を設定できる
- IDE や型チェックの恩恵を受けやすい
- 「デフォルトの管理」という責務がなくなり、クラスの責務をシンプルにできる


## デフォルト値の使い方のまとめ
クラス内でデフォルト値を設定するのが良い時
- オプションがあるが、頻繁に変更されるわけではない場合
- 一方、デフォルト値を変更すると影響が大きいため、変更頻度が高い場合は呼び出し側で設定する方がよい。

呼び出し側でデフォルト値を設定するのが良い時
- デフォルト値が状況ごとに変わる可能性がある場合
- 一方、デフォルト値が一貫している場合は、クラス内で設定するほうがコードがスッキリする。


## 感じたこと
- 可読性と変更容易性はトレードオフな側面がある
  - 可読性を重視すると影響調査が大変になるかも
  - 変更容易性を重視すると読みづらいかも
OpenWRT導入マニュアル　②DynamicDNS編



今回は、DynamicDNSでインターネットから自宅ルーター経由で自宅LANにログインする仕組みを解説します。
我が家は楽天ひかりなんですが、楽天ひかりはPPPoEで接続できます。
PPPoEはIPv4のグローバルIPが１つ払い出されます。ただしIPアドレスは時々変更されますので、DynamicDNSに登録してドメイン名でのアクセスができるようにしたいところです。

まずは、ビルドするときに以下のメニューにチェックを入れてビルドします。
**Luci - Application**
![{D1D54D6E-A7D0-4256-81C5-C5F747328BA5}.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215200/9d993a12-4449-96b7-7b11-b379d0e02ebc.png)

DynamicDNSは、MyDNSを使います。無料でグローバルドメインを使うことができます。
MyDNSへの登録は以下の方が詳しく解説されていますので、そちらを参照してください。
日本語で設定できるのでわかりやすいです。
https://qiita.com/carol0226/items/639977e368b0b91ed98f

MyDNSでは、以下の画面でドメイン名の登録とホスト名の登録を行います。
**Aレコード**(IPv4)はv4  **AAAAレコード**(IPv6)はv6  として設定しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215200/da0dea78-46f6-9fd7-7358-9ed79f29fddf.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215200/9df5d845-d569-a84b-2edb-8eafd4c541e8.png)
MyDNSのサイトの内容を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215200/6cc47c82-3f39-ecff-8ac0-9bdb91184290.png)
![{40E13423-61CB-4A4A-8939-830BA2CBB8F9}.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215200/0de5cf46-d370-b7ea-8497-a1f79f5e7284.png)
v6側の設定もしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215200/baa58d7f-de16-e90d-3a91-c79e46b8547f.png)
![{470B73EB-1951-4E1B-8BF5-FC9284613F00}.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215200/85e4dcc9-b0b7-afd6-4c3d-221cb4df7357.png)
ドメインが４つ登録されている理由ですが、v4.xxxxx  v6.xxxxx xxxxxx の3パターンで登録しています。
**v4.xxxxx** IPv4でアクセスするときに使います。
**v6.xxxxx** IPv6でアクセスするときに使います。
**xxxxx** IPv4/IPV6 両方でアクセスできます。
ちなみに、IPv4側にあるDNSは、IPv4アドレスしか引けないかというとそうではなく、IPv4側のDNSでもAAAA(IPv6)アドレスを引くことができますしその逆もまた可能です。
ルーターの動作ですが、グローバルIPアドレスの変更があると自動的にMyDNSサイトにログインしてIPアドレスの更新を行ってくれます。

設定が完了したら、コマンドプロンプトで確認してみましょう。
Windows でコマンドプロンプトを起動して
```cmd
nslookup [登録したドメイン名]
nslookup [v4.登録したドメイン名]
nslookup [v6.登録したドメイン名]
```
1回目のコマンドでは、IPv4/IPv6両方が返されるはずです。
3回とも正常にIPアドレスが戻れば、設定は成功しています。