OmniAICreator/Qiita-1.07M huggingface dataset:
MLプロジェクトにおけるdocker-compose.ymlの便利帳

## 概要
- MLプロジェクトにおいて再現性は重要である
- 環境構築では、Dockerfileやdocker composeが併用して用いられる
- pythonのpackage管理ではpoetry, aptのpackage管理はDockerfile内で行うことが多い
- docker-compose.ymlを呪文のように意味を考えずに書いていると、ツボにハマるので注意が必要
- 個人的に理解した項目を理解した順（≠体系的）に記載していく（=読みづらい）


## DockerfileのFROMとdocker-composeのimageは何が違う？

以下のようなDockerfileとdocker-compose.ymlがあった場合に、
```bash
# Dockerfile
ARG PYTORCH="1.9.0"
ARG CUDA="11.1"
ARG CUDNN="8"

FROM pytorch/pytorch:${PYTORCH}-cuda${CUDA}-cudnn${CUDNN}-devel
```

```yaml
version: '3.8'
services: 
  mmdetection:
    image: pytorch/pytorch:1.9.0-cuda11.1-cudnn8-devel 
    container_name: mmdetection
```

DockerfileのFROM {image-name}とdocker-compose.ymlのimage: {image-name}のimageの役割が被っているけども、これって何が違うの？という疑問が湧いてきた。

chatgptに聞いてみると、このような回答を得た。


:::note info
DockerfileのFROM指定
これはビルドプロセスで使用されるベースイメージを指定します。新しいカスタムイメージを作成する際の出発点です。

docker-compose.ymlのimage指定
これは2つの目的を持ちます。
1. ビルドされたイメージに名前を付ける：docker-compose.ymlにbuildセクションがあり、imageも指定されている場合、ビルドプロセスで作成されるイメージにこの名前が付けられます。つまり、Dockerfileで作成されたカスタムイメージをレジストリにプッシュする際や、後で参照する際にこの名前を使用します。
2. 既存のイメージを使用する：buildセクションがなく、imageのみが指定されている場合、その指定されたイメージがコンテナを起動するために直接使用されます。
:::

なるほど。いつもdocker-composeとDockerfileを併用していたので気づかなかったけれども、docker-compose.ymlだけでもDocker containerは構築できるらしい。その際、`image: `に指定したImageをベースとしたcontainerが構築されるとのこと。aptやpipのパッケージ管理をしないで良いようなImageをベースとするならば、Dockerfileなしの状態でdocker-compose.ymlだけでも事足りるとのこと。


細かいところだけども、`Dockerfile`の`FROM`＋`docker-compose.yml`の`image: `双方でImaegが指定されている場合の挙動も気になった。

:::note info
docker-compose.ymlとDockerfileの両方でイメージが指定されている場合

ビルドプロセスが含まれる場合：docker-compose.ymlでbuildパスが指定されている場合、Dockerfile内のFROMで指定されたベースイメージが新しいイメージのビルドに使用されます。そして、docker-compose.ymlのimage指定は、そのビルドされたイメージに名前を付けるために使用されます。

ビルドプロセスが含まれない場合：imageのみがdocker-compose.ymlに指定されている場合、そのイメージがコンテナを起動するために直接使用されます。この場合、Dockerfileは関係ありません。
:::

この場合は、Dockerfile指定のimageが優先されるらしい。両方にimageを指定する場合は、上記の挙動は知っておかないと行けなさそう。


## docker-compose.ymlのGPU使用の文法はどんな意味があるのか

GPUを使用するymlファイルを記載する場合、以下のような記述をよく見かけるけども、それぞれどんな意味があるのか知りたいと思った。それぞれかなり長い。
```yaml
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: 1
              capabilities: [gpu]
```

これもchatgptに聞いてみると以下のような回答を得た

:::note info
この設定は、以下のパラメータを含んでいます：

`driver`: 使用するデバイスドライバを指定します。ここではnvidiaが指定されており、NVIDIAのGPUを使用することを意味します。
`count`: 予約するデバイスの数を指定します。1が指定されている場合、1つのNVIDIA GPUがサービスに予約されます。
`capabilities`: 予約するデバイスの能力を指定します。ここでは[gpu]が指定されており、GPU処理能力を必要とするタスクに使用されることを意味します。
:::

ちなみに、CPUについても指定ができる模様。limitsで「確保できるresourceの上限値」を指定でき、reservationsで「常に確保できるresource」を指定できる。機械学習においてはあまり使うシチュエーションが思いつきませんが、A100など強大なサーバーに対して数個のコンテナを立てる場合は、こまかな指定をしないとそれぞれのコンテナ同士が競合してしまって安定した稼働ができないのかもしれない。

https://docs.docker.jp/compose/compose-file/compose-file-v3.html#resources


```yaml
version: "3.9"
services:
  redis:
    image: redis:alpine
    deploy:
      resources:
        limits:
          cpus: '0.50'
          memory: 50M
        reservations:
          cpus: '0.25'
          memory: 20M
```

少し中途半端だけども、自分なりの疑問が一つ解決したのでここで記事は終了！
SSHログインについて


