OmniAICreator/Qiita-1.07M huggingface dataset:
Gitのstash機能4選！作業中の変更をサクッと一時保存する方法


作業中に「別の作業を始めたい」「今の変更を一時的に保存したい」と思ったことはありませんか？そんな時に便利なのが、Gitの「stash（スタッシュ）」機能です。この機能を使うと、作業途中の変更を失うことなく、後で簡単に再開できます。この記事では、初心者向けに、stash機能を使いこなすための基本的なコマンドを4つに絞って紹介します。この方法を覚えれば、作業効率が格段にアップしますよ！

# git stashのな使い方

### 1. 変更をstashに保存する
作業中の変更を保存するには、git stash コマンドを使います。これだけでも保存できますが、覚えておくと便利なのは、push オプションです。

例えば、開発途中の変更を保存する場合はこんな感じ：

```
git stash push -m "開発途中"
```
-mをつけることでメッセージを添えて一時的に退避することが出来ます。不要な方は

```
git stash push
```
だけでOKです。
そして、特定のファイルだけを一時保存したい場合は、次のようにします


```
git stash push -- <ファイル名>
```

例えば、途中で変更が混ざってしまった場合などによく使います。個人的にはこれが最もよく使うコマンドです！

### 2. 保存したstashの一覧を確認する
これまで保存したstashの内容を確認したいときは、以下のコマンドで一覧表示できます：

```
git stash list
```

これで、どんなstashがあるか一目でわかります。

### 3. 保存したstashを戻す（適用）＆削除する

保存したstashを作業に戻すときは、git stash pop を使います。このコマンドは、stashを適用すると同時に削除してくれるので便利です

```
git stash pop
```

もし特定のstashだけを適用したい場合は、次のように指定します：


```
git stash pop stash@{0}
```
`stash@{0}` の部分は、`git stash list` で確認した番号を使います。


### 4. 不要なstashを削除する
不要なstashを削除するには、以下のコマンドを使います

```
git stash drop
```
特定のstashだけを削除したい場合は、番号を指定して削除します

```
git stash drop stash@{0}
```
これで、整理整頓もバッチリです！
ユークリッド距離計算(D言語)

