OmniAICreator/Qiita-1.07M huggingface dataset:
副業4ヶ月になって感じたこと。


## はじめに
副業4ヶ月目になりました。
本業はプログラミングの仕事やってない状況で、
副業だけでどのぐらいできるようになったかをお話して見たいと思います。

### 1月の総額時間

1月で72時間を副業、学習、ポートフォリオ作成に使いました。
1月1日から頑張りました。（笑）
納期がある案件もあるので、あまり休めないのもありますし、
本業もあるので、毎日ちょっとずつやっていくのが大事ですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2350392/ec8c5b15-af6f-1a7b-a624-799676a60fd7.png)

## 副業

[Ruby on Railsの記事](https://qiita.com/parkon_hhs/items/98304bc5112f0e0f6faf)を読んでいただいた副業先の社長から仕事の依頼が来まして、
去年の10月からRuby on Railsのエンジニアとして働くことになりました。

未経験でもRuby on Railsの案件を大きい問題なく完了させることができました。
まずはコードをひたすら読みました。分からないところだらけで泣きなかったところもありましたが、、なんとかサービスの動きがわかったので、
そこからはどんどん作業する時間も短くなるような感じでした。

Ruby　on Railsの基本的な改修ができるようになりましたので、
Reactも学習をしたので、書けます！Reactの案件もありましたらください！と副業先の社長にお願いをして、
1月からはのReactの案件もいただけるようになりました。（やはり自分ができることをアピールするのは大事ですね！）

主にCMSのEditorの機能の追加で、ユーザーが入力したデータがどういう形でDBに保存されて、どういうふうに表示（show）されるのかを把握する必要がありまして、最初時間がかかりました。
実務のReactのコードを初めて読んだので難しかったですが、F12キー（go to definition）を活用しながら、どういった動きをするのかを頑張って把握しました。
入力があると必ず出力があることだけ覚えて、データの動きを1行1行確認すると、意外と早く把握できるので、こういったコツもできたことに観劇しました。
Reactのコードを実務で書くのが初めてで、エラーが2時間連続発生したりして、大変でしたが、その分いい勉強になりました。

そして、バックエンドの方はRailsなので、データ保存後の動き等はRailsも読む必要があって、簡単ですが、フルスタックエンジニアとしての経験ができて、異なる言語間の噛み合いについて理解度が上がったいい機会だったと思います。

## 学習
副業しながら、案件が終わって、ちょっと暇ができたり、本業終わりの車の中での２０分などを利用して学習も進めました。

- React
- Github Actions
- Rspec

#### React
Reactの学習をいろんな教材でしたいと思い、下記のudemyの講座で学習を始めました。
これを含めて5個のReactの講座を見て学習した結果、実務で
簡単なコードを書くことには問題なくなったので、
やはり学習って大事だなと思いました。

https://www.udemy.com/course/react-trello-development/
#### Github Actions
副業で**Github Actions**も使うので、ちょっとずつGithub Actionsの講座も進めました。
#### Rspec
1月は主にReactの実装でしたが、Railsも書いて、テストもしないといけなかったので、1日本業を休んで、**Rspecの本**を読み終えて、テストコードを書きました。実務のテストコードが本より水準が高かったので、本になかったメソッド等は検索で調べながら、テストコードを書きました。


## ポートフォリオ作成
エンジニアの本業転職のために、ポートフォリオを作成しています。
最初決めた主題があまり面白くないなと思い、路線変更をしました。
それで、DBのテーブルを大幅に変更しました。
NOT NULL制約をどのカラムにつけるべきかを結構悩みました。
データの中で、配列をDBに保存したいと思って、しらべたら、Ruby on Railsでもやり方があって、いい勉強になりました。
やはり副業以外でもコードを書くことでさらに成長できる気がします。

Reactを実務でも触れるようになって、どんどん成長していることを感じまして、以前ポートフォリオに書いたコードを今読むと、効率的ではないコードが見えてきたりして、修正すべきところがどんどん増えてきます。
trelloのto do listが溢れていますね。（笑）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2350392/30b5bef3-2605-ef3f-da1c-a4c2b0afa5d7.png)

## 記事

1月の記事はなんと3つもありまして、下記になります。
副業で感じた不便なところなどをまとめて書いた記事ですね。
そして自分が学習していたHappiness Chainというスクールを卒業した記事は6000人以上の方が読んでくださって、本当に嬉しかったです。

https://qiita.com/parkon_hhs/items/30396c1befc250e30a6d

https://qiita.com/parkon_hhs/items/e94affc305994a869e0e

https://qiita.com/parkon_hhs/items/5a63810866743cc7a3f6

## 終わりに

本業をしながら、育児をしながら、毎晩2時間色々頑張ってきたいい1ヶ月でした。
（お金をいただくので、分からなくても絶対やり切らないといけないので、どんどん寝不足になりますが、、）
副業を通じて実務が経験できたのは本当にいい機会ですね、、
先輩たちが書いた実務のコードを読むだけでも成長しますので、、

今後は副業を持って頑張っていきたいと思います。
そしてReactが結構慣れてきたので、この調子でポートフォリオも進めていきたいと思います。
それと、Javascriptをもうちょっと深く知る必要があると思って、JavaScriptの本を読み始めました。
難しいですね、、thisとかcallbackとか、変数とObjectのメモリでの挙動？等、Reactが本当に便利だと改めて感じました。

以上、副業4ヶ月目の駆け出しエンジニアの日常でした。

読んでくださって誠にありがとうございます。引き続き頑張ります！
【OpenCV】作ってみる自動運転。車載カメラ画像の解析（フーリエ変換）

