OmniAICreator/Qiita-1.07M huggingface dataset:
凝集型クラスター分析

凝集型クラスター分析手法

```py
#ライブラリー呼び出し
import pandas as pd
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
%matplotlib inline
import random
random.seed(0)
import copy



```

```py
#下記URL参考にしつつ実施
#https://qiita.com/g-k/items/8f0d9905d3e106caed59
import pandas as pd
import numpy as np
import scipy
from sklearn import datasets

dataset = data

#目的変数（今回分ける基準）
y = data["index"]
#説明変数
X = data.iloc[:40,1:]

dataset_data = X
dataset_target = y

#目的変数の名前
target_names = "index"

from scipy.cluster.hierarchy import linkage,dendrogram,fcluster
#引数でウォード法を指定
Z = linkage(dataset_data, method='ward', metric='euclidean')
pd.DataFrame(Z)

#可視化実施
import matplotlib.pyplot as plt
fig2, ax2 = plt.subplots(figsize=(20,5))
ax2 = dendrogram(Z)
fig2.show()

#3つに分けた時のクラスターNoを振り分け
F = fcluster(Z, t = 3, criterion = 'maxclust')
print(F)

#クラスターラベルの付与
data_with_cluster_label = data.iloc[:40,:]
data_with_cluster_label['cluster_label'] = F

```

```py
#凝集型クラスターを可視化
from scipy.cluster.hierarchy import dendrogram, ward
from sklearn.datasets import make_blobs

# y:目的変数
# x:説明変数
#ここを設定する

X,y = make_blobs(random_state = 0, n_samples=12)
linkage_array = ward(X)
dendrogram(linkage_array)

ax = plt.gca()
bounds = ax.get_xbound()

#線の位置を決める
ax.plot(bounds,[7.25,7.25],"--",c="k")
ax.plot(bounds,[4,4],"-",c="k")

#自分で線を引く場所を決める
ax.text(bounds[1],7.25,"-two_culusters", va="center",fontdict={"size":15})
ax.text(bounds[1],4,"-three_culusters",va="center",fontdict={"size":15})

#X軸のラベル付
plt.xlabel("Sanple_index")
#y軸のラベル付
plt.ylabel("Cluster_distance")

#クラスターNoの振り分け
F = fcluster(Z, t = 3, criterion = 'maxclust')
print(F)

```
HTMLとJavascriptファイルのみのデプロイ

# はじめに
自主学習として、Webサイトを作成しております。
しかし、HTML JSファイルのみでデプロイをしようと試みましたがうまくできないためご教示いただけますと幸いです。

# 試したこと
AWSにてバケットを作成、S3保存をしてherokuデプロイ等の手順を実施しました。
jsonファイル、phpファイルを作成するとデプロイが可能と下記サイトで情報を得たため実施
https://qiita.com/bitcoinjpnnet/items/ee5b4064279996c4d5ad

# 作成データのファイル
ファイルが現在下記のURLとなっております。
https://gyazo.com/7ce45e97e4f6b964124b5c5123c9d7b2
認証ありのプロキシ環境でPower Automate Desktopを使用できるようにする

## 概要

### はじめに
会社のPCなど認証ありのプロキシ環境の場合、Power Automate Desktopをインストールするだけでは使用できない場合があります。
認証ありのプロキシ環境でも使用できるようにするための手順を説明します。

### 対象読者
以下のような画面が表示されて困っている方。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60328/77e0e45a-5c06-8f02-8e21-54f2eb7f56ba.png)

:::note warn
警告
本記事は、2022/5/30時点の情報に基づくものです。Power Automate Desktopの仕様変更により、手順通りにはならない場合があります。
Microsoft社が公開している最新情報をご確認ください。
:::

### 前提条件
- Windows 10以降
- [Power Automate Desktop](https://docs.microsoft.com/ja-jp/power-automate/desktop-flows/install)がインストール済みでサインインしていること
- プロキシサーバのURLとポート番号が分かっていること
  - (例) http://hogehoge.co.jp:8080 

### 参考リンク
- [Power Automate デスクトップでプロキシ設定を検出する](https://docs.microsoft.com/ja-jp/power-platform-release-plan/2021wave1/power-automate/power-automate-desktop-detect-proxy-settings)

## 手順

### レジストリの変更
[Power Automate デスクトップでプロキシ設定を検出する](https://docs.microsoft.com/ja-jp/power-platform-release-plan/2021wave1/power-automate/power-automate-desktop-detect-proxy-settings)を参考に、Power Automate Desktopキーがなければ作成して、下記の通り値を追加します。
利用するプロキシサーバーは{ProxyServer}、{UseDefaultProxyCredentials}の値は現在ログイン中の資格情報(ユーザーID・パスワード)を使用するという意味です。

:::note warn
警告
ProxyServerはhttp(s)を含めてください。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60328/a1719e51-337c-07c5-4902-5e4b3330846e.png)

### Power Automate Desktopを再起動する

Power Automate Desktopを終了して再度起動して設定を有効にします。

:::note warn
警告
設定によっては、×ボタンで閉じても、アプリが常駐したままになります。
タスクバーに残っている場合は終了してください。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60328/e282bf5f-843a-a3c9-af6d-b988f75776a3.png)

## さいごに
フロー一覧画面が表示されたら成功です。よい自動化ライフを！
【自分用メモ】Laravel マイグレーションしてみた

# マイグレーション手順
#### 1. マイグレーションファイル作成
今回はコーヒー豆銘柄のテーブルを作成する。
`php artisan make:migration create_blands_table --create=blands`
#### 2. カラム追加
upメソッドで新規テーブル、カラム、インデックスを追加する。
今回カラムとして以下の通り設定する。
(1) 銘柄ID
(2) 銘柄ステータス
(3) 銘柄名
(4) 生産国
(5) 評価
(6) 作成日時
(7) 更新日時

``` yyyy_mm_dd_hhmmss_create_blands_table.php
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('blands', function (Blueprint $table) {
            $table->increments('id')->index()->comment('銘柄ID');
            $table->string('status', 50)->index()->default('active')->comment('銘柄ステータス');
            $table->string('name', 50)->index()->comment('銘柄名');
            $table->string('country', 50)->index()->comment('生産国');
            $table->string('comment', 254)->comment('評価');
            $table->timestamps();
        });
    }
```
### 3. マイグレーション
`php artisan migrate`
export 'default' (imported as 'content') was not found in | webpack mini-css-extract-pluginでのエラー

webpackでビルドした際に以下のエラーが出ました。

# エラー

```error.sh
WARNING in ./src/style.css 22:17-24
export 'default' (imported as 'content') was not found in '!!../node_modules/mini-css-extract-plugin/dist/loader.js!../node_modules/css-loader/dist/cjs.js!./style.css' (module has no exports)
 @ ./src/index.js 1:0-23
```

# 原因
どうやらmini-css-extract-pluginでesmoduleの設定がデフォルトでonになっているのでesmoduleの構文チェックをしてくれて警告を出してくれている模様でした。

具体的には以下エントリポイントのjsファイルでcssを呼び出しているのですが
これがES modulesの構文的に警告になっている状況でした。

```javascript
import "./style.css";
```

元々JavaScriptは他のファイル（モジュール）をインポートする機能がありませんでした。そして紆余曲折ありながら現在モジュール機能の標準としてES modulesが使われておりその構文にそってないコードを警告してくれる機能がmini-css-extract-pluginに備わっているために出てきたものです。

# 解決方法１
ES modulesで対応していないCSSなどを読み込むためのライブラリでdynamic-import-assetsというものがあり、こちらでインポートをすると警告なく実行することができます。前述のjsファイルを以下のように書き換えます。

```javascript
const { dynamicImportCSS } = dynamicImportCSS("./style.css");
```

これでビルドしてみて警告が出なくなれば成功です。

### 参考
ES Moduleについての解説をわかりやすくまとめていただいておりました。

https://efcl.info/2020/04/05/dynamic-import-assets/

https://hacks.mozilla.org/2018/03/es-modules-a-cartoon-deep-dive/

# 解決方法２
今回の警告はmini-css-extract-pluginの機能が親切で出してくれているものです。警告なのでビルドを実行するときちんとCSSは読み込まれていましたのでやりたいこと自体は実現できている状態でした。であればこの警告機能をオフにしてあげれば警告を消すことができます。webpack.config.jsファイルに以下のようにオプションを追記します。

```webpack.config.js
    module: {
        rules: [
            {
                test: /\.css$/i,
                use: [
                    {
                        loader: MiniCssExtractPlugin.loader,
                        options: {
                            esModule: false,
                        },
                    },
                    "css-loader"
                ],
            },
        ],
    }
```

loaderのオプションのところにesModule: falseという形で追記してあげることで機能をオフにすることができます。
これでビルドを実行して警告が出なければ完了です。

### 参考
同じ現象をわかりやすく解説していただいてとても参考になりました。感謝です。

https://frontendguruji.com/blog/warn-export-default-imported-as-content-was-not-found/
PoCに関連する説明

# Ⅰ. PoCとは
１．PoCとは
Proof of Concept：概念実証、新たなアイデアやコンセプトの実現可能性やそれによって得られる効果などについて検証すること

２．目的
実現可能性の判断の精度を高めるため

３. 効果
①. 新しい技術の使用を前提としたプロジェクトで、技術的な問題を早期に発見し、プロジェクト内で問題を共有し、早期に解決することができる
②. 技術的なリスクによるプロジェクト全体の遅延を軽減
③. 技術的なリスクが排除されない場合でも、代替案を選択するための時間を確保する


# Ⅱ. 実施内容と進み方
１．実施内容
プロジェクトによって異なるが、主に課題によって、小規模で試作や実装、個別の動作確認なとを行う

２．進み方
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2697792/b4f4201c-b323-ec77-0e17-76b1a1df8027.png)

