OmniAICreator/Qiita-1.07M huggingface dataset:
jupyterNotebook上でGPU使用率を調べるメモ

↓の方がいいかも
https://qiita.com/tomotaka_ito/items/1da001c98b46ecf28ec7

import os
import numpy as np
import pandas as pd
import tensorflow as tf
import matplotlib
import matplotlib.pyplot as plt
import tensorflow
import keras

from tensorflow.python.framework.ops import NullContextmanager

# GPUを有効化
os.environ["CUDA_VISIBLE_DEVICES"] = "0"

os.environ['TF_XLA_FLAGS']= '--tf_xla_enable_xla_devices'

print('getcwd:      ', os.getcwd())

print("numpy      :", np.__version__)
print("pandas     :", pd.__version__)
print("tensorflow :", tf.__version__)
print("keras      :", keras.__version__)
print("matplotlib :", matplotlib.__version__)

#--------------------------------------
# GPUの使用メモリを制限する。
#--------------------------------------
physical_devices = tensorflow.config.list_physical_devices('GPU')
if len(physical_devices) > 0:
    for device in physical_devices:
   

        growth = tensorflow.config.experimental.get_memory_growth(device)

        print('{} memory growth: {}'.format(device, growth))
else:
    print("Not enough GPU hardware devices available.")
vialus Studioでoracleと接続できなくなった ODP.net

# はじめに
vialus Studioでoracleと接続できなくなった

# 目次
<!-- タイトルとアンカー名を編集 -->
1. [出現したエラー](#Chapter1)
1. [エラーが起きた原因](#Chapter2)
1. [対応手順](#Chapter3)
1. [参考文献](#reference)

<a id="#Chapter1"></a>
# 出現したエラー
DataSetの変更を行おうとしたら下記のエラーが出現

オブジェクト 'MySettings' の接続 'ConnectionString' が見つかりませんでした。接続文字列がアプリケーション設定に見つからなかったか、または接続文字列に関連付けられているデータ プロバイダーが読み込めませんでした。
<!-- 各チャプター -->
<a id="#Chapter2"></a>
# エラーが起きた原因
・Visual Sudioのバージョン変更が原因
エンタープライズからプロフェッショナルに変更(お試し期間が切れるので、変更しました。)

・Oracle Developer Tools for Visual Studioがうまく使えなくなる
<a id="#Chapter3"></a>
# 対応手順
１，oracleclientをアンインストール
https://sql-oracle.com/?p=446#toc1
下記が残っていたら
Visual SudioインストラーからOracle Developer Tools for Visual Studio削除

２，oracleclientをインストール
設定しなおす

OR

ツールだけアンインストールしてインストール
https://www.oracle.com/database/technologies/dotnet-odacmsi-vs2017-downloads.html
<a id="#reference"></a>
# 参考文献
- [https://codezine.jp/article/detail/5499](URL)
- [https://teratail.com/questions/mh1hvx7r398j54](URL)
- [https://sql-oracle.com/?p=446#toc1](URL)
エクセルメモ1

indirect(外部参照文字列が記述されたセル番地)
外部参照文字列が記述されたセル番地の値を動的にすれば、動的外部参照ができる
ここでは外部参照は外部ブックを想定しているが、別シートなども可能
なお、外部ブックを参照する場合は、その外部ブックが開いていないと参照できない。
完全に自動化するためにはVBAを使用して、特定の条件で対象外部ブックが開くようにする必要がある。
EVE-NG ケーブル接続仕様 変更

最近EVE-NGをよく利用しているのですが、GNS3やCisco modeling labs(CML)では当たり前のようにできることでもEVE-NGだとできなかったりしています。その一つとして起動しているノードへのケーブル接続ができない点です。停止ノードから起動ノードへケーブルの描画はできても接続には至りませんし、起動ノードについてはケーブル自体表示されない状態になります。

今回は上記仕様を変更してみたいと思います。（何かしら理由があってこのような仕様になっているかと思いますので、利用の際は十分テストしてからご利用ください。）

## 1. 環境
OS：Ubuntu 20.04.5 LTS (GNU/Linux 5.17.8-eve-ng-uksm-wg+ x86_64)
Kernel: eve-ng 5.17.8-eve-ng-uksm-wg+
EVE-NG：5.0.1-13（Community Edition）
PHP：7.4


## 1. デフォルト仕様の確認
では、適当なLAB上にノードを２つとブリッジを１つ起動してみます。今回は1台はArista、もう１台はFortigateVMで起動しました。ブリッジからケーブル結線しますと、下記画面のようになりますが
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335933/723a4d1c-e734-05ff-9e7b-7cd05ac27d1b.png)

画面をリロードするともとに戻っていしまいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335933/99374a46-5b9b-b0c1-695a-4a89f52e6677.png)
では、起動時でもへ接続できるように変更してみます。

## 2. 起動ノードへの接続変更
EVE-NGへSSH接続してファイルを変更します。5217行目をコメントアウトします。
```javascript
vim /opt/unetlab/html/themes/default/js/functions.js
5217    if ( linksourcedata['status'] == 2 || linktargetdata['status'] == 2 ) { lab_topology.detach( info.connection ) ; return }
↓
5217   // if ( linksourcedata['status'] == 2 || linktargetdata['status'] == 2 ) { lab_topology.detach( info.connection ) ; return }
:wq
```

画面をリードし、再度ブリッジから接続してみます。いつも通りの画面が出力されますので、Saveをクリックしみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335933/4f9049c0-6e9c-7604-1698-ef8765f72dae.png)

正しく接続されたようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335933/26f27b8d-7f05-9a0c-7fe1-7da4d2a73f3a.png)

## 2. 起動ノードのケーブル接続
次に起動ノードからケーブル接続できるよう、ノードアイコンがHoverされた際にケーブルアイコンが出るように変更します。676行目の.attr('data-status') == 0 から .attr('data-status') != 3 に変更し、画面をリードします。
```javascript
vim /opt/unetlab/html/themes/default/js/actions.js
676    if ((ROLE == 'admin' || ROLE == 'editor') && LOCK == 0 && ( $(this).attr('data-status') == 0 || $(this).attr('data-status') == undefined ) && !$('#lab-viewport').hasClass('fre     eSelectMode') ) {
↓
676    if ((ROLE == 'admin' || ROLE == 'editor') && LOCK == 0 && ( $(this).attr('data-status') != 3 || $(this).attr('data-status') == undefined ) && !$('#lab-viewport').hasClass('fre     eSelectMode') ) {
:wq
```

ノードアイコンHover時にケーブルアイコンがでてきました。Fortigateと接続してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335933/73a087dd-3cab-3112-59ce-8684034603fe.png)

どのポート接続するかの画面も正しく出てきました。Saveしてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335933/5cd8489d-295b-402b-1d6d-6dc15c6e739e.png)

問題なく接続できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335933/407a138d-c07b-cc41-9793-4a3442b8a84c.png)

ただ、このままでは通信をする事はできません。理由はインタフェースが利用できるようになるまでのプロセスにあります。EVE-NG上のNodeは起動前に他ノードと接続されているインタフェースのみ利用できるようOS上にbridgeインタフェースを作成していきます。逆に起動している状態で接続されたインタフェースについてはOS上にbridgeインタフェースを作成する仕組みが備わっていません。ですので、起動後に接続したインタフェースを利用した通信は行う事が出来ません。

次回はこの辺りの処理ついて、深堀・改善していきいたいと思います。
【jq コマンド】特定の要素に JSON 要素を差し込みたい【要素の追加・挿入】

以下の `original.json` の "`.base.data.`" の下に、`additional.json` を追加したい。

```jsonc:original.json
{
  "description": "sample list",
  "base": {
    "data": [
      {
        "name": "foo",
        "age": 15
      }
      // <--- ここに additional.json を追加したい
    ]
  }
}
```
```json:additional.json
{
  "name": "bar",
  "age": 30
}
```

