OmniAICreator/Qiita-1.07M huggingface dataset:
再帰関数(Python)

# はじめに
初学者が個人的に作った備忘録です。

# 再帰関数の基本構造
再帰関数の構造は以下の二つに分かれる

・ベースケース(再帰を行わずにできる処理)
・再帰ステップ(再帰を行ってする処理)

再帰ステップを繰り返し、最終的にベースケースに到達するというのが基本的な流れとなる。
以下、再帰関数を用いる処理(漸化式、木構造)を具体的に扱ってみる。

# 漸化式
## ver工夫無し
フィボナッチ数列を例に扱う。
```python
def fib(n):
# ベースケース
    if n < 2:
        return 1
# 再帰ステップ
    else:
        return fib(n-1) + fib(n-2)
    
```
ただこのアルゴリズムだと、一つの関数内で2回再帰を行っているため、計算量はO(n^2)と重いものになってしまう。

そこで、メモ化再帰、動的計画法を用いた実装を行うことによって計算量をO(n)にできる
## ver メモ化再帰
ここでは`defaultdict`を使ってメモ化を行う。
既に計算した項を`memo`に保存することによって、計算量をO(n)にできる

```python
from collections import defaultdict
memo = defaultdict(lambda :-1)

def fib(n):
     if n < 2:
         memo[n] = 1
         return 1
         
#既に計算していたら、メモを使う。
     if memo[n] != -1:
         return memo[n]
         
     else:
         memo[n] = fib(n-1) + fib(n-2)
         return memo[n]
```
また、`functools.cache`を用いたメモ化も記しておく
関数の前に`@cache`をつけるだけで関数の戻り値をメモしてくれ、同じ引数で関数を呼び出したとき、そのメモをした結果を自動的に使ってくれる。
こっちの方がお手軽
ただし引数がハッシュ可能である必要がある。
```python
from functools import cache

@cache
def fib(n):
    if n < 2:
        return 1
    else:
        return fib(n-1) + fib(n-2)
```
## ver 動的計画法
ただ小さい項から順に計算するだけ
```python

def fib(n):
#辞書に結果を保存
    fib_result = {}
#初期値の設定
    fib_result[0] = 1
    fib_result[1] = 1

    for i in range(2, n+1):
        fib_result[i] = fib_result[i-1] + fib_result[i-2]
```

# 木構造

https://atcoder.jp/contests/abc407/tasks/abc407_d

この問題を扱います。
もう少し適切な題材がある気がしますが、この記事を書くきっかけになった問題なので大目に見てください。

__簡単な問題文__
H行W列の整数の書かれたマスがあり、その上に大きさが2マス分のドミノを0個以上置く。
ドミノが置かれていないマスに書かれた整数の排他的論理和がスコアとなる。
全探索してスコアの最大値を求めろ。

```python
#標準入力(aはマスに書かれた整数のリスト)
h,w=map(int,input().split())
a=[list(map(int,input().split())) for _ in range(h)]

#再帰回数の上限を設定(標準は1000)
import sys
sys.setrecursionlimit(10**6)

from collections import defaultdict
memo=defaultdict(lambda :-1)

#nowはマスにドミノが置かれているかどうか、置かれていたら1、いなかったら0
def dfs(now):
    #すでにドミノが置かれたマスを HWbit の整数で管理
    nn = 0
    for i in range(h*w):
        nn += (1 << i) * now[i]

    best = 0
    score = 0

    #計算済みであったらその値を返す
    if memo[nn] >= 0:
        return memo[nn]
    
    for i in range(h):
        for j in range(w):
            #a[i][j]にドミノが置かれてあったらcontinue
            if now[i*w+j]: continue
            #a[i][j]にドミノが置かれていなかったらスコアを可算する          
            score ^= a[i][j]

            #ドミノを置く(下位のノードに進む)
            now[i*w+j] = 1
            #横向き
            if j + 1 < w and now[i*w+j+1] == 0:
                now[i*w+j+1] = 1
                #下位のノードに進むことを繰り返す
                best = max(best, dfs(now))
                #最後まで進んだら１つ上位のノードに戻る
                now[i*w+j+1] = 0
            #縦向き
            if i+1<h and now[i*w+w+j]==0:
                now[i*w+w+j]=1
                best=max(best,dfs(now))
                #最後まで進んだら１つ上位のノードに戻る
                now[i*w+w+j]=0
            #最後まで進んだら１つ上位のノードに戻る
            now[i*w+j]=0
    
    #常に最高スコアを保存しているので、最後に保存されたスコアが答えとなる
    memo[nn] = max(best, score)
    return memo[nn]

print(dfs([0]*(h*w)))


```
再帰関数を用いた木構造の深さ探索は
最下位のノードまで進む
⇒一つ戻る
⇒最下位のノードまで進む

この繰り返しとなるのでそれを意識してコードを書く
“実務経験が積める”という言葉に騙された話。初日に辞めたエンジニアバイト

## はじめに
こんにちはFujita-createです。
私は、先日「エンジニアとしての実務経験が積める」という求人を見て、ある企業のインターンに応募しました。  
結論から言うと、**初日に辞めました**。  
この記事は、同じように“未経験歓迎”という言葉に期待を抱く方へ、私の実体験と学びを共有するために書いています。

## 応募前の背景と期待

私は現在、大学に通いながらフリーランスエンジニアを目指して技術を磨いています。
Pythonを中心に、JavaScript、HTML/CSS、React、AWSなどのスキルを独学で学び、これまでにいくつかの個人開発プロジェクトも経験してきました。

ただ、個人開発には限界があると感じていました。
「実務経験がないと、フリーランスとして案件を獲得するのは難しい」
「チームでの開発や納品責任など、現場ならではの経験が必要」
そう考えて、私は**実務経験を積めるインターン**を探すようになりました。

そんなときに見つけたのが、ある企業の**「エンジニアアルバイト募集」**という求人でした。
募集要項には、PythonやReact、HTML/CSS、AWSなどの技術に触れられることや、独学OK・学生歓迎という言葉が並んでおり、「これは自分のような人間にピッタリだ」と思いました。

また、面接でも実際に「どんな言語が使えるか？」「どのくらい技術的な経験があるか？」といった質問があり、エンジニアとしてのスキルやポテンシャルを見てくれていると感じました。

私は「ここなら、実務的な経験を積ませてもらえる」「自分の技術を活かせるチャンスだ」と心から期待し、初出勤の日を迎えました。

## 実際に行ってみたら

出勤初日、私はオフィスで社長と先輩社員2名と顔を合わせ、業務の説明を受けました。最初に行ったのは、社内で使用しているタスク管理ツールやメールの設定、チャットツールの導入など、業務システムの使い方を教えてもらうことでした。

その後、会社が展開している既存のプロダクトについての説明に入りました。私は、てっきりこのプロダクトに新しい機能を追加したり、新しいサービスの開発を行ったりするものだと思っていましたが、そこで語られたのはまったく違うものでした。

実際の業務内容は、「外部から送られてきた依頼などを、自社ソフトに手作業で入力する」というもので、開発業務は一切ないことが明かされたのです。
つまり、「自社のソフトを“開発する”」のではなく、「既にあるソフトを“使う”だけ」の作業がメインということでした。

私はその時点で違和感を抱きましたが、それでも一縷の望みにかけて、社員の方に「開発に関わる機会は今後あるのか？」と質問しました。
すると、ある先輩社員の方から、「開発に関われるのは早くて3ヶ月後、それでも業務内容はホームページの修正レベル。それもできる人はごく一部」という言葉を聞きました。
さらに社長からは、「ホームページも作れない人間に開発なんて任せられるわけがない」といった発言もあり、すでに一定のスキルがある先輩社員に対しても、そのような扱いをしていたのを目の当たりにしました。

私としては、個人開発でWebサイトを作ったり、アプリを作成した経験がありましたし、話を聞いた先輩社員の方も工学系の情報学部で学び、個人開発ができる力のある方たちでした。
にもかかわらず、そうしたスキルは社内で正当に評価されておらず、「まずは雑務から」「やる気次第」というような抽象的な理由で、開発業務から遠ざけられている現状がありました。

そして何より、求人票や面接での言葉とは大きく異なる実態に対して、「このままでは、自分が本当に目指したい“実務経験”は何一つ積めない」と強く感じました。

## 学びと気づき

今回の経験を通じて、私は求人票に書かれている言葉を、表面的に信じてはいけないということを痛感しました。

「エンジニア募集」「独学OK」「Python、React、AWS」などの技術ワードが並んでいると、それだけで“開発業務に関われる”という希望を抱いてしまう。
面接でもスキルに関する質問がされると、「自分の技術が活かせる環境なのだろう」と自然に思ってしまう。

しかし実際は、そのような言葉が“労働力を集めるためのキャッチコピー”として使われているだけという場合もあるのだと、身をもって知りました。

また、「やる気次第で任せる」「未経験歓迎」という言葉の裏には、雑務の“地ならし”を正当化するための逃げ道が隠れている場合もあります。

私は今回、仕事を始めてわずか数時間で、「この環境では学びにならない」と判断し、その日のうちに辞めるという決断をしました。
勇気の要ることではありましたが、**「目の前の“経験”が、自分の将来に本当に意味があるのか？」**を問い直した結果でした。

この経験から学んだ最大のことは、“実務経験を積む”という目標を達成するためには、目的意識を明確に持ち、自分の時間と力を注ぐ価値があるかを見極め続けることが大切だということです。

