OmniAICreator/Qiita-1.07M huggingface dataset:
今話題のFramePack-eichi をwsl2(ubuntu)環境で実行


# 今話題の FramePack-eichi を Ubuntu（WSL2）環境で動かす手順

現在注目されている動画生成フレームワーク **FramePack-eichi** を、Ubuntu（WSL2）環境で動作させる手順を紹介します。

Windows 上では比較的簡単に動作しますが、今回は **WSL2（Ubuntu）** 上でのセットアップを試みました。  
※ 本記事では、**Anaconda3 等で Python 実行環境が整備済み**であることを前提とします。

---

## 🔍 FramePack-eichi とは？

`FramePack-eichi` は、lllyasviel 氏による [lllyasviel/FramePack](https://github.com/lllyasviel/FramePack) をベースに、nirvash 氏が改良した [nirvash/FramePack](https://github.com/nirvash/FramePack) をさらに拡張したプロジェクトです。

公式 GitHub リポジトリ（英語版）：  
👉 https://github.com/dijama/FramePack-eichi-eng

---

## ✅ Step 1: nirvash/FramePack を動かす

まずは元となる `nirvash/FramePack` を導入・確認します。

### 📥 ダウンロード

以下のいずれかからダウンロード：

- [Civitai モデル配布ページ](https://civitai.com/models/1513256/illyasviels-standalone-framepack)
- [nirvash/FramePack GitHub](https://github.com/nirvash/FramePack)

ダウンロード後、`framepack_cu126_torch26` フォルダを WSL2 の任意の場所に配置します。

---

## 🛠 Step 2: 仮想環境のセットアップと動作確認

```bash
cd framepack_cu126_torch26/webui
python -m venv venv
source venv/bin/activate
pip install -r requirements.txt
```

途中で `torchvision` が無いというエラーが出た場合は以下を実行：

```bash
pip install torchvision
```

その後、以下のコマンドで Gradio サーバーを起動：

```bash
python demo_gradio.py --server 127.0.0.1
```

初回起動時にはモデルのダウンロードが始まり、完了までに数分〜数十分かかります。

![スクリーンショット 2025-05-04 191436.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430586/015a2f80-8012-475d-8555-99e6bb5dd5b0.png)

---

## 🎬 Step 3: 動作確認
```
* Running on local URL:  http://127.0.0.1:7860

To create a public link, set `share=True` in `launch()`.
```
と、表示されたら、
ブラウザで以下にアクセス：
（上の utlリンクをctrlキーを押しながタップすると、ブラウザが開きます。）

```
http://127.0.0.1:7860/
```

左上の「Image」欄に画像をドロップし、プロンプトを入力して「Start Generation」を押すと、処理が開始されます。

生成完了後、「Finished Frames」欄にアニメーションが表示されれば成功です。

![スクリーンショット 2025-05-04 203959.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430586/fc1f21cd-8b04-40dd-81da-e5aa9974d86b.png)

---

## 🚀 Step 4: FramePack-eichi を導入

### リポジトリをクローン

```bash
cd ~/your_workspace
git clone https://github.com/git-ai-code/FramePack-eichi.git
```

### ファイルを上書きコピー

`FramePack-eichi/webui` 以下のファイルをすべて `framepack_cu126_torch26/webui/` にコピーします：

```bash
cp -r FramePack-eichi/webui/* framepack_cu126_torch26/webui/
```

---

## ▶ Step 5: FramePack-eichi の起動

```bash
python endframe_ichi.py
```

以下のように表示されたら成功です：

```
* Running on local URL: http://127.0.0.1:8001
```

ブラウザでアクセスして、FramePack-eichi のインターフェースが表示されれば完了です。
（上の utlリンクをctrlキーを押しながタップすると、ブラウザが開きます。）

---

## ✅ まとめ

- WSL2（Ubuntu）でも FramePack-eichi の導入・動作は可能
- `torchvision` など一部依存関係は手動インストールが必要
- Gradio UI で簡単に画像〜動画生成が可能
MLflow Tips

# メモ

* UI上でexperimentを削除しても、mlruns/.trash内に残ってるので、同じ名前のexperimentを再作成できない。なので、同名のexperimentを作成する際は.trash内のデータを削除する必要がある
* 関数内でset_experiment(experiment_name)を実行すると、experiment_nameの有無に関係なく毎回同じexperiment_idが設定される。そのため存在しないexperimentでstart_runする状況が生まれエラーを出すことがある（experimentの削除を行うと）。したがって、関数外で一発set_experimentする必要がある

```python:NG(関数内でset_experiment)
import mlflow
def func():
    mlflow.set_experiment("experiment_name")　★存在しないexperiment_idが設定されるケースが発生しうる
    with mlflow.start_run(): ★ここでエラー発生
        ...
```
```python:OK(関数外でset_experiment)
import mlflow
mlflow.set_experiment("experiment_name")
def func():
    with mlflow.start_run():
        ...
```
Linucレベル１勉強メモ　＃１４

＃ 第一章　Linuxのインストールと仮想マシン・コンテナの利用

練習問題1.14
linuxのGUI環境についての説明として適切なものを全て選択してください。

A. X Window systemはXサーバーとXクライアントから構成される。XサーバーとXクライアントは別々のコンピューターで動作していても良い

B. ウィンドウマネージャはX Window Systemの外観を制御している。XDMやGDMなどがある。

C. X.OrgはX Window Systemの実装の１つである。

D. GNOMEやKDEは多数のソフトウェアから構成される統合デスクトップ環境である。

E. WaylandはGUIを実現する手段としては古いので最近は使われなくなってきている。

（解答）　A,C,D

（解説）
選択肢A,C,Dは適切な説明です。「XDMやGDM」はウィンドウマネージャではなくディスプレイマネージャです。WaylandはX.OrgなどのX Window Systemよりも新しいGUI実現の仕組みですのでEは誤り。

X Window Systemの構成について
Linux自体には、GUIを実現する機能が実装されていないため、その手段としてX Window Systemが使えわれてきました。最近では新しい手段とした従来のUNIX系OSで使われていたシステムより派生したX.Orgと、新しく開発されたWaylandがあります。

X Window Systemの構成は
* Xサーバー
* Xクライアント
があります。

X Window systemの外観を制御しているウィンドウマネージャの主な種類について
* twn
* FVWM
* Enlightenment
* Mutter
* Fluxbox
* Conpiz
* KWin

GUIでログイン画面を表示し、ユーザー認証を行うディスプレイマネージャの種類について
* XDM
* GDM
* KDE
* SDDM

（わからない単語解説）
* 統合デスクトップ<br>linuxディストリビューションでは、ウィンドウマネージャも含め、アプリケーションまで揃えて統一的な操作が提供されるのが一般的です。代表例はGNOMEとKDEです。
LINUX　GUIプログラムの骨組み（備忘録）

## 骨組みのコード

```xdemo.c
#include <X11/Xlib.h>
#include <stdio.h>
#include <stdlib.h>

int main() {
    Display *dpy = XOpenDisplay(NULL);         // Xサーバへ接続
    if (!dpy) {
        fprintf(stderr, "Can't open display\n");
        exit(1);
    }

    int screen = DefaultScreen(dpy);           // 使用するスクリーン番号
    Window win = XCreateSimpleWindow(
        dpy,                     // Xサーバとの接続ハンドル
        RootWindow(dpy, screen),// 親ウィンドウに RootWindow (最上位のウィンドウ) を指定
        100, 100, 400, 200,                    // x, y, width, height
        1,                                     // 境界線の太さ
        BlackPixel(dpy, screen),               // 境界線の色
        WhitePixel(dpy, screen)                // 背景色
    );

    XSelectInput(dpy, win, ExposureMask | KeyPressMask); // 描画とキー入力イベントを監視
    XMapWindow(dpy, win);                      // ウィンドウを画面に表示

    XEvent event;
    while (1) {
        XNextEvent(dpy, &event);               // イベント待ち

        if (event.type == Expose) {            // 再描画要求
            XDrawString(dpy, win,
                        DefaultGC(dpy, screen),
                        50, 100, "Hello Xlib!", 11);
        }
        else if (event.type == KeyPress) {     // キーが押されたら終了
            break;
        }
    }

    XCloseDisplay(dpy);                        // 接続終了
    return 0;
}

```

| 構成要素            | 説明                                              |
|---------------------|---------------------------------------------------|
| `XOpenDisplay()`     | Xサーバと接続を行う関数。ディスプレイ名を指定して、Xサーバへ接続する。 |
| `XCreateSimpleWindow()` | ウィンドウを作成する関数。指定した親ウィンドウ上に新しいウィンドウを作成。  |
| `XMapWindow()`       | 作成したウィンドウを画面に表示する関数。ウィンドウは最初非表示なので、表示する必要がある。 |
| `XSelectInput()`     | 受け取るイベント（`Expose`、`KeyPress`など）を指定する関数。どのイベントを待機するかを設定。 |
| `XNextEvent()`       | イベントが発生するまでプログラムを止めて待機。 |
| `XDrawString()`      | ウィンドウ上の指定した座標に文字列を描画する関数。|


## 動作確認
```
gcc -o xdemo xdemo.c -lX11
./xdemo
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4054974/600e9653-b762-4d6b-bdaf-41efe64d020b.png)

## 動作環境
gcc version 11.4.0 (Ubuntu 11.4.0-1ubuntu1~22.04) 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4054974/699dded1-ddaf-486d-8f3b-43fc63281312.png)
USDのチュートリアル

以下のチュートリアルをしてみる
https://openusd.org/release/tut_usd_tutorials.html

####  Hello World - Creating Your First USD Stage
- 作成したUSDはテキストファイルとして見ることができる
  - def {}という感じで定義されている
- stageがroot

#### Hello World Redux - Using Generic Prims
1. ```xformPrim = UsdGeom.Xform.Define(stage, '/hello')```
1. ```xform = stage.DefinePrim('/hello', 'Xform')```
上のように2つの書き方ができる

#### Inspecting and Authoring Properties
- アトリビュート取得して値を設定可能
```GetAttribute('attributeName').Set(2)```

#### Referencing Layers
- 参照の設定
```GetReferences().AddReference('./HelloWorld.usda')```

#### Converting Between Layer Formats
- バイナリとテキスト形式の変換可能
  - usdcatで変換する
- テキスト：usda
- バイナリ：usdc,usd
Fedora42 で VirtualBox が動かない件


Fedora42 で、VirtualBox を動かそうとしましたが、動かないです。この様なエラーが出力されています。

```
VirtualBox can't operate in VMX root mode. Please disable the KVM kernel extension, recompile your kernel and reboot
```

ホストマシンのカーネルは、このようです。
```
$ sudo ls -la /boot/vmlinuz*
-rwxr-xr-x. 1 root root 11802352 11月 23  2022 /boot/vmlinuz-0-rescue-e60d1e12009c487e92312842906a4dfd
-rwxr-xr-x. 1 root root 16939368  4月  7 09:00 /boot/vmlinuz-6.13.10-200.fc41.x86_64
-rwxr-xr-x. 1 root root 17148264  4月 10 09:00 /boot/vmlinuz-6.14.2-300.fc42.x86_64
-rwxr-xr-x. 1 root root 17152360  4月 25 09:00 /boot/vmlinuz-6.14.4-300.fc42.x86_64

$ uname -r
6.14.4-300.fc42.x86_64
```

こちらの記事を参考にして、この設定を入れてマシンを再起動したところ、VirtualBox が起動するようになりました。

```
sudo vim /etc/default/grub
# add kvm.enable_virt_at_load=0 to the line starting with GRUB_CMDLINE_LINUX
# then don't forget
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
# and reboot
```

https://discussion.fedoraproject.org/t/after-upgrading-to-kernel-6-12-virtualbox-fails-to-start/139896
Gradleマルチプロジェクトではmiseの強みを活かせなかった話

## はじめに

miseを実務で使っていて、Gradleのマルチプロジェクトとは相性が悪いことに気づいたので、書き残しておきます。

miseの使い方や、そもそもmiseとは何かの話は、過去に書いた↓の記事を参考にしてください。

https://qiita.com/fujithuro/items/b63a4aea09e1b277f689

https://qiita.com/fujithuro/items/f2902323f7d6d28b9124


## miseでサブプロジェクトのバージョン管理はできない

Gradleのマルチプロジェクトだと、miseでのバージョン管理はうまくいきません。
具体的に何が言いたいかと言うと「サブプロジェクトごとにmiseでバージョンを切り替える」という使い方は難しい、ということです。


### `mise`の設定スコープはカレントディレクトリが基準

miseには、`mise.toml`という設定ファイルにツールやバージョンを記載してプロジェクト内に配置することで、チームでの開発環境共有を簡単に行える仕組みがあります。カレントディレクトリから親ディレクトリ方向へ探索していき、最初に見つかったものが優先される仕様です。

https://mise.jdx.dev/configuration.html

この仕組みのおかげで単にプロジェクトを移動するだけでツールやランタイムのバージョンを切り替えられるのですが、これはGradleのマルチプロジェクト構成とは相性が悪いです。

ルートプロジェクトの下に2つのサブプロジェクトがある場合を例に説明します。

```
root-project/
├── build.gradle.kts
├── gradlew                     # ここが起点
├── mise.toml                   # ← この設定が全体に適用される
├── settings.gradle.kts
├── sub-project-a/
│   ├── build.gradle.kts
│   └── mise.toml              # ← これは読み込まれない
└── sub-project-b/
    ├── build.gradle.kts
    └── mise.toml              # ← これも読み込まれない
```

サブプロジェクトがいくつあっても、`gradlew`はルート直下にしかありません。つまりGradleを実行する際は常にルート直下が起点になります。
このため、`sub-project-a`と`sub-project-b`で別々にバージョン管理をしたいと思い、それぞれに`mise.toml`を配置しても、`gradlew`のあるルート直下やそれより上（親ディレクトリ方向）しか探索されないので、サブプロジェクトの設定ファイルが読み込まれることはありません。

結果、ルート直下の`mise.toml`（あるいはグローバル設定）だけが使われます。

開発者のローカル端末内に限れば、サブディレクトリへ移動してからGradleを動かせば、そのディレクトリの`mise.toml`が読まれるでしょうが、その時点で「複数プロジェクトをまとめてビルドする」という本来の目的から外れるので本末転倒です。


### じゃあどうしたらいいの?

こうした問題がある以上、無理にmiseを使うのではなく、Gradle標準の仕組みを活用するのが現実的だと思います。

まずJDKについては、`Java Toolchains`を使えば「Gradle自体が使うJDK」と「各サブプロジェクトで使われるJDK」はそれぞれ別に管理できます。

https://docs.gradle.org/current/userguide/toolchains.html

また、各種ライブラリなどの依存関係やそれらのバージョンは、サブプロジェクトごとのビルドスクリプト（`build.gradle`や`build.gradle.kts`）で置き換えられます。


```gradle: build.gradle.kts
java {
    toolchain {
        languageVersion.set(JavaLanguageVersion.of(17))
    }
}


dependencies {
    implementation("com.fasterxml.jackson.module:jackson-module-kotlin:2.14.0")
    ...
}
```

このように、マルチプロジェクト構成では潔くGradleの機能で完結させるのが現実的かと思います。
miseはもちろん便利なツールなのですが、カレントディレクトリを基準にして管理するその特性上、マルチプロジェクト構成とは合いませんでした、というお話でした。
【初心者#3】Pythonのインストール(2025)

さて、Pythonをインストールする手順です。

# 0. はじめに
以下の前提でPython環境を構築しています。

**OS：Mac OS Sequoia 15.4
パッケージ管理システム：Homebrew 4.5.0 ※インストール済み
Pythonパッケージ：公式版Python**

今回の環境構築はPythonを用いたゲーム作成を目的にしているため、シンプルに公式版Pythonをインストールすることにしました。データサイエンスや機械学習に関する作業を効率的に行うためのプラットフォームであるAnacondaを介してPythonを利用する方法もあるようなのですが、そちらは、別の機会としたいと思います。

# 1. HomebrewでPythonパッケージをインストールする

以下のコマンド打つと、インストールできるPythonパッケージが表示されます。

```
% brew search python@3
==> Formulae
python@3.10     python@3.12     python@3.8      ipython         jython
python@3.11     python@3.13     python@3.9      bpython         cython
```

今回は、brewを使って最新バージョンのpython@3.13をインストールしていきます。
```
% brew install python@3.13
```
無事、pythonがインストールされたかどうかを確認してみます。
```
% python3 --version
Python 3.13.2
```
Python 3.13.2がインストールされていることが確認できました。

同時に、Pythonのパッケージを管理するためのツールであるpipもインストールされているはずなので、確認しておきます。
```
% pip --version
pip 25.0 from /opt/homebrew/lib/python3.13/site-packages/pip (python 3.13)
```
インストールしたpython3.13の配下にpipがインストールされていることを確認できました。
これで、pythonが実行できる環境が整いました。

# 2. プロジェクトごとに仮想環境を構築する
Pythonでは複数プロジェクトの干渉を避けるため、プロジェクトごとに独立したPython実行環境を用意することを推奨しています。推奨に従って、プロジェクト用の仮想環境を準備していきます。

### ①仮想環境の生成
プロジェクト用にProject1という名前のディレクトリを用意し、そこにvenvコマンドを使って仮想環境を生成します。
```
% mkdir project1
% cd project1
% python3 -m venv .venv
```
これで.venvという名前の仮想環境が生成されました。

### ②仮想環境の有効化
作成した仮想環境を有効化してみましょう。
sourceコマンドを実行し、ターミナルのプロンプトの先頭に、仮想環境名(.venv)がついた状態になれば、仮想環境が有効化できています。
```
% source ./.venv/bin/activate
(.venv) username@UserMacBook-Air project1
```
仮想環境を無効化したいときは、deactivateと打ちます。
```
(.venv) % deactivate
```

### ③パッケージの追加
仮想環境に、プロジェクトに必要な追加パッケージを追加していきます。
仮想環境(.venv)を有効化した状態のまま、パッケージをインストールすることで、.venvの配下にパッケージがインストールされます。今回は、ゲーム作成のために必要なpygameというパッケージを入れておきます。

pipコマンドを使ってインストール。
```
% pip install pygame
```

### ④テストコードの実行
所望の環境が構築できているかの確認をしておきます。
今回は、pythonスクリプトが実行でき、かつ、インストール済みのpygameをインポートできれば、成功とします。

以下のようなテストコードを書いて、実行してみます。インポートエラーが出ず、Hello worldの文字が出力されればOKです。

テストコード
```
# test.py
print('Hello world')
import pygame
import random
```

プロンプトの出力結果
```
% python3　test.py
Hello world
pygame 2.6.1 (SDL 2.28.4, Python 3.13.2)
Hello from the pygame community. https://www.pygame.org/contribute.html
```
うまくいったようです！
初めてのハッカソン参加

# 初めてのハッカソン参加レポート 

2025年5月3日〜5月4日に開催された **Beginner's Hackathon** に参加して、実質24時間でチーム開発に挑戦しました。その体験を備忘録としてまとめます。

デプロイURL：https://student-groups-rally.streamlit.app/
リポジトリ：https://github.com/LanternUnivers/StudentGroups

完成画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3535173/922299cc-31b3-4b6a-8c13-854710bf0b6f.png)



## 🔰 チーム構成とスキル感

参加前の事前面談で「Pythonチームがいい」と伝えていたため、**Pythonチーム**に配属されました。

チームは3人構成：

- 自分（ランタン）: bot開発などの経験あり
- Tyo
- かまむー

メンバーほとんどが**共同開発未経験＆Python少し触ったことがある程度**でしたが、「初心者向けハッカソン」らしく、楽しくやれました。

## 💡 アイディア決定と開発方針

ハッカソン開始直後はアイディアソンからスタート。以下の流れで進めました。
テーマが「**誰かの役に立つサービスを開発しよう！**」でした

1. マンダラートで「悩み」についてたくさん書き出しをする
2. 書き出した「悩み」から一人一つアイディアを出し、**3つのアイディア**を出し合う
3. その中から、**学生団体と学生をつなぐ掲示板アプリ**を作ることに決定
4. **MVP（Minimum Viable Product）方式**で最低限動くものから開発スタート

## 🛠️ 開発の進め方

- GitHubが不慣れなメンバーがいたため、ファイルを**ZIPで受け取り、自分がマージ＆コンフリクト解消**
- 案出しや進行は他メンバーに任せ、自分は**開発に集中**
- **Copilot**を活用して高速開発
- カレンダー機能やマップUIにもチャレンジしましたが、**streamlitの制限により断念**した部分もありました

## ✅ 実装した主な機能

### 1. イベント一覧表示
- **イベント情報**（名前、場所、日時、内容、募集人数、カテゴリー）をカード形式で表示
- **検索機能**（イベント名やカテゴリーで絞り込み）
- **応募機能**（名前とメールアドレスを入力して応募）
- **地図表示**（開催場所をマップに表示）
- **レビュー表示**（満足度・感想）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3535173/f1f5460b-0a02-45dc-b9f2-ad2b6fe15a9c.png)

### 2. ジャンル選択
- **画像付きでジャンル**（例: 新歓、勉強会、スポーツなど）を表示
- **ジャンルクリックで関連イベント検索（未実装）**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3535173/047e5416-85bf-417f-8be1-8d5d6909619a.png)

### 3. イベントマップ
- 地図上にイベントをプロット

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3535173/2f3d6084-a230-4773-96a2-97502974df7a.png)


### 4. レビュー投稿
- 応募者リストに登録されているユーザーのみ投稿可能
- ⭐1〜⭐5の満足度＋コメント

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3535173/2d8a2e1c-0fb2-4eea-8f57-0f812e8a8b26.png)



### 5. サークル登録
- サークル名・アイコン画像・パスワードを設定して登録

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3535173/873c7e7b-daa1-4efd-8bd8-7d7f579766bd.png)


### 6. サークル管理者画面（ログイン機能付き）
- サークル名＋パスワードでログイン
- イベントの追加・編集・削除
- 応募者リストの確認
- ログアウト機能

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3535173/5d5af429-1f1d-45bd-8e35-ab1c6cf0c5fe.png)

## 📌 うまくいったこと
- **完成形まで開発＆デプロイ**できた！
- **コンフリクトの解消がスムーズ**にできた
- **Copilotを活用した高速開発**ができた


## :thinking:うまくいかなかったこと・苦労したこと
- **streamlitの制限**によりカレンダーや地図のホバー機能を実装できず
- **UIの自由度が低く**、やりたかった表現を断念した部分も


## 🌟 良かった点・チームの雰囲気
- アイディア出しから実装まで**協力して進められた**
- 各メンバーが個人タスクを**スムーズにこなせた**
- **役割分担**がうまくできた


## 🔧 改善点
- GitHubの使い方を**もっと共有・練習すればよかった**
- 進捗をもっと**細かく共有**できるとさらに良かった


## 💪 個人的に成長したこと

- **コンフリクト解消が早くなった**
- **技術がわからない人に教えながら開発**を進められた


## 🙌 最後に

今回のハッカソンでは、時間の制約の中で開発からデプロイまでやりきることができ、大きな自信になりました！

チームで何かを作ることの楽しさと難しさを学びつつ、自分の役割に集中する重要さを再認識しました。

初心者でも**やってみること**が一番の成長だと実感できたイベントでした。

今までは開発力がないからハッカソンに応募するのをためらっていましたが、自信をつけることができたのでとてもよかったです！

次は、もっと自由度の高いフレームワークやチーム開発の練習もして、さらに良いものを作れるようにしていきたいです！

---
📌 使用技術: Python, Streamlit, GitHub, Copilot
誰でもわかるVZエディタ  IBM-PC対応

祝VZエディタソースコード公開
https://qiita.com/kaizen_nagoya/items/baad23cf4a041ce845a9

祝：ソースコード公開：VZエディタ移植の方法と成果。註釈 coding(123)
https://qiita.com/kaizen_nagoya/items/5551be98dcbed8f41949

オープンソース化されたVZエディタをブラウザ上で動かしてみる
https://qiita.com/Takaraya/items/785ac9319c3934e30703

# Github
vcraftjp/VZEditor
https://github.com/vcraftjp/VZEditor/

誰でもわかるVZエディタ。0から始める。
https://qiita.com/kaizen_nagoya/items/afe6c4cdccbfdd94baab
## SRC
順次、ソースコードの解説、改良点などを追記予定。

### IBM
VZエディタはversion １は、PC-9801用
version 1.5からIBM-PC用も同梱。

ソースコードの構造も、きれいに整理されている。
.defファイルは、マクロ定義ファイル。起動時に読み込むことにより、設定が有効になる。

VZ-IBM
https://github.com/vcraftjp/VZEditor/tree/main/VZ-IBM

AX	
MISC
PS55
SRC
US
WIN
BLOCK.DEF
BW.DEF
CVTKEI.DEF
GAME.BAT
GAME.DEF
HELP.DEF
HELPE.DEF
INSTALL.BAT
KEISEN.DEF
KEISEN_J.DEF
MAC16.DOC
PALET.DEF
README.DOC
TOOL.DEF
VMAP.COM
VMAP.DOC
VWX.COM
VWX.DOC
VZ.BAT
VZ16.DEF
VZ16.DOC
VZ16E.DEF
VZFL.DEF
VZFLE.DEF
VZIBM.COM
VZIBM.DEF
VZIBMJ.COM
VZIBMJ.DEF
VZSEL.COM
ZCOPY.COM
ZCOPY.DOC
ZENHAN.DEF

# Ref
オープンソース化されたVZエディタをブラウザ上で動かしてみる
https://qiita.com/Takaraya/items/785ac9319c3934e30703
「Betti's theorem#Example(wikipedia)」を参考にsympyで。(その1/2)

:::note info
[AI先生に聞きました。(その2/2)](https://qiita.com/mrrclb48z/items/4562c830804a71b06d4f)
:::

# オリジナル
Example ＜

https://en.wikipedia.org/wiki/Betti%27s_theorem#Example

# sympyで
#### ver0.1
・幾何学的境界条件が同じ。ユーザー定義にした方がヨカッタかも。
```python
# ver0.1
from sympy import *
var('P,L,x,a,EI,l')
var('Q,L1,L2')
w_L  = P*L**3/(6*EI)*(3*x**2/L**2-x**3/L**3)
w_Lab= P*a**3/(6*EI)*(3*x/a-1)
# 
ΔP2=w_L  .subs({     x:L2,L:L1}).simplify()     #;print("#",ΔP2)
ΔQ1=w_Lab.subs({P:Q ,a:L2,x:L1}).simplify()     #;print("#",ΔQ1)
print("#",Eq(P*ΔQ1,Q*ΔP2))
# L2**2*P*(3*L1 - L2)/(6*EI)
# L2**2*Q*(3*L1 - L2)/(6*EI)
# True
```

# (類題)SME 例題9.9 P160
#### ver 0.2
```python
# ver 0.2
from sympy import *
var('PA,PB,a,EI,l')
δ11= PA*a**3/(3*EI)           
δ21=(δ11           +PA*a**2*(l-a)/(2*EI)).simplify() #;print(δ21)
δ12=PB*a**2/(6*EI)*(3*l-a)                           #;print(δ12)
# δ22=PA*l**3/(3*EI)           
print("#",Eq(δ12*PA,δ21*PB))
# True
```
#### ver 0.3
・ver 0.2と同じ。
```python
# ver 0.3
from sympy import *
var('P,L,x')
var('PA,PB,a,EI,l')
w_L  = P*L**3/(6*EI)*(3*x**2/L**2-x**3/L**3)
w_Lab= P*a**3/(6*EI)*(3*x/a-1)
# 
δ2A=w_Lab.subs({P:PA,x:l})    .simplify()     ;print("#",δ2A)
δ1B=w_L  .subs({P:PB,x:a,L:l}).simplify()     ;print("#",δ1B)
print("#",Eq(δ1B*PA,δ2A*PB))
# PA*a**2*(-a + 3*l)/(6*EI)
# PB*a**2*(-a + 3*l)/(6*EI)
# True
```
# いつもの? sympyの実行環境と 参考のおすすめです。
[(テンプレート)](https://qiita.com/mrrclb48z/items/00dd08b0317069be9342)

# いつもと違うおすすめです。
#### Qiita内

https://qiita.com/mrrclb48z/items/e7eab594dc3e876ed9ca

#### wikipedia

#### 参考文献

#### web
Djangoで簡単Webアプリ開発入門

# はじめに

DjangoはPython製の人気Webフレームワークで、「管理画面」「認証」「ORM」など実用的な機能が標準装備されています。この記事では、**Django未経験者でも1時間で動くWebアプリを作れる**ことを目指し、環境構築からシンプルなアプリ作成までを丁寧に解説します。

---

# 1. Djangoのインストール

まずはDjangoをインストールしましょう。Pythonがインストールされていれば、コマンド1つでOKです。

```bash
pip install django
```

---

# 2. プロジェクトの作成

Djangoでは「プロジェクト」と「アプリ」という単位で開発します。まずはプロジェクトを作成しましょう。

```bash
django-admin startproject myproject
cd myproject
```

---

# 3. アプリの作成

次に、Webアプリの機能単位となる「アプリ」を作成します。ここでは「hello」というアプリを作ります。

```bash
python manage.py startapp hello
```

---

# 4. ビューの作成

`hello/views.py`を編集し、Webページの表示内容を記述します。

```python
from django.http import HttpResponse

def index(request):
    return HttpResponse("Hello, Django!")
```

---

# 5. URLの設定

アプリのURLをプロジェクトに登録します。

## 1. アプリ側のURL設定

`hello/urls.py`を新規作成し、以下を記述します。

```python
from django.urls import path
from . import views

urlpatterns = [
    path('', views.index, name='index'),
]
```

## 2. プロジェクト側のURL設定

`myproject/urls.py`を編集し、helloアプリへのルーティングを追加します。

```python
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('hello.urls')),  # ここを追加
]
```

---

# 6. サーバーの起動と動作確認

開発用サーバーを起動します。

```bash
python manage.py runserver
```

ブラウザで `http://127.0.0.1:8000/` にアクセスすると「Hello, Django!」と表示されれば成功です。

---

# 7. 管理画面を使ってみよう

Djangoの大きな特徴は「管理画面」。まずは管理ユーザーを作成します。

```bash
python manage.py createsuperuser
```
指示に従ってユーザー名・メール・パスワードを設定。

サーバー起動中に `http://127.0.0.1:8000/admin/` にアクセスし、ログインすると管理画面が使えます。

---

# 8. テンプレート（HTML）の利用

HTMLファイルを使って、よりリッチなWebページも作れます。

## 1. テンプレートフォルダを作成

`hello/templates/hello/index.html` を作成し、以下のように記述します。

```html:index.html
<!DOCTYPE html>
<html>
<head>
    <title>Hello Django</title>
</head>
<body>
    <h1>{{ message }}</h1>
</body>
</html>

```

### 2. ビューを修正

`hello/views.py`を以下のように変更します。

```python
from django.shortcuts import render

def index(request):
    context = {'message': 'テンプレートからこんにちは！'}
    return render(request, 'hello/index.html', context)
```

---

# 9. データベースとモデル

Djangoではモデルを定義することで、データベース操作も簡単にできます。

## 1. モデルの定義

`hello/models.py`に以下を追加：

```python
from django.db import models

class Message(models.Model):
    text = models.CharField(max_length=100)

    def __str__(self):
        return self.text
```

## 2. マイグレーション

```bash
python manage.py makemigrations
python manage.py migrate
```

## 3. 管理画面に登録

`hello/admin.py`に以下を追加：

```python
from .models import Message
admin.site.register(Message)
```

これで管理画面からデータの追加・編集ができるようになります。

---

# まとめ

- Djangoは「コマンド1つ」で開発環境が作れる
- ビュー・URL・テンプレート・モデルを組み合わせて簡単にWebアプリが作れる
- 管理画面や認証など実践的な機能も標準搭載

まずはこの記事を参考に、**自分だけのWebアプリ**を作ってみましょう！  
慣れてきたら、フォームやユーザー認証、REST APIなどにもチャレンジしてみてください。
BASIC認証を自動入力してくれるChrome拡張

## はじめに

開発や検証環境でよく使われる **BASIC認証**。
アクセスのたびにユーザー名とパスワードを入力するのは地味にストレスですよね。

今回は、その面倒をスマートに解消してくれるChrome拡張 **「MultiPass」** をご紹介します。

## MultiPassとは？

[MultiPass](https://chromewebstore.google.com/detail/multipass-for-http-basic/enhldmjbphoeibbpdhmjkchohnidgnah) は、**HTTP BASIC認証を自動入力してくれるChrome拡張機能**です。

* ドメインやURLパターンごとに認証情報を登録可能
* ローカルで動作、オフラインでも使用OK
* [GitHubでオープンソースとして公開](https://github.com/krtek4/MultiPass)
* ドキュメントも[公式サイト](https://krtek4.github.io/MultiPass/)でしっかり整備されています

## 導入方法

### 1. Chromeウェブストアからインストール

以下のリンクから簡単にインストールできます：

🔗 [MultiPass - Chrome ウェブストア](https://chromewebstore.google.com/detail/multipass-for-http-basic/enhldmjbphoeibbpdhmjkchohnidgnah)

### 2. GitHubからソースを確認・信頼性チェック

拡張機能のコードは以下で公開されています：

🔗 [GitHub - krtek4/MultiPass](https://github.com/krtek4/MultiPass)

コントリビューターも複数名おり、更新履歴も確認できます。

## 使い方

### 基本的な設定手順

1. 拡張機能アイコンをクリック
2. 以下の情報を入力：

| 項目              | 内容                                          |  
| --------------- | ------------------------------------------- | 
| **URL pattern** | 対象となるURLの正規表現（例：`https://.*\.example/.*`） |
| **Username**    | BASIC認証のユーザー名                               |
| **Password**    | BASIC認証のパスワード                                       |

保存すると、対象URLにアクセスするだけで自動的に認証が実行されます。

[![MultiPass for HTTP basic authentication for Google Chrome - Extension Download](https://tse4.mm.bing.net/th/id/OIP.O8Ml2u-HiNTu_R0_j2uoIwHaEo?cb=iwc1\&pid=Api)](https://multipass-for-http-basic-authentication.en.softonic.com/chrome/extension)

### 実例：検証用ドメインに適用する場合

たとえば、以下のような検証環境がある場合：

```
https://dev.example/
https://staging.example/login
```


次のような正規表現を指定することで、すべてに対応できます。

```

https://.*\.example/.*
```

## 参考リンクまとめ

* 🌐 [MultiPass - Chrome ウェブストア](https://chromewebstore.google.com/detail/multipass-for-http-basic/enhldmjbphoeibbpdhmjkchohnidgnah)
* 🛠 [GitHub - krtek4/MultiPass](https://github.com/krtek4/MultiPass)
* 📄 [公式ドキュメントサイト](https://krtek4.github.io/MultiPass/)
PHP備忘録：Laravelで「名前を入力 → 表示」するシンプルな例をハンズオンで体験してみた

## はじめに

Laravel を使ったフォーム処理の基本を学ぶため、名前を入力して表示する機能を実装してみました。

これは PHP のキャッチアップを目的とした個人的な学習メモです。初学者による備忘録となります。

## 書こうと思ったきっかけ

個人的に PHP をキャッチアップしたく、Laravel を使って簡単なフォーム処理を作ってみたいと考えました。

:::note info
**個人の備忘録程度の走り書きとなっておりますが、温かい目で見守っていただければ幸いです。**
:::

特に Blade テンプレートや POST 処理の流れを理解することが目標です。

## 内容

### 目標

* `/hello` にアクセスすると名前を入力するフォームが表示される
* 名前を入力して送信すると、"こんにちは、〇〇さん！" と表示される

---

### フォーム表示用の Blade を作成

**`src/resources/views/hello.blade.php`**

```blade
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>Helloページ</title>
</head>
<body>
    <h1>名前を入力してください</h1>

    <form action="/hello" method="POST">
        @csrf
        <input type="text" name="name" placeholder="お名前">
        <button type="submit">送信</button>
    </form>

    @isset($name)
        <p>こんにちは、{{ $name }}さん！</p>
    @endisset
</body>
</html>
```

`@csrf` は Laravel におけるセキュリティ対策。
`@isset($name)` で、送信された後だけ挨拶を表示します。

---

### ルーティング設定（GET + POST）

**`src/routes/web.php`**

```php
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\HelloController;

Route::get('/hello', [HelloController::class, 'index']);
Route::post('/hello', [HelloController::class, 'post']);
```

---

### HelloController を編集

**`src/app/Http/Controllers/HelloController.php`**

```php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class HelloController extends Controller
{
    public function index()
    {
        return view('hello');
    }

    public function post(Request $request)
    {
        $name = $request->input('name');
        return view('hello', ['name' => $name]);
    }
}
```

---

### キャッシュクリア（任意）

```bash
make cache-clear
```

---

### 動作確認

1. `http://localhost:8080/hello` にアクセス
2. 名前を入力して送信
3. `こんにちは、〇〇さん！` と表示される

**表示結果：**

![Screenshot 2025-05-04 at 19.49.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/b3e689ca-5f64-40e0-b265-bf540b32ebc6.png)

**実際のログ**

![Screenshot 2025-05-04 at 19.50.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/c6590733-0ddf-45ad-9e32-b4640a7f038d.png)

---

## まとめ

Laravel の基本であるルーティング、Blade テンプレート、フォームの POST 処理、そしてコントローラの役割が一連の流れで理解できました。

次はフォームのバリデーションや、データベースへの保存にもチャレンジしてみたいです...！
【エラー対応】error: Two output files share the same path but have different contents

error: Two output files share the same path but have different contents
とエラーが出たが日本語での解決記事が見当たらなかったので投稿する。

# 事象
Reactで開発中に発生し、画面が表示されなくなった。
デザインの実装のためにnpmでインストールして開発を進めると発生した。

> npm install @emotion/react
> 
> npm install @emotion/styled 

# 解決策

次のコマンドを実行。これだけでよい。
> npm dedupe

dedupeとは重複を排除するという意味。

# 対応後の感想
バージョン管理だからといって安易にpackage.jsonの中身のバージョンをいじるものではないなと思った。
私はいじってしまったのでまた余計なエラーがでて、
reactを再インストールしなければならなくなった。(言うほど大変ではないが)

ここらへんは依存関係とnpmについて深い理解がないので、対処方法までの記載とする。
さらに調べて理解が進めば追記するかも。

# 対応後のpackage.jsonの中身

ちなみに、本エラー対応後のpackage.jsonの一部はこれだ。
参考になれば嬉しい。
>   "dependencies": {
    "@emotion/react": "^11.14.0",
    "@emotion/styled": "^11.14.0",
    "react": "^19.1.0",
    "react-dom": "^19.1.0",
    "sass": "^1.87.0",
    "styled-components": "^6.1.17",
    "styled-jsx": "^5.1.6"
  },
  "devDependencies": {
    "@eslint/js": "^9.22.0",
    "@types/react": "^19.0.10",
    "@types/react-dom": "^19.0.4",
    "@vitejs/plugin-react": "^4.3.4",
    "eslint": "^9.22.0",
    "eslint-plugin-react-hooks": "^5.2.0",
    "eslint-plugin-react-refresh": "^0.4.19",
    "globals": "^16.0.0",
    "vite": "^6.3.1"
  }

# 参考

https://qiita.com/totto357/items/585b6bb225021f723c5e

https://docs.npmjs.com/cli/v8/commands/npm-dedupe
ファイルオープン

指定ソフトで指定ファイルを開く
~~~
'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
' ファイルオープン
'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Public Function F_File_Open( _
        ByVal aFilePath As String, _
        ByVal aExePath As String, _
        Optional ByVal aExeArg As String = "", _
        Optional ByVal aAppWinStyle As VbAppWinStyle = vbNormalFocus) As Boolean
    Dim wkPath As String
    
    If Dir(aExePath) = "" Or Dir(aFilePath) = "" Then
        Exit Function
    End If
    
    wkPath = aExePath
    wkPath = M_String.F_String_ReturnAdd(wkPath, aExeArg, aDlmt:=" ")
    wkPath = M_String.F_String_ReturnAdd(wkPath, aFilePath, aDlmt:=" ")
    
    Shell wkPath, aAppWinStyle
    F_File_Open = True
End Function
~~~
セル関連処理

# セル位置情報初期化
セル位置情報を初期化する。
セル範囲指定時はセル範囲値を反映する。
~~~
'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
' セル関連処理
'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
' 位置情報初期化
'------------------------------------------------------------------------------
' 行位置初期化
Public Property Get G_Excel_InitPosRowInf( _
        Optional ByVal aRg As Range = Nothing) As T_EXCEL_POS_ROW_INF
    Dim wkRtn As T_EXCEL_POS_ROW_INF
    
    If aRg Is Nothing Then
        wkRtn.Stt = D_EXCEL_ROW_NONE
        wkRtn.End = D_EXCEL_ROW_NONE
        wkRtn.Cnt = 0
    Else
        With aRg
            wkRtn.Stt = .Row
            wkRtn.Cnt = .Rows.Count
            wkRtn.End = .Row + wkRtn.Cnt - 1
        End With
    End If
    
    G_Excel_InitPosRowInf = wkRtn
End Property

' 列位置初期化
Public Property Get G_Excel_InitPosClmInf( _
        Optional ByVal aRg As Range = Nothing) As T_EXCEL_POS_CLM_INF
    Dim wkRtn As T_EXCEL_POS_CLM_INF
    
    If aRg Is Nothing Then
        wkRtn.Stt = D_EXCEL_CLM_NONE
        wkRtn.End = D_EXCEL_CLM_NONE
        wkRtn.Cnt = 0
    Else
        With aRg
            wkRtn.Stt = .Column
            wkRtn.Cnt = .Columns.Count
            wkRtn.End = .Column + wkRtn.Cnt - 1
        End With
    End If
    
    G_Excel_InitPosClmInf = wkRtn
End Property

Public Property Get G_Excel_InitPosInf( _
        Optional ByVal aRg As Range = Nothing) As T_EXCEL_POS_INF
    Dim wkRtn As T_EXCEL_POS_INF
    
    With wkRtn
        .Row = G_Excel_InitPosRowInf(aRg)
        .Clm = G_Excel_InitPosClmInf(aRg)
    End With
    
    G_Excel_InitPosInf = wkRtn
End Property
~~~
# セル範囲値取得
指定したセル範囲値の値を配列で返却する
~~~
'------------------------------------------------------------------------------
' セル範囲値取得
'------------------------------------------------------------------------------
Public Function F_Excel_ReturnRangeValueArray( _
        ByVal aRg As Range) As Variant
    Dim wkRtnAry As Variant
    
    If aRg Is Nothing Then
        Exit Function
    End If
    
    wkRtnAry = aRg.Value
    '配列でない場合
    If IsArray(wkRtnAry) <> True Then
        ReDim wkRtnAry(D_EXCEL_ROW_START To D_EXCEL_CLM_START)
        wkRtnAry(D_EXCEL_ROW_START, D_EXCEL_CLM_START) = aRg.Value
    End If
    
    F_Excel_ReturnRangeValueArray = wkRtnAry
End Function
~~~
# オートフィルタ設定
オートフィルタを設定する
~~~
'------------------------------------------------------------------------------
' オートフィルタ設定
'------------------------------------------------------------------------------
Public Sub S_Excel_SetAutoFilter( _
        Optional ByVal aRg As Range = Nothing, _
        Optional ByVal aSh As Worksheet = Nothing)
    Dim wkSh As Worksheet: Set wkSh = aSh
    Dim wkRg As Range: Set wkRg = aRg
    
    If Not wkRg Is Nothing Then
        Set wkSh = wkRg.Worksheet
    Else
        If wkSh Is Nothing Then
            Set wkSh = ActiveSheet
        End If
        wkRg = wkSh.UsedRange
    End If
    
    'オートフィルタが設定されている場合は一旦解除
    If wkSh.AutoFilterMode = True Then
        wkSh.Cells.AutoFilter
    End If
    
    'オートフィルタ設定
    wkRg.AutoFilter
End Sub
~~~
ワークシート関連処理

# ワークシート名→ワークシート変換
指定したブックの中から指定したワークシート名のシートを返却する
~~~
'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
' ワークシート関連処理
'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
' ワークシート名→ワークシート変換
'------------------------------------------------------------------------------
Public Function F_Excel_GetSheetName2Sheet( _
        ByRef aRtn As Worksheet, _
        ByVal aName As String, _
        Optional ByVal aBk As Workbook = Nothing) As Boolean
    Dim wkRet As Boolean
    Dim wkRtn As Worksheet
    
    Dim wkBk As Workbook: Set wkBk = aBk
    
    If aName = "" Then
        Exit Function
    End If
    
    If wkBk Is Nothing Then
        Set wkBk = ThisWorkbook
    End If
    
    For Each wkRtn In wkBk.Worksheets
        If wkRtn.Name Like aName Then
            wkRet = True
            Exit For
        End If
    Next wkRtn
    
    If wkRet = True Then
        Set aRtn = wkRtn
        F_Excel_GetSheetName2Sheet = True
    End If
End Function
Public Function F_Excel_ReturnSheetName2Sheet( _
        ByVal aName As String, _
        Optional ByVal aBk As Workbook = Nothing) As Worksheet
    F_Excel_GetSheetName2Sheet F_Excel_ReturnSheetName2Sheet, aName, aBk:=aBk
End Function
~~~
# 全表示
非表示、フィルタを解除し全セルを表示する
~~~
'------------------------------------------------------------------------------
' 全表示
'------------------------------------------------------------------------------
Public Sub S_Excel_ShowAll( _
        ByVal aSh As Worksheet)
    If aSh Is Nothing Then
        Exit Sub
    End If
    
    With aSh
        .Cells.Rows.Hidden = False
        .Cells.Columns.Hidden = False
        
        'オートフィルタが設定されている場合は全表示
        If .AutoFilterMode <> True Then
            'フィルタ設定無しの場合は無視
        ElseIf .FilterMode <> True Then
            '絞り込みされていない場合は虫
        Else
            .ShowAllData
        End If
    End With
End Sub
~~~
M_Excel：各種定義

# Excel処理の各種定義
~~~
'##############################################################################
' Excel処理
'##############################################################################
' 参照設定          |   ―
'------------------------------------------------------------------------------
' 共通バージョン    |   250504
'------------------------------------------------------------------------------

'==============================================================================
' 公開定義
'==============================================================================
' 定数定義
'------------------------------------------------------------------------------
Public Const D_EXCEL_ROW_START As Long = D_POS_START
Public Const D_EXCEL_ROW_NONE As Long = D_POS_NONE
Public Const D_EXCEL_ROW_NOW As Long = D_POS_NOW
Public Const D_EXCEL_ROW_END As Long = D_POS_END

Public Const D_EXCEL_CLM_START As Integer = D_POS_START
Public Const D_EXCEL_CLM_NONE As Integer = D_POS_NONE
Public Const D_EXCEL_CLM_NOW As Long = D_POS_NOW
Public Const D_EXCEL_CLM_END As Integer = D_POS_END

'------------------------------------------------------------------------------
' 構造体定義
'------------------------------------------------------------------------------
Public Type T_EXCEL_POS_ROW_INF
    Stt As Long
    End As Long
    Cnt As Long
End Type

Public Type T_EXCEL_POS_CLM_INF
    Stt As Integer
    End As Integer
    Cnt As Long
End Type

Public Type T_EXCEL_POS_INF
    Row As T_EXCEL_POS_ROW_INF
    Clm As T_EXCEL_POS_CLM_INF
End Type

'==============================================================================
' 内部定義
'==============================================================================
~~~
React-Admin：useNavigate() 、useLocation()などルーティングに関するエラーの対処方法

# 利用パッケージ

:::note info
**利用パッケージ**
- React：18.0
- react-router：7.5.3
- react-router-dom：7.5.3
- Next.js：15.3.1
- react-admin：5.8
- ra-data-json-server：5.8
:::

# 実行コード

以下のようなチュートリアルにあるコードをpages配下に配置し、Nextを実行。

https://marmelab.com/react-admin/Tutorial.html

```/pages/app.ts
import * as React from "react";
import { Admin, Resource, ListGuesser } from "react-admin";
import jsonServerProvider from "ra-data-json-server";

const dataProvider = jsonServerProvider("https://jsonplaceholder.typicode.com");

const AdminApp = () => (
    <Admin dataProvider={dataProvider}>
      <Resource name="posts" list={ListGuesser} />
      <Resource name="comments" list={ListGuesser} />
    </Admin>
);

export default AdminApp;
```


```/pages/index.ts
import dynamic from "next/dynamic";

const App = dynamic(() => import("./app"), { ssr: false });
export default App;

```

# エラー内容

以下のエラーログが表示される。トレースは省略する。

```error.log
useNavigate() may be used only in the context of a <Router> component

```
```error.log
useLocation() may be used only in the context of a <Router> component

```

上記のエラーは、リファレンスにも掲載されている。ただし、リファレンスの解消方法にある「reac-dom-router」、「react-router」の両方のバージョンを揃えてもエラーが発生する。

https://marmelab.com/react-admin/Routing.html#troubleshooting

# 対処方法

以下のサイトを参考に、app.tsの内容を修正する。

https://kodervine.hashnode.dev/uncaught-error-usenavigate-may-be-used-only-in-the-context-of-a-router-component

修正コードは以下。AdminタグをBrowserRouterタグで囲う。これでチュートリアルにある画面が表示される。

```app.ts
import * as React from "react";
import { BrowserRouter } from "react-router-dom";
import { Admin, Resource, ListGuesser } from "react-admin";
import jsonServerProvider from "ra-data-json-server";

const dataProvider = jsonServerProvider("https://jsonplaceholder.typicode.com");

const AdminApp = () => (
  <BrowserRouter>
    <Admin dataProvider={dataProvider}>
      <Resource name="posts" list={ListGuesser} />
      <Resource name="comments" list={ListGuesser} />
    </Admin>
  </BrowserRouter>
);

export default AdminApp;
```
最近のAndroid Studio、実はここが便利になってる【地味改善集】

## はじめに
Android Studioは定期的にアップデートされていますが、目立つ新機能の裏で、見落とされがちな「地味だけど効く改善」も少なくありません。

そこで本記事では、**2025年5月時点の最新安定版である Android Studio Koala Feature Drop（2024.1.2）** を前提に、最近便利になったと感じる機能をいくつか紹介します。

## 主な改善ポイントまとめ

### 1. エミュレータ統合の強化

- IDE内でのエミュレータ表示がより安定
- マルチインスタンスの切り替えがスムーズに
- ワークスペースの中でほぼ完結する開発体験に

開発中の画面確認の流れが断絶されず、テンポ良く進められるようになりました。

---

### 2. Logcatのフィルタ・検索機能がさらに進化

- PIDやパッケージ単位でのフィルタ保存が可能
- ログの色分けや非同期ロードによる表示速度改善
- スクロール保持や検索履歴も強化

細かなチューニングですが、ログ調査のストレスがかなり減ります。

---

### 3. Compose Previewがリアルタイムかつ軽快に

- UI変更が即座にPreviewに反映されやすくなった
- 不安定だった強制再読み込みが改善
- Preview上でのインタラクション対応も実験的に進行中

Compose利用者には特に恩恵が大きいアップデートです。

---

### 4. Layout Inspectorがパフォーマンス改善

- ランタイムUIのキャプチャ速度が向上
- コンポーネントの選択・ハイライトがスムーズに
- 特定のビュー階層のみ表示するフィルタが強化

画面の重ね順やマージン調査がしやすくなり、UIデバッグに重宝します。

---

### 5. IntelliJベースのコード補完精度が向上

- スニペット候補の並びがより文脈に沿うように
- Kotlinコード補完の速度が改善
- コード分析やリファクタ提案もスムーズに動作

ちょっとした入力時の違和感が減り、ミス修正も減少します。


## おわりに
Android Studioのアップデートは「目立たないけど地味に効く」改善がたくさんあります。  
最新バージョンを軽く触ってみるだけでも、日々の開発体験がグッと変わるはずです。

他にも「これは地味に便利だった」という機能があれば、ぜひコメントなどで共有してもらえると嬉しいです。
数値判定　isNaNの罠に注意せよ！

Paizaの文字列処理の「数値判定」問題を解いたので落とし穴と解決法を交えて解説！

## <br>問題概要

文字列 `S` が与えられるので、 `S` を整数に変換できる場合には “`YES`” , そうでない場合は “`NO`” を出力。

なお、文字列 S を数値に変換できるとは、S の全ての文字が
{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 } のいずれかであることをいう。

 S の各文字は数字（{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 } のいずれか) またはアルファベットの大文字。
 
```
入力例：
813

出力例：
YES
```
<br>

https://paiza.jp/works/mondai/string_primer/advance_step4


<br>

## コード例①
```js
const rl = require('readline').createInterface({input:process.stdin});

rl.once('line',(input)=>{
    if(!isNaN(input)){
        console.log("YES");
    } else {
        console.log("NO");
    }
});
```

### ❗ 罠ポイント

- `isNaN("")` → `false` →（ `Number("")` → `0` ）→ `YES`
- `isNaN(" ")` → `false` →（ `Number("")` → `0` ）→ `YES`
- 指数表記（例: `"123E4"`）も `false` になり、誤って `YES`



空白や空文字だけでも `YES` になる可能性があるという地味に怖い仕様。
<br>
※今回の問題は、空文字や空白はないので大丈夫。

<br>

## ✅ 改善コード（3段チェックで堅牢に）
```js
const trimmed = input.trim();
const isNumber =
  trimmed !== "" &&
  !isNaN(trimmed) &&
  !isNaN(Number(trimmed)) &&
  !/[eE]/.test(trimmed);

console.log(isNumber ? "YES" : "NO");
```

### ✔ 解説（3つのチェック）

- `trimmed !== ""` → 空文字の排除
- `!isNaN(trimmed)` → 数値変換チェック（型変換あり）
- `!isNaN(Number(trimmed))` → 明示的に数値変換 → `NaN` 判定
- `!/[eE]/.test(trimmed)` → 指数表記の "e" または "E" を排除


<br>

さらに、`&&`の短絡評価を使って、効率的にチェック!

`&&` は論理積（AND）演算子で、左から右へ評価を行う。
各条件が `true` の場合に次の条件を評価し、
最終的にすべての条件が `true` であれば全体が `true` になる。
途中で `false` が出た時点で評価を終了（短絡評価）。

<br>

## 💡 新しく学んだこと

- `trim()`：前後の空白を削除
- `!== ""`：空文字は除外
- `!isNaN(…)`：数値に変換できるか確認
- 入力系の問題では「予期しない入力」に注意

<br>

## ✅ まとめ

空文字や空白のみの入力、数値と文字が混在する入力などを適切に除外し、正確な数値判定が可能になる！

このような細かな判定を行うことで、予期しないエラーを防ぐことができる👍


<br><br><br>[🐻 僕の失敗談と解決話！](https://paizabeginner.wordpress.com/2025/05/04/paiza%e3%81%a7%e5%9f%ba%e6%9c%ac%e3%83%9e%e3%82%b9%e3%82%bf%e3%83%bc%ef%bc%9a%e6%95%b0%e5%80%a4%e5%88%a4%e5%ae%9a%e3%80%80isnan%e3%81%ae%e7%bd%a0%e3%81%ab%e6%b3%a8%e6%84%8f%e3%81%9b%e3%82%88%ef%bc%81/)
Arduino UNOにACROBOTIC SSD1306を接続してイラストを表示するための変換Excel

Arduino UNOで何か遊んでみるか～、って思い、ディスプレイACROBOTIC SSD1306を入手したので画像表示できるか遊んでみました。↓こんなの表示されますｗ
<img width=400 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155688/2237b044-7951-4740-a537-7392d3782476.jpeg">
が、16進で表現するのが大変だったのでExcelでその部分だけ成形するシートを作ったので公開します。

## １　前提
Arduino UNOにディスプレイACROBOTIC SSD1306を接続。ライブラリ更新やらで初期設定は済ませてください。
なんかソースファイルに未開発なところがあるっぽいので下記参考にして.cppと.hファイルを修正する
http://www.takishita.jp/toy_hospital/staff_blog/ch32v003-oled-ssd1306-library
※修正しないとHelloサンプルですらコンパイルエラーした
  
## ２　画像表示について
ベースはgitでゲット。これ自体はロボットイラストが表示されるサンプルですが記載方法の参考に。
https://github.com/datasith/Ai_Ardulib_SSD1306/tree/main/examples/DrawLogo
Ai_Ardulib_SSD1306/examples/DrawLogo

解像度128*64、8x8ドットで１文字、１行16文字、８行表示、トップ２行は黄色、３行目から８行目は水色で表示されます
![スクリーンショット 2025-05-04 173506.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155688/ccd4e4e1-c4a4-463d-849e-e2f35360b50a.png)
（色が自由だったらすません、未確認です

ドットの点灯はこんな感じでビットで判断してます
  ![qiita01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155688/8b9ca0e2-0ee9-4571-a8ec-7e1953aa4aa0.png)

ここまでわかれば何でも表示できますね！！
まぁここだけの書き方なんでしょうけどね。
  
## ３　何でもいいのでイラストを描きます
ここはスキップして直接Excel(後述)に書いても良いんですが、前もって画像エディタで試作しておいた方が楽でしょうから作っておきます。全領域は128x64ピクセルです。ここでは青い領域用で作成しているので128x48ピクセルです。
![TEST.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155688/e1d385c8-696b-4782-b4fa-da1bda65c644.png)

## ４　１６進に変換します。
下記URLからExcelシートをダウンロードしてドットという名のセルに1を打ち込みます。
ビットマップのフォーマットから変換して出力する方法もあるんでしょうけどいろいろメンドイのでパス…。
ここツールあれば楽なんですがちょっと無さそうなのでExcelで自作しました。
https://github.com/Kiyoshi-T/arduinoUNO/blob/main/sample.xlsx
![スクリーンショット 2025-05-04 182856.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155688/73f8f8a0-67a8-4531-8637-dad8b12d6f8d.png)

成形されたらテキストエディタでTab文字を除去してArduinoのコードに貼り付けてみましょう。
画像が表示されたら成功です。

### （８０年代マイコンゲームなテイストが何とも言えません…(笑)
Raspberry Pi PicoでPicoMite(MMBasic)を使う〜ディジタル入出力

MMBasicでのディジタル入出力を人を検出したらLEDを点灯させ、検出できなかったらLEDを消灯する回路で確認した。

# 使用部品

入力として[焦電型赤外線(人感)センサーモジュール SB412A](https://akizukidenshi.com/catalog/g/g109002/)、出力として赤色LED、LEDの電流制限抵抗として150Ωを使用した。

# 配線
次の図のように配線した。
実体配線図の人感センサーの外観が実物と異なるのはfritzingにSB412Aの部品がなかったため、類似の部品を代用している。中央のピンが出力で人を検出するとハイ、それ以外はローレベルの出力になる。このピンをRaspberry Pi PicoのGP1に接続している。

LEDのアノードは電流制限抵抗としてを通してGP0に接続している。

![PICO-DIN-DOUT_ブレッドボード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72921/26897b2b-f92a-4300-9413-fa29a14c61b1.png)


# プログラム

プログラムは下記のとおりで、2秒間隔で人感センサーの状態を確認し、LEDの点灯を制御するものとした。

```BASIC
Dim din%           ' Define variable
SetPin GP0,DOUT    ' Set GP0 as a digital output pin 
SetPin GP1,DIN     ' Set GP1 as a digital input pin
Do
  din% = Pin(GP1)  ' Get GP1 pin value
  If din% = 1 Then ' Is GP1 a 1? (Did the sensor detect a human?)
    Pin(GP0) = 1   ' Turn on LED
  Else
    Pin(GP0) = 0   ' Turn off LED
  End If
  Pause 2000       ' Wait 2 Sec
Loop
```

MMBasicでは`SETPIN`コマンドで指定したピンの動作をピン番号に続けて指定する。ディジタル入力の場合は`DIN`を、ディジタル出力の場合は`DOUT`を指定する。
DINを指定した入力ピンの状態は`PIN`関数で読み取り、DOUTを指定した出力ピンの場合は`PIN`コマンドで値を設定する。

MMBasicの条件分岐の構文は下記のとおり。

	IF 条件式 THEN
		条件式が成立したときの処理
	ELSE
		条件式が不成立したときの処理
	END IF
# SETPINコマンド
SETPINコマンドについてPicoMiteユーザマニュアルの説明を以下に示します。

構文：`SETPIN pin, cfg [, option]`

SETPINコマンドは外部I/Oピンを設定します。pinは設定するI/Oピン、cfgはピンに設定するモード、optionはオプションのパラメータです。cfgはキーワードで、以下のいずれかになります。

| cfg  | ピンの動作|
| ---- | ----- |
| OFF  | 未設定または非アクティブ|
| AIN  | アナログ入力（入力電圧を測定します）|
| ARAW | 0～1023の値を返す高速アナログ入力|
| DIN  | ディジタル入力<br>optionを省略した場合、入力はハイインピーダンスになります。  <br>optionがキーワードPULLUPまたはPULLDOWNの場合、約50µAの定電流を使用して入力ピンを3.3Vにプルアップまたはプルダウンします。RP2350チップのバグのため、8.2K以下の抵抗を使用してプルダウンを実装することをお勧めします。|
| FIN  | 周波数入力<br>optionは、ゲート時間（入力サイクルをカウントする時間の長さ）を指定するために使用できます。10msから100000msまでの任意の数値を指定できます。PIN()関数は、使用されるゲート時間に関係なく、常にHz単位で正しくスケーリングされた周波数を返します。  <br>optionを省略した場合、ゲート時間は1秒になります。  <br>ピンはGP6、GP7、GP8、またはGP9のいずれかになります（OPTION COUNTで変更できます）。 |
| PIN  | 周期入力  <br>optionは、周期測定を平均化する入力サイクル数を指定するために使用できます。1から10000までの任意の数値を指定できます。PIN()関数は、平均化に使用されるサイクル数に関係なく、常に1サイクルの平均周期をms単位で正しくスケーリングされた値で返します。optionを省略した場合、1サイクルの周期のみが使用されます。ピンはGP6、GP7、GP8、またはGP9のいずれかです（OPTION COUNTで変更できます）。|
| CIN  | カウント入力  <br>optionを使用して、カウントを開始するエッジを指定できます。プルアップまたはプルダウンが有効になっている場合、  <br>2はプルアップありの立ち下がりエッジ、  <br>3はプルアップなしで立ち下がりエッジと立ち上がりエッジの両方でカウントを開始するエッジ、  <br>5はプルアップありの両エッジでカウントを開始するエッジを指定します。  <br>optionを省略した場合、立ち上がりエッジでカウントを開始します。  <br>RP2350チップのバグのため、プルダウンは推奨されません。  <br>ピンはGP6、GP7、GP8、またはGP9のいずれかです（OPTION COUNTで変更できます）。 |
| DOUT | デジタル出力  <br>optionはこのモードでは使用されません。|

関数`PIN()`および`PORT()`を使用して、1つまたは複数の出力ピンの値を返すこともできます。

# PIN関数

`PIN`関数についてPicoMiteユーザマニュアルの説明を以下に示します。
構文：`PIN(pin)`

外部I/Oピンの値を返します。0はデジタルLow、1はデジタルHighを意味し、アナログ入力の場合は測定された電圧が浮動小数点数で返されます。

周波数入力は周波数をHz単位で返します。周期入力は周期をミリ秒で返し、カウント入力はリセット以降のカウントを返します（カウントは立ち上がりエッジで行われます）。カウント入力は、ピンをカウント入力にリセットすることでゼロにリセットできます（既にそのように設定されている場合でも）。

ピンが出力として設定されている場合、この関数は出力設定値（つまり、HighまたはLow）を返します。これは、特にピンがオープンコレクタ出力として設定されている場合は、実際の出力電圧と異なる場合があります。


# 参考サイトなど

- [PicoMite User Manual](https://geoffg.net/Downloads/picomite/PicoMite_User_Manual.pdf)
React特訓02: ランダムで✊✌️✋を表示してジャンケンしよう

# はじめに
私がReactを学習するにあたって、AIに頼らずコードを描けるようになるために解いた問題を、アウトプットとして残していきます。

この問題はAIを使用して作成したもので、以下の流れで学習を進めたものになります。

1\. AIに問題を作らせる
2\. 調べながらやってみる
3\. 困ったらAIに質問する
4\. AIにレビューしてもらう

## 問題
クリックするとランダムで✊✌️✋が表示されるボタンを作成しよう

### 要件
- 初期状態は結果は表示しない
- ボタンをクリックするたびに絵文字がランダムに1つずつ表示

### ポイント
- useStateによる状態管理
- ランダム関数を使用した配列要素の取得
- Reactでの基本的なイベント処理

### 完成系
- 初期状態 
![スクリーンショット 2025-05-04 18.19.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3842446/acb504c0-6c89-405e-82ca-26ac586a9bcd.png)
- ボタンをクリックするたびランダムに表示が変わる
![スクリーンショット 2025-05-04 18.20.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3842446/25f254e3-e860-4f48-a13e-493ddde106a7.png)
![スクリーンショット 2025-05-04 18.20.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3842446/1a623ef5-2200-4b5d-86cb-1fe21d8e2f68.png)
![スクリーンショット 2025-05-04 18.20.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3842446/01d8b0ec-e849-417e-86c0-23ab3ac91525.png)


## 解答
```jsx
import React, { useState } from 'react';

function HandRandomizer() {
  const hands = ['✊', '✌️', '✋'];
  const [handSelected, setHandSelected] = useState('');
  const handleClick = () => {
    const randomIndex = Math.floor(Math.random() * hands.length);
    setHandSelected(hands[randomIndex]);
  }

  return (
    <div className="text-center">
      <button onClick={handleClick} className="bg-blue-500 rounded-lg text-white p-2 my-4">最初はグー！ジャンケンっ</button>
      <p className="text-4xl">{handSelected}</p>
    </div>
  );
}

export default HandRandomizer;
```

### 解説
記述の手順
1\. 関数コンポーネントを作成
2\. 絵文字の選択肢を配列で用意
3\. 選ばれた絵文字を'state'で管理
4\. UIを作成
5\. ボタンに`onClick`イベントを設定
6\. ランダム表示用のクリック関数を作成(コールバック関数)

以下から順に進めます。

--- 
#### 1\. 関数コンポーネントを作成
```jsx
function HandRandomizer() {
```
---
#### 2\. 絵文字の選択肢を配列で用意
✊✌️✋を文字列として配列の要素にします。
```jsx
const hands = ['✊', '✌️', '✋'];
```
---
#### 3\. 選ばれた絵文字を'state'で管理
初期値は空の文字列。
```jsx
 const [handSelected, setHandSelected] = useState('');
```
---
#### 4\. UIを作成
TailWindを使用してお好みのスタイルに調整
```jsx
  return (
    <div className="text-center">
      <button className="bg-blue-500 rounded-lg text-white p-2 my-4">最初はグー！ジャンケンっ</button>
      <p className="text-4xl">{/*ここに結果を表示*/}</p>
    </div>
  );
```
---
#### 5\. ボタンに`onClick`イベントを設定
```jsx
  <button onClick={handleClick} className="bg-blue-500…">
```
---
#### 6\. ランダム表示用のクリック関数を作成(コールバック関数)
`Math`オブジェクトのメソッドを使用して、配列の中身をランダムで取得する。

| 構文               | 説明                                                                 |
|--------------------|----------------------------------------------------------------------|
| `Math.random()`     | 0以上1未満の小数を返す（例：0.215、0.878など）                     |
| `* hands.length`    | hands配列の要素数を掛けることで、0〜(length未満)の数値に            |
| `Math.floor()`      | 小数点を切り捨てて整数にする（例：2.999 → 2）                       |

```jsx
  const handleClick = () => {
    const randomIndex = Math.floor(Math.random() * hands.length);
    setHandSelected(hands[randomIndex]);
  }
```
PHP備忘録：はじめてのLaravelコントローラ＋Blade連携をしてみた

## はじめに

Laravel を使って Web アプリケーション開発を学びながら、コントローラから Blade テンプレートを返す方法と、テンプレートに変数を渡す方法についてまとめます。

## 書こうと思ったきっかけ

個人的に PHP のキャッチアップをしたくて、勉強している初学者による備忘録としてください。


**参考文献**

https://qiita.com/oouaioi/items/c75c95676cd100a4c853

## 内容

### 1. HelloController を修正する

まず、コントローラでビューを返すように書き換えます。

**ファイル**: `src/app/Http/Controllers/HelloController.php`

```php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class HelloController extends Controller
{
    public function index()
    {
        // Bladeビュー「hello」に 'name' を渡す
        return view('hello', ['name' => '太郎']);
    }
}
```

> `view('hello')` は `resources/views/hello.blade.php` を指します。

### 2. Bladeファイルを作成する

テンプレート（HTML＋埋め込み変数）を用意します。

**ファイル**: `src/resources/views/hello.blade.php`

```blade
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>Helloページ</title>
</head>
<body>
    <h1>こんにちは、{{ \$name }}さん！</h1>
</body>
</html>
```

> `{{ $name }}` はPHPで渡した `['name' => '太郎']` によって「こんにちは、太郎さん！」と表示されます。

### 3. ルーティングの確認（既にOKならスキップ）

**ファイル**: `src/routes/web.php`

```php
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\HelloController;

Route::get('/hello', [HelloController::class, 'index']);
```

### 4. Laravelキャッシュクリア（念のため）

コンテナ内で以下を実行しておくと安心です：

```bash
make cache-clear
```

### 5. 確認

ブラウザで以下のURLにアクセス：

```
http://localhost:8080/hello
```

**表示結果**：

![Screenshot 2025-05-04 at 18.02.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/554c1b26-07ae-4899-8fd1-a351b39443b8.png)

## まとめ

この手順で Laravel のコントローラから Blade テンプレートを返し、変数を渡す基本的な仕組みを学ぶことができました。

:::note info
**個人の備忘録程度の走り書きとなっておりますが、温かい目で見守っていただければ幸いです。**
:::

次はフォーム送信やレイアウト共通化、データベースとの連携など、さらに実用的な機能にチャレンジしていきたいと思います...！