OmniAICreator/Qiita-1.07M huggingface dataset:
Azure DNS に Bind ゾーンファイルのインポートを試してみた

## 検証用の Bind ゾーンファイルを作成

```bash:bash
$ cat /etc/os-release | grep PRETTY_NAME
PRETTY_NAME="Ubuntu 22.04.1 LTS"

$ sudo apt install bind9

$ systemctl status named

$ cd /etc/bind

$ sudo cp db.empty db.example.jp

$ sudo sed -i 's/localhost/example.jp/g' db.example.jp

$ echo "@       IN      A       192.168.10.10" | sudo tee -a db.example.jp

$ cat db.example.jp
; BIND reverse data file for empty rfc1918 zone
;
; DO NOT EDIT THIS FILE - it is used for multiple zones.
; Instead, copy it, edit named.conf, and use that copy.
;
$TTL    86400
@       IN      SOA     example.jp. root.example.jp. (
                              1         ; Serial
                         604800         ; Refresh
                          86400         ; Retry
                        2419200         ; Expire
                          86400 )       ; Negative Cache TTL
;
@       IN      NS      example.jp.
@       IN      A       192.168.10.10

$ named-checkzone example.jp db.example.jp 
zone example.jp/IN: loaded serial 1
OK
```

## 検証用の Azure DNS を作成

```bash:bash
$ az network dns zone create \
  --resource-group mnrlabo-rg \
  --name example.jp

$ az network dns zone import \
  --resource-group mnrlabo-rg \
  --name example.jp \
  --file-name db.example.jp

In the future, zone name will be case insensitive.
== BEGINNING ZONE IMPORT: example.jp ==

(1/3) Imported 1 records of type 'soa' and name '@'
(2/3) Imported 1 records of type 'NS' and name '@'
(3/3) Imported 1 records of type 'a' and name '@'

== 3/3 RECORDS IMPORTED SUCCESSFULLY: 'example.jp' ==

$ az network dns zone export \
  --resource-group mnrlabo-rg \
  --name example.jp

; Exported zone file from Azure DNS
;      Zone name: example.jp
;      Resource Group Name: mnrlabo-rg
;      Date and time (UTC): Sat, 11 Mar 2023 08:40:27 +0900

$TTL 86400
$ORIGIN example.jp.
    
@ 86400 IN SOA ns1-09.azure-dns.com. root.example.jp. (
               1 ; serial
               604800 ; refresh
               86400 ; retry
               2419200 ; expire
               86400 ; minimum
               )

  86400 IN A 192.168.10.10

  86400 IN NS ns1-09.azure-dns.com.
  86400 IN NS ns2-09.azure-dns.net.
  86400 IN NS ns3-09.azure-dns.org.
  86400 IN NS ns4-09.azure-dns.info.

$ az network dns zone delete \
  --resource-group mnrlabo-rg \
  --name example.jp \
  --yes
```

## 参考

https://learn.microsoft.com/ja-jp/azure/dns/dns-import-export

https://learn.microsoft.com/en-us/cli/azure/network/dns/zone?view=azure-cli-latest
[Linux]bashコマンドについてメモ

## bashコマンド
コマンドを並べた命令をパイプから受け取って実行

### 使用例
```
$ echo 'print "mkdir test" | bash
$ ls
test   //testというディレクトリができている
```

#### ファイルにコマンドを入れて実行もできる
```
$ echo "mkdir test1" > a   //ファイルaの中に「echo "mkdir test1"」と書き込む
$ ls
a

$ bash ./a   //aファイルを実行
$ ls
a  test1    //test1というディレクトリができている

$ cat a
mkdir test1
```

このときのファイルaを**シェルスクリプト**と呼ぶ（shellにやってもらいたいことを書いたファイルのこと）

#### ファイルだけ実行して同じようにコマンドを発動させる
```
#!/bin/bash

mkdir test1
mkdir test2
```
と書いたファイルaを準備してaを実行するのだが、
今のままだとおそらくファイルaに実行権限がついていないのでchmodコマンドで実行権限を付ける
```
$ chmod +x a
$ ls -l
-rwxrwxr-x 1 misuzz misuzz 37  3月 11 08:22 a    //xが追加された
```

aファイルの実行
```
$ ./a
$ ls
a  test1  test2  //test1, test2というディレクトリができてる
```

### #!/bin/bashとは
- シバンと言う
- #! スクリプト言語のコマンドの絶対パス
- シバンを書くと、OSが絶対パスにあるコマンドを呼んで、２行目以降に書かれているコマンドを実行する


## 見てる本
https://www.amazon.co.jp/1%E6%97%A51%E5%95%8F%E3%80%81%E5%8D%8A%E5%B9%B4%E4%BB%A5%E5%86%85%E3%81%AB%E7%BF%92%E5%BE%97-%E3%82%B7%E3%82%A7%E3%83%AB%E3%83%BB%E3%83%AF%E3%83%B3%E3%83%A9%E3%82%A4%E3%83%8A%E3%83%BC160%E6%9C%AC%E3%83%8E%E3%83%83%E3%82%AF-Software-Design-plus%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA/dp/4297122677
Googleデジタルマーケティング＆Eコマース：リンクのベストプラクティス

# はじめに

”Googleデジタルマーケティング＆Eコマース プロフェッショナル認定証"　の受講が完了しました(2022/3/3)。私がこのコースから得られた素晴らしい体験を、テーマごとに分割して、わかりやすくご紹介しています。興味を持たれた方は、是非下記を受講してみてください。

https://jp.coursera.org/professional-certificates/google-digital-marketing-ecommerce

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/84e33f4e-81cb-98a6-4546-f2ec06fd8b8b.png" width="800">

# リンクの種類

- Webサイト上のリンク
    - サイト内の他のページを指す内部リンク
    - 他のサイトのコンテンツにつながる外部リンク
- Webサイトからのリンク（バックリンク）

| 種類  | 例  | 
| :--- | :--- | 
| 内部リンク | 旅行サイトのホテルのリストから、同じWebサイト内の特定のホテルに関する情報を含む別のページに訪問者を移動させる場合 | 
| 外部リンク | 旅行サイトのホテルリストから、そのホテルの公式サイトに訪問者を導く場合 | 
| バックリンク | バケーション・オンライン記事に、旅行サイトへのリンクが含まれている場合 | 

# 内部・外部リンクのベストプラクティス

### <font color="MediumBlue">適切なアンカーテキストを使用する</font>

アンカーテキストは、ハイパーリンクの目に見えるテキストです。良いアンカーテキストは、訪問者があなたのサイトをナビゲートするのに役立ち、あなたがリンクしているページが何であるかをGoogleが理解するのに役立ちます。以下の例では、「Learn more」がアンカーテキストになります。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/fb8f7653-11c5-c7bb-236d-a88833ebe332.png" width="600">

アンカーテキストは、以下のようにします。

- **説明的である**:
    - 「ページ」「記事」「ここをクリック」などの一般的なアンカーテキストは使用しないようにしましょう。
    - ほとんどの場合、URLそのものをアンカーテキストとして使用することは避けましょう。
- **簡潔である**: 
    - アンカーテキストに必要なのは、数語または短いフレーズだけです。
    - 段落全体や長い文章をリンクにするのは避けましょう。
- **見やすく**: 
    - あなたのWebサイト上の通常のテキストからリンクを目立たせる書式を使用しましょう。
    - マウスを乗せたときに初めてリンクが見えるようでは、リンクを見落としたり、誤ってクリックしてしまったりする可能性があります。
- **役に立つ**: 
    - アンカーテキストは、訪問者がサイト内を移動して必要な情報を見つけるのに役立つ場合のみ使用してください。
    - 検索エンジンのために長いアンカーテキストを使用することは避けてください。
    - アンカーテキストにキーワードを詰め込まないようにしましょう。

### <font color="MediumBlue">外部リンクに注意する</font>

他のWebサイトへのリンクは有益ですが、評判の良くないサイトや、推奨したくない情報が含まれている可能性のあるサイトへのリンクは避ける必要があります。

ユーザーの中には、自分のウェブサイトの利益のために外部リンクを利用しようとする人がいます。例えば、
- Webサイトのコメント欄や掲示板に自分のサイトへのリンクを追加する。
- ライブチャットなど、サイトに追加されたサードパーティのソフトウェアアプリケーションは、不要な外部リンクを含む。

#### nofollowリンク

これらのケースでは、そのリンクを無視するように検索エンジンに指示するHTMLコードを備えているリンクであるnofollowリンクを使用することができます。これは、検索エンジンは、リンク先のサイトとあなたのWebサイトを関連付けないことを意味します。

あなたのサイトにパブリックコメントやメッセージボードがある場合、ユーザーによって追加されたすべてのコメントやメッセージにnofollowリンクを自動的に使用することをお勧めします。これは一般に、コメント欄やメッセージボードに外部リンクが表示されるたびに手動で削除するよりも、より迅速で効率的な処理となります。

# バックリンクのベストプラクティス

GoogleがWebサイトのランキングを決定する方法の1つは、そのサイトにリンクしているサイトを分析することです。リンクの質と量の両方がサイトのランキングにカウントされます。

ここでは、あなたのWebサイトを宣伝し、バックリンクを集めるのに役立つアイデアをいくつか紹介します。

- 新しいコンテンツや新しいサービスに関するブログ記事を公開する。
- ソーシャルメディア上で良質なコンテンツを共有する。
- メールマーケティングで、購入ガイドなどの役に立つ記事を紹介する。
- フォーラムやメッセージボード、ソーシャルメディアグループ、関連サイトなど、自社サイトに関連するオンラインコミュニティと連携する。
- サイトのコンテンツ更新のたびに共有するのではなく、ユーザーの興味を引くコンテンツだけを共有する。

