OmniAICreator/Qiita-1.07M huggingface dataset:
[Swift]RxSwiftとSwift Concurrencyの相互変換

# 概要
同じプロジェクト内にRxSwiftとSwift Concurrencyのasync/awaitで書かれた処理が混在している場合に、相互変換して合成可能にする方法を紹介します。


## バージョン
- XCode 13.2.1 
- Swift 5.5.2
- RxSwift 6.5.0

# 相互変換
## await(Swift Concurrency)->Single(RxSwift)

以下のコードでSwift Concurrencyの`async/await`関数からRxSwiftの`Single`に変換できます。
引数に`async/await`関数を実行するクロージャを指定しています。

```swift:await->Single
extension PrimitiveSequence where Trait == SingleTrait {
    static func fromAwait(task: @escaping () async throws -> Element) -> Single<Element> {
        Single<Element>.create { observer in
            Task.detached {
                do {
                    let value = try await task()
                    observer(.success(value))
                } catch {
                    observer(.failure(error))
                }
            }
            return Disposables.create()
        }
    }
}
```

以下の例では2秒待ってからコンソールへの表示が実行されます。
引数に指定した秒数を待つ`Task.sleep`を`Single`に変換しています。

```swift:使用例
_ = Single.fromAwait {
    try await Task.sleep(nanoseconds: UInt64(seconds) * 1000 * 1000 * 1000)
    return "await"
}
.subscribe(onSuccess: { print($0) }) // 2秒後に文字列"await"を表示
```


## Single(RxSwift)->await(Swift Concurrency)

以下のコードでRxSwiftの`Single`からSwift Concurrencyの`async/await`関数に変換できます。

```swift:await->Single
extension PrimitiveSequence where Trait == SingleTrait {
    func toAwait() async throws -> Element {
        try await withCheckedThrowingContinuation { continuation in
            _ = self.subscribe(onSuccess: { continuation.resume(returning: $0) },
                               onFailure: { continuation.resume(throwing: $0) })
        }
    }
}
```

以下では`Single.timer`を`await`して利用しています。

```swift:使用例
Task.detached {
    let result = try! await Single<Int>.timer(.seconds(2), scheduler: MainScheduler.instance)
        .map { _ in "rx" }
        .toAwait()
    print(result)  // 2秒後に文字列"rx"を表示
}
```

# 合成
## Swift Concurrencyに統一する例
以下のコードで`Single`で表現されたタスクを最終的に`async/await`の流れに組み込んでいます。
両者ともタイマーで2秒待つタスクですが、並行して実行しているので2秒で終わります。

```swift
Task.detached {
    print(Date())  // 開始時刻の確認
    async let rxTask = Single<Int>.timer(.seconds(2), scheduler: MainScheduler.instance)
        .map  { _ in "rx" }
        .toAwait()
    async let awaitTask: String = {
        try! await Task.sleep(nanoseconds: 2 * 1000 * 1000 * 1000)
        return "await"
    }()
    let rxResult = try! await rxTask
    let awaitResult = try! await awaitTask
    print(Date()) // 2秒後に実行される
    print("\(rxResult), \(awaitResult)") // "rx, await"
}
```


## RxSwiftに統一する例
以下のコードで`async/await`の関数を`Single.zip`で合成しています。
先程の例と同様に並行して実行しているので2秒で終わります。

```swift
let rxTask = Single<Int>.timer(.seconds(2), scheduler: MainScheduler.instance)
    .map { _ in "rx" }

let awaitTask: Single<String> = Single.fromAwait {
    try await timer(seconds: 2)
    return "await"
}

_ = Single.zip(rxTask,
               awaitTask)
    .do(onSubscribe: {
        print(Date()) // 開始時刻の確認
    })
    .subscribe(onSuccess: { rxResult, awaitResult in
        print("\(rxResult), \(awaitResult)") // "rx, await"
        print(Date()) // 2秒後に実行される
    })

```
llvm-mingw msvcrt, ucrt のメモ

llvm-mingw 最近 msvcrt と ucrt の２つある... どっちを使えばいいの?

とりあえず Windows 10 or later 前提であれば UCRT にします.
msvcrt は古い Windows version(e.g. Vista)用です.

## UCRT とは

https://qiita.com/syoyo/items/198f91b31c49c5ba68bb
[kubernetes] CronJobで複数コンテナを任意の順番で動かす方法

## 概要
k8s上で定期的にJobを実行させる際、CronJobを使用することがある。
1回のJobで複数コンテナを使用し、かつ動かすコンテナの順番を任意に指定する方法を以下に示す