口当たりのよい言葉や、“それっぽい”技術ワードに惑わされず、「具体的にどんな業務に関われるのか？」「何を成果として求められるのか？」という**現実的な問いを自分から企業にぶつける勇気**も必要だと感じました。

## これからの自分と、同じように悩む人へ

今回の経験は、間違いなく自分にとってターニングポイントになりました。

私はもともと、「フリーランスエンジニアとして、自分のスキルで価値を提供できるようになる」ことを目標にしています。
そのために、開発現場での実務経験を積み、技術力だけでなくチーム開発・納品・対話といった“仕事としてのエンジニアリング”を体感したいと考えていました。

今回の出来事は、その第一歩として選んだ企業とのミスマッチという形でしたが、自分の軸をはっきりさせることができたという意味では、とても大きな収穫だったと思っています。

同じように、「未経験から実務経験を積みたい」「成長できる環境を探している」と思っている人はたくさんいるはずです。
そんな人に私が伝えたいのは、次のことです：

- 求人票や面接での言葉は、具体的な業務内容まで確認すること

- 「やる気次第」は便利な言葉。“開発に携われるか”は明確に聞いていい

- 合わないと思ったら、引き返す勇気を持ってもいい。それは逃げではなく、判断です

私はこれから、長期インターンなどを通じて、本当に実務経験を積める環境を探し直そうと思っています。
個人開発も並行して続けつつ、「実力を磨くこと」と「仕事としての経験を積むこと」の両輪で、自分の進みたい道を切り開いていきます。

この投稿が、少しでも誰かの判断材料や安心につながれば嬉しいです。
ここまで読んでくださり、ありがとうございました。
🛴ループ処理まとめ🔁❹ ー .uptoメソッド / .downtoメソッド

**整数専用**のイテレータである`.upto`メソッドと`.downto`メソッドについて、アウトプットする。

## 具体例による使い方と説明
```ruby
1.upto(5) do |i|
  puts i
end

# 実行結果　=>1 2 3 4 5
```
- 1から5まで、昇順でブロックを回す
※`.downto`メソッドも同様

## 注意点
- 整数専用のイテレータ

## 整数以外を昇順・降順に並べたい場合
- 昇順：`(a..b).each do |i|`
- 降順：`(a..b).reverse_each do |i|`

## まとめてみて
- 配列、整数、数値、文字列、、、どのループ処理を使えばいいか洗濯できるようになりたい。
- コードを書いていて、エラーが出る原因の大きな一つが👆これ。
- ちゃんと理解したい。
Apache POI で シートのならび順を設定したい

Apache POI で シートのならび順を設定したい場合、`Workbook.setSheetOrder`を利用します。

**例: XXX→YYY→ZZZの順番でシートをならべる**

```java
Sheet xxx = workbook.createSheet("XXX");
Sheet yyy = workbook.createSheet("YYY");
Sheet zzz = workbook.createSheet("ZZZ");

workbook.setSheetOrder(xxx.getSheetName(), 0);
workbook.setSheetOrder(yyy.getSheetName(), 1);
workbook.setSheetOrder(zzz.getSheetName(), 2);
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105859/75a96d09-42d0-1add-6010-38b7f773d33e.png)

**環境情報**

```
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>5.3.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>5.3.0</version>
</dependency>
```
【備忘録】WSL (Ubuntu 22.04) で SWAN 41.51 を MPI 対応でビルドする手順


第三世代波浪推算モデルSWAN（Simulating WAves Nearshore）を，Windows上のWSL (Ubuntu 22.04) 環境において **MPI並列計算対応としてソースからビルド**した際の記録です．
ネット上にあまり日本語の情報がないため，せっかくなので今回まとめを作成しました．

## 前提条件

- Ubuntu 22.04 (WSL2)
- SWANのバージョンは41.51：執筆時点で最新


## 1. 必要なパッケージをインストール

```bash
sudo apt update
sudo apt install -y build-essential gfortran mpich libmpich-dev wget
````

> ※ mpichではなくopenmpiを使いたい場合は，`mpich libmpich-dev`を`openmpi-bin libopenmpi-dev に置き換えてください．

### Ubuntuで使える主なMPI実装

| 実装 | 特徴 | Ubuntuでのパッケージ名 |
|------|------|--------------------------|
| **MPICH** | 軽量・高互換性 | `mpich`, `libmpich-dev` |
| **OpenMPI** | 高機能・大規模向け | `openmpi-bin`, `libopenmpi-dev` |


## 2. SWANソースコードのダウンロード

```bash
wget https://sourceforge.net/projects/swanmodel/files/swan/SWAN41.51/SWAN-41.51.tar.gz
tar -xvzf SWAN-41.51.tar.gz
mv SWAN SWAN-41.51-src
cd SWAN-41.51-src
```

## 3. ビルド構成ファイルの準備

```bash
make config
```

これにより `macros.inc` ファイルが生成されます．

## 4. `macros.inc` の編集（MPI対応設定）

```bash
nano macros.inc
```

次のように修正・確認：

```makefile
F90_MPI = mpif90
FLAGS_MPI = -O2
INCS_MPI =
LIBS_MPI =
```
`F90_MPI = mpif90` に設定することで，`make mpi`ターゲットが MPI対応のFortranコンパイラでビルドされるようになります．


## 5. MPI 対応でmake

```bash
make mpi
```

成功すれば `./swan.exe` が生成されます．

## 6. 実行例（並列計算）

```bash
mpirun -np 4 ./swan.exe
```

> ※ `.swn` 入力ファイル，地形データおよび風速データが必要です．[テストケース](https://sourceforge.net/projects/swanmodel/files/testcases/)などを用意してください．


## 参考リンク

* [SWAN公式サイト](https://swanmodel.sourceforge.io/)
* [SourceForge配布ページ](https://sourceforge.net/projects/swanmodel/)
AzureとAWS　サービスについて



AWSとAzureのメリットとデメリット

```
Azureのメリット
OfficeをはじめとしたMicrosoft製品との連携がとりやすいことが、Azureの大きなメリットと言えるでしょう。また、Microsoftが持つ広範囲のグローバルネットワークによるサービスの提供を受けられる。

Azureのデメリット
仮想マシンの起動がAWSに比べ遅い点。AWSでの起動時間が1分程度なのに対して、AWSでは2分半以上かかる。
日々利用するものの起動が遅いのは作業者にとってはデメリットと言える。
オンラインコミュニティの充実度が低い点や、活用に専門知識を要する点などもAWSと比べて弱い部分がある。

AWSのメリット
Azureやほかのクラウドプラットフォームに比べ導入コストが安く、迅速に導入できること。
また、190カ国を超える国での利用が可能なことで以下のメリットがある。
海外に拠点がある企業、グローバル展開を視野に入れている企業に対応可能

AWSのデメリット
メンテナンスによりシステムが停止する際の対応を事前に決めておかなければならない。
⇨メンテナンスは、AWS側から事前告知はあるものの不定期に実施される点は注意が必要

クラウドコンピューティングサービスでは基本的に用意されているプラン以外の増減ができないこと。
カスタマイズの自由度の低さも人によってはデメリットとなるかもしれない。

```

AWS(Direct Connect) と Azure(ExpressRoute) のネットワーク接続サービスの比較

```
　□Azure　ExpressRoute とは
企業と Microsoft のデータ センターを、次のようなプライベート接続となる。

クラウド エクスチェンジ コロケーション 
Any-to-Any IP VPN (通常は MPLS)、または 
ポイントツーポイント イーサネット ネットワーク。

接続の安全性は、サードパーティ接続プロバイダーの仮想クロスコネクト ソフトウェアを使って、
オンプレミスのネットワークまたはコロケーション施設で確保される。

　□Direct Connect (AWS)﻿
AWSが提供する、オンプレミス環境とAWSのVPC（Virtual Private Cloud）を専用線で接続する。
インターネット経由の接続ではないため、より安全で安定した通信が期待できる。
Direct Connectを利用することで、AWSのサービスへのアクセス速度を向上させ、
データ転送コストを削減することができます。

```

※Direct Connect (AWS)とExpressRouteの共通点

```
1.インターネット経由の接続ではないことは共通している
2.接続に対しては、共に専用線を必要とすること
3.データ転送コストを削減して利用することを目的としてること

※Direct Connect (AWS)とExpressRoute (Azure)の接続方法の違いは以下の通り
オンプレミス環境とAWSのVPCを閉域網で接続(Direct Connect)
オンプレミス環境とAzureクラウドを閉域網で接続(ExpressRoute)


(AWS)Direct Connectは、ネットワークをAWSに直接リンクできる

※実務的な接続をする場合。
オンプレのデータセンター⇨FIC等の課金サービスから準備する点も考慮すること。
そのため簡単に聞こえがちであるが敷居は高い点に注意すること

(Azure)ExpressRouteの場合専用のプライベートネットワーク接続を使用し、
ローカルネットワークをAzureのリソースに直接接続することとなる
※Express Routeはオンプレミスのデータセンターからクラウドの直接接続を提供する

