OmniAICreator/Qiita-1.07M huggingface dataset:
Django テンプレートタグに空白を入れると認識してくれません

# 目的

こんなことで時間を使わないようにしましょう。という意味合いで投稿します。
この投稿の内容は **Djangoのツボとコツがゼッタイにわかる本［第2版］** を元に作成しています。

# 画面遷移がうまくいかない

本書では本棚アプリ作成することを目標としています。
個別に用意された本のページから一覧、編集、削除画面へ遷移することができる。

**全体**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/837411/26fc67c7-d14a-37ed-29cc-15683618c83a.png)

**個別ページの例**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/837411/cd1e6735-d839-b0ec-4408-1c91820bf5d1.png)

個別ページにて各ボタンを押下してもPage not found (404)が発生

``` console
Page not found (404)
Request Method:	GET
Request URL:	http://127.0.0.1:8000/book/1/detail/%7B%25%20url%20'delete-book'%20object.pk%20%25%20%7D
Using the URLconf defined in bookproject.urls, Django tried these URL patterns, in this order:

admin/
book/ [name='list-book']
book/<int:pk>/detail/ [name='detail-book']
book/create/ [name='create-book']
book/<int:pk>/delete/ [name='delete-book']
book/<int:pk>/update/ [name='update-book']
The current path, book/1/detail/{% url 'delete-book' object.pk % }, didn’t match any of these.

You’re seeing this error because you have DEBUG = True in your Django settings file. Change that to False, and Django will display a standard 404 page.
```

要するにページが見つからんと怒られてしまった。

# コードを見てみる

スペルミスはパッと見ないと思ったのが、もう一度書いたコードを確認してみる。

``` html:book_detail.html
{% extends 'base.html'%}

{% block title %} {{object.title}} {% endblock %}

{% block h1 %} 書籍詳細 {% endblock %}

{% block content %}
  <div class="p-4 m-4 bg-light border border-success rounded">
    <h2 class="text-success">{{object.title}}</h2>
    <p>{{ object.text }}</p>
    <a href="{% url 'list-book' %}" class="btn btn-primary">一覧へ</a>
    <a href="{% url 'update-book' object.pk % }" class="btn btn-primary">編集する</a>
    <a href="{% url 'delete-book' object.pk % }" class="btn btn-primary">削除する</a>
    <h6 class="card-title"> {{object.category}} </h6>
  </div>
{% endblock content %}
```

恐らく合っている…
そこで今まで忘れていて入れてこなかった拡張機能を追加して確認してみる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/837411/0369da4b-1635-8b7c-5daa-ab0a8ed70778.png)

🤔「なんでhrefの部分、色が違うんや...」
🤔「他の人が書いたコードを見てみよう」
🤔「！！」

# 解決

どうやら **{% xxx %}** のようなテンプレートタグは空白が入っていると認識してくれていないことが原因でした。

**誤：{% xxx % }**
**正：{% xxx %}**
フィクションなどから拾う情報処理用語 その3 レプリケーション (太陽戦隊サンバルカン)

太陽戦隊サンバルカン第23話「銀河魔境の女隊長」（脚本：上原正三、監督：平山公夫 (C) 東映）より

ヘドリアン女王は銀河無宿アマゾンキラーを呼び寄せた。ベーダー一族はヘドリアン女王以外は皆、名前の最後に「ラー」がつく。ヘドラー将軍、ミラー、ケラー、ダストラー、ムササビラーなどなど。アマゾンキラーもそうなのだ。閑話休題。

大平透「ヘルサターン総統は女行動隊長アマゾンキラーに太陽戦隊地下基地爆破を任せることにした。」

かくしてアマゾンキラーが出動した。
アマゾンキラーはオオダコモンガーを宇宙から来たエイリアンの卵に化けさせ、群馬サファリパークにある「太陽戦隊地下基地」の中に潜入させることに成功。オオダコモンガーは暴れ回った。サンバルカン(大鷲龍介、鮫島欣也、豹朝夫)の3人と嵐山長官にヘルサターン総統の三次元映像(?)がこう言い放った。

ヘルサターン総統「嵐山長官。我らがエイリアン作戦にまんまと引っかかったな。太陽戦隊ももうおしまいだ。」

高笑いするヘルサターン総統。毎回思うのだがなぜ敵の皆さんは作戦も終わらぬうちにいつもペラペラと作戦の内容を話してしまうのだろうか。

嵐山長官「ブラックマグマの機械生命体だったか。基地全体緊急配備。」

オオダコモンガーは嵐山長官の娘美佐に襲い掛かり、触手で巻き取ってしまった。逆回転すれば、腰元の帯をくるくる巻き取るお殿様の映像ができそうだ。だがそこへサンバルカンが駆けつけた。

サンバルカン「バルカーンスティック」

3人が投げたバルカンスティックがオオダコモンガーに命中。思わずオオダコモンガーは嵐山美佐を放してしまった。こうして嵐山美佐は救出された。だがオオダコモンガーは逃げ、超音波を発信。その超音波は北極でも受信できた。

アマゾンキラー「オオダコモンガーの発信した超音波で地下基地の位置が掴めました。後は総攻撃あるのみ。」
ヘルサターン総統「よーし。やれい。」

飛び立つ戦闘機群。「太陽戦隊地下基地」を空から攻撃する。そして「太陽戦隊地下基地」の内部ではオオダコモンガーがサンバルカンの追跡をかいくぐって攻撃しまくった。ジャガーバルカンをなぜ発進させないのだろうか?

嵐山美佐「大変です。ジャガーバルカンの発進ゲートが破壊されました。」
嵐山長官「大丈夫だ。落ち着け。」

なぜ嵐山長官は落ち着き払っているのだろうか?
これは重要な伏線である。
サンバルカンも発進ゲートが破壊されたのを目撃。

バルイーグル「ジャガーバルカンが発進できなくなったぞ。」

というや否やブラックマグマの皆さん御登場。
その指揮を執るアマゾンキラーは額と両耳から角が出た怪しい金の輪っかを被り、腕など露出の多い服を着て、小さなマントを背中につけていた。寒くはないのだろうか? 閑話休題。

アマゾンキラー「バルカン基地は吹っ飛んだ。残るはお前達だけだ!」
バルイーグル「誰だ、貴様。」

そういえば初対面であった。

アマゾンキラー「銀河無宿アマゾンキラー」
バルイーグル「アマゾンキラー!?」
アマゾンキラー「やれ!」

こうしてオオダコモンガーとサンバルカンとの戦いが始まった。
いつものようにジャンプしてポーズをとった後、名乗るサンバルカンの面々。

ポーン
バルイーグル「バルイーグル」

ピーン
バルシャーク「バルシャーク」

ピコンピコーン
バルパンサー「バルパンサー」

バルイーグル「輝け。太陽戦隊サンバルカン。」

大鷲龍介の叫びは棒読み気味である。

オオダコモンガー「おのれ。」
アマゾンキラー「かかれー。」

こうして定番のやりとりがあった後、サンバルカンは必殺技バルカンボールを放つ段取りとなった。

バルイーグル「バルカンボールだ。」
バルシャークとバルパンサー「おう。」

バルシャークとバルパンサーは赤青黄の3色に塗られたボールを高く放り上げた。

バルイーグル「ワン」

まず蹴って

バルパンサー「ツー」

ボールを両足で挟んだ後、バック転して飛ばし、

バルシャーク「スリー」

ヘディング。そして

バルイーグル「フォー。アッターック!」

バルイーグルが蹴ったボールがオオダコモンガーに命中。
オオダコモンガーは苦しみ出したが

オオダコモンガー「大モンガー」

オオダコモンガーは巨大化した。
毎回思うのだがバルカンボールなど要らないのではないだろうか。
ジャガーバルカンを発進させて一気に片をつければ良いのではないだろうか。
私は先代のデンジブーメランの頃からそう思っていた。
その視聴者の疑問に答えた(?)者がいた。

バルイーグル「ジャガーバルカンさえあれば。」
アマゾンキラー「地獄へ落ちろ、サンバルカン。」

♪チャッチャカチャチャン
CM
♪チャッチャカチャチャン

ここは「太陽戦隊地下基地」の司令室。
嵐山長官がマイクにこう言うのを嵐山美佐が見ていた。

嵐山長官「新ゲート。応答せよ。応答せよ。」

だが応答はない。
ここで嵐山長官は黒い受話器を取り上げた。
何かが聞こえたのか長官は安堵し、続けてこう言った。

嵐山長官「ジャガーバルカン、出動せよ。」

すると映ったのは伊豆城ヶ崎海岸の崖。
今まで見たこともない巨大な建物が姿を現した。
流れている曲は「バトルフィーバーJ」でバトルフィーバーロボが発進するときに流れた曲である。
その後、いつも流れる曲が流れてジャガーバルカンが登場。
ジャガーバルカンが小さく見えるくらい、大きな建物だったのである。
形勢逆転。
空を飛んで駆けつけたジャガーバルカンはミサイルでアマゾンキラー達を威嚇。
今度は串田アキラの歌が響く。

バルイーグル「おお。」
バルシャーク「ジャガーバルカン。」
バルパンサー「新しい発進ルートがあったんだ。」

バルパンサーの言葉は正確には間違っているのだが、そう思ってしまうのも無理はない。
かくしてジャガーバルカンは着陸。
サンバルカンロボも出動した。
しばらく戦った後、

バルイーグル「太陽剣オーロラプラズマ返し」
バルシャーク「オーロラプラズマ返し」
バルパンサー「オーロラプラズマ返し」
サンバルカンロボ「オーロラプラズマ返し」

♪チャチャチャーン
♪ドゥドゥン、ドゥドゥン、ドゥドゥン
♪パラパ、パッパラー
♪パラパ、パッパラー
♪パラパ、パッパラー、パパン