# はじめに
[前回、OpenCVを利用して車載カメラ画像から白線を検出しました。](https://qiita.com/tentsukup_ch/items/f81aeb2592aa752770b3)

白線だけでなく、白線以外の直線も多く検出する結果となりました。
道路の白線のみを検出するために、道路とそれ以外の領域を分割する必要がありそうです。
まずは、道路とそれ以外の部分のテクスチャの違いに着目して、分割することを目指してみます。
今回のゴールは下図です。
![input_img.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1902761/bcb839c4-7657-3409-bad7-9ea7776dfab7.png)
![output.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1902761/81d9537a-0543-1deb-5af9-5198fa194dd9.png)

「空の領域」、「木々の領域」、「道路の領域」の画像を切り出し、各画像にフーリエ変換を適用します。各画像の周波数領域の違いを確認することを目指します。
* 入力画像から各領域を切り出す
* 切り出した画像にフーリエ変換を適用する

# コードを書いていく
## Step0. 準備
Python 3.10.8、opencv 4.7.0を利用します。いつも通りimportする。
~~~python
import cv2
import numpy as np
from matplotlib import pyplot as plt
~~~

## Step1. 入力画像にグリッド線を描画する
切り出したい各領域を目視で確認しやすくするために、グリッド線を入力画像に描画してみます。
~~~python
# 画像の入力
input_img = cv2.imread('michi.jpg')
original = input_img.copy() #原画像も一応コピーして残す

# グリッド線を描画する準備（何Pixel毎に格子を描画するか）
xd_grid = 50
yd_grid = 50
img_y, img_x = input_img.shape[:2]# 画像の縦横の大きさ取得

# 任意のpixel数の格子を黒接で描画する
input_img[yd_grid : img_y : yd_grid, :, :] = 0
input_img[:, xd_grid : img_x : xd_grid, :] = 0
cv2.imwrite('with_grid.png', input_img)
~~~
## Step2. 任意の領域を切り抜く
~~~python
# 切り抜き #1 空
# 画像特有の座標系(j, i)に注意する
cut_img1 = input_img[0 : 50, 350: 400]# [y軸(縦)方向, x軸(横)方向]
# 切り抜き #2 木々
cut_img2 = input_img[150 : 200, 350: 400]
# 切り抜き #3 道路
cut_img3 = input_img[400 : 450, 350: 400]
~~~
## Step3. 切り出し画像にフーリエ変換を適用する
~~~python
# 切り抜き画像をグレースケールに変換
gray_img1 = cv2.cvtColor(cut_img1, cv2.COLOR_BGR2GRAY)
gray_img2 = cv2.cvtColor(cut_img2, cv2.COLOR_BGR2GRAY)
gray_img3 = cv2.cvtColor(cut_img3, cv2.COLOR_BGR2GRAY)

# 切り抜き画像に対して、それぞれフーリエ変換
f_1 = np.fft.fft2(gray_img1)
fshift_1 = np.fft.fftshift(f_1)

f_2 = np.fft.fft2(gray_img2)
fshift_2 = np.fft.fftshift(f_2)

f_3 = np.fft.fft2(gray_img3)
fshift_3 = np.fft.fftshift(f_3)

# Spectrum画像の作成
spe_1 = 20*np.log(np.abs(fshift_1))
spe_2 = 20*np.log(np.abs(fshift_2))
spe_3 = 20*np.log(np.abs(fshift_3))
~~~
## Step4. 処理結果を描画する
~~~python
plt.subplot(321)
plt.imshow(cv2.cvtColor(cut_img1, cv2.COLOR_BGR2RGB))
plt.title('Input image #1')
plt.subplot(322)
plt.imshow(spe_1)
plt.title('Spectrum #1')

plt.subplot(323)
plt.imshow(cv2.cvtColor(cut_img2, cv2.COLOR_BGR2RGB))
plt.title('Input image #2')
plt.subplot(324)
plt.imshow(spe_2)
plt.title('Spectrum #2')

plt.subplot(325)
plt.imshow(cv2.cvtColor(cut_img3, cv2.COLOR_BGR2RGB))
plt.title('Input image #3')
plt.subplot(326)
plt.imshow(spe_3)
plt.title('Spectrum #3')

plt.tight_layout()# 図を重ねない。
plt.savefig("output.png")# 結果を画像で保存する
plt.show()
~~~

# おわりに
原画像から任意の領域を複数切り抜いて、フーリエ変換を適用してみました。
フーリエ変換により画像が周波数領域に変換されましたが、目視では各画像の違いが分かりづらかったです。
あくまで目視での比較なので、今度はデジタルに比較してみたいと思います。

（参考）入力画像は、[写真素材ルーム](https://photo-room.net{:target="_blank"})様の素材を利用いたしました。
Python全く分からん自分のアウトプット　その3

3日目：昨日の続きから。


◎以下調べたこと、疑問に思ったこととかのメモ◎

for文・・・「for 変数名 in リスト：←コロン忘れないこと

for文処理・・・変数名はリストの単数形にするのが基本らしい。

辞書・・・データをまとめて管理する。個々の要素をリストではなく「キー」という名前をつける。

辞書作り・・・変数名={”キー1”:値,”キー2”:値,”キー3”:値}のように区切る場所はコンマをつける。辞書の順序は定義順。※（）ではなく｛｝間違えやすい。

辞書の要素取り出し・・・辞書名[キー]のように書く。


ｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰｰ

今日はここまでで終了。思ったより苦戦した。
けど一番最初の時よりは「は？」感がないのは慣れてきたということなのだろうか。
まだ3日目、されど3日目。この感覚を掴んで進めていきたい。
明後日は祝日だから多めに時間をとって勉強していこう。
MVCモデルって何？？？？？？

# はじめに
自身がrailsを学んだ時につまずいた、MVCモデルについて
改めて復習していこうと思います。

# MVCモデルとは？？
Webフレームワークの一つ。
プログラムの処理を「Model・View・Controller」の3つの役割に分けてコーディングを行うモデルです。機能ごとにプログラムの中身を分けて記述します。
み、三つぅ？？
とりあえず、一つずつ見ていきましょうか。。


# ①Model(モデル)
データ処理を行う部分です。DBとデータをやり取りして、必要なデータを処理する役割があります。
要するに、データを保存するところ。ですね。
あれ？意外と簡単？
２個目もさくさく行きましょう！

# ②View(ビュー)
ユーザが直接目にする画面の処理です。言い換えればフロント側の処理ですね。HTMLやJavaScriptなどでの画面のレイアウトや機能の処理が役割になります。
要するに、僕たち人間が見るパソコンの画面部分ですね。
この記事を見ている君も"ビュー"を見ています(・_・)
次が最後ですね！

# ③Controller（コントローラー）
上記の2つ、ModelとViewの橋渡しの役割です。データを画面に表示するために、Modelで扱ったデータをViewへ受け渡します。
要するに、仲介役って感じですね。
モデルとビューをコントロールしている影の支配者って感じですね＾＾
パチンコでいう営業者、景品交換所運営者、特殊景品卸売業者の
三店方式ってところでしょうか。![o1024076614405802125.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975065/04e70482-111f-b544-3543-aff15938f0b8.jpeg)

...はい、すいません。テキトーな事言いました。忘れてください。
話を戻しましょう。MVCモデルの三店方式がこちらです。![mvc-model.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975065/67443b6a-dea8-3822-28c6-482e6b179124.png)

どうですか？
イメージがなんとなくつきましたか？？
この方式で楽に分かりやすくデータの受け渡しをしています。
ruby on railsではこの概念の理解が必須です。


# 最後に
MVCモデルの利点はいくつかあります。

1.機能毎に分割されているため，分業して作業を進めやすくなる(各人の得意な所に集中できる)
2.それぞれが独立しているので変更・修正があった場合にその影響を受けにくい

今回の記事は以上になります．
MVCモデル。つまずきやすいですが、少しずつ定着していきましょう！

ということで
僕はパチンコにいってきます！
また、会いましょう！
ターミナルのtmuxのPrefixキーについて(憤怒)

# コントロールはControlです！！！！！
tl;drです。怒らないでください。同じ初心者を助けたいだけです。
macには**意味合いとしてのControlと見た目だけのControl**があります（ドン引き）

# 一言で表すなら　『哀』

愚か者の私は、tmuxのPrefixを使ったショートカットを使えるようになるまでに
計６時間を費やしました。

おそらくこの記事を見る人はしょーもないと感じるか、『草』、と思うかのどちらかだと思います。

# つまり何が言いたいのか

はい。おそらくPrefixキーを使ったショートカットはtmuxを使用する人が初期の段階で使うことになリマス。

その際に様々なtmuxを紹介または説明されていらっしゃる記事やサイトではこう書いてあると思います。

『　　**Control＋B**　　』　　と。

至って簡単上記ボタンを同時押ししてそこからウィンドウ作るなりのキー(例:c)を押すだけですね＾＾

でもね僕はここから先に進めなくなってしまいました,,,

なんでだろうとね　ほんとに　割と詳しい友人に聞いてもなんでなんだろうとずっとずっっと唸ってました

# この世界の真実
すみません。　

キーボードの配列をもう一度よく見てください。コントロールキーはどちらにありますか？スペースの左側にあるやんって？

え？なんて？　もう一度よく見渡してください。もう少しであなたはmacの真実に辿り着けますよ。

>左手の小指の横を見て！

ンンンンん？？？？？？？？？

![IMG_3501.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3169027/f6b07177-5ecd-b3f1-0e8f-ce3580a0af10.png)


いるんだなぁこれが　そうこいつです　『**Controlキー君**』ですにっこり

はい！commandじゃありません！Controlです！w

とりあえずmacにキレましょう　以上です。

# 最後に
僕もそうでしたが、この簡単な引っ掛かりにしょうもない時間をかけてしまいました。なんていうかいい経験というか、プログラミングって大変だなぁて感じです。

地道な努力ってやつ。
無線LANルーターを構築してみた

PCって無線LANも有線LANのインタフェースもついてるから、もしかして無線LANアクセスポイントを買わなくても、インターネットにつなげるシステムを構成できるのでは？というのがモチベーション。できた。

システム構成は下図のような感じ。

![勉強2023.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/ab654add-2533-f0b5-2eaa-f716e61d9c4a.png)

設定概要は下図のような感じ。

![勉強2023 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/106d4d25-006d-1f21-cf0d-a543da312fe1.png)

dsl-providerは以下の通り。プロバイダに接続するための設定。

```dsl-provider
noipdefault
defaultroute
replacedefaultroute
hide-password
noauth
persist
plugin rp-pppoe.so eth0
userpeerdns
user “xxxxx@xxxxx”
```

dhcpd.confは以下の通り。10.0.0.200〜254まで動的にIPを割り当てている。

```dhcpd.conf
subnet 10.0.0.0 netmask 255.255.255.0 {
  option routers 10.0.0.1;
  option subnet-mask 255.255.255.0;
  range dynamic-bootp 10.0.0.200 10.0.0.254;
  option domain-name-servers 8.8.8.8, 8.8.4.4;
  option broadcast-address 10.0.0.255;
}
```

hostapd.confは以下の通り。無線LANアクセスポイントデーモンを起動するための設定ファイル。SSIDとパスワードは適宜設定する。

```hostapd.conf
interface=wlan0
driver=nl80211
ssid=xxxxx
hw_mode=g
channel=7
wpa=2
wpa_passphrase=xxxxx
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP
```

rc.localは以下の通り。念の為ufwとPPP接続をやりなおしている。うまくつながったらセキュリティアップデートを実行する。

```rc.local
/usr/sbin/ufw disable
/usr/sbin/ufw enable
/usr/bin/poff dsl-provider
/bin/sleep 5
/usr/bin/pon dsl-provider
/bin/sleep 5
/sbin/ip addr show dev ppp0
if [ $? -eq 1 ]; then
    exit 1
fi
DEBIAN_FRONTEND=noninteractive
(/usr/bin/apt update && /usr/bin/apt upgrade -y) >/tmp/apt_stdout.log 2>&1
exit 0
```

interfacesは以下の通り。インターネット側はppp0（eth0）、内部ネットワーク側はwlan0としている。

```interfaces
allow-hotplug eth0
iface eth0 inet manual
	pre-up /sbin/ifconfig eth0 up
	up ifup ppp0=dsl-provider
	down ifdown ppp0=dsl-provider
	post-down /sbin/ifconfig eth0 down
# The following is used internally only
iface dsl-provider inet ppp
	provider dsl-provider

allow-hotplug wlan0
iface wlan0 inet static
	address 10.0.0.1
	netmask 255.255.255.0
```

before.rulesは以下の通り。eth0、ppp0にIPマスカレードを行う。片方でもいいかも。

```before.rules
*nat
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s 10.0.0.0/24 -o eth0 -j MASQUERADE
-A POSTROUTING -s 10.0.0.0/24 -o ppp0 -j MASQUERADE
COMMIT
```

sysctl.confは以下の通り。ルーティングしたいので転送を有効化する。

```sysctl.conf
 #net/ipv4/ip_forward=1
net/ipv4/ip_forward=1
```
【Laravel】Bladeでボタンを押したときにFormファサードのrouteを決定するJSの処理

Bladeでボタンを押したときにモーダルが開く  
↓  
「はい」か「いいえ」を選択して
「はい」ならフォームファサードで指定したURLに遷移させる処理を書きたかった。

ここで問題なのはforeach文の中に
`モーダル開くボタン`が書かれていることで

`モーダル開くボタン`がたくさん存在する状況ということ。
マジふざけんなと思った。

#### モーダルで送信した情報をフォームファサードで送信する処理
```
{{ Form::open(['id' => 'Form', 'method'=>'POST'])  }}

モーダルの処理
モーダル内でのsubmit

{{ Form::close() }}
```
#### BladeのJS部分
```
<script>
        const modal = document.getElementById('modal名');

        $('.モーダル開くボタン').on('click', function () {

            const form = document.getElementById('Form');
            form.action = '遷移させたいURL';
        });

</script>
```
`モーダル開くボタン`にdata属性として情報を渡していたら
JSの中でその情報を取ってきて遷移したいURLに組み込むことも可能！！
これによってforeachで`モーダル開くボタン`がたくさんある場合でも
idなどで各`モーダル開くボタン`に情報を渡しておけば
ボタンを押したときにrouteが決定される！！

マジでためになった、ただのメモ。
QIITA とは？

chatGPT に聞いてみました

Q: QIITA を評価してください

A:
QIITAは、プログラマーやエンジニアを中心に、技術的な記事や情報共有をするためのオンラインプラットフォームです。以下は私の評価です。

メリット:

オンライン上で簡単に記事を投稿できるため、情報共有が非常に容易であり、学びやすい環境が整っています。
コメントやいいね機能など、アクティブなコミュニティがあり、交流やフィードバックが得られるため、スキルアップにつながる可能性が高いです。
投稿される記事の品質が高く、多様なトピックについて詳細な情報が提供されているため、学習に適しています。
検索機能が優れており、欲しい情報を簡単に見つけることができます。
デメリット:

エンジニア向けの情報共有サイトであるため、一般的なトピックについては情報が少ない場合があります。
プログラミングに特化しているため、ビジネスやマーケティングなど他の分野に関する情報が少ない場合があります。
総合的に見て、QIITAはプログラマーやエンジニアにとって非常に有益であり、学習や情報共有に適しているプラットフォームです。その一方で、他の分野に関する情報が少ないことが欠点として挙げられます。
【Java】Optionalの使い方を勘違いしてた話

本日業務にてOptionalについて勘違いをしていたことに気付いたのでメモ。
Javaを書いていると、nullの安全性の観点からOptionalを使うことは大事だなと思いながらも、完全には理解できておらず、、

# 勘違いしていたケース
Jsonとマッピングする用のRequestBodyのクラスにて、以下のような定義をしていた。

```java:Request.java
@Data
Public class Request {
    Integer hogeId;
    String hogeName;
    Optional<Integer> maxLength; // Optionalで定義
} 
```
上記のケースにて、リクエストで飛ばしたmaxLengthはOptionalでラップされていなかった。
その後request.getMaxLength().isPresent()という書き方をするとヌルポが発生し、気付いた。
getMaxLengthメンバ変数がnullになっていた。。
勝手にこの書き方でいけると思ってた。


実際には、この書き方ではOptionalにラップできないらしい。
Jsonとのマッピングがされないみたい。

# 書き直した
以下のように書き直した。
```java:Request.java
@Data
Public class Request {
    Integer hogeId;
    String hogeName;
    Integer maxLength; // Optionalやめた
    public Optional<Integer> getMaxLength() {
        // getterでOptional型で返すようにした
        return Optional.ofNullable(this.maxLength);
    }
} 
```
上記のように書くことで、無事Optional型にできた。
lombokにて、@Dataによりgetterが自動生成されるが、上記のように設定すると自動生成されないらしい。

ただ、このようにRequestBodyでラップせず、Serviceクラス内でラップするのでも良いのではないかとは思うがどうなのか。。
Julia の弱点

chatGPT に聞いてみました

Q: Julia の弱点は？

A:
Juliaは優れたパフォーマンスと使いやすさを兼ね備えたプログラミング言語ですが、以下にいくつかの弱点があります。

生態系の不安定さ: Juliaは比較的新しい言語であるため、まだ十分な数のライブラリやフレームワークが存在していない場合があります。また、既存のライブラリやフレームワークのバージョン間の互換性が保証されていないことがあります。

ドキュメンテーションの不足: Juliaの公式ドキュメンテーションは充実していますが、一部のライブラリやフレームワークのドキュメンテーションが不足している場合があります。これは特に新しいプログラマーにとって問題になる可能性があります。

コンパイル時間の長さ: Juliaはコンパイルされるため、PythonやRなどのスクリプト言語よりもコンパイル時間が長くなることがあります。これは、小規模な問題では問題になりませんが、大規模な問題を扱う場合にはパフォーマンスに影響を与える可能性があります。

メモリ使用量の増加: JuliaはC++などの低レベルの言語と比較してはるかに使いやすいですが、Pythonなどの高レベルの言語と比較して、同じ問題を解決するために必要なメモリの量が多くなることがあります。

未熟な開発ツール: Juliaの開発ツールやIDEは、PythonやJavaなどのより成熟した言語に比べてまだ未熟な場合があります。これは、開発者が必要とするツールの数が少ないことによるものです。

以上がJuliaの弱点の一部です。しかし、Juliaは非常に優れた言語であり、特に科学技術計算やデータ分析においては高速で使いやすい言語として広く採用されています。
Python の弱点は？

chatGPT に聞いてみました

Q: Python の弱点は？

A:
Pythonは非常に人気があるプログラミング言語であり、多くの場面で優れたパフォーマンスを発揮していますが、いくつかの弱点もあります。以下にいくつか挙げてみます。

パフォーマンスの制限: Pythonは動的型付け言語であり、コンパイル時に型を決定するわけではありません。そのため、コードが実行される際に実行時に型を決定する必要があり、これが実行速度に影響を与えることがあります。また、Pythonはグローバルインタープリターロック (GIL) と呼ばれる仕組みによって、同時に実行されるスレッドが制限されるため、マルチスレッドプログラミングのパフォーマンスが低下することがあります。

メモリ使用量の増加: Pythonは動的型付け言語であり、変数のデータ型を実行時に決定するため、同じ処理をするために必要なメモリの量が他の言語よりも多くなることがあります。

依存関係の問題: Pythonのパッケージ管理システムであるpipを使用する場合、依存関係の問題が発生することがあります。パッケージのインストールやアップグレードに失敗することがあり、問題の解決に時間がかかることがあります。

プログラムの保護: Pythonはオープンソースのプログラミング言語であり、ソースコードが簡単にアクセスできるため、プログラムを保護することが難しいことがあります。

以上のような問題があるため、Pythonはすべての問題に対して最適な選択肢ではない場合があります。しかし、Pythonは汎用的で使いやすい言語であり、多くの分野で広く使用されているため、多くの開発者にとって非常に魅力的な言語です。
Cannot find module './assets/soundOfMetronome.mp3' or its corresponding type declarations.というエラーが発生した時の対処法

初心者の為、原理はわかりませんが、

react-app-env.d.tsファイルに

declare module "*.拡張子"

と記載したところ、解決。

投稿者は拡張子mp3の音声ファイルを出力したため、

declare module "*.mp3"

と記載。
npmパッケージのバージョン指定について

恥ずかしながらちゃんと理解してなかったので調べました
### package.jsonのバージョン指定
```package.json
"dependencies": {
    "express": "~4.16.1",
    "mongodb": "^5.0.1",
}
```
このチルダ(~)とキャレット(^)の違いって何よ。。。
### こういうこと
チルダ `~4.16.1`は「4.<font color="red">16.0</font> <= インストールバージョン < 4.<font color="red">17.0</font>」ということ
キャレット`^4.16.1`は「<font color="red">4.0.0</font> <= インストールバージョン < <font color="red">5.0.0</font>」ということ

### package-lock.jsonとの関係性

package.jsonで指定したバージョンは`npm install`を実行したタイミングでインストールされるバージョンが異なる可能性があります。
また、package.jsonのインストール対象がさらに別のnpmモジュールに依存していた場合、その依存モジュールのインストールされるバージョンまで異なる可能性があります。

package-lock.jsonとは、package.jsonを元に実際にインストールされたnpmパッケージのバージョンと、依存関係を管理しているファイルとなります。
package-lock.jsonがあれば、チルダ、キャレットに関わらずpackage-lock.jsonに記述されたバージョンをインストールするようになります。
そのため、チーム開発をしている場合、人によって、`npm install`を実行するタイミングで微妙にバージョンが異なります。というのはなくなります。
リリースも同様ですね。リリースするたびに微妙にインストールされるnpmパッケージが異なります。ってのは普通に嫌ですね。

また、優先度ですが下記のようです。
　①pakcage.jsonとpackage-lock.jsonに差がある → package.jsonに従う（あるパッケージをバージョンアップしたときなど）
　②package.jsonとpackage-lock.jsonに差がない → pakcage-lock.jsonに従う（通常時はこれですかね）
　③package-lock.jsonがない → package.jsonに従う。package-lock.jsonは新規で作成される（最初にnpm installするとき）
　④package.jsonがない → エラー（まあ、当たり前ですが、、、気になったので試してみました）

いままで超いい加減で、うまくいかなかったら一回削除して`npm install`しなおせばうまくいくやつという謎の認識でしたが、
更新されたpackage-lock.json普通にコミットしてたな。。。気を付けます。。。
VSCode上にJavaの実行環境を作る【Win11環境】

Recursionのエディターに書いたプログラムもPRに使いたいなーと思って調べてみました。
これでJavaを使ってバックエンドを組めるようになればいいな笑

## 公式サイトからJDKをインストール

下記よりDL→インストール。

※JDK ...... JavaSE Development Kit

https://www.oracle.com/jp/java/technologies/downloads

![Java Downloads _ Oracle 日本 - Google Chrome 2023-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530037/77da5b68-73fd-9653-a9bb-b85bfaeed53c.png)

## PATHを通す

Javaのコンパイル・実行に必要なコマンドを、どのディレクトリ下でも使用可能にします。

### JDKのbinフォルダのパスをコピー
インストール先のパスを調べます。
特に設定していなければ下記のようになっているはず。
```
例）
C:\Program Files\Java\jdk-19\bin
```

### システム→バージョン情報→システムの詳細設定

![Image 2023-02-21 15.55.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530037/fe73bf40-48bc-bf5b-4f6b-f8d895ad8e55.png)

![設定 2023-02-21 15.58.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530037/0fdd5172-a55d-fd70-a626-fa49e9fb813b.png)

### 詳細設定タブ→環境変数→Pathを選択→編集→新規
![システムのプロパティ 2023-02-21 15.59.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530037/977b4d61-06b1-990d-f7f5-af4892825c0d.png)


![環境変数 2023-02-21 16.09.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530037/da13a45c-c9b7-616b-d967-4bf0c91d20f8.png)

![環境変数名の編集 2023-02-21 16.10.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530037/c6a54ec0-3e9e-9ecf-b153-bebc01aa1703.png)

## VSCode上での設定

### ディレクトリ構成
今回は下記のように構成しました。

**※ファイルの中身については私自身も学習中です。コピペでの使用は自己責任でお願いします。**

https://github.com/hirotada-t/design_pattern.git

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530037/f9d4dd91-2dcb-c7ca-3585-95ae722f2c6f.png)

### 実行コマンド
実行するJavaファイルを選択して、
```
Shift + Ctrl + B
```
を入力してください。

## トラブルシューティング

大まかな解決方法ですので、情報が正確でない可能性があります。
詳細は自分で調べましょう。

### エラー：javac' は、コマンドレット、関数、スクリプト ファイル、または操作可能なプログラムの名前として認識されません。
→下記について確認してみてください。
- パスが通っていない（上記の操作を確認）
- JDKがインストールできていない
- VSCodeを再起動する
- PCを再起動する

### エラー：メイン・クラスPlayfulPetsAdventuresを検出およびロードできませんでした。
→ファイル名と同じ名前のクラスにメインの処理を書く必要があります（Javaの仕様）。

![VirtualRides.java - DesignPattern - Visual Studio .png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530037/1c352131-b100-7539-bf83-ea47d3e3b4a6.png)

### エラー: ~\.vscode\tasks.jsonは無効なフラグです。
→VSCode上で、Javaファイルではなく、tasks.jsonファイルが選択されています。
PHP：phpmdを導入してコードの問題をチェックする

# 役割；　バグやバグの温床になるコードを検知する

+ バグの検知
+ 汚いコードの検知
+ 複雑なコードの検知
+ 使用していない引数や関数の検知


# composer.jsonを編集（ない場合はPHP_CodeSnifferを参照）

require-devの欄を以下にする。先に入れていたPHP_CodeSnifferの指示の後ろに追記する。
元々のソースは当然公式から得た。

```json
"require-dev": {
        "squizlabs/php_codesniffer": "3.*",
        "phpmd/phpmd" : "@stable"
    },
```

# Composerを更新（アップデート）する

Composerをインストールしていない場合のコマンドは、
```
composer install
```

すでにComposerをインストールしている場合は、
```
composer update
```

# 注意点：　phpmdが存在しないと表示される

公式でやり方を確認して一度やって見れば、特にComposerもインストールしてあればとても簡単だが、インストールが正常にされているかをコマンド等で確認すると、なぜか存在しないメッセージが表示される。
結論としては、インストールされており、正常に動作する。混乱しやすい部分があるので注意。
[ポエム]AWSでコンテナを使うときはAmazon ECR Public Gallery を使おう

# AWSでコンテナを使うときはAmazon ECR Public Gallery を使おう

## はじめに

docker環境でAWS CLIを構築しようとした時にalpineベースで構築しようとしてめちゃくちゃ詰まりました。AWS CLIの細かい仕様を知らなかったばかりに結構時間を使ってしまったので戒めとして記事を書きます。

alpineを使用する要件があるのであれば、それに従うしかありません。
しかし、特に事情がないのであれば、`Amazon Linuxのイメージ`を利用しましょう。

## 結論

特別な理由がない限りはalpineではなく、`Amazon ECR Public Gallery`にある`Amazon Linuxのイメージ`を使いましょう。
※devcontainer(VSCodeの拡張機能)でAWS CLIを使う場合は特に

https://gallery.ecr.aws/

## 理由

alpineはAWS CLIのインストール要件を一部満たしていません。
インストール要件を満たす為に別途、必要なパッケージをインストールする必要があります。

必要なパッケージというのは
具体的にはalpine が利用している標準のCライブラリは`musl libc`
AWS CLI バージョン 2 では glibc、groff、および less です。

また、EC2からECSなどに切り替える際には`Amazon Linux イメージ`を利用することで
ほぼ互換のある環境で動作確認ができます。

## 参考

https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/getting-started-install.html
極限と級数「2022電気通信大学後期【５】(ⅲ)」をwolframalphaとsympyでやってみたい。


グラフがでません。wolframalphaで計算だけできました。

オリジナル

http://kamelink.com/blog/2023/02/19/15-1-22-denkitsushindai-kou-5-1-3/

上と同じです。大学入試数学問題集成＞テキスト

https://mathexamtest.web.fc2.com/2022/202210271/2022102710200mj.html#top-0205


# wolframで
グラフがでません。

https://www.wolframalpha.com/input?i=Sum%28%28n**2*k%2Bn**3%29%2F%28k**4%2B2*n**2*k**2%2Bn**4%29%2C+%28k%2C1%2Cn%29%29&lang=ja

上と同じつもりが...

https://www.wolframalpha.com/input?i=y%3DSum%28%28%EF%BD%8E**2*k%2B%EF%BD%8E**3%29%2F%28k**4%2B2*%EF%BD%8E**2*k**2%2B%EF%BD%8E**4%29%2C+%28k%2C1%2C%EF%BD%8E%29%29&lang=ja

?ディガンマ関数...？専門家の方へお願いします。
https://ja.wikipedia.org/wiki/%E3%83%87%E3%82%A3%E3%82%AC%E3%83%B3%E3%83%9E%E9%96%A2%E6%95%B0
https://en.wikipedia.org/wiki/Digamma_function

**極限**
以下が、解答です。

https://www.wolframalpha.com/input?i=lim_%28n-%3Eoo%29%E3%80%80Sum%28%28%EF%BD%8E**2*k%2B%EF%BD%8E**3%29%2F%28k**4%2B2*%EF%BD%8E**2*k**2%2B%EF%BD%8E**4%29%2C+%28k%2C1%2C%EF%BD%8E%29%29&lang=ja

展開された形
1/2 + π/8

# sympyで(区分求積法を用いる．)
勉強中

# sympyで(困った時のsimplifyで計算もできませんでした。）
```python
from sympy import *
k,n= symbols("k,n", positive=True,Integer=True)
y=Sum((n**2*k+n**3)/(k**4+2*n**2*k**2+n**4), (k,1,n))
print("#",y)
print("#",Limit(y.simplify(),n,oo))
# Sum((k*n**2 + n**3)/(k**4 + 2*k**2*n**2 + n**4), (k, 1, n))
# Limit(n**2*Sum((k + n)/(k**4 + 2*k**2*n**2 + n**4), (k, 1, n)), n, oo, dir='-')
```

# 参考

Limits

https://docs.sympy.org/latest/tutorials/intro-tutorial/calculus.html#limits

https://funmatu.wordpress.com/2017/10/02/sum%E3%81%A8summation%E3%81%AE%E9%81%95%E3%81%84%E3%81%A3%E3%81%A6%E3%81%AA%E3%82%93%E3%81%A0%E3%82%8D%E3%81%86/
paiza.ioでelixir その189

# 概要
paiza.ioでelixirやってみた。
defmacro使ってみた。

# サンプルコード

```


#defmodule QuoteTest do
#  def hoge do
#    IO.puts 'hoge だよ'
#  end
#end

defmodule QuoteTest do
    defmacro hoge do
        quote do
            IO.puts 'hoge だよ'
        end
    end
end

#defmodule UnquoteTest do
#  def hello do
#    IO.puts 'こんにちは'
#  end
#end

defmodule UnquoteTest do
    defmacro hello do
        quote do
            IO.puts 'こんにちは'
        end
    end
end

defmodule UnquoteTest do
    defmacro hello do
        name = 'test'
        quote do
            hello = "こんにちは #{unquote(name)}"
            IO.puts(hello)
        end
    end
end

#defmodule UnquoteTest do
#  def hello do
#    hello = "こんにちは test"
#    IO.puts(hello)
#  end
#end

#defmodule UnquoteTest do
#  def hello do
#    hello = "こんにちは #{name}"
#    IO.puts(hello)
#  end
#end

defmodule MacroTest do
    Enum.each ['mike', 'alice', 'bob'], fn name ->
        def unquote(:"hello_#{name}")() do
            IO.puts("hello #{unquote(name)}")
        end
    end
end

defmodule MyMacro do
    defmacro unless(expr, do: block) do
        quote do
            if !unquote(expr), do: unquote(block)
        end
    end
end

defmodule MyTest do
    defmacro read(var) do
        quote do
            v = unquote(var)
            IO.inspect v
        end
    end
    defmacro bind(var, value) do
        quote do
            unquote(var) = unquote(value)
        end
    end
    defmacro macro(param) do
        param
    end
end

defmodule Main do
    require QuoteTest
    QuoteTest.hoge()
    #hoge だよ
    #:ok
    require UnquoteTest
    UnquoteTest.hello()
    #こんにちは test
    #:ok
    require MacroTest
    MacroTest.hello_mike
    #hello mike
    #:ok
    require MyMacro
    MyMacro.unless true, do: "Hello"
    |> IO.inspect
    #nil
    MyMacro.unless false, do: "Hello"
    |> IO.inspect
    #"Hello"
    require MyTest
    foo = 1
    MyTest.read(foo) #=> 1
    MyTest.bind(foo, 5)
    foo #=> 5
    |> IO.inspect
    MyTest.macro(1 + 2)
    |> IO.inspect
end



```

# 実行結果

```
hoge だよ
こんにちは test
hello mike
"Hello"
1
5
3
```

# 成果物

https://paiza.io/projects/P9YDOZOr8LgtWhlfJ46b0w


以上。
フィクションなどから拾う情報処理用語 その34 再利用 (ジャイアントロボと仮面ライダー)

東映チャンネルや東映特撮ファンクラブで色々な番組を観ていて気がついた事をこの記事では書く。

まずジャイアントロボ 第11話「恐怖の人喰い砂」(脚本：伊上勝、監督：田口勝彦、技斗：久地明)の話をしよう。

ユニコーンの南極支部が流砂に襲われる事件が起きた。
その調査にユニコーンのニューヨーク本部からの指令で日本支部が当たることになった。
そして草間大作ことU7と南十郎ことU3が出動することになった。
何かがおかしいような気がするのだが、そこは東映特撮番組 アーンド 伊上勝脚本である。
第21話「ミイラ怪人」(脚本：伊上勝、監督：田口勝彦、技斗：久地明)で何気にジャイアントロボはマッハ17で宇宙を飛ぶのであーる。凄すぎる速さだぞ。これだけで適当な作りであることがわかるだろう。
だから気にしては行けない。問題はここからだ。

出動を志願したU7にマリー 花村ことU6がこう言った。

U6「大作君、お願い。」
U7「女の子は連れて行けない。」

ジェンダーフリーの観点から見ると明らかに酷い理屈だがこの話が放送されたのは1967年12月20日。(恐ろしいことに)既におばさんになってしまった森高千里が生まれる前。半世紀以上も前なのだ。そういう時代だったのである。本当の問題はここからだ。

U6「うーうん、違うの。あたしまだ雪って見たことがないの。お土産に雪持ってきて。」

えーと、U6はニューヨークにあるユニコーン本部から派遣された人である。ニューヨークでも雪は降る気がするのだが…だが今回問題なのはこれでもない。本当の問題はここからだ。

U7「冗談じゃない。僕達は南極見物に行くんじゃないんだぞ。」
U3「まあまあ、U7。マリーちゃんのためじゃないか。」

これも別に問題ではない。本当の問題はここからだ…何回、この言葉を使ったのかねえ。

U6「じゃあ、あたしのお守り持ってって。」

と言ってU6はペンダントを出してU7の首にかけた。

!!!

ここで私はあることに気がついたが、とりあえずそれは置いといて、U7はこういった。

U7「ちぇ、こんなお守り。僕のお守りはこれさ。」

U7はジャイアントロボに指令(「ロボ、がんばれ!」のように適当極まりないものが実に多いが)を出すための腕時計型の発信機を示した。

とりあえず、先へ進もう。話は一気に1971年5月29日に飛ぶ。
仮面ライダー 第9話「恐怖コブラ男」(脚本：山崎久、監督：山田稔、技斗：高橋一俊)が放送された。日本の金保管所が襲われた。そのニュースを知り、城南大学の助手(に過ぎないのだが)の本郷猛は立花藤兵衛が営むスナックアミーゴへオートバイを走らせていた。ノーヘルで藤岡弘、が運転している本郷猛である。

本郷猛「今度の事件もきっとショッカーの仕業だ。奴らの目的は?」

あれ? 声が藤岡弘、のものではないぞ。実は藤岡弘、はこの話の撮影最中にオートバイ事故を起こしてしまい、番組どころか自身の俳優生命をも危うくなりかねない重傷を負って入院していた。なので声は納谷六朗さんが当てている。のちの「クレヨンしんちゃん」で組長先生もとい園長先生を演じた方でなんとショッカー首領を演じた納谷悟朗さんの弟である。なお、後の第66話と第67話ではこれまた別の理由で仮面ライダーの声を市川治が当てており、その話では本郷猛は一切出ない…のだが今回問題なのはこれでもない。本当の問題はここからだ。

スナックアミーゴでは偶然にも(としか言いようがない)立花藤兵衛が小林昭二の私物のパイプから煙を出しながらこう言っていた。

立花藤兵衛「次々に世界各国の金を狙っているとすると、(脇で腕組みしているアルバイトの緑川ルリ子の方を向き直して)その目的は地球の征服だ。」

本当か? …だが今回問題なのはこれでもない。本当の問題はここからだ。

緑川ルリ子「だとすれば、これは一大事ね。」

なお脇では島田陽子演じる野原ひろみがカウンターの中で食器を洗っていた(ように見えた)。島田陽子は藤岡弘、と同じ事務所で、なんと藤岡弘、とバーターの形で起用されたらしいのだが、元々近藤正臣が本郷猛を演じる予定だった時は緑川ルリ子には島田陽子が配役されていたので、その説は間違っているような気がする…だが今回問題なのはこれでもない。本当の問題はここからだ。

大好き(絶対そうでしょう)な本郷がやってきて緑川ルリ子は微笑みながら迎えた。

ルリ子「いらっしゃい。」

いつの間にか後に消えた史郎を含めた他の人も「いらっしゃい」と言った。

藤兵衛「ルリちゃん、これ。」

藤兵衛は首に手をやり合図した。ルリ子は奥に入った。

本郷「ひろみ君、コーヒー。」
ひろみ「はい。」

本郷はカウンターに置いてあった新聞を取り上げ、

本郷「立花さん。」

そう、この頃は「おやっさん」とは呼んでおらず、こう呼んでいたのだ…だが今回問題なのはこれでもない。本当の問題はここからだ…何回書いたんだ、この言葉?
閑話休題。

藤兵衛がドアップになった。

藤兵衛「猛、行くか? 金保管所へ。」

本郷がドアップになった。

本郷「ええ。今度こそはきっとショッカーの尻尾を捕まえます。」

本郷の前のめりな姿勢はU7と似ているが、一応、これは偶然だと思う。出動前なので興奮しているのだろう。問題は次。緑川ルリ子が何かを持ってきた。

ルリ子「はい。」

あれ、手に持つのはペンダント。形は違うがペンダントだ。それに気がついた…訳ではなかったのだろうが、本郷は疑問に思ったのは確かだ。

本郷「これは?」
ルリ子「ロケットの中にお守りが入っているの。」

!!!!!

どこかで聞いたような言葉である。ルリ子は本郷の首にペンダントをかけた。差分の一つは

藤兵衛「は、は、は、は、は、は。猫の首に鈴だよ。」

である。もうお分かりであろう。

そう。ジャイアントロボ 第11話「恐怖の人喰い砂」(脚本：伊上勝、監督：田口勝彦、技斗：久地明)と仮面ライダー 第9話「恐怖コブラ男」(脚本：山崎久、監督：山田稔、技斗：高橋一俊)は同じネタを使用しているのだ。東映制作が共通点というだけではない。実は山崎久というのは田口勝彦さんのペンネーム。役割は違えど、田口勝彦さんが両方とも関わっているのである。

さてここからは私の仮説に過ぎない。おそらく山崎久こと田口勝彦さんは仮面ライダー 第9話「恐怖コブラ男」(脚本：山崎久、監督：山田稔、技斗：高橋一俊)の脚本を書くにあたってジャイアントロボ 第11話「恐怖の人喰い砂」(脚本：伊上勝、監督：田口勝彦、技斗：久地明)を参考にしたのではないだろうか。そう考えられるのである。ただし現段階ではあくまでも私の仮説に過ぎない。

さて両者の差分については映像で確認してほしい。両方ともペンダントが何らかの形で活躍するのであーる。
Azure CLIでCache for RedisのRDBバックアップを後から有効にする方法

# はじめに
「Cache for Redis のRDBバックアップをPortalではなくCLIで後から設定したい！」
という事があったんですが、Azureに無知で若干ハマってしまったので備忘録的に書いていきたいと思います。

# 先に答えから

```bash:
az redis update --name MyRedisCache --resource-group MyResourceGroup --set "redisConfiguration.rdb-storage-connection-string"="DefaultEndpointsProtocol=https;BlobEndpoint=<blob-endpoint>;AccountName=<storage-name>;AccountKey=<account-key>" "redisConfiguration.rdb-backup-enabled"="true" "redisConfiguration.rdb-backup-frequency"="15" "redisConfiguration.rdb-backup-max-snapshot-count"="1"
```

# 方法

まずはドキュメントを確認します。

https://learn.microsoft.com/ja-jp/cli/azure/redis?view=azure-cli-latest#az-redis-update

```bash:update
az redis update [--add]
                [--force-string]
                [--ids]
                [--name]
                [--remove]
                [--resource-group]
                [--set]
                [--sku {Basic, Premium, Standard}]
                [--subscription]
                [--vm-size {c0, c1, c2, c3, c4, c5, c6, p1, p2, p3, p4, p5}]
```

…なるほど。
次にRDBバックアップを設定するコマンドがこちら。

```bash:update --set
az redis update --name MyRedisCache --resource-group MyResourceGroup --set "redisConfiguration.rdb-storage-connection-string"="BlobEndpoint=https//..." "redisConfiguration.rdb-backup-enabled"="true" "redisConfiguration.rdb-backup-frequency"="15" "redisConfiguration.rdb-backup-max-snapshot-count"="1"
```

ここで自分は`redisConfiguration.rdb-storage-connection-string=`の指定がわからずハマりました。

```bash
"redisConfiguration.rdb-storage-connection-string"="BlobEndpoint=https//..."
```

さらに公式のドキュメントをさらに漁ってみたところ正解が分かりました。

https://github.com/MicrosoftDocs/azure-docs.ja-jp/blob/master/articles/storage/common/storage-configure-connection-string.md

`rdb-storage-connection-string`の指定は以下のような形式にするみたいです。

```
"DefaultEndpointsProtocol=https;BlobEndpoint=<BlobEndpoint>;AccountName=<storage-name>;AccountKey=<account-key>"
```

中で複数指定しているものの中身はこんな感じ。

```bash:BlobEndpoint
https://<storage-account-name>.blob.core.windows.net/
```

```bash:AccountName
<storage-account-name>
```

```bash:AccountKey
<storage-primary-access-key>
```

なので、コマンドとしては、下記のようになります。

```bash:
az redis update --name MyRedisCache --resource-group MyResourceGroup --set "redisConfiguration.rdb-storage-connection-string"="DefaultEndpointsProtocol=https;BlobEndpoint=<blob-endpoint>;AccountName=<storage-name>;AccountKey=<account-key>" "redisConfiguration.rdb-backup-enabled"="true" "redisConfiguration.rdb-backup-frequency"="15" "redisConfiguration.rdb-backup-max-snapshot-count"="1"
```

以上です。



# さいごに
誰かの参考になれば嬉しいです！
Go言語のcopyについて

Go言語のcopy関数は、配列、スライスの要素をコピーするために使用されます。以下に、copy関数を使用したサンプルコードを記載。

```go: golang sample
func main() {
    // 元となるスライスを作成する
    src := []int{1, 2, 3}

    // コピー先のスライスを作成する
    dst := make([]int, len(src))

    // srcの要素をdstにコピーする
    copy(dst, src)

    // srcとdstを出力する
    fmt.Println(src) // => [1 2 3]
    fmt.Println(dst) // => [1 2 3]
}
```

この例では、copy関数を使用して、srcスライスの要素をdstスライスにコピーしています。copy関数は、第1引数にコピー先のスライス、第2引数にコピー元のスライスを指定します。また、dstスライスを作成する際に、len関数を使用してsrcスライスの長さと同じ長さのスライスを作成しています。

copy関数のTiptsとしては、コピー先のスライスは、コピー元のスライスと同じ型である必要があります。また、copy関数でコピー先のスライスを指定した場合、コピー元のスライスの要素数がコピー先のスライスの要素数よりも多い場合、コピー先のスライスには最初の要素からコピー先のスライスの要素数分だけ要素がコピーされます。逆に、コピー元のスライスの要素数がコピー先のスライスの要素数よりも少ない場合、コピー先のスライスにはコピー元のスライスの要素が最初の要素から順番にコピーされます。

copy関数は、スライスや配列の要素をコピーする場合に便利な関数です。スライスの要素を別のスライスにコピーする場合、copy関数を使用することで、スライスの要素を簡単にコピーすることができます。

### スライスの一部をコピーする場合
元のスライスの一部の要素を新しいスライスにコピーする場合、copy関数を使用することができます。例えば、元のスライスから一部の要素を抽出して、新しいスライスを作成する場合に使用します。

```go: golang sample
a := []int{1, 2, 3, 4, 5}
b := make([]int, 3)
copy(b, a[1:4])
```

上記の例では、元のスライスaから、インデックス1から4の範囲の要素をコピーして、新しいスライスbを作成しています。

### スライスの内容を変更する場合
スライスの要素を変更する場合、copy関数を使用することができます。元のスライスを変更せずに、新しいスライスを作成し、新しいスライスの要素を変更することができます。例えば、スライスの要素を逆順に並び替える場合に使用します。

```go: golang sample
a := []int{1, 2, 3, 4, 5}
b := make([]int, len(a))
copy(b, a)
for i := 0; i < len(b)/2; i++ {
    j := len(b) - i - 1
    b[i], b[j] = b[j], b[i]
}
```

上記の例では、元のスライスaから新しいスライスbを作成し、新しいスライスbの要素を逆順に並び替えています。

copy関数は、元のスライスを変更せずに、新しいスライスを作成することができるため、スライスの要素を変更する場合に有用です。

https://pkg.go.dev/builtin#copy
プログラミングに係る際に意識して欲しいこと

## 目的
「プログラミングとは」と銘打っていますがそんなたいそうなものではなくプログラミング/ソフトウェア開発に係わるひと/初心者へ、私の経験をもとに開発にかかわる際どんなことを意識して欲しいのかや、開発する際にどんなことを考えるのかについて話していきたいと思います。
(最初は何かくか決めてなかった)

---
## About me

handle name: kigawa
GitHub: https://github.com/kigawa01
organization: [OneServer](https://twitter.com/OneServerMC),[Pixelsia](https://twitter.com/Pixelsia_JP),[kigawa-net](https://github.com/kigawa-net)

* java/kotlin 2年
* PHP/typescript 1年
* C#/go 半年

業務経験としてはwebサイトとwindowsのアプリケーションで連携したシステムなどを作成したことがあります・

最近は主にminecraftのpluginの作成やminecraftの改造のほかライブラリやコンソールアプリなどを作成しています。

---
## 意識して欲しいこと
開発に係る際に意識して欲しいことは主に4つあります。

1. 行間を読まない/含めないこと
1. わからないことはわからないということ
1. 言葉の意味を考えること
1. 簡単な答えだけを求めない
2. バグは起きるもの
3. 修正/変更は大変


---
## 行間を読まない/含めないこと
会話などの際に行間を読んだり、含めたりしないでください。単純に理由が知りたくて質問しているのに詰められてると感じてしまう人が良くいますが、そんなことはありません。
逆に、相手に察してもらおうとしても伝わらないのではっきりといってほしいです。

---
## わからないことはわからないということ
開発に関することはすべてを知ることが不可能なほど様々な知識や、物があるので、無知を恥だと思わず素直にわからないことはそういってください。
取り繕ってもばれますし、大事な場面でのミスにつながりかねないのでやめてください。

---
## 言葉の意味を考えること
たまにコードのミスや変数なども命名の指摘に対して「細かいことはどうでもいいでしょ(意訳)」といった返事が返ってくることがあります。
しかし、プログラムというものは「,」と「.」では全く意味が違いますし、「A」と「a」でも全く違うものとして扱われます。そして変数などの名前が適当なプログラムはとても分かりにくく、直せるバグも直せなくなってしまうほか、かかる時間もどんどん増えていきます。
ですので変数などの名前もよく単語の意味を考えてつけてください。

---
## 簡単な答えだけを求めない
例えばコードを書いていて何かしらのエラーが発生した際、どこに何を書けばそれが治るのかを聞く人がいます。しかし問題はそんなに単純には解決できないことがほとんどですし、聞かれた側にも大きな能力/労力を要します。そして、プログラミングのうちそれをすると何が起きるかという知識は教えることができますが、それを組み合わせて作るのはあなたにしかできません。どこに何を書けばいいのか事細かに教えてもらうという行為はプログラミングを教えてもらっているのではなく、ただ代わりにキーボードを打っているだけです。

---
## バグは起きるもの
バグはないのが普通だと思わないでください。皆さんがよく知ってるものにもバグはありますし、それを感じられずにいるのは開発している人の多大な努力のおかげです。

---
## 修正/変更は大変
プログラムの挙動が少しだけ違うからと言って修正/変更が簡単になるわけではありません。場合によっては機能を一つ追加するのにほぼすべて作り直す必要があることもあり得ます。
そんな修正/変更は開発者と相談しながら開発期間を決めたり、内容を決めたりしてください。

---
## 開発する際考えること

開発 = コードを書くことではありません。
開発では、ユーザーにとって使いやすいのはどんなソフトウェアか、今後のメンテナンス(※後ほど説明します)がしやすいのはどんなコードか、ほかの人が開発しやすいのはどんなコードかなど、いろいろなことを考える必要があります。

ただ単純にコードを書くだけでなく、これらを考えることでよりよく、より早く、ソフトウェアを作ることができます。

---
## ユーザーにとって使いやすいソフトウェアとは
ユーザーの要望通りに作ることは使いやすいソフトウェアを作ることではありません。ほとんどの場合においてユーザーは、どのように作ると使いやすいのか知りませんし、人によって答えも変わってきます。

例えば、ユーザーの要望道理に作っていると、機能がどんどん増えていくことがあります。機能が増えることはいいことだと思う人もいるかもしれませんが、そうではありません。
AdobeのPhotoShopを想像してみてください。機能がたくさんあって使いこなすまでにたくさんの労力がかかります。それを使いこなすことが大変なソフトウェアは使いやすいソフトウェアとは言えません。

しかし例外もあります。PhotoShopなどは使いこなすことができればとても有用でその学習するだけの価値があります。ただ、ほとんどの場合においては、それだけの価値を提供できないうえ、結局誰もその機能を必要としていないこともあります。

これ以外にもUIや導線など、使いやすいのはどんな風なのか考えながら作っていきます。

---
## メンテナンスとは
ソフトウェアが完成したとしても、それで終わりではありません。
場合によってはそれをサーバーで動かし続ける必要がありますし、まだ見つかっていないバグが見つかったり、外部の変更によって動かなくなる可能性もあります。
そんな場合にもソフトウェアを動かすことができるように更新することなどをメンテナンスといいます。

---
## 最後に
普段開発者でない人と何かを作ったり、初心者の人に少し教えることがあるのですが、開発者とそうでない人の認識の差を感じていたので、それが少しでも埋まってくれたらうれしく思います。
Gitでよく使うコマンドまとめ


業務でGitを使う機会が増えてきたため、
意味をおさらいしつつ、個人的によく使うコマンドをまとめました。

思い出した順番で載せていきます…。

## git status
ワーキングツリーの状態を表示するコマンド。
ワーキングツリーで未追跡のファイルや、変更があったファイルがあると教えてくれる。

addの前や後などにちょくちょく使用しています。

## git log
コミットやマージの履歴を表示するコマンド。
これもgit statusと同じような感覚で使用します。

## git diff
差分を表示してくれるコマンド。
自分の変更した箇所を確認する時に使用します。addやcommitの前に使うと◎

オプションを使えば、比較する対象を色々指定できるみたいですが、私はまだdiffしか使用していません。

## git add . ＆ git commit -m "○○○○"

ワーキングツリーにあるファイルをまとめてステージングするコマンドと、変更を確定するコマンドです。

オプションについて↓↓↓

addは` . `を使うことで、一つ一つファイルを選択する手間と、それによるミスを防げます。

commitを行う際にはコミットメッセージを書くのが習わし(らしい)で、そのコミットメッセージを書くためのオプションが、`-m "○○○○"`です。
○○○○の部分には、コミットメッセージを書きます。

例)　`git commit -m "#1 Qiitaのタイトルを修正"`

## git pull

リモートブランチからローカルブランチに変更を取り込むコマンド。
`git fetch`と、`git merge origin/master`を同時に行うコマンドなので、←を一つずつ実行してもOK。

実行タイミング：
①リモートのマスターブランチが更新された時 …自分のマスターブランチへプル
②プッシュを行う前 …プッシュしようとしているブランチへプル


## git push -u origin [ブランチ名]

リモートリポジトリにプッシュする際のコマンド。
リモートにまだブランチがない場合、このコマンドを実行することで新規リモートブランチを作成してくれる。
※originはリモートのブランチを示す。

`-u`をつけることで、リモートブランチとローカルブランチが紐づけられ、以降`git push`と打つだけで当該ブランチにプッシュを行ってくれる。

最初のプッシュ(リモートにまだブランチがない状態)の時に実行すると◎

## git switch -c [新しいブランチ名]
新しくブランチを切り、そのブランチに移動するコマンド。

`git swich [ブランチ名]`だけ使用すると、ブランチの移動だけ行えます。

似たような機能を持つコマンドに、
`git checkout -b [新しいブランチ名]`があります。
こちらでもブランチを切ってそこへ移動することができます。

## git checkout .
コミット前の変更を破棄するコマンド。
間違って変な場所を変更してしまったかもしれない！という時に使います。
Gitはほんの少しの差異でも変更と認識して、コミットやらチェックアウトやらで片付けるまでブランチの移動を許してくれません。
`.`オプションで、すべてのファイルの変更を破棄してくれます。

<br>

****
以上、使用頻度の高いコマンドをまとめてみました。

~~コンフリクトなんか起こらず、使用するコマンドがこれだけで済めばいいなぁ…。~~
ServiceLoader

ServiceLoaderを使って、interfaceにclassをloadさせる
Provide-configurationにどのclassをloadするかを設定する

```Hello.java
package sampleproject;

public interface Hello {
    public String hello();
}
```
```HelloImple.java
package lib;
import sampleproject.Hello;

public class HelloImpl implements Hello {
    @Override
    public String hello() {
        return "Hello, SPI!";
    }
}
```
```SampleProject.java
package sampleproject;

import java.util.Iterator;
import java.util.ServiceLoader;

public class SampleProject {
    public static void main(String[] args) {
        Iterator<Hello> hellos = ServiceLoader.load(Hello.class).iterator();
        while(hellos.hasNext()) {
            Hello h = hellos.next();
            System.out.println(h.hello());
        }
    }    
}
```
provider-configuration
sampleproject.Helloというinterfaceにlib.HelloImpleをセットすることを意味する
```META-INF\services\sampleproject.Hello
lib.HelloImpl
```
provider-configurationもclass-pathに含めるために事前にjar化
```
C:\Users\java\Documents\NetBeansProjects\SampleProject>jar cvf impl.jar build\classes\META-INF\services\sampleproject.Hello build\classes\lib\HelloImpl.class
マニフェストが追加されました
build/classes/META-INF/services/sampleproject.Helloを追加中です(入=13)(出=15)(-15%収縮されました)
build/classes/lib/HelloImpl.classを追加中です(入=394)(出=263)(33%収縮されました)

C:\Users\java\Documents\NetBeansProjects\SampleProject>java -cp build\classes;impl.jar sampleproject.SampleProject
Hello, SPI!
```
AWSでドメイン取得 & SSL証明書取得

:::note warn
EC2にWebシステムは開発済みの前提です。
:::

# ドメインの取得
1. AWSコンソールからRoute 53へ移動
2. Route 53 ダッシュボードからドメインの登録をクリック
3. 取得したいドメイン名を入力・カートに入れ、続行をクリック
4. 各項目を入力し、次へ
5. 注文を完了をクリック
6. 保留中のリクエストに購入したドメインが入っていることを確認
# SSL証明書の取得
1. AWSコンソールからCertificate Managerへ移動
2. 証明書をリクエストへ移動
3. 証明書タイプ：パブリック証明書をリクエストを選択し、次へ
4. 完全修飾ドメイン名に先ほど取得したドメインを入力、この証明書に別の名前を追加をクリックし、「*.ドメイン名」を入力し、リクエストをクリック
5. AWSコンソールからRoute 53へ移動
6. ドメイン名をクリックし、レコードを作成
7. 以下それぞれ入力
    レコード名：認証書ページのCNAME名
    レコードタイプ:CNAME
    値:認証書ページのCNAME値
# ロードバランサの作成
1. AWSコンソールからEC2へ移動
2. 左部メニューのターゲットグループをクリック
3. create target groupをクリック
4. Choose a target typeで、Instancesを選択、ターゲットグループ名を入力しNext
5. インスタンスを選択し、Include as pending belowをクリック
6. Create target groupをクリック
7. 左部メニューのロードバランサーをクリック
8. Create load balancerをクリック
9. Application Load BalancerInfoの、Createをクリック
10. ロードバランサー名を入力、VPCを選択、Mappingsで1-a、1-dを選択し、Subnetはそれぞれのpublic ipを選択
11. Listnerで、HTTPのDefault actionを先ほど選択したターゲットグループを選択、Add listnerをクリックしHTTPSを追加、Default actionは先ほど選択したターゲットグループを選択
12. Default SSL/TLS certificateで、作成したSSL証明書を選択
13. Create load balancerをクリック
# ドメインとロードバランサーを紐付け
1. AWSコンソールからRoute 53へ移動
2. ドメイン名をクリックし、レコードを作成
3. 以下それぞれ入力
    レコード名：空
    レコードタイプ:A
    エイリアス：オン
    値:作成したロードバランサー
エラー　sh_dispatch_run_fatal: Connection to ***.**.***.*** port **: message authentication code incorrect lost connection

リモートサーバーから`scp`でファイルをダウンロードしていたらタイトルのエラーが発生しました。  

# 解決策
scpのときに`-l`オプションで帯域制限 (通信につかう通信量を制限) しました。
```
scp -l 5000 *** ***
```

# 原因
Linuxはネットワーク越しにファイル転送を行うとベストエフォートで動いて回線に負荷をかけるらしいので，帯域制限をしました。

環境：
Ubuntu 20.04LTS (WSL)  
OpenSSH_8.2p1 Ubuntu-4
OpenSSL 1.1.1f  31 Mar 2020
Visual Studio CodeでOpenAPI(Swagger) Editorを使用する

# 1. はじめに
* OpenAPIのスキーマ定義ファイルをOpenAPI Editorを使って確認したい
* スキーマ定義のよく間違える型や定義などの誤りを入力時にエディタで構文チェックしてほしい
* visual Studio Codeのコードを簡単に拡大・縮小できるように設定変更したい

# 2. OpenAPI(Swagger) Editorのインストール
## 2.1 Visual Stduio Codeを起動する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/406ec7f4-792d-898c-ba92-4ce2ddaf9b31.png)

## 2.2. ExtensionsタブからOpenAPI(Swagger) Editorを選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/7d05b405-4d5c-225f-9a46-ebf52750d092.png)

## 2.3. installボタンをクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/3241a5c3-343b-b8ea-2ee6-78bb06532c27.png)

# 3. OpenAPI(Swagger) Editorの起動
## 3.1. ショートカットキー ```Shift + Alt + P``` を押す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/309e44f7-99b8-bad6-99f2-36d135ddc01f.png)

## 3.2. OpenAPI SwaggerUI Previewの表示される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/ac8baf3c-e702-6166-c2d2-72ca2361abee.png)

## 3.3. 構文チェックを確認する
* ```Paths```を```Path```にした時の構文チェック結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/58462875-3222-e892-9277-0e318dba1cba.png)