```

以下にサービス表をまとめたものを記載。
※awsとAzureと記載された部分は省いている

|　領域・役割　|　AWSサービス名　|Azureサービス名|
|:-----|:----:|------:|
|クラウド仮想ネットワーク|Virtual Private Cloud (VPC)|仮想ネットワーク|
|NATゲートウェイ|NATゲートウェイ|NATゲートウェイ|
|クロスプレミス接続|サイト間VPN |VPN Gateway|
|NATゲートウェイ|NATゲートウェイ|NATゲートウェイ|
|DNS管理|ルート53| Azure DNS |
|DNSベースのルーティング|ルート53|Traffic Manager|
|専用ネットワーク|直接接続|ExpressRoute|
|負荷分散|(ネットワーク)NLB|Load Balancer|
|APレベルの負荷分散|ALB| Application Gateway|
|ルートテーブル|カスタムルートテーブル|ユーザー定義ルート|
|プライベートリンク|PrivateLink|Private Link|
|プライベートPaaS接続|VPCエンドポイント|Pエンドポイント|
|仮想ネットワークピアリング|VPCピアリング|仮想ネットワークピアリング|
|CDN|CloudFront|フロントドア|
|ネットワーク監視| VPCフローログ|Azure Network Watcher|
|仮想ネットワークピアリング|ランジットゲートウェイ|Virtual WAN|
|クラウド仮想ネットワーク|グローバルアクセラレータ|Traffic Manager|
|クロスプレミス接続|Direct　ConnectGW|Route  Global Reach|
|APレベルのネットワーク提供|DAWS App Mesh|Service Fabric|
|サービス検出|クラウド マップ|Azure プライベート DNS|

※awsとAzureと記載された部分は省いている
App=アプリ　

※クロスプレミス接続について
正式名称は以下
Route  Global Reach　⇨　 Azure Express Route Global Reach

以上、随時更新します
REST / GraphQL API連携で地味に詰まるポイントまとめ【フロントエンド実務Tips】

## はじめに

フロントエンド案件でAPI連携はほぼ必須スキルですが、実務に入ると「地味に詰まるポイント」が頻繁に出てきます。しかも仕様書には書かれていない落とし穴が多い。この記事では、REST / GraphQLを中心に、**実際の受託案件・企業案件でよく遭遇するAPI連携の詰まりポイントと解決策**をまとめます。

---

## 想定読者

* フロントエンド案件の実務を進めている方
* API連携に自信を持ちたい方
* 単なるサンプルコード以上のリアルな実務Tipsを知りたい方

---

## 全体イメージ

```bash
Next.js (App Router構成)
TypeScript
React Query / SWR / Axios / Fetch API
OpenAPI / zodスキーマ連携
REST / GraphQL API
エラーハンドリング設計
認証フロー（Token / OAuth2 / Cookie）
CORS / SameSite / CSRF対策
```

---

## 1. REST API編

### ✅ Axios or Fetch問題

最近は `fetch()` 標準APIの進化で以下が標準化しつつある:

* 自動JSONパース不要（`response.json()`だけ）
* SSRでもNode対応可能（Next.js内蔵）
* `fetch` をラップして共通化するのが実務向き

#### ラッパー例

```typescript
export async function api<T>(url: string, options?: RequestInit): Promise<T> {
  const res = await fetch(url, options);
  if (!res.ok) throw new Error("API Error");
  return res.json() as Promise<T>;
}
```

### ✅ GETでも必ず型定義を作る

```typescript
interface User {
  id: number;
  name: string;
  email: string;
}

const res = await api<User>("/api/user/1");
```

### ✅ エラーハンドリングの癖

* ステータスコードによるエラーマッピングを決めておく
* 401, 403, 404, 500系はUI表示方針も決める
* Next.jsならerror boundaryでラップして共通ハンドリング可能

### ✅ REST設計の詰まりポイント

* **ネストリソース** (`/users/:id/posts`) → 実案件では多い
* **Optional Query** (`/users?isActive=true`) → クエリ生成関数を作成推奨
* **Pagination / Cursor** → 無限スクロール時に詰まりやすい

---

## 2. GraphQL編

### ✅ RESTと違う事前設計の重要性

* クエリ依存で**オーバーフェッチ / アンダーフェッチ**が起きやすい
* スキーマ変更時に全クライアント影響注意
* Apollo ClientやRelay導入の適切さを見極める

### ✅ クライアントコード生成（自動化）

* `graphql-code-generator`を実務で導入すると型定義自動化可能
* スキーマ駆動開発に向いている

#### 例

```bash
yarn add @graphql-codegen/cli
npx graphql-codegen init
```

### ✅ キャッシュ戦略の設計

* Apolloの `cache-first` / `network-only` 切替重要
* SSRとの整合性で詰まりがち（特にNext.js App Router併用時）

---

## 3. 共通詰まりポイント

### ✅ OpenAPI連携で型安全化

* API定義からTS型自動生成することで手戻り削減
* `openapi-typescript-codegen` など利用実績多い

### ✅ 認証フローの罠

* OAuth2のリフレッシュトークン設計忘れ
* CookieベースセッションでのCORS設定漏れ
* CSRF対策：SameSite属性とToken送信のバランス

### ✅ APIバージョン設計

* `/v1/` のルーティングをAPI側で固定管理
* 将来的な互換性維持のために意識必須

---

## 4. React Query / SWRの活用Tips

### ✅ 非同期キャッシュの適切な使い分け

```typescript
const { data, isLoading, error } = useQuery(['user', id], () => api<User>(`/api/users/${id}`));
```

* `queryKey`の粒度設計が超重要（キャッシュ汚染防止）
* `staleTime` と `cacheTime` を意識
* 再フェッチタイミングのUX考慮（タブ復帰・フォーカス復帰時など）

---

## まとめ

* REST/GraphQL問わず、**「型安全・エラーハンドリング・キャッシュ設計」** が実務成否を分ける
* 認証/CORS/CSRFは案件でトラブル頻度高め→事前に潰しておく
* API連携は**実案件で経験を積むと大きな武器**になる

---

## おわりに

API連携は「一通り学んだ」あとに、実務で詰まるポイントが本番です。逆に、ここを乗り越えたエンジニアはフロントエンドでも提案・設計・保守に強くなれます。

Qiitaでは今後もこういった**実務に役立つAPI連携Tips**を発信していくので、ぜひLGTM・フォローお願いします！

---

## 関連タグ

API連携, REST, GraphQL, TypeScript, Next.js, ReactQuery, SWR, Axios, OpenAPI, OAuth2, 認証, CSRF, CORS, 型安全, 受託開発, フロントエンド案件
Reactの`useState`はなぜすぐに反映されない？実務で注意すべきポイントとコツ

# はじめに

Reactで以下のようなコードを書くと、初心者から上級者まで一度は「なんでこうなるの？」と混乱します。

```tsx
const [status, setStatus] = React.useState("clean")

const handleClick = () => {
  setStatus("dirty")
  alert(status) // えっ、まだ"clean"なの？
}
```

ボタンをクリックすると`status`を`"dirty"`に設定したはずなのに、`alert`で表示されるのは古い値の`"clean"`──これにはちゃんと理由があります。この記事ではその理由と、**実務での注意点や対応方法**を紹介します。

# Reactの状態更新は「非同期」

Reactでは`useState`による状態変更は**即座に反映されるわけではありません**。代わりに「再描画のスケジュール」がされるだけです。これは以下のような流れです：

1. `setStatus("dirty")`が呼ばれる
2. 状態更新がReactにキューイングされる
3. `handleClick`の実行が終わったあとに再レンダリングが発生
4. そのときようやく`status === "dirty"`となる

つまり、`setStatus`直後に`status`を参照しても**まだ古い値のまま**というわけです。

# 実務での注意点とコツ

### ✅ 1. 状態変更後の処理は`useEffect`で

状態が変わった「あと」に処理を行いたい場合、`useEffect`を使うのが正しいアプローチです。

```tsx
useEffect(() => {
  if (status === "dirty") {
    alert("状態が変更されました: " + status)
  }
}, [status])
```

### ✅ 2. `setX`の直後に`X`を使わない

ありがちなバグ：

```tsx
setIsLoading(true)
console.log(isLoading) // まだfalse
```

`isLoading`はまだ古い値のままです。こうした処理のタイミングミスは非同期通信（APIリクエスト）やUIトグルで特に起こりやすくなります。

### ✅ 3. 状態の変更が即時必要な場合はローカル変数や関数内で扱う

「すぐに使いたい値」は状態で持つのではなく、**ローカル変数**で完結することも検討しましょう。

```tsx
const handleClick = () => {
  const nextStatus = "dirty"
  alert(nextStatus) // これは確実に"dirty"
  setStatus(nextStatus)
}
```

### ✅ 4. フォームや一時的なUIは「コントロールされすぎない」ように設計する

複雑なフォームやモーダル制御で状態の変更タイミングが混乱しやすい場合、以下のような工夫をしましょう：

* 表示・非表示を制御するstateをbooleanで持つ（`isOpen`など）
* フォームの一時入力状態は`useRef`や`controlled input`で管理
* 状態変化によって動く処理は**必ず副作用として`useEffect`で定義**

**🧪 おまけ：再現用ミニコンポーネント**

```tsx
export default function VibeCheck() {
  const [status, setStatus] = React.useState("clean")

  const handleClick = () => {
    setStatus("dirty")
    alert(status) // 1回目は "clean" が出る
  }

  return (
    <button onClick={handleClick}>
      {status}
    </button>
  )
}
```

**💡 併せて読みたい**

https://qiita.com/oharu121/items/a910d2dbd281476d718f

# おわりに

Reactの状態管理は慣れれば非常に強力ですが、最初はその**非同期性**に戸惑うことも多いです。この記事が、「なぜ古い値が表示されるのか？」という疑問のヒントになれば幸いです。
sataの電源ケーブル

3.5incのHDは12Vが必要ですが、2.5incのHDやSSDは5VだけでOKです。

2.5inc用のケーブルを作ってみました。

![写真（2025-06-05 8.43） #2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/58571244-1e6d-4eb5-8db9-e046d5b6329d.jpeg)

元々1本だったのですが、切って12Vのケーブルを外してDCジャックを付けました。
Windowにchocolateyパッケージマネージャーをインストールする。

[公式サイト](https://chocolatey.org/install)にアクセスし、インストール手順を確認します。  
次に、Windows PowerShellを**管理者権限**で開き、現在の実行ポリシーを確認します。  

```powershell
Get-ExecutionPolicy
```

初期状態では **Restricted** になっています。Chocolatey をインストールできるようにするため、ポリシーを **AllSigned** に変更します。  

```powershell
Set-ExecutionPolicy AllSigned
```

変更後、ポリシーが正しく設定されているか確認します。  

```powershell
Get-ExecutionPolicy
```

もし **AllSigned** に変更されていない場合は、Windows PowerShellを**管理者権限**で開き直してください。  

続いて、Chocolatey をインストールします。以下のコマンドを実行してください。  

```powershell
Set-ExecutionPolicy Bypass -Scope Process -Force;
[System.Net.ServicePointManager]::SecurityProtocol =[System.Net.ServicePointManager]::SecurityProtocol -bor 3072;
iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))
```

インストールが完了したら、Chocolatey のバージョンを確認します。  

```powershell
choco -v
```
【備忘録】バリデーションチェックと確認モーダル機能を持った、登録フォームを作成する(ReactHookForm + ChakraUI)

## やりたいこと

値を入力
↓
入力に問題がある場合、バリデーションエラーを表示
↓
バリデーションチェックがOKな場合、「登録しますか？Yes No」のモーダルを表示
↓
Yesを押下時、モーダルを閉じて入力フォームをリセットする

## 実装
```App.tsx
// Record型は「title:string, time:number」を持つ型を設定
const [records, setRecords] = useState<Record[]>([]); 
const [record, setRecord] = useState<Record>();