こうしてサンバルカンはオオダコモンガーを倒すことに成功したのであった。
嵐山長官はこんなこともあろうかとバルカンベースを用意していたのだ。
レプリケーションは大事なのである。
アジャイルは人生に似ている

「こいつ何を言い出すのか」と思った人も「なんとなく分かる」と思った人もいるのではないでしょうか。
【アジャイル　人生】と調べてみると結構ヒットするので間違った考え方ではないのかなと思っています。
「アジャイル」が流行り出してしばらく経ちましたが、なんちゃってアジャイルが増えてきている気がします。さらにチーム内にも似非アジャイルの認識を持った人がいたので驚いてます。
とはいえ、どう教えるのが正しいのか、何を勘違いしていたのかなど整理しつつ、タイトル回収していこうと思います。

## よくある勘違いとその原因、そして実情
* **アジャイルの方が速く作ることができる。**
**原因**
「速くできた」ということだけを信じて、実際の開発している背景まで把握できていないから。
**実情**
シンプルで要件が定まっているものに関してはウォーターフォールの開発の方が速いことが多い。（アジャイル分かってない人が途中で余計な機能付けがち）
ウォータフォールに比べ手戻りが少ない分、トータルで見ると速い時もある。
モノが出来上がってる状態なので出来上がっていると勘違いしている。

* **アジャイルは要件を簡単に変えることができる=イテレーション中に変更**
**原因**
イテレーションを理解せず、要件定義はいつでもどこでも言えば変えられると思っているから。
**実情**
イテレーション中の要件変更は論外。イテレーション後に振り返りをしたうえで、要件変更と次イテレーションでやることを決めるのが正。

* **クライアントの方が偉いから気が向いた時だけ参加する**
**原因**
案件に対して自分事化できていないから。
**実情**
クライアントも開発チームもすべてフラット。会社の方針の話もあれば、技術的な部分の話もあり、しっかりプロダクトを作っていく姿勢がなければアジャイルは成立しない。
特に開発を知らない人や「アジャイルでやれば？」と軽く言う人が大体こうなる。（出来上がったプロダクトの確認とかやってくれないし。

* **レトロ（振り返り）は適当でいい**
**原因**
これも自分事化できていないから。
**実情**
レトロこそアジャイルの本質であり、次のイテレーションに向けた準備段階となる。
これを無視することで効率化や改善が見込まれず、チームが生産性の低いままずるずると案件消化をする部隊へ。

## アジャイルのポイント
パッと思いついた「なんちゃってアジャイル」の傾向と分析を並べてみましたが、実際アジャイルはどうあるべきなのでしょうか。
個人的にポイントは3つあります。

**①アジャイル教育の徹底**
→そもそもセミナーで聞いたぐらいのレベルでアジャイル開発ができると思っていないので、きっちり教育を受けた上でアジャイル開発に臨むことが大前提となってきます。
**②最重要項目はレトロ**
→人は振り返りをすることで失敗を成功に変えてきました。それはプロジェクトという小さな単位でも同様のことが言えます。たとえ、他の案件であまり関われていなくてもレトロはしっかり参加し、「どうして関われなかったのか」「どう業務を動かせば関わることができるのか」を考えなければなりません。
**③自分事化**
→原因でも自分事化できてないと書きましたが、案件を遂行する意識というのが低いとなんでもうまくいきません。最近は兼務とかで案件跨ぐこともあれば、マネジメント側なので案件に対する意識が低くなりがちです。仕事とは何かを考えれば自然と自分事化できるのではないでしょうか。

これらのポイントをまず抑えることがアジャイル開発の成功の秘訣だと私は考えています。

## 正解がない問いへ
タイトル回収といきたいと思います。
人間は一日、一週間、一か月、一年といった単位で考えることが好きな種族ではないでしょうか。
例えば一週間が終われば「一週間色々あって疲れた。来週も頑張ろう。」となるかと思います。
この区切りがイテレーションにあたります。そして、一週間を思い出すことがレトロになり、反省や改善をして明日に臨みます。
それぞれの人生をどう過ごせばよいのかという「正解」はありませんが、「どう生きたい、どうありたい」という要件定義はできていると思います。要件定義という軸に沿ってより良い時間を過ごし、最高の人生を作るのは正に「<font color="Red">アジャイル</font>」と言えるのではないでしょうか。


過言かもしれませんが（笑）
CloudWatch Logsを監視し、エラーをSlackに通知する

### メトリクスフィルターとサブスクリプションフィルターの違い
https://bftnagoya.hateblo.jp/entry/2022/04/04/131651

1. CloudWatch Logs → メトリクスフィルター → CloudWatch Alarm → SNS → Slack （詳細は通知されない）
https://dev.classmethod.jp/articles/notify-when-a-specific-character-string-was-detected-in-cloudwatch-logs-metric-filtercloudwatch-alarm/

2. CloudWatch Logs → サブスクリプションフィルター → Lambda → Incoming Webhook → Slack （通知内容カスタマイズ可能）
https://dev.classmethod.jp/articles/notification_cloudwatchlogs_subscriptoinfilter/
https://zenn.dev/ushknn/articles/65d9560c0dad6c
Gem fileにてGemを取り込む方法　Gemfile.lockの説明

使用しているVer ruby 2.6.5　Rails 6.0.6.1

○Gemとは？
誰かが作ったものを活用するために、Gemが存在します。
プログラマーでよく言われる言葉で、「車輪の再発明をしない」
この言葉の元Gemというものがありそういったもの総称をライブラリーとも言います。
ライブラリーは有名な言語であれば必ず存在します。


○早速Gemを取り込んでいきたいと思います

まずGem fileにてGemの名前を書き込みます。
　今回はfakerを取り入れます。
　

下記をGem fileに記入


    gem 'faker'
ターミナルにて、
    
    $ bundle install

と実行。※$は記入しません。
以上でfakerのダウンロード完了です👍



・READMEのドキュメントに使い方やインストールのやり方が記入されています。
https://github.com/faker-ruby/faker
もし、他にも取り入れたいgemがあれば、READMEを参考に使用するか
全て英語で分かりづらい時は、有名なgemであれば検索して日本語で出てくるかと思います😆

英語が読めるのであれば、公式のドキュメント見ることをお勧めします！


☆追記　Gemfile.lockの説明

○Gemfile.lockとは？
このプロジェクトにおいてどのgemのどのバージョンを使用しているのかを使用しているのかを指定している。


今回ダウンロードしたfakerを確認


    faker (2.22.0)
と記載あり

なぜGemfile.lockがあるかというと
バージョンが違うと、同じコードを打っても挙動が異なる、動かなくなるときがある
そうならないために、Verをロックしている。
今更CentOS6でcertbot-autoをセットアップ！！

今更CentOS6でcertbot-autoをセットアップ！！
certbot-auto
最新版は動かない（2021 6/29）
古いバージョンの certbot-auto をダウンロード
CentOS6 今更CentOS6でcertbot-autoをセットアップ！！
certbot-auto
最新版は動かない（2021 6/29）
古いバージョンの certbot-auto をダウンロード
```
 /usr/local/sbin
 wget https://raw.githubusercontent.com/certbot/certbot/v1.9.0/certbot-auto
スクリプト /usr/local/sbin/certbot を作る
vi certbot
#!/bin/bash
/usr/local/sbin/certbot-auto $* --no-self-upgrade --no-bootstrap
```
python3.6
python3 が必要だがダウンロードできないので，ソースからコンパイルする．
```
 wget https://www.python.org/ftp/python/3.6.2/Python-3.6.2.tar.xz
 xzcat Python-3.6.2.tar.xz | tar xfv -
 cd Python-3.6.2
 ./configure
 make
 make install
```

certbotで実行可能
```
certbot certonly --standalone -d www.xxxxxxxx.jp -m mymail@gmail.com
以下が生成される。
/etc/letsencrypt/archive/www.xxxxxxxx.jp
cd /etc/letsencrypt/archive/www.xxxxxxxx.jp
-rw-r--r-- 1 root root 1866 Feb 14 04:04 cert1.pem
-rw-r--r-- 1 root root 3749 Feb 14 04:04 chain1.pem
-rw-r--r-- 1 root root 5615 Feb 14 04:04 fullchain1.pem
-rw-r--r-- 1 root root 1704 Feb 14 04:04 privkey1.pem

vi /etc/httpd/conf.d/ssl.conf
ssl.confに下記追記
<VirtualHost *:443>
ServerName animalnote.kiyono-vet.jp:443
DocumentRoot /var/www/html/animalnotekiyono

SSLCertificateFile /etc/letsencrypt/archive/animalnote.kiyono-vet.jp/cert1.pem
SSLCertificateKeyFile /etc/letsencrypt/archive/animalnote.kiyono-vet.jp/privkey1.pem
SSLCertificateChainFile /etc/letsencrypt/archive/animalnote.kiyono-vet.jp/chain1.pem
</VirtualHost>
```
実機ビルド時に警告が出て、アプリが起動するまで時間がかかった件【解決済み】

## 概要
XcodeでiPhoneの実機ビルドを行った際に、以下の警告文が発生して、アプリが立ち上がるまでに30秒ほどかかってしまいました。
**警告文**
**warning: libobjc.A.dylib is being read from process memory. This indicates that LLDB could not find the on-disk shared cache for this device. This will likely reduce debugging performance.**

日本語でざっくりと訳すと、
**ダイナミックライブラリは通常プロセスメモリから読み込みがされるが、この警告は、ライブラリが、ビルドされた実機内のディスクにキャッシュが見つからない。そのため、デバックの機能が著しく低下する可能性がある。**

とのことです。

dylibとは、**効率的にメモリを使用するために使用されるマッキントッシュのライブラリ**らしいです。
LLDBは、**ソフトウェアのデバッガーのこと**です。とりわけ今回の場合は、Xcodeのデバックのことですかね。