# 4. Visual Studio Codeのコード拡大・縮小の設定
## 4.1. Settingsを選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/9cea36a2-89c0-198d-be17-62126aeff691.png)

## 4.2. ```Mouse```で検索し、```Editor: Mouse Wheel Zoom``` にチェックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/ee2585e3-36df-4da2-d4cd-59fa9825d1ce.png)

## 4.3. ```Ctrl```+ ホイール操作でコードの拡大・縮小ができる
* 拡大
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/d94b69c7-a1f8-94f3-1523-38c10eff7d18.png)

* 縮小
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/5063c187-76f5-328f-4783-67d27c82cbd0.png)

# 5. 参考文献

https://marketplace.visualstudio.com/items?itemName=42Crunch.vscode-openapi

https://1-notes.com/visual-studio-code-mouse-wheel-zoom/
LambdaからDynamoDBへのアクセス時にAccessDeniedExceptionと言われた


## 概要
- Lambda関数として用意していたDynamoDBへのGet/Postメソッドの実行時にエラーが出力された。
- エラー内容は以下である。
> An error occurred (AccessDeniedException) when calling the GetItem operation
- これの解決方法を記載する。

## 目次
1. エラーの内容
1. 解決方法

## 1.エラーの内容
このエラーはGetメソッドのコールが失敗していることを表しています。
> An error occurred (AccessDeniedException) when calling the GetItem operation

