OmniAICreator/Qiita-1.07M huggingface dataset:
タグProtectedエラーに対する対処療法【Mathematica備忘録】

今回起こった問題としては
```
のタグ○○はProtectedです
````
のようなエラーが出ることですが、これに対する対処療法的解決策として、
```
Unprotect[○○]
```
をエラーを吐いていると思われる関数の前に置く方法があります。
また、もしエラーを吐く関数が分からない(or多すぎる)時はセクションの一番頭に置くのもアリだと思います。

⭐︎注意⭐︎
根本的に問題を解決している訳ではなく、あくまで「変数や関数をフリーにして、エラーが出ないようにする」方法なので、コードによってはエラーが出る可能性はあります。
【AWS】"Trusted Advisor Priority" を簡単に説明します

![緑 シンプル かわいい 黒板 学校 先生 質問 タイトル YouTube サムネイル (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822977/3b4c9ad4-70cc-edbd-6e03-648c07d8e8a8.png)


# はじめに
Trusted Advisor Priority をご存じでしょうか。
AWS ドキュメントを確認すると「クラウドデプロイの最適化、耐障害性の向上、セキュリティギャップへの対処のために、最も重要なレコメンデーションに集中できるようにします。」と記載されています。

　
当記事では具体的に Trusted Advisor Priority がどのような機能なのかまとめています。
　
 
1. Trusted Advisor のおさらい
2. Trusted Advisor Priority 概要
3. 料金について
4. 利用するための条件
5. 利用開始方法

# 1. Trusted Advisor のおさらい
まずおさらいとして、Trusted Advisor がどのようなものか整理します。

　
Trusted Advisor は「コスト最適化」「パフォーマンス」「セキュリティ」「フォールトトレランス」の観点から AWS の利用状況を自動的にチェックし、改善ポイントを推奨事項としてアドバイスしてくれるサービスです。

　
この推奨事項は AWS のベストプラクティスに則っており、特にセキュリティに関する推奨事項は優先的に対応すべきです。

　
また、Trusted Advisor は Organizations で有効化することができ、有効化すると各メンバーアカウントの推奨事項を管理アカウントに集約できます。
管理アカウントにて各メンバーアカウントの推奨事項を一元管理することが可能になります。

　
Trusted Advisor Priority はこの管理アカウントで集約する機能を ON にすることが前提の機能となっています。

# 2. Trusted Advisor Priority 概要
Trusted Advisor Priority を利用すると、AWS アカウントチームと連携して推奨事項のステータスを追跡し、重大なリスクの軽減に取り組めるようになります。
　

:::note info
Enterprise support のお客様向けにリリースされたサービスです
:::

　
具体的には、管理アカウントに集約された推奨事項の中から、AWS アカウントチームが優先度高として対応すべき推奨事項を登録して、それを管理アカウントに通知 / 表示させることができます。

　
組織の管理者は、AWS アカウントチームによって登録された優先度高の推奨事項を確認し、メンバーアカウント側に連携 / プッシュしていくような運用イメージです。

　
確認後は Dismiss や Resolve などのステータスを推奨事項に登録して管理していきます。

　
通常、管理アカウントには大量の推奨事項が集約され、なにから対応すべきか複雑になるところ、Trusted Advisor Priority を利用することで優先的に対応すべき推奨事項が明確になり、組織の管理者はAWS アカウントチームと連携しながら適切に対処していくことが可能になります。


# 3. 料金について
:::note info
Trusted Advisor Priority の利用に追加料金は発生しません
:::


# 4. 利用するための条件
Trusted Advisor Priority の利用にあたって、以下の条件が必要です。
　

+ Enterprise Support に加入していること
+ Organizations の Management Account にアクセス出来ること
+ Organizations で Trusted Advisor を含むすべての機能を有効化していること
　

:::note warn
AWS アカウントチームによる優先度高の登録を受けるためには、メンバーアカウントのサポートプランは Enterprise である必要があります
:::



# 5. 利用開始方法
上記の条件を満たした上で、TAM 宛に Trusted Advisor Priority 有効化をメール等で依頼します。
無効化も同様です。

:::note info
条件を満たしただけで自動的に有効化されるものではありません
:::



# おわりに
Trusted Advisor Priority について簡単にまとめてみました。
組織が大きく、Trusted Advisor の推奨事項の管理が煩雑になっている場合は便利な機能となっています。
Trusted Advisor Priority 利用検討のお役に立てますと幸いです。
コンテナにsshできなくて困った話

## 0. 概要
コンテナ内部のguiアプリケーションを起動させたいという思いから，ホストからコンテナへのssh接続を試みましょう．せっかくsshするので，鍵認証がいいですね．
鍵認証を行うので，鍵のペア作って，公開鍵を渡して．．．コンテナへの鍵認証ssh接続は，かくして意気揚々と始まりました．
しかし，永遠に表示される下記のエラー．．．
```
root@localhost: Permission denied (publickey).
```
このエラーを解消するために悪戦苦闘した話です．
本記事では，上記のエラー解消を目的としつつ，既存のコンテナへの鍵認証ssh接続の方法について説明します．

## 1. 既存のコンテナへのssh接続
結論から言うと，既存のコンテナのポートをホストのポートにマッピングすることはできないです．そのため，既存のコンテナをイメージ化することでポートマッピングを行うことになります．大まかな手順は以下になります．
1. 既存のコンテナをイメージに変換
1. ポート設定をオプションとしたコンテナを1.のイメージをもとに作成
1. 鍵認証に必要な各種操作
1. 接続！！

上記の手順を具体的に示します．
```
(ホスト側)
$ docker commit container_name imege_name
$ docker run -it -p 2222:22 container_name2 image_name

#　ホストのポートを2222に設定しています．
#　container_name, container_name2, image_name，　の名前は任意です．

```
これで，ホストのポートとマッピングしたコンテナができました．


次にホスト側で鍵を作成します．
```
(ホスト側)
$ ssh-keygen -t rsa -b 2048 -f ~/.ssh/docker_key
$ docker cp ~/.ssh/docker_key.pub ubuntu_container_2:/root/.ssh/authorized_keys
```
これで，ホスト側の準備は終わりです．

次に，コンテナ内の操作に移ります．
今回は，既存のコンテナへの接続を想定していることから，コンテナ内に以下のファイルが存在することを前提としています．もし，ない場合は，mkdirで作成して下さい．
```
/root/.ssh
/var/run/sshd
```
```
(コンテナ側)
# sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
# sed -i 's/#PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config
# sed -i 's/#X11Forwarding no/X11Forwarding yes/' /etc/ssh/sshd_config
# sed -i 's/#X11UseLocalhost yes/X11UseLocalhost no/' /etc/ssh/sshd_config
# chmod 700 /root/.ssh
# chmod 600 /root/.ssh/authorized_keys
# service ssh restart 
```

これで，コンテナ側の準備が整ったはずです（整ってはいないのですが...）
とりあえず，一旦放置で進めましょう．

次に行うのは，ホスト側からのssh接続です．

```
(ホスト側)
$ ssh -X -i ~/.ssh/docker_key -p 2222 root@localhost
root@localhost: Permission denied (publickey).
```
悲しいですが，拒否されます．鍵のペアは問題ないはずなので，何がダメなのかわからず，非常に困惑しました．
一般的に，上記のエラーはパーミッションが問題らしいですが，下記のようにパーミッションを与えています．なぜだ？？？
```
# chmod 700 /root/.ssh
# chmod 600 /root/.ssh/authorized_keys
```

## 2. エラー対処
前節で，パーミッションの問題であると言われました．設定はしたはずですが，一応確認しましょう．
```
(コンテナ側)
# ls -ld /root/.ssh
drwx------ 1 root root 4096 Jul 16 17:03 /root/.ssh