# Ⅲ. 導入のタイミング
技術要素が仮に決められた時

# Ⅳ. PoCの位置付け
１．ウオーターフォールの場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2697792/581d0deb-2bb9-8f32-6eb9-c8c49c04985d.png)

２．スクラムの場合
スプリントとして実施する

# Ⅴ. 実施流れ
１．計画を立ち上げる
例：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2697792/ff9a12fd-3d43-9233-e46b-e5ae3dce2695.png)

２．詳細スケジュールを設ける
例：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2697792/e55d9320-36a8-65b6-05d1-3f3caa51bbb4.png)


３．検証結果を発表
例：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2697792/562f4a68-e8aa-fe61-5ee2-13248540f172.png)

# Ⅵ．参考文献
企業立案からシステム開発まで　本当に使えるDXプロジェクトの教科書｜下田 幸祐、飯田 哲也
Macのpyenv+pycharm環境下でtkinterが使えなかったトラブル

「あれ？Labelがpackされてないぞ！！？」
真っ黒なウィンドウしか作成されず
困っていたところ以下の記事に助けられました。
また忘れそうなのでメモ。


[Macのpyenv環境下でtkinterを使えるようにする方法](https://qiita.com/saki-engineering/items/92b7ec12ed07338929a3)をそのままにトラブルを解決したというメモです。

やり方は、基本元記事を参考にしてやってください。
macとpyenvのバージョンとターミナルのシェルが違うくらいです。


# 使用した環境
- macOS Monterey 12.3.1
- zshを使用
- pyenv 2.3.0
- tcl-tk: stable 8.6


# そのほかの情報
pyenvでインストールしたpython3.9.6を使用していた
pycharmやVScodeのインタプリタとして使用。


# まずはtcl-tkが含まれていないpythonをアンインストール
```
pyenv global system　#systemにまず切り替える
pyenv uninstall 3.9.6 #アンインストールする
brew install tcl-tk #brewを介してtcl-tkをインストール
```

# ターミナルの設定をする

```~/.zshrc

#nodeのインストの時に設定した記述部分
source ~/.profile
export PATH=$HOME/.nodebrew/current/bin:$PATH
eval "$(pyenv init -)"

#今回の追加記述
export PATH="/usr/local/opt/tcl-tk/bin:$PATH"

```

```.zprofile

#nodeとpyenvのための記述
export PATH=$HOME/.nodebrew/current/bin:$PATH
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init --path)"

#今回の追加記述
export PATH="/usr/local/opt/tcl-tk/bin:$PATH"
export LDFLAGS="-L/usr/local/opt/tcl-tk/lib"
export CPPFLAGS="-I/usr/local/opt/tcl-tk/include"
export PKG_CONFIG_PATH="/usr/local/opt/tcl-tk/lib/pkgconfig"
```

# pyenvからtcl-tkの8.6を使用するようにpython3.9.6をインストール
```
$ PYTHON_CONFIGURE_OPTS="--with-tcltk-includes='-I/usr/local/opt/tcl-tk/include' --with-tcltk-libs='-L/usr/local/opt/tcl-tk/lib -ltcl8.6 -ltk8.6'" pyenv install 3.9.6
```
3.9.6でなくてもいいと思うのですが、
自分は今回python3.9.6にしています。

![スクリーンショット 2022-05-30 11.56.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694948/3835df78-2680-9854-906b-4e7f41c846e6.png)

無事にlabelなどがpackされるようになりました。
背景はデフォルト黒のままでした・・・。

configureで色は変えられるみたいので、
とりあえずこのままやってみようと思います。

```
import tkinter as tk
root = tk.Tk()
root.geometory("300x400")
root.configure(bg="pink")
```
![スクリーンショット 2022-05-30 11.58.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694948/1f6750f5-f041-78ed-9266-fa2e2255d99e.png)


pygameも試しているのですが、
そちらはこのようなトラブルはなく
ウィンドウにpack的なことをすることは可能でした。
SSHを再接続時に前のセッションに接続する方法

# 結論
端末のマルチプロクサーを使う
# マルチプレクサー
- [screen](https://www.gnu.org/software/screen/)
- [tmux](https://github.com/tmux/)
# 導入方法
- [tmuxのInstall・How to Use](https://qiita.com/kurashimayuuri/items/55fc80eb9101a89c583f)
# 参考
- [SSH のプロセスが残ったまま切断しちゃった場合の対処](http://dotnsf.blog.jp/archives/1070479698.html)
開発ドキュメントがごちゃごちゃしてきたので整理する

## まとめ
開発ドキュメントを、リリース前だけ必要なものと、リリース後も必要なものを、ディレクトリでわけて整理するとスッキリする。

## 開発ドキュメントの整理方法
リリース後もみるドキュメントのみ残して、それ以外は削除するなり、アーカイブするなりします。
ただし、要件定義書/内部設計書（の一部）/テスト仕様書などリリース後は見ないであろうドキュメントたちも、リリースするまでは必要です。
なので、それらは開発中はリリース後も必要なドキュメントも含めて、すべて現在進行中ディレクトリ（ongoing)などの中にいれます。
リリースされたら、要らないものは削除かアーカイブ、要るものは別のディレクトリに移動します。
これでスッキリするはず...！

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247791/8e110ffd-9b42-ac15-d0e2-6f511195ed12.png" width="400">

## 背景
現在お世話になっているチームでは、"Ongoing"というディレクトリに現在進行中のプロジェクトのドキュメントをまとめています。

それをみて、開発ドキュメントも、プロジェクトが進行中の間だけ参照するドキュメントと、リリース後も参照するドキュメントを、ディレクトリを分けるようにすれば、必要な情報に辿り着きやすくなるのではないかと思い整理してみました。

現場によってはドキュメント一切なしで、issueのみで進めてるところもあるそうです（すごい...）。それで問題なければ、それでいいと思います。（むしろ理想...）

一方で、開発ドキュメントがありすぎると、システムを理解するために必要な情報が埋もれてしまいます。

新しく入った現場でドキュメントの量に圧倒された経験はありませんか？
・何から見ればいいのかわからない。
・ドキュメントがメンテされておらず、最新の情報と古い情報が混在している。
・質問をしたら、ここに書いてあるよ、とそっけなく言われる。辛い。
新規参画メンバーにこのような辛い思いをさせないようするためには、必要な情報のみに絞ることが重要と思います。

ここでは、多すぎるドキュメントをどのように整理すれば、はじめて参画する人もスムーズにシステムを理解できるかを考えたいです。自分はアプリエンジニア（とくにアプリとWEB）ですので、その観点でのみ記載していることをご留意ください。

## リリース後もみるドキュメントは何か？
システムを理解するために見たい情報は、リリースされているプロダクトの全体像くらいです。あとは、開発環境を構築して試しに動かすことができれば、なんとなくは理解できると思います。

### はじめて参画する人向けドキュメント
開発ドキュメントとしては、以下があればいいと思います。
- 開発環境構築手順
- システム構成図
### 仕様確認用のドキュメント
すでに参画している人が仕様を思い出すためにも、以下の開発ドキュメントは役立ちます。
- 外部設計書
    - ER図
    - 画面設計書
- 内部設計書
    - シーケンス図
    - アクティビティー図

そのほかにもあると思いますが、あくまで例になりますので...重要なのは、リリース後も見るのか？という観点で分類することです。
ここでは以下を除外しました。

|ドキュメント  |例  |説明  |
|---|---|---|
|開発前に作成するドキュメント  |要件定義書  |開発者はそもそもあまり見ない（？）し、リリース後は責任回避（or 追求）のためにしか見ない  |
|内部設計書（一部）  |クラス図  |基本的にはコードを見ればわかる内容のため。特に、クラス名などコードに依存する記載があるもの（メンテも大変 ） |
|テスト仕様書  |結合テスト仕様書, シナリオテスト仕様書  |実施済みのテスト仕様書は、外部設計書に記載してある内容のエビデンスでしかないため  |

開発チームがリリース後もみる・みないという観点で開発ドキュメントを整理する方法をご紹介しました。
ありがとうございました。

## 参考
https://thinkit.co.jp/article/17064
Microsoft IntuneからiPhoneおよびiPadにアプリ専用の設定を配信する


モバイル端末管理ツールの一種であるMicrosoft Intuneから、iPhoneにアプリ専用の設定値を配信することがありました。備忘録として、Intune側での設定方法とiOSアプリでの読み出し方を記載します。

<!-- more -->

## Intune側設定

アプリ構成ポリシーを追加します。手順の流れは以下の通りです。

1. アプリ構成ポリシー: "マネージドデバイスの追加"を選ぶ
1. ポリシーの概要を設定する
1. iOS端末に書き込む値を設定する
1. どのグループに端末を配信するかを設定する
1. ポリシーの内容を確認し、OKであれば確定する
1. ポリシーが端末に反映されているか確認する

### 1. アプリ構成ポリシー: "マネージドデバイス"の追加を選ぶ

Microsoft Endpoint Manager admin centerを開き、アプリ > アプリ構成ポリシー > 追加 > マネージドデバイスを選択します。

![Microsoft Intuneからのアプリ構成ポリシー設定の選択](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1967276/d7511375-04b5-81df-b78f-bb4c62ffe503.png)

### 2. ポリシーの概要を設定する

"基本"にて、以下の項目を入力します。

- ポリシー名*: 必須。配信する設定に応じて命名する
- 説明: 任意。ポリシーの配信目的、概要などを記載する
- プラットフォーム名: "iOS/iPadOS"
- 対象アプリ: Intuneで配信しているiOS/iPadOSアプリのうち、設定を配信したいアプリを選ぶ

### 3. iOS端末に書き込む値を設定する

本項目はiOSでの[MDM管理設定(mcx_preference_settings)](https://developer.apple.com/documentation/devicemanagement/managedpreferences/preferencedomain/settings/mcx_preference_settings)に相当します。そのため、アプリからはUserDefaultsを介して取得できます。

構成設定は、XMLデータか構成デザイナーで指定できます。以下は、

- ManagedDevice = true
- ManagedDeviceId = IntuneでのデバイスID

を書き込む例です。

**構成デザイナーの場合**

構成キー | 値の型 | 構成値
--- | --- | ---
ManagedDevice | ブール値 | true
ManagedDeviceId | 文字列 | {{deviceid}}

**xmlの場合**
```xml
<dict>
   <key>ManagedDevice</key>
   <true/>
   <key>ManagedDeviceId</key>
   <string>{{deviceid}}</string>
</dict>
```

値には、[Intuneで定義されている変数](https://docs.microsoft.com/ja-jp/mem/intune/apps/app-configuration-policies-use-ios#tokens-used-in-the-property-list)を指定できます。これらの変数は`{{変数名}}`と書くと参照できます。なお、Intune上では変数名について記載ミスがあっても警告やエラーは表示されません(型の不整合については表示されます)。

なお、複数のアプリ構成ポリシー間もしくはコンプライアンスポリシー間で競合値があった場合、どれが反映されるかはランダムになる[^1]のでご注意ください。

### 4. どのグループに端末を配信するかを設定する

- ポリシーを配信したいグループを"組み込まれたグループ"
- 配信しないグループを"除外されたグループ"

で指定します。

除外は組み込まれたグループよりも優先されるので、除外されたグループに指定されたiOS端末にはポリシーは適用されません。


### 5. ポリシーの内容を確認し、OKであれば確定する

ポリシーの内容が表示されるので、問題がなければ確定します。

### 6. ポリシーが端末に反映されているか確認する

作成されたアプリ構成ポリシーにて、"管理しているデバイス"で状態が"成功"であれば設定が反映されています。まだ反映されていない場合は最大で数時間待機するか、または同期を行ってポリシーを反映します。

## iOS端末側の実装

以下の2手順でポリシーに設定した値を取得することができます。ポリシーの適用状態によっては設定値を取得できない場合があるので、その場合のデフォルト値を考慮しておく必要があります。

### 1. ManagedPreferenceを取得する

MDMから配信されたManagedPreferenceは、UserDefaultsから取得できます。ManagedPreferenceは"com.apple.configuration.managed"キー以下に格納されています。なお、以下のケースでは返り値はnilになります。

- MDM管理でない端末で当該アプリを実行している場合
- ポリシーが当該端末に反映されていない場合

```swift
func getManagedPreference() -> [String: Any]? {
    return UserDefaults.standard.object(forKey: "com.apple.configuration.managed") as? [String: Any]
}
```

### 2. ManagedPreferenceから、特定の設定値を読み出す

以下の処理より、ManagedPreference中の設定値を取得できます。値が設定されていない場合にクラッシュすることがないよう、 `as? 当該パラメータの型`でキャストした上で値を取得します。

```swift
func deviceId() -> String? {
    guard let managedProfile = getManagedProfile() else { return nil }
    let deviceId = managedProfile["ManagedDeviceId"] as? String
    return deviceId
}
```

[^1]: https://docs.microsoft.com/ja-jp/mem/intune/configuration/device-profile-troubleshoot
【iOS】１年振りにアプリを更新しようとしたらAppStoreレビューで何度も却下されたので対応方法を共有します

個人開発アプリをAppStoreに出しています。
ですが
- 更新が１年前
- iOS15対応のXcodeでビルドしていない

という状態だったので久し振りにiOS15への対応やライブラリのアップデートをしてAppStoreへアップロード、審査に提出しました。

その後待つこと半日、、、

**却下の通知が届きました。**

Guideline 2.1 - Performance - App Completeness
- 
> We discovered one or more bugs in your app. Specifically, your app frequently became unresponsive during the review on iPad. Please review the details below and complete the next steps. 

バグがあるので直してとのことです。
確認したら、iOS15への対応の起因で普通にバグってたので直しました。

Guideline 2.1 - Information Needed
- 
>We're looking forward to completing our review, but we need more information to continue. Your app uses the AppTrackingTransparency framework, but we are unable to locate the App Tracking Transparency permission request when reviewed on iOS 15.5.


トラッキング権限の許諾のダイアログが出ないようになっているとのことです。
AppDelegateのapplicationDidBecomeActiveでダイアログを出すという処理をしていたのですが、なんとiOS15からはそのタイミングで出すことが出来ないようになっていました。
なので少しタイミングをずらすことで対応しました。

再提出
====
しかしまたもや却下

Guideline 2.1 - Information Needed
-

> We're looking forward to completing our review of your app. Before we can continue, we need a video that demonstrates the current version, 2.4.9, in use on a physical iOS device.
Specifically, we need a demo video that shows the feature.
Keep these requirements in mind as you make your demo video: 
> - Only use footage of your app running on a physical iOS device, not on a simulator. 
> - Make sure the video clearly documents all relevant app features, services, and user permission requests.
> - You can use a screen recorder to capture footage of your app in use. 

なんと、デモビデオの提出を求められました。
先ほどバグを直して提出したはずなのにまだバグが起きているようです。
レビューチームからバグが起きているスクリーンショットが添付されているので確認すると、なんと直したはずのバグがしっかり起きている状態でした。
再度動作とコードを確認、さらにTestFlightのアプリも何度も動作を確認したのですが絶対にバグは起きないはずの状態でした。

少し考えてみて
もしかしたら新しいビルド番号で提出したアプリではなく更新前のアプリをレビューしてるのでは？と考え
AppStoreレビューのページを確認してみると一番下に赤文字で
**提出をキャンセル**
というボタンを発見
これをせずに再審査をしたのがまずかった？（というかなぜこの処理をせずに再申請した？俺？）

なので早速キャンセル処理。
さらにしっかり動作している状態の動画を撮影して添付もしました。

Guideline 2.3.3 - Performance - Accurate Metadata
- 
>We noticed that your screenshots do not sufficiently show your app in use. Specifically, your 12.9-inch iPad Pro screenshots do not show the current version of the app in use.
>To help users understand your app’s functionality and value, your screenshots should highlight your app's core concept. For example, a gaming app should feature screenshots that capture actual gameplay within the app.

AppStoreに表示されるスクリーンショットが今動いているアプリと相違があるとのことです。
確かにスクリーンショットの更新は４年くらいしておらず、その間に若干デザインの変更とかもしていたので現状とは見た目が違っていました。
スクリーンショットを取り直して適当に編集してから更新しました。
12.9インチiPadProと書いてはありますが、指摘されるのも面倒なので全部の端末分を更新しました。

再提出
-
ようやく承認されました。


- この１年の間にAppStoreConnectも審査のやり方も少し変わっているなと思いながら作業をしていたのですが、細かいところ（キャンセルボタン）に気づけなかったことが招いた失敗でした。
- せめて新しいOSバージョンが出た、とか、新しい端末が出たとかのタイミングでこまめに更新した方が良いですね。(自分に向けた言葉）
- 公式のレビューのガイドラインとかもちょくちょく更新されているのでそちらのチェックもしたほうが良いですね。(自分に向けた言葉）
見えない文字が隠れているのを発見するコード

# 経緯
なぜだか、PHPで文字を置換したりすると、NULL文字が出てきたりして
大手キャリアは対応してくれますが、
メール送信、LINE送信などでnull文字があると、
それ以降の文字が消えて送信される不具合が発生。
どの文字コードが原因か調べるために作った（パクった）関数です。

# 関数
```php
function changeUnicode($utf8_str){
    //入力をUTF-32に変換
    $utf32_str=mb_convert_encoding($utf8_str,'UTF-32','UTF-8');

    for($i=0;$i<mb_strlen($utf32_str,'UTF-32');++$i)
        //1文字ずつ16進文字列に変換
        $result[]=bin2hex(mb_substr($utf32_str,$i,1,'UTF-32'))."|".mb_substr($utf8_str,$i,1,'UTF-8');
    return $result;
}
```

# 例
```php

$str = "こんにちは!";

print_r(changeUnicode($str));

/*出力
Array
(
    [0] => 00003053|こ
    [1] => 00003093|ん
    [2] => 0000306b|に
    [3] => 00003061|ち
    [4] => 0000306f|は
    [5] => 00000021|!
)
*/
```

# ほんとかよー
確認
[Unicode一覧 3000-3FFF - Wikipedia](https://ja.wikipedia.org/wiki/Unicode%E4%B8%80%E8%A6%A7_3000-3FFF)
[Unicode一覧 0000-0FFF - Wikipedia](https://ja.wikipedia.org/wiki/Unicode%E4%B8%80%E8%A6%A7_0000-0FFF)

00003053 →　U+3053 → こ
00003093 →　U+3093 → ん
0000306b →　U+3093 → に
00003061 →　U+3061 → ち
0000306f →　U+3061 → は
00000021→　U+0021 → !

OK!!


# 参考にしたサイト
というかほぼパクリですが。

[PHPにおけるUnicode文字列の正規化 (1/2)：CodeZine（コードジン）](https://codezine.jp/article/detail/2668
)
【Linux】コマンド　初心者のための超基本


環境
MacBook Air (M1,2020)
macOS Monterey


Linuxコマンドを覚えるためにまとめました。
せっかくなのでチュートリアル形式で・・・！


・デスクトップにフォルダを作成
・フォルダ内にファイルを作成
・ファイルへの書き込み
・ファイルの中身の確認
・ファイル名の変更
・ファイルの削除

の順番でやっていこうと思います。

※以下、フォルダ = ディレクトリ と呼びます。


<h1>はじめに</h1>

チュートリアルに入る前に・・・・
まずは、超基本の現在地の確認方法です。
迷子になったらすぐpwdコマンド！

```zsh
#現在のディレクトリを表示 = pwd
~ % pwd

#結果
/Users/ユーザ名
```
~ というのは、ホームディレクトリを表しています。(チルダと読みます)
スタート地点はいつもここです。デスクトップではないのです。

・・・ん？これはどこなの？って人はFinderを開いて確認してみてね。
Macintosh HD → ユーザ → ユーザ名


続いてlsコマンドで、ディレクトリの中身を確認してみましょう！
これは、本当によく使います。

```zsh
#ディレクトリの中身をリスト形式で表示 = ls
~ % ls

#結果
Applications	Downloads	Music		Desktop		
Library		    Pictures    Documents	Movies		
Public
```

<h1>チュートリアル開始</h1>

では、早速チュートリアルに入っていきましょう！
まずはデスクトップに移動。

```zsh
#ディレクトリを移動 = cd 移動先
~ % cd Desktop
```

今回は、sampleという名前のディレクトリを作成します。
普段は右クリックで新規フォルダ作成をしていますよね・・・
その操作をコマンドでやるとこんな感じです。

```zsh
#ディレクトリを作成 = mkdir ディレクトリ名
Desktop % mkdir sample
```

では、作成したsampleディレクトリへ移動してみましょう。

```zsh
#ディレクトリを移動　= cd 移動先
Desktop % cd sample
```

ここでpwdしてみると・・・

```zsh
#現在のディレクトリを表示 = pwd
sample % pwd

#結果
/Users/ユーザ名/Desktop/sample
```

移動できていますね！
testという名前のファイルを1個作成しましょう。

```zsh
#ファイルを作成 = touch ファイル名
sample % touch test
```

sampleディレクトリの中身を確認すると・・・

```zsh
#ディレクトリの中身をリスト形式で表示 = ls
sample % ls

#結果
test
```

今度は、testファイルの中へ書き込みをします！
ベタですが、Hello! にしておきましょうか・・・

```zsh
#文字列をファイルに出力 = echo '文字列' > ファイル名
sample % echo 'Hello!' > test
```

さて・・・本当に書き込まれているのか確認してみましょう。

```zsh
#ファイルの内容を表示 = cat ファイル名
sample % cat test

#結果
Hello!
```

ファイルの中身を全画面表示したい時はlessコマンドを使用します。
戻る時は、【q】を押してください。

```zsh
#テキストファイルを閲覧 = less ファイル名
sample % less test

#結果
Hello!
test (END)
```

どんどん行きましょう！次は、ファイル名の変更です。
test を test1 へ変更してみましょう。

```zsh
#ファイル名の変更 = mv 元のファイル名　変更後のファイル名
sample % mv test test1
```
ファイル名が変更されているかどうかlsコマンドを使って確認します。

```zsh
#ディレクトリの中身をリスト形式で表示 = ls
sample % ls

#結果
test1
```

test1 に変更されていましたね。
mvコマンドは、ファイルやディレクトリの移動でも使います。
気になったらぜひ調べてみてね！

最後に、test1 を削除してみましょう。
※rmコマンドを使用すると、ゴミ箱に行かずに削除されるので注意してね！

```zsh
#ファイルの削除 = rm ファイル名
sample % rm test1
```

sampleディレクトリの中身を確認して
何も表示されなければ削除完了です！

```zsh
#ディレクトリの中身をリスト形式で表示 = ls
sample % ls

#結果
表示されない
```

<h1>おまけ</h1>

チュートリアルで作成したsampleディレクトリも削除してくれや！って方に・・・

```zsh
#現在は /Users/ユーザ名/Desktop/sample にいるため、1つ上の階層へ移動します
sample % cd ..

#空のディレクトリを削除 = rmdir 空のディレクトリ名
Desktop % rmdir sample
```
rmコマンドで削除したものは、
【ゴミ箱】に入らずに消えてしまうので、**基本的に復元できません。ご注意を！！！！**

ラストは、exitコマンドでログアウトしましょう！
```zsh
#ログアウト = exit
Desktop % exit
```
ショートカットキーの場合は、【Ctrl+D】です。

<h1>最後に</h1>

GUIって便利ですよね・・・（おい）

最後に、Macユーザーの方に「ターミナル」以外でおすすめの
コマンドラインツールをご紹介します。
<a href='https://iterm2.com/'>iTerm2</a>
使い方やカスタマイズ方法は、「iTerm2 設定」などで検索してね！
VSCodeのRemote Cotainerを起動しようとすると invalid mode: chached のエラーになる

VSCodeのRemoteContainerでdocker composeを使おうとすると以下のエラーが出てしまう

```javascript
ERROR: for fastapi-react_front_1  Cannot create container for service front: invalid mode: chached

ERROR: for front  Cannot create container for service front: invalid mode: chached
```

## 原因: docker-composeコマンドが入っていたため

ホストマシンであるMacには以下の２つのdocker compose が入っている状態になっていた。

```javascript
$ docker compose version
Docker Compose version v2.2.1

$ docker-compose version
docker-compose version 1.29.2, build 5becea4c
docker-py version: 5.0.0
CPython version: 3.9.0
OpenSSL version: OpenSSL 1.1.1h  22 Sep 2020
```

docker composeがバージョン2になる前から使っていたので、 Docker Dekstopに標準でインストールされているものと、自前でインストールしたものの両方が混在していた

RemoteContaierはどうやら `docker-compose` があれば`docker-compose` を使うようなので、バージョンが古いせいでエラーが出ていたんじゃないかなという推測

## 解決方法: docker-composeコマンドのアンインストール

以下のコマンドで削除してあげればok

```javascript
$ sudo rm /usr/local/bin/docker-compose
```

これでVSCodeのRemoteContainerも無事に起動できました ✨
Accessでテーブルにリンクすると、データがすべて"#Deleted"と表示される。

# 現象
AccessからODBCを介してSQL Serverのテーブルをリンクして使っていた所、一部のユーザーが「#Deleted」と表示されるようになりました。
開発機では現象出ず、他ユーザーでも正常に使える人とそうでない人が混在しており、益々原因不明です。

# ネットで調べると・・・
１. パススルークエリを使うと回避出来る
この方法を使うと、確かにAccess側から参照しても正常に見えるようになりました。
しかし、根本的解決に至ってない気がして何かもやもやします。
現象発生するテーブルのみパススルークエリにするのもいまいち抵抗感がありました。

２. SQL Server側でbigintを使っている
SQL Server側でbigintを使っている事が原因であり、下記の方法で解決するとの事。
- 方法１. SQL Server側をintに修正、Access側を再リンク
- 方法２. Access側のオプション→現在のデータベース→データ型のサポートオプションの「リンク/インポートされたテーブルで大きい数値(BigInt)データ型をサポート」にチェックを入れ、Accessを再起動

しかし、今回の環境のテーブルにはBigIntは使っていませんでした。

３. DateTime型にて小数点が使われている。
SQL Server側でDateTime型の秒データにて、小数点以下のデータが存在している事が原因であり、下記の方法で解決するとの事。
- 方法１. 更新クエリを使い、小数点以下のデータを丸める。
- 方法２. SQL Server側をsmallDateTimeに修正、Access側を再リンク
- 方法３. Access側のオプション→現在のデータベース→データ型のサポートオプションの「リンク/インポートされたテーブルの拡張日時(DateTime2)データ型のサポート」にチェックを入れ、Accessを再起動

DateTimeフィールドが存在していたので、SQL Server側の該当フィールドをsmallDateTime型に変更、再リンクしてみましたが、解決しませんでした。
ダメ元で「拡張日時(DateTime2)データ型のサポート」にチェックを入れてみましたが解決しません。

# 考察
上記「2. SQL Server側でbigintを使っている」関連で、色々調べていると ___PK___（プライマリキー？） ___にbigintを使っているとダメ___ 、みたいな記述を発見しました。
これを見て、主キーのフィールドが関係しているのではないかと思いました。
このテーブルの主キーは６桁固定の英数字で構成されるコードです。

フィールドの型を見てみると、何故か  ___nvarchr(10)___ となっておりました。
char型に於いて、違いを調べると下記のような用途との事です。
- char → ASCII 固定長
- nchar → UNICODE 固定長
- varchar → ASCII 可変長
- nvarchar → UNICODE 可変長

今回のフィールドは「２バイト文字を含む10バイトまでの可変長」という事になります。
仕様としては６桁固定であり、コードに２バイト文字（漢字等）を使うことはあり得ないので、 ___char(6)___ としてみました。

すると、上手く行きました。

# 原因と対策
今回の原因は ___主キーフィールドの型がUNICODE 可変長であった事___ であり、 
 ___ASCII 固定長___ にする事によって解決しました。

UNICODEで変なデータが紛れたのか、主キーなのに長さが違うデータが混在してエラーとなったのが原因なのでしょうかね？

同じ悩みをお持ちでここにたどり着き、多くの方が解決して頂ければ幸いです。
任意のフローから別のフローを呼び出す

掲題の件について調査＆検証したので覚書です。以下のいずれか方法で実現可能です。

# 【方法1】ソリューションに親フロー、子フローともに含める
## :star:特徴
親フロー、子フロー間で値の授受を行わせることができます。
また親フローは**子フローの実行が完了するまで待機する**（待機期間は[公式の説明](https://docs.microsoft.com/ja-jp/power-automate/create-child-flows#create-the-parent-flow-in-a-solution)をご覧ください。）ので繰り返し使用したい一連の処理がある場合に特に向いています。

## :notebook: 作成方法
1. 呼び出されるFlow（子フロー）はトリガー「手動でフローをトリガーする」とし、フローの末尾で「PowerApp または Flow に応答する」を追加します。
![子フローの作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218676/d8f35061-6ae3-497f-6353-81a525ba9398.png)

1. 子フローを定義した後に親フローで「子フローの実行」アクションを追加し使用したい子フローを定義します。
![子フローの作成2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218676/e745db76-d0b3-09d5-4488-9ee0a3c64fd9.png)

:::note warning
Dataverse以外のコネクタを使用するようなアクションを子フローで追加する場合は以下に注意が必要です。
> フローが組み込みアクションまたは Microsoft Dataverse コネクタ以外を使用する場合は、フローを更新して、フローに 埋め込まれた 接続を使用する必要があります。 これを行うには、子フローのプロパティ ページに移動し、編集 を 実行専用ユーザー タイルで選択します。

> 現時点では、親フローから子フローに接続を渡すことはできません。 これを行わないと、子ワークフローは埋め込み接続のみをサポートするため、名前を子ワークフローとして使用できないことを示すエラーが表示されます。

Microsoft、[子フローを呼び出す](https://docs.microsoft.com/ja-jp/power-automate/create-child-flows)より
:::


# 【方法2】子フローをＨＴＴＰ要求アクションでトリガーさせる

::: note warn 
使用するHTTP要求アクションはプレミアムコネクタのためPower Apps**有償プランが必要**です。
:::

## :star:特徴
- モバイルアプリでも子フローを実行できるようにキャンバスアプリのボタンからフローを開始させることができる。
- 親フローは子フローの実行を待機しません。

## :notebook: 作成方法
1.  インスタントクラウドフローの作成から選ぶことができるトリガー「HTTP 要求の受信時」を子フローに使用します。
![HTTP呼出1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218676/db0da133-b6bc-ad7e-f1e7-02e32c027f6e.png)

1. 1を保存後にトリガーで自動生成された「HTTP POSTのURL」をコピー
![HTTP呼出2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218676/f90cfdb1-8368-38c4-1a5d-099805a57603.png)

1. 親フロー側で子フローを呼出したいタイミングにアクション「HTTP」を置き、URLに2でコピーしたURLを貼り付ける。

:::note info
 子フローはソリューションに含めても含めなくても使用できます。
:::

---
# 参考
https://ascii.jp/elem/000/004/077/4077899/

https://docs.microsoft.com/ja-jp/power-automate/create-child-flows#:~:text=%E3%82%BD%E3%83%AA%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AB%E5%AD%90%E3%83%95%E3%83%AD%E3%83%BC%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B%20Power%20Automate,%E3%81%AB%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3%E3%81%97%E3%80%81%20%E3%82%BD%E3%83%AA%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%20%E3%82%92%E9%81%B8%E6%8A%9E%E3%81%97%E3%81%BE%E3%81%99%E3%80%82

https://artisan.jp.net/blog/power-automate-call_the_flow/
【SwiftUI】ViewのスナップショットをUIImageで保存する

元ネタはここです。
> [SwiftUI exporting the content of Canvas](https://stackoverflow.com/questions/71285697/swiftui-exporting-the-content-of-canvas)

まず、View に extension を作ります。
```swift
extension View {
    func snapshot() -> UIImage {
        let controller = UIHostingController(rootView: self)
        let view = controller.view
        
        let targetSize = controller.view.intrinsicContentSize
        view?.bounds = CGRect(origin: .zero, size: targetSize)
        view?.backgroundColor = .clear
        
        let renderer = UIGraphicsImageRenderer(size: targetSize)
        
        return renderer.image { _ in
            view?.drawHierarchy(in: controller.view.bounds, afterScreenUpdates: true)
        }
    }
}
```
使用例
```swift
@State var anyView = AnyView()

Button(action: {
    let image = anyView.snapshot()
    UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil)
}, label: {
    Text("Get Snapshot")
})
```
カメラロールに画像を保存するには Info.plist に "Privacy - Photo Library Additions Usage Description" を設定する必要があります。
Oracle Analytics Cloud 予測機能～誰にも聞けない基礎の話～　その３：閑話休題

皆さんこんにちは。

2回にわたってOracle Analytics Cloud機械学習モデルの内容についてみてきましたが、既にお腹いっぱい、お疲れ気味の方が多いのではないでしょうか。

そこで閑話休題。

前回までの記事の中で回帰という言葉が何回も出てきたと思います。

「回帰」という言葉は、英国の遺伝学者であり統計学者でもあったゴルトン（またはゴールトン）の「平均への回帰」という概念が語源となっています。

ゴルトンさん
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1251127/fa1d32c9-8b84-9baa-9855-1c694490060e.png)

このゴルトンさん、本業の遺伝学の方では彼の功績のおかげで後進の研究者の方々の礎となる考え方をもたらし、研究がかなり進んだと言えるようです。
他にも、様々な分野にその才能を発揮されています。気象図の等圧線を考案し，気圧という概念を発見したり，指紋による個人の識別をスコットランドヤードに提唱したり天才だったのでしょう。


進化論で知られるチャールズ・ダーウィンは従兄にあたります。

ダーウィンさん
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1251127/e633625e-7458-6991-e2d8-e1a92b4bc523.png)

種の起源で大いに刺激を受けて、遺伝学にも統計の技術を持ち込むあたりは画期的ですよね。
埼玉のホームページに掲載されていた身長と体重の回帰分析の例（詳細はその2をご参照ください）はそれっぽくていいです。

このゴルトンさん、な、なんと、ナイチンゲールとも親戚筋にあたります。

ナイチンゲールさん
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1251127/167c4ee6-ca09-d38b-af86-1eb48049ecf7.png)


ナイチンゲールは皆さんご存知「白衣の天使」です。この方、統計学者でもありました。
1853年のクリミア戦争での負傷兵たちへの献身や統計に基づく医療衛生改革を行ったそうです。

学生時代にいろいろな本を読んではいたものの、今、仕事に絡んで読み返してみるとかなり面白いです。
それにしてもゴルトンさんの周辺の方々すごいですねー。
難解な機械学習も、このような雑学を交えながら進めていくと覚えられそうな気がしてきます。
次回は続きを書いていきます！お楽しみに
Dockerコンテナで使用するネットワークアドレスを変更する

新規で作成する手順はいくらでも見つかるのだがいったん作られたものを変更するのは面倒だったのでメモ

基底になるネットワーク(Docker0)はあらかじめ変更しておく。
ここではdefault01を192.168.180.128/26に変更する。

### コンテナがどのネットワークなのか確認する

#docker inspect container01
[

～～～Snip～～～
            "Networks": {
                "default01": {　← これ
                    "IPAMConfig": {},
                    "Links": null,
                    "Aliases": [
                        "e4b3948b34f3"
                    ],
                    "NetworkID": "ce478f4d46b5393c883c5dae52858a2738fa384ac57457ff34d8f631f31cc637",
                    "EndpointID": "8b034278b5cb73fe6cbc675d90a1ff7a354dfbe58076d1fc8cbae211308f46b6",
                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.2",
                    "IPPrefixLen": 26,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:c0:a8:b4:82",
                    "DriverOpts": {}
～～～Snip～～～
]

### コンテナを止める

docker kill container01

### コンテナをネットワークから切り離す

docker network disconnect default01 container01

### ネットワークの削除

docker network rm default01

### ネットワークの作成

docker network create --subnet 192.168.180.128/26 default01

### コンテナをネットワークに接続する

docker network connect default01 container01

### コンテナの起動

systemctl restart docker

### 多分コンテナの再生成が必要

<b>docker-compose.yml を探す</b>
find / -name docker-compose.yml 

### 該当ディレクトリに移動する

### コンテナを停止して削除する
docker-compose down

### ストレージディレクトリを削除する
rm -rf storage/

### コンテナを再生成する
docker-compose up -d
Microsoft Cloud for Sustainability を使って東京電力の電気使用量を取り込む（グラフ表示まではせずに、データ取り込みまで）


## 初めに
企業がもっているデータをもとに、温室効果ガスの現状の可視化、
間接的に発生するCO2排出量の可視化を目指す。
つまり、どれくらい企業が排出し、吸収や削減の活動を行っているか把握したい。

## 東京電力のエリアの電力使用量を取り込みダッシュボードに表示する
### ダッシュボード表示するーこれは東京電力のデータではなくサンプルです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/592a61f4-8b94-cd30-1d28-7ea749a18844.png)

何が原因で排出量が増加しているのかAIがこれまでのデータの要因から教えてくれる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/1b3747f8-f2e5-49df-b621-c48dc26a2920.png)

### やったこと
機械翻訳のＴＯＰ画面からデータ取り込み方法を確認する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/8caf6935-686c-0da2-bb9f-ac7768f70c31.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/1023e245-2c33-0a96-d1fa-c82591c30ab6.png)
東京電力のＨＰよりＣＳＶを取り込む。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/3b204fd8-08f7-ae85-c5f8-768c5373d2b5.png)

https://www.tepco.co.jp/forecast/html/images/juyo-2022.csv

1時間ごとの東京管内の使用量kWが日ごとで見える
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/1b21b246-da20-d5a8-110d-b7f5d9ad7084.png)

データ取り込む標準テーブルがすでに存在する。自分でテーブルを作る必要がないため
マッピングするだけでデータが入る。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/fc32659c-7e6b-1554-a67c-c4f2e0354148.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/0e68f3bd-bdf9-e287-14c3-5b0620bbc11f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/af36f84c-c334-a3af-4eb1-e07afec75d06.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/c7804310-4e2a-c5e3-7a5d-f3b05e672593.png)


### データが入らない。原因判明。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/0fe36c1d-f56b-c350-05f7-816be718948b.png)

原因はマッピングするときに、どの項目にどのCSV項目をマッピングするか設定が必要だった。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/aefeefe6-baba-0280-7cd2-2a54d0f8016b.png)


マッピングすることで、電気使用量は入った。日付等は時間があるときに再度トライしてみたい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/c0bdb40d-2d1c-42cc-7a24-6f01f97f23d4.png)

### 今回は、グラフまではせずに、データ投入まで実施。

## 参考
### 元のテーブルのサンプルデータを見るとき

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/d28a8b00-c58f-0a6a-aa16-84c8f117c3f2.png)

https://docs.microsoft.com/ja-jp/dynamics365-release-plan/2022wave1/industry-clouds/sustainability/
Stripe Payment Linksで、プロモーションコードを事前設定したリンクを作成・共有する


StripeのPayment Linksを使用して支払リンクを作成する場合、クエリストリングを利用して「クーポンコードを適用した状態」にすることができます。

https://stripe.com/docs/payments/payment-links#url-prefills

## 支払いリンクの、クーポンコードを有効化する


クーポンコードを適用するには、作成した支払いリンクでクーポンコードを設定できるようにする必要があります。

新しく支払いリンクを作成する際か、作成済みの支払いリンクを編集して、「クーポンコードを許可」をオンにしましょう。

![スクリーンショット 2022-05-25 18.35.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/904dc659-7ffb-1c6c-fba0-ef06e98bdb44.png)

## クーポンとクーポンコードを作成する

ダッシュボードからクーポンを作成しましょう。

URL: https://dashboard.stripe.com/test/coupons/create

![スクリーンショット 2022-05-25 18.40.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/4e3463e6-d390-9191-377c-ac5994eeb397.png)

### 最低限設定が必要な項目
- **名前**: 管理画面で表示される名前
- **タイプ**: 割引の種類。定額かパーセントでの割引かを選択
- **割引率・割引額**: どれだけ割引するか
- **期間**: サブスクリプションで利用する場合の有効期間。

### クーポンコードを発行する

作成したクーポンを利用できるようにするため、クーポンコードも設定します。

[顧客に表示されるクーポンコード]をオンにすると、クーポン作成画面でコードも発行できます。

![スクリーンショット 2022-05-25 18.44.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/fa81d1e5-e200-5b6e-87a2-f8e8764ddfd8.png)


## `prefilled_promo_code`でクーポンコードを設定する

クーポンコードが作成できたら、あとはURLに設定するだけです。

Payment Linksで作成したURLに、`prefilled_promo_code`文字列を追加しましょう。

例:`https://buy.stripe.com/test_XXXX?prefilled_promo_code=XXXX`

このURLにアクセスすると、クーポンコードが設定された状態の支払い画面が表示されます。


![スクリーンショット 2022-05-25 18.46.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/1656bb04-75c1-5f1c-1bd9-8e8f20e9a768.png)

## 応用編: 特別割引オファー付きの支払いリンクを生成・共有する

この機能と、クーポンコード生成のAPIを活用することで、特別な割引オファー付きリンクを生成できます。

以下のサンプルでは、1回限り・期限付きのクーポンコードを発行し、支払いリンクURLに追加しています。

```js
      import dayjs from 'dayjs'

      const createSpecialOfferLink = async (customerId: string) => {
        // 顧客データを取得
        const customer = await stripe.customers.retrieve(customerId)
        if (customer.deleted) return null

        /**
         * クーポンコードを作成。
         * 1回しか使えない＆有効期限付きにすることで、実質その人限定にする
         **/
        const { code: promoCode } = await stripe.promotionCodes.create({
          coupon: 'YOUR_COUPON_ID',
          max_redemptions: 1,
          expires_at: dayjs().add(7, 'day').unix()
        })

        // URLを作成
        const specialOfferLink = `https://buy.stripe.com/test_xxxx?${[
          `prefilled_promo_code=${promoCode}`,
          (customer as any).email ? `prefilled_email=${encodeURIComponent((customer as any).email)}`: ''
        ].filter(Boolean).join('&')}`
        return specialOfferLink
      }
```

この処理をCRMやStripeのWebhook・自社サービスのバッチシステムなどに組み込むことで、LINEやメールで顧客に特別セールの案内を簡単に出せるようになります。

また、支払いリンクのみを利用して決済を提供している場合でも、セールや割引オファーの提示ができます。

ぜひビジネスのプロモーションやカスタマーサクセスなどの企画として、ご検討ください。



## [PR] Stripe開発者向け情報をQiitaにて配信中！

- [Stripe Updates]：開発者向けStripeアップデート紹介・解説
- ユースケース別のStripe製品や実装サンプルの紹介
- Stripeと外部サービス・OSSとの連携方法やTipsの紹介
- 初心者向けのチュートリアル(予定)

など、Stripeを利用してオンラインビジネスを始める方法について週に２〜３本ペースで更新中です。

-> [Stripe Organizationsをフォローして最新情報をQiitaで受け取る](https://qiita.com/organizations/stripe)
SourceTreeユーザーは`stree`コマンドを使うと残業時間が15秒減ります

## 先に結論だけ

- ターミナルから`stree`コマンドを実行すると、カレントディレクトリでSourceTreeが立ち上がります。
- vscodeやWebStormなど、ターミナルと統合されたエディタで`stree`コマンドを使用するとSourceTreeのリポジトリブラウザを操作する必要がなくなります。

## はじめに

この記事は、SourceTreeコマンドラインツールと、`stree`コマンドの使用方法を共有するためのものです。

### 想定する環境

- macOS 11.6.5
- SourceTree v4.1.8(243)
- Git 2.35.3

### 想定する読者

- Gitを利用している
- SourceTreeを利用している
- 複数のワークスペースを操作する必要がある

## SourceTree command line tools とは

SourceTree command line toolsとは、SourceTreeをコマンドラインから起動可能にするヘルパーアプリケーションです。
macOSの場合、実行ファイルは`/Applications/SourceTree.app/Contents/Resources/stree`にあります。
このアプリケーションは、SourceTreeと同時にはインストールされません。別途インストールする必要があります。

### SourceTree command line tools のインストール

![インストール手順](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9556/f5aecb1a-5828-4743-8b22-013352a8b134.jpeg)

SourceTreeを起動して、メニューバーの[SourceTree]→[コマンドラインツールをインストール]を選択します。

![インストール成功ダイアログ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9556/34254c8b-8e8a-f6f4-1e90-05b47b091383.jpeg)

「インストールに成功」というダイアログが表示されれば、作業は完了です。

## `stree`コマンド

`stree`コマンドは、SourceTreeを起動するコマンドです。コマンドのオプションは以下の通りです。

```shell
stree [path]
```

pathを省略した場合、カレントディレクトリでSourceTreeが起動します。つまり`stree`と`stree .`は同じ結果になります。pathは自由に指定できるので、`~`ホームディレクトリからのパスを指定したり、`../`親ディレクトリを指定することもできます。

`stree`コマンドを利用すれば、コードエディタから直接SourceTreeを起動できます。SourceTreeのリポジトリブラウザを操作する必要がなくなり、複数のワークスペースを切り替える作業では作業時間を短縮できます。

以上、ありがとうございました。
今週の学び　第7回

# 今週の学び


jQueryなど

- null
    - データ型の1種で自身の「null」という値のみを持つ
    nullは識別できないことを表し、変数がオブジェクトを指していないことを示す

- clearInterval()
    - 以前に setInterval() の呼び出しによって確立されたタイマーを利用した繰り返し動作を取り消す
    - 
- setInterval()
    - setInterval(‘関数名’ , ‘ミリ秒’);
    Window および Worker メソッドで提供され、一定の遅延間隔を置いて関数やコードスニペットを繰り返し呼び出す

- prop()
    - 主にチェックボックスやラジオボタンの選択値を取得するために使う
    - 
- clearInterval()
    - 以前に setInterval() の呼び出しによって確立されたタイマーを利用した繰り返し動作を取り消す 

- ==と===の違い
    - ==は、文字列と数値の比較の場合、文字列を数値に変換してくれる
      ===の場合、文字列は数値にに変換されない
      ===はバグが少ないので===の使用が推奨される

- Number()
    - 数値を表現したり操作したりするために使用される
      他の型の値は Number() 関数を用いて数値に変換することができる

- typeofの使い方
    -例えば、console.log(typeof 80);など
    コンマで区切ったりしない

- メソッドの()
    - 何が入るかはその時によって変わるので、調べる
    - 
- null
    - 数字以外のオブジェクトを初期化する
    数字の時は0で初期化する

- タイマーの数字がマイナスにいかなくなった理由
    - clearintervalでsetintervalのループから抜けたから

- .val() 
    - ()内が空なら値を取得、()内に何か入っていれば値をセットできる

- setInterval
    - var intervalID = setInterval(myCallback, 500, 'Parameter 1', 'Parameter 2');
    上記のintervalID(変数名)が返値で、clearInterval()使用時の()内に入れたりする


# まとめ

暗記するだけでなく、アルゴリズムや何をしたいかを明確にしてコードを書くようにする
Git を使うたための初期設定(windows クライアント → Linux サーバ)

# 注意
Linux の細かい操作方法やインストール方法は説明していません。

# サーバ側
## git のインストール
```bash
# yum install git
```

## リモートリポジトリの作成
```bash
$ cd /home/user/
$ mkdir ~/git_repo.git
$ git init --bare --share
```

# クライアント側(windows)
## git のインストール
windows の git を以下の URL からダウンロードします。
https://gitforwindows.org/
インストール方法はここでは説明しませんが、全て「はい(YES)」で良いかと思います。
## リモートリポジトリの追加
コマンドプロンプトを開き以下を実行します。
「git config --global --edit」では適宜名前と E メールアドレスを設定する。
```
C:\USER\USER>cd /Documents/<使いたいフォルダ>
C:\USER\USER>git init
C:\USER\USER>git config --global --edit
C:\USER\USER>git add .
C:\USER\USER>git commit -m "first commit"
C:\USER\USER>git remote add origin user@<サーバの IP アドレス>:~/git_repo.git
```
## 結果の確認
以下のような結果が帰って来ることを確認します。
```
C:\USER\USER>git remote -v
origin  user@<サーバの IP アドレス>:~/git_repo.git (fetch)
origin  user@<サーバの IP アドレス>:~/git_repo.git (push)
```

## クライアントから push してみる
```
C:\USER\USER>git push origin master
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 8 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 304 bytes | 152.00 KiB/s, done.
Total 3 (delta 2), reused 0 (delta 0), pack-reused 0
To <サーバの IP アドレス>:~/git_repo.git
   458c2e8..6b7a273  master -> master
```
## サーバ側で確認してみる
```
$ git log
commit 6b7a273822948d060e8133cdb3d3a133cba6aab3
Author: user <user のメールアドレス>
Date:   Mon May 1 09:45:02 2022 +0900

    first commit
```

ここまで設定できれば VSCode などでも使用できる状態になります。
ValueError: Unknown activation function:swish

### ValueError: Unknown activation function:swish が出た時


### 原因：  
レイヤーが入っていないため、エラーが起きる
参考記事：https://github.com/qubvel/efficientnet/issues/62

  
### 解決法：  
- モデル作成時の既存のレイヤーを入れる↓
```
from efficientnet.keras import EfficientNetB0
```
- 自作のレイヤーを入れる↓
[こちらの記事](https://qiita.com/kiakiraki/items/2ec24f13ee870e13a0fb)  を参考にする
reactの新しいプロジェクト作成で大文字が使えない

reactの新しいプロジェクトを実行しようとした時のエラー

```
$npm init react-app Attendance
```

そうするとこのようなエラーが

```
Cannot create a project named "Attendance" because of npm naming restrictions:

  * name can no longer contain capital letters

Please choose a different project name.
```

多分意味的には大文字がダメだということなので,小文字にして実行
```
$npm init react-app attendance
```
```
Happy hacking!
```
てことでうまくいきました
おにぎりで理解する関数とクラス

## はじめに
今回は、初学者がつまづきやすい関数やクラスの概念や使い方を
おにぎりを作ることを例に理解していけたらなと思います。


## おにぎりで理解する関数

それではまず関数からやっていきましょう。

まず関数とは、一言にいうと、処理の塊です。

さっそくおにぎりを例にすると、
おにぎりを作るまでに必要なものは、
おにぎりを握る人、白ごはん、おにぎりに入れる具になると思います。

この場合、
おにぎりを握る人のおにぎりを握る処理が関数となり、
おにぎりを握る人に渡すおにぎりの具が引数になります。

引数によって決まった処理をして、処理の結果を返す。
おにぎりの具に(引数)よって、おにぎりを握り(決まった処理)、引数おにぎり(返り値)ができあがる。

このようにおにぎりを握る関数を用意しておけば、具を渡すだけで色んなパターンのおにぎりが出来上がります。

同じような処理をする場合は、
関数を用意してあげていれば、その処理をしたいときだけ、その用意した関数を呼び出せばいいので、
何度も同じコードを書かなくて済むようになります。


では、いざコードにおこしてみるとどうなるでしょうか。
１つの例としてはこんな感じになるかと思います。

```c#:onigiri.js
// おにぎりを作る関数

// -- step3 -- onigiriTukuruKansuuが具材を受け取りおにぎりを作る処理が走る 
// ※ またstep2であげた具材(gohan, onigiri_no_gu)を(gohanHikisuu, guHikisuu)で受け取る。
// ※ 仮にstep2あげた具材を(onigiriNoGu, gohan)という順番にすると、(gohanHikisuu, guHikisuu)ここのgohanHikisuuにはonigiriNoGuが入ってくる。
function onigiriTukuruKansuu(gohanHikisuu, guHikisuu) {

    // -- step4 -- 具材がないとおにぎりが作れないので、ifで具材があるかどうかみる(gohanHikisuuがあるか、かつ、guHikisuuがあるか)
    // ※ 仮に、if (guHikisuu)こう書いた時、guHikisuuの中になにか値や文字列があればtrue、guHikisuuが空っぽならfalseという判定ができる
    if (gohanHikisuu && guHikisuu) {
        // -- step5 -- ごはんと具を混ぜてあげる
        let onigiri = guHikisuu + gohanHikisuu;
        // -- step6 -- 出来上がったonigiriをreturnで返してあげる。(返り値)
        // ※ 返ってくる場所は、step2でonigiriTukuruKansuuに作ってもらうと宣言した場所 res_onigiriの中に返ってくる
        return onigiri;
    } else {
        return 'おにぎりの材料がありません';
    }
}

// -- step1️ -- 具材の準備 (変数宣言)
let gohan = 'ごはん';
let onigiri_no_gu = 'うめぼし';

// -- step2 -- onigiriTukuruKansuuに具材をあげて作ってもらう (関数宣言)
let res_onigiri = onigiriTukuruKansuu(gohan, onigiri_no_gu);


// -- step7 -- res_onigiriにonigiriが返ってきたので、console.logで出してみる。
// ※ 具材がなかった場合は、step4でelseが走るため、'おにぎりの材料がありません'が返ってくる
console.log(res_onigiri);
// ※ うめぼしごはんとログにでればOK
```




## おにぎりで理解するクラス

次はクラスについてやっていきましょう。

まずクラスとは、よく設計書と例えられがちですが、
それではイメージしにくいのでざっくりというと関数の集まりです。

例えば、昼食を作る時、必要なのは、
おにぎりを作る
おかずを作る
水筒を用意する(水筒はお弁当を作るというくくりには入りませんが数合わせということで)

このような処理が必要になってきます。

LunchRobotクラスがあってその中に、
おにぎりを作る関数
おかずを作る関数
水筒を用意する関数

があるイメージで大丈夫です。

そしてこのLunchRobotクラスの処理によってできたお弁当こそがインスタンスを言います。


では、関数の話のときのようにこれをおにぎりを作る部分をコードにおこしてみるとどうなるでしょうか。
１つの例としてはこんな感じになるかと思います。

```c#:onigiri.php
<?php

// -- step1️ -- 具材の準備
$obento = new LunchRobot('ごはん', 'うめぼし');
$obento->gohan = 'ごはん';
$obento->onigiri_no_gu = 'うめぼし';

// -- step4 -- onigiriTukuruKansuu()の返り値を出力している。
echo $obento->onigiriTukuruKansuu();

class LunchRobot {
    public $gohan;
    public $onigiri_no_gu;

    // -- step2 -- クラスが呼び出された時に最初走る処理
    public function __construct($gohan, $onigiri_no_gu) {
        $this->gohan = $gohan;
        $this->onigiri_no_gu = $onigiri_no_gu;
    }

    // -- step３ -- ごはんと具があれば混ぜてあげる。なければ'おにぎりの材料がありません'と返す
    public function onigiriTukuruKansuu() {
        if ($this->gohan && $this->onigiri_no_gu) {
            return $this->onigiri_no_gu . $this->gohan;
        } else {
            return 'おにぎりの材料がありません';
        }
    }

    public function okazuTukuruKansuu() {
        // おかずを作る処理を書く
    }

    public function suitoTukuruKansuu() {
        // 水筒を用意する処理を書く
    }
}

```

## 

今回は初学者の方がつまづきやすい関数とクラスについてお話しました。
最後まで読んでくれてありがとうございます。
ツイッターもやってますのでフォローしていただけると嬉しいです。(@LC_Ono)
なんか次の勤務先でnutanixを使いそうなのでメモ失礼します。

[【入門】Nutanix とは？ - (O+P)ut ](https://www.mtioutput.com/entry/2018/11/15/112200)
専用のハイパーバイザであるAHV、
専用の構成管理ツールであるPrism、
そして分散ストレージ機能を受け持つControllerVMです。
RustでPostgreSQLに接続する

## 概要

RustからPostgreSQLに接続し、select文を実行するところをまでを
試してみた作業メモです。

今回、接続にこちらのクレートを使います。
https://docs.rs/postgres/


## プロジェクトの作成

```console
% cargo new connect_postgres
% cd connect_postgres
```


## `src/main.rs` に `postgres` の extern を追加

```rs
extern crate postgres;

fn main() {
    println!("Hello, world!");
}
```


## 一度 cargo run する

`postgres` クレートに必要なライブラリのダウンロード、コンパイルが行われ、
その後に実行される。

```console
% cargo run
    Updating crates.io index
  Downloaded block-buffer v0.10.2
  Downloaded futures-task v0.3.21
  ...
   Compiling futures v0.3.21
   Compiling tokio-postgres v0.7.6
   Compiling postgres v0.19.3
   Compiling connect_postgres v0.1.0 (/Users/username/src/github.com/username/rust-study/connect_postgres)
    Finished dev [unoptimized + debuginfo] target(s) in 1m 46s
     Running `target/debug/connect_postgres`
Hello, world!
```

## PostgreSQLに検証用データを作成する。

下記のdocker-compose.ymlでdocker-commpose upする。
```yaml
version: "3.9"

services:
  postgres:
    image: postgres:14.3-alpine3.16
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: password
    ports:
      - 5432:5432
    volumes:
      - pgdata:/var/lib/postgresql/data

volumes:
  pgdata:
```

検証用データのinsert。
```sql
# create database testdb;
# \c testdb
# create table users (id int, name varchar);
# insert into users values (1, 'name1'), (2, 'name2');
```


## Rustから接続する

postgres crateの例を参考にselectするプログラムを記述。
https://docs.rs/postgres/latest/postgres/#example

```rs
extern crate postgres;
use postgres::{Client, Error, NoTls};

fn main() -> Result<(), Error> {
    let mut client = Client::connect(
        "postgresql://postgres:password@127.0.0.1:5432/testdb",
        NoTls,
    )?;

    for row in client.query("SELECT id, name FROM users", &[])? {
        let id: i32 = row.get(0);
        let name: String = row.get(1);
        println!("{} {}", id, name);
    }

    Ok(())
}
```

## 実行

```console
% cargo run
   Compiling connect_postgres v0.1.0 (/Users/username/src/github.com/username/rust-study/connect_postgres)
    Finished dev [unoptimized + debuginfo] target(s) in 0.98s
     Running `target/debug/connect_postgres`
1 name1
2 name2
```
100日後くらいに個人開発するぞ！day035

## 今日もレスポンシブデザインを実装してみた！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2632394/1ef8f78a-7b8d-5569-1d11-353bbb6dd1bc.png)


##　今日のアウトプット

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2632394/79c983b8-a568-a072-7dc0-0c76e80b4b86.png)

## 今日の学び

### スマートフォン向けレイアウト
＊ スマートフォン向けのレイアウトを組むためにブレイクポイントを670pxに設定
* スマートフォンではfooterが中央寄せになるよう配置した方がいい
* スマートフォン環境でもボタンをタップしやすいようにボタンの幅を広げる
* 画面幅が小さいときはフォントサイズを小さくした方が読みやすい
yarn でワークスペースにパッケージを追加できなくなった

表題の解決法メモ

```sh
$ yarn workspace hoge add fuga
error An unexpected error occurred: "expected workspace package to exist for \"@babel/helpers\"".
```

`@babel/helpers` の部分は人によって違うと思うが、ワークスペースにパッケージを追加しようとすると `expected workspace package to exist for ...` のエラーが出て追加できなくなってしまった
[issue](https://github.com/yarnpkg/yarn/issues/7807)としても挙げられている

# 環境

- yarn 1.22.18
- node v16.14.0
- M1 MacBook Pro
- macOS Monterey 12.4

# 原因

https://github.com/yarnpkg/yarn/issues/7807#issuecomment-623223536
複数のパッケージが依存しているパッケージのバージョンが異なっている

# 解決策

いくつか解決策がある

## その1 `yarn-deduplicate` を実行する

https://github.com/yarnpkg/yarn/issues/7807#issuecomment-1097198463
これが一番正攻法な気がする

```sh
$ npx yarn-deduplicate && yarn install
```

[yarn dedupe](https://yarnpkg.com/cli/dedupe) では解決できない
`error The dedupe command isn't necessary. 'yarn install' will already dedupe.` と出てしまう

## その2 一旦ロックファイルを削除する

最も簡単だが `yarn-deduplicate` よりも差分が大きい

## その3 yarn のバージョンを下げる

https://zenn.dev/kyo9bo/articles/063e60c19449fb
yarn のバージョン1.19あたりから発生しているエラーらしく1.18.0にすることでも回避できる

```sh
$ yarn --version
1.22.18
$ yarn policies set-version 1.18.0
$ yarn --version
1.18.0
```

この場合 `.yarnrc` と `.yarn/releases/yarn-1.18.0.cjs` の2ファイルが作成される

## その4 resolutions を使う

[https://github.com/yarnpkg/yarn/issues/7807#issuecomment-643642616](https://github.com/yarnpkg/yarn/issues/7807#issuecomment-643642616)

```package.json
{
  "resolutions": {
    "@babel/helpers": "7.17.9"
  }
}
```

エラーの原因となっているパッケージ全て記述する必要があり面倒

## その5 `package.json` に手動で書き足して `yarn install`

根本的な解決になっていないのでおすすめはしない

# おわりに

以上、メモ書きでした