OmniAICreator/Qiita-1.07M huggingface dataset:
黄金比の説明に使われる黄金螺旋とフィボナッチ螺旋の誤差について

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/9d8168c0-7129-48e2-8881-ac88af5f67e2.png)

黄金比の話題をするときに、このような図をよく見かけます。1:(1+√5)/2の縦横比で長方形を作った際に登場します。このときに、４分の１の円を次々につなげていくと、黄金螺旋になるという話なのですが、厳密には、近似です。
上の図でいうと、ピンクの図が四分円。黒線が黄金螺旋。
近似にしては「誤差が大きい」というのが、私の感覚。

wikiには、下図が示され、赤破線が円弧、青線が黄金螺旋と記載されています。
https://en.wikipedia.org/wiki/Golden_rectangle#/media/File:Golden_vs_Fibonacci_Spiral.svg
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/cb93a22d-0af0-499a-96b3-31112528b195.png)

# ２つの螺旋の呼び方

円弧の組み合わせで表現した曲線：
(Fibonacci spiral)「フィボナッチ螺旋」

もう一方の曲線：
(Golden spiral)「黄金螺旋」

# 黄金螺旋の定義
極座標表記で示す
```math
r=\phi^{2\theta/\pi}
```
（うまく表示されないが、ファイは黄金比）

以下で、SVGフォーマットで保存できます。

```java:Processing
import processing.svg.*;

float phi = (1 + sqrt(5)) / 2;
float th, r, x, y, _x=1, _y=0;

size(800, 800);

beginRecord(SVG, "golden_spiral.svg");
stroke(0);

translate(width / 2, height / 2);
scale(-1, 1);

for (th = 0; th < 6.08*PI; th+=0.01) {
  r = pow(phi, 2*th / PI);
  x = r * cos(th);
  y = r * sin(th);

  line(_x, _y, x, y);

  _x = x;
  _y = y;
}

endRecord();
```

https://en.wikipedia.org/wiki/Golden_spiral
ほぼ通学時間のみでVR技術者試験に合格した

# VR技術者試験に合格した話

『上級バーチャルリアリティ技術者』と名乗りたい・・！

## はじめに

この度，VR技術者認定試験のセオリーコースとアプリケーションコースの両方に合格したので，その体験をシェアしたいと思います．これから受験を考えている方の参考になれば幸いです．

## VR技術者認定試験とは？

まず，VR技術者認定試験について簡単に説明します．この試験は日本バーチャルリアリティ学会が主催する，VR（バーチャルリアリティ）技術に関する知識や技能を認定する資格試験です．

試験には主に2つのコースがあります：

1. **セオリーコース**: VRの基礎理論や歴史，技術的背景などの知識を問うもの  
2. **アプリケーションコース**: 実践的なVRアプリケーション開発や活用に関する知識を問うもの  

合格基準は各コースとも **60点以上（100点満点）** となっています． 

いずれかのコースに合格すると **「バーチャルリアリティ技術者（Virtual Reality Specialist）」** の資格認定証が発行され，名刺などに記載できる資格となります．  

また，両コースに合格すると **「上級バーチャルリアリティ技術者（Senior Virtual Reality Specialist）」** として認定されます．  

## 受験の動機

私がVR技術者認定試験を受験しようと思ったきっかけは，自分のVRに関する知識を体系的に整理したいと考えたからです．  

大学4年時にVR系の研究を始め，今までも授業や趣味でVRに触れる機会はありましたが，断片的な知識になっていたため，この機会に基礎から応用まで系統立てて学びたいと思いました．  

また，就職活動において，業界で認められる資格を取得することで自身のスキルを証明し，研究活動にきちんと取り組んでいた裏付けとして役立つと考えました．  

## 勉強方法と期間

私の勉強スタイルは以下の通りでした：

- **勉強期間**: 試験日の約1ヶ月前  
- **勉強時間**:  
  - 講習会  
  - 毎日の通学時間（片道1.5時間のうち30〜45分を活用）  
  - 試験前日に3〜4時間の最終復習  
- **使用教材**:  
  - 公式テキスト「バーチャルリアリティ学」  
    - [https://www.vrsj.org/publications/virtualreality/](https://www.vrsj.org/publications/virtualreality/)  
  - 過去問  
    - [https://vrsj.org/events/seminar/](https://vrsj.org/events/seminar/)  

私の勉強方法は，まず過去問を印刷して，いつでも勉強できるようにしました．  

通学時間中に過去問を頭の中で解き，わからない箇所はその都度参考書「バーチャルリアリティ学」を開いて学習する．  

いわゆる **「スキマ時間」を活用した勉強法** です．  

VR技術者試験の問題は，私の体感では**8割程度過去問から出る**印象でした．  

そのため，過去問を覚えながら学習するのが一番コスパの良い方法です（身につくかは置いといて）．  

ただし，今年度から，アプリケーションコースの試験では，  
（[「バーチャルリアリティ学ライブラリ」](https://www.coronasha.co.jp/virtual_reality/)）の中から以下の2冊も試験範囲に含まれます．  

- **ヘッドマウントディスプレイ**（清川 清 編著）  
- **神経刺激インタフェース**（青山 一真 編著）  

そのため，以前の試験よりも過去問と同じor似たような問題の数は減り，新たな問題の割合が増えました．  

とはいえ，私の感覚では，従来通り過去問を対策するだけで**十分合格点には達する**かと思います．  

## バーチャルリアリティ技術者認定講習会

講習会には，**セオリーコース・アプリケーションコース**どちらの時も参加しました．  

**学生会員は3,000円**で，その分野の専門家からの講習を受けることができます．  

正直，参考書「バーチャルリアリティ学」は専門用語が多く，内容が難しいため，完璧に理解するのは至難の業です．  

講習会では，大学の授業のように**スライドで様々な画像や動画付きで説明**を行ってくれるため，非常に理解しやすいです．  

**授業資料をもらうだけでも有効**なので，講習会への参加をおすすめします．  

## 試験当日の様子

- **試験形式**: オンライン試験システム  
- **試験時間**: 各コース60分  
- **合格ライン**: 60点以上（100点満点中）  

試験中は特に緊張することなく，淡々と問題に答えていき，時間は30分ほど余裕を持って終わりました．  

基本的に時間は余る人が多いかと思います．  

## 試験結果

努力の甲斐あって，両コースとも**合格**することができました．具体的な結果は以下の通りです：  

### セオリーコース（第24回）

- **得点**: 87.7点（100点満点中）  
- **合格基準**: 60点  
- **判定**: 合格  

### アプリケーションコース（第25回）

- **得点**: 85.4点（100点満点中）  
- **合格基準**: 60点  
- **判定**: 合格  

正直，受験後は満点近く取れている自信があったので，想像より低いと感じました．  

## おわりに

VR技術者認定試験に合格することで，**『上級バーチャルリアリティ技術者』** と名乗れることはモチベーションに繋がるため，**学生のうちに取得しておいて良かった**と思います．  

入社予定の企業ではVR系はあまり扱っていないので，資格の知識が直接役立つことは多くないかと思いますが，**名刺交換時のアイスブレイクのネタ**として使えたら良いなと思います．  

最後まで読んでいただき，ありがとうございました．  

皆さんの受験の参考になれば幸いです．
Google PixelでLinuxターミナルアプリが標準搭載になりました。

## 概要
Google Pixelの2025年3月アップデートで、Linuxターミナルアプリが標準で使用できるようになりました。
コマンドのmanを確認したり、オプションの検証、簡単なアプリの動作確認によさそうです。

## 導入手順
1. 設定 - システム - 開発者向けオプション - Linux開発環境をONにする。
    ![Screenshot_20250318-081810.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298070/9024c875-dca0-40e3-b34d-0ae81fa2431f.png)

2. アプリ一覧に追加されるターミナルアプリを起動。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298070/5bbbb84c-98e5-4028-adbc-32f727efaa02.png)

3. 初回起動時、通知許可のポップアップが表示されるので許可する。（許可しないを選択した場合、データのインストールボタン選択時にアプリが強制終了する）

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298070/60208d5d-5480-47d9-8997-cdb3b8e253ca.png)

4. インストールを選択する。

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298070/e609893e-4ab7-416c-bfc9-6ee5ddc83fc9.png)

5. インストール完了後、ターミナルが起動する。

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298070/6138f4b5-3bd9-4d94-9d1f-2089ac17cb0b.png)

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298070/f778c189-a438-4386-a33e-75d974f8a59a.png)
```
droid@localhost:~$ uname -a
Linux localhost 6.1.0-28-arm64 #1 SMP Debian 6.1.1
19-1 (2024-11-22) aarch64 GNU/Linux
droid@localhost:~$
```
直感的なデザインを実現する鍵：シグ二ファイアの役割と重要性

私たちの身の回りにある様々な物やデジタルインターフェースには、ユーザーに直感的な使い方を伝えるための工夫が散りばめられています。その中でも「シグニファイア」という概念が、特にデザインの中で重要な役割を果たします。
シグニファイアは、物やインターフェースがどう使われるべきかを明確にする「手がかり」のことです。この記事では、シグニファイアについて具体例を挙げながら解説します。


### シグニファイアとは？

シグニファイアとは、「人の行動を誘導するサイン/ヒント」という意味です。
例えば水道のハンドルには青色と赤色の印や表示がありますが、私たちはその表示をみて「青が冷たい水、赤が暖かい水」であることを認知して、出したい水が使えるようにハンドルを操作します。

![4039336_m.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4008791/93efed85-b994-4f45-a388-2d245be9dc90.jpeg)


また、Webサイトやアプリにおける「ボタン」は立体的にデザインされてたり、色やサイズの違いがつくられていることで、「ここをタップ/クリックすればいいんだな」と分かったりします


### アナログな物体におけるシグニファイアの例