[「jq 要素に追加する -jQuery」でググって](https://www.google.com/search?q=jq+%E8%A6%81%E7%B4%A0%E3%81%AB%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B+-jQuery)も、[「jq add 特定の要素にオブジェクトを追加する -jQuery」とググって](https://www.google.com/search?q=jq+add+%E7%89%B9%E5%AE%9A%E3%81%AE%E8%A6%81%E7%B4%A0%E3%81%AB%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B+-jQuery)も、`-s add` を使って単純にマージさせるだけの記事しか見つからなかったので、自分のググラビリティとして。

## TL; DR <sub><sup>（今北産業）</sup></sub>

1. 一旦、追加したい要素を変数に入れてから `+` 指示子で追加する。
1. 基本構文
    ```bash
    jq --argjson <変数名> "<挿入したいデータ>" '<挿入したい先の要素のパス> += [$<変数名>]' <挿入したい先の JSON ファイル>
    ```
1. マスター、動くものをくれ。

```shell-session
$ jq --argjson myentry "$(cat ./additional.json)" '.base.data += [$myentry]' ./original.json
{
  "description": "sample list",
  "base": {
    "data": [
      {
        "name": "foo",
        "age": 15
      },
      {
        "name": "bar",
        "age": 30
      }
    ]
  }
}
```
- [オンラインで動作を見る](https://paiza.io/projects/MXKSJ5Y2F-t0ZtvhogZn0Q) @ paiza.IO

## 参考文献

- [Assignment](https://devdocs.io/jq/index#Assignment) | v1.6 | Manual | jq @ devdocs.io
- [jq - add objects from file into json array](https://unix.stackexchange.com/a/460986/377806) | Unix @ StackExchange.com
【Visual Studio Code】拡張機能JavaScript and TypeScript NightlyによりTypeScriptのシンタックスハイライトが効かなくなる

# 概要

VS Codeでシンタックスハイライトが効かなくなることがありました。
![スクリーンショット 2022-11-17 115235.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322655/dccf36d6-2061-8bd8-ac4d-46a1270bd459.png)
その原因だったものと解決方法を本記事で取り上げます。

# 原因＆解決方法

原因としては拡張機能である[JavaScript and TypeScript Nightly](https://marketplace.visualstudio.com/items?itemName=ms-vscode.vscode-typescript-next&ssr=false#review-details)が悪さをしていました。
この拡張機能をアンイストールすることでシンタックスハイライトが効くようになりました。

# 拡張機能JavaScript and TypeScript Nightlyとは？

> VS Code extension that enables the nightly build of TypeScript (typescript@next) as VS Code's built-in TypeScript version used to power JavaScript and TypeScript IntelliSense.

VS Code組み込みのTypeScriptのナイトリービルドを可能にする拡張機能っぽいです。
適当に拡張機能入れるとこういうことになるので、気をつけたいです。
OrganizationのFirewall Managerが無効化できない場合の対処法

# はじめに
あまりユースケースとしてないとは思うのですが、OrganizationsコンソールでFirewall Managerサービスを有効化し、委任管理者アカウントを設定している環境で、何らかの理由でサービス無効化する場合、コンソールからサービス無効化ができなかったので手順を書いておきます。

# 事象
Firewall Managerの委任管理者の設定を削除し、OrganizationアカウントのFirewall Managerコンソールで「No administrator set」となっていることを確認後、OrganizationのFirewall Managerサービスを無効化しようとしたところ、以下のエラーが発生した。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/bae45a53-56c9-3ed6-9049-4975f57c4d61.png)

# 原因
無効化できなかった理由としては、コンソール上からは委任管理者がないように見えていましたが、設定として委任管理者が残っていたことが原因のようでした。

# 作業前設定
- OrganizationアカウントでFirewall Managerサービスを有効化済み
- OrganizationアカウントのFirewall Managerコンソールから委任管理者アカウントを設定済み
- 委任管理者アカウント側でポリシーを作成し、Organization配下のアカウントにリソース共有済み

# 作業内容
## 委任管理者アカウント側
最初に委任管理者アカウント上のFirewall Managerコンソールから、管理者アカウントの設定を削除します。
- Firewall ManagerコンソールのSettingsから管理者アカウントをRevokeする

<キャプチャ取り忘れました>

## Organizationアカウント側
その後、OrganizationアカウントのCloudShellで以下のコマンドを実行します。
3つ目のコマンドの実行結果の「DelegatedAdministrators」に何も入っていなければ正常に実行されています。

**実行コマンド**
```
$ aws organizations list-delegated-administrators --service-principal "fms.amazonaws.com"
$ aws organizations deregister-delegated-administrator --account-id <1つ目のコマンドで確認したアカウントID> --service-principal "fms.amazonaws.com"
$ aws organizations list-delegated-administrators --service-principal "fms.amazonaws.com"
```

**実行結果**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/3443f2e9-eec2-db0b-dee1-0aee9a61e0a4.png)

上記コマンドが正常に実行できていれば、OrganizationコンソールからFirewall Managerサービスを無効化ができるようになっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/794b4471-68da-e814-8230-c3648478dce6.png)

# おわりに
普段Organizationを触る機会は少ないので良い経験になりました。
swiftNIOのコードを読んでみたら不思議なものがあったので報告

## swiftnioのコードを読んだ理由
vaporというバックエンドswiftのコードでルーティング周りがどうなっているのか知りたくてちょっと覗いてみたら、http method周りが面白かったので報告

## 該当コード（一部削除）
```
public enum HTTPMethod: Equatable {
    case GET
    case PUT
    case ACL
    case HEAD
    case POST
    case COPY
    case LOCK
    case MOVE
    case BIND
    case LINK
    case PATCH
    case TRACE
    case MKCOL
    case MERGE
    case PURGE
    case NOTIFY
    case SEARCH
    case UNLOCK
    case REBIND
    case UNBIND
    case REPORT
    case DELETE
    case UNLINK
    case CONNECT
    case MSEARCH
    case OPTIONS
    case PROPFIND
    case CHECKOUT
    case PROPPATCH
    case SUBSCRIBE
    case MKCALENDAR
    case MKACTIVITY
    case UNSUBSCRIBE
    case SOURCE
}

```

あれ、多くない？
一瞬、話題になったものまで実装してあるのかも？

## 今後、利用できそうなmethodを書き出し
- `GET`：普通に使われている`GET`
- `PUT`：普通に使われている`PUT`
- `HEAD`：普通に使われている`HEAD`（普通に？）
- `POST`：普通に使われている`POST`
- `PATCH`：普通に使われている`PATCH`
- `NOTIFY`：通知を出させるAPIに使用できるかも？
- `SEARCH`：検索APIの作成に役立ちそう
- `DELETE`：普通に使われている`DELETE`
Leetcode 766. Toeplitz Matrix

# 766. Toeplitz Matrix
https://leetcode.com/problems/toeplitz-matrix/description/

## アプローチ
### Brute-force
```java
func isToeplitzMatrix(matrix [][]int) bool {
    for i := 0 ; i < len(matrix) -1 ;i++{
        for j := 0 ; j < len(matrix[0]) - 1 ;j++{
            if matrix[i][j] != matrix[i + 1][j + 1]{
                return false
            }
        }   
    }
    return true   
}
```
AWS サービス別単語帳

#この記事を書くのに利用したこと
- Alt + 範囲選択　リンク先を開かず、テキストを選択 (ショートカットキー)
- Markdown記法　https://qiita.com/tbpgr/items/989c6badefff69377da7
- AWS 製品サービス一覧 (このページではすべての文章以下urlを参考にしています。)https://aws.amazon.com/jp/products/?aws-products-all.sort-by=item.additionalFields.productNameLowercase&aws-products-all.sort-order=asc&awsf.re%3AInvent=*all&awsf.Free%20Tier=*all&awsf.tech-category=*all

# アプリケーション統合
### Amazon AppFlow
コードを使用せずに SaaS アプリケーションと AWS のサービスを統合
### Amazon SQS  
フルマネージド型のメッセージキューイングサービスで、マイクロサービス、分散システム、およびサーバーレスアプリケーションの切り離しとスケーリングが可能
#
- 管理オーバーヘッドの排除
- 確実にメッセージを配信
- 機密データを安全に保つ
- 伸縮自在に、コスト効率良くスケールする  
https://aws.amazon.com/jp/sqs/?did=ap_card&trk=ap_card  
https://dev.classmethod.jp/articles/re-introduction-2020-amazon-sqs/  
https://business.ntt-east.co.jp/content/cloudsolution/column-135.html

# デベロッパーツール
### AWS Cloud9
ブラウザのみでコードを記述、実行、デバッグできるクラウドベースの統合開発環境 (IDE)
### AWS CodeBuild
コードの構築とテスト
### AWS codestar
AWS アプリケーションを開発してデプロイ

# ネットワークとコンテンツ配信
## Amazon CloudFront
グローバルなコンテンツ配信ネットワーク
## Elastic Load Balancing (ELB)
複数のターゲットにわたる着信トラフィックの分配
https://ex-ture.com/blog/2021/07/14/elb-alb-nlb-clb/
## Amazon Route 53
53 スケーラブルなドメインネームシステム (DNS)
FREENOVEのESP32-WROVER Board（カメラモジュール）を使ってみた

![IMG20221116151627.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1339052/2bfec55a-87f8-cb20-2294-139da53bc466.jpeg)

以前技適が取れているカメラモジュール「WT-ESP32-CAM」を使用していたのですが、
なんと製造中止になり、急遽代替えになる製品を探していました！
https://qiita.com/Kurogara/items/86d0e31c336653b3c14f

そこで見つけたのがFREENOVE社の「ESP32-WROVER Board」


技適が取れているESP32-WROVER-Eのモジュールを使用しているので、
問題なく日本でも使用できるみたいです。
ちゃんと技適マークも記載されています。
![IMG20221116151634.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1339052/0348d657-2d8c-83f4-2c61-a9ca2c28aec5.jpeg)

### 1、ドライバーインストール
そのままでは使用できないので、ドライバーをPCに
インストールします。
↓ドライバーのリンク
https://github.com/Freenove/Freenove_ESP32_WROVER_Board/tree/main/CH340
↓インストール画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1339052/71b825ab-1c4d-6ac8-c54e-3e39ea23ec89.png)

↓インストール完了画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1339052/63844b75-4f04-6dc4-7e3a-ab90d5891465.png)