// ReactHookFormを利用するので、useForm()で呼び出す
const { register, handleSubmit, formState: {errors}, reset } = useForm();

// ChakraUIでモーダルを実装するので呼び出す
const { isOpen, onOpen, onClose } = useDisclosure();

/**
  * フォームから値を抽出する
  */
  const onSubmit = (record: Record) => {
    setRecord(record); // 
    onOpen(); // モーダルを展開する(ChakraUIの機能)
  }

  /**
   * 登録処理
   * 登録完了後、入力テキストを初期化する
   */
   const handlerRegister = () => {

    if (record) { // recordはundefined型の可能性があるため、undefined型の場合をはじく
      addRecord(record); // データ登録用の関数、詳細は省略
      onClose(); // モーダルを閉じる(ChakraUIの機能)
      reset(); // 入力をリセットする(ReactHookFormの機能)
    }
  }

  
<form onSubmit={handleSubmit(onSubmit)}>
    <Input {...register("title", { required: true })} />
    <Input {...register("time", { required: true })} />
    { errors.title && <p style={{ color: "red" }}>タイトルを入力してください</p> }
    { errors.time && <p style={{ color: "red" }}>数値を入力してください</p> } 
    <button type="submit">送信</button>
    <Modal isOpen={isOpen} onClose={onClose}> {/* モーダルを呼び出す */}
        <RecordModal onClose={onClose} record={record} onRegister={handlerRegister}/>
    </Modal>
  </form>
  ```

  ```RecordModal.tsx
  export function RecordModal ({ onClose, record, onRegister }) {
      return (
        <>
          <ModalOverlay /> {/* ChakraUIのオーバレイ表示 */}
            <ModalContent className="modal-content"> {/* ChakraUIのモーダル表示 */}
              <ModalBody>
                <div>この内容で登録しますか？</div>
                <div>title: {record.title}</div>
                <div>time: {record.time}</div>
              </ModalBody>
              <ModalFooter>
                <Button colorScheme='blue' mr={3} onClick={onClose}>
                  Close
                </Button>
                {/* 登録を押下時、App.tsxの関数「handlerRegister」を実行する */}
                <Button variant='ghost' onClick={() => onRegister()}>登録</Button>
              </ModalFooter>
            </ModalContent>
        </>
      )
}
```

## 詰まっていたところ
モーダルで登録を押した後の処理を最初RecordModal.tsxの方で記載していて、処理を終了させたら良いかわからなかった。
プロデル、調査 その24

# 概要
プロデルが、CLRらしいので、調べて見た。
練習問題やってみた。

# 練習問題
棒グラフ表示せよ。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/731f22a4-d5c1-4510-93dc-ea898bb8e96a.png)

# サンプルコード

```
「チャート.rdr」を参照する

チャート1というチャートを作る
	チャート1をクリアする
	チャート1のSizeは{500,500}
	チャート1のDockは「全体」
	チャート1に凡例を作る
タイトル1というタイトル(「タイトル」)を作る
シリーズ線1というシリーズを作る
	シリーズ線1のChartType=「Line」
	シリーズ線1のLegendText =「線の凡例」
	シリーズ線1の線幅=2
	シリーズ線1の印形状は「Circle」
	シリーズ線1の印サイズは12
	シリーズ線1の凡例表示は○
	10回数に繰り返す
		シリーズ線1に(データポイント(数, (0～210)の乱数)を作ったもの)を加える
	そして
シリーズ列1というシリーズを作る
	シリーズ列1のChartType=「Column」
	シリーズ列1のLegendText =「棒の凡例」
	10回数に繰り返す
		シリーズ列1に(データポイント(数, (0～210)の乱数)を作ったもの)を加える
	そして
エリア1というチャートエリアを作る
	エリア1のAxisXのTitle=「X軸」
	エリア1のAxisYのTitle=「Y軸」
	チャート1にタイトル1を加える
	チャート1にエリア1を加える
	チャート1にシリーズ線1を加える
	チャート1にシリーズ列1を加える

メイン画面を表示する
待機する

メイン画面とは
	ウィンドウを継承する
はじめの手順
	初期化する
	チャート1を貼る
終わり
	初期化する手順
		この実質大きさは｛600,394｝
		この内容は「棒グラフテスト」
		初期化開始する
		初期化終了する
		この設計スケール比率は｛144,144｝
終わり
終わり




```

以上。
【Day3】まずはフロントだけ開発環境を構築する

## はじめに

勉強とアウトプットを兼ねて、Webアプリ開発の記録を記事にしてみます。

個人のメモ的な側面が強いです。
Web開発初心者すぎて至らぬところだらけだと思いますが、暖かい目で見ていただければ幸いです。

↓ これまでの内容 ↓
[【Day0】アプリが完成するまで毎日投稿](https://qiita.com/midorigame/items/f9b9a445c945b4a837b1)
[【Day1】開発環境を考える](https://qiita.com/midorigame/items/e26344599e2ffaa22033)
[【Day2】開発環境を構築する、、、はずでした](https://qiita.com/midorigame/items/3f57f2691a8e1074adb8)

## 前回のあらすじ

開発環境として以下を構築してみようと思ったのですが、見事失敗してしまいました泣

> React（frontend）＋ FastAPI（backend）をマルチコンテナで動かしつつ、DevContainerとしてVS CodeでReact開発を中心に行える構成

Chat GPTに聞いてみた感じでは、Docker側とWSL側のフォルダ周りの権限でうまく整合性がとれていなさそうでした。

## 今回の方針

一気にバックエンドのコンテナも作らず、まずはフロント側のDockerコンテナにDevcontainerでリモートアクセスすることを目指します！

## やったこと

最終的に色々作り直して、全部Gitに上げました！！

https://github.com/midorigameee/React-Image-Generator

- 今はここまでできる状態です
    - WSLでプロジェクトルートで`code .`を実行することでVS Codeが立ち上がり、そのままDevcontainerでコンテナ内にアクセスできる
    - コンテナ内でGit操作ができる（リモートリポジトリへのpushもできる）
    - コンテナ内で`npm run dev`でWebサーバーを起動できる

### .devcontainer.json

https://github.com/midorigameee/React-Image-Generator/blob/master/.devcontainer/devcontainer.json

- 工夫ポイント
    - serviceを切り替えるだけで、frontendもbackendもリモートアクセスできるようになる。はず…！
    - ログインユーザーはdevuserに統一
        - フロントでもバックでもコンテナではrootではなく別ユーザーを作る想定
    - devuserですべてのファイルを触れるように`"postStartCommand": "chown -R devuser:devuser /home/devuser/workspace",`で所有者権限を変更
        - この権限周りにめちゃくちゃ詰まった。。。コンテナは基本的にroot所有でファイルを作るので、root以外のユーザーだとファイル操作ができなくなってしまう
    - ` "overrideCommand": true, `と` "runArgs": ["sleep", "infinity"], `のオプションにより、リモートアクセスするコンテナではサーバー起動をしないようにした
        - Devcontainerでリモートアクセスするコンテナは開発用と割り切って、サーバー起動は手動で行う
        - 逆にリモートアクセスしないコンテナはコンテナ起動と同時にサーバーを起動させる

### docker-compose.yml

https://github.com/midorigameee/React-Image-Generator/blob/master/.devcontainer/docker-compose.yml

- 工夫ポイント
    - `context: ..`にして、volumesに`..:/home/devuser/workspace`と設定することで.devcontainer以下のフォルダ、つまり、.gitや.devcontainer自身もコンテナ内にマウントする
        - これにより、コンテナ内でgit操作できるし、コンテナ設定の変更→リビルドが容易になる！
    - node_modulesはDocker Volumeにする
        - これによりホットリロード高速化
        - （たぶんこれはコンテナ内でのNode開発のデファクトスタンダード？）

### Dockerfile

https://github.com/midorigameee/React-Image-Generator/blob/master/frontend/Dockerfile

- 工夫ポイント
    - 開発用に作成したdevuserにsudo権限を付与
    - よく使うエイリアスとかbashを便利にするコマンドは`~/.bash_aliases`にあらかじめ書き込む
    - docker-compose.ymlで`context: ..`と設定したので、Dockerfile内での相対パスに注意！
        - このDockerfileで実行するコマンドはdocker-compose.ymlが存在する.devcontainerディレクトリの一個上、つまりプロジェクトのルートで実行されるので、ルートから見た相対パスを使う必要がある
        - だから、`COPY frontend/package*.json ./ `のコピー元は`frontend/`がついている
    - CMDでサーバーが起動するようになっている
        - ただし、devcontainer.jsonでも説明したようにDevcontainerでリモートアクセスするときはサーバーが起動しないようにしている

## おわりに

なんとかフロント側だけでも環境構築することができました、、、

コンテナでどうしても開発環境を作りたい、なんてこだわりがなければもっと早かったんだろうなぁ、、、と思ったり。
おかげで色々と勉強にはなりましたが、だいぶ長い道のりを歩んでしまいました。

めちゃくちゃChat GPTに聞いたし、ググったし、大変でした。。。こういう詰まったところをもっと丁寧に書くべきなんだろうけど、なかなか切羽詰まったときに１から証跡を残すのは難しいなぁ

そんでもって、本当にChat GPTがいない世界が考えられない。。。ありがとうChat GPT

次回はバックエンド側の開発環境を構築してみます。
どちらかというと先に開発したいのはバックエンド側だからな～～～　がんばろ！
HTML anchor tag

ウェブ開発について学ぶ中で、本当にたくさんのことを学びました。だから今日は、その中のひとつをシェアしたいと思います。これからHTMLを学び始めたいと思っている“ゼロからのスタート”の方にとって、少しでも役に立てば嬉しいです。
はじめに伝えたいことがあります。
「恥ずかしがらないで。あきらめないで。」

ウェブ開発の道は簡単でないかもしれません。でも、誰もが最初は初心者です。HTMLを学び始めるとき、何がわからなくても大丈夫です。間違えても、自信がなくても、それはすべて成長の一歩です。
あきらめずに続ければ、必ず強くなれます。コツコツ積み重ねることが、未来のあなたの力になります。
一緒に頑張りましょう！
今日はHTMLの中で Anchorタグ（<a>）使い方教えていきたいと思います。

<h1>My top 5 favourite websites </h1>

<ul>
<li><a href="https://www.amazon.com/">amazon</a></li>
   <li><a href="https://www.twiter.com/">twiter</a></li>
    <li><a href="https://www.instagram.com/">instagram</a></li>
     <li><a href="https://www.facebook.com/">facebook</a></li>
    <li><a href="https://www.Tiktok.com/">Tiktok</a></li>
</ul>
website　は　名前だけですそれになんでも変わりに何でも入れてもらっても良いです。
li　はリストなんでそのまま使えは　list　になります。<a>href　はlink　するとき使うformula　なんです。
M5NanoC6+SSD1306、2倍角「あ、埼玉」と表示して遊ぶ。


参考
----

https://github.com/Tamakichi/Arduino-misakiUTF16


いろいろ注意
----

- 過去ログを見よ!!!


結果
----

![image_original(47).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/2f40b913-7229-44e1-bee7-d8611eb08750.jpeg)


プログラム
----


```c++