# SSHログインとは
SSH(Secure Shell）は、暗号や認証の技術を利用して、リモートシステムへの安全なログインに使用されるプロトコルのこと。
SSHを使用してリモートシステムに接続して操作する際などによく使われる。
Macでは、ターミナルでSSHを利用できる。

# 基本的な構文
リモートシステム上のユーザー名とローカルシステムのユーザー名が同じ場合はユーザー名などを指定せずに以下だけで接続ができる。
```
ssh {接続しようとしているIPアドレスやドメイン名}
```


リモートシステムのユーザー名と異なる場合は2つの方法でログインする。

# パスワード方式
```
ssh {リモートユーザー名} @ {接続しようとしているIPアドレスやドメイン名} -p {ポート番号}
```
```
Are you sure you want to continue connecting (yes/no)?
```
パスワードを求められるので入力してログイン。

# 秘密鍵方式
パスワード方式とは別に公開鍵(Public Key)と秘密鍵（Private Key）と呼ばれるセットの鍵を用いた認証を使ってログインすることもできる。

秘密鍵は公開したらダメな鍵。公開鍵は公開しても大丈夫。

公開鍵はリモートのサーバー側に置いておき、秘密鍵は自分のPCに保管する。


## 鍵の作り方
https://qiita.com/suthio/items/2760e4cff0e185fe2db9

まず現在持っている鍵を確認する。
```
ls -al ~/.ssh
```

これでそれぞれの鍵の強度を確認できるらしい。
（鍵長が2048以上かつ暗号化方式がRSA、或いはECDSAやEd25519であればOKとのこと）
```
ssh-keygen -l -f ~/.ssh/id_rsa.pub
```
新しく鍵つくる。
```
ssh-keygen -t ed25519 -C "your_email@example.com"
```

```
Enter file in which to save the key (/Users/you/.ssh/id_rsa): [Press enter]
```
ここで保存場所を指定してなければ~/.ssh/の中に鍵たちが入る。

```
Enter passphrase (empty for no passphrase): [Type a passphrase]
```
passphraseの入力を求められるが、これは秘密鍵にアクセスするためのもので、任意なので設定しないこともできる。

# 秘密鍵でログインする
下記でログインできる。
```
ssh -i {秘密鍵のファイルパス} {ユーザー名}@{サーバーのアドレス} -p {ポート番号}
```
※ポート番号は不要ならいらない
AWS WAFを使って特定のIPのみアクセス可能な環境を作る

# 初めに
生後5ヶ月の娘に重くなったね〜と言ったら笑いながら胸ぐらを掴まれ恐怖を感じた27歳です。
今回は全三部構成（多分）の第三部となっております。（前回までの内容は下記にリンクを貼っておくので興味があれば！）


# 前回のあらすじ

CloudFront + S3で作った環境に関しては下記２つのQiitaを見たら誰でもできます！

https://qiita.com/rakkun/private/cbfa52a7fee3f7c0ea39

https://qiita.com/rakkun/private/dc98801524eb2abc6703


# 今回やったこと
AWS WAFを使ってCloudFrontにアクセスできるIPを制限してみた

## WAFとは？
- ウェブアプリケーションファイアウォール
    - いろんな通信（SQLインジェクション、IPアドレス）を検知し遮断できる
    - 今回は特定のIPだけアクセスさせる目的で使用
    - （ちょっとお金かかるよ）

## イメージ
![スクリーンショット 2024-02-14 22.24.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/685033/9d102b9d-88cd-a705-77bf-45125734a00f.png)

- CloudFrontにアクセスする際にWAFでIPのチェック
- S3はCloudFrontからのアクセスしか許可しない

## 手順
1. 前回のあらすじの環境を用意
1. (WAF)[https://aws.amazon.com/jp/waf/]の画面から `IPSet`※1　を作成
1. WAFの画面から`ウェブACL(ウェブアクセスコントロールリスト)`※2 を作成


※1 IPSet: IPアドレスのコレクションなどを返す（今回の場合アクセス許可をするIPを用意）
※2 [ウェブACL](https://docs.aws.amazon.com/ja_jp/waf/latest/developerguide/web-acl.html): ここでIPとか攻撃を検知、事前に設定した対応をする（今回は基本的にリクエストはブロック、特定のIPだけ許可するみたいな設定にしている）

## 実際にやってみる
画面共有で写します(発表形式でやったので、そのうち詳細は書きたい)


# 感想
- いまだに料金の計算が曖昧。。。
  - ~~ウェブACLを作成したら 5USD かかるのかと思ったらそうでもない~~
  - 時間で案分って書いてあった・・・
  - https://aws.amazon.com/jp/waf/pricing/
- 会社のVPNのIPで絞るより家のWi-Fiで絞る方が厳しかった
  - ネットの環境がIPv4, IPv6でIPSetの書き方大きく変わる落とし穴
selenium in pythonでedgeを自動操作しMicrosoftRewardsを増やす方法～♪

# 初めに
Edgeはseleniumで自動化できるんだってらしい。
というわけで、

\1. Edgeのwebdriverをダウンロード
\2. 任意の場所に解凍
\3. webdriverのパスを環境変数Pathに追加
\4. 下記のコードを記述
```python:RewardsCreater.py
# 必要なものもろもろをインポート
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys

import time as timer

# driverを起動
driver = webdriver.Edge()

# ランダムな３０個の検索キーワード（Cpilotさんに頼んだら普通に作成してくれたｗ）
words = [
    "apple", "banana", "chocolate", "dog", "elephant",
    "flower", "guitar", "hiking", "internet", "jazz",
    "kangaroo", "lemon", "mountain", "notebook", "ocean",
    "piano", "quantum", "rainbow", "sunset", "tiger",
    "umbrella", "volcano", "waterfall", "xylophone", "yoga",
    "zebra", "astronomy", "beach", "coffee", "dragon"
]

# １検索につき３ポイント、最大９０ポイントだから、３０回繰り返せばよい
for i in range(30):
    # 検索ページへ行く
    driver.get("https://www.bing.com/?form=ML2PCO")
    # 気長に、機械に負担をかけぬよう、待ちましょう☕~
    timer.sleep(5.0)
    # 検索ボックスを取得
    target = driver.find_element(By.ID, "sb_form_q")
    # 検索ボックスにwordsの検索キーワードを入力
    target.send_keys(words[i])
    # 検索ボックス内でEnter！　→　検索される
    target.send_keys(Keys.ENTER)
    
    # 待つことは大切です（カップラーメンだって3分も待つでしょう？（私は７分ぐらいでも可））
    timer.sleep(5.0)

# 以上です！とても単純ですね！ｗ
```
\5. メールを開きながらDiscordを開きながらSlackを開きながらAmazonを開きながらXを開きながらInstagramを開きながらYoutubeを見ながら上記のコードを記述したファイルを、実行！

# 最後に
パソコンを使って作業をするなら、パソコンに作業をさせましょう！
バックグラウンドでの作業は大事です！

そして、簡単にMicrosoftRewardsは増やせる
大量のプロファイルでipアドレスいじって実装したりすれば簡単に大金が入ったり…
ちょっと利用規約を読まないと危ないですね。

最後まで読んでくれてありがとう！
【Kotlin】Flow から条件を満たす値が流れてくるまで suspend する

次のようにすると、
0〜9が流れてきている間は `collect` が suspend し続け、
10 が流れてきたら `collect` が終了して `"Finshed"` が出力される。

```Kotlin
flow {
    var count = 0
    while (true) {
        emit(count++)
    }
}.takeWhile {
    it < 10
}.collect {
    println(it)
}
println("Finished")
```

／以上
ただの高校生が1ヵ月本気で技術力向上目指す

# 僕はだぁれ
まずは僕の自己紹介をしていこうと思います。
- 高等専門学校というところに通っている1年生(もうすぐ2年生)
- プログラミングをちょくちょくやってたりする
- 勉強はまずまずといった感じ

とりあえず自分の特徴となる項目を挙げてみたけど、特に自分を表せるなにかが見つかりませんでした笑

高等専門学校という文字列を見て「??」が浮かぶ方に簡易的に説明をすると、普通高校よりも少し専門分野を学ぶというところです。
僕がこの記事の読者だとしたら、「僕とは違う世界の人だ…」とか勘違いしそうなので一応訂正を。

> 高専は**専門分野を学べるところ**です

何が言いたいかというと、学べる場所はあっても、何もやらなければ変わらないということです。(自分にぐさぐさクる泣)
話が長くなりすぎました！次行こう！

# 僕のスペック
- c++という言語の構文がある程度わかる
- JavaScriptも構文くらいは分かる
- 開発経験は皆無

技術力に関しては、プログラミング言語の構文をちょろっと知ってる程度です。それを実際の開発に生かせたことなんてないです。
初心者によくある「Progateの後ってなにすればいいんだぁあ！」という典型パターンです。だから安心して！(誰に言ってるんでしょう)
※Progateっていうのはプログラミングを学べるサイトのことです。

# 1ヵ月本気の技術力向上プログラム
やっと本題に入りますが、高専生ならではの長期期間を使った大幅な自分のレベルアップを図ろうと考えています。グダグダとコードを書いている自分に終止符を打とうと思った今日この頃の僕です。
最近qiitaで有名な*Watanabe Jin*さんが運営している**JISOU**というサービスに参加させていただいて、コーチングを受けています。
Reactを中心に学習楽しんでいきます！

本題なのに短い！💦

# 目標
- 短期
自分の作りたいと思ったものを即形にできる力を養うこと！
- 中期
仲間とコンテストに出ること！もちろん自分も活躍する
- 長期
正直まだあんまり見えてない！

これからqiitaで投稿続けていくのでぜひ応援よろしくお願いします。エンジニアになりたい学生のみんな、一緒に頑張ろう！
Mindと日本語について（2）

なんとか『記号と再帰』を読み終えました。内容を半分も理解できませんでしたが惹かれるものがあり、著者の続篇『言語とフラクタル』を購入してしまいました。積読を一冊減らしたのにまた一冊増やしてしまったようです。英語の論文を著者自ら翻訳したもので難しさたるや半端ないです。

「Mindは日本語で記述できる　→　習得が容易、開発効率が高い」

とうのは本当かという命題に対して、反語的に日本語プログラミング言語Mindから日本語を取ってみてはどうかと発言しました。自然言語とプログラミング言語を混同してしまうと議論にならないと思えたからです。さらにややこしいことに日本人の問題があります。プログラミングを容易にするのは、母語だからなのか日本語だからなのか。

いままで自然言語とプログラミング言語と人間（日本人）は別々に考えていました。

プログラミング言語は自然言語ではない。
自然言語は人間が創造したもの。
日本語は印欧語とは仕組みが異なる。

日本語を母語とする日本人にとってはMindは扱いやすいプログラミング言語である。「Mindは習得しやすい」ということに関しては、プログラミングは別言語で習得していたので真であるかはわからないが、日本語で記述できる（考えることができる）ので開発効率は高いと証言できます。

だいたいそんな風に考えていましたが、自然言語もプログラミング言語も人間も、記号であるというパースの汎記号主義に触れて驚きました。

ならばですね、Mindの真価を確かめるのにMindのマニュアルを翻訳して日本語を母語としない人にプログラミングさせてみる必要があります。
それ，numpy で書かない？--7-- いや，もうリストやめよぅ

「エラトステネスの篩」の記事は，ここでも，もう数十回あるんじゃないだろうか。車輪の再発明もいいとこだ。
そして，リストを使わないほうが良いよというのも，何回か書いた。

それ，numpy で書かない？--3--
https://qiita.com/WolfMoon/items/0483ac130684a10cf25e

また，出たが，繰り返し述べる。

**リスト，および，リスト内包表記を使うのは，もう，やめよう。**

**numpy は，遥かに速く，書きやすい。**

```python
import time

def sieve_of_eratosthenes(n):
    primes = [True] * (n + 1) #リストの生成、全てTrue
    primes[0] = primes[1] = False #0と1は素数ではないので除外 FALSE
    for i in range(2, int(n**0.5) + 1):#2以上、2から初めてnの平方根まで計算する
        if primes[i]:
            for j in range(i * i, n + 1, i):
                primes[j] = False
    return [i for i, is_prime in enumerate(primes) if is_prime]

start = time.perf_counter()
n = 10**9
primes = sieve_of_eratosthenes(n)
end = time.perf_counter()
print('n:',n,'len:', len(primes), ' time:', end - start)

# n: 1000000 len: 78498  time: 0.10331487499934155
# n: 10000000 len: 664579  time: 0.9959860000017215
# n: 100000000 len: 5761455  time: 10.647423709000577
# n: 1000000000 10 分経過するも，終わらず？？
```

numpy で書く。

```python
import time
import numpy as np

def Eratosthenes(n):
	""" n 以下の素数をエラトステネスの篩で生成 """
	tbl = np.ones(n+1, dtype=bool)
	tbl[0:2] = False
	for i in range(2, int(np.sqrt(n))+1):
		if tbl[i]:
			tbl[i*i::i] = False
	return np.arange(n+1)[tbl]

start = time.perf_counter()
n = 10**10
primes = Eratosthenes(n)
end = time.perf_counter()
print('n:',n,'len:', len(primes), ' time:', end - start)

# n: 1000000 len: 78498  time: 0.00814820900268387
# n: 10000000 len: 664579  time: 0.05577545899723191
# n: 100000000 len: 5761455  time: 0.6621968749968801
# n: 1000000000 len: 50847534  time: 10.780209208998713
# n: 10000000000 20 分経過するも，終わらず？？
```
MySQLでデッドロック状態を確認するためにログ書き出し設定の変更をした

## やりたいこと
MySQLでデッドロック状態かどうかを確認したいため、InnoDBのモニターを有効にしてログの書き出しをしたい

## 環境
MySQL 5.7.44

## やったこと
MySQLの設定を以下の通り変更

```
set GLOBAL innodb_status_output=ON;
set GLOBAL innodb_status_output_locks=ON;
```

オンにしっぱなしだと永遠に書き続けるのでログのファイルが重くなる。
必要な時だけにするために一時的にオンにして調査終了後はOFFにした。

## 参考文献
https://tech.mti.co.jp/entry/2017/12/27/190733
https://qiita.com/h-oikawa/items/91e2401fad5d93262f6f

## 最後に
誤りなどあればコメントなどご指摘お願いします
今さらながら Intel 32bit アーキテクチャで sysenter を使ったシステムコール(Linux)

64bit 全盛期に需要はないでしょうが…

とりあえずのメモです。需要がありそうなら、修正していきます。

## 筆者が試した環境

- VMware(R) Workstation 16 Player
- kali-linux-2023.4-vmware-i386
- NASM version 2.16.01

## 要点

- 32bit アーキテクチャでは、本来は、kernel が vdso (virtual dynamic shared object) という仕組みを利用して、ユーザープロセスに注入する __kernel_vsyscall を通じてシステムコールを呼ぶのが筋
- sysenter 呼ぶ前にやるべきこと
    - sysenter からの戻り先を保存(push sysenter_ret)
    - レジスタ ECX の保存(push ecx)
    - レジスタ EDX の保存(push edx)
    - レジスタ EBP の保存(push ebp)
    - レジスタ EBP に ESP の値を移動(mov ebp, esp)
    
## コード例(nasm版 Intel 記法)

gas 版(AT&T 記法)は、[assembly - How to use sysenter under Linux? - Reverse Engineering Stack Exchange](https://reverseengineering.stackexchange.com/questions/2869/how-to-use-sysenter-under-linux) を参照

```nasm
        section .data
msg db "Hello World!", 0x0a
len equ $ - msg

        section .text
        global _start

_start:
        mov edx, len       ; size_t count
        mov ecx, msg       ; const char *buf
        mov ebx, 1         ; unsigned int fd
        mov eax, 4         ; write システムコール
        push sysenter_ret  ; sysenter からの戻り先を保存
        push ecx           ; レジスタ ECX の保存
        push edx           ; レジスタ EDX の保存
        push ebp           ; レジスタ EBP の保存
        mov ebp, esp       ; レジスタ EBP に ESP の値を移動(複写)
        sysenter

sysenter_ret:
        mov ebx, 0         ; error_code
        mov eax, 1         ; exit システムコール
        push sysenter_ret
        push ecx
        push edx
        push ebp
        mov ebp, esp
        sysenter
```

ビルド・実行は次の手順で行う。(上記ソースファイル名を sysenter.s とした場合)

```sh
$ nasm -f elf32 sysenter.s
$ ld -o sysenter sysenter.o
$ ./sysenter
Hello World!  ← 実行結果

```

Makefile 作るなら

```makefile
sysenter: sysenter.o
        ld -o $@ $<

sysenter.o: sysenter.s
        nasm -f elf32 $<

clean:
        rm -f sysenter sysenter.o
```

## 参考文献

- [assembly - How to use sysenter under Linux? - Reverse Engineering Stack Exchange](https://reverseengineering.stackexchange.com/questions/2869/how-to-use-sysenter-under-linux)
- [Linux System Calls quick and easy](https://syscall.sh/)
- [x86 Linux上で sysenter 命令を使ってシステムコールを呼び出す方法](https://zenn.dev/yuryu/articles/6ad063f5e2176d)
- [Linuxシステムコール徹底ガイド | POSTD](https://postd.cc/the-definitive-guide-to-linux-system-calls/)
- [【Linux】linux-vdso.so...? #Linux - Qiita](https://qiita.com/syoshika_/items/435a2183265b23bc73fa)
固定IPを登録したい！【ELECOM WRC-1167GS2-B】

# 固定IPアドレスが降ってきた！
グローバルIPが直接割り当てられないが速度だけはいっちょ前に早い無料インターネットではついに我慢が出来なくなり、別のインターネットを契約した。ついでに固定IPアドレスも取得しv6プラスにした。これでやっと楽に外部公開できるぜ。

# で、IPアドレス違うやん？
DHCPの問題解決したしネット接続できるようになったから~~ハッピーハッピーハァッッピー~~喜んでたが確認してみると紙に書いてると全然違う。なんで...
とりあえず設定してないんだろうなと設定をいじりまわしているとWANが自動設定になっていた。じゃあそれ変えればいいんだなってなる訳だが
### どの設定でやっても設定できない
固定IPというモードにしてアドレスをセットしてもなぜか「IPアドレスが無効です。セグメントの中は0~255までです。」(記録していなかったのでこんな感じの事が書かれていたような)とはじかれてしまう。え？？？？？？

# どうやらルーターのバージョンが古い模様【結論】
いろんなサイトで「固定IPアドレス　設定　できない」などと調べていたが冷静になって紙にある「BRアドレス」とか「インターフェースID」ってどこで使うんだと検索語を変えてみる。ついでに「ELECOM WAN ルーター」もつけてみる。すると[公式のサイト](https://qa.elecom.co.jp/faq_detail.html?id=8280)にたどり着くことが出来た。困ったときは公式リファレンスとかとにかく公式の情報読みなさいって田舎のおばあちゃんが言ってたのですごい希望を持ちながら試してみることに。するとルーターのバージョンが古かった模様。何年も在庫として眠ってたら古いよなとファームウェア更新をかけてみる
### が、これがまた動かない<br>なんで1.20で最新バージョンなんだよ
自動アップデートは機能しない模様なのでなくなく手動でアップデートすることに。最新のファームウェアは公式の製品情報のところにあるのでそこからインストールしましょう。[WRC-1167GS2-Bの製品情報はこちら](https://www.elecom.co.jp/products/WRC-1167GS2-B.html)
更新が終わるとさっきまでなかった「v6プラス」固定IPサービスが出現します。これを選ぶと固定IPアドレスを通知する紙の項目をすべて使える入力画面になります。勝った。
## 終わりに
今回は回りくどいたどりつき方をしたのは調べ方に問題があったのかも。それからローカルIPアドレスを固定にしてるのをそのままにLANケーブル繋ぎ変えるとGoogleのサイト(IPv6に対応しているサイト)にしかたどり着けないので気を付けましょう。それではまたしょうもない記事を増やしたところで終わりにしたいと思います。
【ChatGPT】YouTube サムネ構成

YouTubeのサムネの構成を使ってもらう。

# 利用例

## 入力したプロンプト
```
# 指示
あはたは人気があるYouTubeの動画を作成するプロです。
以下の情報をもとに、再生したくなるようなYouTubeの動画のサムネイルの構成案を作ってください。

#YouTubeチャンネルの特徴
・YouTubeチャンネル名は「お家でラーメンを味わいたい」
・家でラーメンを作る楽しさを発信する
・タオルを巻いた猫のキャラクター「たま」が高いテンションで話す

#動画の内容
・初心者向け！基本のラーメンレシピ
・「たま」が基本的なラーメンの作り方を紹介。
・初心者でも簡単にできるレシピをテンポ良く解説します。

#動画のタイトル
手軽に楽しむ！「たま」のお家で作るラーメン講座
```

## レスポンス（GPT-3.5）
```
# 指示
あはたは人気があるYouTubeの動画を作成するプロです。
以下の情報をもとに、再生したくなるようなYouTubeの動画のサムネイルの構成案を作ってください。

#YouTubeチャンネルの特徴
・YouTubeチャンネル名は「お家でラーメンを味わいたい」
・家でラーメンを作る楽しさを発信する
・タオルを巻いた猫のキャラクター「たま」が高いテンションで話す

#動画の内容
・初心者向け！基本のラーメンレシピ
・「たま」が基本的なラーメンの作り方を紹介。
・初心者でも簡単にできるレシピをテンポ良く解説します。

#動画のタイトル
手軽に楽しむ！「たま」のお家で作るラーメン講座
```

## レスポンス（GPT-4）
```
YouTubeのサムネイルは視聴者の注意を引き、クリックさせるための重要な要素です。提案されたチャンネルと動画の内容に基づいて、魅力的なサムネイルの構成案を以下に示します。

### サムネイルの構成案

- **背景**: 明るく温かみのあるキッチンの背景。これにより、家庭での料理の雰囲気を強調します。
- **キャラクター「たま」**: タオルを巻いた猫のキャラクター「たま」を大きくフィーチャーし、高いテンションでラーメンを作っているポーズを取らせます。たまの表情は楽しげで、視聴者にポジティブな気持ちを与えます。
- **ラーメンのボウル**: 手前に美味しそうなラーメンのボウルを配置し、その見た目の魅力を強調します。ボウルから立ち上る湯気を描き、温かみと美味しさを伝えます。
- **テキスト**: 「初心者向け！基本のラーメンレシピ」というフレーズをサムネイルの上部または下部に配置します。さらに、「手軽に楽しむ！」「たま」のお家で作るラーメン講座」という動画のタイトルも目立つように入れます。フォントは読みやすく、視認性の高いものを選びます。
- **色使い**: 明るい色合いを基調とし、特に「たま」やラーメンのボウルを強調するために、彩度の高い色を使用します。これにより、サムネイル全体がポップで魅力的な印象になります。

このサムネイルの構成案は、家庭でラーメンを作る楽しさを強調し、視聴者がクリックしたくなるような魅力的なビジュアルを提供します。キャラクター「たま」を前面に出すことで、チャンネル独自の個性を打ち出し、視聴者に記憶に残りやすくします。
```
AWS Q Quicksight　VS　Quicksight　by　人

## Amazon Q Quicksightuic

ksight　人どちらがいい？

現状の使いやすさ、今の課題

そもそもAWS  Quicksightとは

サーバレスなBIサービス
取ってきた情報をわかりやすく可視化するサービスである。  
可視化、わかりやすい状態にすることの利点とは？
下記資料がかなりわかりやすく記載が行われていたので参考に
https://pages.awscloud.com/rs/112-TZM-766/images/AWS-Black-Belt_2022_Amazon-QuickSight-Visual-Best-Practice_1231_v1.pdf


S3+Glue+Athena+Quicksightを使えばかなり手軽にデータ分析の基盤を作ることができる。

ということで実際に触れてみました。
またQuicksightには　
Amazon Q in QuickSight　というAmazon Qを使ったサービスもあるのでそちらと人との比較を行った

まずS3にCSVファイルをアップロード、Glueのクローラーで読み取りAthenaでテーブルを取ってくるということを行います

1.詳細な手順については省略
![unnamed.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3688241/8d05dfe6-0470-aeb6-059f-28e1dfaba75e.png)
以上のようなテーブルが表示される

2.
持ってくるサービスを選択する
![unnamed (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3688241/7cc78825-8f2c-c9b0-b2e3-5a92a59a084e.png)

3.その他設定を行うと以下のような画面に遷移する
![スクリーンショット 2024-02-14 205002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3688241/a11b4334-ba22-db22-3a4f-411022b817cb.png)
分析したい方法のビジュアルがわかりやすく表示される


4．ビジュアルタイプを選択後以下のようになり、X,Y軸ともに選択する形となる
![unnamed (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3688241/f29d988d-186a-4751-9bd2-0554070d8bc5.png)

５.Quicksight in Amazon Qを使うと、、(Beta版)以下のように記入できるところがある
![スクリーンショット 2024-02-14 210009.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3688241/3d15c7bb-2ab0-753d-c33c-681531a5bb4e.png)

6．月ごとの売り上げの予測をしてください(Forecast profit by month)と記入したところ
![unnamed (8).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3688241/98b6d664-61c9-e8b2-2cdb-922023be0446.png)

![スクリーンショット 2024-02-14 210357.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3688241/16306bb6-7b37-2135-5c06-3080a6aea2bb.png)

上記の形でグラフを作成してくれる

７．別の使い方　Qのマークを選択するとテキストボックスがあるので指定をする
![unnamed (9).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3688241/1f68d430-318e-ec57-4c68-6b780bb54ddd.png)


![unnamed (11).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3688241/52a9f196-b31c-b1e8-54e1-534dcaba2978.png)

Amazon Qを使うと　20分弱で以下のような分析ができる（Quicksightのハンズオン、ゴールが見えている形）
![スクリーンショット 2024-02-14 210943.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3688241/21ae42cf-6d46-9c87-caee-651799acf03e.png)


所感
そもそもQuicksightは結構直感的でつかいやすい
なので大雑把なグラフや傾向を確認を行うという点では初心者でもかなりとっつきやすい
一方で細かい設定、より分かりやすいグラフをさくせいするということを考えると技（細かい設定など）を覚える必要性がある

Qを使ったらどうなのか
より直感的だったのが文章を打ち込むだけでグラフを作成してくれるのでより便利で作業効率があがる
グラフの変換などの指定もできるのでそれも便利ではある

一方、英語での適切な指定をする文章が難しい
今回使用したデータセットが日本語だった影響もあるのか作成したいと思っても思っていた結果にならない
ほかの人が使用していた英文を使用したらうまくいくなど結構苦労する面もある
【VR開発】最短で360度動画コンテンツを作成するなら「VR Video Player」がオススメ

## Asset
**「VR Video Player」**

https://assetstore.unity.com/packages/tools/video/vr-video-player-82597#description

## Oculusへの導入
AssetのImport後は、動かすまでに10分ほどで完了しました。
＊[公式Document](https://evereal.com/docs/vr-video-player-unity-plugin/)より手順を抜粋

1：Main Cameraを削除
2：VRVideoPlayer_UIを導入
3：VRVideoPlayer_UIにて、PlaylistにVideoを追加
[![Image from Gyazo](https://i.gyazo.com/b49adec6a96ab0c44508750955dc9abd.jpg)](https://gyazo.com/b49adec6a96ab0c44508750955dc9abd)
4：OVR cameraRigを追加
[![Image from Gyazo](https://i.gyazo.com/cc63040933154f7c57d76d4203b419d0.jpg)](https://gyazo.com/cc63040933154f7c57d76d4203b419d0)
5：OVR CameraRigのTrackingSpaceの、LeftHandAnchorとRightHandAnchorにVRHandRaycasterを追加
[![Image from Gyazo](https://i.gyazo.com/9f069db856f6bf3e76dec1d4a4ac1d16.png)](https://gyazo.com/9f069db856f6bf3e76dec1d4a4ac1d16)
6：Toolsからメニューを展開していき、Oculusを選択
[![Image from Gyazo](https://i.gyazo.com/f460befc689b208f5b7d1c62d70095a6.png)](https://gyazo.com/f460befc689b208f5b7d1c62d70095a6)

## 導入後
0からAssetを導入するだけで、ここまで実装出来ます。
[![Image from Gyazo](https://i.gyazo.com/7e4193a118d42950878d4792c1f25b19.gif)](https://gyazo.com/7e4193a118d42950878d4792c1f25b19)

## そこから改良したもの
|ver1|
|---|
|モデル操作と共存|
|[![Image from Gyazo](https://i.gyazo.com/b617df731ea3cccbd73e525efe597fe3.gif)](https://gyazo.com/b617df731ea3cccbd73e525efe597fe3)|

|ver2|
|---|
|コンソールパネルを調整|
[![Image from Gyazo](https://i.gyazo.com/f78333616b9959f3053dbd01c0fe9b63.gif)](https://gyazo.com/f78333616b9959f3053dbd01c0fe9b63)|

## 参照
詳細・不明点はこちらをご参照ください

https://evereal.com/docs/vr-video-player-unity-plugin/
【VR開発】形状が複雑なオブジェクトの当たり判定の調整

## 今回の内容
VR開発では、形状が複雑な形のオブジェクトを操作する場合、当たり判定が思うように設定できない事があります。
CTのDICOMデータを3Dオブジェクトに変換した場合も、同様の現象が起きる事が多いです。
拡大縮小の挙動が上手くいかないのは、オブジェクトの原点が理想的な場所に存在しない事が原因だと思われます。
## モデルについて
今回のモデルは、CTなどのDICOMデータから出力したものではありません。

## 解決策
Blenderでオブジェクトの原点（ピボット）を変更する方法も良いですが、ソフトを開いて出力する手間がかかります。
自分は今回の方法が早くて簡単だと思っています。応用すれば、掴みたい範囲や掴みたくない範囲を指定できるので凄く便利です。

PrehabをUnpackし、Meshと同じ層にCubeを配置。
＊この時、間違ってCubeの配下にオブジェクトを持って行くと、形が崩れるので注意が必要です。
Cubeの大きさをオブジェクトを掴みたい範囲に大きさ調整し、重ね合わせます。
|1|2|3|
|---|---|---|
|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2657635/60d45fdc-16b7-09b4-1141-2c58dbb66b28.png)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2657635/a2e78664-554b-1358-92d7-de343ef99d44.png)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2657635/c89cea19-0747-ff11-28ac-3d3a785e49c8.png)|

そして、CubeのMaterialを透明にします。
|1|2|3|
|---|---|---|
|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2657635/1bb9f65b-d3ba-bfb1-6bd1-3c61e422ff06.png)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2657635/2b5fbc8d-348a-20d3-ea4f-06f892d5f993.png)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2657635/cb965d71-f685-c4ec-5a33-e874fddc6ccf.png)|

調整が終わったら、再度PackしてPrehabにしておきます。
＊例えば、AssetsフォルダにドラッグアンドドロップでPackできます。

当たり判定を調整します。
CubeのみにColliderを設定し、それ以外のすべてのColliderを除去します。
これにより、Cubeのみに当たり判定が発生します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2657635/a91d2faa-cbd6-f0e6-ec25-c441cf77032f.png)
PrehabにVrg Grabbableを追加し、RigidbodyにはIs Kinematicを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2657635/435d9601-b474-b598-04a2-4be17f64c011.png)
## 実行
![1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2657635/0d16172b-6ce0-64dc-3eb0-4fc232cdb889.gif)
## 補足
Mesh Colliderを使ってしまうと、余白の多い解剖モデルの当たり判定はシビアになり、扱いにくい事が多いです。加えて拡大縮小の際の処理が重たくなるので、出来るだけBox Colliderやこの手法の利用が理想的だと思います。
【VR開発】コントローラーでモデルを操る（拡大、縮小）

## 今回
**空間内にモデルを配置し、拡大縮小できるようにします。
動画の切り替えなどにコントローラーを使用するので、手やコントローラーを表示させます。**

## 準備
**[凹みTips様が配布して下さっているGrabber](https://github.com/hecomi/VrGrabber)を使用します。**
こちらをダウンロードして、UnityにImportします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2657635/26aeaf25-394c-c79f-bee7-d852565adb89.png)

## 実装
**Projectの検索窓で検索し、Hierarchyにドラッグアンドドロップします。**
- Vrg Right Grabber
- Vrg Left Grabber
- LocalAvatar(手やコントローラーを表示する為)

このような階層で配置できればOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2657635/26bea78b-2719-291f-91b7-91ca79557daa.png)
＊Main cameraは必要ないので削除しました。

このままだと処理が重く端末単体で実行する際にフリーズを引き起こします。
また、コントローラーが表示されるよう調整します。

**LocalAvaterを次のように調整しました。**
- Start With Controllersでコントローラーの表示
- 必要のない箇所のチェックを外し、DetailはLowestに

|1|2|3|
|---|---|---|
|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2657635/73eb71fc-b6a8-56ea-5143-88494a78ac5e.png)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2657635/36d68b8c-1857-98ed-53d0-090c55d45d5a.png)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2657635/16d6343a-6fc3-77c2-dce0-4039650bc847.png)|

---
**次に、つかむオブジェクトの配置と設定を行います。**
適当な場所にCubeを配置して、設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2657635/b567b20c-578c-6f46-4f59-c2d600b7eb0d.png)
Add ComponetからRigidbodyを追加し、Is Kinematicにチェックを入れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2657635/d0e7df52-13f8-751b-732a-11c704e566af.png)
同じくAdd Componentから、Vrg Grabbable(Script)を追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2657635/905d7740-a406-71ca-82a2-f6386a91ac61.png)
Cube側の設定はこんな感じになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2657635/8551a5ae-468d-ebb5-964f-544b9f84fe45.png)

## 実行
モデルの操作が実装出来ました。
コントローラーで掴んだ後にジョイスティック上下で引き寄せ、離しが可能です。
![3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2657635/c2f33f10-817c-3a10-1357-9432f9889b63.gif)

## 参照文献
https://github.com/hecomi/VrGrabber
【VR開発】360度動画をUnityで再生する

## 追記
有料のAssetを利用する事でより手軽に実装する事が出来ました。

https://qiita.com/Kodai_Maki/items/d058f95446b16993c7ee

## 360度動画を再生するには
球体に360度動画を張り付ける方法と、Skyboxに動画を設定する方法があるが、前者を採用した。

検索すると、３種類の方法がヒットする。
１：[octahedron-sphere](https://catlikecoding.com/unity/tutorials/octahedron-sphere/)
こちらを[利用する記事](https://shinrinmusic.com/unity-360-image/)が多く見受けられる。
２：[Sphere100.fbx](https://warapuri.com/post/131599525953/unity%E3%81%A8oculus%E3%81%A7360%E5%BA%A6%E3%83%91%E3%83%8E%E3%83%A9%E3%83%9E%E5%85%A8%E5%A4%A9%E5%91%A8%E5%8B%95%E7%94%BB%E3%82%92%E8%A6%8B%E3%82%8B%E6%96%B9%E6%B3%95%E7%84%A1%E6%96%99%E7%B7%A8)を利用する方法
執筆時にはファイルは存在せず。現在こちらは利用できない。
３：[from2001vr様](https://psychic-vr-lab.com/blog/unity/360%e5%ba%a6%e3%82%ab%e3%83%a1%e3%83%a9theta%e3%81%a7%e6%92%ae%e3%81%a3%e3%81%9f%e5%86%99%e7%9c%9f%e3%82%92unity%e3%81%a7%e4%bd%bf%e3%81%86/
)のファイルを利用する方法
すでに完成したプロジェクトファイルをご好意で配布して下さっている。
しかし、そのままではエラーが発生し、実行できなかった。

１の方法でも実装は可能であるが、既に紹介記事が多数存在する。**３のフォルダ内のBlenderファイルをお借りする方法が最短で実装可能であると考え、本稿ではそちらを紹介する事にした。**

## 実装
[from2001vr様](https://psychic-vr-lab.com/blog/unity/360%e5%ba%a6%e3%82%ab%e3%83%a1%e3%83%a9theta%e3%81%a7%e6%92%ae%e3%81%a3%e3%81%9f%e5%86%99%e7%9c%9f%e3%82%92unity%e3%81%a7%e4%bd%bf%e3%81%86/
)の記事より、[360度画像用Unityプロジェクト（動画用）](https://www.dropbox.com/s/5b9tmsy2c8wvaba/Theta360_blog_movie.zip?dl=0)をダウンロードする。
Assetsファイルの中の、Sphere_for_360CameraをUnityのAssetsにドラッグアンドドロップして取り込む。その後Hierarchyもしくは、Sceneにドラッグアンドドロップする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2657635/0c4a505d-548d-c03e-a6c4-e413bd2957d3.png)
＊Sphereに改名しているが同じ。

右クリックから、PrehabをUnpackし、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2657635/f2462b13-ed8b-68e9-e8bc-21890ab54887.png)

中にあるShepreを外に出し、Camera、Lampを含む方は削除する。
|1|2|3|
|---|---|---|
|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2657635/0a26add8-d5dc-b285-84b3-4156f10e4591.png)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2657635/99b35fd8-ef35-b7c6-6a13-cd6a4f8e8bb2.png)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2657635/9ea94b06-8a88-41bb-1346-acf6f1cc3d52.png)|


その後、動画ファイルをUnityに入れたのち、Shepreにドラッグアンドドロップする。

後は再生ボタンを押すと、動画の再生が確認できる。
![test.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2657635/a1aa63b6-e0db-0738-2f14-c6b2516a920b.gif)
＊動画は[こちら](http://xn--hhro09bn9j8uh.com/movie114VRS.html)よりお借りしました。

## 参考文献
https://framesynthesis.jp/tech/unity/oculusquest/
【ChatGPT】YouTube タイトル

ChatGPTで出した企画から、タイトル案を使ってもらう。

# プロンプト
```
# 指示
あはたは人気があるYouTubeの動画を作成するプロです。
以下の情報をもとに、チャンネル登録して再生したくなるようなYouTubeの動画のタイトルを10つ作成してください。

#YouTubeチャンネルの特徴
（ここに特徴や説明）

#企画
（ここに動画の企画内容）

#条件
・28文字以内にすること
・重要なキーワード検索は左側にすること
```

# 利用例

## 入力したプロンプト
```
# 指示
あはたは人気があるYouTubeの動画を作成するプロです。
以下の情報をもとに、チャンネル登録して再生したくなるようなYouTubeの動画のタイトルを10つ作成してください。

#YouTubeチャンネルの特徴
・YouTubeチャンネル名は「お家でラーメンを味わいたい」
・家でラーメンを作る楽しさを発信するチャンネル
・タオルを巻いた猫のキャラクター「たま」が高いテンションで話す

#企画
・初心者向け！基本のラーメンレシピ
・「たま」が基本的なラーメンの作り方を紹介。
・初心者でも簡単にできるレシピをテンポ良く解説します。

#条件
・28文字以内にすること
・重要なキーワード検索は左側にすること
```

## レスポンス（GPT-3.5）
```
1. 初心者向けラーメンレシピ！たまが教える
2. 家で楽しむ！たまの簡単ラーメン作り
3. たまのテンポ良い基本ラーメンレシピ解説
4. 家庭でできる！たまと楽しむラーメン作り
5. たまと一緒に学ぶ簡単ラーメンの作り方
6. 家で楽しむ！たまの基本ラーメンレシピ
7. 初心者必見！たまが解説するラーメン作り
8. たまと作る！家庭での基本ラーメンレシピ
9. 楽しいラーメン作り！たまが教える基本
10. たまのテンション！初心者向けラーメン作り
```

## レスポンス（GPT-4）
```
1. 初心者必見！「お家でラーメンを味わいたい」基本レシピ
2. 「たま」の簡単ラーメン作り！初心者でも大丈夫
3. お家ラーメン入門！「たま」と一緒に基本を学ぼう
4. 「お家でラーメンを味わいたい」の始め方！初心者ガイド
5. 猫の「たま」が教える！家ラーメンの基本レシピ
6. 手軽に楽しむ！「たま」のお家で作るラーメン講座
7. 家でラーメン作り！「たま」と学ぶ初心者レシピ
8. 「たま」が案内！お家で簡単ラーメンの作り方
9. ラーメン好き集まれ！「たま」の家ラーメン基本教室
10. 「お家でラーメンを味わいたい」初心者向け！たまのレシピ
```
AWSリソースをTerraform or CloudformationにImportする

# はじめに
本記事では既存AWSリソースをTerraform、または CloudformationにImportする方法と設計思想について、体験談ベースに記載します。
# 構成図
AWSの構成図は大まかに下記となっています。
概略1
![architecture2.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2705595/d009e579-a8fc-32bb-2534-4d138f49c416.png)

概略2
![architecture3.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2705595/96922386-9b9d-3bd8-dbf5-315b0dbdc3c1.png)

👆の二つの図のように、
- 開発, テスト、ステージ環境は共有のAWSアカウントで構築されている。
    (以下, NoProd環境と呼びます） 
- そのうち、データベース等のリソースは開発、テスト、ステージで共有。
    (データベースはテーブル単位で環境を分けている)
- 基本的にコンピュートリソースはLambda

# Import方法、設計思想
下記で各コンポーネントについてImport方法について記載します。

## フォルダ構成、ルートスタック
設計思想は[こちらから](https://qiita.com/hrkkanda/items/5bd900a43caebb702bcf)
Terraformはこちらから
Cloudormationはこちらから
※鋭意記述中！

## SecretsManager, KMS
Terraformは[こちらから](https://qiita.com/hrkkanda/items/dd900a7e8217e1587981)
Cloudormationはこちらから
※鋭意記述中！

## ネットワーク
Terraformは[こちらから](https://qiita.com/hrkkanda/items/64a252c5481fdd003e98)
Cloudormationはこちらから
※鋭意記述中！

## データベース
Terraformはこちらから
Cloudormationはこちらから
※鋭意記述中！

## Lambda
Terraformはこちらから
Cloudormationはこちらから
※鋭意記述中！
予定を登録するQRコードを生成するショートカットアプリ

## きっかけ
　イベントの開催案内をメールで配信していて、メールを受け取った人が、忘れないようにカレンダーに登録する手間を省いてあげたいと思った。

## 検討したこと
 Googleカレンダーだと API があるのでそれでできますが、macOSのカレンダーには予定を登録する API やURLスキームがありません。
 ネット検索中に、予定を登録する QRコードを生成してくれるサイトがあった。
 「カレンダーに登録」QRコード作成サイト/無料版
 https://qr.quel.jp/calendar.php

 　なるほど、その手が有ったか。

  ## 自分で作ろう
  macOS には、標準で「ショートカット」という処理を自動化できるアプリが付いていて、QRコードを生成する機能があるので、早速作ってみたのがこれ。
  ![CalQR_SC_All.1.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16491/ee693882-6234-7f09-77ac-d44f1902e783.jpeg)

起動すると、イベント（予定）名、予定の日付、開始時刻、終了時刻を入力するようう促されます。その情報から ICAL 形式のデータを組み立て、 QRコードを生成する前に、内容のテキストを表示し、生成したQRコードを写真アプリに保存して、それを表示するようにしています。ちゃんと動作したら不要なので、表示部分は削除して構いません。
　このバージョンでは複数日にまたがる予定や、繰り返しには対応しておりません。

##もっと省力化
　私が実際に使用しているのは、イベント名と開始終了時刻は同じなので、こてお文字列にして、入力するのは日付だけにしています。

## ショートカットアプリはソース公開が難しい
アプリ名がショートカットなので、ショートカットでググるとキーボードショートカットがゾロゾロ（笑）
ソースも画像として貼り付ける以外には、できそうもなく、スクロールしてスクリーンコピーを複数撮って画像をくっつけて一枚にするなど面倒です。
もっと楽にソースを公開、共有することができれば良いと思う。
{SHOCKING PRICE} “Bioheal CBD Gummies”- Is It Worth the Money or Fake?

 
Official Website@>>> https://top10gummies.com/bioheal-cbd-gummies-buy/ 

➥✅ Official Website: Bioheal CBD Gummies

➥✅ Product Name: Bioheal CBD Gummies

➥✅ Benefits: Bioheal CBD Gummies Helps you to get Pain Relief

➥✅ Category: Pain Relief Supplement

➥✅ Rating: ★★★★☆ (4.5/5.0)

➥✅ Side Effects: No Major Side Effects

➥✅ Where to Buy:  {Buy Now Here — Click Here}

 

Bioheal CBD Gummies:-  

leverage full-spectrum CBD extracts and cannabinoids to probably act as herbal neurotransmitters inside the bloodstream. This technique can also contribute to pain discount, improved flexibility, and higher sleep patterns. The Bioheal CBD Gummies intention to make joints more elastic, reduce tension and pressure, and promote mental cognizance and concentration.
 

Facebook@>>> https://www.facebook.com/GummiesBiohealCBD 

Official Blogs@>>>

https://sites.google.com/view/bioheal-cbd-gummies-sites/ 

https://sites.google.com/view/try-bioheal-cbd-gummies-us/ 

https://biohealcbdgummiesoffer.blogspot.com/2024/01/bioheal-cbd-gummies.html 

https://in.pinterest.com/pin/933511829000173850 

https://groups.google.com/g/hr.rec.bicikli/c/czrabUo85eA/m/fwYSBDZ6AAAJ 

https://medium.com/@bakeannas/bioheal-cbd-gummies-high-quality-powerful-chronic-pain-relief-gummies-1221e4103ac7 

https://bakeannas.bandcamp.com/album/shocking-price-bioheal-cbd-gummies-is-it-worth-the-money-or-fake 

https://gamma.app/docs/bioheal-cbd-gummies-Benefits-Offer-and-Get-up-to-50-Extra-Discou-tm0m9m39e7q5sze 
 
https://paidforarticles.com/what-are-the-benefits-of-bioheal-cbd-gummies-1-770275 

https://solo.to/schellanthny
【ChatGPT】YouTube 企画

架空のYouTubeチャンネルを設定して、企画を出してもらう。

# プロンプト
```
# 指示
あはたは人気があるYouTubeの動画を作成するプロです。
以下の情報をもとに、チャンネル登録して再生したくなるようなYouTubeの動画の企画を10つ作ってください。

#YouTubeチャンネルの特徴
（ここに特徴や説明）
```

# 利用例

## 入力したプロンプト
```
# 指示
あはたは人気があるYouTubeの動画を作成するプロです。
以下の情報をもとに、チャンネル登録して再生したくなるようなYouTubeの動画の企画を10つ作ってください。

#YouTubeチャンネルの特徴
・YouTubeチャンネル名は「お家でラーメンを味わいたい」
・家でラーメンを作る楽しさを発信するチャンネル
・タオルを巻いた猫のキャラクター「たま」が高いテンションで話す
```

## レスポンス（GPT-3.5）
```
1. 「ラーメン大好き！たまと一緒に自家製ラーメン作り」
   - キャラクター「たま」と一緒に、家庭で手軽に作れるラーメンのレシピを紹介する動画。
   
2. 「季節限定！たまと楽しむ季節のラーメンレシピ」
   - 季節ごとに変わるラーメンのレシピを、キャラクター「たま」が楽しく紹介する動画。

3. 「ラーメンのアレンジレシピ！たまと一緒に新しい味を発見」
   - ラーメンをアレンジした斬新なレシピを、「たま」がわかりやすく解説する動画。

4. 「たまの失敗談！家でラーメン作りに挑戦」
   - キャラクター「たま」が失敗しながらも楽しむ、家庭でのラーメン作りのチャレンジを追体験する動画。

5. 「ラーメンの歴史！たまと一緒に学ぶラーメンの興味深い話」
   - ラーメンの歴史や面白いトリビアを、キャラクター「たま」と一緒に楽しく学ぶ動画。

6. 「たまのラーメン旅！地元のラーメン店を訪ねて」
   - キャラクター「たま」と一緒に、地元のラーメン店を訪れてその魅力を紹介する動画。

7. 「家で簡単！ラーメンのスープの作り方をマスター」
   - ラーメンのスープの作り方を、初心者でも簡単にマスターできるように解説する動画。

8. 「ラーメンをもっと美味しく！たまのこだわりトッピング」
   - キャラクター「たま」が自らのこだわりトッピングを紹介し、ラーメンをもっと美味しくする方法を提案する動画。

9. 「たまと一緒におうちラーメンパーティー！」
   - キャラクター「たま」と一緒に、家でラーメンパーティーを楽しむためのアイデアやレシピを紹介する動画。

10. 「ラーメン愛！たまと語る、ラーメンにまつわる面白エピソード」
    - キャラクター「たま」と一緒に、ラーメンにまつわる面白いエピソードや思い出を語り合う動画。
```

## レスポンス（GPT-4）
```
「お家でラーメンを味わいたい」チャンネルのための魅力的な動画企画を10個考えました。これらの企画は、家でラーメンを作る楽しさを伝えるとともに、視聴者がチャンネル登録して再生したくなるような内容です。

1. **初心者向け！基本のラーメンレシピ**
   - 「たま」が基本的なラーメンの作り方を紹介。初心者でも簡単にできるレシピをテンポ良く解説します。

2. **地方ごとのラーメン特集**
   - 全国各地のラーメンを家で再現するシリーズ。北海道の味噌ラーメンから九州のとんこつラーメンまで、地域ごとの特色を「たま」と一緒に探求します。

3. **ラーメン屋さん風トッピングの秘密**
   - プロのラーメン屋さんみたいなトッピングの作り方を「たま」が伝授。チャーシューや味玉、メンマの作り方を紹介します。

4. **ヘルシーラーメンレシピ**
   - 健康志向の人でも楽しめる、低カロリーで栄養満点のラーメンレシピを「たま」が紹介。野菜たっぷりやグルテンフリーなど、バリエーションを豊富に展開します。

5. **外国のラーメン風アレンジレシピ**
   - 世界各国の料理をラーメンにアレンジしたレシピを紹介。たとえば、イタリアンラーメンやメキシカンラーメンなど、国境を超えたラーメンの可能性を「たま」と一緒に探ります。

6. **一風変わった変わり種ラーメン**
   - チョコレートラーメンやフルーツラーメンなど、一見すると驚くような変わり種ラーメンを「たま」が試作・紹介します。

7. **季節ごとのおすすめラーメン**
   - 春夏秋冬、季節ごとにぴったりのラーメンレシピを「たま」が紹介。季節の食材を活かしたラーメンで、一年中ラーメンを楽しめます。

8. **子供と一緒に作れるラーメンレシピ**
   - 小さな子供でも安全に参加できる、簡単で楽しいラーメン作りを「たま」が紹介。親子での料理の楽しみ方を伝えます。

9. **ラーメン屋さん開業への道**
   - 自宅でのラーメン作りから一歩進んで、ラーメン屋さんを開業するためのヒントやアドバイスを「たま」が紹介します。レシピ開発やメニュー作りのコツなど、実用的な情報を提供します。

10. **視聴者参加型！みんなのアレンジラーメン特集**
    - 視聴者から送られてきたアレンジラーメンレシピを「たま」が試し、その過程と結果を動画で紹介。視聴者との交流を深める企画です。

これらの企画は、ラーメン作りの楽しさを幅広い視点から伝えることができるでしょう。また、「たま」のキャラクターを活用して情報を分かりやすく、楽しく伝えることで、より多くの視聴者にチャンネルを楽しんでもらえるはずです。
```
Onyxで破壊的変更をする際の注意点

今回も[Onyx](https://onyxlang.io/)ネタです。ストックがあるのでしばらく続きます。
（過去の記事は[こちら](https://qiita.com/search?sort=&q=user%3Asyuparn+tag%3Aonyx)）

# TL; DR

- 値に対して破壊的変更を行う場合はポインタで渡すこと！

# はじめに

先月から [Crafting Interpreters](https://book.impress.co.jp/books/1122101087) をOnyxで写経している[^lox]のですが、破壊的メソッドが動作せずハマってしまいました。~~「Goとほぼ同じルールだろ」と高をくくっていたのが敗因です~~

そこで本記事では、備忘録も兼ねてオブジェクトに破壊的変更を加える場合の注意点をまとめました。

# バージョン

- Onyx `0.1.8` (執筆時点の最新版)

# 構造体を代入するとコピーされる

構造体は、別の変数へ代入した際にコピーされます。そのため、別変数側を変更しても元の変数へ影響はありません。

```onyx
use core {printf}

Person :: struct {
    name: str;
}

main :: () {
    person1 := Person.{name="Taro"};
    person2 := person1;
    
    person2.name = "Hanako";
    printf("{}\n", person2); // Person { name = "Hanako" }
    
    // 変化なし
    printf("{}\n", person1); // Person { name = "Taro" }
    
}
```

## 解決策: 共有したい場合はポインタを使う

ポインタを渡せば、参照先は同じなので破壊的変更を元の変数へ反映させることができます。

```
main :: () {
    person1 := &Person.{name="Taro"};
    person2 := person1;
    
    // シンタックスシュガー: (*person2).name と書く必要はない
    person2.name = "Hanako";
    printf("{}\n", *person2); // Person { name = "Hanako" }

    // 反映される
    printf("{}\n", *person1); // Person { name = "Hanako" }
    
}
```

# スライスも代入するとコピーされる

個人的な驚きポイントです。ポインタと同じ挙動になると思っていたのですが、別変数側を変更しても元の変数へ影響はありませんでした。

```onyx
main :: () {
    slice1 := i32.[1, 2, 3];
    slice2 := slice1;
    
    
    slice2[1] = 100;
    printf("{}\n", slice2); // [ 1, 100, 3 ]
    // 変化なし
    printf("{}\n", slice1); // [ 1, 2, 3 ]
}
```

# マップはコピーされない

一方、マップの場合は別変数側の変更が反映されました。（コピーしたい場合は、次バージョンで導入される `map.copy` を使うと良さそうです）

```onyx
use core {printf}
use core.map

Person :: struct {
    name: str;
}

main :: () {
    map1 := map.literal(str, i32, .[
        .{"foo", 1},
    ]);
    map2 := map1;
    
    
    map1->put("foo", 100);
    printf("{}\n", map2); // { "foo" => 100 }
    printf("{}\n", map1); // { "foo" => 100 }
    
}
```

# 関数の引数が値型の場合、実引数はコピーされる

破壊的変更を行う場合、仮引数をポインタ型にする必要があります。値型の場合引数がコピーされてしまい、変更が反映されません。

特に**メソッドのレシーバ**は要注意です[^method]。

```onyx
Counter :: struct {
    value: i32 = 0;
    
    inc :: (c: Counter) {
        c.value += 1;
    }
}
```

```onyx
main :: () {
    counter := Counter.{};
    printf("{}\n", counter); // Counter { value = 0 }
    counter->inc();
    printf("{}\n", counter); // Counter { value = 0 }
}
```

## 解決策: ポインタにする

```onyx
Counter :: struct {
    value: i32 = 0;
    
    inc :: (c: &Counter) {
        c.value += 1;
    }
}
```

ポインタで渡すことで、想定通りの破壊的変更が反映されます。

```onyx
main :: () {
    counter := Counter.{};
    printf("{}\n", counter); // Counter { value = 0 }
    counter->inc();
    printf("{}\n", counter); // Counter { value = 1 }
}
```

# おわりに

以上、Onyxの破壊的変更の注意点でした。こういう「コンパイルは通るけど思ったのと違う挙動になる」タイプのミスは見つかりづらくてつらみを感じます...もっとOnyx力を上げていきたいですね。

[^lox]: 完成したらこちらも記事にします。
[^method]: これはGoと同じなのに気づくのに時間がかかりました...「Crafting Interpreters」のJavaコードを移植していたので脳がJavaモードになっていました :sob:
7年前のPCをWindows11にできるか調べてみた

## 結論：CPUの変更のみでは移行できない

2024/05/19追記
理由はマザボ「ASUS H270-PLUS」は第6/7世代のCPUにのみ対応しているため
実際にじゃんぱらで[Intel Core i5-8500](https://www.janpara.co.jp/sale/search/detail/?ITMCODE=180372&OUTCLSCODE=7)を購入し、取り付けてみましたがWindowsは起動しませんでした
調査をしてみると[このページ](https://www.tekwind.co.jp/ASU/products/entry_13222.php#:~:text=Socket%201151%20for-,7th/6th,-Generation%20Core%E2%84%A2%20i7)にて、「Intel® Socket 1151 for 7th/6th Generation」という文字を発見
ソケットの規格はあっているけど、そもそも第6,7世代のみ対応とのことでした

今後は、マザボを変えた場合にメモリ等が使えるか、費用はいくら掛かるかを調査していきたいです

## 経緯

Windows10のサポート期限が1年を切ると中古CPUの値段も上がるかもしれない  
少し余裕があるこの時期に下調べしておこうと思いたち、この記事を書きました。  

## PC構成

- マザボ
  - ASUS H270-PLUS
- CPU
  - インテル® Core™ i7-7700 プロセッサー
- グラボ
  - NE51070S15P2-1041J (GeForce GTX1070 8GB Super JetStream)
    - ドスパラ限定モデル

## PC正常性チェック

![pc正常性チェック.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120432/e1099d97-7da6-1e6c-cfda-5fe0baf25f83.png)

私のPCで解決しなければ行けないのは以下
1. TPMの有効化
2. プロセッサ問題

## TPMの有効化

有効化手順とTPMについての解説付きの記事が公開されていたので  
ありがたく参考にさせてもらいました  
[Windows 11で必須になった「TPM 2.0」って何？TPMの役割や確認方法を紹介](https://pc.watch.impress.co.jp/docs/topic/feature/1334277.html)


## プロセッサ問題

非対応プロセッサの場合、選択肢は以下になる
1. 対応プロセッサに交換する
2. 裏技(！！！非推奨！！！)で強引にアップグレードする

### プロセッサ問題の結論

対応プロセッサに交換する  
交換と強制アップグレードのメリット・デメリットを天秤にかけてみたが  
やはり交換したほうがよいと思う

|方法|メリット|デメリット|
|--|--|--|
|対応プロセッサに交換|アップグレードが容易|1万円前後のお金がかかる<br/>プロセッサの交換が手間|
|強制アップデート|無料|アップグレード時にWindowsが起動しなくなる可能性あり<br/>今後のWindowsUpdateで<br/>非対応プロセッサを使用していることに起因したエラーが発生する可能性あり|

プロセッサの交換なら、色々なところで手順が紹介されているので、そこまで問題にならない  
一方、強制アップグレードによるエラーについては、解決方法が見つからなかったので  
発生した場合は、Windowsが使えなくなるかもしれない  
このように考えると、私は１万円かけてでも対応プロセッサに交換するほうが良いと考えました

### 交換候補の調査

マザボのCPUソケットは`LGA1151`なので、これに合うものを探す

新品を探したが見当たらないので、ドスパラさんで中古を探す  
下記のサイトでソケット形状に`LGA1151`を選択すると  
10,000円前後で購入できそう  
[ドスパラさんのCPU中古](https://www.dospara.co.jp/SBR1517)

- 候補
  - INTEL Core i5 8500
    - 状態は悪いが8,000円程度
  - INTEL Core i7 8700
    - 状態が良いので13,000円程度

### 裏技(！！！非推奨！！！)の調査

iso内のファイルを書き換えて行く方法が見つかった  
この記事にも乗っている通り、正攻法ではないので自己責任  
[【Win11強制更新】](https://penginedu.com/2023-02-04-win10-win11/)

## 調査する際に参考にしたサイト
- [windows11プロセッサ要件](https://learn.microsoft.com/ja-jp/windows-hardware/design/minimum/supported/windows-11-supported-intel-processors)
- [CPUソケットに合うCPU一覧](https://www.cpu-world.com/Sockets/Socket_1151_H4_LGA1151.html)
- [windows11で制限が厳しくなった理由](https://pc.watch.impress.co.jp/docs/column/ubiq/1334963.html)
- [windows11強制アップグレードを辞める理由](https://computerlabo.fc2.page/windows-upgrade-202308/)
ハードウェアの異常がソフトウェアに及ぼす影響

# 前置き(長い)

## 何があった？

### 事象

1ヶ月くらい前でしょうか、Google Chromeをバージョンアップしたところタブがよくクラッシュするようになりました

この時はタイミングがタイミングだったし、Mozilla Firefoxではタブがとくに問題なさそうに見えたので、Google Chromeのバージョンアップが原因なのかと思っていました

しかし、Xなどでは特に不具合を発信している人はおらず……

また、普段Linuxカーネルを常に最新版をビルドしてインストールしているのですが、カーネルのビルドが失敗することが増えてきました

何回かやると上手くいく……

### 疑惑

そのような不具合が多発してきたので、メモリ周りの異常を疑いました

なぜメモリ周りを疑ったかといえば勘としか言い様がないのですが、以前も別なパーツの時代にメモリ周りの異常で不可解な事象が発生していたことがありました

その時はメモリのスロットに埃が入っていたせいか、メモリテストを回したらエラーが出たがケース内部を掃除したら直りました

## やったこと

### メモリテスト

Ubuntuをインストールしてるのですが、デフォルトでブートローダーからメモリテストを選択できるのでメモリテストを回してみます

#### エラー

メモリテストがエラー出しまくる

ということでやはり原因はメモリにありそうです

### ケース内部の掃除

さて、以前埃のせいでメモリテストがエラー出してたことがあったので今回も掃除してみようと思います

今のパーツで組んだのが2021/09なので2年半くらいPCの内部見てない気がしますね👀

その割にはそれほど埃が貯まってなかった気がしますが、とはいえやはり大分埃が貯まってましたので綺麗にします

さて、メモリのスロット周りもしっかり掃除して再度メモリテストを回してみましょう

#### ここでアクシデント

なんということでしょう

電源が付かなくなりました

しかし電源が付かないからと焦ってはいけません
電源が付かない場合、逆に電源ユニットかマザーボードが逝ったと絞り込めます

以前使っていた電源ユニットの購入履歴を調べたら2015/03に買ってた模様……
さすがに買い替えていいよね……

ということで2万3000円の出費です😢

#### 電源交換

無事に起動しました

よかった

### メモリテスト(リベンジ)

まだエラーが出るぞ！！！！

ということでメモリが逝ってるようですので、メモリも買いました……
1万7000円の出費です😢

ちなみにメモリは先述の通り2021/09に買いました
短命でしたね
って思ったけどそうでもなかった
時の流れがはやい

## まとめ(うそ)

自作PCはじめて20年弱くらいかと思うけれども初めてメモリがちゃんと壊れた気がします
それでも以前、メモリ周りで異常があった経験があったためか今回のマシントラブルの原因を突き止めることが出来ました

ちなみにメモリ買ったあとに古い方のメモリを1本ずつテスト回して、2本のうち片方が壊れていることとメモリスロットの異常がないことを確認しました
この辺りは先にやっておくほうが良いとは思いますが今回は脳死で新しいメモリを買いました

1本使えるのに捨てるのももったいないのでデュアルチャネルを犠牲にして3本挿して運用しています
96GBも積んでどうするんだ

# ハードウェアの異常がソフトウェアに及ぼす影響

ここから本題です

冒頭に書いたとおり、メモリの異常が原因でGoogle Chromeのタブがクラッシュするという事象が発生していました

結局のところ、ソフトウェアも現実世界のハードウェア上で動いているので、ハードウェアの問題がプログラムのロジックを超越したところで影響があらわれてきます

もちろんソフトウェアの挙動がおかしいのはハードウェア故障より実装の問題である方が圧倒的に多いはずです

これは個人のPCだけではなく、原理的にはクラウドサービスでも同様のことは起きうるはずです
実際はクラウドサービスではすごく冗長化されてるでしょうから一般のPCで起きるよりもはるかに低い確率になってそうですが

今回のメモリの異常ですが、メモリ上のビット列が正しくなくなるということなのでストレージからロードされたメモリ上のデータが狂ったりメモリ上のデータをストレージに書き込んだらファイルの中身がおかしくなってしまったというようなことも起きそうです
今回、僕はたまたまそういう事象には遭遇していませんが何かファイルが破損しちゃったりしてるのかな……😨

## まとめ(本当)

ということで、ソフトウェアのロジックに問題がなくてもハードウェアの影響によりソフトウェアに異常が発生するケースがありました
ソフトウェアのロジックに問題がないにもかかわらず、再現性のない異常が発生する場合はハードウェアを疑ってみるのも良いかもしれません

---

それでは良い自作PCライフを
WSL2のubuntuからリモートのubuntuサーバーにsshでログインしてGUIを使いたい

# 前提
- WSL2もリモートサーバーもubuntu22.04でテスト。
- 既にVcXsrv、Xmingなどの設定が終わっている。
    - https://qiita.com/ryoi084/items/0dff11134592d0bb895c などを参照して下さい。

# WSL2側の設定
必須ではないが、 WSL2でもGUIを使いたいならば、下記を.bashrcに書き込み、source ~/.bashrcで再読み込み。

```bash
export DISPLAY=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}'):0.0
```

xeyesなどで動作確認。

# リモートサーバーへのログイン
sshのオプションで -Xをつける。なんか知らんけど心配なら-XYでもいいのかな？
```bash
ssh -X <username>@<your_server_ip>
```

# リモートサーバーでの設定

今まで.bashrcに下記のような適当な値をDISPLAYに書き込んでた:
```bash
DISPLAY=localhost:0.0
```

しかしChatGPTさんによるとこれがダメらしい。
> リモートサーバー上でDISPLAY環境変数を手動で設定する必要はありません。ssh -XYを使用している場合、DISPLAY環境変数は自動的に適切な値に設定されるはずです。


上記をコメントアウトして、再度ログインし、下記コマンドを実行

```bash
xeyes
```

動いた。
やったぜ。

雑ですいません。
Pythonで素数を見つける方法: 試し割り法とエラトステネスの篩

pythonによる素数を求めるためのコードです。
自然数nが素数であるかどうかを判定する物ではないので注意してください

# コード
1からnまでの素数の数を数えます。
メモリ容量によりますが、n = 10^7～9あたりが限界です。

### 試し割り法による素数判定

``` prime_numbers.py
import time

def is_prime(n):
    n += 1 # n = 1　からスタート
    if n <= 1: #1を除く
        return False
    for i in range(2, int(n**0.5) + 1): #素数の判定、2から初めてnの平方根まで計算する
        if n % i == 0: #試し割り
            return False
    return True

start = time.perf_counter() #計算時間の計測（スタート）
n = 10**6
primes = [i for i in range(n) if is_prime(i)]
end = time.perf_counter() #計算時間の計測（終了）
print('n:',n,'len:', len(primes), ' time:', end - start)
#n: 1000000 len: 78498  time: 6.511661022999988
```

### エラトステネスの篩を用いて素数判定
``` Sieve_of_Eratosthenes.py
import time

def sieve_of_eratosthenes(n):
    primes = [True] * (n + 1) #リストの生成、全てTrue
    primes[0] = primes[1] = False #0と1は素数ではないので除外 FALSE
    for i in range(2, int(n**0.5) + 1):#2以上、2から初めてnの平方根まで計算する
        if primes[i]:
            for j in range(i * i, n + 1, i):
                primes[j] = False
    return [i for i, is_prime in enumerate(primes) if is_prime]

start = time.perf_counter()
n = 10**6
primes = sieve_of_eratosthenes(n)
end = time.perf_counter()
print('n:',n,'len:', len(primes), ' time:', end - start)
#n: 1000000 len: 78498  time: 0.27198466100003316
#n: 1000000000 len: 50847534  time: 335.51925249500005

```
## 計算方法とコード実装の参考にしたサイト
素数の計算方法については以下のサイトを参考にしました。
[高校数学の美しい物語](https://manabitimes.jp/math/834)

試し割り法やエラトステネスの篩の実装コードについては以下を参考にしました。
[Pythonプログラムでの素数判定 - シンプル実装やエラトステネスの篩（ふるい）](https://pydocument.hatenablog.com/entry/2023/03/24/201247)


## 感想
・試し割り法と比較して、nまでの自然数iの計算が1回しか行われない。計算量がとても少なく済む
・iに素数の判定がbool値による判定になるので高速。「計算しない」というのがスゴい
・試し割り法は除算を使うので遅くなる。四則演算のうち、加算・減算が最も早く、除算が最も遅い。
・n = 10**8あたりでメモリーの限界に到達。計算速度が極端に落ちた
・「1千万近いレコードをどう処理するか」というエンジニアとしての力量が問われる（気がする）。Fortranで微分方程式の計算に一晩かかった思い出が甦る。

## その他
フリー版のGoogleColabで実行した際、試し割り法は10^7あたりで、エラトステネスの篩は10^9あたりでタイムアウトし実行結果を得られませんでした。


## 追記
### 試し割り法へ訂正
@koshi_waru さんからの指摘で、「割り出し」→「試し割り」へ訂正しました
試し割り法が正式な読み方でした。すいません。

### コード訂正
試し割り法のコードに典型的なオフ・バイ・ワンエラーを含んでいました。
コード理解とテストが不十分でした。
spring initializr 使ってみた




# はじめに
バックエンドの構築を行うにあたり、spring initializr を使ってみようと思ったんだけど、
Project Metadata のところにどんな入力を期待されているのか分からなかった。
あれ？私だけ？？

この記事では、そんな私の悩みを解決する。


# 実験！ Project Metadata のどこに何を入れたらどうなる？？
まず [spring initializr](https://start.spring.io/) を開くとこんなページが開く。
![web-spring-initializr.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3695365/75c9393a-268b-e7d1-c928-91206b3c1a93.png)

私が分からないところは、Project Metadata の
  - Group
  - Artifact
  - Name
  - Package name

この４箇所に何を入力したらいいの？？です。

まずは試しに、この状態で GENERATE して、どんなツリー構造になるのか見てみます。
![demo-spring-initializr.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3695365/f113468f-d104-7146-a8b4-5dd1be3fe57b.png)
ほほぉ。
demo の部分は Artifact か Name のどっちかが反映されてそう。
フォルダが展開されていく様子は Package name のところが反映されてそう。
へ〜。

そしたら、Artifact に artifact、Name に name と入れてみたらどうなるんだろう？？

・・・あれ？
Artifact を変更すると、Name も共連れで変更しようとしてくる・・・
ってことは、おそらく Artifact と Name は同じであることを期待されているように感じる。

だけど、Name は個別で変更できそう。
![artifact-name-spring-initializr.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3695365/6115dac0-ea71-9f05-7ddc-2c5a548b69b8.png)
Package name は Group ＋ Artifact って感じで表示されるのか。そしたらここは何もしなくてよさそう。

この状態で GENERATE してみると・・・
![artifact-name-spring-initializr-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3695365/6d8fd070-c460-a33c-6038-100dfeedc223.png)
フォルダ名が Artifact の内容が反映されてて、Name の内容が Application.java のファイル名に反映されてるのね。
ふ〜〜〜ん。

なんとなく、Artifact と Name には 作るアプリの名称を入れるとよさそうな気がしてきました！

だけど、Group には何を入力してほしいのか、まだよくわからない。。。

# IntelliJ から spring initializr を使ったらどうなる？
気持ちを切り替えて、IntelliJ から spring initializr を開くとどうなるかも見てみたい。

適当にフォルダを作って、IntelliJ で開く。
File > New > Module...
![IntelliJ-spring-initializr.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3695365/5539d53f-0d74-c4ad-6a1e-d4cf3ebbac04.png)

！！！
え〜〜〜。Group と Artifact のところに赤い ？ があるじゃん。
ここにはおそらく、私が知りたかったことがっ！！！

Group: Uniquely identifies your project, usually starts with a reversed company domain name.
google翻訳!!!
グループ: プロジェクトを一意に識別します。通常は会社のドメイン名を逆にしたもので始まります。

あ、そうなんだ。
だから com で始まってて、example は会社名を表してたってことか。なるほどー。

Artifact も。

Artifact: The name of the artifact within the group, usually a module name.
google翻訳!!!
アーティファクト: グループ内のアーティファクトの名前。通常はモジュール名です。

おっ。そしたら予想通りアプリ名入れてよさそう！！！


# 結論
Project Metadata の下記４箇所に入力してほしい内容はこちらです。

Project Metadata 
  - Group: 会社のドメイン名を逆にしたもの
  - Artifact: アプリ名
  - Name: アプリ名
  - Package name: なりゆきでOK


スッキリしました〜！

そう言えば、web版の spring initializr には Description の記入も求められてたけど、IntelliJ から開くと Description を書かせる入力欄がない！
web版の spring initializr で、Description のところを書いたら、どこに反映されるのか気になる〜〜〜！！！けど、多分調べてもあんまり意味がなさそうなのでやめておきます。。。

# さいごに
色々やってた中で、ChatGPT にも聞いてみたのね。

**最初から聞けばよかった〜〜〜〜〜！！！**