# 有料リンクの注意

Googleは、広告目的で適切なラベルが貼られていない限り、有料リンクを使用しないよう警告しています。検索結果を操作するためにリンクを売買することは、容認できる行為ではなく、サイトのランキングに悪影響を与える可能性があります。また、評判の悪いサイトからの低品質なバックリンクにつながる可能性もあります。
Googleデジタルマーケティング＆Eコマース：Webサイト・コンテンツのベストプラクティス

# はじめに

”Googleデジタルマーケティング＆Eコマース プロフェッショナル認定証"　の受講が完了しました(2022/3/3)。私がこのコースから得られた素晴らしい体験を、テーマごとに分割して、わかりやすくご紹介しています。興味を持たれた方は、是非下記を受講してみてください。

https://jp.coursera.org/professional-certificates/google-digital-marketing-ecommerce

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/84e33f4e-81cb-98a6-4546-f2ec06fd8b8b.png" width="800">

# コンテンツのベストプラクティス

検索エンジン最適化にはコツがあると思われるかもしれませんが、実際には、まず優れたコンテンツを作成することに尽きます。コンテンツがよく書かれていて、情報が豊富で、話題に事欠かないものであれば、検索者のクエリを満たすのに役立ちます。

今回、Webサイトのコンテンツを最適化する方法について説明します。これらの推奨事項は、GoogleのSEOドキュメントから直接引用したものです。いずれもWebページが検索エンジンで上位にランクされることを保証するものではありませんが、Webページを作成する際に考慮するとよいでしょう。

### <font color="MediumBlue">役に立つ、面白いWebサイトにする</font>

魅力的で役に立つコンテンツを作ることは、今回取り上げた他のどの要素よりも、Webサイトに影響を与える可能性が高いでしょう。

ユーザーは良いコンテンツを魅力的だと感じます。ユーザーが魅力的であれば、それを共有したり、他のユーザーを誘導したりしたくなる可能性が高いです。

訪問者がWebサイトを共有し、話題にすることは、訪問者とGoogleの両方からサイトの評判を高めることにつながります。質の高いコンテンツなくして、共有が行われることはほとんどありません。


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/0dd8a490-ea46-763c-50e8-53b131921bce.png" width="600">

### <font color="MediumBlue">訪問者が何を求めているかを知り、それを提供する</font>

これは、キーワードの調査から始まります。適切なキーワードとトピックが決まったら、次に優れたコンテンツを作成します。

どのように優れたコンテンツを作成するのがベストなのかは、意見が分かれるところです。しかし、Google検索のガイドラインには、コンテンツがよく書かれていて分かりやすいこと、スペルミスや文法的な間違いがないかを慎重に確認することなどの提案があります。

また、新鮮でユニークなコンテンツは、検索でより良いパフォーマンスを発揮します。古いコンテンツを蒸し返さないようにしましょう。Googleは、明確な情報を持つページを表示しようと努力します。もし、Webサイト上に重複していたり、内容が似ているページがあれば、それらのページは検索エンジンの結果に表示されない可能性が高くなります。

### <font color="MediumBlue">ユーザーの信頼を培うような行動をとる</font>

ユーザーは、そのWebサイトが信頼できると思えば、安心して訪問することができます。
- 良い評判を持つサイトは信頼できる。
- 業界や特定の分野の専門家としての評判を培う。
- 誰がサイトを発行しているか、文脈を提供しているか、組織の目標などの情報を提供する。

eコマースサイトの場合は、明確で満足のいくカスタマーサービス情報を用意しましょう。これは、訪問者が問題を解決するのに役立ちます。また、適切なテクノロジーを使用することも必要です。
- 例えば、eコマースのチェックアウトページが安全な接続でなければ、ユーザーはそのサイトを信用することができません。

### <font color="MediumBlue">専門性、権威性を明確にする</font>

次に推奨されるのは、専門性と権威性を明確にすることです。サイトのコンテンツは、そのトピックに精通した人が作成または編集していることを確認してください。デジタルマーケティング担当者として、自分が知識のないコンテンツを書くことを任された場合、専門家である誰かがコンテンツを編集するようにすればいいのです。

あるいは、専門家や経験豊富なソースを提供することもできます。ソースは、あなたがコンテンツのベースとした専門知識をユーザーが理解するのに役立ちます。

### <font color="MediumBlue">対象に対して適切な量のコンテンツを提供する</font>

高品質のコンテンツを作るには、時間、労力、専門知識、才能やスキルのうち、少なくとも1つを相当量必要とします。コンテンツは、事実に基づいて正確であり、明確に書かれ、包括的であることを確認してください。

- 例えば、レシピを公開する場合、簡単にできる完全なレシピを提供すること。材料のセットや料理の基本的な説明を掲載するだけではいけません。手順が理にかなっていて、正しいことを確認しましょう。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/623d6577-0743-b62a-6d4e-f9864c16f72e.png" width="600">
dev_appserver.py app.yamlのコマンドエラー

