OmniAICreator/Qiita-1.07M huggingface dataset:
Pythonでファイル処理をマルチプロセス化

Pythonプログラムで、扱うファイル件数が多く、
バッチの実行にあまりに時間がかかってしまったので、並列処理化をしました。

並列処理化に至った経緯としては、
ローカル端末の環境から、ハイスペックのサーバーの環境へ変えて実行してみても、実行速度がほとんど変わりませんでした。
そこで、サーバーのメモリを確認してみたところ、メモリの占有率がほとんどあがっていませんでした。

また、今回の実行環境としてはWindowsサーバーだったのですが、
Linux環境だとメモリの上限設定をPythonコード上から設定できるようなのですが、
Windows環境ではメモリの上限設定をする方法がないようでした。

また、Pythonでは、CPUバウンドな処理はGILによる排他制御のために、シングルスレッドでの実行となるため、
処理の高速化をするにはマルチプロセス化以外の選択がないと思われたことから、
処理の並列化を実装することとしました。

マルチプロセス化をすることで、CPUの数だけ並列でプロセスを実行できるので相当な高速化が期待できます。

ただし、処理の高速化を試みるにあたり、
実際はボトルネックに対するチューニングが優先事項として高いので、
安易に処理を並列化することは注意が必要になります。

また、以下ソースの補足になりますが、
通常、サブプロセス内でエラーが発生時には、親プロセス側の処理が走り続けてしまいます。
そこで、`process.join()`で処理同期時に、サブプロセスがエラーコード1を返した場合には、
親プロセス側でもエラーをスローするようにして回避しています。

*・コメントをいただきました。今回は、multiprocessingを用いて実装しましたが、concurrent.futureなども良さそうです。*


```python
import glob
import multiprocessing

def process_hoge(input_file):
"""
並列処理で実行する処理
"""
    for i, file in enumerate(input_file):
        # ファイル処理をごちゃごちゃ

        print(f"finished chunks: {i+1} / {len(iuput_file)}")


# 処理対象のファイル群
input_files = glob.glob("*.csv")

num_process = multiprocessing.cpu_count()
num_files = len(input_files)

if num_files < num_process:
    num_process = num_files

# プロセスごとに分割
chunk_size = num_files // num_process
if chunk_size == 0:
    chuk_size = 1

chunks = [(i * chunk_size, (i + 1) * chunk_size) for i range(num_process)]
chunks[-1] = (chunks[-1][0], num_files)
process = []

for c in chunks:
    file = input_files[c[0]:c[1]]
    # 並列処理で処理を実行
    process = multiprocessing.Process(target=process_hoge, args=(file,))
    processes.append(process)
    process.start()

for process in processes:
    process.join()
    if process.exitcode == 1
        raise Exception("Error catched in process_hoge")
```
Ruby on Railsの習得のためタスクリスト的なの作ってみる①〜構成、設計編〜

転職活動で見せられるポートフォリオ的なものが何もなかったので、勉強がてらRuby on Railsを使って何かアプリを作ってみることにしました。
~~プリキュアの変身のおもちゃとかGitHubで公開できないし。。~~
ちなみに私は普段PHPを主に書いています。
学習用に構築するアプリといえばタスクリストアプリということで、初学者の方の参考にもなればいいな〜ということでシンプルに作っていきます。
テーマは **「達成感を生み出すタスクリスト」**！
タスクリストって終わったらあっけなく消えちゃうじゃないですか。タスク解消時に労ってほしい、終わったタスクがずら〜っと並んでいるのを眺めて悦に入りたい、という欲求を満たしたいと思います。


## 構成

#### バックエンド(API) : Ruby on Rails

これが勉強したいので当然の選定。
APIにしたのは、①フロントとバックエンドでしっかり分かれている構成が好きだから ②後でモバイルにもできるから ③とりあえずバックエンドだけリポジトリに載せておけば早い段階で成果物あるっぽく見えるから。

#### フロントエンド : React(TypeScript)

