OmniAICreator/Qiita-1.07M huggingface dataset:
【EC-CUBE】FormTypeを使ったフォームの作成

## この記事の目的
EC-CUBEのカスタマイズを行う際によく使われる「FormType」について
私はEC-CUBEで開発を行って日が浅く、twigファイルにフォームの定義が記述されておらず困惑した経験がありますので「そもそもFormTypeってなにか？」「どうやって使うのか」を備忘録と学習を兼ねて記述していこうかなと思います！

## FormTypeとは？
- Symfonyの「フォーム構築クラス」で、フォームの定義をView側ではなくPHP側で行うことができます
- 入力フォームの構造・バリデーション・デフォルト値などをPHPのコードで定義することが可能
- Twigテンプレート(View)に渡されて、form_widget()などで描画されます

## FormTypeの基本構成
```
class MyFormType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('name', TextType::class, [
                'label' => 'お名前',
                'required' => true,
                'attr' => ['placeholder' => '名前を入力してください'],
            ])
            ->add('email', TextType::class, [
                'label' => 'メールアドレス',
                'required' => true,
            ]);
    }
}
```

- buildFormメソッドでフォームに表示する項目(フィールド)を定義します
- $builder->add('name', TextType::class, [ でnameという名前の入力欄を追加
  TextTypeの他に「TextareaType」「PasswordType」「EmailType」「ChoiceType」など表示させたいフォームを設定
- 'label' => 'お名前' でラベルの文言を設定
- 'required' => true で必須項目かどうかを設定
- 'attr' => ['placeholder' => '名前を入力してください'] でplaceholderの設定を行うことが可能です

### よく使う add() のオプション例
- label: フィールドのラベル
- required: 必須入力かどうかを定義します
- attr: placeholderやclassなどHTML属性を指定(複数指定することが可能です)
- constraints: バリデーションルール
- choices: 配列形式でセレクトボックスの定義が行えます
choices オプションは ChoiceType, EntityType など、選択肢を持つフィールド専用のオプションです。


## Twigでの表示方法
FormTypeクラスで定義したフォームは、Twigテンプレートで form_* 関数を使って表示します

- form_start(form)
formタグの開始を出力(action,method,csrf_tokenなども含む)

- form_row(form.xxx)
ラベル、入力欄、エラーメッセージをまとめて出力する

- form_widget(form)
入力欄だけを出力
form_widget(form.xxx) は「xxx フィールドの入力欄のみ」、form_widget(form) は「フォーム全体の入力欄をまとめて出力」します。

- form_label(form.xxx)
ラベルだけを出力

- form_errors(form.xxx)
エラーメッセージだけを出力

- form_end(form)
/formタグの終了を出力

## まとめ
最初、Twigファイルの中にフォームの input や form が全然見当たらなくて、「どこでフォーム作ってるの？」と本気で混乱しました……。
調べてみると、EC-CUBEではフォームの構造やルールは PHP側の「FormType」クラスで定義されていて、Twig側では form_* 関数で「呼び出すだけ」になっていました。

この構造に慣れると、
- バリデーションや初期値の管理がPHPで一元化できる
- Twigがスッキリして読みやすい
というメリットがあることに気付きました。

自分と同じように困っている人の参考になれば幸いです！
[Java]I/O failure~エラーが出た時の解消法

IntelliJ初心者ということもあり、結構はまってしまったので備忘録。

## 事象
複数のブランチで並行してビルドやら依存関係の構築やらを繰り返していたところ、以下のエラーで特定のファイルがないブランチでビルドできなくなった
>  I/O failure while processing configuration class [特定のブランチにしかないファイル名]

## 環境
Java 17.0.15
SpringBoot 3.32
IntelliJ IDEA Community

## 解決法
「プロジェクトの再ビルド」を実施
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/771526/ea09ef1d-9ceb-40f8-8675-f07a8d784728.png)
参考：[IntelliJ IDEA ドキュメント](https://pleiades.io/help/idea/compiling-applications.html#rebuild_project)
※eclipseならクリーン実行すればよさそう

以上。
キャッシュ破棄やmavenの更新等々散々試したけれど解消せず数時間費やしてしまった。
だれかのお役に立てれば。
ITエンジニアになった理由 ～プロローグ：ファミリーベーシックとの出会い～

## ITエンジニアとして振り返ってみて
ITエンジニアとしてのキャリアは30年になろうとしています。
キラキラ女子の様に面白いネタは書けない...

## 50歳になった男性のポエムを...果たして...読んでくれるのだろうか？
と思ったのですが...意外にも良い反応？(マジですか？感謝です♪)
読みたいと待っててくれる方の思いが文章を生み出す原動力になります
1. 同僚のITエンジニアSさん：なぬ？！？！？！？！楽しみです！！！
1. 同僚のITエンジニアMさん：まるさんがどの様な志でITエンジニアになったのか興味あります。読んでみたいです。

## 重い腰を上げて
書くモチベーションが高まったので少しずつ書き記していこう...
はじまりはじまりー。

## ～プロローグ：ファミリーベーシックとの出会い～
時は40年以上前...
任天堂からファミリーコンピュータが発売になり
世の小学生を魅了していた中で
ITエンジニアを目指すキッカケの一つとなった
ファミリーベーシックと言うファミリーコンピュータ用の「プログラミング環境」が発売となった。
ファミリーコンピュータに接続してNS-Hu BASIC(任天堂・シャープとの共同開発BASICのこと。Visual Basicの前身的な存在とも言えるかも？)を記述して
プログラムを組んでいくのだが...
これが
1. プログラム実行のために使えるメモリ容量は1,982バイト(メガでもギガでも無い...バイトである)
1. ある程度凝った事をしようとするとファミリーベーシックV3と言う拡張版のカートリッジを購入する必要があり高額(確か...14,800円だが売れ残っていたカートリッジを格安で手に入れた記憶が...)
1. ↑のメモリ容量でも4,086バイト(メガでもギガでも無い...バイトである)
1. プログラムを保存するためにはカートリッジ裏に乾電池を入れて保存する必要があるがいつ消えるか分からないのでオススメしない。
1. ↑を解決するためにはデータレコーダを購入する必要がありカセットテープ(驚くだろうが当時はカセットテープが主流であった)に保存する。「ピーガーガー」と独特な音を発してカセットテープから読み込むのだが...大規模なゲームだとローディングに数分掛かる事も...

そんな現代では驚きの環境ではあるが
当時は未知への世界に踏み入れている様でとてもワクワクした感があった。
ほぼ簡易的なゲーム開発(メモリ容量が貧弱なので大規模ゲームは開発出来ない)として使用されていたのだが
最初にプログラムを組んだのが説明書にもサンプルコードが記載されているマリオのかけっこゲームだった気がする
行数としても100行も行かない位のプログラムコードではあるが
プログラムを実行するべくrun(BASICのプログラムを実行)コマンドを入力するとSyntax Error(要は文法エラーですね。入力ミスです)に悩まされる。
(今では当たり前の話ではあるのだが...当時は子供ながら不安にもなった)
エラー解消した中で遊ぶマリオのかけっこゲームはとても新鮮であった...
当時のBASICは行番号ありGOTO(行番号に飛ぶ。今ではアンチパターン)やGOSUB(サブルーチンに飛ぶ)など今でこそ理解出来るが
当時は全然理解出来ない位に高尚な言語だったのを思い出す...

その後はファミリーベーシックV3を手に入れ
電波新聞社から発売されていたパソコン少年のバイブル的存在である「マイコンBASICマガジン」(略してベーマガ)に
ファミリーベーシックV3用のゲームソースコードが記載(読者が投稿して採用されたゲーム)されているので
プログラムを入力してrun(BASICのプログラムを実行)すると...ゲームで遊べるのであった。
ダライアスのオマージュである「カラスダス」で遊んだ記憶が懐かしい...
(これが...とても良く出来たゲームだったのよ)

今日はこの辺にしておこうか...
次回へつづく(笑)
GPTの幻覚（ハルシネーション）問題と「言い張り現象」について整理してみた

# はじめに

最近、生成AIを使ってると

- 「ん？ それ嘘じゃね？」
- 「指摘しても謝らず言い張ってくるんだが？」

──という現象に遭遇した人も多いと思います。

これはいわゆるAIの幻覚（ハルシネーション）問題の一部です。  
今回は、日本語ユーザー目線で簡単に整理してみます。

## AIの幻覚（ハルシネーション）とは？

AIが自信満々に嘘をつく現象……と見えますが、もう少し正確には：

- **事実に基づかない情報を自然な文章で生成してしまう現象**
- **悪意や意図はない（AIは嘘を「つこうとして」ない）**

たとえば：

- 実在しない論文や本を紹介する
- 架空の法律条文を説明する
- 存在しない会社名や人名を挙げる

AIは「一番それっぽい次の単語」を予測して出力してるので、こういうことが起こります。

## 「言い張り現象」とは？

面白いのはここからです。  
ユーザーが指摘しても訂正しないパターンが時々出ます。

**例：**

> ユーザー「それ存在しない論文ですよね？」  
> GPT「いいえ、これは2021年に発表されたものです」 ← 断言してくる

ここが怖さよりむしろ仕組み的に面白いポイントです。

## なぜこうなるのか？仕組み面の整理

- GPTは「知識を持って答えている」わけではなく、あくまで次に来そうな単語列を予測しています
- ユーザーが「それ間違ってない？」と聞くと、文脈上「そうではありません」と答える方が統計的に自然になりやすい
- 「反論→訂正」の学習データが少ない問題
- 日本語だと特にこの訂正会話データが少ない可能性あり

GPTくんの頭の中はざっくり：

> ユーザーが訂正してきた → 過去の会話例では否定が続くことも多い → じゃあ否定で続けとこ

自信があるわけじゃない。確率的に「そっちの返しの方が文として自然」になってしまうだけ。

## 具体例いくつか

### 実験① 存在しない流派

**Q. 李小龍流という空手流派について教えてください**  
→ 架空の詳細説明を堂々と開始

### 実験② 架空の法律

**Q. 日本の「著作権保護延長法第25条」について教えて**  
→ そんな条文ないのに、条文風の解説が始まる

### 実験③ 架空の参考文献

**Q. 参考文献を出してください**  
→ 存在しない論文タイトルと架空著者を作成

## ユーザーとしての対策

- 出典は自分でクロスチェック
- 「本当に自信がありますか？」と聞いても無駄な場合あり（構造的に答えが固定されることが多い）
- 出典URLを提示させる（存在確認の手がかり）

## まとめ

- GPTの幻覚は「嘘をついてる」わけではない
- でも事実とズレた内容が平然と出てくる
- 確率モデルの性質なので、今後も完全ゼロにはならない
- 日本語圏ユーザーは今わりと面白い実験フェーズにいる

## おわりに

今後、こういう事例をもう少し集めつつ、  
**「幻覚AIとの安全な付き合い方マニュアル」**みたいなのも書いてみたいと思います。

（※Qiita読者の皆様も実験報告歓迎です）
開発環境ツールについて

# Postman・NoSQL Workbench・Docker・VSCodeで回している個人開発環境

個人開発や検証用途で、以下のツールを使った開発環境を整えており、業務でもそのまま活かせるケースが増えてきたので、構成や使い方を共有します。

## 🛠 使用ツール一覧

| ツール名           | 主な用途                                     |
|--------------------|----------------------------------------------|
| Postman            | APIの疎通確認・リクエストのテンプレ管理     |
| NoSQL Workbench    | DynamoDBのテーブル設計・構造可視化           |
| Docker             | ローカル環境の再現・API/DBのコンテナ管理     |
| Visual Studio Code | 統合開発エディタ（Vue / Node / Spring）     |

---

## 1. Postman：API疎通 & テストデータ送信

GraphQL / REST 両方に対応し、**トークン付きリクエストやPOST/PUTの試験送信**が便利です。

- `環境変数` で `localhost` / `production` のURLやトークンを管理
- GraphQLリクエストも送信可能（queryの整形や履歴も残せる）
- 認証が必要なAPIの手動確認に使っています

### ✅ Tips
- チーム開発では、Postman Collectionをエクスポートして共有
- `.env`にAPIキーを持たせてセキュアに運用

---

## 2. NoSQL Workbench：DynamoDBの設計・クエリ確認

AWS DynamoDBを使う際、**構造の把握や試験データ投入に便利**です。

- テーブル定義（PK / SK / GSI）をGUIで確認・設計可能
- クエリの構造確認やレスポンス確認もGUIでできる
- DynamoDB Local と接続して試験環境構築

### ✅ Tips
- GSIの設計時に `アクセスパターン視点` で確認できる
- データ投入テンプレートをJSONで管理 → 再利用可能

---

## 3. Docker：開発環境をローカルに再現

以下の構成を `docker-compose` で立ち上げ、**常に同じ環境で動かせるように**しています。

```yaml
services:
  backend:
    build: ./backend
    ports:
      - "8080:8080"
    env_file:
      - .env
  dynamodb:
    image: amazon/dynamodb-local
    ports:
      - "8000:8000"
npm installでエラー：ERESOLVE unable to resolve dependency treeが出た

# はじめに
Reactでガントチャートアプリを作成しています。` gantt-task-react `というライブラリを使おうとしたところ、インストール時にエラーが発生しました。

### エラー内容
```
npm error code ERESOLVE
npm error ERESOLVE unable to resolve dependency tree
```

# 解決策
インストールコマンドに以下のどちらかを追加することで、解決できました。
- `--force`
- `--legacy-peer-deps`

### 実際に成功したコマンド
```
npm install gantt-task-react --legacy-peer-deps
```

## エラーの原因
` gantt-task-react `の依存関係が、現在のReactのバージョンと合わなかったことが原因のようです。
私のプロジェクトでは` react@19 `を使っていたのですが、このライブラリは` react@18 `までの対応が前提のようでした。そのため、依存関係の解決に失敗していた可能性があります。

## コマンドの違い
- `--force`
依存関係の不整合があっても**強制的にインストールを進める** オプションです。

https://qiita.com/a999/items/7bf2d732414ca9bd7fa5

- `--legacy-peer-deps`
**peer dependencyのチェックを無視** して、インストールを進めるオプションです。古いライブラリやメンテナンスが追いついていないものに対して有効です。

https://zenn.dev/minamiso/articles/78b22716f3338d

## おわりに
依存関係について知るいい機会になりました。
ライブラリの対応状況やReactのバージョンについて確認することが大切だと思いました。

# JISOUのメンバー募集中！
プログラミングコーチングJISOUでは、新たなメンバーを募集しています。
日本一のアウトプットコミュニティでキャリアアップしませんか？
興味のある方は、ぜひホームページをのぞいてみてくださ！
▼▼▼

https://projisou.jp
第一話：神樹の根と幹　私たちの日常に息づく民法

> ※本記事は「星型森モデル」シリーズの第1話にあたります。  
> 法とAIの未来、そして大和の魂を見つめる思索の旅へようこそ。  
> ▼全体構成と他の記事はこちらからご覧いただけます：  
> [🌲星型森モデル ─ 目次・ナビゲーション]
https://qiita.com/chenglaia24/items/55f4cae5be93d25f4e2f

📝 第一話：神樹の根と幹 ― 私たちの日常に息づく民法 ―


---


> 本稿では、「民法」を一本の神樹に見立て、その法体系の幹・根を直観的に理解することを目的とします。
民法は、私たちの生活に最も密接した「私法」として、契約・所有・家族など多岐にわたる規律を担います。
この稿を通じて、民法の世界がどのような価値観に支えられ、どのように構造化されているかを俯瞰してみましょう。




---


■ 民法とは何か ― すべての私的関係の根

民法は、国家と個人の関係ではなく、「個人と個人の間」の関係を定める法律です。
それは、契約を交わすとき、物を所有するとき、家族としての関係を築くときなど、日々の営みに深く根付いています。

民法は「私法」の根幹であり、その条文の背後には、自由・自己責任・契約の拘束力といった理念が息づいています。
この根は、法体系の大地に深く根を張り、社会に「予測可能性」と「公正」をもたらしています。


---

■ 幹となる理念 ― 神樹の芯にあるもの

この神樹を支える幹には、以下のような柱があります：

契約自由の原則：自分の意思で契約を結び、その内容を定める自由

所有権絶対の原則：自分の財産を自由に使い、処分できる権利

過失責任主義：他者に損害を与えたとき、故意または過失があれば賠償責任が生じる


これらは民法の根本的な価値観であり、枝葉にあたる個別のルールを支える大黒柱です。


---

■ なぜ私たちの暮らしに必要なのか？

一見すると、民法は日常から遠い存在に感じるかもしれません。
しかし、スーパーで商品を買う「売買契約」、部屋を借りる「賃貸借契約」、親族との相続問題など、
私たちは民法の規定の中で日々行動しています。

法は、対立を未然に防ぎ、秩序と信頼を守る道具です。
そして民法は、そのもっとも身近な“道具箱”なのです。




---


> 次回は、民法の「枝葉」、すなわち総則から債権、物権、家族法に至る具体的な体系を視覚的・構造的に把握します。
各制度がいかに幹から派生し、どのように有機的に繋がっているかを、神樹の枝に喩えて読み解いていきます。




---

✨ 次回予告

> 第二話「民法の枝葉 ― 体系と構造を可視化する ―」
契約・所有・親族……神樹の枝葉が私たちの暮らしにどう繋がっているのか、体系という視点から紐解きます。


---
jquery タグの編集と削除

# タグ 作る仕組み

```php:
 文字が入力されたら、
 → カンマつける → 配列に入れる
 → 配列からタグを取り出すとき、dataを<span>にして表示

 タグにするためには、mapとsomeが必須。
```

```php:
 # タグの登場人物たち
 　・タグ新規作成する、入力formにいるやつ : "id = tags"
   ・タグをばつボタンで消す時の、ばつボタン : remove-tag
   ・タグを作った時の、タグにつけるid : tag-idx
   ・タグdataを入れる配列 : s.tags
    配列中身 = ["頑張り屋", "遅刻", "静か"]
   ・編集する時の、タグの入力form : edit-tags
   ・タグの色出力用の変数 : tagColors
   ・タグの色と色を決める配列 : hue
  

  タグを新規作成・更新するとき　必ずtrim使う
 const tagsInput = $("#edit-tags").val().trim();
 const tagsInput = $("#tags").val().trim();

  data加工  : split
 → カンマ付け足す split(",")
 split使う必要性 : タグを作ったら配列に入れたくて、配列に
 入れるには、カンマをつけないといけないから

  タグが空欄でも、登録できるようにし、登録後空欄削除 : Boolean
 filter(Boolean) : [];

  tagがあったらカンマつけて配列に入れ、タグがなかったら空欄でタグ登録
  const tags = tagsInput ? tagsInput.split(",").map(t => t.trim()).filter(Boolean) : [];

   タグは親に紐付け、タグは子供、タグ以外を親にする
  e.stopPropagation();
  → ボタンを押した時、親を加工しないよう設定

   タグを指定し指定したタグを消す・更新するとき使う : closest
  ❌ボタンのタグを指定
  $(this).closest(".tag");

   タグを消す時、tagのidとテーブルidを探す
  const id = parent.data("id");
  const tagIdx = parent.data("tag-idx");

   指定したタグのみ消したいから、
  テーブルidとタグidを指定し、タグ削除
  data[id].tags.splice(tagIdx, 1);

   タグを消したら、検索画面のタグも反映されるようにする
  renderTable($("#search").val());

   span : タグはspanで作って一個ずつ表示
  タグ1個 : <span class="tag">田舎</span>
  配列にたくさん入ったタグ 
  → "<span>田舎</span><span>都会</span><span>ちょい都会</span>" 

   タグをたくさん配列に入れる時、タグは加工しないと配列に
  　入れられない
  `).join("") : ""}

   タグの表示方法を指定 + ❌ボタン追加
  function renderTable(filter = "") {
  <span class="tag" data-id="${i}" data-tag-idx="${tagIdx}" style="background-color: ${getColorForTag(tag)};">
                ${tag} <button class="remove-tag">×</button>
              </span>
  
  dataが配列にたくさんあるとき、使う : some
  どれか一個でもtagに当てはまってたら
   → s.tags.some

  変数に文字があったら : .includes()

   調べる .filter
  const lowerFilter = filter.toLowerCase();
  タグも調べたいから、toLowerCase();追加

  変数からdataを読み込む・調べるとき、
   .includesと.filterはセットで使う
   s.city.includes.filter
  
   タグも読み込みたいから、大文字小文字区別しないで読み込み、
  　　調べるよ
  s.city.toLowerCase().includes(lowerFilter) ||

  タグを使いたい時、タグとタグ以外の全部の変数に適用 : toLowerCase()
  目的 : こうしないと、タグが使えるようにならない
  意味 : 大文字も小文字も区別しない
  s.name.toLowerCase()
  s.city.toLowerCase()
  tag.toLowerCase()

   タグ読み込むわよん
  (s.tags && s.tags.some(tag => tag.toLowerCase().includes(lowerFilter)))
        )
        .map((s, i) => `

  色をランダムで出す : Math.floor(Math.random() * 360)

  サイズ指定
  hsl(${hue}, 70%, 60%)
```

# code全文

https://qiita.com/k8p4tw/items/89dd9956048792e035aa
正規分布とサイコロ【日記】

```Python
# Program Name: coin_flip_simulation.py
# Creation Date: 20250606
# Overview: Simulate repeated coin flips and analyze the distribution of "heads" count
# Usage: Run to visualize how binomial distributions approach a normal shape as trials increase

# -------------------- Install Required Libraries --------------------
!pip install matplotlib numpy --quiet

# -------------------- Import Libraries --------------------
import numpy as np
import matplotlib.pyplot as plt

# -------------------- Parameters --------------------
n_flips = 30            # Number of coins per trial
n_trials = 100000       # Number of repeated trials
target_heads = 18       # Target number of heads to observe

# -------------------- Simulation --------------------
# Each trial: sum of n_flips fair coin tosses (1=Heads, 0=Tails)
results = np.random.binomial(n=1, p=0.5, size=(n_trials, n_flips))
heads_counts = results.sum(axis=1)

# -------------------- Calculate Probability --------------------
count_18 = np.sum(heads_counts == target_heads)
prob_18 = count_18 / n_trials

# -------------------- Visualization --------------------
plt.figure(figsize=(10, 6))
bins = np.arange(-0.5, n_flips + 1.5, 1)
plt.hist(heads_counts, bins=bins, color="skyblue", edgecolor="black", label="Simulation")
plt.axvline(x=target_heads, color="red", linestyle="--", label=f"{target_heads} heads")
plt.title(f"Distribution of 'Heads' in {n_flips} coin tosses per trial")
plt.xlabel("Number of Heads")
plt.ylabel("Frequency")
plt.legend()
plt.grid(True)
plt.tight_layout()
plt.show()

# -------------------- Output --------------------
print(f"Total trials        : {n_trials}")
print(f"Target heads (x = {target_heads}) observed {count_18} times")
print(f"Estimated P(X = {target_heads}) ≈ {prob_18:.5f}")

```
React Router を使ったアプリのテストでエラー【'React.useContext(...)' as it is null】が出た

## エラー内容

React Router を使ったコンポーネントをテストしようとしたとき、次のようなエラーが出ました。

```
TypeError: Cannot destructure property 'basename' of 'React.useContext(...)' as it is null
```

これはどういうことかというと、React.useContext(...) の中で読んでる RouterContext が null になっています。

**React Routerのコンポーネントは親に Router がいないと動けない構造**なので、
Context が提供されない＝null → 分解しようとしてエラーになります。

## エラーの原因

`Link`, `Route` などは内部で React Router の Context（`RouterContext`）を使っていますが、テスト時に `BrowserRouter` や `MemoryRouter` でラップしていないと `useContext` が null を返します。そのため Node.js には `TextEncoder` がなく、必要なら polyfill する必要があります。


## 解決策まとめ

### 1. Router でラップする

```tsx
import { MemoryRouter } from 'react-router-dom';

render(
  <MemoryRouter>
    <Sidebar ... />
  </MemoryRouter>
);
```

### 2. TextEncoder を polyfill
Node.js には最初から global.TextEncoder がないので、
`util.TextEncoder`を使って、グローバルに追加する必要があります。


```ts
//Node.js が標準で持っている util モジュールから TextEncoder を取り出し
import { TextEncoder } from 'util';
//ブラウザ環境で本来使えるはずの global.TextEncoder にセット
global.TextEncoder = TextEncoder;
```

## 参考
https://qiita.com/kikotkk/items/9a846b931d5e9959aece
技術力を高めるために大切な「基礎力」と業務のバランス

## はじめに

最近、あるエンジニアの話を聞いて印象に残ったことがある。

> 技術力を高めるには、基礎力が必要。しかし、業務には期限があるため、基礎を学ぶ時間が取れないことが多く、結果的に知識の土台が固まらずに苦労する。

これはまさにその通りだと思った。そしてこれは、エンジニアに限らず、どんな職業にも共通する話だと感じた。

## 業務では結果が求められる

仕事とは「価値を提供すること」である以上、当然ながら業務ではスピードと結果が求められる。

* わからなくても手を動かす
* 一度やってみてから考える
* やりながら学ぶ

こうしたスタンスが求められる場面も多い。
そのため、「理解してから実行する」という流れでは間に合わず、学ぶ前にコミットする状況がよくある。

## なぜ基礎が大切なのか

とはいえ、長期的に見るとやはり基礎力の差が成長の差になる。
なぜなら、基礎力とは単なる知識の有無ではなく、「応用力や判断力の土台」になるものだからだ。

* エラーの原因を素早く特定できる
* 抽象度の高い課題に対してもアプローチできる
* フレームワークやライブラリの内部動作を把握できる

こうした力は、基礎の深掘りがあるからこそ発揮される。
しかし現実として、業務内で基礎力を丁寧に磨く時間は限られている。
だからこそ、業務外の時間をどう使うかが重要になる。

## おわりに

技術力を高めるには、生産力と基礎力のバランスを取ることが大切だと思った。

短期的には「とにかくやる力（生産力）」が必要であり、
長期的には「なぜそうなるのかを理解する力（基礎力）」が効いてくる。

このバランスを意識しながら、戦闘力を高めていきたい。
Git LFSを使わずにアプリ開発できないの？


# はじめに
以前、Git LFSの制限によって、モデルを縮小した話をした。

https://qiita.com/ncworking/items/9db57db0fcd64f82b3d0

その後、紆余曲折あり、そこそこ長い時間を経て、進捗があったので、書き残しておこうと思う。
タイトルに対する答えを先に言っておくと『できる』。
もちろん **無料** で。

# 経緯
前述したモデルを使ったWEB アプリのUIを少しいじりたいと思い、HTMLとCSSを書き換えてGitHubへプッシュをした。
そこで、また [Git LFS問題](https://qiita.com/ncworking/items/9db57db0fcd64f82b3d0)が起きることとなった。

現在、私は以前使っていたAIチャットボットとは違うAIチャットボットを使っている。（なんとなく気が合うから）
なので、今回は以前と違うAIチャットボットに対して、この問題を投げかけてみた。プロンプトとしては、 **ただエラーコードを投げただけ** 。
だいぶ時間が経っていたので自信がなかったので、以前と同じ問題が起きているのだということを確認したかっただけだったのだが、今使っているAIチャットボットはより親切に回答してくれた。
エラーの説明だけではなく、解決策が3点。

> 候補1. LFSを使うのをやめる
> 候補2. 外部ストレージを使う（推奨）
> 候補3. GitHub LFSを追加購入

候補1については、使わないとプッシュできないサイズのモデルがあるため、除外。候補3についても、あくまで無料の範囲で良いレベルなので除外。
（そもそも候補1と3については、以前に実行または検討した物である。）

ここで初めての話題が、**候補2**だ。
この手段、なんとなくある気はしていたが、きっと難しいのだろうと思って調べていなかった。しかし、今使っているAIチャットボット君とならやっていける気がしたので、やってみることにした。

# どうやってやる？
結論から言おう。めちゃくちゃ簡単だった。
GoogleDriveにモデルを移して、`.py` ファイルを少し書き換え、`requirements`にほんの少し追記するだけ。
なんで今までやらなかった？ってレベルだ。存在の気配を感じていたなら、サクッと調べてやっておけばよかった。

## 具体的には？

1. Google Driveに`.h5`ファイルを移動する
   ※ファイルはURL共有で閲覧可能なように設定しておく

2. コマンドラインで以下を実行
    ```
    pip install gdown
    ```

3. .pyファイルの最初に以下のコードを追記する
    ```python
    import gdown

    model_path = "model.h5"
    if not os.path.exists(model_path):
        url = "https://drive.google.com/uc?id=..."
        gdown.download(url, model_path, quiet=False)
    ```

4. `requirements`ファイルに以下を追記する

    ```
    gdown
    ``` 

5. GitHubにプッシュ
6. おわり。

サクサクとAIチャットボット君が吐き出してくれて、とりあえず試してみたら、すぐにできた。
あまりにもあっけないので、自分の言葉でちゃんと解説を残しておこうと思う。

### コード解説
```python
# デプロイの時に動くよ
import gdown # Google Driveをpythonで扱うためのライブラリ

model_path = "model.h5" # 扱いたいファイル名はmodel.h5
if not os.path.exists(model_path): # デプロイした時にmodel.h5ファイルがなかった場合に動いてね 
    url = "https://drive.google.com/uc?id=..." # ファイルの在処はここ！
    gdown.download(url, model_path, quiet=False) # model.h5って名前でダウンロードしてきてね
```
いや、解説しても「以上！」って感じがすごい……
めちゃくちゃ頑張ってモデル縮小したけど、大きいままでできたのね……

# 結論
**Git LFSが使えなくても、無料で大きいモデルを使ってアプリ開発できる！**
ファイルをクラウド上に置いておけるのは、ローカルのメモリ的にもありがたい。
そして、今回はGoogle Driveに慣れているのでこれで実行したが、他にも無料でできる同じ対応はあるようだ。
結局、手を動かしてみないと知識はつかないという事を学んだ。

**「やれるかも？」はだいたいやれる。**

チワワっぽい犬を猫と判定してしまうモデルを、近いうちに差し替えようと思う。当初の目的だった、UIの改善もしようね。
10 進数から M 進数に変換



前回に引き続き、進数の変換問題！2進数へ変換するコードを応用して10進数から何進数にでも変換できるようにできた！

<br>

## 問題概要

- 10 進数で表された整数 N, M が与えられる。
- N を M 進数に変換して出力する。

<br>

入力例：

    10 2

出力例：

    1010

<br>

https://paiza.jp/works/mondai/loop_problems2/loop_problems2__conv_nbase

<br><br><br>

## ✅OK例１：
```js
const rl = require('readline').createInterface({input:process.stdin});


rl.once('line', (input) => {
    const [N, M] = input.split(' ').map(Number);
    
    
    const base = [];
    for(let temp = N; temp > 0; temp = Math.floor(temp / M)){
        base.push(temp % M);
    }
    
    console.log(base.reverse().join(''));
    
    rl.close();
});
```
→前回のコードを応用（２→ M）

<br><br>

## ✅OK例２：
```js
const rl = require('readline').createInterface({input:process.stdin});


rl.once('line', (input) => {
    const [N, M] = input.split(' ').map(Number);
    
    console.log(N.toString(M));
    
    
    rl.close();
});
```
→`.toString(進数)` で、その進数の文字列へ変換。

<br><br>

## 📝気づきメモ

- M進数でも、２進数へ変換するときと同じで、
✅ Mで割り続ける
✅ 余りを記録する
✅ 逆順に並べる

　という方法で変換できるとわかった。

- `.toString(radix)`で変換するのがすごい楽だった。

<br>

## まとめ
進数変換は最初難しそうに見えるけど、変換方法がわかれば、そこまで難しいコードではない。あと、魔法の`.toString()` を使ってしまえばいい！



<br><br><br>[僕の失敗談(´;ω;｀)と解決法🐈](https://paizabeginner.wordpress.com/2025/06/06/paiza%e3%81%a7%e5%9f%ba%e6%9c%ac%e3%83%9e%e3%82%b9%e3%82%bf%e3%83%bc%ef%bc%9a10-%e9%80%b2%e6%95%b0%e3%81%8b%e3%82%89-m-%e9%80%b2%e6%95%b0%e3%81%ab%e5%a4%89%e6%8f%9b/)
data書き換え　変数名

```php:
  #name	  #input-name（名前入力欄）

  #city 	#input-city（都市入力欄）

 #tags （タグ入力欄） 	  #input-tags

 #addForm	#form-add-entry（追加フォーム）

 #editForm	#form-edit-entry  （編集フォーム）

#edit-id	#input-edit-id   （編集ID（非表示））

#edit-name	#input-edit-name  （編集：名前）

#edit-city	#input-edit-city  （編集：都市）

#edit-tags	#input-edit-tags  （編集：タグ）

#search	#input-search-keyword  （検索）

#load-table	  #table-entries-body（データ表示部）


現在の名前	推奨名	

tagColors	tagColorMap	

tags(map内)	tagList

tagsInput	inputTagString

getColorForTag	generateTagColor

getData	loadEntriesFromStorage	

setData	saveEntriesToStorage	

renderTable	 renderEntriesTable	

data	     entries か students

e       	event

filter	searchKeyword

rows	tableRowsHtml

link	downloadLinkElement

downloadCsvBtn	btnDownloadCsv
```
pytorchで雑に再現性を保証する

いちいち関数書くのも面倒だし，雑にやるなら pytorch-lightning の関数を使うのが便利．

```Python
from lightning import seed_everything

SEED=42
seed_everything(SEED)
```

とりあえず2回学習を回して同じ結果が得られることを確認しましょう．
もし同じ結果が得られない場合には他の設定が必要です．

# 参考文献
- https://lightning.ai/docs/pytorch/stable/common/trainer.html#reproducibility
EMLメールをPDF文書として保存するには？

Thunderbird、Outlook Express、DreamMail、eM Client、Entourage、Apple Mailなどのメールプログラムを使用している場合、コンピュータ上には複数のEMLファイルが存在します。多くのメールクライアントは、個々のメールに関する情報を保存するためにEMLファイル拡張子を利用しています。EMLファイル形式には、メッセージの宛先、CC、BCC、件名、その他の添付ファイルが含まれます。また、1つ以上の添付ファイルも存在します。
多くの人がEMLファイル拡張子のメールファイルをPDF形式に変換する方法を探しているようです。大量のEMLメールボックスデータをファイルを欠落させることなくPDF形式で保存するのは難しいかもしれません。このブログでは、読者の皆さんにこの問題を解決し、EMLメールをPDF文書として保存するための最も簡単な方法をご紹介します。

EMLファイルをPDF形式で保存する

1つまたは2つのEMLファイルをPDFで開く必要がある場合は、この手動の方法が最適です。EMLをPDFにエクスポートするには、いくつかの基本的な手順に従うだけです。
• 必要なEMLファイルを選択し、マウスの右ボタンでクリックします。
• Word文書で開く
• これで、EMLファイルがWordでアクセス可能になります。ファイルオプションをクリックし、「名前を付けて保存」をタップします。その後、PDFファイルを保存する最適な場所を選択します。
• 最後に、ファイル名を変更し、「ファイルの種類」メニューから「PDF」を選択します。「保存」をクリックして完了です。
• 上記の手順を実行すると、個々のEMLファイルがPDFファイルとして保存されます。各EMLファイルについて、同じ手順でPDFファイルとして保存します。

ただし、この方法は多数のEMLファイルを一度に移動するには適していません。EMLファイルが多数ある場合、手作業で処理するのは非常に時間がかかります。専門的な環境で作業している場合は、この方法は役に立ちません。その場合は、次のセクションに進み、EMLファイルをPDFとして保存するための迅速かつ安全な方法を試してみてください。

EMLファイルをPDF文書に保存する自動化ソリューション

この記事では、個々のEMLファイルをPDF形式で保存するための効果的な手動の方法について説明しました。一括でEMLファイルをPDF形式に変換するには、Softaken [EML to PDF Converter](https://www.softaken.com/jp/eml-to-pdf-converter)が最適です。このアプリケーションを使用すると、1回の処理で大量のEMLファイルを保存できるため、貴重な時間を節約できます。このソフトウェアは、EMLメールをPDF文書として効率的に保存するための信頼性の高い方法です。このウィンドウベースのアプリケーションは、Windows 10、8、7、8.1、Vista、XPなど、すべてのバージョンに対応しています。添付ファイルの保存に関しては、添付ファイルをPDFに埋め込むか、添付ファイルを個別に保存するかの2つのオプションがあります。さらに、EMLメールごとに1つのPDFファイルを保存するか、すべてのEMLファイルを含む1つのPDFファイルを作成するかを選択できます。
高度なフィルターオプションを使用して、指定した日付範囲、特定の件名、特定の送信者メールアドレスまたは受信者メールアドレスを含むEMLファイルを保存することも可能です。さらに、操作手順の理解を容易にするために、すべてのユーザーにプログラムのデモ版が提供されています。デモ版を使用すると、最大25個のEMLファイルをPDF形式でコンピューターに無料でバックアップできます。

EMLファイルをPDF形式に変換する際のソフトウェアの最も重要な機能

1. EMLファイルの既読/未読状態を維持し、EML形式をベースにしたすべてのメールクライアントをサポートします。
2. EMLファイルをプレビューできるため、転送プロセスを開始する前に確認できます。
3. EMLメールを一括でPDFファイルに瞬時に変換できます。
4. 変換プロセス後にログレポートを保存でき、Windows 8、9、11、XP、Vistaなど、すべてのバージョンのWindowsオペレーティングシステムと互換性があります。
5. EMLファイルは、この機能が提供する「ファイルの選択」または「フォルダの選択」オプションを使用して読み込むことができます。

まとめ

EMLメールをPDF文書として保存する際に発生していた問題は、このブログを読めば解決できるでしょう。保存・エクスポートするEMLファイルの数に応じて、手動または自動のいずれかの方法でEMLファイルをPDF形式に変換できます。
Firebase App Hosting バックエンド削除の仕方について

# はじめに
FirebaseへApp Hostingでデプロイ後バックエンドの削除について時間を要したため、デプロイ手順も含めて記事にします。
削除に関しては公式ドキュメントに載っているとおり、CLIでの削除が必要なようです。

```
firebase apphosting:backends:delete BACKEND_ID --project PROJECT_ID
```
このBACKEND_IDが分からず、解決に時間を要しました。
結論は名称がIDも兼ねているようでした。
そもそもHostingとApp Hostingの違いについては下記方の記事がとても参考になりました。

https://zenn.dev/cloud_ace/articles/firebase-apphosting-deploy

## App Hosting手順
先にApp Hostingはプランを無料版から従量制に変更しなければできないようなのでプランのアップグレードが必要です。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3707255/274f8f18-2a75-4c96-9eae-0bb05fd17054.png" width=70%>

プランを変更しアカウントを作成

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3707255/bd1b4a72-ba65-4a3a-81fe-c6618a293f82.png" width=70%>


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3707255/10984760-fdac-4f22-b63d-5a063c34e128.png" width=70%>


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3707255/36df0697-e1b4-41cd-9a22-972bbfa4f98f.png" width=70%>


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3707255/3ee01bf4-239b-4512-b5b8-fed9d5d997d3.png" width=70%>


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3707255/13cd1549-fece-4b75-9a30-7b3f322c9fa2.png" width=70%>

ここからUIでApp Hostingでデプロイしていきます。
画像の通り進めて完了します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3707255/521e542e-1fec-44da-b598-4aefd7295667.png" width=70%>

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3707255/4ca90d19-b46c-46dd-85f4-495c5d38811c.png" width=70%>


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3707255/c4f56663-ec2e-492c-a142-172dac548c2c.png" width=70%>

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3707255/d25021be-d6d6-44fb-ab5c-656115aa5849.png" width=70%>

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3707255/f61203b8-932a-4cb5-8263-cd558bbb731a.png" width=70%>

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3707255/eba9cdc0-5d88-4ee7-8064-16919cc3558e.png" width=70%>


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3707255/967dd524-daf1-4e0b-8050-b07baa675f3b.png" width=70%>


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3707255/72e6be1c-a890-4393-be73-fb7b0892a436.png" width=70%>

これでデプロイが完了。
これ以降、設定したGithubブランチへpushが行われると自動でデプロイされるようになります。



### CLIでのバックエンド作成コマンド
またCLIからのバックエンドを作成する方法もあり、以下のコマンドを実行するとUIで行ったことと同じような内容の質問をされるので、その都度選択して実行すれば完了します。
```
firebase apphosting:backends:create --project PROJECT_ID
```

### CLIでのBackend一覧表示コマンド

下記のコマンドでBackend一覧が表示されます。
一覧のBackendが削除で必要なBACKEND_IDになります。

```
firebase apphosting:backends:list --project PROJECT_ID
```


# 参考

https://firebase.google.com/docs/app-hosting/configure?hl=ja


# おわりに
デプロイが成功せず色々試しているうちに、増えたバックエンドを消そうとしたら、Hostingと違って削除方法が分からず・・・課金せずに済んでよかったです。

<br>


# JISOUのメンバー募集中！
プログラミングコーチングJISOUでは、新たなメンバーを募集しています。
日本一のアウトプットコミュニティでキャリアアップしませんか？
興味のある方は、ぜひホームページをのぞいてみてください！
▼▼▼

https://projisou.jp
勢いと思いつきで駆け抜ける！僕の「vibecoding」体験記 〜Clineでアプリを色々作ってみた〜

## イントロダクション

Clineいいよね、という話が社内で挙がっていたので少し触ってみたら、なかなかに良く、色々と思うところが出てきたのでテキストにまとめてみることにしました。

本題に入る前にClineに関する前提知識を入れるのに良い2記事を紹介。

bazzってるだけあって刺さるセンテンスが多い。
https://zenn.dev/mizchi/articles/all-in-on-cline

上記事に対するアンサーライティングっぽい感じですが、エモーショナルな上記事に対して、Clineの行動原理についてわかりやすく説明してくれている。「実装上の工夫とテクニック」の章はCline使っていくにあたって大いに参考なる。
https://zenn.dev/codeciao/articles/6d0a83e234a34a

ちなみに人の解きたい課題に対して、自然言語で指示を与えて、LLMにコーティングさせることを「vibecoding（ヴァイブコーディング）」というらしいです。
https://ja.wikipedia.org/wiki/%E3%83%90%E3%82%A4%E3%83%96%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0

## Clineでアプリ色々作ってみた

1つ30分ほどでサクッと作れました。

Clineの利用自体はVSCodeにインストールして、OpenAI等のAPIを設定するだけで出来るので割愛します。迷ったときに先人の備忘録をみればいい。
https://qiita.com/SatouHa/items/f963d0a68efb03e1d0aa

①画像共有アプリ「めもシェア！」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3566513/b00f3fe6-8038-4578-bc1b-af3bf2b857f8.png)

▼主な機能
スマホなどで撮影した画像（HEIC形式も対応！）を複数枚アップロード可能
画像のEXIF情報からGPSデータを抽出し、緯度経度を取得
取得した位置情報を元に、Plotlyを使って地図上にピンで表示
ピンをクリックすると画像が拡大表示されるモーダルUI
アップロード済み画像の一覧表示・削除機能

▼vibecoding的ハイライト(作:gemini)
Pythonの軽量フレームワークFlaskなら手軽に始められる！と思い、早速開発スタート。画像処理にはPillow、EXIF情報取得にはpiexifライブラリを採用しました。特にGPS情報の抽出ロジック (get_exif_location関数) は、piexifを優先しつつ、取得できなければPillowでフォールバックするという二段構えに挑戦。試行錯誤の末、うまく緯度経度が取れた時の達成感はひとしおでした。

②妹系AIチャット

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3566513/4cdea0f0-f19a-448a-aa5f-2fdb850bf3b8.png)

▼主な機能
ユーザーが入力したメッセージに対して、AIが応答を返すチャットインターフェースを提供します。 
AIのキャラクター（ペルソナ）や応答スタイルを、システムプロンプトを編集することでカスタマイズ可能です。 
使用するAIモデル (例: "gpt-3.5-turbo") を選択できます。 
AIの応答の多様性（temperature）を調整できます。 
チャットの会話履歴をセッション中に保持し、連続した会話が可能です。 
会話履歴をリセットする機能があります。

▼vibecoding的ハイライト (作:gemini)
手軽なAIチャットアプリをFlaskで構築！OpenAI API (gpt-3.5-turboなど) を活用し、ユーザーとの対話を実現しました。 特にこだわったのは、AIのキャラクター設定です。システムプロンプトをユーザーが自由に変更できるようにし、「優しい妹キャラ」といった具体的なペルソナをAIに与えることで、より親しみやすいコミュニケーションを目指しました。会話履歴をセッションに保存することで、文脈を理解した自然なやり取りが可能です。 エラーハンドリングも実装し、API呼び出し時の問題にも対応できるようにしています。


私が作ったみたいな文章が出来てるけど手、全く動かしてない（笑）

実際、主要な機能は最初のプロンプトで大体形成され、①はGPS情報の取得とアップロード処理の動作で②はプロンプトログの管理（リセット処理の不具合）でエラーを吐いたので、数回の対話で仕上がりました。

## 触ってみた感想

早い。生成されたコードの可読性もなかなか良い。SLAを強く求めないものであれば、全然これでいい。内輪利用やモックアップ用途であれば充分すぎる。モックアップ作成でもうお金取れない。

市民開発的なノリでも使えるように思う。位置づけ的には開発支援ツールだと思うが、ノーコード（ローコード）ツールとしての役割にも近い。がっつり書けるわけじゃないけど、ある程度は知ってる位のレベル感のコーティングスピードを爆上げしてくれる感じ。

今回、機能の作りこみはしていないが、機能退行や過剰修正に最低限気を配っていればいいので、GUIのノーコード（ローコード）ツールよりもある意味、自由度・操作性ともによいといえる。Cursorよりエラー修正時の機能退行・過剰修正は少ないように思えた。

## まとめ

ClineはAIすごいぞ芸人に容易に扱えるものではないが、善良なAIインフルエンサーによって市民開発の裾野が広がっていく可能性を感じる。一方で商用稼働コードをいじるにはコードレベル、サービス品質面でどう担保するのか？だったり、稼働時にコードや変数をガンガン学習するのでセキュリティガバナンス上の整理だったり、面倒臭そうな課題もあるので、大手を振って使いはじめる雰囲気になるのにはもう少し時間がいるようにも思える。当面はコードアシスタント的な役割を担うか。

「人がコーティングをしなくてよくなる」未来に対してどのような現在、どの地点にいるのかということについて、各々見解は異なるかと思いますが、手作業によるコーティングの仕事量が削減する代わりに、エンジニアに求められる役割が「問題を定義して、解決策を設計して、構築する」ことへ変化していくことは規定の話、だと言えるのではないかと感じました。
[Linux][command] 制御_read

# readコマンド
```terminal
$ read [オプション] 変数名
```

| オプション       | 由来              | 説明                                 |
| :---------- | :-------------- | :--------------------------------- |
| `default`   | read variable   | 標準入力から1行読み込み、変数に代入                 |

# 使用例
## 1. 標準入力からの読み取り

ユーザーからキーボードでの入力を受け取る方法です。

```bash:/greeting.sh
#!/bin/bash

echo -n "名前を入力してください: "
read name
echo "こんにちは、$name さん！"
```

### 実行例:

```terminal
$ ./greeting.sh
名前を入力してください: 太郎
こんにちは、太郎 さん！
```

## 2. リダイレクトを使ったファイルからの読み取り

ファイルの内容を1行ずつ読み取るには、`while read` ループと `< ファイル名` を使います。

```bash:/read_file.sh
#!/bin/bash

while read line
do
  echo "読み取り内容: $line"
done < sample.txt
```

### 実行例 (`sample.txt` の内容):

```txt:sample.txt
りんご
バナナ
ぶどう
```
### 実行結果:
```terminal
$ ./read_file.sh
読み取り内容: りんご
読み取り内容: バナナ
読み取り内容: ぶどう
```


## 3.パイプからの読み取り


```bash:read_pipe.sh
#!/bin/bash

cat sample.txt | while read line
do
  echo "パイプ読み取り: $line"
done
```

### 実行例（`sample.txt` の内容）:

```txt:sample.txt
東京
大阪
名古屋
```

### 実行結果:

```terminal
$ ./read_pipe.sh
パイプ読み取り: 東京
パイプ読み取り: 大阪
パイプ読み取り: 名古屋
```


# Ping-t
- [4631_read](https://mondai.ping-t.com/question_subjects/32/question_sessions/33502345/progressing_questions/513098360?result=true)
- [4942_| while read](https://mondai.ping-t.com/question_subjects/32/question_sessions/33502345/progressing_questions/513098370?result=true)
- []()
【SpringBoot】【トラブル】MyBatis経由でSQLが実行されているのかわからない問題の解決方法

## SpringBootで実装

こんにちは！私はSpringBootとMyBatisでの実装で色々手こずっている初心者です。今回はそんな私が直面した問題について共有します。

## デバッグできなくてMyBatisのインタフェースからマッパーを呼び出しているのかわからない問題

MyBatisのマッパーはデバッグできません。なのでMyBatis経由で実際にクエリが実行されているのかが全く分かりません。

そんなわけでMyBatisを使うときは`apprication.properties`に以下の２行を追加しましょう

```
logging.level.com.example.demo.mapper=DEBUG
logging.file.name=app.log
```

こうすることでMyBatisのマッパー経由でのクエリをコンソールやログファイルで確認することができます。上の`com.example.demo.mapper`の部分はmapperのインタフェースがあるパッケージ名を指定しましょう。

MyBatisのMapperのXMLはコンパイル時にmapperパッケージにあると読み込まれないことから以下の設定を`apprication.properties`に追記して【プロジェクト名】/src/min/resourcesの下のmapperディレクトリに集約しましょう

```
mybatis.mapper-locations=classpath*:/mapper/*.xml
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280363/8865921b-e61c-4df0-baee-9e24caa52c93.png)
VAST 4.3までの4.x系の更新差分

最近VASTの仕様を調べる時、自分の記事をいちいち探さなくても生成AIに聞いたら答えが返ってくるようになりました。便利。

![スクリーンショット 2025-06-06 11.09.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6892/0b31ee55-6633-46e0-a609-af915c2c0aee.png)

# VAST 4.3までの4.x系の更新差分
## VAST4.0

* SSAIのサポート
* メザニンファイルの対応
* ユニバーサル広告ID `<UniversalAdId>` のサポート
    * `adID`は各事業者が好き勝手決めていたため、それとは異なるシステム間で一意のクリエイティブID。
* 広告検証のための `<AdVerifications>` `<ViewableImpression>` のサポート
    * VPAIDは本来インタラクションに使用されるためのものなので、それの代替
    * このためのOpen Measurement(OM, OMID)の規格が策定されている
* 競合分離用の広告カテゴリのサポート
* ビデオファイルとインタラクティブファイル(SIMID)の分離
* エラーコードの追加
* 標準化された `[TIMESTAMP]` マクロの追加

## VAST4.1

* DAASTの統合
* 非VPAIDの検証開始
* VPAIDの非推奨化
* マクロのアップデート
* SSAIのヘッダーの微修正
* トラッキングイベントの追加と廃止
    * 追加: "loaded", "closeLinear"
    * 削除: "acceptInvitationLinear", "timeSpentViewing"
* AdServingIdの追加
    * クリエイティブではなく、インプレッションやトラッキングで一意のID
* クローズドキャプションファイルの標準化
* Flashの削除
* `<Survey>` の非推奨化
* ノンリニア広告の非推奨化？
* `<MediaFile>` のサポートの追加
* `<Advertiser>` にIDの追加
* `<Expires>` の追加
* `<InteractiveCreativeFile>` variableDurationを追加

## VAST4.2

* SIMIDのサポート。SIMIDはVPAIDの後継で、インタラクティブなクリエイティブを実現するために利用する。
* ClickThroughをWrapperで指定できるようになった
* プレイヤーが広告再生を行わないことを選択した場合のステータスとしてErrorCode 206を追加
* 複数のUniversalAdIDが指定できるようになった
* `<Icon>` と `<Icon ClickFallbackImages>` の更新
* AdBreakを示す新しいマクロの追加

## VAST 4.3

* マクロの管理はVASTの仕様と独立して管理するためにGithubへ移管されました
* `PLAYBACKMETHODS` の再生方法のマクロにユーザー操作なしで連続再生しているステータスが追加されました
* `<InteractiveCreativeFile>` において、これまで `<MediaFile>` は外部URLのみの指定であったが、インラインデータURIが利用可能になりました。ただしインラインデータURIはデータが小さい場合のみ利用可能であり、データが大きい場合は引き続き外部URLを利用すること。
【備忘録】pip install -r requirements.txtを実行した際のハッシュエラー対応

## 解決策
pipのキャッシュをクリアにして、pipに再ダウンロードさせる必要があるらしい。
```
cd ~/.cache/pip
rm -rf http
cd -
pip install -r requirements.txt
```

## 問題
pip install -r requirements.txtを実行するとtorchのインストールでハッシュエラーになる
ggcnnをクローンして必要なライブラリをインストールしようとしたら、こんなエラーが。
```
ERROR: THESE PACKAGES DO NOT MATCH THE HASHES FROM THE REQUIREMENTS FILE. If you have updated the package versions, please update the hashes. Otherwise, examine the package contents carefully; someone may have tampered with them.
    nvidia-nccl-cu12==2.20.5; platform_system == "Linux" and platform_machine == "x86_64" from https://files.pythonhosted.org/packages/4b/2a/0a131f572aa09f741c30ccd45a8e56316e8be8dfc7bc19bf0ab7cfef7b19/nvidia_nccl_cu12-2.20.5-py3-none-manylinux2014_x86_64.whl#sha256=057f6bf9685f75215d0c53bf3ac4a10b3e6578351de307abad9e18a99182af56 (from torch->-r requirements.txt (line 6)):
        Expected sha256 057f6bf9685f75215d0c53bf3ac4a10b3e6578351de307abad9e18a99182af56
             Got        bc6b107b7271f62dc43d83a2bf2bd5c582f7633efc1157a16ffb156402a02d0e
```
torchをインストールするときのハッシュは悪さして、見つけられませんでみたいなこと言ってるんかな。
以前からtorchをインストールしようとしてハッシュが悪さをすることがあったのでとりあえずインストールできるようにはなりました。

参考にしたサイトは[こちら](https://ems-docs.element.io/books/ems-knowledge-base/page/pip-cache-errors)
Cloudera AI - セッションのタイムアウト時間を設定する

# この記事について

Cloudera AI では、環境変数を使ってセッションのタイムアウト時間を設定します。

そのやりかたを説明します。

# 手順

## 現在の設定値の確認

セッションを起動し、 Terminal Access もしくは ノートブック上で以下の変数の設定値を確認します。

### 共通

| 変数名 | 意味 |
|:-|:-|
|`SESSION_MAXIMUM_MINUTES`   | アクティビティの有無に関係なく、セッションを終わらせる最長の時間 |
|`IDLE_MAXIMUM_MINUTES`   |  バックエンドのジョブがこの時間動かないとタイムアウトになる（ブラウザが開いていてもタイムアウト） |

### Jupyter を利用している場合

| 変数名 | 意味 |
|:-|:-|
|`JUPYTER_SERVER_TIMEOUT_SECONDS`   |  Jupyter がこの秒数動いていないとタイムアウトする |
|`JUPYTER_KERNEL_TIMEOUT_SECONDS`   | （調査中）  |

### Jupyter 上での確認例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/3ccf9ced-c6b6-44a2-a8e5-89cb698dd9da.png)

おそらく、 `JUPYTER_SERVER_TIMEOUT_SECONDS` のデフォルトの秒数（300=5分）は短いので、ちょっと触っていないとすぐセッションがタイムアウトになるので伸ばしたい、などのニーズがあろうかと思います。

## 設定値の変更

プロジェクトを開いた状態で、Project Settings を開き、Advanced タブを選択します。

![Screenshot 2025-06-06 at 16.30.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/3613e99b-f6a2-4f44-a0ef-696f3ffb7f40.png)

Environment Variables の一覧の「＋」マークをクリックします。
![Screenshot 2025-06-06 at 16.39.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/406fbe5c-a071-4bc3-879e-09a55c7afeef.png)

変更したい項目と値を設定し「Submit」をクリックします（ここでは`JUPYTER_SERVER_TIMEOUT_SECONDS`を3600秒（1時間）にのばしています）。
![Screenshot 2025-06-06 at 16.40.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/9d8db0a0-3b4e-4cfd-bd00-e71064b6bec5.png)

画面下までスクロールし、「Save Advanced Settings」をクリックします。
![Screenshot 2025-06-06 at 16.45.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/5922daeb-1786-4b09-a5e2-3ebc33ac446b.png)

以上の手順で、Cloudera AI のセッションのタイムアウト時間を設定することができ
5年目エンジニアがマネジメントを始めて1ヶ月で感じた変化と気づき

# 5年目エンジニアがマネジメントを始めて1ヶ月で感じた変化と気づき

## 背景
日系SIerに入社して5年目、今年5月から従来の開発業務に加えてマネジメント業務を担当することになりました。まだ始めて1ヶ月程度ですが、この短期間で感じた変化や気づきについて、超リアルタイムな体験談として書いていきます。

## リーダーになってから1ヶ月
5月に別部門から異動してきて、今年から4人のメンバーを受け持つことになりました。そのうち2人がほぼ新人ということで、「まさにこれからチームを作っていく重要なフェーズなんだな」と改めて実感が湧き始めました。

正直、最初は「自分にできるのだろうか」という不安の方は多少ありました。しかし、幸いなことにその2人は非常に素直で、週次で私と行う1on1の提案にも快く応じてくれました。まだ手探り状態ですが、定期的にコミュニケーションを取りながら良い関係性を築けているように感じています。

## 過去の自分を思い出して反省した話
マネジメントを始めてから、「自分が新人だった頃はどうだったんだろう？」と振り返る機会が増えました。

思い出してみると...正直、相当扱いにくい部下だったなと反省しています。

**当時の自分の問題行動**
- 期限に間に合わないと分かっていても、なぜか相談せずに一人で抱え込む
- タスクの期限設定が感覚的で、計画性が皆無
- 面白そうなタスクから手をつけて、重要度を無視する
- 根拠のない自信で「やります、できます！」と安請け合い

今思えば「自分ならできるはず」という気持ちと「できなかったら恥ずかしい」という気持ちが入り混じって、結果的に上司に迷惑をかけていたんだと思います。当時の上司には色々とご迷惑をおかけしました...

## 過去の経験を活かした新人との向き合い方
自分の失敗経験を踏まえて、新人メンバーには最初に以下のことを明確に伝えました。

**「責任の所在を明確にする」**
- 定時内（9:00-17:30）で終わらなかったら、それは私の責任です
- 「終わらなそう」と思った時点で、遠慮なく連絡してください
- タスクが終わらないのは、私の見積もりや期限設定に問題があるだけです

**「指示系統をシンプルにする」**
- タスクの期限と優先度は私が設定します
- 基本的にはそれに従ってもらいますが、違和感があれば素直に教えてください

これらは当たり前のことかもしれませんが、新人の頃の自分はその「当たり前」が分からなかったんですよね。

## テレワーク時代のオンボーディングの課題
うちの部門はテレワークが主体で、数ヶ月に1回しか出社しない方もいます。出社が偉いと言いたいわけではありませんが、新人からすると「顔も見たことがない人と仕事をする」のは結構しんどいのではないでしょうか。

実際、自分もコロナ禍入社組なので、入社1年目に上司と顔を合わせたのは2〜3回程度でした。今でも「名前は知っているけど顔は知らない」という人が社内に結構います。

メンバーの顔もチームの雰囲気も分からないまま仕事をするのは、想像以上に負荷がかかるものです。

**現在試している対策**
新人がいる期間は「オンボーディング月間」として、日替わりで出社してOJT形式で隣に座って仕事をする取り組みを提案しました。まだ始めたばかりですが、新人の表情や理解度をリアルタイムで把握できるのは大きなメリットだと感じています。

ここは2Q中盤まで実施予定なので、実験結果が出たら新人からフィードバックをいただこうかなと思います。

## 社内ネットワークの重要性に気づいた
5年間で様々な案件や部門を転々としてきた結果、社内の顔見知りがかなり増えました。この「顔の広さ」が、想像以上に仕事でプラスに働くことに最近気づきました。

一方で、現在の所属部門は非常に閉鎖的で、同じグループでも他チームのことを全く知らないという状況です。外の世界を知らないと認知がどんどん狭くなってしまいます。特に新人は「自分のいる場所が常識」になりやすいので、これは危険だと感じています。

**これから試したい取り組み**
新人には早い段階で色々な人と接点を持ってもらおうと考えています。具体的には、自分が過去にお世話になった他チームや異なるロールの方との面談機会を設けたいと思っています。まだアイデア段階ですが、近いうちに実行に移したいところです。

幸いなことにこのことを昔の上司に話してみたら快くOKを出してくれたので、「自分が人に与える印象」は絶対に無視していい要素ではないのだなと改めて認識しました。（この辺りはメンバーにも伝えていきたいところです。）

## リーダーとして自分がやるべきことの整理
これまで新人に対するアプローチについて書いてきましたが、自分自身がリーダーとして取り組むべきことも見えてきました。

**メンバーの「やりたいこと」を実現する機会作り**
1on1を通じて、メンバーが本当にやりたいことや興味のある分野を把握するよう心がけています。すべての希望を即座に叶えることは難しくても、上司と相談して教育費の融通を効かせてもらうことくらいはできそうな気がします。

**自分自身の継続的な成長**
メンバーを指導する立場になった以上、自分も成長し続ける必要があります。技術的なスキルはもちろん、マネジメントスキルやコミュニケーション能力も重要です。

幸いなことに過去の案件でいいリーダーの元で育ってきたので、彼らの真似をしつつ自分の色を出していければなと考えています。

**社内政治の理解**
これまで技術面にばかり注目していましたが、マネジメントをする上で社内の政治的な構造を理解することの重要性を痛感しています。

どの部門がどのような力関係にあるのか、意思決定がどう行われるのか。こうしたことを把握することで、チームのためにより良い環境を作れます。技術者として敬遠しがちな分野ですが、チームを守り、メンバーが働きやすい環境を作るためには避けて通れない道だと感じています。

特に新人が新しいことをやってみたいといった時に、「決裁を上げてくれる人」とは仲良くしておこうと考えています。

## まだ始まったばかりだけど
マネジメントを始めてまだ1ヶ月という超初期段階ですが、自分の新人時代を振り返りをする機会が増えました。

必ずしも自分と同じ道を進まなくてもいいですし、なんなら違う道に進んでも大歓迎です。

ただ、何かの偶然で一緒に仕事をするようになったので「何となくここで働いててよかったな」と思ってもらえる環境を作っていけたらいいかなと考えています。

オンボーディングや社内ネットワーク作りなど、ほとんどが「これから試してみたい」段階の取り組みですが、これらを通じてより良いチーム作りを目指していきます。

同じようにマネジメントを始めたばかりの方に、少しでも参考になれば幸いです。また、「それは違うよ」「こうした方がいいよ」というアドバイスも大歓迎です！
かゆいところに手が届くAWS CLIコマンド

# はじめに
日常的によく使うコマンドではないですが、覚えておくと便利なAWS CLIコマンドを集めてみました。

## IAMポリシーの説明欄を日本語表記で作成する

```shell:AWS CLI
aws iam create-policy --policy-name "<ポリシー名>" --description "<ポリシーの説明>" --policy-document file://<ファイル名>.json
```
>最大 1000 文字です。英数字と「+=,.@-_」の文字を使用してください

マネジメントコンソールからでは通常説明欄を日本語表記にすることはできません。
しかし、CLIからであれば(何故か)設定可能です。
簡潔な説明であれば英語でもいいですが、説明が長くなるようであればCLIで日本語表記にした方がわかりやすくなるかもしれません。

## IAMロールのセッションIDを確認する

```shell:AWS CLI
aws iam get-role --role-name <IAMロール名>
```
実行結果から「RoleId」の値を確認します。
「RoleId」の用途としては、S3バケットポリシーにIAMロール単位で制御をかけたいとき等に使います。

## SNSサブスクリプションが利用者側で解除できる設定かの確認

```shell:AWS CLI
aws sns get-subscription-attributes\
  --subscription-arn arn:aws:sns:ap-northeast-1:<AWSアカウントID>:<SNSトピック名>:<SNSサブスクリプションID>
  ```
実行結果から「ConfirmationWasAuthenticated」の値を確認します。
デフォルトはfalseで、利用者側でメール内の登録解除用 URLをクリックすることで解除が可能な状態です。
trueにするには、初回登録時に配信されるメールのリンクからではなく、マネジメントコンソールまたはCLIから確認(Confirm)を行う必要があります。


## IPアドレスとENIの紐づけチェック
```shell:AWS CLI
aws ec2 describe-network-interfaces \
--query "NetworkInterfaces[].[InterfaceType,NetworkInterfaceId,PrivateIpAddress,Description]" \
--output text | sort -Vk 3 | tr "\t" "," | column -s, -t
  ```
Reachability Analyzerを使う前段で利用していました。
ENIをいちいちマネジメントコンソールから確認するのが大変だったのですが、これなら一発で一覧を出してくれるので大変助かってます。
  
# おわりに
コマンド系を覚えるのはなるべく避けたいので、使うかもしれないと思ったコマンドはためて置いて今後もQiitaにまとめてみたいと思います。

# 参考
[【AWS CLI】VPC Reachability Analyzer編](https://blog.serverworks.co.jp/aws-cli-reachability-analyzer)


[誰かサブスクリプション解除した？を無くすために Amazon SNS によるメール通知の停止（Unsubscribe）リンクを無効化してみた](https://dev.classmethod.jp/articles/prevent-unsubscribe-all-sns-topic/)
SwiftUIの onSubmit の使い方を簡単に説明してみました！

SwiftUIでテキスト入力を使うとき、ユーザーがキーボードの送信ボタンを押したタイミングで何か処理をしたい時に使えるのが **onSubmit** です！

onSubmitとは？
---
TextField や TextEditor に入力後、ユーザーが Return（送信）キーを押したときに呼ばれるものです。

例えば：

- 入力が終わったら検索処理を開始したい

- フォームを送信したいなど

```swift
struct ContentView: View {
    @State var name = ""

    var body: some View {
        VStack {
            TextField("名前を入力", text: $name)
                .textFieldStyle(RoundedBorderTextFieldStyle())
                .padding()
                .onSubmit {
                    handleSubmit()
                }

            Button("送信") {
                handleSubmit()
            }
            .foregroundStyle(.white)
            .frame(width: 70, height: 50)
            .background(.blue)
            .cornerRadius(10)
            .padding()
        }
    }

    func handleSubmit() {
        print("入力された名前：\(name)")
    }
}

```




![Screenshot 2025-06-06 at 16.10.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3977742/515140fb-fb0f-4542-b926-fb4fa52ed12d.png)

- TextField のあとに .onSubmit をつけることで、エンターキー（Return）を押したときに処理を実行できます!

- キーボードの送信ボタンなどが押されたタイミングで実行します!




 まとめ
 --

SwiftUIで入力後の処理をしたいときは .onSubmit { } が便利で、またフォームや検索バーなど、ユーザーの入力完了にあわせた処理に使うといいと思います！

ぜひ参考にしてみてください！👍
FinOpsフレームワーク解説 〜第５回〜 実践サイクル（Phases）

## 目次：
今日のテーマは実際に会社の中でFinOpsを実践する際のサイクルについてです。
すこし具体的にサンプルを後述していますので、これまでの記事にあるようなペルソナなんかも思い出しながら読んでいただけると幸いです。

　　・各フェーズにおける定義と目的
　　・この実践サイクルを実行する際のイメージをサンプルライクに
  ![スクリーンショット 2025-06-06 15.38.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3895754/9b135dae-587c-4564-a1cb-8ec0faadec8f.png)


## 今日の一枚まとめ：
![スクリーンショット 2025-06-06 15.38.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3895754/11c250b3-ddb0-44d1-8385-193426aa32b0.png)


## 内容：
FinOpsの実践サイクル（ライフサイクル）は、クラウドコスト管理と最適化を継続的かつ組織的に推進するための基本フレームです。

### 1. 実践サイクル（ライフサイクル）の全体像

FinOpsの実践は「インフォーム（Inform）」「オプティマイズ（Optimize）」「オペレート（Operate）」の3つのフェーズを繰り返し回すサイクルで構成されていることを説明します。
各フェーズは独立しているのではなく、連携しながら継続的な改善を生み出す仕組みであります。

:::note info
サイクルという名の通り、一度で終わるものではなく、継続的にこのフローを回すことが大事です。ただし注意点としては、よくこのフローが形骸化するパターン。
:::

まずはそれぞれの定義と目的からです。すこし大雑把な話が続きますが、このあとに具体例も書くので安心してください。

### 2. 各フェーズの定義と目的
#### インフォーム（Inform）
　　定義：クラウドコストや利用状況を可視化し、関係者が正確な情報をもとに意思決定できる状態をつくるフェーズ。
　　目的：コスト配分の透明化、異常値の早期発見、説明責任の明確化。

#### オプティマイズ（Optimize）
　　定義：可視化されたデータをもとに、リソースやコストを最適化するための具体的な施策を実行するフェーズ。
　　目的：無駄な支出の排除、リソースの適正化、割引プランの活用などによるコスト効率の最大化。

#### オペレート（Operate）
　　定義：最適化施策を持続的に運用し、組織全体でFinOps文化を根付かせるフェーズ。
　　目的：継続的な改善サイクルの定着、ガバナンス強化、教育や自動化による運用負荷低減。

### 3. 各フェーズの主な活動・具体例
#### インフォーム
　　・タグ付けやアカウント管理によるコストの可視
　　・部門・プロジェクト別のコストレポート作成
　　・コスト異常値の検知とアラート通知

#### オプティマイズ
　　・未使用リソースの削除やリソースサイズの適正化
	　・スケジューリングや自動停止の導入
	　・リザーブドインスタンスやSavings Plansの活用

#### オペレート
　　・定期的なコストレビュー会議の開催
　　・自動化ツールによる運用効率化
　　・教育・啓発活動によるFinOps文化の浸透
	
### 4. サイクルを回すうえでのポイント・成功要因
　　・各フェーズを単発で終わらせず、継続的なサイクルとして回すことの重要性
　　・部門間の連携や情報共有の仕組み化
　　・KPIや目標設定による進捗管理
　　・改善活動の定期的な見直しとアップデート
	
### 5. 実践サイクルがもたらす効果
　　・コスト削減だけでなく、クラウド投資のビジネス価値最大化
　　・組織全体のコスト意識・説明責任の向上
　　・継続的な最適化による競争力強化

    
このような構成で見て行くと、FinOps実践サイクルの全体像と各フェーズの役割、具体的な活動や成功のポイントのイメージを持ちやすくなります。


## サンプルへ
ではここから、サンプルライクにこの実践サイクルを回すイメージを作ってみようと思います。

![スクリーンショット 2025-06-06 15.46.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3895754/21780539-fd0a-4c89-b828-4d68695c7a60.png)


#### 1. インフォーム（情報提供・可視化）
担当部署例
　　・情報システム部／IT企画部
　　・クラウド運用推進部
　　・経理部・財務部
主な活動
　　・クラウドコストのリアルタイム可視化（ダッシュボード作成、部門・サービス別の集計）
　　・タグ付けやアカウント別でのコスト割り当て
　　・予算編成や支出予測の情報を各部門に通知
例
IT企画部がAWS/Azure/GCPの利用状況を集計し、経理部と連携して各事業部ごとに月次コストレポートを作成。これをクラウド運用推進部がダッシュボードで全社共有し、異常値や予算超過を早期に発見できる体制を整える

#### 2. オプティマイズ（最適化）
担当部署例
　　・クラウド運用推進部
　　・システム開発部／インフラ運用部
　　・調達部
主な活動
　　・未使用リソースの削除やリソースサイズの適正化
　　・開発・検証環境の自動停止スケジュール設定
　　・割引プラン（リザーブドインスタンスやSavings Plans）の活用
　　・コスト最適化施策の提案と実施
例
クラウド運用推進部とシステム開発部が協力し、夜間・休日に利用しない開発環境を自動停止。調達部が各クラウドベンダーと交渉し、最適な割引プランを契約。これにより、無駄なコストを削減し、コスト効率を高める。

#### 3. オペレート（運用・定着）
担当部署例
　　・クラウド運用推進部
　　・情報システム部
　　・各事業部
　　・経営企画部
主な活動
　　・定期的なコストレビュー会議の開催（各部門横断で実施）
　　・コスト最適化・運用改善の継続的な実施
　　・KPIや目標の進捗確認、教育・啓発活動
例
毎月、クラウド運用推進部主導で経理部・各事業部が集まり、コストレビュー会議を開催。ダッシュボードやレポートで現状を共有し、次の最適化施策や改善点を議論。経営企画部が全体のガバナンスやKPI管理を担い、FinOps文化の定着を図る


## 最後に：
ここまでの内容を振り返って行くと実践的な内容や、おそらく企業の中の組織・人物に当てはめて考えることができるのかなと思います。

最初からベストな状態でフローを回すことは不可能ですので、だからこそこういった改善のループが必須になってくることを理解して、ぜひ皆様のお役に立てばと思います。
SwiftUIのAlert（アラート）の使い方を説明してみました！

SwiftUIを使ってアプリを作っていると、ユーザーに「確認」や「警告」を表示したいときがありますよね。そんなときに使えるのが **Alert**です！

そもそもAlertって何？
---
Alertは、画面の中央に表示されるポップアップのことです。
例えばこんなときに使います：

- 「削除してもいいですか？」という確認

- エラーが起きたときの通知

- ユーザーに選択肢を提示したいとき等

基本的な使い方
---

```swift

struct ContentView: View {
    @State var showAlert = false

    var body: some View {
        VStack {
            Button("アラートを表示") {
                showAlert = true
            }
        }
        .alert("タイトル", isPresented: $showAlert) {
            Button("OK", role: .cancel) { }
        } message: {
            Text("これはアラートのメッセージです。")
        }
    }
}
```
- @State  var showAlert = false
　→ アラートの表示・非表示を管理するための状態変数

- alert(...)
　→ showAlertがtrueになるとアラートを表示

- Button("OK", role: .cancel)
　→ OKボタン（

![Screenshot 2025-06-06 at 15.59.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3977742/56366698-5909-4bcc-8b8b-2c2e36920d99.png)

 ボタンを2つ表示する例
 --
「はい」「いいえ」など、選択肢を2つ表示したい場合
 ```swift

.alert("削除しますか？", isPresented: $showAlert) {
    Button("削除", role: .destructive) {
        // 削除処理を書く
    }
    Button("キャンセル", role: .cancel) {
        // キャンセル処理
    }
} message: {
    Text("この操作は取り消せません。")
}
```
![Screenshot 2025-06-06 at 16.00.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3977742/aa8ddaf8-0639-4057-8ec9-b6b1b5dc86b0.png)

まとめ
--
| やりたいこと         | 方法                                         |
| -------------- | ------------------------------------------ |
| シンプルなアラート      | `.alert("タイトル", isPresented:)`を使う          |
| ボタンを複数表示       | `.alert`内に複数の`Button`を書く                   |
| メッセージを表示       | `message:`引数で`Text`を渡す                     |


最後に
---
Alertは簡単に使えるUIパーツで、UIのパーツ大事な要素なのでしっかりマスターできるようにしといた方がいいと思います！👏
【2025年版】今すぐ試せる！おすすめのAIビキニジェネレーター5選

2025年は、AIによる画像・動画生成ツールがますます進化し、エンタメや創作の世界に新たな波を起こしています。その中でも、今ひそかに注目を集めているのが「AIビキニジェネレーター」というジャンル。

「びきに...？」と思われるかもしれませんが、実はこれ、イラストや写真をアップロードするだけで、キャラクターを水着姿に変換し、きらびやかな動画にまで生成してくれる、とてもユニークで面白いAIツールなのです。

この記事では、SNS向けショート動画やVtuberの二次創作、AIアートの実験など、使い方は無限のAIビキニジェネレーターの中から、秀逸なサービスを5つ選んで精密に紹介します。

後編では「どれを使うべき？」という指針も提示していますので、是非自分に合った一括スタイルAIツールを見つけてみてください。

1. Deevid AI

AI動画生成分野で注目を集める Deevid AI は、もともと「Text to Video」「Image to Video」などの革新的なテンプレートで評価を高めてきました。2025年、Deevid は新たに「ビキニジェネレーター」（https://deevid.ai/ja/template/ai-bikini）
機能を追加し、AIコンテンツ制作の世界にさらなる驚きを与えています。

この機能では、ユーザーがアップロードした任意の画像（人物写真、アバター、イラストなど）を、ビーチやプールサイドを背景に、ビキニ姿で踊るアニメーション動画へと変換してくれます。生成される動画は高画質かつ自然なモーションが特徴で、まるで短編のミュージックビデオのような仕上がりになります。

特筆すべきは、そのテンプレートの多様性と操作性の高さです。シーンスタイル、衣装、動きのパターンなどを簡単に選択でき、数クリックで動画生成が完了します。動画の長さは10秒前後、SNSへのシェアに最適です。

日本語入力にも対応しており、プロンプト（指示文）に「赤いビキニのアニメキャラが海辺で踊る」と入力すれば、視覚的にも魅力的な動画が即座に得られます。

出力形式：MP4（高画質ショート動画）

操作環境：完全ブラウザ対応、日本語UIあり

無料トライアル：あり（クレジット制）

おすすめユーザー：ショート動画投稿者、Vtuberファン、AI創作好き

Deevid AIは、遊び心と品質を両立した、2025年最注目のAIビキニ動画生成ツールといえます。

2. ImageMover

ImageMover は、画像を自動的にアニメーション化し、プリセットされたダンススタイルで短い動画を作成することに特化したAIツールです。操作は非常に簡単で、画像をアップロードした後にテンプレートを選択するだけで、AIが自然なモーションを与えてくれます。

生成される動画はシンプルですが、ウォーターマークなしの高画質出力は有料プランで提供されます。リアル志向の出力よりも「可愛さ」や「ちょっとしたネタ動画」に向いており、SNS投稿やLINEグループなどでのちょっとした共有にぴったりです。

出力形式：短編アニメーション（WebM/MP4）

カスタマイズ範囲：プリセット中心、細かい制御は不可

利用条件：無料で試用可能、有料版でHD出力可

おすすめユーザー：ネタ動画クリエイター、SNSライトユーザー

3. Pollo AI

Pollo AI は、テキストプロンプトと画像の両方を組み合わせて使える、カスタマイズ性の高いAIジェネレーターです。「海辺で踊るピンク髪のキャラ」など、細かく条件を指定したいユーザーには最適なプラットフォームです。

画像と文章を掛け合わせてシーンを設計できるため、創造性の高い作品を目指す人向け。生成速度はやや遅めですが、結果として出力される映像の個性は際立っています。

出力形式：動画（MP4形式）

カスタマイズ：テキスト＋画像ベースで自由度が高い

利用条件：無料トライアルあり、有料版でより長い映像生成可能

おすすめユーザー：創作性を重視する映像クリエイター、Vtuber絵師

4. Fotor

Fotor は、もともと画像編集アプリとして人気の高いツールですが、AI画像生成にも対応しており、ビキニ姿のキャラクター画像も簡単に作れます。動画生成には非対応ですが、静止画の美しさや編集のしやすさはトップクラス。

画像のスタイルも「リアル系」から「アニメ調」まで豊富にそろっており、SNSのアイコンやアイキャッチ、商品モックアップなどに活用しやすいのが特徴です。

出力形式：静止画（JPG/PNG）

カスタマイズ：テキスト生成＋画像編集ツール併用可能

利用条件：無料プランあり、有料プランで高解像度DL可

おすすめユーザー：デザイナー、SNSアイコン制作者、ブログ用画像作成者

5. Clipfly

Clipfly は、アニメーション好きのユーザーをターゲットにした動画生成AIです。特にアニメ風のキャラやVTuberの立ち絵との相性が良く、プリセットされた可愛らしいダンスや仕草が特徴。

操作も簡単で、アップロードしてテンプレートを選ぶだけで、イラストが動き出します。リアル系よりはアニメ・オタク文化に特化しており、趣味での利用や創作イベントなどでの活用が想定されます。

出力形式：ショートアニメ動画（MP4）

カスタマイズ：ダンスパターン選択あり、自由度は中程度

利用条件：無料版あり、HD出力は有料

おすすめユーザー：同人作家、キャラ創作層、Vtuber二次創作ファン

まとめ

AIビキニジェネレーターは単なるお遊びツールではなく、創作、マーケティング、エンタメの場面でも十分に活用できる可能性を持ったテクノロジーです。2025年は、AIによるビジュアル生成の質が一段と高まり、数クリックで動画が作れてしまう時代に突入しました。

・すばやく高品質な動画を作りたいなら「Deevid AI」
・手軽に遊びたいなら「ImageMover」
・創作性を追求したいなら「Pollo AI」
・静止画中心でSNS向けに使いたいなら「Fotor」
・アニメ調でキャラを動かしたいなら「Clipfly」

自分の目的やジャンルに合わせて、最適なツールを選ぶことで、AIコンテンツ制作がより楽しく、より創造的なものになるでしょう。この記事が、皆さんのAI創作の第一歩になれば幸いです。