OmniAICreator/Qiita-1.07M huggingface dataset:
エンジニアになって2ヶ月経って感じた事と必要だと思った知識

## はじめに

社員の皆さんはこんな奴が最近エンジニアになって頑張ってるんだなと暖かい目で読んでいただければと思います。

社外の方やエンジニアを目指している方は少しでも学習の参考や、コネクター・ジャパンに興味を持っていただければと思います。

## 私について
未経験から独学でプログラミング学習し5ヶ月でLaravelでポートフォリオを作成しました。そして現在は自社開発企業に入社し、WEBエンジニアとしてプロダクト開発に携わっています。

## この記事を書いた理由
自分の備忘録としての振り返りと重要な部分を再認識するために書きました。

## 記事の流れ
1. エンジニア仕事の8割は思考の時間
2. 言語化の難しさ
3. 働き方
4. 公式ドキュメントをみよう
5. 振り返りをする
6. まとめ


## 1.エンジニア仕事の8割は思考の時間
初心者のエンジニアとして、バリバリコードを書くことが中心の仕事だと考えていました。カタカタ高速でキーボード叩くのかっこいいですよね！

しかしエンジニアになってみると、実際にキーボードを叩く時間よりも、
要件定義、設計、デバッグ、最適化する為にググったりする時間の方が

**圧倒的に長いことに気づきました。**


私が就職活動の時に作っていたポートフォリオは一人で開発しているものでしたが、実際に開発するとなるとチームで開発するものなので、どのようにチームと協力するかとか、他人が見ても分かりやすいコードを書くとか、様々な思考も含まれます。人に説明するのが一番コード理解につながると思います。

## 2.言語化の難しさ

ありがたいことに分からないことは先輩エンジニアにすぐ聞ける環境なのですが、
リモートだった時や口頭で説明受けたときに、slackで質問のテンプレートを使用して文章でやり取りをすることがあります。その時に今自分が分からないことや状況の説明をするときに言語化が難しいと感じました。
他にもユーザーの要望を汲み取ったり、要件の内容を文章で汲み取って実装するのも同様です。

簡潔かつ具体的に説明する能力が求められますね。
社内開発部で活用している質問のテンプレートも共有しておきます。

:::note info
開発質問テンプレート

■ 質問のタイトル

■ 期待する結果は何か
（何をするための質問なのかを目的を明確に書きましょう。）
■ 現在はどういう状態か
（ソースコードを張り付けましょう）

■自分で調査したこと、考えたこと
（自分で調査した結果、試行錯誤したことを書きましょう。）
:::
先輩の過去の経験談によると、結局何がやりたいのか何が聞きたいのか分からなくなってしまうエンジニアが多いみたいなので、このテンプレートを活用することですっきりと質問をまとめられることができてます。


## 3. 働き方

前職と比べて社風の違いや仕組みに驚きました。

新しい技術やツールの導入(GitHubCopilotやChat、Notionなど)は社員が言えばすぐ検討して導入出来るし、フレキシブルな時間で働くことが出来るので、早い時間に開催しているLT会に参加したりもできます。
前職の営業職では出来なかったリモートワークなども出来るのでかなりエンジニアの働き方は自由度が高いなぁと感じています。

## 4.公式ドキュメントをみよう
ある日分からないことをGitHubCopilotChatやChatGPT、テックブログなどで調べていると、先輩から「公式ドキュメントを読もう」とアドバイスをくれました。
公式ドキュメントはその技術の正しい情報です。とは言っても公式ドキュメントを読むのは難しいですよね。
理由は英語のドキュメントであることが多く、日本語で翻訳されていても翻訳が正確ではないです。またある程度ドメイン知識がある前提の専門用語を多用しているので理解がなかなか難しい。

でも公式以外は正確じゃないし...

ということで私はこのように取り組むことにしました。

:::note info
1.分からないことや読めないコードはまずCopilotChatに聞いて要約してみる。
2.概要がわかったら公式ドキュメントを見る
:::

大体の概要を知ってから公式ドキュメントを見ることでだいぶ理解が早まりました。
今はまだ実力が足りずに公式ドキュメントを読むのが苦手ですが、読みながら問題解決スピードを上げたいですね。
    
## 5.振り返りをする
毎日の作業終了時に、その日の学びや成果、課題点を整理し、振り返りを行うことで、次のステップに繋げることができます。
社内の習慣の取り組みで私が入社した時には既にありました！

振り返らないと一日何をしたか、何が分からなかったか鮮明に覚えてないですよね。
それをまた明日に活かすために振り返りは重要だと私は思っています。

特に、失敗から学ぶことはエンジニアとしての成長にとって非常に価値があるし、業務をしている中で分からない単語もたくさん出てきます。分からないことがあるたびに自分でメモをしておいて分からないことを少しずつ減らしていけば成長に繋がります。

:::note info
分からないことは忘れないうちに素早くメモをしておいて、きちんと振り返ろう！
:::
    
## 6. 動きがわからないコードは出力してみる

基礎ですが大事だと思ったので書きました。
私の現在の開発環境では、機能の追加や修正など既に基盤が出来ている状態から手を加えていくことが多いです。
経験が浅いのもあって何がどういう処理なのかこの変数には何が入っているのかなどコードを理解するのに時間がかかります。


JavaScriptだったら

    console.log()

Laravelだったら

    Log::debug();

コードの動作が意図通りでない時、様々なデバッグ方法が考えられますが、まずはそのコードが何を出力しているのかを確認することから始めるのがおすすめです。ログ出力やデバッグツールを駆使して、コードの動きを手がかりに問題の原因を特定していきます。

:::note info
ポイント
とにかくデバック入れてみよう！
:::

## まとめ
エンジニアとして入社してからこの2ヶ月はあっという間に感じますし、毎日が勉強で刺激を感じます。

実際にエンジニアになってみて、技術的なスキルだけでなく、コミュニケーションや働き方などのソフトスキルも非常に重要であることを実感しました。
Apache Pulsarのストリーミング処理開発を助けるPulsar Transformations紹介

本稿では、DataStaxの以下のリポジトリで公開されているPulsar Tansformationsについて紹介します。

https://github.com/datastax/pulsar-transformations

# 概要
Pulsar Tansformationsの目的は、Pulsarファンクションのユースケースにおいて、一般的に行われる変換を実装するパルサー関数を提供し、それらの組み合わせをノーコードで編成できるようにすることです。
Pulsar Transformationsを利用するために、Pulsar スキーマを理解したり、Pulsar Functions でサポートされている言語でのコーディングを理解している必要はありません。

また、複雑なソフトウェアの組み合わせのセットアップする手間を取らせずに、Pulsar Transformationsを Pulsar クラスターで簡単に使用できる環境を提供することも目標としています。

Pulsar Transformationsでは、汎用性の高い基本的な変換の提供を目的としています。
ビジネスロジックの実装のために、Pulsarファンクションを独自に実装する必要性を不要にするものではありません。

現在利用可能な変換は次のとおりです。

- `cast` : キーまたは値のスキーマをターゲットと互換性のあるスキーマに変更します。
- `drop-fields` : 構造化データからフィールドを削除します。
- `merge-key-value` : キーと値の両方が同じスキーマ タイプの構造化データである KeyValue レコードのフィールドをマージします。
- `unwrap-key-value` : レコードが KeyValue の場合、KeyValue のキーまたは値を抽出し、それをレコード値にします。
- `flatten` : 構造化データを平坦化します。
- `drop` : レコードを（移行の処理から）削除します。
- `compute` : 新しいプロパティ、値、またはフィールド値を計算します。


Pulsar Transformations を実行するには、Pulsar 2.11 以降または Luna Streaming 2.10 以降が必要です。

## コンフィギュレーション

以下にPulsar Transformationsコンフィギュレーションの実例を示します。

```json
{
  "steps": [
    {
      "type": "drop-fields", "fields": "keyField1,keyField2", "part": "key"
    },
    {
      "type": "merge-key-value"
    },
    {
      "type": "unwrap-key-value"
    },
    {
      "type": "cast", "schema-type": "STRING"
    }
  ]
}
```

`steps`配列の要素の順に変換が行われます。各ステップの処理はその`type`によって定義され、その`type`に応じた引数と組み合わせて利用します。

# 終わりに

本稿では、Pulsar Transformationsの概要について紹介しました。今後、別稿にて、より具体的な内容を紹介することができればと思っています。

ご興味のある方は、どうぞGithubリポジトリのREADMEや以下のドキュメントをご覧になってください。

https://docs.datastax.com/en/streaming/streaming-learning/functions/index.html

また、以下のビデオがStreamNative社のサイトで紹介されています。
https://streamnative.io/videos/pulsar-virtual-summit-europe-2023-build-low-code-stream-data-pipelines-with-pulsar-transformations

上記と同じ著者による以下のブログで、簡潔に全体像を把握することができます。

https://thenewstack.io/simplified-data-pipelines-with-pulsar-transformation-functions/
WSL でのパーミッション設定・GPU の有効化

# はじめに
WSL2 での環境構築にあたって、表題の件でちょっと操作が必要だったりしたので、書き留めます。

# 環境
Windows10　22H2（OSビルド：19045.3324）
WSL2