Rubyは初めてなので、フロントは最近仕事でも使っているこちらを選定。
[コンポーネント指向](https://zenn.dev/offers/articles/20220523-component-design-best-practice)はコードが読みやすいし使い回しが効いて、実装が本当に楽。
TypeScriptを選んだのは、とにかく全部エラー吐いてくれて、私のようなうっかりやにはこれくらいの世話焼き言語が合っているため。

#### RDB : MySQL

特にこだわりはないのですが、使い慣れているため。

#### 開発環境 : Docker

何はともあれdocker-compose。作って壊せる、使いまわせる、環境がどうなっているか一目でわかる。好き。


## 機能要件

#### タスクに関する機能
- 表示機能

タスクを表示する機能。期限とか優先度でソートしたい。

- 保存機能

タスクを保存する機能。サクッと登録したい。

- 編集機能

タスクを編集する機能。いらないかと思ったけど、期限変更とか誤字とかあるしなあ。

- 解消機能

やり終わったタスクを解消する機能。解消したタスクは後から見られるようにしたい。あと、解消した時にめっちゃ褒めてほしい。

- 削除機能

間違って登録したりやらなくて良くなったタスクを削除する機能。

- 解消済みタスク表示機能

ただ並べて眺めて満足感を得る機能。

#### ユーザーに関する機能

- 登録機能

実際サービスとして運用するわけじゃないしなんでもいいのですが、ユーザーという概念がないのは流石におかしいので一応作成。

- ログイン機能

上に同じ。せっかくだから[JWT](https://developer.mamezou-tech.com/blogs/2022/12/08/jwt-auth/)のライブラリ[ruby-jwt](https://github.com/jwt/ruby-jwt)とか使ってみたい。


## データモデル設計

機能追加した時複雑化するような構成は避けたいので、[イミュータブルデータモデル](https://scrapbox.io/kawasima/%E3%82%A4%E3%83%9F%E3%83%A5%E3%83%BC%E3%82%BF%E3%83%96%E3%83%AB%E3%83%87%E3%83%BC%E3%82%BF%E3%83%A2%E3%83%87%E3%83%AB)を参考にします。
が、あまり厳密にしても逆にわかりづらいので、タスクにはユーザーIDを入れました。タスクリストなのに共有機能とか作らないですし。
あと、タスク自体の更新・削除は履歴なしで物理で強行します。もちろん更新日時もなし。なぜなら履歴を遡らないし復元もしないから。

2023-03-05追記：それはイミュータブルじゃなくね？更新してるじゃん。イベント分離しただけで喜んでましたごめんなさい。

というわけで以下のような超絶シンプルなデータモデルが完成！([gitmind](https://gitmind.com/jp/)で描画)
![データモデル.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363775/093cf85b-d3ce-1550-71a7-320231ad0409.jpeg)



## API設計

できることならymlとか書きたくないので[stoplight](https://stoplight.io/)を使いました。ありがとうGUIにしてくれたひと。

↓こんな感じの種類でAPIを作ることにします。

![スクリーンショット 2023-03-03 3.15.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363775/869d8ea0-0814-3196-7282-afdb01cf4529.png)

ここで突然ですがおすすめの本紹介。
「[Webを支える技術 ―― HTTP，URI，HTML，そしてREST](https://gihyo.jp/book/2010/978-4-7741-4204-3)」。APIって何？そもそもWebって何？ということをかなり噛み砕いて教えてくれます。
ちょっと古いけどベストセラーなので読んだことない方はぜひ！

## 次回予告

今回は構成、設計編ということで大体固まったのでここまで！
次回は開発環境構築編を予定しています。
がんばるぞい！
WSLからGit for Windowsに同梱されたGPGを使ってコミットに署名する

Git for WindowsにはGnuPGが同梱されており、Git Bashから使うことができる。普段Windows上でコミットに署名している場合はこのGPGを使っているはずだ。鍵は`C:\Users\<user>\.gnupg`ディレクトリに保管されている。

この鍵を使ってWSL上でGPG署名をしたい場合、WSLで次の設定をすればよい。

```bash
git config --global gpg.program '/mnt/c/Program Files/Git/usr/bin/gpg.exe'
```
Google Colaboratory をiPadで使うとコピーできない問題をどうにかする

iPad で Colabo を使っているとクリップボードにコピーできなくて困るのですが、git hub のissue に回避策の記載がありました。


```
try:
    import google.colab

    IN_COLAB = True
except:
    IN_COLAB = False

if IN_COLAB:
    from IPython.core.magic import register_cell_magic

    @register_cell_magic
    def printcell(line, cell):
        print(cell)
```

このコードを実行した後、コピーしたいコードセルの先頭に

```
%%printcell

```

を記載して、そのセルを実行すると、outputにセルのコードが出力されるので、それをコピーするということ。

この対処方法に思うことはありますが、全くできないよりマシなので感謝しかありません！！


なお、物理キーボードがあるときは、

Cmd+MM ショートカットで Code セルを Text セルに変換。コピー。
Cmd+MY ショートカットで Text セルを Code セルに戻す。

という方法もあるみたいですが、こちらの動作は未確認です。


ipad safari unable to copy/paste text from a code cell #1236
https://github.com/googlecolab/colabtools/issues/1236
入門GOプログラミング　Lesson3 ループと分岐

## bool値
Python, Javascript：（""）データも”偽”とみなされるが、
Go:真の値は`true`だけ。偽の値は`false`だけ


```go:
package main

import (
	"fmt"
	"strings"// 文字列を扱うパッケージ
)

func main() {
	var command = "walk outside"
	var exit = strings.Contains(command, "outside")// commad文字列は"outsideを含むか（return bool）"
	fmt.Println("out cave", exit)
}
```
### if分岐
```go:
package main
import (
	"fmt"
)
func main() {
	var age = 1
	if age >= 20 {
		fmt.Println("飲酒喫煙OKです")
	} else if 10 < age && age < 20 {
		fmt.Println("飲酒喫煙NGです")
	} else {
		fmt.Println("まさかそんな人いないよね！？")
	}
}
```
- `if XXXX`は`if (XXXX)`にしてもOK
- or演算は`||`を使用する

## switch分岐
```go
func main() {
	var age = 20
	switch {//case内部でbool値を比較する場合はswitch XXの記述は不要
	case (age >= 20):
		fmt.Println("飲酒喫煙OKです")
	case (10 < age && age <= 20):
		fmt.Println("飲酒喫煙NGです")
	default:
		fmt.Println("まさかそんな人いないよね！？")
	}
}
```
`switchXX`を必要とするとき

```golang
func main() {
	var name = "hoge"
	switch name {
	case "hoge":
		fmt.Println("Good day!")
	case "huga":
		fmt.Println("nice!")
        fallthrough// C, Java, Javascriptではデフォルト
	default:
		fmt.Println("wonderful!")
	}
}
```
## ループ文
```go
func main() {
	var i = 0
	const stopNum = 10
	for i < stopNum { // 条件を記述
		fmt.Println(i)
		if i == 7 {
			fmt.Println("break!")
			break // ループからブレイクアウト
		}
		i++
	}
}
```
■練習問題（数あてゲーム）解答例
```go
func main() {
	var randNum = rand.Intn(100)
	const collectNum = 49
	switch {
	case collectNum == randNum:
		fmt.Printf("randNum : %v, just collect!!", randNum)
	case collectNum > randNum:
		fmt.Printf("randNum : %v, too small", randNum)
	case collectNum < randNum:
		fmt.Printf("randNum : %v, too big", randNum)
	default:
		fmt.Printf("error")
	}
}

```
Qiita始めました


# はじめに
テスト投稿です
Markdownの練習します

#### 見出しサンプル
#4つらしい

コードはこんな感じで...
``` test.sh
echo "hoge"

```

インラインはバッククォートで囲うのか...
`echo "hoge"`

太字は**で囲うのね
**echo "hoge"**
angular 開発環境構築メモ

前提
　公式サイトで基本概念を事前に理解しておく
　　[Angular](https://angular.jp/guide/setup-local)
　　・JavaScript
　　・HTML
　　・CSS
　の基本知識をもっているのは前提

インストールもの

 ①Node.jsをインストールする必要あり
　[Node.js](https://nodejs.org/)
 ②npmのインストール
  node.jsと一緒にインストールされるはず
以下のコマンドで正常かどうか確認
　```node -v```
　```npm --version```
 ③Angular CLIをインストールする
　```npm install -g @angular/cli```
　留意点
　windowsの場合、以下の設定変更は必要
　```Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned```
　ＰＳ：設定変更の説明
　　[execution policy](https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_execution_policies?view=powershell-7.3)

動作確認
　①ＤｅｍｏＡＰＰ作成
　```ng new my-app```

　②ＡＰＰを実行する
　　```cd my-app```
　　```ng serve --open```
　インストールとセットアップが成功すると、次のようなページが表示されます。![app-works.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/194355/455eec30-11ad-8f69-fa91-4411411b05f2.png)
AtCoderで解いた方がいい順番(仮)

# 目的
・言語を変更した時にどんな順番で解いたら学べるかいいかロードマップを作る。
・ちなRubyで解いてる。

# ルール
・[x]が付いている問題は未実施

# ステップ1、四則演算で自信をつける。
<b>レベル1</b> ー 足し算・引き算・掛け算
・[abc123_A - Five Antennas](https://atcoder.jp/contests/abc123/tasks/abc123_a)
・[abc182_A - twiblr](https://atcoder.jp/contests/abc182/tasks/abc182_a)
・[abc184_A - Determinant](https://atcoder.jp/contests/abc184/tasks/abc184_a)
<b>レベル2</b> ー 割り算

# ステップ2、文字列の比較
・[abc217_A - Lexicographic Order](https://atcoder.jp/contests/abc217/tasks/abc217_a)

# ステップXXX、標準ライブラリ関数を知っていれば解ける問題
・[x][abc239_A - Horizon](https://atcoder.jp/contests/abc239/tasks/abc239_a)

# ステップXXX、四則演算 + 条件分岐
・[x][abc245_A - Good morning](https://atcoder.jp/contests/abc245/tasks/abc245_a)


# ステップXXX、ハッシュを使う問題
・[abc261_C - NewFolder(1)](https://atcoder.jp/contests/abc261/tasks/abc261_c)

# その他
https://qiita.com/emioiso/items/1e0b800e201963f7f409
FQDN

# FQDN(Fully Qualified Domain Name: 完全修飾ドメイン名)
* ```ドメイン名やサブドメイン名をなどを省略せずに記述した形。```
    これに対し、```ホスト名などを省略した形を複数持つことも可能```。
    ```どちらもDNSによりグローバルIPアドレスと関連づけられている。```
# 出典
https://gihyo.jp/book/2022/978-4-297-12375-8

* 「FQDN」とは、「Fully Qualified Domain Name」の略で、 日本語では主に「完全に指定された(限定された)ドメイン名」などと訳されますが、 ```「絶対ドメイン名」```と呼ばれることもあります。

    ツリー(木)構造を持つDNS (Domain Name System)の階層構造において、 ある特定のノードに付けられたドメイン名を表記する際、 そのノードからDNSのルートまでの```すべてのラベルを並べて書いたもの```がFQDNです。

    具体的な例を挙げると、JPNICのWebサーバのFQDNは「www.nic.ad.jp.」となります。 一番左から、「www (第4レベルドメイン)」.「nic (第3レベルドメイン)」.「ad (第2レベルドメイン)」.「jp (トップレベルドメイン)」.「ルート」と、 順にすべてのラベルを表記しています。

    ドメイン名の表記においては、一般的にルートは「.」で表されるため、 ```狭義の意味でのFQDNを表記する際には、末尾の「.」まで含めて表記することが必要```です。 ただし、RFCなどで厳密にFQDNの定義が決まっていないことから、「www.nic.ad.jp」のように、 ```トップレベルドメインまで表記されていれば、広義のFQDNとして扱われる例も増えてきています```ので、 こうした表記が必ずしも誤りというわけではありません。

    一方、上記の例における表記の中から、 「www」や「www.nic」などといったドメイン名を抜き出して表記した場合については、 それらの表記は「相対ドメイン名」や「不完全なドメイン名」などと呼ばれます。

    日常的に、多くのユーザーがインターネットを利用する際には、 サーバ側やクライアント側がドメイン名を補ってFQDNを用いて通信するため、 ユーザー自身が特段FQDNを意識する必要はありません。ただし、DNSのドメイン名空間において、 ```あるノードを一意に特定する必要がある場合には、FQDNが利用```されます。 例えば、DNSのゾーンファイルなどを記述する際には、FQDNを用いて設定する場合があります。

# 出典
https://www.nic.ad.jp/ja/basics/terms/fqdn.html
Route53インバウンドエンドポイントの集約によるコスト削減

# はじめに
オンプレミスからAWSへの名前解決を行う際に名前解決の受け口となるインバウンドエンドポイントの集約について記載していきます。

# そもそもなぜオンプレミスからAWSへの名前解決が必要なのか
オンプレミス、クラウド間でなぜ名前解決が必要になるのか疑問に思う人がいるかも知れません。その理由は単純で、AWSのリソースには固定IPでないリソースがあるからです。RDSやALBを始め、名前解決が必須であり、静的なIPアドレスでの接続をサポートしていないリソースが多々あります。そのため、名前解決が前提となるのです。AWS内であれば、AWSのResolverが名前解決を行ってくれますが、AWS外からの場合、名前解決をどのように実装するのか検討する必要があります。また、プライベートなドメインを利用している場合、オンプレミス側あるいはAWS側にDNSを置くことになり、その名前解決の転送を設計する必要があります。

# シングルアカウントでの構成
まずはシングルアカウントでの構成です。

## 名前解決をオンプレミス側で実施する場合
この場合は非常にシンプルで、オンプレミスのDNSサーバのゾーンに対し、必要なレコードを登録します。
固定IPの場合はAレコードとなりますが、ALBなどの名前解決をベースとするリソースは、CNAMEレコードでAWSのリソースのFQDNを登録します。
また、AWSのリソースに関しては、xxx.amazonaws.comのような名前が振られますので、転送ルール（条件付きフォワーダなど）を設定し当該ゾーンの名前解決をAWSのインバウンドエンドポイント宛に転送するように指定します。
ユーザはオンプレミス側のDNSに問い合わせ（www2.exmaple.internal）、返却されたレコード(XXX.amazonaws.com)に基づき再度DNSに問い合わせを行い、転送ルールに基づきAWS側で転送されIPアドレスが返却されます。その結果対象のサービスへのアクセスが可能となります。

![スクリーンショット 2023-02-25 12.21.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584167/2f092af6-f3f5-433c-dfc8-d1ad0412d87f.png)

## DNS自体をAWS側で管理する場合
個人的にはこちらの構成をおすすめしていますが、オンプレミス側では名前解決を単純に転送、すべてAWS側で名前解決をするという構成です。
この場合何がメリットかというと、Route53の機能を利用できること、オンプレミスのDNSには転送ルールの設定のみで、AWS側で自由にゾーンのレコードの書き換えができるということです。
Route53には様々なレコードの種類があり（レイテンシベースや重み付けなど）その利用が可能であるメリットは大きいです。また、BlueGreenデプロイや、障害発生時のレコード切り替えなどをRoute53側に寄せることで、AWSのAPIも利用でき、自由度があがります。

https://docs.aws.amazon.com/ja_jp/Route53/latest/DeveloperGuide/rrsets-working-with.html

構成としては単純で、オンプレミス側は特定のゾーンの名前解決をインバウンドエンドポイントに転送するのみ、
あとはRoute53プライベートホストゾーンにて適時レコードを定義するのみです。
Route53のレコードが利用できますので、ALIASレコードも利用できます。
CNAMEレコードよりALIASレコードの方が、名前解決の効率は良いので、ALIASレコードが利用可能な場合は、ALIASレコードの利用をおすすめします。

https://docs.aws.amazon.com/ja_jp/Route53/latest/DeveloperGuide/resource-record-sets-choosing-alias-non-alias.html

![スクリーンショット 2023-02-25 12.26.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584167/7a0c0283-5dd7-1d5c-350d-6f8fd896bd34.png)

# マルチアカウントでの構成
次にマルチアカウントでの構成の場合です。

## 名前解決をオンプレミス側で実施する場合
シングルアカウントでの場合とほぼ変わりません。
この場合、amazonaws.comの名前解決は、VPC-Aで実施しても、Bで実施しても結果は変わらないですので、どちらか代表するVPCにエンドポイントを作成してあげるだけでよいです。

![スクリーンショット 2023-02-25 12.33.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584167/0512db25-c4a4-5fba-05f4-41a8591f04d4.png)

## 名前解決をクラウド側で実施する場合
### インバウンドエンドポイントの集約なし
単純に考えると以下の構成となります。
VPC-A、Bそれぞれのインバウンドエンドポイントに対してゾーンごとに転送ルールを振り分ける構成となります。
この場合インバウンドエンドポイントのコストがVPCの数だけ加算されてしまいます。
![スクリーンショット 2023-02-25 12.35.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584167/20b01119-658b-20ae-d900-9eb65c6a6bed.png)

### インバウンドエンドポイントの集約あり
以下の構成では、インバウンドエンドポイントを１つに集約しています。
Route53プライベートホストゾーンを、VPC-Aにも紐付けることで、VPC-Bのインバウンドエンドポイントを削減しています。この構成はVPCが増えれば増えるだけ効果があります。インバウンドエンドポイントの費用は決して安くないため、ゾーンの共有が可能であれば、こちらの構成をおすすめします。

https://docs.aws.amazon.com/ja_jp/Route53/latest/DeveloperGuide/hosted-zone-private-associate-vpcs.html

![スクリーンショット 2023-02-25 12.37.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584167/ccb6ca61-059f-ccc3-b9f9-108e7e186851.png)

# まとめ
オンプレミスとAWSのハイブリッドクラウド構成では名前解決が必ずポイントとなります。
管理面、リソース面での費用をできるかぎり削減して便利に使っていきたいですね。
ChatGPT の APIキーを取得する手順

ChatGPT の API キーを取得する手順を簡単に記します。

APIキーは、取得してから約4か月間、18 米ドルの無料クレジットがついてきます。
性能と価格のバランスが優れている「gpt-3.5-turbo」は、1000トークン当たり0.002ドル。
日本語の場合おおよそ1文字1トークンになります。

派手に使うとすぐなくなるので注意が必要です。

それでは取得手順について説明していきます。

### 1. OpenAIのAPIページにアクセス

https://openai.com/api/


### 2. サインアップしアカウントを作成してログイン
（サインアップには携帯電話番号が必要）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2611121/ba9fb9bc-cdc8-75ce-7fb9-cfd188ca8ced.png)


### 3．左上のアカウント名をクリックし、ドロップダウンメニューから「View API keys」を選択
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2611121/d5f1b1c3-c197-2f73-3529-3df7b51a6f91.png)


### 4. Create new secret key をクリック
クリップボードに API キーがコピーされるので一時的に控えておきましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2611121/143e830a-0995-503b-de80-306873f9be7f.png)

以上で取得は完了です。
MIME

# MIME
```メールで文字以外のデータ（画像や音楽)を添付して送るプロトコル```

# 出典
https://gihyo.jp/book/2022/978-4-297-12375-8

電子メールに、```音声や画像などを添付できるのは、それらをテキストに変換している```からです。そのための規格が、 MIME なのです。

MIME は、 Multipurpose Internet Mail Extensions （多目的なインターネットのメールの拡張）の```略語で「マイム」```と読みます。 MIME は、もともとテキストしか送れないインターネットの電子メールを、音声や画像なども送れるように、多目的に拡張したものです。

# 出典
https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/mastering_tech/mime_type/

# 感想
知らなかった。
データベース講習会 ~ 基礎編 ~

# データベース講習会 ~基礎編~
最近、ほとんどプログラミングの経験がない後輩に講習会をする機会があったので、その後輩向けの資料をなんとなくまとめました。本当に基礎の基礎しかまとめていないので、これからプログラミングを勉強する初学者向けの記事として読んでください。

## 関連
- [データベース講習会 ~実践編~](https://qiita.com/ReAL1341/items/61602bc3a73546d58f19)

## データベース（DB）とは
- **データベース**とは、「整理されたデータの集合」のことです。**DB**と略します。
- データベースのデータは一定の形式で整理されているので、データの管理が格段に楽になります。そのため、データベースは単なる保管庫以上の役割を果たします。
    - 例えば、「ある条件を満たすデータだけ取り出したり削除したりする」、「データを指定の順番に並べ替える」、「関連のある他のデータと一緒に取り出す」などができます。
- つまりデータベースを利用することで、単にデータを保存して取り出すだけでなく、最適な形に整形してデータを管理できます。


## データベース管理システム（DBMS）とは
- データベース管理システムとは、効率よくデータベースを運用するためのシステムです。DBMSと略します。
- データベースの情報を自動で整理したり、データの取得や編集をサポートしたりしてくれます。
    - DBMSの一例
        - MySQL
        - PostgreSQL
        - SQLite
        - Oracle Database など他多数


## リレーショナルデータベース（RDB）とは
- **リレーショナルデータベース**とは、Excelのような表形式でデータを管理するデータベースの1種です。**RDB**と略します。

### RDBに関する用語
下の表を例にとって説明します。
| id  | 名前   | 年齢 | 学部 |
| --- | ------ | ---- | ---- |
| 1   | マイク | 20   | 経済学部|
| 2   | アリス | 19   | 理学部 |
| 3   | ボブ   | 21   | 工学部 |

- 「1/マイク/20/経済学部」、「2/アリス/19/理学部」のようなデータの1セットのことを**レコード**と言います。表の行にあたる部分です。
- 「id」、「名前」、「年齢」、「学部」のようなデータの項目のことを**カラム**と言います。表の列にあたる部分です。
-「マイク」、「21」、「工学部」のような実際のデータのことを**フィールド**と言います。Excelで言う「セル」にあたる部分です。
- 表のことを**テーブル**と言います。そのままです。
    - RDBにおいては、このテーブルを複数集めたものが1つのデータベースと考えてください。


## SQLとは
- **SQL**とは、DBMSを用いてRDBを操作するときに用いる言語のことです。
- SQLで書かれた一つ一つの命令のことを**クエリ**と言います。
- 例えば、``users``テーブルから``age``カラムのフィールドが``18``未満のレコードを削除するクエリは、SQLで次のように書きます。
    - SQLについては、別の記事で詳しく説明します。
```SQL
DELETE FROM users WHERE age < 18;
```

## 終わりに
今回の記事はどちらかというと用語の説明が中心になりました。次の記事では実際にSQLを使ってデータを操作する方法を書こうと思います。
「act」を使ってGitHub Actionsの実行結果をローカルで確認する

## はじめに
GitHub Actionsは、GitHub上で実行できるCI/CDツールであり、業務で使用しているが多いのではないでしょうか。GitHub Actions用のymlファイルを編集する際、実際のコミットをプッシュして結果を確認しており、効率が悪いなと思っていました。ローカルで実行結果を確認できるツールがないか探していたところ、[act](https://github.com/nektos/act)というツールを見つけたたので、インストール方法と基本的な使い方を説明します。

## 「act」のインストール

homebrewでインストールする際は下記コマンドになります。他のOS等でインストールしたい場合は、公式ドキュメントをご参照ください。

```sh
brew install act
```

## 「act」の使い方
「act」を使うには、まずGitHub Actionsのワークフローファイルを用意する必要があります。例えば、以下のような内容のワークフローファイルを用意します。

```yml
name: Test
on: [push]
jobs:
  test:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - name: Hello
      run: echo "Hello, world!"
```

上記のワークフローファイルでは、GitHub上でプッシュされた時に、Ubuntuの環境で「Hello, world!」と表示するジョブを実行するようになっています。

このワークフローファイルを含むディレクトリに移動し、以下のコマンドを実行します。

```sh
act
```

これにより、ローカルでGitHub Actionsの実行が行われます。以下は、実行結果の一部です。

```sh
[1/3] 🚀  Starting virtual environment.
[2/3] 🐳  Docker network created.
[3/3] 🐳  Docker images built.
        ACTION hello
        ✔︎ runs-on: 'ubuntu-latest'
        ✔︎ uses: 'actions/checkout@v2'
        ✔︎ name: 'Hello'
        ✔︎ run: echo "Hello, world!"
Hello, world!
```

実行結果は、GitHub Actionsと同じように出力されます🙆

他にもactにはさまざまなオプションが用意されています。
例えば、特定のjobを実行したい場合には下記コマンドを実行しましょう。

```sh
act -j <ジョブ名>
```

## まとめ
本記事では、「act」を使ってGitHub Actionsの実行結果をローカルで確認する方法について説明しました。「act」を使うことで、GitHub上での実行を待つことなく、効率的にワークフローファイルの作成やデバッグができます。[公式ドキュメント](https://github.com/nektos/act)に他にもさまざまなオプションが載っているので、ぜひ一度読んで見てください。
CGI

# CGI
```Webサーバーがクライアントからの要求に応じてサーバーサイド・スクリプトを起動するための仕組み```

CGI用のプログラム（CGIプログラム)として定義されたコンテンツについてはそのままクライアントに返信せず、それを```Webサーバー上で実行した時の結果を返信```する

Webサーバー上でサーバーサイド・スクリプトを実行できるため、```小規模な動的ページ作成に多く用いられる```。

### サーバーサイド・スクリプト
* CGIから呼び出されるプログラムのこと。
* 一般的に文字列の扱いに長けたスクリプト言語と呼ばれる言語を記述される。
具体的にはPerl,Ruby,Python,javascirptなど

* CGIから呼び出すためHTMLと分離した別ファイルにします。
* 言語はWebサーバー上で実行可能でなものであれば、なんでも良い。

# 出典
https://www.sbcr.jp/product/4797388817/

# 感想
CGIがいまいち理解できなかった。
2023研修に向けて2022研修情報などをまとめてみる

# 概要
そろそろ来期の研修の時期が近付いているので
公開されている22研修を中心にいくつかまとめ

## 新人研修資料

### サイボウズ
https://blog.cybozu.io/entry/2022/06/23/170000

### mixi
https://mixi-developers.mixi.co.jp/22-technical-training-5fc362a9dc41

### リクルート
https://blog.recruit.co.jp/rtc/2022/09/09/recruit-bootcamp-2022/

### GMO ペパポ
https://tech.pepabo.com/2022/12/02/newbie-training-2022/

## ちょっと前の研修や一般研修とか役にたつもの

### クックパッド 総合職・デザイナー向け技術基礎研修2018
https://techlife.cookpad.com/entry/2018/05/09/080000

### Wantedly 2019年度新卒研修
https://www.wantedly.com/companies/wantedly/post_articles/173824

### AI SHIFT SQL
https://www.ai-shift.co.jp/techblog/1980

### freeeアクセシビリティー研修資料
https://developers.freee.co.jp/entry/a11y-training

### 情報通信用語集
https://www.soumu.go.jp/hakusho-kids/word/

### 質問は恥ではないし役に立つ - Qiita
https://qiita.com/seki_uk/items/4001423b3cd3db0dada7

### 良い質問をして、良い回答を得るためのコツ
https://kensuu.com/n/na4c0872fe664

### 練習中ではなく「頻繁な休憩」がスキルを上達させると判明
これってエンジニアの学習もそうなんですかね？
一度トイレ休憩やコーヒー休憩をとると問題解決できることがよくある。
https://nazology.net/archives/91085

## 23研修に向けて

### chatGPTなどの自動生成系の取り扱い
まあ会社ごとに異なりますよね
https://www.businessinsider.jp/post-265674

機密情報を与えてしまうとそれを学習データにしてしまうので
それを与えるのは論外として。
一般的な情報を用いてうまく利用する分には問題なさそうだし
うまく壁打ち役として使えれば学習効果は上がる気がする。
もちろん、間違った情報も出てくることを前提として。
今後はググる技術ではなくchatGPTとかBingとかとうまくやり取りできるスキルが必要かなとも。
セキュリティ教育の教材として使えるネタでもありますね。

### 日本における未来志向型インフラ・テクノロジのハイプ・サイクル：2022年
何が出てくるかな
https://www.gartner.co.jp/ja/newsroom/press-releases/pr-20220901

### 気になるlinux本
https://satoru-takeuchi.hatenablog.com/entry/2023/03/01/224800

### DX白書2023
https://www.ipa.go.jp/publish/wp-dx/dx-2023.html

### 情報セキュリティ10大脅威2023
https://www.ipa.go.jp/security/vuln/10threats2023.html
FDM 3Dプリンタのフィラメント吸湿対策

# Prusaのエンクロージャ
テーブル全体を使用するような薄物を出力する場合、有効だそうなのでエンクロージャを購入。
長時間の出力にはヒータ付きフィラメントケースを併用していたが、エンクロージャには入らない。
隙間をテープで塞いだが、塩カリ除湿剤では湿度が下がらない。
ペルチェ素子を使用した小型の除湿機(幅16.3x奥行き10.7*x高さ6.7)をエンクロージャ内に設置。気温が低い時は除湿能力が低いので、20度40％程度の庫外に対して5％程度しか下がらないが、印刷によって庫内の温度が上がれば、効果はアップするはず。

# 湿度計
密閉ボックスに付属している湿度計が故障しがちであることを製品評価コメントにあったので、ThermoProの無線測定機で測定することに。
計測値は温度20度前後でも30％以下に。付属のアナログ計測器は一旦湿度が上がると低い湿度を計測できなくなるようだ。

# 吸湿対策
FDMタイプの3Dプリンタを利用する場合、フィラメントの吸湿は出力の悪化につながる。
* プリンタを購入したら、密閉ボックスも用意する。
* 密閉ボックスには吸湿剤を入れ、低湿度を維持する。
* フィラメントは環境にも依存するが、半日程度で吸湿するので、必要量だけを切り取り使用する。
よって、多少高価ではあるが、フィラメントの切替が容易なダイレクトエクストルーダが良い。
市販の塩カリ除湿剤で40％以下に維持でき、出力も許容範囲。
2022／12使用開始　550mlタイプ
* 12時間以上の長時間出力の場合は、ヒータ付きのボックスで吸湿対策。
プルーサの1層目定着　　
気温が低い時、ヒートベッドのヒーターから離れた部分は温度が低くなり定着が甘くなるので、中央を使う。接触面積が小さい場合、周辺部まで使用する場合「プリム」で接触面積を大きくする。

# 塩カリ除湿剤 
2022/12使用開始した除湿剤が2023/07固まって、能力ダウン。水も溜まっていないが、50%になっている。
そのせいか、1層目の定着が悪くなったようだ。フィラメントをヒートボックスに入れて、プリントすると改善。　
除湿剤を交換。能力の落ちた除湿剤は押し入れに。42％程度まで低下。
押し入れに入れて半日で、固まっていた除湿剤はほぐれたので、防湿ボックスへ再度投入。新旧2個体制。
古い除湿剤が足尾引っ張るのか、湿度が50％から下がらないので、古い方を取り出した。
入門GOプログラミング　Lesson2　偉そうな計算機

## 整形付き出力

標準出力
`Print` : 
`Println` :
`Printf` : Print formatの略（だと思われる）
以下の使い方が可能
```go:
    fmt.Print("Hello World")
	fmt.Println("kgです")// 自動改行付き
	fmt.Printf("私の体重は%v表面で%vkgです", "Earth", 70)//フォーマット指定子付き
```

## テキストのアライメント調整
```go
	fmt.Printf("%-15v $%4v\n", "spaceX", 94)// 右に15文字分パディングを設ける
	fmt.Printf("%-15v $%4v\n", "Virgin Galactic", 100)//左に4文字分パディングを設ける
```


## 定数と変数

```go:
const lightSpeed = 300000 // 定数定義
var distance = 1000000000 // 変数定義
```
ショートカット定義も可能
```go:
var (
    distance = 50000000
    speed = 100800
)

var distance, speed = 50000000, 100800
```
## 代入演算子・インクリメント

```go:代入演算子
var weight = 70
weight *= 0.39
```
```go:インクリメント
var weight = 70
weight + weight + 1
weight += 1// 同上
weight++// 同上
```
デクリメントは`weight--`

乱数
```go:インクリメント
import (
    "math/rand"
)
```

## ■練習問題
```go:malacandra.go
package main

import (
	"fmt"
)

func main() {
	const distanceToMalacandra = 56000000
	var spendDays = 28
	var speed = distanceToMalacandra / spendDays
	fmt.Printf("%vkm/sec", speed)
}
```



## メモ
変数の宣言はできない
`var distance` → `missing variable type or initialization`
Springでポートフォリオを作る　3-2-1.機能設計(機能設計と画面設計を繋ぐ)

# 前回まで
これまで機能設計と画面設計を行いました。

画面設計

https://qiita.com/Jackoguro/items/2bcaac1b13aa61131598

機能設計

https://qiita.com/Jackoguro/items/ccce8b0fd3d5ba44d8d8


# この記事の目的
これまで作成した画面設計と機能設計を紐づけし、ユーザー操作・裏側の処理がどのように行われているかを確認します。

# 機能設計と画面設計を繋いだ全体像
この記事では全体像は入りきらないため、全体像はFigmaで作成したリンクを貼っておきます。

https://www.figma.com/file/wHbtJZQYGBKYgPyeVxzshN/%E6%A9%9F%E8%83%BD%E8%A8%AD%E8%A8%88(%E6%A9%9F%E8%83%BD%E8%A8%AD%E8%A8%88%E3%81%A8%E7%94%BB%E9%9D%A2%E8%A8%AD%E8%A8%88%E3%82%92%E7%B4%90%E3%81%A5%E3%81%91%E3%82%8B)?node-id=0%3A1&t=dlKzMlmNOTyZ0aXn-1

# ポイント
1. 裏側の処理、ユーザーの処理、分岐の処理の3つに分けて作成する
1. ユーザーの処理は画面遷移に関係のある操作(主にボタン操作)を中心に書く
1. 裏側の処理はDBを中心に書く
『この一冊で全部わかる WEB制作と運用の基本』メモ Chapter1

本記事は[『この一冊で全部わかる WEB制作と運用の基本』](https://www.sbcr.jp/product/4815609559/)のChapter 1のメモです。

人々は情報を求めて文書を読む。昔は書籍や書物をあたっていました。
しかし現代ではそれら以外にも文書を読む手段があります。
それこそ、WEBなのです。

# WEBの用語の整理

WEB＝文書を公開し、見るためのシステム

WEBページ＝WEB上にある文書

WEBサイト＝特定のドメインの中にあるWEBページの集まり

トップページ＝WEBサイトの表紙にあたるWEBページ

ホームページ＝ブラウザを起動した時に最初に開かれるWEBページ
(Google ChromeやMicrosoft Edgeを起動したときに最初に開かれるあれ)
ただし、単にWEBサイトを指す時に使われる場合もあり。

WEBアプリケーション＝WEBを介して人が利用するサービスを提供するsomething

WEBシステム＝WEBサイト、WEBアプリケーションを提供するための仕組み

# WEBサイトの種類
分類の仕方は複数ありますが
ここでは
消費者向け | 企業内利用
情報のやり取りが　一方向 | 双方向
の2次元で分類しました。

消費者向け & 一方向
例：企業サイト、商品の宣伝サイト

消費者向け & 双方向
例：ECサイト、比較サイト、SNS、ブログ

企業内利用
例：スケジュール管理サイト、企業内手続きサイト
以前はPCにアプリケーションをインストールしないと使えないサービスが
WEB化されている例がある。

# 何のためにWEBサイトをわざわざ作るのか？
本書はビジネス志向の人向けで、
WEBがいかにしてビジネスに資するかについてまとめられていました。
①企業や自社商品の認知度・ブランドイメージを向上させたい人には...
WEBサイトでの打ち手の例：
企業サイトをブラッシュアップ、
商品の宣伝サイトの立ち上げなど

②売上を向上させたい人には...
ECサイトの立ち上げなど

③顧客からの問い合わせに対応したい人には...。
問い合わせを受け付けるWEBサイト、チャットによる自動応答機能

④企業内で社員間の情報共有をしたい人には...
社内ポータルサイトの立ち上げなど

# WEB開発プロジェクトでの登場人物
・プロジェクトマネージャー(PM)＝開発サイドの責任者。QCDを守れるようにプロジェクトを計画、調整する。
・WEBディレクター＝WEB制作の現場のリーダー。PMが作った計画を実行する。
成果物の完成までの指揮をとる。
・WEBデザイナー＝WEBサイトのデザインを担当。デザインの方向性や配色などを決める。
・フロントエンドエンジニア＝WEBサイトをHTML, CSS, JavaScriptで実装する。
・システムエンジニア=フロントエンドに対して、サーバーサイドを担当する。例えば、サーバーを設定したり、Webアプリケーションの設計・開発をする。
・WEBマーケター＝WEBを活用したマーケティング活動の企画・実行をする。
・WEBアナリスト＝WEBサイトから収集されたデータを解析し、ユーザー行動を理解する。

# WEBサイト開発の流れ
左上から辿ってください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1081780/4408ad87-fecc-72a3-c62e-4f237087ff85.png)

# WEBサイトは改善するもの
①WEBサイトがどのように利用されているかを把握する
例えば、何人が閲覧しているか？、離脱率は？をチェックする。
このためのツールは、googleアナリティクスなどです。

②これじゃだめだ！となったら、改善します

どうやって？

2つの領域があります。
WEBサイトのデザインを改善する(例：)
マーケティングを改善する(例：WEB広告を出してもらっている場所を変える)

利用状況のモニタリングと修正のサイクルを通して、
ビジネスの目標を達成できるWEBサイトを仕上げ、維持していきます。



さて、WEBサイトの良さを把握する際に注目される指標は2つ。
まずは、
UX(ユーザーエクスペリエンス)です。
これは何なのでしょうか。

これは、WEBサイトを使った時に人間に生じる体験と感情のことです。
例：ECサイトを使った人間のUXとは。
商品情報が動画で載っていたのでわかりやすい、
商品検索が素早くできたのでうれしい。
などです。

次に、別のWEBサイトの良さを把握する際に注目される指標を紹介します。
ユーザビリティです。

ユーザビリティは、3つの下位の要素で構成されています。つまり
ある人が、ある利用シーンで、自分の求めていたもの(=目的)を得る際に
「ちゃんと求めていたことができたか」＝有効性
「それは効率的にできたか」＝効率性
「その際に満足したか」＝満足度
です。

例としてこの枠組みをECサイトに当てはめ、
ECサイトの良さを分析してみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1081780/b42bc1a9-c4c5-1d90-6fbb-8c7d1fd2d32b.png)

この絵ではイイ感じのユーザビリティが上がっていますが、
「気になる機種が見つからない！」「比較しにくい！」などがあれば、
そこは改善すべき点ということになります。
このように枠組みを用いて、真に把握・改善すべきポイントを発見できる
ということだと思います。

※ユーザビリティの下位の指標は他にもあります。
ニールセンの5つの指標で調べてみてください。


以上です。お読みいただきありがとうございました！
Python3で花火を実装してみた

実行結果（コマンドライン）は以下の通り。

```command line
$ python3 ico11.py
x 1.1647083184890923e-16
x 1.7470624777336384e-16
x 2.3294166369781847e-16
x 2.911770796222731e-16
x 3.494124955467277e-16
x 4.076479114711823e-16
x 4.658833273956369e-16
x 5.241187433200916e-16
x 5.823541592445462e-16
x 6.405895751690008e-16
x 6.988249910934554e-16
x 7.5706040701791e-16
x 8.152958229423646e-16
x 8.735312388668193e-16
x 9.317666547912739e-16
x 9.900020707157283e-16
x 1.0482374866401831e-15
x 1.1064729025646376e-15
x 1.1647083184890924e-15
```

実行結果（ウィンドウ表示）は以下の通り。
![Screenshot from 2023-03-04 13-37-43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/ad7aef4a-9c89-f4e1-56bd-03ab9e2247a2.png)


ソースファイル（matplotlibを使った）は以下の通り。中心部から同心円状に点が広がる。再描画。

```ico11.py
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import time
import random

radius=1.0
sectorCount=20
stackCount=20

fig = plt.figure(figsize = (20,20))
ax = fig.add_subplot(111, projection='3d')
fig.set_figheight(6)
fig.set_figwidth(6)
#plt.xlim(0.0, 10.0)
#plt.ylim(0.0, 10.0)
#plt.zlim(0.0, 10.0)
ax.set_xlim(0.0, 10.0)
ax.set_ylim(0.0, 10.0)
ax.set_zlim(0.0, 10.0)
#fig.tight_layout(False)
ax.set_xmargin(10.0)

#xx = []
#yy = []
rc_array = []
gc_array = []
bc_array = []
for i in range(int(stackCount)):
    for j in range(int(sectorCount)):
        rc_array.append( random.random() )
        gc_array.append( random.random() )
        bc_array.append( random.random() )

#plt.show()
plt.ion()
k=1
while k<20:

    plt.cla()
    xx=[]
    yy=[]
    zz=[]

    lengInv=1.0/(radius+float(k))
    radius = radius + 1
    sectorStep = 2* np.pi/ sectorCount;
    stackStep = np.pi/ stackCount;

    for i in range(int(stackCount)):
        stackAngle=(np.pi/2)-i*stackStep
        xy=radius*np.cos(stackAngle)
        z=radius*np.sin(stackAngle)

        for j in range(int(sectorCount)):
            sectorAngle = j * sectorStep
            x = xy * np.cos(sectorAngle)            
            y = xy * np.sin(sectorAngle) 

            xx.append(x)
            yy.append(y)
            zz.append(z)

    print("x",xx[1])

    for i in range(len(xx)):
        ##ax.plot_surface(xx[i], yy[i], zz[i], rstride=4, cstride=4, color='b')
        #ax.plot_wireframe(xx[i], yy[i], zz[i],color="r")
        #ax.scatter(xx[i], yy[i], zz[i], color="r", s=8.0)
        #rc = random.random()
        #gc = random.random()
        #bc = random.random()
        rc = rc_array[i]
        gc = gc_array[i]
        bc = bc_array[i]
        ax.scatter(xx[i], yy[i], zz[i], color=[rc,gc,bc], s=8.0)
        #ax.quiver(0, 0, 0,xx[i], yy[i], zz[i], color='royalblue',length=1.0, normalize=True, arrow_length_ratio=0.2)

    #ax = fig.add_subplot(111, projection='3d')
    #plt.show()
    #plt.plot()

    ax.set_xlim(-20.0, 20.0)
    ax.set_ylim(-20.0, 20.0)
    ax.set_zlim(-20.0, 20.0)
    
    #fig.canvas.draw()
    #fig.canvas.flush_events()
    plt.draw()
    plt.pause(0.01)
    k = k + 1
    #time.sleep(0.2)
```
ChatGPTが書く小説を投稿するサイトを作ってみた

## 前提
ChatGPTを使って遊んでいたところ、無限に小説を作ることができると知ったので、生み出して読んでいたところ、読みやすくて普通に面白いと思いました。なので、AI小説の投稿サイトを作り、AIが生成した面白い小説を共有できたら面白いと考え、また、react, django REST framework の勉強がてら作ってみました。

https://www.levonia.link/category

https://github.com/esakiryota/novel-gpt


## 技術
**バックエンド**
-- 言語
- Python3

-- フレームワーク
- Django 3.0.6


**フロントエンド**
- React

**インフラ**
- AWS EC2
- AWS Amplify

## アーキテクチャー
![architechture.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1860891/c1662813-ca1a-233a-cac9-b73cbb5d961e.png)


## 工夫した点
- SPAを採用して、できるだけスムーズに小説が読めるようにしました。![スクリーンショット 2023-03-04 13.35.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1860891/5bfc4760-b6e0-94f8-38a6-7f50556f98bd.png)




## これから実装すること
- ChatGPT APIの導入
【PHP / Laravel】privateメソッドのunitテストをする

# 環境
PHP8
Laravel9

# やりたいこと
privateメソッドをテストしようとするとテストできない、、、
そこでprivateメソッドのunitテストをする方法を２つご紹介します。

今回のテスト対象のクラスとメソッドは以下のようなものとします。
```TestService.php
class TestService
{
    //省略

    private function targetPrivateMethod ($familyName, $firstName) {
        return $familyName . '' . $firstName;
    }
}
```

# 方法
### 1.`ReflectionClass`を使用する
```PrivateMethodTest.php
use ReflectionClass;//追加

class PrivateMethodTest extends TestCase
{
    $familyName = '山田';
    $firstName = '太郎'; 
    $reflection = new ReflectionClass(TestService::class);//対象のクラス
    $method = $reflection->getMethod('targetPrivateMethod');//対象のprivateメソッド
    $method->setAccessible(true);//アクセスを可能にする
    $result = $method->invokeArgs(new TestService(), [$familyName, $firstName]);//実行
}

```


### ２.`ReflectionMethod`を使用する
```PrivateMethodTest.php
use use ReflectionMethod;//追加

class PrivateMethodTest extends TestCase
{
    $familyName = '山田';
    $firstName = '太郎'; 
    
    $class = new TestService();//クラスのインスタンスを作成
    $method = new ReflectionMethod($class, 'privateMethodName');//対象クラスとprivateメソッドを指定
    $method->setAccessible(true)//アクセスを可能にする
    $result = $method->invokeArgs($class, [$familyName, $firstName]);//実行
}

```

ここで一点注意点ですが、テスト対象のprivateメソッドに引数がなかった場合、
`$method->invoke($class);`
とします。

以上です。
usermod: user xxx is currently used by process xxx の対処法

`CentOS8.1`

ユーザー名を変えたくて、usermod -l new_name old_nameを叩くと
usermod: user xxx is currently used by process xxxとなって変更できない。suでrootになっても同じだったので、どうやらログインしてしまうとだめらしい。

# CUI起動
対策として、システム起動後にログイン画面になる前にctrl+alt+F2で下のCUIに入ってrootでログイン。

<img width="600" alt="useradd編1.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2929519/fbaf1ae6-9218-5f36-b1a0-d1a046a1be38.png">

次に
```
usermod -l new_name old_name

```
で変更が完了。その後reboot。
【競プロ/Swift】AtCoder Beginner Contest 291

# 注意事項
本記事は復習のための日記的なものであり、丁寧な解説を求めている方には不十分かと思われますので、ご了承のほどお願いいたします。

# 正解済み問題
## A - camel Case
**問題文**
[こちら問題ページ](https://atcoder.jp/contests/abc291/tasks/abc291_a)

**解答**
受け取った文字列の内に何文字大文字があるかを判定。
文字列をfor分で１文字ずつ流して、String側の標準APIのisUppercaseを使用することで大文字か判定。
最終的に集計した値を出力することで解答。

```swift
let S = readLine()!
 
var counter = 1
 
for str in S {
  if str.isUppercase {
    break
  }
  counter += 1
}
 
print(counter)
```

## B - Trimmed Mean
**問題文**
[こちら問題ページ](https://atcoder.jp/contests/abc291/tasks/abc291_b)

**解答**
入力値Nの数分の最小値と最大値を入力値xArrayから取り除き、残されてた値の平均値を求める処理。
N回ループを回し、xArrayから最大値と最小値のIndexを見つけ取り除いていく。
最終的に残された値の合計をreduceでも求めて、あとは残された値の数で割って、平均値を出力する。
```swift
let N = Int(readLine()!)!
var xArray = readLine()!.split(separator: " ").map{Int($0)!}
 
for _ in 0..<N {
    let maxValue = xArray.max()
    let minValue = xArray.min()
    if let index = xArray.firstIndex(where: { $0 == maxValue }) {
        xArray.remove(at: index)
    }
    if let index = xArray.firstIndex(where: { $0 == minValue }) {
        xArray.remove(at: index)
    }
}
 
print(Float(xArray.reduce(0, +)) / Float(xArray.count))
```

# 誤答及び、未解答問題
## C - LRUD Instructions 2
**問題文**
[こちら問題ページ](https://atcoder.jp/contests/abc291/tasks/abc291_c)

**誤答**
実行時間制限超過により誤答。
N個の文字列Sは「RLUD」で構成されており、
Rの場合はx座標を＋１
Lの場合はx座標をー１
Uの場合はy座標を＋１
Dの場合はy座標をー１
する。

最終的に座標移動開始から終了まで、同じ座標を踏んだかを判定する。

```swift
let N = Int(readLine()!)!
let S = Array(readLine()!)
 
var xy = [0, 0]
var xyHistory = ["00"]
 
var isPositioned = false
 
for num in 0..<N {
    if S[num] == "R" {xy[0] += 1}
    else if S[num] == "L" {xy[0] -= 1}
    else if S[num] == "U" {xy[1] += 1}
    else if S[num] == "D" {xy[1] -= 1}
 
    if xyHistory.contains("\(xy[0])" + "\(xy[1])") {
        isPositioned = true
        break
    } else {
        xyHistory.append("\(xy[0])" + "\(xy[1])")
    }
}
 
print(isPositioned ? "Yes" : "No")
```
**正答**
原因は過去の座標入れている変数にSetを使用していなかったのが、原因みたいです。
Setにしないと処理速度が遅くなるみたいですね。
```swift
let N = Int(readLine()!)!
let S = Array(readLine()!)
 
var xy = [0, 0]
var visited: Set<[Int]> = [[0, 0]]
 
var isPositioned = false
 
for num in 0..<N {
    if S[num] == "R" {xy[0] += 1}
    else if S[num] == "L" {xy[0] -= 1}
    else if S[num] == "U" {xy[1] += 1}
    else if S[num] == "D" {xy[1] -= 1}
 
    if visited.contains([xy[0], xy[1]]) {
        isPositioned = true
        break
    }
    visited.insert([xy[0], xy[1]])
}
 
print(isPositioned ? "Yes" : "No")
```
# 参考
https://atcoder.jp/contests/abc291
https://qiita.com/Saayaman/items/4f3f63048d1d5924a829#set%E3%81%AB%E8%A4%87%E6%95%B0%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%E3%82%BF%E3%82%A4%E3%83%97%E3%81%AF%E4%BF%9D%E5%AD%98%E3%81%A7%E3%81%8D%E3%82%8B%E3%81%AE
https://qiita.com/KyoheiG3/items/0bf9887a55fe7ad05811
macOSでjarがダブルクリックで起動しない場合の解決方法

# Executable Jarではない
```shell
unzip jar
cat ./META-INF/MANIFEST.MF 
Manifest-Version: 1.0
Main-Class: practice.Main
```

jarを解凍して、Manifest.MFを見て、Main-Classが設定されていること。

# アプリケーションフォルダ配下にJarを配置していない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87538/3f24e81e-945c-c9be-eace-5f952ddf000c.png)
こちらに配置して、ダブルクリックすれば起動できる。
Raspberry Pi 3B+とMCP2518FDを用いたCAN FD通信に関するノウハウ(一般公開用)


# はじめに

研究室を卒業するが，引き継ぎ用資料の内，一般公開可能なものを備忘録としておきます．
- [公式サイト](https://www.raspberrypi.com/software/) より環境にあったRaspberry Pi Imagerをダウンロード，インストールする．(本記事ではwindows11で進める) ![スクリーンショット 2023-03-04 123144.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2211347/d75d8daf-4f81-a459-a74a-58b6410b37af.png)
- 通常通りRaspberry Piを起動させ，初期設定，apt updateやapt upgrade -yを完了させる．
- ipアドレスは ip aで確認できる![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2211347/b7b966c7-01bc-b85d-3472-1ef73b6671e4.png)
この例だと 192.168.52.128である(実機ではなく，vmware環境で撮影しています．すみません)
- 左上ボタン→設定Raspberry Piの設定→インタフェースを開き，ssh(と必要に応じてvnc)を有効にする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2211347/48cf51a9-6d0a-7c59-5371-5b68538bf70a.png) 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2211347/2a3efed6-00fb-6f7b-60ae-a9fc3b3838db.png)
- Raspberry Piを再起動する
- sshでログインできることを確認する
- スクリーンエディタ(nanoなど)を用いて/boot/config.txtというファイルをsudoで開き，その一番下に以下の3行を追加する(間違ってそれ以外を触らないように注意!!!)
```
dtoverlay=spi1-3cs
dtoverlay=mcp251xfd,spi0-0,interrupt=25
dtoverlay=mcp251xfd,spi0-1,interrupt=24
```
- Raspberry Piを再起動する
- PC上にvscodeをまだ入れていない場合には入れ，ssh拡張機能を入れる．
 
```
$  sudo ip link set up can0 type can bitrate 500000 dbitrate 1000000 fd on
$  sudo ip link set up can1 type can bitrate 500000 dbitrate 1000000 fd on
```
とipコマンドを使用してインタフェースを起動するコマンドの引数の意味は
sudo ip link set (起動する) (インタフェース名) type can bitrate (ボーレート(例の場合500 kbps)) dbitrate (データビットレート(例の場合1 Mbps)) fd on(can fdを使用する)
である
https://github.com/HarunobuEnami/send_example
送信プログラムの例
https://github.com/HarunobuEnami/recieve_example
受信プログラムの例
Typescript基礎


## NPM/NPX

### package.json
-  アプリケーション情報
- インストールしたモジュールのバージョンの依存関係

### package-lock.json(yarn.json)
- package.jsonとの利用モジュールの依存関係
- モジュールの存在URL
### node_modules
モジュール本体
※ここは.gitignoreにいれる

### npx
npxはnode_modulesにインストールしたモジュールを実行する事ができる
内部的には npm execを実行している
A Closer Look At Memorization in Deep Networks: パターン学習？丸暗記？

https://arxiv.org/abs/1706.05394
Submitted on 16 Jun 2017
Cited by 1275
Universite de Motereal, Canadaなど Yoshua Bengio先生監修

# 結論
* **DLはまず単純なパターン学習(データ共通)をして、その後で丸暗記(少数・個別データ)する**
    * 丸暗記にはモデルのキャパが必要
    * 丸暗記は決定境界が曖昧・近い
* Dropout等の正規化により丸暗記を防止できる。結果、汎化が改善することがある

# 感想
* **「パターン学習が先」「正規化で汎化改善かも」は現在でも重要**
* この後、Double Decent・Overparamsの登場で規模は正義になる
    * Overparamsでパターン学習と丸暗記が競合せずに達成される、と理解。中途半端なキャパだと丸暗記がパターン学習を妨げて精度低下する。
* 表現学習と最終層を分けていないが、インプットノイズは表現学習を妨げ、レーベルノイズは最終層学習を妨げる、と理解
    * 実務上はインプットノイズよりレーベルノイズが問題=最終層のパターン学習問題
* 思い浮かぶ疑問
    * **パターン学習と丸暗記の違いの定義がない。データ共通頻度、というグラデーションでとりあえず理解。** グラデーション定義できたら、学習達成の指標ができそう
    * **Epoch-wise Double Descentとの整合性をどう理解するか？** トレーニング損失が0になる前後でテスト損失が上昇する。丸暗記が途中で、パターン学習済を邪魔する？

# 詳細

### 勾配のジニ係数
* **パターン学習はデータの勾配に差が出る。丸暗記はどのデータも同等**
    * 通常データではステップ進むほど、勾配のジニ係数が上昇する（=特定のサンプルのみ勾配が強い）
    * ランダムデータではステップ進んでも、勾配のジニ係数が上昇しない（=サンプルの勾配の強さに差がない）

### パラメタ数
* **パターン学習はキャパ小さくてもできる。丸暗記にはキャパが必要**
    * 通常データではパラメタ数が少なくても高い精度で学習できる
    * ランダムデータはパラメタ数を大きくしないと高い精度で学習できない 

### 収束時間
* **パターン学習はキャパ小さくても効率よく収束する。丸暗記はキャパ利用で収束する**
    * 通常データはパラメタ数増やしても収束時間はそこまで短くならない
    * ランダムデータはパラメタ数増やすと収束時間が短くなる

### CSR(critical sample ratio)
* **パターン学習は決定境界周辺にアンチデータが少ない。丸暗記は決定境界周辺にアンチデータ多い**
    * 通常データでCSRはそこまで上昇しない。決定境界がはっきりしている
    * ランダムデータでCSR上昇し続ける。決定境界が曖昧・近い

### その他
* 1エポックだけ回すと、ランダムデータ(インプットでもレーベルでも)は学習しないが、通常データは学習する
* レーベルランダムデータでは、トレーニング精度が収束する前に、テスト精度がピークを迎える
ゲートウェイ

# ゲートウェイ
```トランスポート層（第４層)以上が異なるネットワーク間で、プロトコル変換による中継機能を提供```する装置。

ネットワーク双方で使っている```プロトコルの差異をこの装置が変換、吸収```することでお互いの接続を可能にしている。

# 例
* 携帯メールとインターネットの電子メールがお互いにやり取りできるのも、間にメールゲートウェイという変換器が入っているため。

* 装置だけでなくその役割を持ったネットワーク内のコンピュータなども該当する。

# 出典
https://gihyo.jp/book/2020/978-4-297-11781-8
Leetcode 2062. Count Vowel Substrings of a String

https://leetcode.com/problems/count-vowel-substrings-of-a-string/

## アプローチ
### Sliding window

```java
class Solution {
    public int countVowelSubstrings(String word) {
    int wordLength = word.length();
        int result = 0;
        if (wordLength < 5) {
            return result;
        }

        Set<Character> set = new HashSet<>();

        for (int i = 0; i < wordLength - 4; i++) {
            set.clear();
            for (int j = i; j < wordLength; j++) {
                char temp = word.charAt(j);

                if (temp == 'a' ||
                        temp == 'e' ||
                        temp == 'i' ||
                        temp == 'o' ||
                        temp == 'u') {
                    set.add(temp);
                    if(set.size() == 5){
                        result++;
                    }

                } else {
                    break;
                }

            }
        }
        return result;
    }
}
```
『それが大事』フローチャートをMermaidで書いてみた

# 『それが大事』とは

* **負けない事**
* **投げ出さない事**
* **逃げ出さない事**
* **信じぬく事**

の大事さを歌った『[大事MANブラザーズバンド](https://ja.wikipedia.org/wiki/%E3%81%9D%E3%82%8C%E3%81%8C%E5%A4%A7%E4%BA%8B_(%E5%A4%A7%E4%BA%8BMAN%E3%83%96%E3%83%A9%E3%82%B6%E3%83%BC%E3%82%BA%E3%83%90%E3%83%B3%E3%83%89%E3%81%AE%E6%9B%B2))』さんの名曲です。

# 『それが大事』フローチャートとは

これです。

https://youkoseki.com/soregadaiji/

ふとこれを[Mermaid](https://mermaid.js.org/)で書きたくなったので書いてみました。

```mermaid
    graph TB;
        S([Start])-->負けない事;
            負けない事-->投げ出さない事-->逃げ出さない事-->信じ抜く事;
            信じ抜く事-->駄目になりそうな時-->それが一番大事;
            信じ抜く事-->涙見せてもいいよ-->それを忘れなければ;
        それが一番大事-->負けない事;
        それを忘れなければ-->負けない事;
        それを忘れなければ-->Oh...;
        Oh... -->高価な;
        それを忘れなければ-->高価な;
        高価な-->墓石を建てる-->より-->安くても生きてる方がすばらしい-->ここに;
        高価な-->ニットをあげる-->より-->下手でも手で編んだ方が美しい-->ここに;
            ここに-->いるだけで-->傷ついている人はいる-->けど;
                けど-->さんざん我儘言った後-->あなたへの想いは変わらない-->けど;
                けど-->見えてるやさしさに-->時折負けそうになる-->ここに;
            ここに-->無いものを信じれるかどうかにある-->今は遠くに離れてる-->それでも生きていればいつかは逢える-->でも傷つかぬように嘘は繰り返される-->ここに;
            ここに-->あなたが居ない;
                あなたが居ない-->のが
                    のが-->淋しい
                    のが-->せつない
                あなたが居ない-->と思う事が
                    と思う事が-->淋しい
                    と思う事が-->せつない
                淋しい-->のじゃなくて;
                せつない-->のじゃなくて;
                    のじゃなくて-->ここに;
                淋しい-->Wow...;
                せつない-->Wow...;
                    Wow... -->でも-->負けない事;
        それを忘れなければ-->E([End]);
```

コードで読んだ時に分かりやすくするために、どこのインデントを下げればよいかとても悩みます。
書いてる最中は頭がこんがらがって駄目になりそうでした。

```
    graph TB;
        S([Start])-->負けない事;
            負けない事-->投げ出さない事-->逃げ出さない事-->信じ抜く事;
            信じ抜く事-->駄目になりそうな時-->それが一番大事;
            信じ抜く事-->涙見せてもいいよ-->それを忘れなければ;
        それが一番大事-->負けない事;
        それを忘れなければ-->負けない事;
        それを忘れなければ-->Oh...;
        Oh... -->高価な;
        それを忘れなければ-->高価な;
        高価な-->墓石を建てる-->より-->安くても生きてる方がすばらしい-->ここに;
        高価な-->ニットをあげる-->より-->下手でも手で編んだ方が美しい-->ここに;
            ここに-->いるだけで-->傷ついている人はいる-->けど;
                けど-->さんざん我儘言った後-->あなたへの想いは変わらない-->けど;
                けど-->見えてるやさしさに-->時折負けそうになる-->ここに;
            ここに-->無いものを信じれるかどうかにある-->今は遠くに離れてる-->それでも生きていればいつかは逢える-->でも傷つかぬように嘘は繰り返される-->ここに;
            ここに-->あなたが居ない;
                あなたが居ない-->のが
                    のが-->淋しい
                    のが-->せつない
                あなたが居ない-->と思う事が
                    と思う事が-->淋しい
                    と思う事が-->せつない
                淋しい-->のじゃなくて;
                せつない-->のじゃなくて;
                    のじゃなくて-->ここに;
                淋しい-->Wow...;
                せつない-->Wow...;
                    Wow... -->でも-->負けない事;
        それを忘れなければ-->E([End]);
```

もっと良い書き方があれば是非ご意見ください。

終わりです。
Databricks Notebookでpygwalkerを動かしてみる


Tableau ライクなインターフェースでノートブック上で可視化が出来るツールがある。と聞いたので早速 pygwalkerを試してみました。

# pygwalkerとは？

https://github.com/Kanaries/pygwalker

PyGWalkerはJupyter Notebookのデータ解析とデータ可視化のワークフローを簡素化し、pandasデータフレームをTableauスタイルのユーザーインターフェースに変えて、視覚的に探索することができます。とのことです。

残念ながら Sparkデータフレームには対応していない模様です。Databricksにある bamboolibに近い製品かなと思いました。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/0563d8a8-9702-6545-8e2f-2b5febcd6621.png" width='600'>


# セットアップ

非常に簡単です。

```python
!pip install pygwalker
```

# サンプルデータの取り込み

今回は、Databricksでデフォルトで用意されているデータをpandasで読み込みます。

```python
import pandas as pd
df=pd.read_csv('/dbfs/databricks-datasets/bikeSharing/data-001/day.csv', parse_dates=['dteday'])
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/4b847463-6679-ba76-bece-ce10c82a5d56.png)


# pygwalkerの起動

```python
import pygwalker as pyg
gwalker = pyg.walk(df)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/852eb910-ca5e-c251-d355-471591e19dde.png)

以上です。あとはGUI上で Tableauライクに可視化が出来ます。


# サンプル

### 月毎の利用者数を調査　＆天候毎にグループ化

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/98acd55d-d9da-71cf-093f-bcfc600b56ff.png)

### グラフのサイズの変更

ギアマークをクリックするとサイズ変更出来ます。もしくはグラフの青色の枠を掴んでサイズ変更できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/4bfff83a-9290-22dd-fe88-2e64245e20e0.png)

### グラフタイプの変更

そこまで多くないですが変更可能
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/a563820d-6aac-cf08-96bc-2959cd6d10ea.png)


### Aggregation機能

**Aggregation**ボタンを押すと、sum/min/max/meanなどでAggregationして表示できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/e41abb51-505e-f67b-77d4-3406c6b394b9.png)


### filter条件の入力

filterフィールドに tempを入れてみます。クリックすると条件を指定出来ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/e073772b-7006-84fd-7b2d-fd563a97cb9b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/b304bf46-d93e-6249-8318-06ecfc7f2c97.png)



### Exportはpngとsvg形式のみ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/13977ca5-71f3-491b-af5f-cef092679c7b.png)


# メリット＆デメリット

### メリット
- Tableauライクなインターフェースで誰でも直感的に操作できる
- Filter設定でInteractiveな操作が可能

### デメリット
- pandasデータフレームしか利用出来ない。ビックデータには不向き
- 利用できるグラフが少ない（拡張とかできるのかな？）
- ノートブック上のため設定を保存出来ない。（リフレッシュすると全て消えてしまう）
- ETL的な操作は出来ない（Joinやデータ加工など）
- csvやexel形式でダウンロード出来ない
- グラフにタイトルや、X/Y軸のラベルや凡例などカスタマイズできない

# 感想

ちょっと触っただけの感想で恐縮ですが。操作はシンプルなので直感的で非常に使いやすいツールと思いましたが、個人的にはDatabricks標準のDisplay()で十分な気がしましたし、機能面ではBamboolibの方が優っていると思いました。ただ直感的にわかるというのはやっぱ重要ですよね。
NAPT

# NAPT
プライベートIPアドレスとグローバルIPアドレスをn対１に紐づけて変換します。

```送信IPアドレスだけでなくポート番号も変換```する。

# ルーターの動き
ルーターはクライアントから受け取ったIPアドレスとポート番号を変換して、その変換情報を記憶して転送します。

レスポンスが帰ってきたらその変換情報を基に元のIPアドレスと宛先ポート番号に変換する。

# 参考資料
http://lan-pc.pc-beginner.net/bb_router/bb_router_napt.html

# 気づき
ポート番号を基に紐づけて変換しているのか。
つまり
変換できるポート番号の数で同時接続できる機器台数も変わるのか。

# 過去の記事
https://qiita.com/masatom86650860/items/d2778f92bdd4584094ea
LANとWAN その２

# LAN
```オフィスや家庭などの一つの拠点内のネットワーク```を指します。

# WAN
```拠点と拠点を結ぶためのネットワーク```を指します。

インターネット接続サービスを使用するためにオフィスや家庭に引いた回線のことをWANと呼ぶこともあります。

# 気づき
インターネットはWANで繋がって通信をしているのか。
もう何回目だろうか。

# 出典
https://www.sbcr.jp/product/4797386677/

# 関連記事
https://qiita.com/masatom86650860/items/2021870c33a8f28d1475
FTTH

# FTTHとは
FTTHとは、光ファイバーを使った家庭向けの通信サービスのことを意味する```「Fiber To The Home」```の略称です。

FTTHは、```基地局から各家庭まで光ファイバーが繋がっている```配線方式です。

各戸のONU（光回線終末装置）まで光ファイバーが接続されているため、```他の形式と比較してもっとも通信速度が速い```という特徴があります。

# FTTHと光回線の違い
FTTHは光回線とほぼ同じ意味なのですが、厳密にいうと```光回線の数ある配線方式の一つ```がFTTHです。

光ファイバーがどこまで通っているかにより、「FTT〇」といった感じで呼称が変化していきます。

# 4つの配線方式
光ファイバーを使用して通信を行うのが光回線の特徴ですが、```光ファイバーがどこまで繋がっているかによって、呼び方が異なります```。ここでは、以下の主要な4つの引き込み方法をご紹介していきます。

・FTTH（Fiber To The Home）
・FTTB（Fiber To The Building）
・FTTC(Fiber To The Curb)
・FTTN (Fiber To The Node)

# 出典
https://www.nuro.jp/article/ftth-shikumi/

# 感想
知らなかった。
光回線の配線方式で呼び方が違うんだな。
AWS EC2を再起動してみた

# はじめに
AWS　EC2を再起動した際の動作を確認してみた


# 対応手順

### サービス >> EC2 >> 左ペインのインスタンスを選択する


### 対象EC2にチェックを入れてインスタンスの状態から「インスタンスを再起動」を選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/5d43e83e-e4f8-783e-2da2-b3b1c0b58d5b.png)



※誤って「インスタンスの状態」にある「インスタンスを終了」を選択しても、EC2が終了せずにもう一回終了して良いか確認画面が出ます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/d882a66f-0eb5-30ed-3f67-104a3b064a83.png)


### 再起動前の確認画面

対象のEC2であることを確認して「再起動」をクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/d27af2be-bca2-a45c-907a-e8235ebc6f04.png)


EC2が起動中の状態での再起動だったため、パブリックIPは変わりませんでした。

以下の公式サイトに記載の通り、EC2が停止の状態での再起動であればパブリックIPは変わるそうです。

AWS公式サイト
https://aws.amazon.com/jp/premiumsupport/knowledge-center/ec2-recover-ip-address/



### EC2の画面を確認
インスタンスの状態から「インスタンスを再起動」を選択しても、
EC2のステータスは実行中のままで何も変化がないように見えました。
本当に再起動したか気になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/8a6d5685-8277-b273-2698-45f10137ea39.png)


「正常に再起動しました」というメッセージが画面上に表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/511cdad8-c2a1-d848-e2e1-28e605980450.png)


確認するためにTeraTermからSSH接続を使用としましたが、再起動後なのかすぐにSSH接続は出来ませんでした。
「ホストに接続できません」と表示されました。


### OSの稼働時間を確認
OSが稼働時間が1min(1分)のため、再起動されていることが分かった
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/ee9c1e59-e1ee-5f8c-0be5-01fbcb921f03.png)