OmniAICreator/Qiita-1.07M huggingface dataset:
java初心者が行く～継承2～

# はじめに
java初心者が備忘録的に書いています

# 抽象クラスの考え方
今回は抽象クラスの継承についてまとめていく。
そもそも抽象クラスとはその名の通り抽象的なクラスである。具体例でイメージしてみる。
ＲＰＧゲーム作成で敵モンスターであるスライムクラスを作成する。フィールド変数にはＨＰとＭＰがあり、攻撃用のメソッドがある。さらに別でゴブリンクラスを作成する。同じくＨＰとＭＰをフィールド変数にもち、攻撃用クラスを持つ。
javaで書いてみると以下のようになる。

```java:slime
public class Slime{
    int HP;
    int MP;
    pubric void attack(){
        //hoge
    }
} 
```

```java:goblin
public class goblin{
    int HP;
    int MP;
    pubric void attack(){
        //hoge
    }
} 
```

こうやって書いたあと中身を見てみると同じようなコードを書いていていることがわかる。
なぜならスライムもゴブリンもどちらも「モンスター」だからである。この考え方が抽象クラスの考え方。
ここでいうモンスターとは「HP」、「MP」、「攻撃用メソッド」をもつキャラクターのこととする。
java風に言い換えると親クラスに「Monster」というクラスを持つ子クラス「Slime」と「Goblin」を作成すればコーディングが楽になる。
~~（もう少し良い説明方法浮かばなかったものかと反省）~~

# 抽象クラスの書き方
実際に書いてみる。

```java:Monster
public abstract class Monster{//抽象クラスはclassの前にabstractをつける
    int HP;
    int MP;
    
    public abstract void attack(){
        
    }
}
```
```java:Slime
public class Slime extends Monster(){//extendsで継承
    
    public Slime(int HP, int MP){//コンストラクタ
            super.HP = HP;
            super.MP = MP;
        }
    
    public void attack(){
        //hoge
    }
} 
```

```java:Goblin
public class Goblin extends Monster(){//extendsで継承
    
    public Goblin(int HP, int MP){//コンストラクタ
            super.HP = HP;
            super.MP = MP;
        }
    
    public void attack(){
        //hoge
    }
} 
```
書き方自体はクラスの継承と変わらない

# 抽象クラスの特徴とメリット
抽象クラスのもっとも大きな特徴に「オブジェクトを直接生成できない」という（newできない）特徴がある。抽象クラスはあくまでも定義を行うクラスなのでnewを行おうとするとエラーがでる。

次に抽象クラスを使うメリットである。
抽象クラスを使うメリットは様々あるが、一番大きなメリットは実装の強制である。抽象クラスは、抽象メソッドを定義することができるため、サブクラスに必ず実装（これをオーバーライドという）させることができる（オーバーライドしないとエラー）。これにより実装漏れを防ぐことができる。ほかにもいろいろあるが初心者はこれくらい知っておけばいいんじゃね？~~（責任は取らぬ）~~

# interface
抽象クラスの中にinterfaceというものがある。これは簡単に言うとめっちゃ抽象度が高いクラスのことをいう。
interfaceの大きな特徴は二つある。
1. メソッドはすべて抽象メソッドである
2. フィールドを一つも持たない

今回Monsterクラスを抽象クラスとしたがさらに抽象度の高いCharacterクラスを親クラスにつける。
implementsの書き方と継承方法は以下のように書く。最低限

```java:Character
public interface Character{
    void walk();//public abstractは省略してもよい。理由は特徴1
}
```

```java:Monster
public class Monster implements Character{//抽象クラスはclassの前にabstractをつける
    int HP;
    int MP;

    public void attack(){}
    public void walk() {}
}

```
後は同様にattackメソッドとwalkメソッドを実装した子クラス(Characterクラスから見たら孫クラス)を実装すればよい。

# interfaceのメリット
interfaceはメソッドの処理内容を一切定義していないため通常のクラスでは許されていない多重継承が許されている。
メソッドの処理内容を一切定義していない->オーバーライドする必要があるため親クラスに同じ名前のクラスがあっても問題ないため多重継承できる。

ちなみにextendとinterfaceを同時に使うこともできるがそれはまた別の機会に、、、
Javaで安全に一時ファイルを作成したい

# はじめに

ここ数日、コンビニ交付のシステムトラブルが世間をにぎわせています。

https://www3.nhk.or.jp/news/html/20230502/k10014056301000.html

この記事にある川崎市のシステムを開発したベンダーからプレスリリースがでており、その内容から「一時ファイルの不適切な取扱いが原因ではないか」とSNS上ではうわさされています。

https://www.fujitsu.com/jp/group/fjj/about/resources/news/topics/2023/0509.html

本当に一時ファイルの取り扱いが悪かったのかについては関係者しかわからないのですが、そういうSNSのやりとりを見ていて、Javaには一時ファイルを安全に作成する方法が標準で用意されていることを思い出したので、まとめておこうと思った次第です(強引)

# Java6以前

Java6以前の場合はFileクラスのcreateTempFileメソッドを利用します。