ただ、DynamoDBへのフルアクセス権限はIAMロールにポリシーを作成していたのですが、このエラーが出たので？？？となりました。

こういったエラーが出た時に、AWSの公式が解決方法を示してくれています。
> Amazon DynamoDB テーブルにアクセスしようとしているときに表示される AccessDeniedException というエラーをトラブルシューティングする方法を教えてください。
https://aws.amazon.com/jp/premiumsupport/knowledge-center/dynamodb-access-denied-exception/

上記の記事によると、今回のようにAccessDeniedExceptionというエラーに遭遇した場合、以下のような要因が考えられるそうです。
- DynamoDB テーブルへのアクセスに使用した AWS Identity and Access Management (IAM) ロールに必要なアクセス許可がない。
- DynamoDB テーブルへのアクセスが組織レベルで制限されている。
- DynamoDB の Amazon Virtual Private Cloud (Amazon VPC) エンドポイントに関連付けられたポリシーにより、オペレーションが制限されている。
- 多要素認証 (MFA) を有効にし、MFA を使用してサインインせずにテーブルにアクセスしようとした。
- DynamoDB テーブルの保護に、カスタマーマネージドキーまたは AWS マネージドキーを使用している。

一番上が怪しいですけど、IAMロールでの権限の作成から、LambdaからDynamoDBへのフルアクセス権限のポリシーは設定済みです。