//misaki_test_nibai1_M5NanoC6
//2倍角「あ、埼玉」を表示

//ヘッダーファイル
#include <Arduino.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <misakiUTF16.h>


//定義
#define SCREEN_WIDTH 128     // OLED display width, in pixels
#define SCREEN_HEIGHT 64     // OLED display height, in pixels
#define OLED_RESET -1        // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3C  ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);


//2倍角の文字列を表示
void k_print(int x, int y, char *ptr) {

  unsigned char font[8];        // フォント格納バッファ
  unsigned char font2[16 * 2];  // フォント格納バッファ

  while (*ptr) {                         // 文字列分ループ
    ptr = getFontData(font, ptr, true);  // 1文字分のフォント取得
    if (!ptr)
      break;  // エラーの場合は終了

    int j = 0; //2倍角出力フォントのカウンター
    for (int i = 0; i < 8; i++) { //フォントの2倍角化ループ

      int al = font[i]; //入力フォントの読み出し
      int s = 0;
      s = s | (0b0000000000000001 & al); al = al + al;
      s = s | (0b0000000000000100 & al); al = al + al;
      s = s | (0b0000000000010000 & al); al = al + al;
      s = s | (0b0000000001000000 & al); al = al + al;
      s = s | (0b0000000100000000 & al); al = al + al;
      s = s | (0b0000010000000000 & al); al = al + al;
      s = s | (0b0001000000000000 & al); al = al + al;
      s = s | (0b0100000000000000 & al); 
      s = s | (s + s);

      font2[j++] = s >> 8;
      font2[j++] = s & 0xff;
      font2[j++] = s >> 8;
      font2[j++] = s & 0xff;

    }  //for


    //ビットマップの表示
    display.drawBitmap(x, y, font2, 16, 16, WHITE);
    x = x + 16;

  }  //while

}  //k_print


//初期化
void setup() {

  // I2Cアドレスは使用するディスプレイに合わせて変更する
  display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS);

}  //setup


//メインループ
void loop() {

  // 画面表示をクリア
  display.clearDisplay();


  //開始　2倍角の文字列の表示
  char *str = "あ、埼玉";  // 文字列
  int x = 0;
  int y = 0;
  k_print(x, y, str);
  //終了


  // 描画バッファの内容を画面に表示
  display.display();

  delay(5000);  //5秒待つ

}  //loop


```
ドメイン取得したらワイルドカードは使わないこと！！（サブドメインを勝手に使われそうになった話

今日の朝、突然Google Search Consoleから所有者が追加されましたとメールが来ました。
ただ、まったく身に覚えがない。。。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325108/cc6dbb39-ba27-4a99-9a33-6a02cf78a09d.png)

Google Search Consoleの「ユーザーと権限」を確認しても対象のアドレスは存在しない🤔

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325108/ab2531d4-fbf7-4817-b9d3-1c0f12135352.png)

よくよく見ると、URLが作ったことないサブドメインだったので、ためしにアクセスしてみました（ホントはやめた方が良いのだろうけど。。。

なんとAmazonのコピーサイトのようなものが表示されました！！😲

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325108/32a1097c-95dc-41be-9228-3b59e8ba9586.png)

これ何に使われるかわからないし、やばい！！と思って急ぎ対策しました。

# 原因と対策

Route53＋GitHub Pagesのカスタムドメインでカスタムドメインを利用していましたが、Route53側で登録する際にワイルドカードを指定してました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325108/c867799b-2829-42d8-a289-aebbd2f3de51.png)

これを本当に公開しているサイトの分だけサブドメインを明記して登録することで、問題のURLにアクセスしても表示されなくなることを確認できました。



# 最後に

レコード登録時にワイルドカードは使っちゃだめですよ！！！

今回はGoogle Search Consoleに登録してたから通知来ましたが、勉強用とかにドメイン取得したまま放置してる人とかは知らずに使われている可能性もあるので、ドメイン設定見直しましょう！


朝からめっちゃ焦った💦
ollamaでGPUメモリ余ってるのにCPU使ってしまい遅い件

- GPUメモリが余ってるのにCPUばかり使うときはnum_gpuを増やすとよい（かも）。
- リニアに増えないことに注意。

例）
```
FROM MrScarySpaceCat/gemma3-tools:4b
PARAMETER temperature 0.7
PARAMETER top_p 0.9
PARAMETER top_k 40
# PARAMETER num_gpu 40 4831 6s
# PARAMETER num_gpu 30 2411 40s
# PARAMETER num_gpu 32 2507 40s
# PARAMETER num_gpu 34 2653 40s
# PARAMETER num_gpu 36 4831 6s
PARAMETER num_gpu 36
```
【公ド読】複雑なアルゴリズムまたはロジックの説明

【公式ドキュメントを読もうシリーズ】複雑なアルゴリズムまたはロジックの説明

## シリーズ概要

[https://qiita.com/yasu_programming/items/cec66f9e8d5d571e9ce3](https://qiita.com/yasu_programming/items/cec66f9e8d5d571e9ce3)

## URL

[https://docs.github.com/ja/copilot/copilot-chat-cookbook/documenting-code/syncing-documentation-with-code-changes](https://docs.github.com/ja/copilot/copilot-chat-cookbook/documenting-code/syncing-documentation-with-code-changes)

## 説明

関数の処理の内容に合わせて、ドキュメントを修正してくれる。

## 所感

チーム開発していると、実装するのが第一であって、ドキュメントを書くのが二の次になってしまう場合がある。
Github Copilotでコードの挙動を確認できるとはいうものの、開発者自身でドキュメントを作成するほうが、信頼のおけるコードであると思われるので、開発者自身が労力少なくドキュメントを作成することができるというのは、便利な機能だなと思っている。
XServerにPHP-sodium 拡張を入れてみた

XserverにEC-Cubeを導入しました。
web APIを使いたいが、
PHP-sodium がないため
インストールができませんでした。


探してみたところ、
さくらサーバでインストールした記録がありました。

https://qiita.com/tomcat0090/items/2564baa9179747b4d855

## 結論と補足

PHPinfo()で、sodiumが表示されるようになりました。
しかし、EC-CUBEのWeb APIで、Oauth2.0接続を確認できてないです。
なので、こちらの方法でも、何か足りないかも知れません＞＜

## 手順

他のプラグインの兼ね合いでPHP8.2でしています。

以下、参考URLの手順をまるまるパクっていますが、
wgetのバージョンが古いのかダウンロードができていません。

PCでダウンロードした後に、SFTPで入れています。

```
# 作業用ディレクトリの作成
mkdir -p {~/usr/local/src,~/usr/local/php/extension}

