OmniAICreator/Qiita-1.07M huggingface dataset:
recsys-pythonをやってみる【第1章】

# はじめに
レコメンドシステムに携わっているので、Pythonによる推薦システムの演習問題集であるrecsys-pythonを解いてみました。
まずは１章です。
参考にしたサイトは以下です。
https://note.nkmk.me/
https://oregengo.hatenablog.com/entry/2016/03/09/132214
https://qiita.com/okkn/items/54e81346d8f35733ab5e
https://biotech-lab.org/articles/12701

# 01 評価履歴の生成
```
import numpy
Du = numpy.array([[5, 3, 1],
                 [6, 2, 1],
                 [4, 1, 1],
                 [8, 5, -1,],
                 [2, 4, -1],
                 [3, 6, -1],
                 [7,  6, -1],
                 [4,  2, numpy.nan],
                 [5, 1, numpy.nan],
                 [8, 6, numpy.nan],
                 [3, 4, numpy.nan],
                 [4, 7, numpy.nan],
                 [4, 4, numpy.nan]])
print('Du = \n{}'.format(Du))
```

# 02 評価履歴の形状
```
print('Duの形状 = {}'.format(Du.shape))
```

# 03 評価履歴の行数
```
print('Duの行数 = {}'.format(Du.shape[0]))
```

# 04 評価履歴の列数
```
print('Duの列数 = {}'.format(Du.shape[1]))
```

# 05 評価履歴の全要素数
```
print('Duの全要素数 = {}'.format(Du.size))
```

# 06 アイテム集合
```
I = numpy.arange(0, Du.shape[0])
print('I = {}'.format(I))
```

# 07 アイテムの特徴ベクトルの集合
```
x = Du[:, :2]
print('x = \n{}'.format(x))
```

# 08 アイテムiの特徴ベクトル
```
i = 0
print('x{} = {}'.format(i, x[0]))
```

# 09 評価値集合
```
ru = Du[:, 2:3].reshape(Du.shape[0])
print('ru = {}'.format(ru))
```

# 10 評価値集合の形状
```
print('ruの形状 = {}'.format(ru.shape))
```

# 11 評価値集合の全要素数
```
print('ruの全要素数 = {}'.format(ru.shape[0]))
```

# 12 評価値集合の部分集合
```
i = 2
j = 5
print('ru{}からru{}までの評価値 = {}'.format(i, j-1, ru[i:j]))
```

# 13 評価値集合の要素の逆順
```
print('ruの逆順 = {}'.format(ru[::-1]))
```

# 14 アイテムiに対する評価値
```
i = 0
print('ru{} = {}'.format(i, ru[i]))
```

# 15 ユーザuが未評価であるか否かの判定
```
print('ユーザuが未評価 = {}'.format(numpy.isnan(ru)))
```

# 16 ユーザが評価済みであるか否かの判定
```
print('ユーザuが評価済み = {}'.format(~numpy.isnan(ru)))
```

# 17 ユーザuが評価済みのアイテム集合
```
Iu = I[~numpy.isnan(ru)]
print('Iu = {}'.format(Iu))
```

# 18 ユーザuが「好き」と評価したアイテム集合
```
Iup = I[ru == 1]
print('Iu+ = {}'.format(Iup))
```

# 19 ユーザuが「嫌い」と評価したアイテム集合
```
Iun = I[ru == -1]
print('Iu- = {}'.format(Iun))
```

# 20 ユーザuが未評価のアイテム集合
```
Iu_not = I[numpy.isnan(ru)]
print('Iu_not = {}'.format(Iu_not))
```

# 21 訓練データ
```
DuL = Du[Iu]
print('DuL = \n{}'.format(DuL))
```

# 22 訓練事例数
```
print('|DuL| = {}'.format(DuL.shape[0]))
```

# 23 正事例数
```
print('|DuL+| = {}'.format(DuL[DuL[:,2]==1].shape[0]))
```

# 24 負事例数
```
print('|DuL-| = {}'.format(DuL[DuL[:,2]==-1].shape[0]))
```

# 25 予測対象データ
```
DuU = Du[Iu_not]
print('DuU = \n{}'.format(DuU))
```

# 26 予測対象事例数
```
print('|DuU| = {}'.format(DuU.shape[0]))
```

# おわりに
次回は２章できたらと思っています。
Rocky Linux 使ってみた

Centos8に変わるOSでRocky Linuxを使っていくことになりそうなので今のうちに試しておく

結論CentOS8あまりにいじったことはなかったが、CentOS7に使い慣れてればまぁ困らなそう,あと全く関係ないところで詰まったことを忘れないように記事に残しておきます

# 開発環境
``` 
macOS Monterey 12.2.1
VirtualBox 6.1
Vagrant 2.2.19
```

面倒なのでVagrant Cloudに乗せてもらってるソースをそのまま利用
Vagrantfile
```
Vagrant.configure("2") do |config|
  config.vm.box = "generic/rocky8"
  config.vm.network "public_network", ip: "192.168.0.17"
end
```

vagrant up
vagrant ssh

# とりあえずnginxを入れてみる

```
sudo yum install nginx
sudo systemctl status nginx
```

# ブラウザ確認するところでめっちゃはまった、、
結論
firewalldが悪さをしてた

```
systemctl status firewalld
sudo systemctl stop firewalld
systemctl status firewalld
sudo systemctl disable firewalld

reboot
```

![スクリーンショット 2022-04-03 9.40.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307994/e8d0444e-6cba-e6aa-ecc9-18570041589a.png)
無事に見えたー
ちゃんとon Rocky Linuxと出るんですね

# memo
mac環境でネットワーク周りでどうデバックしたらいいのかつまったので残しておく

ターミナルを開いてping
```
bash-3.2$ ping 192.168.0.17
PING 192.168.0.17 (192.168.0.17): 56 data bytes
64 bytes from 192.168.0.17: icmp_seq=0 ttl=64 time=0.545 ms
64 bytes from 192.168.0.17: icmp_seq=1 ttl=64 time=0.568 ms
```
これは届く

curl
```
bash-3.2$ curl -I http://192.168.0.17
curl: (7) Failed to connect to 192.168.0.17 port 80: Connection refused
```
届いてそうだけど変なところにいってないか念の為tcpdumpで確認

```
yum install tcpdump
tcpdump -i eth1
```
パケットは来ていた
/var/log/nginx/access_log にはログ無し

よってnginxの手前でアクセス拒否されてるということがわかりfirewallにたどり着く
dockerでローカル環境に静的サイトのテスト環境をつくる

# やること


dockerでnginxコンテナ使ってローカルサーバー立てて静的サイトのテスト環境を作ります


# 説明


html/CSSのテストをするだけならローカルフォルダに置いてブラウザで開けば良いんですが、JavaScriptからファイルを読んで何かするようなサイトはローカルにファイルを置いてあると動きません。これはサイト運営側やサイトを乗っ取った攻撃者がJavaScriptを使ってユーザーPCのローカルファイルを盗み取るのに使えないようにブラウザが設計されているからですが、動かないと開発出来ないのでちょっと困ります。

対処方法としてブラウザの設定をいじってローカルファイルを読むようにするというのも紹介されていますが、これだと開発PCでうっかり攻撃サイトを踏んだらローカルファイルを盗まれ放題なので、やはりサーバーを立ててるのが良いと思います。

ローカルにサーバーを立てる方法はたくさんありますが、ここではdockerを使ってnginxサーバーを立ててみたいと思います。


# 1. コンテナの準備


nginxコンテナをdocker hubからダウンロードして起動します
8080番ポートにサーバーを待機します


```terminal:terminal
docker run --name hogehoge -d -p 8080:80 nginx
```


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277233/a815574c-85ab-df06-e75d-ee015f367744.png" width=50%>


ちゃんと動いているようです

ポートに待機させておくと後で邪魔になるのでコンテナを終了しておきます

```terminal:terminal
docker stop hogehoge
```


# 2. 自作のhtmlファイルを表示する


適当なhtmlファイルをつくります。置き場所はどこでも大丈夫です。


```html:/home/html/index.html
<!DOCTYPE html>

<html>
<body>

<h1>hugahuga</h1>
<p>husahusa</p>

</body>
</html>
```


-vオプションでローカルフォルダをバインドマウントして、それをnginxが表示するようにしてやります。先程と同じnginxイメージを使いますが、バインドマウントしたコンテナを新たに作ってやります。


```terminal:terminal
docker run --name fugafuga -v /home/html/:/usr/share/nginx/html:ro -d -p 8080:80  nginx
```


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277233/79714b05-831d-1027-5cda-6b9d81682fad.png" width=50%>

このやり方でやればコンテナ起動時にフォルダを指定するだけで手元の任意のフォルダのhtmlファイルを表示することができて便利です。マウントされた結果、どういうフォルダ構造になっているか調べたいときは以下でbashを開いて確認することが出来ます。


```terminal
docker exec -it fugafuga bash
```
[Kotlin]JetpackComposeで引数にComposableを指定するサンプル

# 概要
＠Composableの引数に＠Composableを指定するサンプルです。

# 本文

```kotlin
@Composable
fun Main() {
    Sub(
        description = { Description() }
    )
}

@Composable
fun Sub(
    description: @Composable () -> Unit,
) {
    Column() {
        Text(text = "タイトル")
        description()
    }
}

@Composable
fun Description() {
    Text(text = "内容")
}
```