確かにこのように調べると、僕自身ビルドした時にデバックの表示がめちゃくちゃ遅くて、アプリの立ち上がりも遅かったです。
以下で、解決方法を解説します。

## 解決方法
バージョンに関しては以下の通りです。
iOS 16.0
Xcode 14.0

手順は大きく2つです。

##### 1.ターミナルで、以下のコマンドを打ちます。
```ターミナル.
rm -r ~/Library/Developer/Xcode/iOS\ DeviceSupport
```

##### 2.このコマンド後、デベロッパー機能を切ってから再度オンにします。

再度、ビルドし直すとおそらくビルドした時、上記の警告文がなくなり、アプリも他の端末と同様のスピードで立ち上がりました！

他にも再起動をすればエラー分がなくなるとおっしゃっている方もいましたので、ぜひ試してみてください！


## さいごに
結構長い間この問題が解決できなかったので、やっと解決できてよかったです。
データベースの機能・排他制御を知ろう！

未経験からエンジニアになりたい人は、プログラミングから始める人が多いと思いますが、
エンジニアの仕事は、プログラミングだけではありません。そして、プログラミングだけでは、エンジニアになれません。同時にプログラミングが苦手でも、システム構成や開発の流れを理解するとエンジニアに近づきます！
今回はデータベースの機能　排他制御について更に詳しく調べてみましょう！
![インスタスライド_202302021.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/4b0c80aa-a0a0-5cda-ceb6-f04d817fe539.gif)


# 排他制御とは
複数の処理が並行で実行されて同時に同じデータにアクセスされる場合に、

データの整合性を保つために、データの読み書きを一時的に制限する機能です。

# 排他制御がないと
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/e1a08a9d-0e65-d84c-6dd3-6046334051bd.png)
並列でAとBが動くと在庫数が正しく反映されない事になってしまう。

# 排他制御があると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/896e13e5-7588-9304-428a-54c2448db7c3.png)
AがロックをかけるとBはロックが解除されるまで待たされる。
これによりデータの整合性が保たれる。

# ロックをかけるには
データを取得する時にロックを宣言する
Select * from 在庫テーブル where id = “A01”
for update

id = “A01”のデータをロックかける事ができる
commit か rollbackでロックが解除される

# まとめ
ー排他制御でデータの整合性が保たれる

ー並行処理の時に排他制御が有効となる

ーロックによりデータが排他制御される

ーselect * for update でロックされる

# 最後に
未経験の皆さん、若手エンジニアの皆さん、勉強方法について悩みがあればなんでも気軽に質問して下さい！
これからも記事を書いていきますので、モチベーションアップのためフォロー、イイねお願いします。
ボックスモデルについて

###### ボックスモデルとは具体的に何なのか？

- border, padding, marginは、ボックスモデルという概念に基いている。
- HTMLの全ての要素には、border（初期状態では表示されない）があり、その外側の余白はmargin, 内側の余白はpaddingである。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3123154/4aa279da-bedf-b409-22bd-fd1741ef174b.png)

- paddingとmarginについて

paddingはborderの内側の余白を作る。
borderの外側に余白を作りたい場合、marginを使う。
値の指定の方法は、paddingと同じ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3123154/605cd550-db1b-25c0-12a5-d37b8e870fb0.png)
JavaScript 日付フォーマット、日時分秒の差分計算（週末・年末まで）

JavaScript の日付処理でさっとやったやつをメモしておく
フォーマット、日付計算とかもっと良いのないかなと感じてます．．．
変数名も適当すぎる．．．

https://sueasen.github.io/javascript-exercise/work/datecalc/

```JavaScript
// 現在日時取得
const now = new Date();
// 今週末
const nextWeekEnd = new Date(now.getFullYear(), now.getMonth(), now.getDate() + (6 - now.getDay()));
// 来年初日
const nextYearFirst = new Date(now.getFullYear() + 1, 0, 1);

console.log(dateFormat(now));
console.log(diffDate(now, nextWeekEnd));
console.log(diffDate(now, nextYearFirst));
console.log(diffTimes(now, nextWeekEnd));
console.log(diffTimes(now, nextYearFirst));

// 曜日の日本語リスト
//const weekdays = ['日', '月', '火', '水', '木', '金', '土'];

// 日付フォーマット YYYY/MM/DD(a)HH:MI:SS
function dateFormat(date) {
    const formatOptions = {
        year: "numeric", month: "2-digit", day: "2-digit", weekday: 'short'
        , hour: "2-digit", minute: "2-digit", second: "2-digit"
    }
    return date.toLocaleString("ja-JP", formatOptions);
    // return date.toLocaleString("sv-SE").replace(' ', `(${weekend[date.getDay()]})`);
    // return date.getFullYear() + '/'
    //     + String(date.getMonth() + 1).padStart(2, '0') + '/'
    //     + String(date.getDate()).padStart(2, '0') + '('
    //     + weekend[date.getDay()] + ')'
    //     + String(date.getHours()).padStart(2, '0') + ':'
    //     + String(date.getMinutes()).padStart(2, '0');
}

// 日時の日数差
function diffDate(from, to) {
    const f = new Date(from.getFullYear(), from.getMonth(), from.getDate());
    const t = new Date(to.getFullYear(), to.getMonth(), to.getDate());
    return Math.floor((t.getTime() - f.getTime()) / (1000 * 60 * 60 * 24));
}

// 日時の時分秒差
function diffTimes(from, to) {
    const diffTime = to.getTime() - from.getTime();
    return {
        time: diffTime,
        hour: Math.floor(diffTime / (1000 * 60 * 60)),
        minute: Math.floor(diffTime / (1000 * 60)),
        Second: Math.floor(diffTime / 1000)
    }
}

```
2023/2/15主にITとかセキュリティの記事

「ESXiArgs」に新亜種、復号ツールに対抗 - SLP無効で被害も
https://www.security-next.com/143637

メタップスPの「Pマーク」取消 - PCI DSS準拠でサービスは再開へ
https://www.security-next.com/143640

複数NASがランサム被害、設定ミスからわずか数時間 - 埼大
https://www.security-next.com/143596

2年以上、スペル異なるメアドをMLに誤登録 - 鹿児島大
https://www.security-next.com/143626

「イオン銀行」を装うフィッシング報告が増加
https://www.security-next.com/143651

暴露型ランサムウェア、被害の75％は従業員500人以下の中堅中小企業--トレンドマイクロ調査(2/13)
https://japan.zdnet.com/article/35199939/

県事業受講した50人の情報漏えい　トーマツが運用ミス、群馬県が謝罪(2/11)
https://www.jomo-news.co.jp/articles/-/240582

増えるフィッシング攻撃、その被害は高額に--バラクーダ調査(2/13)
https://japan.zdnet.com/article/35199943/

Redditにサイバー攻撃。内部資料やソースコードに不正アクセス(2/13)
https://pc.watch.impress.co.jp/docs/news/1478160.html

人気ソーシャル・ニュース集計プラットフォームReddit、内部データ流出(2/13)
https://news.mynavi.jp/techplus/article/20230213-2590396/

フィッシングメール、2億7830万通と前四半期比36%で増加(2/13)
https://news.mynavi.jp/techplus/article/20230213-2587946/

ChatGPTがサイバーセキュリティにもたらす影響(2/13)
https://forbesjapan.com/articles/detail/60806

悪意あるPyPIパッケージ発見、SSHのauthorized\_keysファイル書き換えなど行う(2/13)
https://news.mynavi.jp/techplus/article/20230213-2590391/

ロシアのハッカー、「ChatGPT」の制限回避を狙う--Check Pointが確認(2/13)
https://japan.zdnet.com/article/35199940/

PCの数と資産台帳の数字が合わない--そこに潜む根深い原因(2/13)
https://japan.zdnet.com/article/35199572/

無償のランサムウェア被害復旧ツール、米当局がGithubで公開(2/13)
https://www.zaikei.co.jp/article/20230213/709535.html

マイナンバーカード｢普及7割｣その先にある課題
普及拡大目指す河野太郎デジタル相が新方針表明(2/13)
https://toyokeizai.net/articles/-/652384

NEC、法人向けPC用設定ユーティリティに脆弱性(2/13)
https://pc.watch.impress.co.jp/docs/news/1478117.html

ＩＭＦ、エルサルバドルのビットコイン法定通貨化で改めてリスク指摘(2/13)
https://jp.reuters.com/article/imf-el-salvador-idJPKBN2UM0GE

【独自】韓米、北のハッカーによる仮想通貨現金化を阻止…協調で初成果(2/13)
https://news.yahoo.co.jp/articles/0e463b379ae0fb26e2946991de2039873c5e2f90?source=rss

1Password、パスワードを不要にする計画(2/13)
https://www.zaikei.co.jp/article/20230213/709387.html

ユニスワップV3、BNBチェーン展開が正式決定、a16zの反対票届かず(2/13)
https://www.neweconomy.jp/posts/295941

群馬県内 去年1年間のサイバー犯罪 相談件数　4118件で過去最多に(2/13)
https://news.yahoo.co.jp/articles/57665e4e5a4b773c627c970122ba3677ffe909c7?source=rss

リテラシーと言えばITパスポート　経営者はデジタルを学ぶ努力を(2/14)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600001/020700129/

サイバー攻撃を受けた金沢西病院が2カ月ぶりの通常診療再開、被害の詳細は説明せず(2/14)
https://xtech.nikkei.com/atcl/nxt/column/18/00598/021000206/

医療・エネルギー産業にサイバー攻撃したのは北朝鮮、ウィズセキュア分析(2/14)
https://xtech.nikkei.com/atcl/nxt/news/18/14617/

アマゾンの家庭用ロボット「Astro」、警備や見守りに突破口(2/14)
https://xtech.nikkei.com/atcl/nxt/column/18/00001/07673/