アナログな物体におけるシグニファイアの例として、ドアの取っ手が挙げられます。
縦長の取っ手であれば「引く（引けそう）」、平らなプレートであれば「押す（押せそう）」という情報を手がかりに、私たちは自然とドアを通過するための動作を選ぶことができます。

### Webサイトなどデジタル領域におけるシグニファイアの例

Webサイトやアプリなどにおいて、シグニファイアはユーザーにとっての使いやすさを大きく左右します。

【ボタン】
Webサイトやアプリでよく使われる「ボタン」は、シグニファイアの典型的な例です。ボタンが平面的であったり、リンクと区別がつかない場合、ユーザーはその部分をクリックできることに気づかないかもしれません。これを防ぐために、影や立体感を持たせたデザインが施され、ボタンであることが視覚的にわかりやすくなっています。また、「クリックしてください」といったラベルを付けることで、さらに明確なシグニファイアを追加できます。

【フォームの入力フィールド】
フォームの入力フィールドもシグニファイアの一つです。入力ボックスが枠で囲まれていたり、下線が引かれていることで「ここに文字を入力できる」とユーザーに伝えています。プレースホルダーとして「名前を入力してください」と書かれていれば、ユーザーはそのフィールドにどの情報を入れるべきかを瞬時に理解できます。

![AdobeStock_458144941.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4008791/ae854913-7113-4dcc-a079-0b2ade075227.jpeg)

### シグニファイアは受け取る人のメンタルモデルに左右される

物や環境からシグニファイアを受け取ることで、私たちは特定の行動を促されます。しかし、すべての人が同じようにシグニファイアを認識するわけではありません。これはシグニファイアが、その人のメンタルモデルに影響されるからです。

メンタルモデルとは、物事の見方や行動に大きく影響を与える「思い込み」や「暗黙の前提」のことで、簡単に言えば、私たちが無意識に抱いている固定観念です。
例えば、神社の入り口に立つ「鳥居」は、神聖な領域の入り口を示すシグニファイアです。鳥居をくぐることで参拝者は「ここから神域に入る」という認識を持ち、無意識のうちにその後の礼儀や作法を意識し始めます。これは、鳥居が参拝者に対して境界を示し、行動を自然に導いているためです。

一方で、もし鳥居を初めて目にする人や、日本文化に馴染みがない人であれば、鳥居が持つシグニファイアを認識できないかもしれません。その結果、神聖な場所だと気づかず、適切な行動を取らない可能性もあります。

このように、シグニファイアの解釈や反応は、その人が持つメンタルモデルに大きく依存しているのです。

![AdobeStock_413020131.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4008791/05ffc5cf-0c76-4fe0-9c94-3f9d8b2c8638.jpeg)

### まとめ

シグニファイアは、物やインターフェースの使い方をユーザーに明確に伝える重要な要素です。適切なシグニファイアが配置されていることで、ユーザーは直感的に操作を理解し、スムーズに目的を達成できます。

一方で、シグニファイアが不十分であったり曖昧な場合、ユーザーは混乱し、操作に戸惑うことが増え、結果として離脱する可能性も高くなります。

デザインの現場では、シグニファイアとメンタルモデルを意識することで、UIや画面、さらにはプロセス全体が直感的で使いやすく、ユーザーに迷わない体験を提供することができるでしょう。
【デジタルデトックス?】ネット接続を切ってみてプログラミングする

# たまにはあり。
やってみたけど結構良かった。

・通知を気にしない時間を作れる。
・そのタイミングで開いているブラウザしか見れないため、そこで取り組んでるタスクに集中できる。
・検索や生成AIへの質問ができないことで、考える時間を持つことができる。
.NETのお勉強7_開発環境整える

# 概要
AmazonLinux2023インスタンス上にコンテナで.NETを利用したサーバをたてる
そのお勉強メモ7

ろくな開発環境を用意していなかったので整える

# エディタの用意
VSCodeを採用
ここからインストール
https://code.visualstudio.com/download

# 日本語化プラグイン
左メニューの四角４つみたいなマークを押して、検索窓から「Japanese Language Pack for Visual Studio Code」を検索してインストール
再起動すれば日本語化されてる
![スクリーンショット 2025-02-07 午前10.56.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298813/3f778ca5-da61-8b3a-0653-43abccfa71f3.png)


# .NETとC#の補完プラグイン
macに直接dotnetを入れたくない
直接入れる方がエディタ的には楽だけど、バージョン管理の楽さとか、結局リリースする時にはコンテナで動かすことを考慮してコンテナだけにしたい

ただ、そうすると普通に拡張機能を入れてもローカルのdotnetを探しに行って、見つからないからとエラーになる...

# Remote - Containersプラグイン
上記の理由から、先に別のプラグインを入れる
ホストで動くVSCodeからコンテナに接続して、そのコンテナ内で開発できるようにするプラグイン
拡張機能がコンテナ内で実行されるようになるので、dotnetがコンテナ内にしかなくとも、そのコンテナ上で動く

Dev Containersプラグインをインストール
![スクリーンショット 2025-02-07 午前10.55.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298813/a72fcde7-047e-7429-7716-fdd9bc35307e.png)


インストール後、左メニューに「リモートエクスプローラー」が追加される
SDKコンテナを選択してAttachすると、エディタが更新され、ターミナルやファイルがコンテナ内参照に変更される

# 改めて.NETとC#の補完プラグインをインストール
コンテナに繋いでいる状態で、C# Dev Kitをインストール
![スクリーンショット 2025-02-07 午前10.58.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298813/cc0602c4-b991-b441-419a-bbd7d7155b89.png)

インストール後、拡張機能一覧がこうなる
どうやら、プラグイン自体はmacではなくコンテナ内にインストールされるっぽい
一度コンテナを停止して再度立ち上げると、プラグインの再インストールが走ってる(インストール履歴だけ残ってる？
ちょっと非効率かも
![スクリーンショット 2025-02-07 午前10.58.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298813/a42a5521-26f6-6a82-5efb-2468646d7c8a.png)
ある行や列のセルすべてをクリアしたい

ある行や列のセルすべてをクリアしたい場合は、`Range.Clear` や `Range.ClearContents` を利用します。

- `Range.Clear` : すべてをクリアする（数式・値・書式・コメントなど）
- `Range.ClearContents` : 数式と値をクリアする

__例1: A列のセルすべてをクリアする__

```vba
ThisWorkbook.Worksheets("Main").Range("A:A").Clear
```

__例2: 3行目の数式・値をすべてクリアする__

```vba
ThisWorkbook.Worksheets("Main").Range("3:3").ClearContents
```

__環境情報__

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105859/a5a7c586-9284-476a-8084-95362d647f58.png)
テストケースに必要な項目

# はじめに

こんにちは、QAエンジニアのヨシナです。

毎週金曜日、QAチームでテストプロセスを振り返る会議を行っています。使用するテスト手法、テスト仕様書のレビューフロー、工数の見積もり方法などについて議論しています。最近の会議では、テスト中に「テストケースに必要な項目が不足している」と感じたことを議題として取り上げました。

本記事では、テストケースに必要な項目について話し合った結果を書きます。

# 現在使用しているテストケース項目

QAチームでは以下の項目をテストケースに使用しています。

| 項目名 | 説明 |
| --- | --- |
| 番号 | テストケースのID |
| 機能 | テスト対象の機能 |
| 画面種別 | テストを実施する画面の分類 |
| 対象画面名 | テスト対象の画面名。（画面がない場合は機能名を記載） |
| 要素（大、中、小） | テスト対象の要素名やシナリオ |
| 前提条件・テストデータ | テストで使用する前提条件やテストデータ |
| 手順 | テストの実施方法 |
| 期待結果 | 手順を実施した際に得られるべき結果 | 
| 確認担当者 | テスト担当者 |
| 確認結果 | テストの結果が期待結果と一致するかを示すステータス |
| 備考 | テストケースに関する補足情報 |

# 他にあるべき項目

以下の項目の追加を提案しました。

1.	**実行日付**
2.	**ビルドバージョン**

これらの項目は**トレーサビリティ**を向上させる効果があります。たとえば、テストした機能でバグが発見された場合、実行日付やビルドバージョンが記録されていれば、以下のようなメリットがあります：

* 正常に動作していた時期や製品バージョンを特定できる
* バグが混入したタイミングを追跡しやすくなる
* リリース済み機能におけるユーザへの影響範囲を計測しやすくなる

# 議論の結果

結論として、**実行日付**と**ビルドバージョン**の項目は採用されませんでした。

現状ではQAチームがバグの混入タイミングを把握する必要がなく、バグの影響範囲の調査は主に開発チームが担当しているためです。また、テストケースをExcelで管理しています。手動で実行日付を入力する必要があるため、テスターへの負担が増えることが懸念されました。

テストケース管理ツールを導入すれば実行日付を自動登録する機能が利用できるため、将来的にツールを導入した際には再度検討する予定です。また、QAチームがバグ調査を行う必要が生じた場合にも、改めて項目追加を議論することになりました。

# まとめ