[Google Cloud CLIに含まれるローカル開発用サーバーコマンド](https://cloud.google.com/appengine/docs/standard/python/tools/using-local-server?hl=ja)を使用する際にpythonコマンドが見つからないエラーの解消。

```
$ dev_appserver.py app.yaml
/usr/bin/env: `python': そのようなファイルやディレクトリはありません
```

シンボリックリンクを作成。

```
$ which python3
/usr/bin/python3
$ sudo ln -s /usr/bin/python3 /usr/local/bin/python
```

デフォルトだと`python2`を使用するため`CLOUDSDK_PYTHON`の環境変数を追加する。
```
$ dev_appserver.py app.yaml                    
ERROR: (dev_appserver) python2: command not found
```

```
$ echo 'export CLOUDSDK_PYTHON="/usr/bin/python3"' >> ~/.zshrc
```
VBEの立ち上げ マクロ Excel mac

マクロの編入画面　＝　VBE （Visual Basic Editor）
Editor:編集するための

<h3>VBEの開き方</h3>
・「Visual Basic」ボタンで表示できる。
開発タブの一番左にある

・「Option」 + 「F11」 でも表示できる。

<h3>VBEの閉じ方</h3>
・上部のExcelタブを押し、終了してMicrosoft Excelへ戻るを選択
・左上のバツ「✖️」で閉じる
5分で紹介「図解まるわかり メタバースのしくみ」

# はじめに
この記事は 
**「図解まるわかり メタバースのしくみ」** を**５分**で**この本の魅力や大まかな内容**を理解することを目的とした記事です。

この記事で少しでも興味を持ってこの本を読むきっかけになれば幸いです。

<img width="300" alt="名称未設定のアートワーク (1).jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2921163/243b9965-6cf8-6648-4514-0cc934a3a1b6.jpeg">

# 目次
**・概要
・個人的な感想
・引用**

# 概要
この本は**全199ページ**、**9章**で構成されていています。

内容は**一冊でメタバースの概要**がわかるようになっています。

この本の特徴はとにかく**図やグラフなど理解を助けるものが多いこと**です。

他にも**見開き1トピック**になっているため、
わからないところから読むことができるようになっています。

重要な語句には**アンダーライン**が引かれていたり、**太文字**になっています。

**右ページ**には左ページの理解を助けるような**グラフ**や**図**が各ページにあります。
**右ページ**の最後には最低限押さえておくべき**POINT**がかかれています。

さらにメタバースだけでなく、
**NFT**や**ブロックチェーン**など
**メタバースの発展に寄与した技術**などもかかれています。


# 個人的な感想
この本を読んで
この本は**メタバースの概要をつかみたい人におすすめできる本**だと思いました。

この本はメタバース初学者でも読みやすい工夫がたくさんあり、

内容も前提知識がなくても理解できるようなもので、
**グラフや図でとても分かりやすくなっています。**

そして**各トピックが独立している**ため、
自分が関心のあるトピックだけ読むこともできます。

**199ページなので初学者でも読み切ることも難しくないとおもいます。**

さらに**NFTやブロックチェーンなどの知識**や
**メタバースを使った新しいビジネスに関する内容**など
メタバースの知識を深めるような内容も書かれています。







# 引用
>図解まるわかり メタバースのしくみ
著 波多間 俊之  
2022/9/7


https://shopping.yahoo.co.jp/products/e197535580
【Go】go-openaiを使っていろいろやってみる

ChatGPTが公開から6日間でユーザー数が100万人突破など、なにかと話題沸騰ですね。公式サイトでgo言語向けのパッケージが記載されていたので触ってみました。

* 公式サイトURL

https://platform.openai.com/overview

* パッケージURL

https://github.com/sashabaranov/go-openai


# 画像生成してみた
githubのほうに、簡単な使用例がいくつか載っています。
APIトークンが必要になるので事前にアカウントを作成して、発行しておいてください。
フリートライアルでも期間限定ですが、5$分のクレジットがつきます。
個人で遊ぶ範囲では十分かと思います。

```Go:sample.go
package main

import (
	"context"
	"fmt"

	openai "github.com/sashabaranov/go-openai"
)

func main() {

	var prompt string
	fmt.Println("Please Enter...")
	fmt.Scanf("%s", &prompt)

	client := openai.NewClient("API Token")
	resp := openai.ImageResponse{}

	resp, err := client.CreateImage(
		context.Background(),
		openai.ImageRequest{
			Prompt: prompt,
		},
	)

	if err != nil {
		return
	}

	fmt.Printf("%s", resp.Data[0])
}


```

コンソールで動かすと以下のような感じに

```console:コンソール画面
$ go run sample.go
Please Enter...
Hello
{https://xxxxyyyyzzzz } //生成された画像のURL

```

以下、生成された画像になります。
とてもかわいいですね。。？

* 生成された画像
![img-7qnDiK37KvxEDnzsIg0njopW.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2271131/1c07f3ed-f2f9-bf87-613f-2ee943e82ce2.png)


# 感想
openaiを触ってみて、とても楽しかったです。
ほかにもいろいろできそうなので研究してみたいと思います。
ハッカソンにゴリゴリのゲーム作品で参加して賞を取った話


# はじめに
今回の記事では、2月上旬に行われた技育CAMP(vol.11)に参加し、そこから色々とブラッシュアップし、賞を取るまで経緯について話したいと思う。


# なぜゲーム作品で参加したのか
自分は中高生にITプログラミングを教える事業を展開する会社にて、Unityを使ってゲームプログラミングを教えるメンターをしていた。そこで知り合った同期のUnityメンターと色々話している内に、「チーム開発をしてみたい」という話になった（だいたい2022/10くらい）。そこからゲームクリエイター甲子園2022で賞を取ることを目標に少しずつ開発を行っていった。しかし初めてのチーム開発するメンバーが多く、とりあえずネット記事に書いてあったScorceTreeを採用するも、扱いが慣れずCloneができなかったり、コンフリクトを頻繁に起こしたことで徐々にメンバーのモチベーションが下がり、プロジェクトが自然消滅してしまった（だいたい2022/1くらい）。


しかしせっかく頑張って出したアイデアやGitの使い方を、多くの時間を割いて学んだのに終わらせりのはもったいないと強く感じていた自分は、「短期間で成果を上げて決着をつけよう」という考えになった。そこで、元々プロジェクトに参加していた子と、追加でエンジニアを誘い、３人でハッカソンに出ることにした。メンバー全員がはじめてゲーム制作をチームで行うということで、初心者にも優しい技育CAMPに参加することにした。役割としては自分がプランナー兼エンジニア、エンジニア、UI/UXデザイナーという役割にした。使用技術は、初めての自分たちでも太刀打ちできるUnityにした。

# アイデア出しで考えたこと
元々私が取り組んでいた2Dホラーゲームをベースに3D化したら面白そうという発想をメンバーに共有したら、「面白そう！」という声が多かったので、ジャンルとしては3Dホラーゲームを作ることになった。


# 技育CAMPを終えた感想
本当に参加してよかったと感じた。ハッカソンの好きなところは、チームが行ったことを人前で発表するという場が設けられていることで、何がなんでも完成まで持っていかなきゃいけないプレッシャーがあるところだと思う。とにかく自分が思うような形でプロジェクトを管理し、ひたすらゲームを面白くするために脳みそを費やし、コードを書いた。

↓発表スライド↓

https://docs.google.com/presentation/d/1y5Iq1eWukDOBnlhDcOnqQYi1FSiMf-kYhgB52hNmCY8/edit#slide=id.g207f8037b7d_0_11


結果としては、無事にunityroomにリリースでき（Webでいうデプロイ）、作品が評価され、賞を頂くことができた。

↓Twitter↓

https://twitter.com/YY_Frank27/status/1624704998448984064

昨年から感じていた苦しみからやっと解放され、ひと段落できると思いきや、今度は受賞者のみが参加できる技育CAMPアドバンスというイベントが開催されるとのことで、せっかくの機会であったため出ることにした。そこでは、発表してからどれだけブラッシュアップ・追加開発を行ったかを発表するイベントであった。


# ブラッシュアップ期間に何をやったか
自分たちは中高生にITプログラミングを教えるメンターとして、自分の担当している中高生に今回作成したゲームをプレイしてもらい、FBをもらった。そこで得たFBをできるだけ反映できるように、実装すべき・したほうが良い機能を書き出し、スケジュールを組んだ。個人的にやってよかったアイデア出しの方法として、全てのアイデアを三段階の優先度で区別し、優先度3のアイデアをさらに三段階の実装難易度で区別することだ。これを行うことによって、実装する必要性を的確に絞り込めることができ、短い期間の中でもメンバーが納得する最適な計画をつくることができるからだ。

↓アイデア出しで用いた議事録↓

https://docs.google.com/document/d/1Kwy_QCoWEX3BbvLDaD2sLpKBJASNkXV0PqFKouuV6qs/edit


# 技育CAMP アドバンスを終えた感想
交流会後に感じたこととしては、自分が思っている以上にゲーム作品は思った以上に他エンジニアにウケる点だ。自分が当たり前に実装できる機能や技術は、Unityを知らない人にとってこんなにワクワクするようなことなんだなと感じた。知らない人に制作した背景や技術を説明し、最終的には「Unityおもしろそう」と言われた時は、本当に嬉しかった。

またありがたいことに、ゲームが企業から評価され、企業賞まで頂くことができた。

↓Twitter↓

https://twitter.com/YY_Frank27/status/1632023382903644161

↓発表スライド↓

https://docs.google.com/presentation/d/1k4cy5PB5QnmrgeZ9joNNkd3lID5sssRcjY8jE3UdpQ0/edit#slide=id.p


↓実際の書いた企画書↓

https://docs.google.com/spreadsheets/d/1vV-gdCBHBC6KeUNyigXEzRzshoW9-5ha08DdyUTs-zQ/edit#gid=0


# ２回のイベントを通じて学んだこと
総評として、ハッカソンに参加したことで新たな気づきと成長が沢山あった。
1. どんな技術・サービスでもいいからとにかく自分の好きなことを全力でやってみることの大切さ
2. FBの大切さ
3. プロジェクトが正しいように管理するプランナーの大変さ
error TS2550: Property 'fill' does not exist on type 'any[]'. Do you need to change your target library? Try changing the 'lib' compiler option to 'es2015' or later.の解決法

## tscを使ってたらエラーが出た
tscを使ってローカルの環境でTypeScriptを使用していたが、fillを使おうとした瞬間エラーが出た。
```
error TS2550: Property 'fill' does not exist on type 'any[]'. Do you need to change your target library? 
Try changing the 'lib' compiler option to 'es2015' or later.
```
es2015より後でしかfillは使えないよって言われてるな。ってことはわかった。
その後、tsconfig.jsonを確認。

![スクリーンショット 2023-03-11 3.15.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651685/e0d58691-ea39-0a6f-cbfb-844bbfca5713.png)

あれ？ちゃんとes2020にしてるはずだけど？?
理由はtsconfig.jsonが反映されていないだけだった。
```
tsc ファイル名 
```
でコンパイルをしてしまうとtsconfigの設定が反映されない。
```
tsc　
```
だけでコンパイルをしてあげるとうまくいった
## 結論
`tsc　ファイル名`ではなく`tsc`を使うべし
each メソッドの使い方について

# はじめに
オリジナルアプリ実装中にeachメソッドに悩まされました。
理解が深まったので備忘録として残します。
**eachメソッドが理解できていなくて悩んでいる**という方が一人でもこの記事を読んで少しでもお役に立てたら幸いです。

# 1. ``each メソッド``とは？？
データベース上にある複数のレコード（データ）からレコードを1個ずつ(または一個だけ）取得して、繰り返し処理を行ってくれます。

# 2.記述方法と解説
```ruby:example.erb
 [配列].each do | [変数] |
    繰り返し処理
 end
```
上記がeachメソッドの構造となっています。
[変数]は、eachのdo ~ endの中でしか使えない変数です。ブロック変数と呼ばれます。
```ruby:index.html.erb
 <% @birthdays.each do |birthday| %>
 　　　<%=link_to '誕生日の詳細情報はこちら', birthday_path(birthday.id), method: :get %>
  <%= (birthday.celebrate_person_name) %>　　
  <%= (birthday.date) %>
 <% end %>
```




上記のコードではbirthdaysテーブルに複数登録されているレコードのカラムの値（この場合はcelebrate_person_nameとdate）を一個ずつ（または1個だけ）を取得してきています。
(birthday.celebrate_person_name)の間にあるドットだけで取得してくれています。
# ３.まとめ

**eachメソッド**を使用することによりbirthdaysテーブルに複数登録されているレコード郡を**繰り返し処理で1個ずつ操作**してくれます。（今回の場合は取得という操作）

**eachメソッド**は初学者が必ずと言っていいほど躓くところなので頑張って使いこなしていきましょう！！

ここまで読んでいただきありがとうございました。
[UE5] Geometry ScriptとSplineの応用

# はじめに
<img width="400" alt="サムネ" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3264403/b024175c-1a6a-0e10-aab3-ef49413fa81b.png">

[Epic Forum Snippet](https://dev.epicgames.com/community/snippets/ePg/create-mesh-with-spline-using-geometry-script)　　[元ツイート](https://twitter.com/ktam876/status/1514648881665314819)
私が以前TwitterとEpic Forumに上げたGeometry Script Blueprintの解説になります。

## 制作環境
- Unreal Engine 5.1.1
- 公式のGeometry Scriptプラグイン

## Geometry Scriptの使い方
Geometry Script専用のクラスがあるので、ブループリント作成で
 `GeneratedDynamicMeshActor`を選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3264403/0bb52df6-2cc2-3708-5207-ea196e59a39b.png)
イベントノード　`On Rebuild Generated Mesh`　が開始点になります。
ブループリントの変数などをいじったら自動でメッシュを更新してくれます。
そして下で参照できるのはダイナミックメッシュで、これに対していろいろ編集していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3264403/ec9a81b0-3dda-3c3d-bbdd-6b2ce90ade05.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3264403/93f90a47-c477-1415-d721-f3dda5c7f8e9.png)

基本のノードとしてトランスフォーム、マテリアルの編集などなどがありますが、今回は `Append Simple Extrude Polygon`　というノードをベースにしていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3264403/51ebdcc3-f17b-7579-6265-8630a25eba7d.png)
たくさんのインプットがありますが、このノードの機能は、
1. `Polygon Vertices`で入力するVector2DのArrayを点繋ぎみたいに平面作成
1. 作った平面を `Height`の高さまで押し出しをする

の２つがメインです。

試しにこのようにArrayを入れてみるとキューブができあがります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3264403/cde778d3-2243-d028-0c2a-4421e1285326.png)

>`recompute normal`ノードでノーマル方向を平均化させて影が直せます。

２Dの形であれば基本なんでも作れますが、Vertexの位置を手入力するわけにもいかないので
Splineで場所の制御をしていきます。

## Spline Component
同じブループリントにSpline Componentを追加し、
`Get Location at Spline Point`ノードや
`Get Location at Spline Input Key`でSplineの場所を取得します。
>`Spline Point`はポイントの場所を直接取る
>`Spline Input Key`はポイントとポイントの間なども取れる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3264403/f37995f0-a394-7f02-e025-71a104a7090f.png)
Z軸の情報は`Append Simple Extrude Polygon`の`Height`で入力していきますので使いません。

# 実装
これで手札は揃いました。
Splineで決めた場所を一個ずつVector2D Arrayの変数に保存して、`Append Simple Extrude Polygon`に入力すれば簡単にメッシュの形を決めることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3264403/33323fc6-a476-c434-c720-0124ba007c92.png)
結果がこちら
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3264403/d77c847c-8b45-5621-510b-e7584b9beddf.png)
>Splineポイントは`Alt+ドラッグ`で追加できます

# Static Meshに変換
私の経験上ですがGeometry Scriptはまだ不安定で、ランタイムでよくクラッシュするので、メッシュの形を決めたあとブループリントをStatic Meshアクターに変更した方が安心します。
ただしStatic Meshに変更したら形は固定になるのでご注意ください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3264403/c1be1a15-ae67-f1f1-7387-c85a41b791f4.png)

# 考えられる改善点と割愛したところなど
- 壁などZ軸が変化するメッシュは作れません
- Splineの曲線、カーブに沿っていない（こちらはUnreal forum Snippetで上げたバージョンにて実装しています、気になる方はぜひチェックしてください）
- Splineの位置がマイナス方向に設定された時、面の向きが内側になることがある（`Append Simple Extrude Polygon`>`Primitive Options`>`Flip Orientation`で治ります）
- メッシュのUV、マテリアル設定（Unreal forum Snippetバージョン）
- Boolean機能を使ってメッシュを切り取り、縁をつくる（Unreal forum Snippetバージョン）
- Vectorで直接Vertexの位置をZ軸まで決めれるノードがあるかもしれません
Pythonのパッケージ管理、仮想環境はPyCharmに丸なげすべき件

:::note warn
この記事の内容は古いです。2025年6月現在ではuv一択です。時間があればそれもまとめたい。
:::



PythonをRustのcargoのように宣言された実行環境管理、バージョン管理で実行しようとして相当に苦しんだのでやったことをまとめる。

そもそもPythonは大変だしすべてが面倒くさいので、使いたくないんじゃ！という人間が書いてます。Rust使いたい。

【目標】
できるだけ簡単でトラブルを起こさないPythonの開発環境をゲットする。理想はcargo

【要件】
・ローカル（windows)
・仮想環境必須。混ざるし何入れたか忘れるので生のインストールには手をつけない
・pip installしたパッケージとそのバージョンを一覧したい
・CUDAを使いたい

【結論】
PyCharm使え

## 最終的にこれに落ち着いた
- PyCharm使用
- PyCharmがよしなにしてくれる仮想環境を使う
- パッケージ管理はpip install（後述）

## PyCharmの良さ
①何もしてないのにパッケージのバージョンが見れるではないか！
仮想環境で適当にpip installする。すると、入ったやつが一覧表示される。ドキュメントによる宣言管理ではないが、プロジェクトごとに仮想環境を作るならこれで十分ではないだろうか。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1435444/bcac9349-d863-84c0-7c7b-fbab3c7ce1c4.png)

②Pythonコンソールもあって開くとすぐ使える
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1435444/5844bec3-503d-bf2b-cc70-0ec074983621.png)

③ターミナルは開くと自動で仮想環境に入ってくれる。めっちゃ便利
```
(virtual env) PS C:\Users\{user}\PycharmProjects\pythonProject>
```

④VSCodeで起こる、実行のインタープリターと、コードアシストのインタープリターが別にならないので「波線エラーでるけど実は実行すれば動く」というくそみたいなことがない、そしてそれを解決するためにググらなくていい

### ほかのツールに対する愚痴
・google colab
遅い、エディタが。セルの実行のショートカットが変。
個人的には自分のGPUで動かしたいというのがあるので却下。

・VSCode
我らがVSCodeだが、pythonに限ってはインタープリターの選択まわりがトラブルの元。

・Anaconda
ごちゃごちゃしている。重い、煩雑。やだ
（仮想環境枠だが、統計学者ではなくエンジニアとしてはこれの存在意義がわからない、仮想環境の機能としても普通のvenvと何が違うのかよくわからないのでお気持ちで却下。Jupyterとかにはいいんだろうけど、セルスタイルが好きではないし、コード補完がもっさりしすぎで無理だった）

・Docker(WSL)
コンテナ作成が煩雑すぎる、DockerDesktopが不安定（よく起動しなくなったりする）
CUDAを使うのが簡単になったらしいが、動かなくて、対処が面倒そうだったので却下

・poetry
機能はすばらしい。だが、インストールしてパスを通してもなぜかエディタのターミナルでは認識されない。調べまくったのに不明なまま。時間返せ
機能はすばらしい。

・pyflow
Rust製なだけあってcargoを意識していて、pythonのバージョン指定、パッケージ管理、全部理想的。なんとpythonのインタープリターまで内臓していて、別途必要ない。
完璧だ！
と思ったのだが、ライブラリを依存に組み込むと動かない。おお～い。まあ年次の浅い小さいプロジェクトだし、今後に期待
（ライブラリをインポートしなければ現状でも十分だが、それならRustでよくねってなる）

・reqwirement.txt
うーん、そういうんじゃないんだよな。cargoみたいなのが欲しい

・venv
Pythonに元からあるやつ。わりと簡潔なので使うならこれだがパッケージの宣言的管理はできないのとVSCodeだと起動がちょっと面倒

・PyCharm
Python専用の統合開発環境。VSCodeで苦しんだのでIDEに希望を託してみた。これが正解だった
Cloud RunはDocker Hubのコンテナを直接指定できます【Cloud Run Jobs】

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/ef7360ee-30f2-0707-23a6-110a3a25bd8f.png)

Docker Hubのコンテナを直接指定みましょう

https://github.com/docker/welcome-to-docker

# `サービスの作成`を押します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/d30e5ff5-08d2-93e1-a404-b98134c15dbc.png)

# コンテナイメージのURLに`docker/welcome-to-docker`を入力します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/bf70824f-7980-ee03-ee7f-8ef5c0653045.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/c334779f-ff1d-46d7-9606-4700d63ce911.png)
# ポートを`80`にします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/53cd5f36-6684-aad4-2b97-a6011f9d06f2.png)

# `URL`を開きます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/639b6004-8b3d-066a-1789-78ac714c93d7.png)

# おめでとうございます！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/78ccc6ea-24f5-dd74-2410-fd47efda42c6.png)

これは実質Arukas

https://stackoverflow.com/a/75640854/5602117

https://cloud.google.com/run/docs/release-notes#February_16_2023
CSSが反映されずお困りのあなたへ

# 問題
PHPやGo言語でアプリを作成している際にCSSを変更したはずが、ブラウザ画面を確認してみると**CSSが反映されていない**という事態が起きました。

半日くらい経てば、CSSが反映されるという事も・・・

# 考えられる原因
調べたところ、反映されない原因が4つほど紹介されていました。
1. キャッシュに残っていたページのCSSで表示されている
2. CSSで指定したスタイルの優先順位が低い
3. CSSの記述ミス
4. CSSが上手く読み込めていない（パスが間違っているなど）


この中でも、１番のキャッシュが原因だった場合の対処法と反映されなかった理由を解説していきます。


参考URL(キャッシュ):[キャッシュとは？Webサイト高速化にかかせない機能をご紹介！](https://digitalidentity.co.jp/blog/seo/seo-tech/cash-speed-up.html)

参考URL:[CSSが反映されない時にチェックすべき5つのポイントと解決方法](https://www.sejuku.net/blog/100015)

# 環境
環境は以下のようになります。

PC: M2 MacBook Air
ブラウザ: Chrome

# 対処法
キャッシュが問題の場合は解決する方法として、残ったキャッシュを破棄して最新のデータを読み込む**スーパーリロード**を使うと解決出来るようです。

スーパリロードの方法はWindowsとMacで異なっており

Windows：**Ctrlキー**と**F5キー**を同時押し
Mac ：**commandキー**と**shiftキー**と**Rキー**を同時押し

になります。



ショートカットキーを使わない方法もあります。
URL　→　[CSSが反映されない時の原因と対処法を5つ紹介！わかりやすく解説！](https://web-camp.io/magazine/archives/97804#:~:text=%E3%81%A6%E3%81%84%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82-,1.%E3%82%AD%E3%83%A3%E3%83%83%E3%82%B7%E3%83%A5%E3%82%92%E5%89%8A%E9%99%A4%EF%BC%86%E3%82%B9%E3%83%BC%E3%83%91%E3%83%BC%E3%83%AA%E3%83%AD%E3%83%BC%E3%83%89,-%E3%81%BE%E3%81%9A%E5%88%9D%E3%82%81%E3%81%AB)

# キャッシュとは？
ブラウザが一度表示したWebページのデータを保存しておき、次回以降 同じページを表示する際に、あらかじめ保存しておいたデータを使うことにより、一度目より素早く表示してくれる仕組みのことです。

# 反映されなかった原因
今回の場合はリクエストを送った際に、キャッシュの機能によって**保存されていたページが返されていたため**、反映させたいCSSを含んだページが上手く反映されない事が原因でした。

また、半日くらい経ってからCSSが反映された理由は、半日が経つまでに色々な操作をした事により、新しいキャッシュとして最新のページ（反映させたいページ）が追加され、**古いキャッシュ**として過去のページ（キャッシュにあったページ）が消去されたためだと考えられます。

# キャッシュの設定を変える
html上でキャッシュ自体の設定を変更する事も出来るようです。
方法は簡単で一行のmetaタグをheadタグ内に追加するだけです。
例えば、

##### 1.キャッシュの無効化
クライアントのリクエストやサーバーのレスポンスについて、キャッシュに何も保存しないように設定できる。
```<meta http-equiv="Cache-Control" content="no-store">```<br/>
##### 2.キャッシュの検証
キャッシュした複製を渡す前に検証をさせるために、生成元のサーバーにリクエストを送信するよう設定できる。
```<meta http-equiv="Cache-Control" content="no-cache">```<br/>

##### 3.キャッシュの期限設定
この要素で指定した日時、または秒数後に、ブラウザのキャッシュから文書の情報を消去するよう設定できる。
```<meta http-equiv="Expires" content="86400">```
この例では、contentに"86400"は86400秒の事を指し、24時間後にキャッシュを削除する事を表しています。
<br/>
これらを使えば 今回のような問題を起こさない事、キャッシュの設定をきちんと行った上での対応を取る事ができ、より便利になるのではないかとも思います。

参考URL:[【HTML】常に最新の情報を表示するためにもキャッシュを無効にしよう※デメリットも解説](https://web-camp.io/magazine/archives/105295)


# 参考URL
- [キャッシュとは？Webサイト高速化にかかせない機能をご紹介！](https://digitalidentity.co.jp/blog/seo/seo-tech/cash-speed-up.html)
- [CSSが反映されない時にチェックすべき5つのポイントと解決方法](https://www.sejuku.net/blog/100015)
- [CSSが反映されない時の原因と対処法を5つ紹介！わかりやすく解説！](https://web-camp.io/magazine/archives/97804)
- [【HTML】常に最新の情報を表示するためにもキャッシュを無効にしよう※デメリットも解説](https://web-camp.io/magazine/archives/105295)
Slim入門【環境構築と基本的な書き方】

## Slimとは
Slimは、Rubyのテンプレートエンジンの一つであり、HTMLをよりシンプルな記述で表現することができるように設計されています。

## 環境構築

### rubyがインストール済みか確認
```sh
ruby -v
```

### gemを最新版にアップデート
```sh
sudo gem update --syste
```

### slimのインストール
```sh
gem install slim
```

### slimをhtmlに変換
```sh
slimrb -p index.slim index.html
```

***

## Slimの書き方


### 要素
```
要素
main
```

### 属性
```
href="./"
```

### コメント
```
/ コメント
```

## 例
```slim:index.slim
doctype html
html
  head
    title Slimテスト
  body
    header
      h1
        a href="./"
          img src="./logo.png" alt=""/
      nav
        ul
          li
            a href="./" リンク1
          li
            a href="./" リンク2
          li
            a href="./" リンク3
    main
      section#box-id.box-class
        h1 見出し
        p 段落
      section#box-id.box-class
        h1 見出し
        p
          | 段落
          br
          | 段落
    footer
      small
        | (c) テストサイト
```
### 変換
```html:index.html
<!DOCTYPE html>
<html>
  <head>
    <title>Slimテスト</title>
  </head>
  <body>
    <header>
      <h1>
        <a href="./"><img alt="" src="./logo.png" /></a>
      </h1>
      <nav>
        <ul>
          <li>
            <a href="./">リンク1</a>
          </li>
          <li>
            <a href="./">リンク2</a>
          </li>
          <li>
            <a href="./">リンク3</a>
          </li>
        </ul>
      </nav>
    </header>
    <main>
      <section class="box-class" id="box-id">
        <h1>
          見出し
        </h1>
        <p>
          段落
        </p>
      </section>
      <section class="box-class" id="box-id">
        <h1>
          見出し
        </h1>
        <p>
          段落<br />段落
        </p>
      </section>
    </main>
    <footer>
      <small>(c) テストサイト</small>
    </footer>
  </body>
</html>
```
Python演習問題＿0【　素数の判定　】

# 素数の判定

問題：以下の条件に従って、ユーザーが入力した数値が素数であるかどうかを判定するプログラムを作成してください。

プログラムは、ユーザーから数値を入力するように要求します。
入力された数値が素数であるかどうかを判定し、結果を出力します。
出力されるメッセージは、「[数値]は/は素数ではありません。」としてください。
入力値が整数以外の場合、プログラムは「整数を入力してください。」とメッセージを出力し、再度入力を求めるようにしてください。
ヒント：素数は、1と自分自身以外の約数を持たない正の整数です。

```
[　例1　] 
数値を入力してください：23
23は素数です。
```

```
[　例2　]　　
数値を入力してください：10
10は素数ではありません。
```
```
[　例3　]
数値を入力してください：abc
整数を入力してください。
数値を入力してください：17
17は素数です。

```
fish shellで連番のファイル（フォルダ）を作成する

# `file1`から`file10`まで作りたい

こうします。

```fish
for i in (seq 1 10)
  touch file$i
end
```

### 解説

`seq n m`はnからmまでの連番を生成するコマンドです。

```fish
> seq 1 10
1
2
3
4
5
6
7
8
9
10
```

```fish
> seq 5 10
5
6
7
8
9
10
```

`for i in (seq 1 10)`のループは、`in`句の後に来る値の列（リスト）を順番に変数`i`に入れて、`end`までの行を実行します。

```fish
❯ for i in 1 2 3 4 5
    echo $i
  end
1
2
3
4
5
```

`touch`コマンドは存在しないファイル名を指定した場合は空のファイルを新規作成します。

これらを組み合わせて、先程のコマンドを改めて実行すると・・・


```fish
> for i in (seq -w 1 10)
    touch file$i
  end
> ls -l
total 0
-rw-rw-r-- 1 matoruru matoruru 0 Mar  7 00:44 file01
-rw-rw-r-- 1 matoruru matoruru 0 Mar  7 00:44 file02
-rw-rw-r-- 1 matoruru matoruru 0 Mar  7 00:44 file03
-rw-rw-r-- 1 matoruru matoruru 0 Mar  7 00:44 file04
-rw-rw-r-- 1 matoruru matoruru 0 Mar  7 00:44 file05
-rw-rw-r-- 1 matoruru matoruru 0 Mar  7 00:44 file06
-rw-rw-r-- 1 matoruru matoruru 0 Mar  7 00:44 file07
-rw-rw-r-- 1 matoruru matoruru 0 Mar  7 00:44 file08
-rw-rw-r-- 1 matoruru matoruru 0 Mar  7 00:44 file09
-rw-rw-r-- 1 matoruru matoruru 0 Mar  7 00:44 file10
```

（`seq`についている`-w`オプションは0埋めのために必要です。）

10個のファイルが作成されました。

`touch`を`mkdir`に変えれば、ファイルの代わりにフォルダが作成できます。

# 参考

- [fish-shellの公式チュートリアル](https://fishshell.com/docs/current/tutorial.html#loops)

# 最後に

記事を読んでくださってありがとうございます！

Twitterフォローしていただけると記事を書き続けるモチベーションになります😺
https://twitter.com/_matoruru
Python演習問題＿0【　リストの利用　】

# リストの利用

## 出力

問題：以下の条件に従って、与えられたリストの中で最大値を求める関数を実装してください。ただし、Pythonの組み込み関数max()は使用しないでください。

リストを引数として受け取る関数find_maxを作成してください。
find_maxは、与えられたリストの中で最大値を見つけて、その最大値を返します。
リストが空の場合は、Noneを返してください。
ヒント：ループを使用して、リストの各要素を比較し、最大値を更新します。


```Python
# 例1
>>> lst1 = [3, 5, 1, 8, 2]
>>> find_max(lst1)
8

# 例2
>>> lst2 = [4, 4, 4, 4, 4]
>>> find_max(lst2)
4

# 例3
>>> lst3 = []
>>> print(find_max(lst3))
None
```
Tailwind環境構築

## tailwindとは
tailwindは、オープンソースのCSSフレームワークであり、HTMLとCSSをより効率的に書くことができます。

### メリット
- 自分で記述するCSSを減らせる
- ビルド時に使用していないCSSがビルドされない、容量を削減できる
- jsに依存しない(Bootstrapは依存あり)

### デメリット
- ビルドが必要
- HTMLのクラス記述が長くなる



## 環境構築
### npmの初期化
```sh
npm init -y
```

### tailwindcss
```sh
npm install -D tailwindcss
```

### tailwindcssの設定ファイル作成
```sh
npx tailwindcss init
```

### 自動ビルド
```sh
npx tailwindcss -i ./src/input.css -o ./dist/output.css --watch
```

## 参考サイト
### 公式サイト
https://tailwindcss.com/
Python演習問題＿0【　計算のキホン　】

# 計算
## 出力
問題：以下の条件に従って、2つの整数を入力し、それらを足した結果を表示するプログラムを作成してください。

プログラムは、ユーザーから2つの整数を入力するように要求します。
ユーザーが入力した整数を足し合わせ、その結果を出力します。
出力されるメッセージは、「入力した2つの整数の和は[結果]です」としてください。
入力値が整数以外の場合、プログラムは「整数を入力してください。」とメッセージを出力し、再度入力を求めるようにしてください。


```
【　例1　】
最初の整数を入力してください：5
2番目の整数を入力してください：7
入力した2つの整数の和は12です。
```
```
【　例2　】
最初の整数を入力してください：abc
整数を入力してください。
最初の整数を入力してください：3
2番目の整数を入力してください：def
整数を入力してください。
2番目の整数を入力してください：5
入力した2つの整数の和は8です。
```
Deno DeployでPuppeteerを動かす【Browserless】

URLにアクセスするだけでPuppeteerを動かせます

https://pup.deno.dev

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/3b7058e3-ceac-69c8-0792-19cebb88a7bc.png)

```bash
import { serve } from "https://deno.land/std@0.177.0/http/server.ts"
import puppeteer from "https://deno.land/x/puppeteer@9.0.0/mod.ts"

serve(async (req: Request) => {
    const browser = await puppeteer.connect({ browserWSEndpoint: 'wss://chrome.browserless.io?token=YOUR_TOKEN' })
    const page = await browser.newPage()
    await page.goto('https://www.yahoo.co.jp/')
    return new Response(await page.screenshot())
})
```

# tokenの作り方

下記からtokenをつくりましょう

https://cloud.browserless.io/account/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/f03da168-f9e9-b800-c3ce-8bb0705202b0.png)
Haml(ハムル)入門【環境構築と基本的な書き方】

## Hamlとは
Hamlは、HTMLをより簡潔かつ読みやすくするためのマークアップ言語です。

## 環境構築とHaml変換

### rubyがインストール済みか確認
```sh
$ ruby -v
```

### gemを最新版にアップデート
```sh
$ sudo gem update --syste
```

### hamlのインストール
```sh
$ sudo gem install haml
```

### hamlのバージョンを確認
```sh
$ haml version
```

### hamlをhtmlに変換
```sh
$ haml render index.haml > index.html
```

## Hamlの書き方

### 要素
```
%要素
%html
```

### 属性
```
%要素{:属性 =>"値" }
%要素(属性="値")

%html{:lang =>"ja" }
%html(lang="ja")
```

### コメント
```
/　コメントテキスト
```

### haml内のみのコメント
```
-# コメントテキスト
```

## 参考サイト

### 公式サイト
https://haml.info/
SwitchBotの指を定期的（指定した時間）に実行するプログラムを作った


<blockquote class="twitter-tweet"><p lang="zxx" dir="ltr"><a href="https://t.co/kjMX57gyUb">pic.twitter.com/kjMX57gyUb</a></p>&mdash; phxa phxa (@phxaUser) <a href="https://twitter.com/phxaUser/status/1641458842134519808?ref_src=twsrc%5Etfw">March 30, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# 背景

SwitchBotの指を使って加湿器を二時間おきに強風にしたかった。

しかしAlexaでは実行する時間を一つしか設定できない。
また、それを、定期的に毎日、実行することはできるが、1時、2時のように１日の内に複数の時間を指定して実行することはできない。

そこで、SwitchBotのAPIを利用して、指定した時間に指を実行するプログラムを作ることにした。

# やったことと注意

時間（今回はHourのみ）を指定し繰り返し実行するプログラムをpythonで書いた。

コードと詳しい説明は[こちら](https://github.com/PHXA/switchBotSchedule)から。

最初の一回だけプログラムを実行した際に指が起動します。それ以降は指定した時間になると実行されます。

.env.exampleを.envファイルとしてmain.pyと同じ階層にコピーし、TOKEN等をよしなに変更しておいてください。

関連パッケージとpythonはシステムに入れておいてください。

# 最後に

これで湿度が保たれQOLが上がりそうです。

# 備考

いいねもらえると励みになります。
仕様について改良案があればコメントいただけると幸いです。

# プログラム

```python:main.py
import requests
import json
from dotenv import load_dotenv
import os
import datetime
import numpy as np
import time

load_dotenv()

TOKEN = os.environ["TOKEN"]
API_HOST = os.environ["API_HOST"]
DEBIVELIST_URL = f"{API_HOST}/v1.0/devices"
DEVICE_ID = os.environ["DEVICE_ID"]

HEADERS = {
  'Authorization': TOKEN,
  'Content-Type': 'application/json; charset=utf8'
}

def _get_request(url):
  res = requests.get(url, headers=HEADERS)
  data = res.json()
  if data['message'] == 'success':
      return res.json()
  return {}

def _post_request(url, params):
  res = requests.post(url, data=json.dumps(params), headers=HEADERS) 
  data = res.json()
  if data['message'] == 'success':
      return res.json()
  return {}

def get_device_list():
  try:
    a=_get_request(DEBIVELIST_URL)["body"]['deviceList']
    print(a)
    return a
  except:
    return

def send_button(deviceId=DEVICE_ID,):
  url = f"{API_HOST}/v1.0/devices/{deviceId}/commands"
  params = {
      "command": "turnOn",
      "parameter": "default",
      "commandType": "command"
  }
  res = _post_request(url, params)
  if res['message'] == 'success':
      return res
  return {}

schedule=[0,2,4,6,8,10,12,14,16,18,20,22] # 時間を指定
schedule=sorted(schedule)
schedule=np.array(schedule)
def run():
  while 1:
    now = datetime.datetime.now()
    next = now
    future_is=schedule[schedule>now.hour]
    if sum(future_is)==0:
      next=datetime.timedelta(days=1)+next
      next=next.replace(hour=schedule[0],minute=0,second=0,microsecond=0)
    else:
      next=next.replace(hour=schedule[future_is][0])
    send_button()
    s=datetime.datetime.now().timestamp()
    e=next.timestamp()
    print(f"now: {now}, next: {next}, sleep: {(e-s)/60} [min]")
    time.sleep(e-s)
   
if "__main__" == __name__:
  # data = get_device_list()
  run()
```
特定の条件下でfoeachのブロックから抜ける方法、あなたは思いつきますか？

ある配列に対して`foreach`を呼び出していて、その`foreach`ブロックの中でも`foreach`を呼び出している時に、特定の条件になったら現在のブロックを抜け出したい場合を考えていました。

例えば、次のような感じのコード。

```typescript
const list: number[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10].forEach((i) => {
  list.forEach((n) => {

  });

  if (i === 5) {
    return;
  }
});
```

お分かりの通り、上記のコードの`if (i === 5) { return; }`の呼び出しでは、一番外側のブロックを抜け出すことはできません。

もしこれを読んでいるあなただったら、どのように書きますか？

ChatGPTに聞いてみました。

すると次のようなコードを生成してくれました。

```typescript
const list: number[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

outerLoop: for (const i of list) {
  list.forEach((n) => {
    // 内側のループ処理
  });

  if (i === 5) {
    break outerLoop;
  }
}
```

ChatGPTの説明は、次のとおりです。

> forEachループでは、returnを使ってもループ自体を途中で抜けることはできません。代わりにfor...ofループを使い、外側のループを途中で終了するためにbreakを使用できます。
>
> 以下のように書き換えることで、iが5になった時点で外側のループを抜けることができます。
>
> この例では、outerLoopというラベルを外側のループに付け、break outerLoop;を使ってラベルが指すループを途中で終了させます。これにより、iの値が5になった時点で一番外側のループが終了します。

僕の圧倒的知識不足なのですが、TypeScriptで`goto`のようなラベルを使うことができることを今のいままで知りませんでした。

実はこの程度のコードにおいて、外側のループにラベルを付ける必要はないのです。
上記のコードのミソは、外側のループにおいて、`foreach`を使う代わりに`for...of`を使ってる点が大事なところなのでした。

ChatGPTを使うことで、もちろん間違っているコードを生成してしまう場合もあるのですが、正しいプロンプトを開発者側が入力してあげることで、普段使わないような書き方や、そんな書き方があったんだというような発見を与えてくれます。

みなさんもどんどん、ChatGPTを使って新しい発見をしてみてください。
Squidの設定ファイルsquid.confの主な設定項目

●Squidの設定ファイルsquid.confの主な設定項目

・http_port　[IPアドレス:]ポート番号　Squidが利用するポート番号
・hierarchy_stoplist　文字列　キャッシュを利用しない文字列を指定
・maximum_object_size　バイト数　キャッシュされるデータの最大サイズ
・minimum_object_size　バイト数　キャッシュされるデータの最小サイズ
・maximum_object_size_in_memory　バイト数　メモリにキャッシュされる最大ファイルサイズ
・ipcache_size　数　IPアドレスの名前解決をキャッシュする数
・cache_dir　ディレクトリ名　キャッシュディレクトリとパラメータ
・cache_mem　バイト数　総メモリの最大量
・cache_log　ファイル名　キャッシュのログ
・request_header_max_size　バイト数　HTTPリクエストのヘッダの最大サイズ
・request_body_max_size　バイト数　HTTPリクエストのボディの最大サイズ
・acl　acl名　aclタイプ　文字列|ファイル名　アクセスコントロールリストの定義
・http_access allow|deny ACL名　アクセスこのンとロールリストの制御
・auth_param 認証方式 program 認証プログラム パスワードファイル　ユーザ認証の方式等を設定
ニフクラのオブジェクトストレージサービスにWinScpでアクセスする

## 経緯

* ニフクラのオブジェクトストレージサービスにはGUIが存在しない
    * ※ [公式](https://pfs.nifcloud.com/service/obj_storage_service.htm) に以下の記載がある
        * `オブジェクトストレージサービスにはバケット・オブジェクト操作用のWeb画面はございません`
* GUIがないと何かと不便なので、WinSCPで操作できないか試してみたらテストファイルのアップロード/ダウンロードができたので実施した内容を共有する
    * `※公式に確認した内容ではないので、想定通り動作しない可能性がある`

## アクセスするための設定

1. セッション情報に対して下記のように設定する
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139297/1b3f8b38-26a7-11c2-087b-5c3a71e17710.png)
    * 補足
        * ホスト名は [こちら](https://pfs.nifcloud.com/api/endpoint.htm#objectstorageservice) を参照
        * アクセスキーID/シークレットキーは [こちら](https://pfs.nifcloud.com/help/object-storage-service/account_detail.htm) の手順で取得した値を設定


1. 設定ボタンから高度なサイトの設定画面に遷移し、接続したいバケットの情報を入力する
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139297/c70a8315-069c-eac0-0674-a8221edcb9ec.png)

1. S3タブに遷移し、URLスタイルを `パス` に変更する
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139297/580c2ab1-6537-47e7-b304-dcc5f304fbab.png)

1. 環境に応じて proxy の設定も行う
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139297/c7cc5a0d-ac0a-4953-abf1-2c3e0b16e850.png)

1. ログインボタンを押下して接続
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139297/e29e35c7-7762-72ed-e411-cd7a328fe91b.png)


1. ドラッグ&ドロップでファイルをアップロード/ダウンロードができました
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139297/6c7ffc36-7b89-0ca1-7528-13e01dae16d2.png)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139297/72defe3a-931f-0e2f-d93f-09399eb320e0.png)
GitHubPagesで無料で簡単にwebページを公開してみる



# GitHubPages について

GitHub Pages は GitHub でホスティングされる静的サイトを作成するための簡単な方法です。 あなたのリポジトリに [README.md](http://readme.md/) や index.html などのファイルをプッシュするだけで、無料でホストされたサイトが作成されます。

GitHub Pages サイトは [Jekyll](https://jekyllrb-ja.github.io/) を使用して自動的に生成されます。 Jekyll は Markdown と Liquid テンプレートエンジンを使用してコンテンツをレンダリングします

# GitHub Pages を使用する主な利点

- 無料でホストされる - GitHub は無料でホスティングを提供します。 ホスティングやストレージについて気にすることなくサイトをホストできます。
- シンプルなセットアップ - リポジトリに [README.md](http://readme.md/) や index.html などのファイルをプッシュするだけで、サイトが自動的に生成されます。 複雑な設定やデプロイメント手順はありません。
- 自動生成 - 先述したJekyll がサイト全体を自動的に生成します。 コンテンツを更新するたびに、Jekyll が最新のビルドを生成してくれます。
- カスタマイズ可能 - CSS と JavaScript ファイルを追加して外観と機能をカスタマイズできます。 完全にカスタマイズ可能なテーマも利用可能です。
- グローバルにホストされる - サイトは世界中からアクセス可能です。
- インテグレーション - GitHub とのシームレスな統合。コミットの履歴とブランチが表示されます。 コードリポジトリとサイトが密接にリンクされています。

# GitHubPagesで公開する手順

## GitHubアカウントの作成

GitHubのアカウントを所有していない方は、アカウントを作成するところから始めてください。

https://github.com/

## リポジトリの作成

ファイルをアップロードするために、リポジトリを作成します。注意点として、**無料で**GitHubPagesに公開するためには、**Public**で公開する必要があります。

![https://s4.aconvert.com/convert/p3r68-cdx67/awkuv-fsckg.jpg](https://s4.aconvert.com/convert/p3r68-cdx67/awkuv-fsckg.jpg)

https://docs.github.com/ja/get-started/quickstart/create-a-repo

## リポジトリにファイルをアップロード/pushする

作成したリポジトリにHTML/CSS等のファイルをアップロードします。
アップロードに関してはProgate様のsec4.ファイルのアップロード

https://prog-8.com/docs/github-pages

を参照ください。
GitHubを利用したことがある方は、作成したリポジトリにpushを行ってください。

![https://s4.aconvert.com/convert/p3r68-cdx67/aarqp-7u5pn.jpg](https://s4.aconvert.com/convert/p3r68-cdx67/aarqp-7u5pn.jpg)

## ページを公開する

ようやくページを公開する設定に入ります。ファイルをアップロードしたリポジトリのsettings→Code and automationのPagesタブ→【Your site is live at …(生成されたURL）】が表示されていればGitHubPagesでの公開は完了です。
もし、表示されていない場合は「Branch」の項目が「**None**」となっていると思いますので、これをデフォルトブランチ（**master** or **main**）に変更して「Save」ボタンを押すことでURLが表示されます。

![https://s4.aconvert.com/convert/p3r68-cdx67/ap84a-vsj6d.jpg](https://s4.aconvert.com/convert/p3r68-cdx67/ap84a-vsj6d.jpg)

# おわりに

GitHubPagesを用いることにより、静的サイトはお金を支払わなくても簡単に公開できるようになりました。そのため、実機での確認も容易で、とても優れているサービスだと思います。ぜひご利用ください！
stringの中身をsplit()とjoin()置き換える。

# はじめに
文章の中身を一部だけ、変更したい！splitとjoinでの文字列置換方法があります。
そのコードで、一瞬混乱したので、どこかの誰かのためにアウトプットします！

# 早速解説
```Js
const oldStr = aaabbbccc;

const newStr = oldStr.split('bbb').join(BBB);

//newStrは「aaaBBBccc」
```

①splitの区切り文字として'bbb'をセットすることで、'bbb'を区切り文字にして、配列を文字列に!
[aaa, ccc]
②joinで、'BBB'をセパレーターにして、配列を文字列に！
'aaaBBBccc'
結果的に置き換えができる!

# おまけ

## replace()
```js
const newStr　= '梅干おにぎり'.replace(/梅干/g, '塩');
// newStrは「塩おにぎり」となる。
```

## replaceAll()
```js
const oldStr = '梅干おにぎり 梅干おにぎり　梅干おにぎり';
const newStr　= onigiri.replaceAll('梅干', '唐揚げ');
// newStrは「唐揚げおにぎり　唐揚げおにぎり　唐揚げおにぎり」となる。
```

### 謎
replaceとsplit()とjoin()の使い分けって、調べてもあんまり出てこなかったので、もう少し調べます！
[Blender]BAKE-A-NODEアドオンでシェーダーをベイクする

# 概要
Blenderの無料アドオン「BAKE-A-NODE」を使うとシェーダーノードの出力を手軽にテクスチャへベイクできます。
その手順をまとめます。
# 本文
まずアドオンをインストールします。ZipファイルはBake-A-Nodeのダウンロードサイトからダウンロードしてきてください。
![スクリーンショット 2023-03-30 22.26.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/b47fd3d5-e44f-2c82-148a-3fbe0323b679.png)


Shading画面を表示して、焼き付けたいテクスチャの最終出力ノードを選択状態にします（今回の場合はColorRampを選択しました）
![スクリーンショット 2023-03-30 22.31.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/4209185f-6989-982d-a3db-a22d3bbc9a7b.png)




サイドメニューを表示(表示されてなかったらNキーを押してください)してNodeタブを選びます。そしてBake Nodeを押します。
![スクリーンショット 2023-03-30 22.33.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/276839df-05c0-bfba-d14b-2c1b300386df.png)

ポップアップが表示されますので、目的のクオリティに合わせた設定にします（とりあえずスクショのような設定にすれば大丈夫だと思います）
最後にOKを押すとベイク処理が始まります。

:::note info
Outputにはいくつか選択肢があると思いますが、これは選択したノードの出力端子が表示されます。
今回の例では「Color」と「Alpha」が表示されましたが、出力のラインがつながっているColorを選びました。

この要領でRoughnessやNormalもベイクすることができます。
:::

![スクリーンショット 2023-03-30 22.37.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/ae43f61c-e6ae-9c03-3cc7-e5b2b854b264.png)

Texture Paint画面を表示するとテクスチャにベイクされていることが確認できます。
Image*を押してSave Asからテクスチャ画像を保存しておきます。
![スクリーンショット 2023-03-30 22.50.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/796814ff-0178-6151-0c76-85cf172304eb.png)

再びShading画面に戻るとイメージテクスチャのノードが自動で用意されています。ColorRampの接続をイメージテクスチャの接続に入れ替えます。3Dオブジェクトに元のシェーダーと同じ模様が表示されました。テクスチャのベイクが正しく行われました:raised_hands_tone2:
![スクリーンショット 2023-03-30 22.55.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/f7bf9b82-38ae-64fb-34cc-595d45cfaffb.png)







# 補足
今回の記事はこの動画を参考にしました。
[Free Blender Addon for Shading l Bake a Node](https://www.youtube.com/watch?v=JeHDd81VzMs)
スプレッドシートの用語集から、特定の用語の意味をピックアップし表示する（XLOOKUP関数）

## Googleスプレッドシートで「用語集」を作る
初めまして。職業としてwebエンジニアをやっています。学習することが山盛りです。手のつけやすい学習として「知らない用語の意味を調べ、Googleスプレッドシートで用語集を作る」というのをやっています。こんな感じです。
![スクリーンショット 2023-03-22 23.01.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3249420/7f7e9200-4dde-ee96-868e-ec0ece76e590.png)

学習として手がつけやすく、調べた量を視覚的に感じることができるのでモチベーションが維持しやすいです。

さて、このような用語集をどんどん作っていくと、こんな欲求が生まれます
1. 過去に記載したが意味を忘れた用語を再度知りたい
2. 特定の用語群を固めて表示したい

スプレッドシートであれば、1番は検索機能でまかなえるかもしれません。しかし、毎回「command(ctrl) + F」からの入力が必要です。２番ですが、用語に分類やタグの情報をつければある程度は対応できそうです。しかし入力の手間が増えますし、どんな時でもうまくいくとは限りません。

任意の数単語だけ、表の中からヒョイっとピックアップできればいいなぁ、と思います。

## XLOOKUP関数でピックアップする
そこで登場するのが「XLOOKUP関数」です。
![スクリーンショット 2023-03-23 23.04.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3249420/168f471f-dc5a-ecf7-0a74-743dcf3c6c8f.png)
画像で動作を示してみました。F列に、用語の中からピックアップしたい用語を入力すると、G列にその意味が表示されます。

この時、G2セルにXLOOKUP関数が入っています。
式は
```
=XLOOKUP(F2,A:A,D:D,"-")
```
です。式を解説すると
+ F2に入力された値を
+ A列の中から探し
+ 該当する行のD列の値を返す
+ A列の中にない場合は"-"を返す

となります。


### 動作の様子
![xlookup_sai.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3249420/fcf171b2-ed7e-d0d1-d7c0-6abb1df7cee4.gif)

※[Excelでもおそらく同様のことができると思います](https://support.microsoft.com/ja-jp/office/xlookup-%E9%96%A2%E6%95%B0-b7fd680e-6d10-43e6-84f9-88eae8bf5929)

以上です。
クラスインスタンス変数、クラス変数を使う時に気をつけること

以下のコードについて何か気をつけることがないか考えてみましょう。

```Ruby
class BookService
  class << self
    def latest_book_id
      latest_book.id
    end

    def latest_book_name
      latest_book.name
    end

    def latest_book
      @latest_book ||= Book.last
    end
  end
end
```

このコードは、`latest_book`の内容をクラスインスタンス変数を使ってメモ化しています。
これにより`BookService.latest_book_id`や`BookService.latest_book_name`を実行した際に初回のみBookの参照が行われるのでSQLの発行を抑えることができます。

実際にirbを使って試すと以下のようになります。

```ruby
irb(main):016:0> BookService.latest_book_id
   (0.6ms)  SELECT sqlite_version(*)
  Book Load (0.3ms)  SELECT "books".* FROM "books" ORDER BY "books"."id" DESC LIMIT ?  [["LIMIT", 1]]
=> 1
irb(main):017:0> BookService.latest_book_name
=> "test"
irb(main):018:0> BookService.latest_book_id
=> 1
```

余計なSQL発行を抑えられるのでgood！といきたいのですが、実際はこのようなコードを書くとバグになる可能性があります。

それを確認するために、まずはbooksテーブルに新規レコードを追加してみましょう。

```ruby
irb(main):019:0> Book.create!(name: "book2")
  TRANSACTION (0.1ms)  begin transaction
  Book Create (1.5ms)  INSERT INTO "books" ("name", "created_at", "updated_at") VALUES (?, ?, ?)  [["name", "book2"], ["created_at", "2023-03-30 13:37:35.307343"], ["updated_at", "2023-03-30 13:37:35.307343"]]
  TRANSACTION (1.1ms)  commit transaction
=>
#<Book:0x0000000107c0dd40
 id: 2,
 name: "book2",
 created_at: Thu, 30 Mar 2023 13:37:35.307343000 UTC +00:00,
 updated_at: Thu, 30 Mar 2023 13:37:35.307343000 UTC +00:00>
```

これでレコード追加が完了しました。では改めて`BookService.latest_book_id`を実行します。

```ruby
irb(main):020:0> BookService.latest_book_id
=> 1
```

最新のbooksテーブルのidが2であるにも関わらず、1が返ってきてしまいました。
これは、先ほどメモ化したlatest_bookが使われてしまっているためです。

このようにクラスインスタンス変数やクラス変数を使うと意図せず以前の値を使い回してしまう恐れがあります。
Railsアプリの場合はプロセスごとにクラスインスタンス変数やクラス変数の値を保持しているので、異なるリクエストに対しても以前のリクエストの値を使い回してしまうというわけです。
スレッドセーフにはならいのでマルチスレッドも同様に注意が必要です。

というわけで、クラスインスタンス変数やクラス変数を使う際は本当にそのクラスで使い回して良い値（リクエストやスレッドごとに変わらない値）に限って使った方が良いでしょう。

### 参考

https://qiita.com/nareff/items/3d4e5116e6dc9dcb6e3a
#(バウンド記号)の使い方

「バウンド記号」または「#」は、Webページ内でリンクを作成するための記号の一つです。
この記号が必要かどうかは、リンク先が同じページ内の場合と、異なるページにリンクする場合で異なります。

## 同じページ内のリンクの場合
同じページ内のリンクの場合、バウンド記号は必要ありません。これは、リンク先の要素のIDを指定することで、ページ内の特定の場所にスクロールすることができます。例えば、以下のHTMLコードでは、"top"というIDを持つ要素にスクロールするためのリンクを作成しています。

```html
<a href="#top">ページトップに戻る</a>

<div id="top">
  <h1>ページトップ</h1>
  <p>この部分がページのトップです。</p>
</div>
```

## 異なるページにリンクする場合

異なるページにリンクする場合、バウンド記号は必要です。これは、リンク先のURLに、リンク先のページ内の特定の場所を示すアンカーを追加するためです。例えば、以下のHTMLコードでは、"example.com"というURLの、"target"というIDを持つ要素にリンクするためのリンクを作成しています。


```html
<a href="http://example.com/#target">リンク先のページの特定の場所に移動する</a>
```
つまり、バウンド記号の必要性は、**リンク先が同じページ内**か、**異なるページにあるか**によって異なります。
rails セレクトボックス作成

# 対象者

* Rails 初学者.  

# 目次

1. 実現したいこと.  

1. 作り方の全体像.  

1. 実際に手を動かして作ってみた. 


# 1. 実現したいこと.  

* railsでセレクトボックスを作成してみる.  
↓セレクトボックス
![スクリーンショット 2023-03-29 11.04.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602256/64e20633-6659-f084-625f-43deb0ea0fbc.png)


注意点:今回はセレクトボックスの選択肢はデータベースのカラムの値にします.   
選択肢はcolorカラムの「クリーム、ホワイト,グレー」にします。
![スクリーンショット 2023-03-30 22.36.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602256/4efc818d-ab61-4194-3d5a-78ee8002a57e.png)


# 作り方の全体像.  
①form_withでフォーム作成.  
②label作成.  
③selectボックスの作成.   

# 実際に手を動かして作ってみた. 
 
form_withとは.  
⇨フォームを生成するものです。
フォームとは？
![スクリーンショット 2023-03-30 22.43.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602256/1bda6ba3-db25-72a3-49d0-7b9faac139d8.png)

.  
このようなアカウント登録する際に入力するものです.  

form_withとは.  
![スクリーンショット 2023-03-30 15.03.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602256/758d818a-ca9f-954d-aca2-8760af450969.png)
⇨２つ（form_tagとform_for）の機能が１つになったもの

↑２つの機能の違いはデータベースにフォームの内容をデータベースに保存するかしないかです。

form_withは２つの書き方があります.  
１つ目⇨form_withでform_tag（データベースに保存なし）の機能を使いたい時.  
２つ目⇨form_withでform_for（データベースに保存あり）の機能を使いたい時.  

今回は１つ目の方法で作成します。
```
<%= form_with url: "パス" do |form| %>
  <!--フォーム内容 -->
<% end %>
```
url: "パス"の部分はルーティングが入ります.  
routes.rb↓
```
  get '/index', to: 'cats#index'
```
今回はcatsコントローラのindexアクションにフォームの内容を送りたいのでget '/index'のindexを指定します.  
```
<%= form_with url: "/index" do |form| %>
  <!--フォーム内容 -->
<% end %>
```

#②ラベルの作成.  
ラベルとは上のフォームの画像の「お名前」、「メールアドレス」などの部分.  
```
<%= f.label :カラム名 %>
```

```
<%= form_with url: "/index" do |form| %>
<%= f.label :color,"毛色" %>
<% end %>
```
第二引数”毛色”がないと、colorと英語で表示するためわかりにいからです。

#③selectボックスの作成.  
```
<%= f.select :カラム名、配列（選択肢の中身）、オプション %>

```
↑が構文です.  
埋めてみると. 
```
<%= f.select :color, ['ホワイト', 'クリーム','グレー'], { prompt: '選択してください' } %>

```
今回catテーブルの中のcolorカラムの中の「ホワイト」「グレー」「クリーム」という値の選択肢を使いたいので.   
第一引数⇨colorカラム.  
第二引数⇨ ['ホワイト', 'クリーム','グレー'].  
第三引数⇨選択肢のデフォルト値
![スクリーンショット 2023-03-29 11.04.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602256/06301b5e-646c-95e1-30ee-2080f601150d.png)


以上です