- [D言語](https://dlang.org/)はC言語に似たシンプルかつ高機能で可読性が高い言語です。
- 触れることがあったので、プログラミングの基礎が詰まった「ユークリッド距離計算(2点間の距離の計算)」を実装することで理解を深めていくことにします。

## 環境
- macOS 13.7.3
- DMD64 D Compiler v2.110.0
- DUB version 1.39.0

## 手順

### プロジェクト初期化
- パッケージマネージャのdubを利用してプロジェクトを初期化します。

```shell
$ mkdir sample
$ cd sample
$ dub init
$ ls

dub.json	source
```

### コード記述
- `source/app.d`に以下のコードを記述します。

```d
import std.stdio;
import std.math.algebraic : hypot;
import std.random : Random, uniform;

/**
 * 点
 */
struct Point
{
  double x;
  double y;
}

/**
 * ユークリッド距離計算
 * Params:
 *   p1 = 始点
 *   p2 = 終点
 * Returns: ユークリッド距離
 */
pure nothrow @nogc double distance(Point p1, Point p2)
{
  return hypot(p2.x - p1.x, p2.y - p1.y);
}

void main()
{
  // テストデータ作成
  immutable int numPoint = 10;
  Point[] points = new Point[numPoint];
  for (int i = 0; i < numPoint; i++)
  {
    // 0.0から10.0までの範囲でランダム座標を生成
    points[i] = Point(uniform(0.0, numPoint), uniform(0.0, numPoint));
  }

  // 10回distance関数を実施
  for (int i = 0; i < numPoint; i++)
  {
    int idx1 = cast(int) uniform(0, numPoint);
    int idx2 = cast(int) uniform(0, numPoint);

    // 同じ点はNG
    while (idx1 == idx2)
    {
      idx2 = cast(int) uniform(0, numPoint);
    }

    // 距離計算
    double dist = distance(points[idx1], points[idx2]);

    // 結果表示
    writefln("[%.4f, %.4f]から[%.5f, %.5f]の距離: %.4f",
      points[idx1].x, points[idx1].y,
      points[idx2].x, points[idx2].y,
      dist);
  }
}

// ユニットテスト
unittest
{
  Point point1 = Point(2.0, 1.0);
  Point point2 = Point(4.0, 1.0);

  assert(distance(point1, point2) == 2.0);
}
```

### 解説
- まず点の表現には構造体を定義します。C同様にstructを利用します。
- 次に座標計算関数の実装に必要なhypot関数ですが、D言語にも[std.math](https://dlang.org/library/std/math.html)に定義されていますので、そちらを利用します。
- その実装の際に以下を指定することで、「**コンパイラの最適化**」に加えて「**関数特性の明示的表現による可読性の向上**」につながります。
    - pure: 副作用を持たない純粋関数の定義。[参考](https://dlang.org/spec/function.html#pure-functions)
    - nothrow: 例外を投げない。[参考](https://tour.dlang.org/tour/ja/basics/exceptions)
    - @nogc: GCを利用しない。D言語ではデフォルトでGCを利用しますが、利用しないようにすることも可能。
- メイン関数で[ランダムデータ](https://dlang.org/phobos/std_random.html)の作成をして、複数回実施をして実際の計算結果を確認します。
- D言語には[ユニットテスト機能](https://tour.dlang.org/tour/ja/gems/unittesting)も標準でついており、コード内のどこでも埋め込むことが可能です。

### 実行
- コード記述後、まず以下でビルドおよびテストを実行します。

```shell
$ dub test
```

- エラーなく通ったら、以下でビルドおよび実行します。

```shell
$ dub run

[9.0373, 2.5852]から[0.05691, 0.55945]の距離: 9.2060
[9.2209, 0.7538]から[0.05691, 0.55945]の距離: 9.1660
[9.1896, 0.6472]から[9.03729, 2.58521]の距離: 1.9440
[1.3550, 8.2721]から[0.05691, 0.55945]の距離: 7.8211
```

## まとめ
- 今回の実装を通じて、D言語のシンプルかつ美しい表現力かつ可読性の高さは非常に魅力あると感じました。


## 参考
- [公式サイト](https://dlang.org/)
openpyxl  excel 交通費と単発バイト給料自動

<br>
<h3>A12 文字太字に</h3>

```ruby: ✅ 
s['A12'].font = font_futoji
ws.cell(row=12, column=1).value = "交通費"  # A12セル
```

![スクリーンショット 2025-03-16 17.12.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/96f7e3cf-e1bb-48c3-ab58-2c6fdd0f5f2a.png)


<br>
<h3>日付 / 経路 / 交通費入力 </h3>

```ruby: 
ws.cell(row=13, column=1).value = "10"     # 日付
ws.cell(row=13, column=2).value = "蒲田→二子玉川"  # 交通経路
ws.cell(row=13, column=3).value = "554"    # 交通費
```

<br>
<h3>日付 / 勤務先 /経路 /  交通費 /給料 入力 </h3>

```ruby: 
ws.cell(row=13, column=1).value = "10"     # 日付
ws.cell(row=13, column=2).value = "セブン"  # 勤務先
ws.cell(row=13, column=3).value = "蒲田→二子玉川"    # 交通経路
ws.cell(row=13, column=4).value = "554"  # 交通費
ws.cell(row=13, column=5).value = "6140"    # 給料


```
マイグレーションとArtisanコマンドまとめ

# ①マイグレーションとは？
- データベースの構造をコードで管理できる仕組み
- チーム開発や環境ごとの再現に便利

# ②マイグレーションファイルの作成

```
php artisan make:migration create_posts_table
```

- ファイルは**database/migrations**に生成される
- 命名規則は**create_{テーブル名}_table**

# ③よく使うマイグレーションのカラム定義

```
Schema::create('posts', function (Blueprint $table) {
    $table->id();                  // IDカラム
    $table->string('title');       // 文字列カラム
    $table->text('body');          // 長文
    $table->timestamps();          // created_at / updated_at 自動追加
});
```

# ④Artisanコマンド一覧（マイグレーション系）

**php artisan migrate**
→ マイグレーションを実行

**php artisan migrate:rollback**
→ 最後のマイグレーションを取り消す

**php artisan migrate:reset**
→ 全てのマイグレーションを取り消す

**php artisan migrate:refresh**
→ 全マイグレーションをリセット&再実行

**php artisan migrate:fresh**
→ テーブルを全削除して再実行(データも削除)

# ⑤よくある使い分け
- php artisan migrate
→**新規環境で初回マイグレーション(データ構造を作成)**

- php artisan migrate:refresh
→**テーブル定義を変更後に再反映(データは残る)**

- php artisan migrate:fresh
→ **DBを完全リセットしたい(データも削除されるので注意)**

# ⑥実務Tips(任意で)
- php artisan migrate --path=database/migrations/ファイル名 で個別に実行できる

- --seed をつけて、マイグレーション後に初期データを流すこともできる：

```
php artisan migrate:fresh --seed
```

# ⑦まとめ
- マイグレーションを活用すれば、DB構造をGitで管理できて便利
- Artisanコマンドを覚えると作業効率がUPする
- 安易に fresh を多用しないよう注意（データ消える）
〈ServiceNow〉グローバル展開時の考慮点と対応策

# はじめに
グローバル化が加速する現代のビジネス環境において、多国籍企業が直面する重要な課題の一つがITシステムの統合です。特にServiceNowのようなプラットフォームでは、SaaSアプリケーションが多岐にわたり、国や地域ごとにインスタンスを分散して利用されるケースもあります。さらなるコスト最適化や効率化とガバナンス強化を目的としたインスタンス統合が喫緊の課題となっています。

技術的な側面だけでなく、組織的・文化的な観点も含めた包括的な統合戦略を提示することで、同様の課題に取り組む皆様の一助となれば幸いです。ぜひ皆様の知見や経験もコメントいただき、この分野の集合知を高めていきましょう。

# 複数インスタンス環境の現状と日本特有の課題
日本に本社を置くグローバル企業では、海外拠点毎に個別のServiceNowインスタンスを運用しているケースがあります。これは海外展開の過程やM&A、地域ごとの独立したIT運用が理由です。

海外拠点特有の課題として、本社との時差によるコミュニケーション困難、現地言語への対応、各国の法規制対応があります。また、日本本社の意思決定プロセスが海外拠点には理解されにくく、「根回し」や「稟議」の概念が浸透しないことも課題です。

複数インスタンス環境では、全社的な可視性の欠如、重複開発による非効率、一貫性のないプロセス、ライセンスコストの増加などの問題が生じています。本社主導の統合プロジェクトでは、各国の現地事情が見落とされるリスクもあります。

# 統合戦略オプションと海外拠点への適用
日本本社主導のServiceNowインスタンス統合には複数の戦略オプションがあると考えます。

**完全統合（シングルインスタンス）アプローチ**では、すべてのインスタンスを一つに統合します。データの一元管理や可視性向上のメリットがありますが、各国固有の要件への対応や多言語対応が課題です。

**ハブアンドスポークモデル**は、日本本社をハブとし、海外拠点をスポークとして連携させる方法です。各地域の自律性を保ちながらグローバルな可視性も確保できますが、連携の仕組み構築が必要です。

**フェデレーションモデル**は、各インスタンスの独立性を維持しながら、特定のデータのみを連携させる方法です。

選択にあたっては、海外拠点の自律性、各国固有の業務要件、本社のガバナンス方針などを考慮します。日本企業の強みである「現場重視」の文化を活かし、各拠点の声を反映できる仕組みづくりが重要です。
とはいえ、OOTBに準拠した設計と構築が必要だと考えています。

# データ移行と統合の技術的アプローチ
日本本社と海外拠点間のServiceNowインスタンス統合では、言語や業務慣行の違いに注意が必要です。

**データ移行の主要アプローチ**:
ServiceNow標準ツール（IDR、Data Export/Import）、ETLツール（Integration Hub、MID Server）、スクリプト化されたアプローチなどがあります。

**多言語データの課題**:
日本語と現地言語の混在環境では、文字コードの統一（UTF-8以外は非推奨）が重要です。また、日本特有のデータ形式と海外の形式の違い（日付形式、住所形式など）に対応する変換ルールが必要です。

**統合時の考慮点**:
データ統合では命名規則の統一、ユーザーデータ統合では多言語対応（日本語名と現地語名・英語名の併記）、カタログとナレッジの統合では多言語コンテンツ管理が重要です。また、多言語のコンテンツが既存環境に存在しない場合はDynamic Translationを活用する方法もあります。

日本本社のデータ品質基準を明確にしつつ、各国の事情に合わせた柔軟な対応も必要です。

# グローバル標準と各国固有プロセスの調和
日本本社主導のServiceNow統合では、本社標準と各国固有プロセスの調和が重要です。

**プロセスの見極め**:
”ITILプロセスやNISTプロセスなどいわゆるグローバル標準プロセスに合わせられることが望ましい。しかし固有のプロセスを無視できないケースもあることも事実です”
この場合は、グローバル標準プロセスに加えて、[80/20ルール]を適用するという柔軟性も必要です。
※「80/20ルール」とは多くの場合において結果の約80%は原因の約20%から生じるという考え方です。

**設計アプローチ**:
1.グローバル標準プロセスに沿う前提（OOTB）のFit&Gapを実施し、GAPを特定する。
    2.GAPに対する施策を議論する。（論点例：既存プロセスでグローバル標準に合わせられるポイントが存在しないか？　無駄はないか？　改善することによるメリットはどこか？...）

**実装のポイント**:メンテナンス性やアップグレード性を意識して原則的にはOOTBプロセスに手を入れないことが重要でカスタマイズではなく、コンフィグレベルで対応する
前段の設計アプローチの段階でも、ServiceNowの専門家を招集し固有プロセスの実装の複雑度や難易度を事前に協議することも有効だと考えています。また、多言語・多文化のユーザーが利用することになるのでOOTB準拠のUI・設計となればUXは大きく向上すると考えます。

# 日本本社を中心としたグローバルガバナンスと運用モデル
**ガバナンス構造**:
日本本社にグローバルガバナンス委員会を設置し、各地域の代表者を含めます。意思決定プロセスは日本企業の特徴である「コンセンサス重視」を活かしつつ、スピード感も両立させる工夫が必要です。

**運用チーム構造**:
日本本社にグローバルCoE（Center of Excellence）を設置し、各地域にローカルサポートチームを配置する二層構造が効果的です。時差を考慮し24時間サポート体制を構築します。

**サポートモデル**:
各地域のユーザーには現地言語でのティア1サポートを提供し、高度な問題は本社CoEにエスカレーションする体制が一般的です。日本企業の強みである「おもてなし」精神を活かした質の高いサポートを目指しましょう。

**継続的改善**:
定期的な改善活動を全社的に展開します。各地域からの改善提案を積極的に取り入れる仕組みも重要です。

# 最後に
日本に本社を置くグローバル企業のServiceNow統合では、日本の企業文化と各国特性の調和が鍵となります。複数インスタンスの課題を理解し、最適な統合戦略を選択しましょう。データ移行では多言語対応に配慮し、本社標準と各国固有プロセスのバランスを取ることが重要です。日本企業の強み —「カイゼン」文化、「現場重視」の姿勢、「コンセンサス型」意思決定— を活かしたガバナンスモデルを構築することで、グローバル統合は日本発企業の競争力強化に貢献すると考えます。
DNSの流れについて整理してみる

## 記事の概要
DNSの流れについて何となく理解したものの、細かいところの理解が浅いので
情報収集しながら自分なりに整理してみました。

## DNSの流れ
### １．クライアントからキャッシュDNSサーバへの問い合わせ
①クライアントから、とあるドメイン（Webサイトなど）に接続を試行

②対象ドメインの名前解決（=IPアドレスの取得）のため
　キャッシュDNSサーバに問い合わせ。
　⇒キャッシュDNSサーバで名前解決できる場合
 　　・・・IPアドレスをクライアントに返して終了
　⇒キャッシュDNSサーバで名前解決できない場合
 　　・・・権威DNSサーバに問い合わせ（２．へ）

:::note info
**キャッシュDNSサーバの補足**
- ドメインとIPアドレスの紐づけ情報を持たないが、
過去に権威DNSサーバーへ問い合わせた内容をキャッシュとして保存
※保存期間は「TTL(Time To Live)」と呼ばれるパラメータで定義
- Windowsの場合はコントロールパネルのネットワーク設定より
キャッシュDNSサーバの設定が可能
・優先DNSサーバ：最初に問い合わせるサーバ
・代替DNSサーバ：優先DNSサーバが応答しない時に問い合わせるサーバ
- 通常はISPのキャッシュDNSや企業内のキャッシュDNSを利用するが
「パブリックDNSリゾルバ（インターネット経由で自由に利用できる
　DNSサーバ）」に変更可能
　⇒セキュリティやパフォーマンスの向上が期待できる

  　＜代表的なパブリックDNSリゾルバ＞
　・Cloudflare（優先DNSサーバ：1.1.1.1／代替DNSサーバ：1.0.0.1）
　・google public DNS（優先DNSサーバ：8.8.8.8／代替DNSサーバ：8.8.4.4）

:::


### ２．キャッシュDNSサーバから権威DNSサーバへの問い合わせ
①まずDNSルートサーバに問い合わせ
　⇒関連情報※を持つ権威DNSサーバを教えてもらう
　　※NSレコードで「このドメインはこのDNSサーバに問い合わせる」という
　　　情報（親子関係）を定義している
   
②教えてもらった権威DNSサーバに問い合わせ
　⇒名前解決できた場合
　　・・・IPアドレスをクライアントに返して終了
　⇒名前解決できなかった場合
　　・・・関連情報を持つ権威DNSサーバを教えてもらう
  　　　　　（以後、名前解決するまで②を繰り返し）

:::note info
**DNSルートサーバの補足**
- 世界で十数か所にしか存在しない
- 「.com」「.jp」などのトップドメインを管理
※DNSルートサーバを起点に下のレベルのドメインに問い合わせていく
:::

:::note info
**権威DNSサーバの補足**
- ドメインとIPアドレスの紐づけ情報を持つ
- 以下2つのサーバで構成される
・プライマリDNSサーバ（マスターDNSサーバ）
　⇒メインで稼働するサーバ
・セカンダリDNSサーバ（スレーブDNSサーバ）
　⇒プライマリDNSサーバが応答しない時に問い合わせるサーバ
:::

## まとめ
文字ばかりで見づらいですがとりあえず言語化してみました。
認識齟齬などあれば教えてください。
【備忘録】Kleinbergのバースト分析がだいぶ理解できた

SNSのバースト分析などでも頻繁に登場する**Kleinberg博士のバースト分析**のロジック、論文見てもさっぱりでした。

いろんなサイト見たら、**隠れマルコフモデル**と**ビタビアルゴリズム**がポイントということはわかったんですが、今度はビタビアルゴリズムが理解できない。。。

こんなダメダメ状態でしたが、この本とChat-gpt先生のお陰でやっとだいぶ理解できました。

https://www.kspub.co.jp/book/detail/1529182.html

このシリーズはトピックモデルも読んでいますが、数式の解説が丁寧で、文系出身には大変ありがたい本です。ありがたやありがたや。黄色本にはまだ手が出ないので、このシリーズで基礎力を底上げしていきたいと思います。こんな状態で**４月から博士課程大丈夫か俺**、**いやだいじょばない**。

アルゴリズムの理解のためChat-gpt先生にコードを出力してもらいましたが、**V[{}]** で早速つまずきました。でもこれが**ビタビテーブル**で、**ビタビアルゴリズム**の肝なのですね。

簡潔に言うと、**時間 × 状態の2次元構造の確率を記録するテーブルで、その確率値はすべて「その状態に最も高確率で到達するパスの確率」を記録したもの**です。

| t(時刻) | Rainy（雨） | Sunny（晴れ） |
|:-:|:-:|:-:|
|0（初期）  |0.06   |0.24   |
|1  |0.048   |0.0432   |
|2   |0.0168   |0.003888   |

これを**再帰的に更新していき、最後にそれぞれ時刻におけるの確率値の大きい方をかけていくことで、最後の状態に至る最尤確率とその状態に至るパスが分かると理解**しました。

以下、Chat-gpt先生に出力してもらったコードです。最後の方でまだ理解できない部分がありますが、とりあえずはなんとなく理解できたので満足。

```Python:viterbi_algorism.py

import numpy as np

# 状態（hidden states）
states = ['Rainy', 'Sunny']

# 観測値（observations）
observations = ['walk', 'shop', 'clean']

# 初期確率（start probabilities）
start_probability = {'Rainy': 0.6, 'Sunny': 0.4}

# 状態遷移確率（transition probabilities）
transition_probability = {
    'Rainy': {'Rainy': 0.7, 'Sunny': 0.3},
    'Sunny': {'Rainy': 0.4, 'Sunny': 0.6}
}

# 出力（観測）確率（emission probabilities）
emission_probability = {
    'Rainy': {'walk': 0.1, 'shop': 0.4, 'clean': 0.5},
    'Sunny': {'walk': 0.6, 'shop': 0.3, 'clean': 0.1}
}

def viterbi(obs, states, start_p, trans_p, emit_p):
    """
    Viterbi アルゴリズムの実装
    obs: 観測列（例: ['walk', 'shop', 'clean']）
    states: 状態のリスト（例: ['Rainy', 'Sunny']）
    start_p: 初期状態確率（辞書）
    trans_p: 状態遷移確率（辞書の辞書）
    emit_p: 観測確率（辞書の辞書）
    """
    V = [{}]  # Viterbiテーブル
    path = {}

    # 初期化
    for s in states:
        V[0][s] = start_p[s] * emit_p[s][obs[0]]
        path[s] = [s]

    # 再帰ステップ
    for t in range(1, len(obs)):
        V.append({})
        new_path = {}

        for curr_state in states:
            (prob, prev_state) = max(
                (V[t - 1][prev_state] * trans_p[prev_state][curr_state] * emit_p[curr_state][obs[t]], prev_state)
                for prev_state in states
            )
            V[t][curr_state] = prob
            new_path[curr_state] = path[prev_state] + [curr_state]

        path = new_path

    # 終了ステップ
    n = len(obs) - 1
    (prob, state) = max((V[n][s], s) for s in states)
    return prob, path[state]

# 実行
prob, path = viterbi(observations, states, start_probability, transition_probability, emission_probability)

print("最尤確率:", prob)
print("最も確からしい状態列:", path)

```
キャラごとに違う声でしゃべるWebアプリを作ってみた【Python × gTTS × Streamlit】


ふと「テキストで会話してるやり取り、声がついたらもっと楽しいのにな」って思ったのがきっかけで、  
キャラごとに違う声でしゃべってくれるWebアプリを作ってみました。  
名前は **VoiceTalker** です。

テキストで書いた会話を、キャラクターの声で読み上げてくれるアプリです。

---

## できること

VoiceTalkerでは、こんなことができます。

- テキストから会話音声を生成  
- キャラクターごとに声の設定（高さ・速さ・音量・太さ）ができる  
- 複数キャラの会話を1つの音声ファイルとして出力  
- 調整した声をリアルタイムで試聴できる  

---

## セットアップ

環境はPythonです。以下で起動できます。

git clone https://github.com/mtrtrdev/voicetalker.git
cd voicetalker
pip install -r requirements.txt
streamlit run app.py

起動するとブラウザが開き、Webアプリが立ち上がります。

---

## 会話の作り方

サイドバーから「会話生成」を選んで、使いたいキャラクターにチェックを入れます。

テキストはこんな感じで入力します。

```
アリス: おはよう！
ボブ: おはよう、アリス。
```

そのあと「音声生成」ボタンを押すと、会話が音声化されます。

---

## 声のカスタマイズ

「声の設定」では、キャラクターごとに細かい調整ができます。

- 話す速さ：0.5～1.5（1.0が標準）  
- 声の高さ：-12～+12（0が標準）  
- 音量：-20～+20 dB（0が標準）  
- 声の太さ：0～12（数字が大きいほど低音強め）  

テスト用のテキストを入れると、その場ですぐに試聴できます。

---

## 技術スタック

VoiceTalker は以下の技術で作られています。

- Python 3.9+  
- Streamlit：WebアプリのUI  
- gTTS：Google Text-to-Speech（音声生成）  
- librosa：音声の加工（ピッチ、速さ、音量）  
- soundfile：音声ファイルの読み書き  

すべてPythonだけで構成されているので、比較的扱いやすいです。

---

## 注意点

- gTTSを使用しているため、インターネット接続が必要です  
- 音声生成には少し時間がかかる場合があります（数秒）  
- 音声ファイルは一時的に生成されますが、サーバーには保存されません  

---

## GitHub

コードはこちらで公開しています。  
スターしてもらえると励みになります！

https://github.com/mtrtrdev/voicetalker
Laravelで「画像フォルダを一括削除する自作コマンド」を作成する手順

# 目的
ダミーデータを作る際に、「php artisan migrate:fresh --seed」を複数回やるとこれまで「php artisan migrate:fresh --seed」で生成してきた画像データが残ったまま新しい画像データを生成してしまう。
毎回「画像データを削除 → ダミー画像生成」の流れを作りたい


# 手順
# ステップ1：Artisanコマンドを作成
```bash
php artisan make:command ClearCollectionImages
```
成功すると：
```
Console command created successfully.
```
以下のファイルが作成される👇
app/Console/Commands/ClearCollectionImages.php


# ステップ2：コマンドの中身を書く
ClearCollectionImages.php を以下のように編集👇
```ClearCollectionImages.php
<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use Illuminate\Support\Facades\Storage;

class ClearCollectionImages extends Command
{
    // コマンド名（ここが実行時に使うやつ）
    protected $signature = 'storage:clear-collection-images';

    // 説明（`php artisan list` に出るやつ）
    protected $description = 'storage/app/public/collection_images の画像をすべて削除します';

    public function handle()
    {
        $directory = 'collection_images';

        if (!Storage::disk('public')->exists($directory)) {
            $this->warn("📂 ディレクトリが存在しません: storage/app/public/{$directory}");
            return Command::SUCCESS;
        }

        $files = Storage::disk('public')->files($directory);

        if (empty($files)) {
            $this->info("🧼 削除する画像はありませんでした。");
            return Command::SUCCESS;
        }

        foreach ($files as $file) {
            Storage::disk('public')->delete($file);
        }

        $this->info("🗑️ {$directory} 内の画像を削除しました。削除数: " . count($files));

        return Command::SUCCESS;
    }
}
```


# ステップ3：コマンドを登録する
app/Console/Kernel.php を開いて、commands に登録👇
```app/Console/Kernel.php
// app/Console/Kernel.php

protected $commands = [
    \App\Console\Commands\ClearCollectionImages::class,
];
```
![スクリーンショット 2025-04-15 20.17.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3726068/f4f94d3c-7d9a-47b8-9319-63357ec5038e.png)



# ステップ4：実行
```
php artisan storage:clear-collection-images
php artisan migrate:fresh --seed
```
UTF-8とUnicodeの違いと関係について

# UTF-8とUnicodeの違いと関係について

## はじめに

現代のプログラミングやウェブ開発において、文字エンコーディングは非常に重要な概念です。特に、UTF-8とUnicodeは多くの場面で登場しますが、その違いや関係について理解している人は少ないかもしれません。本記事では、UTF-8とUnicodeの違いとその関係について詳しく解説します。

## Unicodeとは？

Unicodeは、全世界の文字を一意に識別するための標準化された文字セットです。各文字には一意のコードポイント（数値）が割り当てられており、これにより異なる言語やシステム間で文字が正しく表示されるようにします。

### Unicodeコードポイントの例

- "A" のUnicodeコードポイント: U+0041
- "あ" のUnicodeコードポイント: U+3042
- "𠮷" のUnicodeコードポイント: U+20BB7

## UTF-8とは？

UTF-8は、Unicodeのコードポイントをバイトシーケンスにエンコードするための方式の一つです。UTF-8は可変長エンコーディング方式で、1バイトから4バイトの範囲で文字をエンコードします。

### UTF-8のエンコードルール

- **1バイト（7ビット）**: U+0000 - U+007F
  - 0xxxxxxx
- **2バイト（11ビット）**: U+0080 - U+07FF
  - 110xxxxx 10xxxxxx
- **3バイト（16ビット）**: U+0800 - U+FFFF
  - 1110xxxx 10xxxxxx 10xxxxxx
- **4バイト（21ビット）**: U+10000 - U+10FFFF
  - 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

### UTF-8エンコードの例

- "A" (U+0041) -> 0x41
- "©" (U+00A9) -> 0xC2 0xA9
- "あ" (U+3042) -> 0xE3 0x81 0x82
- "😀" (U+1F600) -> 0xF0 0x9F 0x98 0x80

## UTF-8の利点

1. **ASCII互換性**: ASCII文字（U+0000からU+007F）は1バイトでエンコードされ、従来のASCIIと完全に互換性があります。
2. **多言語対応**: UTF-8は全てのUnicode文字をエンコードできるため、日本語を含むあらゆる言語の文字を扱うことができます。
3. **効率的なエンコーディング**: 英語などのラテン文字ベースの言語では、ほとんどの文字が1バイトでエンコードされるため、非常に効率的です。
4. **エラー耐性**: UTF-8はエンコーディングの誤りを検出しやすい構造を持っているため、データ破損や不正なデータに対する耐性が高いです。

## まとめ

UTF-8は、Unicodeのエンコード方式の一つであり、全世界の文字を一貫して扱うことができます。ASCIIとの互換性、多言語対応、効率的なエンコーディング、エラー耐性などの利点があるため、現代のシステムやウェブ開発において広く採用されています。

本記事が、UTF-8とUnicodeの違いとその関係についての理解を深める一助となれば幸いです。
AIイラストを種苗法で規制しろ

# 主張
AIイラストを自分の創作物だと言い張り，権利を主張する輩がいる．そいつらに言葉が通じるとは思っていない．この主張は，その他大勢の無関心だった人々への主張である．

## シャインマスカット
上手なイラストを集めて，似たようなイラストを出力させる．
奴らがやっていることは「このシャインマスカットが美味しいから，種を持って帰って自分で育てて売ろう」というものである．シャインマスカットを作り上げた農家へのリスペクトは微塵もない．

このようなことが続けば，より美味しい果物を開発しようという人はいなくなる．なぜならすぐに複製され努力に見合った報酬が得られないからだ．

## AIを調整する工夫
AIイラストレーターは，望みの出力が出るように工夫している，と主張するかもしれん．それ「うちの畑に植えてもなかなか上手く育たなくて苦労しました」って主張だけど，一旦どついていいか？

## 産業革命の時と一緒wwwww
産業革命を経てなお，種苗法によって種苗を開発した権利は保証されてます．本物のイラストレーターが描くイラストは，これと同じだと私は主張する

## 最後に
このたとえ話もきっと奴らは理解できないが，大勢の普通の人は理解できるので問題ない．
[Linux][command] パイプとリダイレクト_|, >, >>, <, <<, tee

# 標準入出力
|番号|入出力名|デフォルト|
|:--|:--|:--|
|0|標準入力|キーボード|
|1|標準出力|画面|
|2|標準エラー出力|画面|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2955010/c9a97225-2f6f-403c-ae43-ce9c6a16eb2d.png)


# パイプとリダイレクト

| 書式 | 説明 |
|:--|:--|
| `コマンドA \| コマンドB` | **パイプ**：コマンドAの標準出力をコマンドBの標準入力として渡します。|
| `コマンド > ファイル`<br>`コマンド 1> ファイル` | **標準出力のリダイレクト**：コマンドの標準出力を指定したファイルに書き込みます。<br>- ファイルが存在しない場合は新規作成<br>- ファイルが存在する場合は上書き |
| `コマンド >> ファイル`<br>`コマンド 1>> ファイル` | **標準出力の追記リダイレクト**：コマンドの標準出力を指定したファイルの末尾に追記します。 |
| `コマンド 2> ファイル` | **標準エラー出力のリダイレクト**：コマンドの標準エラー出力を指定したファイルに書き込みます。 |
| `コマンド 2>> ファイル` | **標準エラー出力の追記リダイレクト**：コマンドの標準エラー出力を指定したファイルの末尾に追記します。 |
| `コマンド < ファイル` | **標準入力のリダイレクト**：コマンドの標準入力を指定したファイルから読み込みます。 |
| `コマンド << EOF` | **ヒアドキュメント**：複数行の標準入力をスクリプト内に直接記述して渡します。<br>EOF（End Of File, 終了文字）は区切り文字の例。 |
| `コマンド <<< "文字列"` | **ヒアストリング**：一行の文字列を標準入力としてコマンドに渡します。 |
| `コマンド 1>&2`<br>`コマンド >&2` | **標準出力を標準エラー出力にリダイレクト**：標準出力を標準エラー出力として扱います。 |
| `コマンド > ファイル 2>&1` | **標準エラー出力を標準出力にリダイレクト**：標準エラー出力を標準出力として扱います。 |



# teeコマンド
| 書式 | 由来 |説明 |
|:--|:--|:--|
| `コマンドA \| tee ファイル` |T状に分岐| **パイプと標準出力の複製**：コマンドAの標準出力をコマンドBに渡すと同時に、指定したファイルにも書き込みます。 |
| `コマンドA \| tee -a ファイル` |apend| **パイプと標準出力の追記複製**：コマンドAの標準出力をコマンドBに渡すと同時に、指定したファイルに追記します。 |


# Ping-t
パイプとリダイレクト
- [3463_|, >, <](https://mondai.ping-t.com/question_subjects/31/question_sessions/31375489/progressing_questions/480744516)
- [3646_>, 1>](https://mondai.ping-t.com/question_subjects/31/question_sessions/31541108/progressing_questions/483298455)
- [3713_>>, 1>>](https://mondai.ping-t.com/question_subjects/31/question_sessions/31943721/progressing_questions/489464098)

- [3464_<<](https://mondai.ping-t.com/question_subjects/31/question_sessions/31913990/progressing_questions/489024883)
- [3472_<<](https://mondai.ping-t.com/question_subjects/31/question_sessions/31943721/progressing_questions/489464092)
- [3687_<<<](https://mondai.ping-t.com/question_subjects/31/question_sessions/31941533/progressing_questions/489430952)

- [3469_>&2](https://mondai.ping-t.com/question_subjects/31/question_sessions/31870469/progressing_questions/488372722)
- [3469_2>&1](https://mondai.ping-t.com/question_subjects/31/question_sessions/31969785/progressing_questions/489837032)
- [3470_2>&1](https://mondai.ping-t.com/question_subjects/31/question_sessions/32209448/progressing_questions/493463161)
- [3666_2>&1](https://mondai.ping-t.com/question_subjects/31/question_sessions/32209448/progressing_questions/493463160)


tee
- [3474_tee](https://mondai.ping-t.com/question_subjects/31/question_sessions/31869840/progressing_questions/488361807)
- [3475_tee](https://mondai.ping-t.com/question_subjects/31/question_sessions/32193725/progressing_questions/493221752)
- [3476_tee -a](https://mondai.ping-t.com/question_subjects/31/question_sessions/32260881/progressing_questions/494259499)
- [3633_echo ping-t | tee | cat](https://mondai.ping-t.com/question_subjects/31/question_sessions/32311097/progressing_questions/495045358)
日本語プログラミング言語Mindでたらい回し関数　別表記

Mindでも下記のとおり、関数っぽい表記も出来ます。

```
tarai4.src

たらい回しとは
　　　  関数　整数入力、整数入力、整数入力、整数出力　
      ｘは  変数    ｙは  変数    ｚは  変数
      ｘと  ｙと  ｚに  入れ   　　
      ｘが  ｙ  以下  
         ならば  ｙを  返し
　　　　　さもなければ
             たらい回し(たらい回し(ｘ － １,ｙ,ｚ),たらい回し(ｙ － １,ｚ,ｘ),たらい回し(ｚ － １,ｘ,ｙ))を  返す
　　　　　　つぎに。

メインは
　　・・・
　　・・・
　　たらい回し（x,y,z)を　数値表示する
　　・・・・。
  ```
pygps2 バージョン情報(NMEA解析プログラム)

# リポジトリ

https://github.com/saradaabura/pygps2

# Version 3.5 最新バージョン
- class化
(3.4はgithubへ)

# Version 3.2
**軽量化#2**

一度にすべてのセンテンスを入れなくても、解析できるようにした。
解析データの変数をinit処理させるようにした。
結果として、小さいメモリでも動作しやすくなった。

使用方法は変わってしまうので、サンプルコードとしてexamples/pico_example_32.pyを参照

# Version 3.1
**解析方法の変更**

analyzeにデコードしたデータを直接いれることができるようにした。 これにより、簡略化されたプログラムを作成できるようになった。
詳細はexamples/pico_example_31.pyを参照
# Version 3.0
**メモリの最適化**

- del を使用して不要になった変数を削除するようにした
- gcを実行できるようにした
- 解析するプログラムを選択できるようにした

これにより、少ないリソースでも動作する可能性が上がった。
# Version 2.9
**チェックサムの機能を追加**
- 各センテンスをチェックサムにより検証する機能を追加
→parse_nmea_sentencesで処理される際、チェックサムを検証するようになった。

今後はチェックサム検証を有効にするかどうかを選択できるようにする予定。

# Version 2.8 リリースバージョン
**RMCや経緯度変換関数の変更**
### RMC
- cpython環境下でmktimeのエラー回避　cpythonではmicropythonと同じように使用可能
### 経緯度変換関数
- cpythonでDecimalを使用するように変更

どちらも条件分岐でmicropythonとcpythonで処理を変更するようにしている。
これにより、cpython環境でも安定して動作するようになった。
# Version 2.7
**decimal関数を用いてissues#2を解消**
使用したライブラリ
- micropython-decimal-number
 
https://github.com/mpy-dev/micropython-decimal-number/tree/main

THANK YOU!
latとlonは処理する前にstr()で文字列に変換する必要がある。今後はこの処理を関数に組み込む予定。

float(str())にして演算を行うと、精度が落ちるため**なるべくstr型**で保持するようにする。

# Version 2.6 リリースバージョン

**パターンにないデータの処理**

2.5以前はpatternsにないデータは処理されなかったが、2.6以降は処理されるようになった。

処理されたデータはpygps2.parse_nmea_sentences()でOtherに分類される。pygps2.analyze_nmea_data()では処理されない。
例
![スクリーンショット 2025-03-22 195114.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3994157/93da86a7-163d-4a24-8626-7c3809eb3e45.png)


# Version 2.5
**DHV ZDA TXT追加**
- 解析センテンスの追加
**FIXしていないときの時刻(初期値)は2000/01/01になりました**
- timeのmktimeエラー回避のため

# Version 2.4
**RMC変更**
- RMCに経度から計算したローカル時刻を追加
→No FIXのときはUTC時刻でlocal_datetimeに値がある
- 日付の変更に対応

# Version 2.3
**GST解析関数追加**
- GSTセンテンスの解析関数を追加
# Version 2.2
**衛星のデュアルバンドによるカウント重複の解消**
GNSSのセンテンスから2回以上同じPRNが検出されてもカウントしないようにした。

まだ完全ではないが、一部のセンテンスに対しては対応した。

動作確認
- AT6668
- AT6558
# Version 2.1
**GSV解析関数変更**
- 衛星識別子を追加

GSVセンテンスの先頭2文字目から4文字目を取得

それを識別子として辞書の"type"に追加するよう処理を追加した

```:例 対応
$BDGSV "type":"BD"
$GPGSV "type":"GP"
$GAGSV "type":"GA"
$GLGSV "type":"GL"
$GNGSV "type":"GN"
$GQGSV "type":"GQ"
$GBGSV "type":"GB"
```
SBASについては対応していない

$GPGSVの中にあるQZSS等のデータはGPとして処理される。

直接センテンスから取得した出力であるため、使用するモジュールによってプログラムを変更する必要がある。

# Version 2.0
作成
「複素数平面のi/zはどのような意味ですか。」をAI先生に聞きました。

# (本日の)ChatGPT先生へ
#### 開始
```
複素数平面のi/zはどのような意味ですか。
1/zと何が違いますか。
```
・ChatGPT先生の回答はていねいです。
　**2.が変です。**
　5.が必要でした。
　そこまでやらなくてもと、聞くのを忘れました。
　2.を聞くのを忘れました。
　作図をお願いするのを忘れました。
　ちょうど時間となりました。GPT-4o. の Free プランの制限に達しました。
#### 質問リスト
・質問リストの追番は無視して下さい。１個ずつです。途中の回答表示は省略しています。
```
# 質問リスト
1. 複素数平面の \( \frac{i}{z} \) はどのような意味ですか。
2. \( \frac{1}{z} \) と何が違いますか。
3. 上記を sympy のソースコードで教えて下さい。結果は、ソースコードの外で。markdown 形式で。テキストも。
4. mathjax を省略しないで、私の質問を最初から、Markdown 形式でリスト化して出力して。Markdown 形式でリストからアスタリスクは削除して。1行目に、# 質問リスト の文字を出力して。
5. 私の質問だけで。本質問も含めて。
```
>(ステキな解説省略)
1. 逆数1/zの意味
...z を原点を中心とする円の内側にひっくり返し（反転）、共役を取ることで y 軸方向に対称移動させる...
2. i/zの意味
...1/zをさらに90°反時計回りに回転させたもの...
3. 幾何的な違い
...
具体例
まとめ
```python
import sympy as sp

# 複素数 z を定義
x, y = sp.symbols('x y', real=True)
z = x + sp.I * y

# 逆数 1/z
inv_z = 1 / z

# i/z
i_over_z = sp.I / z

# 結果を展開
inv_z_expanded = sp.simplify(inv_z)
i_over_z_expanded = sp.simplify(i_over_z)

# 結果を表示
print("1/z =", inv_z_expanded)
print("i/z =", i_over_z_expanded)
```
・???よくわからなくなりました。
```
### **計算結果**
1. **逆数 \( \frac{1}{z} \)**  
   \[
   \frac{1}{z} = \frac{x - iy}{x^2 + y^2}
   \]
2. **\( \frac{i}{z} \)**  
   \[
   \frac{i}{z} = \frac{y + ix}{x^2 + y^2}
   \]

### **解釈**
- \( \frac{1}{z} \) は \( z \) の共役をとって大きさの二乗で割る（反転＋共役）。
- \( \frac{i}{z} \) はさらに \( 90^\circ \) 反時計回りに回転した結果。
```
・これか？変な記号そのままです。
```math
   \[
   \frac{1}{z} = \frac{x - iy}{x^2 + y^2}
   \]

   \[
   \frac{i}{z} = \frac{y + ix}{x^2 + y^2}
   \]
```

# Gemini先生へ


# copilot先生へ

# いつもの? sympyの実行環境と 参考のおすすめです。
[(テンプレート)](https://qiita.com/mrrclb48z/items/00dd08b0317069be9342)

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

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

https://en.wikipedia.org/wiki/Complex_plane

https://ja.wikipedia.org/wiki/複素平面

複素数の積と回転

https://ja.wikipedia.org/wiki/複素平面#複素数の積と回転

### wikibook

https://ja.wikibooks.org/wiki/高等学校数学C/複素数平面

複素数の積・商

https://ja.wikibooks.org/wiki/高等学校数学C/複素数平面#複素数の積・商

回転移動

https://ja.wikibooks.org/wiki/高等学校数学C/複素数平面#回転移動
[Linux][command] プロセス管理_実行_nice, renice, nohup

# niceコマンド
~~~terminal
# nice [オプション] コマンド
~~~

| オプション | 英語の由来        | 説明                                                                                 |
|:--|:--|:--|
| default | nice               | デフォルトの優先度（`10`）でコマンドを実行<br>なお、`nice`コマンドを使わない場合の優先度は`0`  |
| `-n nice値`<br>`-nice値`       | niceness            | 実行するコマンドのnice値（優先度）を指定<br>- 値が高いほど優先度が低く、値が低いほど優先度が高い。<br>- 優先度最高 `-20`, 優先度最低 `19` |


## 使用例
優先度（正）
~~~terminal
# nice -n 15 tar czf home_backup.tar.gz /home

or 

# nice -15 tar czf home_backup.tar.gz /home
~~~

優先度（負）←rootユーザーのみ
~~~terminal
# nice -n -10 tar czf home_backup.tar.gz /home

or

# nice --10 tar czf home_backup.tar.gz /home
~~~

# reniceコマンド
~~~terminal
# renice nice値 [オプション]
~~~

| オプション | 英語の由来 | 説明 |
|:--|:--|:--|
| default | re-nice | 実行中プロセスの**nice値（優先度）を変更**します。 |
| `-p <PID>`<br> `<PID>` | process | 対象とするプロセスID（PID）を指定します。<br>- 省略可能 |
| `-u <ユーザー名>` | user | 対象とするユーザーを指定します。<br>- ユーザーが所有するすべてのプロセスのnice値を変更|

## 使用例
優先度を低くする
~~~terminal
# renice 15 -p 1234

or

# renice 15 1234
~~~

優先度を高くする←rootユーザーのみ
~~~terminal
# renice -10 -p 1234

or

# renice -10 1234
~~~

# nohupコマンド
~~~terminal
# nohup コマンド [引数] &
~~~

| コマンド例 | 説明   |
|:--|:--|
| `nohup ./script.sh &` | `script.sh`をバックグラウンドで実行し、ターミナルを閉じてもプロセスが継続します。 |

# Ping-t
nice
- [3200_nice デフォルト](https://mondai.ping-t.com/question_subjects/31/question_sessions/32960551/progressing_questions/504874665?result=true)
- [3489_nice -19, nice -n 19](https://mondai.ping-t.com/question_subjects/31/question_sessions/31870469/progressing_questions/488372721)
- [3491_nice](https://mondai.ping-t.com/question_subjects/31/question_sessions/31913990/progressing_questions/489024879)
- [3493_nice デフォルト](https://mondai.ping-t.com/question_subjects/31/question_sessions/31375489/progressing_questions/480744514)
- [3494_nice --20, nice -n -20]()

renice
- [3495_renice -u](https://mondai.ping-t.com/question_subjects/31/question_sessions/31913990/progressing_questions/489024885)
- [3496_renice -20 -p, renice -20](https://mondai.ping-t.com/question_subjects/31/question_sessions/32244301/progressing_questions/494010613)

nohup
- [3487_nohup](https://mondai.ping-t.com/question_subjects/31/question_sessions/31375489/progressing_questions/480744515)
Substance 3D PainterとPyCharmを接続してデバッグしやすくする

## 環境
* Windows
* Adobe Substance 3D Painter 10.1.2
* PyCharm 2024.3.4

## 設定手順

### デバッグ構成の作成

[Remote debugging with the Python remote debug server configuration](https://www.jetbrains.com/help/pycharm/2024.3/remote-debugging-with-product.html?top=&keymap=Windows&utm_source=product&utm_medium=link&utm_campaign=PY&utm_content=2024.3#remote-debug-config) の手順にしたがってリモートデバッグ用の構成を作成します。

まず、メニューの ```Run| Edit Configurations...``` から ```Run/debug configurations``` ダイアログを開き、＋ボタンをクリックして ```Python Debug Server``` を選択します。

次に設定値を入力します。

* IDE host name: localhost
* Port: 空いている番号

設定値を入力すると、この後の接続手順で必要となる情報が設定値に合わせて表示されます。1の手順のコマンドと2の手順のPythonコードをメモしてください。
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3965005/c4833200-79ef-4548-ac53-0ea02190f728.jpeg">

:::note warn
画像では ```port``` の箇所が ```$SERVER_PORT``` になっていますが実際は入力した値が表示されます。
:::

### ライブラリのインストール

メモした手順の1のコマンドで ```pydevd-pycharm``` パッケージをインストールしてください。

```console
pip install pydevd-pycharm~=243.25659.43
```

## 接続手順

まずPyCharm のデバッグボタンを押します。
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3965005/ffbbe8f7-d752-45e5-8cc5-7dd8a16f763b.jpeg">

PyCharmのConsoleに「Waiting for process connection...」と表示され接続待ちの状態になったことを確認します。
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3965005/612f9b81-ccee-448e-960f-966e4a5943bb.jpeg">

Substance 3D Painter の Python Console にメモした手順2のコードを実行します。
```python
import pydevd_pycharm
pydevd_pycharm.settrace('localhost', port=<port number>, stdoutToServer=True, stderrToServer=True)
```

PyCharmのConsoleに「Connected to pydev debugger」と表示されれば接続成功です。
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3965005/a3cdcf9d-6a44-4c9b-aec4-cf0d137d1067.jpeg">

接続直後はSubstance 3D Painter が一時停止状態となり、操作ができなくなります。
Resume Program のボタンを押すとSubstance 3D Painter の一時停止が解除され操作できるようになります。
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3965005/f4b48cdd-49bf-4b0c-a3d1-ff45993c0cbf.jpeg">


### 接続に関しての簡単な補足

接続中はブレークポイントの設定が有効になります。
Substance 3D Painter の Python Console から呼び出して実行すれば、ブレークポイントで一時停止し変数の確認が可能です。
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3965005/e97f6fed-ebba-42fb-9bef-1d9970933f19.jpeg">

またPause中はPyCharmのConsole上で Substance 3D Painter の Python APIを実行することが可能です。
Substance 3D PainterのPython Consoleと異なり、複数行のコードをコピーペーストして実行することも可能です。
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3965005/d15200c3-67d3-48b6-9ac5-786f5df08cd0.jpeg">

## 停止方法

PyCharm で Stop ボタンを押します。
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3965005/31f53203-5316-4569-89cc-53376d3d10f9.jpeg">

また、Substance 3D Painter の Python Console で下記のコードを実行します。

```python
pydevd_pycharm.stoptrace()
```

## 参考

* [Remote debugging with the Python remote debug server configuration](https://www.jetbrains.com/help/pycharm/2024.3/remote-debugging-with-product.html?top=&keymap=Windows&utm_source=product&utm_medium=link&utm_campaign=PY&utm_content=2024.3#remote-debug-config)
mallocにNUMA APIのmbindを適用させる方法

# 何故mmapじゃダメか
mmapで確保された領域はmunmapによりOSに返還されますがこれだと再度割り当てた際にマイナーフォルトなどにより非常に効率の悪い処理になってしまうことがあります。
mallocはfreeが呼び出された後メモリプールなどでメモリ領域を管理していることが多く, こうした問題を回避しています。

# エラーが起きる時
以下のようなコードだとエラーが起きます。
```C++
void *ptr = (void *)malloc(size);
unsigned long nodemask = 1 << 0;
if (mbind(ptr, size, MPOL_PREFERRED, &nodemask, sizeof(nodemask) * 8, 0) != 0){
    perror("mbind failed");
}
```
これは[mbind](https://man7.org/linux/man-pages/man2/mbind.2.html)のdocsにもある通りmbindは基本的にmmapで割り当てた領域を対象に作用するためです。しかしながら, どうにかしてmallocでも使う方法はないでしょうか, mallocでも一部のallocateはmmapのはずなのにどうして使えないのでしょうかと思いませんでしょうか?
# mbindが作用する時
mmapはページサイズの倍数アドレスが返されるので, mbindはどうもalignされたアドレスを想定しているっぽいのでaligned_allocを使うと動きます
```C++
void *ptr = (void *)aligned_alloc(PAGE_SIZE, size);
unsigned long nodemask = 1 << 0;
if (mbind(ptr, size, MPOL_PREFERRED, &nodemask, sizeof(nodemask) * 8, 0) != 0){
    perror("mbind failed");
}
```
一応これで動きましたがaligned_allocの実装次第では想定してない挙動になるかもしれません。実験ではjemallocのaligned_allocを用いました。
プロキシサーバと通信プロトコルの基本

## 1. プロキシサーバの役割
プロキシサーバは、クライアントとサーバの間に立ち、クライアントの要求を受けてその代わりにサーバと通信を行うサーバです。プロキシサーバを使用することで、アクセス制御、キャッシュ、トラフィックの最適化、セキュリティ強化などが可能になります。

・プロキシサーバの主な役割:
　・通信の中継: クライアントが直接サーバにアクセスする代わりに、プロキシサーバを経由して通信を行います。

　・セキュリティの向上: サーバとの直接的な通信を避けることで、企業の内部ネットワークを外部の攻撃から保護します。

　・トラフィックの制御: アクセス制限やフィルタリング、通信のログ記録などが行えます。

## 2. プロキシサーバの宛先IPアドレスと送信元IPアドレス
プロキシサーバがクライアントとサーバの間で通信を行う場合、宛先IPアドレスや送信元IPアドレスがどのように設定されるかは重要な点です。

・宛先IPアドレス: クライアントがアクセスしたいサーバのIPアドレスです。プロキシサーバは、クライアントから受け取ったリクエストに基づき、宛先IPアドレスに通信を転送します。

　・HTTPの場合: クライアントからのリクエストにはサーバのIPアドレスが含まれており、プロキシサーバはそのIPアドレスを基に通信を行います。例えば、クライアントがhttp://example.comにアクセスした場合、プロキシサーバはexample.comのIPアドレスにアクセスします。

・送信元IPアドレス: プロキシサーバがサーバにリクエストを送信する際の送信元IPアドレスです。プロキシサーバを使用することで、クライアントの本来のIPアドレスではなく、プロキシサーバのIPアドレスが送信元IPアドレスとして使用されます。

　・HTTPの場合: クライアントがリクエストを送信すると、その送信元IPアドレスはプロキシサーバのIPアドレスになります。サーバには、リクエスト元がプロキシサーバであることが分かり、クライアントの実際のIPアドレスはサーバ側に渡りません。

　・HTTPSの場合: HTTPS通信では、プロキシサーバは暗号化されたトンネルを介してデータを送信します。そのため、プロキシサーバはデータの内容を確認せず、そのまま暗号化されたデータを宛先サーバに転送します。この場合でも、プロキシサーバのIPアドレスが送信元として使用されます。

## 3. HTTPとHTTPSでのプロキシサーバの動作
HTTPとHTTPSの動作の違いについても理解しておくことが重要です。

・HTTP通信の場合:
　・クライアントがプロキシサーバにリクエストを送信すると、プロキシサーバはその内容（URL、ヘッダーなど）を読み取って、目的のサーバにリクエストを転送します。この際、プロキシサーバはサーバへのリクエストにおいて、宛先IPアドレスを指定し、送信元IPアドレスはプロキシサーバのものになります。

・HTTPS通信の場合:
　・HTTPSでは、クライアントとサーバ間で**TLS（Transport Layer Security）**を使用して暗号化された通信が行われます。プロキシサーバがHTTPリクエストを受け取ると、クライアントとサーバ間の暗号化されたトンネルを作成します。この際、プロキシサーバはクライアントとサーバ間のデータを暗号化されたまま中継するため、データ内容は確認できませんが、送信元IPアドレスとしてプロキシサーバのIPが使用されます。

　・プロキシサーバがHTTPS通信を中継する際に使用されるプロトコルとして、**SSL/TLSトンネル（CONNECTメソッド）**があります。これにより、プロキシサーバはクライアントとサーバ間の暗号化された通信を中継しますが、内容は見ることができません。

## 4. プロキシサーバの種類と動作
・フォワードプロキシ:
　・クライアントがインターネットにアクセスするために使用するプロキシサーバです。企業などの内部ネットワークからインターネットにアクセスする場合に使われます。外部のサーバからは、プロキシサーバのIPアドレスが送信元IPとして表示されます。

・リバースプロキシ:
　・サーバ側に配置され、クライアントからのリクエストを受けて内部のサーバに転送します。例えば、負荷分散やキャッシュのために使用されます。内部のサーバからは、リバースプロキシサーバのIPアドレスが送信元IPとして表示されます。

## 5. WebSocket通信とプロキシサーバ
WebSocketは、HTTPと異なり、持続的な接続を確立して双方向通信を行うため、プロキシサーバとの連携が必要です。WebSocket通信では、以下の点に注意する必要があります。

・WebSocketハンドシェイク: 最初はHTTPを使ってWebSocket接続を確立します。HTTPリクエストにUpgradeヘッダーを含めてWebSocket通信に切り替えます。プロキシサーバはこの初期のHTTPリクエストを中継し、接続が確立されると、その後のWebSocket通信は直接クライアントとサーバの間で行われます。

・ポートの使用: WebSocket通信は、通常、HTTPと同じポート（ポート80または443）を使用します。これにより、プロキシサーバやファイアウォールの設定を変更せずに済む場合があります。

・ファイアウォールとルータの設定: WebSocketは持続的なTCP接続を必要とするため、ファイアウォールやルータで特定のポートを開放する必要がある場合があります。しかし、HTTPと同じポートを使用するため、既存の設定変更が最小限で済むことがあります。

## 6. まとめ
・HTTP通信は、リクエスト-レスポンスのサイクルで通信が行われ、プロキシサーバを利用することでセキュリティや制御が向上します。プロキシサーバを経由した場合、送信元IPアドレスはプロキシサーバのものになります。

・HTTPS通信では、暗号化されたトンネルを使ってデータを中継しますが、プロキシサーバはデータ内容を確認できません。送信元IPアドレスはプロキシサーバのものになりますが、暗号化されたままでデータを中継します。

・WebSocket通信は、HTTPを使って接続を確立した後、持続的なTCP接続で双方向通信が行われます。プロキシサーバはWebSocket接続の初期ハンドシェイクを中継し、その後は直接通信が行われます。

プロキシサーバを理解することは、ネットワーク管理やセキュリティ設計、または通信プロトコルの選定において非常に重要です。試験対策として、HTTPとHTTPS、WebSocket通信の動作、プロキシサーバの役割をしっかりと押さえておきましょう。
C_TS422_2023 SAP Certified Application Associate SAP S/4HANA Production Planning and Manufacturing対策（1/100）

【1日目】
トピック 1：SAPS/4HANAサプライチェーン計画の概要（1/6）

≪問題1≫
サプライチェーン計画において予測に利用できるSAPアプリケーションは次のうちどれでしょうか。
（２つ選んでください）
▢サプライチェーンマネジメント（SCM）
▢Integrated Business Planning（IBP）
▢能力所要量計画（CRP）
▢資材所要量計画（MRP）

≪解答≫
■サプライチェーンマネジメント（SCM）
■Integrated Business Planning（IBP）
▢能力所要量計画（CRP）
▢資材所要量計画（MRP）

≪解説≫
サプライチェーン計画において、予測に使用する最適なツールは、SCMとIBPです。
・サプライチェーンマネジメント (SCM)：SCMは、供給、需要、輸送、および在庫管理を通してサプライチェーン全体の最適化を図るために使用されます。予測のためのデータを集約して分析し、効率的なサプライチェーン計画を支援します。
・Integrated Business Planning (IBP)：IBPは、需要と供給のバランスをとるための統合的な計画ツールで、企業全体のデータを使って計画を立てます。これにより、より正確で柔軟な予測が可能になります。

≪正解の選択肢≫
・サプライチェーンマネジメント (SCM)：SCMはサプライチェーンのすべての段階に関与し、予測や計画に対して非常に高い精度を提供します。各段階での需要と供給を適切に管理することで、効率的な物流を実現します。
・Integrated Business Planning (IBP)：IBPは高度な予測機能を備えており、需要計画、供給計画、財務計画を一体化させることで、全体的なビジネス戦略に対応します。

≪不正解の選択肢≫
・資材所要量計画 (MRP)：資材所要量計画 (MRP)は主に生産計画と在庫補充を行うためのツールで、サプライチェーン全体の予測を管理するには不十分です。
・能力所要量計画 (CRP)：能力所要量計画 (CRP)は生産能力の計画を行うためのツールで、サプライチェーン全体の需要予測には使用されません。

≪まとめ≫
サプライチェーン全体の予測と計画においては、SCMとIBPが最適です。これらのツールを使うことで、需要と供給のバランスをとり、より効率的で精度の高い計画が可能となります。
React - マウント，再レンダリング，アンマウントで起こること

## はじめに
コンポーネントのマウント，再レンダリング，アンマウント時に起こることが曖昧だったので，基本的な内容をまとめてみます．

## マウント
Reactにおけるコンポーネントのマウントとは，コンポーネントがDOMに初めて表示されることをいいます．
### マウント時に起こること
- useStateの初期値の設定
- 関数コンポーネントの実行
- useRefの初期値の設定
- JSX が評価されて DOM に描画
- useEffectの実行

## 再レンダリング
再レンダリングが起きる条件については，簡単に[こちら](https://qiita.com/peipeita/items/bed8096a2013c2f86403)でまとめています，
### 再レンダリング時に起こること

- 関数コンポーネントの再実行
- JSX が再評価されて DOM に描画
- useEffectの実行
   - ただし，依存配列がない場合や，依存配列の要素が変更されたときに限ります．
   依存配列が`[]`の場合はマウント時のみの実行になります．


 ## アンマウント
 Reactにおけるコンポーネントのアンマウントとは，コンポーネントがDOMから削除されることをいいます．
 例：以下の場合があります．
- ページ遷移でコンポーネントが画面から消えたとき
- 条件分岐でコンポーネントがnullになったとき

### アンマウント時に起こること
- useEffectのクリーンアップ関数の実行

例えば，以下のコードでは，ボタンをクリックすることで`showTimer`のtrue/falseを切り替えることで，`TimerComponent`をnullかどうかを制御することができます．
falseになったときは，`TimerComponent`がアンマウントされ，useEffectのクリーンアップ関数が実行されることで，"アンマウントされてタイマーを解除しました"がコンソールに表示されます．

```jsx
const Timer = () => {
  useEffect(() => {
    const timer = setInterval(() => {
      console.log("1秒ごとに表示しています");
    }, 1000);

    return () => {
      clearInterval(timer);
      console.log("アンマウントされてタイマーを解除しました");
    };
  }, []);

  return <div>タイマーが動作中です！</div>;
};

const Example = () => {
  const [showTimer, setShowTimer] = useState(true);

  return (
    <>
      <button onClick={() => setShowTimer((prev) => !prev)}>Timerの切り替え</button>
      {showTimer && <Timer/>}
    </>
  );
};

```

## おわりに
マウント，再レンダリング，アンマウント時に起こる内容について基本的なものをまとめてみました．
pyperclip でクリップボードの監視機能がなくなった

pyperclip でクリップボードの監視機能 `waitForPaste`, `waitForNewPaste` がなくなったことに気付きました。自前でポーリングするようにとのことです。

https://github.com/asweigart/pyperclip/issues/272

# 自前実装

上記 Issue のコードに少し手を加えました。

```python
import pyperclip, time

def waitForNewPaste(timeout=0):
    current = pyperclip.paste()
    start = time.monotonic()
    while True:
        time.sleep(0.1)
        text = pyperclip.paste()
        if text != current:
            return text
        if timeout > 0 and time.monotonic() - start > timeout:
            raise pyperclip.PyperclipTimeoutException(
                f"waitForPaste() timed out after {timeout} seconds.")
```

クリップボードの中身が変化するのを待ちます。`time.monotonic()` は OS での時刻の再設定に影響を受けない経過時間を返します。

:::note warn
同じ内容をコピーしてもスルーされます。これはやや不自然に感じますが、実装が簡単で、過去の実装もこういう挙動でした。
:::

# 参考

監視機能が存在していた頃の説明です。

https://note.nkmk.me/python-pyperclip-usage/

> `pyperclip.waitForPaste()`を実行するとクリップボードの中身が空の場合は待機状態になり、新しいテキストがコピーされるとそれを返す。

> `pyperclip.waitForNewPaste()`を実行すると待機状態になり、新しいテキストがコピーされる（= クリップボードのテキストが変更される）とそれを返す。

# 関連記事

使用例です。

https://qiita.com/7shi/items/7f9c8ea1a4e380c02af1
【React】useContextとJotaiの違い

# はじめに
Reactで開発をしていて値や関数を渡すということをするときにuseContextを使っていましたが、Jotaiを学んだ際、違いをよく理解できていなかったため今回まとめてみました。
間違いあればご指摘をお願いします。
内容については、単純な挙動でまとめています。

<br>

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3707255/093e5f5f-bd66-41e8-a9a1-2048547de3f4.png)

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3707255/4649ea53-dbb6-4c94-9e0a-9463bdebd451.png)

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3707255/bc8198de-f3d4-439f-9f9b-e800cfb1a7f9.png)

![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3707255/e482154c-aecd-4a2a-acf5-0d28f5ae1f94.png)

![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3707255/19b921ef-701c-4093-bdc5-016604e75fac.png)

![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3707255/f234b76f-c74e-4314-8b80-5fd866c12d15.png)

![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3707255/efd05ff1-e9dc-4cb2-96b8-f76c3efdd428.png)

![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3707255/0355a910-3126-4a33-923e-93856cbea135.png)

![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3707255/ee681f21-df93-4504-b328-469f984895a8.png)

![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3707255/6814a010-d6fd-4840-bb7e-e7921491c343.png)

![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3707255/bcde7c2b-1d58-4bc1-9fae-c43454c051e4.png)

![12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3707255/1c648342-a59a-4775-b39d-3dc82f356316.png)

![13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3707255/dac62bd7-4721-4c6c-80df-118c5a8aabde.png)

![14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3707255/6126e3f5-ffc1-4802-8f9a-ce9b42e22313.png)

![15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3707255/b88adf24-1b8a-4a81-b7fb-4c0e63d7a0ff.png)

![16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3707255/fe071a20-80c3-4f5b-a2bd-362b600e65ac.png)

![17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3707255/22449d05-54ca-4f49-8773-1baeb525fe94.png)



# おわりに
沢山使いまわして、理解を深めていきます。

<br>

[<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3707255/8bfacf61-7d8d-6d27-cb07-98d1f8f27fcd.png"  width=100%>](https://projisou.jp)
AWS Inspectorがアップデートされたというので確認してみた

# 挨拶

こんにちは。日々の通知を探しながら確認して気になることはXにポストしたりしている

白”雪姫”(しらゆき）ですです。

# 概要

そんなご挨拶をしていますが、AWSの通知をRSSで取得するようにしています。

そんな中で気になったの記事がありました。

[Amazon Inspector が最小限のコンテナベースイメージと強化された検出に対する ECR のサポートを拡張](https://aws.amazon.com/jp/about-aws/whats-new/2025/03/amazon-inspector-container-base-images-enhanced-detections/)
こちらの気になったところがあったので試してみました。

# 内容の抜粋

> さらに、Amazon Inspector は、Amazon EC2 インスタンスと Amazon ECR コンテナイメージで実行されている廃止されたオペレーティングシステムの識別をサポートするようになりました。Amazon Inspector は、情報提供のみを目的として、廃止されたオペレーティングシステムを使用しているリソースに関する検出結果を生成し、リスク軽減戦略の優先順位付けをサポートします。

こんなワードがあります。
「おっ？これは？？？」なんて思っちゃいました。
ちょうど私のアカウントのテストEC2がかなり古く（あえてリプレースしてないインスタンスで普段は休止にしています）

試してみましょう！

＃ 実践

1. まずは普段止めているこちらを起動します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3553392/71dacd25-948b-4484-abfd-896732a8dd61.png)

見ておわかりかと思いますが、だいぶ古いです。
AMIも2016とかなり古いAMIから起動しているものです。
2. Inspectorにアクセスします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3553392/670a9f35-8cb8-48bc-9e5d-106ce250ce6b.png)
3. 標準スキャンで出るのかなーと思いかけて結果を確認してみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3553392/a11b7199-9dae-483a-9a1a-1918a8c2b86f.png)
うーん？出なさそうだなぁ・・・？
4. CISScanもちょっと試してみてます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3553392/f757041e-67b0-4555-852d-7ce11b0df735.png)
5. って思ったら・・・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3553392/791df86b-6473-47e0-9003-0aea8db05200.png)
OSがUnknowとなってました。
おそらく、Agentの管理下に置く必要があると思います。
また試してみようかなと思います。
今日はここまでにしましょう

# 感想

Inspectorもだいぶ変わりましたね。Classic時代を使ってたのでちょっとびっくりしました。
色々、また試して検証の記事作りたいと思います
Array(10).keys()でスマートに連続数を出力する方法

1〜10を1行で出力する問題」。最初は `for` ループでやったけど、もっとスッキリ書ける方法があった！

この技術メモでは、 `Array(10).keys()` を使った最適解をサクッと解説します。

## <br>🔍 問題概要

「`1 2 3 4 5 6 7 8 9 10 `」と出力する。ただし、

- 間に半角スペースを入れる
- 最後に半角スペース＋改行を入れる
- 余計な文字や空行はNG

## <br>❌ NGコード
```js
for (let i = 1; i <= 10; i++) {
    console.log(i + " ");
}
```
問題点:
- `console.log()` は 自動的に改行を入れる → 1行にならない！
- 余計な空行が発生する

## <Br>✅ OKコード（forループ版）
```js
for (let i = 1; i <= 10; i++){
    if(i !== 10){
        process.stdout.write(`${i} `);
    } else {
        process.stdout.write(i + " \n");
    }
}
```
👍 改善ポイント:
- `process.stdout.write()` を使うことで 改行なしの出力 を実現
- 最後の要素だけ スペース＋改行を加える処理 を入れる


## <br> ✅ OKコード（スマートな解法）
```js
console.log([...Array(10).keys()].map(i => i + 1).join(" ") + " ");
```
解説:
- `Array(10)` → 長さ10の空の配列 を作成
- `.keys()` → インデックス（0〜9）を取得
- `map(i => i + 1)` → 1〜10の配列を作る
- `join(" ")` → 半角スペース区切りの文字列に変換
- `+ " "` → 最後にスペースを追加して改行を入れる

### <br>🎯 おまけ: シンプル版（最後のスペース不要）
```js
console.log([...Array(10).keys()].map(i => i + 1).join(" "));
```
## <br>🚀 まとめ

✅ `process.stdout.write()` を使えば改行なしの出力が可能
✅ `join(" ")` は「間にスペースを入れて1行にする」時に便利
✅ スプレッド構文 `...` ＆ `.keys()` で簡単に連番を作れる



 <br>[僕の失敗談と解決話！](https://paizabeginner.wordpress.com/2025/03/22/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%e9%80%a3%e7%b6%9a%e6%95%b0%e3%82%92%e3%82%b9%e3%83%9e%e3%83%bc%e3%83%88%e3%81%ab%e5%87%ba%e5%8a%9b%ef%bc%81for%e3%83%ab/)
babylon.jsでのテクスチャの貼り方

# はじめに
Babylon.jsでのテクスチャの貼り方を忘れてしまっていたので記事化する。
またPlaygroundでのセーブのやり方も忘れていたので同時に記載し備忘録とする。

# やり方
## テクスチャ
BABYLON.MeshBuilderを使いboxを作成
テクスチャ用のマットをBABYLON.StandardMaterialで作成
作成したマットをテクスチャに割り当てる
boxのマテリアルに付与してやる

```javascript
var box = BABYLON.MeshBuilder.CreateBox("box", {diameter:2, segments: 8}, scene);

const boxMat = new BABYLON.StandardMaterial("boxMat");
boxMat.diffuseTexture = new BABYLON.Texture("textures/albedo.png", scene);

box.material = boxMat;
```

## 保存方法
1.再生ボタンの隣のボタンを選択（ctrl+sでも可）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330568/9ec14bf7-8c5b-4c60-99a9-903027f7ceae.png)

2.詳細を記載する画面が出てくるので記入をしてOkを押す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330568/7b159cb1-7b79-4203-b47f-01ccadee5bf9.png)

3.これでURLが変化し、共有がされる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330568/2b161ec2-d0b6-41f4-a42c-64fed0821e72.png)

# 今回作ったコード
https://playground.babylonjs.com/#YSLJ2S#3

# 参考サイトなど

テクスチャ情報
https://doc.babylonjs.com/toolsAndResources/assetLibraries/availableTextures

保存方法関係
https://www.crossroad-tech.com/entry/GetStartedBabylonjs2022_winter

チュートリアルの日本語版
https://zenn.dev/chomado/books/babylonjs-tutorial-ja/viewer/2-05

# 終わりに
しばらくぶりにBabylon.jsを触ったのでどの機能がどこにあったのかを失念していた。
技術書の執筆までに要素を分解し、記事化をすることで知見の共有を行うとともに執筆の練習とする。
VSCodeによるiOSアプリ開発時の問題点（メモ）

こんな問題がながらく放置されているとは思えないので、自分の環境だけかもしれませんが、困っている人がいるかもしれないので、メモを公開します。

## ひとことで言うと

VSCodeのFlutter Extensionをインストールすると、Xcodeでビルドができなくなることがあります。

## 環境
Xcode 16.x
VSCode 1.98.2
VSCode Flutter Extension 3.106.0
VSCode Dart Extension 3.106.0

## 現象

Dart拡張機能は、Xcodeのビルド時に使用される ~/Library/Developer/Xcode/DerivedData/ 内の
- ModuleCache.noindex
- SDKStatCaches.noindex 

を削除してしまいます。（環境によっては削除されない。原因は不明）

これらの削除は常に実行されるため、Xcodeがビルドのために、それらのディレクトリやファイルを生成しても、即座に削除されてしまいます。

## 結果

そのため、この拡張機能が有効な状態では、Xcodeによるビルドが正常に行えません。

```
stat cache file '~/Library/Developer/Xcode/DerivedData/SDKStatCaches.noindex/iphonesimulator18.1-22B74-xxxxx.sdkstatcache' not found

```

## 対策

現時点での対処法としては、

- Xcode側で Library/Developer/Xcode/DerivedData のパスを変更する
- Dart Extensionを一時無効にする
- VCCodeを落とす

ということしかなさそうです。

### DerivedData のパスを変更する

Xcodeメニュー　→ Settings... → Locations → Derived Data を Relative に変更

## 弊害

そもそもこの対応を知らないと、ビルドができなくなって、何時間も時間を浪費してしまいます。
（私は原因が分からず、macを clean インストールして時間を浪費しました）
また、DerivedDataをRelativeに作成すると、プロジェクト内に巨大なサイズのデータが作成されてしまいます。
当然、 .gitignoreで除外していないといけません。
HP作成備忘録：地図付きアクセスページの作り方【HTML＋Googleマップ】をまとめてみた

## はじめに

Webサイトの「アクセス」ページに地図を表示することで、訪問者が場所を確認しやすくなります。

:::note info
**Googleマップから地図を埋め込むことで、インタラクティブな操作やナビ機能を利用できるようになります。**
:::

この記事では、ホンダ社労士事務所のWebサイトを例に、GoogleマップをHTMLに組み込む方法をご紹介します。

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

---

## Googleマップの埋め込みコードを取得する

1. Googleマップで表示したい場所（例：ホンダ社労士事務所）を検索します。
2. 左側の「共有」ボタンをクリック
3. 「地図を埋め込む」タブを選択
4. 表示された `<iframe>` タグをコピーします

---

## HTMLに埋め込む

取得したiframeコードを、HTMLファイルの「アクセス」セクション内に貼り付けます。

### 実際のコード例（ホンダ社労士事務所の地図）
```html
<section id="access">
  <h2>アクセス</h2>
  <p>
    〒xxx-xxx xxx<br>
    xxx。<br>
    駐車場あり（1台）／完全予約制
  </p>
  <div style="margin-top: 20px;">
    <iframe
      src="https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d3314.5616692989574!2d132.75333807570672!3d33.82362307324398!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x354fef14eeb74943%3A0xcdaca6bace23b645!2z44Ob44Oz44OA56S-5Lya5L-d6Zm65Yq05YuZ5aOr5LqL5YuZ5omA!5e0!3m2!1sja!2sjp!4v1742613774124!5m2!1sja!2sjp"
      width="100%"
      height="450"
      style="border:0; border-radius: 8px;"
      allowfullscreen=""
      loading="lazy"
      referrerpolicy="no-referrer-when-downgrade">
    </iframe>
  </div>
</section>
```

---

## 表示上の工夫とポイント

- `width="100%"` にしておくと、画面サイズに応じて自動で幅が調整されます（レスポンシブ対応）
- `border-radius: 8px;` を追加することで、角が少し丸くなり、柔らかい印象になります
- `height="450"` は好みに応じて調整可能（例：300〜600など）

---

## まとめ

- Googleマップは「共有 → 地図を埋め込む」からiframeコードを取得できる
- HTMLの任意の場所に貼り付けるだけで簡単に地図表示が可能
- 見た目やサイズはCSSで自由にカスタマイズ可能

訪問者にとっても「ここに行きやすい！」という印象を持ってもらえるため、事務所や店舗ページにはぜひ活用してみてください！