こりゃわからない・・・と思ってましたが、Lambda関数の許可ポリシーを確認すると、AmazonDynamoDBFullAccessのポリシーが添付できていませんでした。。。。ロールの設定だけしてたのが原因です。

## 2.解決方法

実際にLambda関数に以下のポリシーを設定していきます。
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/754596/9f012cce-2f19-b317-2822-0e3dbd05a5ff.png)
このポリシーはDynamoDBへのフルアクセス権限を表します。

![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/754596/0d732d30-b71c-36a3-e5da-72fa1ce6ea27.png)
実行ロールにある、AmazonDynamoDBFullAccessポリシーを紐づけたBeAbleToFullAccessFromLambdaToDynamoDBというロールを作成していたので、付与しました。

具体的には、以下の実行ロールの右側にある編集を押下し、
![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/754596/f0c5b979-a444-1f6d-24f4-e3dacfd94738.png)
基本設定から既存のロールを選択後、保存を押下します。
![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/754596/de7965df-0574-22fd-87bd-a001f89b662e.png)

これで、LambdaからDynamoDBへアクセスするための権限が付与されたので、エラーを解消できるはずです。


## おわりに
- 完全に備忘録ですね。
- cliからも解決してみたい。
Private Endpoint が有効な(パブリックネットワークアクセスが無効な) App Service に デプロイを行う方法　その 1


