OmniAICreator/Qiita-1.07M huggingface dataset:
【Docker】Flask 開発環境構築の流れ

## Docker 環境構築の流れ
備忘録として。
エラー出たところは一言メモを入れている。

## 外部ライブラリの書き出し
```console
pip freeze > requirements.txt
```

### ディレクトリ構成
```console
yuutanoMacBook-Pro todoapp % ls
Dockerfile              app.py                  init_todos.py           migrations              static
__pycache__             data.sqlite             init_user.py            requirements.txt        templates
```

### Dockerfile
FROM python:3.10.10-alpine だと、docker build でエラーになった。
requirements.txt をインストールの箇所で失敗していた。
```Dockerfile
FROM python:3.10.10

WORKDIR /ToDoApp

COPY . /ToDoApp

RUN pip install -r requirements.txt

CMD ["python", "app.py"]
```

### docker build (イメージの作成)
-t オプションの後に、「ToDoApp」にしたらエラーになった。
```console
docker build --platform amd64 -t flask:v1 .
```

```console
yuutanoMacBook-Pro todoapp % docker images                             
REPOSITORY        TAG              IMAGE ID       CREATED         SIZE
flask             latest           6606d8c501e3   5 minutes ago   1.15GB
```

### app.py の修正
ホストを"0.0.0.0"にしないとブラウザからアクセスできない。
```py
if __name__ == "__main__":
    # app.run(debug=True)
    app.run(host="0.0.0.0", port=80, debug=True)
```

### docker run (コンテナの立ち上げ)
```console
docker run -p 5001:80 -v ${PWD}:/ToDoApp -d flask:v1
```
DockerfileのCOPYにToDoAppディレクトリごとコピーするよう修正したので、
上記のコマンドは、以下に修正(ボリュームマウントは無し)
```console
docker run -p 5001:80 -d flask:v1
```

```console
yuutanoMacBook-Pro todoapp % docker images                             
REPOSITORY        TAG              IMAGE ID       CREATED         SIZE
flask             latest           6606d8c501e3   5 minutes ago   1.15GB
```

### docker exec (コンテナにログイン)
bash じゃなくて、sh にしたらログインできた。
```console
docker exec -it 4847a95f7921 sh 
```

```console
# python -V
Python 3.10.10
# ls
Dockerfile  __pycache__  app.py  data.sqlite  init_todos.py  init_user.py  migrations  requirements.txt  static  templates
```

ブラウザからアクセスできた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695961/f5b99140-7bb6-f93d-47ad-74b1efa17fdc.png)
VSCode で indexファイルを修正しても反映された。
「TODO」 →  「TODO 入力」 に修正
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695961/9e0b428d-6517-441e-537f-fea4bb127bad.png)

### 参考サイト
ありがとうございました。
https://gray-code.com/blog/flask-on-docker/
neosでlogix その138

# 概要
neosでlogixやってみる。
Get Texture 2D Pixelノードを使ってみる。
うまくいかない。

# 写真

![2023-05-07 10.13.41.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/5fa5ddd1-6066-2980-4b91-9019b2105402.jpeg)

# 手順
- ファイルブラウザを開く
- news.pngをダブルクリックする
- devtooltipを装着
- インスペクターを開く。
- logixtooltipを装着
- statictexture2dのインターフェースを取り出す
- ノードブラウザを開く
- Assets>Get Texture 2Dをアポーン
- Assets>Get Texture 2D Pixelをアポーン
- つなぐ

以上。
ChatGPTと対話しながら地球から火星に航海する物語を作るアプリの作り方

# はじめに

物語を読む　→　ユーザーが次の行動を指示する　→　新しい物語が生成される

みたいなゲームブック的なアプリをChatGPTで作れないかなと思って
ちょろっとしたアプリを作ったので、今後似たようなものを作りたい人の参考になればと思ってここに残します。

なお、この記事はベストプラクティス的なものではなく「こうやりました」という結果を中心に記載したものになります。また、APIの使い方には触れず、プロンプトの作り方を中心に紹介しています。

## どんなものを作ったのか

こんな感じで、1日の出来事をChatGPTに作らせて、次の日の行動をユーザーに入力させる
ということを5日間繰り返して1つの物語を作ることができるアプリです。

![1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166855/a9c243cf-aa63-8692-69d0-e7d4c95011cd.jpeg)

↓

![2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166855/0a1c943b-2a57-0d0d-7c55-dd2f329a75c5.jpeg)


## アプリの場所

コストの問題がある＋文章生成に時間がかかるのでアプリとしては公開してません。
ソースコードだけあるのでそれぞれでやってもらえれば。
https://github.com/TASKIH/five_days_to_mars

## 技術
OpenAI APIを使います。

接続のために以下のパッケージも使用しました。
https://github.com/openai/openai-node

APIの使い方等は特にこの記事では触れません。

## 工夫した点

生成した文章をすべてChatGPTに送ると、APIのトークンの上限に引っかかってしまうので、日ごとに「要約」させながら文章を圧縮しています。

簡単に言うと、

初日の文章を書かせる
↓
初日の文章を要約させる
↓
文章の要約とユーザーの行動を使って2日目の文章を書かせる
↓
要約と2日目の文章を使って要約させる
↓
文章の要約とユーザーの行動を使って3日目の文章を書かせる

というのを繰り返す感じになってます。

（もっと良い方法があるかもしれませんが検証していません）

### 要約の内容
「要約」がメモリの役割を果たしているので、ここから情報が抜けると後続の物語との連続性が喪われてしまうので、特に「登場人物」の情報（名前）を抜かさないように指示しています。

```ts
`【200文字以内の要約】以下の物語を要約せよ。それとは別にキャラクターの名前と行動を合計100字で記載せよ。\n過去のまとめ：${
        novel.stories[day - 1].summaryOfWholeStory
      }\n今日の出来事：${novel.stories[day].description}
      以下の形式で記載せよ。
      【過去のまとめ】：
      【今日のまとめ】：
      【登場人物の情報】：`
```

（これをやっても抜けることがたまにあります）

## 文章作成用のプロンプト

文字数がトークンの上限に抵触しないように、制約をかけながら欲しい文章を要求します。
制約は割と守られないので、少しずつ変更しながら良さそうなものを模索します。

今回はやっていませんが、ランダムで「宇宙人」「隕石」「故障」のようなお題を与えると、もっと良い物語が作られるかもしれません。

```ts
`【300文字以内の小説】地球から火星への5日間の航海の物語を作れ。まずは1日目のストーリーを書け。登場人物は4人でその中には${heroName}を含めよ。私「${heroName}」は
      主人公であり物語の主役である。朝起きてから夜寝るまでの出来事を書け、その中でちょっとした事件を起こせ。
      制約：ストーリーは主人公の一人称視点で「ですます」ではなく「である調」＋「過去形」で書け。小説なので文中に文字数は書いてはならない。
      推奨：乗組員の名前や行動は文中に積極的に書け。
      
      1日目：`
```

物語に起伏をつけたいので、日ごとに少しずつ指示を変えます。

1日目：ちょっとした事件を起こせ
2日目：奇抜でかつやや大きな事件を起こせ
3日目：重大な事件を起こせ
4日目：問題を解決してはいけない。主人公に大きな決断を促せ
5日目：ミッションの成功または失敗のいずれかの結果を記載し、物語を完結させよ

2日目以降は、このプロンプトに過去の要約を渡します。

```ts
`ヒント：前日までの出来事のまとめは以下である。\n
${prevSummary}\n
      5日目：`;
```

## 感じている課題

これで遊んでいるとすごい勢いでトークンが消費されていくので、（開発者的には）気軽に楽しめないというところが一番大きな課題ですね。。。

またResponseが返ってくるまでの時間が1分ぐらいかかるので、この辺も実運用するとなるとネックになりそうです。

## まとめ

プロンプトを工夫することによって、ある程度望んでいたアプリをつくることができました。
他の多くのChatGPTを使ったアプリと同様にコストが課題になりますが、この辺も今後技術の進歩とともに解消されていくと思うので、もっと実用的なゲームアプリを作ることができそうです。

最後に上の方でも貼った物語の続きを貼って終わりにしたいと思います。

![1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166855/8b98f7cd-a458-ac14-5501-43ee04d65333.jpeg)
![2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166855/b860c1d9-b111-5950-5c39-fb33cf798b09.jpeg)
![3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166855/fa58462b-8ae3-aae3-0321-ee88c354ad7e.jpeg)
![4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166855/426b1215-6ee4-da92-1d6a-868bcf5d2b40.jpeg)
![5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166855/fa42c207-5733-c88f-6922-39fc21f267f7.jpeg)


コーヒーをこぼしただけなのに
RiderのAttach to Unity Editorがなくなってブレークポイントデバッグができない

# RiderのAttach to Unity Editorがなくなってブレークポイントデバッグができない

ある日、RiderでUnity向けのC#スクリプトを書いてたら、 `Attach to Unity Editor` がなくなっていることに気が付きました！
デバッグボタンも押せないので、このままだとブレークポイントデバッグができません！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221845/c465e9f7-b864-03fc-c7ed-3c1d4bf536dc.png)


# `Unity Support` プラグインが無効になってた