- [File.createTempFile(String prefix, String suffix)](https://docs.oracle.com/javase/jp/8/docs/api/java/io/File.html#createTempFile-java.lang.String-java.lang.String-)
- [File.createTempFile(String prefix, String suffix, File directory)](https://docs.oracle.com/javase/jp/8/docs/api/java/io/File.html#createTempFile-java.lang.String-java.lang.String-java.io.File-)

またFileクラスの	deleteOnExitメソッドを利用すると、JVMの終了時に作成した一時ファイルを削除することができます。

- [File.deleteOnExit()](https://docs.oracle.com/javase/jp/8/docs/api/java/io/File.html#deleteOnExit--)

# Java7以降

Java7以降の場合はFilesクラスのcreateTempFileメソッドを利用するとよいです。

- [Files.createTempFile(Path dir, String prefix, String suffix, FileAttribute<?>... attrs)](https://docs.oracle.com/javase/jp/8/docs/api/java/nio/file/Files.html#createTempFile-java.nio.file.Path-java.lang.String-java.lang.String-java.nio.file.attribute.FileAttribute...-)
- [Files.createTempFile(String prefix, String suffix, FileAttribute<?>... attrs)](https://docs.oracle.com/javase/jp/8/docs/api/java/nio/file/Files.html#createTempFile-java.lang.String-java.lang.String-java.nio.file.attribute.FileAttribute...-)

Files.newBufferedWriterやFiles.newOutputStreamなどを使ってこの一時ファイルをオープンする際、OpenOptionとしてStndardOpenOption.DELETE_ON_CLOSEを指定すると、ファイルをクローズする際にファイルを削除することができます。

- [StndardOpenOption.DELETE_ON_CLOSE](https://docs.oracle.com/javase/jp/8/docs/api/java/nio/file/StandardOpenOption.html#DELETE_ON_CLOSE)

またFilesクラスにはcreateTempDirectoryというメソッドも用意されています。これを利用すると、安全に一時ディレクトリを作成することができます。

- [Files.createTempDirectory(Path dir, String prefix, FileAttribute<?>... attrs)](https://docs.oracle.com/javase/jp/8/docs/api/java/nio/file/Files.html#createTempDirectory-java.nio.file.Path-java.lang.String-java.nio.file.attribute.FileAttribute...-)
- [Files.createTempDirectory(String prefix, FileAttribute<?>... attrs)](https://docs.oracle.com/javase/jp/8/docs/api/java/nio/file/Files.html#createTempDirectory-java.lang.String-java.nio.file.attribute.FileAttribute...-)
結局interfaceは何がいいのか

# 結論
interfaceは便利だからどんどん使え。

# そもそもなぜ書こうと思ったのか
interface、正直作るのめんどくさいし、こんなの必要ないやんって思ってた。
特に研修の頃は死ぬほど思ってた。
案件に入ってからもレガシーであんまりオブジェクト指向チックなことをしていないコードだとinterfaceなんて実装されていないし、いらんと思ってた。

でもデザインパターンとかアーキテクチャの話は好きでいろいろ書籍を漁っているうちに必要だと思えるようになった。
フルスクラッチで開発するってなったとき、便利さにめちゃくちゃ気付いた。

# ほな、なにがええのか
型が担保されます。
実装時にinterfaceをもとに自動でコード生成してくれます。
DIとかできます。

# そもそもinterfaceとは
ユーザーインターフェース（UI）とかのインターフェースです。つまりINとOUTをつなぐものです。
そのため、各関数の**引数のかたち**と**返り値のかたち**のみ記載したクラスです。

# 型の担保のなにがいいのか
何よりも、「この型を受け入れられて、この型で返します」ということがわかります。
type errorとかを未然に防ぐことができます。
また、interfaceを参照したクラスを実装する際、IDEが勝手に骨組みを作ってくれたり、静的解析を行ってくれます。
この静的解析はjavaなどのコンパイラ言語の場合はコンパイラがしてくれるので未然にバグを防げますが、PHPなどインタプリタ言語の場合、そこのソースを動かさないと例外を吐かないので、とても便利です。
つまり、プログラミングしている段階でバグに気付くことができます。

# 自動でコードを生成することのなにがいいのか
基本的に人間はミスをします。バグが実はタイポだったりするのはよくあることです。それを機械が勝手にしてくれるので、タイポを減らせます。また一瞬で骨組みを作ってくれるのでその分生産性も向上します。
プログラミングはあくまで手段であることを忘れてはいけません。正直AIに任せて生産性が上がるなら、任せたほうが楽です。

# DIとかができると何がいいのか
DI、依存注入と呼ばれるものですが、要は疎結合になるんですね。コンポーネントの独立性が高まるので影響範囲が狭いんです。
その結果、保守性が高まります。

# 終わりに
~~酔っ払いが酒の勢いで書いた記事です。~~
要はinterfaceを使うことで、生産性と保守性が高くなりまっせ。という話でした。

そのシステム、何年使いますか？最初の数時間を犠牲にして後々の何年を大切にしませんか？
【micromodal.js】モーダルウィンドウのライブラリの使い方

### 環境

今回の開発環境は以下の通りです。
Laravel9
Inertia
Vue3

# micromoal.jsとは

シンプルなモーダルウィンドウを簡単に作れるライブラリです。

公式

https://micromodal.vercel.app/

# インストール

```
npm i micromodal@0.4.10 --save
```
コマンド実行後、json:package.jsonにmicromodalが追加されていれば、無事にインストールされています。

```json:package.json
"dependencies": {
    "micromodal": "^0.4.10",
}
```

# 準備

### micromodal.js
resources/js/micromodal.jsを新たに作成します。

```js:micromodal.js
import MicroModal from 'micromodal'

// MicroModal.init()で初期化
MicroModal.init({
    // オプション
    
    // 背景をスクロールさせない
    disableScroll: true
});
```

### micromodal.css

resources/css/micromodal.cssを作成し、下記のページからコードをコピー

※公式マニュアルにこのコードが書かれているGitHubへのリンクがあります。

https://gist.githubusercontent.com/ghosh/4f94cf497d7090359a5c9f81caf60699/raw/d9281f3298b46d9cf991b674bc6e1c1ed14e91cc/micromodal.css

### app.js

resources/js/app.jsでこれまでに作成したファイルをインポートし、使えるようにします。

```js:app.js
import './micromodal';
import '../css/micromodal.css';
```

# components

コンポーネントを作っていきます。

resources/Components/MicroModal.vueを作ります。

```vue:MicroModal.vue
<script setup>
import { ref } from 'vue'

// boolean型の変数 初期値がfalse
// クリックしたらtrueに変わる
const isShow = ref(false)
const toggleStatus = () => { isShow.value = !isShow.value}
</script>

<template>
<div v-show="isShow" class="modal" id="modal-1" aria-hidden="true">
        <div class="modal__overlay" tabindex="-1" data-micromodal-close>
            <div class="modal__container" role="dialog" aria-modal="true" aria-labelledby="modal-1-title">
            <header class="modal__header">
                <h2 class="modal__title" id="modal-1-title">
                Micromodal
                </h2>
                <button @click="toggleStatus" type="button" class="modal__close" aria-label="Close modal" data-micromodal-close></button>
            </header>
            <main class="modal__content" id="modal-1-content">
                <p>
                Try hitting the <code>tab</code> key and notice how the focus stays within the modal itself. Also, <code>esc</code> to close modal.
                </p>
            </main>
            <footer class="modal__footer">
                <button @click="toggleStatus" type="button" class="modal__btn modal__btn-primary">Continue</button>
                <button @click="toggleStatus" type="button" class="modal__btn" data-micromodal-close aria-label="Close this dialog window">Close</button>
            </footer>
            </div>
        </div>
    </div>

    <button @click="toggleStatus" type="button" data-micromodal-trigger="modal-1" href='javascript:;'>Open Modal Dialog</button>
</template>
```

# 使いたいファイルに記述

使いたいファイルでコンポーネントを呼び出せば使えるようになります。

```js:Index.vue
import MicroModal from '@/Components/MicroModal.vue'

<MicroModal />
```
Djangoプロジェクト(DRF)を作るとき最初にやること

Djangoプロジェクトを作るたびに初期設定が面倒だなぁと思いながらやるため忘れても良いようにメモっておきます。

## 仮想環境の作成

```
pyenv virtualenv 3.9.16 env_name
pyenv local env_name
```

## 必要なもののinstall
```
pip install djangorestframework
pip install django-environ
pip install psycopg2
```

## プロジェクトの作成

```
django-admin startproject project_name .
```

※project_nameにはハイフン（-）は使えない。


## アプリの作成

```
python manage.py startapp app_name
```


## DB設定の変更 (settings.py)

```
# 追加
import environ
import os

# 追加
env = environ.Env()
env.read_env(".env")

以下略

# 編集
DATABASES = {
    "default": {
        "ENGINE": "django.db.backends.postgresql_psycopg2",
        "NAME": env("DB_NAME"),
        "USER": env("DB_USERNAME"),
        "PASSWORD": env("DB_PASS"),
        "HOST": env("DB_HOST"),
        "PORT": "",
        "TEST": {
            "NAME": 'test_hogehoge',
        }
    }
}
```


## INSTALLED_APPSの追加

```
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app_name',
]

```

## モデル定義

よしなに。

## DB設定（postgre）

```
psql postgres
CREATE DATABASE db_name;
CREATE ROLE db_user_name WITH LOGIN PASSWORD 'hogehoge';
```

## .env設定

```
export DB_HOST=localhost
export DB_PASS='hogehoge'
export DB_USERNAME=db_user_name
export DB_NAME=db_name
```

## makemigrasions実行

```
python manage.py makemigrations
```

makemigrationsが通れば最低限の設定ができたといえる（と思う）
Arduino Portenta H7でBreakoutを使わずにUARTを増やす

# 概要(動機)
LTEモジュールとの通信と、FCとの通信を同時に行いたい。UARTが2本必要。

だが、Portenta単体ではUARTは1本しか出ていない。(ように見えた)
SoftwareSerialも使えない。(使えたとしても使いたくない)

増やすにはBreakoutボードを追加購入する必要がある。(と思った)

Breakoutはそこそこお高い。それに **デカい** 。
こんなん積みたくない。なんとかならないか。

ワンチップマイコンには、大抵IOピンを入れ替える機能があるはず。
これでなんとかならないか。

最悪レジスタいじってでもなんとかしてやりたい。
GPIO registers(Reference manual、RM0433、11.4 GPIO registers)を見る限り、行けるんじゃね？

# 結論
**レジスタ云々全く必要なかった。**
「このピンをこの機能で使いたい」という目線でクラスライブラリが用意されている。それが実際にUART6かどうかはユーザーは気にする必要はない。
**ライブラリの設計者天才。感心した。**

結果、以下のコードでPC6(D5)をTX、PC7(D4)をRXとする、HardwareSerialが使用できる。(UART6の形跡がないが、実際にはUART6のリソースが使用される)

```
arduino::UART AdditionalUartWithoutBreakout(PC_6, PC_7, NC, NC);
```

# 雑感
辿り着くのに苦労させられた...経験重ねてるのがあだになり、余計なこと考えすぎたのかも知れません。
もちろん、PC6とPC7が、I/OマルチプレクサによってUART6のTX/RXに割り当て可能であるということを読み解く力は必要なわけですが。
**全部が全部好きなピンに割り当てられるわけではない。**
探し方によってはあっさり見つかったのかもしれませんが。
未だに見つけられていませんが。

一助になれば幸いです。

# コードおよび結果
送信だけだが、921600bpsで特に問題は見当たらない。

```PC67_as_UART6.ino

arduino::UART AdditionalUartWithoutBreakout(PC_6, PC_7, NC, NC);

void setup() {
  // put your setup code here, to run once:
  AdditionalUartWithoutBreakout.begin(921600);
}

void loop() {
  // put your main code here, to run repeatedly:
  AdditionalUartWithoutBreakout.println("Hello new HardwareSerial!");

  delay(1000);
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1082015/ab5de01b-a21b-5e6f-67c0-f6a2cf559832.png)
【Swift】Realmのオブジェクトを途中で変更する

# はじめに
Realmでオブジェクを設定して、途中で変更をするとクラッシュしてしまいます。
これに対応するには「マイグレーション」と言うものが必要らしいです。

Realmでのマイグレーションの方法を学んだので記録しておきます。

# 元のオブジェクト
```swift
import Foundation
import RealmSwift
 
class SampleObject: Object {
    @Persisted(primaryKey: true) public var id: Int = 0
}
```

# 新しいオブジェクト
```swift
import Foundation
import RealmSwift
 
class SampleObject: Object {
    @Persisted(primaryKey: true) public var primaryKey: Int = 0
}
```

# 実装
```diff_swift
import Foundation
import RealmSwift

class SampleRealmRepository {
    func get() throws -> Results<SampleObject> {
+       Realm.Configuration.defaultConfiguration = config
        return try! Realm().objects(SampleObject.self)
    }
    
    func add(object: SampleObject) throws {
+       Realm.Configuration.defaultConfiguration = config
        let realm = try Realm()
        try realm.write {
            realm.add(object)
        }
    }
    
    func delete(object: SampleObject) throws -> Results<SampleObject> {
+       Realm.Configuration.defaultConfiguration = config
        let realm = try Realm()
        if let history = realm.object(ofType: SampleObject.self, forPrimaryKey: object.primaryKey) {
            try realm.write {
                realm.delete(object)
            }
        }
        return realm.objects(SampleObject.self)
    }
    
    func deleteAll() throws -> Results<SampleObject> {
+       Realm.Configuration.defaultConfiguration = config
        let realm = try Realm()
        try realm.write {
            realm.deleteAll()
        }
        return realm.objects(SampleObject.self)
    }
    
+   private var config: Realm.Configuration {
+       Realm.Configuration(schemaVersion: 2) { migration, oldSchemaVersion in
+           if oldSchemaVersion < 2 {
+               migration.enumerateObjects(ofType: SampleObject.className()) { oldObject, newObject in
+                   guard let oldObject, let newObject else { return }
+                   newObject["primaryKey"] = oldObject["id"]
+               }
+           }
+       }
+   }
}
```

# おわり
オブジェクトを変更してもクラッシュしませんでした！！
curlでのhttps通信の疎通確認でプチハマった

# TL;DR
curlコマンドの標準出力のエラー事由はあてにしないほうがいい。

# 起きた事象
外部システムとのhttpsでのシステム連携前に疎通確認を実施したところ、以下のエラーでtlsハンドシェイクがエラー(ssl alert)で通信が行えなかった。


```
> curl --tlsv1.2 --cert xxx.pem --key xxxx.key https://example.com -x http://〇〇.〇〇.〇〇:8080 -X POST  -H "Content-Type: text/plain; charset=shift-jis"  -vv

~~~~中略~~~~
* error:14094410:SSL routines:ssl3_read_bytes:sslv3 alert handshake failure
* Closing connection 0
curl: (35) error:14094410:SSL routines:ssl3_read_bytes:sslv3 alert handshake failure
>
```

sslv3 ？ tls1.2のはずだが・・・

# 調査

１、curlのバージョン

```
curl --version
curl 7.61.1 (x86_64-redhat-linux-gnu) libcurl/7.61.1 OpenSSL/1.1.1k zlib/1.2.11 brotli/1.0.6 libidn2/2.2.0 libpsl/0.20.2 (+libidn2/2.2.0) libssh/0.9.6/openssl/zlib nghttp2/1.33.0
Release-Date: 2018-09-05
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp scp sftp smb smbs smtp smtps telnet tftp
Features: AsynchDNS IDN IPv6 Largefile GSS-API Kerberos SPNEGO NTLM NTLM_WB SSL libz brotli TLS-SRP HTTP2 UnixSockets HTTPS-proxy PSL
```
→1.1.1kでTLS1.3まで対応してる。

２、実際の通信
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124955/02395d3b-a213-18c6-3533-9445a72e40ff.png)
→tls1.2で通信していた、curlのオプションが効いていると思われる。

３、実際の通信
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124955/8c990af8-b68d-0ee5-e34d-a1ff486732de.png)
→Alert Messageは'handshake_failure(40)'

>   handshake_failure
      Reception of a handshake_failure alert message indicates that the
      sender was unable to negotiate an acceptable set of security
      parameters given the options available.  This is a fatal error.

クライアント側の暗号スイーツや証明書がおかしいじゃい！って言ってブチっと落とされている。なぜsslv3って言ってくるのだろう。。。

# 結論
クライアント認証のpem内部に中間証明書が入ってないだけだった。
（正常に取引できていた時のdumpを偶然に発見し比較して気づきました。）

NGパターン
```
>cat xxx.pem
-----BEGIN CERTIFICATE-----
XXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXX
-----END CERTIFICATE-----
```

OKパターン
```
>cat xxx.pem
-----BEGIN CERTIFICATE-----
XXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXX
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇
〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇
-----END CERTIFICATE-----

```

# 参考
https://work-in-progress.hatenablog.com/entry/2017/12/03/113552
Sftpサーバーとは？

１、Sftpサーバーとは？
インターネット上で安全にファイルを送受信する仕組み
sshの仕組みで暗証番号を使用することで、安全にファイル間で送受信することが可能になる。

２、FTPSサーバーとの違いは？
SFTP：FTP+SSh(SSHで暗号化される)
FTPS：FTP+SSL（TLS）(SSLで暗号化される)

※FTP：ファイルを送受信する際のプロトコル
※SSL：インターネット上でやり取りする情報を暗号化して送受信するための仕組み

※SSH：遠隔でコンピュータの操作を行う際に通信データを暗号化するもの遠隔でコンピュータの操作を行う際に通信データを暗号化するもの

※SSHとSSLの違いはこちらで説明済み
https://www.winserver.ne.jp/column/ssh/#SSHSSL


参考
https://wa3.i-3-i.info/diff451ftp.html
https://wa3.i-3-i.info/word116.html
https://wa3.i-3-i.info/word1137.html
https://www.winserver.ne.jp/column/ssh/#SSHSSL
Yumとは何か？

１、Yumとは何か？

パッケージ管理ツール

２、パッケージとは？
* コンパイル済みのバイナリ・依存関係のあるファイルを提供
* インストールしたらすぐ使える

３、バイナリとは？
コンピュータが扱うデータのこと

４、Rpmとの比較（これらは全てRPMにはない）
・パッケージの依存関係を自動解決
　・依存するパッケージも一緒にダウンロードする（rpmにはない機能）
・自動的に更新機能あり
・リポジトリとの連携もあり



参照
https://qiita.com/ritukiii/items/cc22efd005a06b8d4a86
https://uxmilk.jp/9715
【Tips】「@IBAction」と「@IBOutlet」の一般的な命名規則

```swift
@IBAction func Back
@IBAction func Go

@IBOutlet weak var backButton
@IBOutlet weak var goButton
```

↓

このように
「`@IBAction`」は「動詞」で
「`@IBOutlet`」は「名詞」で
統一化するのが一般的
Citrix XenServerの仮想マシンをバックアップする

### 背景

Citrix XenServerを使ってデータベースサーバを複数立てて運用しています。
ただ、ホストマシンだったり、仮想マシンは、いつお亡くなりなるかわからないので必ずバックアップが必要です。
備忘録も兼ねてバックアップするためのスクリプト記録しておきます。

### XenServerの環境
* XenServer: 7.6.0

実際にバックアップ処理をするスクリプトが以下です。
#### バックアップの流れ
1. バックアップ先のディレクトリをマウントします。
    1. この例では、自前のNASの共有ディレクトリにバックアップしています。
1. 指定された仮想マシンのスナップショットを作成します。
    1. 「仮想マシン名_SNAPSHOT」という名前のスナップショットを作成します。
1. 作成したスナップショット(uuidで識別)をバックアップ先のパスに(xva形式?)エクスポートします。
1. エクスポートが終了したら、スナップショットを削除します。
1. バックアップ先のマウントを解除します。

```shell:vm-export
#!/bin/bash
## VM Name
echo $1
VMNAME=$1
DestDir=`date '+%Y%m%d'`

## Mount Backup Server
mount -t nfs 192.168.3.150:/volume1/xenserver_vm /mnt
cd /mnt
if [ -e $DestDir ]; then
    echo "$DestDir found."
else
    mkdir $DestDir
fi
cd ..

## Snapshot created.
uuid=`xe vm-snapshot vm=$VMNAME new-name-label="$VMNAME"_SNAPSHOT`
## Export snapshot.
xe template-param-set is-a-template=false uuid=$uuid
xe vm-export uuid=$uuid filename=/mnt/"$DestDir"/"$VMNAME".xva
##delete Snapshot
xe vm-uninstall uuid="$uuid" force=true
## Unmount Backup Server
umount /mnt
```

### まとめてバックアップ

指定した仮想マシンをバックアップします。
vm-exportに仮想マシン名を渡すだけです。

1. バックアップしたいVMの名前をvm-exportの1番目の引数に指定して呼び出します。
1. ```vm-export-all```は、vm01, vm02, vm03という仮想マシンを順番にバックアップします。

```shell:vm-export-all
#!/bin/bash
./vm-export vm01
./vm-export vm02
./vm-export vm03
```

### バックアップの実行

バックアップの実行は、毎日0時に```cron```で自動的にするようにしています。
```/etc/cron.d``` に以下のファイルを置いています。

```shell: vm-backup.cron
#!/bin/bash
#vm-export-all
0 0 * * * root /root/vm-export-all
```

### 失敗談

バックアップ先のNASがダウンしていることがあり、バックアップ先をマウントできずにローカルディスクの ```/mnt``` にバックアップファイルが作成されてしまい、Disk fullでXenServerが起動しなくなったことがありました。
（もちろん原因の特定に時間がかかって仕事は止まりました）
気を付けてください。大量の汗がでます。

### お礼

このスクリプトのベースになったのは、どこかの記事だったのですがもうすれてしまいました。
スクリプトしか残ってません。
でも、おかげで仮想マシン破壊の恐怖から逃れることができています。
ありがとうございます。
ubuntu環境構築後、terminalが起動できない時のおまじない

最近Ubuntu環境を構築する機会がありました。
インストールが終わった後、terminal起動できない現象がでました。

原因がわからないのでおまじないとしていますが、terminalが起動できたのでメモしておこうと思います。

環境：Ubuntu22.04

１・設定 > 言語 設定をみると英語になっていたので、日本語に変更して再ログイン。
２・再ログイン後にhomeフォルダ配下のパスを英語のままにするか、日本語のままにするか選択をせまられるので英語のままにする。

これでterminalが起動できるようになりました。
JNCIA-DCについて、初心者向けにざっくりと

# JNCIA-DC
JNCIA-DC (Juniper Networks Certified Associate - Data Center)は、ジュニパーネットワークスのデータセンターテクノロジに関する基本的な知識を持つことを証明するための認定資格です。
本試験のコードはJN0-280です。

## Juniperのデータセンターに関する資格一覧
**JNCIA-DC：データセンターアソシエイト** 　←今回はこれについて
JNCIS-DC：データセンタースペシャリスト
JNCIP-DC：データセンタープロフェッショナル
JNCIE-DC：データセンターエキスパート

## さ～
JNCIA-DCについて簡単にご紹介していきます。

## 試験範囲
JNCIA-DC試験は、データセンターの基本的な概念、ネットワーキングテクノロジ、ジュニパーネットワークスのデータセンター製品に関する知識をテストすることを目的としています。初心者向けに説明すると、以下のようなトピックを含んでいます。

1. **データセンターの基本概念**: データセンターの目的、コンポーネント、ネットワークトポロジ、冗長性の概念など、データセンターの基本的な概念についての理解が求められます。

2. **スイッチングテクノロジ**: VLAN、スパニングツリープロトコル、リンクアグリゲーション、Virtual Chassisなど、データセンターネットワーキングにおけるスイッチングテクノロジに関する知識が必要です。

3. **ルーティングテクノロジ**: ルーティングプロトコル（OSPF、BGPなど）、仮想ルーティングインスタンス（VRF）、ルーティングポリシーなど、データセンターネットワーキングにおけるルーティングテクノロジに関する理解が求められます。

4. **セキュリティ**: ファイアウォール、アクセス制御リスト（ACL）、仮想プライベートネットワーク（VPN）など、データセンターのセキュリティに関する基本的な知識が必要です。

5. **ストレージ**: ストレージテクノロジ（iSCSI、Fibre Channelなど）、ストレージアーキテクチャ、データ保護、ストレージトポロジに関する理解が求められます。

6. **仮想化**: 仮想マシン、ハイパーバイザ、仮想ネットワーキング、仮想スイッチングなど、データセンターにおける仮想化技術に関する基本的な知識が求められます。

「[試験範囲の詳しくは公式サイトへ](https://www.juniper.net/jp/ja/training/certification/tracks/data-center/jncia-dc.html)」

JNCIA-DC試験は、上記のトピックに関する基本的な理解と応用能力を持っていることを評価します。初心者向けの試験であるため、実務経験がない方でも基礎的な知識を身につけることができます。

## 資格試験合格に向けて
JNCIA-DC試験の合格には、以下のステップを踏むことが一般的です。

1. **学習リソースの準備**: ジュニパーネットワークスの公式ウェブサイトや書籍、オンラインのトレーニングコースなど、学習に役立つリソースを探しましょう。公式の試験ガイドやシラバスを確認することがおすすめ
「[Juniper公式サイトで本がたくさん「無料でdownload可能」](https://www.juniper.net/documentation/jnbooks/us/en/day-one-books)」


2. **基礎知識の習得**: ネットワーキングの基礎概念、データセンターテクノロジ、ジュニパーネットワークスの製品について学習します。トピックごとに理解を深め、関連する用語や技術に慣れるようにしましょう。

3. **ハンズオンの実践**: 仮想環境やシミュレータを使用して、実際にネットワーク構成や設定を行うハンズオンラボを実施しましょう。これにより、理論だけでなく実践的なスキルも身につけることができます。

4. **試験の申し込みと受験**: 準備が整ったら、ジュニパーネットワークスの公式ウェブサイトから試験の申し込みを行います。試験センターでの試験受験やオンラインでのリモート試験が選択できます。

5. **試験の合格**: 試験当日はリラックスして臨みましょう。問題に慎重に取り組み、自信を持って解答しましょう。

### 受験料 (2023/01/22)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492082/c07333c1-b832-bedf-9975-b0b11acd7f32.png)
AWS Certificate ManagerでDNS 検証 が失敗したときに解決方法

# 作成経緯
cloudfornt用の証明書を発行したがDNS検証がいつまで立っても終わらなかった。
過ちを繰り返さないようにメモ。

# 参考サイト/参考記事
http://blog.livedoor.jp/harukisan7/archives/24272658.html
https://docs.aws.amazon.com/ja_jp/Route53/latest/DeveloperGuide/domain-name-servers-glue-records.html#domain-name-servers-glue-records-procedure
https://docs.aws.amazon.com/ja_jp/Route53/latest/DeveloperGuide/GetInfoAboutHostedZone.html

# 原因
route53で登録されているドメインのNSとホストゾーンのNSが一致していなかったのが原因でした。
`dig hoge.com. +trace`を実行してみて確認してみると
```bash
hoge.com.    172800  IN      NS      ns-53.awsdns-06.com.
hoge.com.    172800  IN      NS      ns-909.awsdns-49.net.
hoge.com.    172800  IN      NS      ns-1095.awsdns-08.org.
hoge.com.    172800  IN      NS      ns-2012.awsdns-59.co.uk.
```
の状態でした。
これはroute53に登録されているドメインのNSですが、ホストゾーンのNSのレコードとは異なっていました。
なのでドメインの方のNSをホストゾーンのNSに合わせて上げます。
変更後は以下の様になりました。
```bash
hoge.com.    172800  IN      NS      ns-707.awsdns-24.net.
hoge.com.    172800  IN      NS      ns-220.awsdns-27.com.
hoge.com.    172800  IN      NS      ns-1183.awsdns-19.org.
hoge.com.    172800  IN      NS      ns-1555.awsdns-02.co.uk.
```
しばらく(自分の場合は2~3時間ほど)まつと
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185852/c7ab7a29-da85-c1f7-e35a-a32d2d5a757c.png)
発行済になった！
ずっとホストゾーンの方にドメインのNSを記載するように編集していたのでうんうん悩んでいました。
ネットワークは本当に知識が弱いですね……。
CSSで追従ヘッダーをfixedやstickyで作っているときにページ内リンクがずれる問題の解決

検索すると`margin-top:-100px;padding-top:100px` やJavaScript, jQueryで解決するような記事が沢山出てくる。

でも一番シンプルな解決方法は `scroll-padding-top` を使うことのようだ。

```css
scroll-padding-top: 100px;
```

https://www.aizulab.com/blog/sticky-header-overlap/

最初`margin-top`と`padding-top`で作っていて、いやこれ各要素で干渉しないように設定していくの面倒すぎる、何か別の方法あるだろうと思って別の記事を探したら見つかった。


プログラミング系は割とまともな検索結果が出るんだけど、こういうCSSのTIPS的な記事は一番良いのが上位に出てこないよねえ…。

上記の記事は、記事内にfixedやstickyというテキストが無いことの影響か。


こういうときこそChatGPT？

> CSSのfixedやstickyでヘッダーを固定表示すると、ページ内リンクのスクロールがズレてしまう。解決方法は？

> ページ内リンクのスクロールがズレてしまう問題は、固定ヘッダーがページ内リンクのターゲット要素を覆ってしまうことが原因です。この問題を解決するためには、ターゲット要素までのスクロール位置を調整する必要があります。以下にいくつかの解決方法を挙げます。
> 1. CSSで:target疑似クラスと::before疑似要素を利用する方法:
この方法では、ターゲット要素に対して疑似要素を追加し、その高さとマージンを調整してスクロール位置を補正します。
> 
> ```css
> :target::before {
>   content: "";
>   display: block;
>   height: ヘッダーの高さ;
>   margin-top: -ヘッダーの高さ;
> }
> ```
>
> ヘッダーの高さには、実際のヘッダーの高さを指定してください。
> 
> 2. JavaScriptでスクロール位置を調整する方法:
この方法では、ページ内リンクがクリックされたときに発生するイベントを監視し、スクロール位置を調整します。
>
> ```javascript
> document.querySelectorAll('a[href^="#"]').forEach(anchor => {
>   anchor.addEventListener('click', function (event) {
>     event.preventDefault();
> 
>     const target = document.querySelector(this.getAttribute('href'));
>     const headerHeight = document.querySelector('ヘッダーのセレクタ').offsetHeight;
> 
>     window.scrollTo({
>       top: target.offsetTop - headerHeight,
>       left: 0,
>       behavior: 'smooth'
>     });
>   });
> });
> ```
>
> ヘッダーのセレクタには、実際のヘッダー要素に対応するCSSセレクタを指定してください。
>
> どちらの方法を選んでも、ページ内リンクのスクロール位置が固定ヘッダーによって覆われないように調整できます。必要に応じて、いずれかの方法を適用してみてください。


> scroll-padding-top を使う方がより良い解決方法なのでは？


> おっしゃる通り、scroll-padding-top を使う方法は、ページ内リンクのスクロール位置が固定ヘッダーによって覆われる問題を解決するためのシンプルで効果的な方法です。このプロパティは、スクロールコンテナ（通常は<html>または<body>要素）に適用され、スクロール位置を調整する際に上部のパディングを考慮します。
>
> 以下のようにスタイルシートに追加して、ページ全体に適用できます。
>
> ```css
> html {
>   scroll-padding-top: ヘッダーの高さ;
> }
> ```
>
> ヘッダーの高さには、実際のヘッダーの高さを指定してください。これにより、ページ内リンクのターゲット要素が固定ヘッダーの下に表示されるように調整されます。
>
> scroll-padding-top の利点は、CSS のみで実現できることと、スムーズスクロールなどのブラウザのデフォルトのスクロール動作に影響を与えずに調整できることです。ただし、一部の古いブラウザではサポートされていないことに注意してください。最新のブラウザでは、このプロパティを利用することで簡単に問題を解決できます。

聞けば答えてくれるが、ChatGPT-4でもまだちょっと足りないようだ。

というか、Webで検索したときに優勢な答えがそのままAIの妥当な答えとして学習されていて、それが返ってくるのかな？
それだとこういった用途には使えないな…。
【.md】この書き方知ってる？ちょっとマニアックなマークダウンの書き方 4選

なんか数年前から下書きでマークダウンのマニアックな書き方を集めていたけど、供養したいので投稿させていただきます。。。

# 【.md】この書き方知ってる？ちょっとマニアックなマークダウンの書き方 10選


## 1 列の中にコードスニペット

```
1. 事前設定
    - DBを元に戻す
        ```
        update ratio_tax set end_date='2019-09-30 23:59:59' where id=1;
        update ratio_tax set start_date='2019-10-01 00:00:00' where id=2;
        ```
```

## 2. 表で改行

`<br>` いれる

## 3. 表の書き方最小

|x|
|:-:|

```md
|x|
|:-:|
```

x
:-:

```
x
:-:
```


## 4. h1って#使わなくてもかける

```md
Alt-H1
======
```

## サンプル貼り付け

Emphasis, aka italics, with *asterisks* or _underscores_.

Strong emphasis, aka bold, with **asterisks** or __underscores__.

Combined emphasis with **asterisks and _underscores_**.

Strikethrough uses two tildes. ~~Scratch this.~~

## 参考

[Qiitaのテーブルの書き方についてまとめた - Qiita](https://qiita.com/zakuroishikuro/items/f33929eab9d55c5bd073)

[Markdown Cheatsheet · adam-p/markdown-here Wiki · GitHub](https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet#tables)


参考になる。
Atx形式
Setext形式

https://github.com/sugarnaoming/markdown_manual
【Django】migrationsファイルが更新されていない場合に出るエラー「Your models have changes that are not yet reflected in a migration...」

# 概要
* 本記事では、djangoアプリにて、`migrations`ファイルが更新されていない場合に出るエラーについて解説します。

# エラー内容
* 以下でマイグレーションを実行。

```terminal
$ python manage.py migrate
```

* すると以下のエラーが表示されました。

```terminal
  Your models have changes that are not yet reflected in a migration, and so won't be applied.
  Run 'manage.py makemigrations' to make new migrations, and then re-run 'manage.py migrate' to apply them.
```

* このエラーは、`migrations`ファイルが更新されていないため、現在の状態に合わせてデータベースを更新することができないことを示しているようです。

### マイグレーションファイルの詳細：
* Djangoがデータベーススキーマの変更を記録するためのファイル。
    * 変更=フィールドの追加やモデルの削除など
* ファイルは、「アプリ名/migrations/」以下に保存されます。
* ファイル名は、「マイグレーション番号_マイグレーション名.py」という形式（番号が実行順序）になります。

# 解決方法
* 以下のコマンドを実行し、モデルの変更をマイグレーションファイルに記録します。


```terminal
$ python manage.py makemigrations
```

* その後、再度以下コマンドを実行することで、新しいマイグレーションファイルをデータベースに適用できます。

```terminal
$ python manage.py migrate
```

* これで、モデルの変更がデータベースに反映され、エラーが解決しました。

### `migrate`コマンドの詳細：
* Djangoのモデル定義をデータベースに反映させるためのコマンド。
* 上記コマンドにより、Djangoは現在のアプリケーションの状態と、実際のデータベースの状態を比較し、スキーマの違いを検出します。その後、必要なマイグレーションファイルを実行し、データベースのスキーマを最新の状態に更新します。

### 参考
* [マイグレーション — Django 4.0.6 ドキュメント](https://man.plustar.jp/django/topics/migrations.html)
DAOは何に使えるのか？

<h2>はじめに

今のところDAOは、投資、チャリティ、資金調達、借り入れ、NFTの購入など、さまざまな目的で利用されており、すべて、そうした仲介者を介さずに行われています。

<h2>1. プロポーザルの実施

DAOの主要な使用例の中で、まず第一に挙げられるのは、メンバーが組織の「株式」を保有することができる機能である。メンバーは、自分の議決権を表すものとして株式を利用し、その対価として必要な報酬を受け取ることができます。
最も有名なDAOの例であるCurve DAOは、トークン保有者に報酬を提供するためにAutomated Market Makerモデルを活用しています。

<h2>2. 分散型プロジェクトのための資金調達

最高のDAOの使用例の中でもう一つ注目すべきは、明らかに投資目的または助成金のための資金調達に脚光を浴びていることである。

この資金は、分散型アプリケーションや全く新しいタイプの暗号関連プロジェクトのスポンサーになるために使用することができます。MetaCartel Venturesは、dAppsに投資するための資金を調達するDAOのユースケースの一例です。

<h2>3. クラウドファンディング

DAOは、クラウドファンディングの取り組みをサポートすることで、ブロックチェーンと暗号の世界の外でも価値を提供することができます。

DAOは何に使えるのか」を知りたければ、DAOが特定の目標を支援するための資金をクラウドソーシングする際にどのように役立つのかにも注目する必要があります。

憲法DAOの例は、分散型自律組織が特定のプロジェクトのための資金集めにどのように役立つかをまざまざと証明している。

<h2>4. 分散型アプリケーションガバナンス

DAOの用途は何か」に対する最大の答えの1つは、dAppガバナンスの可能性を指し示しています。DeFiエコシステムが急ピッチで成長するにつれ、開発者は分散化の側面をネットワークレベル以上に拡張したいと考えています。

DAOは、アプリ開発者がユーザーに開発者ではなく、プラットフォームを信頼させるのに役立ちます。dAppsを持つDAOは、トークン保有者に投票権を認めるのと同時に、分散型アプリケーションに変更を提案するユーザーをサポートすることができます。

<h2>5. NFTベースの投資

トップDAOのユースケースには、NFT市場の成長とともに勢いを増し始めたNFTベースの投資への注目も含まれています。
多くのNFT保有者は、グループの資産の1つの端数を表すものとして、NFTを議決権行使やトークンの獲得に賭けることができます。

NFTベースの投資のためのDAOの例の1つは、メンバーが優良なNFTの集団所有権を持つHeadDAOです。

<h2>6. メタバース・デセントラリゼーション

DAOは何に使えるのか」という議論では、メタバースにおける分散化をどのようにサポートできるのかにも焦点が当てられるだろう。

多くのメタバースプラットフォームでは、メンバーがゲームやエコシステム全体の変更について投票できるようにすることで、分散化を促進するためにDAOを使用しています。

例えば、Decentraland DAOは、3D世界のメンバーがプラットフォームとそのエコシステムのさまざまな変更について投票するのを支援します。


▼「分散型自律組織（DAO）とは? 特徴と運用法と事例を紹介」についてもっと知りたい方はこちらの記事もご参照ください。

https://miichisoft.com/what-is-a-dao/

Website: https://miichisoft.com/
カメラを貫通しているメッシュを描画する

自分へのメモも兼ねて、カメラ周りについてのハマった内容とその対処法を記録しておきます。


# 調査環境

**UnrealEngine 5.1.1**

# 発生した問題

あるアクターの中をカメラが横切る場合に、カメラではNearクリップより前はレンダリングされず、ぶつ切りされます。
下の画像だと、カメラに当たってNearクリップが突き抜けている箇所はレンダリングされません。この挙動はゲームエンジンとしては正しい挙動です。

![カメラに当たっている範囲は描画されない.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153021/9cfa3b8a-bda0-686a-4931-be41e0ce4106.png)

しかし、<font color="red">**Mayaや3DSMaxなどのDCCツールでは、正確にレンダリングされる**</font>為、ゲームエンジンでは描画されないこの領域もレンダリングされ、レンダリング結果が一致しないという事が発生します。

ゲームであれば、カメラが特定のアクター(オブジェクト)をすり抜けたり、オブジェクトに埋まるっという事は、演出として採用していなければ、不具合だと思われる為、まず起こりえない状況になるかと考えられます。
しかし、映像系のコンテンツになると、話は変わり、カメラがオブジェクトをすり抜けるというカメラワークが作成されることもあります。

:::note warn
例えば、以下のようなケースがが考えられます。

 * キャラクターを追いかけている最中に障害物があり、追いかける疾走感を損なわないように、カメラがそのままのスピードで障害物の中を突っ込むカメラワーク
 * 建造物の大きさを表現するかのように、カメラゆっくりと建物の中を映していき、壁をすり抜けて、最後に俯瞰で空から全体像を映すカメラワーク
:::

# 回避方法

UnrealEngineでこれを回避するには、『SetNearClipPlane』という設定を変更します。
コンソールコマンドの場合は、アウトプットログか『ExecuteConsoleCommand』から、以下のコマンドを実行してください。

```
r.SetNearClipPlane 1
```

すると、以下の画像のようにNearクリップによって、レンダリングされない領域がレンダリングされるようになります。

![カメラに当たっている範囲は描画される.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153021/a44baf26-1167-4a60-9941-787943b61858.png)


# SetNearClipPlaneは何をやっているのか

SetNearClipPlaneで何をやっているのかと言うと、ニアクリッピングプレーンを設定し直すという事をしています。単位は、cmになります。

実装は、下記だと思われます。
UnrealEngine-5.1\Engine\Source\Runtime\Engine\Private\UnrealEngine.cpp

:::note info
注意点として、<font color="red">**起動時にリセットされる**</font>為、レンダリング前にコンソールコマンドを投げるのが良いかと思います。
:::

また、DefaultEngine.iniに、書いてみたところ、コマンドの置き替えに失敗し、エディタがクラッシュしました。
その為、コンソールコマンドから設定した方が安全そうです。

![Configに書いたらクラッシュした.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153021/fce59ea3-7baf-6e93-9682-c5ecfe32a608.png)


:::note warn
最後にもう一つ、注意点として、カメラのNearクリップの位置を変更しているだけなので、カメラが壁に
の中に埋まって横切る場合などは、<font color="red">**中を作っておかなければ、ポリゴンが無い空間**</font>が表示されてしまいます。
:::
期限切れでPersonal Access Tokenを作り直したらgit pushできなくなった

# 問題
git pushしようとしたら以下のようなエラーが出た。
どうやらPersonal Access Tokenが期限切れになっているようだ。

```
remote: Invalid username or password.
fatal: Authentication failed for 'https://github.com/xxx/yyy.git/'
```
そのため**Personal Access Tokenを削除→新規作成した。**

その後、またgit pushしようとしたが、そもそもpush時にusernameとtokenを聞かれないためエラーが解消しない。

どこかにtokenの情報が保存されてしまっているようだ。

# 解決
だいぶ昔にghコマンドでログインしていたのを忘れていました……

```
gh auth login
```
こちらのコマンドで新しいtokenを使ってログインしなおし、git pushできるようになりました。

# 根本解決
Personal Access Tokenが期限切れになったときは、削除→新規作成ではなく、期限の延長をすればよかったようです。

[GitHubのPersonal Access Tokenが期限切れした場合の対処](https://zakino-engineer.hatenablog.com/entry/2022/10/22/234329)
本日の微分方程式（6日目）

なんとなく脳トレがてら1日1問解説しようと思っただけです．飽きたらやめます．
変数分離形もついに6問目ですね．あと1回やって同次形に行こうと思います（1週間で1セットくらいの感覚？）．

## 問題

微分方程式，

```math
\frac{\mathrm{d}y}{\mathrm{d}x} = f(ax+by+c),
```
は，$u = ax+by+c$ とおくことにより，変数分離形になることを示せ．

## ポイント
- 「証明せよ」と言われると「何から始めたらいいかわからない」状態になりますよね．今回の証明の発想は次のとおりです．
    1. "$u = ax+by+c$ とおくことにより" と問題文側の司令がありますから，一旦右辺が $f(u)$ になることはわかります．
    1. 上記より，与式は $\dfrac{\mathrm{d}y}{\mathrm{d}x} = f(u),$ と変形できますが，$u, y, x$ と文字が3つ並び，なんだか余計難しくなったように思えます． 
    2. ここで思考が止まっては勿体ないです．どうなるかはわかりませんが，一旦微分方程式を $u$ と $x$ だけの式にできないか？を考えます．
    3. 右辺はバッチリなので，左辺 $\dfrac{\mathrm{d}y}{\mathrm{d}x}$ を頑張って $\dfrac{\mathrm{d}u}{\mathrm{d}x}$ で置き換えることを考えます． $u = ax+by+c$ という関係がありましたから，$\dfrac{\mathrm{d}u}{\mathrm{d}x}$ を作るために「両辺を $x$ で微分してみようかな」と手が動けばベストです．
- [本日の微分方程式（3日目）](https://qiita.com/Schwarzschi1d/items/c9d1cdfed48f4bdbbbc3) でにおいて，$u=4x+y$ とおいたことの数学的な背景です．

## 解説

```math
u=ax+by+c,
```

の両辺を $x$ で微分すると，次のようになります．

```math
\dfrac{\mathrm{d}u}{\mathrm{d}x}=a+b\dfrac{\mathrm{d}y}{\mathrm{d}x}.
```

よって，これを $\dfrac{\mathrm{d}y}{\mathrm{d}x}$ について解くと，

```math
\dfrac{\mathrm{d}y}{\mathrm{d}x}=\dfrac{1}{b}\left(\dfrac{\mathrm{d}u}{\mathrm{d}x}-a\right)~~~(b\neq 0),
```

が得られます（ここで，$b\neq 0$ とします． $b=0$ のときについては後で検討します）． $u=ax+by+c$ 及び上式を，与式 $\dfrac{\mathrm{d}y}{\mathrm{d}x} = f(ax+by+c)$ に代入すると，次のように変形できます．

```math
\begin{align*}
\dfrac{1}{b}\left(\dfrac{\mathrm{d}u}{\mathrm{d}x}-a\right) &= f(u),\\
\dfrac{\mathrm{d}u}{\mathrm{d}x}-a &= bf(u),\\
\therefore\dfrac{\mathrm{d}u}{\mathrm{d}x} &= bf(u)+a.\\
\end{align*}
```

よって，これは変数分離形です（キリッ）．「本当にこれって変数分離形なの？」って思うのも無理ないです．わかりにくいよって方は，右辺を $\left(bf(u)+a\right)\times 1$ と見ましょう．$P(x)=1$，$Q(u)=bf(u)+a$ と解釈すれば，右辺は紛れもなく $P(x)\times Q(u)$ の変数分離形です．

さて，$b=0$ のときはどうでしょうか． $b=0$ のとき，与式は次のようになります．

```math
\frac{\mathrm{d}y}{\mathrm{d}x} =f(ax+c).
```

この場合，既に変数分離形が完成しています．つまり，$P(x)=f(ax+c)$，$Q(y)=1$ と解釈すれば，右辺は $P(x)\times Q(y)$ と表すことが出来ます．

以上より，微分方程式，

```math
\frac{\mathrm{d}y}{\mathrm{d}x} = f(ax+by+c),
```
は，$u = ax+by+c$ とおくことにより，変数分離形になることが示されました．

## 【参考】 直接積分形
一般に，次の微分方程式は，直接積分形とも呼ばれます．

```math
\frac{\mathrm{d}y}{\mathrm{d}x} =P(x),
```

変数分離をするまでもなく，両辺を $x$ で積分することで，

```math
\begin{align*}
\int\frac{\mathrm{d}y}{\mathrm{d}x}\mathrm{d}x &=\int P(x)\mathrm{d}x,\\
\int\mathrm{d}y &=\int P(x)\mathrm{d}x,\\
\therefore y +C&=\int P(x)\mathrm{d}x~~~(C:任意定数),
\end{align*}
```

と簡単に解くことが出来ます．
電気の正体は何か

## 結論
電気の正体は小さな粒の移動。移動の量が少なければ、便利なもの。

## 内容
「電流が流れる」「電圧がかかっている」「ワット数が高い」という言葉を日常のどこかで聞いたことがあると思います。これらは全て電気についての話です。電気は体に触れると危ないことはわかりますが、いまいちイメージがつかないことが多いのでは無いでしょうか。イメージがつかない理由として、目で見えることがほとんどないためだと思います。
電気とは「電子」と呼ばれる小さな粒が移動することになります。この粒は小麦粉の粒より小さく、2020年に世間を騒がせた新型コロナウィルスよりも小さいです。それほど小さい粒子のため、移動したかどうかは目に見えることがありません。そのため、見たことがないのです。
雷はどうでしょうか。雷は電気が原因で起こります。とても大きな音と強い光を発します。あの光は電子が大量に移動して、空気中の酸素や窒素とたくさんぶつかり、窒素や酸素が発火するため目にすることができています。実際は電気が光っているわけではありません。そのため、もし空気がない宇宙空間ですと雷は見えることができません。

## もし体に電気が流れたらどうなる？
電子という小さな粒は移動して、衝突することで、エネルギーを発生させています。先ほどの例でもあった雷がわかりやすい例です。目に見えないほど小さな粒ですが、大量に集まって移動することで、光や音を作るほど爆発的なエネルギーを発生させます。そのため、人に雷が流れる(雷に打たれる)と、発火することがあります。では、乾電池のプラスとマイナスを触った時はどうでしょうか。実はその時も電気は発生していて、小さな粒は体を流れています。しかし、流れる量が小さいと、全然害がないのです。乾電池のような小さな電気であれば無害ですが、電気が少し流れることで、光を発生させる物質が世の中にあって、その原理を利用して、今皆さんがみているiPhoneやパソコンのディスプレイは光っています。
[執筆] [研究] [画像] ブラウザ上で使える便利ツール

# はじめに

研究用でいろいろな便利ツールが必要になる場合，まずそのような機能が存在するのか，そのためにフリーソフトをDLしなければならないのか．と思うことが多々ありますよね（私はありました）．
ネットには依存しますが，PCのスペックには依存しなくなるので，作業性も上がると思います．

ここでは自分が見つけた便利なWebブラウザ上で動くツールをURLと一言コメントで紹介していきます．ただし，ここで使用した情報について機密情報に関するルールは調べておりませんので，各自で確認の上ご利用ください．

随時便利と思ったものは追加していく予定です．

# Tools

## 画像関係

### WebPlotDigitizer

- URL：https://automeris.io/WebPlotDigitizer/tutorial.html
- 用途：画像のグラフなどをデジタルデータ化したいときに用いる
- ざっくり使用法：画像をアップロードしてクリックしていけば，csvでデータを出力できます．
- 類似サイト：こちらも使えます（https://apps.automeris.io/wpd/）

### iLoveIMG

- URL：https://www.iloveimg.com/
- 用途：画像のリサイズ・拡張子変換・トリミング・回転など．WindowsのペイントでできることをWebでとかまとめてやりたいとき．
- ざっくり使用法：トップページから必要なモードを選択，画像をドラッグ＆ドロップ．
- 類似サイト：リサイズならはここも使ってた（https://bulkresizephotos.com/en）

### Crop PDF Online

- URL：https://www.sejda.com/crop-pdf
- 用途：PDFで作った画像の余白トリミング．特にLatexにPDF画像を埋め込むときに重宝．
- ざっくり使用法：ドラッグ＆ドロップすれば自動で周囲の余白が切り取られる．あとはDLするだけ．

## 文書関係（特にLatex)

### Ｏverleaf

- URL；https://www.overleaf.com/project
- 用途：文章をLatexで作りたいときに．テンプレートが大量にあるのが非常に便利．
- ざっくり使用法：要アカウント作成．あまりにも有名なので，他のサイトを参照ください．

### Online LaTeX diff tool

- URL：https://3142.nl/latex-diff/
- 用途：Latexで差分を表示したいとき．ローカルにLaTex環境がない場合特に有用．
- ざっくり使用法：old version と　New versionを入れてGenerate~~をクリック．

### Online LaTeX Equation Editor

- URL：https://latex.codecogs.com/eqneditor/editor.php
- 用途：画像で式を作成したいときに使用．
- ざっくり使用法：窓にLatex作法で記載．タブから出力形式を選択．ベクターがいい場合はpdfかsvgにしましょう．

### 大文字⇔小文字変換ツール

- URL：https://tech-lagoon.com/textchef/convert-text-case.html
- 用途：特に文献引用時に，ジャーナルに沿った英語フォーマット（大文字小文字，単語頭文字のみ大文字など）に変更するために使用．
- ざっくり使用法：文章をコピペ．右の窓から変換モードを設定．英文タイトル用，は接続詞や前置詞を小文字のままにしてくれてありがたい．※ただしすべて小文字にしてから出ないとうまくいかなかった．

### カウントツール＠お便利ツール.com

- URL：https://www.oh-benri-tools.com/tools/counter
- 用途：日本語及び英語の語数を調べるときに使用．ファイルアップロード機能は，PDFをアップしてみたが文字コードのバグか使えなかった．
- ざっくり使用法：日本語文章用か英語文章用を選んだ後，ウインドウにコピペ．


### Doc Word Counter

- URL：https://docwordcounter.com/en/word-counter
- 用途：英文ファイル，特にPDFの語数カウントをしたいときに．
- ざっくり使用法：ドラッグ＆ドロップ．上記のサイトではPDFが読み込めなかったので．


## カリキュレーター

### 計算系ツール＠お便利ツール.com

- URL：https://www.oh-benri-tools.com/tools/calculation
- 用途：長さ・重さ・面積の単位変換に．簡単なものだけ．
- ざっくり使用法：選びたいものを選択して，数字を入力，単位をドロップダウンから選択．

### Online Unit Converters

- URL：https://www.translatorscafe.com/unit-converter/en-US/#toc-Common
- 用途：あらゆる単位を変換．英語サイト．
- ざっくり使用法：ドロップダウンから種類選択．FromとToに変換元と先の単位を入れる．

### Mean Free Path Calculator

- URL：https://www.omnicalculator.com/physics/mean-free-path
- 用途：平均自由工程を計算できる．niche
- ざっくり使用法：分子・圧力・温度を入れれば出てくる．
確認画面戻るボタンを押下後、入力画面に入力した内容を保持した状態で遷移させたい

https://qiita.com/_P0cChi_/items/ebf8fbf035b36218a37e

上記サイトにて入力画面から入力確認画面に遷移したものを実装していますが、確認画面にて戻るボタンを実装し、入力した内容を保持した状態で入力画面に戻るにはどのように実装すればよろしいでしょうか?
アプリとアプリケーションの違い：違いは何か、そして重要か？



![6191768_2827484.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92345/5790570c-7ffc-85c8-8809-2194c89a661d.jpeg)


多くの人がそうであるように、私もこれまで、デバイスのフォームファクターによってアプリとアプリケーションを何気なく区別してきました。アプリとは、携帯電話やタブレットで使うもの。

アプリケーションは、ノートパソコンで使うものでした。しかし、そのような単純な考え方は、おそらくあまりにも狭く、もはや一般的ではありません。デスクトップやノートパソコンにもアプリはありますし、逆にスマホで動くアプリもあります。

では、実際には何が違うのでしょうか？ここでは、両者を区別しようとする人々がよく使う方法を紹介します。

<h2>機能

昨年開催されたGARTNER PORTALS, CONTENT AND COLLABORATION SUMMITでの円卓会議に関するTAHOE PARTNERSのブログ記事で、アプリとアプリケーションを区別する一つの方法が紹介されています。

David Sidwell氏の投稿によると、専門家のラウンドテーブルでのコンセンサスは、その違いは機能性を中心としたものであったという。

App = 単一目的のために設計され、単一の機能を実行するソフトウェア。
アプリケーション＝様々な機能を果たすように設計されたソフトウエア。

例えば、私の携帯電話にはヤフーのアプリが入っています。このアプリをタップすると、Safariブラウザが起動し、ヤフーのモバイル向けウェブサイトへ誘導されます。

ヤフーのウェブサイトでは、ヤフーのアプリケーションにアクセスし、インターネット検索や電子メールへのアクセスなど、さまざまな機能を利用することができます。

しかし、フォームファクターは重要な役割を果たすことがあります。トラックビアの超敏腕モバイルエンジニアが指摘してくれたように、今日の多くの「アプリ」は、モバイル機器に特有な、あるいは電話やタブレットで使うのがより自然な技術の主要部分を活用しています。

例えば、TRACKVIAのモバイルアプリは、モバイルデバイスの主要なコンポーネントを活用するために最適化されています。

<h2>価値

少し古いかもしれませんが、アプリとアプリケーションを区別するもう一つの方法は、「価値」です。アプリは価値が低い、つまり使い捨てのように感じるという意見もあります。アプリが動作しなかったり、必要なかったりしたら、削除すればいいだけです。でも、アプリが使えないとなると、生活がちょっと大変になります。

アプリ＝アプリが動かなくなったら、最悪だが、人生は続きます。
アプリケーション = アプリケーションが機能しなくなると、仕事をしなくなる可能性が高いです。

ヤフーの例で言えば、何らかの理由でヤフーのアプリ（ブラウザを開いてモバイルサイトに移動する）が使えなくなったとしても、問題はありません。しかし、携帯電話のSafariを開いて、ヤフーのURLを入力することは簡単にできます。しかし、ヤフーのウェブサイトやアプリケーションがダウンしてしまうと、検索やメールのチェックができなくなる。

このように、アプリの価値が低いという微妙で主観的な区別があるからこそ、アプリは無料であることが多いのでしょう。最近のREPORT BY GARTNERでは、アナリスト会社は、2017年までにモバイルアプリの全ダウンロード数の94.5％が無料になると推定しています。

もちろん、Googleはほとんど無料で、私は検索、メール、ドキュメント、その他半端なく重要なことを仕事やプライベートで使っています。

それでも、携帯電話にダウンロードしようとしているアプリに値段がついていると、たとえ0.99ドルであっても、立ち止まってしまうことは、個人的に知っています。たぶん、私の期待値が違うのでしょう。

私はアプリが無料であることを期待しているのに対して、アプリケーションにはお金を払うことを期待しています。そして、もし私の期待値が違うのであれば、アプリとアプリケーションの間には、現実のものであれ、単なる認識であれ、何らかの違いがあるはずです。

<h2>アクティビティタイプ

さらに珍しいことに、小さなサークルで「アプリ」は一般的に人々がレジャーに使うものだという議論を耳にすることがある。ゲーム、友人とのチャットや共有、ブラウジングなどです。一方、アプリケーションは、人々が「実際の仕事」をするためのものです。電子メールの送信、データの収集や操作、売買などです。

これは、初期の頃はもっと真実だったかもしれませんが、私はそれが嗅覚テストに合格するとは思っていません。それでも、時折耳にすることがある言葉です。

<h2>なぜこれが重要なのか？

今頃は、「なぜこれが重要なのか？」と自問自答していることでしょう。それはもっともな疑問です。先ほども述べたように、ソフトウェアやテクノロジーに関しては、人々の期待が重要だからです。あなたの期待も重要です。

従業員の期待も重要です。お客様の期待も重要です。そして、もしあなたがアプリやアプリケーションに同じような期待を抱いているとしたら、あなたは失望したり、不満を感じたり、ただただ怒ったりすることになるかもしれません。

結局のところ、アプリとアプリケーションを区別するのは自由なのです。最も重要なのは、アプリであれアプリケーションであれ、自分が何をしようとしているのかを理解し、明確に定義することに全力を尽くすことだと思います。この作業に少し時間をかけることで、明確なユースケースを手に入れることができます。

そして、明確なユースケースを念頭に置くことで、アプリやアプリケーションが実際に何をすることを期待しているのかをより明確に定義することができます。

以上が、アプリとアプリケーションというトピックに関する私の考えです。あなたはどう思われますか？アプリとアプリケーションには違いがあり、それは重要ですか？あなたの考えを下のコメント欄で共有してください。

▼「Canva」についてもっと知りたい方はこちらの記事もご参照ください。
https://miichisoft.com/what-is-app-type-example-flow/

Website: https://miichisoft.com/
phanmemmaytinh.com.vn - Phần mềm máy tính

https://phanmemmaytinh.com.vn/ Chuyên trang chia sẻ phần mềm miễn phí phục vụ mọi nhu cầu✔️✔️✔️
0909757921
info.phanmemmaytinh@gmail.com
Số 1 đường Đào Cam Mộc, Phường 4, Quận 8
https://www.twitch.tv/phanmemmaytinh1
https://about.me/phanmemmaytinh1
https://www.deviantart.com/phanmemmaytinh1
https://sketchfab.com/phanmemmaytinh1
https://devpost.com/phanmemmaytinh1
【Git】stashしたファイルはどこにあるの?

## はじめに

`git stash`でファイルを退避させた際の挙動について調べました。
Gitオブジェクトの話が出てきますので、前回の記事もご覧ください。
https://qiita.com/k-yaina60/items/4020a19e4adfab01a895

## `git stash`とは

gitでファイルを管理していると、編集したファイルをコミットせずに一時的に退避させておきたいということが結構あります。
(別の作業が割り込みで入って、ブランチを切り替える必要がある等)
この時、`git stash`を実行すると編集したファイルを退避させることができます。

```sh
$ git stash
```

退避したファイルを戻すには`git stash pop`を実行します。

```sh
$ git stash pop
```

## stashの正体

stashを行うと`.git/refs/stash`ファイルが作られます。
このファイルの中身を確認するとGitオブジェクトへのポインタであることがわかります。

```sh
$ cat .git/refs/stash
dbbfad1f96c78436c6ef388635fdb579e1bab496
```

次にこのGitオブジェクトの中身を確認します。

```sh
$ git cat-file -p dbbfad1f96c78436c6ef388635fdb579e1bab496
tree 9b2cc9bfc2122829051d130bae10851ab0045ff5
parent 7bc3c78b0bed6a41f110b143e71de4e2de9937a0
parent c7db2bc3cc5c92b19e5fbf83b8bba5819a400c0c
author Test User <test_user@example.com> 1683645430 +0900
committer Test User <test_user@example.com> 1683645430 +0900

WIP on main: 7bc3c78 First commit
```

stashの正体は**commitオブジェクト**です。
そのため編集したファイルはblobオブジェクトとして`.git/objects`以下に保存されています。

また、stashするとcommitオブジェクトは2つ作成されます。
例えばブランチの最新コミットAでstashするとコミットB、Cが作成されます。
コミットBでは作業中のindexファイルの状態が保存されます。
つまり、コミットBでステージングされた作業中のファイルが管理されています。
コミットCではステージングしてない作業中のファイルが管理されています。
`.git/refs/stash`はコミットCのハッシュ値を指しています。

![commit.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2693350/537d4e37-dde6-dda2-a19a-f79d1ff1cc79.png)

コミットせず退避させたい時に使うstashですが、実はコミットされていたのです。
ただし、ブランチのハッシュ値は更新されないのでブランチ自体には影響を与えません。


## stashが複数ある場合

`.git/refs/stash`に最新のstashのハッシュ値しか保存されません。
stashの一覧は`.git/logs/refs/stash`に保存されています。

```sh
$ cat .git/logs/refs/stash
0000000000000000000000000000000000000000 dbbfad1f96c78436c6ef388635fdb579e1bab496 Test User <test_user@example.com> 1683645430 +0900    WIP on main: First commit
dbbfad1f96c78436c6ef388635fdb579e1bab496 293e3cea4db140399c95ec6e52c489294ab3171b Test User <test_user@example.com> 1683701208 +0900    WIP on main: First commit
```

## まとめ

stashしたファイルはコミットして保存されている。(保存場所は`.git/objects`)

## 参考文献

https://git-scm.com/docs/git-stash#_discussion

https://stackoverflow.com/questions/41440933/why-does-git-stash-creates-2-commit-objects-seems-like-1-was-adequate
主要データベース別 CAP特徴まとめ

# 主要データベース別CAP
<br>


|SQL  |一貫性の特徴  |可用性の特徴  |分断耐性の特徴
|---|---|---|---|
|MySQL  |	ACID準拠でトランザクションの一貫性を保証する  |再起動や障害発生後の復旧機能があり、可用性が高い  |レプリケーションやシャーディングにより、分断に対して耐性がある|
|PostgreSQL  |ACID準拠でトランザクションの一貫性を保証する  |クラッシュ後の復旧機能があり、可用性が高い  |レプリケーションやシャーディングにより、分断に対して耐性がある|
|Oracle Database  |ACID準拠でトランザクションの一貫性を保証する  |再起動や障害発生後の復旧機能があり、可用性が高い  |レプリケーションやシャーディングにより、分断に対して耐性がある|
|SQL Server  |	ACID準拠でトランザクションの一貫性を保証する  |再起動や障害発生後の復旧機能があり、可用性が高い  |レプリケーションやシャーディングにより、分断に対して耐性がある|
|SQLite  |ACID準拠でトランザクションの一貫性を保証する  |シンプルなデータベースエンジンであり、小規模なアプリケーションに適している  |分断に対する耐性が低く、シングルノードの利用に限定される|
|MongoDB  |BASEモデルに基づくため、一貫性の強度は可変的である  |レプリケーションやシャーディングにより、可用性が高い  |レプリケーションやシャーディングにより、分断に対して耐性がある|
|Cassandra  |	BASEモデルに基づくため、一貫性の強度は可変的である  |分散ネットワーク型のアーキテクチャにより、可用性が高い  |分散ネットワーク型のアーキテクチャにより、分断に対して耐性がある|
【PHP】多次元配列内の配列を、配列の要素を元に並び替える方法


使用する機会があったのでメモです。

```php
//　配列を日付で昇順に並べたい
$data = [
    ['2023-04-11', '20', 'hoge'],
    ['2023-04-24', '30', 'hoge'],
    ['2023-04-03', '40', 'fuga']
];
// 各配列の0番目の要素で並び替え
array_multisort(array_map("strtotime", array_column($data, '0')), SORT_ASC, $data);

var_dump($data);
```

```php:出力結果
array(3) {
  [0]=>
  array(3) {
    [0]=>
    string(10) "2023-04-03"
    [1]=>
    string(2) "40"
    [2]=>
    string(4) "hoge"
  }
  [1]=>
  array(3) {
    [0]=>
    string(10) "2023-04-11"
    [1]=>
    string(2) "20"
    [2]=>
    string(4) "hoge"
  }
  [2]=>
  array(3) {
    [0]=>
    string(10) "2023-04-24"
    [1]=>
    string(2) "30"
    [2]=>
    string(4) "hoge"
  }
}
```

追記：
@ss8826さんがコメントにて、より簡潔な書き方を教えてくださいました✨
ありがとうございました！

参考

https://www.php.net/manual/ja/function.array-multisort.php
dockerでReactの環境構築

# はじめに
Reactの環境構築を行いました。
備忘録を兼ねて環境構築の手順を書きました。
各コードの詳細については省いてます。

忙しい人のために最終的なソースです。
https://github.com/nonamenme/docker-react
こちらを`docker-compose up -d`で立ち上げれば、とりあえずReactの環境は完成します。

# 1. 準備
以下の構成でファイルを用意
```
─── project
    ├── docker-compose.yml
    └── Dockerfile
```
・各ファイルの中身
```yml:docker-compose.yml
version: '3.8'

services:
  frontend:
    container_name: react-app
    build:
      context: ./
    restart: always
    tty: true
    volumes:
      - ./:/app
```
・コンテナ名などは必要に応じて変更

```dockerfile:Dockerfile
FROM node:17.5.0-stretch-slim

WORKDIR /app
```

# 2. 作成したdockerfileを元にイメージを作成
```terminal
$ docker-compose build
```
# 3. 新規プロジェクトの作成
```terminal
$ docker-compose run frontend npx create-react-app react-app
Creating network "react-app_default" with the default driver
Creating react-app_frontend_run ... done
Need to install the following packages:
  create-react-app
Ok to proceed? (y) y
```
・ コマンドに`--template typescript`を追加すると、typescriptで作成出来る。
（例: `docker-compose run frontend npx create-react-app {プロジェクト名} --template typescript`

# 4. docker-compose.ymlを編集
```diff_yaml:docker-compose.yml
version: '3.8'

services:
  frontend:
    container_name: react-app
    build:
      context: ./
+   ports:
+     - 3000:3000
    restart: always
    tty: true
    volumes:
-     - ./:/app
+     - ./react-app:/app
+     - react-node_modules:/app/node_modules
+volumes:
+  react-node_modules:
```

# 5. Dockerfieを編集
```diff_docker:Dockerfile
FROM node:17.5.0-streetch-slim

WORKDIR /app

+ COPY react-app/package.json react-app/package-lock.json ./
+ RUN npm install
+ COPY react-app/ .

+ CMD npm run start
```

# 6. Imageを作成し直して、コンテナを立ち上げる
```
docker-compose up -d --build
```

# 7. サーバー立ち上げ完了
以下のURLを開くとReactのスタートページが表示されていると思います。
http://localhost:3000

# 最後に
node_modulesをDockerのVolumeで管理をするようにしましたが、
このようにするとホスト側のnode_modulesは空のため、VSCodeなどのエディタでESLintのモジュールが見つからないエラーが出ます。
volumeで管理するようにしない場合は、ホスト側のnode_modulesにも同期されますが、コンテナを立てて同じ環境を作っているのにホスト側のnode_modulesも同期されてしまう可能性があります。
（また、立ち上げに時間がかかる・・・）
VSCodeの場合`Remote Containers`という拡張機能を使えば一応解決はできますが、他にも何か良い方法があればコメントで教えていただけるとありがたいです。
プログラマーへの道 #1 プログラマーになる前に知っておいた方がいいこと（プログラミング入門）のメモ帳

# 参考にした動画

https://youtu.be/2ce5IXyJeDc

[プログラマが知るべき97のこと](https://xn--97-273ae6a4irb6e2hsoiozc2g4b8082p.com/)

# プログラマーの職種
```
- WEB系エンジニア
- ゲーム開発エンジニア
- モバイルアプリ開発エンジニア
- 組み込みシステム開発エンジニア
- AI・機械学習エンジニア
- クラウドエンジニア
```
# WEB系エンジニアの種類
```
- フロントエンドエンジニア
    - ユーザーが直接操作するWebページのデザインや機能を実装する。
    - HTML、CSS、JavaScriptを使って、Webページの見た目や動作を実現する。

- バックエンドエンジニア
    - WebサイトやWebアプリケーションの裏側で動くサーバーサイドの処理を担当する。
    - データベースの設計や操作、サーバーサイドのプログラミング言語を使って、Webアプリケーションのロジックを実現する。

- フルスタックエンジニア
    - フロントエンドとバックエンドの両方を担当する。
    - Webアプリケーション全体の開発や運用を一貫して担当することができます。

- インフラエンジニア
    - WebサイトやWebアプリケーションのサーバー環境を構築・運用する。
    - サーバーのセットアップ、ネットワーク設定、セキュリティ対策、パフォーマンスチューニングなどを担当する。

- テストエンジニア
    - Webアプリケーションの品質を確保するためのテストを担当する。
    - 自動テストやマニュアルテストを行い、バグの発見や品質改善に取り組む。
  
- セキュリティエンジニア
    - Webアプリケーションのセキュリティ対策を担当する。
    - 攻撃手法の分析や脆弱性の診断、対策の実施などを行い、Webアプリケーションのセキュリティを確保します。
```

# WEBサービスとWEBアプリケーションの違い
```
- WEBサービス
    - コンテンツの種類
        - テキスト、画像、動画、音声などの静的なコンテンツ。
            - ブログ
            - ニュースサイト
            - オンラインマガジン
- WEBアプリケーション
    - オンラインショップ
    - SNS
        - Facebook
        - twitter 
    - オンラインゲーム
- コンテンツの種類
    - 動的なUI要素
    - リアルタイムでのデータ更新
    - 自動更新機能
        - メールクライアント
            - 新しいメールを自動的に受信し、受信トレイに表示する機能
            - 手動で受信を更新する必要がない。
        - (メールサーバー)
            - サーバーシステムとして機能し、データベースを使用してメールを管理することができる
        - チャットアプリケーション
            - 新しいメッセージが届いた場合に自動的に通知を送信する機能
            - 手動で受信を更新する必要がない。
        - カレンダーアプリケーション
            - 新しい予定や変更があった場合に自動的に更新され、ユーザーに通知される
            - 手動で受信を更新する必要がない。
        - ファイル共有サービス
            - 共有されたファイルに更新があった場合に自動的に更新される
                    - ユーザーは手動でファイルを更新する必要がない
    - ユーザーとの対話性を持つフォーム
        - コンタクトフォーム
            - Webサイト上でのお問い合わせ
            - 資料請求などを受け付けるフォーム
        - 登録フォーム
            - ユーザーが必要事項を入力し、送信することで、アカウント登録や会員登録が完了する     
            - アンケートフォーム
                - Webサイト上でのアンケート調査
                - 商品やサービスに対する意見・感想の収集などに利用されるフォーム
                    - ユーザーが質問に回答することで、意見や要望を収集することができる
            - 注文フォーム
                - Webサイト上での商品やサービスの注文を行うためのフォーム
                - ユーザーが必要事項を入力し、送信することで、注文が完了します。
```
# ゲーム開発エンジニア
```
- ゲームプログラマー
    - コンピューターゲームの開発に従事する。
    - ゲームエンジンの開発やゲームのロジックやシステムのプログラミングを行う。

- ゲームデザイナー
    - ゲームのコンセプトやストーリー、キャラクター、レベルデザインなどのゲームプレイ全体を設計するエンジニアです。

- ゲームアーティスト
    - ゲームに使用されるグラフィック、音楽、効果音などのアートデザインを担当するエンジニアです。また、3Dモデルやアニメーションの制作も行います。
```
```
- 組み込み系エンジニア
- 機械系エンジニア
```