独自路線のGmailを使う7つのメリット、進化した「統合レイアウト」が便利(2/14)
https://xtech.nikkei.com/atcl/nxt/column/18/02337/011900001/

深夜に始まると迷惑な「Windowsの自動メンテナンス」、実行中でも停止する方法(2/14)
https://xtech.nikkei.com/atcl/nxt/column/18/02329/011600010/

トップダウン型DXに転換　経営指標の改善こそ本道(2/14)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600003/020600065/

市販製品に潜む未知のバグ表面化　申請情報が他事業者から閲覧可能に 静岡県(2/14)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600011/020800126/
AWSCLI v1とv2の共存環境でv2を更新する手順メモ

この記事は仕事用のメモ。
使い終わったら消す予定。

##### ■お家検証内容

`yum install zip unzip -y`

`yum install centos-release-scl -y`
`yum repolist all | grep -e centos-sclo -e rhel-server-rhscl-7-rpms -e software`
`yum install rh-python38 -y`
`scl enable rh-python38 bash`
`python -V`

`cd /tmp/`

`curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64-2.1.36.zip" -o "awscliv2.zip"`

`curl "https://s3.amazonaws.com/aws-cli/awscli-bundle.zip" -o "awscli-bundle.zip"`

`unzip awscliv2.zip; unzip awscli-bundle.zip`

`sudo /tmp/aws/install -i /usr/local/aws-cli -b /usr/local/bin; aws --version`
>-i : ライブラリを含むインストール資産の配置先ディレクトリ  (default:/usr/local/aws-cli)
>-b : 実行コマンドのシンボリックリンクを作成するディレクトリ(default:/usr/local/bin)

`rm -rf /tmp/aws`

`ln -s /usr/local/aws-cli/v2/current/bin/aws /usr/local/bin/aws2
unlink /usr/local/bin/aws`

`sudo /opt/rh/rh-python38/root/usr/bin/python /tmp/awscli-bundle/install -i /usr/local/aws-cli-v1 -b /usr/local/bin/aws`
>-i : ライブラリを含むインストール資産の配置先ディレクトリ  (default:~/.local/lib/aws)
>-b : 実行コマンドのシンボリックリンクのパス                (default:シンボリックリンクを作成しない)

`rm -rf /tmp/awscli-bundle`

---
`aws --version; aws2 --version`
aws-cli/1.27.70 Python/3.8.13 Linux/3.10.0-1127.el7.x86_64 botocore/1.29.70
aws-cli/2.1.36 Python/3.8.8 Linux/3.10.0-1127.el7.x86_64 exe/x86_64.centos.7 prompt/off

---

`curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64-2.9.23.zip" -o "awscliv2.9.23.zip"`

`unzip awscliv2.9.23.zip`

`sudo /tmp/aws/install -u -i /usr/local/aws-cli -b /usr/local/bin; aws --version; aws2 --version`

`ln -sf /usr/local/aws-cli-v1/bin/aws /usr/local/bin/aws`

---
`aws --version; aws2 --version`
aws-cli/1.27.70 Python/3.8.13 Linux/3.10.0-1127.el7.x86_64 botocore/1.29.70
aws-cli/2.9.23 Python/3.9.11 Linux/3.10.0-1127.el7.x86_64 exe/x86_64.centos.7 prompt/off

---


##### ■開発環境でやるべきこと

_'*** 最新AWSCLIv2をダウンロード＆サーバへ格納(/tmp)_
_'*** URL : https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip_
_'*** rename awscli-exe-linux-x86_64.zip awscliv2.zip_
`cd /tmp/`
`unzip awscliv2.zip`

_'*** シンボリックリンクの状況を整理、記録_
`ll /usr/local/bin/aws*`

_'*** 各AWSCLIのバージョンを確認、記録_
`aws --version`
`aws2 --version`

_'*** AWSCLIv2を更新インストール_
`sudo /tmp/aws/install --bin-dir /usr/local/bin --install-dir /usr/local/aws-cli --update`

_'*** シンボリックリンクの状況を整理、記録_
`ll /usr/local/bin/aws*`

_'*** シンボリックリンク「/usr/local/bin/aws」 にAWSCLIv1が、_
_'*** シンボリックリンク「/usr/local/bin/aws2」にAWSCLIv2が、_
_'*** それぞれ登録されるようにln -sfコマンドで修正_
`ln -sf /usr/local/aws-cli-v1/bin/aws /usr/local/bin/aws`
`ln -sf /usr/local/aws-cli/v2/current/bin/aws /usr/local/bin/aws2`

_'*** お片付け_
`rm -f awscliv2.zip`
`rm -rf aws/`

おわり
Laravelとvite

走り書きメモ
・laravelでviteを使うことになった場合は
resouces/views/app.blade.phpでassetやmixじゃなくて
`<link href="{{ asset('resources/sass/app.scss') }}" rel="stylesheet">`　⇒　@vite('resources/sass/app.scss')
`<script src="{{ asset('resources/js/app.js') }}" defer></script>`　⇒　@vite('resources/js/app.js')

・vite.config.jsの