次にモジュールをUSBケーブルでPCに接続し、デバイスマネージャーで「CH340」と認識されていればOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1339052/e00819af-059b-687a-b152-f85dfc978003.png)

### 2、環境設定
まずはArduinoで環境設定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1339052/72aec6c2-67ee-38dd-1974-6fd89a97b974.png)

追加のボードマネージャのURLに「https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json」
を記載しOKをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1339052/bacddf2e-998b-ad13-922b-fa2c5f415cfb.png)

ツールでボードマネージャを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1339052/7afd5821-0e34-666d-c6df-c0e76a530bcc.png)

検索で「esp32」と入力し、インストール開始。（私は既にインストール済みでした。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1339052/6286df03-5b35-e88f-f908-a24e5b5b6455.png)

書込設定は以下。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1339052/bdb992a0-dd06-0b18-8375-661955ab3df3.png)

### 3、サンプルプログラムの書込
サンプルプログラムを書き込みます。
ファイル＞スケッチ例＞ESP32＞Camera＞CameraWebServerを選択してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1339052/db93db1e-f107-3683-9fd7-83a75146d851.png)

特にデフォルトのプログラムから変更する必要はなく、
SSIDとPASSWORDだけ環境に合わせて変更してください。

### 4、動作確認
一度モジュールをリセットして、シリアルモニタで確認すると
IPアドレスが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1339052/629c8288-41c9-a89a-2e02-55cd05ab4ea0.png)

ブラウザのURLに「http://192.168.0.101」と入力すると
無事カメラ映像が表示されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1339052/c01f0559-738a-1493-5680-7f1ef273ff90.png)


今回良かった点は、カメラが横型と思っていたのですが縦型タイプでした！
Mantine UI の TextInput の input 部分だけ横幅を狭めて、ラベル等の横幅は変えない方法

# 目的

![郵便番号の入力欄の幅が狭くなっている様子](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234029/5287e8b1-447c-f765-3490-0d50c9b93973.png)

上の図の「郵便番号」欄のように、

- 最高の桁数が決まっていて、
- その桁数が少ない場合
- 特に PC で表示するとき

には、入力欄をその**桁数に合わせて狭くする**のが一般的なグッド・プラクティスだと認識しています。

Mantine UI の TextInput は、 `label`, `description` Props を備えている「全部入り」の文字列入力用コンポーネントですが、  それらの横幅を狭めることなく（長い説明文を折り返さず表示できるようにするため）、**入力欄本体の横幅だけを狭くする**にはどうすれば良いでしょうか？

# 結論

`styles` prop を使って、 `input` にスタイルを当てましょう。

```tsx
<TextInput
  name="postalCode"
  label="郵便番号"
  required
  description="必須 半角数字でハイフンを含めずに入力して下さい。例: 5400002"
  styles={{ input: { maxWidth: 120 } }}
/>
```

# 解説 &mdash; Mantine の Styles API について

https://mantine.dev/styles/styles-api/


`styles` Prop は、 Mantine のコンポーネント全般に備わっている機能です。

この機能を使うと、コンポーネントを構成する**小さな要素を指定してスタイルをカスタマイズ**することが出来ます。(上記の例では `input`、ほかに `icon`、`label` など) また、 `required` のように、コンポーネントが**特定の状態におけるスタイルもカスタマイズ**することができます。

具体的に、それぞれのコンポーネントのどの要素・どの状態の見た目がカスタマイズ可能なのか調べたいときには、

↓この TextInput の Styles API の章に列挙されているように、

https://mantine.dev/core/text-input/?t=styles-api


コンポーネントのドキュメント > "Styles API" のタブの内容を参照すると良いでしょう。
PHPのライブラリでQRコード®を作成する。(chillerlan/php-qrcode)

PHPのライブラリ(chillerlan/php-qrcode)を使ってQRコード®を作成しました。

# 本記事の環境

ホストOS：Windows10 Pro 64bit 8GB
ゲストOS：Red Hat Enterprise Linux release 8.3 (Ootpa)
Oracle VM VirtualBox：6.0.4a
vagrant：Vagrant 2.2.14
Apache：2.4.37
PHP：PHP 7.4.15
Tera Term：4.105
Composer：Composer version 2.0.8 2020-12-03 17:20:38
chillerlan/php-qrcode：4.3.4
Google Chrome：96.0.4664.110
コマンドプロンプト
ホストOS側に実ソース

# 手順1(ライブラリ導入)
* Tera TermでゲストOSに接続する。
* 作業用ディレクトリを作成する。
* 作業用ディレクトリ配下でディレクトリ作成コマンドを実施する。
```			
mkdir -p php-qr-code-generator \
php-qr-code-generator/src/QR/{Image,Options} \
php-qr-code-generator/public/img
```
* ディレクトリを移動する。
```		
cd php-qr-code-generator
```
* composerを使ってライブラリを取得する。
```		
composer require chillerlan/php-qrcode
```	

# 手順2(ソースコード作成～動作確認)

* ソースコードを書く。(サンプルは以下に載せています。)
  * 作業用ディレクトリのパスを指定してもいいし、作業用ディレクトリを実行用パスにコピーしてもいい。
* ブラウザ上にQRコード®が表示されていることを確認する。		
* QRコード®を読み込んで、サイトへ遷移できることを確認する。

# 成果物(ソースコード(制御側))
```php
// 定義(必要に応じてパスを変更してください。)
use chillerlan\QRCode\QRCode;
use chillerlan\QRCode\QROptions;
(中略)
// 実処理
require_once([実行用基点ディレクトリ] . '/php-qr-code-generator/vendor/autoload.php');
$options = new QROptions(
    [
        eccLevel' => QRCode::ECC_L,
        outputType' => QRCode::OUTPUT_IMAGE_PNG,
        version' => 5,
        imageTransparent' => false,
    ]
);
$qrcode = (new QRCode($options))->render('https://[QRコード®を作成するURL]');
```
* eccLevel：QRコードの欠損を何%まで許容するか。
  * L　・・・　７％までなら欠けてもOK
  * M　・・・　15％までなら欠けてもOK
  * Q　・・・　25％までなら欠けてもOK
  * H　・・・　30％までなら欠けてもOK
* outputType：出力画像タイプ(SVG、PNG、JPG、GIF、、、)
* version：QRコードの粒度、細かさが変わる。
* imageTransparent：透過するかどうか。(true：透過する、false：透過しない)
* 他にできそうなこと：QRの色指定、サイズ指定、QRにロゴを付ける。


# 成果物(ソースコード(画面側))
```html
<img src='<?= $qrcode ?>' alt='QR Code' width='800' height='800'>
```

# 参考
https://chillerlan.github.io/php-qrcode/classes/chillerlan-QRCode-QRCode.html
https://www.twilio.com/blog/create-qr-code-in-php-jp
https://blog.capilano-fw.com/?p=2140
Macのsedでスラッシュを置換したい

sedの区切り文字は`#`や`!`に変えることができる。
ただし、`!`の場合は`"`ではなく`'`で囲む必要がある。
```
sed -i "" "s#https://example.com#http://localhost:3000#g" test.txt
sed -i "" 's!https://example.com!http://localhost:3000!g' test.txt
```
【HM90】Ubuntu20.04のトラブル対応

ラズパイ4をメインに扱ってきたが、代わりにミニPCを使ってみてはいかがか．という話が出てきた．
ということで、割と安価で、小型で、高性能なHM90を選定し、Ubuntu20.04を入れてみる．

# HM90
選定したPCは以下の通り
- CPU：AMD Ryzen 9 4900H
- メモリ：DDR416GB×2 デュアルチャンネル
- SSD：M.2 2280 512GB PCIe SSD
- 寸法：149.6×149.6×55.5mm
- その他：
    - USB3.0×4、USB3.1(Gen2)×2
    - 1000Mpbs LAN(RJ45), 2500Mpbs LAN(RJ45)

https://store.minisforum.jp/collections/all-product/products/minisforum-elitemini-hm90

このスペックで、8万円（2022-11-17現在）ほどで買える．
お得なのではないだろうか．

寸法も申し分ない．が、
ACアダプタが本体と同じくらいにでかい！ということは一つ注意したい点である．

# Ubuntu20.04のインストール

それでは、いつもの通りUbuntu20.04.5を入れていく.

