OmniAICreator/Qiita-1.07M huggingface dataset:
昔使ったことがあるポートスキャンツールを想い出しながら使ってみた。

## はじめに
昔使ったことがあるポートスキャンツール（Zenmap）ってまだ使えるのか？
どういう情報が得られるのか？　思い出しながら使ってみました。
※今回はスキャンして出た結果を見る最低限の確認までとします。
![sitelogo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1525363/a206574e-2c59-e5f1-85aa-09f14a6132fa.png)

## やりたいこと
**・ポートスキャンとは？**
**・NmapとZenmapの違いは何か？**
**・環境構築をしてスキャンを行う**

## ポートスキャンとは？
>「ポートスキャン」はネットワークに接続されている、通信可能なポートをひとつひとつ順番に特定のデータを送信して、
その応答状況を調べることを指します。

**※下記から引用**
https://www.shadan-kun.com/waf/portscanning/

<font color="red">**ポートスキャンは、サイバー攻撃の準備とみなされることがあります。**</font>
<font color="red">**自己が管理しているサービスのセキュリティチェックにお使いください。**</font>

## NmapとZenmapの違いは何か？
「**Zenmap**」というツール名よりは「**Nmap**」の方が聞いたことがあるのかなと思います。
基本的には同じツールです！
「Nmap」は**コマンドから操作**、「Zenmap」は**GUIでの操作**となります。
今回は比較的とっつきやすい「Zenmap」を使っていきます。

## 環境
Windows10
Zenmap 7.93

## 環境構築をしてスキャンを行う
#### Zenmapのインストーラーをダウンロード

下記のリンクから環境にあったインストーラーを選択してダウンロードしましょう！
※「**Windows**」「**Linux**」「**Mac**」複数用意されています。
https://nmap.org/download

#### インストール
ダウンロードが完了したらインストーラーを起動し、インストールを開始してください。
![画像①.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1525363/dfa0edd0-3aad-c541-14b9-b4d983502e4c.png)

インストール手順に従って設定などについては任意で変更し完了まで進めてください。

#### Zenmap起動
Zenmapを起動してみましょう！
※デスクトップにショートカットがない場合、
インストール時に格納先を変更していなければ下記にexeファイルがあるかと思います。
```C:\Program Files (x86)\Nmap```
※デスクトップにショートカットを作ることをオススメします。

起動！
以前の記憶を想い出しながら。。。
やっていきます。
![画像②.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1525363/9a83db36-4f71-a94e-a9ad-1e839187b7e9.png)
Zenmapは起動してからスキャン開始までほぼ設定がいらないです。

まずは、どのIPに対してスキャンを行うかターゲット(IPアドレス)を決めましょう！
ターゲットを決めたら用意されている「**スキャンプロファイル**」または「**コマンド**」を設定してください。
※コマンドは多数ありますで下記を参考に！
https://nmap.org/man/ja/man-briefoptions.html

今回は事前に用意されている「**スキャンプロファイル**」から「**Intense scan,all TCP ports**」を選択してスキャンしてみます。
「**Intense scan,all TCP ports**」を選択するとコマンドに自動で値が入ります。
準備ができたら【スキャン】を選択します。
<font color="red">**※スキャン前にターゲットが間違っていないか再度確認してください。**</font>
![画像③.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1525363/34813872-7118-55be-c05a-cde7dbf232c2.png)
スキャンが完了すると下記の様な結果が表示されます。
今回はTCPポート1-65535をスキャンした結果が表示されてます。
![画像④.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1525363/905e5f0e-2248-4904-1944-d5b7373028a3.png)
スキャンでは、「**ポート情報**」「**プロトコル**」「**ポートの状態**」「**サービス**」「**バージョン**」が検知されました。
結果の中には「filtered」が1件検知されましたが他は「open」となっているポートが複数見つかりましたね！

今回は環境構築からとりあえずスキャンまでやってみる！までが目的なのでここまでとなります！！

### おわりに
久しぶりに使ってみましたが、問題なくスキャンできました。
今回のスキャンでも「ポートの状態」や「サービス」「バージョン」などの情報がとれましたが、OSに依存する脆弱性を狙って攻撃をする材料にも使われる恐れがあります。
皆さんが運営しているサービスでも不要なポートや脆弱性があるポートが解放されたままとなっていないか今一度チェックするのはいかがでしょうか。

紹介した内容以外にも「Zenmap」には多数の機能があります！
ただ、まだ使ったことがなく・・・調べながらまた続きを記載できたらなと思ってます。
ここまで見て頂いてありがとうございました！
微力ながらこの記事が参考になればと思います。

### 参考資料
一部の説明やコマンドについて下記よりお力をお借りしました。

■ポートスキャンについて
https://www.shadan-kun.com/waf/portscanning/

■コマンドやその他オプションについて
https://nmap.org/man/ja/man-briefoptions.html
CoroutineWorker がキャンセルされたときの後始末をしたい


Kotlin 使いには、CoroutineWorker がとても便利なのです.

Workerがキャンセルされたときに後始末をしたかったので、onStopped() でやればいーやと思ったのですが、
final がついているので override できませんでした（泣）

なぜ final になっているかというと、内部で確実にCoroutine　を停止するためでした。
``` kotlin:CoroutineWorker
    public final override fun onStopped() {
        super.onStopped()
        future.cancel(false)
    }
```

Workerがキャンセルされたときの後始末をおこなう、実装サンプルです。

```kotlin:sample.kt

package sample

import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import androidx.work.*
import java.util.*


class MyWorker(val context: Context, params: WorkerParameters) :
    CoroutineWorker(context, params) {

    override suspend fun doWork(): Result {
        runCatching {
            return workSomething()
        }.onFailure { throwable ->
            // Worker が キャンセルされると
            // kotlinx.coroutines.CancellationException が発生する 
            // (実態は JobCancellationException)
            cleanup()
        }
        return Result.success()
    }

    private fun workSomething(): Result {

        // ...

        return Result.success()
    }

    private fun cleanup(): Result {

        // 後始末をする処理
        // ...

        return Result.success()
    }
}

var workerId: UUID? = null

fun startWorker(context: Context) {
    val manager = WorkManager.getInstance(context)
    workerId?.let {
        // Worker が動いているかチェック
        val isRunning = manager.getWorkInfoById(it).get().state == WorkInfo.State.RUNNING
        if (isRunning) {
            // Worker をキャンセルする
            manager.cancelWorkById(it)
            return
        }
    }
    val myWorker: WorkRequest = OneTimeWorkRequestBuilder<MyWorker>()
        .setInputData(workDataOf())
        .build()
    workerId = myWorker.id
    // worker を起動する
    manager.enqueue(myWorker)
}

```
sliceメソッドの使用方法

# sliceメソッドとは
sliceメソッドとは、配列や文字列から指定した要素を取り出すことができるメソッドです。

    # 配列を作成します
    array = [0,1,2,3,4,5,6]
    
    # 配列から引数で指定した要素を取得します
    ele1 = array.slice(1)
    puts ele1
    #=> 1
    
    # 配列番号-4から4つ分の要素をsliceします
    ele2 = array.slice(-4,4)
    puts ele2
    #=> 3, 4, 5, 6

# 配列はもとのままです
puts array 
#=> [0,1,2,3,4,5,6]
過去の自分に教えてあげたい！if文編。

2022/09/08
読んで欲しい人


3ヶ月前の私。
それと、プログラミング初学者の方。または、プログラミングを教えている人。


なぜ、Qiitaでブログを書こうと思った理由は私のつまずきってもしかしてSSR+（スーパースペシャルレア+）なのでは？と思ったからです。
このSSR+級のつまずきを言語化すれば

①私の'できなかった'を'できる'ようになる

②初学者の方は自分の成長が見えにくいと思うので小さい事から自分を褒めてあげる習慣をつけませんか？っていう提案

③プログラミングを教える側の方たちにも初学者だった頃を思い出して欲しくて書きました。


で、本題。

結局、私は今回、何でつまずいたかというと、、、
if文の中括弧の開始と終了がどこの位置に書いてあるかが理解できませんでした。

例

```js
if(age >= 20){
	result = '成人';	
} else {
	result = '未成年';
}
```

こちらを見て皆さんは
条件分岐を使って20歳以上は成人、それ以外は未成年と出力するプログラムと理解すると思います。

しかし私には、

`else` が `}{` に囲われているゾ
　
`} else {`　←がelseの書き方だと思っていました。

if文の中括弧の閉じかっこがどこに書いてあるのかが理解できないまま3ヶ月の時が経ちなんとなくif文の例題をまじまじと見ていたら
ifの終了の中括弧ってelseのeの左じゃね？って気づいたら世界が一気に明るくなりました。


`} else {`　に見えた原因はなんだったのか。

【例1】

```js
if(age >= 20){
	result = '成人';	
} else {
	result = '未成年';
}
```