plugins: [
        laravel({
            input: [
                'resources/css/app.css',
                'resources/js/app.js',
                'resources/sass/app.scss',//念のため追加
            ],
            refresh: true,
        }),
IISのルートディレクトリを共有フォルダにした時の挙動

# HTTP Error 401.3 - Unauthorized 
Windows で Webページ を公開する際には IIS (インターネットインフォメーションサービス) を使用できます。そして、Webページのコンテンツを別のPCから更新するためには、古くからFTPが用いられてきました。
が、Windowsの「共有フォルダ」機能を使ってWebページのコンテンツを差し替えようとしたところ、個人的には想定外の挙動をしたので記録しておきます。
## 再現方法
1. 一般的な手順で IIS を設定して Webページ を公開します。ローカルホストや他の PC から内容を参照できることを確認します。
2. Webページ のルートディレクトリ（デフォルトでは C:\inetpub\wwwroot）を、Windowsファイル共有機能 を用いて共有します。
3. この段階で再びWebサイトにアクセスしようとすると、HTTP Error 401.3 - Unautorized 等のエラーが表示されます。条件によっては文字化けしたメッセージが表示される等様々な現象が起こります。

# 解決方法
ルートディレクトリのアクセス設定を追加します。
1. エクスプローラでルートディレクトリを右クリックし、プロパティを開きます。IISマネージャーの アクセス許可の編集... をクリックしても同じ画面が開きます。
2. セキュリティ タブ中の 編集 ボタンをクリックします。
3. (ルートディレクトリ名) のアクセス許可 というタイトルのウィンドウが開くので、追加 ボタンをクリックします。
4. ユーザー または グループ の選択 というタイトルのウィンドウが開くので、選択するオブジェクトを入力してください とある欄に Users と入力し、名前の確認ボタンをクリックします。
5. 先程入力した Users が、設定で使用できる形式に修正されますので、OK ボタンをクリックします。
6.  (ルートディレクトリ名) のアクセス許可 というタイトルのウィンドウに戻ってくるので、必要そうなアクセス許可を与えておきます。読み取りと実行、フォルダーの内容の一覧表示、読み取り の3つが良いでしょうか...
7. OK ボタンを順次クリックすることで、プロパティ を閉じます。

# 気を付けたい事
この様なアクセス設定がどの様なリスクをもたらすか調査中です。許可する範囲が広過ぎる様に感じます。もっと絞ったユーザにのみ権限を与える方法を探索しましたが、2023年2月現在のところ上手くいっていません。

そもそも、Windowsファイル共有でWebページを更新する方法はあまり良くない考えかもしれません。結局私は他の方法を使う事にしてしまいました...。
不意な断線

今日は”ブチッ”という音で心が萎えた。

趣味でいじっていた紙幣読み取り機を分解してブレッドボード上に配線組んで電圧調べていたら、抵抗をはさまないといけなかったっぽい場所に挟まずに接続したらしく、”ぶちっ”というイヤぁな音がした。
紙入れても吸い取らなくなったぁ！！

3日は食欲減退だわ、、、

中古で購入した券売機の中の読み取り機で、自作じゃないからどこが断線したか全く見当がつかない。

さてと、
明日からは気持ちを切り替えてArduinoをいじろうっと！

はあはあ。。
Firestore rules Reference型使用時の注意

# TL;DR
文字列とReferenceは比較できないので、
```js:
function matchUserReference(ref, userId) {
    return ref != null && ref == get(/databases/$(database)/documents/users/$(userId)).__name__;
}
```
これを使う。

```js
    allow <操作>: if matchUserReference(resource.data.<refのキー>, request.auth.uid);
```
こう。

## 
postsを保存する時等、userのRefをフィールドとして保存したい。
自分は
```js
    allow <操作>: if '/users/' + request.auth.uid == resource.data.author;
```
としてしまい、かなりの時間詰まった。

web consoleは使用感がとても悪いのでvscodeで書けるようにした方が良さそう。

### 参考
https://qiita.com/sgr-ksmt/items/1a731fdadf06119d35fc
Apacheのアクセス制御・Requireディレクティブの書式

●Apacheのアクセス制御
Apacheではアクセス元のIPアドレス、ホスト名もしくはドメイン名を使用してアクセス制御を行うことが出来る。アクセス制御にはApacheの設定ファイルhttpd.confを用いる。
Apache2.2では、Order、Allow、Denyディレクティブを使用したが、Apache2.4では非推奨、Requireディレクティブを使う。

●Requireディレクティブの書式

Require [not] エンティティ 値

主なエンティティ
■mod_authz_coreモジュール
・all　granted　すべて許可
・all　denied　すべて拒否
・env　環境変数　指定した環境変数が設定されていると許可
・method　httpメソッド　指定したhttpメソッドに合致すると許可
・expr　表現　指定した表現に合致すると許可

■mod_authz_hostモジュール
・ip　IPアドレス(範囲)　指定したアドレス(範囲)を許可
・host　ホスト名　指定したホスト名を許可

■mod_authz_userモジュール
・user　ユーザ名　指定したユーザを許可
・group　指定したグループを許可
・valid-user　正常に認証されたユーザを許可


●ディレクティブの意味
・<RequireAll>　すべての条件に合致したら真
・<RequireAny>　いずれかの条件に合致したら真
・<RequireNone>　すべての条件に合致しなかったら真

●アクセス制御をLimit、LimitExceptディレクティブ内に設定して、特定のHTTPメソッドに適用することもできます。

・Limitディレクティブ
指定したHTTPメソッドのみに、Limitディレクティブ内に設定したアクセス制御を適用。

・LimitExceptディレクティブ
指定したHTTPメソッド以外のメソッドに、LimitExceptディレクティブ内に設定したアクセス制御を適用
【ES6】配列の要素の合計値をreduce()で求める【メモ】


```js
// 数値を格納した配列を用意
const pureNumArr = [1, 2, 3]

// 合計値を求める
let totalNum = pureNumArr.reduce((sum, element) => {
  return sum + element;
}, 0)
console.log(totalNum) // 6
```
【Rails】Blocked host 解消法

## 状況

任意のホスト名を指定してアクセスしようとした際に次のようなエラーが発生しました。

```
Blocked host: sample-host.com
To allow requests to sample-host.com, add the following to your environment configuration:
    config.hosts << "sample-host.com"

```

## 解消法

次のように`config/environments/development.rb`に追加しホストを許可することで解消します。

```rb:development.rb

Rails.application.configure do

  config.hosts << "sample-host.com"

end

```
数学検定 準1級受験メモ: 双曲線の接線の方程式導出

# 双曲線とは
双曲線の方程式は次の式で与えられる．
$$ \frac{x^2}{a^2} - \frac{y^2}{b^2}= 1$$

焦点は$F = (\pm \sqrt{a^2 + b^2}, 0)\$で与えられ，漸近線は $ y = \pm \frac{b}{a} x\$ で与えられる．

図示すると以下のようになります．

https://www.desmos.com/calculator/vgfqbejegx?lang=ja

# 双曲線の接線の方程式の導出

まず双曲線の方程式を次のように変形する．
$$ y^2 = b^2 + \frac{b^2}{a^2}x^2 $$

 次に上式の両辺を x で微分する．
$$ 2y \frac{dy}{dx} = 2 \frac{b^2}{a^2} x$$

よって，
$$ \frac{dy}{dx} = \frac{b^2}{a^2} \frac{x}{y}$$

さて，接線の方程式は$x$の一次式なので
$$ y - y_0 = m (x - x_0) $$
で与えられる．
 
ここで，$m$は接線の傾きであり，$(x_0, y_0)$は接線と楕円の接点の座標である．
接点にて接線の傾きは $m = \frac{b^2}{a^2} \frac{x_0}{y_0}$ である．
あくまで「接点での傾き」なので$\frac{b^2}{a^2} \frac{x}{y}$ではなく$\frac{b^2}{a^2} \frac{x_0}{y_0}$である．

この傾きを接線の方程式に代入すると
$$ y - y_0 =  \frac{b^2}{a^2} \frac{x_0}{y_0} (x - x_0) $$
この式を展開していくと，

$$ y =  \frac{b^2}{a^2} \frac{x_0}{y_0} (x - x_0) + y_0 $$

$$ y_0 y =  \frac{b^2}{a^2} x_0 (x - x_0) + {y_0}^2 $$

$$ y_0 y =  \frac{b^2}{a^2} x_0 x - \frac{b^2}{a^2} {x_0}^2 + {y_0}^2 $$

$$ \frac{y_0 y}{b^2} =  \frac{x_0 x}{a^2} - \frac{{x_0}^2}{a^2} + \frac{{y_0}^2}{b^2} $$

$\frac{{x_0}^2}{a^2} - \frac{{y_0}^2}{b^2} = 1$ なので

$$ \frac{x_0 x}{a^2} - \frac{y_0 y}{b^2} = 1 $$

以上，接線の方程式が求められました．
数学検定 準1級受験メモ: 楕円の接線の方程式導出

# 楕円とは
楕円の方程式は次の式で与えられる．
$$ \frac{x^2}{a^2} + \frac{y^2}{b^2}= 1$$

焦点は$F = (\pm \sqrt{a^2 - b^2}, 0)\$で与えられる．

図示すると以下のようになります．

https://www.desmos.com/calculator/afja7ee9mh?lang=ja


# 楕円の接線の方程式の導出

まず楕円の方程式を次のように変形する．
$$ y^2 = b^2 - \frac{b^2}{a^2}x^2 $$

 次に上式の両辺を x で微分する．
$$ 2y \frac{dy}{dx} = - 2 \frac{b^2}{a^2} x$$

よって，
$$ \frac{dy}{dx} = - \frac{b^2}{a^2} \frac{x}{y}$$

さて，接線の方程式は$x$の一次式なので
$$ y - y_0 = m (x - x_0) $$
で与えられる．
 
ここで，$m$は接線の傾きであり，$(x_0, y_0)$は接線と楕円の接点の座標である．
接点にて接線の傾きは $m = - \frac{b^2}{a^2} \frac{x_0}{y_0}$ である．
あくまで「接点での傾き」なので$- \frac{b^2}{a^2} \frac{x}{y}$ではなく$- \frac{b^2}{a^2} \frac{x_0}{y_0}$である．

この傾きを接線の方程式に代入すると
$$ y - y_0 =  - \frac{b^2}{a^2} \frac{x_0}{y_0} (x - x_0) $$
この式を展開していくと，

$$ y =  - \frac{b^2}{a^2} \frac{x_0}{y_0} (x - x_0) + y_0 $$

$$ y_0 y =  - \frac{b^2}{a^2} x_0 (x - x_0) + {y_0}^2 $$

$$ y_0 y =  - \frac{b^2}{a^2} x_0 x + \frac{b^2}{a^2} {x_0}^2 + {y_0}^2 $$

$$ \frac{y_0 y}{b^2} =  - \frac{x_0 x}{a^2}  + \frac{{x_0}^2}{a^2} + \frac{{y_0}^2}{b^2} $$

$\frac{{x_0}^2}{a^2} + \frac{{y_0}^2}{b^2} = 1$ なので

$$ \frac{y_0 y}{b^2} + \frac{x_0 x}{a^2} = 1 $$

以上，接線の方程式が求められました．
数学検定 準1級受験メモ: 放物線の接線の方程式導出

# 放物線とは
放物線の方程式は次の式で与えられる．
$$ y^2 = 4 p x$$

焦点は$F = (p, 0)\$で与えられ，準線は$x = -p\$ で与えられる．

図示すると以下のようになります．

https://www.desmos.com/calculator/vaevit3bri?lang=ja


# 放物線の接線の方程式の導出

まず $ y^2 = 4 p x$ の両辺を x で微分する．
$$ 2y \frac{dy}{dx} = 4p $$

よって，
$$ \frac{dy}{dx} = \frac{4p}{2y} = \frac{2p}{y} $$

さて，接線の方程式は$x$の一次式なので
$$ y - y_0 = m (x - x_0) $$
で与えられる．
 
ここで，$m$は接線の傾きであり，$(x_0, y_0)$は接線と放物線の接点の座標である．
接点にて接線の傾きは $m = \frac{dy}{dx} = \frac{2p}{y_0}$ である．
あくまで「接点での傾き」なので$\frac{2p}{y}$ではなく$\frac{2p}{y_0}$である．

この傾きを接線の方程式に代入すると
$$ y - y_0 = \frac{2p}{y_0} (x - x_0) $$
この式を展開していくと，

$$ y = \frac{2p}{y_0} (x - x_0) + y_0$$

$$ y_0 y = 2p (x - x_0) + {y_0}^2$$

$$ y_0 y = 2p (x - x_0) + 4 p x_0$$

$$ y_0 y = 2p (x + x_0)$$

以上，接線の方程式が求められました．
NuGetパッケージのリストアを無効にしてビルド時間を短縮する方法

プログラマーにとって、ビルド時間が短くなることは非常に重要です。nugetを使用してプロジェクトを作成する場合、nugetがパッケージを復元するために時間がかかることがあります。これは、nugetパッケージが複数ある場合や、インターネット接続が遅い場合に特に顕著です。

しかし、nugetパッケージを無効にすることで、ビルド時間を大幅に短縮することができます。以下に、nugetパッケージの復元を無効にする方法を紹介します。

## 方法1: NuGet.Configファイルの変更

プロジェクトフォルダにNuGet.Configファイルがある場合、以下の手順でNuGetパッケージの復元を無効にすることができます。

1. NuGet.Configファイルを開く
2. config要素内に、以下の行を追加する: <add key="disableSourceControlIntegration" value="true" />
3. ファイルを保存して閉じる

## 方法2: コマンドラインでパッケージの復元を無効にする

Visual StudioのNuGetコンソールで以下のコマンドを実行することで、nugetパッケージの復元を無効にすることができます。

```powershell
nuget.exe restore SolutionName.sln -DisableParallelProcessing -ConfigFile .\NuGet.Config -NonInteractive -NoCache
```

SolutionName.slnの部分を自分のソリューションファイル名に変更してください。

## 結論

nugetパッケージのリストアを無効にすることで、ビルド時間を大幅に短縮することができます。この方法は、パッケージの更新が頻繁に行われる場合や、インターネット接続が遅い場合に特に効果的です。是非お試しください。
Cの基本7 ~関数２・変数~　備忘録

### はじめに
私は初心者である。この備忘録を参考にされようとしている他の初心者の方は、ここに書かれていることを鵜呑みになさらぬようお願いしたい。何か間違いを見つけた方はコメント欄でご報告頂きたい。

___

### 関数の型と宣言

##### 関数の型
関数の引数と戻り値を合わせて関数の型という。
下記の関数では引数が`int`と`int`で戻り値が`int`だ。
```c
    int add (int x, int y) {...}
```
この書き方だと関数の型を宣言して本体を定義しているが、下記のように型だけを定義する書き方があるらしい。
```c
    int add (int x, int y);    // 仮引数の名前は省くことができる
```
このようにして関数を宣言することを**関数宣言**と呼ぶ。

C言語では関数宣言をするのが基本だそうだ。関数定義の前に、まとめて書くのが慣習とのこと。
`main`関数においてはもともと処理系が型を理解しているから宣言はしないらしい。

##### 関数宣言の役割

Cのコンパイラは上から順にプログラムをみる。関数宣言はコンパイラに関数の型を教え、関数を呼び出すための正しい機械語コードを作るのに利用される。

呼び出される関数を先に定義しておくと関数宣言の役割もこなしてくれるが、関数の数が多くなってくるとそのような作業も面倒くさくなる。関数宣言に慣れよう。

*2つの整数の和を求める関数`add`と関数宣言の例*
```c
    int add(int, int);    // 関数宣言

    int add(int x, int y) {
    return x + y;
    }

    int main(void) {
    int a, b;
    a = 10;
    b = 5;
    printf("a + b = %d\n", add(a, b));    // a + b = 15が出力される
    return 0;
    }
```
___

### 自動変数と再帰呼び出し

##### 自動変数


関数が呼び出されるときには、実引数の値が仮引数に代入される。仮引数は変数なので使用するにはメモリ領域がなければいけない。しかし、仮引数のメモリ領域というのは宣言した時に作られるているのではない。呼び出しの時に新しく作られ、関数から戻るときになくなっている。`local variable`みたいなもんだろうな。

このような特徴を持つ関数の仮引数や`if`文や`while`文などのブロック内で宣言される変数を**自動変数**と呼ぶ。

##### 再帰呼び出し
ハイ出てきましたこれ。再帰呼び出し。数学的なセンスがない私はとても苦手です。
```c
int rsum(int);

int rsum(int n){
    if (n==0)
        return 0;
    else 
        return n + rsum(n-1);    // 自分の中で自分自身を呼び出す（再帰呼び出し）
}

int main(void){
    int x;
    x = rsum(4);
    printf("%d\n", x);
    return 0;
}
```

再帰的に定義されるものについては再帰呼び出しを使うと簡単にプログラムを書ける場合が多い。しかし、再帰呼び出しより繰り返しを用いた方が、大抵は実行速度が速くメモリ消費も少ないらしい。
再帰呼び出し嫌いの私は積極的に繰り返しを使おう。

___

### レジスタ変数

```c
int main(void){
    register int i, j;

    for (i=1; i<=9; i++) {
        for (j = 1; j<=9; j++) 
            printf("%2d ", i*j);
        printf("\n");
    }
    return 0;
}
```
```c
 1  2  3  4  5  6  7  8  9 
 2  4  6  8 10 12 14 16 18 
 3  6  9 12 15 18 21 24 27 
 4  8 12 16 20 24 28 32 36 
 5 10 15 20 25 30 35 40 45 
 6 12 18 24 30 36 42 48 54 
 7 14 21 28 35 42 49 56 63 
 8 16 24 32 40 48 56 64 72 
 9 18 27 36 45 54 63 72 81
```
`register int i, j;`のように`register`という予約語がついている変数をレジスタ変数と呼ぶ。レジスタ変数には処理系に、できるだけその変数へのアクセスを早くしてくれと伝える意味がある。

`register`指定をしなくても、コンパイラは実行速度の速いコードを生成しようとする。これを最適化と呼ぶ。

##### レジスタ変数の制約
単項演算子の`&`はレジスタ変数に適用できない。この演算子はよく`scanf`の引数で使われる。これはアドレス演算子と言って、変数のアドレスを得る演算子だ。レジスタ変数の記憶領域としてプロセッサのレジスタが割り当てられることがあり、レジスタはメモリアドレスを持たないから演算ができない。
下記のようなコードが書けないということだ。
```c
register int x;
scanf("%d", &x);
```
___

### 外部変数
自動変数は有効な範囲が限られている変数だった。外部変数はプログラム中のどこでも有効な変数だ。
関数の外で宣言すれば外部変数になる。
```c
void add1 (void);

int x;    // 宣言

void add1(void) {
    printf("%d\n", x);
    x++;
    return;
}

int main(void){
    x = 2;
    add1();
    printf("%d\n", x);
    return 0;
}    // 2と3が出力される
```
プログラム全域に渡って使うような情報は外部変数を使うと便利だ。

ただ、他ファイルからのアクセスを可能にするには外部変数を作るだけではいけない。まずコンパイルは、ファイルごとにされるから、関数宣言は各ファイルごとにするか、`include`を使ってヘッダファイルを共有しなければならない。また、他ファイルからのアクセスを可能にするための`extern`宣言もしなければならない。


*追記　`extern`については[こちら](https://monozukuri-c.com/langc-funclist-extern/)がわかりやすい。*

___

>今回の内容は富永和人氏の[新しいC言語の教科書](https://www.amazon.co.jp/%E6%96%B0%E3%81%97%E3%81%84C%E8%A8%80%E8%AA%9E%E3%81%AE%E6%95%99%E7%A7%91%E6%9B%B8-%E5%86%A8%E6%B0%B8%E5%92%8C%E4%BA%BA-ebook/dp/B07P1TC98P)を参考に書き留めてます。
IPMI Console経由でKVM Console を起動する方法

# はじめに
物理サーバーを利用するにあたり、サーバー設定を外部から変更したり、監視をしたいという要件があるかもしれません。IBM Cloudのベアメタルでは、IPMI を介してサーバーにアクセスし、KVM console を介して Windows OS のログを確認します。

# 環境情報
ベアメタル
- **Processor**：3.8GHz Intel Xeon-CoffeeLake
- **OS**：Windows 2012 R2 FULL STD 64 bit
- **Motherboard**：SuperMicro X11SCW-F_R1.02

作業環境
- **ローカルOS**：MacOS Monterey 12.6


# 手順
## 1. ベアメタル詳細画面へアクセス
詳細は割愛します

## 2. KVM Consoleを開く
「**Actions**」->「**KVM Console**」をクリックし、KVM のログイン画面を開きます。
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2199676/12b6c0c7-bde1-4ccd-c6fe-d0df825c6414.png width=70%>

ベアメタル詳細画面サイドバーの「**Remote management**」を開き、
"**User**"と"**Password**"を確認します。
![Screen Shot 2023-02-14 at 23.33.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2199676/9ddc82a7-daf6-d7a8-57e9-d57ec74d5fce.png)

ログインできました。
![kvm_console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2199676/d4f28eb0-37b1-7d81-de44-ab237b145456.png)

## 3. KVM Console へのログイン
"SUPERMICRO" と書かれた部分をクリックします。
(launch.jnlpがダウンロードされます)
![kvm_download_jnlp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2199676/75fd989a-2dfa-8f3a-bb4c-1219b9eb4205.png)

launch.jnlpはJava Web Start を使用します。そこで、Java をインストールします。

インストールできたら、launch.jnlp を JavaLauncher で起動します。
![java_start.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2199676/f1fc4c26-5285-80f7-bf5b-ba229fbf359e.png)

しばらくすると、Windowsのログイン画面になります。
![access_ipmi.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2199676/6825ef63-4702-47d0-8eca-ea9f2183b82b.png)

上部「**Options**」より"Ctrl+Alt+Del"を選択するとPassword入力画面になるので、
ベアメタル詳細画面の「**Passwords**」サイドバーより、パスワードを入力します。
![Screen Shot 2023-02-14 at 23.33.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2199676/8362c94b-d088-7762-2cef-29b7961e56f3.png)

Windows OSの画面が見えました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2199676/2add7762-712b-5b90-0341-77f1425c7a3f.png)
新規boneが追加されたSkeletonをALSv4で使用する（Animation Curve）

# Skeleton
既存のALSv4のSKeletonに「Scabbard_Target01」というboneが追加されたSkeletonを使用する
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3119336/cbf80869-a03b-ee1b-de72-a3c4d9a8ba84.png">

# Animatin Blueprint
ALS_AnimBP > LayerBlendingに以下を追加する

<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3119336/054f9e92-fa76-7ffa-fa3d-865ef7e99aed.png">

ALS_AnimBP > LayerBlendingのHeadのblend per boneから繋ぐ感じで以下を追加し、出力はArm_Lのblend per boneに繋げる

<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3119336/21781d80-f0ee-5507-4874-ea28ed56135d.png">

Scabbard_Target01のblend per boneの以下の設定にする

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3119336/b474b905-524a-ded5-b697-3ab6cd585161.png">

ALS_AnimBP > UpdateLayerValueに以下を追加する

<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3119336/e909e287-a63f-822e-4756-c4d28d8b625f.png">

# Animation Curve
Animation Sequenceで「Layering_Scabbard_Target01」「Layering_Scabbard_Target01_Add」のAnimation Curveを追加する

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3119336/9d145469-2a42-d457-e3d7-ca04d5e83369.png">

※適宜スロットや変数をいい感じに追加

# 参考
https://www.youtube.com/watch?v=6iscGKfZc-Q&list=WL&index=4
良いコードは良い机から 〜デスク周りのコスパライフハック術〜

## はじめに

自分が在宅勤務を始めてからおよそ３年。  
快適に仕事ができる環境を求めて辿り着いたのは100均でした。  

## ターゲット 

+ **金欠の人**
+ 配線・収納で困っている人
+ 花粉症の人
+ （腰痛の人）

## 収納編　

### PCラック 

大き目の100均にはDIYコーナーがあります。　
板材・角材・ボックスなど種類も豊富。　
木工用ボンドでくっつけるだけで簡単に棚が作れます！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557050/65e43023-c8a2-c4d7-997a-f94072cb4f61.png)

### カバンフック　

リモートワークがメインでも、たまには出社しますよね。　
そんな時、手の届くところにカバンがあると荷物の出し入れがスムーズ。
主要な100均どこでも見つかります。　
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557050/fbe682bc-917e-5ef7-7b5d-e9fb69b9d639.png)