# ls -l /root/.ssh
total 4
-rw------- 1 502 dialout 427 Jul 16 00:38 authorized_keys
```
...authorized_keysの所有者とグループがおかしい！！！！
/root/.sshディレクトリ自体のパーミッションは問題ないようですが，ディレクトリ内のauthorized_keysファイルのパーミッションがおかしいですね．

では，適切な所有者とグループに設定しましょう．

```
(コンテナ側)
# chown root:root /root/.ssh/authorized_keys
```
所有者とグループがrootになったと思います．安心です．
sshを再起動して，ホストから接続してみましょう．

```
$ ssh -X -i ~/.ssh/docker_key -p 2222 root@localhost
Welcome to Ubuntu 22.04.4 LTS (GNU/Linux 6.4.16-linuxkit x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/pro

root@xxxxxx:~# 
```
上記のように表示されたら完成です．

### 3. まとめ
ここにきて改めて，502という番号が一体なんだったのか考えましたが，正直よくわかりませんでした．コンテナを作成したホストのユーザidがそのまま反映されてしまっていた説が濃厚ですが，何かご存知でしたら，教えていただけますと幸いです．


以上！！

## 4. 参考
https://qiita.com/youcune/items/2f427979403771f2e03a

https://qiita.com/YumaInaura/items/7509061e4b27e03ea538

https://stackoverflow.com/questions/28210637/unable-to-ssh-localhost-permission-denied-publickey-connection-closed-by
Gitで大文字・小文字の識別をするには

## はじめに

ローカルで pagesフォルダの名前を Pagesに変更し、Azure Reposにプッシュしたところフォルダ名が pagesのままで、大文字に変換されない問題が発生しました。この原因と解決策についてまとめます。

## 原因

Gitはデフォルトでファイル名の大文字・小文字の変更を検知しない設定になっています。このため、ローカルでフォルダ名を変更しても、リモートリポジトリ（Azure Reposなど）にプッシュすると変更が反映されないことがあります。

## 解決策

以下のコマンドを使用して、Gitの設定を変更します。

```sh
git config core.ignorecase true   # 大文字小文字を区別しない
git config core.ignorecase false  # 大文字小文字を区別する
```

設定が反映されているか確認するには、以下のコマンドを実行します。

```sh
git config core.ignorecase

# false が表示されれば、大文字小文字を区別できる設定になっています。
```
ダビングしたブルーレイが再生できない時の原因と解決策

ダビングしたブルーレイディスクが再生できないのは、とても困りますよね。大切な録画番組や思い出の映像が見られないのは残念です。でも、ご安心ください。ほとんどの場合、自分で原因を突き止めて、適切な対処をすれば再生できるようになります。

<strong>ダビングしたブルーレイの再生ができない原因:</strong>
【原因1.ブルーレイディスクの汚れやキズ】 
原因：ディスクの記録面に指紋、ホコリ、汚れなどが付着していると、再生エラーの原因になります。
解決策：柔らかい布やメガネ拭きなどで、ディスクの中心から外側に向かって優しく拭いてみましょう。

【原因2.ディスクの初期化が必要】 
原因：新品のブルーレイディスクにダビングする時は、レコーダーでディスクの初期化（フォーマット）が必要です。
解決策：通常、ディスクをセットすると自動的に初期化が始まります。「初期化する」を選択して決定してください。

【原因3.ディスクの種類や規格に非対応】
原因：お使いのブルーレイレコーダーやプレーヤーが、ダビングしたディスクの種類（BD-R、BD-RE等）や規格に対応していないと再生できません。
解決策：機器の取扱説明書や公式サイトで、対応ディスクの情報を確認しましょう。

【原因4.レコーダーの読み取り部の汚れ】 
原因：ブルーレイレコーダーのディスク挿入口や読み取り部にホコリや汚れが付着していると、再生エラーになることがあります。
解決策：市販のブルーレイレンズクリーナーを使って、優しく拭き取ってみましょう。

【原因5.ソフトウェアのアップデートが必要】 
原因：ブルーレイレコーダーのソフトウェア（ファームウェア）が古いと、ダビングしたディスクが再生できない場合があります。
解決策：レコーダーのメニューから、ソフトウェアのバージョンを確認します。最新版がリリースされていれば、アップデートを試してみましょう。

【原因6.ダビング時の編集が原因】 
原因：ダビングする際に、頻繁な編集やチャプター分割、部分削除などを行うと、正しく再生できなくなることがあります。
解決策：できるだけシンプルな編集にとどめるのがおすすめです。

また、[ブルーレイコピーソフト](URL "https://www.leawo.org/jp/tips/best-blu-ray-copy-software-1352.html?utm_source=qiita.com&utm_campaign=1352")を使ってブルーレイのデータをコピーガードなしの空きのディスクにコピーすれば､任意のプレーヤーでブルーレイ再生ができます｡

さらに、[ブルーレイリッピングソフト](URL "https://www.leawo.org/jp/tips/blu-ray-ripper-1352.html?utm_source=qiita.com&utm_campaign=1352")を利用して、ブルーレイの映像をパソコンやスマホなどのデバイスに取り込んで楽しめることもできます。


以上の点をチェックして、適切に対処すれば、ほとんどの場合ダビングしたブルーレイを再生できるようになるはずです。それでも改善しない場合は、レコーダーやプレーヤーの故障も考えられます。メーカーのサポートや修理窓口に相談してみましょう。
大切な映像を楽しめるよう、しっかりとメンテナンスしながら、ダビングブルーレイライフを満喫しましょう！
SageMaker ProcessingJobのCLIからのジョブ管理方法

# TL;DR

こんにちは。弥生R&D室の飯田です。R&D室ではSageMakerを使用して機械学習 (ML) のプロジェクトを進めていますが、SageMakerには[ProcessingJob](https://docs.aws.amazon.com/sagemaker/latest/dg/processing-job.html)というサービスがあり、モデル訓練のような重い処理に適しているため大変便利です。

しかし計算用インスタンス上で実行しているプロセスの管理には直接 `ps` や `kill` を使うことができず、独自のコマンドが必要となるため、よく使うものをこの記事で紹介したいと思います。

# 実行環境

AWS CLI が動作する環境、および利用するSageMakerのドメインに対応したアクセスキーの設定が必要です。

# コマンド集

## 現在動いているジョブを確認する

ローカルにおける `ps` に相当するコマンドです。非常によく使います。

```bash
aws sagemaker list-processing-jobs --status-equals InProgress
```

https://docs.aws.amazon.com/cli/latest/reference/sagemaker/list-processing-jobs.html#list-processing-jobs


## ジョブを作成する

ジョブを作成するためのコマンドです。

実は `list-processing-jobs` と違い、こちらを使うことは少ないです。

オプションの変数が多すぎるためコマンドラインやシェルスクリプトで管理するのが割と大変で、[Pythonラッパー](https://sagemaker.readthedocs.io/en/stable/api/training/processing.html)を使って書く方が便利であり、個人としてはそちらをよく使います。

一応、この記事だけでジョブの確認・作成・削除を一通りこなせるようにするために記載します。

```bash
aws create-processing-job \
  --processing-job-name $JOB_NAME \
  --processing-resources $RESOURCES \
  --app-specification $APP_SPEC \
  --role-arn $ROLE_ARN
```

https://docs.aws.amazon.com/cli/latest/reference/sagemaker/create-processing-job.html#create-processing-job

## 不要なジョブを削除する

ローカルにおける `kill` に相当するコマンドです。こちらも `list-processing-jobs` との組み合わせでよく使います。

```bash
aws sagemaker stop-processing-job --processing-job-name $JOB_NAME
```

https://docs.aws.amazon.com/cli/latest/reference/sagemaker/stop-processing-job.html#stop-processing-job

# まとめ

- ジョブの確認には `list-processing-jobs` が便利です
- ジョブを作るには [Pythonラッパー](https://sagemaker.readthedocs.io/en/stable/api/training/processing.html) がおすすめです
- 不要なジョブが生きてたら `stop-processing-job` でお掃除しましょう

---

本記事は下記の記事と同じ内容です。 アクセス解析を目的としてマルチポストしています。

https://tech-blog.yayoi-kk.co.jp/entry/2024/07/29/110000

また弥生では一緒に働く仲間を募集しています。 ぜひエントリーお待ちしております。

https://herp.careers/v1/yayoi/requisition-groups/2363876d-7695-46ea-9e6a-0bc64d11b6bc
無料でロボティクスとROSコースを学ぼう - ロボティクスアンバサダー活動


私たちは、ROSとロボティクスの知識を世界中に広めることを目的とした[ロボティクスアンバサダー](https://www.theconstruct.ai/robotics-ambassador/)プログラムの開始を喜んで発表します。


私たちの使命：ROS とロボット工学を学び、教え、強化する

私たちの目標はシンプルです。ROS とロボティクスを学び、教え、個人がその知識を世界と共有できるようにすることです。

Robotics Ambassadorの特典

Robotics Ambassadorとして、以下の特典をお楽しみいただけます：
● 完全な学習アクセス：
[The Construct](https://app.theconstruct.ai/)の学習プラットフォームへの無料アクセスが可能です。この学習ライセンスの価値は€439です。70 を超える ROS およびロボット工学のコースを探索して、ロボット プログラミング スキルを向上させましょう。

● Robotics Ambassadorパック：
プログラム内のさまざまなレベルを進んで、エキサイティングな報酬をアンロックできます。新しい段階ごとに、直接あなたに送られる対応するギフトが付いてきます。

![Robotics_Ambassador_merchandise-1.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3844319/0812ede5-4506-7e0d-4e26-f13cf25651c3.jpeg)

どのように機能するのでしょうか?

ロボット アンバサダー プログラムは、ロボットと ROS に関する知識が限られているかまったくない初心者を対象としています。

ロボティクス アンバサダー プログラムに参加すると、ROS またはロボティクス コースを毎月完了し、関連タスクを完了して他の人を支援し、ロボティクス愛好家向けの Q&A ビデオ チュートリアルやブログ投稿を作成してロボティクスの知識を広めることができます。

どうやって申請すればいいですか？
プロフィールをambassadors@theconstructsim.com に送信してください。
次の情報を含めてください：

プログラミング能力:
C++（0-5）
Python（0-5）

現在のROSレベル:
ROSの基礎（0-5）
ROSナビゲーション（0-5）
MoveIt（0-5）
Gazebo（0-5）
ROS制御（0-5）

国籍と母国語
学歴
現在の教育または職業の状況（学生または働いている）
さらに詳しい情報が必要な場合は、次の Web ページを参照してください: (https://www.theconstruct.ai/robotics-ambassador/)


知識と発見のエキサイティングな旅にぜひご参加ください。ロボティクス アンバサダーになり、The Construct のサポートを受けてロボティクスと ROS コミュニティの成長に貢献しましょう。

暖かい挨拶、

建設 | [theconstruct.ai](https://www.theconstruct.ai/)
ロボット工学のキャリアが結実する場所
ブルーレイコピーソフトを選ぶ際の注意点

ブルーレイディスクを複製したい、バックアップを取りたい、といったニーズをお持ちではないでしょうか。[ブルーレイコピーソフト](URL "https://www.leawo.org/jp/tips/best-blu-ray-copy-software-1352.html?utm_source=hashnode.com&utm_campaign=1352")を使えば、お気に入りの映画やドラマ、大切な思い出の詰まったブルーレイディスクを簡単に複製することができます。データの保護や共有にも役立ちます。このチュートリアルでは、ブルーレイコピーソフトを選択する時の注意点を紹介していきます。


<strong>ブルーレイコピーソフトの主な機能：</strong>
●ブルーレイディスクの動画・音声データを無劣化に複製
●ディスク上の字幕や特典映像もコピー可能
●複製したデータをISO形式やフォルダに保存
●複数のディスクを一括でコピーできるバッチ処理対応

<strong>ブルーレイコピーソフトを選ぶ際の注意点：</strong>
ブルーレイディスクのコピーやリッピングを行う際は、信頼性の高いソフトウェアを選ぶことが重要です。無料のフリーウェアも多数ありますが、有料のプロ仕様のソフトウェアを使うことをおすすめします。有料ソフトには、高度な圧縮技術や、コピーガード解除機能、バッチ処理など、便利な機能が多数搭載されています。

●操作画面のわかりやすさ:コピー手順が簡単で初心者でも扱えること
●高画質出力:ブルーレイ作品本来の高画質を損なわないこと
●多彩な出力形式:様々なデバイスに合わせてファイル形式を選べること
●動作環境との互換性:WindowsでもMacでも快適に使えるし、ブルーレイの最新規格である「Ultra HD Blu-ray」に対応可能
●安全性:ウイルスなどのマルウェアが混入していないこと
●コピー時の高速性と安定性：高速にブルーレイダビングができること
●価格:手頃な料金設定であること
●ユーザーサポートの充実度：顧客からの質問や疑問、クレームに迅速に対応してくれること

<strong>ブルーレイコピーとブルーレイリッピングの違い：</strong>
ブルーレイコピーとは、ブルーレイディスクのコンテンツを、ディスク to ディスクでそのままコピーすることを指します。ブルーレイドライブを使ってディスクからディスクへダイレクトにコピーする方法で、ディスクイメージを作成することなく、コンテンツをそのままコピーできます。ただし、コピー元のブルーレイディスクと同じディスクが必要となります。

一方、[ブルーレイリッピング](URL "https://www.leawo.org/jp/tips/blu-ray-ripper-1352.html?utm_source=hashnode.com&utm_campaign=1352")とは、ブルーレイディスクのコンテンツを、コンピューターのハードディスクやSSDなどの記憶媒体に取り込むことを指します。ブルーレイドライブを使ってディスクの内容をデジタルデータ化し、コンピューターに保存する方法です。リッピングすることで、ブルーレイディスクを物理的に保管する必要がなくなり、いつでも好きなタイミングでブルーレイコンテンツにアクセスできるようになります。

<strong>まとめ</strong>
ブルーレイコピーソフトは、お気に入りのブルーレイ作品をバックアップすることができます。また、スマートフォンやタブレットなどのモバイル端末でブルーレイ作品を楽しめるように、動画ファイルに変換することも可能です。さらに、地域コードの違いによる視聴制限を回避することで、海外のブルーレイ作品も視聴できるようになります。ブルーレイコピーソフトを活用すれば、大切なブルーレイディスクのデータを守りつつ、より便利に活用してみよう！
透明物体・反射物体のステレオ計測のためのデータセット



![Screenshot from 2024-07-23 13-42-07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83761/86a71779-9c37-b962-3b8b-150f742abd58.png)
pdf [Open Challenges in Deep Stereo: the Booster Dataset](ttps://arxiv.org/pdf/2206.04671)

Abstractの和訳
我々は、高密度で正確なグランド・トゥルース視差で注釈された屋内シーンをフレーミングする、新しい高解像度で困難なステレオデータセットを提示する。本データセットの特徴は、いくつかの鏡面や透明な面が存在することである。我々の取得パイプラインは、サブピクセル精度で簡単かつ正確にラベリングできる、新しいディープ時空間ステレオフレームワークを活用している。我々は、64の異なるシーンで収集され、高密度のグラウンドトゥルース視差でアノテーションされた合計419のサンプルを公開する。各サンプルには、高解像度のペア（12 Mpx）とアンバランスなペア（左：12 Mpx、右：1.1 Mpx）が含まれています。さらに、手作業で注釈を付けたマテリアルセグメンテーションマスクと15Kのラベルなしサンプルを提供する。我々は、我々のデータセットに基づいて、最新のディープネットワークを評価し、ステレオにおける未解決の課題に対処する上での限界を強調し、将来の研究のためのヒントを導き出す。

DeepL.com（無料版）で翻訳しました。

web page https://cvlab-unibo.github.io/booster-web/


booster_gt.zip

フォルダ構成の一部
```
test/balanced/Bottles/camera_00
test/balanced/Bottles/camera_02
test/unbalanced/Bottles/camera_00
test/unbalanced/Bottles/camera_01

train/balanced/Bottle/camera_00
train/balanced/Bottle/camera_02
train/unbalanced/Bottle/camera_00
train/unbalanced/Bottle/camera_01
```

![Screenshot from 2024-07-24 16-17-47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83761/35ac424e-6960-dc9c-1722-4fb6283ea21c.png)

![Screenshot from 2024-07-24 16-20-03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83761/16d06ef0-7e4b-8fce-59d8-c331f55c5eca.png)


フォルダ構成の一部
```
test/balanced/Mirror1/camera_00
test/balanced/Mirror1/camera_02
test/unbalanced/Mirror1/camera_00
test/unbalanced/Mirror1/camera_01


train/balanced/Mirror/camera_00
train/balanced/Mirror/camera_02
train/unbalanced/Mirror/camera_00
train/unbalanced/Mirror/camera_01
```


![Screenshot from 2024-07-24 16-34-45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83761/04c6ce67-7a0a-a5f0-f792-4156f32ce79f.png)
![Screenshot from 2024-07-24 16-34-54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83761/ca10860c-e9c9-fd03-9a8f-f7d631c2526f.png)
【資格】OSS-DB Silver 取得への冒険譚

## はじめに

ますだです。
普段は AWS 案件の保守や運用辺りを担当してます。  
今回、OSS-DB Silver Ver.3.0 に合格したので、アウトプットも兼ねて学習方法や期間についてゆるっと書いてみます。

---

## ざっくり纏め

- **OSS-DB Silver**：[公式](https://oss-db.jp/outline/silver)
- **合格ライン**：64 点
- **結果**：84 点
- **学習期間**：2024-07-03 ～ 2024-07-24 (22 日間)
- **教材**：[Ping-t](https://mondai.ping-t.com/g) (ほぼこれ), [緑本](https://www.amazon.co.jp/OSS%E6%95%99%E7%A7%91%E6%9B%B8-OSS-DB-Silver-Ver-3-0%E5%AF%BE%E5%BF%9C-%E7%A6%8F%E5%B2%A1/dp/4798180319) (睡眠導入用), [Youtube (LPI-Japan)](https://www.youtube.com/playlist?list=PLAsEyLm5aGOAGTLHkzcQM7liQD87cobcm) (耳だけ) 

---

## スペック

- 業界未経験からキャリーバック片手に上京して 5 年
- AWS サービスに触れる機会多め
- データベースは初心者
- SQL はちょいちょい書く程度
- 頭は良くないので勉強は時間と量でごり押しタイプ

---

## 受験のきっかけ

1. **Airflow での PostgreSQL 利用**  
   現職は Airflow でジョブ管理していて、データベースに PostgreSQL を使っており理解を深めたかったため。

2. **現職での SQL 利用**  
   各種管理画面は自社で開発されたものがあるがあまりいけてなく、ユーザの追加や削除等をはじめ Aurora MySQL に直接 SQL を叩く機会が多い。なので、もっと SQL に詳しくなりたかったため。

3. **Oracle よりも OSS-DB**  
   Oracle はベンダー特有の知識が多そうで、OSS-DB の方が業務範囲に近そう、かつさっくり取れそうだったため。

---

## 学習方法

基本は問題演習 (Ping-t)。
試験日から逆算して 1 日に解く問題数を決めて、以下のように進めました。
- **1 週目**：50 問 / 日
- **2 週目**：100 問 / 日
- **3 週目**：3 日で 500 問

寝る前の 30 分で緑本の面白そうな部分や理解が浅い部分をつまみ読み (合格目的なら書籍は不要)。
移動時間には LPI-Japan の動画を聞き流してました。
特に変わったことはしてないかなーと思います。

---

## まとめ + 次にやろうかなーてきなこと

- **SQL 読解力の向上**  
  業務で積極的に SQL を読みに行くようになり、裏で動かしていたバッチの理解が深まった感があるので良かったかなーと思います。

- **PostgreSQL の設定理解**  
  試験では設定ファイルの中身について細かい部分が問われるので、「うちってなんでこの設定値にしてんだろう？」という観点で見れるようになったのもプラス。

- **今後の学習予定**  
  Laravel (PHP) のマイグレーションも理解しようと思ってます。秋には情報処理安全確保支援士を受験予定なので、箸休めに CCNA の勉強でもしようかなと考えてます。

`(Try Hack Me や AtCoder のようにゲーム感覚で楽しめるものも多いので時間がバリバリ溶けていきますね)`

---

以上、OSS-DB Silver に合格するまででした。少しでも参考になれば嬉しいです！
Pythonで簡単に2次元バーコード（QRコード）を作成する方法

# はじめに
QRコードは、日常生活でよく見かける便利なツールです。この記事では、Pythonを使って簡単にQRコードを生成する方法を紹介します。QRコードを生成するために、qrcodeライブラリを使用します。このライブラリはシンプルで使いやすく、わずかなコードでQRコードを作成できます。

# 必要なライブラリのインストール
まず、QRコードを生成するために必要なライブラリをインストールします。qrcodeライブラリと、画像を扱うためにpillowライブラリをインストールします。ターミナル（またはコマンドプロンプト）で以下のコマンドを実行してください。

```bash
pip install qrcode[pil]
```

# QRコードを生成するPythonコード
ライブラリのインストールが完了したら、実際にQRコードを生成するためのコードを書きます。以下のコードを使ってQRコードを生成し、画像として保存します。

```python
import qrcode
from PIL import Image

# QRコードに含めるデータを指定します
data = "https://www.example.com"

# QRコードを生成します
qr = qrcode.QRCode(
    version=1,  # バージョンはQRコードのサイズを指定します（1から40まで）
    error_correction=qrcode.constants.ERROR_CORRECT_L,  # エラー修正レベル（L, M, Q, H）
    box_size=10,  # QRコードの各ボックス（ドット）のサイズ
    border=4,  # QRコードの境界の幅
)

# データをQRコードに追加します
qr.add_data(data)
qr.make(fit=True)

# QRコードの画像を生成します
img = qr.make_image(fill='black', back_color='white')

# QRコードの画像を保存します
img.save("qrcode.png")

# 画像を表示します
img.show()
```

# コードの説明
## インポート
```python
import qrcode
from PIL import Image
```
まず、qrcodeライブラリと画像処理のためのPIL（Python Imaging Library）をインポートします。

## データの設定
```python
data = "https://www.example.com"
```
QRコードに含めたいデータ（この場合はURL）を設定します。

## QRコードの生成
```python
qr = qrcode.QRCode(
    version=1,
    error_correction=qrcode.constants.ERROR_CORRECT_L,
    box_size=10,
    border=4,
)
```
ここでは、QRコードのバージョン、エラー修正レベル、各ボックスのサイズ、境界の幅を設定しています。

* version: QRコードのバージョンを指定します。バージョンが高いほどQRコードのサイズが大きくなり、より多くのデータを含むことができます（1から40まで）。
* error_correction: エラー修正レベルを指定します。エラー修正レベルが高いほど、QRコードの一部が破損しても読み取れる可能性が高くなります。
    * qrcode.constants.ERROR_CORRECT_L: 7%のエラー修正
    * qrcode.constants.ERROR_CORRECT_M: 15%のエラー修正
    * qrcode.constants.ERROR_CORRECT_Q: 25%のエラー修正
    * qrcode.constants.ERROR_CORRECT_H: 30%のエラー修正
* box_size: QRコードの各ボックス（ドット）のサイズを指定します。
* border: QRコードの周りの余白の幅を指定します。

## データの追加とQRコードの生成
```python
qr.add_data(data)
qr.make(fit=True)
```
データをQRコードに追加し、最適なサイズに調整します。

## QRコード画像の生成と保存
```python
img = qr.make_image(fill='black', back_color='white')
img.save("qrcode.png")
```
QRコードの画像を生成し、指定した名前で保存します。

## 画像の表示
```python
img.show()
```
生成されたQRコード画像を表示します。


![スクリーンショット 2024-07-24 16.45.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75802/af822f2f-e25e-a92a-80fe-cc606fd47a30.png)


# まとめ
以上のコードを使って、簡単にQRコードを生成することができます。Pythonとqrcodeライブラリを活用すれば、様々な用途に合わせたQRコードを手軽に作成できるので、ぜひ試してみてください。質問やコメントがあれば、ぜひお寄せください！
論理演算子「&&」や「||」の挙動について理解する

## はじめに
初学者向けの記事となっております。
本記事ではJavaScriptを用いて説明します。他言語とは実際の挙動が異なる可能性があります。あらかじめご了承ください。

## `true && hoge()` はどうなる？
突然ですが、以下のコードをご覧ください。

```javascript
function hoge() {
  console.log("hoge")
  return 123;
}

const result1 = true && hoge()
const result2 = false && hoge()
const result3 = true || hoge()
const result4 = false || hoge()
const result5 = true && hoge() && false
const result6 = false || hoge() || true
```

これらの変数には何が入るでしょうか？またどのような処理が行われるでしょうか？
"hoge"という文字列が出力され、最終的に **123** という数値を返す `hoge` 関数を用意し、その後、論理演算子を使用して各々変数に入れる処理が書かれています。
このコードを読む上で引っ掛かる要素としては、
1. 関数を論理演算子と一緒に使用していること
1. `hoge` は論理値（Boolean）ではない

あたりになるのかなと思います。このコードを読み解くためには **truthy・falsy** の理解、そして **論理演算子の挙動** の理解が必要になります。

## truthy、falsyについて
**truthy、falsy** について、MDNで以下のように記述されています。

> JavaScript において、真値 (truthy) は論理値のコンテキストに現れた時に true とみなされる値のことです。偽値 (falsy) として定義された値 (つまり、false, 0, -0, 0n, "", null, undefined, NaN) を除くすべての値は真値です。

JavaScriptでは、`false`, `0`, `-0`, `0n(Bigint)`, `""`, `null`, `undefined`, `NaN` の値は **`falsy`** な値、端的に言えば条件分岐で **false** と同じ挙動をとるようになっています。
逆に、**`falsy`** 以外の値は全て **`truthy`** となり、条件分岐で **true** 同じ挙動をとります。

例えば空の文字列 `""` をif文で使用するとelse句の方が実行されると思います。

```javascript
// F12キーを押して、検証ツールの中にある"コンソール"タブの中で試してみてね！
if ("") console.log("空文字はif文を通らない！")
else console.log("falseと同じ挙動になるよ！")
```

少し脱線すると、`if` というのは **`truthy`** か **`falsy`** かどうかで判断しているということになりますね。

## 論理演算子の挙動
truthyな値、falsyな値についての理解ができたと思うので、ここから論理演算子の挙動について説明しようと思います。

論理演算子は、与えられた値を一つずつみて **`truthy`** な値なのか、 **`falsy`** な値なのかを判別しています。

さらに、「&&」と「||」はそれぞれ異なる動きをしています。

| \|\| | && |
|:-:| :-: |
前の値が **falsy** な値である場合次の値を見にいく<br>もし **truthy** な値であった場合はその時点の値を返す<br>一番最後の値まで来たときはその値を返す| 前の値が **truthy** な値である場合次の値を見にいく<br>もし **falsy** な値であった場合はその時点の値を返す<br>一番最後の値まで来たときはその値を返す|

一つずつ値を検証し、使用する論理演算子によって返す値が変わります。
実際にどのような挙動をするのか、サンプルコードを用いて説明していきます。

```javascript
// 左から順番に値を見ているよ、ここでは0は falsy な値、それ以外は全て truthy な値
const result = true && "hoge" && 0 && true;
console.log(result); // ?
```

`result` に論理演算子を使用して値を初期化しています。
最終的に出力される値はどうなるでしょうか？

<details>
<summary><strong>回答と解説</strong></summary>

答えは **0** です！以下のような処理が行われます
1. `true` の後に「&&」が使用されているので、次の値へ
1. `"hoge"`の後に「&&」が使用されているので、次の値へ
1. `0` の後に 「&&」が使用されており、`0` は **`falsy`** な値なのでこの値を返す
1. `console.log(result)` で、初期化された `0` を出力


</details>

だいぶ理解が深まったと思います！では、冒頭のコードをもう一度見てみます！

```javascript
function hoge() {
  console.log("hoge")
  return 123;
}

const result1 = true && hoge()
const result2 = false && hoge()
const result3 = true || hoge()
const result4 = false || hoge()
const result5 = true && hoge() && false
const result6 = false || hoge() || true
```

今までと違う点は、関数を論理演算子と一緒に使用しているところにあると思います。
この場合、論理演算子が一つずつ見ていく時に **関数が実行される** ようになっています。
そのことを踏まえた上で、これら変数に入る値の答えは、検証ツールのコンソール等でぜひ試してみてください。

つまるところ、論理演算子を使用することで、**ある関数の実行が正常だった場合、次の処理に移る** という処理を簡潔に書くことができます。

```javascript
function hoge() {
  // ...処理を実行...
  if (status == SUCCESS) return true
  else return false
}

function message() {
  console.log("DONE!")
}

// hoge関数の実行が失敗すると、message関数は実行されない
hoge() && message()
```

### 参考文献
https://developer.mozilla.org/ja/docs/Glossary/Truthy
未経験エンジニアが周りに質問しまくったら爆成長できた件

## エンジニアになりました
　こんにちは、こんばんは、今年社会人になった私です。入社当初は全く考えていなかったエンジニアなる職種に配属され、絶賛研修中です。まるで異世界にいるかのようにわからない言葉が飛び交う世界の中でどうやって私が冒険しているかを今回書きます。個人的な意見ではあるのでそんな意見もあるんだな程度に見ていただければ幸いです！
 　私と同じような初学者の方や、それに限らず新しい世界に踏み込んだ方たちの助けに一ミリでもなればいいなと思います。
## 研修って大変！！
　早速、研修の話に入っちゃいます。研修の最初は当たり前ですが、未知のことが多すぎて大慌てでした。結構内心焦ってた気がします。
 　例えばわからない単語を調べても、さらにわけのわからない単語が出てきて混乱しまくりです。「あれれ～？おかしいぞ」状態です。それじゃあ、詳しい人に聞いてみようとおもって聞いてみるとこれまた出てくる単語がそもそもわからんってなって相手にも申し訳なくなっちゃってました。
　もう一つ苦しんだのが、タスクの目途が全く立たなかったことです。課題が出されて取り組むわけなんですが、未経験なので課題のレベル感がわかんないですよね。なので、見切り発車みたくなって「これ間に合うんかな？わからん。」ってめっちゃ不安になってました。
 ## 無限に質問しよう　
  「じゃあ、エンジニア嫌なのか？」って聞かれると「なんだかんだやれる」状態で実はやってこれてます。むしろ、なんだかんだ楽しく研修を続けられています。じゃあ、どうやって上記の悩みと向き合ったのかってなるのでここから書いていきます。
　その答えはずばり、周りの人に聞きまくることです。「いや、さっき聞いてもわからんかったって書いてるやん！」と皆さん思われたかもしれないです。そうなんです。そうなんですけど、大事なのはそこからさらに**聞き続ける**ことなんです。
 まず、知らない専門知識に関しては調べても正味わかんないことが多いです。また、どこまで自分で調べるべきなのかも正直わからないです。そこで時間を取りすぎるのはもったいないかなと個人的には感じます。時間を取りすぎてしまう前に先輩や上司、同期の力を存分に借りましょう。
 また、未経験の私からすれば一回の説明だと頭の中で抽象化させて理解することができなかったんですよね。その瞬間は理解したつもりでも、ある日見直すと「あれ？」みたいな。これってまだ、自分の中に落とし込めてはいないんですよ。そこで重要だと私が感じたのは**いろいろな人に同じ質問をしてみる**ことでした。人によって理解の仕方って異なっていて、頭の中に浮かべるイメージが異なるんですよね。なので、一人に聞いてその説明の中で出てきたイメージが自分に合っていればすんなりいくし、合わなければ「ん－、わからない」みたいな感じになるのかなって個人的には思います。でも、複数人に聞くと自分に合っていると思える説明に出会ったり、複数人の異なるイメージの捉え方から共通点を見出して抽象化しやすくなると研修の中で私は感じました。これが開発という未知の世界に踏み込んだ私にとっての一番の解決方法でした。
## 質問の仕方
まあ、でも質問するの苦手っていう方ももちろんいると思います。「ただの丸投げの質問になってしまう」とか「どこが分からないかがわからない」みたいなやつですかね。自分が考えていたのは。他にもたくさんあると思います。
そんな方にお伝えしたいなと思うのが「**もっと気軽で大丈夫だよ！**」ってことです。ただの丸投げは確かによろしくないです。でも、調べてみても「全部わっかんない」ってときは往々にしてあると思います。そのようなときは丸投げしちゃいましょう。ただ、その時に丸投げしたのではなく、調べたけどわからなかったという点をできるだけ具体的に伝えるのが大事だと思います。「このページを見て考えたけど全くわからなかった」みたいな感じに。
後者の「わからないことがわからない」問題もそのまま投げましょう。相手との対話で急にわかることがマジであります。(自分はめっちゃありました。)その際にも「このように考えたけど何が分かってないのか自分でもわからない」って伝えましょう！
相手に配慮して「聞いていいのかな？」とか「聞いて迷惑って思われないかな」って考えることとかあると思うんですけどそこの心配もいらないと思います。なぜなら、質問に答えるかは**相手の自由**だからです。例えば、質問に答える時間が無ければ相手は断りますし、調べたらわかるような質問なら「もうちょっと自分で調べてみて」とか何かしらのレスポンスが返ってきます。つまり、聞くこと自体を申し訳なく思う必要はないってことです！
 大切なことは自分で調べること自体を怠らないこととその中で考えて脳内がどうなっているかを相手に伝えることです。考えたうえで理解ができてないことを伝え、どこまでなら理解できているのかを相手に伝えましょう。そうすれば、質問した相手が嫌な気持ちになることなんてないです！考えないことがよくないことであって質問することは、悪いことではないのです。(**あと当たり前ではあるのですが本気で感謝して相手にお礼を伝えてください。**)

 ## 質問しまくってると？
 　じゃあ、質問をしまくった結果どうなったかって話になるんですがマジで伸びました。当たり前なんですけど、たくさんの人から説明を受けてるんで未知の学びに対して高速で理解できます。また、対話形式で勉強ができるので必ず自分のアウトプットも必要になるんですよね。なので、自分の理解を言語化させることができるので明確に自分が分からないところ、わかるところを分別できます。(人に話すと自分で考えていたとこと全く異なるところで詰まってるとかめっちゃあります。)
## 最後に
ここまで、長々と呼んでくださってありがとうございます。最後に、この「質問をしまくる」ことについてですが、これは初学者や新卒であればあるほどできる方法かなと私は思います。だって、始めたばかりじゃ聞くしかない場面多いですから。
　なので、ぜひこの機会に勇気を出して質問しまくってみるのはいかがでしょうか？
icdiffでutf-8とshift-jisの両方を一度に比較する方法（おそらく非推奨）

## icdiffとは
ターミナル上で横並びにファイル比較ができるツール。

https://github.com/jeffkaufman/icdiff

公式でも紹介されているように、gitに組み込むこともできる。

## icdiffのデフォルトエンコーディングはutf-8

以下のようにデフォルトでutf-8で読み込むようになっている。

```python
    parser.add_option(
        "--encoding",
        default="utf-8",
        help="specify the file encoding; defaults to utf8",
    )
```

ところが、業務で`utf-8`と`shift-jis`の両方を同時に扱うことがある。
そのため差分ファイルに`utf-8`と`shift-jis`が混ざった状態で`git icdiff`を叩くと、`shift-jis`側のファイルはエンコードエラーとなる。

```
error: file 'filename.jsp' not valid with encoding 'utf-8': <invalid start byte> at 191-192.
```

<font color="red">※`shift-jis`のオプションをつけると今度は`utf-8`のファイルがエラーになる。</font>

## 特定のファイルだけshift-jisで開くように無理やり改造

以下3行を追加して特定のファイル（`*.jsp`）だけsjisで無理やり読み込むようにした。

```python
def read_file(fname, options):
    try:
        with codecs.open(fname, encoding=options.encoding, mode="rb") as inf:
            return inf.readlines()
    except UnicodeDecodeError as e:
+++     if '.jsp' in fname:
+++         with codecs.open(fname, encoding='sjis', mode="rb") as inf:
+++             return inf.readlines()
        codec_print(
            "error: file '%s' not valid with encoding '%s': <%s> at %s-%s."
            % (fname, options.encoding, e.reason, e.start, e.end),
            options,
        )
        raise
    except LookupError:
        codec_print(
            "error: encoding '%s' was not found." % (options.encoding), options
        )
        sys.exit(EXIT_CODE_ERROR)
```

pythonには詳しくないが、例外処理の中を無理やり書き換えているのであまり良くないのはわかる。
他にいいやり方ご存じの方教えてください。
unittest pytestの一歩踏み込んだ使い方

# pytestの一歩踏み込んだ使い方

pytestを使ってテストを書いて～
中の関数呼び出しは mock があるから～
と言われたけれど、
関数のテストするには、例外処理とか、例にない mockの書き方とか
検索しても  assert x == y までの書き方までが多くて、
リファレンス的なものにたどり着けなかったので、まとめ

# その関数がどの引数で呼ばれたか
```python
from unittest import mock
mock_instance = mock.MagicMock(spec=MockModule)
mock_instance.method_name.assert_called_once_with(a, b, c)
```

# 何回呼ばれたか
```python
from unittest import mock
mock_instance = mock.MagicMock(spec=MockModule)
mock_instance.method_name.call_count == 1
```
# メソッドの中で呼んだメソッドで例外を起こしたい
```python
from unittest import mock
mock_instance = mock.MagicMock(spec=MockModule)
mock_instance.method_name.side_effect = ExceptionName

# 例外をキャッチ
```python
import pytest
with pytest.raises(ExceptionName) as e:
    _ = target.method()
assert e.value.error_type == 'exception_type'
```
# 引数を変えて同じテストを繰り返す
```python
import pytest
@pytest.mark.paramaize(
    [
        "number"
    ],
    [
        pytest.param(
            123
            id="number_test_123"
        ),
        pytest.param(
            456
            id="number_test_456"
        ),
    ]
)
def test_some_method(number)
```
これで `number` が `123` と `456` のテストを同じコードで実施できる

# テストしたいモジュールにある関数のスタブを作りたい
```python
def test_some_method
    from path.to.TargetObject
    
    with patch.object(TargetObject, 'method_for_stub', return_value=1) as mock_method
        target = TargetObject()
        target.some_method()
        # 呼び出されたことを確認
        mock_method.call_count = 1
```
[CSS] flexbox 内の要素でスクロールが発生するケースでハマった

久しぶりに CSS でハマったのでメモしておく。

<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

## ハマった点
<p class="codepen" data-height="300" data-default-tab="result" data-slug-hash="qBzNeQW" data-pen-title="Untitled" data-user="hoto17296" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/hoto17296/pen/qBzNeQW">
  Untitled</a> by hoto (<a href="https://codepen.io/hoto17296">@hoto17296</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>

サイドバーは固定幅・メインコンテンツはブラウザ幅に合わせて可変というよくあるレイアウトを flexbox で組んで、メインコンテンツ内に Carousel のような横に長い要素を含むコンポーネントを配置した。

`.outer` に `width: 100%; overflow: scroll;` が指定してあるので、これによりブラウザ幅に合うように要素幅が調整され、横に長い `.inner` (黄色い領域) のみがスクロール可能になることを期待していた。

しかし実際にはメインコンテンツ自体が横に伸びてしまい、ページ全体で横スクロールが発生してしまった。

※ 今回は横方向の話をしているが、縦方向でも同じ問題が起きる

## 対処
メインコンテンツに `overflow: auto;` を指定したところ、意図した通りの挙動になった。

**(追記)** `min-width: 0;` でも同じ動きになる (理由は後述)

<p class="codepen" data-height="300" data-default-tab="result" data-slug-hash="BagLaBM" data-pen-title="Untitled" data-user="hoto17296" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/hoto17296/pen/BagLaBM">
  Untitled</a> by hoto (<a href="https://codepen.io/hoto17296">@hoto17296</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>

## 原因 (推測)
おそらく flexbox の flex アイテムは `overflow` プロパティの値によって下記のように振る舞うのだと思う。(詳細不明)

### flex アイテムの `overflow` が `visible` (または指定なし) のとき
子要素が大きい場合、flex アイテムは flex コンテナのサイズに縛られず伸びる

### flex アイテムの `overflow` が `auto` (または `hidden`) のとき
子要素が大きい場合、flex アイテムは flex コンテナのサイズを超えないように調整され、要素内でスクロール可能になる (`auto` の場合)


## (追記)
flex コンテナに合わせて縮めてくれない理由は「デフォルトで `min-width: auto` になっていて、コンテンツ幅を自動計算してそれを `min-width` として扱うから」っぽい。そのため上記の `overflow: auto;` ではなく `min-width: 0;` を指定しても動く。

- [Flex item の overflow: hidden が効かない問題の対処方法](https://zenn.dev/bicstone/articles/flex-item-overflow-hidden)
- [CSS Flexible Box Layout Module Level 1](https://www.w3.org/TR/2018/CR-css-flexbox-1-20181119/#min-size-auto)

`overflow: auto;` を指定すると何故うまくいくのかは引き続き不明だが、`min-width: 0;` を指定する方法のほうが適切なのかもしれない。
PrismaのMigrateが終わらなかったときの話

## はじめに
Prismaで定義したDBモデルをSupabaseに移行(Migrate)するとき、実行したコマンドが一向に終わらず、でもエラーも出ず、若干詰まったので備忘として残しておきます。

## 発生事象
Prismaのクイックスタートにある手順3で以下のMigrateコマンドを実行

```
$ npx prisma migrate dev --name init

Environment variables loaded from .env
Prisma schema loaded from prisma\schema.prisma
Datasource "db": PostgreSQL database "postgres", schema "public" at "aws-0-ap-northeast-1.pooler.supabase.com:6543"
```

これ以降ターミナルにメッセージは表示されなくなりました。

https://www.prisma.io/docs/getting-started/quickstart

## 原因
.envファイルに記載していた定数"DATABASE_URL"のポート番号が誤っていました。
本来"5432"と記載すべきところ"6543"となっていたため疎通できず停止していました。

<img width=700 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3551799/b1478454-2695-98e4-af7a-b09fde5a7193.png">

## なぜ？
・クイックスタートにある手順1の以下コマンドを実行すると、
　.envファイルに定数"DATABASE_URL"が追記される。（.envがなければ作成される）

```
$ npm i -D prisma
```

・追記された定数"DATABASE_URL"をsupabaseのDatabase Settingsにある
　Connection Stringで上書きする。

:::note warn
ここで追記時と上書き時のポート番号を確認する。
:::

## おわりに
初歩的なミスですが結構時間を食ってしまいました。誰かの助けになれば幸いです。
S3のライフサイクルを設定する(terraform)

## S3のライフサイクル
ライフサイクルには2種類のアクションを設定できるようです。
以下公式より: [ストレージのライフサイクルの管理](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/object-lifecycle-mgmt.html)

- Transition actions
  - オブジェクトを別のストレージクラスに移行するタイミングを定義し、オブジェクトを作成から30日後にS3標準 IA ストレージクラスに移行したりできる
  - 移行リクエストにはコストが発生する
- 有効期限切れアクション
  - オブジェクトの有効期限を定義し、有効期限切れのオブジェクトを削除する

今回はシンプルな有効期限切れのアクションの方をやってみます。


## terraformでバケット作成、ライフサイクル指定
7日間で有効期間が切れるように設定を行いました。
```
# S3バケット作成
#（今回はメール用の物を作ろうと思っていたので`mail`にしています。）
resource "aws_s3_bucket" "mail" {
  bucket = "mailbox"
}

# ライフサイクル指定
resource "aws_s3_bucket_lifecycle_configuration" "mailbox" {
  bucket = aws_s3_bucket.mailbox.id
  rule {
    id = "mailbox"

    expiration {
      days = var.mail_s3storage_retention_in_days
    }

    status = "Enabled"
  }
}

```

AWS コンソールからS3を選択してライフサイクルルールを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884542/9c4d5494-c17f-9f78-de85-d491d1950a7b.png)

左下に`7日 オブジェクトの有効期限切れ`となっていることを確認できました。

別のストレージクラスに移動させるといったアクションも今後試してみたいと思います。
目的思考を習慣化するワークフロー

こんにちは。７月から未経験の文系で開発職に配属されたとある新人エンジニアです。  
経験者たちに追いつくためにはどうしたらいいか考えつつ、日々試行錯誤しています。  
そのなかで、大切にしている（しようとがんばっている）考え方のひとつが**目的思考**です。  
今回はその目的思考を身に付けるために作成したワークフローをご紹介したいと思います。  

## 目的思考とは
そもそも目的思考とは、何のために自分はそれに取り組んでいるのか、何を実現したいのかを常に意識し、それらに沿った考えや行動をすることです。この思考を持っていると、自分の向かうべき方向性が明確になるため、妙な脱線をすることや、達成したかったことが気付けば全然達成できていないといったことを防ぐことができます。

## 目的思考を習慣化するワークフローを作ろうと思った理由
ではなぜ、目的思考を習慣化させようと思ったのかというと、研修でさんざん目的思考は大切だと言い聞かせられたからです。
そして、一向にできなかったからです。  
目的思考が大切なことはわかった、でもなかなか意識できない、ではどうするか。常に目的を意識せざるを得ない状況を作ろうということで、普段業務でよく使っているSlackのワークフローを作ってみることにしました。

## ワークフローをつくる
実際に私が作成したワークフローは以下です。 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3843296/8784fbd9-55c3-6e6d-a803-66ca79faef01.png)  

タスク１つずつに対して**目的**（最終的に実現を目指すこと）・**ゴール**（目的を果たすためにどうすればいいか、どんな状態になればいいか）を書き出す構成にしました。  
 
目的思考を習慣化させるためにはこれだけで十分に見えるかもしれませんが、目的を実現できたとしても、無駄に長い時間を書けてしまうと良いとはいえません。時間は有限ですし、やらなければならないこと、やりたいことは山積みですから。そのため、**所要予定時間**も記入する欄を設け、常に予定時間内に目的・ゴールを意識しながらタスクに取り組める仕様にしてみました。

## ワークフローを活用する
せっかく作ったのだからもっと効果的に使いたい！ ということで、１つのワークフローで
**振り返り**までできるようにしました。

目的などを回答すると、以下のようなボタンがチャンネル内に投稿されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3843296/4705d512-de7e-7a70-29b1-7931513ce9fe.png)

このボタンを押すと、タスクを経て学んだことなどの内省を記録し、次の行動につなげることができる構成にしました。

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3843296/0bb785eb-d0e4-cf00-d2aa-6431dabbc9cf.png)

回答内容はスプレッドシートへ集約し、いつでも見返すことができるようにしました。

このワークフローによって、目的思考を習慣化し、さらに、目的は達成できたのか・その過程でよかったことや改善することはあるか・次はどんなことをすべきかを振り返ることで成長サイクルを構築できると考え、実際に使ってみています。

## おわりに
このワークフローを作成して１か月も経っておらず、まだまだ改善点はあると思います。
私自身、試行錯誤しながらどんどん良くしていきたい、成長していきたいという思いがあります。
もし、他にも目的思考を身に付ける方法、経験者に追いつくべく少しでもはやく成長するコツをご存じでしたら共有していただけると幸いです！
よろしくお願いいたします！
DirectusのExtensionsを実装してインストールしてみる

HeadlessCMSの[Directus](https://directus.io/)に触れる機会がありました。
標準機能では実現できないことがあったので拡張機能(Extensions)を実装した際の記録です。
本記事ではExtensionの実装からインストールするまでの流れを纏めます。

## 前提
・作業端末にはnodejsがインストール済みであること
・DirectusはSelf-Hostingで起動していること

## プロジェクトの作成
プロジェクトを展開するディレクトリで以下のコマンドを実行する。
```
npx create-directus-extension@latest
```
実行すると対話形式で以下のことを聞かれる。

- Extensionのタイプ
    - [公式ドキュメント](https://docs.directus.io/extensions/creating-extensions.html#developing-your-extension)を参照して拡張機能のタイプを指定
- プロジェクト名
    - 拡張機能のプロジェクト名
- 開発言語
    - javascript/typescriptから選択
- 依存関係の自動インストール
    - Yes/Noから選択

上記の対話スクリプトを実施すると、HelloWorldをレスポンスするサンプルコードが生成される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2736004/34973243-872a-e411-5d7f-d5cca205d50b.png)

## プロジェクトのビルド
まずはサンプルコードをそのままビルドしてみる。
プロジェクトのルートディレクトリで以下のコマンドを実行する。
```
npm run build
```
ビルドに成功するとdistというフォルダにモジュールが生成される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2736004/ea5f076f-9df5-5fe2-ea38-4c244d15f44c.png)

## Directusにビルドモジュールをインストール
上記の作業でビルドしたモジュールをDirectusにインストールしてみる。

### Extensionsの格納先確認
Directusを起動するためのdocker-compose.ymlでextensionsの格納先を確認する。
[公式ドキュメント](https://docs.directus.io/self-hosted/quickstart.html#create-a-docker-compose-file)に記載のサンプルコードを使用している場合は`./extensions`がアタッチされている。
```
version: "3"
services:
  directus:
    image: directus/directus:10.13.1
    ports:
      - 8055:8055
    volumes:
      - ./database:/directus/database
      - ./uploads:/directus/uploads
      - ./extensions:/directus/extensions
    environment:
      SECRET: "replace-with-secure-random-value"
      ADMIN_EMAIL: "admin@example.com"
      ADMIN_PASSWORD: "d1r3ctu5"
      DB_CLIENT: "sqlite3"
      DB_FILENAME: "/directus/database/data.db"
      WEBSOCKETS_ENABLED: "true"
```

### ビルドモジュールの格納
Extensionsの格納先に拡張機能のプロジェクト名のディレクトリ作成し、ビルドモジュール(distごと)とpackage.jsonを格納する。
ディレクトリは以下のような構造となる。
```
./extensions
└── {拡張機能のプロジェクト名}
    ├── package.json
    └── dist/
```

### Directusの起動
以下のコマンドでDockerコンテナを起動する。
```
docker compose up
```

## インストール確認
DirectusにログインしてSettings>Extensionsを開くとインストールされている拡張機能の一覧が確認できる。
先ほどビルドしたプロジェクト(typescript-sample)がenableとなっている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2736004/03b966c7-b1d9-4a93-896b-7aec05bd6780.png)

Endpoint型の拡張機能を作成した場合は、拡張機能のプロジェクト名をURLパスに含めることで、HelloWorldの応答を確認できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2736004/88bf56f9-5a56-32e8-3f5e-e6f29c378093.png)
セッションが保存されない原因はトランザクションにあった