例1を例2にように書く文化だったら私は　} else {　に見えてしまう病に罹らなかったかもしれない説

【例2】

```js
if(age >= 20){
	result = '成人';	
} 
else {
	result = '未成年';
}
```

【例2】の書き方はどの教材（千円程でサブスクできる教材）にも記載がないので一般的ではないのはわかるけど
なぜ、ifの終了中括弧と同じ行にelseを書く文化になったのか気になります。
この件に関してはいつか深掘りできたらいいなと曖昧にしておきます。


おわりに


初学者は思わぬところで躓いたり、モチベが下がったり、応用問題が解けただけで天才プログラマー気取りします。
よく耳にする'初学者'さえも初耳でした。
初心者と何が違うところから調べ、字の通り初学者は学問のみを対象としているようでした。
Stable Diffusion(画像生成AI)をローカルインストールしてみた

初めてNxバックエンド勉強会で発表したのでその内容をまとめる。
# Stable Diffusion(画像生成AI)をローカルインストールして実行してみた
実行した環境は
- windows11 pro
  Intel(R) Core(TM) i9-12900 
  GPU なし
- mac book pro 
 2019 model intel core i9
 GPU なし
- ubuntu20.04
  GPU Nvidia GeForce RTX 3070

以上の三つの環境でStable Diffusionを動かした。
### 用いたgithub
https://github.com/huggingface/diffusers

こちらのgithubを使って実行した。詳しい説明はしないが、README.mdの通りにやっていきながらエラーが出たらpipやcondaでインストールをしていきながら進むと実行できる。
私の環境だと、windowsとmacはpipでインストールをしてubuntuではcondaでやっていくとうまくいった。
またubuntuでGPUを使うときはcudaをインストールして実行する。

## 実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961973/a70475e6-e845-41b3-9b6f-d69811a2a7dc.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961973/c115823c-44d8-1a86-1428-23d606b37a29.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961973/989a6cb6-b4f9-3e7f-8ef7-282d80b3bc1e.png)

実行したコマンドは忘れてしまったがだいたいイメージとあった画像が出てきてくれている!
精度良い画像をだしたかったので以下のサイトを使った。

https://samezi-but.com/toaru-ai-no-prompt-generater-for-midjourney/

ここで気になったのが実行スピードだ。
### 実行結果比較
- windows11 pro Intel(R) Core(TM) i9-12900 
  2分45秒

- mac book pro 2019 model intel core i9
 7分30秒

- ubuntu20.04 GPU Nvidia GeForce RTX 3070
 20秒 

この結果を見るとGPUの凄さがわかる。

## なぜNx勉強会に参加したか
このStable Diffusionをelixirで実行してみようとしているからだ。
Axonを使ってみたところ出来そうだと感じた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961973/8b1c3bfe-6634-5e2f-1574-266d26fb73fb.png)
このようにモデルを簡単に可視化できるのでとても便利だ。
~~~
model =
  input
  |> Axon.dense(128, activation: :relu)
  |> Axon.batch_norm()
  |> Axon.dropout(rate: 0.8)
  |> Axon.dense(64)
  |> Axon.tanh()
  |> Axon.dense(10)
  |> Axon.activation(:softmax)
~~~
またこのようにmodelをパイプラインで繋ぐことができるのでとても気持ちがいい。
そしてAxonOnnxというライブラリがあり、onnxの学習済みデータがあるので実行してみたいという発表で終わった。
divで囲まれたimgタグの下になぜか4pxスペースが存在する問題の解決方法について


# 解決法
imgタグに`vertical-align: bottom;`もしくは`display: block;`を追加する

# なぜこのようなことが起こるのか
次のリンクに詳しい解説があります。

https://stackoverflow.com/questions/5804256/image-inside-div-has-extra-space-below-the-image

デフォルトではimgタグはインライン要素で表示されます。
そのため例えば、適当な文字列(`abcde`)と画像を横並びにすると`画像の下枠`と`文字のベースライン`が一直線に並びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1351846/35ffab86-8214-6734-05cd-ca69070d8e02.png)

ところが、`g` `j` `q`などの文字列と一緒に並べると下のほうが少しだけはみ出してしまいます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1351846/9a0d63c8-e994-09c3-e90a-1ee9cbb7dc33.png)

このはみだしが4px分の隙間を生んでいます。

imgタグに`vertical-align: bottom;`を設置することでベースラインの位置が上手く調整されて(g,j,qのはみ出しがなくなる)この4pxの謎のスペース問題が解決されます。

### 備考
この問題は、そもそもimgがインライン要素として配置されることに起因しているため、imgタグに`display: block;`を追加してブロック要素として表示することでも解決することができます。
Z値変換(Z-Score)