# libsodium のダウンロードとコンパイル
cd ~/usr/local/src
wget https://download.libsodium.org/libsodium/releases/libsodium-1.0.20.tar.gz
tar xzvf libsodium-1.0.20.tar.gz
cd libsodium-1.0.20
./configure --prefix=$HOME/usr/local
make && make check
make install

# PHP拡張のダウンロード＆コンパイル
cd ~/usr/local/src
wget https://github.com/php/php-src/archive/php-8.2.28.zip
unzip php-8.2.28.zip
mv php-src-php-8.2.28/ext/sodium ./sodium-php-8.2.28
cd sodium-php-8.2.28
/opt/php-8.2/bin/phpize
./configure --with-php-config= /opt/php-8.2/bin/php-config --with-sodium PKG_CONFIG_PATH=$HOME/usr/local/lib/pkgconfig/ LDFLAGS=-L$HOME/usr/local/lib/
make
gmake test
```

# インストール

Xサーバのコントロールパネルで、PHP.ini設定で、以下の1行を追加する

```
extension=$HOME/usr/local/php/extension/sodium.so
```

# 確認

phpinfo();

を表示させて、 sodium と表示されればOK



# クライアントでも使いたい

素直に.bash_profileでPHPのAliasとして設定をする

```.bash_profile
alias php='php8.2 -c ~/<ドメイン>/xserver_php/php.ini'
```
GitHub Pagesの使い方

GitHub Pagesを使えば無料でWebページを全世界に公開できます。

GitHub PagesはGitHubのアカウントを持ってる方であれば誰でも簡単に使うことができる機能です。
ここではGitHub Pagesの使い方を書いていきます。

## GitHub Pagesの使い方
GitHub Pagesを使うためには、リポジトリにWe ページで公開したいファイルが入っている必要があります。
今回の想定としては、作成したリポジトリの`main`ブランチに公開したいファイルが入っている想定です。

1.ヘッダーの`Settings`をクリック
![スクリーンショット 2025-06-05 5.43.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4037626/31358975-7428-43ce-a0be-b5b97f272f04.png)

2.ナビバーの`Pages`をクリック
![スクリーンショット 2025-06-05 5.44.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4037626/0b7735f3-1d62-45fb-967a-84f8327efbeb.png)

3.Branchの`None`を`main`に変更
![スクリーンショット 2025-06-05 5.45.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4037626/b48c1239-ddcc-4ed2-a55b-1825051081fa.png)

:::note info
もし`main`ブランチ以外を公開したいなら、公開したいブランチ名を選択してください。
:::

4.`Save`をクリック
![スクリーンショット 2025-06-05 5.45.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4037626/d7addb98-4088-45b9-921c-7d5c427848b0.png)

5.画面を更新して`Visit site`をクリックすると公開されたWebページにアクセスできます
![スクリーンショット 2025-06-05 5.47.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4037626/911f8bee-f7c8-498d-a8f7-90036b31fc33.png)



## GitHub Pagesを非公開にするには
3番で`main`ブランチに変更しましたが、また`None`に戻していただければサイトは公開されなくなります。

## 終わりに
これだけの簡単な操作でGitHub PagesでWebページを公開できます。
使ったことがない方でもGitHubのアカウントを持ってるのであれば、練習として行ってみるのも良いかもしれません。特に公開できるWebページのファイルがない場合は下記の404の画面が出るだけで、記載した操作自体は可能なのでGitHub Pagesの練習にはなるかと思います。
![スクリーンショット 2025-06-05 6.26.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4037626/036a6641-95fd-43dd-a80f-1d759dcf60ab.png)
🔍企業分析の4ポイント【就活ワーク用まとめ】

就活での企業研究、何を見ればいいの？という方に👇 シンプルで実践的なチェックポイントを紹介します！

## まずは分析の全体像をチェック✅

### ✅ 企業分析の4つのポイント
- 🏢 事業内容・規模
- 🛠 職種・業務内容
- 📚 求められるスキル
- ✍️ 応募理由

## ① 事業内容・規模 🏢
### 調べること
- **何の会社？** メイン商品・サービス
- **業界での立ち位置** シェアや競合との違い
- **会社の大きさ** 従業員数、売上、拠点数
- **将来性** 業績は伸びてる？安定してる？

### どこで調べる？
- 会社HP「会社概要」「事業内容」
- 求人票の会社紹介
- ニュースサイトで会社名検索

## ② 職種・業務内容 🛠
### 具体的にチェック
- **1日何する？** 朝から夕方の業務の流れ
- **使うツール** プログラミング言語、システム
- **誰と働く？** チーム人数、関わる部署
- **何を作る？** 最終的な成果物や目標

### 自分のスキルとの接点
- 学んだプログラミング → どの開発で使う？
- 取得した資格 → 実務でどう活かす？
- 前職の経験 → どう組み合わせる？

## ③ 求められるスキル 📚
### 3つのカテゴリで整理
- **技術スキル** 言語、フレームワーク、資格
- **ビジネススキル** コミュ力、問題解決、チームワーク
- **経験** 業界知識、類似業務、プロジェクト経験

### 現状分析のコツ
- ✅ **今持ってる** → アピールポイント
- 🔺 **少し足りない** → 入社までに補強
- ❌ **全然ダメ** → 入社後に教えてもらう

### ギャップを埋める方法
- 独学でキャッチアップできる技術
- 資格取得で証明できる知識
- ポートフォリオ制作で実力アピール

## ④ 応募理由 ✍️
### 3段階で考える
1. **なぜこの業界？**
   - 将来性、安定性、社会貢献度
   - 自分の興味・価値観との一致

2. **なぜこの会社？**
   - 他社との違い、独自性
   - 企業理念や文化への共感
   - 働く環境や制度の魅力

3. **なぜこの職種？**
   - 自分のスキル・経験が活かせる
   - キャリアビジョンに合ってる
   - 成長できる環境がある

### 志望動機の組み立て方
**「業界への興味」＋「企業の魅力」＋「自分の強み」＋「将来のビジョン」**

例：「IT業界のDX推進に興味があり、御社の地域密着型のシステム開発方針に共感。学習したJavaスキルを活かしながら、将来はプロジェクトリーダーとして地域企業の課題解決に貢献したい」

## 📝 効率的な企業研究の手順
1. **公式サイトを隅々まで読む**（15分）
2. **求人票と照らし合わせて整理**（10分）
3. **自分のスキル・経験とのマッチング確認**（10分）
4. **志望動機を文章化**（15分）

## 📌 実践用ワークシート

```
企業名：株式会社○○システム

1. 事業内容・規模
→ 中小企業向け業務システム開発、従業員50名、売上3年連続成長

2. 職種・業務内容
→ Java/PHPでWebアプリ開発、3-4名チーム、月1回客先訪問あり

3. 求められるスキル
→ Java経験2年以上（自分：基礎習得済み、ポートフォリオで実力証明予定）

4. 応募理由
→ 地域企業のDX化支援に興味。学んだスキルを実践で活かし、
  将来はシステム設計もできるエンジニアになりたい
```

## 🎯 **成功のポイント**
- **具体的な数字や事例**で語る
- **自分の言葉**で志望動機を表現
- **「やりたいこと」と「求められること」**の重なりを見つける

**企業分析は練習すればするほど上達します！** まずは気になる企業で試してみよう✨（＾_＾）b
Exponential backoff and jitter

# Exponential backoff and jitterとは
リトライ戦略の一つです。指数関数的にリトライ間隔を徐々に伸ばしつつランダムなばらつきを付与することでリトライ間隔を調整する手法です。それぞれの単語を和訳すると以下の通りです。
- exponential: 指数関数的な
- backoff: 速度・ペースを落とす
- jitter: ばらつき・揺らぎ・ズレ

# 詳細
- sleep: リトライ間隔
- base: リトライ間隔の基本単位。例：1000msなど
- cap: リトライ間隔の最大値。sleepがcapを超え内容にする。（capは帽子の意味？）
- attempt: リトライ回数

### Exponential backoff無しの普通のリトライ
$$
sleep = base
$$
単純にbaseの秒数だけ待ちます。

メール送信処理を例にします。100人のユーザーが同時にメール送信リクエストを実行したとします（多重度100)。アプリサーバーはメール送信ロジックを1件ずつしか捌くことができないものとします。この場合、まず1人目のメールが送信され残り99人のメールリクエストはリトライに回されます。次に2人目のリクエストが処理され残り98人はリトライに回され…といった挙動を100人目まで繰り返します。

### Exponential backoffを適用＆Jitterを付与(Full jitter)
$$
sleep = random(0 ,min(cap, base \times 2^{attempt}))
$$

$base \times 2^{attempt}$によってリトライ回数に応じた遅延（backoff）が適用されます。また、$random$によってばらつき（jitter）が生まれます。

### Equal jitter
```math
temp = min(cap, base \times 2^{attempt})
```
```math
sleep = \frac{temp}{2} + random(0, \frac{temp}{2})
```
遅延（backoff）とばらつき（jitter）を最小限に留めようとする手法です。jitterがどんな値になろうとも$ \frac{temp}{2}$の分は必ず待つことになります。

### Decorrelated jitter
$$
sleep = min(cap, random(base, sleep \times 3)
$$
前回計算した$sleep$の値を拡大することでsleepの最大化を図ります。
※Decorrelatedは無関心という意味です。

# 実装(Java)
以上を踏まえてJavaでサンプルコードを実装してみました。Equal jitterの例のみ記載します。
```java
    private static int MAX_RETRY = 3;
    private static int CAP = 10 * 1000L; // 10,000ms
    private static int BASE = 1000L; // 1,000ms
    
    private void run() {
        for (int currentTry = 0; currentTry < MAX_RETRY; currentTry++) {
            try {
                doHeavyTask();
                return;
            } catch (final SomeException e) {
                try {
                    final var temp = Math.min(CAP, BASE * Math.pow(2, currentTry));
                    Thread.sleep(temp / 2 + RandomUtils.nextLong(0, temp / 2));
                } catch (final InterruptedException e1) {
                    // sleepでInterruptedExceptionが発生してもログだけ出力して握り潰す
                    log.warn(e1.getMessage());
                }
            }
        }
    }