# はじめに

他と同じようにセッションへ保存のコードを書いているにも関わらず、
セッションが保存されない！！！

その原因がトランザクションにありました。

原因不明で悩みましたので、記事にさせていただきます。

参考になりましたら幸いです。

# 問題

Laravelにて、以下の通り記載しているにも関わらず、セッションに保存されない

```php
DB::beginTransaction();
-省略-
$request->session()->put('errorMessage', $errorMessage);
```

# 原因

データベーストランザクションがセッションに影響を与えていました。

# 解決方法

```php
DB::beginTransaction();
-省略-
DB::rollBack(); //解決策①
$request->session()->put('errorMessage', $errorMessage);
DB::commit(); //解決策②
```

トランザクションをしっかり終了させると想定通り動きました👏

ちなみに、Chat GPTに「何が原因やと思う？」と質問したところ解決しました。

AI、素晴らしいです。

![_2024-07-23 14.53.36.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1656885/48997d6d-d580-8ee0-ae1e-8dda11234de0.jpeg)


## 原因詳細

私の使用環境では、Laravelがデータベースをセッションドライバとして使用していました。

その場合は、セッションデータの保存もデータベーストランザクションの一部として扱われます。

今回の場合、トランザクションがコミットされなかったために、セッションデータの保存も未決定状態となっていました。