# はじめに

https://qiita.com/georgeOsdDev@github/items/1827c2a5bc15db214cff

に対する回避策 1 となります。
この記事では、Private Endpoint を利用してデプロイを行う方法について記載します。

# 回避策

パブリックアクセスネットワークアクセスが無効で、Private Endpoint が設けられている状況に対して最も単純なソリューションとしては、
Private Endpointにアクセス可能な箇所からデプロイするということになります。

Private Endpoint にアクセス可能なサブネットに配置された VM を作業用マシンとして、VM 上から az cli や Kudu API を利用することで、作業環境から App Service のデプロイエンドポイント(Kudu サイト https://<App名>.scm.azurewebsites.net) はプライベートエンドポイント経由でアクセスすることになります。

また、Azure DevOps Pipelines を利用する場合は、Private Endpoint にアクセス可能な箇所に VMSS を作成し、VMSS エージェント を用いることでデプロイすることが可能になります。

https://learn.microsoft.com/ja-jp/azure/devops/pipelines/agents/scale-set-agents?view=azure-devops

GitHub Actions においても セルフホステッド ランナーをPrivate Endpoint にアクセス可能な VM 上などに用意することで、Private Endpoint を経由してデプロイすることが可能になります。

https://docs.github.com/ja/actions/hosting-your-own-runners/about-self-hosted-runners

Container Apps Jobs を用いて セルフホステッド ランナー を VNet 内で動かす方法については以下に記載しました。

https://qiita.com/georgeOsdDev@github/items/52baf8713f434a9d02eb

# 参考

https://azure.github.io/AppService/2021/01/04/deploying-to-network-secured-sites.html
OpenAPIのスキーマファイルからモックサーバを立ち上げる

# 1. はじめに
* APIのスキーマ定義からモックサーバを立ち上げ、簡単な動作確認をしたい
* Prismをインストールして使用したい

# 2. Prismのインストール
## 2.1. コマンドプロンプトを立ち上げる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/4d1ebf27-2c2f-b9ac-4ca6-83f58f2fbb51.png)

## 2.2. npm経由でインストールコマンドを入力する
```npm install -g @stoplight/prism-cli```
* npmを使用するため事前にnode.jsををインストールした
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/5c4da5b5-37fe-a5ef-fa7e-cee59973d1b9.png)