テスト関連ツールを提供しているBrowserStackによると、以下の項目がテストケースにおける[標準項目](https://www.browserstack.com/guide/how-to-write-test-cases)とされています。

1.	ID
2.	シナリオ
3.	手順
4.	前提条件
5.	テストデータ
6.	期待値
7.	テスト結果
8.	テストステータス

「テスト結果」を独立した項目としては設けていませんが、代わりに「備考欄」がその役割を果たしています。

テストケースに含めるべき項目は企業ごとに異なりますが、重要なのはチームの業務やプロセスに合った項目を採用することです。今後も、テストケースで情報が不足していると感じた際には、必要な項目についてチームで改めて議論していきたいと思います。

---

# KIYOラーニング株式会社について

当社のビジョンは『世界一「学びやすく、分かりやすく、続けやすい」学習手段を提供する』ことです。革新的な教育サービスを作り成長させていく事で、オンライン教育分野でナンバーワンの存在となり、世界に展開していくことを目指しています。

https://kiyo-learning.com/

## プロダクト

* [スタディング](https://studying.jp/)：「学びやすく・わかりやすく・続けやすい」オンライン資格対策講座
* [スタディングキャリア](https://career.studying.jp/)：資格取得者の仕事探しやキャリア形成を支援する転職サービス
* [AirCourse](https://aircourse.com/)：受け放題の動画研修がついたeラーニングシステム（LMS）

### KIYOラーニング株式会社では一緒に働く仲間を募集しています

https://www.wantedly.com/companies/kiyo-learning/projects

https://herp.careers/v1/kiyolearning
【Python_osモジュール】プログラム内でWindows環境変数を読み込んでキー登録したい

## ▼環境変数設定
### ・Windows10/11：
①スタートメニューを右クリックし、「システム」を選択。
②「関連設定」の「システムの詳細設定」をクリック。
### ・Windows 7/8:
①「コンピューター」を右クリックし、「プロパティ」を選択します。
②「システムの詳細設定」をクリックします。
### ・以降Windows共通
③「システムのプロパティ」ウィンドウが開いたら、「詳細設定」タブを選択。
④「環境変数」ボタンをクリックします。
※システム環境変数: すべてのユーザーに適用
※ユーザー環境変数: 現在のユーザーのみに適用
⑤下記登録
・変数名: DATADOG_API_KEY
・変数値: Datadogで生成したAPIキーの値を入力
⑥環境変数の変更を反映させるために、コマンドプロンプトまたはPowerShellを再起動
⑦下記コマンドで反映確認
echo %DATADOG_API_KEY% (コマンドプロンプト)
echo $env:DATADOG_API_KEY (PowerShell)

## ▼Pythonで設定した環境変数を読み込み、APIやアプリケーションにキー登録
### DatadogAPIキーの取得例：
```php
import os
configuration = Configuration()
configuration.api_key['apiKeyAuth'] = os.environ.get'DATADOG_API_KEY'
configuration.api_key['appKeyAuth'] = os.environ.get'DATADOG_APP_KEY'
```

## ▼補足
セキュリティ上の理由から、コード内にAPIキーを直接記述(ハードコーディング)するのは推奨しないため、環境変数を使用する方が安全です。
ですが、結局暗化しないとハードコーディングとあまり変わらないので、暗号化したものを環境変数にして、利用する時は復号すること。
NEXT.JSにおいて、静的生成でエクスポートする際の注意点

## 1. サーバーサイド機能の制限

**ポイント:**

- API Routes、middlewareなどのサーバー機能が使えない

**対処方法:**

- API Routesの代わりに外部APIサービス（Firebase、Supabase等）を利用する
- ビルド時にデータを取得し、静的ファイルとして生成する

## 2. クライアントサイドハイドレーションの問題

**ポイント:**

- 初期表示時にクライアントサイドコンポーネントが正しくレンダリングされないことがある

**対処方法:**

- コンポーネントの初期化状態を明示的に管理し、初期化完了を監視する
- `useEffect`で初期化状態を検出し、状態によって表示を制御する
- ライブラリのAPIオブジェクト（例：カルーセルのAPI）が利用可能になったことを確認する
- プリローディングを実装し、アセットを先読みする

## 3. 画像処理と最適化

**ポイント:**

- Next.jsの`Image`コンポーネントによる自動最適化が使えない
- 画像のロードに関連する問題が発生しやすい

**対処方法:**

- `next.config.js`で`images: { unoptimized: true }`を設定する
- ビルド前に画像を事前に最適化しておく（WebP形式等に変換）
- 通常の`img`タグを使い、適切な`width`と`height`属性を設定する
- 画像のローディング状態を管理し、ロード完了後に表示する処理を実装する

## 4. データフェッチング

**ポイント:**

- `getServerSideProps`が使えない
- ビルド時にすべてのデータを取得する必要がある

**対処方法:**

- `getStaticProps`と`getStaticPaths`を使用してビルド時にデータをフェッチする
- 動的なデータはクライアントサイドで`useEffect`や`SWR`/`React Query`を使ってフェッチする
- 定期的にビルドを実行し、コンテンツを更新する（CI/CDパイプラインの設定）
- ISRの代わりに、ビルドフックを使って定期的に再ビルドをトリガーする

## 5. 動的ルーティング

**ポイント:**

- 動的ルートはビルド時にすべて生成しておく必要がある
- 後から追加されるコンテンツのURLが事前に分からない

**対処方法:**

- `getStaticPaths`で生成するパスを網羅的に指定する
- `fallback: false`で存在しないパスへのアクセスを404にする
- あるいは`fallback: true/blocking`にして、クライアントサイドでデータフェッチする実装を追加
- 新しいコンテンツが追加されたら再ビルドする仕組みを作る

## 6. 環境変数と設定

**ポイント:**

- サーバーサイド専用の環境変数が使用できない
- ビルド時の環境と実行時の環境の違いに注意が必要

**対処方法:**

- `NEXT_PUBLIC_`プレフィックスをつけた環境変数のみを使用する
- ビルド時に必要な値を`.env.production`などに定義する
- クライアントに公開してはいけない情報は、ビルド時にのみ使用し、出力に含めない
- `next.config.js`で`env`オプションを使って環境変数を明示的に定義する

## 7. クライアントステートの管理

**ポイント:**

- ページ間でのステート維持が難しくなる
- ハイドレーション不一致エラーが起きやすい

**対処方法:**

- `localStorage`や`sessionStorage`を使ってステートを保存する
- グローバルステート管理ライブラリ（Redux、ZustandなどのContext API）を使う
- ハイドレーション不一致を避けるため、サーバーサイドとクライアントサイドで同じ初期値を使う
- `useEffect`内で初期化コードを実行し、SSRではデフォルト値を使用する

## 8. スタイルとアセット

**ポイント:**

- CSSモジュールやスタイル読み込みの問題が起きることがある
- アセットパスの指定方法に注意が必要

**対処方法:**

- スタイルは`className`を使う（インラインスタイルは避ける）
- アセットパスは常に`public`ディレクトリからの相対パスで指定する
- フォントや大きなアセットは事前に最適化しておく
- Tailwind CSSなどのユーティリティファーストCSSを使うと安全

## 9. パフォーマンス最適化

**ポイント:**

- サーバーサイドの最適化がない分、クライアントの負荷が大きくなりがち
- 大規模サイトだとビルド時間が長くなる

**対処方法:**

- コード分割を活用し、必要なJavaScriptのみロードするようにする
- 重いライブラリは動的インポート（`next/dynamic`）を使用する
- Lighthouseなどでパフォーマンス測定を行い、最適化する
- ビルドを高速化するため、`next.config.js`で`swcMinify: true`を設定する
Gitを2.49.0に更新したら、ミラーレポジトリとしてcloneできなかった話


# 序文
Gitを2.49.0に更新したら、ミラーレポジトリとしてcloneできなかったという、お話です。(fatal: multiple updates for ref 'refs/tags/...' not allowed)  

検索してでてきた次のお話とは、別のお話です。
[Gitを2.21.0にアップデートしたらcloneできなくなった話(fatal: multiple updates for ref 'refs/remotes/origin/master' not allowed) #homebrew - Qiita](https://qiita.com/ZOLLVEREIN1213/items/10159a102344c97b7b70)

上記のケースでは
```gitconfig
[remote "origin"]
    fetch = +refs/heads/*:refs/remotes/origin/*
```
といった設定がある場合に、
```sh
git config --global --unset remote.origin.fetch
```

などで、上記設定を取り除けばいいという、解決策（回避策？）が案内されていたようです。2019年ころのお話でした。  
今回のケースは上記ケースと異なり`git 2.49.0`でmirrorオプションとbranchオプションを合わせて指定している場合に、cloneが止まってしまうケースがあるというお話です。

実例として、Fcitx-Mozcのレポジトリで説明します。
```sh
git clone --filter=tree:0 --mirror --branch fcitx https://github.com/fcitx/mozc.git fcitx-mozc
```

```log
fatal: multiple updates for ref 'refs/tags/fcitx-mozc-1.10.1390.102.1' not allowed
```
上記のようなエラーが出て処理が止まります。  

ちなみにbareオプションだとエラーがでず、cloneできました。（2.49.0よりも前のgitだと、mirrorオプションを用いた上記コマンドでcloneできていました。）
```sh
git clone --filter=tree:0 --bare --branch fcitx https://github.com/fcitx/mozc.git fcitx-mozc
```

## 回避策
`git 2.49.0`でmirrorオプションでcloneする場合、branchを指定したい場合には、--single-branchオプションも追加しましょう。または、そもそもbranch指定を行わないというのが、今回の回避策になります。
```sh
git clone --filter=tree:0 --mirror --branch fcitx --single-branch https://github.com/fcitx/mozc.git fcitx-mozc
```
```sh
git clone --filter=tree:0 --mirror https://github.com/fcitx/mozc.git fcitx-mozc
```
GoogleCheomeの設定をドメインのグループポリシーで設定する

# 初めに
ドメインに参加しているPCについて、ドメイングループポリシーにて一括制御したいと思うことがありました。ただ、調べてみるとローカルグループポリシーでの制御方法ばかりが出てきます。
　そこで、試行錯誤してドメイングループポリシーでの適用方法がわかりましたので自分への覚書として書き留めます（ご覧になる方、すみません。急いで書きあげましたので若干雑になっておりますがご容赦ください）

# 適用方法
１．下記サイトへアクセスする

　https://support.google.com/chrome/a/answer/187202?hl=ja#zippy=%2Cwindows

２．「Google ChromeのテンプレートとドキュメントのZIPファイル」部分（赤枠内）をクリックし、ポリシーファイルをダウンロードする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434774/45e8764e-8c4f-40a3-ac03-3f7a78f4ef68.png)

３．任意のフォルダ保存し、展開を行う。

４．policy_templates\windows\admx内の
「chrome.admx」及び「google.admx」を「c:\Windows\SYSVOL\domain\Policies」フォルダに配置する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434774/b2655860-f385-4802-8662-a932966cc386.png)

５. 展開したフォルダの「policy_templates\windows\admx\ja-JP」内の「chrome.adml」「google.adml」を「c:\Windows\SYSVOL\domain\Policies\ja-JP」フォルダ内に配置する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434774/3f67cfb3-008d-4cb1-8e46-f26d319bddd7.png)


６．グループポリシー管理ツールを使用し、「default_policy」を編集する。
Memento

Mementoはインスタンスの状態をカプセル化の破壊を起こさずに別のインスタンスに保存して復元したりすることができる。MementoクラスはOriginatorクラスの情報を保存して、アクセスされないようにしておくクラスであり、またOriginatorクラスは保存しておいたMementoのインスタンスを受け取ることで復元できる。
Processingのビデオ録画はXBox厳禁！

# 概要
OpenCVやメディアアートなど動くものをビデオにしたい場合、多くはXBoxの録画機能を使うことが多いと思います。しかし、Processingは簡単なコードだけでビデオキャプチャができます。

## 手順
やり方は以下の通りです。
<ol>
    <li>コード記入
    <li>プログラム実行
    <li>ムービーメーカーでmp4形式の動画作成
</ol>

## コード記入
まず、ビデオ撮影のためにフレームを取り出します。
Processingでは以下のコードをdraw関数内に記入します。
```
saveFrame("frames/######.png");
```
例えば1フレーム目の場合、"frames/000001.png"と生成されます。

## プログラム実行
プログラムを実行すると、実行時から順番にフレームを切り出してくれます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1226429/eb05f86d-defa-405a-851e-bbdd1cc17bcf.png" width="60%"><br>

一回、描画画面を閉じます。

そうすると以下のように保存されました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1226429/e0b430ed-fcc7-43f1-b488-0dfcc554106c.png" width="60%"><br>

## ムービーメーカーでmp4形式の動画作成
フレーム切り出しただけでは、動画は作ることができません。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1226429/e36eead8-fdc9-43dd-b206-6f5b17175198.png" width="60%"><br>

そこで、上のタブの「ツール」から「ムービーメーカー」をクリックします。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1226429/bf6a6b70-81d1-485b-9d6c-f3130bab8dc4.png" width="60%"><br>

好きなディレクトリを設定して「動画を作成」をクリックすると、ディレクトリ上に動画を生成してくれます。

保存したframeから以下のような動画生成が可能です。
<iframe width="560" height="315" src="https://www.youtube.com/embed/3qZgf8-J3Tk?si=f_MZ0TAaQQq1yTGW" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

# まとめ
上記のようにProcessingで簡単にビデオ作成できるので、XBoxの録画ツールよりも便利です。また、PythonのOpenCVやPygameでも録画機能を使えますので、普通のビデオキャプチャよりもおすすめです！
Observer

Observerはクラスの変更があった時通知として受け取って変更に応じた処理ができるようになる。Subjectクラスは観察される被験者地なるクラスで変更があるとupdateメソッドを呼び出してObserverクラスに知らせることができる。（メソッドを呼び出して別のクラスに通信を行うという点でMeditatorに共通する）
wslでelixir その164

# 概要
wsl(wsl2じゃない)で、elixirやってみた。
練習問題やってみた。

# 練習問題
Livebookの、kino.jsで、Live2dを動作させよ。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/86e4f546-c7c0-46ab-840e-04e68e43d437.png)
 
# サンプルコード

```
defmodule KinoHTML.Live2d do
  use Kino.JS
	def new(toolbox) do
		Kino.JS.new(__MODULE__, toolbox)
	end
	asset "main.js" do
		"""
		export async function init(ctx, toolbox) {
      await ctx.importJS("https://cubism.live2d.com/sdk-web/cubismcore/live2dcubismcore.min.js")
      await ctx.importJS("https://cdn.jsdelivr.net/gh/dylanNew/live2d/webgl/Live2D/lib/live2d.min.js")
      await ctx.importJS("https://cdn.jsdelivr.net/npm/pixi.js@6.5.2/dist/browser/pixi.min.js")
      await ctx.importJS("https://cdn.jsdelivr.net/npm/pixi-live2d-display/dist/index.min.js")
      ctx.root.innerHTML = `
            <canvas id="canvas" style="height: 480px; width: 600px;"></canvas>
			`;
      const cubism2Model = "https://cdn.jsdelivr.net/gh/guansss/pixi-live2d-display/test/assets/shizuku/shizuku.model.json";
      (async function main2() {
        const app = new PIXI.Application({
          view: document.getElementById("canvas"),
          autoStart: true,
          resizeTo: window
        });
        const model2 = await PIXI.live2d.Live2DModel.from(cubism2Model);
        app.stage.addChild(model2);
        model2.scale.set(0.3);
      })();
    }
    """
  end
end

KinoHTML.Live2d.new(0)

```

以上。
各社iOSアプリ用Managed App Config解説ページのリンク集

ただのリンク集ですけれども～
英語の記事が殆どとか公開されてる情報が少ないとかあって探すのが大変なので纏めてみました。

## Managed App Configurationとは
MDMから管理アプリを配信する際に固有のパラメータを追加して配信することができます。
自社ドメインでのログインを強制し、野良アカウントでのログインを防いだりできます。
設定の仕方はご利用のMDMベンダーのヘルプを参照下さいまし。

Androidにもある機能ですがそちらは詳しくないのでiOS用のみです。
見付けたら追記していきます。
またWeb上から拾ってきた情報を列挙しているだけであり、
全てのアプリのついて動作をテストした訳ではないのでその点もご了承下さい。
コメントでもどんどん指摘して頂ければと～

## 各社の解説ページのリンク集
### Acrobat :flag_us:
https://experienceleague.adobe.com/landing/acrobat-mobile-deployment/appconfig.html

### Atrassian :flag_us:
https://support.atlassian.com/security-and-access-policies/docs/what-are-the-appconfig-settings-for-mdm/

### Box :flag_jp:
https://support.box.com/hc/ja/articles/18839684244499-MDM

### Chrome :flag_us:
https://www.chromium.org/administrators/ios-mdm-policy-format/

### LINE WORKS :flag_jp:
https://help.worksmobile.com/ja/admin-guides/security/mobile-security/3rd-party-mdm/

### Microsoft製品（Intuneでないと駄目かも）:flag_jp:
https://learn.microsoft.com/ja-jp/mem/intune-service/apps/app-configuration-policies-use-ios#allow-only-configured-organization-accounts-in-apps

https://learn.microsoft.com/ja-jp/intune/intune-service/apps/manage-microsoft-edge

https://learn.microsoft.com/ja-jp/exchange/clients-and-mobile-in-exchange-online/outlook-for-ios-and-android/outlook-for-ios-and-android-configuration-with-microsoft-intune#configuration-keys

### Mattermost :flag_us:
https://docs.mattermost.com/deploy/mobile/deploy-mobile-apps-using-emm-provider.html

### Netscope :flag_us:
https://docs.netskope.com/en/deploy-client-on-ios-using-intune/

### SalesForce :flag_us:
https://help.salesforce.com/s/articleView?id=xcloud.mobile_security_mdm_plist.htm&type=5

### ServiceNow :flag_jp:
https://www.servicenow.com/docs/ja-JP/bundle/yokohama-mobile/page/administer/tablet-mobile-ui/reference/appconfig.html

### Slack :flag_jp:
https://slack.com/intl/ja-jp/help/articles/115002579426-OrG-%E3%81%AE%E3%82%A8%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%97%E3%83%A9%E3%82%A4%E3%82%BA%E3%83%A2%E3%83%93%E3%83%AA%E3%83%86%E3%82%A3%E7%AE%A1%E7%90%86%E3%82%92%E6%9C%89%E5%8A%B9%E3%81%AB%E3%81%99%E3%82%8B

### Tableau :flag_us:
https://help.tableau.com/current/mobile/mobile-admin/en-us/admin_mobile_ace.htm

### Webex Meeting :flag_jp:
https://help.webex.com/ja-jp/article/nafabti/%E3%83%A2%E3%83%90%E3%82%A4%E3%83%AB-%E3%83%87%E3%83%90%E3%82%A4%E3%82%B9%E3%81%AE%E7%AE%A1%E7%90%86%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6-Webex-Meetings-%E3%82%92%E6%A7%8B%E6%88%90%E3%81%99%E3%82%8B

### Zscaler :flag_jp:
https://help.zscaler.com/ja/zscaler-client-connector/deploying-zscaler-client-connector-microsoft-intune-ios

### Zoom :flag_jp:
https://support.zoom.com/hc/ja/article?id=zm_kb&sysparm_article=KB0064103
自分のGitHubリポジトリを紹介したい！

## 自分のGitHubリポジトリを紹介したい！

どうも”sakana-max”です。
身勝手かもしれませんが、自分のリポジトリを紹介させてください
リポジトリ名:Image_information_embedder
リンク:https://github.com/sakana-max/Image_information_embedder

リポジトリの改善点などを指摘してくださると助かります。

### 作ったもの

私が作ったものは、画像を崩さずに任意のファイルを埋め込み、読み込むプログラムです。
### 注意！

絶対に黒いことには使わないでください！責任取りませんよ！
### 詳細

まずPythonで書かれてます。

画像を崩さないで情報を埋め込む方法は画像のRGBの偶数奇数によって0と1を記録するといったものです。(下位ビット変換とかとほぼ同じ)

これにより1ピクセルに３ビットの情報を書き込めます。

そして、これにより様々なファイルを画像に埋め込み読み込むことができます！

**GUI環境あり←＊これ重要**

### 使い方。

申し訳ありませんが、リポジトリのリンクから参照してください。
英語ですので、グーグル翻訳等で翻訳してください。

### 方針
開発を予定していることは


-1透明度への情報書き込み

等が主な内容です。

**このリポジトリに貢献することを歓迎します！**
プルリクエストとかは英語と日本語両方で書くといろんな国の人が見やすくていいかも。

ピンポイントな質問はこっちのコメントでも、GitHubの方でもじゃんじゃん書いて下さい！
ブルースクリーン「KERNEL SECURITY CHECK FAILURE」について

# 概要
Windowsのブルースクリーン「KERNEL SECURITY CHECK FAILURE」が発生したので、備忘録として記載しました。

# 現象
業務中、Visual Studioを使用してデバッグしている際に、急に「KERNEL SECURITY CHECK FAILURE」というブルースクリーンが出ました。
また、「100％完了」という文字が出ても一向に再起動せず、同じ画面の状態でした。

# 原因
「KERNEL SECURITY CHECK FAILURE」はWindowsのブルースクリーンエラーのひとつで、メモリやドライバに不具合が出ていたり、ハードウェアの故障などが原因で発生するらしいです。
また、PCを落としたり、パソコンに水をこぼしたり、5年程度使用していることへの劣化 (パソコンの寿命) によっても発生します。
寿命の兆候としては、フォルダやファイル等ハードディスクのデータをクリックした際のデータ読み取りや書き込みの速度が極端に低下していたり、PCから「カチカチ」や「ジー」などという異音がすることが挙げられます。
加えて、Windows Updateが失敗した際も出る場合があるらしいです。

# 予兆
自分の場合はPCを落としたり、水をこぼしたりはありませんでした。ただWindows10からWindows11にアップデートしてから凄く動作が遅くなり、フォルダを開いたりメモ帳にテキストを入力するだけでもとんでもない時間が掛かってしまう場合がありました。
※いつもではなく、一時間に数回ほど、凄く遅くなるタイミングが5、6分ほどあり、そのタイミングではほぼ何も操作できないような状態でした。また、アップデートした最初よりも徐々にそのような状態に陥る頻度が増えてきたような形でした。

# 自分が解消した方法
強制再起動しかありませんでした。。
[現象](#現象)にも記載した通り、自分の場合は「100％完了」という状態のまま再起動がされませんでした。そのため電源ボタンを長押しして一度停止させました。少し時間をおいてから再度電源ボタンを押してPCを起動させました。
ただ自分はこの方法でPCが起動されましたが、この方法で再起動しようとすると、画面が起動しなくなったりと上手くいかなくなり手に負えないことになる場合もあるそうです。またPCが一度起動したからと言って、再度ブルースクリーンになる可能性もあります。

# 今後の対策
### PCについて
自分が使用していたPCはメモリは32GBを積んでおりハードディスクの空きも150GB以上ありましたが、製造されてから6年ほど経過しており、CPUがよく100％になっていました。6年間ほぼ毎日使用されていたPCだったためPCの寿命というところも濃厚そうでした。なので今のうちにPC自体を新しいものに変える、という方針が良さそうかと思っています。

### ハードディスクのファイルについて
ハードディスクは1TBあり、その中に大事なファイルをたくさんおいていましたので、ブルースクリーン中はPCが二度と起動しなかったら...という焦りがありました。
クラウド等にバックアップできるものは、ハードディスク以外の場所にバックアップしておくことが大事だと感じました。

### その他
ブルースクリーンになって数分後に、客先の方から大事なご連絡をいただきました。PCがまったく動かなかったのですが、文章のやりとりだけで済んだので、スマホでも応答ができました。
客先の方と連絡を取るツールをスマホにもインストールしていてよかったと思いました。

# 参考
- [「KERNEL SECURITY CHECK FAILURE」エラーの原因と対処法を解説](https://www.ino-inc.com/data_check/pc/kernel-security-check-failure.php)
- [KERNEL SECURITY CHECK FAILUREエラーの原因と対処法](https://cybersecurity-jp.com/contents/data-security/8226/)
- [Blue Screen Error- KERNEL_SECURITY_CHECK_FAILURE in windows 10 .](https://answers.microsoft.com/en-us/windows/forum/all/blue-screen-error-kernelsecuritycheckfailure-in/f3ae13bc-723b-40f3-a92e-86e7aa7d9370)
- [PC bluescreening with "Kernel Security Check Failure"](https://www.reddit.com/r/techsupport/comments/epm3hs/pc_bluescreening_with_kernel_security_check/)
- [頻発してたブルースクリーンに最善をつくしてみた｜Kernel Security Check Failure](https://note.com/usausan/n/n2b2f6889457d)
Draw.io（ブラウザアプリ）でミニマルを選択したらメニューバーが消えてしまった。

見た目が変えられる事を知ったのでちょっといじってました。
メニューバーにある、「拡張」＞「テーマ」＞「ミニマル」にしたらメニューバーが消えてしまったという話です。

![スクリーンショット 2025-03-18 153051.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213689/79a93585-f5fa-495e-aeaa-c7b243d16ff8.png)

左上の「ダイアグラム」から「Settings」があり、そこからテーマを戻せませした。
![スクリーンショット 2025-03-18 153553.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213689/d720a470-d5f9-4c24-a3ad-f14544dcd9cc.png)



なんでこんなことやっちゃったんだろう。

調べてもなかなか見つからなかったので、メモです。
若者から見たIBM i

## はじめに
本稿は、IBM iを初めて扱う新入社員の率直な感想についてまとめています。 内容はあくまで初心者視点の意見であり、必ずしも正確な知識ではないことをあらかじめご了承ください。また、年齢的には若者と言えるか微妙ですが、その点もご容赦ください。


本稿は、自己紹介も兼ねています。よろしくお願いします。


***


## 私について
私はIT企業に入社して1年目の新人です。大学でコンピュータサイエンスを学んだわけでもない、25歳の社会人です。そんな私から見たIBMという企業や製品についての率直な感想が、誰かの参考になれば幸いです。


## IBMについて
現在の仕事に就くまでは、IBMに対して「遠くもなく、近くもない」という印象でした。親戚がIBMに勤めていた影響で、漠然と「海外の有名なIT企業」という認識はあったものの、具体的にどんな製品を扱っているのかは全く知りませんでした。


## 経緯
業務でIBM製品に触れる機会がありました。使用したのは IBM Power S1012 で、主に構築業務を行いましたが、1年目の私ができることは限られており、上司の作業を見ながら手順書を作成する程度でした。


それでも、重厚感のある機体に触れた際にはすごく興奮しました。上司は「薄いね」「静かだね」とおっしゃっていました。IBM製品初見の私には「ごついな」「ジェット機かな（飛び立ちそう）」と思っていました。


上司の勧めで e-BELLNET.com の記事や、同世代の 古閑さくらさん ( @koga39chan ) のQiita記事を読み、私も何か発信し記録して、同じように学び始める人たちの役に立ちたいと思い、本稿を書くことにしました。


## あの黒画面を若者はどう感じるか
黒の背景に緑の文字。


私の第一印象は「カッコイイ！」でした。映画やドラマ、そして学生時代にハマっていたゲーム「Falloutシリーズ」を彷彿とさせ、まさに「IT企業に来た！」という感覚を味わいました。


「**ダム端末**」と呼ばれる、この画面（厳密にはダム端末ではなく、5250エミュレータの画面）。ダムは英語で「馬鹿」を表すようで、反対に「インテリジェント端末」とやらもあるそうです。こう言った命名も大変IT用語っぽくて好きです。またどこかでちゃんと取り上げたいです。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3953056/55620f04-5509-4b84-a19d-6d7cd95b6067.png)
( https://www.wikiwand.com/fr/articles/IBM_i ) より引用


記事「IBM iとは」（ https://www.e-bellnet.com/what-is-ibmi/introduction.html ）では、「**レガシー**」という課題について言及されていました。IBMは100年以上の歴史を持つ企業であり、エンジニアの平均年齢も高めです。そのため、私たちの世代が触れる機会は少なく、むしろ他の製品に触れたことのある方がほとんどだと思います。しかし、実際に触れてみると、今まで見たことのないシステムに対して「もっと学びたい！知りたい！」という気持ちが湧きました。


## 初学者には、まだまだハードルが高い
IBM iのメインメニューに初めて到達した時、「何をどうすればいいのか？」と戸惑いました。調べても英語のドキュメントが多く、初心者には難解でした。正直「初心者には敷居が高い」という印象です。


これからは、わからなかったことやつまずいたことを記録し、同じように困っている人の助けになれればと思っています。まだまだ未熟者ではありますが、表面的な理解にとどまらず、深く理解していきたいと思っています。

***

## 更新日付
投稿日：2025年3月18日（火）
更新日：2025年3月21日（金）URL, 更新日付の追加
更新日：2025年3月26日（水）文章の追加
更新日：2025年4月4日（金）文章の一部修正
メンバーとリーダーって何が違うの？

## 1. 何が違う？
組織やチームにおいて「メンバー」と「リーダー」には、それぞれ異なる役割があります。

- **メンバー**: 指示を受けて実行し、チームの目標達成に貢献する
- **リーダー**: チームを率い、目標を設定し、メンバーをサポートする

リーダーは全体の方向性を決め、メンバーはその方針に沿って実行する役割を担います。ただし、優れたリーダーはメンバーの意見を尊重し、共にチームを成長させる存在でもあります。

また、メンバーとリーダーの違いは、単なる役職の違いではなく、思考や行動のアプローチにも影響します。メンバーは個々の業務に集中し、成果を上げることが求められるのに対し、リーダーは全体を見渡し、チームとしての成果を最大化することが求められます。

## 2. タスク内容の違い

| 役割      | 主なタスク |
|-----------|-----------|
| メンバー | 指示された業務の遂行、スキル向上、チームへの貢献、チームの一員としての協力、フィードバックの提供 |
| リーダー | 目標設定、計画策定、意思決定、メンバーのサポートと育成、進捗管理、タスク割り振り、成果物のレビュー、報告/相談、チームのモチベーション管理、問題解決、リスクマネジメント |

メンバーは与えられたタスクを適切にこなし、自身の成長を通じてチームに貢献します。一方、リーダーはメンバーのスキルや適性を考慮しながら業務を配分し、全体の進行を管理することが重要です。

また、リーダーはチームの心理的安全性を確保し、メンバーが自由に意見を言える環境を整える役割も果たします。これにより、チームの創造性や問題解決能力が向上し、より高い成果を生み出すことができます。

## 3. 気をつけること

### メンバーが意識すべきこと
- 自分の役割を理解し、責任を持って行動する
- 自発的に学び、成長する意識を持つ
- チームワークを大切にし、他のメンバーと協力する
- 自分の意見を積極的に発信し、改善に貢献する
- フィードバックを受け入れ、柔軟に対応する

### リーダーが意識すべきこと
- チーム全体の成果を考え、バランスよく指示を出す
- メンバーの強みを活かし、適材適所に配置する
- 信頼関係を築き、オープンなコミュニケーションを促す
- 問題発生時に冷静に対応し、適切な解決策を考える
- メンバーのモチベーションを維持し、成長の機会を提供する
- 必要に応じてフィードバックを与え、チームの改善を促す

リーダーとメンバーが互いの役割を理解し、意識的に行動することで、チームの生産性と雰囲気が大きく向上します。

## 4. いいチームの条件

良いチームを作るためには、リーダーとメンバーが互いに補い合う関係が重要です。

### いいチームの特徴
- **明確な目標がある**: 何を達成すべきかが共有されている
- **役割分担が適切**: メンバーの強みが活かされている
- **信頼関係がある**: 意見を言いやすく、助け合える雰囲気がある
- **成長できる環境がある**: 挑戦と学びの機会がある
- **適切なフィードバックがある**: 改善のための意見交換が活発に行われる
- **柔軟な対応が可能**: 状況の変化に応じて、迅速に方針を調整できる
- **共通の価値観がある**: チーム全体で大切にする考え方が一致している

リーダーはチームの方向性を示し、メンバーは主体的に動くことで、より強いチームが生まれます。特に、メンバーが自分の役割を理解し、責任を持って行動することが、チームの成功に大きく寄与します。

また、良いチームは成果だけでなく、メンバーが働きやすい環境を持つことも重要です。適切なコミュニケーションやサポート体制を整えることで、長期的に成果を出せるチームになります。

---

メンバーとリーダー、それぞれの違いを理解し、適切な行動を取ることで、チームの成果は大きく向上します。自分の立場を理解し、役割を果たすことを意識しましょう！

チームの一員としてどのように貢献できるか、またリーダーとしてどのようにチームを支えられるかを考えながら、成長していくことが重要です。
【SpringBoot】CRUD

# CRUD

ツール：Eclipse

CRUDとは、データを操作するときに必要な最低限の機能である

・登録機能（「C」reate）
・参照機能（「R」ead）
・変更機能（「U」pdate）
・削除機能（「D」elete）

の4つを一緒くたにした表現

Spring BootのCRUD機能を実際に作ってみましょう。
前の章では登録機能を作成したので、そのほかの機能の作成しましょう。

## 1.Viewを作成します。
/demo/src/main/resources/templatesを右クリック > 新規 > その他 > WEB > HTMLファイル
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3279952/a1126a97-45e3-46ec-a639-1885a605bc85.png)

```diff_java:/demo/src/main/java/com/example/demo/TodoController.java
	package com.example.demo;				
					
	import org.springframework.stereotype.Controller;				
	import org.springframework.web.bind.annotation.GetMapping;				
	import org.springframework.web.bind.annotation.PathVariable;				
	import org.springframework.web.bind.annotation.PostMapping;				
	import org.springframework.web.servlet.ModelAndView;				
					
	@Controller				
	public class TodoController {				
                    ・
				    ・
	    			・

+	    @GetMapping("/{id}")				
+	    //　パスパラメータを受け取るアノテーション				
+	    public ModelAndView edit (@PathVariable Long id) {				
+	        ModelAndView mav = new ModelAndView();				
+	        				
+	        mav.addObject("todo", repository.findById(id));				
+	        				
+	        mav.setViewName("edit");				
+	        				
+	        return mav;				
+	    }				
+	    				
+	    //　わかりやすくstoreメソッドと分けていますが、一緒でも動作します。   				
+	    @PostMapping("/{id}")				
+	    public String update (Todo todo) {				
+	        repository.save(todo);				
+	        				
+	        return "redirect:/";				
+	    }				
+	    @PostMapping("/delete/{id}")				
+	    //　パスパラメータを受け取るアノテーション				
+	    public String delete (@PathVariable Long id) {				
+	        repository.deleteById(id);				
+	        				
+	        return "redirect:/";				
+	    }				
+	    				
	}				
					
```

``` diff_html:/demo/src/main/resources/templates/edit.html
	<!DOCTYPE html>
	<html>
	<head>
+	    <meta charset="UTF-8">
+	    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+	    <title>編集画面</title>
+	    <link th:href="@{/css/style.css}" rel="stylesheet">
	</head>
	<body>
+	    <div class="container">
+	        <h2>編集画面</h2>
+	        <form method="post" th:action="@{/*{id}}" th:object="${todo}">
+	            <input type="text" placeholder="タイトルを入力..." th:field="*{title}">
+	            <br>
+	            <textarea rows="4" placeholder="メモを入力..." th:field="*{memo}"></textarea>
+	            <br>
+	            <button type="submit">編集</button>
+	        </form>
+	    </div>
	</body>
	</html>
```
アプリケーションを実行します。

http://localhost:8080/

次はValidationについてです。
ChatGPTで引越し先を選定してみた

## はじめに
こんにちは！今回は「引越し先をどう選べばいいかわからない…」という方に向けて、ChatGPTを使って家賃や初期費用、広さのコスパなどを比較してみたお話を共有します。  
わたしは計算をするのは得意だけど、「どのような指標を見て物件を比べたらいいんだろう…？」と迷うことがよくあり
ました。  
そこで、ChatGPTに頼りながら、以下のような項目で家を比較することにしました。

- 駅からの距離  
- 家賃・管理費・駐車場代の合計  
- 礼金や敷金など初期費用  
- 2年間など一定期間の総支払い  
- 広さ（㎡あたりのコスパ）

今回のデータは実際にあった物件情報を元にしていますが、個人情報保護のために詳細はぼかしています。  

## 今回比較した物件たち
複数の物件（以下「物件A」「物件B」「物件C」）を比較しましたが、個人情報保護の観点から詳細な住所や建物名、具体的な金額などは伏せさせていただきます。  

## 実際に使った計算式
ChatGPTに教えてもらいながら、下記の計算式でいろいろ比べてみました。

- **礼金の月割り**  
  ```
  礼金 ÷ 24
  ```
  （2年間で分割した例）

- **保証金（実質初期費用）の月割り**  
  ```
  (契約時費用 - (礼金 + 敷金)) ÷ 24
  ```
  ※「契約時費用 - (礼金 + 敷金)」で出る金額は返還されない費用という前提。

- **月額支払い合計**  
  ```
  家賃 + 管理費 + 駐車場代 + 礼金の月割り + 保証金の月割り
  ```

- **2年間の総額**  
  ```
  月額支払い合計 × 24
  ```

- **実質初期費用**  
  ```
  契約時費用 - (礼金 + 敷金)
  ```
  ※「礼金は月額家賃で償却・敷金は戻ってくるかもしれないので差し引く

- **広さのコスパ (円/㎡・月)**  
  ```
  月額支払い合計 ÷ 専有面積(㎡)
  ```

## ChatGPTによる比較ポイント

### 1. 駅からの距離
徒歩何分かを比較すると、毎日の通勤・通学や買い物などの利便性に直結するのでとても重要な要素ですね。

### 2. 広さのコスパ (円/㎡・月)
家賃や管理費、駐車場代、初期費用の月割りなどを合計した金額を「1㎡あたり」で割ると、同じ家賃でも広さが違えばコスパが全然変わるということがよくわかります。

### 3. 2年間の総額
「月々の支払い合計 × 24」で算出すると、2年間でどれくらいかかるのかイメージが明確になります。月単位で安く見えても、駐車場代などの積み上げで結構な差が出る場合も。

### 4. 実質の初期費用
「契約時費用 - (礼金 + 敷金)」で、退去時に返ってこない額が見える化できます。最初にドカッとお金を用意しなければならないのはどの物件か、判断材料になりますね。

## 実施にChatGPTでした質問内容

```
下記の情報から住居のコスパを比較したいです。
礼金を月々に割り当てて、
家賃、管理費、保証金を合計した月々の支払いと、
2年間の総額、礼金と敷金を引いた実質の初期費用、
広さのコスパ、駅からの距離、周辺環境をPythonで分析してください。
分析した結果を、駅からの距離、広さのコスパ、二年間の総額、実質の初期費用の順で比較してください
```

## 最終的な考察
- **駅近重視**なのか  
- **広さのコスパ重視**なのか  
- **2年間など一定期間での総額**を抑えたいのか  
- **初期費用**を抑えたいのか  

そういった優先順位によって選択肢は変わると思いますが、ChatGPTを使って比較の基準を明確にすると、意外な発見があって面白いですよ。

## まとめ
今回、ChatGPTに「どこを比較すればいいか教えて！」と助けてもらいながら、上記の計算式を用いて家賃や初期費用、広さのコスパなどを整理しました。数字だけで見ても、物件ごとに大きな差があることがわかります。最終的には内覧などで現地の雰囲気をチェックするのが大切ですが、まずはこのような数値化で考えると、物件選びの候補が絞りやすくなるのではないでしょうか。

## 最後に
この記事が役に立ったら、ぜひ「LGTM」してくれると嬉しいです！ 💖  
では、また次回の記事でお会いしましょう👋
UnhandledPromiseRejectionにご注意



Lambdaでのこと。
長い通信をパスしたくて、axiosで下記のような書き方をした。
うおおおおおおお脳死try-catch！！！！！


```JS:
try {
    axios.post(requestUrl, params, {
      headers: {
        "Content-Type": "application/json",
        "X-API-KEY": api_key,
      }
    })
      .then(result => {
    	// ...
        console.log(result.data);
      })
}catch(e){
	console.error('failed',e)
}
```

これでは、try-catchブロックは機能しませんね。

結果、axiosが失敗するとプロセス落ちして502行き。さよなら....。

### UnhandledPromiseRejection

>最近リリースされたNode.js 15ではデフォルトの設定が変更され、Unhandled Rejectionが発生した際にプロセスが強制終了されるようになりました。
>https://zenn.dev/uhyo/articles/unhandled-rejection-understanding

await にしていない時点でtry-catchは機能しない。

下記のように修正する

```
axios.post(requestUrl, params, {
      headers: {
        "Content-Type": "application/json",
        "X-API-KEY": api_key,
      }
    })
      .then(result => {
	// ...
        console.log(result.data);
      })
	.catch(e => {
	console.error('failed',e)
	})
```

これでaxiosのエラーはcatchチェーンが受け止めてくれるようになった。

...そもそも長い処理はキューに入れましょう。AWSの意味ないやん。
Argo CD Helm Redis のパスワードについて少し触れてみた

## 【調査メモ】Argo CD Helm Redis のパスワード管理、どうしていますか？安全な管理方法と変更手順

こんにちは、皆さん。今回は Argo CD で Helm を使用して Redis をデプロイしている方向けに、Redis のパスワード管理と変更方法について解説します。

### 調査経緯：Argo CD Redis のパスワードの仕組みを知りたい！

今回の記事作成のきっかけは、「Argo CD でデプロイした Redis のパスワード管理はどうなっているんだろう？」という疑問でした。

### Redis のパスワード管理、なぜ重要？

Redis はバージョン 6.10 からセキュリティ向上のため、パスワード認証が必須になりました。これは、脆弱性 (GHSA-9766-5277-j5hr) への対策として導入されたものです。

Argo CD Helm チャートを使用している場合、デフォルトでは `argocd-redis` という Kubernetes Secret に Redis のパスワードが保存されます。この Secret は `redis-secret-init` という Job によって自動生成され、初期パスワードが設定されます。

しかし、セキュリティ要件や運用ポリシーによっては、デフォルトの管理方法では不十分な場合もあります。

### パスワード変更手順

Argo CD Helm チャートを使用している場合、Redis のパスワードを変更する手順は以下の通りです。

1.  Argo CD がインストールされた名前空間で `argocd-redis` Secret を削除します。

    ```bash
    kubectl delete secret argocd-redis -n <argocd 名前空間>
    ```

2.  Helm アップグレードを実行します。

    ```bash
    helm upgrade argocd argo/argo-cd --reuse-values --wait
    ```

3.  Redis 実行モードに応じて Redis を再起動します。

    * HA モードの場合:

        ```bash
        kubectl rollout restart deployment argocd-redis-ha-haproxy
        kubectl rollout restart statefulset argocd-redis-ha-server
        ```

    * 非 HA モードの場合:

        ```bash
        kubectl rollout restart deployment argocd-redis
        ```

4.  Argo CD の他のコンポーネントを再起動します。

    ```bash
    kubectl rollout restart deployment argocd-server argocd-repo-server
    kubectl rollout restart statefulset argocd-application-controller
    ```

### より安全なパスワード管理のために

パスワード管理方法を変更する際は、以下の点に注意してセキュリティを確保しましょう。

* **安全なパスワード生成:**
    * 強力なパスワード生成ツールを使用し、推測されにくいパスワードを作成しましょう。
* **パスワードのローテーション:**
    * 定期的にパスワードを変更し、漏洩時のリスクを軽減しましょう。
* **シークレット管理:**
    * Kubernetes Secret は適切にアクセス制御し、不要な権限を持つユーザーからのアクセスを防ぎましょう。

### まとめ

今回は Argo CD Helm Redis のパスワード管理と変更方法について解説しました。セキュリティ要件に合わせて適切な管理方法を選択し、安全な Redis 運用を実現しましょう。

ご不明な点やご質問がありましたら、お気軽にコメント欄にご記入ください。

### パスワード管理方法の代替案

デフォルトのパスワード管理方法に対する代替案として、以下の方法も考えられます。

1.  **`argocd-redis` Secret を直接生成する**
    * `redis-secret-init` Job を無効化し、必要なパスワードで `argocd-redis` Secret を直接作成します。
    * この方法は、パスワードを柔軟に管理できる一方で、Secret の管理に注意が必要です。
2.  **外部 Redis を利用する**
    * Helm チャートの設定で、外部の Redis サーバーを指定できます。
    * これにより、Redis の運用管理を外部に委ねることができます。
    * 設定箇所：`externalRedis.host`, `externalRedis.port`,`externalRedis.username`,  `externalRedis.password` など

### 参考資料

* [Argo CD Helm Chart (6.10.0)](https://github.com/argoproj/argo-helm/tree/main/charts/argo-cd#6100)
* [argocd admin redis-initial-password](https://argo-cd.readthedocs.io/en/stable/user-guide/commands/argocd_admin_redis-initial-password/)
H2データ永続化手順

# H2Database永続化

Spring Bootの学習に際して、煩わしかったのでまとめます。

H2をただ導入するだけだと実行されるたびにデータが初期化されてしまいます。

H2のデータを永続化かつ、データをコンソールで操作できるにしていきます。

```diff_properties:o/demo/src/main/resources/application.properties	
	
	spring.application.name=demo
	
+	spring.sql.init.mode=never 
+	spring.h2.console.enabled=true
+	spring.jpa.hibernate.ddl-auto=update
+	spring.datasource.url=jdbc:h2:./data/db
+	spring.datasource.driver-class-name=org.h2.Driver
+	spring.datasource.username=sa
+	spring.datasource.password=password
+	spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
```
ルートディレクトリにdataというディレクトリが作成され、そこにデータが保存されます。
	
これで完了です。	
	
以下URLでコンソールにもログイン可能です。	

http://localhost:8080/h2-console
5つの注目講座でスキルアップ！今すぐ始めたいプログラミングの世界

こんにちは、韓国在住のsanaです！

プログラミング学習は、どこから始めるかが重要です。
今回は、スキルアップをサポートする注目の5つの講座をご紹介します！

:star:１【ウェブパブリッシング実習】ウェブ標準サイト作成:star:

最も基本的なウェブ講義であり、 ウェブサイト制作を初めて学ぶ方におすすめの授業です。ソースと動画を見ながら従うチュートリアル講義で、 じっくりとした例に従うと、 サイトをどのように作るか感覚をつかむことができるでしょう。
https://u.inf.run/4hEclEQ
https://u.inf.run/4kBmtBa


:star:２Flutter 3.0 アプリ開発:star:
モバイルアプリの開発に挑戦したい方におすすめなのが「Flutter 3.0」。Googleが開発したFlutterは、iOSとAndroidの両方に対応したアプリを一度に開発できるフレームワークです。
この講座では、Flutterを使って本格的なモバイルアプリを作成するための基礎から応用までを学べます。

https://u.inf.run/4hhuOai

:star:３フロントエンドウィング:star:
フロントエンド開発に必要な基本的なスキルを学べる「フロントエンドウィング」。HTML、CSS、JavaScriptを使って、実際のWebページを作成する方法を学びます。

https://u.inf.run/4kXtaNV

:star:４生活コーディングのJavaScript講座:star:
Webブラウザを直接制御できるJavaScriptのリファレンスを用いて、実際の生活シーンで役立つプログラムを作成します。JavaScriptの活用方法を学び、ブラウザを自在に操作できるスキルを手に入れることができます。

https://u.inf.run/4bZBFDW

:star:５Pythonを活用してGUIプログラミング:star:
この講座では、Pythonを使ってデスクトップアプリケーションを開発するためのGUIプログラミングを学びます。Pythonの基礎を学んだ後、実際に使えるアプリを作成する過程を通じて、より高度な技術を習得できます。

https://u.inf.run/3E0Cy2y

どの講座も実践的で、実際に手を動かしながら学べるので、即戦力として活用できること間違いなしです。みなさんの興味や目的に合わせて、最適な講座を選び、スキルを磨いていきましょう。　ファイティン～:blush:
VBAでファイルを移動させるプログラム

まずは全体像から
```vb
Sub MoveFile()
    Dim sourcePath As String
    Dim destPath As String
    Dim fileName As String
    Dim fullDestPath As String
    Dim userResponse As VbMsgBoxResult
    
    ' 移動するファイルのフルパス
    sourcePath = "C:\Users\User\Desktop\source\test.xlsx"
    
    ' 移動先のフォルダ（末尾に \ をつける)
    destPath = "C:\Users\User\Desktop\destination\"
    
    ' ファイル名を取得
    fileName = Dir(sourcePath)
    
    ' 移動先のフルパス
    fullDestPath = destPath & fileName
    
    ' ファイルが存在するか確認
    If fileName <> "" Then
        ' 移動先に同名のファイルが存在する場合の処理
        If Dir(fullDestPath) <> "" Then
            ' 上書きするかどうかをユーザーに確認
            userResponse = MsgBox("移動先に同じファイルがあります。上書きしますか?", vbYesNo, "確認")
            
            ' 「いいえ」を選択した場合、処理を終了
            If userResponse = vbNo Then
                MsgBox "処理を中止します。", vbInformation, "キャンセル"
                Exit Sub
            End If
        End If
        
        ' ファイルをコピペ（上書き含む）
        FileCopy sourcePath, fullDestPath
        
        ' 元のファイルを削除
        Kill sourcePath
        
        MsgBox "ファイルを上書き移動しました: " & fullDestPath, vbInformation, "完了"
    
    Else
        MsgBox "ファイルが見つかりません: " & sourcePath, vbCritical, "エラー"
    End If
    
End Sub
```

## 解説
指定したExcelファイルを別フォルダに移動するが、もし移動先に同じ名前のファイルがある場合、ユーザーに上書きするかを確認して回答に合わせて処理を切り分ける。

### コードの流れ
1 移動元ファイルの存在を確認
2 移動先に同じファイルがあるかチェック
　　●　ある場合 → ユーザーに「上書きしますか？」と確認
　　　●　「はい」 → 上書き移動
　　　●　「いいえ」 → 終了
　　●　ない場合 → そのまま移動
3　FileCopy でファイルをコピーし、元のファイルを Kill で削除
4　完了メッセージを表示
5　エラー処理（移動元ファイルがない場合はメッセージ表示）
【Git】溜まったローカルブランチを一掃したい！

## はじめに

こんにちは、フリーランスエンジニアのRyuです。

みなさんは普段Gitを使っていてローカルに不要なブランチが溜まってしまった経験はありませんか？
mainブランチ以外のローカルブランチを削除したい！そんな時は以下のコマンドで一括削除できます。

※**本当にmainブランチ以外消えてしまうのでコマンドの実行には十分気をつけてください**（リモートブランチは関係ありません。）

## コマンド

mainブランチに移動してください。
以下のコマンドを実行します。

```
git branch | grep -v "main" | xargs -n 1 git branch -D
```

- git branch でローカルブランチ一覧を取得
- grep -v "main" で「main」という名前の行を除外
- xargs -n 1 git branch -D で、リストアップされた各ブランチに対して git branch -D（強制削除）を実行

## 実行結果
![スクリーンショット 2025-03-18 14.33.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3577451/39d49656-0ef7-46f2-b68c-8f2a5022e4e7.png)


## 最後に

ローカルはこまめに整理して綺麗な状態を保ちたいですね。
【備忘録】Anaconda で PyTorch 環境を構築する方法

# はじめに
PyTorch 環境を構築する際の手順をまとめた備忘録です。  
**Python 環境の作成、PyTorch のインストール、動作確認までの流れ** を記録しています。

---

## **1. PyTorch 用の仮想環境を作成する**
まず、`pytorch` という名前の **新しい仮想環境** を作成し、Python 3.8 をインストールします。

```bash
conda create -n pytorch python=3.8
```
#### コマンドの説明
<ul>
<li> <code>conda create</code> ：新しい Conda 仮想環境を作成する</li>
<li><code>-n pytorch</code>：仮想環境の名前を pytorch に指定</li>
</ul>


## 2. 仮想環境を有効化する

作成した環境を有効化します。

```bash
conda activate pytorch
```
実行後、ターミナルの環境名が (pytorch) に変わっていれば成功です。

## 3. インストール済みのパッケージを確認
仮想環境内にインストールされているパッケージを確認するには、以下のコマンドを実行します：

```bash
pip list
```
現在の環境にインストールされているすべての Python パッケージとそのバージョンが表示されます。

## 4. PyTorch をインストール
### GPU 版（CUDA 12.1 対応）
```bash
conda install pytorch torchvision torchaudio pytorch-cuda=12.1 -c pytorch -c nvidia
```
#### コマンドの説明
<ul>
<li><code>pytorch</code>：PyTorch のメインパッケージ</li>
<li><code>torchvision</code>：画像処理用の PyTorch サブパッケージ</li>
<li><code>torchaudio</code>：音声処理用の PyTorch サブパッケージ</li>
<li><code>pytorch-cuda=12.1</code>：CUDA 12.1 に対応した PyTorch の GPU バージョン</li>
<li><code>-c pytorch -c nvidia</code>：PyTorch と NVIDIA の公式チャンネルからインストール</li>
</ul>

### CPU のみで PyTorch を使用する場合は、以下を実行してください：

```bash
conda install pytorch torchvision torchaudio cpuonly -c pytorch
```

## 5. PyTorch の動作確認
インストールが完了したら、Python で PyTorch が正常に動作するか確認します。

#### Python を開いて以下のコードを実行
``` python
import torch

# PyTorch のバージョンを確認
print(torch.__version__)  

# PyTorch が対応する CUDA のバージョンを確認
print(torch.version.cuda)  # 例: 12.1

# GPU が利用可能か確認
print(torch.cuda.is_available())  # True が返れば GPU 使用可能

# 使用している GPU の名前を取得
print(torch.cuda.get_device_name(0))  # 例: "NVIDIA GeForce RTX 4060"
```

すべて問題なく出力されれば、PyTorch の環境構築は成功です｡
【MYSQL】動的にパラメータにしてバインドする処理（取った配列とそのバインドの処理）

**背景**
テーブルに対して、配列で取ったデータを基に、処理を行う
（例えば、フロント側でチェックボックスにチェックしたものを、バック側で処理するということ）
```php
     //ここで配列を取得
    $arr = $_POST["arr"];
    //配列要素数分のプレースホルダ（"？"）を作成する
    //（$arrが[1,2]だと、$placeholdersが　?,?　になる]）
    $placeholders = implode(',', array_fill(0, count($arr), '?'));
    $id = $_POST["id"];//例えば、001

   global $host, $user, $pass, $db;
    $conn  = new mysqli($host, $user, $pass, $db);

 if ($conn->connect_error) {
        echo json_encode(['success' => false, 'message' => 'データベース接続失敗: ' . $conn->connect_error]);
        exit();
    }
    //上記の場合、UPDATE table SET flag = '0' WHERE user_id = ? AND page_id IN (?,?)になる
    $sql = "UPDATE table SET flag = '0' WHERE user_id = ? AND page_id IN ($placeholders)";

    $stmt = $conn->prepare($sql);

    // プレースホルダーにバインドするための配列を作成
    //$params = [001,1,2];
    $params = array_merge([$id], $arr);
    //$params配列の要素数分だけ's'を繰り返した文字列を作成
    //$paramsには三つあり、$types="sss";
    $types = str_repeat('s', count($params));  
    
    //動的にパラメータをバインド
    //スプレッド演算子「...」で配列を個別の引数に展開する
    $stmt->bind_param($types, ...$params);
    
    //クエリを実行
    if ($stmt->execute()) {
        //省略
    } 

```
始めてやったので、メモしておく。
ミドルウェア名の安定版調査

ミドルウェア名	最新版	最新安定版
Apache HTTP Server	2.4.54	2.4.54
Nginx	1.23.0	1.22.0
Microsoft IIS	10.0	10.0
Apache Tomcat	10.1.0	10.0.22
JBoss/WildFly	26.1.1.Final	26.1.1.Final
IBM WebSphere	9.0.5	9.0.5
Oracle WebLogic	14.1.1	14.1.1
MySQL	8.0.29	8.0.29
MariaDB	10.8.3	10.7.4
PostgreSQL	14.3	14.3
Oracle Database	21c	19c
MongoDB	5.0.9	5.0.9
Microsoft SQL Server	2019	2019
Zabbix	6.0.3	6.0.3
Java	18	17
PHP	8.1.6	8.0.19
Python	3.10.4	3.9.13
Perl	5.36.0	5.34.1
Ruby	3.1.2	3.0.4
Postfix	3.7.0	3.6.5
rsyslog	8.2204.0	8.2204.0
【CSS】レスポンシブ対応で画像を遅延読み込み表示する場合のaspect-ratioの使い方


今更ながら…今まで画像比率を保持するために使用していたCSSが
IEサポート終了によって使用できるようになったためメモ:pencil2:

### 作りたいイメージ
<img style="width: 300px;margin: 0 auto;" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3813674/079830d4-03d9-4ebd-9cec-8bc873efd1b7.png">


```HTML:HTML
<div class="content">
  <div class="content-img-wrap">
    <img loading="lazy" src="/app/img/images.jpg" alt="猫img" class="content-img" width="300" height="200">
  </div>
  <p class="content-text">猫ちゃんかわいいね</p>
</div>
```
```CSS:今まで

.content-img-wrap {
  position: relative;
  width: 100%;
}

.content-img-wrap::before {
  content: "";
  display: block;
  padding-top: 66.7%; /* 比率を指定(高さ ÷ 横幅 × 100(整数にならない場合は小数点第二位を四捨五入)) */
}

.content-img {
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
}
```

業務では画像を遅延読み込みする際に発生する画面のカクツキ防止のため、
画像の高さを枠で保持することが多いのでデフォルトではこちらを使用する。
```CSS:aspect-ratio
.content-img-wrap {
  width: 30%;
  height: auto;
  max-width: 300px; /* 最大表示枠が決まっている場合 */
  aspect-ratio: 3 / 2 /* 明確な比率が決まっていないときは横幅と高さを指定するでもOK */
  overflow: hidden;
  margin-right: 20px;
}

.content-img {
  width: 100%;
  height: auto;
  max-height: 100%;
  object-fit: cover; /* 画像全体を表示させたい場合はcontentとする */
  border-radius: 6px;
}
```