ここからISOをインストールし,
[ubuntu-20.04.5-desktop-amd64.iso](https://releases.ubuntu.com/focal/)

UNetbootinで、ブータブルUSBを作成する．
[UNetbootin](https://ja.osdn.net/projects/sfnet_unetbootin/)
もしくは、Rufus．お好みでどうぞ．
[Rufus](https://rufus.ie/ja/)

あとはUSBをPCに挿して、BIOSの起動順序をUSBからに直し、実行すれば、インストーラが立ち上がる．

# トラブル対応

Ubuntuを入れると、大抵の場合トラブルが起こる．
基本的な対応方法は、カーネルとgrubとたまにBIOSの設定である．

## 1. Wi-Fi、Bluetoothが機能しない
**解決策）カーネルを変更しまくる．**
こうしたネットワークトラブルの場合、大抵はドライバの問題なので、カーネルのバージョンを変更してみよう．
HM90の場合、カーネルを一番新しいバージョンに変えたらうまくいく．
```sh
sudo apt install linux-image-5.15.0-53-generic linux-headers-5.15.0-53-generic linux-modules-extra-5.15.0-53-generic 
```

## 2. USBが反応しなくなる、時間によって接続が切れる
**解決策）grub_cmdlineを修正しよう**

```sh
sudo gedit /etc/default/grub
```
```sh:変更前
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
```
```sh:変更後
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash iommu=soft usbcore.autosuspend=-1"
```
保存して、update-grubを実行
再起動
```sh
sudo update-grub
sudo reboot
```

---

…気がついたことがあったら順次追加
log_tagsでRails.loggerにsessionのuser_idを出力する

## 環境

* Rails 7.0.4
* redis 6.2

## cookie_storeの場合

```rb
# config/initializers/session_store.rb
Rails.application.config.session_store :cookie_store, ... 

# config/environments/development.rb
Rails.application.configure do

  config.log_tags = [
    :request_id,
    lambda { |req|
      session_key = (Rails.application.config.session_options || {})[:key]
      session = req.cookie_jar.encrypted[session_key] || {}

      "user_id: #{session['user_id'] || '-'}"
    }
  ]
end
```

## redis_storeの場合

```rb
# Gemfile
gem 'redis-actionpack'

# config/initializers/session_store.rb
Rails.application.config.session_store :redis_store, ...

# config/environments/development.rb
Rails.application.configure do

  config.log_tags = [
    :request_id,
    lambda { |req|
      session_options = Rails.application.config.session_options || {}
      session_id = req.cookie_jar[session_options[:key]]
      session = if session_id.present?
                  redis = Redis.new(session_options[:servers])
                  key = [
                    session_options.dig(:servers, :namespace),
                    Rack::Session::SessionId.new(session_id).private_id
                  ].compact.join(':')
                  val = redis.get(key)
                  Marshal.load(val) if val
                end || {}

      "user_id: #{session['user_id'] || '-'}"
    }
  ]
end
```

redis の key には`Rack::Session::SessionId.new(session_id).private_id` が使われているっぽい。
内部の生成ロジックは`2::"#{Digest::SHA256.hexdigest(session_id)}`となっている。

https://github.com/rack/rack/blob/a5e80f01947954af76b14c1d1fdd8e79dd8337f3/lib/rack/session/abstract/id.rb#L24


セッション周りのコードリーディングは以下の記事が参考になった
https://blog.freedom-man.com/rails-session-codereading
ある結果のアウトプットをチャットでするときのコツ

# 伝えたいこと

SlackやTeamsなどチャットにて、とある結果のアウトプットを上司や同僚に出すときは、次の４つを抑えましょう。

1. **長文にならないこと**
1. **結論を書いて理由を書く**
1. **絵文字やアイコンは多用しない**
1. **参考リンクはチャットには載せない**

※ なお、筆者の経験に基づいており、アウトプット先の組織・チーム・人物によって影響が異なります。
へー、そんなことも考えてチャットするんだ! というTipsとして読んでいただけると幸いです。

## 背景
新型コロナウイルスによる影響および働き方改革の推進によって、2020年よりリモートワークが一気に推進しました。
会議はZoomなどによるWeb会議に変わり、組織内でのやりとりもメールから気軽なチャットにシフトした方々も多いのではないでしょうか。
自己紹介がてら、筆者は2013年ごろよりチャットを使っており、リモートワークもはや5年目になりました。


気軽に上司・同僚・はたまた取引先と連絡ができるチャットは便利ですし、現在のチャットツールは画像や添付ファイルを送信することも容易にできます。一方で、いわゆるチャットもTPOを分けて書き方を変えると伝わりやすいです。

## 目的
何か上司や同僚またはクライアントから依頼された調査に対する結果、または自分でプロアクティブにインプットしてきたものを周知したい結果をチャットで伝えるときに、より効果的に伝わる＆伝えるためには何をすればいいか？

## ケース
誰かから依頼されたケースと自分で拾ってきたものを周知したいケースでは、みなさんお察しの通り大きく状況が異なります。
上司の人柄や同僚との関係性、自分の社内での立ち位置など、考慮すべき事項によって枕詞やクッション言葉は必要ですが、本記事は両方のケースでそつなく効果的に平均点を超えるにはどうすればいいかの一例です。

一番業務で役立つ、上司に依頼されたケースを例にします。
「〇〇さん、今朝ニュースになってたXXについて我が社で取り入れられそうかを調べて欲しい」

## しくじる可能性が高いチャット例

:::note alert
XXとは2019年からあったみたいですが、〇〇時に〇〇ができる新技術です。詳しくはこのリンクが参考になりました。 :nerd:hxxps://xxxxxxxxx.xxx.xxx/yyyyyyy/zzzzzzz/g?gggggggg
そのためにはライブラリ△△が必要で、△△を利用すると現在利用しているLLは利用できなくなります。
過去同じような技術でAAやBBがありましたが、どちらもいまは人気がなさそうです。:frowning2:
この技術はAAの基礎でも使われている△△に基づいており、△△を拡張した類似のものとして以下のサービスがありました。:point_up:
hxxps://1xxxxxxxxx.xxx.xxx/yyyyyyy/zzzzzzz/g?gggggggg_example1
hxxps://2xxxxxxxxx.xxx.xxx/yyyyyyy/zzzzzzz/g?gggggggg_example2
hxxps://3xxxxxxxxx.xxx.xxx/yyyyyyy/zzzzzzz/g?gggggggg_example3
これらと比較すると優位性として
1. XX自体の導入価格が安い
1. 運用のための学習コストが低い
が挙げられると思います。
メリットとデメリットとがありますが、どうしましょう:sweat_drops:
:::

一見、比較検討までしてまとめられているようにみえますが、いろいろツッコミどころが満載ですね。
たとえば

*[❌]まずXXとは何かについて歴史も含め語ってしまう*
*[❌]ネガティブなところを先に書いてしまう*
*[❌]調査が一通り完了したのかまだ途中かが読み取りにくい*
*[❌]類似比較を先走って実施してしまい、どれの特徴について書いているのかがわかりにくい*
*[❌]リンクが多くバナーも生成され、長文に見えやすい*

## うまくいく可能性が高いチャット例
:::note info
XXについての調査結果をお伝えします。

我が社にXXを導入すると、現状よりコスト削減できるメリットがあります。
XXの導入価格および運用コストが安いからです。
運用コストではこの技術は日本語ドキュメントが豊富で、既存技術との類似も多いため、学習コストが低いことが予想されます。
一方デメリットとして、XXを利用するとLLが利用できなくなります。

以上です。よろしくお願いいたします。

:::

## 考察

うまくいくケースの特徴
* ヘッダー、フッターとの間に一行を開けて本文がどこからどこまでかをよりわかりやすくなる工夫をしています。
* 文字数はおよそ150文字です。たまたまTwitterの140文字と近いです。
* 特に感情を入れずに冷静に評価しているように感じられます。もしかすると同僚などに出すと感情が薄いやつだなと思われるかもしれませんがここ内容が伝わることを優先しています。
* 一旦調査が完了したことを明示しています。
* 参考リンクについては読むかわからないので貼ってないです。ここが結構ポイントで、親切心で昔はよく貼ってしまってましたが、参考リンク頂戴といわれるまでは書かないように心がけてます。結果の**アウトプット**は**自分用のメモ**とは別と心がけてます。
* 今回はXXが類似サービスより優っているので、結果にはXXのみについて記載しています。

おそらくは、このあと上司からは「LL」の担当部署と調整できないか話してきてと言われるか、上司が話をしに動くでしょう。
アウトプットが**次のアクション**に繋がりやすい形になりました。


もしかすると調査結果の詳細版をWikiやWordなどにドキュメンテーションしてくれとお願いされるかもしれません。
類似サービスや参考リンクなどはそのときに書けばよいのかと思います。
事前に詳細版をWikiなどにまとめることもできますが、XXがボツったときに徒労に終わります。
XXが絶対に次に進む自信がないときは段階を踏む方が賢明かもしれません。

## 結論

SlackやTeamsなどチャットにて、とある結果のアウトプットを上司や同僚に出すときは、次の４つを抑えましょう。

1. **長文にならないこと**
1. **結論を書いて理由を書く**
1. **絵文字やアイコンは多用しない**
1. **参考リンクはチャットには載せない**


## 参考
[クッション言葉](https://go.chatwork.com/ja/column/business_chat/business-chat-144.html)

以上です。ご一読ありがとうございました。
チャットにて結果のアウトプットを書くときの参考にと思い書きました。休憩中のお茶請けにでもなれば幸いです。
【TypeScript】命名規則 メモ

***1\. キャメルケース***
英語の複合語や文を1語につなげて表記するときに使う
先頭の単語の1文字目だけ小文字、他の単語の1文字目は大文字
用途：***変数、引数、関数、プロパティなど***
ex)`getName` `thisIsAnExample(this is an example)`

***2\. パスカルケース***
キャメルケースと同じく、英語の複合語や文を1語につなげて表記するときに使う
すべての単語の1文字目を大文字にする
用途：***クラス、インターフェース***
ex)`ClassName` `CatchTheTrain`

***3\. コンスタントケース***
すべて大文字または単語を繋げるときはアンダースコア
用途：***定数、グローバル変数***
ex)`ENDURL` `HELLO_WORLD`

***4\. boolean型の時の変数名***
「is + 形容詞」→ `isClose`
「can + 動詞」→ `canStart`
「has + 過去分詞」→ `hasChanged`
などの形式で命名する
詳しくは[こちらの方の記事から](https://qiita.com/GinGinDako/items/6e8b696c4734b8e92d2b)
シェルスクリプトからのdirenvが上手く行かないときの対応

`cd`と`direnv allow`の間に`eval "$(direnv export bash)"`を入れる必要がある。

```
cd [移動先]
eval "$(direnv export bash)"
direnv allow
```

↓これと似てる

~/.zshrc                                             
```
eval "$(direnv hook zsh)"
```

 ~/.bashrc                                             
```
eval "$(direnv hook bash)"
```
Microsoft Defender for Cloud の推奨事項を Microsoft Sentinel でインシデント通知する

# 1. はじめに
お客様からのご要望で、Microsoft Defender for Cloud の推奨事項(Recommendations)を通知したいといったニーズが多かったので、Microsoft Sentinel の分析ルールを用いて特定の推奨事項だけをインシデント/アラートするパッケージを作ってみました。

# 2. パッケージについて
パッケージは Github で公開しています。
ReadMe も入れていますので、手っ取り早く導入してみたい！という方はこちらをご参照下さい。

https://github.com/hisashin0728/UnhealthyStateRuleSentinel

# 3. 構成図
構成図としては次のような接続構成になります。

![Diagram](https://user-images.githubusercontent.com/55295601/198253654-8857cc7b-a228-4405-a578-be6a7deadd03.png)

- Microsoft Defender for Cloud 側からは、[連続エクスポート(Continuous Export)](https://learn.microsoft.com/ja-jp/azure/defender-for-cloud/continuous-export?tabs=azure-portal)を設定して、Microsoft Sentinel の Log Analytics ワークスペースにログを送ります。
- Microsoft Sentinel 側では、分析ルールを用いて連続エクスポートのテーブル情報から ``Unhealthy`` と判定した推奨事項非準拠のイベントを検知して、インシデントを作成します。

なお、お客様のご要望もあり、以下のようなカスタマイズも加えてみました。

1. **「特定の」推奨事項**のみ、アラート化する
    - Sentinel の[ウォッチリスト機能](https://learn.microsoft.com/ja-jp/azure/sentinel/watchlists)を利用して、特定の推奨事項名にマッチしたものだけをアラートに出すようにしています。
    - 全ての非準拠をインシデント作成するとノイズが大量に発生するため、Microsoft Defender for Cloud を運用している中で、特定の推奨事項だけを抽出した方が良い、とのお客様の声がありました。
2. **サブスクリプションの名前**をインシデントに表示させる
    - Microsoft Defender for Cloud から出力する連続エクスポートでは、サブスクリプションの ID が含まれていますが、ID 情報だけを見てもどこのサブスクリプションなのか分からない、との声がありました。
    - こちらも[ウォッチリスト機能](https://learn.microsoft.com/ja-jp/azure/sentinel/watchlists)を用いて、Sentinel 側で登録したサブスクリプションの名前を通知するようにカスタマイズで設定しています。


# 4. アラート画面例
Microsoft Sentinel のインシデント画面例です。
インシデントアラートの通知は、推奨事項の名前 + サブスクリプションの名前が表示されるようにしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/10cbf0ea-dd86-871a-f6e5-8ddfdc820bdd.png)

インシデントの詳細画面では、説明の箇所にクエリーで引っ張ってきた日時、サブスクリプションID、リソースIDなどを表示しています。Entity 情報はリソースIDをマッピングすることで、対象リソースを可視化できるようにしてみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/2d369188-920e-0820-5ca6-63bdb7d0e61c.png)


# 5. 導入方法
導入方法は、Microsoft Sentinel 分析ルールのインポート機能で導入できるようにしています。
ARM テンプレートを Github に公開していますので、対象の JSON ファイルをインポートしてください。

- [標準バージョン](https://github.com/hisashin0728/UnhealthyStateRuleSentinel/blob/main/Detect_Unhealthy_State_from_MDFC.json)
- [ウォッチリストで推奨事項やサブスクリプション名を表示するバージョン](https://github.com/hisashin0728/UnhealthyStateRuleSentinel/blob/main/Detect_Unhealthy_State_from_MDFC_watchlist.json)


https://learn.microsoft.com/ja-jp/azure/sentinel/import-export-analytics-rules

# 6. [カスタマイズ]　ウォッチリストの作成
ウォッチリストで推奨事項やサブスクリプション名を表示させたい場合、別途 Microsoft Sentinel 側でウォッチリストの作成が必要になります。
こちらのパッケージでは 2 つのウォッチリストを用いています。詳細は GitHub の Readme をご参照下さい。

| Watchlist name  | 説明 |
| ---- | ---- |
|  ASC_Reco  | 検知する推奨事項を絞り込むためのウォッチリスト |
| testwatchlist | サブスクリプションの ID を任意の名前に変換させるためのウォッチリスト 
|

2つのウォッチリストを作成し、GitHub に記載した CSV ファイルをアップロードして自由にカスタマイズしていただければと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/8c179308-66c4-13ba-e516-5679928730eb.png)

以下は推奨事項のCSVファイルの例です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/62761569-13d6-ced0-3539-55e1edc35868.png)

# 7. まとめ
幾つかのお客様で、標準では提供されていない・・・とのお声があり、サンプルとして作ってみました。本記事がどなたかの参考になれば幸いです。

＊本稿は、個人の見解に基づいた内容であり、所属する会社の公式見解ではありません。また、いかなる保証を与えるものでもありません。正式な情報は、各製品の販売元にご確認ください。
PRTG（監視システム）センサーログが逼迫した話

## PRTGでトラブったのでメモを残します
PRTG（監視システム）をWindowsサーバ上で運用中、OSが突然ハングアップ。
設計に漏れがあったため、簡単に記録を残しておきます。

## そもそもPRTGとは
#### PRTG Network Monitor 
ドイツに本社を構える Paessler AG社 によって開発された、
ネットワーク監視ソフトウェアです。

日本語対応しており、UIは直感的。
Zabbixと比較して、設計・構築に苦労することなくネットワーク・サーバの
監視システムを立ち上げることができます。

## センサーとは
#### 監視対象ノードの監視対象部位のこと
PRTGでは監視対象の「部位」ごとに１センサーを消費する、
という考えになっており、これはPRTGのライセンスを選択する際に重要となります。

例）
サーバAのPing監視　⇒ 1センサー消費
サーバAのCPU使用率監視　⇒ 1センサー消費
サーバBのPing監視　⇒ 1センサー消費
サーバBのCPU使用率監視　⇒ 1センサー消費

PRTGフリー版では100センサーまで監視可能です。 
ライセンスは、センサー数︓500/1000/2500/5000/無制限 から選択可能です。

## Cドライブが真っ赤に
ある日OSが不安定になっていることに気づき、
確認を進めるとCドライブの使用量がとんでもないことに…。
どうやらPRTGのセンサーログ（監視ログ）がドライブを逼迫していたご様子。

PRTGではセンサーログ（過去の監視データや統計情報等）のDBファイルを
デフォルトで以下の場所に格納します。
`C:¥ProgramData¥Paessler¥PRTG Network Monitor¥Monitoring Database`

センサー数が多いと、このフォルダサイズがあっという間に肥大化します。
**デフォルト設定では365日間**、センサーログを保存する設定となっているため
センサーログのローテーション設計を考える必要があります（ありました。）

センサーログの肥大率は正直読めないので、1ヶ月運用してみてどれだけのサイズになったか観察しながら保存期間をチューニングしていくしか無いと思います。

なお、デフォルトだと366日以上古いセンサーログはローテションにより自動削除されるため、1年以上前の監視データは参照できなくなる　ということです。
要件に、**過去の監視データ保存要件** がある場合は要注意。

## センサーログ保存期間の変更
ということで、PRTG管理画面上でセンサーログ保存期間を365日から適切な日数に変更します。
設定箇所は以下の通り。
```
PRTG WebGUIの設定タブ
　User Interface
　　Core ＆ Probes
　　　データパージ制限
   　　センサーデータ履歴
```

![image-20190520023926308.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2723699/1b3f609f-f433-a188-1192-96b912da91db.png)

経過観察的に、まずは半年 に変更を行い様子を見ることとしました。
PRTGサービス再起動をすると、すぐにセンサーログが削除された（気がします。）
Entity Framework Coreで"You need to call SQLitePCL.raw.SetProvider(). が発生したときの解決方法"

久しぶりの投稿。

## 問題発生ケース

環境
OS:Windows11
IDE:Visual Studio2022 Windows Form .Net7

https://learn.microsoft.com/ja-jp/ef/core/get-started/winforms

Entity Frameworkのチュートリアルを進めていたところ、下記の場所でエラーが発生した。
"You need to call SQLitePCL.raw.SetProvider(). If you are using a bundle package, this is done by calling SQLitePCL.Batteries.Init()".

```c# sample.cs
dbContext.Database.EnsureCreated();
```

## 対応方法

パッケージマネージャーで下記の通り実行。

```
PM> install-package system.data.sqlite
PM> uninstall-package system.data.sqlite
PM> install-package microsoft.entityframeworkcore.sqlite
```

リビルド実行後、再度実行するとエラーは発生しなくなった。

[参考ページ](https://forums.devart.com/viewtopic.php?t=44578)

以上
エンジニア初心者が個人開発した話

# はじめに
アウトプットのため、簡単なシステムを個人で開発したときの内容を簡単にまとめてみます。
詰まった際にサポートしてもらいつつではありましたが、デプロイまで20時間弱で出来ました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2889192/842489b1-993b-fd4f-d0e1-82f1fda9c65f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2889192/55dc0eba-6fa3-0b93-ef9a-e4fae9fca688.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2889192/12ce5834-0ef1-6638-2e13-d80ed09256ff.png)



# 概要
その日に学んだことを簡単な記事としてアウトプット/共有できる成長可視化システム
使い勝手はTwitterをイメージ
記事を作成するとタイムラインに表示され、他ユーザーからいいねがもらえるような作り

# 使用技術
- TypeScript
- React
- FireStore/Firebase Hosting
- Chakura-UI

# 良かったこと
- 業務で学んだことを自分の思考スピードでアウトプットすることで理解が深まった
- デプロイまで一通りやりきった経験は自信に繋がった

# 気をつけたい点
- リファクタリングまで考える余裕がなかった
- Firebaseは初めてで、慣れるまで時間がかかった

# おわりに
デプロイまでの流れを把握することや、画面を素早く作ることなどを意識付ける機会になりました
もっと慣れていきたいです。
Databricksにおける機械学習モデルデプロイメントのパターン

[Model deployment patterns \| Databricks on AWS](https://docs.databricks.com/machine-learning/mlops/deployment-patterns.html) [2022/10/24時点]の翻訳です。

:::note warn
本書は抄訳であり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
:::

本書では、ステージングからプロダクションにMLアーティファクトを移行する際の2つの一般的なパターンを説明します。モデルやコードに対する変更における非同期的な性質は、ML開発プロセスが従う可能性がある複数のパターンが存在することを意味します。

モデルはコードによって作成されますが、得られるモデルアーティファクトや、モデルを作成するコードは非同期的にオペレーションされることがあります。すなわち、新たなモデルバージョンやコードの変更が同時に発生しないことがあります。例えば、以下のシナリオを考えてみます。

- 不正なトランザクションを検知するために、週次でモデルを再トレーニングするMLパイプラインを開発します。コードは頻繁に変更されないことがあるかもしれませんが、新規データを取り込むためにモデルは毎週再トレーニングされます。
- 文書を分離するために、大規模なディープニューラルネットワークを作成することがあります。このケースでは、モデルのトレーニングは、計算的に高コストで時間を浪費するものであり、モデルの再トレーニングが頻繁に行われないかもしれません。しかし、このモデルをデプロイ、サービング、モニタリングするコードは、モデルを再トレーニングすることなしにアップデートされることがあります。
![](https://docs.databricks.com/_images/deploy-patterns.png)

この二つのパターンでは、*モデルのアーティファクト*、あるいは*モデルアーティファクトを生成するトレーニングコード*がプロダクションにプロモーションされるのかどうかという点で異なります。

# コードをデプロイ(推奨)

多くのシチュエーションにおいて、「コードのデプロイ」アプローチを推奨します。このアプローチは[DatabricksにおけるMLOpsワークフロー](https://qiita.com/taka_yayoi/items/2d6eaa8aafa39fc8bddf)に組み込まれています。

このパターンにおいては、モデルをトレーニングするコードは開発環境で開発でされます。同じコードがステージング、プロダクションに移行します。モデルはそれぞれの環境でトレーニングされます: 最初はモデル開発の一部として開発環境でトレーニングされ、インテグレーションテストの一部としてステージングで(限定的なデータのサブセットに対して)トレーニングされ、プロダクション環境では最終モデルを生成するために(完全なプロダクションデータに対して)トレーニングされます。

利点:

- プロダクションデータへのアクセスが制限されている企業においては、このパターンを用いることでプロダクション環境のプロダクションデータを用いてトレーニングを行うことができます。
- トレーニングコードはプロダクションに向けてレビュー、テスト、承認されるので、自動モデル再トレーニングはより安全になります。
- サポートするコードはモデルトレーニングコードと同じパターンに従います。両方ともステージングのインテグレーションテストを通ることになります。

欠点:

- 関係者にコードを受け渡すためのデータサイエンティストの学習曲線は急峻なものになります。事前定義済みのテンプレートやワークフローが役立ちます。

また、このパターンにおいては、データサイエンティストはML固有の問題を特定、修正できる知識を持っているので、プロダクション環境からトレーニング結果をレビューできる様になっている必要があります。

このシチュエーションにおいて、ステージングで完全なプロダクションデータセットに対するモデルのトレーニングが必要であれば、コードをステージングにデプロイし、モデルをトレーニングし、プロダクションにモデルをデプロイするハイブリッドなアプローチを使うことができます。このアプローチはプロダクションにおけるトレーニングのコストを削減しますが、ステージングにおける血雨以下のオペレーションコストを発生させます。

# モデルのデプロイ

このパターンでは、モデルアーティファクトは開発環境のトレーニングコードによって生成されます。アーティファクトはプロダクションにデプロイされる前に、ステージング環境でテストされます。

以下の条件が一つ以上当てはまる場合には、この選択肢を検討することは可能です。

- モデルのトレーニングが非常に効果、あるいは再現が困難。
- 単一のDatabricksワークスペースで全ての作業が行われた。
- 外部のリポジトリやCI/CDプロセスを使っていない。

利点:

- データサイエンティストへの引き継ぎが簡単です。
- モデルトレーニングが高コストの場合、モデルトレーニングが一回のみで済みます。

欠点:

- 開発環境からプロダクションデータにアクセスできない場合(セキュリティ上の理由からあり得ることです)、このアーキテクチャは実現できません。
- このパターンではモデルの再トレーニングの自動化はトリッキーです。開発環境で再トレーニングを自動化することはできますが、プロダクションにモデルをデプロイする責任を持つチームは、結果得られるモデルをプロダクションレディとして受け入れられないかもしれません。
- 特徴量生成、推論、モニタリングで使用するパイプラインのようなコードは、別にプロダクションにデプロイする必要があります。

以下の図では、異なる実行環境に対して上述のデプロイメントパターンのコードのライフサイクルを対比しています。

図に示している環境はステップが実行される最終的な環境となります。例えば、モデルをデプロイするパターンでは、最後のユニットテストとインテグレーションテストは、開発環境で実行されます。コードをデプロイするパターンでは、ユニットテストとインテグレーションテストは開発環境で実行され、最後のユニットテストとインテグレーションテストはステージング環境で実行されます。
![](https://docs.databricks.com/_images/deploy-patterns-lifecycle.png)

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)
WordPress wgetでインストールする際のリンクはどこに記載されている

# 概要

- 最新のWordPressをwgetでインストールする際のリンクの記載場所をまとめる。

# 場所

- ここにある

https://wordpress.org/support/article/how-to-install-wordpress/

![How_to_install_WordPress_–_WordPress_org_Forums.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/ec66593e-c06d-2e21-a65b-4c4d6787a56a.png)
getXXX..のような名前の処理の中で値をセットするのはやめよう

# はじめに
何番煎じだよ・・って内容ですが、遂に実際に目の当たりにすることができたので記念カキコです。
こういうコードを書く人はqiitaなんか見てない気がしますが、これから生まれる初心者さんたちが少しでもこういうコードを書かずに育てるように書き残しておきます。

# どういうコードだったの？
```Apex
public class testClass {
    private Map<String, String> userInfo;

    public void main() {
        userInfo = new Map<String, String>();

        userInfo.add('userId', '123456');
        String parentId = getParentId();

        // 色々な処理
    }

    private String getParentId() {
        String parentId = '';
        parentId = UserDao.getParentId(userInfo.get('userId'));
        userInfo.put('parentId', parentId);
        return parentId;        
    }
}
```
ざっくりですが、まあこんな感じでした。

# (個人的に)だめなところ
**getXXXの中で値をセットしているところが良くないです！！！[^1]**

これにつきます。
コードを書いたあなた以外の人の9割9分は、getXXXという関数を見たときに
「ああ、値を渡せば目当ての値を返してくれるんだな」
と考えます。

ところがどっこい、実は中で勝手に値をセットしている。

まあびっくりする程度で済めばいいですが、そのほかの人がどんなコードを書きたいのかはその時にならないとわかりません。
このparentIdがこっそりセットされている仕様に気づかず書ききって、後でめちゃくちゃロスが発生する可能性もあります。
(使う前に他人が書いたコードは確認しよう)

ちなみに僕は今回3時間ほど無駄にしました。

# まとめ
関数名以上の処理を関数の中でやらないようにしよう。
ほんとうに。お願いします。

個人的にこちらの記事は一回読む価値があると思います。
内容もユーモアも全部お気に入りです。

[あっと驚かせるJavaプログラミング(をやめよう）](https://qiita.com/tatesuke/items/36924274f043f37a391f)

[^1]:プロパティのフィールドとかじゃなくて、たんに何かしらの値を取得するような関数のときもgetterって呼んでいいのかな？
Windowsでクリップボード中の画像に枠線をつける【ImageMagick】

Windows環境でスクリーンショットを取得し画像を貼り付ける場合。

貼り付ける対象の色が、貼り付け画像と同様で画像縁を枠線で強調した方が見やすい場合もあるかと思います。

下記は画像の縁に赤く枠線をつけたケース。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/92fea44b-4b18-510a-6d43-e82549e941c8.png)

本記事では`ImageMagick`を使い、クリップボードにスクショされた画像に対して枠線を追加してみます。

## そもそも切り取り ＆ スケッチ　でできるけど

2022年11月現在、`Windows 10` と `Windos 11` で提供されている公式アプリ　`切り取り　＆　スケッチ`。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/993f006d-ec5c-c7b3-fda4-9fcfebe4071c.png)

こちらのアプリの設定で、`切り取り領域のアウトライン` 設定を有効にすると。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/afb8fd59-340a-03ba-01ac-a4df7ae1370f.png)

本記事でやっている事はこの機能を使うと実現できたりします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/3dce2c40-489f-9343-ecae-2ce70ea862a3.png)

今回は普段使っている`Flameshot`で該当の機能がなかっため。
`Flameshot`でクリップボードに取得した画像に枠線をつける目的でやっています。

## 今回対象とする環境

- Windows 10 21H2
- ImageMagick 7.1.0-52

## ドキュメント

[ImageMagick](https://imagemagick.org/)
[ImageMagick Examples --
 Cutting and Bordering Frame, adding a 3D-like border](https://imagemagick.org/Usage/crop/)

## ImageMagickとは

`ImageMagick`とは様々なOS向けに提供されている、画像加工ソフトです。
コマンドラインからイメージを加工、変換できます。

## ImageMagickで枠線をつける

下記を実行するとクリップボードに格納されている画像に赤色で枠線をつけてくれます。
`ImageMagick`は適宜インストールしておいてください。

```powershell:Add-BorderToImage.ps1
if ( [System.Windows.Forms.Clipboard]::ContainsImage() ){
    magick clipboard: -mattecolor "red" -frame "10x10" clipboard:
}
```

`ImageMagick`で枠線をつける方法については、[ImageMagick Examples -- Cutting and Bordering](https://imagemagick.org/Usage/crop/)のFrame, adding a 3D-like border項に記載があります。


必要最小限としては、`magick clipboard: -mattecolor "red" -frame "10x10" clipboard:`の部分だけあればよいのですが。

クリップボードに画像以外が格納されている場合を考慮して、`Clipboard`クラスの`ContainsImage`メソッドで画像が含まれているか確認してから、`ImageMagick`を呼ぶようにしています。

## 総評

大量の画像に一括で枠線をつけたい場合には、画像保存して一括で変換した方が楽な気がしますが。
`切り取り　＆　スケッチ`アプリ以外で取得したスクショ数枚に対してといった場合は、このような方法もありかと思います。
月別ビンゴで挑戦する -モブプロ開発を行っているチームでやっている取り組み-

# はじめに

本記事は[モブプロ開発を行っているチームでやっている取り組み Advent Calendar 2022](https://qiita.com/advent-calendar/2022/mob_torikumi_example)の6日目の記事です

前回は「100のリスト」を紹介したので、そこで掲げた目標を目標で終わらないようにどのように実行していっているかお話します。

# 前回

https://qiita.com/Sicut_study/items/ab6ce11bc185d217881c

# Chapter#5 ちゃんと行動しよう

アール「いやーやはり100個も期初に書こうと思うと書ききれないですね～」
ミュート「いま50超えたくらいだけどなかなか思いつかないものだね」
じん「期初に100個かく必要はないです！思いついたらどんどん追加していくようにしましょう」
ベープ「この100のリスト面白い取り組みだけど、決めただけで終わりになりそうな気配がしますねｗ」
じん「100のリストはやることも大切ですが、やはり常に目を通していき地道に消化していく必要があります。今日は月別ビンゴをやっていきましょう！」

一同 「月別ビンゴ？？」

# 月別ビンゴについて

今回の話は前回の記事の100のリストの続きとなっています。

前回半期でチームとしてやる100個の項目を一覧にしました。
しかし、一覧にしただけで満足してしまうケースがよくあります(個人で作る場合尚更やらないことが多いです)

そこで100項目を1つでも消化するために私たちのチームでは「月別ビンゴ」というのを**各月最初のチーム会議**で作成しています。

月別ビンゴの具体的なものは以下のようなものになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/cead3af4-798c-6587-179e-b9795004c0a6.png)

これは7月分の実際のビンゴシートになります。

やり方としてはその月にやるべきこと8個をビンゴ形式で書いていきます。
この内容は「100のリスト」からとることもあれば、直近でやりたいことや、個人的なことなども入れてよいというルールになります。
また1人1個以上枠を埋めれば個数は自由というルールも設けています。

毎週のチーム会議でビンゴの進捗を確認して、月末までに多くのビンゴを達成することを目標にしています。

この取り組みをすることで目標を実際に実行するような習慣づけや、100のリストに普段から目を通す、目標を追加していくなど意識づけるようにしています

ちなみにこの元ネタも「100にリスト」同様です

https://twitter.com/toriga_niwa/status/1543165315344789504?s=20&t=eCxAGn155KTg9VnAI_L7aw

(この方のイラストも生き方もとても好きです)

また私たちのチームでは、半期の成果となりそうなものを一覧にまとめるようにもしています。
もっと成果を増やすぞと色々チャレンジする文化ができていきました。

![1668642555.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/5f21e3f2-e0ec-d973-0583-9d1e1acf9d34.png)

# 次回

https://qiita.com/Sicut_study/items/64cc24386f8099c61dfe

# おわりに

今回は短い紹介になりますが、チームでやっている珍しい取り組みについて紹介しました
チームのモチベーションを保つための工夫として取り組んでみたらどうでしょうか
答えは裏から覗けば見えてくる

先日、開発ベンダーからの提案に対して相談を受けました。
開発ベンダーから、保守費用として当初と違って３倍近くの提案をもらった。
これどう思いますか？

良く提案内容を見てみると、発注側から
・SLAが99.9％
・停止の場合は、損害補償必要
と指示があったみたいでした。

そーなると、２４時間３６５で体制を組む必要があります。３交代制にして、トラブルに対応できる様にスキルも高くシステムを理解したメンバーの配置。且つ１名でなく複数名。
**そりゃ。こうなりますね**

# 問題の本質は裏側にある
これってどう対処するのが正解だと思いますか？
1.ベンダー調整して、少しでも安くなる様に調整する
2.SLAを調整して、少しでも安くする
どちらも不正解。
1,2で解決したとしても、きっと、又、どこかで問題が発生します。
結局は、発注側と開発側がコミュニケーションの上手く出来てない事が問題なんです。
コミュニケーションが円滑であれば、開発側からSLAを損害保証までというのは結構厳しいですよ。コストも上がりますよ。と話が出来ます。
発注側からも、なんでここまで高いのか、どういう事なのか質問できます。
きっと、既にコミュニケーションが破綻している状態で、開発側は、断りたい思いで提案してると思われます。

# 先ずは情報収集から始める
事象を裏からや横から見ることで、問題の本質が見えてくる事は良くありますが、どこから初めて良いか悩む所です。
バスケット分析で、おむつとビールが同時買われると分析されたのは有名ですが、これは、ビールの売上をあげようとだけ考えているだけだとおむつ購入者にビールの良さをプッシュする様な発想は出てきません。
バスケット分析という手法の様にバスケットのデータを収集する事から始めます。

退職率の高さを対策しようとしている会社で、退職を止めるために面談を増やしたり、福利厚生を充実させる事が考えられますが、実は、使ってるブラウザがChromeの社員は、退職率が低く、IEを使ってる社員は退職率が高かったみたいです。IEは、渡されたPCのWindowsのデフォルトで入ってスグに使えますが、Chromeは自分でインストールする必要があります。自分自身で環境を良くしようとしている社員は、モチベーションも高く、生産性も高く、退職率は低いという結果です。

# データが無い時は、ヒヤリングと多重人格
世の中は、もっと複雑でデータがない場合もあると思います。この場合は、沢山ヒヤリングして情報収集する事で因果関係が出てくると思います。
更に相手の気持ちになって考えてみると、引っかかっている部分も見えてくるでしょう。関係者・ステークホルダーが多い場合は、全員の気持ちになって、立場になって見て下さい。

# 最後に
課題に対して、正しい答えが見引きだせない時や、糸口が見えない、真実が見えない時があると思います。
世の中は、本当に複雑怪奇で、ステークホルダーが増えると立場によって変数が増えて理解不能になります。
先ずは情報収集しながら、様々な角度から課題解決を検討してみて下さい
High Probability Opportunities での問題


https://trailhead.salesforce.com/content/learn/modules/lex_customization/lex_customization_list


何故か、商談オブジェクトでなくて取引先を使っているようです。どうしてオブジェクトを間違えるのかは不思議です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/3b51aef1-bb81-dedb-1732-be6439e2ed87.png)

+ [High Probability Opportunities](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000A8gIzSAJ)

:::note
Hi! I'm not familiar with that module but it looks like your list view is built on the Account object vs the Opportunity object. If you build it on the Opportunity object it will give the Opportunity fields to use as a filter. 

こんにちは！私はそのモジュールに詳しくありませんが、リストビューはAccountオブジェクトとOpportunityオブジェクトに基づいて構築されているようです。これを Opportunity オブジェクト上に構築すると、フィルターとして使用する Opportunity フィールドが提供されます。
:::

+ [High Probability Opportunities issue.](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000KgYq2)

:::note
If you build it on the Opportunity object it will give the Opportunity fields to use as a filter.

これを Opportunity オブジェクト上に構築すると、フィルターとして使用する Opportunity フィールドが提供されます。
:::

+ [未解決:Create a Custom List View](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007OqY4Q)

何をやっているのか、理解できませんでしたね。

# High Probability Opportunitiesの重複

+ [I am getting the following message when trying to create custom view list](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007epuQD)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/3c54c484-f3c5-f57a-0c5e-8a707a256c5c.png)


:::note
I am guessing from the name of the list view, High Probability Opportunities, that the list view is on the Opportunities tab. Click on the Opportunities tab and, using the drop-down menu with the list view names, look for the list view. Chances are that it will have the same name, "High Probability Opportunities." One way of checking the List View API name is by selecting the list view, clicking the List View Controls icon (the small cogwheel icon), and selecting Rename. That will show you the List Name and List API Name. Then click Cancel. Once you find the List View to delete, click the List View Controls icon and choose Delete.

リスト ビューの名前「High Probability Opportunities」から、リスト ビューは [Opportunities] タブにあると推測されます。 「商談」タブをクリックし、リスト ビュー名が含まれるドロップダウン メニューを使用してリスト ビューを探します。おそらく、同じ名前の「高確率の機会」が付けられるでしょう。リスト ビュー API 名を確認する 1 つの方法は、リスト ビューを選択し、リスト ビュー コントロール アイコン (小さな歯車アイコン) をクリックして、名前の変更を選択することです。これにより、リスト名とリスト API 名が表示されます。次に、「キャンセル」をクリックします。削除するリスト ビューを見つけたら、[リスト ビュー コントロール] アイコンをクリックして、[削除] を選択します。
:::
拡張ドメインを有効にした場合の URL の変更状況の確認

+ 拡張ドメインを有効にした場合の URL 構造へのすべての変更は、拡張ドメインを有効にした場合の [私のドメインのURL 形式の変更](https://help.salesforce.com/s/articleView?id=sf.domain_name_url_format_changes_enable_enhanced.htm&type=5)に一覧表示されています。

以下のように確認する見たいです。

+ [メール テンプレートにコミュニティ URL を含むリンクがあります。リンクを下に貼り付けます。どう影響するか教えてください。](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000LFycU)

そのページで documentforce を検索すると、次の 2 つのエントリが見つかります。

**本番**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/efe66aef-1547-24c7-168d-943dc099d479.png)

**Sandbox**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/68f31ec2-d90e-c634-d2ca-b1772af7248f.png)


そのため、URL を更新するときは、最初のスラッシュの前の部分を上記の形式に置き換えてみてください。(あなたのフォーマットは本番フォーマットのようです。最初にサンドボックスでこれをテストすることを強くお勧めします。)
ツリーマップを表示する(SPSS Modeler データ加工逆引き10-3)

# ツリーマップを表示する（新グラフ）

![スクリーンショット 2022-11-11 18.45.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/b36debea-6ee0-a801-5a1c-7759f6c7a8ee.png)

## 1.想定される利用目的

・グループ間の規模の比較


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

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

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

![スクリーンショット 2022-11-11 18.43.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/1582a631-c9e0-e24a-c245-18913ccd4b30.png)

入力するデータを確認するため[テーブル]を実行します。
![スクリーンショット 2022-11-11 18.44.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/3b1ff86d-ad0d-e375-6035-45ca551adf42.png)


[value]ノードを右クリックして[データの表示]を選択します。
![スクリーンショット 2022-11-11 14.15.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/e530a920-bd72-f10e-e043-75c9c611611d.png)

ツリーマップを選択します。
![スクリーンショット 2022-11-11 17.25.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/53724845-3972-14f3-0f2b-b316699db4dd.png)

以下の画面左の設定に従いセットします。ツリー図は構造が分かりやすいですが、マウスでポイントしないと規模がわかならいため、円がお勧めです。

![スクリーンショット 2022-11-11 18.42.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/5d9aea90-7748-cc21-9647-8a4fb3c8f19c.png)

![スクリーンショット 2022-11-11 18.40.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/08ba5d5e-e64f-6006-bafd-e2a6d8fd20f3.png)

#### 注意事項

新グラフ機能はバージョン18.1以降で装備されました。

## 4.参考情報

#### 新グラフを解説した記事

https://www.ibm.com/blogs/solutions/jp-ja/learn-modeler-04/

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

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

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

https://qiita.com/416nishimaki/private/4bf813e6cba84b2a1008
久々にunityで何か作ろうとしたら、プロジェクトを開くのに失敗しましたと出た。

![Pasted Graphic.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638403/ba11d071-2f11-cf8a-b1ab-b06fda9f046e.png)
この下にある、ログフォルダーを開いて、ガーッとスクロールしたら

```
Access token is expired, attempting to get a new one with refresh token
```
な文字が大量に書いてあった。
![timestamp2020-05-31T041537.881Z}.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638403/8f6ec430-cc45-4696-3fe0-78f2b18d8fd6.png)

## 最終的に原因と思しきこと

昔、unityとunity hubをゴミ箱に入れてアンインストールした。そのせいで、ライセンス認証でなんらかが残ってしまった。
その後、unity hubも新しくして、エディターも新しくインストールしたからだと思われるけど、はっきりとした原因はわからない。

### そもそもunityのライセンス周りは繊細？
https://forum.unity.com/threads/license-server-returned-unknown-error-please-contact-support-unity3d-com.527145/

## やってみたこと
### １.ライセンスリクエストによる認証を試したけど上手くいかなかった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638403/e34bf14d-cf95-94c0-d618-5219893a7524.png)


### 2.ライセンスを返却して、unityエディター削除しその後unityエディターを再インストールした。(これで上手くいった)
1では上手くいかなかったので、
プロジェクトは作っていないので、失うものは何もないですし、おすしなので、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638403/11b643cb-5ee4-3985-c46e-9a6879908610.png)
まずライセンスを（無料だし）返却しようとしたのだが、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638403/1e0d1a11-28d5-55ca-6486-154024882d3e.png)
返却できない！
最終的に、Editorを削除し、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638403/9b8f65b5-f030-a790-322a-e1ed5a748699.png)
からライセンスを習得し直して、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638403/9eb1fe7f-e969-dbc4-5242-63e50858f504.png)
情報を更新したら、今度はライセンスが返却できた！
その後、再び、無料のPersonalライセンスを取得して、

https://shibuya24.info/entry/unity-start
あとは、↑を参考（インストールについてはだいぶ下スクロールしないとみれない）にエディターをインストールし直したら、
無事起動しました！！👌