![スクリーンショット 2022-04-03 8.45.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/4ae39868-5e66-edc0-f4bf-dd0e2e6d00d2.png)
AtCoder Beginner Contest 246　A~C　3完記事

アルゴリズムの学習改善のための自身の備忘録及び学習の一環として記事を書くことにしました.
読んでくれた方で何かありましたら気兼ねなくコメントしてください.お待ちしております.

# [A - Four Points](https://atcoder.jp/contests/abc246/tasks/abc246_a)

## 問題文　概要
長方形の$3$点が与えられる.残りの$1$点はなにか.

## 制約と入力
制約
>$-100 \leq x_i,y_i \leq 100$
>$(x_1,y_1),(x_2,y_2),(x_3,y_3)$のすべてを頂点に持つ長方形がただ一つ存在し,その各辺は$x$軸または$y$軸に平行であり,面積は$0$ではない
>入力は全て整数である

入力
>入力は以下の形式で標準入力から与えられる。
>$Ax_1 \ \ y_1$
>$Ax_2 \ \ y_2$
>$Ax_3 \ \ y_3$

## 考察
$x_1,x_2,x_3$の排他的論理和を求めると,対にならないただ一つが決まる.
同様に,$y_1,y_2,y_3$の排他的論理和を求める.
排他的論理和は$x_1 \oplus x_1=0$になることに注意したい.
これが答えになる.

## サンプルコード
```python:a.py
x1,y1=map(int,input().split())
x2,y2=map(int,input().split())
x3,y3=map(int,input().split())
print(x1^x2^x3,y1^y2^y3)
```

# [B - Get Closer](https://atcoder.jp/contests/abc246/tasks/abc246_b)

## 問題文　概要
座標平面上の原点から$A,B$に線分を引く.原点からの距離が$1$となる座標はなにか.

## 制約と入力
制約
>$0 \leq A,B \leq 1000$
>$(A,B) \neq (0,0)$
>入力は全て整数である

入力
>入力は以下の形式で標準入力から与えられる。
>$A \ \ B$

## 考察
ベクトルの正規化をすればよい.
大きさで割れば答えが求まる.


## サンプルコード
```python:b.py
import math
A,B=map(int,input().split())
norm=math.sqrt(A**2+B**2)
print(A/norm,B/norm)
```

# [C - Coupon](https://atcoder.jp/contests/abc246/tasks/abc246_c)
## 問題文　概要
クーポンを使ってできるだけ安く買い占めたい.
商品は$N$個あり,$1$枚当たり$X$円やすくなる.
商品に$A=A_1,A_2,\dots,A_i,\dots,A_N$と識別番号を割り当てる.
$K$枚のクーポン券があり,$a$円の商品に$k$枚のクーポンを使った値段は$\max(a-kX,0)$円である.



## 制約と入力
制約
>$1 \leq N \leq 2\times 10^5$
>$0 \leq K,X \leq 10^9$
>$1\leq A_i \leq 10^9$
>入力は全て整数である

入力
>入力は以下の形式で標準入力から与えられる。
>$N \\ K \\ X$
>$A_1 \\ A_2 \\ \dots \ \ A_N $

## 考察
安く買うを言い換えると割引額を大きくするとなる.
クーポン$1$枚当たり$X$円まで割引がある.
$0 \leq i \leq N $の各$A_i$が$X$円未満になるまでクーポンの枚数分割引を行う.
この時、途中でクーポン券がなくなった場合は割引を終了する.
$A_N$まで割引を続け,クーポン券が余っている時は,$A$の大きいものからクーポンの枚数分割引を行える.
クーポンは過剰となってもよい.


## サンプルコード
```python:c.py
N,K,X=map(int,input().split())
A=list(map(int,input().split()))
for i in range(N):
    if A[i]>X:
        cnt=A[i]//X
        if cnt>K:
            cnt=K
        A[i]-=cnt*X
        K-=cnt
A.sort()
A.reverse()
for i in range(min(len(A),K)):
    A[i]=0
print(sum(A))
```
Kintone クエリを使った情報の取得　フィールドタイプ＞ドロップダウン

前に利用したクエリと同じようにクエリを作ったのにエラーがでたのはこれ
```
var paramQuery = "&query=" + encodeURIComponent("選択=\"移動端末\"");
```
エラーメッセージは
```
Exception: https://=~=~=~=~=~=~=.cybozu.com のリクエストに失敗しました（エラー: 520）。
エラーメッセージは
 {"message":"選択フィールドのフィールドタイプには演算子=を使用できません。"}

```
選択のフィールドはドロップボックスだったのが原因か・・・
じゃあ、どうすれば

ドロップダウンイールドは「＝」ではなく「in」を使用するらしい。