# WSL で `git clone` ができない（パーミッションの問題が発生する）
`git clone` のみならず、ファイルの書き込みなどが起きるアプリケーションを WSL 上の Docker で動かそうとするとパーミッションのエラーになるようです。
対処としては、
* コマンドを実行する
一時的な手段のようなので、都度実行が必要。
```bash:bash
sudo mount -t drvfs C: /mnt/c -o metadata
```
参考：[【WSL】git fatal: could not set 'core.filemode' to 'false'になる](https://zenn.dev/dev63/articles/da1577b52cbae2)
* 設定ファイルに書き込んで保存する
WSL のディストリビューションに対する設定ファイルに書き込んでおく方法。

（１）ルートユーザーで WSL に入る

（２）`wsl.conf` ファイルを作成する
場所に決まりがありそうなのでご注意（[参考](https://learn.microsoft.com/ja-jp/windows/wsl/wsl-config)）。
`wsl.conf` はそのディストリビューションのみに対する設定なので、対象が複数ある場合はそれぞれで作る必要あり。
```bash:bash
sudo touch /etc/wsl.conf
```
（３）`wsl.conf` を開く
```bash:bash
vi /etc/wsl.conf
```
（４）編集モードに入る
`i` を押すと編集できるようになります。

（５）オプションを追加
```
[automount]
options = "metadata"
```
（６）`ESC` で編集モードから抜けて、`:wq` を入力してエンターする（上書き保存）

（７）WSL を再起動して、入り直す
`WSL --shutdown` や `wsl -t ` で一度ディストリビューションを終了後、再度 WSL に入る。

これで、パーミッション関連のエラーは出なくなると思います。
参考：[WSL2上のDockerでMySQLを構築する際のpermissionsの対策](https://qiita.com/n-jun-k2/items/f8f36cebc7312df8bc31)

# GPU を WSL 上の Docker で使えるようにする
WSL 上の Docker で、GPU を使って何かをしたい場合、そのままの状態だと下記のようなエラーが出る場合があります。
```
Error response from daemon: could not select device driver "" with capabilities: [[gpu]].
```
この場合は、WSL のディストリビューションに NVIDIA Container Toolkit を入れる必要があります。
### NVIDIA Container Toolkit のインストール
[公式の手順](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html#docker)に従ってください。
ページとしては長いですが、Docker に関しては途中から始まる `Docker` というタイトルが付いたセクションです。

参考
[DockerでCUDA GPU環境を作る方法 自分用まとめ](https://qiita.com/psymonmarkrine/items/c2111d713371dac38653)
[WSL2+docker+GPU環境構築(win11)](https://qiita.com/nabion/items/4c4d4d4119c8586cbd9e)
【GlassFish】管理コンソールが開かない

# 困ってたこと
GlassFishの[管理コンソール](http://localhost:4848)を開こうとすると、「The Admin Console is starting.Please wait.」から一向に進まずリロードすると真っ白なページが開く。
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526202/3590d4c1-9080-6313-8227-78147f880e31.png)
ここから進まない。。。

# 解決策
サーバまでのパスに日本語が含まれないように移動したら解決。
ベクトルデータベースについて備忘録

## 概要

ベクトルデータベースなるものの存在を知り、
どんなものがあるのかを少しだけ調べてみました。

## 使用目的

機械学習モデル例えば画像認識モデルは、
基本的にバックボーンに通したデータから特徴量ベクトル（５１２次元とか）を抜き取り、
それらに対して何かしらの回帰やクラシフィケーションを行います。
もしくは類似画像を検索するのであれば、その特徴量ベクトルに対して類似検索をかけていきます。

そのときに、それらの大量のベクトルの中から類似したベクトルをとってくるためのデータベースを用意する必要があり、
その検索のためにベクトルデータベースは使われます。

2015年あたりからこのようなデータベースについて特化したプロダクトなどがいくつか生まれました。
ChatGPTが誕生し、OpenAIのAPIを使って彼らのLLMからEmbeddingベクトルを取得するようなシーンが増え、
結果としてこのベクトルデータベースについても需要が大きくなっている様です。


## 主要なベクトルデータベースたち

他にもたくさんありますが、一旦４つのみピックアップしました。

### PineCorn (SaaS, API)
https://www.pinecone.io/ 
https://dev.classmethod.jp/articles/pinecone-overview/


### Weaviate (OSS, can run locallly)
https://weaviate.io/
https://dev.classmethod.jp/articles/weaviate-overview/

### Chroma (Locally, on memory)
https://www.trychroma.com/


### RediSearch Module (Locally, on memory)
https://www.youtube.com/watch?v=yrXlS0d6t4w&t=528s



## まとめ

今回はベクトルデータベースについて少しだけ調べて備忘録として残しました。

今回はこの辺で。
シェルで数値計算をするコマンドについて

# はじめに
先日他人の書いたシェルスクリプトを読んでいるときに、シェルでの数値計算の省略表記方法について初めて調べたので、その方法について記載します。

## シェルの実行結果について
シェル内の数字は全て文字列扱いになるため、普通に書こうとすると文字列として実行されてしまいます。

```console
$ echo 1+3
1+3
$ echo 1 + 3
1 + 3
$ echo 3/1
3/1
```

# 1. `expr`コマンドを使う
`linux 数値計算`で調べて一番上に出てきたコマンドです。
`expr 数値 演算子 数値`の様な使い方をします。なお小数の計算はできないため、その場合は別のコマンド(`bc`)を使うそうです。

こちらは本題ではないので、簡単に例をいくつか書きます。
```console
# 演算子は離して書く
$ expr 1 + 3  
4
$ expr 1 / 3
0
$ expr 6 / 2
3
```
exprコマンドは他にも使い道がありますが、簡単な計算だけなら2の方法が簡単かと思います。

# 2. `$((f))`を使う
文字にするとよく分からないので、実際の例を書いてみます。

```console
$ echo $((1+3))
4
$ echo $((1 + 3))
4
```
シェルの組み込み機能で、このような構文が使えるそうです。
`$(コマンド)`でコマンドの結果を出力するのはよく使いますが、(1+3)というコマンドがあるわけではないので、初めて見たとき混乱しました。

```console
# コマンドを出す例
$ echo $(pwd)
/Users/wkani
```

ちなみに`$(())`の表記方法でlinuxコマンドを入れて見た場合は、エラーにならず0が帰ってきました。
使う機会はないと思います。
```console
$ echo $((pwd))  
0
$ echo $((ls)) 
0
```
ラズパイでNASを作った話。

# 目的
家族二人で動画を保存できるNASが欲しいので構築。

# ハード・ソフト
- Mac Studio
- RaspberryPi ３ model B
- openmediavault (NAS用にしようしたいOS)


# いきなり躓いた話
学習用にしようしているラズパイ４とは別に家族が以前使用していた`ラズパイ３`に`64bit`のOSを入れてNAS環境を構築しようとしたのが最初である。

https://craft-gogo.com/raspi-omv/

上の記事を参考に`openmediavault`をインストールしようとしたところ、こんなメッセージが。
~~~
This system is running a desktop environment!

Please use a Lite version of the image or

do not choose to install a desktop environment.

This install is not supported.

Search the forum for more info - https://forum.openmediavault.org

Exiting...
~~~

どうやらデスクトップ版にはインストールできないらしい。
確かにサーバOSなのにデスクトップ機能はいらないなぁと感想を抱きつつ、ラズパイのOSについて以下の記事を発見した。

https://www.mikan-tech.net/entry/raspi-os-editions

とてもわかりやすい。
OSを選ぶところからしっかりとサーバを構築することを念頭においておけば、Lite版を選んでいたに違いない。
（と、言いつつ普段はSSH接続で学習を行っている。）

そして以下の記事も発見する。

https://denor.jp/64%E3%83%93%E3%83%83%E3%83%88%E7%89%88raspberry-pi-os%E3%81%A7nas%E6%A7%8B%E7%AF%89-openmediavault-6-%E4%BB%A4%E5%92%8C52023%E5%B9%B41%E6%9C%88%E7%89%88

しっかりとLite版を使うべきであると記載がある。
先ほどのエラーメッセージはOSをLiteにすることで解決できそうである。

# OSを入れ直して再始動
無事にアップデートおよびSSH接続が完了し、以下のコマンドを実行してみると
~~~
$ cd /opt
$ sudo wget -O - https://github.com/OpenMediaVault-Plugin-Developers/installScript/raw/master/install | sudo bash
~~~

数十分経つと無事にopenmediavaultをインストールできたらしい。

ということで以下のような形で別のPCからラズパイにアクセスしてみる。(デフォルト状態では、の話なのでホスト名は変えました。)
~~~
http://raspberrypi.local/
~~~

![スクリーンショット 2023-09-01 16.19.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3403549/c48549e1-a8c2-4089-9a8b-cda5d7a7c6b2.png)

ふむ…

# もう一度つまずいた話。
なぜかわからないがローカルで接続ができなくなってしまった。

SSH接続をやり直してみようかと考え、ローカルで試みるがつながらない。
仕方がないのでディスプレイにHDMI出力してみると…
~~~
openmediavault 6.7.1-2(Shaitan)NASUBI tty1
・
・
・
eth0: /*ここにIP*/
eth0
・
・
・
~~~

といった感じでopenmediaVaultが普通に起動していた。
一応SSHも取得できたIPアドレスで行ってみると...

できない。

ではブラウザからは・・・

![スクリーンショット 2023-09-01 16.35.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3403549/74ee89a6-a275-be16-d705-18e5c1ccb9dd.png)

できた。
できてしまったのである。

気を取り直して進めてみる。



初期の設定ではadmin/openmediavaultでログインできるはず。
→問題なくできました。

後の工程では記事を参考にラズパイのNAS化に成功しましたので記事は以上になります。
エンジニアからPMOへの挑戦(PMOの役割とロードマップ)　🌿vol.1


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

このたびエンジニアからPMOへキャリアチェンジすることとなり、
ディープラーニングと自身の振り返りのために挑戦記をかこうと思い筆をとりました✍🏻✨

気長に楽しんで読んでもらえたらと思っています。どうぞよろしくお願い致します🧘🏻‍♀️

# 目次

今回は、以下の目次で記録をしようと思います👣
- これまでのキャリア紹介
- PMOへの挑戦経緯
- PMOの役割
- PMOのロードマップ
- まとめ


### これまでのキャリア

新卒3年目のフロントエンジニアで、現在2社目です。

1年目の半年間はOJTとして上流工程やサポート業務を、
OJT終了後にフロントエンドエンジニアとして設計と実装・テストを経験してきました💪🏻

経験スキルでいうと、JS・TS・React・Vueなどなどがっつりフロント系と、
趣味でちょこっとPython・Javaのバックエンドをやっていました🐍

### PMOへの挑戦経緯

技術不足、体調不良、メンタルの問題、男性社会での厳しさ（筆者は女性です👧🏻）、
色々なことが重なってしまいIT業界を去ろうかと思っておりました。。

3年目のひよっこが言うのはおこがましいですが、IT業界ってなかなか大変ですよね。🐣

そんな時上司から「PMOに挑戦してみない？」とお話しをいただきました。
たくさん考えた結果このようなチャンスは何度もない！挑戦してみよう！と決意をし、
心機一転新たなキャリアを歩むこととなりました。

## PMOってなんだろう？

とはいえPMOってなんだろう？
・・筆者は現職で初めてPMOを知りました🙇🏻‍♀️💦

### PMOの定義と役割

正式名称は『**Project Management Office**』

日本では「プロジェクトマネジメントオフィス」「プログラムマネジメントオフィス」と呼ばれているそうです。

主な役割はPMの補佐として、以下のような役割を果たすそう。
- 課題管理
    - 課題の洗い出し、課題解決に向けた施策の検討支援
    - タスク停滞箇所の把握と追跡、期限超過の未然防止に向けた施策の検討・実行

- TODO管理
    - 管理ツールにてタスク・各種チェックリストなどを確認

- QA・品質管理
    - プロジェクトの品質向上に向けた施策の検討・実行

- 社内外調整
    - 顧客（エンドユーザー）からのニーズヒアリング・情報整理
    - ニーズをプロジェクト関係者へエスカレーション

- その他
    - スケジュール調整
    - 報告書の作成
    - データ・情報分析

かなり多義にわたりますよね！

自分の認識は、
**PMの支援を通じ、プロジェクトの成功に導く究極のサポーター業務・コンサルティング業務**だと感じています。🌱

## PMOのレベルとロードマップ

🕴🏻偉い人：「プロジェクトのコンサルティングよろしく」
と、突然言われてもできないですよね🥹

PMOにも以下のようなロードマップがあるようです。

- 初級レベル ：事務型PMO　⬅️筆者はイマココ🐣
基本情報整備　作業環境整備

- 中級レベル ：管理型PMO
プロジェクト管理整備、プロジェクト可視化支援

- 上級レベル ：参謀型PMO
プロジェクトコントロール、プロジェクト遂行支援

- 上級レベル ：全社型PMO
ガバナンス構築、全PJ経営意思決定支援

ロードマップがあると今の自分の位置と目指すべき目標が明確になって、
モチベーションあがりますよね！🐰（私は不安になりやすいので、位置を知ってたいタイプです👧🏻）

もちろん今に集中して気がついたらこんなところに辿りついてた！って場合もとても素敵だと思います✨

# まとめ
最後まで読んでくださってありがとうございます！
次回は「プレゼン資料について」と「人のタイプわけについて」記事を書こうかと思っています。
何かリクエスト・アドバイスなどありましたら、コメントいただけると幸いです🙇🏻‍♀️
supabaseをローカル環境に立てる　LINUX

# supabaseをローカル環境に立てる
## ドキュメント
https://supabase.com/docs/guides/cli/local-development

### supabase CLIにログイン
```sh
npx supabase login
```

### 途中でアクセストークンを求められるので下記URLからトークンを発行
https://supabase.com/dashboard/account/tokens

### 初期化
```sh
npx supabase init
```

### dockerの起動
- 何も気にせずただdockerを起動するだけでよい

### サービスの開始
```sh
npx supabase start
```
- dockerでサービスが立ち上がる。

:::note warn
failed to connect to `host=localhost user=postgres database=postgres`: dial error (dial tcp 127.0.0.1:54322: connect: connection refused)
というエラーが発生した場合は下記手順にて修正を加えてください。
:::

### エラーが発生した場合
- npx supabase init するとできる```supabase/config.toml```のportを54322から5432に修正
```sh
[db]
# Port to use for the local database URL.
port = 54322
# The database major version to use. This has to be the same as your remote database's. Run `SHOW
# server_version;` on the remote database to check.
major_version = 15
```

- うまく立ち上がると下記のような情報が表示される
```sh
Seeding data supabase/seed.sql...
Started supabase local development setup.

         API URL: http://localhost:54321
     GraphQL URL: http://localhost:54321/graphql/v1
          DB URL: postgresql://postgres:postgres@localhost:5432/postgres
      Studio URL: http://localhost:54323
    Inbucket URL: http://localhost:54324
      JWT secret: super-secret-jwt-token-with-at-least-32-characters-long
        anon key: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZS1kZW1vIiwiXXXXXXXXXXXXXXXXXXXXXXXXXX
service_role key: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFXXXXXXXXXXXXXXXXXXXXX
```

### .envファイルを作成
- ルートディレクトリに.envファイルを作成し、下記内容を記述
```sh
DIRECT_URL="postgresql://postgres:postgres@localhost:5432/postgres"
WRITER_DATABASE_URL="postgresql://postgres:postgres@localhost:5432/postgres"
```
- このURLは先ほどのDB URL

### prismaを使用している場合はschemaを書きマイグレーションする
```sh
npx prisma migrate dev
```

### localのsupabaseにアクセス
http://localhost:54323

### エラーが出る場合
- NEXT_PUBLIC_SUPABASE_URLとNEXT_PUBLIC_SUPABASE_ANON_KEYが必要な場合は併せて.envに記載する
```sh
NEXT_PUBLIC_SUPABASE_URL=http://localhost:3000/api/v1/
NEXT_PUBLIC_SUPABASE_ANON_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
```
OSI基本参照モデル

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457284/cbbfc3f5-f007-a398-fce7-fa00e09984e1.png)
１：OSI基本参照モデル
①アプリケーション層（第７層）：通信を行う各種アプリケーションの動作を定める

②プレゼンテーション層（第６層）：各アプリケーションが送受するデータを共通の転送構文に変換する。

③セッション層（第５層）：アプリケーション間で取り交わす会話を成立させる。

④トランスポート層（第４層）：ネットワークごとの品質の良さを吸収した透過的な伝送路を上位層に提供する。

⑤ネットワーク層（第３層）：データの中継や経路選択を行う。

⑥データリンク層（第２層）：隣接ノード間のデータ転送を行う。

⑦物理層（第１層）：伝送を行う上での物理的な条件を規定する。

２：物理層（第１層、L1）
　コネクトの形状やケーブリウの電気特性など、物理的な電気特性について規定するグループです。

３：データリンク層（第２層、L2）
　誤りなくデータの送受信をできるように、隣接ノード間（ケーブルで直接繋がれた機器間）での通信方法について規定するグループです。同時制御、伝送制御手順、アクセス制御手順、誤り制御箱に襲うの話題です。

４：ネットワーク層（第３層、L3）
　データの中継方法について規定するグループです。経路制御（ルーティング）はこの層の重要な話題です。経路制御とは、ネットワークのどの経路を使ってデータを伝送するのかを決める方法のことです。経路制御を行う機器を「ルータ」と言います。

５：トランスポート層（第４層、L4）
　通信品質を高くする方法について規定するグループです。データが伝わってくる経路の中には、回線の品質が悪くて、誤りが発生して安い回線が含まれていることもあります。こういった場合でも、一定レベルの通信品質を保てるよう調整を図るのがこの層の役割です。具体的には、誤り制御や再送制御、コネクションの多重化（複数のコネクションを束ねる）について規定します。下位層（物理層〜ネットワーク層）の品質の位置外を意識させずに、一定レベルの品質で利用者に利用させようということです。このようなことを、エンドノード間での投下的な通信を行えるようにすると表現します。

６：セッション層（第５層、L5）
　アプリケーション間でメッセージのやり取りを迅速に行えるようにする機能について規定するグループです。送信権制御や同時制御について規定します。

７：プレゼンテーション層（第６層、L6）
アプリケーションがやり取りするメッセージの形式（フォーマット）について規定するグループです。文字コードの変換、圧縮・身長などを行います。

８：アプリケーション層（第７層、L７）
　アプリケーションとやり取りする手順について規定するグループです。例えば、Webサーバとやり取りするにはHTTPという手順を用います。電子メールサーバとやり取りするにはSMTPやPOPという手順を用います。このように、アプリケーション独自の手順を規定します。

９：プロトコル
　プロトコルとは、通信規約、通信手順を意味する言葉です。相手と正しく通有心を行えるようにするための取り決めがプロトコルです。自分と相手は同じプロトコルをリヨして、はじめて、正しく通信をすることができます。インターネット通信では、各層ごとに次のプロトコルを利用しています。

※代表的なプロトコル
①ネットワーク層：プロトコル：IP、役割：宛先/送信元ホストの指定
②トランスポート層：プロトコル：TCP、UDP、役割：宛先/送信元アプリケーションプログラムの指定
③アプリケーション層：
プロトコル：HTTP、役割：Webサービスの提供
プロトコル：FTP、役割：ファイル転送サービスの提供
プロトコル：SMTP、役割：電子メールの配送
プロトコル：SNMP、役割：ネットワーク上の機器の動作情報収集
プロトコル：DNS、役割：ホスト名とIPアドレスの変換
django 更新ページを更新してその詳細ページへ飛ばす方法。updateViewの記述。

# 概要
djangoを使ったブログ投稿アプリ制作で躓いたため記事を作りました。

### 解決したかったこと
任意の詳細ページから更新ページへ飛んで、更新ボタンを押したらまた詳細ページへ飛ぶ仕様を実現したかった

### よくある記事
任意の詳細ページから更新ページへ飛んで、更新ボタンを押したら一覧ページに飛ぶ仕様。この問題を解決するためのサイトはたくさんあるが、中々上記の解決方法が乗っているサイトがなかったため記載します。


### 前提情報
- 任意の詳細ページはdetail.html
- それに紐づく更新ページはupdate.htmlと仮定
- detail.html内にある「更新」ボタンを押すと、update.htmlを表示
- update.html内にある「更新」ボタンを押すと情報が更新されたdetail.htmlが表示されるようにする
- アプリの階層は

```フォルダ階層(簡易版).
├── aaaフォルダ
    ├──blogフォルダ(今回のアプリケーション名)
        ├──urls.py ※今回記述箇所
        ├──views.py　※今回記述箇所
        ├──models.py　
    ├── confフォルダ
    └── templatesフォルダ
```




### 実装方法

`name='blog_detail'`と記述しています

```python:urls.py
urlpatterns = [
    ````
    path('detail/<int:pk>', views.BlogDetail.as_view(), name='blog_detail'),
    path('update/<int:pk>', views.BlogUpdate.as_view(), name='blog_update'),
    ````
]
```
`def get_success_url(self):~~`を追加します。
print文はpkの値をコンソールにて確認したいため記述しています。
print文はなくてもOK
reverse_lazyを利用して処理を完了した後に詳細ページに飛ばします。

:::note info
('blog:blog_detail', kwargs={'pk': self.object.pk})の部分が重要で
('**アプリケーション名**:**urls.pyで設定したname**',id)となります。
これが
~blog/blog_detail/1 のURLなります。
:::

```python:views.py
~
~
~
from django.urls import reverse_lazy 　　　　　※この行を追加


urlpatterns = [
    ````
    class BlogUpdate(generic.UpdateView):
    model = Post
    form_class = BlogUpdateForm
    template_name = 'blog/blog_update.html'

    ※↓ここ重要！！！！！！！
    def get_success_url(self):
        print(self.object.pk)
        print('こんにちは')
        return reverse_lazy('blog:blog_detail', kwargs={'pk': self.object.pk})
    ````
]
```

#### ※参考
update.htmlではinputタグを用いてデータを送信しています。
そのためViews.pyのUpdateViewにて処理が終わったらページに遷移するコードを書かなければならないのです。

```html:update.html
<form method="post" enctype="multipart/form-data">
    {% csrf_token %}
    {{ form.as_p }}
    <input type="submit" id="save" value="更新">
</form>
```
ChatGPTを無料で使う方法

# はじめに
OpenAI社からGPT-4がリリースされ月額$20で、最新の情報が学習されたAIチャットボットが利用できるようになりました。
月額$20というと、日本円で約2,900円
「毎月3000円も払えない〜」という方に向けてChatGPTのGPT-4を無料で使える方法をご紹介します
（ご利用は自己責任でお願いします）

# Microsoft Bing
![Anniversary_Chat_16x9_Edit-1024x.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603047/2368a54e-da91-2a69-dd7e-d9f0645f0d26.jpeg)
(https://news.microsoft.com/ja-jp/2023/02/08/230208-reinventing-search-with-a-new-ai-powered-microsoft-bing-and-edge-your-copilot-for-the-web/ より引用)

検索ブラウザのMicrosoft Edgeや、Chromeなどで「Microsoft bing」で検索すると利用できます。
モデルはGPT-4やDALLE2を搭載しています。
無料かつ会員登録無しで使用できますが、この場合は1日に5件しかチャットができません。
Microsoftのアカウントを作成すると、1日に30件もチャットができます。
機能は様々あります。
・段落を付けて文章を作成
・メールの文章作成
・ブログ記事作成
・アイデア作成
![スクリーンショット 2023-09-01 15.54.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603047/8a973d9f-d6de-be3c-607a-1ac1968ef853.png)

# Forefront AI
![TusSXtGuKJMxZohL.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603047/acecd85c-eba1-6acd-c795-6da5e60d77de.jpeg)
(https://twitter.com/ForefrontAI より引用)

ForefrontAIは日本語対応があり、GPT-4を無料で利用できるサービスです。
会員登録(無料)をすると利用できます。
架空のキャラクターを作成できたり、現実のキャラクターを設定してチャットができます。
有名人や歴史上の偉人とチャットができるのが面白いです。
会話の内容をフォルダに保存できる機能があります。
また、画像生成の機能もあります。

👇公式サイトは下記

https://www.forefront.ai/

# AIチャットくん
![w960.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603047/c3620b0b-6306-f711-b591-7b15b8c38a40.jpeg)
(https://page.line.me/295aqhjz/showcase/1169802955539752/item/1169845849849741 より引用)
こちらはLINEの公式アカウントを登録すると、LINEの画面上で使用できるサービスです。
無料版だと回数制限があります。

https://page.line.me/295aqhjz

# さいごに
他にはHugging faceがありますが、エラーが比較的多めなので忍耐が必要です
https://huggingface.co/


今回ご紹介したサービスや他社のサービスを使用して物足りなさを感じた方は正式なOpenAI社のChatGPTに課金しましょう。
今年度内なら3,000円前後で利用できます。
社内で福利厚生に設定されたり、個人事業主や副業されている方は仕事で利用して確定申告で経費にしましょう笑

https://openai.com/gpt-4
Laravel ブラウザバック対策 ブラウザキャッシュさせないミドルウェアを実装

## 概要

ログインした後にブラウザバックするとブラウザキャッシュが残っててログイン画面が表示されてしまうとかそういう時の対策です。

## 環境

- PHP 8.0
- Laravel 9.x

## ミドルウェアを作成

```php:app/Http/Middleware/NoCacheMiddleware.php
<?php

declare(strict_types=1);

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Http\Response;

final class NoCacheMiddleware
{
    /**
     * @param Request $request
     * @param Closure(Request): (Response|RedirectResponse) $next
     * @return Response|RedirectResponse
     */
    public function handle(Request $request, Closure $next): Response|RedirectResponse
    {
        $response = $next($request);
        $response->withHeaders([
            'Cache-Control' => 'no-store',
            'Max-Age' => 0,
        ]);

        return $response;
    }
}
```

## Httpカーネルにミドルウェアを登録

```php:app/Http/Kernel.php
<?php

declare(strict_types=1);

namespace App\Http;

use Illuminate\Foundation\Http\Kernel as HttpKernel;

class Kernel extends HttpKernel
{
    protected $routeMiddleware = [
        // ... 追加
        'no-cache' => \App\Http\Middleware\NoCacheMiddleware::class,
    ];
}
```

`$middleware` や `$middlewareGroup` に登録すると全体的に適応されてしまうので、
`$routeMiddleware` に登録して使用したいルートだけミドルウェアを呼び出したいと思います。

## 使い方

```php:routes/web.php
Route::middleware([
    'no-cache',
])->group(function (): void {
    Route::get('login', LoginController::class)->name('login')->middleware(['guest']);
});
```

![ScreenShot 2023-09-01 17.27.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52879/19874152-e1be-ed17-04d5-b28038d15026.png)

開発者ツール見てヘッダーが反映されてることを確認します。

## 追記

@mpyw さんからコメントから公式で用意されてるのを教えてもらいました。

```php:app/Http/Kernel.php
        'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
```

`cache.headers` ミドルウェアが用意されました。

```php:routes/web.php
Route::middleware([
    'cache.headers:no_store;max_age=0',
])->group(function (): void {
    Route::get('login', LoginController::class)->name('login')->middleware(['guest']);
});
```

ミドルウェアを自前で用意しなくてもレスポンスヘッダーを指定できました。
スッキリわかるJava入門 第３版を読んでみて- part16 -コレクション

# はじめに
こんにちは(・ω・）ﾉ
今回はコレクションについて学びました！
## 第１６章　コレクション
### 1.コレクションとは
配列のように「順序をつけて並べて格納する」...リスト
API版... __コレクションフレームワーク__

例：ArrayList
　配列に似たもの、リスト構造でデータを格納できる入れ物クラス
特徴は３つ
1.import文を記述する
　ArrayListクラスをはじめとするコレクションクラスはjava.utilパッケージに属す
2.＜＞記法を使って、格納するインスタンスの型を指定する
文字列の格納の時
　配列...String[]
　　ArrayList...ArrayList<String>
※＜＞を使った表現...ジェネリクス
＜＞の中身はDeroでもDateなどなんでもどんな種類のインスタンスでも格納できる
3.宣言時のサイズ指定は不要であり要素は随時追加できる
　宣言時にはこの宣言が不要
　データを追加する際に不足していれば自動的に追加されるため

:sparkles: コレクションにはできないこと
コレクションには、基本データ型の情報を格納することができない

８つの基本データに対応して「基本データ型の情報を中身に保持すること」
を責務とする８つのクラス　→ __ラッパークラス__
ラッパークラス型のインスタンスを基本データ型のデータを相互に自動変換する
→ __オートボクシング__、オートアンボクシング

### 2.ArrayListの使い方
:pencil2: ArrayListの宣言
`ArrayList<~>　変数名 = new ArrayList<~>();`

メソッドの種類
要素を追加する
　add()　挿入
　set()　上書き

要素の取り出し
　get()　要素の始まりが0からなのに注意

リストを調査する
　size()　要素数の調査
　isEmpty()　要素数が０かどうか
　contains()　値が「含まれているか」
　index Of()　「何番目の位置か」

要素を削除する
　clear()　すべての要素を削除する
　remove()　指定位置の要素を削除

中身が省略された＜＞... __ダイヤモンド演算子__

要素を順に取り出す３つの方法
:pencil2: : for文を用いたリスト要素の取り出し
```
for(int i = 0; i < リスト変数.size(); i++){
 /*リスト変数.get(i)で要素の読み書き*/
}
```

:pencil2: 拡張for文を用いたリスト要素を取り出し
```
for(リスト要素の型 e :リスト変数){
 /** e で要素を読み書き/
}
```

コレクションクラスの中身を順に取り出すための専用... __イテレーター__
:pencil2:  イテレーターの取得
`Iterator<リスト要素の型> it = リスト変数.iterator();`

※iteratorメソッドを呼ぶと...
　そのリストの先頭（最初の箱）よりもっと前を指定した状態の矢印が取得された

:pencil2: イテレータを用いたリスト要素の取り出し
```
Iterator<リスト要素の型> it = リスト変数.iterator();{
while(it.hasNext()){
 リスト要素の型 e = it.next();
 /*要素eを用いた処理*/
}
```
### 3.LinkedListの使い方
ArrayListの他にもLinkedListというクラスが用意されている
連結リストと呼ばれる構造を応用

内部構造の違いに起因した動作の違いがある
1.要素の挿入や削除に対する違い
2.添え字の指定に対する違い

ザックリいうとどっちもリスト！

:sparkles:インタフェース型の活用
引数・戻り値・ローカル変数には、極力あいまいな型（インタフェース型）
を利用できないかを検討し、積極的に利用する

### 4.Set関連のクラス

:sparkles:Setの基本特性
・それぞれの特性には、重複が許されない
・それぞれの要素には、基本的に順序関係がない

SetとListには似た部分がある、比較して注意すること３点
1.重複した値を格納しようとすると無視される
2.Set()やget()がない
3.要素を１つずつ取り出す場合の順序は不明
　中身を１つずつ取り出すときにどのような順序で要素が取り出されるかは保証されない

:sparkles:順序が保証されるSetバリュエーション
LinkedHashSet:値を格納した順序に整列
TreeSet:自然順序付けで整列
※自然順序付け...それぞれのクラス固有の順序

### 5.Mapの使い方
Mapとは...２つの情報を __キー__ と __値__ のペアとして格納するデータ構造

:pencil2: HashMapのインスタンス化
```
Map<キーの型、値の型> マップ変数=
 new HashMap<キーの型、値の型>();
```
Mapでは値の重複はOK、 キーの重複はNG

:pencil2: マップに格納された情報を１つずつ取り出す
```
for(キーの値　key:　マップ変数.keySet()){
　値の型　value = マップ変数.get(key);
/*keyとvalueを用いて何らかの処理を行う*/
```
### 6.コレクション活用
:sparkles: 格納しているのは参照
格納前や取得後の変数のインスタンスを書き換えると、
コレクションに格納中の要素も書き換わる恐れがある

:sparkles: Hash系コレクションの制約
HashSetやHashMapに格納するクラスは、equals()およびhashCode()を
正しくオーバーライドしていないと意図しない動作をすることがある

## まとめ
主なコレクションとしてはList,Set,Mapの３種類があり、目的に応じて使い分ける
→Listは要素の格納
→Setは要素の取り出し
→Mapはペアの集まりを取り出し

上の感じで大体のコレクションの特性を大まかに理解しました！
コレクションの活用について理解を深める必要があると感じました（´ω｀）

今回もありがとうございました！
ではまた〜　＊˙︶˙＊)ﾉ"
terraform plan の結果だけを粛々とログに自動保存する

plan の結果をログなどに溜めておきたいことがある。
以下のようなコマンドを .bashrc に書くことで、plan/apply 時の標準出力をログに力技で保存することが可能。

```bash:.bashrc
terraform() {
  PLAN_FILE="/tmp/tfplan_$(date +%Y%m%d).log"

  if [ "$1" = 'plan' ] || [ "$1" = 'apply' ]; then
    date --iso-8601=seconds >> $PLAN_FILE
    command terraform "$@" -no-color | tee -a $PLAN_FILE
    echo -e "\n\n" >> $PLAN_FILE
  else
    command terraform "$@"
  fi
}
export -f terraform
```

```text:/tmp/tfplan_20230901.log
2023-09-01T15:04:05+09:00
module.foo.data.archive_file.this: Reading...
module.bar.archive_prepare[0]: Reading...
   :
```

課題

- plan/apply 時にターミナルに表示されるテキストのカラーがなくなる
  - オプションの `-no-color` を外せば色が付くが、ログファイルにエスケープシーケンスが表示されるようになってしまう
- Makefile など特殊なシェルで実行される場合は .bashrc を読まないので効かなくなる
RenderでWebアプリを公開する方法[Windows10]

## はじめに
今回はRenderの使用方法について書きたいと思います。
Githubを使用するので、登録していない方は、こちらの記事を読んで登録してください。

https://qiita.com/ren_g/items/e77c0484e5d1b9e74b35

## 前提条件

|Windows10 64bit|
|---|

## Renderについて
[Render](https://render.com/)とは、Webサイトを構築または、実行するためのツールです。
アプリ開発では、デプロイすることが必要になります、
* デプロイ
実行ファイル（プログラムなど）を、アクセス可能な本番環境に配置すること。



## Docker について
Dockerfileを使用するので、Dockerについての説明をします。
* Docker
Docker社が開発するアプリケーションの実行環境
* Dockerコンテナ
仮想化されたアプリケーションの実行環境
* Dockerイメージ
Dockerコンテナの動作環境
* Dockerfile
Dockerイメージを作成するための設計図

Dockerfileを利用するだけで、同じ開発環境を簡単に作成することができます。

## Dockerfile作成方法
<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3526192/f0b3b37c-1c36-58cf-2c6a-6aaca6c0c859.png">

STSを開いて、Dockerfileを作成するプロジェクトを選択し、右クリック＞新規＞その他を押します。

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3526192/062e4285-1216-5b00-20bc-10c6ade39be5.png">

一般＞ファイル＞次へを押します。

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3526192/636b9798-3366-fccb-742b-9618f88fd560.png">

親フォルダーを選択します。今回はdemoを使用するので、demoを選択しました。
次に、「ファイル名」の欄にDockerfileと入力します。
ここまでできたら、「完了」を押してください。

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3526192/e53552c6-94ae-0468-0aed-ca203806c0b7.png">

demo配下に、Dockerfileが作成されたことを確認します。

そして、下のコードをDockerfileに入力します。
```
FROM maven:3-eclipse-temurin-17 AS build//buildステージを開始、Eclipse Temurin 17 JDKを適応したMavenということを設定
COPY . .//ファイルをコピー
RUN mvn clean package -Dmaven.test.skip=true//アプリケーションの実行と、テストのスキップ。
FROM eclipse-temurin:17-alpine//新しいビルドステージの開始
COPY --from=build /target/demo-0.0.1-SNAPSHOT.jar demo.jar//前のビルドステージからビルドされたjarファイル(demo.jar)を新しいビルドステージにコピー
EXPOSE 8080//ポート8080を宣言
ENTRYPOINT ["java", "-jar", "demo.jar"]//実行するファイル(demo.jar)を指定
```
ファイルの変更を保存して完了です。

プロジェクト名がdemoではない時は、demoと記載している部分を変更してください。

## Render登録方法
[Render](https://render.com/)のページへ飛びます。
今回は、Renderをデプロイ環境として利用していきたいと思います。


<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3526192/22f534e2-797d-616d-a2fc-e9ad1629383a.png">

「GET STARTED FOR FREE」を押してください。

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3526192/d99676e1-4c68-7837-dde8-18d35ab8cef5.png">

Githubを選択します。

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3526192/83e3afee-bff1-7fa2-9fd4-07ec6853e0f3.png">

ログインできたら、ページ右上のNew＞Web Serviceを押します。

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3526192/04ad4602-3e9d-ca89-6130-d66293446a30.png">

Githubと連携できていれば、リポジトリが表示されるので、前回の記事で作成したリポジトリを「Connect」します。

<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3526192/4e459aa5-0a51-3008-0d57-a6bcab0bc41f.png">

Dashboradから、デプロイできているのか確認します。
「Events」を押せば、デプロイ状況が確認できます。
デプロイ完了であれば、URLからページにアクセスします。
<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3526192/849b1dbb-ce1c-fcf3-e8f7-9b75932e30f0.png">
このように表示されれば、成功です。
お疲れさまでした。

## 参考記事
今回は、こちらの記事を参考にしました。

https://qiita.com/hardreggaecafe/items/406042168fe2bce3b53d#tldr
データベースコマンド基礎：MySQLでよく使うコマンドまとめ

### イントロダクション
データベースは現代のソフトウェア開発において不可欠な要素です。しかし、データベースを効率よく操作するには、そのコマンドを理解する必要があります。このブログでは、MySQLデータベースでよく使用される基本的なコマンドを紹介します。

### 対象読者
- データベース初心者
- SQLの基本的なコマンドを学びたい人
- 基本的なコマンド

#### SELECT
データを取得するための基本的なコマンドです。

```
SELECT * FROM users;
```

#### INSERT
新しいレコードを追加します。
```
INSERT INTO users (username, email) VALUES ('john_doe', 'john@example.com');
```
### UPDATE
既存のレコードを更新します。

```
UPDATE users SET email = 'john.new@example.com' WHERE username = 'john_doe';
```
### DELETE
レコードを削除します。

```
DELETE FROM users WHERE username = 'john_doe';
```
高度なコマンド
#### JOIN
複数のテーブルからデータを結合して取得します。

```
SELECT orders.id, users.username FROM orders JOIN users ON orders.user_id = users.id;
TRANSACTIONS
```
複数の操作を一つのトランザクションとして扱います。

```
START TRANSACTION;
UPDATE account SET balance = balance - 100 WHERE id = 1;
UPDATE account SET balance = balance + 100 WHERE id = 2;
COMMIT;
```

#### エラーとトラブルシューティング
- Syntax error：コマンドの文法に誤りがあります。コマンドを再確認してください。
- Table doesn't exist：指定したテーブルが存在しない場合に出るエラーです。テーブル名を再確認してください。

#### ベストプラクティス
- 常にバックアップを取ってから大きな操作を行う。
- SELECT *は避け、必要なカラムのみを取得する。
- パスワードなどのセキュアな情報は暗号化して保存する。

#### まとめ
このブログでは、MySQLでよく使用される基本的なコマンドをいくつか紹介しました。これらのコマンドをマスターすれば、データベース操作がぐっと楽になるでしょう。

以上が簡単な例ですが、これをベースに更に内容を深掘りしていくとよいでしょう。希望に添えれば幸いです。
Ubuntu環境でdockerを扱うためのコマンドの備忘録


# この記事について
最近初めてubuntuを触り始め、わからないことを調べたはいいものの記憶に残らないため、備忘録として残します。なお、著者のubuntuとlinuxの使用歴は0で、dockerの使用目的は深層学習を仮想環境で行いために利用しています。

# linuxコマンドのファイル操作について

### touch : ファイルを作る
~~~md:ファイルを作成する
touch new_file.txt
~~~
### cp : ファイルをコピーする
~~~md:ファイルのコピー
cp file.txt new_file.txt
~~~
### mv : ファイルの移動
~~~md:ファイル名の変更
mv file.txt new_file.txt
~~~

~~~md:ディレクトリ名の変更
mv FILE/ NEW_FILE/
~~~

### ファイルの削除
~~~md:ファイルの削除
rm file.txt
~~~

~~~md:ディレクトリの削除
rm -r FILE/
~~~

### find : 指定ファイルを見つける
~~~md:指定ファイル(100_G.pth)以外の(_G.pth)の削除方法(確認のみ)
find ./ -name "*_G.pth" ! -name "100_G.pth" | xargs echo
~~~
Linuxコマンドは"|"をいれることで複数の操作を行うことができる
~~~md:上記の削除用(※sudoが必要な場合は、rmの前に入れる)
find ./ -name "*_G.pth" ! -name "100_G.pth" | xargs rm
~~~

# UbuntuでのDockerについて
以下例で示すために、
- コンテナ名：**torch112**
- imageファイル：**pytorch/pytorch:1.12.1-cuda11.3-cudnn8-devel**
- マウントするローカルディレクトリ：**/data/torch1.12**
- docker内での上記ディレクトリと対応する名前：data
とする

### docker pull & runコマンド
- --shm-size : 使用する共有メモリ。デフォルト(64mb?)では足りないことが多いため、2gとする
- -v : "マウントするローカルディレクトリ":/"docker内で対応するディレクトリ名"
- --gpus : allや0, 1等
- -it : imageファイル
- -p : ホストとコンテナのポートマッピング
~~~md:Dockerのimageをpull & 起動
docker run --shm-size=2g --name torch112 -v /data/torch1.12:/data --gpus all -p 8080:8080 -it pytorch/pytorch:1.12.1-cuda11.3-cudnn8-devel
~~~
### 稼働状況について
~~~md:dockerの稼働状況確認
docker ps -a  #-aをとると起動中のコンテナのみ表示される
~~~

~~~md:imageの一覧表示
docker images ls
~~~

### コンテナの起動や停止
~~~md:作成したimageを起動する
docker start torch112
~~~
~~~md:起動したimageの中に入る
docker exec -it torch112 bash
~~~
~~~md:コンテナ停止
docker stop torch112
~~~

### コンテナの削除
~~~md:作成したコンテナの削除
docker rm -f torch112
~~~

# Nvidia-smiでGPU温度やメモリ使用率を監視する
### nvidia-smi実行
~~~md:
nvidia-smi
~~~
### nvidia-smi実行(一定時間で更新)
タスクマネージャのように表示を更新させる方法
~~~md:
nvidia-smi -l
~~~

なお、GPU Memory Junction Temperatureはubuntuからは監視することができない模様。
Javaで「メソッドを使ってメンバ変数を変更する理由」の動作を確認してみた

# 概要
Javaで「メソッドを使ってメンバ変数を変更する理由」の動作を確認してみました。以下のページを参考にしました。

https://www.javadrive.jp/start/member/index3.html

# 実装
以下のファイルを作成しました。
```CTest3.java
class CTest3{
  public static void main(String args[]){
    Television tv1 = new Television();

    tv1.setChannel(1);
  }
}

class Television{
  private int channelNo;

  void setChannel(int newChannelNo){
    channelNo = newChannelNo;
    System.out.println("新しいChannelNo=" + channelNo);
  }
}
```
以下のコマンドを実行しました。
```
$ javac CTest3.java 
$ java CTest3 
新しいChannelNo=1
```

# まとめ
何かの役に立てばと。
脱SourceTree👋🏻Gitコマンドを知る⚙️

# ◉はじめに
現在私はSourceTreeを使用してコミットやプッシュしたりしているのですが、まだまだ未熟ながらもそのうち超エンジニアっぽくスパパパーンッとTerminalにGitコマンドを打ち込んで使いこなせたらいいな〜と思ってます🤤
ということで、普段から使えるGitコマンドを教えていただいたので記録しました📝

# ◉Gitコマンド一覧（よく使いそう厳選）◉

## Commitしたのを希望のところに戻す
`git reset HEAD^`

コミットしたのを希望のところに戻せます。
一番右の`^`の数で戻る個数が決まります！

例：`^^`２つだと２つ前のコミットに戻せる

:::note info
使用例
- 最新のコミットを取り消す
```
git reset HEAD^
```
- 最新のコミットを取り消し、変更を修正して再コミット
```
git reset HEAD^
# 変更を修正
git commit -c ORIG_HEAD
```
:::

## 変更したファイルをステージングに追加する
`git add -u`

新しいファイルをステージングエリアに追加せず、既存の変更をステージングしたい場合に便利だそうです。

:::note info
使用例
- 変更されたファイルをステージングエリアに追加
```
git add -u
```
- ディレクトリ内の変更をステージング
```
git add -u path/to/directory
```
:::


## 現在の変更の状態を確認する
`git status`

どのファイルが変更されたかや、commitされていない変更がないか等状態を確認できます。

:::note info
使用例
```
git status
```
- コミット前の確認
- 変更の差分を表示
- ステージングの状態を確認
:::

## Commitする
`git commit -m “コメント”`

Commitする際に変更した箇所などのコメントを記載してCommitできます。

:::note info
使用例
- 変更をコミット
```
git commit -m "⚪︎⚪︎⚪︎を修正"
```
- 複数のファイルを一度にコミット
```
git add file1.txt file2.txt
git commit -m "ファイル1とファイル2の変更をコミット"
```
:::

## プッシュする
`git push`

プッシュできます。

:::note info
使用例
- リモートリポジトリへのプッシュ
▼mainブランチをプッシュ
```
git push origin main
```
- 強制プッシュ
→誤ってコミットした変更を修正する場合などに使用される
▼originというリモートリポジトリ
```
git push -f origin main
```
:::

# 💡他にどんなのがあるのかchatGPTに聞いてみました

### 新しいGitリポジトリを初期化する
`git init`

:::note info
使用例
- 新しいGitリポジトリの作成
```
cd /path/to/your/project
git init
```
- 既存のプロジェクトをGitで管理を開始
```
cd /path/to/existing/project
git init
```
:::

### リモートリポジトリからローカルにコピーを作成する
`git clone <リモートリポジトリのURL>`

:::note info
使用例
- GitHub上のプロジェクトをクローンする
```
git clone https://github.com/ユーザー名/リポジトリ名.git
```
- 特定のブランチをクローン
```
git clone -b develop https://github.com/ユーザー名/リポジトリ名.git
```
- クローン先のディレクトリを指定する
```
git clone https://github.com/ユーザー名/リポジトリ名.git my-project
```
:::

### ブランチの一覧を表示する
`git branch`

:::note info
使用例
- ブランチの一覧を表示
```
git branch
```
- 新しいブランチを作成
```
git branch new-feature
```
- ブランチ名の変更
```
git branch -m old-branch-name new-branch-name）
```
:::

### ブランチを切り替える
`git checkout <ブランチ名>`

:::note info
使用例
- 既存ブランチに切り替える
```
git checkout 既存ブランチ名
```
- 新しいブランチを作成して切り替える
```
git checkout -b 作成するブランチ名
```
:::

### ブランチを統合する
`git merge <ブランチ名>`

:::note info
使用例
- ブランチを現在のブランチにマージ
▼feature-branchブランチをmainブランチにマージ
```
git checkout main
git merge feature-branch
```
- 過去のコミットをマージ
▼特定のコミットをmainブランチにマージ
```
git checkout main
git merge 3a3b12c
```
:::

### コミット履歴を表示する
`git log`

:::note info
使用例
- コミットの差分を表示
```
git log -p
```
:::
M2のMacBookにHomebrewをインストールする方法

## 概要
M2のMacBook Proを購入しました。
そこで、通常の手順に則りHomebrewのインストールを進めたところ、エラーが発生しインストールができませんでした。
この記事では、その際にとった行動と解決方法をまとめます。

#### Homebrew
https://brew.sh/index_ja

## 問題に対してとった行動
<b>「Homebrew インストール M2 Mac」</b>というキーワードで検索をしました。

検索したところ、以下の記事を参考にして改めてインストールを実行したところ、無事にHomebrewのインストールが完了しました。

#### 参考にさせていただいた記事 🙏
https://qiita.com/otoriemuemu120/items/11bec052697a3230850f

## 解決方法

①ターミナルのアイコンを右クリックし、「オプション」の中から「Finderで表示」を選択

②Finderに表示されるターミナルのアイコンを右クリックし、「情報を見る」をクリック

③「Roseetaを使用して開く」にチェックをつける

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3550401/eee519b6-ba22-9456-a54d-8563cb7935a4.png)

ここまで進めたら、再度ターミナルでHomebrewのインストールを実行してみます。

``` 
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" 
```


<b> Installation successful! </b>と表示されたらインストール完了です。


最後にインストールされているかを確認するために以下のコマンドを実行してみてください。

```
brew -v 
```

` Homebrew 4.1.7 `というような結果が表示されていればインストール完了です。

## おわりに
今回はM2のMacBookでHomebrewをインストールを実行した際に、生じた事象とその対策について紹介しました。

今後も学習の過程について記録を残していこうと思います。

最後までお読みいただきありがとうございました。
Salesforce sfdx-cli (7.209.6) におけるテスト付きデプロイの引数メモ

# Salesforce sfdx-cli (7.209.6) におけるテスト付きデプロイの引数メモ

Salesforce CLI をもちいたデプロイの引数が、ネット検索などでも導出しづらいことがありました。そのため、動作実績ある引数メモを残します。

こちらの Salesforce sfdx コマンドですが、つい最近にも引数の仕様変更が入りました。
help を熟読すると最新版での引数はわかるようになっています。

ただ、毎度だと辛いので、現時点の版である `sfdx-cli/7.209.6` での動作実績ある引数メモを残します。

## sfdx コマンド引数（デプロイ）

```shell
sfdx project:deploy:start -x ./manifest/depscript.xml --test-level=RunSpecifiedTests --coverage-formatters=text --tests Test1 Test2 -o targetorg
```

| 引数 | 値／意味 | ポイント |
| --- | --- | --- |
| `project:deploy:start` | デプロイ | 過去に仕様変更 |
| `--test-level` | RunSpecifiedTests | テストクラスを個別に指定 |
| `--tests` | Test1 Test2 Test3 | テストクラス名を空白区切り<br>過去に仕様変更 |
| `--coverage-formatters` | text | カバレッジレポートを<br>テキスト出力 |
AWS CodeCommitでgit clone時のGitCredentialManager認証情報を設定した

# 課題
CICDの初心者ですが、
以下記事を見て、AWSのCodeシリーズを触ってみたところ、、、

https://qiita.com/MasayaMizuhara/items/12d1f3810601f6f07e5f#codedeploy%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%82%92%E3%81%99%E3%82%8B

CodeCommitのgit cloneとgit push時、画像のようなGit Credential Manager認証情報が聞かれて、、、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538617/db518684-a5fa-4f2d-98d2-758890a2031a.png)

最初**AWS CLI**の**アクセスキー**と**シークレットアクセスキーを**入れてみたけど、失敗してしまって、、、
（初心者がよくありがちらしい↑↑↑）

# 前提
・AWS CLIインストール済み
・gitインストール済み
・好みですが、TortoiseなどのGUIなども必要であれば
・上のサイトに従いAWS Codeシリーズを作成


# 対処方法
以下のサイトを見て解決した！

https://docs.aws.amazon.com/ja_jp/codecommit/latest/userguide/setting-up-gc.html

どうやら、必要な認証情報はAWS CLIのアクセス情報じゃなく、「**CodeCommit への HTTPS 接続用の Git 認証情報**」というやつでした。。。

## ①資格情報マネージャーの確認
まず、Windowsの資格情報マネージャーを開いて確認すると、確かにgit関連の認証情報は一つも設定されていなかった。。。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538617/377c9da9-1853-95ff-d26f-55406d71756f.png)

## ②AWSでcodeCommitの認証情報を作成

IAMを開いてCLI用のユーザーをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538617/a79a8ec6-b187-9315-ee08-505461df90dc.png)

セキュリティ認証情報タブをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538617/aa103d04-05ad-185f-4863-ef8413f62581.png)


認証情報の生成をクリックし、情報をダウンロード
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538617/a6290389-6830-f310-d1ab-ce0e5636c364.png)

## ③ダウンロードした認証情報を入れたらOK！

ダウンロードしたエクセルファイルを見て認証情報をGitCredentialManagerに入れたら、無事git cloneできたよ！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538617/86d590ce-b82a-9c0d-f67c-00e8fb9adc0f.png)



## ④もう一度資格情報マネージャーを確認
もう一度資格情報マネージャーを確認すると、さっき入れた認証情報は自動で覚えられて、今後git cloneするとき、パスワードを入れなくても大丈夫ようになった！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538617/1a0da712-9c66-a428-895a-e1725cd4589e.png)

# 終わりに
今回はWindowsの認証周りを学習できた！
AWS CloudFormationでKMSのAWSマネージド型キーのエイリアス名を指定する際の注意点

RDSのCloudFormationテンプレートを作成している際に、KMSのAWSマネージド型キーのエイリアス名を値として指定するときに気づいた注意点を共有したいと思います。この注意点は、AWS RDSだけでなく、他のサービスでもCloudFormationでKMSのAWSマネージド型キーのエイリアス名を指定する際に共通して適用されると思います。

## RDSマネジメントコンソールでは`aws/`プレフィックスになっている

RDSマネジメントコンソールでは、`aws/secretsmanager`のような形式で表示されているため、そのままパラメータの値として使用できると考えがちですが、実際には異なる形式で指定する必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3330696/1656e80b-c7ad-a3cc-cbbc-8dbf910defc3.png)

## KMSエイリアス名の注意点

>KMSのエイリアス名には、`aws/`プレフィックスが予約されています。  

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3330696/2f2a9406-476c-3ee3-40ad-fcf996fa7ba9.png)
スタック作成の際のエラーメッセージによると指定されたKMSキー（`aws/secretsmanager`）に関連する問題があるとのことで以下のいずれかの状況が発生している可能性があるようです。

1. 指定されたKMSキー（`aws/secretsmanager`）が存在しない。
2. 指定されたKMSキーが有効化されていない。
3. 現在のユーザーが指定されたKMSキーにアクセスできない。

```
Resource handler returned message: "The specified KMS key [aws/secretsmanager] either doesn't exist, isn't enabled, or isn't accessible by the current user. Either specify a different key or access the key with a different user."
```


`aws/secretsmanager`は存在してマネジメントコンソールで作成する時に利用できたのに、CloudFormation作成する時に同じ値を指定するとエラーが出てます。

## 対処方法

KMSキーのエイリアス名を指定する際には、`alias/aws/`プレフィックス形式で指定する必要があります。例えば、`alias/aws/secretsmanager`のような形式で指定することで、スタック作成時にエラーを回避できます。

## KMSキーのエイリアス名について

>[AWS KMS APIでは、エイリアス名は常に`alias/`で始まります](https://docs.aws.amazon.com/ja_jp/kms/latest/developerguide/concepts.html#key-id)

エイリアス名の形式は次のとおりです。

```
alias/<alias-name>
```

例:

```
alias/aws/secretsmanager
```

## まとめ

AWS CloudFormationでスタックを作成する際に、マネージドキーのエイリアス名を指定する場合は、`aws/`プレフィックスではなく、`alias/aws/`プレフィックスを使用しましょう。
Psych::BadAlias Unknown alias: defaultのエラーの原因とその対応

## 前提
- Ruby：3.0.0
- rails：6.1.3.1

## 経緯
Rubyを3.0.0から3.1に上げたところ、railsアプリ立ち上げ時に以下のようなエラーが発生した。

```shell
/usr/local/bundle/gems/psych-3.3.0/lib/psych/visitors/to_ruby.rb:420:in `resolve_class': Unknown alias: default (Psych::BadAlias)
```

## 原因
Ruby3.1から新たにPsychのバージョンが4.0に上がり、`Psych.load` が `safe_load` を利用するようになった。

> Psych 4.0 では Psych.load が safe_load を利用するように変更されました。この挙動が影響ある場合は、従来の挙動である unsafe_load を利用する Psych 3.3.2 を移行パスとして利用できます。[Bug #17866]

ref: https://www.ruby-lang.org/ja/news/2021/12/25/ruby-3-1-0-released/

この変更は以下のような背景があるらしい。

> loadメソッドが正しく使われないと脆弱になる可能性があるので、デフォルトでsafe_loadを実行するように

ref: https://techracho.bpsinc.jp/hachi8833/2021_05_18/107813#3-3

## 対応
Rails6.1.4にて、このPsych4.0への互換性の対応が行われたので、railsのバージョンを`6.1.3.1`から`6.1.4`にバージョンアップした。

> Starting in Psych 4.0.0 YAML.load behaves like YAML.safe_load. To preserve compatibility `Rails.application.config_for` now uses `YAML.unsafe_load` if available.

ref: https://github.com/rails/rails/releases/tag/v6.1.4

対応としては、`sale_load` がデフォルトになったために、制約が厳しくなるので、可能な箇所では `unsafe_load` を使うようになったということ。

あるいはこの記事([visit_Psych_Nodes_Alias': Unknown alias: default (Psych::BadAlias)　解決方法](https://qiita.com/mono_glyceride/items/a447f2451078e8031cbc))で言われているように、Psychのバージョンを下げることでも対応できるらしい。
ChakuraUIでのbuttonタグの属性disabledは使用不可

# 起きた問題
- React環境下ChakuraUIで画面開発途中`Button`が非活性にならない（ボタンを押せないようにしたい）


# 解決策

ChakraUIでbuttonを非活性にしたいときは[isDisabled](https://chakra-ui.com/docs/components/button/props#button-props)を使用

https://chakra-ui.com/docs/components/button/props#button-props

# 具体例
### NG例

```hoge.tsx
<Button disabled>
  {children}
</Button>
```

### OK例

```hoge.tsx

<Button isDisabled>
  {children}
</Button>
```

# 環境
- React18
- "@chakra-ui/react": "^2.8.0"
【Chrome Tips】特定の画面サイズをDimensionsに登録する方法

## これは何

Chromeで検証を開いているときに、特定の画面サイズで表示をすることができます。
画面上の`Dimentions:hoge`の部分のことです。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577501/dbf34081-37fd-7099-7d51-dab0c3a0384d.png)

ここで一定のデバイスのサイズを選べるほか、`Responsive`で手動でサイズを設定することもできますが、特定の画面サイズを頻繁に使用する場合は、そのサイズを`Dimensions`に登録しておくと便利だよという記事です。

## 方法

1.Chromeの検証モードを開き、`Dimensions`のドロップダウンを開きます。

:::note
そもそも`Dimensions`が表示されないよという方は`device toolver`の表示がオフになっています。

Dockの左上にあるPCとスマホのアイコンをクリックすると、device toolverを表示できます。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577501/53423947-ff59-9a2f-3201-de906d7b59e4.png)
:::

2.一番下にある`Edit...`を選択して、`Setting > Devices`を表示する

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577501/da9aa98b-7861-371f-5e8d-a217b65a6be7.png" width="300" />

3.`Setting > Devices`で`Dimensions`に追加したい画面サイズを登録する


デフォルトで表示されていないだけで、すでに用意されているデバイスサイズもたくさんあるので、`Dimensions`に追加したいサイズがあればチェックを入れておきます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577501/6c77edaa-eb22-33c0-d1ae-cc321d05c84d.png" width="300" />

用意されていないサイズを追加したい場合は、`Add custom devide...`で追加したいサイズを入力して追加できます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577501/be00bfc8-30b1-ea77-85e2-28f4d0182824.png" width="300" />


無事追加できると、Dimentionsに追加されて簡単にアクセスできるようになります。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577501/8239e771-ba76-d776-37a1-c155bca7de64.png" width="300" />

特定の画面サイズでよくスクリーンショットを撮る場合や、ブレイクポイントをテストする際に便利です。
SelenideでWebComponentsのinput要素を取るとShadowDomの外の要素を取ってしまう

# はじめに

普段E2EでSelenideを利用してテストを書いています。
今回その中で挙動がよくわからないコードがあり、うまくテストするのに時間がかかったのでまとめていきます

# 問題

以下のテストを書きました

```kotlin:test.kt
    @Step("<labelName>のチェックボックスが存在する")
    fun displayCheckBox(labelName: String) {
        `$$`(shadowDeepCss("todo-label"))
            .find(exactOwnText(labelName))
            .preceding(0)
            .`$`(shadowDeepCss("input"))
            .shouldBe(type("checkbox"))
    }
```

ここでHTMLの構造としては

```html
<header>
  <input className="search" />
</header>
<div class="chackbox-area">
  <sample-element>
    ここがshadowDOMになっている
    <input type="checkbox" />
    <todo-label>
     ここもshadowDOMになっている
     ラベル名
    </todo-label>
  </sample-element>
</div>
```

このようになっておりました

ここで、`todo-label`の上にあるチェックボックスをとりたいのですが、なぜかヘッダーのインプットがとれてしまいました

# 解決方法

```
`$`(shadowDeepCss("input"))
↓
`$`("input")
```

とすることで治りました。shadowDeepCssは1回のみでうまいことやってくれます

ではなぜヘッダーの`input`がとれたのかというとドキュメントをみるとわかります
>Now you can save time with the help of new method shadowDeepCss - it searches the element recursively in all shadow roots all over the dom.

すべての要素をしらべてヒットしたものを返しています
なのでヘッダーの`input`が返ってきてテストが失敗したのです

# おわりに

この1週間でSelenideについての理解がすこしふかまったようにおもえます

# 参考

https://selenide.org/2022/09/24/selenide-6.8.0/
React クラスコンポーネントのライフサイクルの理解



こんにちは！今日はReactの基本的な概念である、**ライフサイクル**について解説します。この記事では、マウント時、更新時、アンマウント時の各フェーズについて深掘りします。

## Reactコンポーネントのライフサイクル

Reactコンポーネントのライフサイクルは大きく分けて3つのフェーズに分けられます。

1. マウント（Mounting）
2. 更新（Updating）
3. アンマウント（Unmounting）

それぞれのフェーズで呼び出されるライフサイクルメソッドは異なります。

![スクリーンショット 2023-05-22 17.16.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/987057/a259f874-0ff4-95b9-e339-c22ce6a78261.png)


## 1. マウント（Mounting）

マウントは、コンポーネントがDOMに初めてレンダリングされる際のフェーズです。以下のメソッドがこの順番で呼び出されます。

1. `constructor()`
2. `static getDerivedStateFromProps()`
3. `render()`
4. `componentDidMount()`

ここで特に重要なのは、`constructor()`で初期状態を設定し、`render()`で初期レンダリングを行い、`componentDidMount()`でDOMが生成された後の操作を行うことです。

## 2. 更新（Updating）

コンポーネントの更新は、状態（state）またはプロパティ（props）の変更によってトリガーされます。以下のメソッドがこの順番で呼び出されます。

1. `static getDerivedStateFromProps()`
2. `shouldComponentUpdate()`
3. `render()`
4. `getSnapshotBeforeUpdate()`
5. `componentDidUpdate()`

これらのメソッドは、新しいプロパティまたは状態の変更に応じてコンポーネントの更新を制御します。

## 3. アンマウント（Unmounting）

コンポーネントがDOMから削除されるときにアンマウントフェーズが発生します。以下のメソッドが呼び出されます。

- `componentWillUnmount()`

このメソッドはコンポーネントがDOMから削除される直前に一度だけ呼び出されます。ここでは通常、タイマーや外部データソースといった、コンポーネントによって設定されたリソースをクリーンアップ（解除）します。

これらのライフサイクルメソッドを理解することは、Reactアプリケーションを効率的に制御し、データのフローを理解する上で重要です。
Salesforceリリースチェックリスト【随時更新】

## 本記事について
本記事はSalesforceのモジュール(メタデータ)をVSCodeでリリースする際の注意点を纏めたものです。
随時更新予定です。

## VSCodeによるSalesforceリリース時のチェックリスト
- **フローが有効となっていること**
salesforceのフローは組織の設定によっては無効な状態でリリースされます。
その場合、手動で有効化が必要です
- **レポートタイプのリリース状況が「リリース済」であること**
レポートタイプのリリースの設定に「開発中」「リリース済」があります。「開発中」の設定だと一般ユーザが参照できないので本番環境には「リリース済」の設定でリリースが必要です
- **テストクラスのカバレッジが75%以上であること**
これはsalesforceの常識ですが、Apexクラスをリリースする場合、Apexクラスのテストカバレッジが75%以上ある必要があります。リリース前にカバレッジを確認しておかないと、本番反映時にリリースが出来ないなんてことになります。
- **本番と開発でIDが異なる**
開発環境と本番環境ではレポートなどのIDが変わります。IDを直接指定してレポートを開いていたりすると開けません。IDを直接指定するのではなくデベロッパーネームを使うのが正しいですが、そうできない場合は本番リリース時にIDを本番用に置換が必要です。環境依存の設定はカスタム設定やカスタムラベルに定義しておくのが一般的です。

## Salesforce公式サイトの情報
変更セットおよびVSCode(メタデータAPI)によるリリースの注意点が[公式サイト](https://help.salesforce.com/s/articleView?id=sf.deploy_special_behavior.htm&type=5)に纏められているので、リリース時は公式サイトの注意事項を確認することをお勧めします。

## VSCodeによるリリースのその他考慮点
- **メタデータではリリース出来ないものがある**
フォルダ、キューやバッチスケジュールなどメタデータではリリース出来ないものがあります。
それらは個別にGUIなどから設定が必要です。
【ちょっと便利な小技_part 7】 Snippetでファイル名に合わせたクラス名を表示させよう

今回は前回の記事[【ちょっと便利な小技_part 6】VSCodeのカスタムSnippet編](https://qiita.com/nakamura_slj/items/bbad445bb213545c82a9)の内容を応用したものとなります。
なので、Snippetの利用方法はわかっている前提で進めるので、わからない人は前回の記事を見てください。
これでは始めます。
今回は**Snippetを使って楽にファイル名に合わせたクラス名をつける方法**を紹介します。
めちゃくちゃ簡単ですぐに終わります。
是非、試してみてください

## 実装方法
まずdart.jsonに下記のコードを追加します。
これでもうOKです。
あとは使うだけ！

```ruby:dart.json
"Class name": {
		"prefix": "Class name",
		"body": [
			"${TM_FILENAME_BASE/(.*)/${1:/pascalcase}/g}",
		],
		"description": "Class name",
	},
```
## 結果
もし、**test_class_name.dart**というファイル内でしようした場合
**TestClassName**となります！