OmniAICreator/Qiita-1.07M huggingface dataset:
[VRChat] Modular Avatar で新しい衣装に交換

## ⭐️目的

- 新しい衣装を着せた改変をする





## ⭐️参考

### ☂️公式

https://modular-avatar.nadena.dev/ja/docs/intro




## ⭐️インストール

- https://modular-avatar.nadena.dev/ja/

![スクリーンショット 2025-05-16 14.43.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610706/f1d00bb8-748d-4f33-bb5f-ff5cc353008b.png)




## ⭐️使い方

### ☂️衣装をインポート

![スクリーンショット 2025-05-16 14.43.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610706/66a7db03-6818-4931-8eca-64677767437c.png)

- クリックしてインポート

![スクリーンショット 2025-05-16 14.44.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610706/0d9188af-4cd2-4537-8876-7bd4ce156f38.png)

- projectのassetsに入ってるので衣装のブランドフォルダからprefabまで移動

![スクリーンショット 2025-05-16 14.45.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610706/a2b2f172-0805-41f9-b39b-1cd7d206f91b.png)

- 使いたい服をプレハブから選択したらヒエラルキーのアバターのフォルダに入れる


### ☂️ここでインストールしたモジュールが真価をはっきすr

![スクリーンショット 2025-05-16 14.47.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610706/391f5b7a-1ebe-4bd7-8561-b6d2c5ad3654.png)

- ヒエラルキーの衣装のフォルダを右クリックして画像のsetup outfitを実行する
- Modular Avatarが自動的に衣装の中のアーマチュアを見つけ出して、Merge Armatureコンポーネントを追加する
Blenderで単純なオペレーターを実行させるパネルを作るスクリプト

Blenderのスクリプトを作っている時に
UIのパネルからオペレータを実行した場合に得られるcontextが単純にスクリプトを使った場合と異なるので
それを調べるための　単純なオペレータを実行させるスクリプト
（実行しているコンテキストということでAriaやその下のSpace関連の情報が少し違ってくる）

さほど難しくないだけに　何度か書き捨ててしまっているので
試しにGrockに生成させてみた

``` py
import bpy

# カスタムオペレーターの定義
class SimpleOperator(bpy.types.Operator):
    bl_idname = "object.simple_operator"  # 一意のID
    bl_label = "Simple Operator"          # ボタンに表示される名前
    bl_description = "A simple operator example"  # ツールチップ

    def execute(self, context):
        # ここでオペレーターの処理を記述
        self.report({'INFO'}, str(context.space_data.camera))
        return {'FINISHED'}

# 3Dビューポートにパネルを追加
class View3DPanel(bpy.types.Panel):
    bl_label = "Custom Panel"            # パネルのタイトル
    bl_idname = "VIEW3D_PT_custom_panel" # 一意のID
    bl_space_type = 'VIEW_3D'            # 3Dビューポートに表示
    bl_region_type = 'UI'                # UI領域（Nパネル）に表示
    bl_category = 'My Panel'             # パネルのタブ名

    def draw(self, context):
        layout = self.layout
        # ボタンを追加
        layout.operator("object.simple_operator", text="Run Simple Operator")

# 登録関数
def register():
    bpy.utils.register_class(SimpleOperator)
    bpy.utils.register_class(View3DPanel)

# 解除関数
def unregister():
    bpy.utils.unregister_class(View3DPanel)
    bpy.utils.unregister_class(SimpleOperator)

# スクリプトを直接実行する場合
if __name__ == "__main__":
    register()
``` 

この長さなので何が書いても変わりようがないけれど
適切にコメントが付くのは楽ですね
メモ程度に。
IISとTomcatを連携する手順・方法

## 概要
TomcatはApplicationサーバーの一種で、JavaのWebアプリケーションを動作させるのによく使う。単独で使用しても問題ないが、一般的にはWebサーバーと連携させて使用する。代表的なところではApacheと連携させることが多いが、何かの事情でWebサーバーにIISを使用する場合に、その連携手順をここにまとめる。

 ## 手順・方法
ここではIIS・Tomcatともにインストール済みでそれぞれは単独で動作していることを前提として進める。

### １．連携に必要なIISモジュールをセットアップする。
#### １．１．以下のURLにアクセスしてインストーラをダウンロードする。
https://www.iis.net/downloads/microsoft/application-request-routing

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15241/42b4f5c0-82cc-4362-a9b6-a4efb97a899e.png)

#### １．２．以下のURLにアクセスしてインストーラをダウンロードする。　
https://www.iis.net/downloads/microsoft/url-rewrite

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15241/70c525aa-a78e-4090-800b-558ae7a44f84.png)

#### １．３．「requestRouter_amd64.msi」をインストールする。
　インストーラをダブルクリックして進めるだけでインストールが可能。再起動も不要。

#### １．４．「rewrite_amd64_ja-JP.msi」をインストールする。
　インストーラをダブルクリックして進めるだけでインストールが可能。再起動も不要。

### ２．IISマネージャーを開き、「Application Request Routing Cache」をダブルクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15241/ffa5a4ce-b497-4a35-9003-4d596e6fee86.png)

### ３．「Server Proxy Settings」をダブルクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15241/4edf4202-9f29-45ef-a3c2-9fb1d2d2568a.png)

### ４．「Enable proxy」にチェックを入れて、「適用」をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15241/e4b7baff-75e7-451a-acd1-e5f93106f354.png)

### ５．C:\inetpub\wwwrootに、TomcatにデプロイしているWebアプリケーションと同じ名前のフォルダを作成する。
　ここでは例として「ext」とする。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15241/6aa68e31-0e8d-4484-9fcb-2be2e009ceaf.png)


### ６．IISマネージャーで、画面左の「フォルダ」を選択した状態で、「URL書き換え」をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15241/93354d7f-d43f-4edc-8b04-bd06b83f25ca.png)


### ７．「空の規則」をダブルクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15241/7ef9d87f-8ce5-47dd-b2d8-3fc7dbe85f04.png)

### ８．以下のように指定して、「適用」をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15241/60569162-3b2a-46c0-87f3-c73ed16473d4.png)
　「パターン」のところを「(.*)」にする、
 　「URLの書き換え」のところを「TomcatのURL/{R:1}」にするのがポイント。

### ８．設定は以上となるので、あとはクライアントPCからアクセスして確認する。
　これまではhttp://ホスト名:8080/ext/・・・ でアクセスしていたところを、
　http://ホスト名/ext/・・・ でアクセスできるようになる。
　この方法だと、IISに証明書設定をすればhttpsでアクセスできるようにもなる。
PowerVSにIBM i 7.6環境を作ってみました

# はじめに
IBM i 7.6が4/8に発表、4/18に出荷となりましたね！そこで早速検証用としてPowerVSにIBM i 7.6環境を作ってみました。

なおIBM i 7.6の発表レターはこちらです。OS標準でMFA (多要素認証) が実装されるなど多くの機能拡張が図られているようです。
[IBM i 7.6発表レター](https://www.ibm.com/docs/ja/announcements/i-76-release)

# PowerVSでのIBM i 7.6ストック・イメージ
PowerVSでVMを作成しようとすると、2025/5/16時点では、IBM i 7.6のストック・イメージは残念ながらまだ提供されていないようでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1305251/b3924a43-c361-4742-bd39-32bed597489c.png)

ということで、検証なのでネットワーク・インストール機能を使って導入メディアから作りました。