```

# 参考
https://aws.amazon.com/jp/blogs/architecture/exponential-backoff-and-jitter/

https://aws.typepad.com/sajp/2015/03/backoff.html
Laravel 12 + Fortify その5 トークンで安全なログイン環境を構築

## はじめに

これまでの記事では、Laravel 12 + Fortifyの基本認証やUI連携、認証情報の取得方法などを紹介してきました。  
今回は「トークン」を活用し、APIや外部クライアントからも安全に認証できる仕組みを構築する方法を解説します。

---

## 1. Fortifyとトークン認証

Fortify自体は「ログイン/登録/パスワードリセットなどのエンドポイント提供」が主な役割で、  
API用のトークン認証機能は内包していません。  
そのため、トークン認証には**Sanctum**や**Passport**と組み合わせて使うのが一般的です。  
ここでは「Fortify + Sanctum」を例にします。

---

## 2. Sanctumのインストールとセットアップ

```bash
composer require laravel/sanctum
php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"
php artisan migrate
```

`config/sanctum.php` が生成されます。

---

## 3. Sanctumミドルウェアの有効化

`app/Http/Kernel.php` のAPIミドルウェアグループに `\Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class` を追加（デフォルトで含まれています）。

```php
'api' => [
    \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
    'throttle:api',
    \Illuminate\Routing\Middleware\SubstituteBindings::class,
],
```

---

## 4. Fortifyのエンドポイントでトークンを発行する

Fortifyの`/login`エンドポイントにPOSTすると、通常はセッション認証ですが、APIの場合はコントローラで「トークン発行」を追加します。

例：`routes/api.php` に独自のトークン発行エンドポイントを作成

```php
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use App\Models\User;

Route::post('/token-login', function (Request $request) {
    $request->validate([
        'email' => 'required|email',
        'password' => 'required',
        // カスタム認証の場合、user_codeなども追加
    ]);

    $user = User::where('email', $request->email)->first();

    if (! $user || ! \Hash::check($request->password, $user->password)) {
        return response()->json(['message' => '認証失敗'], 401);
    }

    // トークンを発行
    $token = $user->createToken('api-token')->plainTextToken;

    return response()->json([
        'access_token' => $token,
        'token_type' => 'Bearer',
        'user' => $user,
    ]);
});
```

---

## 5. トークンでAPIを認証する

APIリクエスト時、`Authorization: Bearer {トークン}` ヘッダーを付与します。

```bash
curl -H "Authorization: Bearer {発行されたトークン}" https://your-domain/api/user
```

`routes/api.php` の保護ルート例：

```php
Route::middleware('auth:sanctum')->get('/user', function (Request $request) {
    return $request->user();
});
```

---

## 6. セキュリティのポイント

- トークンは漏洩しないよう厳重に管理
- 必要に応じて「トークン失効」や「スコープ（権限）」の設計も検討
- HTTPS通信を必須にする

---

## まとめ

- Fortifyで認証エンドポイントを構築しつつ、Sanctumでトークン認証APIも簡単に追加できる
- SPAやモバイルアプリ、外部サービス連携でも「安全なログイン環境」を実現
- ユースケースに応じてセッション認証・トークン認証を使い分けよう

---

### 参考

- [Laravel 12 Fortify ドキュメント](https://laravel.com/docs/12.x/fortify)
- [Laravel 12 Sanctum ドキュメント](https://laravel.com/docs/12.x/sanctum)
Laravel 12 + Fortify その4 Auth情報を取得してViewやControllerで使用する

## はじめに

前回までの記事で、カスタム認証やUI連携、パスワードリセット・メール認証のカスタマイズを紹介しました。  
今回は「Laravel 12 + Fortify」の認証済みユーザー情報（Auth情報）をBladeビューやコントローラで取得・活用する基本パターンをまとめます。

---

## 1. コントローラでAuth情報を取得する

### 1-1. 現在のユーザー情報

```php
use Illuminate\Support\Facades\Auth;

$user = Auth::user(); // 認証済みユーザー（Userモデルインスタンス） or null
```

### 1-2. IDのみ取得

```php
$userId = Auth::id(); // 認証済みユーザーのID or null
```

### 1-3. 属性へアクセス

```php
if ($user) {
    $userCode = $user->user_code;
    $email = $user->email;
}
```

---

## 2. BladeビューでAuth情報を使う

### 2-1. Bladeのグローバル変数

Bladeでは`Auth`ファサードまたは`auth()`ヘルパを使うことで、認証ユーザー情報にアクセスできます。

```blade
ようこそ、{{ Auth::user()->name }}さん！
```

または

```blade
@auth
    <p>こんにちは、{{ auth()->user()->name }}さん！</p>
@endauth

@guest
    <p>ログインしてください。</p>
@endguest
```

---

## 3. ミドルウェアでの利用

### 3-1. 認証チェック

コントローラやルートで`auth`ミドルウェアを付与していれば、`Auth::user()`は常に「認証済みユーザー」を返します。

```php
Route::get('/dashboard', function () {
    $user = Auth::user();
    // ...処理
})->middleware('auth');
```

---

## 4. APIでのAuth情報取得

APIルート（`routes/api.php`）でFortifyのトークン認証を使っている場合も、`auth:sanctum`や`auth:api`ミドルウェアを通せば`Auth::user()`が利用可能です。

```php
Route::middleware('auth:sanctum')->get('/user', function (Request $request) {
    return $request->user();
});
```

---

## 5. よくある応用例

### 5-1. ログインユーザーの情報をViewに渡す

```php
public function showDashboard()
{
    $user = Auth::user();
    return view('dashboard', compact('user'));
}
```

Blade内で

```blade
<p>あなたのユーザーコード: {{ $user->user_code }}</p>
```

### 5-2. 条件分岐

```blade
@if(Auth::check())
    <!-- ログイン時の表示 -->
@else
    <!-- 未ログイン時の表示 -->
@endif
```

---

## まとめ

- Fortifyで認証したユーザー情報は、`Auth::user()` や `auth()->user()` でコントローラ・ビューどちらでも簡単に取得可能
- Bladeの`@auth`/`@guest`ディレクティブや、コントローラでの属性アクセスなども活用できる
- APIやSPAでも、ミドルウェア経由で同様に取得できる

---

### 参考

- [Laravel 12 ドキュメント：認証](https://laravel.com/docs/12.x/authentication)
- [Laravel Fortify ドキュメント](https://laravel.com/docs/12.x/fortify)
プロデル、調査 その23

# 概要
プロデルが、CLRらしいので、調べて見た。
練習問題やってみた。

# 練習問題
jsonをツリー表示せよ。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/e1de44fd-3329-47e6-8902-6e995f2db4a0.png)

# サンプルコード

```
//jsonツリー

「shell32.dll」の4番目からアイコン画像を抽出してアイコンとする
メイン画面を表示する
待機する

メイン画面とは
	+値
	ウィンドウを継承する
	はじめの手順
		初期化する
		値からツリーを構築する
	終わり
	初期化する手順
	この設計スケール比率を｛144,144｝に変える
	この内部領域大きさを｛538,417｝に変える
	この内容を「jsonツリー」に変える
	ツリー1というツリーを作る
		その位置と大きさを｛12,12,514,346｝に変える
		その項目高さを20に変える
		その移動順を2に変える
		その位置固定方向を「右＋左＋下＋上」に変える
	値は、JSON形式:「{
		"userID":"ajax",
		"userPW":"xanadu" , 
		"name" : "\u4eca\u671d\u306f",
		"count":1.05
	}」を読み取る
	値を報告する
	終わり
	[値]からツリーを構築する手順
		ツリー1をクリアする
		ツリー1に値をアイコンで追加してルートとする
		ルートに値からツリーを構築する
	終わり
	[値]から[対象ノード]にツリーを構築する手順
		値を組にそれぞれ繰り返す
			対象ノードに「[組のキー]->[組の内容]」をアイコンで追加して子ノードとする
		そして
	終わり
終わり




```

以上。
Laravel12 インストール

```sh:install.sh
composer create-project laravel/laravel:^12.0 プロジェクト名
```

node package をインストール
```
npm install
```

次にenvファイルを設定データベースをデフォルトから変更
よく使うしmysqlで
```
#デフォルトは下記
DB_CONNECTION=sqlite
# DB_HOST=127.0.0.1
# DB_PORT=3306
# DB_DATABASE=laravel
# DB_USERNAME=root
# DB_PASSWORD=