### 小物入れ　

小物入れは常に手の届くところに！　
マグネット式のフックで小物入れを吊るして収納。　
デスクを広く使えます。　
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557050/1cc1ea95-916b-ccb1-8b9f-bd20eac1a87f.png)

## 配線編　

### 電源タップ　

コンセントも手の届くところに！
磁石付きのタップでなくても強力テープで貼り付ければ問題解決。
写真左のCROCODILE GRIPの方。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557050/83cb3509-944c-d33e-041b-a84f1ea29f4b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557050/ccda93f9-97cf-a686-73fc-868fcdd90000.png)

### ケーブルホルダー

ケーブルホルダーに一工夫。
磁石をつけてステンレス板に貼り付けることで使い勝手が100倍に！
（個人の感想です。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557050/9025cc80-304d-6f31-c44b-212971a00479.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557050/3c1f1446-fed0-0466-013c-aaae486b109f.png)

### 裏の配線

配線はマグネットフックでぶら下げたワイヤーネットに括り付ける。　
ごちゃごちゃ配線も多少はマシになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557050/c041b0ec-842e-a05b-d422-2fcaaea58d34.png)

## 健康編

### 花粉症対策　

ティッシュとゴミ箱は必需品です。
ティッシュボックスはCROCODILE GRIPで貼り付け収納。　
ゴミ袋はYAMORI GRIPでペタッと貼り付け。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557050/0e033c4e-fcb7-9322-199d-5a5bbe877fc5.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557050/ef71da0c-7616-b34d-62f9-7d3727596237.png)