ちなみに、セッションドライバはこちらから確認可能です。

.env

```php
'driver' => env('SESSION_DRIVER', 'file'),
```
texのために画像をepsに変換する際のあれこれ

texでレポートなどを書いているとき、pngファイルなどの画像を貼り付けようとすると`LaTeX Error: Cannot determine size of graphic in image.png (no BoundingBox).`のようなエラーが出て画像が貼れない場合があります。
そうした場合は画像をepsファイルに変換してtexに貼るといい感じになりますが、オンラインツールなどでpngファイルをepsファイルに変換するとかなり手間がかかります。
そこで使うといいのが`convert`コマンドです。
Macで`convert`コマンドを使用する場合は
```
brew install imagemagick
```
でimagemagickをインストールし、
```
convert image.png image.eps
```
と実行することで`image.png`ファイルをepsファイルに変換できます。

また、フォルダに入った複数のファイルをconvertしたい場合、
```
convert '*.png' -set filename:fn '%[basename]' '%[filename:fn].eps'
```
を実行するとフォルダ内の全てのpngファイルをepsにできます。
【備忘録】React Hook FormでsetValueを使って保持している値をコンポーネントで描画する

# はじめに
`React Hook Form` で**register**を使わずに、**setValue**を使うと、描画時にRHF側の`state`とinputタグへの入力内容が一致しないことを解決した**備忘録**です。

