OmniAICreator/Qiita-1.07M huggingface dataset:
Android12で起こったPendingIntentエラーについて(Chuckライブラリ)

# はじめに
Android12からPendingIntentにフラグの設定が必要になったのですが、使用していた[Chuckライブラリ](https://github.com/jgilfelt/chuck)にもその影響がありエラーになってしまいました。
今回はそのエラーの対応方法についてご紹介します。

# 開発環境
PC：MacBook Pro
OS：macOS BigSur
Android Studio：Arctic Fox 2021.1.1

# PendingIntentのエラー対応方法
SDKバージョンを31にしてアプリを実行した際に、PendingIntentを使用している箇所で以下のようなエラーが出る場合があります。
```
PendingIntentを作成するときにFLAG_IMMUTABLEまたはFLAG_MUTABLEのいずれかを指定する必要があります。
FLAG_IMMUTABLEの使用を強く検討してください。
たとえば、インライン応答やバブルで使用する必要がある場合など、
一部の機能がPendingIntentの変更可能性に依存している場合にのみ、FLAG_MUTABLEを使用してください。
```

これはAndroid12ではPendingIntentに可変性を指定する必要があるためです。([Android developers](https://developer.android.com/about/versions/12/behavior-changes-12?hl=ja#pending-intent-mutability))
基本的にFLAG_IMMUTABLEかFLAG_MUTABLEを設定してあげれば大丈夫だそうです。

2つの違いは以下の通りです。
・FLAG_IMMUTABLE:
 パラメータを追加をしたとしても元々のIntentは変更はされず、起動された側でも取得できずにnullになる。
 (ほとんどの場合はFLAG_IMMUTABLEで良いとされています)
・FLAG_MUTABLE:
 変更が可能となり、先程のパラメータを追加したときに、起動された側で取得することが出来る。


### 実装
```
//FLAG_IMMUTABLEのフラグを設定
val pendingIntent = PendingIntent.getActivity(it, 0, intent, PendingIntent.FLAG_IMMUTABLE)

//FLAG_MUTABLEのフラグを設定
val pendingIntent = PendingIntent.getActivity(it, 0, intent, PendingIntent.FLAG_MUTABLE)
```

上記対応ででエラーがなくなった方はここまででOKです！

# Chuckライブラリのエラー対応方法
上記対応を行ってもまだ同じエラーが表示され、さらに[Chuckライブラリ](https://github.com/jgilfelt/chuck)を使っている！という方はこちらを参考にしてみてください。
調査したところChuckライブラリはインテントフラグに対応していないことが分かりました。([Android12/S ＃634での例外](https://github.com/ChuckerTeam/chucker/issues/634))

ということでChuckライブラリはAndroid12に対応していないことが分かったので、[Chuckerライブラリ](https://github.com/ChuckerTeam/chucker)に移行しました。
移行は難しくなく、基本的にこちらの[移行ガイド](https://github.com/ChuckerTeam/chucker/blob/develop/docs/migrating-from-chuck.md)を見れば大丈夫です！

### 実装
まずChuckライブラリは不要なので削除し、代わりにChuckerライブラリをgradleファイルの`dependencies`に追加します。

```build.gradle()
// Chuckerライブラリ
debugImplementation "com.github.ChuckerTeam.Chucker:library:3.0.1"
releaseImplementation "com.github.ChuckerTeam.Chucker:library-no-op:3.0.1"
```

次に`ChuckInterceptor`を使用している箇所を`ChuckerInterceptor`に変更します。
その後設定を行います。こちらについては[Chuckerライブラリのページ](https://github.com/ChuckerTeam/chucker#getting-started-)内の`Configure`という見出しを見ると詳細が分かります。

```
// Create the Interceptor
val chuckerInterceptor = ChuckerInterceptor.Builder(context)
        .collector(chuckerCollector)
        .maxContentLength(250_000L)
        .redactHeaders("Auth-Token", "Bearer")
        .alwaysReadResponseBody(true)
        .addBodyDecoder(decoder)
        .createShortcut(true)
        .build()

// OkHttpClient内にChuckerInterceptorを接続
val client = OkHttpClient.Builder()
        .addInterceptor(chuckerInterceptor)
        .build()
```

これでChuckライブラリによるPendingIntentのエラーは解決できたはずです！

PendingIntentのエラーが出た時は「フラグ追加すればいいだけじゃん」と思いましたが、ライブラリにも影響あることが分かったので今後は注意して行きます。。

# 参考文献
・[Android developers](https://developer.android.com/about/versions/12/behavior-changes-12?hl=ja#pending-intent-mutability)
・[Chuckライブラリ](https://github.com/jgilfelt/chuck)
・[Android12/S ＃634での例外](https://github.com/ChuckerTeam/chucker/issues/634)
・[Chuckerライブラリ](https://github.com/ChuckerTeam/chucker)
・[Chucker移行ガイド](https://github.com/ChuckerTeam/chucker/blob/develop/docs/migrating-from-chuck.md)
Jetson AGX Xavierでpipパッケージインストールできない場合の対処

#目次
[1.はじめに](#1-はじめに)
[2.パッケージが入らない](#2-パッケージが入らない)
[3.オフラインインストールを試す](#3-オフラインインストールを試す)
[4.JetPack46用も確認](#4-jetpack46用も確認)
[5.おわりに](#5-おわりに)

# 1. はじめに
* Jetson AGX Xavier Developer Kitの環境
    * JetPack4.6.1
    * OSはNVMeへ書き込み
    * LANはUSBドングルまたは有線接続
    

* 例によって社内手順書兼公開リマインダー
    * お使いのAGX Xavierに他のサードパーティー製キャリアボードの組み合わせでのSDKmanagerセットアップは各メーカにお問い合わせいただいた方がいいかもです。
    * Developerのアカウントお持ちの方はDesign Guideもご確認ください。

    
https://developer.nvidia.com/embedded/downloads


:::note info
インフォメーション1
* AGX Xavier出始めのころいじったサードパーティー製キャリボードのセットアップはMicro USBからのIP接続でした。
* 今回のDeveloper KitはキャリボードフロントのType-Cタイプポートマニュアル接続でした（公式マニュアル確認）
    * JetPack4.6.1では昔のバージョンと違ってFlashのところで普通にイメージの書き込み先選択できました。
:::



# 2. パッケージが入らない

* JetPackなので、一通り環境はできていますが入らない以下のパッケージ(apt)でインストール
    * git
    * pip,pip3
    * お気に入りのエディタなど

* pip3 コマンドで普通にパッケージを入れるぞととりあえずのTensorflow

```
pip3 install tensorflow
#エラー表示例
Defaulting to user installation because normal site-packages is not writeable

```

* Tensorflowに限らず結構なパッケージが弾かれました。4.5では特に問題がなかったと思ったのですが…
* 念の為、Python3.6.9に対応の対応表もみてみました。

http://tecsingularity.com/cuda/version-2/

* エラーをみるとTensorflow場合はそのものが、他のパッケージはnumpy等の依存関係で弾かれている模様。
    * なんとか単体でインストールできないものだろうか・・・


# 3. オフラインインストールを試す

### 参考にさせて頂いたのはこちらの記事です。

https://tech-diary.net/python-library-offline-install/

https://pypi.org/


* ふむふむtensorflowのwheelパッケージを落としてきて、オフラインインストールですな

```

#tensorflow-2.3.0 パッケージをインストール

pip install --no-deps <Wheelファイル名>

```

* やっぱり同じエラーで蹴られてしまう・・・
* さらに調べてNvidiaで配布しているパッケージ＋上のオプションなら入るのではと試行。

https://developer.download.nvidia.com/compute/redist/jp/v45/tensorflow/


```

 pip install --no-deps tensorflow-2.4.0+nv21.3-cp36-cp36m-linux_aarch64.whl 

```
**今度はしっかりインストールできました**


```
hoge@ubuntu:~/Downloads$ pip install --no-deps tensorflow-2.4.0+nv21.3-cp36-cp36m-linux_aarch64.whl 
Defaulting to user installation because normal site-packages is not writeable
Processing ./tensorflow-2.4.0+nv21.3-cp36-cp36m-linux_aarch64.whl
Installing collected packages: tensorflow
Successfully installed tensorflow-2.4.0+nv21.3

```


# 4. JetPack46用も確認

**こちらより4.6用wheelファイルダウンロード**

https://elinux.org/Jetson_Zoo

```
hoge@ubuntu:~/Downloads$  pip install --no-deps tensorflow-2.5.0+nv21.7-cp36-cp36m-linux_aarch64.whl 
Defaulting to user installation because normal site-packages is not writeable
Processing ./tensorflow-2.5.0+nv21.7-cp36-cp36m-linux_aarch64.whl
Installing collected packages: tensorflow
  Attempting uninstall: tensorflow
    Found existing installation: tensorflow 2.4.0+nv21.3
    Uninstalling tensorflow-2.4.0+nv21.3:
      Successfully uninstalled tensorflow-2.4.0+nv21.3
Successfully installed tensorflow-2.5.0+nv21.7

```

* 無事にインストールできました。なお、Pytorchは特にトラブルなくインストールできました。

# 5. おわりに

* nxのカメラのトラブルといい、今回のAGX XavierといいJetPack4.6はなにかあるのでしょうか。フォーラムやドキュメントでいい説明がなかったので、メモとして残しておきます。

* Jetson Nanoの方はあまりSDKmanagerとSDカードイメージを行き来するなどなく、SDカードが主流かとおもいますのであまりトラブらないのかなぁといった感じです。
Site24x7と連携したMS Teams上でChatOps 

Site24x7は様々なアプリと連携できますが、今回はMS Teamsと連携しChatOpsを構築してみました。
https://www.site24x7.jp/

この連携における特長としては3点あります。
1)ダッシュボード機能でSite24x7の監視全体概要を把握できる
2)最新のアラート情報が逐次投稿され、そのアラートに関連したアクションまでボタン1つで行える
3)ボットとの会話で監視に関する欲しい情報が表示される


1)はSite24x7で設定済みのダッシュボードをTeamsでも取り込んで表示できる機能ですが、
Site24x7のコンソールを逐一表示しなくてもよいのが利点です。
ダッシュボードがあれば監視全体の概要が容易に把握できるので、影響範囲や障害情報に行き着くまでの最初のステップとして重要です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1674507/c06128b1-bcd0-d2ac-dea1-c351b76ab725.png)


2)は、Site24x7で発生したアラートが次々に投稿されていきます。障害範囲が広かったり
監視項目を多数登録していると、最も確認したいアラートが埋もれてしまい
スクロールで探し出すのが手間に感じます。
ただ、アラート情報からすぐに次のアクションをその場で実行できるのはオペレーションとしても
楽に感じます。
とりあえず、対象のアラートのステータスをメンテナンスマークにして技術担当者を割り当てて障害対応させたり、即座にサーバー再起動等のアクションを実行できます。
技術担当者やIT自動化の実行については、Site24x7の設定に依ります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1674507/e5cf7ad3-0c68-ea0c-0a9d-d1d89a18838a.png)

3)監視項目において、ステータス情報を確認したりパフォーマンス情報を取得したりすることが
Teams内でさらにCLIのような形で解決できるのが利点に感じます。
残念な点は英語の文字しか対応できないようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1674507/7f093cc4-3f94-3824-07cb-74a8bcf19f56.png)

ちなみにチャットで取得できる情報は以下のようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1674507/76d167fc-90a4-e08a-148d-3391abf4ad57.png)


なお構築手順は以下の通りです。
https://www.site24x7.jp/help/admin/third-party-integration/microsoft-teams.html
基本的につまずくようなポイントはありませんが、
Site24x7で作成済みのダッシュボードをTeamsで取得するプロセスにおいて、なぜかFireFoxで動かずMS Edgeでうまくいきました。

ChatOpsの簡単な説明になりましたが、もしかするとより実用的で意義深い使い方ができるかもしれませんので今後探求していきたいと思います。
【Python】SSL関係でエラーが発生

# エラー文
```
URLError <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1124)>
```

# 解決方法
```python
import ssl

ssl._create_default_https_context = ssl._create_unverified_context
```

エラーが出るコードに上記のコードを追加することで解決した。

# おわり
詳しくはわかりませんが、
検証されていないSSLを使えるようにするコードだと思うので、セキュリティ的にはよろしくないと思います。
Watson Speech to Text の Next-generation モデルの性能評価をしてみた

## 初めに

Watson Speech to Text では、現在Previous-generationモデル(BroadbandModel, NarrowbandModel)とNext-generation(Multimedia, Telephony)のモデルを提供中ですが、2022年9月15日をもって、日本語とアラビア語を除いてPrevious-generationモデルの提供が終了します。

Next-generationモデルは、Previous-generationモデルよりも認識精度、認識速度があがっているとのことです。
(引用）
IBM Cloud Docs(https://cloud.ibm.com/docs/speech-to-text?topic=speech-to-text-models-ng)
「Next-generation models have higher throughput than the previous-generation models, so the service can return transcriptions more quickly. Next-generation models also provide noticeably better transcription accuracy.」

そこで、実際に認識精度があがっているのか調査してみました。


## 使用データと認識精度の結果

今回、アメリカ英語と日本語で試してみました。
また、Next-generationはMultimedia、Previous-generationはBroadbandModelを使用しました。
認識精度評価としては、WER(Word Error Rate）を用います。
WERの算出については、以下を参考にさせていただきました。
https://qiita.com/Kchan/items/7bba1f066234ba24898b

英語データ
LibriSpeechのtest-cleanデータ
http://www.openslr.org/12/

日本語データ
Common Voice Corpus 6.1 (日本語)
https://commonvoice.mozilla.org/ja/datasets
※一部数字だけの発言等があるため、それらは除外しました

認識結果

|        | Next-generation | Previous-generation | 
| :----: | :-------------: | :----------------: | 
| 英語   | 7.74            | 11.06              | 
| 日本語 | 19.49           | 15.17              | 

今回使用したデータでは、英語はNext-genrationモデルの方が、精度が良かったですが、
日本語では、Previous-generationの方が、精度が良いという結果になりました。
日本語は、Previous-generationを使用続けることが可能なので、場合によっては、
Previous-generationの使用もご検討ください。

## Previous-generation から Next-generation への移行について

いくつかの機能（オプション）は、Next-generationでは使用できません。
また、独自のカスタムモデルを使用している場合は、再度、Next-genearionで学習させる必要があります。
詳細については、下記ドキュメントをご参照ください。
[IBM Cloud Docs]
https://cloud.ibm.com/docs/speech-to-text?topic=speech-to-text-models-migrate
サーバー環境をもらって最初にやること



# SSHでサーバーにアクセス

Windowsのコマンドプロンプトで秘密鍵と公開鍵を作成し，
コマンドプロンプトのSSHクライアントを使ってサーバーにアクセスする

## 公開鍵と秘密鍵の作成

Windowsのコマンドプロンプトを起動．
(画面左下の検索窓から"cmd"もしくは，"コマンド"と検索すれば表示される)
作成場所を聞かれるので，変更する場合は場所のパスを，そのままの場合はEnter.
パスフレーズを聞かれるので，入力.(入力しなくても作成できるが，セキュリティ的には作成した方が良い)

```
$ ssh-keygen -t rsa -b 2048
Generating public/private rsa key pair.
Enter file in which to save the key (C:\Users\stars/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
```

指定したディレクトリに,id_rsaとid_rsa.pubが作成される．(この例では，C:\Users\stars/.ssh/)
id_rsa.pubをサーバーの管理者へ渡す．
id_rsaは，厳重に管理する．(流出するなどした場合は，作り直すこと)

# サーバーへのアクセス

管理者にサーバーを設定してもらったら，コマンドプロンプトからSSHでアクセスできるようになる．

```
$ ssh -p <ポート番号> <サーバーのユーザ名>@<サーバーのIPアドレス>
```

例えば，下記のように

```
$ ssh fuga@192.168.11.1
```


# 事前準備の流れ

勉強会に参加するにあたり，サーバー環境が必要となる．
また，プログラミングを全くやったことがない人向けに資料の読み方などを記載する．

- 流れ : 
    - 資料の読み方
    - 開発環境の準備
    - サーバー環境をもらって最初にやること
    - 学習用データのダウンロード


## 資料の読み方

黒塗りの部分にはコマンドもしくは，プログラムが記載されている．
白文字で記載されているのがコマンド，着色された文字が含まれているのがプログラムである．
今回の勉強会では，プログラミング言語はPythonのみであるため，プログラムが記載されている場合は，Pythonで記述されている．
※ コマンド : Linux OSを操作するための手段．文字列を入力し，OSを操作する．
※ プログラム : コンピュータが実行する処理手順をプログラミング言語で記述したもの．

```
ここには，コマンドもしくは，プログラムの内容が記載されている．
```

コマンドの場合，`$`が先頭にある行は，一般のユーザーで実行するということ．
`#`が先頭にある行は，管理者権限を持つユーザーで実行するということ．
`$`, `#`のどちらもない場合は，コマンドの実行結果が表示されているということ．
自分で実行する際は，先頭の`$`,`#`は含めずに実行する点に注意．

```
$ ls -la
# ls -la
```


プログラムが記載されている場合，`#`の後には，プログラムの内容などの人間が読むための，
コンピューターの命令ではない文字列を記載してある．
(実際にPythonでは`#`以降をコンピューターは認識しない)
残して置きたいプログラムの内容を記述するときにも使用する．
プログラムはそのままコピー&ペーストすることで動作するように記載している．

```.py
print("プリント") #プログラムのコメントが記載
#print("残しておきたい")
```




## 開発環境の準備

自分で環境を作成する場合

Virtual BoxやWSLを使用して仮想環境を作成すると良い

https://qiita.com/t-baba-11/items/1aa80df8df27e30dac4e

https://qiita.com/t-baba-11/items/9d74710ce960b582dcd2



### パスワードの変更

初期パスワードを変更する.
ターミナルでログインして，初期パスワードを入力し，
新しいパスワードを二度入力する．

```
$ passwd 
Current password:
新しいパスワード:
新しいパスワードを再入力してください:
```

## Jupyter Notebookの使い方

jupyter notebookはデフォルトでは，localからしか接続できないので，
設定ファイルを作成し情報を追記します．
(0.0.0.0はすべてアクセスを許可する設定のため，セキュリティには，注意が必要)

```
$ jupyter notebook --generate-config
$ sed -i "$ a c.NotebookApp.ip = '0.0.0.0'" ~/.jupyter/jupyter_notebook_config.py
```

### Jupyter Notebookの起動と終了

#### 起動方法

```
$ jupyter notebook
```

URLが表示されるため，127.0.0.1の部分をサーバーのIPアドレスに変更して，ブラウザでアクセスする．

#### 終了方法

Ctrl + C

終了していない場合，ポートが解放され続けるので，必ず終了させること
Linuxについて６（自分用メモ


ファイルやディレクトリを作成したユーザーが所有者となり、所有者のプライマリグループが所有グループに適用される。
所有者と所有グループはls -lで確認できる。

●所有者の変更　rootのみ
chown ［-R］　所有者　ファイル名またはディレクトリ名

ディレクトリの情報を表示するときは　ls -ld コマンド（-ldオプションをつける）

●所有グループの変更　rootおよび一般ユーザー
chgrp ［-R］　グループ名　ファイル名またはディレクトリ名

※一般ユーザーの場合は、所属しているグループのみ指定できる。

●所有者と所有グループを同時に変更したい場合
・chown ユーザー名:グループ名　ファイル名
・chown ユーザー名.グループ名　ファイル名

●ファイルやディレクトリにはアクセス権が設定されている。
アクセス権には、①所有者　②所有グループに属するユーザー　③その他のユーザーに対して設定される。

設定される内容としては、
１、所有者はファイル内容を読み出したり、書き込んだりできる
２、所有グループに属するユーザーはファイル内容を読み出せるが書き込みできない
３、その他のユーザーはファイル内容を読み出すことも書き込むこともできない

これをパーミッションという。

アクセス権には、
・読み取り権＝r（Read)
・書き込み権＝w(Write）
・実行権　　＝x（eXecute）

があり、ファイルのパーミッションはls -l コマンドで確認できる。
「rw-re-r—」の部分がパーミッションにあたる。パーミッションは最初の３つから「所有者のアクセス権」、「所有グループのアクセス権」、「その他のユーザーのアクセス権」を表す。

また、アクセス権は数字で表すことができ、
読み取り権＝４、書き込み権＝２、実行権＝１
合計は７

●読み取り権
ファイルに読み取り権が設定されていると、ファイルの内容をcatコマンドなどで読み出せる。

●書き込み権
ファイルに書き込み権が設定されているとファイル内容を変更することができる。
ディレクトリに書き込み権が設定されていると、そのディレクトリ内でファイルを作成・削除できる。
※ファイルに対するアクセス権がなくてもファイルを削除できてしまうので注意。

●実行権
権限が設定されているとファイルをプログラムとして実行することができる。
そのディレクトリ内にcdコマンドで移動したり、ディレクトリ内のファイルにアクセスしたりできる。

●パーミッションの変更　ディレクトリ所有者とrootのみ
chmod ［-R］　アクセス権　ファイル名またはディレクトリ名

-Rオプションをつけると、指定したディレクトリ以下全てのアクセス権を変更することができる。
アクセス権には「７６１」のように数字を指定するか記号を指定する。

●スティッキービット
/tmpや/var/tmpディレクトリのパーミッションでは、その他のユーザーの実行権が「t」になっている。これはスティッキービットという特殊なアクセス権が設定されている。
スティッキービットが設定されたディレクトリは誰でもファイルを作成できるがファイルを削除できるのはファイルの所有者のみ、という制限がかけられる。（rootユーザーを除く）
スティッキービットを設定しておくことで、ファイルを勝手に削除されるのを防ぐ。
定期的にアップデートしようねっていう話

# ある日の出来事
「久々の新案件だなー。環境構築♪環境構築♪」
「構築手順に沿って`docker-compose up -d`っと〜 」
「あれ、立ち上がらん。なぜ、、手順は間違ってないのに..」

# 原因
1. 諸事情により長らく別のPCを使っていた
2. アップデートすんのめんどいなー（最新版って不具合ありそうだし）って後回しにしてた
3. 問題なく使えてるし大丈夫やろとか思ってた

# 解決
まずMacOSを
**mojave 10.14** から
**monterey 12.4** にアップデート

次にdocker for Macも
**ver 3** から（正確なver忘れた）
**ver 4.9.1** にアップデート

「今度こそ立ち上がれ、、お願いしまーーーす！！！」

無事環境構築完了したのであった。

# まとめ
無駄な時間を使うことになりますので定期的にアップデートはしましょうね、、
動作軽くなったりしたり便利な機能が使えるようになったりといい事いっぱいあります。
アプデしてなさすぎて自分で引くわ、、

# ついでに
他にもIDEの**phpstorm**はアプリ内では最新に更新してたけども差分のタブ表示ができなくて環境設定を変えようにもUIとか設定内容変わってたので一度アンイストールしてからもう一度インストールしたら設定項目表示されて無事表示できました。
LightGBMのコードを読み解くのに必要だった知識をまとめてみた


LightGBMのコードを読み解く必要があり、調べた内容をまとめました。


## LightGBMとは

[NIPS2017読み会](https://www.slideshare.net/tkm2261/nips2017-lightgbm-a-highly-efficient-gradient-boosting-decision-tree)
[LightGBMの理論のまとめ](https://nigimitama.hatenablog.jp/entry/2021/01/16/212601)

GBDT(勾配ブースティング決定木)のフレームワーク
動きが早いかつ精度高く人気らしい

GOSSとEFBが重要らしいけどちゃんと理解するのは保留


## 使用されているパラメータ

### boosting_type

boostingはアンサンブル手法のこと
LightGBMで選択できるのは下記の4つ

[lightgbm.LGBMClassifier](https://lightgbm.readthedocs.io/en/latest/pythonapi/lightgbm.LGBMClassifier.html)

| 略 | 正式 | 日本語 | 意味 |
|:-:|:-:|:-:|:-:|
| GBDT | Gradient Boosting Decision Tree | 勾配ブースティング決定木 | https://www.acceluniverse.com/blog/developers/2019/12/gbdt.html |
| DART | Dropouts meet Multiple Additive Regression Trees | 多重加法回帰木 | https://www.simpletraveler.jp/2019/10/01/gradientboosting-dart/ |
| GOSS | Gradient-based One-Side Sampling |  | |
| RF | Random Forest | ランダムフォレスト  | |

GOSSって日本語だとなんだろう？


### objective

目的
[Core Parameters](https://lightgbm.readthedocs.io/en/latest/Parameters.html#core-parameters)

| 略 | 日本語 | 意味 | 補足 |
|:-:|:-:|:-:|:-:|
| regression | 回帰 | mean_squared_errorを誤差関数として使う回帰
| regression_l1  | 回帰 | mean_absolute_errorを誤差関数として使う回帰 | |
 | metricはmaeかmse,rmseがよい？ |
| binary  | 二値分類 | logless? | ラベルは0,1  |
| multiclass  | 多クラス分類 | metricはmulti_logloss(softmax関数)とmulti_error, num_classsオプションも推奨  |
| huber  |   |   | |
| fair  |   |   | |
| poisson  |   |   | |
| quantile  |   |   | |
| mape  |   |   | |
| gamma  |   |   | |
| tweedie  |   |   | |
| multiclassova  |   |   | |
| cross_entropy  | クロスエントロピー |   | |
| cross_entropy_lambda  |   |   | |
| lambdarank  |   |   | |
| rank_xendcg  |   |   | |

まずは`regression `, `binary`, `multiclass`を抑えておけばよさそう。

### metric

評価方法
[Metric Parameters](https://lightgbm.readthedocs.io/en/latest/Parameters.html?highlight=metric#metric-parameters)

種類が多いので押させておきたいものだけ表にしました。


[【翻訳】scikit-learn 0.18 User Guide 3.3. モデル評価：予測の質を定量化する](https://qiita.com/nazoking@github/items/958426da6448d74279c7)
[機械学習で使われる評価関数まとめ](https://qiita.com/monda00/items/a2ee8e0da51953c24da8)



### その他、GBDTで使われるパラメータ

[lightgbm.LGBMClassifier](https://lightgbm.readthedocs.io/en/latest/pythonapi/lightgbm.LGBMClassifier.html)

こちらの記事で図解で説明されていたのでとてもわかりやすかったです。
https://knknkn.hatenablog.com/entry/2021/06/29/125226


## 知っておくべきライブライ

```py
# train, testデータの分割(デフォテスト25%)
from sklearn.model_selection import train_test_split

# train, testデータの分割
from sklearn.model_selection import KFold

# カテゴリ変数を数値へ変換
from sklearn.preprocessing import LabelEncoder

# モデル評価用(回帰用)
from sklearn.metrics import mean_squared_error  # 平均二乗誤差
from sklearn.metrics import r2_score  # 決定係数

# モデル評価用(分類用、多分)
from sklearn.metrics import log_loss 
from sklearn.metrics import f1_score  # F値

# 表作成用 
import matplotlib.pyplot as plt
!pip install japanize-matplotlib  # Google Colaboratoryで必要
import japanize_matplotlib
import seaborn as sns
```
Firefoxで起動時に複数サイトを立ち上げる

# やり方

1. 右上⇒設定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/b9427bc9-1af6-d2b9-f430-8058a0c9c0b6.png)
1. ホーム⇒カスタムURL⇒ホームページと新しいウィンドウ⇒『|』区切りで記述。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/04d38284-0a63-edf5-6ca1-d3d4e52d82ef.png)
1. 左から順番に開かれる。
上記の場合、 **一番左** のタブがhttp\://tes1、 **一番右** のタブがhttp\://tes3、となる。


# バージョン

Windows 10 Pro 21H2 OSビルド 19044.1889
Firefox 103.0.2 (64 ビット)
【Git】git cloneして別のリポジトリにpushする

## 別名で`git clone`
元のリポジトリ名とは別名で`git clone`します。
```:ターミナル
$ git clone git@github.com:ユーザー名/リポジトリ名.git 別名
```

## 新リポジトリを作成する
新しいリポジトリを作成します。
作成方法については以下のページをご参照ください。

https://docs.github.com/ja/get-started/quickstart/create-a-repo

## `remote url`を変更
以下のコマンドでリモートリポジトリを変更します。
```:ターミナル
$ cd $_

$ git config remote.origin.url
git@github.com:旧ユーザー名/旧リポジトリ名.git

$ git remote set-url origin git@github.com:新ユーザー名/新リポジトリ名.git

$ git config remote.origin.url
git@github.com:新ユーザー名/新リポジトリ名.git
```

2回目の`git config remote.origin.url`で新しいリポジトリの情報が表示されることを確認します。
表示されていればあとは通常通り`push`するだけです。
teipコマンド

## teip  
### コマンドインストール方法  
```shell
$ wget https://github.com/greymd/teip/releases/download/v2.0.0/teip-2.0.0.x86_64-unknown-linux-musl.deb
$ sudo dpkg -i ./teip*.deb
```
### 使い方  
- 基本動作  
  fオプションで区切られたフィールドを選択する。  
  ```shell
  $ echo "100 200 300 400" | teip -f 3
  100 200 [300] 400
  ```
- コマンド利用  
  フィールド選択後コマンドを記述する。  
  （コマンドの前に--記述推奨）
  ```shell
  $ echo "100 200 300 400" | teip -f 3 -- cut -c 1
  100 200 3 400
  ```

- 範囲指定  
  
  fオプションで選択対象を指定できる。  
  ※teip -f -3の時にエラーが起きました。 
　[公式](https://github.com/greymd/teip)の入力例と異なる挙動です。  
  ```shell
  $ echo "100 200 300 400" | teip -f 1-3 -- sed 's/./@/g'
  @@@ @@@ @@@ 400
  $ echo "100 200 300 400" | teip -f 2- -- sed 's/./@/g'
  100 @@@ @@@ @@@
  
  ```
- 文字範囲選択  
  ```shell
  $ echo ABCDEFG | teip -c 1,3,5,7 -- sed 's/./@/'
  @B@D@F@
  ```

- 区切りテキストの処理(CSV、TSV等)  
  dオプションを使用する。
  - CSV処理  
    ```shell
    $ echo "100,200,300,400" | teip -f 3 -d , -- sed 's/./@/g'
    100,200,@@@,400
    ```
  - TSV処理  
    ```shell
    $ printf "100\t200\t300\t400\n" | teip -f 3 -d $'\t' -- sed 's/./@/g'
    100     200     @@@     400
    ```
  - 拡張正規表現指定  
    Dオプションを使用する。
    ```shell
    $ echo "1970-01-02 03:04:05" | teip -f 2-5 -D '[-: ]' -- sed 's/./@/g'
    1970-@@-@@ @@:@@:05
    ```






## 参考文献  
- [teipコマンド](https://github.com/greymd/teip)
Redis To Go がサービス終了するので Heroku Redis に移行する


## はじめに

- Heroku で Redis を使う際によく使われていた "Redis To Go" が 2022/08/08 にサービス終了されるとアナウンスが届きました
- Redis To Go から Heroku Redis に移行する方法を調査し、移行したのでその記録をまとめました

## 移行先を選ぶ

今回は時間的都合から、 Heroku から別のプラットフォームに変更することは検討していません
Heroku で Redis Addon は複数ありますが、今回は "Heroku Redis" を選択しました
選択した理由は、 "Heroku 公式の Addon である", "データの移行が容易" の 2 つです

https://elements.heroku.com/addons/heroku-redis

また、 "Heroku Redis" 以外の Addon は以下から検索できます

https://elements.heroku.com/search/addons?q=Redis

## データを移行する

### 事前準備

#### Heroku CLI の Install

データの移行には、 Heroku CLI を必要とします
Heroku CLI が Install されていない場合は以下ドキュメントを参考に Install をしてください

https://devcenter.heroku.com/articles/heroku-cli

#### Redis To Go の接続先を取得

Heroku CLI から "Redis To Go" Redis の接続先情報を取得します

接続先情報は環境変数 `REDISTOGO_URL` に保存されています
`heroku config` を実行すると対象の App に設定されている、環境変数を取得できます

```sh
heroku config -a YOUR_APP_NAME | grep REDIS
```

上記コマンドを実行すると、 `redis://<user_name>:<password>@<hostname>:<port>` 形式の Redis の接続先情報が表示されています
後の設定に必要なので手元に保存しておきましょう

### Redis データの移行を行う

今回の移行先である "Heroku Redis" を作成すると共に、データの移行を実施します。
移行にはデータ量に関わらず 30 分 ~ 45 分 かかりました
また、"Heroku Redis" の作成を行うと、 Redis の接続先情報が `HEROKU_REDIS` 等に設定されます移行中の Redis に誤って接続されないよう App 側の設定は事前に変更しておきましょう

"Heroku Redis" 作成と同時に Redis のデータを移行する場合は、 `heroku addons:create` を実行する際に `--fork` オプションを付け実行する必要があります

```sh
heroku addons:create heroku-redis:hobby-dev --fork redis://h:<password>@<hostname>:<port> -a YOUR_APP_NAME
```

"Heroku Redis" の作成状態については `heroku redis:info` コマンドで確認することができます

```sh
heroku redis:info -a YOUR_APP_NAME
```

移行開始直後は Status が `Preparing (fork in progress)` になっていますが、 移行が完了すると `Available` に変更されます

### App の接続先を切り替える

"Redis To Go" から "Heroku Redis" にデータの移行が完了したら接続先を切り替えます
私の場合は環境変数を変更しました

## Reference

https://devcenter.heroku.com/articles/heroku-redis#using-the-cli

> END OF LIFE NOTICE
>
> ON AUGUST 8TH, 2022, WE WILL BE SHUTTING DOWN OUR PLATFORM. THIS DECISION WAS MADE AFTER CAREFUL ANALYSIS OF OUR BUSINESS AND OUR ABILITY TO MAINTAIN THE STANDARD OF SUPPORT FOR CUSTOMERS ON THIS PLATFORM.
>
> WE RECOGNIZE THAT THIS WILL POTENTIALLY CAUSE SOME CHALLENGES AND WE WANTED TO COMMUNICATE THIS CHANGE AS EARLY AS POSSIBLE. TO AVOID ANY SERVICE INTERRUPTIONS, WE RECOMMEND BEGINNING A MIGRATION PLAN AS SOON AS POSSIBLE.
>
> THANK YOU,
> REDISTOGO SUPPORT

https://redistogo.com/

https://redistogo.com/documentation
100日後くらいに個人開発するぞ！day062

## 今日はクラスメソッドを学んでみた！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2632394/9d4cde99-d5f7-7cbd-102a-9c8799c55c21.png)


## 「Ruby 学習レッスン V」コースを修了！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2632394/90981a82-493c-1ca8-6b22-d057a38bce42.png)




## 今日の学び
### クラスメソッドの定義
* クラスメソッドは`def クラス名.メソッド名`とすることで定義できる
    * 例
        * `class Menu`
        * `def Menu.is_today_sunday?`
        * `処理`
        * `end`
* インスタンスメソッドとの違いはメソッド名の前にクラス名を書く必要がある点

### クラスメソッドを呼び出す
* クラスメソッドは`クラス名.メソッド名`で呼び出すことができる
    * 例
        * `class Menu`
        * `def Menu.is_today_sunday?`
        * `処理`
        * `end`
        * `puts is_today_sunday?`
* クラスメソッドはクラスの中でも同じように呼び出すことができる
    * 備考：インスタンスに対して呼び出すメソッドはインスタンスメソッド
WordPressから自作テーブルを利用する

本稿は下記案件の続きです。併せてご参照下さい。

https://qiita.com/mindwood/items/eccc97cc0eacff1bdc95

# やりたいこと
昨秋以降の原油価格上昇に加え円安とウクライナ情勢...と仕入コスト負担が急騰し、価格改定（値上げ）のニュースが後を絶ちません。
価格改定の度に、ホームページに記載している価格を手作業でひとつひとつ修正するのはしんどいので、データベースを参照するように直してみました。

# データベースを準備しよう
まず、システムから抜いた価格情報（下図はイメージ）をCSVファイルにしてサーバにアップロード。
MySQLにインポートします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236222/d44479fa-9f68-8250-1005-3ee847186a0a.png)

```:MySQLにログイン
mysql -h example.com -u ユーザ名 -pパスワード データベース名 --show-warnings
```

`LOAD DATA`構文を使うので `--show-warnings` を指定して接続するのがお勧めです。
今回は、WordPressと同じデータベースに作成します。

```sql:MySQLからテーブル作成
CREATE TABLE wp_foo_product (
  code VARCHAR(50) NOT NULL PRIMARY KEY,
  name VARCHAR(255),
  class CHAR(2) NOT NULL,
  old_price INT UNSIGNED DEFAULT 0,
  new_price INT UNSIGNED DEFAULT 0,
  url VARCHAR(160),
  amazon_url VARCHAR(160)
);
```

```sql:MySQLでインポート
LOAD DATA LOCAL INFILE '/tmp/wp_foo_product.csv'
INTO TABLE wp_foo_product
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"';
```

エックスサーバーには phpMyAdmin が標準でインストールされているので、そこで操作しても良いですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236222/c1eb2d0c-4450-d669-3060-6da24ca6537f.png)

# WordPressをいじろう
テーブル名をWordPressに登録します。
書き方は`wp-includes/wp-db.php`のwpdbクラスが参考になります。

```php:wp-content/db.php
<?php
require_once(ABSPATH.WPINC.'/wp-db.php');

class my_wpdb extends wpdb {
    public $tables = array(
        'posts',
        'comments',
        'links',
        'options',
        'postmeta',
        'terms',
        'term_taxonomy',
        'term_relationships',
        'termmeta',
        'commentmeta',
        'foo_product'  ← ← ← 今回追加したテーブル名（プレフィックスは不要）
     );
}
if(!isset($wpdb)) {
    $wpdb = new my_wpdb(DB_USER, DB_PASSWORD, DB_NAME, DB_HOST);
}
```

ユーザー定義関数を`functions.php`に追加します。
品目コードを受け取ると、その価格を返却する、というものです。

```php:functions.php
function my_get_price($code) {
	global $my_price_flag_new;
	global $wpdb;
	$product = $wpdb->get_row("SELECT * FROM $wpdb->foo_product WHERE code = '$code'");
	if (is_null($product)) {
		return '-';
	}
	if ($my_price_flag_new) {
		return '\\ '.number_format($product->new_price);
	} else {
		return '\\ '.number_format($product->old_price);
	}
}
```

価格を掲載しているHTMLを修正します。
価格表示箇所を、先ほどの関数呼び出しに置き換えます。

```html:修正前
<tr>
  <td>A1636CX</td>
  <td>ほげほげ</td>
  <td>\ 36,000</td>
```

```php:修正後
<tr>
  <td>A1636CX</td>
  <td>ほげほげ</td>
  <td><?php echo my_get_price('A1636CX') ?></td>
```

価格改定のタイミングでフラグ（グローバル変数）を立てれば、一斉に新価格に切り替えることができます。

```php
$my_price_flag_new = true
```

HTMLの修正が必要なのは初回のみです。
次回からはテーブルを差し替えるだけで良く、大幅な省略化になりました。

# さいごに
サーバ全体の仕組みを知っているバックエンドエンジニア（サーバサイドエンジニア）にとっては、正直なんてことない作業なのですが（開発というのもおこがましいくらい）、非ＩＴ企業でこういうことをサクっとやってみせると結構喜んでもらえます。
【新卒必見】報連相は重要

実務でこんな経験をして悲惨な目に遭ったという体験を共有できればと思って書きました。

# 実体験
とある仕事がクローズの段階に入ってしまった。まあ、こんな体験はなれたことでまた暇になるんだろうくらいの状態で仕事はしていた。だが、今回は違った。
もともと入ったときから炎上していたといえば炎上していたので、クローズのギリギリになっても全然余裕がない。むしろクローズする気あるのかって感じでまだまだ仕事が降ってくる。
それでも自分の仕事にはめどがついてきたころ、チームのメンバーから自分の仕事が終わりそうにないとの話題があった。まあ、この時点ではまだまだどうにかなりそうだな位にしか思っていなかった。
で、何を手伝えばいいのか聞いてみたが、いまいち煮え切らない答えしかやってこない。まったくとは思いつつ、仕事を進めていったら、話は食い違う。はっきり言ってだめなときは早々に連絡がほしかった。

# ギブアップするなら早くしよう
新人（新卒）ははやく報連相して指示を伺うのも仕事だと思う。過去に何件かやっているのであれば、こうやってみたいな方針とか分かるかもしれないが、やったことないもんどんだけ時間かかるか分からん。そんなもん誰かに分かるまで聞かないと無理なもんは無理ってキッパリ決めておいた方がいい

# どんな感じで報連相したらいいかわからない
わかんないなら状況だけでも伝えちゃえって思っていた方がいいと思う。
何回も繰り返すと成長ないなこいつと思われかねないが、新人（新卒）なら仕方ないくらいで許される場合の方が多い

# 期限には余裕があるが
期限には絶対に余裕を持たせて組んでいるはずである。なので、ちょっとくらい遅れたってとか思うことがあるが、そんなことは忘れたほうがいい。決めたデッドライン（期限）は絶対だと思っていると相手に期限を守ろうとしているという誠意を見せることもできる。（必ずしも誠意として受け入れられる訳ではないので注意）
特定の日付や期間のレコードを抽出する(SPSS Modeler データ加工逆引き1-7)

# 特定の日付や期間のレコードを抽出（特定日/期間の抽出）

![スクリーンショット 2022-07-15 10.12.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/a4dabcb9-f510-35db-edad-2d82eca43472.png)

## 1.想定される利用目的
・異常値の確認
・時系列予測モデルの学習と検証のデータ分割

## 2.サンプルストリームのダウンロード

https://github.com/yoichiro0903n/blue/blob/main/datetime_date.str?raw=true

## 3.サンプルストリームの説明

![スクリーンショット 2022-07-15 10.12.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/9ae7b94f-62b9-54ce-aef0-7aac1187ed5d.png)

a.入力するデータは以下の通りです。
![スクリーンショット 2022-07-15 9.58.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/482ac032-6911-852f-8332-5af70ca725d6.png)

プレビュー時点で3月5日のセルを選び[生成]メニューから[条件抽出ノード(AND)]を選択するとbが自動生成されます。
![スクリーンショット 2022-07-15 10.15.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/5f70d381-6189-cd6b-83f5-ff48cac5e99d.png)

b.[条件抽出]ノードを編集します。
![スクリーンショット 2022-07-15 10.16.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/02211304-dd48-47ae-8084-c877e7839260.png)

[テーブル]ノードを実行します。3月5日のレコードだけを抽出できました。
![スクリーンショット 2022-07-15 9.58.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/871ca126-9b77-5354-4e75-d59bfbec1096.png)

#### 期間を直接記述する方法

c.[条件抽出]ノードを編集します。3月の日付の範囲を式で記述します。
![スクリーンショット 2022-07-15 10.16.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/bae99f58-7109-6597-5e8e-6086e551c0c7.png)

[テーブル]ノードを実行します。3月のレコードだけを抽出できました。
![スクリーンショット 2022-07-15 9.59.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/dd4b7d03-a02c-9d74-6a7b-fd84135093eb.png)

#### 時系列グラフから[条件抽出]ノードを自動生成する方法

d.[時系列グラフ]ノードを実行します。[表示]は[ポイント]を選んでいます。赤い縦棒（バンド）を利用して期間を指定します。期間の内側で右クリックし[バンドの条件抽出ノードの生成]を選択するとeが自動生成されます。
![スクリーンショット 2022-07-15 10.00.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/836510c8-7ce6-c1f8-7bfd-e151a74ec125.png)

e.[条件抽出]ノードを編集します。範囲を選択する式が自動記述されていますので3月1日から31日になるように調整します。
![スクリーンショット 2022-07-15 10.16.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/678dc439-111d-92e6-cd54-a223e89e48ef.png)

#### 注意事項

[時系列]グラフで赤い縦棒（バンド）ボタンが見当たらない場合には[表示]から[インタラクティブ]を選択します。以下の記事に手続が解説されています。

https://qiita.com/416nishimaki/items/c5cc0c087b464fe162e5#%E9%A0%98%E5%9F%9F%E3%81%AE%E6%9D%A1%E4%BB%B6%E6%8A%BD%E5%87%BA

## 4.参考情報

#### よく使う「日付と時間」関数

https://qiita.com/Makimaki2020/items/72e3b774039327fa4ac4

#### SPSS Modeler ノードリファレンス目次

https://qiita.com/416nishimaki/private/503037195081d3323eee

#### SPSS Modeler 逆引きストリーム集（データ加工）

https://qiita.com/416nishimaki/private/4bf813e6cba84b2a1008
（材料集め中）固定電話（IMS）のアーキテクチャ・シーケンス

# 背景
モバイルな友人から、固定電話のサーバ（IMS）を勉強したいといわれ、国際標準・公開情報を集めて作成。
キャリア網の内側の広大なイントラネットの解説です。最近はやりのWeb3とは真逆の中央集権的がつながりあった網のお話です。

# スコープ

# 参考文献
[1] Edgecore ニュースレター https://www.edge-core.com/jp/news-inquiry.php?cls=12&id=517
[2] 長期増分費用モデル研究会 
https://www.soumu.go.jp/main_sosiki/joho_tsusin/policyreports/chousa/chouki_index.html
[3]長期増分費用モデル研究会（第73回）配布資料
https://www.soumu.go.jp/main_sosiki/joho_tsusin/policyreports/chousa/chouki/02kiban03_04000782.html
[4]JT-Q 3402 https://www.ttc.or.jp/download_file/3773/300
[5]JJ-90.30 https://www.ttc.or.jp/application/files/6015/5418/5716/JJ-90.30v5.pdf
# 1. 全体アーキテクチャ

# 2. 電話サーバまでの物理的なネットワーク

# 3. ネットワークとコアとIMS（電話サーバ）

# 4. 電話（SIP）シーケンス
## UNI(端末とキャリア網の間) JT-Q3402
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311625/0ac208c7-f386-3ddc-7cd1-a8054aec7685.png)

## NNI（キャリア網間）　JJ-90.30
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311625/e4ce1b9e-8443-182d-02c7-2651a4ad80fc.png)



# おまけ勉強になった絵
## NWとコア網の関係[1]
キャリア網（アクセスルータ、Aggrebationルータ、コアルータがあって）に、コアルータに電話サーバくっついているイメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311625/89049bca-46e5-08c6-75d4-e17366133db0.png)

## 収容局とコア局[2]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311625/e19ee8cb-4a23-14aa-277f-87ad0f3e6b02.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311625/4ad48b60-fc6f-6ec7-a130-5bfcf8e17c9a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311625/c15298ec-ec8e-31b6-338a-c7eb2ad4dc5d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311625/dde13cf6-6f92-ac77-f56b-d5203d0a74c2.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311625/b5f15674-1285-5394-c445-2504349bbad8.png)

SBさんの資料わかりやすい
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311625/c0a1b6e0-3853-05b8-8bed-99b91b7710ef.png)

NTTもわかりやすかった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311625/8c620bc5-9651-a76b-a8f4-cb769bd05f84.png)

## 長期増分費用モデル研究会（第73回）配布資料[3]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311625/7e853408-f873-5252-b134-7ecf3f22fad9.png)
Blenderを使って、NASAのHight Mapから月の３Dモデルを作る。

HightMapから月の３Dモデルを作ろうとして詰まったのでメモ。

# 流れ
1. 平面を作成
2. 細分化
3. ディスプレイスでHightMapを反映←ちょっと詰まった
4. シンプル変形で平面を球体化←詰まった

# 1. 平面を作成
オブジェクトモードでメッシュの平面を作成
スケールをHightMap画像の比に合わせておく（自分はXは2、YZは1でできた）

# 2. 細分化
編集モードで平面を右クリックで出る細分化をお好みの回数クリックして、細分化（月の凸凹の解像度になる）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2745572/585805e2-3c4a-6006-09f6-83a5b470166f.png)

# 3. ディスプレイスでHightMapを反映
モディファイアプロパティを開き、モディファイアを追加からディスプレイスを追加
テクスチャにHightMap画像を選択　画像の向きとかでうまくいかないかも
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2745572/8d542748-621a-ee28-65db-8e90cdb9324f.png)


# 4. シンプル変形で平面を球体化
https://www.youtube.com/watch?v=Lr49AyeM8p4&ab_channel=Jayanam

この動画を見て球体化
EmptyのArrowの向きに注意


# 終わり
超初心者なので意味ないかもしれないけれど、他の同じような記事だとうまくできなかったので一応。間違いやもっといい方法もあると思うので指摘お願いします。。。
ImageJ で作った PowerPoint に対応していない動画を埋め込んだり、再生速度を変える方法

## 2022/10/9 追記
ImageJ の動画を PowerPoint に貼るための苦労だったが、実は
- 元の動画を 8-bit に変換した
- jpg 圧縮の .avi を作る

ことで、PowerPoint でも再生可能だった。
この目的であれば、それが一番簡単かも。

## 結論
VLC Media Player を、ActiveX plugin で PowerPoint に埋め込む。
但し、MRL には、 `file:///`＋再生したいファイルパス を入れることに注意。
Windows Media Player を埋め込むと、動画の再生速度を変えることもできる。

## 背景
生物系の人や顕微鏡を使う人は、TIFF画像を使うことが多い。
TIFF形式で撮影した動画を PowerPoint に埋め込むには何らかの動画形式に変換する必要がある。

良さそうなフリーの変換ソフトとして、
- ImageJ
- VLC Media Player

が考えられるが、
- ImageJ で出力できるのは、.avi や .gif で、
    - .avi だと、64 ビットのコーデックがインストールされておらず挿入できない ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669556/1d68057f-5149-b236-bb08-9a37741a16bc.png)
    - .gif にすると Powerpoint に挿入できるが、プレゼン中に動画を少し飛ばしたり巻き戻したりといった柔軟な再生ができない
- VLC Media Player では、なぜか MP4 に変換できない

という事態に陥った。

しかし、.avi に変換すれば、VLC Media Player で再生することはできた。

## 環境
Windows 10
Powepoint バージョン 2206
VLC Media Player 3.0.12

## 方法
VLC Media Player をオブジェクトとして Powerpoint に埋め込む。
参考にしたのは https://smallbusiness.chron.com/insert-vlc-player-powerpoint-40733.html のページ。

- （最初のみ）VLC Media Player をインストール https://www.videolan.org/
- （最初のみ）Powerpoint で、ファイル（左上） ＞ オプション（左下） ＞ リボンのユーザー設定（左） ＞ メインタブ（左）の下をスクロールして、☑開発
- 開発（上） ＞ コントロール中の右下 コントロールの選択 （ドライバーのマーク） ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669556/e9bf4e1c-3fee-bdac-9169-773a1fc6fd22.png)
- （Vボタンを押すと近くに飛べる） VLC ActiveX Plugin and IE Web Plugin v2 を選択
- 動画を挿入したい場所をマウスポインタで長方形を描くように指定 = オブジェクト配置
- オブジェクト上で右クリック ＞ プロパティシート
- MRL にファイルパスを挿入

## 注意
ほとんどのサイトで、MRL にファイルパスを入れると再生できると書かれている。
しかし、実際に入れてみても再生できない。
実は、MRL (Media Resource Locator) は、ファイルの場所の情報以外に、ファイルの種類の情報なども含ませないといけない！
https://wiki.videolan.org/Media_resource_locator/

実用上は、メディア ＞ 変換 / 保存 ＞ 追加 or ファイルをドラッグアンドドロップ ＞ ☑詳細設定オプションの表示 によって、MRL を作ることができる。
https://forum.videolan.org/viewtopic.php?t=149142
（ここで触れられている通り、ほとんどのサイトでは MRL について触れておらず、パスについては間違ったことが書かれている…）

## 応用
- プロパティシートの各変数で、自動ループ・自動再生・途中から再生・音量・ロゴ表示などがいじれる 
 https://wiki.videolan.org/Documentation:WebPlugin/
- 同様の方法で、Windows Media Player も埋め込める https://smallbusiness.chron.com/insert-media-player-object-powerpoint-autostart-42163.html
    - これによって、再生速度を変えることもできる
    - ただし、速い方はおそらく2倍まで
2022/7/25主にITとかセキュリティの記事

海外バーチャルペットサイト「Neopets」顧客データ流出のおそれ―プレイ経験者はパスワードの変更を(7/22)
https://www.gamespark.jp/article/2022/07/22/120555.html

任天堂、旧型Wi-Fi関連2製品の使用停止を呼び掛け(7/23)
https://www.zaikei.co.jp/article/20220723/682251.html

プルーフポイント、「Human Factor 2022」日本語版を発表：2021年はサイバー犯罪者が創造性を発揮した年であったことが明らかに(7/22)
https://www.jiji.com/jc/article?k=000000011.000073972&g=prt

ヘルスケア企業CTO「医療分野でのブロックチェーン活用は不可欠」(7/22)
https://coinpost.jp/?p=369810

重大な事故「恐れ」も報告、通信トラブル防止へ総務省(7/22)
https://www.nikkei.com/article/DGXZQOUA22C1K0S2A720C2000000/

ランサムウェアスポットライト：AvosLocker
AvosLockerは、比較的新しいランサムウェアファミリーであり、最新のランサムウェアの特徴である、窃取した情報を暴露すると脅す「二重脅迫」を用いています。(7/21)
https://www.trendmicro.com/ja_jp/research/22/g/ransomware-spotlight-avoslocker.html

国産クラウドを育てるとは言うけれど(7/23)
https://www.orangeitems.com/entry/2022/07/23/113000

連載816　 デジタル庁ができてもデジタル化できず。 「デジタル後進国」はいつまで続く　（中）(7/22)
https://www.dailysunny.com/2022/07/22/yamada220721-2/

その男はなぜCIAのトップシークレットを暴露しまくったのか？(7/22)
https://courrier.jp/columns/295272/
Steam版 地球防衛軍5をウルトラワイド解像度(21:9)に対応させる方法(備忘録)

Steam版 地球防衛軍5 (EARTH DEFENSE FORCE 5)を、ウルトラワイドモニタ(アスペクト比率が21:9)の解像度に対応させるための方法を備忘録を含めて載せておきます。

# 前置き

:::note
ウルトラワイド対応させる手順のみ知りたい方は
この「前置き」は読まなくて大丈夫です。
次の「準備」の項までスキップしてください。
:::

本作、ゲーム内の画面設定から2560 x 1080などのウルトラワイド比率の解像度を選択すること自体は出来ますが、ゲームのプレイ画面は以下のようになります。⬇

・画面全体に引き伸ばされるだけ
(画面設定でレターボックスがオフの場合)![EarthDefenceForce 5 for PC 2022_07_25 2_30_51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1216467/288d0262-5a66-fd6f-8afc-b190b32b5294.png)

あるいは

・画面両サイドが黒で塗りつぶされ、ゲーム画面のアスペクト比を維持しているだけ
(画面設定でレターボックスがオンの場合)![EarthDefenceForce 5 for PC 2022_07_25 2_17_33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1216467/c1f4a440-b178-7030-ad95-6e5af2fda06d.png)

という感じで、本当の意味でのウルトラワイド対応をしていません。

ウルトラワイドモニタを使用しているのであれば、一般的な16:9のモニターより横長である分だけ、ゲーム画面の視野も広く見れるというのが理想ですよね。

先輩EDF隊員の悲痛な叫び　⬇
>37 UnnamedPlayer ：2019/07/11(木) 21:47:58.41 ID:7EryE4EzM.net
新作なのにウルトラワイドモニター非対応かよ…
設定画面には解像度表示されてるのに、両横にデカデカと、黒帯出るとかどうなってんだ

そこで、本記事の方法でウルトラワイド比率に対応させるとこんな感じになります。⬇
![EarthDefenceForce 5 for PC 2022_07_25 2_38_15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1216467/14560404-e01c-db67-341e-8d3c9177be7e.png)

広い視野でプレイできます。

# 準備

・Steam版 地球防衛軍5 (EARTH DEFENSE FORCE 5)
・HxDなどのバイナリエディタ　(DL先 : https://mh-nexus.de/en/hxd/)

:::note
バイナリ書き換えができるソフトなら何でも大丈夫ですが、
本記事ではHxDを使用しています。
:::
# やり方

ゲームの実行ファイル(EDF5.exe)をバイナリエディタで書き換えします。

:::note warn
実行は自己責任でお願いいたします。
:::

## 手順1
EDF5を起動し、ゲーム内の
<i>システム設定 > 画面設定</i>
を開き、以下のように設定してください。
![EarthDefenceForce 5 for PC 2022_07_25 3_30_13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1216467/698c423c-62c8-b856-52b8-3ba4e30f1816.png)
変更を適用し、必ずセーブして終了してください。

## 手順2
EDF5のローカルディレクトリ内にある、EDF5.exeをバイナリエディタで開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1216467/da44a692-5827-3e0c-b018-912af4f2df65.png)


不安な方は事前にEDF5.exeをバックアップしておいてください。

もしバックアップしていなくても、ゲームを再インストールするか、SteamでEDF5のプロパティを開き、「ファイルの整合性の確認」をして復元できます。(詳しくは調べてください。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1216467/bfe1939a-65a7-5628-96c8-aff6ec621b30.png)

こんな感じの編集画面になります。
ここから、バイナリエディタでの書き換えを行っていきます。

## 手順3

### (1)アドレス60B57Eの値を5Eから42に変更する
HxDのエディタ画面でCtrl + G
⬇
アドレス60B57Eを入力してOKでアドレスまで移動
⬇
値を42に変更する

### (2)アドレス4B24BCの値を20から04に変更する
HxDのエディタ画面でCtrl + G
⬇
アドレス4B24BCを入力してOKでアドレスまで移動
⬇
値を04に変更する

### (3)アドレスEE4CC4の浮動小数点値を、モニタの解像度に応じて下の各値に変更する
<b>[A]解像度2560 x 1080 のモニタを使用している場合　→　2.37037に変更
[B]解像度3440 x 1440 のモニタを使用している場合　→　2.38888に変更</b>

HxDのエディタ画面でCtrl + G
⬇
アドレスEE4CC4を入力してOKでアドレスまで移動
⬇
エディタ画面右側の「データインスペクター」タブから、「Single (float32)」の入力欄に2.37037あるいは2.38888を入力

### (4)(1)から(3)まで終わったら、保存して終了してください。

# 完了
![EarthDefenceForce 5 for PC 2022_07_25 3_34_58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1216467/bd590dd1-190d-c902-b0c3-501a0cc82bf6.png)

ゲームの起動はEDF5.exeをクリックするのではなく、Steamから普段のように起動してください。
ミッションに出撃してみて、しっかりと視野が広くなっていれば成功です。

お疲れ様でした。

:::note warm
<b>補足</b>
以上の方法では、ミッション出撃中のチャットメッセージがチャットの吹き出しからはみ出る現象が発生します。
これでもプレイ自体は可能ですが、気になるという方は以下のバイナリ書き換えも行ってください。
吹き出しからはみ出る現象が修正されます。
:::

(1)アドレスEE5190の浮動小数点値を-600から-500に変更する
(2)アドレスEE4B50の浮動小数点値を0.5625から0.41に変更する
MacでのJava環境構築方法[HomeBrew][VSCode]

### 概要
久々にJava環境構築したら意外とハマってしまったので記録です。

OS：Mac
言語：Java
エディタ：VSCode
ツール：homebrew

必要な手順は大きく5つです。
[1.Javaのインストール](#javaのインストール)
[2.VSCodeのインストール](#vscodeのインストール)
[3.VSCodeを日本語化](#vscodeを日本語化)
[4.VSCodeにJavaをインストール](#vscodeにjavaをインストール)
[5.動作確認](#動作確認)


***
### Javaのインストール
私はbomebrewで管理したかったので↓を参考にしました。
https://codeaid.jp/java-homebrew/

最初は他サイトを駆使してインストール作業していたのですが、いろいろエラーにぶち当たったので↓に別途まとめてます。
https://qiita.com/timustan/items/1ad987232c1a975b8801

***
### VSCodeのインストール
安心安全の公式サイトからインストールします。
https://code.visualstudio.com/download
![スクリーンショット 2022-07-25 1.50.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2745096/398efbd9-4241-c622-a007-c85f78e4b6d8.png)

Mac OSなので然るべきものを選択。
アプリはダウンロードディレクトリに配備されるので、アプリディレクトリにドラッグ&ドロップしとくと次から楽です。

***
### VSCodeを日本語化
VSCodeを起動したら最初にやること。
私は日本語で戦うしがないエンジニアなのでまずVSCodeを日本語化します。
英語いけちゃうハイスペックさん、英語で頑張りたいエンジニアさんは次に読み飛ばしてください。

ちょっと画像が分かりにくくて申し訳ないのですが手順は以下です。
①左の拡張機能アイコンをクリック（`Command + Shift + x`でも可）
②検索欄に`jap`と入力
③「Japanese Language Pack」を選択
④`install`をクリック（画像はインストール後のものなので表示が違います、失礼。）
その後、VSCodeを再起動すると日本語化されます。
※右下に「Restart」が出た場合はそれを押せば再起動不要
![スクリーンショット 2022-07-25 1.59.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2745096/1ffef096-5fa9-b750-2f19-fc687924098d.png)

***
### VSCodeにJavaをインストール
拡張機能にて「Java Extension Pack」をインストールします。
①左の拡張機能アイコンをクリック（`Command + Shift + x`でも可）
②検索欄に`java`と入力
③「Java Extension Pack」を選択
④`インストール`をクリック
![スクリーンショット 2022-07-25 2.20.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2745096/312d3341-274a-b5b9-b4ef-79c7f4f22c19.png)

***
### 動作確認
ようやく準備が整いました。
あとはHello Worldするのみ！
ツールを使って簡単に実行する方法もあるのですが、せっかくなので自分でファイルを作ってみましょう。
手順が長くなってしまったので↓にまとめました。
https://qiita.com/timustan/items/2133dda904841356fea3

ツールを使ってさっくり行きたい人は↓の`VSCodeでJavaを動かしてみよう`からやってみてください。
https://usimaru.net/vscode-install-java/#1


***
### おわりに
こうしてまとめてみると大したことないのですが如何せんHomebrewで躓き、謎に時間を消費してしまいました。
皆さんのお役に少しでも立てればと思います。
参考にさせて頂いたリンク先の主さんありがとうございました。
お疲れ様でした！
VSCodeでHello Worldする[Java][Mac]

### 概要
Mac OSにてVSCodeでHello Worldする方法です。
今回はJavaを使用してます。
環境構築手順は↓をご参照ください。
https://qiita.com/timustan/items/78e02d3c02fbf3cc60cf
***
### 実行ファイルを作成する
①左のエクスプローラーアイコンをクリック（`Comand + Shift + e`でも可）
②「フォルダーを開く」をクリック
![スクリーンショット 2022-07-25 2.27.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2745096/30c7c3cc-4b28-4b9a-38ba-7846061f071b.png)
③適当な開発用ディレクトリを作成、選択（私は今回`DEV`ディレクトリの中に`JavaTest`フォルダを作ってみました）
![スクリーンショット 2022-07-25 2.28.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2745096/6b327362-83c8-aace-de13-9e38a026d9bf.png)
④作成したフォルダに`Main.java`ファイルを作る
![スクリーンショット 2022-07-25 2.46.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2745096/a16eb465-173b-ecc5-cc53-7330cfd56d0f.png)

***
### コードを書いてみる
作成した`Main.java`ファイルに`Hello World`するためのコードを書きます。
``` Main.java
class Main {
    public static void main(String[] args) {
        String msg = "Hello World!";
        System.out.println(msg);
    }
}
```
***
### デバッグする
⑥左のデバッグアイコンをクリック（`Comand + Shift + d`でも可）
⑦「実行とデバッグ」をクリック
![スクリーンショット 2022-07-25 2.50.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2745096/97b630ab-7929-a345-fe62-28a4c31594e6.png)

あとは右下のターミナルに`Hello World!`が表示されればOK！！！
![スクリーンショット 2022-07-25 2.59.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2745096/437d3865-360f-3df5-7592-784f16c83f03.png)

お疲れ様でした！
【HTML】高さ(height)のまとめ【CSS】

## 大前提
・インライン要素には高さは指定できません。（幅も）
・子要素が親要素より大きい場合ははみ出ます。（親要素が広がる）
・設定値により基準があります。（vh,px,%,auto）

## vh
・vhはビューポート(viewport)の略
・ビューポートとは、端末の表示領域のこと。画面を表示できる領域のことです。
　ブラウザで言えば今あなたが見ているブラウザが表示できる範囲を言います。（PCブラウザなら可変です）
　携帯端末だと固定になることが多いです。
・heightを100vhに設定すると高さは画面の高さいっぱいに設定されます。（逆に1を設定すればビューポートの1/100の高さになる）
・基準がビューポートになるため、親要素に影響されません。


## %
・親の要素を基準として、その要素が何%の高さになるかを設定します。（親要素以外には影響されません。）
・親要素の高さがautoの場合は、%は聞きません。

## auto
・heightを設定しない場合、autoがデフォルトで設定されます。
・ブラウザ側が自動で高さを設定します。（とは言え計算方法はあり、画像だとその画像の大きさ分になります）


## その他備考（主に画像について）
### img要素は例外
・img要素はインライン要素にも関わらず、高さ、幅が設定できます
・height:autoを設定した場合、幅(width)の値に応じて、横縦比を維持したまま高さが自動で決定されます。

### 画像が大きすぎて親要素より大きくなってしまう場合
・img要素に直接widthとheightを設定することが多いようです。
・外観を設定する場合はCSSでクラスを適用させるとかしましょう


## おまけ
・画像を横にいい感じで並べたい場合、display:inline-blockでインラインブラック要素に変更し、object-fit:coverで指定した枠をはみ出た場合にはみ出た部分をトリミングするといい感じになります。
・更に疑似セレクタのhoverでマウスオーバー時にopacity:0.5をつけるとそれっぽくなります。
Next.jsでnpm run buildできないときはnext.config.jsの  swcMinifyをfalseにするとnpm run buildできるかもしれない。

環境
・Ubuntu 22.04 LTS(WSL2)
・Node v16.16.0
・npm 8.11.0
・Next.js 12.2.2
・React 18.2.0

npm run buildを実行すると下記エラーが発生した。
```bash:エラーログ
sddd3@wsl:~/dev/abcd$ npm run build

> abcd@0.1.0 build
> next build

info  - SWC minify release candidate enabled. https://nextjs.link/swcmin
info  - Linting and checking validity of types
info  - Using experimental wasm build of next-swc
warn  - Attempted to load @next/swc-linux-x64-gnu, but an error occurred: libssl.so.1.1: cannot open shared object file: No such file or directory
warn  - Attempted to load @next/swc-linux-x64-gnux32, but it was not installed
warn  - Attempted to load @next/swc-linux-x64-musl, but an error occurred: libc.musl-x86_64.so.1: cannot open shared object file: No such file or directory
panicked at 'The global thread pool has not been initialized.: ThreadPoolBuildError { kind: IOError(Error { kind: Unsupported, message: "operation not supported on this platform" }) }', /Users/runner/.cargo/registry/src/github.com-1ecc6299db9ec823/rayon-core-1.9.1/src/registry.rs:170:10

Stack:

Error
    at module.exports.__wbg_new_693216e109162396 (/home/sddd3/dev/abcd/node_modules/next/wasm/@next/swc-wasm-nodejs/wasm.js:202:17)
    at wasm://wasm/059aa236:wasm-function[5445]:0xf90917
    at wasm://wasm/059aa236:wasm-function[13700]:0x11eca7b
    at wasm://wasm/059aa236:wasm-function[9995]:0x1186adc
    at wasm://wasm/059aa236:wasm-function[11009]:0x11b6862
    at wasm://wasm/059aa236:wasm-function[12785]:0x11e5cdd
    at wasm://wasm/059aa236:wasm-function[11383]:0x11c358f
    at wasm://wasm/059aa236:wasm-function[10017]:0x1187e72
    at wasm://wasm/059aa236:wasm-function[1151]:0x98decd
    at wasm://wasm/059aa236:wasm-function[654]:0x75f3f2


info  - Creating an optimized production build
Failed to compile.

static/chunks/framework-aceae1aece8045c6.js from Terser
unreachable
RuntimeError: unreachable
    at wasm://wasm/059aa236:wasm-function[9995]:0x1186aff
    at wasm://wasm/059aa236:wasm-function[11009]:0x11b6862
    at wasm://wasm/059aa236:wasm-function[12785]:0x11e5cdd
    at wasm://wasm/059aa236:wasm-function[11383]:0x11c358f
    at wasm://wasm/059aa236:wasm-function[10017]:0x1187e72
    at wasm://wasm/059aa236:wasm-function[1151]:0x98decd
    at wasm://wasm/059aa236:wasm-function[654]:0x75f3f2
    at wasm://wasm/059aa236:wasm-function[654]:0x760098
    at wasm://wasm/059aa236:wasm-function[3154]:0xd6fe73
    at wasm://wasm/059aa236:wasm-function[654]:0x75f24f


> Build failed because of webpack errors
```

Build failed because of webpack errorsを頼りに解決策を探したところ、webpack5を使うようにする方法があったが解決できなかった。
しかし、swcMinifyをfalseにしたらnpm run buildできた。
```next.config.js
/** @type {import('next').NextConfig} */
const nextConfig = {
  reactStrictMode: true,
  swcMinify: true, <------ここをfalseにする
}

module.exports = nextConfig

```
HomebrewでJavaをインストールする際に発生したエラーと解決策

HomebrewでJavaインストールしようとしたらいくつかエラーにぶち当たったのでメモ。

***
### 「Error: Unknown command: cask」

最初はこれ。
```
$ brew cask install java
```
を実行したら発生したエラー。
<font color = "red">原因はcaskの利用方法が変更されたためでした。</font>
Homebrew2.6まで`brew cask`としていたコマンドは、オプション`-–cask`で指定するように変更されていたようです。
てことで以下を実行。
```
$ brew install java –-cask
```
そして次のエラーにぶち当たる。

***
### 「Cask ‘java’ is unavailable: No Cask with this name exists.」
んん〜〜〜〜〜！
どうやらJDK のインストール方法が変わったようです。
変わらないためには変わり続けることが必要って誰かが言ってました。

***
### 解決策
結局以下のコマンドで最新版の`AdoptOpenJDK`インストールできました。
```
$ brew install --cask adoptopenjdk
```

2022/07時点で最新は16のバージョンでした。
お疲れ様でした。。。