### 番外編：腰痛対策

これは流石に100円では無理でした。。。
正しい姿勢は超大事。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557050/0c293b93-f31e-2d03-0d63-41b093df6a46.png)

## さいごに

デスクの快適さは費やした金額では決まらない。
知恵と工夫でいくらでも快適にできます！
皆さんの開発環境（物理）の改善にお役に立てれば嬉しいです。
Leetcode 67. Add Binary

https://leetcode.com/problems/add-binary/description/

```java
class Solution {
    public String addBinary(String a, String b) {
        StringBuilder sb = new StringBuilder();

        int i = a.length() - 1;
        int j = b.length() - 1;
        int carry = 0;
        while (i >= 0 || j >= 0) {
            int sum = carry;
            if (i >= 0) {
                sum += a.charAt(i) - '0';
                i--;
            }
            if (j >= 0) {
                sum += b.charAt(j) - '0';
                j--;
            }
            if (sum >= 2) {
                carry = 1;
            } else {
                carry = 0;
            }
            sb.append(sum % 2);

        }

        if (carry != 0) {
            sb.append(carry);
        }
        return sb.reverse().toString();
    }
}
```

- [こちら](https://www.youtube.com/watch?v=ocD8RsILeuI&t=24s)を参考しました
iperf3についても備忘録

# はじめに
iperf3について調べたことの備忘録です


# 目次
[1.はじめに](#1-はじめに)
[2.内容い](#2-内容い)
[3.内容ろ](#3-内容ろ)
[4.内容は](#4-内容は)
[5.おわりに](#5-おわりに)

# 1. iperf3とは
PCなどの機器2台間のネットワークパフォーマンスなどを測定するためのツール。
tcpとudpを使用してパフォーマンスを測定することが可能であり、
オプション指定で切り替えるが、特段指定しない場合tcpが使用される。
それぞれの機器上にiperf3のツールをダウンロードしておく必要がある。
Windows間だけでしか使ったことがないが、LinuxとWindows間なども測定可能らしい。

iperf3のダウンロードURL
https://iperf.fr/iperf-download.php

# 2. 使い方

用意した機器をサーバー側とクライアント側に分ける必要がある。
それぞれの機器にiperfのサイトからツールをダウンロードした後、
コマンドプロンプトなどでダウンロードしたフォルダに移動し、下記のコマンドを入力することでパフォーマンスを測定できる。

サーバー側のコマンド
```
ipefr3 -s
```

クライアント側のコマンド
```
ipefr3 -c "サーバー側の機器のIPアドレス"
```

クライアント側のコマンドでは下記オプションをつけることもでき、自分が使用するオプションは下記のもの。

|オプション  |内容  |
|---|---|
|-u  |udpでパフォーマンスを測定する  |
|-V  |詳細表示(パフォーマンス測定にかかったCPUの使用率なども分かる(多分))  |
|--logfile "ロフファイル名" |測定内容をログファイルに出力する|
|-w  "ウィンドサイズを指定(例:10M)"| ウィンドサイズを指定する(tcpで測定している時のみ限定)|

補足:
・udpでパフォーマンスを測定する時のBandWidthは実際の測定値ではない(ACK応答がないためらしい)。
・udpでパフォーマンスを測定する時、ジッタとロスト率を測ることができる
ジッタについて参考サイト
https://digitaldiy.jp/article/esportsgame/17350/
・ウィンドサイズに大きいものを指定することで、パフォーマンス値は向上する
(ACK応答がくる頻度が減るので、その分パフォーマンスが上がる？)。
ウィンドサイスについての参考サイト
https://www.infraexpert.com/study/tcpip11.html

# 4. エラーが出た場合
```error - unable to connect to server: Connection timed out```
というエラーが出たことがあった。
その際はファイアーウォールの設定が影響することがある。
自分の時は、接続されているネットワークの種類の設定がプライベートになっているかと勘違いしていたら、
実際はパブリックの設定になっていた。

# 5. 所感
ツールをダウンロードするだけで、パフォーマンスを測ることができる手軽さは魅力的だと思った。
インターネット越しでパフォーマンスを測定する際は、ウィンドサイズを指定してあげた方が良いパフォーマンスが出る。
udpで測ることにより、ジッタやロスト率を知ることができネットワークの状況把握に使えそうだなと考えた。


# 5. 参考記事
[ネットワークの実効速度を測ることのできる「iperf3」の使い方](https://chateau-vulpes.com/entry/iperf )
[iperf3コマンド使い方、オプション一覧](https://qiita.com/yokoc1322/items/bfd8b6e69d6bdb3bb1c6 )
Pycharmのターミナル起動時出力される「このシステムではスクリプトの実行が無効になっている～」ログの解決法

# 環境条件
    Windows 11 Home
    pycharm

# 状況
学習を進めていく途中でpycharmを知り、毎回Terminalを開くと出てくる
怪しげなログが気になったので調査してみた。
そこまで深く追及する気はなし。
治ったのなら、ひとまずOKの精神。
ちなみに出力されているのはこんなログ。
~~~
Import-Module : このシステムではスクリプトの実行が無効になっているため、ファイル~
~~~


# 原因
PowerShellの "Excution Policy" の値が "Restricted"となっているためらしい。

# 解決策
その "Excution Policy"の値を" RemoteSigned" に変更すればよいらしい。

# 過程
①確認コマンド`Get-ExecutionPolicy`を実行。
~~~
PS C:\WINDOWS\system32> Get-ExecutionPolicy
Restricted
~~~

②設定コマンド`set-executionpolicy remotesigned`を実行
~~~
PS C:\WINDOWS\system32> set-executionpolicy remotesigned

実行ポリシーの変更
実行ポリシーは、信頼されていないスクリプトからの保護に役立ちます。実行ポリシーを変更すると、about_Execution_Policies のヘルプ トピック (https://go.microsoft.com/fwlink/?LinkID=135170)
で説明されているセキュリティ上の危険にさらされる可能性があります。実行ポリシーを変更しますか?
[Y] はい(Y)  [A] すべて続行(A)  [N] いいえ(N)  [L] すべて無視(L)  [S] 中断(S)  [?] ヘルプ (既定値は "N"): y
~~~

③再びPycharmにおいてTerminalを起動し、問題のログが出てこなければ成功。

# 結論
とりあえず、問題のログは消えたことを確認。
設定コマンドを入力した際に出てきた、脅しの長文には少しビビった。
触らない時は Restricted にしておいた方がよいみたい。

# 参考
https://rainbow-engine.com/ps-script-execution-disabled/
MongoDBのコネクションプールがわからなかったので調査

恥ずかしながらMongoDBなどNoSQL系は業務経験がなく、最近勉強中の身です。
[Express＋Typescriptプロジェクトのひな形をささっと作る](https://qiita.com/tomoyanp/items/8f039493570c7d29ae86)で作成したExpressからMongoDBに接続する形でやってます。

MongoDB公式のドライバを使用してますが、dbの接続部分は下記のような記述をよく見かけます。
```javascript
MongoClient.connect('mongodb://localhost:27017/db', (err, db) => {
  db.collection('mycollection').insertOne(xxxxxx);
  db.close();
})
```

シンプルに、毎回connectしてcloseするの？？？コネクションプールとかないの？？？となったので実機で試してみた記事です。
なんとなく調べていると、MongoClientにプール数を指定することは可能で、connectメソッドを呼んでも毎回接続しているわけではなくプーリングされた接続を使いまわしているという情報を発見。
いろいろ実験してみます。

### とりあえず試してみる
```javascript
export async function connect() {
  const client = await MongoClient.connect(MONGODB_URI, {
    minPoolSize: 40, // コネクションプール数を40にしてみる
    maxPoolSize: 40,
  });

  return client.db('example');
}

connect(); // 接続
```
### 結果
```
> db.serverStatus().connections
{
        "current" : 42, // ローカルの接続もあるので多少ずれるけどOK
        "available" : 777,
        "totalCreated" : 304,
        "active" : 2,
        "exhaustIsMaster" : 0,
        "exhaustHello" : 0,
        "awaitingTopologyChanges" : 1
}
```
Expressを起動してconnectを呼ぶと、40のコネクションが作成されてますね。
connectを何度呼んでも最初に作成されたコネクションプールが使いまわされるのでしょうか？

なんとなく、最初に呼んだMongoClient.connectの戻り値（client）を使いまわすようにしないとだめな気がする。
試しに、40回connectを呼んでみる
```javascript
export async function connect() {
  const client = await MongoClient.connect(MONGODB_URI, {
    minPoolSize: 40,
    maxPoolSize: 40,
  });

  return client.db('example');
}

for (let i = 0; i < 40; i++) {
  connect();
}
```

### 結果
```
> db.serverStatus().connections
{
        "current" : 485, // 40余裕で超えてる！！
        "available" : 334,
        "totalCreated" : 8256,
        "active" : 2,
        "exhaustIsMaster" : 0,
        "exhaustHello" : 0,
        "awaitingTopologyChanges" : 1
}
```
ですよね。。。計算合わないけどとりあえずconnectを毎回呼んでよいものではなさそう。
というか、connectした結果をグローバル変数に突っ込んでおいて、Expressを起動 → あとみんなで共有。というやり方だろうな。きっと。

### まとめ
```javascript
export async function connect() {
  const client = await MongoClient.connect(MONGODB_URI, {
    minPoolSize: 40,
    maxPoolSize: 40,
  });
}

export let db: Db; // これをみんなで使いまわす

// connectに成功したらdbを変数に格納
// その後サーバを起動する
connect().then((d) => {
  db = d;
  server.listen(port);
});
```
多分こんな感じですね。。。どこかのページでも似たような記述を見た気がしました、、、
変なことしてたらどなたかご指摘ください。。。
UE5.1で追加されたFActorSpawnParameters::CustomPreSpawnInitalizationでアクターにパラメータをセットしてみる

UE5.1からアクターを生成する時に与えるパラメータ*FActorSpawnParameters*に*CustomPreSpawnInitalization*メンバが追加されました。

アクター生成時にBeginPlayが呼ばれるより前にパラメータをセットしておく方法は、ブループリントだとプロパティのExpose on Spawnにチェックを入れる、c++であればUWorld::SpawnActorDeferredでアクターを作成した後にパラメータをセットしてUGameplayStatics::FinishSpawningActorを呼び出すといった方法がありますが、CustomPreSpawnInitalizationはそれより早い段階でアクターを操作できることが特徴です。

# アクターの生成処理の流れ
アクターが生まれる時の処理の流れはこちらで解説されています。

https://docs.unrealengine.com/5.1/ja/unreal-engine-actor-lifecycle/

以下は一部を拝借して少し追加したものです。

----
- SpawnActorが呼び出される
- NewObject<AActor>
  - コンストラクターの実行
  - PostInitProperties
- **CustomPreSpawnInitalization**
- PostSpawnInitialize
  - RegisterAllComponents (ルートコンポーネントがc++で定義されている場合)
- PostActorCreated
- (SpawnActorDeferredを呼び出した場合はこのタイミングでユーザーコードを実行)
- ExecuteConstruction:
  - OnConstruction
- PostActorConstruction:
  - PreInitializeComponents
  - InitializeComponent
  - PostInitializeComponents
- OnActorSpawned
- BeginPlay

----

CustomPreSpawnInitalizationはNewObject<AActor>が終わった後にすぐに呼び出されるため、**特にRegisterAllComponentsの前にパラメータをセットしたい場合**に威力を発揮します。

# 使い方
CustomPreSpawnInititalizationの型は *TFunction\<void(AActor\*)\>* となっているのでラムダなどの形でユーザーコードを実行することができます。
以下の例はGeometryCollectionComponentを持つアクターを生成し、そのRestCollectionに任意のアセットを設定しています。
GeometryCollectionComponentはRegisterComponentが呼び出されるタイミングで適切なRestCollectionが設定されている必要があるため、CustomPreSpawnInitalizationを利用することが有効です。
```
void UMyBlueprintFunctionLibrary::SpawnGC(const UObject* WorldContextObject, TSubclassOf<AActor> ActorClass, UGeometryCollection* InRestCollection, FTransform InTransform)
{
	if (UWorld* World = GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::ReturnNull))
	{
		FActorSpawnParameters Parameter;
		Parameter.CustomPreSpawnInitalization = [&](AActor* Actor)
			{
				UGeometryCollectionComponent* Component = Actor->FindComponentByClass<UGeometryCollectionComponent>();
				if( Component )
				{
					Component->SetRestCollection( InRestCollection );
				}
			};
		World->SpawnActor<AActor>( *ActorClass, InTransform, Parameter );
	}
}
```
InfraCostでAWS ECS Clusterのコストを見積もり

1. Install Infracost VSCode Extension https://marketplace.visualstudio.com/items?itemName=Infracost.infracost
2. Connect VSCode to Infracost.
3. Open Terraform main.tf, then you can see AWS monthly cost. 
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3126935/c01d9440-d23a-4839-acb8-e166423342cb.png)
4. Click the link to see the details.
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3126935/a3f5e1a7-82c2-4126-c6cc-994b5417a0de.png)
FastAPI勉強用(初期設定編)

# 作業目的
Apacheを介して、FastAPIにアクセスする。

# 環境
RedHat EnterpriseLinux 8.7
Python 3.8
※RHEL8.7のデフォルトのPythonは3.6だが、WebSocketの検証も行う予定のため、3.8を使用する。。

## FastAPI環境構築
```
# pip3.8 install "fastapi[all]"
```
:::note warn
以下の方法ではインストールは行えたが、サンプルとの疎通試験で、`telnet localhost 8000`で無応答であった。プロンプトの応答もなし。
```
pip3.8 install fastapi uvicorn
```
2023/02/24追記
別マシンで`curl http://localhost:8000`で確認したところ、疎通確認はできた。
telnetでもリクエストヘッダを適切に指定すれば疎通確認ができるとは思うが、curlでよいと思う。
:::

# FastAPIの設定
## サンプルプログラム
```
$ mkdir /www/api/fastapi_server
$ cd /www/api/fastapi_server
$ vi main.py
```
:::note info
サンプルプログラムは以下のmain.pyを使用。シェバンは不要。
https://fastapi.tiangolo.com/ja/tutorial/first-steps/
:::

## サービス起動
ポートはデフォルトの8000を使用する。
```
$ uvicorn main:app --reload
```


## FastAPI単体での動作確認
ポートを開放して、アクセスできるホストの制限を外す。
```
# su 
# firewall-cmd --add-port=8000/tcp
# exit
$ uvicorn main:app --reload --host 0.0.0.0 --port 8000
```
:::note warn
デフォルトでは`127.0.0.1`からののみ受け付ける。`--host 0.0.0.0`でIPアドレスの制限が無くなる。
サブネットマスクで制限できる方法は別途調べる。
ポートを変更する場合は`--port`オプションで変更できる。
:::
### 別ターミナルからの確認
```
$ curl http://localhost:8000
レスポンスが返ってくることを確認
```
:::note warn
`telnet localhost 8000`ではBad Requestになる。RequestHeaderを設定すれば動作するかもしれないが、curlで十分
:::

### 別PC(Win10)のブラウザから確認
```
ブラウザで以下のURLにアクセスする
http://IPアドレス:8000/
```
### 確認終了後
開放していたポート8000を閉じる。
```
# firewall-cmd --remove-port=8000/tcp
```

## Apacheを介して接続できるようにする。
/apiはFastAPIにアクセスできるようにする。
```diff:httpd.conf
-#LoadModule proxy_module modules/mod_proxy.so
-#LoadModule proxy_http_module modules/mod_proxy_http.so
-#LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so
+LoadModule proxy_module modules/mod_proxy.so
+LoadModule proxy_http_module modules/mod_proxy_http.so
+LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so
```
:::note info
proxy_wstunnel_moduleを有効にしているのは、WebSocketの試験を行うため。
WebSocketを使用しないならば、proxy_wstunnel_moduleはコメントアウトのままでよい。
:::
```extra/httpd-ssl.conf
SSLProxyEngine on
<Location /api/>
    ProxyPass        http://localhost:8000/
    ProxyPassReverse http://localhost:8000/
</Location>
```

## systemdでFastAPIの自動起動設定
```service:/etc/systemd/system/uvicorn.service
[Unit]
Description=The uvicorn process
Before=httpd.service
After=network.target remote-fs.target nss-lookup.target

[Service]
User=www
Group=www
WorkingDirectory=/www/api/fastapi_server
ExecStart=/usr/local/bin/uvicorn main:app --reload
ExecReload = /bin/kill -s HUP $MAINPID
ExecStop = /bin/kill -s TERM $MAINPID

[Install]
WantedBy=multi-user.target
```
```
# systemctl daemon-reload
# systemctl restart uvicorn
# systemctl enable uvicorn
```

### 動作確認
ブラウザで`https://IPアドレス/api/`を表示して、レスポンスが表示されることを確認する。

# ToDo
api/docs ではswaggerのドキュメントが参照できないので調査する。

# 参考

https://fastapi.tiangolo.com/ja/

https://qiita.com/bee2/items/75d9c0d7ba20e7a4a0e9

https://note.com/kiyo_ai_note/n/n6f8b45161d89#5886a912-f951-4d18-83c0-473812431b9a


https://qiita.com/sand/items/ebd4812138e0a5d3a444

https://tech.morikatron.ai/entry/2020/06/22/100000

https://qiita.com/ekzemplaro/items/dd04dac58a147bea5c74