# 実装例
・onDropの中で**setValue**を使ってRHF側の`state`を書き換えています。
・**getValues**を使って値を取得して、コンポーネントで描画しています。

```tsx
export function ImageDragAndDropZone() {
  const { setValue, getValues } = useFormContext();

  const onDrop = (files: File[]) => {
    const droppedImage = files[0];

    // RHF側で一元管理する
    // 本来はサーバ側に処理を投げて、画像保存 + パスをDBに保存
    const imageUrl = URL.createObjectURL(droppedImage);
    setValue("imageSrcPath", imageUrl);
  };

  const { getRootProps, getInputProps, isDragActive } = useDropzone({ onDrop });

  const imageSrcPath = getValues("imageSrcPath");

  return (
    <>
      <ToastContainer />
      <div
        {...getRootProps()}
        className={
          isDragActive
            ? "border-2 border-dotted rounded-lg border-red-400 h-3/6"
            : "border-2 border-dotted rounded-lg border-gray-300 h-3/6"
        }
      >
        {imageSrcPath && (
          <Image
            src={imageSrcPath}
            alt="プレビュー画像"
            width={9999}
            height={9999}
            className="h-full object-contain"
          />
        )}
        <input {...getInputProps()} />
        {!imageSrcPath && (
          <p
            className={
              isDragActive
                ? "text-gray-600 flex justify-center items-center h-full text-center"
                : "text-gray-400 flex justify-center items-center h-full text-center"
            }
          >
            ここにアップロードしたい画像をドラッグ&ドロップしてください。
          </p>
        )}
      </div>
    </>
  );
}
```
# さいごに
**setValue**だと再レンダリングが引き起こされないので、**getValue**の値が更新されないと書いているのですが、
私の環境では、**setValue**でも再レンダリングされて値が更新されているようです。