[Teradata Vantage - Vantage Analytics Library](https://docs.teradata.com/r/Vantage-Analytics-Library-User-Guide/January-2022)[2022/9/22時点]の翻訳です。
(リリース番号 : 2.1.1 | リリース日 : January 2022)
> この記事はVantageアナリティクスライブラリ シリーズのコンテンツです。

# 概要
Z値変換を使用して、数値列を列値の平均値と標準偏差に基づくZ値に再スケールします。各列の値は、この式を使用して、列の平均値からの標準偏差の数に変換されます。

# 前提条件
・Teradata Vantageインスタンスにアクセスできること。
・Vantage アナリティクス・ライブラリがインストールされていること。

::: note info
Vantage アナリティクス・ライブラリのインストールについて、既にVantageを導入頂いているお客様はTeradataサポートサービスにお問い合わせください。
Vantage Express (評価版)やクラウドサービスのDIYでご利用頂く場合は[Teradata Dounload](https://downloads.teradata.com/download)からダウンロードし利用可能です。
Vantage アナリティクス・ライブラリのインストール手順は「[Vantageアナリティクス・ライブラリのインストール](https://qiita.com/ykswi/items/12d0da2ac69b4b161881#vantage%E3%82%A2%E3%83%8A%E3%83%AA%E3%83%86%E3%82%A3%E3%82%AF%E3%82%B9%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)」の記事に従い行います。
:::

# データの準備
## サンプルデータの入手とデータベースへの格納方法
こちらの「[チュートリアル用のサンプルデータを用意する](https://qiita.com/tmsky/items/4d86ca35aef753290020)」を参照ください。


# 実行方法
## SQLから実行する場合の例
```SQL
CALL td_analyze (
  'vartran',                          /* 分析手法　*/
  '
  database        = QID;              /* データベース名 */
  tablename       = Superstore;       /* テーブル名 */
  zscore = 
     zscore = columns (sales,quantity)
  ;                                   /* 導出項目の定義 */
  '
);
```

:::note information
出力結果をテーブルに書き込む場合は以下オプションを指定可能です。
outputdatabase = 出力データベース名;
outputtablename = 出力テーブル名; 
overwrite = {true | false}; --- 未指定の場合はtrueで上書きします
:::

## 出力結果
データ量が多いため上位10件を表示しています。
|Sales|Quantity|
|:-|:-|
|-0.25142891728253014|0.9934507321230805|
|-0.3272359533218057|0.5440121998321898|
|-0.3385001433352617|-0.35486486474959156|
|0.8653946629404943|0.09457366754129916|
|-0.34387229549552534|-0.35486486474959156|
|-0.30547777432145484|-1.253741929331373|
|0.27297528833536583|-0.8043033970404823|
|-0.33783905412079673|-0.8043033970404823|
|-0.03219761341380314|-0.8043033970404823|
|-0.35334576812222673|0.9934507321230805|
|～|～|

# おわりに
:::note information
サンプルコードはSQL関数から掲載し順次Pythonコードも掲載していく予定です。
:::

:::note warn
警告
この本書は[Teradata Vantageドキュメンテーション](https://docs.teradata.com/)よりトピックに必要な情報を抜粋したものです。掲載内容の正確性・完全性・信頼性・最新性を保証するものではございません。正確な内容については、原本をご参照下さい。
また、修正が必要な箇所や、ご要望についてはコメントをよろしくお願いします。
:::

#### Teradata Vantageへのお問合せ
[Teradata Vantage へのお問合せ](https://www.teradata.jp/About-Us/Contact)
【超初級】GitからファイルをGithubに上げれるようにするまで

# レクチャー動画を見てもちんぷんかんぷん級にGitが全然使えなかったため1から勉強しました！
主な学習法は上司に聞く。（これ1番効果あり！！）
GitHubにアップすることができるようになるよ！

# 目次
1.[Githubでリポジトリ作成](#1-Githubでリポジトリ作成)
2.[クローンの作成](#2-クローンの作成)
3.[ファイルをクローンに追加する前作業](#3-ファイルをクローンに追加する前作業)
4.[クローンにファイルを追加していく！！](#4-クローンにファイルを追加していく！！)
5.[追加したファイルをローカル→Gitにあげていく！！く](#5-追加したファイルをローカル→Gitにあげていく！！)
6.[とうとうcommitの出番！](#6-とうとうcommitの出番！)
7.[伝説のプルリクの出現](#7-伝説のプルリクの出現)


# 1.Githubでリポジトリ作成
（なんとかがんばってくれ。。。すみません後で追記します）
# 2.クローンの作成
Git Bash（Win）/ターミナルを起動してコマンドを叩いていくよ～！
## クローンを作成する
```
 C:\Users\(ユーザー名)\(格納先)\(Gitフォルダがあるところ)
git clone https://github.com/(アカウント名)/(リポジトリ名).git
```

## 既にクローン作成してある場合
手順3に進む
# 3.ファイルをクローンに追加する前作業
クローンのディレクトリに移動していく
```
cd (リポジトリ名)
```

ブランチ切って
```
git branch init-branch origin/main
```
チェックアウトする
```
git checkout init-branch
```
# 4.クローンにファイルを追加していく！！
・プッシュ対象ファイルをサーバからダウンロード
・カレントディレクトリにプッシュ対象ファイルをすべて格納

### ▼格納状況の確認　
```　
git status
ls -la
```

# 5.追加したファイルをローカル→Gitにあげていく！！
addは追加で-AはALLって意味だよ！
このコマンドでローカルのGitに新しいファイルを追加することができるよ！
```
git add -A
```
### ▼格納状況の確認
```
git status
```
# 6.とうとうcommitの出番！
コミットまで進むとゴール目前を感じるね？！
ここまで進んだらなんの迷いもなくコミットしてやりましょう！
```
git commit
```
するとどうでしょう！git commit入力後に謎の操作を求められます。。
commit commentを求めてきたんだが。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2480815/e19e9ff5-d33a-a2ac-d2c4-3a9df62d1161.png)
そんなときはこうするよ！
iを入力→INSERTとなりコメントが入力できる
入力をやめるときはEsc

:wqで保存＆Quitしてコメント入力は完了！

# 7.伝説のプルリクの出現
最後にこのコマンドを叩いてやりましょう
```
git push origin init-branch
```
## 無事にgit push origin init-branchまで進むと伝説のプルリクが！！！？
GitHubを開いて更新をするとどうでしょう。
新たなボタンが発生していて、そこにはCompare & pul requestが発生してます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2480815/d5c0c280-f501-5812-3f05-ed68d0dfb114.png)

ここからはGitHub上でMargeしていって完了！！
Leetcode 1894. Find the Student that Will Replace the Chalk


# 1894. Find the Student that Will Replace the Chalk

https://leetcode.com/problems/find-the-student-that-will-replace-the-chalk/description/

例を確認して考えている通り実装

```java
class Solution {
    public int chalkReplacer(int[] chalk, int k) {
        int index = 0;
        while (0 < k - chalk[index]) {
            k -= chalk[index];
            if (index < chalk.length - 1) {
                index++;
            } else {
                index = 0;
            }
        }
        return index;
    }
}
```
配列と文字列の変換

# 配列から文字列へ変換
```rb
irb(main):017:0>  ["1", "2", "3", "4"].join(",")
=> "1,2,3,4"
```
### 出典
https://docs.ruby-lang.org/ja/latest/method/Array/i/join.html

# 文字列から配列へ変換
```rb
irb(main):018:0>   "1,2,3,4".split(",")
=> ["1", "2", "3", "4"]
```
### 出典
https://docs.ruby-lang.org/ja/latest/method/String/i/split.html

https://qiita.com/beanzou/items/a9253ee083aeac9fc608

# 感想
基本だけど忘れていた。
使い所が出てきてよかった。
Win11で.batを動かそうとしたらtimeoutが使えない？？

- 久々に動かそうとした.batファイル
- timeoutが効いていない模様？
- Powershellから直接timeout 3とか入力したら正常にtimeoutできる
- batの時だけ？？？
- とりあえず時間が無いので、追及はここまで

## 解決策
timeoutをpowershell sleepに書き換え
powershell sleepもデフォルトではミリ秒ではなく秒
1年間365日 草を生やし続けて見えた景色


## 草 生やしてますか？

#### そもそも草とは
Githubのコミットを可視化した緑のやつです。　
コミットして緑でコマを塗りつぶすことを「草を生やす」と言うそうです。


#### なぜ私が草を生やしだしたのか
エンジニアに就職する際にGithubのコミットを参考程度に見てもらえることがあると知った私はとにかくコミットして草を生やすようになりました。
無事に就職した後も下記の記事を参考に何か良いことがあるんじゃないか、とまずは1年間草を生やし続けてみる挑戦をはじめました。


https://qiita.com/mizo_k/items/c2aba14e77f5fc6f7483

## 継続するために意識したこと
#### 習慣化するまでは継続することを優先する
雑草でもいいから草を生やすことを意識しました。
issueを上げるだけ、コードを整理しただけのコミットも存在しますが
**継続することが最優先**なので中身は気にしません。

#### 続けられる、続けたいことをやる
継続できる内容から徐々に中身を充実させます。やりたくないことはなるべく排除しました。

![スクリーンショット 2022-11-10 8.55.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1201315/0bc592c1-4569-072a-878f-2acb57bca887.png)


#### 継続し歯磨きレベルまで習慣化
いつの日か意識して継続していたことが習慣となり生活の一部になります。
結婚式当日だろうと新婚旅行中だろうと歯は磨きます。毎日歯を磨くよう、毎日コードを書きます。
さすがに結婚式当日は継続を意識しましたが苦ではありませんでした。


#### その他
- **数字や視覚的に継続していることが分かるようにする(個人的に結構重要)**
- 継続していることを周囲に発信する。(Twitterで発信してました。)
- 継続の準備をする。　継続と呼べるか怪しいですが翌日のコミット分を前日に作成しておいた日もありました。キャンプの前日はこの技を使いました。

こちらの記事はとても共感できる内容でした。

https://www.xserver.ne.jp/blog/how-to-habituate/


## 継続して得られたこと
#### 開発、勉強が習慣になった
習慣になるのが継続の最大のメリットだと思います。

#### 達成感
自己満足の世界ですが数字や視覚的に積み上がっていくのを見るのは楽しいです。
365日コミットした先に大草原がありました。これが１年間草をはやし続けて見えた景色です。いい眺めですね。
![スクリーンショット 2022-11-10 8.32.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1201315/45bbb586-bd7f-06c5-2421-862bb2bae400.png)

#### 副産物
開発に関する知識
個人開発アプリを4つリリース


## 所感
よく見る継続の法則です。
知識に関してはこの法則は当てはまらず足し算でたまに相乗効果が生まれることがあるくらいな気がします。
技術は進化していくので1.01じゃ足りません。毎日10足すくらい頑張ります。
![スクリーンショット 2022-11-10 8.12.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1201315/65932766-87d7-bbcd-9219-2f6023b21f98.png)




## まとめ
ここまで習慣、習慣と言いましたがやっぱり生きていく上で必須なことでなければ忘れてしまう日もあります。
最近は草を生やせない日もありました。それでも継続して得られたものは大きいです。
**あなたも365日草チャレンジしてみませんか？**



冒頭で紹介した「子育てしながら~」の筆者のまとめが私の言いたいことと一致したので紹介します。
- 自分は何かを毎日継続することができる
- 少しずつでも毎日継続することで、いつか大きな成果となる
- 人生、何かを始めるのに遅すぎるということはない
引用 - https://qiita.com/mizo_k/items/c2aba14e77f5fc6f7483

参考記事
https://minchalle.com/blog/forming-habits#5-6
Minecraftサーバ（統合版：bedrock_server）をバージョンアップする

前回記事↓の続きです。
https://qiita.com/ABK28/items/1a6deb9ae227bb2812f7
https://qiita.com/ABK28/items/df16c4822994527f4196


# 期限切れ？
しばらく使っていなかったら、「接続できませんでした：サーバーが期限切れです！」なってしまいました。
アプリがバージョンしているのに、サーバが古いからだそうです。
とうわけで、バージョンアップすることにしました。

# 手順

## 先ずはバックアップ
設定ファイルが消えないように、マルっとバックアップしちゃいます。
ほんとは必要なものだけでいいと思う・・

いつものように、めんどくさいっていう理由で、sudo suしちゃって作業してます。
```
$ sudo su
```

ちなみに、フォルダ名は、前回構築時のフォルダ名です。
```
# cd
# cp -r ./bedrock_server ./bedrock_server_bk
```

## 最新サーバアプリのダウンロード
新しいバージョンのzipのURLを確認します。
``
https://www.minecraft.net/ja-jp/download/server/bedrock/
``
ダウンロードのボタンがありますので、マウス右ボタン？で、リンク先をコピーします。 

そして、wgetしときます。
```
# cd　bedrock_server
# wget https://minecraft.azureedge.net/bin-linux/bedrock-server-1.19.41.01.zip
```

## 展開します。
```
# unzip bedrock-server-1.19.41.01.zip 
```

## バックアップから設定ファイルをもどします。
```
# cp ../bedrock_server_bk_20221110/permissions.json .
# cp ../bedrock_server_bk_20221110/server.properties .
# cp ../bedrock_server_bk_20221110/allowlist.json .
```

## 構築時に作ったスクリプトで再起動します。
```
# ./brs_script.sh stop
# ./brs_script.sh start
```

# 完成

めでたしめでたし。
PostgreSQLでデータベースを削除しようとしたときに「他にこのデータベースを使っている １ 個のセッションがあります。」のメッセージに遭遇したら

## PostgreSQLでデータベースを削除しようとしたときに「他にこのデータベースを使っている １ 個のセッションがあります。」のメッセージに遭遇したら

### データベースの削除を試みる
```sql
drop database "Implem.Pleasanter";
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481749/136cdac5-db43-a30d-5187-32a1d2dcb896.png)

### セッションの特定
使用しているセッションを確認します。
```sql
select * from pg_stat_activity;
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481749/0e623d59-dc0c-578d-d809-af567c411f00.png)

### プロセス切断
確認したpidをもとに以下のSQLでプロセスを切断します。
```sql
select pg_terminate_backend(12852);
select pg_terminate_backend(28480);
```
pgAdmin上で上記SQLを実行すると、以下のように新しいセッションを確立しようとするので、Cancelします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481749/83cf3690-ed4b-409d-ef89-21988c52803a.png)

### 再度データベースの削除を試みる
再度データベースをdropします。
```sql
drop database "Implem.Pleasanter";
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481749/e21d46cd-da1f-84fd-9f40-11d748e2ebf8.png)
ハッシュから任意のキーのバリュー（値）を取得する方法

# はじめに
ハッシュから値を取得する方法について、曖昧に覚えていた部分があったので整理のためまとめます。
間違った解釈をしていたらご指摘ください。

## ハッシュの取り出し方
例えば以下のようなハッシュが存在するとする

    user = {name: タロウ, age: 15, height}

userというハッシュ名から任意のキーのバリュー（値）を取り出すためには、

    puts user[:name]
    ⇨"タロウ"

ここで少し落とし穴がある。
railsで開発を続けていると、ついついテーブルの値を取得する延長線上で

    puts user.name

で値を取り出したくなるが、これでは「nameの変数が未定義ですよ」とエラーが出ます。

これはなぜ起きるのか・・・
ズバリ原因は、ゲッターセッターが定義できているかと、ActiveRecord::Baseの存在のせいです。

## ゲッター、セッターとは
以下の記事を参考にしました。

https://qiita.com/k-penguin-sato/items/5b75be386be4c55e3abf

https://qiita.com/ShintaNakama/items/3aecb569d74fda63c85d

## ActiveRecord::Baseとは
ゲッターとセッターを理解したら、次はActiveRecord::Baseの理解も必要です。
下記に自分が理解できた記事を記載しております。

簡単に説明すると、Railsでは、rails g model　モデル名で作成したモデルは、テーブルとやりとりをしやすくするために、ActiveRecordという機能を使えるように設定されています。
実際は、ActiveRecord::Baseをモデルクラスに継承することでそのモデルは、ActiveRecordを使用できます。
ActiveRecordが継承されると、そのモデルはfindやsaveメソッドが使用できるようになるのですが、他にもモデルクラスが紐づくテーブルのカラムがプロパティ値となり、明示的にgetter や setter を定義しなくても自動的に作成してくれるという役割も担います。
（ゲッターやセッターを自動生成してくれる役割をついつい忘れがちになるので注意が必要）

https://qiita.com/penguin_note/items/adb0b9bf7c13c1b1d44d

https://techracho.bpsinc.jp/hachi8833/2017_04_27/36050
GitHub ActionsでのNode.js利用のアップデートメモ


エラーではないけどアラートが出ていた

> Node.js 12 actions are deprecated. For more information see: https://github.blog/changelog/2022-09-22-github-actions-all-actions-will-begin-running-on-node16-instead-of-node12/. Please update the following actions to use Node.js 16: actions/checkout, actions/setup-node, actions/checkout

> ![スクリーンショット 2022-11-11 12.46.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/2571f74c-08b5-20a7-d329-c216b1698584.png "スクリーンショット 2022-11-11 12.46.21.png")

書き方古いから新しくしてね的な内容っぽいです。

## 今まで

```yml
name: xxを実行

on:
  push:
    branches: [ main ]

jobs:
  build:

    runs-on: ubuntu-latest
    timeout-minutes: 30

    strategy:
      matrix:
        node-version: [18.x]

    steps:
    - uses: actions/checkout@v2

    - name: Use Node.js 18.x
      uses: actions/setup-node@v1
      with:
        node-version: '18.x'

    - name: yarn install command
      run: yarn install

    - name: start action...
      run: > 
        XX_TOKEN=${{secrets.XX_TOKEN}}
        YY_TOKEN=${{secrets.YY_TOKEN}}
        node app.js
```

## アップデート

公式ドキュメントに書いてあるサンプルをもとに書き直してみました。

> https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-nodejs

- `actions/checkout@v2`の箇所を`actions/checkout@v3`に
- `actions/setup-node@v1`の箇所を`actions/setup-node@v3`

が主な変更っぽいです。
↓にはそれ以外にも調べてでてきたキャッシュ処理も入れてますがなくても動きます。

```yml
name: 実行

on:
  push:
  	branches: [ main ]

jobs:
  build:

    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v3
      - name: Use Node.js
        uses: actions/setup-node@v3
        with:
          node-version: '18.x'

      # キャッシュ
      - name: Cache dependencies
        uses: actions/cache@v2
        with:
          path: ~/.npm
          key: npm-${{ hashFiles('package-lock.json') }}
          restore-keys: npm-

      # インストール
      - name: yarn install command
        run: yarn install

      # 実際のコマンド
      - name: start action...
        run: > 
          XX_TOKEN=${{secrets.XX_TOKEN}}
          YY_TOKEN=${{secrets.YY_TOKEN}}
          node app.js
```
【PHP】【多次元配列】配列を追加していく  array_merge() 不要論

# コード
```PHP
<?php
$results = [
    ['name' => '田中',  'japanese' => 83, 'math' => 57, 'science' => 43,  'social' => 72, 'english' => 78],
    ['name' => '渡部',  'japanese' => 62, 'math' => 88, 'science' => 70,  'social' => 66, 'english' => 38],
    ['name' => '品川',  'japanese' => 23, 'math' => 33, 'science' => 53,  'social' => 17, 'english' => 7],
    ['name' => '滝谷',  'japanese' => 93, 'math' => 89, 'science' => 79,  'social' => 96, 'english' => 91],
    ['name' => '川原田','japanese' => 55, 'math' => 56, 'science' => 60,  'social' => 54, 'english' => 66],
    ['name' => '一色',  'japanese' => 27, 'math' => 47, 'science' => 100, 'social' => 42, 'english' => 38],
];
$new_results = [];
foreach($results as $key =>$value){
    $new_results[$key] = $value;
    $new_results[$key]['gokei'] = $value['japanese'] + $value['math'] + $value['science'] + $value['english'];
}
var_dump($new_results);
```

# 結果
```javascript
array(6) {
  [0]=>
  array(7) {
    ["name"]=>
    string(6) "田中"
    ["japanese"]=>
    int(83)
    ["math"]=>
    int(57)
    ["science"]=>
    int(43)
    ["social"]=>
    int(72)
    ["english"]=>
    int(78)
    ["gokei"]=>
    int(261)
  }
  [1]=>
  array(7) {
    ["name"]=>
    string(6) "渡部"
    ["japanese"]=>
    int(62)
    ["math"]=>
    int(88)
    ["science"]=>
    int(70)
    ["social"]=>
    int(66)
    ["english"]=>
    int(38)
    ["gokei"]=>
    int(258)
  }
}
```
Herokuから個人のwindowsにpythonを移動しました

## Herokuの無料プラン

Herokuのいい所は無理プランですが2022年11月28日よりこのプランがなくなります。それで色々のサービスをやってみました

## Herokuを使ってたについて

[別の記事で説明](https://qiita.com/Oukaria/items/35977bd5997503d43911)してました、基本はボットを作ってました、reddit.comのコメントをstreamで見て、特別の文字で反応して、情報を固めてでこのコメントに返事するボットでした、いわえるscrappingに近い形です。Herokuだと別に問題なかったで24時間に動いても大丈夫ですし、無料だったので結構よかったでしたが。。無料プランが無くなると困ります。

## 他のホスティングについて

Herokuがもうダメなので他のホスティングサイトを探してました

### deta.sh

オススメされたがdeta.shでした、herokuとにてまして無料プランがありますとデプロイすると自分のエンドポイントもあります。やり方がちょっと違ってましてて、Herokuはgitを連携してデプロイしてますがdeta.shは独特のCLIです。まーそんなに難しくはないです、このCLIをインストールして、ログインして、プロジェクトを作成して、デプロイで終わり。

```bash
$ curl -fsSL https://get.deta.dev/cli.sh | sh
$ deta login #（ブラウザーを開く）
$ deta new --python first_micro #（pythonでプロジェクトを作成）
$ deta deploy #（本番を展開する）
```
`deta new --python first_micro`をするとそのフォルダーの中に`main.py`のファイルが作成されて、そこにコードあれば動けます。

言われると割と簡単ですがherokuと違って、ローカルでgit管理しないとまずいことになれます、これはちょっと注意点です。Herokuのrequirements.txtをそのまま持ってたら無事に本番でライブラリを作れますのでそれは問題ないです！

ドキュメントを確認してまして、無事に動けそうですが、テストすると何も反応なしでした。。

色々検索してたら、ボットはダメでした。。。

![Screen Shot 2022-10-27 at 15.21.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878226/09b5391c-f731-8a25-434f-d7d7eed17b46.png)

:::note warn
12.Microsでは、Websocketや長時間稼働するプロセスは動作しません。(例: socket.ioやDiscordのbotは動作しません)。
:::

なので自分は使いませんでした。ドキュメントをちゃんと読んだらWEB系の使い方です



## 実際使った

別にコネクションはずっといらないのでウェーブサービスもいらない、通信もいらない、ただ走るだけでAPIを繋がっててで良いので自分の行人のパソコンがそもそも24時間で動いてるのでそれでも良い・・！

ですが、自分のパソコンがwindowsでそのOSに開発は経験不足なのでやってみるしかないです

まずはインストールする：https://www.python.org/downloads/windows/

![win_installer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878226/e92c05d1-4d8a-f1c5-48c6-1c958701e9b2.png)

:::note warn
`add python 3.8 to PATH`を忘れなずにインストールしてください、それじゃないだとこのエラーになります
:::

```
C:\>python
'python' is not recognized as an internal or external command,
operable program or batch file.
```

その場合は２パターンがあります：

- 手動でPATHを追加する
    - その場合はこれにより、[システムのプロパティ] ウィンドウが開きます。 [詳細設定] タブに移動し、[環境変数] ボタンをクリックします。Windowsのシステム変数ウィンドウで、Path変数を見つけ、Editをクリックします。

        ![environment_variables.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878226/b114174d-ecf5-1154-d27a-dae86dc369e5.jpeg)
        ![edit_environment_variables.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878226/48e588fd-a63f-820f-994a-0779cd2ad1a4.jpeg)
        ![add_path.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878226/5950029c-2f8e-ad35-b6b4-2305670baf04.jpeg)


        無事に成功したら`python`が出来るようになります
        ```
        C:>python --version
        Python 3.8.3
        ```

- `py`のコマンドを使うか
    - pythonではなくて、pyでも使えます！使い方が一緒なので気にしなくて良い

    ![py-examples-100888366-orig.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878226/7ad9c024-c6f4-68c4-d06e-341a83d041b1.png)


インストールしたら初めての気持ちはコマンドをやってみるでしたが

`pip`も使えます

![Screen Shot 2022-11-11 at 12.22.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878226/b801a4e7-7433-a73d-ad93-022d2de2b272.png)
Salesforceレポート勉強方法

こんにちは
本橋孝昭です

今回はSalesforceレポートの作成方法をご確認します

今回の内容は動画でも公開しております

https://www.youtube.com/watch?v=4LY_HxjqF2Y

<iframe width="560" height="315" src="https://www.youtube.com/embed/4LY_HxjqF2Y" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

## Salesforce　レポートとは

こちらのTrailheadをご確認ください

レポートおよびダッシュボードの概要
https://trailhead.salesforce.com/ja/content/learn/modules/reports_dashboards/reports_dashboards_overview


以下抜粋

レポートとは?
レポートとは、定義した条件を満たすレコードのリストです。Salesforce に行と列で表示され、絞り込み、グループ化、グラフィカルなグラフでの表示ができます。

すべてのレポートはフォルダーに保存されます。フォルダーは公開、非表示、共有のいずれかで、「参照のみ」または「参照・更新」に設定することができます。フォルダーの内容へのアクセス権を持つユーザーの制御は、ロール、権限、公開グループ、ライセンスの種類に基づいて行います。フォルダーを組織全体で使用できるようにしたり、非公開にして所有者のみにアクセス権を与えたりすることもできます。


では、このレポートどのように勉強すればいいでしょうか


## 勉強方法01  Trailheadで学習しよう

Trailheadではレポートについてのモジュールがいくつかあります
ハンズオンチャレンジもありますのでご確認ください


クイックスタート: レポート & ダッシュボード
https://trailhead.salesforce.com/ja/content/learn/projects/quickstart-reports?trailmix_creator_id=welcome4&trailmix_slug=mazuyaru-mix2

Lightning Experience のレポートおよびダッシュボード
https://trailhead.salesforce.com/ja/content/learn/modules/lex_implementation_reports_dashboards


なお、このモジュールのハンズオンチャレンジは公式解説や公式和訳などが存在しています
ぜひハンズオンチャレンジが難しい場合こちらをご確認ください


https://quip.com/hWmPASpflZIa

https://quip.com/ala8AoUwF8aY/Lightning-Experience-


動画の解説はこちら

<iframe width="756" height="315" src="https://www.youtube.com/embed/dUzy1K6SnUA" title="TrailheadハンズオンChallengeチャレンジ01【Salesforce公式解答有り】" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>


## 勉強方法01  レポートドリルで学習しよう

色々なレポートの作り方をマスターできるドリルがあります
ぜひご確認ください


https://successjp.salesforce.com/article/NAI-000254

レポートドリルなら画像付きで分かりやすく解説されています
OneDriveのバックアップについて

# Microsoft OneDriveのバックアップについて
仕事から私用までWindowsユーザーはOneDriveを利用していることが多いのではないでしょうか。
今回、動作がよくわからなかったので思い返しようにメモ程度に記載していきます。
## Documentフォルダなどが共有化している
ローカルのドキュメントやピクチャ、デスクトップがOneDriveと共有化されていて、My Gamesなどのこちらで設定できないフォルダが自動生成され、大きいファイルやデータがOneDriveに入ってしまいエラーなど予期しないことが起こっていました。
原因と対策を考えるために、いろいろ試してみました。
### バックアップ設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180100/0387e02a-362e-b090-0708-e73035bd959d.png)
原因からいうと、ここにチェックを入れてバックアップを開始するとドキュメントなどのフォルダがローカルからOneDrive内のものに切り替わってしまうようです。
Windows内のドキュメントへのパスもこちらを優先して見てしまうので、バックアップ不要なファイルまで上がってしまいます。
つまり、自動でバックアップされるように裏で設定されるわけですね。
仕事用のみとかなら問題ないですが、私用に使う書類や画像、ゲームのデータなんかも入ってしまいます。
まずはチェックを外して、バックアップが自動で動かないように設定しましょう。
### 確認してみる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180100/d622a9c3-a044-b7d0-4a9a-0b4ee33b381c.png)
![2022-11-11 123253.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180100/c0e41978-b741-cbaf-ad8c-d68b8be8155e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180100/98d2e120-87bd-d4cc-e998-56d7ac29ae7d.png)
今回はFF14のゲームをインストールしてみました。
画像はセットアップをダブルクリックしただけの状態です。
こんな感じでOneDrive管理のフォルダには作成されずローカルのドキュメントフォルダにMｙGamesが作成されました。
ひとまずこれでいいと思います。

必要なドキュメントは手作業で移す形にはなりますが、こちらでインストールフォルダを制御できないデータがバックアップされるのを防ぐのが目的なので、多少作業が発生するのは致し方なしかとおもいます。
【OutSystems】 テーブルにスクロールバーをつける

## このような従業員情報にスクロールバーをつけたいとき（一例）
今回は垂直方向につけます。![キャプチャ.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691264/a03c9bca-2d9c-79be-1a26-854e3288a4d8.jpeg)

#### 1. テーブルをコンテナに入れる
![c.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691264/584365b0-d1d4-1e7f-c8f7-dd5298b24563.png)

#### 2. Style Classの設定![1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691264/49569adc-64d1-3d2a-0c1a-a3eac26dbc92.jpeg)``"overflow-vertical"``
を設定。
overflow は CSS のプロパティで、要素の内容が多すぎて収まらない場合の動作を設定。

#### 3. コンテナの高さを設定![2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691264/47a2bf1f-6961-16ea-99e0-e8036dc2d436.jpeg)``height: calc(100vh - 200px);``
vh(viewport height)、vw(viewport width)  は要素の幅や高さを指定する単位。
viewport(ビューポート)はユーザーが現在見ているページの可視領域のこと。

#### ``height: calc(100vh - 200px);``
calc()関数は、CSSで「四則演算」ができる関数。
100vhは、ビューポート(ブラウザウィンドウ)の高さの100%を意味しています。

上記のように指定すると、ブラウザの画面の高さ100%から200pxを引いた値がコンテナの高さとして設定され、テーブルに表示される内容がコンテナの高さに収まらない場合は 2."overflow-vertical"の指定が効いてスクロールバーがつきます。

#### スクロールバーがつきました。![3.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691264/456c83a1-a110-9539-3446-9273cbd65f01.jpeg)
AWS Glue Flexオプションについて

# AWS Glue Flexオプション

AWS Glueでは2022/08/09にFlexタイプのジョブ実行モードというのが追加されました。  
FlexタイプのジョブはEC2のスポットインスタンスのような非占有型のコンピュートキャパシティ上で動作します。  
そのため、リソースの使用状況に応じてジョブの開始に時間がかかる場合などがありますが、その分コスト的には通常のジョブに比べ安価になっています。  
テスト用途のジョブや実行時間の制約の緩い夜間のバッチジョブなどでコストを安価に抑えながらジョブを実行できるオプションになります。  

# Flexオプションのコスト

2022年11月現在、東京リージョンではFlexオプションは通常のジョブに比べ最大34%のコスト削減効果があります。

|通常|Flex|
|:---|:---|
|$0.44 per DPU-Hour|$0.29 per DPU-Hour|

# Flexオプションの特徴

FlexオプションはGlue 3.0またはそれ以降のバージョンのETLジョブで利用可能です。  
また、Flexオプションを有効にした場合は以下のような形でジョブが動作します。

- ジョブ実行時に確保できるリソースがある場合は速やかにジョブが開始されるが、リソースが不足している場合はWAITING状態に遷移する
- WAITING状態は最大20分。WAITING状態に遷移してから15分後に確保可能なリソース量でジョブを実行開始する。
- ジョブ実行中であってもリソース量の増減は発生する可能性がある
- 確保されたリソース量のみに課金が発生する。すなわちWAITING状態の時は課金は発生しない

# Flexオプションの有効化方法

Glue Studioでの有効化方法を記載します。  
Glue Studioのジョブ作成画面のJob DetailsでFlex executionのチェックボックスをチェックすることでFlexオプションが有効化されます。Flexオプションは既存のジョブであっても有効化することが可能です。

![glue_flex.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276167/c9b95e5a-7b01-4114-129c-ffd8af93e913.png)
小技：Windows11でIMEを削除する方法(ATOKだけにしたい)

# やりたいこと
ATOK等のIME以外の日本語入力システムを使っていて、ちょいちょい勝手に切り替わってしまうIMEを使えないように削除する方法を解説します。
## 現状の確認
ご覧の通り、IMEが選択できる状態になっていて、油断をすると切り替わってしまいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351028/7f3e8df4-aa7d-d979-85bb-480ff5f516e4.png)

# もともと
Winsows10では、IMEが`設定 > 時刻と言語 > 言語のオプション`を開くと
出てくるキーボードの一覧の中から`Microsoft IME`の選択項目があって削除ができました。
しかしながら、Windows11にVerUPして間もなく配布された`22H2`にアップデートしたところ`IME`が復活するという悲劇が起こってしまいました。

# 具体的な手順
## 手順①：他言語のインストール
まず`設定 > 言語と地域`を確認しましょう。
恐らく`Windowsの表示言語`が`日本語`になっていて、その下に表示される言語も日本語だけのはずです。
ここで`English US`を選んで言語を追加します。

## 手順②：他言語への切り替え
一旦`Windowsの表示言語`をインストールした言語に切り替えます（サインアウトが必要になります）

## 手順③：日本語への切り替え
`Windowsの表示言語`を`日本語`に切り替えます（サインアウトが必要になります）

## 手順④：多言語の削除
追加した他の言語を`設定 > 時刻と言語`に出てくるリストから削除します。（･･･を右クリック > 削除）

## 手順⑤：IMEの削除
`設定 > 時刻と言語`にで出てくる`日本語`の横の`･･･`から`言語のオプションの`をクリックします。
すると！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351028/2dae82ea-2a0f-08f4-1682-0abd2aad7df0.png)
なんと！　一覧に「Microsoft IME」が出てきているでは有りませんか！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351028/666610b1-5de4-246a-d4c3-fa393ca9a06e.png)
あとはもう「削除」を選ぶだけです。

# 結果の確認
無事にIMEを削除できている筈です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351028/73232862-ece8-d00c-ca5c-f3d76184f647.png)

# 終わりに
なぜ？一度、他の言語を追加して日本語に戻すと`Microsoft IME`が表示されて削除できるようになる？のかは謎ですが・・・ATOKとかに固定したいのにIMEに切り替わってしまって困るような現象からは解放されます。
Leetcode 26. Remove Duplicates from Sorted Array

# 26. Remove Duplicates from Sorted Array

https://leetcode.com/problems/remove-duplicates-from-sorted-array/description/

```java
class Solution {
    public int removeDuplicates(int[] nums) {
        Set<Integer> set = new HashSet<>();

        for (int i : nums) {
            set.add(i);
        }

        Integer[] array = set.stream().toArray(Integer[]::new);
        Arrays.sort(array);
        for (int i = 0; i < nums.length; i++) {
          if(i < array.length){
                nums[i] = array[i];
            }
        }
        return set.size();
    }
}
```
Dockerとdocker-composeの動作を図にしてみました

そろそろDockerコンテナをもとにCI/CDを実践してみようかと思ったところ、Dockerのイメージとコンテナの概念をしっかり理解していないとCI/CDパイプラインが作成できないことに気づき、少々混乱しました。

ということでDockerおよびdocker-conposeの動作についてまとめてみました。

# CI/CDにコンテナを使うときの課題
わかったつもりで使っていましたが、CI/CDパイプラインを構築しようと思うと以下でつまずきました。

:::note warn
永続化したファイルってイメージに含まれるの？
:::
:::note warn
docker-compose.ymlに記述したenvironment部分ってどうなる？
:::
:::note warn
Dockerfileとイメージ・コンテナの関係は？
:::
:::note warn
接続データベースを商用環境のコンテナやテスト環境のコンテナでは変更したいけどどうしたらいい？
:::

実際にコンテナベースでCI/CDを構築しようと思うとしっかりとDockerコンテナの仕様を知らないと運用できないですね😥

# まずはコンテナ、イメージの関係を整理する
ということでDockerのコンテナ、イメージの関係を整理することにしました。
コンテナとは？イメージとは？を記載している方は多くいるので助かっているのですが、Dockerコマンドやdocker-composeコマンドのbuild,up,run,createなどで何が起こるのかについては少々情報が少ないです。

そんな中で以下の記事を参考にしながら図式化してみました。
※私なりの解釈で書いています。

https://qiita.com/ryuyaF/items/9b7a033bb9df5627e977

https://qiita.com/tearoom6/items/326895f0a35774d70729

## Dockerの動作
![スクリーンショット 2022-11-11 11.50.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1926542/49a306da-ebde-f8a3-0f14-e282d7e40e11.png)

1. buildを行うとDockerfileをもとにイメージを組み立てる、その際ローカルファイルをイメージに取り込む（バインドする）ことができる
1. createを行うとイメージからコンテナを作る
1. startでコンテナを起動する、その際ローカルファイルをマウントできる

# docker-composeの動作
![スクリーンショット 2022-11-11 11.51.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1926542/1bdc9b2f-30be-a661-ba62-a54d784e9c53.png)

1. buildを行うとdocker-compose.ymlファイルをもとにイメージを組み立てる、その際Dockerfileの利用やローカルファイルのバインドも可能
1. startを行うとまず停止中のコンテナがないかを調べ、なければイメージからコンテナを作成。その後コンテナを実行する。その際ローカルファイルをマウントできる

# まとめ
自身で開発したプログラムなどはバインドまたはマウントして永続化しているはずです。
しかし、マウントしただけでは開発プログラムはイメージに取り込まれません。
AWS Fargateなどでテスト環境、商用環境を構築しようと思うと独自生成したイメージを利用することになるのでマウントではなく、バインドしてあげる必要があるというわけですね。
【TypeScript】Null合体演算子(??)

## Null合体演算子とは？
論理演算子の一種です。この演算子は左辺が `null` または `undefined` の場合に右の値を返し、それ以外の場合に左の値を返します。
参考：https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Nullish_coalescing

私は初めて見た時に「なんこれ。どういう判定？」と思いました。
今でもどんな処理がされているっけとなるのでメモとして残しておこうと思います。

## 使い方
1\. 左辺が`Null`or`undefined`の場合
```typescript
const example1 = null ?? "右辺";
console.log(example1); //右辺
const example2 = undefined ?? "右辺";
console.log(example2); //右辺
```
example1,example2ともに右辺が出力されています

2\. `Null`or`undefined`が含まれていない場合
```typescript
const example3 = "左辺" ?? "右辺";
console.log(example3); //左辺
const example4 = "" ?? "右辺";
console.log(example4); //""
```
左辺が優先され出力されます
`Null`or`undefined`しかNull合体演算子の判定条件にならないので`0`や` `` `は左辺が出力されることになります(example4)

例えば配列があって、存在しないインデックスにアクセスしたとします
null合体演算子を使わず、if文で書くとすると...
```typescript
if (num[10] === undefined) {
  console.log("数値ではありません");//こちらが出力される
} else {
  console.log("数値です");
}
```
数値である場合と数値でない場合の2種類処理を書かなければなりません

しかし、Null合体演算子を使うことで...
```typescript
const num: number[] = [1, 2, 3];
const check1 = num[0] ?? "数値です";
const check2 = num[10] ?? "数値ではありません";
console.log(check1, check2);//数値ではありません,数値です
```
一文で処理を終わらせることができます

Null合体代入演算子(??=)というのもあるようなので、また別の機会に。。。
多言語FizzBuzzチャレンジ25日目:Windowsバッチファイル

## これまでのまとめ
https://qiita.com/tenteko/private/fc52f7aec63ba5f67854

https://qiita.com/tenteko/private/ca9813f0982370d0c901

https://qiita.com/tenteko/private/bc808ba59f6993019045

https://qiita.com/tenteko/private/74aa4c422196cb5cdeac

https://qiita.com/tenteko/private/ea22bd19360333f9ca85

https://qiita.com/tenteko/private/ec2f7c2f99229a55a7aa

https://qiita.com/tenteko/private/237556777f5c5546af6e

https://qiita.com/tenteko/private/264e4aca8a2ee6761a6c

https://qiita.com/tenteko/private/6e86fa0eeed9d24805ab

https://qiita.com/tenteko/private/f32baaf43fe0217b7fc7

https://qiita.com/tenteko/private/b44e1e5bfc91f6f3a52f

https://qiita.com/tenteko/private/333b9697c03561fb6158

https://qiita.com/tenteko/private/667f5f69eda60f221912

https://qiita.com/tenteko/private/eff296000ecbc7b43f07

https://qiita.com/tenteko/private/f5ea89c185b14a5952f3

https://qiita.com/tenteko/private/64a5814d35f73972bde9

https://qiita.com/tenteko/private/7981389372c7f6bdc073

https://qiita.com/tenteko/private/f6814b2e192e23298da8

https://qiita.com/tenteko/private/e3e498be93b847139a7d

https://qiita.com/tenteko/private/70f6a6588bc72acf27cf

https://qiita.com/tenteko/private/0d384ab42091434edb88

https://qiita.com/tenteko/private/a6ef98f964083d96e443

https://qiita.com/tenteko/private/650093e823bb993f77a6

https://qiita.com/tenteko/private/63b1b8e769ef38389b09

## 本日のお品書き
ついに来ました最終回。最後を飾るのはコレしかないでしょう、はい、Windowsバッチファイルです。最後にふさわしい困難がそこにはありました。

## FizzBuzz

せっかくなので動作せずにハマったパターンを先に載せます。

```batch
@echo off
setlocal
for /l %%x in (1, 1, 100) do (
    rem /aをつけないと数値として扱われない. また=の前後にスペースを入れてもいけない.
    set /a F=%%x %% 3
    set /a B=%%x %% 5
    set /a FB=%F%+%B%
    if "%FB% == "0" (
        echo Fizz Buzz
    ) else if "%F%" == "0" (
        echo Fizz
    ) else if "%B%" == "0" (
        echo Buzz
    ) else (
        echo %%x
    )
)
endlocal
```

これを実行するとエラーです。見事にはまりました。`for`の中の環境変数展開が都度行われないという仕様のため、`set`が評価される前に`if`が呼ばれ、その中で存在しない変数を参照しようとするためエラーになってしまいます。

これを解決するには遅延環境変数展開を有効にするとともに、変数名を`% %`ではなく`! !`で囲う必要がありました。

```diff_batchfile
@echo off
- setlocal
+ setlocal enabledelayedexpansion
for /l %%x in (1, 1, 100) do (
    rem /aをつけないと数値として扱われない. また=の前後にスペースを入れてもいけない.
    set /a F=%%x %% 3
    set /a B=%%x %% 5
-   set /a FB=%F%+%B%
+   set /a FB=!F!+!B!
-   if "%FB%" == "0" (
+   if "!FB!" == "0" (
        echo FizzBuzz
-   ) else if "%F%" == "0" (
+   ) else if "!F!" == "0" (
        echo Fizz
-   ) else if "%B%" == "0" (
+   ) else if "!B!" == "0" (
        echo Buzz
    ) else (
        echo %%x
    )
)
endlocal
```

## おわりに
くぅ〜疲れましたｗ[^1]

- 完走賞を目指してはじめてみたのですが、初めて関数型言語を触るきっかけにもなるなど、意外と学びが多い試みになりました。やってみてよかったです。
- 言語仕様もそうですが、初めて触る言語だと、やはり実行方法自体もなかなかわからなかったりしますね。その辺りが分かりやすかったり、Docが親切だったりする言語は、初学者にとっては触りやすい言語なんじゃないかな？と思いました。

[^1]: くぅ〜疲れましたwとは. https://dic.nicovideo.jp/a/%E3%81%8F%E3%81%85%E3%80%9C%E7%96%B2%E3%82%8C%E3%81%BE%E3%81%97%E3%81%9Fw
Sipsデータ 1　備忘録

備忘録…1

調剤薬局での仕事の流れは
1.処方箋を受け取る。
2.処方箋をコピー
3　Ａコピーした処方箋を見て調剤
　 Ｂ原本を見てレセコンにてデータ入力（薬袋の印刷、会計等）
4.入力、調剤が終わった時点でそれらを合わせてお薬をお渡しする。

Sipsデータは3Bび入力終了の時点で、レセコンサーバー内のあるフォルダにテキストファイルとして貯められていく。周辺機器（プリンタ、自動監査機等）はこのSipsデータを処方データをとしてそれぞれの機器の情報として作業する。
Sipsは統一規格として博多薬剤師会が考えたもので、今では日本薬剤師会が管理している。
Sipsデータの仕様の情報はオープンでは無い様子。

ファイル名
A22110400002600100000.txt
U22110400002600100000.txt
もし処方が削除されたら
D22110400002600100000.txt が吐き出されるであろう。
ファイルの中身（A22110400002600100000.txt）

VER010401,[ファイル作成_日時_分],[レセコン会社名],SERVER,24,4,[薬‗保険番号],[薬局名],[薬_郵便番号],[薬_住所],[薬_電話番号],
1,[患者ID],[患者_カナ名],[患者名],1,[患者_生年月日],[患者_郵便番号],[患者_住所],[保険番号],,,,1,2,[保険番号],,,[保険番号],1,10,90,0,,,,,,,,,,,,,,,,0,0,0,0,0,0,0,0,0,0,0,
2,221104000026001,0,A,20221104,,20221104,20221104,0,0,0,6,[医_保険番号],24,[医療機関名],[医_郵便番号],[医_住所],[医_電話番号],15,[医_科名],,,11,[医師カナ],[医師名],1,[投薬_薬剤師名],,,,,,,,0,0,0,0,0,0,0,0
3,1,2,１日１回　朝食後,,,,,2,1,49,1,,1,0,0,,,,,,
4,1,1,1,3399008F1190,622422201,,42428,クロピドグレル錠２５ｍｇ｢ケミファ｣,クロピドグレル錠 ２５ｍｇ,0,0,0,0,0,0,2,1,錠,0,0,0,0,1,19.6,,,,3399008F1190,,,クロピドグレル錠 ２５ｍｇ,0,0,,0,,,,,1
3,2,2,１日１回　朝食後,,,,,2,1,49,1,,2,0,0,,,,,,
4,1,2,1,2149118F1070,622620101,,100180,イルアミクス配合錠ＬＤ｢ＹＤ｣,イルベサルタン・アムロジピン５ｍｇ配合錠 ,0,0,0,0,0,0,1,1,錠,0,0,0,0,1,18.2,,,,2149118F1070,,,イルベサルタン・アムロジピン５ｍｇ配合錠 ,0,0,,0,,,,,1
4,2,2,1,1139002F2026,611130100,,20346,テグレトール錠１００ｍｇ,カルバマゼピン錠 １００ｍｇ,0,0,0,0,0,0,0.5,1,錠,0,0,0,0,1,5.9,,,,1139002F2026,,,カルバマゼピン錠 １００ｍｇ,0,0,,0,,,,,1
5,294,24,115,0,505,0,72,0,0,0,115,505,510,0,0,0,510,510,510,0
6,1,24,6,49,318,0,318,,,,,,,,,,,,,,,,,,,,
6,2,0,0,49,0,0,0,,,,,,,,,,,,,,,,,,,,
7,1,440012010,服薬管理指導料(３ヶ月以内来局あり・手帳あり),1,45
7,2,440012070,特定薬剤管理指導加算１,1,10

テキストファイルの中身は、1～7のブロックに分かれる。
一番最初はヘッダー
1　患者情報
2　医療機関錠
3  処方内容の用法、用量
4　薬品名
5　今後調べる
6　今後調べる
7　今後調べる

5～7は、入力情報の何かだが現時点では不要。
それぞれのブロックの要素数は…
1:49,2:42,3:22,4:41,5:21,6:28,7:6

以は同様の物を作る時は、テーブルはブロック1,2のテーブルと3，4のテーブルでリレーションをは組んでいた。

今日はここまで。
PlanetScale に Prisma でテーブルを作りたい



[PlanetScale](https://planetscale.com/) に接続して、 [Prisma](https://www.prisma.io/) (schema.prisma) で設定した通りのテーブルを作成したい。
開発環境を想定したテストブランチを PlanetScale に作っていたので、 `prisma migrate dev` でいけるかなと試してみても、エラーが出てしまった。


## エラーログ

```
$ yarn prisma migrate dev
yarn run v1.22.19
$ {ディレクトリパス}/node_modules/.bin/prisma migrate dev
Environment variables loaded from .env
Prisma schema loaded from prisma/schema.prisma
Datasource "db": MySQL database "{DB名}" at "{PlanetScale側DBホスト}:{ポート番号}"

Error: P3014

Prisma Migrate could not create the shadow database. Please make sure the database user has permission to create databases. Read more about the shadow database (and workarounds) at https://pris.ly/d/migrate-shadow

Original error: 
create database is not supported
   0: migration_core::state::DevDiagnostic
             at migration-engine/core/src/state.rs:250

error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
```


## 環境

- PlanetScale
- Prisma 4.6.0
- Yarn 1.22.19


## 対処法

公式サイトを確認すると、 `prisma migrate` ではなく、 `prisma db push` を推奨していた。

https://www.prisma.io/docs/guides/database/using-prisma-with-planetscale

https://planetscale.com/docs/tutorials/prisma-quickstart

実際、 `prisma db push` を実行すると問題なく通った。


「シャドウデータベースが作れない」というエラーだったり、「create database is not supported」って出ていたので、なにか権限を付与する必要があるのか？と誤解した。
日本語でElixir

[Elixir]: https://elixir-lang.org/

`:闘魂.挨拶`
これは歴とした[Elixir]コードです。

```elixir
defmodule :闘魂 do
  def 挨拶 do
    "元氣ですかーーーーッ！"
  end

  def 説明 do
    "「闘魂」とは己に打ち克ち、闘いを通じて自分の魂を磨くことである"
  end
end
```

```
:闘魂.挨拶

:闘魂.説明
```

![CleanShot 2022-11-11 at 07.17.23@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82804/18211306-4db3-fe53-312a-6a3d87f083b4.png)


少なくとも僕のMacBookでは問題なくイゴいてます。

## 参考資料

https://qiita.com/torifukukaiou/items/4481f7884a20ab4b1bea

https://note.com/awesomey/n/n4d8c355bc8f7

## ご参考までに

https://speakerdeck.com/elijo/elixirkomiyunitei-falsebu-kifang-guo-nei-onrainbian

https://qiita.com/piacerex/items/e0b6e46b1325bb931122

https://qiita.com/torifukukaiou/items/1edb3e961acf002478fd

https://qiita.com/piacerex/items/e5590fa287d3c89eeebf
img要素による読み込みを中断する

# 背景

`img`要素で表示させた画像の読み込みが`img`タグがなくなった状態でも続き、接続数の上限に達してしまうという事がありました。  
`img`要素による読み込みを中断させる方法を本記事では取り上げます。

# 解決法

`img`タグの`src`属性に空文字(`""`)を指定して上げるだけで読み込みがキャンセルされます。

# 参考文献

[How to cancel an image from loading](https://stackoverflow.com/questions/5278304/how-to-cancel-an-image-from-loading)
初心者向けの教習で、関数を説明するときに無意味な足し算をするのはやめよう

# はじめに
ふと初心者の頃を思い出して、ふつふつと「これは俺だけじゃないはずだ！みんなもわかるよな！？わかってくれよ・・！」という感情が湧き出してきたので記事にしました。

# 言いたいこと
昔買ったJavaの教習本やら、外部講習を受けたときの話。
こういう感じのサンプルを見せられました。

```java
public int testFunction(int num1, num2) {
    int result;
    result = num1 + num2;
    return result;
}
```
それで、こんな感じの説明が一緒になってます。

>このように、関数を使うことで処理をまとめることができます。

これが何度読んでも理解できませんでした。
え、これ使う必要ある？なくない？と。

その結果どうなったかというと、めちゃくちゃ長ったらしいmain処理を書いてた記憶があります。
関数に切り出す意味がわからなかったからです。

# (個人的に)良い例
```java
double calcBmi(double heightMeter, double weightKg) {
    return weightKg / (heightMeter * heightMeter);
}
```
>この例では、BMIを算出する処理を1箇所にまとめることで、色々なところで計算が必要になるたびに計算式の確認が必要になったり、1箇所のみでミスが発生するような事態を防ぐことができました。
>このように、関数を使うことでよく使う処理をまとめることができます。

(2022/11/14 コメントにて頂いたサンプルを利用させていただきました。ありがとうございます！)

初心者向けのサンプルにやたら長い処理を持ってこられても困りますが、かといってなんの意味もないコードを見せられても疑問符しか出ないです。
（僕の察しが悪かっただけかもしれませんが・・）

# まとめ
例文を書く場合は、ある程度実用時をイメージしやすい形にしよう。


# 追記(2022/11/12)
今回伝えたかったのは
×そのままコピーしても実用できるようなサンプルコードを記載しよう
○利用する意味がわかるようなサンプルコードを記載しよう
だったのですが、それがわからない方々からクレームが飛んでくるから世の中のサンプルコードは、ケチがつかない無意味なものになるのだな・・と勝手に納得しました。

教習的なお仕事をされている方々いつもお疲れ様です。
【Flutter】CupertinoAppではSnackBarは表示できない

どうやらFlutterではCupertinoAppでSnackBarを表示することはできないようです。
私はFlutter3にアップデートしたタイミングで、 `flutter_platform_widgets` ライブラリの`PlatformApp` を使っている場所でSnackBarが表示されなくなったことでこの問題に気が付きました。

公式ドキュメントは見当たらなかったんですが、SnackBarはマテリアルデザインの概念なのでクパチーノ系では使えない方があるべき姿ということでしょうか。



表示できないことを検証したコード
```dart:main.dart
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return CupertinoApp(
      // MaterialAppならSnackBar出る
      home: const MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key});

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  void _showSnackBar() {
    final snackBar = SnackBar(content: Text("hogehoge"));
    // final snackBar = CupertinoPageS
    ScaffoldMessenger.of(context).showSnackBar(snackBar);
  }

  @override
  Widget build(BuildContext context) {
    return CupertinoPageScaffold(
      // ■ScaffoldならSnackBar出る
      child: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ElevatedButton(
                onPressed: () => _showSnackBar(), child: Text("Show Snackbar"))
          ],
        ),
      ),
    );
  }
}
```
BPXPRMxx SYNTAX Error

If you see following message at IPL
```
BPXI012I ERRORS IN PARMLIB MEMBERS=BPXPRMXX, REFER TO HARDCOPY LOG.
BPXI029I AN OMVS= PARMLIB MEMBER WAS NOT FOUND OR IS IN ERROR.
*  IEA341A RESPECIFY OMVS PARM OR PRESS ENTER
```
In this case, you need to check the member really exists and review your member have any error.
To continue to do IPL, you need to reply to message (ex R nn,OMVS=(XX)).
If you want to avoid this error, you should run SYNTAX CHECK after modify BPXPRMxx before reIPL.
```
SETOMVS SYNTAXCHECK=(XX)
```
<H2>References</H2>

https://www.ibm.com/docs/en/zos/2.5.0?topic=sys1parmlib-checking-bpxprmxx-syntax
https://www.ibm.com/docs/en/zos/2.5.0?topic=reference-setomvs-command
https://www.ibm.com/docs/en/zos/2.5.0?topic=sc-syntax-20
https://www.ibm.com/docs/en/zos/2.5.0?topic=messages-bpxi012i
https://www.ibm.com/docs/en/zos/2.5.0?topic=messages-bpxp029i
https://www.ibm.com/docs/en/zos/2.5.0?topic=messages-iea341a