# 3. モックサーバーの起動
## 3.1. スキーマ定義ファイルを準備する
* 今回は ```C:\temp``` フォルダへ保存した
```json:swagger.json
{
  "openapi": "3.0.1",
  "info": {
    "title": "WebApplication1",
    "version": "1.0"
  },
  "paths": {
    "/WeatherForecast": {
      "get": {
        "tags": [
          "WeatherForecast"
        ],
        "operationId": "GetWeatherForecast",
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/WeatherForecast"
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "WeatherForecast": {
        "type": "object",
        "properties": {
          "date": {
            "type": "string",
            "format": "date-time"
          },
          "temperatureC": {
            "type": "integer",
            "format": "int32"
          },
          "temperatureF": {
            "type": "integer",
            "format": "int32",
            "readOnly": true
          },
          "summary": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      }
    }
  }
}
```
## 3.2. コマンドプロンプトからモックサーバーを立ち上げる
```prism mock ./swagger.json```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/5e5998d8-c2e0-ac6c-0b38-4b5bef2417dc.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/769f91f4-8ec6-5668-05ca-a1c11238276f.png)

# 4. 動作確認
## 4.1. POSTMANから実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/5a2e9560-b4a4-d35a-00d5-a82aa9f3a742.png)

## 4.2. Webブラウザから実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/8e50a4d9-4af9-6ffd-c5dd-ffdfc0c7f3e6.png)