https://scrapbox.io/mrsekut-p/getValues%E3%81%A8watch%E3%81%A8useWatach%E3%81%AE%E4%BD%BF%E3%81%84%E5%88%86%E3%81%91
【DevContainer入門①】チュートリアルをやってみた


気になっていたdevcontainerのチュートリアルをやってみた記録

## 実施するチュートリアル

:::note info
Dockerのインストールはスキップ
:::

https://code.visualstudio.com/docs/devcontainers/tutorial


## 1. devcontainer拡張機能をインストトール

- チュートリアルの内容に従ってインストール

## 2. MSが提供しているサンプルdevcontainer環境を開く

- VSCodeのウィンドウが開きなおされてコンテナの立ち上げが行われる

- しばらくまつ

## 3. ターミナルを立ち上げる

1. `ctrl + shift + @`を押すとターミナルが起動する

2. コンテナに接続された状態でターミナルが起動する

3. 以下バージョン確認コマンドを打つとコンテナ内にインストールされたnodeとnpmのバージョンが確認できる

```bash
node --version; npm --version
```

## 4. nodeアプリケーションを起動する

1. `F5`を押すとexpressサーバがコンテナ内で起動する

2. ブラウザから`http://localhost:3000`に接続すると`Hello remote world!`と表示されているのが確認できる