#修正する　環境にあった設定をしてください
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE={データベース名を入力}
DB_USERNAME={usernameを入力}
DB_PASSWORD={passwordを入力}
```
念の為。.envを変更したので
```
php artisan config:clear
php artisan cache:clear
```

artisanでデータベースマイグレーション
```
php artisan migrate
```


dev環境開発を進めるホットリロード開始
```
npm run dev
```

ちなみにこれだけだとviteサーバーが立ち上がっただけ（環境にもよる）
あとは別途webサーバーでlaravelが動作する環境のURLでアクセス
dockerなら特に設定なしでアクセスできる

ちなみにディレクトリのpublicがルートディレクトリに設定されていること

sassの準備 flocss
---
sassインストールしていなかったら

-D（--save-dev）は開発用依存としてpackage.jsonに追加するオプションです

```
npm install -D sass
```

sass-embedded は、Dart Sassの「埋め込み版」で、Node.jsから高速にSassをコンパイルできます。
```
npm install -D sass-embedded
```
Laravel 12 + Fortify その3 パスワードリセットやメール認証のカスタマイズ


## はじめに

前回までに、「カスタム認証」や「Blade UIとの連携」方法を解説しました。  
今回は、Laravel 12 + Fortifyで「パスワードリセット」や「メール認証（メールアドレス検証）」のカスタマイズ方法について紹介します。

---

## 前提

- Laravel 12 プロジェクト
- Fortify導入済み
- メール送信設定済み（ `.env` で `MAIL_` 設定）

---

## 1. パスワードリセットのカスタマイズ

### 1-1. パスワードリセットのフロー

Fortifyは標準で以下のルートを提供します：

- `POST /forgot-password` : リセットリンク送信
- `POST /reset-password` : 新パスワード設定

### 1-2. リセットメールの内容を変更

`app/Notifications/ResetPasswordNotification.php` を作成（自動生成も可能）

```bash
php artisan make:notification ResetPasswordNotification
```

生成されたクラスを編集：

```php
public function toMail($notifiable)
{
    $url = url(route('password.reset', [
        'token' => $this->token,
        'email' => $notifiable->getEmailForPasswordReset(),
    ], false));

    return (new MailMessage)
        ->subject('パスワードリセット通知')
        ->line('パスワードリセットのリクエストを受け付けました。')
        ->action('パスワードをリセット', $url)
        ->line('このメールに心当たりがない場合は、何もする必要はありません。');
}
```

### 1-3. Userモデルで通知クラスを差し替え

```php
use App\Notifications\ResetPasswordNotification;

public function sendPasswordResetNotification($token)
{
    $this->notify(new ResetPasswordNotification($token));
}
```

---

## 2. メール認証（メールアドレス検証）のカスタマイズ

### 2-1. メール認証の有効化

`config/fortify.php`:

```php
'features' => [
    // ...
    Features::emailVerification(),
],
```

### 2-2. メール認証メールのカスタマイズ

`app/Notifications/VerifyEmailNotification.php` を作成

```bash
php artisan make:notification VerifyEmailNotification
```

編集例：

```php
public function toMail($notifiable)
{
    $verificationUrl = $this->verificationUrl($notifiable);

    return (new MailMessage)
        ->subject('メールアドレスの確認')
        ->line('下記のボタンをクリックしてメールアドレスを確認してください。')
        ->action('メールアドレスを確認', $verificationUrl)
        ->line('心当たりがない場合は、このメールを無視してください。');
}
```

### 2-3. Userモデルで通知クラスを差し替え

```php
use App\Notifications\VerifyEmailNotification;

public function sendEmailVerificationNotification()
{
    $this->notify(new VerifyEmailNotification());
}
```

---

## 3. Bladeビューのカスタマイズ

`resources/views/auth/passwords/email.blade.php`  
`resources/views/auth/passwords/reset.blade.php`  
`resources/views/auth/verify-email.blade.php`  
などを用意し、UIを自由に編集できます。

---

## 4. テスト方法

- パスワードリセット画面からメールアドレスを送信し、カスタムメールが届くか確認
- 新規登録後、メール認証が必要か・認証メールがカスタム内容で届くか確認

---

## まとめ

- Fortifyのパスワードリセット/メール認証は通知クラスの差し替えで柔軟にカスタマイズ可能
- Bladeビューやリダイレクト先も自由に調整できる

---

### 参考

- [Laravel 12 Fortify公式ドキュメント（パスワードリセット）](https://laravel.com/docs/12.x/fortify#password-reset)
- [Laravel 12 Fortify公式ドキュメント（メール認証）](https://laravel.com/docs/12.x/fortify#email-verification)
- [通知カスタマイズ](https://laravel.com/docs/12.x/notifications)
Java開発環境構築（その２）

～統合開発環境（IDE）をインストール～

## はじめに
前回の記事の続きになります。

https://qiita.com/Noriyuki1203/items/d509812d0f2d1943998c

## 開発環境

- OS: Windows 11  
- IDE: Visual Studio 2022（17.9 以降）  
- .NET: 8.0  
- Google Play Console を使用

---

## ダウンロード
公式サイトへアクセスし「Download　x86_64」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4088188/94b34def-a577-4f39-9756-aeedd04d666c.png)

インストーラーを起動し「Eclipse IDE for Enterprise Java and Web Developers」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4088188/aa401358-009c-40b5-b6ca-bd3b86f37d78.png)
画面に沿ってインストールする。

## エクリプス起動

エクリプス起動後にしたような画面が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4088188/028aea83-dd4e-4c7c-b5d3-6af7a4bad065.png)

画面の選択肢の意味
- Exclude Eclipse IDE from being scanned to improve performance.
　Eclipse IDEをDefenderのスキャン対象から除外する
　→ 起動や動作が少し速くなる可能性がある。

- Keep Eclipse IDE being scanned by Microsoft Defender.
　Eclipse IDEをDefenderのスキャン対象に含めたままにする
　→ 通常のセキュリティレベルを維持。ごくまれにパフォーマンス低下の要因になる場合もあります。

 今回はセキュリティを優先します。

 ## おわりに
 これで総合開発環境（IED）のインストール手順を終わります。
 次回はtomcatサーバーのダウンロードと設定について書いていきます。
星型森モデルの記事の概略






---

🧭 はじめに（導入）

星型森モデルとは何か？

「憲法を中心に据えた、各法分野との連関を“星”と“森”の構造で捉える法理論」

個人の自由、法の普遍性、社会の多様性を、比喩と構造で表現


この理論が生まれた背景

幼少期からの憲法への疑問

法と道徳、自由と制約の交錯への問い

自身の経験・直観・洞察の蓄積




---

📚 各章の要点とリンク（節のダイジェスト）


---

第1章：発端としての道徳授業

7歳時の憲法への違和感

「精神の自由」による殺意の正当化への反発

法の支配と個人の感覚のズレから生じた問題意識
🔗 [→ 該当記事リンク]



---

第2章：内在する“自由”の疑念

経済的自由と法の役割

「自由を守るための制限」とは何か

規範の階層性と使い方への気づき
🔗 [→ 該当記事リンク]



---

第3章：神樹構造の発想

各法分野を“神樹”に見立てた森の構想

憲法を天に掲げる星として配置

「森と星」による法の調和的全体構造の視覚化
🔗 [→ 該当記事リンク]



---

第4章：星型森モデルの構成

憲法＝星、各法域＝森の神樹

神樹は時代と文化に応じて成長・変容

憲法の普遍性と個別法の多様性のバランス
🔗 [→ 該当記事リンク]



---

第5章：湖と滝のモデル（変化と受容の比喩）

法律は時代の“水”を受け入れる「湖」

新たな水は“滝”として神樹を潤す

変化への柔軟性と持続可能性の象徴
🔗 [→ 該当記事リンク]



---

第6章：神樹の構成と各法域の分類

民法、刑法、行政法などの具体的な神樹構造

各法域がどのように星（憲法）とつながるか

学問としての法体系の位置づけと連関
🔗 [→ 該当記事リンク]



---

第7章：AI関連法と星型森モデルの応用

生成AI時代における法整備の課題

「AI神樹」は存在するか？

倫理・技術・権利の交差点と星型森モデルの可能性
🔗 [→ 該当記事リンク]



---

第8章：想定問答と批判的検証

よくある質問と理論への反論

それに対するモデル内での応答

社会実装や教育現場での応用可能性
🔗 [→ 該当記事リンク]



---

第9章：図解とまとめ

星型森モデルの全体構造を視覚化

神樹・湖・滝・星の位置関係

図解と簡潔なまとめ
🔗 [→ 図解掲載記事リンク]



---

📌 補足案内

Q&A・想定問答まとめページ（FAQ形式）

用語集・比喩解説ページ（神樹・星・湖など）

寄稿・対話ログ・派生考察ページ（読者との意見交換含む）



---

🔗 星型森モデル：はじめての人向けリンク

内容	リンク例

要約ページ（このページ）	https://qiita.com/chenglaia24/items/要約
初出記事（全文）	https://qiita.com/chenglaia24/items/全文リンク
図解単独記事	https://qiita.com/chenglaia24/items/図解
Q&A	https://qiita.com/chenglaia24/items/faq



---
Geminiでとんぼを使う魔法少女を描いてみた。

# 概要

Geminiでとんぼを使う魔法少女を描いてみました。

# 実装

プロンプトと実行結果は以下の通りでした。

```
聖なるとんぼを使う魔法少女を描いてください。
```

![聖なるとんぼを使う魔法少女_20250605.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/8a9f33e1-6d18-495c-a7e9-21ed2c93e172.png)

# まとめ

可愛い。何かの役に立てばと。