`Settings > Plugins` で `Unity` を検索したところ、なぜか `Unity Support` のチェックが外れていました！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221845/950fdcca-6967-1604-3c0e-4bd6186cb355.png)

自分で無効にした記憶はありません…


# `Unity Support` プラグインを有効にしたら直った

ためしに `Unity Support` にチェックを入れて `Save` をクリックすると、再起動をうながされたので再起動しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221845/13e19da4-9620-3252-f6f2-876a367cd72d.png)


すると、無事に `Attach to Unity Editor` が復活し、ブレークポイントデバッグができるようになりました！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221845/ce481860-05e4-e4e5-10fd-91c7b1249a81.png)

なんでプラグインが無効になったのか謎ですが、とりあえず解決しました！
よかったよかった！
オフラインリアルタイムどう書く問題作成リハビリ #0 Java で解く

[こちらの問題](https://nabetani.github.io/q/pages/r0/) を Java で解きました。
他の方の解答例は [こちらの記事](https://qiita.com/Nabetani/items/03f983f0835b928a9524) のコメント欄から見れます。


1 時間では解き切れなかったので敗北です。

```java
package org.example;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class Solver {

  public String solve(String src) {
    var squares = new ArrayList<Square>();
    Arrays.stream(src.split(",")).map(Integer::parseInt).forEach(length -> {
      var nextX = Integer.MAX_VALUE / 2;
      var nextY = Integer.MAX_VALUE / 2;
      for (int x : xs(squares)) {
        for (int y : ys(squares)) {
          var square = new Square(new Point(x, y), length);
          if (squares.stream().allMatch(s -> s.isNotOverlapped(square))) {
            // できるだけ下 ( x + y が小さい ) または同じ高さ ( x + y が同じ ) でできるだけ左 ( y が大きい ) が見つかったか判定
            boolean b = (x + y < nextX + nextY) || (x + y == nextX + nextY) && (nextY < y);
            if (b) {
              nextX = x;
              nextY = y;
            }
          }
        }
      }
      squares.add(new Square(new Point(nextX, nextY), length));
    });
    Square maxSquare = squares.stream().max(Comparator.comparingInt(Square::length)).get();
    return squares
        .stream()
        .filter(maxSquare::isNeighbor)
        .mapToInt(Square::length)
        .sorted()
        .mapToObj(String::valueOf)
        .collect(Collectors.joining(","));
  }

  private List<Integer> xs(List<Square> squares) {
    return Stream.concat(
        Stream.of(0),
        squares.stream().map(square -> square.point.x + square.length)
    ).distinct().toList();
  }

  private List<Integer> ys(List<Square> squares) {
    return Stream.concat(
        Stream.of(0),
        squares.stream().map(square -> square.point.y + square.length)
    ).distinct().toList();
  }

  private record Point(int x, int y) {

  }

  private record Square(Point point, int length) {

    public boolean isNotOverlapped(Square other) {
      return (point.x + length <= other.point.x) || (other.point.x + other.length <= point.x) || (
          point.y + length <= other.point.y) || (other.point.y + other.length <= point.y);
    }

    public boolean isNeighbor(Square other) {
      if ((point.x + length == other.point.x) || (point.x == other.point.x + other.length)) {
        return (other.point.y < point.y + length) && (point.y < other.point.y + other.length);
      }
      if ((point.y + length == other.point.y) || (point.y == other.point.y + other.length)) {
        return (point.x < other.point.x + other.length) && (other.point.x < point.x + length);
      }
      return false;
    }
  }
}
```
本日の微分方程式（3日目）

なんとなく脳トレがてら1日1問解説しようと思っただけです．飽きたらやめます．

## 問題
```math
y^{\prime} = (4x+y)^2.
```
## ポイント
- 右辺を展開しても $16x^2+8xy+y^2$ となり，変数分離できません．
    - $y^{\prime} = 16x^2+8xy+y^2$ の形は，一階非線形常微分方程式と呼ばれます．
- $4x+y$ を置換すると変数分離形になるタイプだと気づけたら勝ちです．
- 忘れがちな公式: $\displaystyle\int\frac{1}{x^2+a^2}=\frac{1}{a}\tan^{-1}\frac{x}{a}+C~~~(C:任意定数)~$
    - 逆三角関数の定義: $y=\tan^{-1}x\Longleftrightarrow \tan y=x$

## 解説

$u = 4x+y$ とおくと，$y=u-4x$ です．両辺を $x$ で微分すると，$y^\prime = u^\prime -4$ が得られます．これを与式に代入することで，次のように $u$ と $x$ に関する変数分離形を作ることが出来ます．

```math
u^\prime - 4 = u^2,\\
\therefore u^\prime = u^2 +4.
```

「本当にこれって変数分離形なの？」って思うのも無理ないです．わかりにくいよって方は，右辺を $(u^2+4)\times 1$ と見ましょう．$P(x)=1$，$Q(u)=u^2+4$ と解釈すれば，右辺は紛れもなく $P(x)\times Q(u)$ の変数分離形です．あとは力技で解いていきましょう．

```math
\begin{align*}
u^\prime &= u^2 +4,\\
\frac{\mathrm{d}u}{\mathrm{d}x} &= u^2 +4,\\
\frac{1}{u^2 +4}\frac{\mathrm{d}u}{\mathrm{d}x} &= 1,\\
\int\frac{1}{u^2 +4}\frac{\mathrm{d}u}{\mathrm{d}x} \mathrm{d}x&= \int1\mathrm{d}x,\\
\int\frac{1}{u^2 +4}\mathrm{d}u&= \int 1\mathrm{d}x,\\
\frac{1}{2}\tan^{-1}\frac{u}{2}&=x+C_1~~~(C_1:任意定数),\\
\tan^{-1}\frac{u}{2} &=2x+2C_1,\\
\frac{u}{2} &=\tan(2x+2C_1)\cdots(☆),\\
\therefore u &=2\tan(2x+2C_1).
\end{align*}
```

ここで，最後の左辺の積分では $\displaystyle\int\frac{1}{x^2+a^2}=\frac{1}{a}\tan^{-1}\frac{x}{a}+C~~~(C:任意定数)~$ を用いています．また，$y = \tan^{-1}x$ は $y=\tan x$ の逆関数です．つまり，$y=\tan^{-1}x\Longleftrightarrow \tan y=x$ で定義されます．この定義を用いて式$(☆)$を求めました．参考書によっては，$y=\arctan x$と書いてるかもしれませんね．

さて，最後に得られた式 $u =2\tan(2x+2C_1)$ は， 新たにおいた $u$ と $x$ に関する式なので，解答としては不完全です．$u = 4x+y$ とおいたことを思い出し，$y$ について解いておきましょう．

```math
\begin{align*}
u &=2\tan(2x+2C_1),\\
4x+y &= 2\tan(2x+2C_1),\\
y &=2\tan(2x+2C_1)-4x,\\ 
y &=2\tan(2x+C)-4x~~~(C:任意定数).
\end{align*}
```

## 【参考】 Wolframalpha

非常に便利なので皆さん積極的に使っていきましょう．

https://www.wolframalpha.com/input?i=y%27+%3D+%284x%2By%29%5E2&lang=ja
Flutterで、Drawerから子画面を開いた際にDrawerを閉じる

## 問題点
FlutterでDrawerから子画面を開いた際に、子画面を閉じた時にDrawerが開きっぱなしになってしまう。

## 解決方法
子画面の遷移前に、
```dart
Navigator.of(context).pop();
```
を入れる。

## 実際にやってみる
```dart
drawer: Drawer(
            child: Align(
          alignment: Alignment.topLeft,
          child: ListView(
            children: [
              SizedBox(
                height: 65,
                child: DrawerHeader(
                    child: userState.nickName != null
                        ? Text(
                            userState.nickName! + ' さん',
                            style: const TextStyle(
                                fontSize: 24, color: Colors.white),
                          )
                        : const Text('メニュー'),
                    decoration: const BoxDecoration(
                        color: AppColors.mainBackColorMaterial)),
              ),
              ListTile(
                title: const Text('共有'),
                trailing: const Icon(Icons.people_alt_outlined),
                onTap: () {
                 ///★ここで、遷移前に閉じておく！
                  Navigator.of(context).pop();

                  ///リストID入力画面に遷移（InputDialogは独自Widget)
                  showDialog(
                    context: context,
                    builder: (BuildContext context) {
                      return InputDialog(
                        title: '共有する',
                        onPressed: () {
                          
                        },
                        description: ('共有IDが記載されたメールが送信されます。'),
                      );
                    },
                  ).then((value) => null);
                },
              ),
            ],
          ),
        ))
```

子画面で「キャンセル」を押して、元の画面に戻ると、Drawerが閉じた状態になりました！
Rustで自動テスト

現在フリーランスエンジニアとして活動していて、今今携わっている案件ではRustとTauriを使ってExcelファイルを出力するデスクトップアプリを開発しています。

上記デスクトップアプリにはユーティリティ関数としてアラビア数字を漢数字に変換する関数があり、テストを実装しようとすると似たようなテストケースが増えて多少保守性が悪くなるので、今回パラメタライズドテストで実装したいと思います。

Rustでパラメタライズドテストを実装しようとすると方法としてはマクロを使う方法や`test-case`クレートや`rstest`クレートを使う方法があります。自分が元々Pythonとpytestを使っていて、rstestが作者曰くpytestの構文を模倣して似ているということなのでrstestを使いたいと思います。

https://docs.rs/rstest/0.17.0/rstest/

```:Cargo.toml
[dev-dependencies]
rstest = "0.17.0"
```

早速、上記クレートを使用したパラメタライズドテストのサンプルコードを載せます。

```
#[cfg(test)]
mod tests {
    use rstest::rstest;

    use super::*;

    #[rstest]
    #[case(1, "一")]
    #[case(31, "三十一")]
    #[case(12345, "一万二千三百四十五")]
    #[case(100000, "十万")]
    #[case(1000000, "百万")]
    fn test_to_kanji(#[case] n: u32, #[case] expected: String) {
        assert_eq!(to_kanji(n), expected)
    }
}
```

`#[test]`の代わりに`rstest`アトリビュートを使用し、複数の`#[case]`アトリビュートを使ってテストケースを定義しています。そして、それぞれの#[case]アトリビュートでは、テストの対象関数に渡す引数の値を指定し、テスト関数の引数にも#[case]アトリビュートをつけて引数を渡します。

上記のテスト関数`test_to_kanji`には漢数字に変換したい数値である`n`と期待する漢数字の文字列である`expected`の2個の引数があり、`assert_eq!`マクロを使って期待する結果と実際の結果を比較しています。

`cargo test`で上記のテスト関数を実行すると、

```Rust
test utils::tests::test_should_return_kanji_number_for_to_kanji::case_1 ... ok
test utils::tests::test_should_return_kanji_number_for_to_kanji::case_2 ... ok
test utils::tests::test_should_return_kanji_number_for_to_kanji::case_3 ... ok
test utils::tests::test_should_return_kanji_number_for_to_kanji::case_4 ... ok
test utils::tests::test_should_return_kanji_number_for_to_kanji::case_5 ... ok
test utils::tests::test_should_return_kanji_number_for_to_kanji::case_6 ... ok
```

となり、それぞれのテストケースごとにテスト結果を表示します。

以上でRustでも簡単にパラメタライズドテストを実装することができました。`rstest`には上記以外にも`fixture`など便利な機能もあるようなのでもっと使い方を勉強したいと思います。
[SwiftUI] SafeAreaInsetsをEnvironmentで取得できるようにする

階層が一番上のViewのSafe Areaの情報を知りたい時があったので備忘録として残します。
GeometryReaderを使用した場合、そのViewのSafe Areaの情報しか取得できず、一番上のViewのSafe Areaの情報が取得できません。そこで今回はEnvironmentを使ってどのViewでも一番上のViewのSafe Area Insetsを取得できるEnvironmentを自作していきます。
# 実装
まずはUIApplicationからkeyWindowを取得できるプログラムを記述していきます。
```Swift
public extension UIApplication {
    var keyWindow: UIWindow? {
        connectedScenes
            .compactMap { $0 as? UIWindowScene }
            .first?
            .windows
            .filter(\.isKeyWindow)
            .first
    }
}
```
ちなみにkeyWindowは直近でmakeKeyAndVisible()メソッドを実行した最新のUIWindowを指します。つまり、アプリの最前面にあるWindowです。

次にUIEdgeInsetsからEdgeInsetsに変換するコードを記述していきます。
```Swift
extension UIEdgeInsets {
    var edgeInsets: EdgeInsets {
        EdgeInsets(top: top, leading: left, bottom: bottom, trailing: right)
    }
}
```
さいごにEnvironmentKeyを定義し、EnvironmentValuesにpropertyを生やします。
```Swift
private struct SafeAreaInsetsKey: EnvironmentKey {
    static var defaultValue: EdgeInsets {
        UIApplication.shared.keyWindow?.safeAreaInsets.edgeInsets ?? EdgeInsets()
    }
}

public extension EnvironmentValues {
    var safeAreaInsets: EdgeInsets {
        self[SafeAreaInsetsKey.self]
    }
}
```

## 使用方法
```Swift
struct HogeView: View {
    @Environment(\.safeAreaInsets) var safeAreaInsets

    var body: some View {
        Text("ステータスバーの高さは\(safeAreaInsets.top)です")
    }
}
```
このようにして一番上のViewのSafe Area Insetsを取得することができました。

# 参考
https://developer.apple.com/documentation/uikit/uiapplication/1622924-keywindow

https://danielsaidi.com/blog/2022/05/23/creating-an-environment-key-to-get-safe-area-insets
Diffusionたちの関係の個人的理解用メモ

# 論文間の関係
```mermaid
stateDiagram-v2
  (Sohlら2015) --> DDPM(Hoら2020):・ノイズを推定\n・分散を固定

  DDPM(Hoら2020)--> DDIM(Songら2020):・デノイズ時にx0を介在\n・サンプリング時にノイズ無しもあり\n

  DDPM(Hoら2020)--> ImprovedDiffusion(Nicholら2021):・分散も学習\n・コサインノイズスケジュール\n・diffusion stepを重要度サンプリング

  DDIM(Songら2020)--> LatentDiffusion(Rombachら2021):・拡散モデルの中に潜在変数を導入
  ImprovedDiffusion(Nicholら2021)--> LatentDiffusion(Rombachら2021)

  LatentDiffusion(Rombachら2021)-->StableDifusion
  CLIP-->StableDifusion

```

# 各論文の説明
- [Sohlら2015](https://qiita.com/ma_si_/items/1a945183775899f263df)
- [DDPM(Hoら2020)](https://qiita.com/ma_si_/items/5fcb0fc7ed6604e025c1)
- [ImprovedDiffusion(Nicholら2021)](https://qiita.com/ma_si_/items/7e635d13efd1060391b3)
- [LatentDiffusion(Rombachら2021)](https://qiita.com/ma_si_/items/219f4d178a4906144f00)
- [CLIP(Radfordら2021)](https://arxiv.org/abs/2103.00020)
- [StableDiffusion](https://github.com/CompVis/stable-diffusion)

# その他
内容に問題がある場合も責任は持てません。
コメントをいただければ修正します。
【Android】helpshiftのバージョンが上がってstyleの設定が不要になった話

# はじめに
GWはいかがお過ごしだったでしょうか？
私は後半、風邪をひき長い時間を布団の中で過ごしていました、、、(笑)
だいぶ体調が良くなってきたので、helpshiftに関する記事を備忘録的にまとめておこうと思います。

# helpshiftがXへと上がった
少し前の話なのですが、helpshiftがSDK Xへとバージョンが上がりました。

https://developers.helpshift.com/sdkx_android/

それによりかなりSDKの使い勝手が大きく変わったのですが、その中でヘッダーなどのカラーリングに関する設定がstyleによる設定から管理画面上からの設定に変わりました。
過去の古い設定は以下ですね。

https://developers.helpshift.com/misc/android-theming-skinning/

SDK Xへアップデート後は以下のページにも記載があるように、メニューにある【Branding & Customizations page】より設定が可能です。

https://developers.helpshift.com/sdkx_android/design/

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354522/c67c59f8-b7df-c646-628e-8f617094a00b.png" width="220px">

上記ページでは細かくカラーリングの設定が可能なので、これまでのデザインと合わせる形で設定することが可能だと思います。
その他に関しましてもこれまでと大きく異なっている点がありますので、ドキュメントを熟読しご対応されることをお勧めします。

# さいごに
寝正月ならぬ寝GWになってしまって悲しいです、、、
High-Resolution Image Synthesis with Latent Diffusion Modelsの理解用メモ

# 論文情報
[High-Resolution Image Synthesis with Latent Diffusion Models, Robin Rombachら, 2021](https://arxiv.org/abs/2112.10752)

# 簡単な説明
- 拡散モデルの中に潜在変数を導入→計算コストが減った

（以下工事中）

# その他
内容に問題がある場合も責任は持てません。
コメントをいただければ修正します。
ArbotiX インストール と使用

インストール
=
方法 1.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
sudo apt-get install ros-noetic-arbotix
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
方法 2.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
cd ~/catkin_ws/src/
git clone https://github.com/vanadiumlabs/arbotix_ros.git
cd ~/catkin_ws/
catkin_make
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
使用
=
ArbotiXはROSのインターフェイス（ドライバー）を提供している汎用的なモーターコントローラー。モーター駆動のロボットの制御ハードとして使える便利な部品。
ROSのパッケージも提供しているため、ROS上で簡単にシミュレーションをできるので、実験として試して見る。

１．インストール終わったら、ArbotiXのPython実行ファイルに実行権限を付与する。じゃないと、シミュレーションで使えない
![Screenshot from 2023-05-21 10-26-17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3181208/eba9b7d2-6490-ca32-9e93-b03b329c9814.png)


２．ロボットのモデルが用意されている前提だが、ロボットのlaunchファイルにArbotiXのノードを追加する。※pkg名は自分のものに書き換える。arbotix.yamlは次のステップで作る。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
<node name="arbotix" pkg="arbotix_python" type="arbotix_driver" output="screen">
     <rosparam file="$(find pkg名)/config/arbotix.yaml" command="load" />
     <param name="sim" value="true" />
</node>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~

３．arbotixに必要なコンフィグファイルarbotix.yamlファイルを作る。pkgの下のconfigフォルダ内に入れる。
~~~~~~~~~~~~~~~~~~~~~~~~~~~
#パラメータ設定
controllers: {
   base_controller: {
       #タイプ設定:差動コントローラ
       type: diff_controller,
       #進行座標
       base_frame_id: base_footprint, 
       #駆動輪の距離(m)
       base_width: 0.2,
       #制御timer（Hz）
       ticks_meter: 2000, 
       #PID車速制御
       Kp: 12, 
       Ki: 0, 
       Kd: 12, 
       Ko: 50, 
       #加速制限 
       accel_limit: 1.0
    }
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~

注意
=
動かしたら下記warningが出た、これはLobotのLink名とAbotixが制御したいLink名が異なることによる問題。
~~~~~~~~~~~~~~~~~~~~~~~
[ WARN] [1620731067.801481542]: Joint state with name: "base_l_wheel_joint" was received but not found in URDF
~~~~~~~~~~~~~~~~~~~~~~~

テスト
=
ターミナル1
~~~~~~~~~~~
roscore
~~~~~~~~~~~

ターミナル2
~~~~~~~~~~~~
runlaunch pkg名 **.launch
~~~~~~~~~~~~
参考Launchファイル
~~~~~~~~~~~~~~~~~~~~~~~
<launch>
	<!-- robotbody -->
	<arg name="model" default="$(find xacro)/xacro --inorder '$(find mrobot_description)/urdf/mrobot_with_kinect.urdf.xacro'" />
	<arg name="gui" default="true" />
	<param name="robot_description" command="$(arg model)" />

    <!-- arbotix -->
    <node name="arbotix" pkg="arbotix_python" type="arbotix_driver" output="screen">
        <rosparam file="$(find mrobot_description)/config/fake_mrobot_arbotix.yaml" command="load" />
        <param name="sim" value="true"/>
    </node>

    <!-- GUI設定 -->
	<param name="use_gui" value="$(arg gui)"/>

    <!-- ロボットのjoint_state_publisher -->
	<node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" />

	<!-- ロボットのrobot_state_publisher  -->
	<node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" />

    <!-- rviz -->
	<node name="rviz" pkg="rviz" type="rviz" args="-d $(find mrobot_description)/config/mrobot.rviz" required="true" />

</launch>
~~~~~~~~~~~~~~~~~~~~~~~

ターミナル3（キーボード操作の情報をrosに出してくれるlaunch）
~~~~~~~~~~~~~~~~~~~~~~~
roslaunch mrobot_teleop mrobot_teleop.launch 
~~~~~~~~~~~~~~~~~~~~~~~

これでRviz上でキーボード操作→arbotix→ロボット走行のシミュレーションができた。

http://wiki.ros.org/arbotix
シェルのアスタリスクでエラーに遭遇した

# はじめに
個人開発の学習用メモとして投稿します。
シェルスクリプトの練習で簡単な四則演算を行う電卓を作成していた時にエラーに遭遇しました。
そのエラー内容と、どのように解決したかについて書いていきます。

# プログラムの挙動
1. プログラムを実行すると、ユーザーはターミナル上で数字を2つ入力するよう求められる。
2. ユーザーが数字を2回入力する。
3. ユーザーは演算子として、(+, -, *, /)の何れかを入力するよう求められる。
4. ユーザーが演算子を入力する。
5. 演算子の種類に従って、計算結果がターミナル上に表示される。  

# 遭遇したエラー
4で入力した演算子が(+, -, /)の場合は、演算結果が正しく表示されましたが、演算子が*の場合のみ、[: too many argumentsというエラーが出ました。

# エラーの原因
引数を一つしか渡していないつもりだったので、最初は意味がわかりませんでしたが、これは、*演算子がワイルドカード文字として解釈され、カレントディレクトリのファイル名に展開されたためのようです。実際カレントディレクトリには2つのファイルが存在していました。なお、シェルスクリプトの該当箇所は次のように書いていました。
```
elif [[ $operator = "*" ]]; then
  echo "The result: $(($num1 * $num2))"
```


### 解決策
変数を次のように"(ダブルクウォーテーション)で括ると、変数展開されず、"*"という文字列として認識されるようになりました。
```
elif [[ "$operator" = "*" ]]; then
  echo "The result: $(($num1 * $num2))"
```
参考にした記事

https://qiita.com/daisuke0115/items/76136703c90e1f17a1fc

# おわりに
正規表現の中で"*"が使用されているのは目にしたことがありましたが、こういう挙動をするのは知りませんでした（単に勉強不足なだけですが）。これも糧としてシェルスクリプトに関する理解を今後深めていきたいと思います。
CKA試験、PersistentVolume

# PersistentVolume 作成

`pv001`という名前で、サイズは`1Gi`アクセスモード`ReadWriteMany`を利用し、Persistent Volumeを作成します

VolumeType は`hostPath`で、場所は`/tmp/app-config`です


## チートシート
https://kubernetes.io/docs/concepts/storage/persistent-volumes/#persistent-volumes

https://kubernetes.io/docs/concepts/storage/volumes/#hostpath

```
vi pv001.yaml
```


```(修正前)pv001.yaml
```

```(修正中1)pv001.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv0003
spec:
  capacity:
    storage: 5Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Recycle
  storageClassName: slow
  mountOptions:
    - hard
    - nfsvers=4.1
  nfs:
    path: /tmp
    server: 172.17.0.2


  volumes:
  - name: test-volume
    hostPath:
      # directory location on host
      path: /data
      # this field is optional
      type: Directory

```


```(修正後)pv001.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv0001 # 名前
spec:
  capacity:
    storage: 1Gi # 1Gi
  accessModes:
    - ReadWriteMany # アクセスモード
  hostPath:
      # directory location on host
    path: /tmp/app-config
```

```
kubectl apply -f ./pv001.yaml

```
JetRacerのレースメモ

## JetRacerから画像ファイルをWSLでJupyterlab構築済みのGPUマシンにディレクトリごと画像ファイルを転送する

外部からアクセスできるようにJetRacer側のマシン（Docker）で画像データをdataフォルダへコピーする
```
cp -r /home/jetson/任意のディレクトリ /home/jetson/data/
```

JetRacerにある画像データをGPUマシンにコピーする

```
scp -r jetson@192.168.xx.xx:{JetRacerのディレクトリ} {GPUマシンのディレクトリ}
```

## イーサケーブルで接続

Wi-Fiではギャラリーが増えると厳しいので有線LANでつなぐ方法を構築する。
ルータの場合は、つなげるだけで設定できますが、電源確保と機動性が悪くなるのでイーサケーブル一本でも接続できるようにする。クロスケーブルは不要のようです。自動認識みたいです。

Jetson Nanoに固定アドレス(ex 192.168.2.100)を設定する

```bash
sudo vi /etc/network/interfaces
```

以下を追記する

```bash
auto eth0
iface eth0 inet static
address 192.168.2.100
netmask 255.255.255.0
gateway 192.168.2.1
dns-nameservers 192.168.2.1
```

つぎにpc側（WINDOWS）を192.168.2.101に設定する
設定->ネットワークとインターネット->プロパティ->編集で
Iv4
IPアドレス　　　　192.168.2.101
サブネットマスク　255.255.255.0
ゲートウェイ 　　 192.168.2.1
優先DNS          192.168.2.1
に設定する。

アドレスバーに192.168.2.100でJetRacerにアクセスできるはずです。


## OLED表示を消す

systemctlのサービスを検索する。
```
systemctl list-units --type=service
```

以下のサービスを停止する。

```
jetcard_display.service 
```

サービスを停止する。

```
systemctl disable jetcard_display.service
```


サービスを開始する。

```
systemctl enable jetcard_display.service
```

ステータスを確認する。

```
systemctl status jetcard_display.service 
```

（参考）サービスわからないとき調べる。

```
sudo find / -type f -print | xargs grep '1306' 2>/dev/null
```
【文系3年目】OracleJavaBronze合格体験記

# 自己紹介
文系大学卒3年目になったばかりのインフラエンジニアです。業務では運用作業をしています。
開発経験はほぼなし
保持資格：AWS SAP,LPIC2,基本情報

# 学習記録
学習期間:2週間(GW込み)
使用教材:紫本、黒本(総合問題のみ)、ChatGPT

今回は紫本を中心に勉強を進めました。1章ごとに読み進め、わからない箇所はChatGPTに質問しながら進みました。1日目の夜に1章を読み、2日目の朝に問題演習をするペースで、8章のテキストを9日間で終えました。紫本を理解するために、テキストの中項目を全てChatGPTに入力し、「小学生にもわかるような例文と解説をお願いします」とお願いしました。これが大変効果的でした。GPT-4の正確さに感謝しつつ、どんな小さな疑問も質問しました。

その後、4日間で模試問題に取り組みました。紫本に2つ、黒本に1つの模試があり、全部で3つを試しました。1回目の模試は時間がかかりましたが、次第にスピードが上がり、最終的に得点率7割に達しました。

# 試験当日
これまでやった3つの模試よりも簡単な気がしました。ほとんどの問題を根拠を持って答えることができたと思いましたが、結果は8割でした。合格したのはホッとしましたが、正直わからない問題は10問もなかった気がしたので、どこで間違えたのか気になります。

# 試験を受けてみて
これまでのAWSやLPIC、基本情報とは違い、理解を深める必要がある試験でした。学習中もやりがいを感じました。また、ChatGPTの理解力と正確な回答に驚きました。プログラマの必要性が減ると言われているのも納得ですが、設計や修正などの知識は重要だと思います。
今後SilverやGoldの試験を学習していくのが楽しみです。
チェックされたチェックボックスの数を判定し、2つ以上なら対象のボタンを活性化する処理

```
function countChecks() {
    // チェックボックスの要素を取得する
    const el = document.getElementsByClassName("checks");

    let count = 0;
    // チェクボックスの数分ループ
    for (let i = 0; i < el.length; i++) {
        // チェックされている数をカウント
        if (el[i].checked) {
            count++;
        }
    }
    // チェック済みの項目が2個以上の場合、ボタンを活性にする
    if(count >= 2) {
        multiDeleteBtn.disabled = false;
    } else {
        multiDeleteBtn.disabled = true;
    }
};
```
【Intellij】コミットした時のメッセージの内容を後から編集する方法（Mac）：備忘録

## 手順

①エディタ上で「⌘ + 9」を押下し、「ログ」のタブを開く
![20230507-171743.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2659821/1aca4344-58e0-eade-6830-90cb2a2f3cc3.png)

②該当のコミット（コミットメッセージ）の上で右クリック → コミットメッセージの編集
![20230507-173014.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2659821/b1102944-eec9-ee27-1610-44a2f3688df9.png)

③編集し、OKボタンを押下
![20230507-171813.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2659821/a38a3cb3-5484-8864-b2a7-fa86bc5ce7cb.png)
以上で、コミットメッセージの編集が完了です！

## まとめ
Gitコマンドでも対応出来るに越した事はないですが、GUIでこんなに簡単に編集できるのはめちゃくちゃ便利でありがたいですね。ついコミットメッセージを間違えてコミットしてしまった場合でも、これで安心です^^
wordpressをdocker環境で立ち上げてみる。

# はじめに

naritomoと申します。

本職はインフラエンジニアを行っています。
wordpressについて、開発環境構築方法について投稿したいと思います。

いろいろアドバイスいただけると嬉しいです。

## 立ち上げ概要

macを使用してvscode+git環境を作り、
docker-composeを使用して立ち上げるものになります。

必要なソースは以下にまとめてあります。

dockerソース

https://github.com/naritomo08/wp-docker

## 参考URL

[Docker ComposeでWordPress開発環境を構築する方法](https://weblabo.oscasierra.net/wordpress-docker-compose/)

## なぜ、あえてDockerなのか？

インフラエンジニアとしてDockerから触れたほうが扱いやすく、
以下の利点を感じられたため、開発環境構築ではDockerを使用することを
推しています。

* OS問わず同じ開発環境での開発が可能
* インフラ/アプリエンジニアでのコラボがしやすい。
　 (具体的にはインフラ屋でOS/開発環境のベース環境を構築し、
　　アプリエンジニアで本来行うべき開発業務に集中できる。)
* 本番Web環境で多く使用されているAWS/AzureなどのIaaSサービス
　に対し、Docker資産を使用できる。

一応、本番環境展開にPaaSを使用する手はありますが、
AWS/Azureを絡めたほうが業務につながるとみています。

## 事前準備

mac+DockerCompose+vscode+gitでの環境を構築してること。

## 環境構築手順

### ベースリポジトリをクローンする。

```bash
$ git clone https://github.com/naritomo08/wp-docker.git
$ cd wp-docker
*フォルダ名は任意のものに変更できる。
```

後にファイル編集などをして、git通知が煩わしいときは
作成したフォルダで以下のコマンドを入れる。

```bash
 rm -rf .git
```

### dockerコンテナを立ち上げる。

```bash
$ docker-compose up -d
```

### 各種サイト確認する。

## サイトURL

### laravel

http://127.0.0.1:8080

### adminer(DB管理ツール)

http://127.0.0.1:8081

* ログイン情報
  - サーバ: mysql
  - ユーザ名: wordpress
  - パスワード: wordpress
  - データベース: wordpress

### mailhog(メールサーバ)

http://127.0.0.1:8025

* 本メールサーバを使用するときは以下の設定を行うこと。
 - メールサーバホスト:mailhog
 - ポート:1025
 - 送信元アドレス:info@example.com

## コンテナ起動する方法

`docker-compose.yml`が存在するフォルダーで以下のコマンドを実行する。

```bash
$ docker-compose up -d
```

## コンテナ停止する方法

`docker-compose.yml`が存在するフォルダーで以下のコマンドを実行する。

```bash
$ docker-compose stop
```

## コンテナ削除する方法

`docker-compose.yml`が存在するフォルダーで以下のコマンドを実行する。

```bash
$ docker-compose down
```

## 起動中のコンテナに入る

### wordpressコンテナ

```bash
$ docker-compose exec wordpress /bin/bash
```

### DBコンテナ

```bash
$ docker-compose exec mysql /bin/bash
```

## その他

## 本作成したソースを流用したい場合

今回のソースについて、コンテナ作成時に以下の
wordpressソースをローカルに保管するようにしています。

以下のローカルフォルダをコンテナ停止状態でgitに保管して
他の開発環境に持っていくことで流用することが出来ます。

本Dockerに再度展開するときはコンテナファイル展開先のローカルにして、
他のすでに立ち上げている環境ではコンテナ内のフォルダへオフライン
状態で展開してください。

DBの移行についてはここでは割愛します。
DBのバックアップ/リストアについてはadminerからのインポート/エクスポートをおすすめします。

| ローカル | コンテナ内のフォルダ | 概要 |
| ---- | ---- | ---- |
| ./docker-data/mysql/ | /var/lib/mysql	| MySQLのデータベース |
| ./docker-data/wordpress/themes | /var/www/html/wp-content/themes | WordPressのテーマが保存されるフォルダ |
| ./docker-data/wordpress/plugins | /var/www/html/wp-content/plugins	| WordPressのプラグインが保存されるフォルダ |
| ./docker-data/wordpress/uploads | /var/www/html/wp-content/uploads	| WordPressにアップロードしたメディアが保存されるフォルダ |

# おわりに

本記事以外にもElixir/rubyについても同様のものを上げていますので、
参照していただいてこちらにも挑戦していただければと思います。

https://qiita.com/naritomo08/items/fecf4ace7b9ca9078102

https://qiita.com/naritomo08/items/b39d4ee6987fb052ca79
数Ⅲ関数の最大最小「2023京都大学前期理系【４】」をWolframAlphaとsympyでやってみた。

WolframAlphaとsympyのグラフがでます。

オリジナル(youtube)

https://youtu.be/jJpacHG44Pk

京都大学

https://kamelink.com/exam/index.php?2023%C7%AF%B2%F2%C5%FA%C2%AE%CA%F3#m9896e6e

上と同じです。大学入試数学問題集成＞テキスト理系【４】

https://mathexamtest.web.fc2.com/2023/202310541/2023105410100mj.html#top-0105

# WolframAlphaで

https://www.wolframalpha.com/input?i=%28exp%28-%28x**2%29%29%2B1%2F4*%28x**2%29%2B1%29%2B1%2F%28exp%28-%28x**2%29%29%2B1%2F4*%28x**2%29%2B1%29+++&lang=ja

https://www.wolframalpha.com/input?i=0%3C%3Dx%3C%3D1%2C%28exp%28-%28x**2%29%29%2B1%2F4*%28x**2%29%2B1%29%2B1%2F%28exp%28-%28x**2%29%29%2B1%2F4*%28x**2%29%2B1%29+++%E3%81%AE%E6%A5%B5%E5%80%A4+&lang=ja

# sympyで
・問題文の「その値はe=2.71・・・である.」の使い方を教えて下さい。
・sympyのLambertWがでました。(参照あり。)
・solveでできませんでした。
　nsolveにしました。(参照あり。)
```
エラーメッセージ
print("#",solve(Eq(f,myMinY),x))
No algorithms are implemented to solve equation x**2/4 - 5/4 - 1/(exp(-1) + 5/4) - exp(-1) + 1 + exp(-x**2) + 1/(x**2/4 + 1 + exp(-x**2))
```

最小値のxをsolveで求める事はできませんでした。
```python
from sympy import *
x=symbols('x',real=True)
g=exp(-(x**2))+Rational(1,4)*(x**2)+1
f=g+1/g
myMaxY=maximum(f,x,Interval(0,1))  
myMinY=minimum(f,x,Interval(0,1))  
print("#",myMaxY,float(myMaxY))
print("#",myMinY,float(myMinY))
print("#",solve(Eq(f,myMaxY),x))
#print("#",solve(Eq(f,myMinY),x))
print("######################################################")
from sympy import *
x=symbols('x',real=True)
g=exp(-(x**2))+Rational(1,4)*(x**2)+1
f=g+1/g
myMaxY=maximum(f,x,Interval(0,1))  
myMinY=minimum(f,x,Interval(0,1))  
print("#",myMaxY,float(myMaxY))
print("#",myMinY,float(myMinY))
print("#",nsolve(Eq(f,myMaxY),x,1))
print("#",nsolve(Eq(f,myMinY),x,1))
plot(f,(x,0,1))
# 5/2 2.5
# exp(-1) + 1/(exp(-1) + 5/4) + 5/4 2.2359724674824384
# [0, -sqrt(-2 + LambertW(-4*exp(2))), sqrt(-2 + LambertW(-4*exp(2))), -sqrt(LambertW(-4*exp(-4)) + 4), sqrt(LambertW(-4*exp(-4)) + 4)]
######################################################
# 5/2 2.5
# exp(-1) + 1/(exp(-1) + 5/4) + 5/4 2.2359724674824384
# 2.91112052904527e-7
# 1.00000000000000
```

①私の環境は,pycharmです。
②よく聞くのは、Jupyterです。
③web上で、上記のソースを「SymPy Live shell」に、コピー貼り付けでもできました。
黒背景の右上に、マウスを移動すると、コピーマークが発生します。
???　タブレット環境で、コピー貼り付けが実行できませんでした。???

https://live.sympy.org/

？？？？plotコマンドは、縦横比？異なります。

![0png.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109698/e40b836b-a70a-9bd6-276c-8a45d6f0c457.png)

# 参考
sympy.solvers.solvers.nsolve(*args, dict=False, **kwargs)

https://docs.sympy.org/latest/modules/solvers/solvers.html#sympy.solvers.solvers.nsolve

？？？？何かあるのでしょうね？？？？
class sympy.functions.elementary.exponential.LambertW(x, k=None)

https://docs.sympy.org/latest/modules/functions/elementary.html#lambertw

wikipedia 

https://ja.wikipedia.org/wiki/%E3%83%A9%E3%83%B3%E3%83%99%E3%83%AB%E3%83%88%E3%81%AEW%E9%96%A2%E6%95%B0

https://en.wikipedia.org/wiki/Lambert_W_function
【Flutter】ビルドエラーが出る時の対処法

## エラー内容

```
Error (Xcode): File not found: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/arc/libarclite_iphonesimulator.a

Error (Xcode): Linker command failed with exit code 1 (use -v to see invocation)

Could not build the application for the simulator.
Error launching application on iPhone 14 Pro.
```
このようなエラーがよく出ていましたので、解決方法を探しました。

File not Foundのエラーを中心的に探してみたらios/Podfileに以下の内容を変更しました。

## 解決前
```
post_install do |installer|
  installer.pods_project.targets.each do |target|
    flutter_additional_ios_build_settings(target)
  end
end
```

## 解決後
```
post_install do |installer|
  installer.generated_projects.each do |project|
    project.targets.each do |target|
      target.build_configurations.each do |config|
        config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '13.0'
      end
   end
  end
  installer.pods_project.targets.each do |target|
    flutter_additional_ios_build_settings(target)
  end
end
```

## 参考記事
https://qiita.com/Todate/items/a97e359e934a174e1068
MacのSafariを完全に初期状態にする方法




## Webサイトのキャッシュを消す


```shell
/Users/user-name/Library/Containers/com.apple.Safari
```
com.apple.Safariの部分は表示がSafariとかになってたりしますが、Safariっぽいやつを削除してください。



## Safari自体のキャッシュを消す

```shell
/Users/user-name/Library/Safari
```

Appcleanerで他のキャッシュも消せます。
一度Safariをウインドウにぶち込んで、キャッシュデータだけ選択して削除しましょう。
間違えてもSafari自体は削除しないように。


https://freemacsoft.net/appcleaner/
電波時計ハック

おうちでNTP ST1を運用しているのですが、表示機能がありません。ST1モジュールにLCDや7セグなどを付けて表示する事はできるかもしれませんが、基板のままだと埃まみれになるし、ケースを作るもの面倒なのでやってませんでした。

いろいろ思案して電波時計をそのまま使う方法を試してみました。

NTP ST1で使っている[Arduino(JJYS)](https://github.com/yamori813/JJYS)でデコードしているJJY信号を普通の電波時計につっこんでみます。

![電波時計.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/a438bf45-b304-c8ad-8393-1abd7e6de141.png)

逆に電波時計からJJY信号を拾うこともできるのですが、受信モジュールはノイズ対策でフォトカプラーでの絶縁を行って、物理的にもデジタル系から離したほうが安定するので、現在稼動しているシステムのデジタル系から信号をもらうことにしました。

電波時計のもともと付いていた受信モジュールを外して何かの基板から剥がした3Vでも動作する74LVC125をつけます。

普通の電波時計は電池の消耗を抑えるため、定期的に受信を行います。受信を行う時はPONをLにしてモジュールを動作させます。

取扱説明書には2時から3時間おきに受信とあるので、2,5,8,11,14,17,20,23時に合わせているようです。

12時や18時は炊事のために電子レンジなどを使っていることがあり、ノイズが出やすい時間なのでそれを外しているのではないかと思われます。クオーツなので6,12時間おきでも十分な気がしますが、合わせてるアピールなのかもしれません。

連続して信号を入れても大丈夫なのかもしれませんが、仕様が不明なので同じようにするため74LVC125を使います。Arduinoは5Vで動作させているので、レベル変換にもなります。

回路はこんなです。74LVC125の未使用回路の入力はGNDに落とします。

![JJY-SEIKO.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/21c44230-99bb-1fdb-1e30-4d3536e1a79b.png)

こんな風に接続します。

![JJY.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/3d8db861-dd28-89a1-13e4-2023c6115e17.jpeg)

受信モジュールは40K専用になってます。東京では60Kはちょっと厳しいです。

これにArduinoに入れている信号を入れます。

電源入れて5分くらいで現在時刻が拾えました。

![IMG_20230507_161322.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/1c0f18e5-6106-bad4-42b2-781e2b987cbd.jpeg)

フォトカプラーを使って受信モジュールとArudinoを接続していて、信号が反転しているのですが、受信モジュールが反転している信号を出しているので、正しく受けられているようです。

![JJY.png](https://qiita-image-store.s3.amazonaws.com/0/104066/638b1d24-1620-6a78-a378-ce08c24a277f.png)

汎用トランジスタの2N3904を使っているのはジャンク袋に大量に入っていたからです。それ以外の理由はありません。自分の世代の汎用トランジスタは2SC945でした。

秋月のキットでは受信モジュール側でトランジスタを二段にしています。これは反転のためで、受け側でも反転することで、元に戻すためのようです。

受信モジュールを外して消費電力小さくなってるはずなので、元通りに単三電池二本で使うことにしました。アダプターにすると損失の方が大きくなるのかもしれません。

ネットを検索すると同じSEIKOのNTPクロックなる商品がありますが、けっこう高価です。SEIKOのNTPクロックはST2以下ですが、これはNTP ST1相当の時計です。

元々ついていたHUAHONGの100uF 6.3Vの電解コンデンサー二つも予防的に交換しました。

電波時計が受信しにくいのは、

1. コンクリートなどの遮蔽物で電波が弱い
1. ノイズを発生するものがあって電波が壊れる

1の場合は窓際などの電波が入りやすいと思われる場所で試すのと、2の場合はノイズの発生源から遠ざける事が対策になります。パソコンなどはノイズ源になります。1の場合難しいですが、バーアンテナの向きも大切で送信所に直行するように置きます。電波は目に見えないので、やっかいです。AMラジオもほぼほぼ同じ傾向になるので、AMラジオで確認してみるのも良い方法です。

建物がコンクリートで電波が弱くても、ノイズが少なければ受信できるような気がします。

時計本体と受信モジュールを分離する事で、時計の向きを自由に出来るメリットもありましたね。
QGISを使って山林エリアをポリゴンで描く

山林のエリアをデジタル地図上で表示してみたいと思います。
デジタルツールとしては、QGISを使用します。QGISは、無料でオープンソースのGIS（地理情報システム）ソフトウェアで、地理情報を地図やグラフなどの形式で可視化できたり、ゆくゆく別な利用を考えた場合にデータフォーマットの変換などもある程度自由にすることができそうです。
大まかな流れで何が出来そうかが伝われば良いと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21408/6939bd8e-0e16-c145-2bba-76d4542c3648.png)

# 手順

### 1. QGISのインストール
こちらからツールをインストールします

https://qgis.org/ja/site/

### 2. Googleマップの航空写真を通過

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21408/ea06c878-ba90-9050-7ee4-7aa124e12ab1.png)

WEBにも様々な記事がありますが、こちらなどが参考になります。

https://stickboost.net/qgis_googlemap

### 3. レイヤを追加

土地を描く為に、「新規GeoPackageレイヤ」を追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21408/704f928c-1862-03ad-a081-23d0902f513d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21408/9d8ebbb0-e736-5cb4-dd11-1bb3c5c3824c.png)

### 4. ポリゴンを描く

「ポリゴン地物を追加」からポリゴンを追加し、土地のエリアを囲みます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21408/44bac76a-9c4b-b9b0-4164-fe32641bfcd3.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21408/42697df8-a09f-4c7c-8a34-0eeb19de65b2.png)

### 5. レイヤのスタイル変更

レイヤをスタイルを少し変更します。
地図のレイヤも透過して表示されるので、分かりやすくなりました。
・色の変更
・透明度の変更
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21408/ee30fa41-6d2b-52dc-c827-b061c3f812f2.png)

# まとめ
Googleの航空写真上に山林エリアを描くことが出来ました。
デジタル上にエリアを描いていくことで、ゆくゆくはGPSと連携させながらエリアの内外を確認したり、エリアの微調整なども出来るようになると思います。
https通信を簡易な環境で可視化する。

# やりたいこと
- 警告詐欺のような不正サイトにどのように飛ばされるのか知りたい。
    - プロキシで可視化する。
    - 可視化する過程で証明書廻りについて学びたい

## 環境
学習用なので環境構築が簡単なDockerを使用
##### プロキシ
- Windows 11
    - Docker Desktop
        -  ubuntu/squid(https://hub.docker.com/r/ubuntu/squid)
##### クライアント
- Windows 11のEdge

## 手順
  
### プロキシ側
1. ubuntu/squidをダウンロードして実行
(省略)

1. security_file_certgenのインストール
復号にはSquidのSSL Bumpの機能を利用する。ubuntu/squidはコンパイルオプション`--with-openssl`がないのでaptでインストール。ついでにいろいろインストール
`apt update`
`apt install squid-openssl`
`apt install vim`
`apt install systemctl`

1. SSL Bumpの設定
以下のページを参考に
https://tech-mmmm.blogspot.com/2021/09/squidssl-bumphttps-ssl.html

1. 動作確認
Docker側からcurlで確認する。証明書が信頼されていないため、curlの`--insecure`オプションが必要
`curl --insecure -x http://localhost:3128 https://google.com `

### クライアント側
1. 証明書のダウンロード
プロキシ側の2.の手順で作成した証明書を、クライアント側のWindowsに登録する必要がある。
Docker環境からのファイルの取出しはDocker cpコマンドを使用する。
`docker cp <docker id>:/etc/squid/bump.crt .`
1. 証明書の登録
検索ウインドウから、「コンピュータの証明書の管理」を起動
「信頼されたルート証明機関」を右クリックし、「すべてのタスク」→「インポート」を選択し、先ほど取り出したbump.crtをインストールする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163765/52685906-c9a1-ad08-dc19-fc006c756abc.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163765/b39e18a2-49f3-68e6-5d4d-ac97a1cc006e.png)
1. プロキシ設定
検索ウインドウから、「プロキシの設定を変更する」を起動→「プロキシサーバーを使う」でプロキシIPアドレスを「http://localhost」、ポートを「3128」に変更
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163765/8f36df49-c50a-830e-c8a0-1045c7617a59.png)


# 参考文献
技術メモメモ SquidのSSL Bumpを使ってHTTPS (SSL) 通信を可視化する
https://tech-mmmm.blogspot.com/2021/09/squidssl-bumphttps-ssl.html
TECH4ALL クライアントに証明書インストール不要なSSL対応透過型プロキシを構築する
https://tech.opst.co.jp/2023/02/17/%E3%82%AF%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%B3%E3%83%88%E3%81%AB%E8%A8%BC%E6%98%8E%E6%9B%B8%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E4%B8%8D%E8%A6%81%E3%81%AAssl%E5%AF%BE%E5%BF%9C/
社内勉強会を任意参加から強制参加にしたら得られた知見

技術的な交流・Output文化の醸成したいけども、いきなり浸透するものでもなく、困っているコミュニティ（企業）多いと思います。
また、上記の達成のため任意の社内勉強会を実施するも、参加率が低くて悲しい気持ちになった開催者も同様に多いのではないかと思います。

試験的に強制参加で実施してみたら知見を得たのと、また想像以上の盛り上がりがあったので記録しておきます。

## 現状・背景
### 弊社の属性
- SES事業中心
  - 業務内業・取り扱い技術がバラバラ
  - 労働時間帯もバラバラ
  - 一人現場も多くて調整が大変
- 採用
  - 未経験者も積極採用
### 社内勉強会の状況
- 月1回程度で有志が全社に周知し実施
- 参加率は全体の約5%
- 内容はもくもく会が多め

## 実施要項
### 建付け
- グループの帰社日
### 対象者
- リーダー
  - 5名
  - 会の内容検討・ホストを実施
- メンバー
  - 20名
### スケジュール
- 事前周知
  - 2月
- 資料作成
  - 3月
  - 作成した資料は随時アップロード
- LT会実施
  - 4月
  - 5名のリーダーが日替わりで1週間にわたり実施
### テーマ
- LT（ライトニングトーク）会
- 発表テーマは自由
  - ただし、出来る人は技術関連・業務関連の内容にすること
### 作成時間
- 勤務時間に含む
- 30分を目安に作成

## 実施結果
### 参加実績
- 22/25名
  - 5回の会のうち、1つの会が参加者の業務都合により流会したため。
  - 流会となった会に参加予定だった人も、資料はちゃんと作成していた。
### 発表カテゴリ
- 技術
  - 9
- ビジネススキル・現場体験談
  - 7
- 趣味・雑学
  - 6

## 振り返り
### 「出来ないからやらない」ではないことが判明した
- 参加率・作成資料・スピーカーとしての能力、そのどれもが想像以上に良かった。
  - 任意参加で5%しか参加しない現状なので、正直期待値は低かった。
- みんなの能力があることと、Outputを「出来ないからやらない」ではないことが判明した。

### ハードルを下げる工夫が良かった
- 帰社日という建付け・建前
  - 既存の社内施策に乗っかることで、参加への納得感を演出。
    - 追加の施策として社内業務を増やしすぎると、「案件外の仕事ばっかり増やしやがって…」という心理が働きがち。
  - 帰社日の目的は「技術的なスキルアップ」ではなく、「社員間の交流」。
    - 技術的な内容である必要がなくなり、ハードルが下がった。
- 2か月という長期の準備期間
  - 資料作成に余裕を持たせる。
  - 現場との調整に余裕を持たせる。
    - 特に、シフト制の現場との調整は、最低でも１か月以上前から実施必要な場合が多い。
- 下のボーダーとなるサンプル提示
  - サンプルとしてまず「与謝野晶子はなぜ力道山を殺さなかったのか？とはなにか？」というネットーミームを題材にした資料を公開し、下のボーダーラインとした。
- オールジャンルにした
  - 現場で技術に触れる機会が少ないメンバーも多い。
  - 入社して数か月のメンバーもいる。
- 作成時間の指定
  - 30分とかなり短めに指定することで、参加者の負荷を軽減。
  - 勤怠管理上のメリットも。
    - 過重労働防止
    - 生活残業防止
- 複数日時設定した
  - １週間のうち、どこかには参加できる想定で設定。
    - ホスト側の都合で開催日時を決め打ち設定するケースは多いが、ホスト側は平日日中帯勤務で、時間の調整が可能な場合が多い。
    - これはシフト勤務のような調整が困難な現場の人の参加意欲を削る行為。
  - 週の初め会参加予定だったが参加できなくなった人が、週の後ろの会に参加出来るケースも。

### メンバーの2番槍的な動きに助けられた
- メンバーのうち、最速でアップロードされた資料が「スプラトゥーン３について」であり、ハードルを大きく下げてくれて非常に助けられた。
  - リーダーのサンプルをもとに、メンバーが後に続いてくれたことが重要。
  - リーダーのように役職者が率先してやって見せても、「役職者なので当然」という心理が働きがち。
  - 趣味・雑学カテゴリだった点も助かった。
    - この2番槍が技術的な内容で、資料もハイレベルなものだったら、全体的に結果変わっていたかもしれません。
- 作成を促すような根回しは1on1で実施していた。

## 今後のアクション
強制することにより、みんながOutputする能力はあることが判明。
技術的な交流・Output文化の醸成のために必要なことがスキルアップではなく、参加しやすい仕組み作り・参加するための動機付けが重要であることがわかりました。
なので、今後はそのあたりを整備していきたいと思いました。
Windows Serverが便利そうだったのでEC2使って自己証明書でhttpsでwebページ表示するまで

## 概要
タイトルの通りです。
ずっとLinuxだったけど会社の案件でWindows Serverに触れる機会があって、GUI操作べんりや～んと思って使いました。
やってみた感想ですが全部わかりやすくて楽しかったです（こなみ）

## やったこと
### EC2インスタンス作成
クイックスタートのWindowsから
記事が多かったので2019にしました。
あとの設定は例のごとく調べながら、高度な詳細は面倒なので全部そのままで。

### 接続
EC2の接続 > RDPクライアントからpem使ってパスワードを取得。
リモートデスクトップファイルのダウンロードをしてリモデスで接続。おわり！はやい！

### webページの配置
なんかIISマネージャーとか使うのかな？と思って色々やっていたんですけど、chatGPT大先生に聞いたら
```
インスタンス上で、C:\inetpub\wwwroot フォルダにHTMLファイル（例: index.html）を作成します。
このファイルに簡単なWebページのコンテンツを記述して保存します。
インスタンスのパブリックIPアドレスをWebブラウザーに入力し、
作成したWebページにアクセスできることを確認します。
以上で、EC2上のWindows Serverを使って簡単なWebページにアクセスできるようになります。
```
え、そんなので良いんだ～と思って配置。
パブリックIPからアクセス。表示されました。

### SSL
自己証明書でhttpsにしてみたかったのでその辺も大先生に聞きました。下記の通り
```
自己証明書を使用して、Windowsサーバー上でHTTPSを有効にする手順は以下の通りです。

1. IISマネージャを開きます。
2. 左側のペインでサーバー名をクリックし、その中の「IIS」セクションで「サーバー証明書」をダブルクリックします。
3. 右側の「アクション」ペインで、「自己証明書の作成」をクリックします。
4. 証明書の名前を入力し（例：SelfSignedCert）、他のオプションはデフォルトのままにし、「OK」をクリックして証明書を作成します。
5. 左側のペインで「サイト」を展開し、「デフォルトWebサイト」をクリックします。
6. 右側の「アクション」ペインで、「バインドの編集」または「バインドの追加」をクリックします。
7. 「タイプ」ドロップダウンで「https」を選択し、他の設定はデフォルトのままにして、「SSL証明書」ドロップダウンで先ほど作成した自己証明書（例：SelfSignedCert）を選択します。
8. 「OK」をクリックしてバインドを保存します。

これで、自己証明書を使用したHTTPSが有効になりました。ただし、自己証明書は認証局によって発行された証明書ではないため、ブラウザは警告を表示します。開発やテスト環境でのみ使用し、本番環境では正式な証明書を使用してください。
```

上記の通りです。できた。すげ～


あとはDocker入れてdjangoで何かアプリとして公開でもしようかなと思ってます。
備忘録まで
Scikit-learn入門

# はじめに

Scikit-learnは、Pythonの機械学習ライブラリで、分類、回帰、クラスタリング、次元削減、モデル選択、前処理などの機能が提供されています。ここでは、Scikit-learnの基本的な使い方と機能について説明します。
本記事で使用している[ソースコードはこちら](https://github.com/Isaka-code/scikit_learn_getting_started)です

## 目次

1. [Scikit-learnのインストール](#1.-Scikit-learnのインストール)
2. [データの読み込みと前処理](#2.-データの読み込みと前処理)
3. [モデルの選択と訓練](#3.-モデルの選択と訓練)
4. [モデルの評価](#4.-モデルの評価)
5. [モデルの保存と読み込み](#5.-モデルの保存と読み込み)
6. [ハイパーパラメータチューニング](#6.-ハイパーパラメータチューニング)

## 1. Scikit-learnのインストール

Scikit-learnはpipを使って簡単にインストールできます。

```
pip install scikit-learn
```

## 2. データの読み込みと前処理

Scikit-learnでは、データの前処理や分割を行うためのモジュールが提供されています。まずは、データセットを読み込みましょう。

```python
from sklearn import datasets

breast_cancer = datasets.load_breast_cancer()
X = breast_cancer.data
y = breast_cancer.target
```

データセットを学習用とテスト用に分割するには、`train_test_split`関数を使用します。

```python
from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
```

## 3. モデルの選択と訓練

Scikit-learnでは、多くの機械学習アルゴリズムが提供されており、簡単にモデルの選択と訓練が行えます。ここでは、決定木を使った分類器を作成します。

```python
from sklearn.tree import DecisionTreeClassifier

clf = DecisionTreeClassifier()
clf.fit(X_train, y_train)
```

## 4. モデルの評価

学習したモデルの性能を評価するために、テストデータを使って予測を行い、正解率を計算します。

```python
from sklearn.metrics import accuracy_score

y_pred = clf.predict(X_test)
acc = accuracy_score(y_test, y_pred)
print("Accuracy:", acc)
```

## 5. モデルの保存と読み込み

学習したモデルを保存して再利用することができます。`pickle`モジュールまたは`joblib`モジュールを使ってモデルを保存し、読み込むことができます。ここでは、`joblib`を使用した例を示します。
```
pip install joblib
```
```python
import joblib

# モデルの保存
joblib.dump(clf, 'model.pkl')

# モデルの読み込み
loaded_clf = joblib.load('model.pkl')

# 読み込んだモデルで予測
y_pred = loaded_clf.predict(X_test)
acc = accuracy_score(y_test, y_pred)
print("Accuracy:", acc)
```

## 6. ハイパーパラメータチューニング

モデルの性能を向上させるために、ハイパーパラメータを調整します。Scikit-learnでは、`GridSearchCV`や`RandomizedSearchCV`を使って簡単にハイパーパラメータの探索ができます。ここでは、`GridSearchCV`を使った例を示します。

```python
from sklearn.model_selection import GridSearchCV

param_grid = {'max_depth': [2, 3, 4, 5],
              'min_samples_split': [2, 3, 4, 5]}

grid_search = GridSearchCV(DecisionTreeClassifier(), param_grid, cv=5, scoring='accuracy')

grid_search.fit(X_train, y_train)

# 最適なハイパーパラメータの組み合わせを表示
print("Best parameters:", grid_search.best_params_)

# 最適なハイパーパラメータで訓練されたモデルを取得
best_clf = grid_search.best_estimator_

# モデルの評価
y_pred = best_clf.predict(X_test)
acc = accuracy_score(y_test, y_pred)
print("Accuracy:", acc)
```

これで、Scikit-learnを使って機械学習モデルの作成、評価、保存、読み込み、ハイパーパラメータチューニングができるようになりました。Scikit-learnには他にも多くの機能がありますので、公式ドキュメントを参照してください。
Docker&MySQL学習＠まとめ

##### MySQL学習
https://qiita.com/mkame/items/5be612996766a69806eb

##### DockerでMySQL環境構築
https://qiita.com/mkame/items/c289d68acbc85dda5263

##### Docker学習
https://qiita.com/mkame/items/dcf26fe4a6d725dbeaf6
DockerでMySQL8.0のコンテナを作成

##### はじめに
MySQL8.0のDBコンテナをサクッと作成し、MySQLのコマンド練習したかったので、下記の記事を参考にDockerを使って環境構築した。

https://qiita.com/ucan-lab/items/b094dbfc12ac1cbee8cb

##### 事前準備
環境構築に必要なファイルは下記3つ

```yml:docker-compose
version: "3"
services:
  db:
    image: mysql:8.0
    volumes:
      - db-store:/var/lib/mysql
      - ./logs:/var/log/mysql
      - ./docker/mysql/my.cnf:/etc/mysql/conf.d/my.cnf
    environment:
      - MYSQL_DATABASE=${DB_NAME}
      - MYSQL_USER=${DB_USER}
      - MYSQL_PASSWORD=${DB_PASS}
      - MYSQL_ROOT_PASSWORD=${DB_PASS}
      - TZ=${TZ}
    ports:
      - ${DB_PORT}:3306

  db-testing:
    image: mysql:8.0
    volumes:
      - ./docker/mysql/my.cnf:/etc/mysql/conf.d/my.cnf
    tmpfs:
      - /var/lib/mysql
      - /var/log/mysql
    environment:
      - MYSQL_DATABASE=${DB_NAME}
      - MYSQL_USER=${DB_USER}
      - MYSQL_PASSWORD=${DB_PASS}
      - MYSQL_ROOT_PASSWORD=${DB_PASS}
      - TZ=${TZ}

volumes:
  db-store:
```

```text:.env
DB_NAME=database
DB_USER=root
DB_PASS=password
DB_PORT=13306
TZ=Asia/Tokyo
```

```text:my.cnf
# MySQLサーバーへの設定
[mysqld]
# 文字コード/照合順序の設定
character-set-server = utf8mb4
collation-server = utf8mb4_bin

# タイムゾーンの設定
default-time-zone = SYSTEM
log_timestamps = SYSTEM

# デフォルト認証プラグインの設定
default-authentication-plugin = mysql_native_password

# エラーログの設定
log-error = /var/log/mysql/mysql-error.log

# スロークエリログの設定
slow_query_log = 1
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time = 5.0
log_queries_not_using_indexes = 0

# 実行ログの設定
general_log = 1
general_log_file = /var/log/mysql/mysql-query.log

# mysqlオプションの設定
[mysql]
# 文字コードの設定
default-character-set = utf8mb4

# mysqlクライアントツールの設定
[client]
# 文字コードの設定
default-character-set = utf8mb4
```

##### Docker-build

```docker:
$ docker-compose up -d  #コンテナ構築
$ docker-compose ps     #コンテナ確認
```

##### MySQLへログイン
```docker:
$ docker-compose exec db bash -c 'mysql -u${MYSQL_USER} -p${MYSQL_PASSWORD} ${MYSQL_DATABASE}'

$ docker-compose exec db bash #MySQLサーバーへアクセス
$ mysql -u${MYSQL_USER} -p${MYSQL_PASSWORD} ${MYSQL_DATABASE}  #MySQLへログイン
```
##### Docker-初期化
```docker:
$ docker-compose down --volumes #コンテナ初期化
```

##### おわりに
Docker-Buildまでは順調に進めることが出来た。
mysqlのテストデータを保存・移動・読込で、下記3点で詰まったが無事解決する事が出来。
これでMySQLのコマンド練習に取り掛かれる！

【詰まった所】
・ローカル内のディレクトリをコンテナ内のディレクトリにコピー
→DockerでMySQLサーバーへアクセスして、所定のディレクトリを指定してコピー
・コンテナ内のディレクトリ内のファイルを開く際、ERROR 1044 (42000) の権限エラー
→コンテナログイン時のuserをrootに変更
・コンテナ内に保存したmysqlデータを読み込む際に、mysqlデータ内のsourceが実行されない。
→mysqlデータが置いてあるディレクトリでコマンドを実行しないと、sourceが実行されなかった。