[レコードの取得（GET）](https://developer.cybozu.io/hc/ja/articles/202331474-%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E5%8F%96%E5%BE%97-GET-#step2)



```
var paramQuery = "&query=" + encodeURIComponent("選択 in (\"移動端末\")");
```

これでどうだ？！
↓
できた！！
受験談 AWS Certified Database - Specialty 認定

AWS Certified Database - Specialtyを受験しました。

受験される方の参考になりましたら。

# 前提
2021年
8月：SAA [(受験談)](https://qiita.com/h2m_kinoko/items/5179bcb73b6773771f79 "受験談 AWS Certified Solutions Architect – Associate 認定")
9月：SAP
11月：SOA [(受験談)](https://qiita.com/h2m_kinoko/items/0b05378d96f4246bbdd0 "受験談 AWS Certified SysOps Administrator - Associate 認定")
12月：SCS [(受験談)](https://qiita.com/h2m_kinoko/items/20f06a746ab15540cd37 "受験談 AWS Certified Security – Specialty 認定")
2022年
1月：DVA[(受験談)](https://qiita.com/h2m_kinoko/items/67ec0a97039570524574 "受験談 AWS Certified Developer - Associate 認定")
2月：MLS[(受験談)](https://qiita.com/h2m_kinoko/items/1f6028f302c879293870 "受験談 AWS Certified Machine Learning - Specialty 認定")
3月：ANS[(受験談)](https://qiita.com/h2m_kinoko/items/a89164b4bff097df1121)
4月：DBS(←今回ココ)

[SAA受験談](https://qiita.com/h2m_kinoko/items/5179bcb73b6773771f79)に私のAWSの事前知識・経験が書いてありますが、業務等での経験はほぼゼロです。

# これまでの認定試験と比較して

特に大きな違いは感じなかったです。
データベース周りのサービスがメインで出題されてましたが、セキュリティ関係の設問もいくつかありました。
KMS、Secrets Managerはあらためて押さえておくと良いと思います。

#### 書籍やkoiwa clubなどの類似問題

65問中、1、２割程度だった印象です。
比較的初見の問題が多くちょっと戸惑いました。

#### １問あたりの問題にかかる時間

MSLは明らかに短文問題が多く、SAPは長文問題が多く、というように認定試験ごとに問題文には長短があります。
そういう意味では、DBSは長文が多いなという印象はありません。比較的短文問題も多いので時間的には余裕を持てた気がします。
実際の試験でも100分ほどで一度一周し、あとは飛ばした問題を再度確認する時間に充て、残り40分程を残して退出した感じです。


# 活用したもの

#### 公式サンプル問題

10問ではありますが、雰囲気や難易度をつかむには十分かなと思います。

https://d1.awsstatic.com/ja_JP/training-and-certification/docs-database-specialty/AWS-Certified-Database-Specialty_Sample-Questions.pdf

#### AWS BenchPrep認定試験練習

無料で模擬問題が20問受けられるので活用しないと損です。

https://amazonwebservices.benchprep.com/

|回数|正解率|
|:--|:--:|
|1回目（koiwa-club一周後）|40%|
|2回目(書籍一読後)|80%|
|3回目(同二周後)|90%|

#### koiwaclub

全14節。１節７問なので合計98問。ひたすら繰り返しました。
DBSの問題は少ないので、色々な問題に触れるという点では少々不安でしたが、あまり多過ぎても気持ち的に持たないのでこれくらいでちょうど良かったです笑

https://aws.koiwaclub.com/

#### Udemy

今回は活用しませんでした。
日本語版がなかったので・・・

#### 書籍

唯一の試験本でしょうか。
DocumentDBやQLDBなど、一通り登場するであろうサービスについて触れられていましたので全体を把握する意味でもとても参考になりました。
あとは巻末の６５問の模擬問題です。

https://www.amazon.co.jp/%E8%A6%81%E7%82%B9%E6%95%B4%E7%90%86%E3%81%8B%E3%82%89%E6%94%BB%E7%95%A5%E3%81%99%E3%82%8B%E3%80%8EAWS%E8%AA%8D%E5%AE%9A-%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9-%E5%B0%82%E9%96%80%E7%9F%A5%E8%AD%98%E3%80%8F-Compass-Books%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-NRI%E3%83%8D%E3%83%83%E3%83%88%E3%82%B3%E3%83%A0%E6%A0%AA%E5%BC%8F%E4%BC%9A%E7%A4%BE-ebook/dp/B0936PSMXT

#### Googleスプレッドシート

チートシートです。SAA受験の時から作っているのでだいぶボリューム満載になってきています笑

# 実際の試験

やはりRDS,Aurora,DynamoDB,Redshiftあたりが中心で、付随するセキュリティ面やバックアップ・復元・レプリカ関係だと思います。この辺りは確実に押さえておいた方が良いなと思いました。
試験でも消去法で残り2つまでは絞れたけど、どっちだろう？というのが結構多かったです。正直自信ないまま回答した問題が多かったので、合格できるかどうかは感覚的には微妙でした。。

# まとめ

なんやかんやでここまできたので、あと3つ・・頑張るかどうか。。
DatabricksでBokehを使う

[Bokeh \| Databricks on AWS](https://docs.databricks.com/notebooks/visualizations/bokeh.html) [2020/7/14時点]の翻訳です。

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


[Bokeh](https://docs.bokeh.org/en/latest/)は、Pythonのインタラクティブなビジュアライゼーションのライブラリです。

Bokehを使用するには、[ライブラリ](https://qiita.com/taka_yayoi/items/d3a46efdc1ad01a581d0)UIからBokeh PyPIパッケージをインストールし、クラスターにアタッチします。

:::note info
**訳者注**
- Databricksには簡単にグラフを表示する機能がビルトインされています。詳細は[Databricksにおけるデータの可視化](https://qiita.com/taka_yayoi/items/36a307e79e9433121c38)を参照ください。
- Databricks上でクイックにBokeh試す場合には、`%pip install bokeh`を実行してノートブックスコープライブラリとしてBokehをインストールすることもできます。
:::

BokehのプロットをDatabricksで表示するには以下の手順を踏みます。

1. [Bokeh documentation](https://docs.bokeh.org/en/latest/docs/user_guide/quickstart.html)の指示に従ってプロットを生成します。
1. 例えば、Bokehの`file_html()`や`output_file()`関数を用いて、プロットのデータを含むHTMLファイルを生成します。
1. HTMLをDatabricksの`displayHTML()`関数に渡します。

:::note warn
**重要！**
コンテンツと出力の両方を含むノートブックのセルの最大サイズは16MBです。`displayHTML()`関数に渡すHTMLのサイズが、この値を超えないようにしてください。
:::

サンプルは以下のノートブックをご覧ください。

# bokehデモノートブック

https://docs.databricks.com/_static/notebooks/bokeh-demo.html

以下のコードを実行します。

```py:Python
from bokeh.plotting import figure
from bokeh.embed import components, file_html
from bokeh.resources import CDN

# データの準備
x = [1, 2, 3, 4, 5]
y = [6, 7, 2, 4, 5]

# タイトルと軸ラベルを持つ新規プロットの作成
p = figure(title="シンプルな折れ線グラフのサンプル", x_axis_label='x', y_axis_label='y')

# 凡例と線の太さを設定したラインレンダラーの追加
p.line(x, y, legend_label="温度", line_width=2)

# Bokehプロットを埋め込むHTMLドキュメントの作成
html = file_html(p, CDN, "my plot1")

# HTMLの表示
displayHTML(html)
```

プロットが表示されます。
![Screen Shot 2022-04-03 at 8.06.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/86208683-f9d2-b745-8a74-ccad74342bf2.png)



### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)
IBM Cloudの新マスタリー試験IBM Cloud for Financial Services v1 Specialtyを受けてみた

# IBM Cloud for Financial Services v1 Specialtyとは

IBMのマスタリー試験（特定製品スペシャリストの適格認定試験）の1つです。主にIBM Cloud for Financial Servicesという、金融機関等の厳しいレギュレーションに対応したIBM Cloudサービスの専門性を認定する試験です。

<img width="160" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241424/c1648948-239a-7c9c-cf76-7b63b8491cb1.png">

認定資格および試験の概要はこちら。

> https://www.ibm.com/training/certification/S0010500

# 学習方法

難易度はかなり「低め」です。肝を抑えていれば簡単でした。一応学習パスは公開されています。

> https://www.ibm.com/training/path/ibmcloudforfinancialservices

# 受験方法

PearsonVUE社のサイトで予約して受験してください。

https://www.pearsonvue.co.jp/Clients/IBM.aspx

以前は最寄りのテストセンターでしか受験できなかったのですが、最近はカメラ付きPCがあれば自宅でも受験可能になりました。こういうご時世ですので、可能であれば自宅での受験をお勧めします。ただし部屋の片づけはきちんとしておいてください。

# 合格点

44問中30問以上の正解で合格です。正答率は68%です。

# 出題内容

試験規約により具体的な問題文は書けませんので、雰囲気になりますが、いくつか問われそうな箇所を書きます。

* SCC (Security and Compliance Center)の役割、構成
* Financial Services検証済サービスの種類、特徴
* Hyper Protect Crypto Servicesの仕組み、役割

# 感想

先ほど肝を抑えれば簡単と書きましたが、IBM Cloud for Financial Servicesとは、技術的にはHyper Protect Crypto Servicesを使ってセキュアにしたIBM Cloudサービス集に加え、SCCによる業界標準レギュレーションへの監査機能のことです（間違って理解していたらすみません）。そのため、IBM CloudのArchitect資格を持っているような人であれば、少しHyper Protect Crypto ServicesやSCCを調べれば、十分合格できるレベルになると思います。
[ABC246 D] 2-variable Function ざっくり解説

# 初めに

公式と若干説明が違いそうなので書いておく。 趣旨としてはよくわかんなったらエクセル使って視覚的にみてみるのもいいよ、ということで。
あまり数学的な整理はしないので、正確な理解は別の説明に譲る。

解説的に色弱の方にはわかりづらい内容かもしれないのでそこは申し訳ないです。（グレースケールで描いたらなんか錯視的に直観とずれたので、色付きのままです。）

# 問題
https://atcoder.jp/contests/abc246/tasks/abc246_d

# 当時の分析

因数分解し始めて時間を食ったのち、とりあえずエクセルで横軸a,縦軸bで実際に描写して値がどう変化するかを観察してみる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2522928/8e148f07-efec-3e99-5ace-50aa12130298.png)

これを眺めながら、

- Nとして特定の色を指定されて、どれだけ近い色を見つけられるか、という問題ともいえる。
- 色の変化は左上を中心とした同心円状に変化しているように見える。

という訳で、例えば薄めのオレンジ色を探す問題せっていなら、なんとなく下記図の3角形にありそう。だし、視覚的にも薄めのオレンジは三角の中に入ってそう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2522928/ab58364c-730d-0565-0321-4c1cd226fea1.png)

従い、まず対角線で該当色近辺の色が出始める場所を探し、そのあと右にずらしながら該当色に近いものを探してく。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2522928/a94d7b82-d1e3-3aaa-cc74-b58c3a36a896.png)

1. 言い換えると、a==bとして、N<f(a,a)となるaを探す。
1. aを増やしつつ、b=[0,a]の範囲でNになるべく近くなるbを探して、よりベターなら更新する。

条件的にa^3<=10^18で、10^6の規模でできそう。

私の場合は2分探索で実装したが、前述の3角形の範囲にありそう=f(i,j)<f(i+1,i-1)なことを考えれば尺取りっぽくも行けそう。


# コード

```python
N = int(input())

def calc(a, b):
    return a**3 + a**2 * b + a * b**2 + b**3

#1　対角線操作
for ab in range(10**6 + 1):
    if N <= 4 * ab**3:
        break

#2 同色探索
ret = 4 * ab**3
for a in range(ab, 2 * ab + 1):

    l = -1
    r = a + 1
    m = (l + r) // 2
    while l < m:
        t = calc(a, m)
        if t < N:
            l = m
        else:
            r = m
        m = (l + r) // 2
    ret = min(ret, calc(a, r))

    if m == -1:
        break

print(ret)
```

# 2022/4/4追記

公式に貼ってある解説を眺めながらそもそもあんまり意味がないことしているよね、というのに気付いたので追記する。

## 改めて考察

別に対角線を探索する行為(①）は不要で、最初から②だけやっておいても計算量的には十分間に合う。
下記みたいな感じ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2522928/fc18e002-4d1e-9c13-f3fd-b3eb48b818a7.png)

## 別解検討

### エクセル図再訪

せっかくなので2枚目の図の3角形を活用したい。眺めていると薄いオレンジ色は右上方向に存在していることがわかる。

とすると、bの全範囲を二分探索で探す必要はなくて、aを増やす→N<f()になるまでbを減らす→...を繰り返していけばいい。以下みたいな感じ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2522928/73cd97e0-5eb7-34ea-5098-5b80db3f52e1.png)

計算量について考えてみると、

b^3<=a^3<N<10^18 -> b<=a<10^6

を踏まえ、二分探索をする対角線走査の有無にかかわらずO(aloga)になる。一方で、新解法だとO(a)で済む。

### コード

```Python
N = int(input())


def calc(a, b):
    return a**3 + a**2 * b + a * b**2 + b**3


ret = 0
for a in range(10**6 + 1):
    ret = calc(a, a)
    if N <= ret:
        break

b = a
while a <= 10**6 + 1:
    while b >= 0:
        r = calc(a, b)
        if N <= r:
            ret = min(ret, r)
        else:
            break
        b -= 1
    a += 1

print(ret)

```
cscの作法 その92

# 概要
cscの作法、調べてみた。
練習問題やってみた。

# 練習問題

もぐら叩きを作れ。

# 方針

- pictureboxとtimer使う
- 一秒毎に動かす。
- 一匹叩くと消える、一点追加
- １０秒でタイムアップ


# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/8da84214-b771-fbe3-fecd-4d1121ae5c4b.png)


# サンプルコード

```

using System;
using System.Drawing;
using System.Windows.Forms;

namespace App
{
	public partial class Form1 : Form {
		Random r = new Random();
		int k = 0;
		int j = 0;
		int ten = 0;
		PictureBox pictureBox1;
		public Form1() {
			Text = "mogura";
			ClientSize = new Size(450, 450);
			pictureBox1 = new PictureBox();
			pictureBox1.Width = 100;
			pictureBox1.Height = 100;
			pictureBox1.Left = 200;
			pictureBox1.Top = 200;
			pictureBox1.Image = Image.FromFile("sakana.png");
			Controls.Add(pictureBox1);
			pictureBox1.Click += pictureBox1_Click;
			Timer timer = new Timer();
			timer.Interval = 1000; 
			timer.Tick += new EventHandler(timerTick);
			timer.Start();
		}
		void timerTick(object sender, EventArgs e) {
			if (j == 0 && k > 9)
			{
				j = 1;
				MessageBox.Show("おしい！" + ten + "点");
			}
			if (j == 0)
			{
				k = k + 1;
				pictureBox1.Left = r.Next(300);
				pictureBox1.Top = r.Next(300);
				pictureBox1.Visible = true;
			}
		}
		void pictureBox1_Click(object sender, System.EventArgs e) {
			ten = ten + 1;
			//Console.WriteLine("ok0");
			//Console.Beep(262, 300);
			pictureBox1.Visible = false;
		}
		[STAThread]
		static void Main(string[] args) {
			Application.Run(new Form1());
		}
	}
}







```

以上。
pastelコマンド 覚え書き

[GitHub - sharkdp/pastel](https://github.com/sharkdp/pastel)
さまざまな形式の色をプレビューしたり別の形式に変換したりと、色に関することはわりとなんでもできるコマンド  
すごく多機能なんだけど、その割にあまり頻繁に使うものでもないので使い方を忘れやすい  
有効な色表記は[readmeの該当セクション](https://github.com/sharkdp/pastel#specifying-colors)を参照  
また、詳しいところはサブコマンドごとのヘルプ`--help`を参照  

注：スクショはありません  

## `list` - 有効な色名を一覧表示
使用可能なカラーネームの一覧をばーっと表示してくれる
```
pastel list
```

## `color` - 任意の色の情報を表示（プレビュー＆他フォーマットでの表記などを表示）
`"rgb(255, 255, 255)"`だとか`"hsl(100, 100%, 100%)"`などの値も有効だがいちいち引用符で囲う必要があるため、コマンドラインからだと16進のが使いやすい  
ただ、bashとかだと`#`始まりのはコメントになる気がするので、それらは適宜クォートするかハッシュを除いた形式に置き換える必要がありそう  
表示例は[readme](https://github.com/sharkdp/pastel)冒頭のgifを参照  
```
pastel color #93c068
```

## `format` - 任意の色を別形式にフォーマット
フォーマット後の形式がその色を背景色として出力される  
結構いろんな形式に対応してるらしい（`format --help`のpossible valuesを参照）  
```
pastel format hex black
```

## `random` - ランダムな色を表示
```
pastel random
```

別形式にフォーマットしてコンパクトに  
デフォルトではhex（16進数）に変換されるが、rgbやhslなども有効  
```
pastel random | pastel format
```

## `paint` - 任意の色で文字列を出力
ANSIエスケープシーケンスを使った出力を気軽に試せるやつっぽい  
例えば以下のようにすれば、緑色のテキストを出力できる（先述の通り色指定時の`#`は省略している）  
また、本来冒頭や末尾にスペースを含めない限りクォートは不要のようだが、出力もされないのでわかりやすさのために記述している  
```
pastel paint 00fa9a "green text"
```

また、`-o`(`--on`)で背景色を指定できる  
```
pastel paint black  -o 00fa9a "black text on green background"
```

装飾付きの出力も可能で、それぞれ`-b`(`--bold`), `-i`(`--italic`), `-u`(`--underline`)というふうになる（ただし、私環境のcmdだと下線のみで斜体と太字は反映されない...）  
また、`-n`(`--no-newline`)というオプションもある  
以下は下線の例  
```
pastel paint 00fa9a -u "underlined green text"
```

色や装飾ごとファイルに保存したい場合、普通にリダイレクトするだけじゃエスケープシーケンスが失われてしまうので`-f`(`--force-color`)オプションを使う  
なお、`pastel subcommand --help`ではなく`pastel --help`で出てくるオプションは、サブコマンドの前につける必要があるっぽい  
```
pastel -f paint 00fa9a "green text" > colored.txt
type colored.txt # カラー出力される
```

（Windowsにおける）`type`コマンドはANSIエスケープシーケンスの解釈に対応してるようなので、このようにすると色を付けて表示してくれる  
装飾にも対応してた（原理的には同じなのでそりゃそうか）  
`more`コマンドは対応していないようなので、cmd上だとエスケープシーケンスがパースされずそのまま出力されてしまうみたい（Alacritty上ならAlacrittyくん側で勝手に色付けしてくれますが）  

あと、Windows上だとMeryってエディタが`[ESC]`（こんなふうに表示される）含めた制御文字の表示にも対応してるっぽいので便利かもしれません（VSCodeとかでもいけそうだけど）  

...他にももっといろいろとサブコマンドがあるのですが、（色混ぜたりソートしたり明度いじったりhueいじったりグレスケにしたり補色求めたり）今のところ自分が使うのはこの辺ぐらいだと思うのでこのぐらいにしときます  
詳しくはreadeのデモとかヘルプメッセージを見てください（投げやり）
cscの作法 その91

# 概要
cscの作法、調べてみた。
DllImport使ってみた。

# 参考にしたページ

https://qiita.com/santarou6/items/cfb497a858ed5314be46

# コンパイル手順

```
>set PATH=C:\Windows\Microsoft.NET\Framework\v4.0.30319;%PATH%

>csc kansi.cs

```

# 実行結果

```

cmd.exe_コマンドプロンプト-kansi
cmd.exe_コマンドプロンプト-kansi
cmd.exe_コマンドプロンプト-kansi
cmd.exe_コマンドプロンプト-kansi
cmd.exe_コマンドプロンプト-kansi
cmd.exe_コマンドプロンプト-kansi
cmd.exe_コマンドプロンプト-kansi
cmd.exe_コマンドプロンプト-kansi
cmd.exe_コマンドプロンプト-kansi
cmd.exe_コマンドプロンプト-kansi
```

以上。
Google DriveのAPIをサービスアカウント認証方式でNode.jsから利用するメモ


前回書いた記事で調べていて、サービスアカウントを利用する方式も試してみたので記録しておきます。

> [Google DriveのAPIをNode.jsで触る ~ @google-cloud/local-authのサンプル版](https://qiita.com/n0bisuke/items/fbf920cdd7ed99b2fc8c)

## 前提など

- https://console.cloud.google.com にアクセスできる
- Google DriveのAPIをONにしている。

> ![](https://i.gyazo.com/0f53c4422a117c9ef0b021b99077b937.png)

### 環境

- Node.js v17系
- google-api-nodejs-client(googleapis) v100
	- https://github.com/googleapis/google-api-nodejs-client

## 1. サービスアカウント利用の準備

こちらの記事が分かりやすかったです。

> 参考: [NodeでGoogle Drive, Cloud Storage, Gmailを使ったアプリ開発（主に認証)](https://qiita.com/plsplsme/items/0d1bc2041ddcc438b54e)

### 1-1. サービスアカウントの作成

`APIとサービス`のメニューから認証情報を作成 -> サービスアカウントと進みます。

> ![](https://i.gyazo.com/e7c09689a40ea16448b8ce63a4e76bd3.png)


サービスアカウントの名前を入れて完了で進みます。

> ![](https://i.gyazo.com/9b258e0d2bdec1588313fdc26dde5cd6.png)

サービスアカウントが作成されました。メールアドレスが発行されます。

> ![](https://i.gyazo.com/66634c1abe1133170e3165b11baeb021.png)

作成したサービスアカウントに権限を付与します。新しいプリンシパルの部分に先ほど発行されたメールアドレスを指定しましょう。ロールは`プロジェクト =>  オーナー`にして保存します。

> ![](https://i.gyazo.com/b849cff30fe739c97208cfee6336de20.png)

### 1-2. キーの発行

> ![スクリーンショット 2022-04-03 5.37.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/d9cd3f75-2895-a6ae-908c-fdb395d7b360.png "スクリーンショット 2022-04-03 5.37.35.png")

サービスアカウントのキーを発行します。

JSON形式で保存します。

`credentials.json`という名前にして保存するとサンプルを試しやすいです。

### 1-3. 利用するGoogle Driveのフォルダにサービスアカウントの権限を付与

サービスアカウントを編集者にしてGoogle Driveに追加します。

> ![](https://i.gyazo.com/34dad0d08e5e9e004c7887082eb45532.png)


## 2. サービスアカウントのキーで認証

ライブラリをインストールします。

```bash
npm i googleapis@100
```

こちらのドキュメントを参考にサービスアカウント利用のコードに修正してみました。

> https://github.com/googleapis/google-api-nodejs-client#service-account-credentials

以下のようなコードになりました。

```js
'use strict';

const path = require('path');
const {google} = require('googleapis');

async function runSample(query) {

  const auth = new google.auth.GoogleAuth({
    keyFile: path.join(__dirname, './.private/credentials.json'),
    scopes: ['https://www.googleapis.com/auth/drive.metadata.readonly'],
  });

  const drive = google.drive({version: 'v3', auth: auth});
  
  const params = {pageSize: 3};
  params.q = query;
  const res = await drive.files.list(params);
  console.log(res.data);
  return res.data;
}

if (module === require.main) {
  runSample().catch(console.error);
}
module.exports = runSample;
```

実行すると見事にファイルリストが取得できました。

```bash
$ node app.js
{
  kind: 'drive#fileList',
  nextPageToken: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
  incompleteSearch: false,
  files: [
    {
      kind: 'drive#file',
      id: '1QBZPkNxxxxxxxxxxxxxxxxxxxx'

省略   
```

特にリダイレクトURLなど無しで利用できました。

前回（[Google DriveのAPIをNode.jsで触る ~ @google-cloud/local-authのサンプル版](https://qiita.com/n0bisuke/items/fbf920cdd7ed99b2fc8c))のサンプルだと毎回認証が発生して少し手間でしたが、こちらの方式だと手間が少なそうです。
【Python × FastAPI × Heroku】Procfile はこう書け！

# 目的
fastAPI と Heroku を使用した場合の Procfile についての注意点を示すこと


# OK
```Procfile
web: uvicorn timelabAPI:app --host=0.0.0.0 --port=${PORT:-5000}
```
IPアドレスを 0.0.0.0 にしておく！
Heroku 上で動かすときに、外部から呼び出し可能になる。


# NG
```Procfile
web: uvicorn timelabAPI:app
```

IPアドレスが 127.0.0.1 となる。
これでは、Herokuのローカル 上でしか動かない。
外部から呼び出せない。
2022/4/3主にITとかセキュリティの記事

子会社機器に脆弱性　サイバー攻撃被害の小島プレス(4/1)
https://www.chunichi.co.jp/article/445050?rct=national

子会社機器から侵入　トヨタ系のサイバー攻撃(3/31)
https://www.sankei.com/article/20220331-NV4LC5OFDFIUNILY3GXQ6NATQY/

IPA、中小企業におけるセキュリティ対策の実態調査報告書を公開、5年間で対策の改善はわずか(4/1)
https://cloud.watch.impress.co.jp/docs/news/1399461.html

IPA、Webサイト運営者向けにセキュリティに関する窓口設置を推奨する資料を公開(4/1)
https://s.netsecurity.ne.jp/article/2022/04/01/47391.html

いま気にするべきはスマホのセキュリティ(4/1)
https://ascii.jp/elem/000/004/087/4087510/?rss

【重要】迷惑メール（なりすましメール）に関するお詫びと注意喚起(3/30)
https://www.maruo-cal.co.jp/html/info_20220330.html

パスワードを使いまわす人は4～5割、自分で記憶や紙にメモが2トップ(4/1)
https://s.netsecurity.ne.jp/article/2022/04/01/47390.html

ランサムウェア攻撃者に広がる“人間不信”　原因は懸賞金と「いいね」依存症？(4/1)
https://techtarget.itmedia.co.jp/tt/spv/2204/01/news03.html

東京都の中小企業向け、サイバー攻撃特別相談窓口開設 電話で受付(4/1)
https://s.netsecurity.ne.jp/article/2022/04/01/47389.html

「GビズID」利用者の個人情報の漏えいについて(3/31)
https://www.e-gov.go.jp/news/2022-03-31t1322240900_752.html

「マイナカードに知らない人の情報」と市に連絡…更新で職員が“直後に訪れた人”の個人情報記録 住所氏名等(3/31)
https://www.tokai-tv.com/tokainews/article_20220331_17368

e-Gov電子申請サービスのアクセス集中、利用日時の分散への協力を依頼(4/1)
https://s.netsecurity.ne.jp/article/2022/04/01/47393.html

電子決済アプリ不正利用、容疑の中国人ら逮捕　警視庁(3/31)
https://www.nikkei.com/article/DGXZQOUE311790R30C22A3000000/

IT用語、ドメインとは？｜ 独自ドメインとサブドメインの違いやメリットを解説【インターネット基本のき】(3/31)
https://serai.jp/living/1059740

Visaの「取引情報をマーケティングに使用されないようにするための設定ページ」が1週間以上ダウン中(3/31)
https://gigazine.net/news/20220331-visa-marketing-opt-out-down/

2021年度 セキュリティ製品の有効性検証の試行について(3/31)
https://www.ipa.go.jp/security/economics/shikoukekka2022.html

ゼロパーティデータ 、なぜいま バズワード となったのか？： Cookie 終焉を目前にブランドや小売業者の利用が加速(4/1)
https://digiday.jp/modern-retail/unpacked-why-zero-party-data-became-the-brand-and-retailer-marketer-buzzwor/

「カプセルホテルのIoTをハッキング」…その後の対策は？ 現地調査してみた(4/1)
https://ascii.jp/elem/000/004/085/4085737/?rss

「ふるさと納税」かたる”詐欺サイト”　福山市「悪質と判断し警察に相談」(3/30)
https://www.fnn.jp/articles/-/339887

Windows 11ではIPアドレスの設定方法が変更になりました(3/31)
https://atmarkit.itmedia.co.jp/ait/spv/2203/31/news038.html

デジタル庁、宛先ミスでメール誤送信　「再発防止に努める」としながら2度目の失敗(4/1)
https://www.itmedia.co.jp/news/spv/2204/01/news166.html

セキュリティカメラのWyze Camに3年間誰でもアクセス可能だった脆弱性があったことが明らかに(3/31)
https://gigazine.net/news/20220331-wyze-cam-vulnerability/

PPC マンガで学ぶ個人情報保護法など公開(3/31)
https://ab.jcci.or.jp/article/62752/

OSのパフォーマンス調査方法についてまとめてみた(3/31)
https://qiita.com/tbtakhk/items/de5b682d2334523dafd9

改正個人情報保護法施行でデジタルマーケテターが見直すべき4つのポイント(4/1)
https://marketing.itmedia.co.jp/mm/spv/2204/01/news044.html

Spring4Shell: このJavaのRCE脆弱性について分かったこと(4/2)
https://qiita.com/SnykSec/items/8d6892d856b80505570d

Visaの不正検知システム「Visa Risk Manager」を導入（ナッジ）(4/1)
https://paymentnavi.com/paymentnews/117086.html
Preact で Vite 版 Storybook が動かない問題

# 問題

記事投稿時点では、 Preact のプロジェクトに

```terminal
npx sb init --builder storybook-builder-vite
```

で Storybook を入れてもうまく表示されません。その対症療法を書き残しておきます。

# @mdx-js/preact のバージョン

`.mdx` 形式の story を表示するために必要なライブラリ `@mdx-js/preact` が自動では入らないので、入れる必要があります。

しかも `@mdx-js/preact` はつい最近メジャーバージョンが変わったようで、最新を入れても動きません。メジャーバージョンが変わる直前のバージョンを入れる必要があります。

```terminal
npm install --save-dev @mdx-js/preact@1.6.22
```

# Vite の設定

加えて、 `@storybook/preact` が Vite に対応していないため、 Vite のビルドオプションをこちらで設定してやる必要があります。

`storybook-builder-vite` を使用している場合、 `.storybook/main.js` の `viteFinal` で Vite に渡すオプションを設定することができます。

最小の設定は以下になります。

```diff
 module.exports = {
   ...,
+  viteFinal: (config) => ({
+    ...config,
+    esbuild: {
+      jsxFactory: "h",
+      jsxFragment: "Fragment"
+    },
+    resolve: {
+      alias: {
+        "react-dom": "preact/compat",
+        react: "preact/compat"
+      }
+    }
+  })
}
```

JSX を `h`, `Fragment` 関数に変換すること、 React 特有の関数を `preact/compact` で代用することを指定します。

story ファイルでいちいち `import { h } from 'preact';` するのが面倒な場合は、さらに以下の行を追加することで勝手に import してくれます。

```diff
       jsxFactory: "h",
       jsxFragment: "Fragment",
+      jsxInject: `import { h, Fragment } from "preact"`
```
【React初学者】props親子間の受け渡し


<h2>通常の受け渡し</h2>

親

```Parent.jsx
import { Child } from "../components/child";

export default function App() {
  return (
    <>
      <Child age={20}/>
    </>
  );
}
```

子

```Child.jsx
export const Child = ({ age }) => {
  return (
    <>
      {age}
    </>
  );
};
```

<h2>children</h2>

親

```Parent.jsx
import { Child } from "../components/child";

export default function App() {
  return (
    <>
      <Child>
        <div>children</div>
      </Child>
    </>
  );
}
```

子

```Child.jsx
export const Child = ({ children}) => {
  return (
    <>
      {children}
    </>
  );
};

```

<h2>親に関数を定義して、子から呼ぶ</h2>

親

```Parent.jsx
import { Child } from "../components/child";

export default function App() {
  return (
    <>
      <Child onClick={() => alert("hello")}/>
    </>
  );
}

```

子

```Child.jsx

export const Child = ({ onClick }) => {
  return (
    <>
      <div onClick={onClick}>関数呼び出し</div>
    </>
  );
};

```
Mysql旧pearと利用しない方法でテーブルフィールド名取得

pearによるDBのtablesinfoにてフィールド名取得例。
```
require_once 'DB.php';
$dsn = "mysqli://root:password@localhost/db名";
$options = array(
    'debug'       => 2,
    'portability' => DB_PORTABILITY_ALL,
);
$db = DB::connect($dsn);
if (DB::isError($db)) {
   die($db->getMessage());
}
$db->query('SET NAMES utf8');
$info = $db->tableInfo('テーブル名',0);
//print_r($info);
$i=0;
foreach($info as $key => $value){
//echo $info[$i][len]."<BR>";
echo $info[$key][name]."<BR>";
}
```
pearを利用しないフィールド名取得。
```
$mysqli = new mysqli('127.0.0.1', 'root', 'パスワード', 'db名');
if ($mysqli->connect_error) {
    echo $mysqli->connect_error;
    exit();
} else {
    $mysqli->set_charset("utf8");
	echo "connect ok!!";
}
$query = "SELECT * from テーブル名 order by pet_id";
if ($result = $mysqli->query($query)) {
echo "result ok!!";
        /* すべてのカラムのフィールド情報を取得します */
        $finfo = $result->fetch_fields();
//print_r($finfo);

        foreach ($finfo as $val) {
		//print_r($val);
		echo $val->name."<br>";
	}

}else{
	echo "not result";

}
```
【Docker】Rails + Puma + Nginx + MySQL + React（2）

## はじめに
　本記事は、プログラミング初学者、学習を進めていて疑問に思った点について調べた結果を備忘録も兼ねてまとめたものです。
　そのため、記事の内容に誤りが含まれている可能性があります。ご容赦ください。
　間違いを見つけた方は、お手数ですが、ご指摘いただけますと幸いです。

## 【Docker】Rails + Puma + Nginx + MySQL + React（2）
### Nginx

```Dockerfile:Dockerfile
FROM nginx:1.21.6

RUN rm -f /etc/nginx/conf.d/*

COPY nginx.conf /etc/nginx/conf.d/myapp.conf

ENV USER_NAME=myuser
RUN adduser ${USER_NAME} && \
    chown -R ${USER_NAME} /var/cache/nginx/ && \
    chown -R ${USER_NAME} /var/run/
USER ${USER_NAME}

CMD /usr/sbin/nginx -g 'daemon off;' -c /etc/nginx/nginx.conf
```

```nginx.conf

upstream myapp {
  server unix:///myapp/tmp/sockets/puma.sock;
}

server {
  listen 80;

  server_name localhost;
  access_log /var/log/nginx/access.log;
  error_log  /var/log/nginx/error.log;

  root /myapp/public;

  client_max_body_size 100m;
  error_page 404             /404.html;
  error_page 505 502 503 504 /500.html;
  try_files  $uri/index.html $uri @myapp;
  keepalive_timeout 5;

  location @myapp {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_pass http://myapp;
  }
}
```
```puma.rb
threads_count = ENV.fetch("RAILS_MAX_THREADS") { 5 }
threads threads_count, threads_count
environment ENV.fetch("RAILS_ENV") { "development" }
plugin :tmp_restart

app_root = File.expand_path("../..", __FILE__)
bind "unix://#{app_root}/tmp/sockets/puma.sock"

stdout_redirect "#{app_root}/log/puma.stdout.log", "#{app_root}/log/puma.stderr.log", true
```

### React
```docker-compose.yml
version: '3.9'
services:
  front:
    build: .
    volumes:
      - .:/myapp/front
    environment:
      NODE_ENV: development
    command: sh -c "npm start"
    ports:
      - 3000:3000
    networks:
      - nginxrailspumamysql_default
networks:
  nginxrailspumamysql_default:
    external: true

```
```Dockerfile:Dockerfile
FROM node:16.14.2

ENV APP_NAME=myapp
ENV USER_NAME=myuser
ENV TZ=Asia/Tokyo

WORKDIR /${APP_NAME}/front

RUN adduser ${USER_NAME} && \
  chown -R ${USER_NAME} /${APP_NAME}
USER ${USER_NAME}

EXPOSE 3000
CMD ["npm", "start"]
```
pip install 時のエラー（pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available.）

# 発生したエラーについて
## エラーの本文
```bash
Retrying (Retry(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError("Can't connect to HTTPS URL because the SSL module is not available.",)': /simple/pip/
Could not fetch URL https://pypi.org/simple/pip/: There was a problem confirming the ssl certificate: HTTPSConnectionPool(host='pypi.org', port=443): Max retries exceeded with url: /simple/pip/ (Caused by SSLError("Can't connect to HTTPS URL because the SSL module is not available.",)) - skipping
Requirement already up-to-date: pip in /usr/local/lib/python3.6/site-packages (18.1)
pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available.
Could not fetch URL https://pypi.org/simple/pip/: There was a problem confirming the ssl certificate: HTTPSConnectionPool(host='pypi.org', port=443): Max retries exceeded with url: /simple/pip/ (Caused by SSLError("Can't connect to HTTPS URL because the SSL module is not available.",)) - skipping
```

## 環境
- Docker version 20.10.12, build e91ed57
    - Dockerイメージ　nvidia/cuda:11.3.1-cudnn8-devel
- Python3.6.13

## エラーの発生手順
コンテナ内でPython3.6を利用する必要があり、下記リポジトリを`clone`してREADMEの手順通りにインストールを実行。
```bash
./configure
make
make test
sudo make install
```

https://github.com/deadsnakes/python3.6

その後、`pip install`を実行するとSSLに関するエラーが発生。


# 対処法
`libssl-dev`をインストールする。
```
apt-get install libssl-dev
```


# 参考サイト
https://www.teamxeppet.com/install-python3-9-1_on_ubuntu20-04/
サクラレンタルサーバーでphpからメールを送信する

# 概要
サクラレンタルサーバーで動かしてるLaravelのフレームワークからメールが送信したくなったのでその時実装したものの紹介

## 方法

Laravelのフレームワークでやるやり方がいくつかあったんですけど、レンタルサーバー側でcomposerのupdateができなくなってしまっていて、それに頼ることができなくなったので素のPHPの書き方をベースに書くことにした。

## 書き方
最終的に書いたコードがこちら

```php
        mb_language("uni");
        mb_internal_encoding("UTF-8");
        $to = "送信したいメールアドレス"
        $subject = "件名"
        $header = "Content-Type:text/plain;charset=UTF-8\r\n";
        $header .= "From: 送信元メールアドレス\r\n";
        $param = "-f 送信元メールアドレス";
        $message = "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\r\n";
        $message .= "XXXX会員 仮登録完了のおしらせ\r\n";
        $message .= "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\r\n";
        $message .= "\r\n";
        $message .= "この度は、XXXへご登録いただきまして誠にありがとうございます。\r\n";

        mb_send_mail($to, $subject, $message, $header, $param); 

```

## 詰まった部分
### 日本語が使えない

```php
        $to = "送信したいメールアドレス"
        $subject = "件名"
        $header = "Content-Type:text/plain;charset=UTF-8\r\n";
        $header .= "From: 送信元メールアドレス\r\n";
        $param = "-f 送信元メールアドレス";
        $message = "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\r\n";
        $message .= "XXXX会員 仮登録完了のおしらせ\r\n";
        $message .= "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\r\n";
        $message .= "\r\n";
        $message .= "この度は、XXXへご登録いただきまして誠にありがとうございます。\r\n";

        mb_send_mail($to, $subject, $message, $header, $param); 

```

最初上記の状態で記載していたのですが日本語全く表示されなかった。ので下記の記述を追加

```php
        mb_language("uni");
        mb_internal_encoding("UTF-8");

        $to = "送信したいメールアドレス"
        $subject = "件名"
        $header = "Content-Type:text/plain;charset=UTF-8\r\n";
        $header .= "From: 送信元メールアドレス\r\n";
        $param = "-f 送信元メールアドレス";
        $message = "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\r\n";
        $message .= "XXXX会員 仮登録完了のおしらせ\r\n";
        $message .= "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\r\n";
        $message .= "\r\n";
        $message .= "この度は、XXXへご登録いただきまして誠にありがとうございます。\r\n";

        mb_send_mail($to, $subject, $message, $header, $param); 

```

### 改行されなかった

最初改行の文字列すら表示されなかったのですが原因が
```php
        $header = "Content-Type:text/plain;charset=UTF-8\r\n";
```
こちらのheader部分が
```php
        $header = "Content-Type:text/html;charset=UTF-8\r\n";
```
ｈｔｍｌを指定したせいでした
【初心者が始める】githubの環境構築(後編)

前回投稿した「【初心者が始める】githubの環境構築(前編)」に引き続きgithubの環境構築を最後までやった際の個人的つまずきポイントを残そうと思う。

今回も前編に引き続き下記リンクを参照しながら環境構築を行なった。

https://prog-8.com/docs/git-env

今回つまずいた箇所は、上記リンク手順５の「githubにプッシュする」の下記コマンドを実行した際、
```python:
$ git commit -m "Create index.html"
```
下記の表示が現れたことについて
```python:
On branch development
nothing to commit, working tree clean
```
こちらは正常にgit commitできている時の表示らしい。
nothingが不安を掻き立てるが、気にせず次の手順へ進もう。

この次に最後のプッシュコマンドを実施した際（下記がプッシュコマンド）
```python:
$ git push origin master   

#著者は前編にて、"initial branch（master)"をdevelopmentに変更したため下記で実行
$ git push origin development   
```


githubのユーザーネームとパスワードが求められるが、なぜかパスワードが承認されなかった（下記エラーメッセージ）
```
remote: Support for password authentication was removed on August 13, 2021. Please use a personal access token instead.
remote: Please see https://github.blog/2020-12-15-token-authentication-requirements-for-git-operations/ for more information.
```
パスワードがなぜ承認されなかったかは分からなかったが、パスワードの代わりに、一時的にパスワードの代わりとなる`Access token`を作成することで、承認することができた。
その方法が下記リンクとなる。

https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token

このリンク先は英語で記載されているが、手順を見よう見まねで実行していけばAccess tokenを作成することができます。
そのAccess tokenを先ほどの手順のパスワードの代わりに打ち込めば、承認がされます。

なんとかgithubの環境構築ができました！
これからどんどん慣れていきたいと思います！
【Linux】コマンドまとめメモ

### ディレクトリ、ファイル		
|	コマンド名	|	説明	|
|	---	|	---	|
|	ls	|	ファイル、ディレクトリを表示	|
|	pwd	|	現在自分がいるパスを表示	|
|	cd	|	カレントディレクトリの変更	|
|	mkdir	|	ディレクトリを作成する	|
|	touch	|	 ファイルの作成	|
|	rm	|	ファイルの消去	|
|	rmdir	|	空のディレクトリの消去	|
|	cat	|	ファイル内容の表示	|
|	less	|	ファイル内容を一画面ごとに表示	|
|	cp	|	ファイル、ディレクトリのコピー	|
|	mv	|	ファイルの移動	|
|	in	|	リンクを貼る	|

### 探す、調べる	
|	コマンド名	|	説明	|
|	---	|	---	|
|	find	|	ディレクトリーツリーからファイルを探す	|
|	locate	|	ファイル名、ディレクトリ名からファイルを探す	|
|	--help	|	コマンドのヘルプ表示	|
|	man	|	コマンドのオンラインマニュアルを表示	|
|	which	|	コマンドのフルパスを表示	|

### プロセス、ジョブ			
|	コマンド名	|	説明	|
|	---	|	---	|
|	ps	|	現在動作しているプロセスの表示	|
|	fg	|	ジョブをフォアグランドにする	|
|	bg	|	ジョブをバックグランドにする	|

### フィルタコマンド				
|	コマンド名	|	説明	|
|	---	|	---	|
|	cat	|	入力をそのまま出力する	|
|	head	|	先頭部分を表示する	|
|	tail	|	末尾の部分を表示する	|
|	grep	|	指定した検索パターンに一致する行だけを表示する	|
|	sort	|	順番に並べ替える	|
|	uniq	|	重複した行を取り除く	|
|	tac	|	逆順に出力する	|
|	wc	|	行数やバイトを数を出力する	|

### テキスト処理				
|	コマンド名	|	説明	|
|	---	|	---	|
|	cut	|	入力の一部を切り出す	|
|	tr	|	文字を変換、消去する	|
|	diff	|	差分を表示する	|

### アーカイブ、圧縮				
|	コマンド名	|	説明	|
|	---	|	---	|
|	tar	|	アーカイブファイルの作成、展開	|
|	gzip	|	.gzの作成、展開	|
|	bzip2	|	.bz2の作成、展開	|
|	zip	|	アーカイブファイルの作成と.zipの作成	|
|	unzip	|	.zipを展開	|　　　

### リダイレクト				
|	コマンド名	|	説明	|
|	---	|	---	|
|	< FILE	|	標準入力をFILEに変更する	|
|	> FILE	|	標準出力をFILEに変更する	|
|	>> FILE	|	標準出力をFILEの末尾に追記する	|
|	2> FILE	|	標準エラーの出力をFILEに変更する	|
|	2>> FILE	|	標準エラーの出力の出力をFILEの末尾に追記する	|
|	> FILE 2> & 1	|	標準出力と標準エラー出力を、共にFILEに変更する	|
【世界一わかりやすい】Atcoder ABC246 C・D問題 Python3解説

**ABC246**の**C,D**問題を、**Python3**で解説します！

ょゎょゎな筆者でもわかる、読みやすさを重視した、**初心者**向け解説です(´・ω・｀)

ゆっくり見ていってね(｀・ω・´)ｷﾘｯ

# 目次
[1. C問題 - Coupon](#-c問題-coupon)
[2. D問題 - 2-variable Function](#-d問題-2-variable-function)

# C問題 『Coupon』

問題ページ：[C問題 - Coupon](https://atcoder.jp/contests/abc246/tasks/abc246_c)

C問題までは、forループとか書ければ、アルゴリズム知らなくても、なんとなく解ける気がする(気がするだけ)。
クーポンの問題、筆者はケチな大阪人なので得意かも(｀・ω・´)
Nはせいぜい $10^5$ なので、時間はなんとかなりそう。

### 考え方
商品を高いもん順にソートしておく。
まず、商品の値段が0円にならないように、クーポンを使っていく。
クーポンを使った商品の値段は、値引き後の値段に置き換えていく。

場合分け①：**途中でクーポンが無くなる場合**
クーポンがなくなる時の商品の値段に注意。
商品は値引き後の値段に置き換えられているので、そのまま和を求めれば良い。

商品の値段が0円にならないように、クーポンを使っていくと、まだクーポンが余る場合がある。

場合分け②：**いくつかの商品のみが0円になる場合**
値引き後の値段が高いもん順に再度ソートする。
値引き後の値段は全てクーポンより安いはずなので、さらにクーポンを使うと0円になる。
クーポンが無くなった時点で、残った商品の値引き後の価格の和を求めれば良い。

場合分け③：**全て0円になる場合**
余ったクーポンの数が、商品の数より多い時、全て0円になる。

### コード
```python3:C.py
n, k, x = map(int, input().split())
A = list(map(int, input().split()))

#商品を高いもん順にソート
A.sort(reverse=True)

cnt = 0 #クーポンを使った枚数
ans = 0 #答え(出力)

for i in range(n):
  cnt += A[i]//x #クーポンを使った枚数
  if cnt >= k:
    #場合分け①：途中でクーポンが無くなる場合で、クーポンがなくなる時の商品の値段
    A[i] = A[i]-(k-(cnt-A[i]//x))*x 
    cnt = k #クーポンはk枚以上使えない
    break
  A[i] = A[i]%x #値引き後の値段に置き換え

#場合分け①：途中でクーポンが無くなる場合    
if cnt == k:
  ans = sum(A)

#場合分け②：いくつかの商品のみが0円になる場合
elif cnt < k and k-cnt<n: 
  A.sort(reverse=True) #値引き後の値段が高いもん順にソート
  ans = sum(A[k-cnt:]) #クーポンが無くなった時点で、残った商品の値引き後の価格の和

#場合分け③：全て0円になる場合
else:
  ans = 0
  
print(ans)
```

# D問題 『2-variable Function』

問題ページ：[D問題 - 2-variable Function](https://atcoder.jp/contests/abc246/tasks/abc246_d)

むずい、むずいよぉ、ｳﾜｧｧｧｧｧｧヽ(`Д´)ﾉｧｧｧｧｧｧﾝ!
（2022/04/03追記：公式解説のやり方が天才肌すぎてとても凡人には思いつかなそうだったので、二分探索に変更しました）

### 考え方
$N$ は10の18乗だけど、$X$ は3次式なので、 **$a, b$ は $10^6$ に収まる**ことに気づくのがポイント。
$f(a,b)=a^3+a^2b+ab^2+b^3$ とする。
$a$ を固定すると、$f(a,b)$ は単調増加なので...そう、$b$ は**二分探索**で探せるヽ(・∀・)ﾉ

$a=0$ から $10^6-1$について、ギリギリ $f(a,b)≧N$ となる $b$ を二分探索で探す。
その最小値が答えになる。

### コード
```python3:D.py
n = int(input())

#n=0の時はややこしいので場合分けしといた
if n==0:
    print(0)
    exit()

#f(a,b)を定義
def f(a,b):
    return a**3+a**2*b+a*b**2+b**3

#ここにf(a,b)を保存していく
X = []

for a in range(10**6):
    #二分探索の両端を定義
    ng = 0
    ok = 10**6
    while ok-ng>1:
        m = (ok+ng)//2
        if f(a,m)>=n:
            ok = m
        else:
            ng = m

    #ギリギリN以上になるf(a,b)をXに保存しておく
    X.append(f(a,ok))

print(min(X))
```
# まとめ
最後まで見てくれてありがとう(´・ω・｀)
これからも自分の勉強がてらABCのC,D問題とか、過去問の解説上げてくかも。
来週も頑張ろうね(｀・ω・´)ｷﾘｯ
ゲーミングPCで起きた悲劇

# 最重要項目（オチ）（2022/4/9追記）
初版は、真の解決方法とほとんど関係しませんでした。申し訳ございませんでした。気休め程度の処置？でした。
実際には、「<b>デバイスマネージャ</b>>><b>ディスプレーアダプタ</b>>><b>GeForce Nvidia RTX 3090</b>>><b>プロパティ</b>>><b>ドライバー</b>>><b>ドライバーを元に戻す</b>」から、前のバージョンに戻してPCを再起動するだけでクリアしました！
![Inkedプロパティ_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452331/91098c39-0f44-fb69-e340-8aff55bb06fc.jpeg)
紆余曲折しましたが、クリアしてよかったです！！
HPさんに問い合わせをしたのですが、土曜日にもかかわらず対応してもらえたのと、すごくわかりやすい説明だったので、すんなりと解決しました！
どうやら、最近（2022/3/22）のNvidiaドライバーの更新で不具合が生じてしまったらしいです。
いやぁ、本当に良かった！！


# 背景
著者は、普段、ゲーミングPCを利用して人工知能を開発しています。
環境は、以下の通りです。
| | 名称 |
|:-:|:-:|
|  マシン|  HP OMEN| 
|   OS| windows 10 Pro|
|   GPU|  RTX3090 |
|   CPU|  intel core  i9 |
|   RAM|  64GB |

上記のハイスペックPCで人工知能を開発していて、普段はスイスイ学習を行ていました。しかし、ある日事件が起きました。


# 事件
突如として、ブルースクリーンが出現。そして、強制的に学習停止、コンピュータの再起動。。。
なんじゃこりゃ泣
![事件.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452331/697a1f79-212b-bcc3-0f84-76df123e4e22.jpeg)

https://www.windows.com/stopcode

停止コード：PAGE_FAULT_IN_NONPAGED_AREA
失敗した内容：nvlddmkm.sys
もうわけわからない。。。
ただ、nvlddmkmということは、GPU周辺の何かがおかしいとだけ分かりました。

# 対処
調べてみると、いろんなサイトで対処法が出てきました。
主に参考にさせていただいたサイト

https://chirashi.twittospia.com/%E6%8A%80%E8%A1%93/windows10%E3%81%A7nvlddmkm-sys%E3%82%A8%E3%83%A9%E3%83%BC%E3%82%92%E4%BF%AE%E6%AD%A3%E3%81%99%E3%82%8B5%E3%81%A4%E3%81%AE%E7%B0%A1%E5%8D%98%E3%81%AA%E6%96%B9%E6%B3%95/2021-02-02/

そして、試したことは以下の通りです。
1. GeForce Experienceから nvidiaドライバーの更新
最新に更新しました
2. デバイスマネージャから nvidiaドライバーの更新
デバイスに最適なドライバーだと表示されましたので、ノータッチです
3. コマンドプロンプト（管理者）から、
```
chkdsk /f c:
```
を実行して、ディスクチェック
4. Windowsメモリ診断 
<b>Windowsキー+R</b> から、mdsched.exeを実行

以上が検索したら、出てきて、試したことです。しかし、メモリチェック、ディスクチェックでは、何もエラーは検出されず、一向に状況は改善されませんでした。
どうしよう。。完全に詰んだ。

# 奇跡
そういえば、事件当日から原因不明で、マウスポインタの周辺に青いクルクルが出ていたような。。。
何かの処理が重くなっている！？と考えました。
まずは、そこから解消することに。
何かの処理があれば、タスクマネージャーでわかるので、そこで確認すると、<b>OMEN Gaming Hub</b>というソフトが起動していて、割とメモリを食っていた。取り敢えず、タスクを終了。すると、マウスの周りを回っていたクルクルが解消されました！！ん、もしや、今回の事件に関与していたのでは！？学習もできるようになったのでは？？
と思い、<b>学習用コードを走らせてみると、学習ができた！！！</b>
今回、使用デバイスを敢えて記載した理由はここにあります。
実は、HPのOMENくんは、優秀なゲーミングPC。ゲーム用に作られているのだ。
当方、ゲームをやらないのでわかりませんが、この便利ソフト？がが今回の事件のトリガーだったようでした。何は、どうであれ、解決して良かったです。

# 最後に
ゲーミングPCで人工知能を開発する人は少ないかもしれませんが、なんかの手助けになれれば幸いです。
当方、初心者ですので、何かアドバイス等ございましたら、コメント等で教えてください…！！
Ubuntu 22.04 Jammy Jellyfishのibus-mozcで変換候補が左下に出てしまう場合の対策


# 変換候補が左下に出てしまう問題

![Screenshot from 2022-04-03 00-48-31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208363/4da34170-0947-a19d-ee1c-719cb2156571.png)
![Screenshot from 2022-04-03 00-47-12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208363/535ae33f-99e0-3769-e4eb-0709a7b92430.png)
![](https://i.bmp.ovh/imgs/2022/03/34ebb5158ceeedfc.png)

# 対策

`/etc/environment` に `GTK_IM_MODULE=ibus` を追加して再起動

```bash
sudo vi /etc/environment
```

https://bugs.launchpad.net/ubuntu/+source/ibus-libpinyin/+bug/1966552

カーソルの下に候補がでるようになった
![Screenshot from 2022-04-03 01-01-58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208363/adfef92e-b4d8-d308-ca45-14a21d167f3c.png)
![Screenshot from 2022-04-03 01-01-25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208363/86d4e437-e4c5-c064-fcc8-75cc517fe124.png)
Vue3でWebアプリ開発 #0

# はじめに
フロントエンド開発未経験者です。
バックエンドに関しても、ほとんど初心者です。
そんな私がVueを用いたWebアプリ開発日記をここに書いていきます。
なお、Vue3+TypeScriptで開発を進めていきます。

# 準備
開発をするにあたって必要な準備をします。
#0では、プロジェクト作成直前まで行います。

## NodeとNpmのインストール
Node.jsは、JavaScript実行環境です。(詳しくは、[こちら](https://qiita.com/non_cal/items/a8fee0b7ad96e67713eb　"Node.jsとはなにか？なぜみんな使っているのか？")から)
また、npmとは、Node.jsのパッケージ管理システムです。
どちらもWebアプリ開発をするには必須です。

それぞれ以下の公式サイトからダウンロード出来ます。
(トップページのダウンロードリンク1つでインストール出来ます。)
[Node.js](https://nodejs.org/ja/)

インストール方法は、[こちら](https://qiita.com/mk185/items/7ad004bf202f400daea1)をご参照ください。

## vue-cliのインストール
Vue CLIとは、Vue.jsのプロジェクト作成やビルドなどができるコマンドラインツールです。
ターミナルで以下のコマンドを実行してください。
`
$npm install -g @vue/cli
`

# 最後に
これでVueを用いたWebアプリ開発を行う準備が出来ました。

次回は、実際にWebアプリを作成していきます。
vscode rails環境構築時のエラー brew doctor

# vscodeにrailsの環境構築の中で出たエラー
homebrewをインストールした後```brew doctor```を行った時
```
Homebrew/homebrew-core (git ******** last commit *******)
*****@mbp ~ % brew doctor
Please note that these warnings are just used to help the Homebrew maintainers
with debugging if you file an issue. If everything you use Homebrew for is
working fine: please don't worry or file an issue; just ignore this. Thanks!

Warning: Your Command Line Tools are too outdated.
Update them from Software Update in System Preferences or run:
  softwareupdate --all --install --force

If that doesn't show you any updates, run:
  sudo rm -rf /Library/Developer/CommandLineTools
  sudo xcode-select --install

Alternatively, manually download them from:
  https://developer.apple.com/download/all/.
You should download the Command Line Tools for Xcode 13.3.


Warning: A newer Command Line Tools release is available.
Update them from Software Update in System Preferences or run:
  softwareupdate --all --install --force

If that doesn't show you any updates, run:
  sudo rm -rf /Library/Developer/CommandLineTools
  sudo xcode-select --install

Alternatively, manually download them from:
  https://developer.apple.com/download/all/.
You should download the Command Line Tools for Xcode 13.3.
```
```
softwareupdate --all --install --force
```
をしたが同じく表示されたので
```
sudo rm -rf /Library/Developer/CommandLineTools
```
を行った。
```
******@mbp ~ % brew doctor                                    
Please note that these warnings are just used to help the Homebrew maintainers
with debugging if you file an issue. If everything you use Homebrew for is
working fine: please don't worry or file an issue; just ignore this. Thanks!

Warning: Git could not be found in your PATH.
Homebrew uses Git for several internal functions, and some formulae use Git
checkouts instead of stable tarballs. You may want to install Git:
  brew install git

Warning: No developer tools installed.
Install the Command Line Tools:
  xcode-select --install
```
エラーが減った。

```
brew install git
```
エラーが出た。
```
.
.
.
Disable this behaviour by setting HOMEBREW_NO_INSTALL_CLEANUP.
Hide these hints with HOMEBREW_NO_ENV_HINTS (see `man brew`).
```
調べてみたところ最初```git -v```をしていたのでやってみた。

```
**********@mbp ~ % git -v
xcrun: error: active developer path ("/Library/Developer/CommandLineTools") does not exist
Use `sudo xcode-select --switch path/to/Xcode.app` to specify the Xcode that you wish to use for command line developer tools, or use `xcode-select --install` to install the standalone command line developer tools.
```
そうすると```xcode-select --install```が上のエラーメッセージと重なるので
```
xcode-select --install
```
を実行。
```
*********@mbp ~ % brew doctor         
Your system is ready to brew.
```
エラーが出なくなった。