## 5. デバッグしてみる

1. `server.js`を以下のように書き換える

```diff
- res.send('Hello remote world!\n');
+ res.send('<h1>Hello remote world!</h1>\n');
```

2. `ctrl + shift + F5`を押しnodeアプリケーションを再起動する

3. VSCode上で`server.js`の17行目にブレークポイントを張る

4. ブラウザから`http://localhost:3000`にアクセスする

5. VSCode上でステップ実行ができることを確認する

## 所感

ものすごい簡単に環境立ち上げからデバッグまでができた。
実際にはDockerfileを書きつつ独自のコンテナをdevcontainerとして立ち上げて
開発するがチュートリアルとしてそこを省いて触ってみた感じはとてもお手軽。

この次は、独自のコンテナを作成してそれをdevcontainerとして使用する方法を試してみようと思います。

この記事がdevcontainer入門へのきっかけになれば幸いです。
謎の任意団体「任意団体なんでやねん」

# 茶番
*どこにでもいる学生が勉強サボって書いてます
こないだ　セミとクワガタがバラバラ死体になって落ちてた
NullPointerException
とか言うJavaのエラーより　気持ち悪い
そうそう　ChatGPTは、なぜかタメ口聞いてきたんですが()

# ということで本題
まず、なんとなくgoogle検索してたらこんな物を見つけた
https://nandeyanen.ie-t.net/
なんか　任意団体なんでやねん　とか　書いてあるし？
何この名前　なんでこんな前なの　なんでやねん(　
とか言いつつサイトを見ると
「当団体の理念は、

「世界中の人々が差別なく利用できるサービス・ツールを開発し、人々が分断されず、誰もが繋がることができる世界を創り出すこと」です。」
って書いてあった
ということは、だよ
おもしろツールがあるのかなぁ　って思ってみたら　ありましたよｗ
なんか　SNSやら掲示板が　いろいろ　面白いです
ぜひ使え　
以下が関連qiita記事です。

https://qiita.com/Asahi-jp/items/440147da682d698d6bc0

# 雑談
えとそれで、
話は、それますが
この人たち　SQLソフトも配布してるの.....?
それは、どうでもいい((((
話したいのは、この人たちのサービスのホストだそれを見よう
https://ie-t.net/
これがそのホストだ
なんか　さくらのVPSだか　なんだかでホストしてるんだって
自分と知り合いの @JF6DEU ( https://JF6DEU.net )もつかってるVPSです。
なんかねぇ　色々すごい
完全無料でクレカとかSMSとかなしに登録できるんです!
PHP8.3だかに対応ですって
メールもついてくる! 神やん....
ドメインも登録(?)の時に設定すればいけるし
一人で数件もOKだったはずだし　
すごいねぇ
###### FTP使えないとデータ配置とかできないとか言うところに触れてはいけないけど
以上

-----
筆者:kkk2z1
最終編集(?):2024/7/17
Revolt chat : kkk2z1
Scratch　: NEKO_LAB_TOKYO_0009
homepage: kkk2z1.ie-tnet

---
GitHub　readme　PNG画像表示

GitHubのReadMeにて画像を表示させたい際に、つまずいたので解決した方法を記述する。

調べるとIssuesを新規作成して画像をドラッグアンドドロップし、生成されたコードをReadMeに張り付ける、とあったが表示されなかった。
その時のコード　
~~~
![text](URL)
~~~
原因
拡張子がpngだったという点。

解決策
imgタグを使う。

~~~
<img src="URL">
~~~
なお、画像の置き場はそのリポジトリに画像用のブランチを作って入れた。
git checkout どこから -- どのファイルを

いつもわすれるので 「特定ブランチの特定ファイルをもってくる」　やりかた

```bash
$ git checkout どこから -- どのファイルを
```

特定ブランチの特定ファイルをもってくる、他にも他人が開発している別ブランチで必要なファイルをもってくるなど。

例: 開発中に間違ってコミットしてしまった、変更してはいけないファイル README.md をdevelopの内容に戻す

```bash
$ git checkout develop -- README.md
```

## 参考
いつもWebで rebase onto毎回検索してますが、その次にこの操作をやってます。覚えられない！

https://qiita.com/sotarok/items/07c6b2cca5ed2f9a53a6
android開発初心者が一番最初に出たErrorを直してみた

やりたかった事
MakeProjectで中身のないアプリを起動する。

出たError
Unable to find Gradle tasks to build ( Build mode: ASSEMBLE

エラーの翻訳
ビルドする Gradle タスクが見つかりません (ビルド モード: ASSEMBLE)

原因
テンパってフォルダーをダウンロード中に停止した。

治し方
画面左下の"sync"の部分のプロジェクト名が赤色になっていたため、リロードマークをおしてダウンロードし直した。

結果
赤色から通常カラーに戻りプロジェクトを、実行できるようになった
Llama 3.1がDatabricksにやってきました！

こちらのブログで発表しています。

https://www.databricks.com/blog/new-standard-open-source-ai-meta-llama-31-databricks

冒頭を翻訳します。

> DatabricksでLlama 3.1シリーズのモデルをリリースし、パワフルなオープンモデルの標準を前進させるためのMetaとのパートナーシップに興奮しています。Llama 3.1によって、企業は品質に対するオーナーシップやカスタマイズ性を犠牲にすることなしに、最高品質の生成AIアプリを構築することができます。Databricksにおいては、オープンな言語モデルによるイノベーションの加速とより安全なシステムの構築に対するコミットメントをMetaと共有しており、Day1から新たなモデルのスイートを企業の皆様が利用できるようにすることに興奮を覚えています。
>
> DatabricksにLlama 3.1をインテグレーションしており、お客様がそれを用いて自身のアプリケーションを容易に構築できるようにしています。本日からDatabricksのお客様は、Llama 3.1モデルをサービング、ファインチューニングし、Retrieval Augmented Generation (RAG)やエージェントシステムに接続し、自身のユースケースのための合成データを容易に生成し、スケーラブルな評価のためにモデルを活用するためにMosaic AIを活用することができます。これらに機能によって、企業はプロダクション規模の生成AIアプリケーションを構築するために、最高品質のオープンソースモデルと、自身のユニークな企業データを完全に活用できるようになります。

[こちら](https://docs.databricks.com/ja/large-language-models/llm-serving-intro.html)にあるように、いくつかの方法でLlama 3.1ファミリーのモデルを利用できますが、AWS日本リージョンでは、現時点ではFoundation Models APIが利用できないため、[Unity Catalogで公開されているモデル](https://docs.databricks.com/ja/generative-ai/pretrained-models.html)を使う形になります。

カタログエクスプローラで`system.ai`を確認すると、Llama 3.1ファミリーのモデルを確認できます。
![Screenshot 2024-07-24 at 9.44.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/aa1e4310-02a3-bc96-747d-6ba3cd91a275.png)
![Screenshot 2024-07-24 at 9.56.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/ba00315f-57f6-d709-7425-419b08c27462.png)

こちらをGPUのモデルサービングエンドポイントにデプロイします。
![Screenshot 2024-07-24 at 13.43.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/856a5a08-59d8-1a68-36ee-f25c3312563c.png)

しばらく待つとエンドポイントがreadyになります。
![Screenshot 2024-07-24 at 13.42.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/1c0295f0-e3d2-4e73-f104-d243bd9c0486.png)

エンドポイントにクエリーしてみます。
![Screenshot 2024-07-24 at 13.53.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/73d2c45d-f810-23cf-4935-57fcdc2ceb6b.png)

繰り返しが発生していますが、とりあえず動きました。

AWS東京リージョンでは利用できますので、いろいろ試してみてください！


### はじめてのDatabricks

[はじめてのDatabricks](https://qiita.com/taka_yayoi/items/8dc72d083edb879a5e5d)

### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
pyenvで最新バージョンがインストールできない

# 環境

* Ubuntu 22.04

# 結論

* リモートリポジトリのURLを更新してgitから最新のpyenvを取得した
```bash
$ git remote -v
origin  git://github.com/yyuu/pyenv.git (fetch)
origin  git://github.com/yyuu/pyenv.git (push)

$ git remote set-url origin https://github.com/pyenv/pyenv.git
$ git pull

```
## インストールできるバージョン確認

* Python3.12をインストールするためpyenvでバージョン確認を行ったところ、3.12がなぜか出てこない

```bash
$ pyenv install -l
Available versions:
…
  3.9.9
  3.10.0
  3.10-dev
  3.11.0a2
  3.11-dev
  activepython-2.7.14
  activepython-3.5.4
  activepython-3.6.0
  anaconda-1.4.0
  anaconda-1.5.0
…

```

## バージョンアップ（できてない）

* pyenv updateというコマンドをインストールして実行すれば使えるらしいと聞きインストールして実行（これが落とし穴に）

```bash
$ git clone https://github.com/pyenv/pyenv-update.git $(pyenv root)/plugins/pyenv-update
$ pyenv update
```

* 特にエラーが出ることもなく終了
* しかし、バージョン確認しても新しいバージョンは表示されなかった

## 無理やりアップデートしてみる

* リストに表示されていないだけかもしれないと思いバージョンを指定してインストールを試みるもやはりエラー

```bash
$ pyenv install 3.12.4
python-build: definition not found: 3.12.4

See all available versions with `pyenv install --list'.

If the version you need is missing, try upgrading pyenv:

  cd /home/hogehoge/.pyenv/plugins/python-build/../.. && git pull && cd -

```

* 失敗したがコマンドの提案をしてもらったので素直に実行してみる

```bash

$ cd /home/hogehoge/.pyenv/plugins/python-build/../.. && git pull && cd -
fatal: unable to connect to github.com:
github.com[0: xx.xx.xx.xx]: errno=接続がタイムアウトしました


```
* タイムアウトしてしまった

# Gitのリモート先URLを確認

* 以下コマンドでリモートリポジトリURLを確認

```bash
$ cd ~/.pyenv
$ git remote -v
origin  git://github.com/yyuu/pyenv.git (fetch)
origin  git://github.com/yyuu/pyenv.git (push)

```

* 以下コマンドでGitリモートリポジトリURLを更新し、最新を取得
```bash
$ git remote set-url origin https://github.com/pyenv/pyenv.git
$ git pull
```

* ここまでやったところ3.12が一覧に表示されるようになって解決
画面フロー : 選択肢リストコンポーネント


+ [画面フロー:選択肢セットの考察](https://qiita.com/Keiji_otsubo/items/ed6eea4a8e740b201aa2)

+ [CASE関数でテキスト型の数字をテキストに変換すると返り値がnullになる](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007cmQG0SAM)

ラベルが表示されますね。(画面上でデバックするとラベルが表示されるけど、値をセットできます。)

+ [画面フロー上の動的選択リストの値取得方法について](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX000000TQBw)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/01b5d966-5ea7-b43f-8c78-701d491f1f60.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/d296ce26-8dcf-22e1-dff0-52911158ff0f.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/397af4ab-ce19-33b5-e870-fa8e7cd91c65.png)

API名は必要な場合は再度変換しないといけなさそうです。(←違う)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/6a34e8ff-8d89-a362-7457-3a4bdd2e4683.png)

:::note
デバッグとして画面コンポーネント上にselection1を表示テキストで表示させた場合はラベルが表示されていましたが、実際に項目更新を行う際はselection1を指定するだけで値で更新されていました。
:::

# 設定

+ [SFDC 内のオブジェクトの 1 つにすでに存在する選択リスト フィールドの特定の値のみを持つ選択リスト コンポーネントを画面フロー内で使用する方法はありますか? たとえば、商談オブジェクトにはステージの選択リスト値が 9 つありますが、ステージの選択リスト コンポーネントには画面フロー内でその 9 つの値のうち 7 つだけが表示されるようにしたいとします。   ](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX000000W4On)


# エラー

+ [画面フローの選択項目の反映エラー](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007erKPI)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/fcfc863e-1a45-2833-c8aa-a8aa74f1704e.png)

:::note
選択肢の値をAPI 参照名に変更してみてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/2759b7ac-591d-8a07-8bd5-52be63ff8921.png)
:::