# 5. 参考文献

https://gihyo.jp/magazine/SD/archive/2022/202208
Snowflake のマルチクラスターウェアハウスに関する細かい話

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16369/92c42cd8-d549-2286-4670-49098b00b59d.png)

Snowflake を触っていて「マルチクラスターウェアハウスってなんだ？？？」となったので疑問点と調べたことをまとめる。ただし公式ドキュメントをちゃんと読めばだいたい書いてある。

https://docs.snowflake.com/ja/user-guide/warehouses-multicluster

https://docs.snowflake.com/ja/sql-reference/sql/create-warehouse

## 要点
- 内部的には「`MIN_CLUSTER_COUNT` (クラスター最小数)」と「`MAX_CLUSTER_COUNT` (クラスター最大数)」という２つのパラメータがあるのみ
- 「モード： `Maximized` (最大化) / `Auto-scale` (自動スケール)」や「マルチクラスターウェアハウス有効」というようなパラメータは内部的には存在せず、これら `MIN_CLUSTER_COUNT` `MAX_CLUSTER_COUNT` を設定するための UI (？) に過ぎない

## マルチクラスターウェアハウスとは？
通常のウェアハウス (シングルクラスターウェアハウス) ではクラスタは１つだけ起動するが、マルチクラスターウェアハウスでは複数のクラスタを起動することができる。

クラスタの起動数は `MIN_CLUSTER_COUNT` `MAX_CLUSTER_COUNT` で設定する。

**マルチクラスタウェアハウスを有効にして `MAX_CLUSTER_COUNT = 1` に設定した場合、シングルクラスターウェアハウスとまったく同じになる。**

## マルチクラスターウェアハウスのモードとは？
`Maximized` (最大化) / `Auto-scale` (自動スケール) という2つのモードがあるが、「`Maximized` の場合は `MIN_CLUSTER_COUNT` と `MAX_CLUSTER_COUNT` が同じ値が設定される」というだけで、それ以外は何も変わらない。

## マルチクラスターウェアハウス有効で `Min Clusters = 1` の場合、常に起動し続けるから常に課金されてしまう？
マルチクラスターウェアハウスであっても `AUTO_SUSPEND` が設定されていれば自動停止するし、停止中は課金されない。

「クラスター数」と「ウェアハウス全体の自動停止」は別物であり、 `Min Clusters` `Max Clusters` はあくまで「ウェアハウスが起動状態にあるときの最小/最大クラスター数」であるため。