## 方法
[Init Containers](https://kubernetes.io/docs/concepts/workloads/pods/init-containers/)を使用する。
Init ContainersとはPodが立ち上がる際、メインのアプリコンテナが立ち上がる前に動作するコンテナ群であり、主にアプリコンテナのためのセットアップを行うために使用される。

通常のアプリコンテナとの差は以下の機能がサポートされない点である。
- lifecycle
- livenessProbe
- readinessProbe

Init Containersを使用する理由はコンテナを任意の順番で動作させることが可能であるからである。[公式ドキュメント](https://kubernetes.io/docs/concepts/workloads/pods/init-containers/#differences-from-regular-containers)には以下のような記載がある

> If you specify multiple init containers for a Pod, kubelet runs each init container sequentially. Each init container must succeed before the next can run. When all of the init containers have run to completion, kubelet initializes the application containers for the Pod and runs them as usual.

Init Containersに指定されたコンテナ達はkubeletによって順番に実行されるのである。


つまりCronJobを使い`batch-01`コンテナと`batch-02`コンテナを`batch-01`→`batch-02`の順番で動作させたい場合は以下のようにyamlを記述する。


```yaml
apiVersion: batch/v1
kind: CronJob
metadata:
  name: batch
spec:
  schedule: "0 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          initContainers:
          - name: batch-01
            image: batch-01
          - name: batch-02
            image: batch-02
          containers:
          - name: job-done
            image: job-done
            command: ['sh', '-c', 'echo "batch-01 and batch-02 completed"']
          restartPolicy: OnFailure
```

少し強引な方法ではあるが...
VS2022 VS2008　共存環境においてツールボックス アイテムの選択 が落ちる

先人の方々も記事にされておりますが、私も2022版で備忘録として。

```
C:\Program Files (x86)\Microsoft Visual Studio 9.0\Visual Studio Tools for Office\PIA
```
フォルダ内の
```
Office11
Office12
```
を適当な名前（^Office11とか）にするとフォルダ内のDLLを読みこまなくなるのでアイテムの選択が可能になります。

2008を使用する際には戻したほうがよいかもです。
Vim上からの 「! +コマンド」が実行できなくなった件

今回は、なぜか動かなくなったVim上のコマンド処理について。

vi aaa.shで、ファイルを生成し、
Vimが開きます。(ファイルは拡張子含めて何でもOK)

:wq や:q!などを行うコマンドモードで、
:!pwdをすると、本来は、pwdの結果(現在の作業パス)が返されます。

しかし、以下の返答がきてしまいます。
```
shell failed to start: no such file or directory: /bin/vzsh
シェルが値を返しました -1
```

んー、ターミナル上のコマンドは、普通に動くし、
.shファイルの実行も問題なく行える、、

なぜか、Vim上でだけ動かないのが引っ掛かっていました。
エラー文をよく読んでみると、
 /bin/vzsh??  本来は/bin/zshなのに、vが余計に追加されています。
ここで、、ようやくタイプミスだと気づきました。

最近、NeoVimの使用などで、設定ファイルを変更していた時に、
以下のファイルに記載ミスがあったんだなと。
/Users/yusuke/.config/nvim/init.vim

こちらを開くと、やはり一行目には、vzshという、謎の文言をいれてしまっています。
set shell=/bin/vzsh

こちらを修正した後、すぐに、Vimのコマンドモードで!pwdを入力してみました。
すると、
```
:!pwd
/Users/yusuke/.config/nvim
```
無事に上記が返されて、解決しました！
エラー処理は地道ですが、今回の経験から、
init.vimが読み込まれていることが、体感できたので、
とても良い勉強だったなと思いました。

色々とググってみたのですが、
やはり、基本的にまずはエラーコードを冷静に分析しなければなと、反省ですね。。
Vimを使って出力したけど三列までしか表示できなくて困った件をGoogleスプレで力技解決ぅぅ

![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1299864/31711f72-d76d-91f7-026c-a632b5de0050.png)
　今回の問題として四つの関数の出力をターミナルで行なった際、結果として三つの関数が一列ずつ表示されました。
そして四つめの表示したい関数が、一つ目の関数の表示の下の行に出てくるという状態になりました。これによりいつもやっていたコピペしてそのままExcelなどで処理をするといったことができず非常に困り果て、色々調べて解決することができたので、その内容をメモ書きとして書かせていただいます！
内容でおかしな部分がありましたら、どんどん言っていただけると幸いです:relaxed:
# 1. Excelで数値を一度文字に変換
今回の問題としては、別の関数の出力が同じ列に表示されていて分けづらいというところにあります。そこで一度全体を選択してそのままGoogleスプレットシートに貼り付け、それぞれの関数を別の列に再定義し直します（**文字列として**）![898188B0-83E1-4B95-8428-CAB0410F26BC_1_201_a.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1299864/e67e8386-2c8c-57be-ea6d-3a3d32c49ecc.jpeg)
![04F882AE-589F-48A7-AA9F-84521CBB7487_1_201_a.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1299864/8c8f4718-e6b1-01d1-2461-ac002c874244.jpeg)
![4AC452FA-214A-4FF9-83FE-10B7998DE1D6_1_201_a.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1299864/42cb4676-0e3b-7cee-1152-db64b6dae55f.jpeg)

'=L2と書くことで文字列に変換します。そしてその下にも同様に書き、両方を選択しコピー（オートフィル？）します。すると以下のようになります。![スクリーンショット 2022-08-04 17.10.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1299864/77adb83e-07f8-60ee-a8c7-fa0e0d628baf.png)
# 2. 文字列を数値に戻す

そして今の状態は、選択した値は、文字列です。そのため数値に変換するために、前についていた『'』を削除します。
![CF05DF53-C715-40AE-88AF-9C5412BDB7E6_1_201_a.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1299864/39d7a17a-7309-341e-18c9-5e460c1f29c2.jpeg)

以上の方法で文字から数値に変換することができます。実際に確認してみるとQ2のセルの中身が、=L2となっていることが分かります。
![スクリーンショット 2022-08-04 17.17.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1299864/3c821e53-504a-3b92-31a1-e1678127485a.png)

次に表示形式から数字を選択し、数値を選ぶと選択していたセルの値を数値に戻せます！:information_desk_person:
![スクリーンショット 2022-08-04 17.21.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1299864/55ff49cb-ad1a-4cff-e412-637de387c87f.png)
![スクリーンショット 2022-08-04 17.21.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1299864/a9f5901e-f9fc-130b-23f4-a58768a2eff6.png)

以上で問題解決です！お疲れまでした！:grin::grin::grin::grin:

# 3. 最後に

　Excelに慣れてないということもあり、自分のやりたいことをExcelのどの機能を使えば達成できるのか調べるのに一番苦戦しました。データの分析には、これからもExcelなどは使うと思うので、もっと勉強せねば。。。。。。。
# 4. 参考にしたサイト（自分のブログ記事よりわかりやすいかも:sweat_smile:）

https://blog02.aqua-school.com/2021/01/20/excel-76/
Sequelizeを使用して、結合テーブルに対してCOUNT関数とDISTINCTを組み合わせて値を取得する

## 概要
Sequelizeを使用して、結合テーブルに対してCOUNT関数とDISTINCTを組み合わせて結合テーブルの数を取得する。
実装方法を検索した際に、`COUNT`関数を使用する方法は多く見かけたが、`COUNT`関数に`DISTINCT`を付与する方法が見つからず苦戦したため投稿する。
Sequelizeのメソッドは`findAll`メソッドを使用する。

## 環境
■ MySQLバージョン
5.7.35
■ Sequelizeバージョン
3.30.4

## テーブル設計
投稿とその投稿に対する閲覧数を保存しているテーブルがある。
目標は、全ての投稿とその閲覧数を取得することである。

- Post（投稿テーブル）
    - id
- Browsing（閲覧数テーブル）
    - id
    - post_id

## 解決薬
結論として、以下の記述で対応可能である。

```js
Post.findAll({
    include: [{model: Browsing, attributes:['id']}],
    group: [`Post.id`],
    subQuery: false,
    attributes: [
        "id",
        [sequelize.literal("COUNT(DISTINCT `Browsing`.`id`)"), "history_count"]
    ]
}).then((results)=>{
    const results_string = JSON.stringify(results);
    const last_results = JSON.parse(results_string);
})
```

発行されるSQL

```sql
SELECT 
    `Post`.`id`,
    `Browsing`.`id` AS `Browsing.id`,
    COUNT(DISTINCT `Browsing`.`id`) AS `history_count`
FROM
    `Post` AS `Post`
        LEFT OUTER JOIN
    `Browsing` AS `Browsing` ON `Post`.`id` = `Browsing`.`post_id`
GROUP BY `Post`.`id`
ORDER BY id DESC;
```


以下で、1つ１つの記述が必要な理由を記載する。

### include
子テーブルを外部結合させている。
外部結合にしている理由は、閲覧数がない投稿も取得するためである。
必要であれば`attributes`にカラムを追加する必要があるが、今回は`COUNT`関数で指定するカラムのみ取得している。
テーブル結合しないと、COUNT関数実行時にBrowsingテーブルが存在しないのでエラーになる。

### group
`GROUP BY`句を発行している。
`GROUP BY`句がないと、COUNT関数が意図した数値を指定できないので記載している。

### subQuery: false
サブクエリを無効化している。
この記述がないと以下のようなSQLが発行される。

```sql
SELECT
    `Post`.*,
    `Browsing`.`id` AS `Browsing.id`
FROM
    (
        SELECT
            `Post`.`id`,
            COUNT(DISTINCT `Browsing`.`id`) AS `history_count`
        FROM
            `Post` AS `Post`
        GROUP BY
            `Post`.`id`
        ORDER BY
            id DESC
        LIMIT
            0, 25
    ) AS `Post`
    LEFT OUTER JOIN `Browsing` AS `Browsing` ON `Post`.`id` = `Browsing`.`post_id`
ORDER BY
    id DESC;
```

上記だと、サブクエリ内でCOUNT関数が発行されて閲覧数テーブルの数を取得できない。
そのためサブクエリを無効化している。

### attributes
`attributes`の1つ目の要素は、投稿テーブルの取得するカラムを指定している。
`sequelize.literal`メソッド内の記載が、SELECT文として発行される。
第２引数に`history_count`とあるが、DBが返却するカラム名を指定しているので任意の名称で良い。

### 取得した結果をJSONオブジェクトに変換
SQL発行後に、Sequelizeから返却される値のCOUNT関数を使用して取得したプロパティ（`results[0].history_count`）を指定すると`undefined`になる現状が発生した。
返却される値をJSONオブジェクトに変換すると指定できるようになった。

```js
const results_string = JSON.stringify(results);
const last_results = JSON.parse(results_string);
```

## 取得できる値

#### 例

| id | Browsing.id |history_count|
| ---- | ---- |---- |
| 1| NULL| 0|
| 2| 1| 3|
| 3| 4| 15|
確認テスト 基礎編2.10 (標準) 最尤推定，推定量の評価

## 答案

![確認テスト 基礎編2-19.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/9fa6665c-495c-5fb7-d420-4f850eb56f9b.jpeg)
![確認テスト 基礎編2-20.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/9809246c-1d65-e541-7c9d-e9b935b839f9.jpeg)
![確認テスト 基礎編2-21.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/02fa1475-9c97-9d76-d4ec-ea67ce251094.jpeg)

## 参考文献

- 『[現代数理統計学の基礎](https://www.kyoritsu-pub.co.jp/bookdetail/9784320111660)』(久保川達也　著)
Dockerのセットアップ

## はじめに
WSLでDockerの環境構築を行ったので、作業と参考記事をまとめます。

## 作業
1. 以下の記事を参考にDocker for desctopをダウンロードしたが、エラーが発生した。
[Docker Desktop for WindowsをWSL2で使う](https://codeaid.jp/blog/docker-windowswsl2/)
1. 以下の記事を参考にエラーを解決し、無事dockerをダウンロードすることができた。
[wsl上のubuntuでdockerが使用できない](https://zenn.dev/kathmandu/articles/4a86c3d75b93c3)
確認テスト 基礎編2.9 (標準) 最尤推定，推定量の評価

## 方針

- (a) 標本平均と標本分散の独立性については[確認テスト 基礎編1.8](https://qiita.com/ut-tokei/items/5221a834f28fb2f47bd5)で示した．

## 答案

![確認テスト 基礎編2-17.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/d540d528-2ea0-8b02-2300-071664948a8c.jpeg)
![確認テスト 基礎編2-18.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/d206bf79-68cd-3d5d-abbc-9fced82c565f.jpeg)

## 参考文献

- 『[現代数理統計学の基礎](https://www.kyoritsu-pub.co.jp/bookdetail/9784320111660)』(久保川達也　著)
【Microsoft】Formsの回答内容をメールで通知させたいゾ

## はじめに
Formsで回答を受けた際、メール通知させるにはForms作成時の設定で「各回答の通知をメールで受け取る」を選択すれば
誰の回答であるかわかるし、Viewを選択すれば回答が記載されたExcelシートが開かれて確認できる。
![画面キャプチャ_005.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2511562/6df7e03e-48fc-aba1-259b-446f4153b42c.jpeg)
しかし、これが正直めんどくさい。
たかが内容を確認するためにタブが増えるし、二度手間な感じもする。

と、いうことで。
今回は通知されるメールを見るだけで回答内容を確認でできるようにしていく。


## 用意するもの
### 対象のForms
今回は「お問い合わせフォーム」を想定して作成を進めていく。
![お問い合わせフォーム.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2511562/8d001516-9828-f315-25a7-79949b5ec5f4.jpeg)



## 作成してみる
Power Automateを開き、「テンプレート」「新しい回答が送信されたときにチームに通知する」を選択する。今回はこれをベースにメール通知機能を追加していく。
※見つからない場合は検索窓より探す。
![qiita1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2511562/9757e4a6-9be9-5c26-662a-8c8049d75a23.png)

以下の画面が表示されたら「続行」を押下する。
![qiita2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2511562/60166c02-206a-51e1-3b1c-10074b937280.jpeg)


編集画面が表示されたら「When a new response is submitted」で作成したフォームを指定する。今回は対象の「お問い合わせ」フローを選択する。
![qiita3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2511562/2def7de8-6224-3dfe-08c7-69a2deb0bd03.jpeg)

「Get response details」で入力された情報をどのフォームから取得するかを指定する。今回は対象の「お問い合わせ」フローを選択する。
※フォームIDにて前の項目で選んだものと同じフォームを指定する。
![qiita4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2511562/ebf8a4ae-880e-16cb-48c3-5eeb1da9625b.jpeg)

「Post message in a chat or channel（プレビュー）」を削除する。
![qiita5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2511562/33d9cf11-5466-6ee1-cda9-2e88cd9ca7d2.jpeg)

「アクションの追加」を押下し、「メールの送信(V2)」を選択する。
![qiita6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2511562/5851ddbb-d790-4719-d9ba-1955cbc2a6cb.jpeg)
![qiita7.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2511562/d166eed2-f410-5251-2f83-56cc5ba47e28.jpeg)

通知先のメールアドレス、件名、本文を記載する。本文にフォームで収集した情報を掲載する際は「動的なコンテンツの追加」より選択する。設定が終わったら「保存」を押下する。
![qiita8.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2511562/79756dc1-8e22-4c36-2c2f-476bdfd3822f.jpeg)
![qiita9.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2511562/e02b6dcd-9b41-6c81-b327-cfbd8f5e606b.jpeg)


## 実装してみる
お問い合わせフォームで以下の内容を回答する。
![qiita10.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2511562/1ab45b7e-0d58-6e58-1a55-3ab26cc93e24.jpeg)

回答した瞬間、通知メールが届いた！解決！
![qiita11.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2511562/cbbf3db3-417e-8438-e41a-f7ee15d45076.jpeg)


## さいごに
今回はFormsの回答内容をメール通知できるように設定した。次はFormsで回答してくれた人に対して、Outlookのスケジュールに登録できる機能を追加したい。
確認テスト 基礎編2.8 (標準) 順序統計量

## 方針

順序統計量の確率密度関数については[5.13](https://qiita.com/ut-tokei/items/fd6a46f54c6dfc8df8a3)でまとめた．一様分布の順序統計量はベータ分布に従う．

## 答案

![確認テスト 基礎編2-15.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/c9830f68-7fbe-9258-0c8a-e0f63e637b8f.jpeg)
![確認テスト 基礎編2-16.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/4fc1c318-49b3-b996-014d-816868d36975.jpeg)

## 参考文献

- 『[現代数理統計学の基礎](https://www.kyoritsu-pub.co.jp/bookdetail/9784320111660)』(久保川達也　著)
【備忘録】Provisioning profile "x" doesn't include signing certificate "Apple Developmet: x"の対処方法

:::note info
**また起きた時の個人的備忘録**
:::



# ◆環境 
MacOS Monterey ver 12.5
Xcode 13.4.1(13F100)

# ◆エラーメッセージ
Runnerに下記メッセージが表示される
**Provisioning profile "x" doesn't include signing certificate "Apple Developmet: x"**
![1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55299/8ff5e69b-0fd2-ecc5-bd28-9c67de5d7179.jpeg)

# ◆証明書
証明書絡みは他の方の記事参照

https://qiita.com/warapuri/items/2a32cb2201ce75aa5f4b

・下記は全部消す事を忘れずに
　秘密鍵などcerファイルを再取り込みしたら復活するから構わないだろう(適当)

　**キーチェーンアクセス →　ログイン →　自分の証明書**
　**キーチェーンアクセス →　ログイン →　鍵**
![2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55299/6b41dd9d-4da6-d0a6-79bc-4ac8c292d2e6.jpeg)

# ◆キャッシュの削除
### ①ダウンロード済Provisioning Profile
Store ConnectからダウンロードしたProvisioning Profileが保存されている
プロファイルを削除する
```` 
cd ~/Library/MobileDevice/Provisioning\ Profiles
rm -rf *
```` 
![3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55299/8ea59074-5aee-193c-3f77-d3378825636c.jpeg)

### ②XCode 中間生成ファイル
Runner.appなど中間生成のキャッシュファイルが置かれている。
当方の環境では **このフォルダ内にあるデータをすべて削除したら表題のエラーが改善した**
````
cd ~/Library/Developer/Xcode/DerivedData/
rm -rf *
````

Xcodeのキャッシュについても別の方が詳しく記事を書いているのでそちらを参照の事

https://qiita.com/shtnkgm/items/c96a58579ec406194fa8
最大最小「20年 長崎大 工・歯・教育・薬・情報 5」をsympy でやってみたい。

直方体の対角線の長さを3，表面積を16とすると....

オリジナル

大学入試数学問題集成＞

https://mathexamtest.web.fc2.com/2020/202010881/2020108810100mj.html#top-0111

# sympyで
```python
from sympy import *
x = Symbol('x', positive=True)
y = Symbol('y', positive=True)
z = Symbol('z', positive=True)
var('t')
AB=x
AD=y
AE=z
AG_len2  =Eq(x**2+y**2+z**2 ,3**2)
ABCD_area=Eq(2*(x*y+y*z+z*x),  16)
xyz_len  =Eq(sqrt(symmetrize(AG_len2.lhs+ABCD_area.lhs)[0]),
             sqrt(           AG_len2.rhs+ABCD_area.rhs)     )
print("#(1)",xyz_len)
var('yTz,yKz')
yTz=solve(  xyz_len.subs(y+z,yTz),yTz)[0]
ans=solve(ABCD_area.subs(y*z,yKz),yKz)[0]
yKz=-collect(-ans,x).subs(y+z,yTz).expand()
myEq=Eq(t**2-yTz*t+yKz,0)
print("#(2)",myEq)
myDet=discriminant(myEq.lhs).subs({t:x})
print("#(3)",
      Intersection(
                     solve_univariate_inequality(myDet >= 0, x, relational=False),
                     Intersection(solve_univariate_inequality(yTz > 0, x, relational=False),
                                  solve_univariate_inequality(yKz > 0, x, relational=False)
                                  )
                  )
      )
V=x*yKz
print("#(3)",V.expand())
#(1) Eq(x + y + z, 5)
#(2) Eq(t**2 - t*(5 - x) + x**2 - 5*x + 8, 0)
#(3) Interval(1, 7/3)
#(3) (途中)x**3 - 5*x**2 + 8*x
# 以下増減表より省略。
```
(参考)関数の増減表作成プログラム

|x|1|... |4/3|...|2|...|7/3|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|f'(x)||+|0|-|0|+||
|f(x)|4|↗|112/27|↘|4|↗|112/27|

![Figure_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109698/2d1a327c-e7eb-8bcd-3416-670f86041648.png)




# 理解してから対応予定

「(2)，(3) の誘導を無視して 3 次方程式の解と係数の関係を利用した解法も考えられる．」そうです。

「x座標は等差数列をなし...」そうです。

# 参考

https://qiita.com/mrrclb48z/items/f98d7ea0f664768790ed
確認テスト 基礎編2.7 (標準) カイ二乗分布，中心極限定理，デルタ法

## 方針

- (a) V_XとV_Yは独立なのでカイ二乗分布の期待値と2.3(e)を使ってE[F]などを求める．
- (b) 独立性を利用して期待値を求める．不偏分散の和はカイ二乗分布に従うが，自由度に気を付ける．
- (c) 分母，分子に分けてCLTとスラツキーの定理によって漸近分布を求める．不偏分散は真の分散に確率収束する．[5.10](https://qiita.com/ut-tokei/items/31ede62eb39226ac5da7)参照．
- (d) デルタ法．


## 答案

![確認テスト 基礎編2-12.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/247a9940-b1d4-8a20-66ce-263fef21e345.jpeg)
![確認テスト 基礎編2-13.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/11186f56-f087-8e20-f317-8adea0fd148f.jpeg)
![確認テスト 基礎編2-14.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/5ad4bf74-c6e3-4953-1e95-09b2ef334491.jpeg)

## 参考文献

- 『[現代数理統計学の基礎](https://www.kyoritsu-pub.co.jp/bookdetail/9784320111660)』(久保川達也　著)
DatadogをECSで利用する際にpublic.ecr.aws/datadog/agent:latestを直接利用しないようにする


# 概要
DatadogをECSで利用するときにタスクをプライベートサブネット上で起動させているとpublicなイメージをNAT経由で取得しようとするのでコストが嵩みます。Amazon ECRプルスルーキャッシュリポジトリという機能を使えばそれを回避できるので活用しましょう。

# 問題に気づいたきっかけ
一部プロジェクトにDatadogを導入したのですが、導入したプロジェクトで導入したタイミングからNATゲートウェイの使用料が増加していることに気づきました。

NATゲートウェイの利用料が増加した過去の事例として、ECRに対してVPCエンドポイントを設定していなかったという事例がありました。（参考：[そのトラフィック、NATゲートウェイを通す必要ありますか？適切な経路で不要なデータ処理料金は削減しましょう](https://dev.classmethod.jp/articles/reduce-unnecessary-costs-for-nat-gateway))

# 問題のあった箇所
DatadogをECS Fargateで利用する際にはコンテナのイメージとしてpublic.ecr.aws/datadog/agent:latestを指定することを指示されます。
https://docs.datadoghq.com/ja/integrations/ecs_fargate/?tab=webui

実際には以下のようになるかと思います

```json
  {
    "name": "datadog-agent",
    "image": "public.ecr.aws/datadog/agent:latest",
    "essential": true,
    "portMappings": [
      {
        "hostPort": 8126,
        "protocol": "tcp",
        "containerPort": 8126
      }
    ],
    "environment": [
      {
        "name": "DD_API_KEY",
        "value": "(APIキー)"
      },
      {
        "name": "ECS_FARGATE",
        "value": "true"
      },
      {
        "name": "DD_APM_ENABLED",
        "value": "true"
      }
    ]
  }
```

上記の中で以下の部分が見直すべき箇所となります
```json
"image": "public.ecr.aws/datadog/agent:latest",
```

# 対処方法
プライベートレポジトリから取得すればNAT Gatewayを使用しなくなるので一度Publicから落としてPrivateレポジトリにPushしてあげれば問題は起きなさそうです。ただそれだとImageにバージョンアップがあった際に追随して再度PullとPushをしなけばならないので煩雑です。

どう対処すべきか調べていた過程でまさにこれを解決するための機能と言えるプルスルーキャッシュレポジトリという機能が2021/11にできたを知りました。おそらくこの機能ができるまでは上記のやり方でやるしかなかったのでしょう。
[Amazon ECRプルスルーキャッシュリポジトリをVPCエンドポイント経由で試す](https://qiita.com/t_tsuchida/items/d3c284aac0f84a597c70)

この機能を活用することによってイメージをプライベートレポジトリから落としつつ、最新版に1日に1回アップデートしてくれるというも実現できます

# Terraformでの設定

設定はTerraform上で可能で、以下の記述を入れるだけでした

```hcl
resource "aws_ecr_pull_through_cache_rule" "this" {
  ecr_repository_prefix = "ecr-public"
  upstream_registry_url = "public.ecr.aws"
}
```

そして、ECSでのImageを差し替えて実行します

```
"image": "(アカウントID).dkr.ecr.ap-northeast-1.amazonaws.com/ecr-public/datadog/agent:latest",
```

初回試した時は、エラー内容をメモしていなかったのですがImageが落とせないというエラーで失敗しました。
別途他のサーバーから

```
docker image pull (アカウントID).dkr.ecr.ap-northeast-1.amazonaws.com/ecr-public/datadog/agent:latest
```
とすると問題なくイメージが落とせ、Webコンソール上にも表示されたほかECSも問題なく起動できるようになりました。
おそらくIAMの権限不足でレポジトリの作成ができなかったのが原因ではと思います。うまくいかなければそこを見直してみてください。

[プルスルーキャッシュルールの使用](https://d![Screen Shot 2022-08-04 at 16.46.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145904/585ec36c-ff1f-a493-a290-28612f363963.png)
ocs.aws.amazon.com/ja_jp/AmazonECR/latest/userguide/pull-through-cache.html)

# 結果

コストをがっつりと下げる事ができました！単位はお見せできないのですが、対応前と比較してNatGateway-Bytesが減っているのがわかるかと思います。

![Screen Shot 2022-08-04 at 16.46.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145904/51ec0806-63b2-46fd-5637-76ac26502f07.png)

ECSのタスク数と起動停止が少なければそこまで効果はないでしょうが、今回は本番稼働しているサービスかつオートスケールで起動停止があるものだったのでインパクトが大きめでした。

# まとめ

以上でpublicなイメージをAmazon ECRプルスルーキャッシュリポジトリを利用することによりコストの削減ができました。
Datadogで手順通りにセットアップしていくと、特に断りもないのでpublic.ecr.aws/datadog/agent:latestのままにしてしまうケースが多いかと思います。簡単に直せるので是非見直してみてください。
[備忘録] Jetson Nano 4GB (新モデル A02)に電源ボタンを増設

# [備忘録] Jetson Nano 4GB (新モデル A02)に電源ボタンを増設
- カメラスロットが2つあるJetson Nano 4GB(A02)に電源ボタンを増設しました。
    - 旧モデル (B01)の記事しか見当たらなかったので、備忘録としてまとめておきます。
- [購入したマザーボード用スイッチのAmazonのリンク](https://www.amazon.co.jp/gp/product/B01KJ11QG6/ref=ppx_yo_dt_gb_asin_title_o02_s00?ie=UTF8&psc=1) 
- 画像上で右から順に、**POWER SW**、(2つ空き)、**RESER SW**、**ジャンパピン**、(2つ空き)、**POWER LED＋**、**POWER LED−**を接続しました。

![PXL_20220804_072044283.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2525418/259e3816-6cb1-a6ad-e7d1-9dc609d980a3.jpeg)

# Reference
- [NVIDIA Jetson Nano（旧モデル）に電源スイッチ、リセットスイッチを増設する方法](http://www.neko.ne.jp/~freewing/raspberry_pi/nvidia_jetson_nano_power_switch/)
 - [Jetson Nano B01 vs A02: What’s New for the Compute on Module (CoM) and Carrier Board](https://www.arducam.com/nvidia-jetson-nano-b01-update-dual-camera/)
 - [JETSON NANO DEVELOPER KIT User Guide](https://developer.download.nvidia.com/assets/embedded/secure/jetson/Nano/docs/NVIDIA_Jetson_Nano_Developer_Kit_User_Guide.pdf?eDAWoxos3kTa7jE-8teRR-jDfQr25_YZixpmSBXV6wQ0QlhwAI6n5S-RO96T2F1DkVQTw2vKVJQr5ZQuCsVrdRpMQx6A3Tj_r-GzD3pMJ9U2bmaefNEoq5m7f4zhtwvBbQyewKKQvxfdWDVEi_e3yIcL2CjpHQwpg6fF5kHFeuGbMFubr1Dud8Hv-3AoEa2OJDn34lSI&t=eyJscyI6ImdzZW8iLCJsc2QiOiJodHRwczpcL1wvd3d3Lmdvb2dsZS5jb21cLyIsIm5jaWQiOiJhZm0tY2hzLTQ0MjcwIn0)
確認テスト 基礎編2.6 (易) 等比数列の和

## 答案

![確認テスト 基礎編2-11.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/e1cbcc64-0bf7-8b27-095e-1d7490cd83bd.jpeg)


## 参考文献

- 『[現代数理統計学の基礎](https://www.kyoritsu-pub.co.jp/bookdetail/9784320111660)』(久保川達也　著)
確認テスト 基礎編2.5 (易) 繰り返し期待値，条件付き分布

## 方針

類題は[4.16](https://qiita.com/ut-tokei/items/5f7a4576241bc01e962d)，[4.17](https://qiita.com/ut-tokei/items/fc82bcfaff66d798cb81)など．


## 答案

![確認テスト 基礎編2-10.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/a4dbd814-8f1f-ada9-c84e-e9fe7fb27321.jpeg)

## 参考文献

- 『[現代数理統計学の基礎](https://www.kyoritsu-pub.co.jp/bookdetail/9784320111660)』(久保川達也　著)
Dart swap(スワッピング)をして配列内を入れ替える

`swap`関数を作成して、配列内で文字列を入れ替えてみます。
```dart
void main() {
  final list = ['A', 'B', 'C'];
  print(list); // [A, B, C]
  print(swap(list, 0, 2)); // [C, B, A]
  print(list); // [A, B, C]
}
```
`swap`関数内では新しく配列を作成する必要があり、最後にその作成した配列を返します。
```dart
swap(List list, int x, int y) {
  final a = [...list];
  String b = a[x];
  a[x] = a[y];
  a[y] = b;
  return a;
} 
```
`final a = [...list];`これで、`a`に新しい`['A', 'B', 'C']`の配列が作成されます。あとは、型付の変数を用意して、スワッピングさせます。
JavaScriptで配列最後の要素を取得する

Javascript では配列最後の要素を取得する方法がいくつかあったのでまとめておきます。

## array[array.length - 1]
今まではこれを使うのが多かったそうです。
```javascript
const fruits = ['apple', 'banana', 'orange'];
console.log(fruits[fruits.length - 1]); // orange
```
## array.pop()
これで取得すると、元の配列から最後の要素が消えてしまいます。
```javascript
const fruits = ['apple', 'banana', 'orange'];
console.log(fruits.pop()); // orange
console.log(fruits); // ['apple', 'banana']
```

## array.slice(-1)[0]
これでも取得できますが、何をしているコードか分かりづらいです。
```javascript
const fruits = ['apple', 'banana', 'orange'];
console.log(fruits.slice(-1)[0]); //orange
```

## array.at()
ES2022 で at() メソッドが追加されたので、これを使うのが一番簡単そうです。
```javascript
const fruits = ['apple', 'banana', 'orange'];
console.log(fruits[0]); // apple
console.log(fruits[-1]); // undefined
console.log(fruits.at(0)); // apple
console.log(fruits.at(-1)); // orange
```

## 参考
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/at
https://qiita.com/kerupani129/items/64ce1e80eb8efb4c2b21
確認テスト 基礎編2.4 (易) 変数変換

## 方針

変数変換はまず分布関数から考える．分布関数ができたらそれを微分することで確率密度関数を求める．

## 答案

![確認テスト 基礎編2-8.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/96a85398-f73f-3ed8-b1ca-98005dd87187.jpeg)
![確認テスト 基礎編2-9.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/75860a62-6e06-715c-3132-ba364b0ffda0.jpeg)

## 参考文献

- 『[現代数理統計学の基礎](https://www.kyoritsu-pub.co.jp/bookdetail/9784320111660)』(久保川達也　著)
確認テスト 基礎編 2.3 (標準) 変数変換，ガンマ関数，期待値の定義

## 方針 

- (a) 確率積分変換．

![確認テスト 基礎編2-4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/186b03d9-2348-47e4-660a-91891aacbbd2.jpeg)

- (b) 変数変換と分位点の問題．
- (c) 正規分布の積率母関数をもとにモーメントを計算する問題．別解のように定義通り計算しても良い．
- (d) ガンマ関数．
- (e) 期待値の定義通り計算する．

## 答案

![確認テスト 基礎編2-5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/5adb8551-4736-7587-5675-0d213f8d612b.jpeg)
![確認テスト 基礎編2-6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/29701676-e4a2-1d36-f649-19247d7cc225.jpeg)
![確認テスト 基礎編2-7.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/3c1243a4-35c8-43b9-e9ee-de7c18a74204.jpeg)






## 参考文献

- 『[現代数理統計学の基礎](https://www.kyoritsu-pub.co.jp/bookdetail/9784320111660)』(久保川達也　著)
ホームページを初めて作ろうとする人に必要なものを紹介

今までアメブロばかりやって来たけど、そろそろ自分のホームページを持ちたいという方のために、必要であり、おすすめのものをご紹介します。

１．ドメイン

まず必要なものはドメインというものです。

インターネット上では、このドメインという名前でアクセスしますので、まずドメインを取得する必要があります。

今では実に様々なドメインがありますので、ご自身で気に入った名前で検索してみてください。

おすすめなのは、お名前です。

ドメインの業界では最大手だと思いますし、実にたくさんの種類のドメインを扱っていますから。

２．レンタルサーバー

次に必要になるのは、取得したドメインで使うメールやホームページの情報を置いておく場所です。

この場所を提供してくれるのがレンタルサーバーを運営している会社です。

これもまた実にたくさんあって、どこがいいのか、どこにしたらいいのかわからないと思います。

初めてホームページを作るのですが、あとあとの事も考えると、ある程度のものが必要になります。

スペックやサポートというのを見ても、実際に使ってみないとわからない部分が多々あるのが実情です。

そこで、私が普段使っているもので、おすすめなのは、エックスサーバーです。

ホームページの表示の速さや価格面から総合してみて、おすすめなレンタルサーバーです。
https://i-fc.jp/web/rentalserver-recommendation/

３．WordPress

ホームページを作るのに必要というか、いま最も使われているのが、WordPressというものです。

これは、サーバーの方で動くプログラムで、よく企業が作っているホームページのようなものと、アメブロのようなブログの両方の機能を備えています。

それと、これはかなり重要なことなんですが、SEO対策に最適化されているということです。

ちょっと難しい表現になりましたが、簡単に言うと、YahooやGoogleの検索結果で上位に行きやすくなるような作りになっているということです。

あと、テーマと呼ばれる見た目や作りを、テンプレートというもので、自由に変更ができるのです。
Elastic IPの無料枠について

# 背景
- AWSを勉強中
- 出来るだけ無料枠を使いたくて調査実施
- ログインが面倒なので、固定IPを取得したい
- EIPの料金設定が以外と面倒だったのでまとめる  

# まとめ
- EC2とEIPを完全に無料枠で利用する条件が絶妙（さすがAWS）
- 以下の制約を気にする必要有
    - EIP制約
        - Elastic IP アドレスに関連付けられているインスタンスが実行中である
    - EC2
        - 1 か月に最大 750 時間が無料枠
- EC2を停止していると、EIPの料金が発生
- EC2は1か月に最大750時間が無料枠
- 1台以上のEC2を利用するとしたら、利用時間以外は停止しておきたい

# 参考
- [EIPで料金発生するパターンとしないパターン #AWS](https://dev.classmethod.jp/articles/cost-of-eip/)
- [すべての Amazon EC2 インスタンスが終了されているにも関わらず、Elastic IP アドレスの料金が請求されているのはなぜですか?](https://aws.amazon.com/jp/premiumsupport/knowledge-center/elastic-ip-charges/)
- [Amazon EC2 の料金](https://aws.amazon.com/jp/ec2/pricing/?loc=ft#Free_tier)
phpをwindowsコマンドラインで動かすのに必要な最小限のファイル

## 動かすのに必要な最小ファイル

以下2ファイルだけで動く。

```go
php.exe
php5.dll (もしくは php5ts.dll)
```

### バージョンごとのphp~.dllのサイズ

| php~.dll | サイズ | 備考 |
|:--|:--|:--|
| 4.3 | 1252 kb | - |
| 4.4.6 | 1372 kb | mysqlへの接続はdll不要 (内包) |
| 5.2.17nts | 4729 kb | mysqlへの接続は ext/libmysql.dll 指定 |
| 5.4.9 | 5938 kb | 配列の短縮構文。xp最後のバージョン |
| 5.6.24 | 10409 kb | [xpに5.6.24を移植したもの](https://github.com/ProgerXP/php-5.6-xp/tree/master/release/x86) |
| 8.2.5 | 8703 kb | 2023-04-21最新。配布にVC++ Runtime必要 |

* [php 5.4.9](https://windows.php.net/downloads/releases/archives/)
* [php 8.2](https://windows.php.net/download)

| version | 対応 |
|:--|:--|
| 4.0.6 | mb_convert_encoding() |
| 4.3 | pdo、file_get_contents() |
| 5.2 | json_encode() json_decode() |
| 5.4 | 配列の短縮構文 $a = [1, 2, 3, 4]; |
| 7 | 処理速度が早くなった。あとclassのstatic記述 |
| 8 | 処理速度が早くなった。(JIT) |

メジャーバージョンアップのごとにdllサイズが大きくなる・・・
コマンドライン引数: $argv[1]

### php5について

* OneDrive上のファイルにアクセスができない。php8では可能。

### php4

* https://museum.php.net/php4/

### php3について

php.exeとphp3.ini だけで動く。容量は小さくてすごい。

* https://museum.php.net/php3/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/8b171bc1-5cf9-ae50-cbad-e5e35095d2f0.png)

[phpのバージョンの歴史](https://thinkit.co.jp/free/compare/2/1/)

### PHP を実行環境ごと EXE にパッケージする

* [p2x](https://www.vector.co.jp/soft/dl/win95/prog/se365730.html)
* [PHP7をEXEにコンパイルする方法（PHP7＋WinBinder＋VBS） - tukihatuの技術日記](https://tukihatu.hatenablog.com/entry/20151229/1451373607)


### php8でhttpsアクセスをするには

```diff:php.ini
+ extension_dir = ".\ext"
+ extension=openssl
```


### php5でmbstringsを使う

* php.ini

```
[PHP]

extension=ext\php_mbstring.dll
```
AWS AmazonLinux2 ホスト名の変更

# 概要
- AmazonLinux2の初期設定についてのまとめ
    - /etc/cloud/cloud.cfgの設定
    - hostnamectlによるホスト名の変更
        - /etc/hostnameの変更確認(念のため）
        
# Amazon Linuxのホスト名の変更
- [Amazon Linux インスタンスのホスト名の変更](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/set-hostname.html)
- 上記リンクを参照に設定

- /etc/cloud/cloud.cfgの設定
```
// [preserve_hostname: true]の記載があるか確認
# cat /etc/cloud/cloud.cfg | grep preserve_hostname

// なければ末尾に追記
vi /etc/cloud/cloud.cfg
--------------------------
# host名設定
preserve_hostname: true
--------------------------

// 確認
# cat /etc/cloud/cloud.cfg | grep preserve_hostname
```

- hostnamectlによるホスト名の変更
```
// 確認コマンド
# hostnamectl

// コマンドの実行＆確認
# hostnamectl set-hostname hoge
# hostnamectl

// 設定反映のために再起動
# reboot
# hostnamectl
```

# host名の変更方法
- /etc/hostnameの変更
- hostnamectlにて変更されるので不要（念のため確認するくらい）
```
// 確認
# cat /etc/hostname

// 変更&確認
# vi /etc/hostname
# cat /etc/hostname

// 設定反映のために再起動
# reboot
```

# おまけ：RHEL7でのホスト名の状態
- [6.1. ホスト名について](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/networking_guide/ch-configure_host_names#doc-wrapper)
- 以下の3つの状態があるとのこと
    - static (静的)：/etc/hostname ファイルに保存される
    - pretty：ユーザーに自由形式の UTF8 ホスト名を提示
    - transient (一時的) ：カーネルによって維持される動的なホスト名（リブート後staticに戻る）

# 参考
- [Amazon Linux インスタンスのホスト名の変更](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/set-hostname.html)
- [AWS EC2 - Amazon Linux2 のホスト名を永久的に変える方法](https://qiita.com/qualitia_cdev/items/220a22474b2a3bb4f062)
- [6.1. ホスト名について](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/networking_guide/ch-configure_host_names#doc-wrapper)
GitHub Copilot が私のコーディングを助けてくれた話

# 結論
GitHub Copliot（下記、Copliot）を導入することで AI がコーディングのサポートをしてくれます。
60 日間のお試し期間があるため、ぜひお試しあれ。

# 初めに
正式リリースして 1 ヶ月ほど経ちようやく私も、Copilot を導入しました。
私はソフトウェアのエンジニアとして普段、主に PHP や React でコードを書いております。
Copilot は、導入後、明らかにコーディングの助けになってくれています。

※ 筆者は PhpStorm を利用していますが、VSCode でも勿論お使いいただけます。

# GitHub Copilot とは

>GitHub Copilotが誕生したことで、ソフトウェア開発の歴史の中で初めて、開発者がコードを書いたり、完成させるためにAIを広く利用できる開発環境が整いました。コンパイラやオープンソースの台頭と同様に、AIによるコーディング支援はソフトウェア開発のあり方を根本から変え、開発者がより簡単かつ迅速にコードを書くための新しいツールを提供することで、より幸せな生活を送ることが出来るようになると考えています。

https://github.blog/jp/2022-06-22-github-copilot-is-generally-available-to-all-developers/

「Copilot」は日本語で「副操縦士」と言い、コーディングする際にもう一人エンジニアがいるかのような体験をすることができます。

# 使用感（PHP Laravel）
`getByU` まで打つことで Copilot がコードの提案をしてくれます。
![スクリーンショット 2022-08-04 13.07.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488575/38f780e7-c3d4-f445-0791-07cbfd05cb45.png)

提案されたコードは Tab キーを押すだけで入力が確定します。
![スクリーンショット 2022-08-04 13.17.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488575/7a8e3879-8077-efd9-e87f-f4f592a64313.png)

勿論、全てのコードを提案してくれる訳ではありません。あくまで副操縦士です。
Copilot の提案を受け入れ修正しつつコーディングをしていくことで時間短縮につながることは間違いないのではないでしょうか。

また、便利な反面、学習データとして使用された GitHub 上の公開リポジトリのコードがそのまま提案されてしまう場合もあるそうです。権利関係に注意を払って使用する必要がある事に注意してください。

https://ainow.ai/2021/09/03/257207/

# 料金
料金プランは本記事編集時点で 2 種類あります。
1. 10米ドル/月
2. 100米ドル/年
>エディターでソースコードを提案してくれるAIペアプログラマー「GitHub Copilot」をすべての開発者が10米ドル/月、100米ドル/年で利用できるようになりました。学生や人気のあるオープンソースプロジェクトのメンテナーは無料で利用できます。

しかし、60 日間の無料プランがある為、お試しで始めることができます。
おそらく私は無料プラン終了後も継続して使用するだろうと思います。

# 導入方法
## 1. GitHub から利用開始設定を行う。
まずは利用開始設定を行いましょう。私は利用開始設定をせずに次のステップに進んだため少しだけ躓きました。
ここで利用者情報や、クレジットカード情報の登録を行います。それほど難しくありません。

https://docs.github.com/ja/billing/managing-billing-for-github-copilot/managing-your-github-copilot-subscription

## 2. エディタ上に Copilot の拡張機能をインストールする。

インストール後、GitHub ログインを求められると思いますのでログインしましょう。

以上、簡単に導入することができます。

# 合わせろ Copilot
呪術廻戦の言葉で締めたいと思います。
契約形態　備忘録

## SES
SES契約（システムエンジニアリング契約）とは、準委任契約、業務委託、タイマテとも呼ばれる契約形態。エンジニアの能力を契約の対象とした手法です。つまり、エンジニアを雇用する時間に対して報酬を支払う形態になります。

https://boxil.jp/mag/a1450/

## 準委任契約
時間に対して報酬を支払う形態

## 請負契約
請負契約は、当事者の一方がある仕事を完成させることを約し、相手方がその仕事の結果に対して報酬を支払うことによってその効力を生じる契約

https://keiyaku-watch.jp/media/kisochishiki/inikeiyakutoukeoikeiyaku
確認テスト 基礎編2.2 (易) 期待値の定義

## 方針

[2.4](https://qiita.com/ut-tokei/items/98b3f81287928168cfb6)で確認した通り，前者を最小にするtは期待値で，後者を最小にするtは中央値である．よって期待値，中央値を求める問題と置き換えることもできるし，2.4と同様に最小化問題として前者は平方完成，後者は微分して一階条件を求める形でも良い．

## 答案

![確認テスト 基礎編2-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/96806c46-0ebe-919f-412a-d42c70e1d5cf.jpeg)
![確認テスト 基礎編2-3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/a454aff1-e2a0-718e-0256-3beef9981039.jpeg)

## 参考文献

- 『[現代数理統計学の基礎](https://www.kyoritsu-pub.co.jp/bookdetail/9784320111660)』(久保川達也　著)
Accessでテーブルのカラム属性（値要求などのプロパティ）を一括変更

# やり方

DDL（SQL）でなく下記のような使い捨て関数を用意してキック。

```vb:全てのカラムの値要求をいいえにするサンプル関数
Private Function DdlSample()
    
    Dim dbs_ As DAO.Database: Set dbs_ = CurrentDb
    Dim tdf_ As DAO.TableDef: Set tdf_ = dbs_.TableDefs("テーブル名")
    
    Dim fld_ As DAO.Field
    For Each fld_ In tdf_.Fields
        fld_.Required = False '値要求
    Next

End Function
```


# 参考サイトさん

https://okwave.jp/qa/q5504734.html

# バージョン

Windows 10 Pro 21H2 OSビルド 19044.1889
Microsoft Access for Microsoft 365 MSO (バージョン 2207 ビルド 16.0.15427.20166) 32 ビット
確認テスト 基礎編2.1 (易) 条件付き確率の典型問題

## 方針

類題は[1.5](https://qiita.com/ut-tokei/items/83297ec6bb5093753951)．

## 答案 

![確認テスト 基礎編2-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/eb83004e-6f62-07e1-f5be-983540ba7f0f.jpeg)

## 参考文献

- 『[現代数理統計学の基礎](https://www.kyoritsu-pub.co.jp/bookdetail/9784320111660)』(久保川達也　著)
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)への対処

docker-composeで生成したコンテナのMySQLへログインしようとしてパスワードを何度見返しても
```
ERROR 1045 (28000): Access denied for user 'testpass'@'localhost' (using password: YES)
```
と怒られてしまい入れないことで何時間も溶かしました。ﾁｸｼｮｰ

```docker-compose.yml
~省略~
    environment:
      - MYSQL_USER=testpass
      - MYSQL_PASSWORD=testpass
      - MYSQL_ROOT_PASSWORD=testpass
```
でenv設定していました。mysql:8.0を使用。

結論として以下の方法でうまく行きました
## volumeを削除して入れ直す
```
docker-compose down -v
docker-compose up -d
```
にてvolumeにてdocker-composeで設定したvolumeもろとも入れ直し。
※volumeの中身が消えてしまうので怖い人は名前を指定して削除しても良いかも。

```
docker volume ls 
docker volume rm ${VOLUME NAME}
```

これでログインできた
```
 docker-compose exec db sh -c 'mysql -utestpass -ptestpass'
 mysql>
```
### 原因
docker環境構築にまだ慣れておらず、iamgeファイルを削除すればvolumeやnetworkなども消えていると思い込んでいました。
そこでvolumeを入れ直したところ無事にログインできました。

```docker-compoes.yml
~省略~
volumes:
  mysql_test_volume:
    name: mysql_test_volume
```
name: mysql_test_volumeの名前と同名で過去にvolume生成していました。おそらく古いvolumeにおけるSQLのログインパスが必要だったのか、それ以外の理由でエラーが起こっています。

stack overflowの回答に助けられました。

参考：<a href="https://stackoverflow.com/questions/59838692/mysql-root-password-is-set-but-getting-access-denied-for-user-rootlocalhost">MYSQL_ROOT_PASSWORD is set but getting "Access denied for user 'root'@'localhost' (using password: YES)" in docker container</a>

## 他に試していたこと
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)のエラーの記事はよく見かけました（volume起因のものはほぼありませんでしたが）。

volumeで上手くいかなかった人は試してみる内容になるかと。

### パスワードをワンライナーで入力する
```
docker-compose exec db sh -c 'mysql -utestpass -ptestpass'
```
の -ptestpass なのですが、-pオプションにいたってだけはなぜか -p testpass ではなく -ptestpass にしなければなりません。
ちなみに-uオプションは-u testpassでもログインできます

### パスワードを無視してログインする
bash上で MYSQLD_OPTS="--skip-grant-tables" のenv環境設定するとパスワード無視してログインできるようです。
しかし通常では使いたくない手法。

詳細は下の記事をどうぞ。
参考：<a href="https://onoredekaiketsu.com/can-not-root-login-to-mysql-with-error-1045-28000/">ERROR 1045 (28000):でMySQLにrootログインできない場合の対策</a>


### ログイン方法を変えてみる

```
docker exec -it ${コンテナID or コンテナ名} mysql -u testpass -ptestpass
```
or
```
//bashへ入ってからログインする
docker exec -it ${コンテナID or コンテナ名} bash 
mysql -utestpass -ptestpass
```

Dockerの操作は時間が経つとすぐに忘れてしまう。ﾂﾗｲ
DOMに動きをつける Animation (JavaScript, CSS)

JavaScript の Animations API, CSS の animation を使って簡単に画面の要素(DOM)に動きをつけることができる
キーフレームで変化させるスタイルを指定してタイミングプロパティで変化の間隔や回数が指定できる
使い方を簡単に記載、細かい設定はまだまだある．．．


## DOM に動きをつける設定方法 `animate(キーフレーム, タイミングプロパティ)`
```JavaScript
let dom = document.getElementById('id');

dom.animate(
    // キーフレーム ⇒ スタイル名: [値1, 値2...]  # 値1～2～...と徐々に変化
    {
        backgroundColor: ['red', 'blue', 'red']
        , fontSize: ['10px', '25px']
        , transform: ['rotate(0deg)', 'rotate(360deg)']
        , width: ['10%', '50%', '100%', '50%', '10%']
    }
    // タイミングプロパティ ⇒ タイミング名: 値
    , {
        duration: 3000  // 変化の間隔(ms)
        , iterations: Infinity // 繰り返し回数, Infinity は無限
    }
);
```
## CSS て設定する `animation`, `@keyframes`
```CSS
/* @keyframes 名前を設定, 0%, 50%, 100%.. などパーセントで変化中のCSSを設定 */
@keyframes keyframename {
    0% {
        background-color: red;
        font-size: 10px;
        transform: rotate(0deg);
    }
    50% {
        background-color: blue;
    }
    100% {
        background-color: red;
        font-size: 25px;
        transform: rotate(360deg);
    }
}
/* animation "-" でプロパティを指定して値を設定 */
.classname {
    animation-name:keyframename;  /* @keyframes で設定した名前に合わせる */
    animation-duration: 3s;
    animation-iteration-count: infinite;
}
```
【iOS】アプリアイコンは正方形でいい。

## ※メモ程度の記事です。内容ペラッペラ

そうなのかーと気づいたので、備忘録ってほどでもないけど、とりあえずメモ。

### Appleのガイドラインにも記載あり（2022/8月現在）

https://developer.apple.com/design/human-interface-guidelines/foundations/app-icons

> Design your icon as a full-bleed square image. On most platforms, the system applies a mask that automatically adjusts icon corners to match the platform’s aesthetic.

意訳すると、だいたいのOSがいい感じに角丸にするから、正方形でアイコン作ってねって感じ。

ちなみに、角丸でアプリアイコンを作ると、ホーム画面でアイコンを見た時に黒い線?（枠みたいな何か）が見えてしまう。

ガイドラインは定期的に読んだほうがいいですね:rolling_eyes:
[iOSアプリ]Apple審査前の準備についての備忘録

iOSでアプリを数個リリースし、知見も少し溜まってきましたが
リリース前にやるべきことが多く度々忘れる部分もあるので備忘録がてら残しておきます。

リジェクトされやすい項目も上げておきます。

※証明書関連は本記事では説明しません


## スクリーンショット関連

解像度が一致すればシュミレーターの機種はなんでもいいのですが、
自分はいつも下記でやっています。


#### ・5.5インチ用（１枚以上用意）

サイズ：1242 x 2208
機種: iPhone８Plus

#### ・6.5インチ用（１枚以上用意）
サイズ：1242 x 2688
機種　iPhone13ProMax


※シュミレーターのスクショについて
・`Command ＋　shift + 4 、Enter`を押しシュミレーターを選択する
・`option`を押しながら撮影する
そうすると、影がなくなるので加工時に便利です。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1112697/8d1f909d-446a-54a1-7d90-5ea78ddffd2e.png" width="３00">


## アイコン関連

いつも下記サイトで全サイズを生成しています。

https://appicon.co/#app-icon

iOSだけでなくAndroid用もいけるみたい👀

作成したアイコン用画像をアップすると、ファイルを生成してくれます

![スクリーンショット 2022-08-04 12.13.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1112697/99e7978b-6bfa-baba-3bef-55a3df092b1b.png)

そしてAssets.xcassetsの中にある`Applcon`をXcodeのAssets.xcassetsにアップするだけです。

※ドラック&ドロップでアップできますが、その際下記のようにAppIcon-1と生成されてしまう場合があります。

![スクリーンショット 2022-08-04 12.09.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1112697/69bad924-d5e4-457b-c12a-0371e4dd4fd8.png)


するとarchiveビルド時にエラーがでてしまうのでAppIconの方を削除して、AppIcon-1　→ AppIconと修正しましょう。


## AppStoreConnectについて

記載ミスや記載忘れがあるとリジェクト対象になるのでしっかり記入しましょう。

### 記載忘れがちな箇所
- 年齢制限指定
- 価格設定
- プライバシーポリシーURL
- データタイプ
- サポートURL
    - GoogleフォームのURLだけではNGだったので、mailアドレス記載のURLが良い
- マーケティングURl
- 連絡先情報
    - サインインがあるかに関わらず必要。電話番号は`+81~`で記載する

## アプリのarchiveビルド（アップロード）

- Xcodeを起動してProducts→Archiveを選択
- アーカイブビルド成功後、DistributeAppを選択
- Select a destinationの中からUploadを選択してNext
- 「Include bitcode for iOS content」と「Upload your app's symbols to receive symbolicated reports from Apple」にチェックを入れてNext
- 「"アプリ名" needs to be signed for App Store Connect distribution.」と質問されたらAutomatically manage signingを選択
- アーカイブの詳細情報が表示されたらUploadを選択
- 「App "MyApp" successfully uploaded.」がでたら成功

## リジェクトの理由

### ・アプリの説明・記載不足
上記でも説明した、記載漏れが原因でリジェクトされます。
マーケティングURLやプライバシーポリシーがしっかり確認できない場合も同様です。

### ・サインイン情報の記載忘れ
SNSなどのサインイン機能がある場合はレビュー時用のサインイン情報を記載する必要があります。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1112697/cd6baac3-2ab8-3630-c057-cc9b812f5745.png" width="300">

### ・アクセス許可時の説明不足

アプリ内でカメラ・写真ライブラリを使用する際にその目的を表示させていないとリジェクトされます。

下記のようにinfo.plistで記載しましょう。
![スクリーンショット 2022-08-04 14.15.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1112697/197b20bf-5ce3-d8a2-73ea-d916a8e46496.png)

自分の場合はアイコン設定時のみの使用だったので
`アプリに表示・使用するための写真や動画をライブラリから選択する目的でリクエストします`
と記載しました。

## アプリの説明文が不十分
説明文がシンプルすぎるとリジェクトをくらいます。
機能などしっかり記載しましょう。

## 個人情報の取得

アプリが立ち上がっていきなりサインインさせる、のような会員登録ありきのアプリはダメと怒られます。

SNS系アプリの場合だっだら、説明すれば審査通るみたいですが個人開発だと厳しそう・・（説明しましたが何度もリジェクトされました）

なので、あとからサインインさせる機能が現実的かと思います。
AWS AmazonLinux2 EPELリポジトリ設定

# 概要
- OS初期設定時に必要な設定の一つ
- 以下の2点についてまとめた
    - リポジトリの設定：EPELリポジトリについて
    - yum updateにて最新化

# リポジトリの設定：EPELレポジトリについて
- EPELとは、
    - [CentOSなどで使う、EPELってなんだ？](https://qiita.com/charon/items/f5732694515d174851b3)
    - EPELは、Extra Packages for Enterprise Linuxの略
    - エンタープライズLinux用の高品質な追加パッケージセットが含まれている
    - 標準のリポジトリでは提供されていないパッケージを利用することが可能

# Amazon Linux2でEPELリポジトリを利用する方法
- [AWSサイト](https://aws.amazon.com/jp/premiumsupport/knowledge-center/ec2-install-extras-library-software/)
- [Amazon Linux 2のEPELレポジトリを有効にする](Amazon Linux 2のEPELレポジトリを有効にする)
- 上記2つのリンクを参考にEPELリポジトリを追加して、yum apdateを行う
```
// amazon-linux-extrasパッケージがインストールされていることを確認
# which amazon-linux-extras
/usr/bin/amazon-linux-extras

// 現在のリポジトリの確認
# yum repolist
読み込んだプラグイン:extras_suggestions, langpacks, priorities, update-motd
リポジトリー ID                      リポジトリー名                          状態
!amzn2-core/2/x86_64                 Amazon Linux 2 core repository          28,421
amzn2extra-docker/2/x86_64           Amazon Extras repo for docker               63
amzn2extra-kernel-5.10/2/x86_64      Amazon Extras repo for kernel-5.10         182
repolist: 28,666

// EPELインストールコマンドの実行
# amazon-linux-extras install -y epel

// update対象の確認
# yum check-update
読み込んだプラグイン:extras_suggestions, langpacks, priorities, update-motd
amzn2-core                                                  | 3.7 kB  00:00:00

// updateの実行
// 確認があれば[y]で進めてください。
// [完了しました!]が表示されればOK
# yum update

// update対象の確認
# yum check-update
読み込んだプラグイン:extras_suggestions, langpacks, priorities, update-motd
228 packages excluded due to repository priority protections
```

- yum updateの際に以下の標準出力がでる場合はリポジトリの優先順位を変更することででなくすることも可能
- [CentOSなどで使う、EPELってなんだ？](https://qiita.com/charon/items/f5732694515d174851b3)
- EPELコマンドを使うとき面倒になるので、無視してもいいかも？
```
// エラー
packages excluded due to repository priority protections
```
SSLの各種証明書について（csr, pem, der, cerなど）

# 各種証明書
|名詞|説明|
|-|-|
|x.509|公開鍵証明書の標準形式です。 各X.509証明書には、公開鍵、識別情報、およびデジタル署名が含まれています。|
|pkcs1~pkcs12|Public Key Cryptography Standard#12の略です。公開鍵証明書および秘密鍵をパスワードベースの対象鍵で保護し、安全に保存または転送するために使用されるファイル形式です。拡張子は*.pN,*.p12は鍵や証明書をひとつのファイルにまとめて取り扱うための形式|
|*.der|証明書のバイナリ保存形式|
|*.pem|証明書または鍵のbase64保存形式です。証明書または鍵を単独もしくはまとめて保存できます。|
|*.key|pem鍵の保存形式|
|*.cer *.crt|２つとも証明書のことを指します。Linuxはcrt、Windowsはcer。保存形式はpemまたはderでもできます。|
|*.csr|証明書署名リクエストのことです。証明書持ち主の情報が含まれています。例えば、ドメイン名、国、メールアドレスとか|

# CSR
CSRの中身を表示する
~~~
openssl req -in my-request.csr -text -noout
~~~
補足ですが、*.pem拡張子の証明書署名リクエストもあります。
~~~
openssl req -text -noout -in csr.pem
~~~
*.pemのCSRファイルを*.csrファイルの変換は下記のコマンドで変換できます。
~~~
openssl req -in csr.pem -out cert.csr
~~~
CSRなのかファイルの中身を確認しましょう。
ファイルの頭部
~~~
-----BEGIN CERTIFICATE REQUEST-----
~~~
ファイルの末尾
~~~
-----END CERTIFICATE REQUEST-----
~~~
上記のファイルはCSRファイルを指します。

# pem
PEMファイルは通常、拡張子付きで表示されます .crt, .pem, .cer, .key （秘密鍵の場合）が、異なる拡張子で表示される場合もあります。 

PEM証明書ファイルの内容を表示する
証明書の場合はopenssl x509 コマンドを使います。
~~~
openssl x509 -in CERTIFICATE.pem -text -noout 
~~~
DERエンコードされた証明書ファイルの内容を表示する
~~~
openssl x509 -inform der -CERTIFICATE.der -text -noout
~~~
PEM証明書をDERに変換する
~~~
openssl x509 -outform der -in CERTIFICATE.pem -out CERTIFICATE.der
~~~
DERエンコードされた証明書をPEMに変換する
~~~
openssl x509 -inform der -in CERTIFICATE.der -out CERTIFICATE.pem
~~~

# 秘密鍵と公開鍵
- RSA秘密鍵の生成
openssl genrsa コマンドを使うとRSAの秘密鍵を生成することができます。
~~~
openssl genrsa 1024 > private-key.pem
~~~
標準出力出力される鍵はPEMエンコードされているので、ファイル名も.pemとしています。

- RSA公開鍵の生成
RSAでは秘密鍵があればいつでも公開鍵を生成することができます。openssl rsa コマンドを使用して先ほど作成した秘密鍵を読み込ませ、-pubout で公開鍵を出力します。
~~~
openssl rsa -in private-key.pem -pubout -out public-key.pem
~~~
-outform オプションを指定していないので、PEMエンコードされた公開鍵が出力されます。

- 秘密鍵の中身を見る方法
~~~
openssl rsa -in private-key.pem -text -noout
~~~
上記は鍵ファイルがPEMエンコードされている場合でしたが、もしDERエンコードされている場合は -inform der というオプションを指定してください。
~~~
openssl rsa -in private-key.der -inform der -text -noout
~~~
- 公開鍵の中身を見る方法
~~~
openssl rsa -pubin -in public-key.pem -text -noout
~~~
Linux topコマンドとジョブについて（自分用メモ

プロセスの稼動状況を一定時間ごとに更新して表示するコマンドはtop。
topコマンドでは、プロセスごとのCPUやメモリの使用状況が確認できます。
デフォルトの状態では5秒ごとに表示が更新されます。「q」キーを押すとtopコマンドは終了。

システムの稼働時間や負荷平均などを表示するコマンドはuptime。
また、topコマンドの実行結果の1行目もuptimeコマンドの実行結果とほぼ同じ。



ジョブとはコマンドやプログラムをグループ化して管理するための単位です。例えば、複数のコマンドをパイプでつないで実行したものも、1つのジョブ。

コマンド(ジョブ)はフォアグラウンドまたはバックグラウンドで実行されます。コマンドをシェル上で実行すると、通常フォアグラウンドで実行されます。コマンドをバックグラウンドで実行するには、コマンドラインの末尾に「&」を付けて実行。


また、ジョブの動作(フォアグラウンドとバックグラウンド)を変更するには以下のコマンドを使用。

・fg
バックグラウンドで動作中または一時停止中のジョブを、フォアグラウンド動作に切り替えるコマンド。

・bg
一時停止中のジョブを、バックグラウンド動作に切り替えるコマンド。
ジョブを一時停止するには「Ctrl+z」キーを押下します。

なお、フォアグラウンドでコマンドを実行すると、コマンドが終了するまで別のコマンドを実行することができません。

また、現在バックグラウンドで動作している、または一時停止中のジョブはjobsコマンドで確認することができます。

「+」がついてるジョブはカレントジョブといいます。カレントジョブとは、直前にバックグラウンドで実行されたジョブ、または直前に一時停止されたジョブのこと。