# CORサーバーを使用したネットワーク・インストール機能でのIBM i 7.6 VMの作成
PowerVSでのCORサーバーを使用したIBM i ネットワーク・インストール機能の活用は@6onodaさんがとても詳しい記事にまとめてくださっているので、そちらを参照させていただきました。
[PowerVS IBM i 日記(69): CORの利用(1) - COR サーバーを構成してライセンスプログラムを導入する](https://qiita.com/6onoda/items/35eaf065fdbcd2c7b2d9)
[PowerVS IBM i 日記(70): CORの利用(2) - COR サーバーから 2 次言語を導入する](https://qiita.com/6onoda/items/c401d2608175b4dd0ab7)
[PowerVS IBM i 日記(71): CORの利用(3) - COR サーバーを使って 1 次言語を 2962 日本語に変更する](https://qiita.com/6onoda/items/07de8f49b81d45d3c227)
[PowerVS IBM i 日記(72): CORの利用(4) - COR サーバーを使って IBM i をバージョンアップする](https://qiita.com/6onoda/items/71a0cc7b23a1eda6cfb6)

なお、今回実施した手順としては、
1. [IBM ESSのサイト](https://www.ibm.com/servers/eserver/ess/landing/landing-page) からIBM i 7.6の評価版導入メディアをダウンロード
1. CORサーバーにダウンロードした導入メディアを配置
1. Power10マシンにIBM i 7.5のVMをデプロイ、そのVMをIBM i 7.6にリリース・アップ
という感じです。

# PowerVSでのIBM i 7.6 VM
上記手順で問題なくIBM i 7.5からIBM i 7.6にリリース・アップすることができました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1305251/4b52f7f4-0ff2-4c1d-9e92-04cf766c78fb.png)

見てみますとキーが自動登録されました。
PowerVSでは定期的に各VMに対してライセンス・キーの自動注入処理が投入されるのですが、既にIBM i 7.6のライセンス・キーも注入されるようになっているようですね！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1305251/fd7ada78-eaee-4950-a417-e3d1461a6470.png)

簡単に検証環境ができるのはPowerVSならではと思います。
これでIBM i 7.6の検証環境ができましたので、いろいろ試して記事にしていきたいと思います。
コーディングだけじゃない。ブログやドキュメント、技術書の執筆でもCodeRabbitを！

[CodeRabbit](https://www.coderabbit.ai/ja)は、AIコードレビューサービスです。GitHubやGitLabと連携し、プルリクエストに対して自動的にレビューを実行します。開発者はCodeRabbitからの指摘を確認して修正を行い（修正をCodeRabbitにやってもらうこともできます）、追加でコミットします。

先日、[CodeRabbit for VSCode](https://marketplace.visualstudio.com/items?itemName=CodeRabbit.coderabbit-vscode)がリリースされました。これにより、ローカルエディタ上でのレビューが可能になりました（しかも無料です）。これまでのCodeRabbitは、GitHubなどでのPRに対してレビューを行う形でした。それに対して、CodeRabbit for VSCodeはローカルで動作します。そして、コミットやブランチに対してレビューを行えるのが特徴になります。

今回は、このCodeRabbit for VSCodeを使って、コーディング以外のレビューに利用してみました。

## 利用環境について

CodeRabbit for VSCodeは、VSCodeはもちろん、CursorやWindsurf、その他すべてのVSCodeフォークでも動作します。

## CodeRabbit for VSCodeのインストール

まずは、VSCodeの拡張機能からCodeRabbitをインストールします。インストール後、CodeRabbitにログインします。VSCodeの拡張機能は、以下のリンクからインストールできます。

[![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/2299d159-c66e-4edd-b89a-f9a4e7e041c7.png)](https://marketplace.visualstudio.com/items?itemName=CodeRabbit.coderabbit-vscode)


[CodeRabbit \- Visual Studio Marketplace](https://marketplace.visualstudio.com/items?itemName=CodeRabbit.coderabbit-vscode)

無料で利用可能ですが、CodeRabbitのアカウントが必要です。アカウントは、[こちら](https://www.coderabbit.ai/ja)から作成できます。

## アカウントの接続

CodeRabbit for VSCodeをインストールしたら、アカウントを接続します。VSCodeの拡張機能から、CodeRabbitを選択し、アカウントを接続します。接続だけしたら、後は自由に文章を書いていきます。

![スクリーンショット 2025-05-16 14.14.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/a6bb3e3d-4c36-4155-8922-9f64b9ca716d.png)

## 注意点

- CodeRabbitは、Gitリポジトリでないと使えません
- CodeRabbitは、GitHubやGitLab、Bitbucketなどのリモートリポジトリの設定がないと使えません

## 文章を書く

後は文章を書いていきます。たとえばブログの下書きやプロジェクトのドキュメント、技術書などがあるでしょうか。保存し、コミットしたタイミングでレビューを行うか確認が出ます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/e4437346-ed94-4fc9-a89f-1b3652232471.png)

Yesを選択すると、レビューが実行されます。だいたい2〜3分程度かかります。ステータスも表示されるので、お待ちください。

![スクリーンショット 2025-05-16 14.09.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/9f415461-2fd4-4c80-b258-f39c395889b6.png)

レビューが終わると、指摘事項が表示されます。日本語の記事であれば、指摘も日本語で返ってくるようです。

文章の場合、1クリック修正が出ない場合もありますが、Markdown記法に関連したものであれば修正提案をしてくれるので、Approveすれば修正が反映されます。

![スクリーンショット 2025-05-16 14.10.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/d8159e83-1efa-4223-b7f6-afc1b4a78c57.png)

## まとめ

CodeRabbit for VSCodeは、コーディングだけでなく、ブログやドキュメント、技術書の執筆でも利用できます。タイポの発見や、可読性の低い部分の指摘など、編集者的な立ち位置で指摘してくれるのは便利です。

皆さんの執筆活動に、ぜひ🐰を役立ててください。

[AI Code Reviews \| CodeRabbit \| Try for Free](https://www.coderabbit.ai/ja)
【ざっくり解説】コンストラクタ


# はじめに
プログラムを始めてコンストラクタという言葉を知った初学者の方向けにその基本的な役割や使い方をざっくり解説する記事です。


# コンストラクタとは
コンストラクタとはオブジェクト指向プログラミング言語の多くで使われる初期化用の特別な関数です

クラスを定義し、そのインスタンスを作成した場合メンバ変数を適切に初期化できていないとロジックエラーが発生してしまいます。

その対策として初期化専用の関数をつくっても、それを実行し忘れたら元も子もない、、
そういった経緯からコンストラクタはインスタンスが宣言されたタイミングで**自動的**に実行されます。


コンストラクタはクラス名と同じ関数であり、返り値は存在しませんが、引数を持つことができます。
そのためインスタンスを作成した際に任意の初期値を与えることもできます。
以下はコンストラクタに引数を用いない場合と用いた場合の、初期値の設定例です。

# 使用方法

引数を用いない場合
```cpp
class Dog {
public:
    int walkspeed = 0;
    std::string name = "名無し";
    //引数なしコンストラクタ
    Dog() {                    
        walkspeed = 10;
        name = "ぽち";
    }
};

void sample(){
    Dog shiba_dog;                              //コンストラクタ実行
    std::cout << shiba_dog.name << std::endl;   //出力：ぽち
}
```

引数を用いる場合
```cpp
class Dog {
public:
    int walkspeed = 0;
    std::string name = "名無し";
    //引数ありコンストラクタ
    Dog(int _walkspeed, std::string _name) {
        walkspeed = _walkspeed;
        name = _name;
    }
};

void sample(){
    Dog shiba_dog(9,"ぽち");                      //引数ありコンストラクタ実行
    std::cout << shiba_dog.name << std::endl;    //出力：ぽち
}
```

コンストラクタに引数を用いるとインスタンスごとに異なる値で初期化ができます。

# デストラクタ
コンストラクタが生成された時に自動的に実行されるのに対して、デストラクタはインスタンスが消滅する時に自動的に実行されます。
ここにはメモリの解放等の後始末処理を書きます。
デストラクタの関数名はクラス名の先頭に~をつけたものになります。また、コンストラクタと違ってデストラクタには引数を持たせることができません。

```cpp
class Dog {
public:
    int walkspeed;
    std::string name;

    //コンストラクタ
    Dog(int _walkspeed, std::string _name) {
        walkspeed = _walkspeed;
        name = _name;
    }

    //デストラクタ
    ~Dog() {
    std::cout << "オブジェクトが削除されました。" << std::endl;
    }
};

void sample(){
    Dog shiba_dog(9,"ぽち");    
    std::cout << shiba_dog.name << std::endl;    //出力：ぽち
}//ここでデストラクタ実行　　　　　　　　　　　　　　　　 //出力：オブジェクトが削除されました。
```

# 終わりに
コンストラクタについてざっくり理解していただけたでしょうか？
自分への備忘録も兼ねて投稿してみました、初執筆なので至らない箇所もあると思いますが、修正点等があればコメントでご指摘頂けたら幸いです！
CSSカスケード ~スタイル適用の優先順位~

## はじめに

CSSでスタイルが競合することがある。たとえば単純な例だが、 `<span class="title">`というタグがあって下のようなルールが合った場合。
```css
#cover {
  margin: 1rem;
}

span {
  font-size: 12px;
}

.title {
  color: red;
}

span.title {
  font-size: 24px;
}
```
この場合、フォントサイズが競合している。このような競合を解決するためにルールがどのようになっているのか。興味が湧いたので調査した。

### MDNのドキュメント

- https://developer.mozilla.org/ja/docs/Web/CSS/CSS_cascade/Cascade
- https://developer.mozilla.org/ja/docs/Learn_web_development/Core/Styling_basics/Cascade_layers

ドキュメント化されているが、調べてみると意外と分かりづらかったため理解を深めるべくまとめた。

今回は大枠の部分を記載し、詳細は別途記事として投稿する。

## CSSにおけるカスケードとは？

CSSで複数のスタイルが競合した時に、どのスタイルが最終的に適用されるかを決める仕組みのこと。冒頭に挙げた例のようにフォントサイズが競合している場合、最終的にどのフォントサイズが適用されるのか。これを決めるルールが明確に決まっている。

CSSの適用アルゴリズムは「フィルタリング」「優先順位の比較」の順番で行われるため、その順番に沿って記載する。

## フィルタリング

### オリジン

CSSの出どころは大きく分けて次の3通り。

1. ブラウザ標準スタイル
	- 各ブラウザに内蔵されているデフォルトのスタイル
2. ユーザースタイル
	- ブラウザの機能や拡張機能でユーザーが独自のCSS設定を追加することができる
3. 開発者スタイル
	- 開発者が書いたCSS

### 関連性

スタイルを適用する際、まずはフィルタリングから行われる。オリジンからすべてのルールをピックアップし、該当の要素に適用されないルールは除外される。

冒頭に挙げた単純な例を再度見る。
`<span class="title">`というタグがあって下のようなルールが合った場合。
```css
#cover { /* 除外 */
  margin: 1rem;
}

span { /* 適用候補 */
  font-size: 12px;
}

.title { /* 適用候補 */
  color: red;
}

span.title { /* 適用候補 */
  font-size: 24px;
}
```
この場合、`#cover`は適用外となりその他のルールは適用候補となる。

これら候補のなかで最終的に適用されるのはどれか。次の優先順位によって決まる。

## 優先順位

次の1から5があり、優劣が決まるまで順番に比較する。

### 1. オリジンと重要度

優先順位が高い → 低い順に。
- CSS トランジション
- ブラウザ標準スタイル (!important) 
- ユーザースタイル (!important) 
- 開発者スタイル (!important) 
- キーフレームアニメーション 
- 開発者スタイル（通常）
- ユーザースタイル（通常）
- ブラウザ標準スタイル（通常）

「通常」と書いたものは`!important`と付かないスタイルのこと。直感通りではあるが`!important`と付いている方が優先順位が高い。


:::message
注意1. CSSトランジッションは`!important`よりも優先順位が高い。 
:::

:::message
注意2. `!important`と通常時で、ブラウザ標準スタイル、ユーザースタイル、開発者スタイルの順番が逆転している点に注意。
:::

### 2. カスケードレイヤー

カスケードレイヤーとはCSSのスタイル適用順序をより細かく制御するために導入された、比較的新しいしくみ。

CSS内に`@layer`を書くことでレイヤーを定義できるが、このレイヤーを見ることで優先順位を決める。

### 3. 詳細度

詳細度はCSSに記述されたセレクタによって決まる。
詳細度は「A-B-C」という3つの数値で表され、それぞれ以下のような意味がある。

- A: IDセレクタ( `#id` )の数
- B: クラス（`.class`）、属性（`[attr]`）、疑似クラス（`:hover`など）の数
- C: 要素型（`div`など）と疑似要素（`::before`など）の数

この「A-B-C」によって優先順位を決める。

#### インラインスタイル

インラインスタイルは詳細度のルールに含まれるが、カスケードレイヤーとセットで考えないといけないの注意。

### 4. スコープ近接性

CSS内に`@scope`を書くことでスコープを定義することができる。
このスコープにおける近さを比較することで優先順位を決める。

### 5. 記述順

ここまで比較して優先順位が同じであれば、もっとも後に書いたスタイルが適用される。

次回の記事から「カスケードレイヤー」「詳細度」「スコープ近接性」について記述する。
再帰処理(その2)

# 前回のつづき
前回は my-map 手続きを使って Scheme の手続きの基本的な書き方を紹介しました。
今回はどんな時に再帰処理が便利なのかを説明していきますが、その前にもう少しだけ手続きの書き方について慣れておきましょう。

# リストで与えられた数列を合計する
今回は数字の要素を持つリストを引数に受け取って、その要素をぜんぶ合計した値を返す手続き sum を考えます。
つまり
```
gosh> (sum '(1 2 3))
6
```
このような動作をする手続き sum を作ってみます。
考え方は my-map と同じです。
```
(define (sum items)
  (if (null? items)
      ??
      (+ (car items)
         (sum (cdr items)))))
```
lst が空リストの場合は、まだよくわからないので ?? としてあります。

プログラムを書く場合に、「よくわからない部分」を「よくわからないまま」にして、他の部分を先に書くのはとても良いことです。わからない部分で立ち止まってしまうより、わからない部分は一旦置いて先に進んでみることのほうが大切です。立ち止まらずにとりあえず先に進んでみると、今まで見えなかった事に気づいたりします。

他方、空リストでない場合は簡単です。my-map 手続きの時と同じように、
```
・car を使って先頭の要素を取り出す
・cdr を使って sum 手続きに先頭の要素以外を引数にして評価する（再帰呼び出し)
・上記２つを + 手続きで足し算する
```
とすれば良いでしょう。

残った ?? の部分を考えてみます。
1 つ目の考え方としては、sum 手続きに空リストを渡したときにどんな値を返せば良いか考えてみるとすぐにわかります。
```
gosh> (sum '())
0
```
空リストが与えられた場合は、足し算する数は何もないので 0 を返せば良さそうです。

2 つ目の考え方としては、sum 手続きがどのような式に置き換えられるかを考える方法です。
sum 手続きの定義から次のような式に置き換えられることがわかるでしょうか？
```
(sum '(1 2 3)) ===> (+ 1 (sum '(2 3)))
(sum '(2 3))   ===> (+ 2 (sum '(3)))
(sum '(3))     ===> (+ 3 (sum '()))
```
リストを何度も cdr していくと、やがて空リスト「'()」が現れますから、sum 手続きの引数に空リストが渡されます。空リストの場合は 0 を返せば良さそうです。
```
(sum '())      ===> 0
```
どんな数に 0 を加えても、値は変化しません。
```math
x + 0 = x
```
以上の式をまとめて書くと
```
(sum '(1 2 3)) ===> (+ 1 (+ 2 (+ 3 0)))
```
こうなることがわかります。
わからなかった ?? の部分は 0 にするのが正解です。
```
(define (sum items)
  (if (null? items)
      0
      (+ (car items)
         (sum (cdr items)))))
```
sum 手続きで合計を求めてみます。
```
gosh> (sum '(1 2 3 4 5))
15
```
このように正しく合計を求めることができました。

# リストで与えられた数列の積を求める
では掛け算する場合はどうすれば良いでしょうか？
```
(define (product items)
  (if (null? items)
      ??
      (* (car items)
         (product (cdr items)))))
```
＋ 手続きを ＊ 手続きに変えれば簡単です！
と言いたいところですが、ここで１つ困った問題が発生します。

product 手続きは最終的に次のように式に変換されるので、
```
(product '(1 2 3)) ===> (* 1 (* 2 (* 3 ??)))
```
リストの最後に現れる空リストは 1 にすればよさそうです。?? を 1 に修正しました
どんな数に 1 を掛けても値は変化しません。
```math
x \times 1 = x
```
```
(define (product items)
  (if (null? items)
      1
      (* (car items)
         (product (cdr items)))))
```
実行してみます。
```
gosh> (product '(1 2 3 4 5))
120
```
結果はあっています。ですが、product 手続きに空リストを与えたらどうなるでしょうか。
```
gosh> (product '())
1
```
返却値が 1 になってしまいました。空リストの場合は、掛け算する数が無いわけなので 0 を返したほうが良いでしょう。1 を返してしまうのはおかしいです。

これを解決するにはどうすればよいでしょうか？

product 手続きに単に空リストが与えられた場合は 0 にしなければいけませんが、普通に要素があるリストが与えられた場合については、リストの最後に現れる空リストの値は 0 ではなく 1 にしたいわけです。空リストの値を  0 にしたい場合と、1 にしたい場合があって、この違いが問題です。手続きを修正してこれに対応しなければなりません。

次のように product 手続きを書き直します。
```
(define (product items)
  (define (iter l)
    (if (null? l)
        1
        (* (car l)
           (iter (cdr l)))))
  (if (null? items)
      0
      (iter items)))
```
いままでの product 手続きを、iter 手続き（名前は product 以外なら何でもいいです) にそのまま移して、prodect 手続きは、items のチェックを行い、空リストなら 0 を返し、空リストでないなら iter 手続きに items を渡して評価します。

また、この iter 手続きを「内部手続き」と言います。iter 手続きは product 手続き内でのみ使用できる手続きで、他の手続きから隠されます。具体的に言えば sum 手続きからは見えませんし、呼び出すこともできません。つまり、
```
・他の手続きと名前が衝突しないかな？
・手続きを修正すると他の手続きに影響がでないかな？バグになったりしないかな？
```
などの心配をする必要が無くなります。

最後に、修正した product 手続きを実行してみます。
```
gosh> (product '(1 2 3 4 5))
120
gosh> (product '())
0
```
これならば問題ないでしょう。

# まとめ
今回は、Scheme の手続きの書き方についてさらに深堀りしました。次回は、いよいよ再帰処理がどんな場面で役に立つのかについて説明したいと思います。

つづく！（たぶん）
文章要約AIライブラリ　手順


### いるもん

```php:
pip install transformers torch
```

```php:
from transformers import pipeline

summarizer = pipeline("summarization", model="モデル名")
result = summarizer("要約したい長文", max_length=60, min_length=20)
print(result[0]['summary_text'])
```


```php:
モデル選ぶ作業　発生

「モデル "要約" 選ぶ」
rinna/japanese-gpt-1b
cl-tohoku/bert-base-japanese
```

https://huggingface.co/tasks/summarization

https://huggingface.co/docs/transformers/en/tasks/summarization

https://huggingface.co
【ChatGPT】Code Interpreterを使うならば、GPT-4.1を使いましょう。


　どうも、カーブミラーです。

　今回は、Code Interpreterを使うならば、GPT-4.1を使いましょう、という話です。

:::note info
本記事は、ChatGPT（Plus版）
で行なっております。
画像はあります。　あしからず。
:::
　ChatGPT等の動作状況を知らせる
　　OpenAIのステータスページ。
　　　[OpenAIステータス](https://status.openai.com/)
***
　こちらも載せますね。
　　[ChatGPTが使えない？ログインできない・反応しない原因やエラー時の対処法を解説](https://aismiley.co.jp/ai_news/chatgpt-error-resolution-explanation/)
***
　著作権法については
　　こちらを参照するのが
　　　良いのではないかと。

　文化庁レポートをもとにした
　　著作権法についての動画（約20分）
　　　[かいちのAI大学　【警告】ChatGPTの画像生成は危険です...【4o Image Generation】](https://youtu.be/8VLUnG-iyo0?si=rAfjMboqmNqppDGq)
***
　では、さっそく【本題】です。

　今回は、
　　昨日に引き続き、
　　　GPT-4.1についてです。

　昨日（2025/05/15）の記事はこちら。
　　[【ChatGPT】に新しいモデルGPT-4.1が登場したので、使ってみた。](https://qiita.com/kabumira/items/45a6a5dbccd8bba6c441)

　昨日は
　　ファーストインプレッションでの
　　　感想でした。

　あれからも
　　続けて触っています。

　今回は、
　　Code Interpreterを
　　　試してみた結果です。

　結論としては、
　　**Code Interpreterを使うならば、
　　　GPT-4.1を使いましょう**、
　　　　という意見になります。

　理由は、
　　速度に加えて、
　　　その安定性です。

　GPT-4oでは、
　　うまくいったり
　　　いかなかったり、
　　　　という感じでした。

　それを込みで
　　処理をさせていました。

　でも
　　GPT-4.1は、
　　　安定しています。

　今回試したのは、
　　自作の小説のエピソードごとの
　　　文字数のカウントです。

　出力された表がこちら。
![Screenshot_20250516-132431.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/66d9d746-aae7-4ae9-a474-139bd1f07fc1.png)


　試した回数は、何度かですが、
　　すべて同じ結果でした。
***
　ほかにも
　　簡単な図形を描かせたりも
　　　しました。

　その速さは、
　　拍子抜けするものでした。

　みなさんの
　　作品制作の糧に
　　　なれば、幸いです。

　今回は、ここまで。
***
　PS.
　　日本時間で
　　　土曜日の午前0時から
　　　　YouTubeで、
　　　　　OpenAIの開発者向けライブが
　　　　　　予定されています。

　　太平洋時間の
　　　金曜日のAM 8時で
　　　　サマータイムがあるから
　　　　　この時刻になりますね。

　　[OpenAI公式ポスト](https://x.com/OpenAI/status/1923212267677499469?t=MxHN2e0Zx8pXnlSEFLLP1A&s=19)

　　でも、OpenAI公式から
　　　ポストされてるってことは
　　　　ChatGPT自体にも
　　　　　関係あり？
1日6時間以上ChatGPTを使う社内SEが、GPTに仕様書を書かせるAI対話術

ChatGPTを「調べ物のツール」として使っている人は多いと思います。  
でも、僕はChatGPTをそうは見ていません。

僕にとってChatGPTは、**仕様設計やテスト定義を一緒にこなす“チームの一員”** です。

要件定義書の作成、分岐条件の精査、制御条件のチェック、テストシナリオの作成……。  それらを人間ひとりで整理しようとすると、思考が詰まりがちです。

そこで僕は、**ChatGPTを6時間／日くらい使って、業務設計の思考工程そのものを“分業”しています。**

## ChatGPTは“思考労働の外注先”として使う

ChatGPTを質問に答えるだけのツールとしてではなく  
プロンプトの出し方次第で、**業務仕様や設計の草案を自動生成し、整合性までチェックしてくれる「設計メンバー」** になります。

でも、それは「雑に聞いてもちゃんと返ってくる」という話ではありません。  
むしろ逆で、**“ちゃんと仕事を振る”** ことが必要になります。

---

## 「業務を振る」ためのプロンプト設計のコツ

僕がChatGPTに仕様設計を頼むとき、こんなふうに投げています：

    以下の前提条件に基づいて、UATの正常系テストシナリオをTSV形式で出力してください。

    【前提】
    - 商談詳細画面 > タスク管理タブにおける操作
    - チェック対象項目：進捗状況、予定日、担当者
    - Flow：タスク完了時に承認フローへ遷移
    - バリデーション：予定日が過去日の場合はエラー

    【制約】
    - 各ステップは「1操作＝1行」で記述すること
    - チェックONとOFFは別ステップとして明記
    - スケジュール入力とタスクON/OFFは分離
    - 出典や備考欄にソース名は含めないこと
    - 末尾に「テスト結果」「異常理由」列（空欄）を追加

    出力形式：TSV（タブ区切り）／Excel貼付け可能形式

重要なのは、「やってほしいこと」だけでなく、「守ってほしいこと」まで書くこと。  
これはもはや“プロンプト”というより、“業務依頼書”です。

---

## なぜここまで細かく書くのか？

ChatGPTは“人間的な曖昧さ”には意外と弱いです。  
とくに、テスト設計や仕様書のような構造化されたアウトプットを求める場合、**出力形式・粒度・順序**を明示してあげる必要があります。

例えば、こういう曖昧さはNGです：

- 「この操作をテストしてください」→ 何行で？どの粒度で？
- 「ON/OFFを切り替えて」→ 同一ステップ？別ステップ？
- 「正しく動作すること」→ 何をもって“正しい”とする？

逆に、**出力条件を“コード化”するように指定すれば、GPTは極めて論理的に応えてくれます。**

僕はこのスタイルを「プロンプト＝業務命令書」と呼んでいます。

---

## プロンプト幻想からの脱却：「ちゃんと書けば答えてくれる」はもう古い

昔は「プロンプト職人になるのが最強」みたいな空気がありました。  
でも、GPT-4oになってからは、**プロンプトを“構文”として書く必要すらなくなってきている**と感じます。

最近の僕は、基本的には**チャットの口調で自然に投げる**ことが多いです。  
むしろ“構文っぽい指示”を書いてしまうと、GPTがそれを説明し返してきたりしてテンポが悪くなることすらある。

たとえば、こういう感じ：

    このフローって、S05の時と同じ分岐条件ですよね？
    ただ、今回は承認対象が別だから、UIとバリデーション側だけ変わってると思ってます。
    この理解で正しければ、UATの正常系定義をその前提で再設計してもらえますか？

このレベルの自然言語で通る。  
むしろそのほうがGPTの「ノイズ除去能力」や「指示文脈の保持力」が活きます。

ですがさっきみたいに何かを定義するとき(要求条件をまとめてあるとき)とかは依然としてプロンプト形式のほうがGPTの理解がいいですね。

---

## データはなるだけ渡したほうがいい：自由に考えさせたいなら材料を与えるべき

「GPTに自由に発想してもらいたい」と思ったとき、**データがないと自由ではなくなる**んですよね。

むしろ何も与えないと、GPTは「それっぽいけど薄い」ものを生成しがちになります。  
なので僕は、**自由なタスクほどデータソースを渡す**ようにしています。

たとえば、Salesforceのオブジェクト構成をベースに受入テスト仕様を作るときは：

- オブジェクト名・項目名・役割が一覧化された定義書  
- サンプルのMashmatrix画面構成（画像スクショ）  
- 正常系シナリオ(テキスト)

これを全部投げておくことで、GPT側の“認識のベースライン”が整い、**解像度が高くブレにくい設計出力**が返ってくるようになります。

---

## スレッドとメモリは“破綻したらリセット”が基本

ChatGPTと長くやり取りしていると、**急にハルシネーションが出てくる**ことがあります。

- なんか変な用語を使い出した  
- 条件を勝手に書き換え始めた  
- 途中までのルールを無視するようになった

こうなったら、潔く**スレッドを新しく立て直す**のが鉄則です。

### メモリが壊れてるケースもある

「スレッドだけじゃなく、GPTの“記憶そのもの”がズレてきてる」ってケースもあります。  
これは僕自身何度も経験しました。

そういうときは、[設定] → [パーソナライズ] → [メモリ] から中身を確認して、**間違って記憶された“思い込み”を削除**します。

（例：プロンプトでうっかり誤ったルールを書いてしまったときとか仕様変更があったときに、古いメモリが参照されてしまうことがちょいちょいあります）

---

## ChatGPTとの設計は「コラボ」ではなく「運用」になっていく

ここまでくると、ChatGPTとの関係性は「壁打ち」や「アシスタント」ではなくなります。  
むしろ、**ルールを守らせて、誤解を防ぎ、定期的に環境を整備する“運用対象”** になってきます。

でも、逆に言えばそれだけ**設計・実装・レビューの工程をAIに任せられる時代が来た**ということでもあります。

抽象課題の構造化や、ロジックの文章化などを得意とするGPTの良さを生かして、仕事効率上げていきましょう
SalesforceのエージェントアクションをAPEXで実装したらめっちゃ楽だった

SalesforceのAgentforceは、基本的にSalesforceのオブジェクトに関連するデータの取得をサポートしていますが、特定の返答を得るためにはカスタムアクションの実装が必要です。一般的にカスタムアクションはフローで実装することが多いですが、APEXを使ってプロンプトを作成するとすごく楽でした！

# フローとAPEXの比較
Agentforceを使用する際、フローとAPEXの両方でカスタムアクションを実装することができますが、実際の利用シーンに応じて適切な選択をすることが重要です。

### フローの利点:
- 直感的なビジュアルプログラミングで、複雑なロジックを理解しやすい。
- シンプルなデータ処理や基本的なロジックに適している。

### APEXの利点:
- テキストデータの処理や高度なビジネスロジックを迅速に実装できる。
- データベース操作や複雑なクエリを効率的に処理できる。

## APEXに向いている処理、フローが向いている処理
### APEXは特に以下のような処理に向いています：
- 大規模なデータ集計や処理
- 複雑な条件分岐やデータベース操作
- 外部APIとの統合や高度なテキスト処理

### 一方、フローは次のようなシンプルなプロセスや基本的なロジックに向いています：

- ビジュアルでのプログラム設計が要求される場合
- 単純なデータ変換や自動化プロセス


## APEXでの実装
今回は営業別の活動数を集計しました。フローより直接SOQLが使えるAPEXのほうが向いていました。また最近の生成AIの加速によりローコードよりコードのほうが生産性が高くなってきている気がします。

ヘルプは[こちら](https://help.salesforce.com/s/articleView?id=ai.prompt_builder_add_apex_flex.htm&type=5)

```apex
public with sharing class SalesActivityCount {

    public class Request {
        
        @InvocableVariable
        public Opportunity opportunity;
    }
    
    public class Response {
        @InvocableVariable
        public String Prompt;

        public Response(String prompt) {
            this.Prompt = prompt;
        }
    }

    @InvocableMethod
    public static List<Response> getEventCounts(List<Request> reqs) {
        List<AggregateResult> ars = [
            SELECT OwnerId , Owner.name na , COUNT(Id) cnt
            FROM   Event 
            WHERE  IsDeleted = false
            GROUP  BY OwnerId,Owner.name
        ];

        String body = '';
        for (AggregateResult ar : ars) {
            body += '\n' + ((Id)ar.get('OwnerId'))
                + ' : ' + ar.get('na') + ' san '
                  + ' : ' + ar.get('cnt') + ' 件';
        }

        Response r = new Response(body);
        return new List<Response>{ r };
    }
}
```
このAPEXクラスは、Eventオブジェクトから営業担当者ごとの活動件数を取得し、Agentforceにテキストデータとして返します。フローと比較して、このような高度な集計処理を実現する際には、APEXがより効率的である場合があります。

### エージェントアクション登録
作成したAPEXはエージェントアクションとして追加することができます。
こちらは直接Agentforceから実行できるアクションとして登録しました。
![スクリーンショット 2025-05-16 13.23.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260655/b65999a4-8600-4509-8cf2-c5dc4b6124e4.png)

また、APEXの結果を元に生成AIを使って処理したい場合はプロンプトテンプレートに埋め込むこともできます。（こちらのほうが使い勝手いいかも）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260655/a82b5d46-cdde-4d6b-bd4d-51bd12931da5.png)

余談ですが、APEXの実行は、システム権限です。
規定では実行ユーザーに関係なくシステムアクセスできるデータにアクセス可能になります。
セキュリティ担保のために[With Sharing](https://developer.salesforce.com/docs/atlas.ja-jp.252.0.apexcode.meta/apexcode/apex_classes_keywords_sharing.htm)の実装などをご検討ください。

## まとめ
SalesforceのAgentforceを使用したカスタムアクションの実装において、ローコードであるフローをファーストチョイスにしがちですが、プロンプトへのテキストを作成する場合はAPEXで記載したほうが目的を速く達成できるケースもあります。テキスト処理など柔軟に扱えますし、必要な情報をSOQLで直接取得できるので作業効率は高いです。
PWA reactプロジェクト立ち上げ

　
### プロジェクト立ち上げ＆プラグインインストール

作りたいフォルダで下記コマンドでプロジェクト立ち上げ＆プラグインインストール

```terminal
npm create vite@latest プロジェクト名 -- --template react
cd プロジェクト名
npm install
npm install vite-plugin-pwa --save-dev
```
 　
  
プロジェクト直下にvite.config.jsが作られているはずなので中身を以下に変えて保存する
```jsx
import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react';
import { VitePWA } from 'vite-plugin-pwa';

export default defineConfig({
  server: {
    host: true  // ← これがないと外部からアクセスできない！
  },
  plugins: [
    react(),
    VitePWA({
      registerType: 'autoUpdate',
      includeAssets: ['favicon.svg'],
      manifest: {
        name: 'My PWA App',
        short_name: 'PWA App',
        start_url: '/',
        display: 'standalone',
        background_color: '#ffffff',
        theme_color: '#317EFB',
        icons: [
          {
            src: 'pwa-icon-192.png',
            sizes: '192x192',
            type: 'image/png'
          },
          {
            src: 'pwa-icon-512.png',
            sizes: '512x512',
            type: 'image/png'
          }
        ]
      }
    })
  ]
});
```

### 仮想サーバー立上げ＆iPhoneからPWA実感
```
npm run build
npm run preview
```

npm run previewでPWAを実装するための仮想サーバーが立ち上がる。
画像のようなURLが出ていればOK
　
![スクリーンショット 2025-05-16 13.17.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3832683/3a5767bd-c042-4769-8f6f-3a0f0cb86139.png)

Networkに書かれたURLをiPhoneのSafariなどで検索すると
アプリで内容を確認できる。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3832683/74fb3eea-9ca5-4bd7-882a-8100587f9423.jpeg" width="200">
)

あとはホーム画面に出す手順
１、共有（下のタブの真ん中）
２、ホーム画面に追加

でPWA完了

### もしIPアドレスがわからなかったら
```
ipconfig getifaddr en0
```
IPが出るので
http://IPアドレス/4173
でiPhoneからアクセスする。

4173の部分は仮想サーバー立ち上げ時に出ているので違う場合はかえる。
元ヤフーエンジニア社長がオススメする、人生に影響を受けた本4選  〜「成長したいすべての人」に向けて〜

こんにちは、元Yahooエンジニアで、現在は株式会社PRUMの代表をしている岩本です。  
[PRUM公式サイト](https://prum.jp/)  

日々たくさんの人と出会い、仕事や人生について話をする中でよく聞かれるのが、「成長するためにどんなことを意識していますか？」という質問。

実践や経験の中で学ぶことが多いですが、僕の価値観や行動の軸を作ってくれた一つとして「本」の存在が大きかったと思っています。  
今日は、そんな僕自身が「本気で人生に影響を受けた」と感じている本を、厳選して4冊紹介します。

エンジニア向けというよりは、「これからもっと成長していきたい」と思っているすべての人に向けて。  
ビジネス書に馴染みがない人でも、読みやすくて心に刺さる本ばかりなので、ぜひ参考にしてみてください。

---

## ① [DIE WITH ZERO 人生が豊かになりすぎる究極のルール](https://amzn.asia/d/cuEr6Mh)

> 「今持ってる100万円と、10年後に持ってる100万円の価値は全然違う」

この一文がまさにこの本の本質。  
成長意欲が高い人ほど、今という時間を「今しかできない」経験に使わない、使えない人が多いんじゃないかと思います。でも、この本はそんな価値観に強烈なカウンターを与えてくれます。

人生を豊かにする最大の投資は「思い出」への投資。  
つまり、“そのときにしかできない経験”に時間もお金も使っていくべきだというメッセージです。

特に印象的だったのは、  
> 「人は最終的にお金を使い切れずに死ぬ。だったら、もっと早くから経験に投資しよう」  
という考え方。

将来のために頑張ることは大切。でも、「今」というタイミングを見逃すと、もうそのチャンスは二度と来ないかもしれない。  
仕事や勉強に没頭する中でも、しっかり“人生を味わう意識”を持ちたい。そんな風に価値観をアップデートしてくれる一冊です。

---

## ② [夢をかなえるゾウ1](https://www.amazon.co.jp/dp/B091PWJ82D)

これはめちゃくちゃ読みやすい自己啓発本です。小説仕立てになっているので、活字が苦手な人でもスイスイ読めるはず。

この本のテーマはズバリ、「当たり前のことを、ちゃんとやろう」。  
結局、人が成功するためにやるべきことって、この何千年という人類の歴史の中でほぼ明らかになっていて、みんな本当は知ってる。でも、それを“面倒くさい”という理由でやらない。

> 「めんどくさいが、最大の敵」

この言葉は、僕の中でずっと残っています。  
裏技や近道を探す前に、「今やるべきことをやる勇気」を持つこと。  
「変わりたい」「成長したい」と思っているのに動けない自分に向き合うきっかけになる一冊です。

---

## ③ [嫌われる勇気](https://www.amazon.co.jp/s?k=%E5%AB%8C%E3%82%8F%E3%82%8C%E3%82%8B%E5%8B%87%E6%B0%97+%E6%9C%AC)

人間関係に悩んでいる人、過去にとらわれて前に進めない人にぜひ読んでほしい本です。  
アドラー心理学をベースにした内容で、タイトル通り「人から嫌われてもいい」と思えるようになる考え方が詰まっています。

印象的なのは、  
> 「トラウマは存在しない」  
という一節。過去にどんなことがあったとしても、それを理由に今の自分を制限しているのは自分自身。  

「目的思考」の考え方を身につけることで、環境や他人のせいにせず、「どうなりたいか」に集中できるようになります。

何かに挑戦しようとしたとき、つい人の目が気になってしまう人にはとても刺さる本です。  
僕自身もこれを読んで、「自分の人生を生きる」と覚悟できるようになりました。

---

## ④ [USJのジェットコースターはなぜ後ろ向きに走ったのか?](https://www.amazon.co.jp/dp/4041041929)

最後は、マーケティングやビジネスに関わる人だけでなく、「仕事に本気になりたい人」に読んでほしい一冊。

USJのV字回復を牽引した森岡毅さんが、「どうやってUSJを復活させたか」を物語形式で描いた本なのですが…とにかくエネルギーがすごい。

> 「ここまで考え抜いて、やり切れば、仕事は本当に人を動かすんだ」  
と衝撃を受けました。

常識を壊す発想力、粘り強い仮説検証、圧倒的な覚悟。  
ただの“アイデア”だけじゃない、“行動”と“信念”が人と仕事を動かしていくんだというリアルが詰まっています。

「仕事に誇りを持ちたい」「自分も何かを変えてみたい」と思っている人には、間違いなくエネルギーをくれる一冊です。

---

## おわりに

本は「人生のペースメーカー」みたいなものだと思っています。  
忙しさや悩みに飲まれて、自分の軸がぶれそうになるとき。本を開くことで、もう一度「どう生きたいのか」「どう成長していきたいのか」を見つめ直すことができる。

今回紹介した4冊は、どれも僕にとって“節目”をつくってくれた本です。  
もし今、何か変わりたいと思っているなら、その一歩としてぜひ手に取ってみてください。


---
PRUMのエンジニアの95%以上は、未経験からの採用です。
ぜひ、求人をチェックしてみてください！

▼ Wantedly求人
https://www.wantedly.com/projects/626662

▼ コーポレートサイト
https://prum.jp/

VISION 『日本で一番エンジニアが成長する会社を創る』

ご応募お待ちしておりますー！
rex0220 ちょっと便利なプラグイン 編集画面で編集不可項目の文字色を黒に変更

[ちょっと便利なプラグイン](https://qiita.com/rex0220/items/45883f15ccd34a68b8af)の機能をご紹介します。
この機能は、編集画面で編集不可の項目の文字色を黒に変更することで、視認性を向上させます。

# 概要

「F74 編集画面で編集不可項目の文字色を黒に変更」をチェックすることで、編集不可の項目の視認性を向上させます。

※Ver.33 で、対象項目にドロップダウン・ラジオボタン・チェックボックス・複数選択の項目を追加

![2025-05-16_12h35_21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/c51b878d-0ab5-49e9-bea6-60868ea20b7d.png)

# 適用前後の比較

![2025-05-16_12h33_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/82c90ef1-3ffd-4496-b301-d32947a1e2de.png)

# ちょっと便利なプラグイン設定

「F74 編集画面で編集不可項目の文字色を黒に変更」をチェックします。

![2025-05-16_12h59_28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/b8fbdcc1-9b03-47b0-a050-f7596862c796.png)
kaliのネットワークが壊れた

# kaliのネットワークが壊れた
何もしてないのに壊れた。
TryHackMeのVPNに繋ぎながら、リバースシェル繋ぎながら、ホストPCをスリープしただけなのに壊れた。

具体的にはkaliから外のネットワークに一切繋がらなくなった。

### 環境 
- windows11
- VMware

## 治す
![スクリーンショット (23).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3348724/75fe6757-47dc-4728-b26a-dbedc62ad955.png)

VMwareの編集、仮想ネットワークエディタから

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3348724/62bf5730-e285-474d-ba1a-53ebd3338ba6.png)

右下にある管理者権限渡して

![スクリーンショット (22).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3348724/3cfabe34-ae43-4a11-8619-4831e871a925.png)

デフォルトに戻すを選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3348724/ea9c1266-fc96-4eb8-af9a-b7df8ae8869a.png)

治った！

## 終わり
たぶんvpn繋ぎながらホストをスリープしたのが問題なので、みなさんはちゃんとスリープ前切るようにしましょう。
【完全ノーコード】Databuttonにおけるハッシュタグ（#）の使い方完全ガイド

# 【完全ノーコード】Databuttonにおけるハッシュタグ（#）の使い方完全ガイド

こんにちは。今回は、**ノーコードでAIアプリが作れる**と話題の [Databutton](https://databutton.com/?via=takahiro19) において、「#ハッシュタグ」の活用方法を完全ガイド形式で解説します。

コードが書けなくても安心！エンジニアでなくても、この記事を読むだけで、Databutton上でのハッシュタグの使い方をしっかり理解できます。

---

## 🔰 そもそもDatabuttonとは？

Databuttonは、AIを活用したWebアプリを**完全ノーコードまたはローコード**で作成できるプラットフォームです。

- フロントエンド（UI）とバックエンド（Python）をつなぐ仕組みがシンプル  
- ChatGPTを利用したプロンプト操作が可能  
- Firestoreなどの外部データベースとも簡単に連携可能  
- デプロイ・共有もボタンひとつでOK

👉 詳しくはこちら → [https://databutton.com/](https://databutton.com/?via=takahiro19)

---

## 🏷️ ハッシュタグ（#）とは？

Databuttonでは、UI（ボタンやテキスト入力など）とバックエンドをつなぐ「アクション呼び出し」の中で、`#task` や `#function_name` のように**`#` 付きのキーワード**が使われます。

これは、**バックエンドの関数（task）と連携するためのトリガー**の役割を持っています。

---

## ✅ 使い方のイメージ（ノーコード）

以下のような流れでハッシュタグは使われます。

1. **ボタンやドロップダウン**などのUIコンポーネントをDatabutton上で配置  
2. 「On Click」や「On Change」などのイベントに`#`で始まる関数名を指定  
3. その`#関数名`がバックエンドで定義されていれば、自動的に接続される  

つまり、「UIでイベントが起きたら、#で指定されたバックエンド関数を呼び出す」という超直感的な構造になっているのです。

---

## 👀 例：UIとバックエンドのつながり

UI側で「#generate_summary」と設定した場合、Databuttonは内部で以下のように動作します。

- ボタンを押す  
- `#generate_summary` にマッチする関数がバックエンドに存在するか確認  
- 存在すれば実行、結果をUIに返して表示  

👉 詳細な連携例は公式ガイドにも記載されています：  
[Connecting UI with the backend](https://docs.databutton.com/prompting-in-databutton/connecting-ui-with-the-backend)

---

## 🤖 ChatGPTを使ったプロンプト連携も #で簡単に！

Databuttonでは、ChatGPTを活用した処理も、ハッシュタグを活用してシームレスに呼び出すことが可能です。

例えば：

- `#ask_gpt` という関数を作成しておけば、  
- テキストボックスに入力した内容をそのままGPTに送信し、  
- 結果をUI上に表示する、という**AI搭載アプリがノーコードで実現**します。

---

## 📌 補足：どこで定義するの？

`#function_name` は、Databuttonの「Backend（Python）」セクションで作成された関数（task）に対応しています。

この関数名と一致させるだけで、自動的に呼び出しが機能するので、面倒なバインディングや設定は一切不要です。

---

## 💡 おすすめの使い方Tips

- UIコンポーネントにはすべて`#〜`のアクション名をつけよう  
- タスク名は短く、意味のある英単語にすると整理しやすい  
- アクションがうまく動かないときは、バックエンドに関数が存在しているかチェック

---

## 🔚 まとめ

Databuttonの「#ハッシュタグ機能」は、ノーコードなのに強力。UIとバックエンドのつながりを、**たった1行の`#タグ`で実現**できるのは驚異的です。

これからAIアプリを構築したい方、ノーコードでプロトタイプを作りたい方にはぜひ試してみてください。

👉 今すぐ試す：[https://databutton.com/](https://databutton.com/?via=takahiro19)

---

\#Databutton \#ノーコード \#AI開発 \#プロンプト連携 \#バックエンド接続


⸻
VSCodeでのビルド設定エラー時に出てくる"Remember my choice for this task"をリセットする方法

## 記事執筆のきっかけ

[CursorでC#のデバッグができるよう試行錯誤](https://qiita.com/luxun1910/items/e2519ae9544d320b371a)していて、ビルドボタンを押した際、以下のようなエラーが出ました。

![error-could-not-find-the-task.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558837/aa04d9c3-c87b-49f9-ab5a-a18f46e03c55.png)

ここで、自分は良く分からず誤って「Remember my choice for this task」を押下したのち、「Debug Anyway」を押してしまいました。
その結果、ビルド設定にミスがあるにもかかわらず、ダイアログが出なくなったため、何がエラーの原因なのか分からなくなってしまいました（反省...）。

そこでこの設定を解消しようとしたところ、VSCodeのsettings.jsonに記載されているわけではないようで、解消するのに苦労しました。
おまけに、非常にマイナーなケースであるためか、調べても解決方法が中々出てこず、ChatGPTも嘘情報を教えてくる始末でした。

そのため、今後同じようなケースが発生したときにスムーズに対応できるようにするべく、備忘録として手順を記載します。

## どうすればいいか？

結論から言えば、VSCode（Cursorの場合はCursor）のworkspaceStorage内の当該ワークスペース（「Remember my choice for this task」を押下してしまったワークスペース）に対応するstate.vscdbを削除すれば解決します。

### 手順

#### 1．エディタを閉じる

まずはVSCode（Cursor）を閉じてください。
でないと、後で出てくるstate.vscdbを削除できません。

#### 2. workspaceStorageフォルダを開く

workspaceStorageのパスは以下の通りです。

Windowsの場合:
`%APPDATA%\Code\User\workspaceStorage`

Mac/Linuxの場合:
`~/.config/Code/User/workspaceStorage`

なお、Cursorを使っている方は、上記パスのCodeをCursorに置き換えてください。

Windowsの場合:
`%APPDATA%\Cursor\User\workspaceStorage`

Mac/Linuxの場合:
`~/.config/Cursor/User/workspaceStorage`

すると、英数字の羅列みたいなフォルダ一覧が出てくるはずです。

![workspace-storage-folders.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558837/efbaa5f9-6402-4132-bec6-4642f5473460.png)

このフォルダー1つが、1つのWorkspaceの各種履歴やキャッシュなどを管理してる、というイメージです。

#### 3. 更新履歴が最新のフォルダを開く

この英数字の羅列がどのWorkspaceに結びついているか確認する方法もあるようですが、手順が複雑です。
そこで、更新履歴が最新のもの＝最近開いたものと判断する方法をとります。

#### 4. state.vscdbを削除する

中にstate.vscdbというファイルがあるはずなので、削除してください。

#### 5. エディタを起動する

VSCode（Cursor）を再度起動し、「Remember my choice for this task」を押下してしまったワークスペースを開いてください。
再度ビルド設定エラーが発生した際、しっかりダイアログが表示されると思います。

## まとめ

まさかビルド設定エラー時のダイアログの「Remember my choice for this task」の設定がワークスペースのストレージに記録されているとは思いませんでした...。
非常にレアケースだと思いますが、同じような状況に陥って解決したい方は、是非参考にしてみてください。
バイブコーディングスケール

## はじめに

最近、開発者のSNSやコミュニティでは、自分が体験したバイブコーディングについて語ったり、AIと一緒にコードを書くことがどれほど快適で優れているかを紹介したりする開発者が急増している。しかし、実際に内容をよく見てみると、同じ「バイブコーディング」という言葉を使いながらも、その経験レベルは人によってまったく異なっている。簡単なコード補完を面白がる人もいれば、サービス全体をAIとともに設計・運用するレベルに達している人もいる。ここでは、自分なりに考えたバイブコーディングの成熟度の基準を整理してみようと思う。

## 1段階 – 単純な支援レベル（コード予測）

1段階目は「単純な支援レベル」だ。代表的なものとしてGitHub Copilotなどが該当する。この段階では、次に書く数十行のコードまたはメソッドをAIが提案してくれる程度だ。便利ではあるが、コードの流れや設計は完全に開発者自身の責任となる。実際、これだけでもうまく使えば、熟練した開発者にとっては大きな生産性向上をもたらすことができる。

## 2段階 – ファイル単位の完成レベル（スクリプトの自動化）

2段階目は「ファイル単位の完成レベル」だ。簡単なスクリプトやユーティリティ的な作業なら、AIがそれなりにまとまった形でコードを書いてくれる。反復作業や単純な自動化スクリプトの開発をAIの支援を受けて迅速にこなせるレベルだ。この段階では開発者はコード全体をチェックし、軽微な修正を加えるだけでよい。

## 3段階 – モジュールレベルでの統合（モジュラーインテグレーション）

3段階目からは明らかに違いが出てくる。「モジュールレベルでの統合」だ。この段階では、AIが複数のファイルからなる独立した機能やモジュールを設計パターンや原則をある程度考慮して提案するようになる。開発者はAIが作ったモジュールをプロジェクトに統合し、管理すればよい。SOLID原則やクリーンアーキテクチャなど基本的な設計原則がある程度反映されたコードを得られるようになる。

## 4段階 – プロジェクトレベルの管理（プロジェクトオーケストレーション）

4段階目は「プロジェクトレベルの管理」だ。このレベルでは、コーディングだけでなく設計、リファクタリング、テスト、デプロイの自動化まで、プロジェクト全体の流れをAIが広くサポートするようになる。開発者は要求事項を明確に伝え、AIが生成したコードをレビューし選択・管理する程度まで作業が単純化される。複雑な文脈もある程度AIが理解するため、開発者の役割は徐々に管理や監督側へと移っていく段階だ。

## 5段階 – ビジネス目標を中心とした自動化（ビジネスゴールドリブンオートメーション）

最後の5段階目は「ビジネス目標を中心とした自動化」だ。この段階までくると、技術的な実装を超えて、サービスのビジネス目標や運用環境までAIが理解するようになる。開発者は技術的な実装よりも、要求事項やビジネス目標の設定に集中することができる。AIは技術的な実装やデプロイだけでなく、パフォーマンスの最適化、障害対応など運用管理のかなりの部分を自動で処理するようになる。開発者はビジネス戦略や重要な意思決定に専念することになる。

## 結論

段階が上がるにつれて、開発者が管理すべき技術的な要素は減り、ビジネス面での要素が増える。ビジネス領域の問題定義や解決、意思決定もAIの支援によってさらに効率的に行われるようになるだろう。今後数年のうちに、開発者が直接コードを書く場面は大幅に減少し、場合によってはほとんどなくなるかもしれない。現在シニア開発者が担当している業務が、一般化されるのだ。

バイブコーディングはもはや単なるツールではなく、開発手法そのものを変える大きな流れとなった。しかし、全ての人が同じレベルや方法でバイブコーディングを使っているわけではない。この文章が、自分自身の成熟度を把握し、次の段階へ進むための小さな道しるべになればと思う。
🚀 ポケモンで学ぶ！CI/CDの冒険ガイド ～中学生でもわかる継続的インテグレーション／継続的デリバリー自動化の世界～

# 🚀 ポケモンで学ぶ！CI/CDの冒険ガイド ～中学生でもわかる自動化の世界～

ポケモンの世界を舞台に、CI/CD（継続的インテグレーション／継続的デリバリー）の仕組みを、ジム戦や冒険に例えてわかりやすく説明します。

---

## 🔍 逆引き目次（ポケモンで学ぶCI/CD）

* 🎯 [そもそもCI/CDってなに？](#そもそもcicdってなに)
* 🧩 [ポケモンで言うとこう！](#ポケモンで言うとこう)
* 🗺 [ステップ別 CI/CD 冒険ガイド](#ステップ別-cicd-冒険ガイド)

  * [1️⃣ ポケモンを育てる（コードを書く）](#1️⃣-ポケモンを育てるコードを書く)
  * [2️⃣ ポケモンセンターに預ける（GitにPush）](#2️⃣-ポケモンセンターに預けるgitにpush)
  * [3️⃣ ジョーイさんが健康チェック（CIでテスト）](#3️⃣-ジョーイさんが健康チェックciでテスト)
  * [4️⃣ 冒険へ出発！（CDでデプロイ）](#4️⃣-冒険へ出発cdでデプロイ)
* 📦 [実務で使われるツール例](#実務で使われるツール例)
* 🧠 [まとめ：CI/CDは冒険を加速させる！](#まとめcicdは冒険を加速させる)
* 🌟 [おすすめの一歩](#おすすめの一歩)



---

## 🎯 そもそもCI/CDってなに？

CI（Continuous Integration）とは…
> **みんなのプログラムを自動でまとめて確認する仕組み！**
> ポケモンで言うと、「バトル前に全ポケモンをポケモンセンターで健康チェックする」こと！

CD（Continuous Delivery/Deployment）とは…
> **バグがなければ自動でアプリを出荷・更新する仕組み！**
> ポケモンで言うと、「準備万端になったら自動で次の冒険へ出発する」こと！

---

## 🧩 ポケモンで言うとこう！

| ポケモンの世界                | 開発の世界                |
|------------------------------|---------------------------|
| ポケモンセンターにポケモンを預ける | GitにコードをPushする       |
| ジョーイさんが健康チェックをする   | CIがテストを実行            |
| 問題がなければすぐに冒険に出発！   | CDで自動デプロイ            |
| 状態異常だったら「休ませて」くれる | エラーが出たら通知           |

---

## 🗺 ステップ別 CI/CD 冒険ガイド

### 1️⃣ ポケモンを育てる（コードを書く）

- トレーナーはポケモンを大切に育てます。毎日一緒にバトルして、経験値を積ませ、進化させたり、技を覚えさせたりします。
- これはコードを書く作業と同じで、「より強い技（＝新機能）を覚えさせる」「弱点（＝バグ）を克服させる」ようなものです。

```text
🧒 トレーナー：技の名前を考える（関数名を決める）
🧪 技マシンを使う：新機能を追加する
🔁 レベルアップ：何度も練習して、ポケモンを成長させる
```

---

### 2️⃣ ポケモンセンターに預ける（GitにPush）

- 預けたら自動で健康診断が始まります。コードをGitHubにPushすると、CIツールが動き出すイメージです。

---

### 3️⃣ ジョーイさんが健康チェック（CIでテスト）

- 技が正しく動くか、ポケモンが元気かをチェックしてくれます。

```yaml
# 例：GitHub Actionsの設定
name: Pokemon CI
on: [push]
jobs:
  test:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    - name: Run tests
      run: npm test
```

---

### 4️⃣ 冒険へ出発！（CDでデプロイ）

- 準備OKなポケモンはそのままジム戦へ！
- テストOKなコードもそのまま本番環境へ出発！

```yaml
# 例：本番サーバーへデプロイ
    - name: Deploy to production
      run: npm run deploy
```

---

## 📦 実務で使われるツール例

| ポケモンの世界         | ツール例                       | 用途             |
|------------------------|-------------------------------|------------------|
| ポケモンボックス（預ける）   | GitHub, GitLab               | ソース管理         |
| ジョーイさん（健康診断）   | GitHub Actions, CircleCI     | CIツール          |
| 冒険に送り出す（出発）    | Vercel, Netlify, Firebase    | デプロイツール       |

---

## 🧠 まとめ：CI/CDは冒険を加速させる！

- 育てたポケモンが自動でジムに挑んでくれる！
- トレーナーが寝てても、自動で体調管理＆出発してくれる！
- 状態異常やバグがあれば即メールでお知らせしてくれる！

CI/CDを導入すると、**まるで「ポケモンが自分でバッジ集めしてくれる」ような冒険効率化**ができるのです！

---

## 🌟 おすすめの一歩

- GitHubにサインアップしてみよう
- `actions/setup-node` や `actions/checkout` を試してみよう
- 自分のポケモン（コード）を自動で冒険に出してみよう！
traitが有効な場面とその理由を深掘りする

## はじめに
PHPで共通処理を複数のクラスに持たせたいとき、インターフェースを抽象クラスで実装すること以外に、traitを使うということを学んだ。
この記事では、その理解の過程を整理する。

---

## traitは「処理の再利用」のための道具

- 抽象クラス → 「共通の型・構造をもつクラスを継承させる」ためのもの
- trait → 「特定の処理だけを、クラスに柔軟に注入する」ためのもの

共通のインターフェースやプロパティをもたせたいなら抽象クラス
単に関数の中身を再利用したいだけなら traitがベスト

---

## インターフェース＋抽象クラス と trait の違い

たとえば、
- 複数のクラスで `render()` メソッドを使いたい
- 全部同じ実装になる
- それなら、interface + 抽象クラスで共通実装を提供すればよさそう

これで「共通実装」も「共通の型」も成立する。
でも抽象クラスには制限がある。

それは、PHPはクラスの多重継承ができない。

```php
class A extends B, C // ❌ 不可能
```

つまり、共通処理をいくつも継承させることはできない。

そこで、trait の出番。
trait は一つのクラスに複数入れ混むことができる。

## trait を使うべき場面は？

- 共通処理を複数のクラスに持たせたい。
- 共通の状態や型（プロパティ・親クラス）は不要。
- オーバーライドもしない。
- 必要があれば複数の共通処理を組み合わせたい

→ これらを満たすのが trait の強み

---

## おわりに
インターフェースを抽象クラスで実装することの限界を理解した。
でも、trait を使えば、その限界を突破できる。
【React】React routerのLinkを使用しないページ遷移(useNavigate)


# はじめに

こんにちは。アメリカ在住で、独学でエンジニアを目指している Taira です。
現在、Udemy の講座「React に入門した人のためのもっと React が楽しくなるステップアップコース完全版」で React の学習を進めています。

この講座の内容は非常にわかりやすいのですが、紹介されている React および React Router のバージョンがやや古く、現在主流となっている react-router-dom バージョン 7 とは操作方法が大きく異なります。

そこで本記事では、講座内で紹介されている内容をもとに、2025 年 5 月 10 日時点での react-router-dom の最新バージョン (7.5.3) に対応した useNavigate について解説します。

## 開発環境

- React 19.1.0
- Vite 6.3.5
- react-router-dom 7.5.3

## 始める前に

最初に react-router-dom をインストールしましょう:

```bash
npm install react-router-dom
```

インストール後、`package.json` の `dependencies` に `react-router-dom@7.5.3` が含まれていることを確認してください。

### useNavigate の使い方

```jsx
import { useNavigate } from 'react-router-dom';

const MyComponent = () => {
  const navigate = useNavigate();

  const handleClick = () => {
    navigate('/about');
  };

  return <button onClick={handleClick}>Go to About</button>;
};
```

`navigate('/about')`のように、URL を指定するだけでそのページへ遷移します。

---

## 戦略的な使い方

### 1. 戻る

```jsx
navigate(-1); // 1順戻る
```

### 2. state を渡す

```jsx
navigate('/user', { state: { id: 123 } });
```

渡された state は `useLocation()` で取得できます:

```jsx
const location = useLocation();
console.log(location.state.id); // 123
```

### 3. replace

`replace: true`を指定すると、ヒストリの戻る編にたまらない

```jsx
navigate('/dashboard', { replace: true });
```

---

## コンポーネントとの違い

| 順序 | `<Link>`                          | `useNavigate`                    |
| ---- | --------------------------------- | -------------------------------- |
| 1    | JSX 上で簡単に記述                | JavaScript 内で自由に制御        |
| 2    | 表示は `<a>` のような指し方       | 押した時に移動するように動的制御 |
| 3    | state, replace は使わない事も多い | 突発的な移動に適する             |

---

## まとめ

`useNavigate`を使うことで、ユーザー操作や出力結果に応じて、動的にページ遷移を実現できるようになります。

- ボタン押下時
- ログイン成功時
- API 通信結果に応じた遷移

などのシーンで有効に活用できます。

# 参考文献

https://www.udemy.com/share/104d6k3@42e714cVu4rgVDHDJf-ktUgk7fTCTCZNgNYDjNAfj2ycTQZlC2z-9pgXx7KV8hvxwQ==/
数字を文字として表示する.to_s メソッド、整数（数字）として表す.to_iメソッド

### 数字を文字として扱いたい場合 ###
```
数字.to_s 
```
とする

具体的には
```
20.to_s
```

to_sの「S」はstring(文字列)の「S」より



### 数字を数字として扱う場合 ###

```
数字.to_i
```

to_iの「i」はinteger（整数）の　「I」


また
```
#{数字}
```
とすると文字列の中にそのまま使うことができる
【最新のOpenSSLに対応】OpenSSL3.4.1をソースコードからインストール

特段ハマったことはなく、バージョンが最新の3.4.1になっただけ。そのまま素直にインストールだけした感じ。とりあえずメモ代わりに記事にする。

手順は以下の通り。
```
dnf install wget \
            tar \
            gcc \
            make \
            zlib \
            zlib-devel -y
            
dnf install perl-IPC-Cmd perl-Pod-Html -y
```
```
wget https://github.com/openssl/openssl/releases/download/openssl-3.4.1/openssl-3.4.1.tar.gz
tar xvfz openssl-3.4.1.tar.gz
cd openssl-3.4.1
LDFLAGS="-Wl,-rpath=/var/home/lib/openssl/lib64" \
./Configure  --prefix=/var/home/lib/openssl shared zlib
make all
(約8分かかる)
make install_sw
make install_ssldirs
```
```
mv /var/home/lib/openssl /var/home/lib/openssl3.4.1
ln -s /var/home/lib/openssl3.4.1 /var/home/lib/openssl
```
【Django】ファイルサイズのKB表示

# やりたいこと
アップロードしたファイルのサイズをKB単位で表示したい。

**イメージ**


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3784177/2e37c226-be71-4cf9-ab8f-23da116719f2.png)

# models.py

```diff_python:  models.py 
class UploadFile(models.Model):
    title = models.CharField(max_length=50)
    file = models.FileField(upload_to='uploads/')

    # ファイル名を取得
    @property
    def filename(self):
        return self.file.name.split("/")[-1]  # uploads/を除くファイル名だけ取得

+   # ファイルサイズを取得
+   @property
+   def file_size(self):
+       return self.file.size // 1024  # KB単位で取得 
```
- @property を使うとfile_sizeで呼び出せる
- ファイルサイズはbyte単位で取得されるので、// 1024 で割る
- 割り算の結果を整数で取り出している

# detail.html

```diff_html: detail.html
    <ul class="list-group list-group-flush">
        {% for file in object.uploaded_files.all %}
            <li class="list-group-item">
                <a href="{{ file.file.url }}">{{ file.filename }}</a>　<small>{{ file.uploaded_at }}</small>
+               <p class="text-end blockquote-footer mb-0">ファイルサイズ：{{ file.file_size }} KB </p>
            </li>
        {% empty %}
            <li class="list-group-item">
                アップロードされたファイルはありません。
            </li>
        {% endfor %}
    </ul>
```
- 装飾にはBootstrapを利用しています
- MB単位にしたい場合はさらに // 1024 
- 小数点で表示する場合は / 1024
ECS Fargateによるエンタープライズ向けスケーラブルWebアプリケーション基盤構築


# ECS Fargateによるエンタープライズ向けスケーラブルWebアプリケーション基盤

この[リポジトリ](https://github.com/softjapan/ECS-Fargate-Web-App-Stack)は、AWS上にエンタープライズレベルのスケーラブルなWebアプリケーション基盤を構築するためのリファレンスアーキテクチャを提供します。コンテナベースのマイクロサービス、CI/CDパイプライン、自動化されたインフラ管理、そしてオンプレミスとのハイブリッド接続までを網羅し、可用性・セキュリティ・運用性のベストプラクティスに準拠しています。

本アーキテクチャは、再利用可能なインフラ構成として、オープンソースでの展開と企業利用の両立を目指しています。

---

## 🗺 システム構成図

以下は、本アーキテクチャ全体の構成を示したシステム図です：

![ECS-Fargate-Web-App-Stack.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125746/d9bd47ba-f860-431f-a605-79f4b14716cd.png)


---

## 🧩 アーキテクチャ概要

本構成は、以下の主要コンポーネントによって構成されています。

### 🐳 コンテナオーケストレーション基盤（Amazon ECS on AWS Fargate）

* マイクロサービスアーキテクチャに基づいたコンテナ化アプリケーションのデプロイおよびスケーリングをサポート
* サーバーレス実行環境により、ホスト管理の負担を排除
* Availability Zone（AZ）を跨いだ高可用構成で、サービスの耐障害性を強化

### 🛠 運用管理ノード（EC2 Step Server）

* ジョブ管理、バッチ処理、保守タスクを集中管理
* S3やDynamoDBなどAWSマネージドサービスとの連携による高度なオーケストレーション

### ⚖️ 負荷分散機構（Application Load Balancer）

* アプリケーション層でのルーティングを提供し、可用性とスケーラビリティを向上
* TLS終端によりセキュアなトラフィック管理を実現
* ヘルスチェック機能による自動フェイルオーバー

### 🔁 CI/CDパイプライン（CodePipeline + CodeCommit + CodeBuild）

* AWS CodePipelineを中心とした完全自動化の継続的インテグレーション/デリバリー（CI/CD）フロー
* CloudWatch Eventsと連携したデプロイメントトリガー
* Infrastructure as Codeによって一貫性のある環境構築を実現

### 🌐 ハイブリッドネットワーク構成

* AWS Direct Connect + DX Gatewayによる低遅延・高信頼の専用線接続
* オンプレミス環境（ファイルサーバー、DNS、PCクライアント）との連携
* Route 53およびCustomer Gatewayによる名前解決・ルーティング管理

### 🔒 運用監視・セキュリティ統合

* Amazon CloudWatchによるメトリクス収集、アラート通知
* AWS CloudTrailでの操作ログ取得とコンプライアンス対応
* NAT Gatewayを介したセキュアなアウトバウンド通信
* AWS AppConfigによる設定値の安全なデプロイ管理

---

## ✅ 主な利点（Key Benefits）

* **コスト効率**：Fargateの利用により、インフラ管理の最適化とTCO（総所有コスト）の削減を実現
* **高可用性**：マルチAZ構成により、99.99%の可用性を確保
* **開発効率向上**：CI/CDの自動化により、迅速なリリースと検証が可能
* **拡張性と柔軟性**：マイクロサービスアーキテクチャにより、新機能追加やスケーリングに対応
* **セキュリティとコンプライアンス**：CloudTrailやIAM、専用線接続を活用し、セキュリティ要件に対応

---

## 🔧 今後の展望（Future Roadmap）

* TerraformやAWS CDKによるIaCテンプレートの提供
* 複数環境（Dev, Staging, Production）対応のベストプラクティス追加
* マルチテナント対応やサービスメッシュ（App Mesh等）統合
* SSOやOIDC連携など、エンタープライズセキュリティ機能の拡充

---
## 🚀ソースコード
https://github.com/softjapan/ECS-Fargate-Web-App-Stack

---

## 📎 参考リンク

* [Amazon ECS on AWS Fargate](https://aws.amazon.com/fargate/)
* [AWS Well-Architected Framework](https://aws.amazon.com/architecture/well-architected/)
* [AWS Hybrid Connectivity](https://aws.amazon.com/hybrid/)
【GCP】ロードバランサーの設定ミスで、SSL証明ができない、そもそも立てることができない、の二重エラーに苦しんだ


GCPのHTTP(S)ロードバランサー設定中に、**SSL証明がうまく発行されない**＋**ロードバランサーが立たない**という二重のトラブルに遭遇しました。
その原因と対策を備忘録としてまとめておきます。



## 結論

* **リージョンは「グローバル」を選ぶ**
* **「HTTPからHTTPSへリダイレクト」のチェック外す**



## ハマったポイント①：リージョンが単一リージョン

デフォルトでリージョンを「単一（Regional）」にしてしまうと、従来の方法でSSL証明書が発行できないのでちょっと手間になります。
GCPの[Google Managed SSL Certificate](https://cloud.google.com/load-balancing/docs/ssl-certificates/google-managed-certs)は**グローバルロードバランサー**に対応していて、単一を選ぶと「Google マネージドの証明書を作成するグレーアウト」して選択できなくなってしまいます。

![スクリーンショット 2025-05-16 11.17.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/572617/9cc0f25c-7e98-464b-aa34-f586fda34624.png)


> 単一リージョンでもできないことはないです。証明書を発行してドメインにCNAMEレコードを渡してDNS認証をすれば承認されます。今回、ドメインを取得していたのが他社さんだったので余計なやり取りを発生させたくない背景がありました。。。


## ハマったポイント②：「HTTP→HTTPS」リダイレクトのチェック

SSL証明以前にロードバランサーの構築自体がエラーで止まるケース。

諸々の設定が終わり完了ボタンを押すと、しばらくしたのちGCPが以下のようなエラーを吐きました

```
Invalid value for field 'resource.IPAddress': 'projects/hogehoge/global/addresses/hoeghoge-ip'. Specified IP address is in-use and would result in a conflict.
```
指定したIPアドレスは他で使われているので、使い回すと問題が起きる的なことを言ってます。
他のプロジェクトでこのIPアドレスを使ってるわけでもなく、ポートは:80と:443で分けているので問題はないはずですが...これに関しては原因がよくわかりませんでした

これが原因でエラーが起きてるとは思わずめちゃくちゃ時間食われました
ファイル内の処理でリダイレクトすれば問題ないのでチェックは外して構成することにしました

---

## まとめ

| 問題              | 原因                        | 対策               |
| --------------- | ------------------------- | ---------------- |
| SSL証明の発行がめんどいことになってる    | 単一リージョン指定                 | グローバルロードバランサーを使う |
| ロードバランサーが構築できない | HTTP→HTTPSリダイレクト設定によるエラー | チェックを外す          |


## さいごに

GCPのロードバランサーまわりはUIが整っているように見えて、細かい設定の落とし穴が多い印象を受けました。
自分と同じように「構築できない」「SSLが生えない」人の助けになれば幸いです。