OmniAICreator/Qiita-1.07M huggingface dataset:
DataSaber Ord6. Visual Best PracticeⅡ振り返り

DataSaberにチャレンジしているMaroppaです。
今回はOrd6. Visual Best PracticeⅡを受講した振り返りとして、KTさんが冒頭で言っていたように、まずは自分で考えてやってみた後にKTさんの動画を見た結果、気づきを得たり自分の思っていたイメージと違う、という問題があったので、ここでご紹介したいと思います。

### Q1：サブカテゴリ別円グラフ
まずは、自分がパッと見て元のチャートが分かりづらいと思った点です。
* 色が多すぎて判別が付きづらい
* ラベルがサブカテゴリしかないため、サブカテゴリの何(売上？利益？)を表しているのか、パッと分からない
* サブカテゴリの数が多すぎるため、比較が難しい

サブカテゴリをそれぞれ色で分ける必要はなく、かつ、凡例から売上を表したいのだな、と思い、シンプルにサブカテゴリ別の売上を棒グラフで表現してみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4095431/bcab48ee-0afc-494b-a51a-03b112535f92.png)

その後、KTさんの動画を視聴。問題点としてはそこまで大きな認識ずれは無かったのですが、動画では元のチャートは円グラフ、つまり、作り手はサブカテゴリ別の売上の割合を表したかった、と想定してヒートマップを作成していました。なるほど、私は自分勝手にサブカテゴリ別の売上金額が見れれば良いだろう、と安易に考えたのですが、大事なのはまず、**元のチャートの作り手が何を表現したいのか？を考える**べきだ、と気づきました。動画でも何度も述べられてますが、実際のケースでは作り手に直接確認するのが良く、今回の場合は棒グラフでも間違いではないと思いつつ、大事な視点が抜けていたな、と勉強になりました。






### Q2：サブカテゴリ別売上推移
こちらもまずは自分が見て分かりづらいと思った点は、、
* 折れ線グラフが多い、かつ似通った点が多く、見づらい
特に、売上50万以下で推移しているサブカテゴリが密集していて見づらい

この折れ線グラフって、年度の表示がない、つまり数年分をまとめて月別で表現しているので、どのサブカテゴリがどの月に売上が多いか、他の月と比較して売上が多いか少ないかなど、月別のトレンドを見たいのかな、と勝手に想定。ヒートマップを使って、縦軸を月、横軸をサブカテゴリにし、売上の大きさを色で表現してみました。
    
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4095431/fb7b63e5-2ad6-496e-a61b-c601dc5ee960.png)

 

その後、KTさんの動画を視聴。ところが、自分の作成したチャートとは全く違うアプローチで、各月のサブカテゴリのランキング形式やエリアチャートで表現されていました。なるほど、ランキングで表現する視点はなかったです。ただ、問題点(線が重なってスパゲッティみたいになっている、意味なく同系色の色が使われている)の認識は同じだったので、それらを解消するという点では私の作成したグラフも間違いではない？と思ってはいるのですが、何か改善点などあれば誰か教えてくださいー！
ONES Wikiのページ履歴機能を使いこなそう！～変更管理・差分比較・復元を簡単に～

## はじめに
チームやプロジェクトでドキュメントを作っていると、「前の状態に戻したいな…」「あの時の内容を確認したい」「誰がどこを変えたの？」と感じることはありませんか？

そんなときに活躍してくれるのが、[ONES Wiki](https://systemcon.co.jp/products/oneswiki/)の「ページ履歴」機能です。今回は、このページ履歴の基本的な使い方と、便利な活用例をご紹介します！

## ページ履歴ってどんな機能？
ページ履歴は、ページを編集して保存するたびに履歴を残してくれる機能です。例えば3回ページを保存すると、3つのバージョンが残ります。

それぞれのバージョンを後から確認したり、2つのバージョンの差分を比較したりすることもできます。ページは常に最新の状態が表示されるので、管理がすごくラクになりますよ。

さらに、過去のバージョンに戻す（ロールバックする）こともワンクリックでOKです！

## ページ履歴の使い方は簡単！
ページ履歴は、各ページから簡単にアクセスできます。

ページの右上にある「… その他」をクリックして、「ページ履歴を参照」を選びましょう。

![ページ履歴.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3483972/9d732179-3089-492e-a9f3-a98069f0bab4.png)

履歴画面では、「いつ、誰が、どこを」変更したのかがすぐに分かります。
各バージョンをクリックするとその内容を確認できて、「備考」欄に簡単なメモを残せば、変更内容もすぐに分かりますよ。

![バージョン.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3483972/c9ea28ff-a62f-4f8f-82a6-35b423fb20c9.png)

## ページを簡単に復元（ロールバック）する方法
元に戻したいバージョンを選んで、「復元」ボタンをクリックするだけ！
選んだバージョンが最新版として復元されます。過去の履歴もそのまま残るので、安心して使えます。

例えば16個バージョンがあった場合、古いバージョンを選んで復元すると、それが17番目の最新版として追加されます。これなら間違っても慌てる必要なしですね！

![復元方法.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3483972/eacd0d0a-d211-4aa7-b9ab-2829d1812c1e.png)

## 2つのバージョンを比較して差分をチェック
ページ履歴のもう一つの便利な機能が「差分比較」です。

比較したい2つのバージョンを選ぶと、追加された部分や削除された部分（×で表示）が色付きでハイライトされます。

複数人で編集している場合は「いつ、誰が、どこ」を編集したか一目瞭然です。

![差分比較.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3483972/aaea1dfc-4c90-4854-8dcc-996fcba16aad.png)

## まとめ
ファイルでドキュメントを管理していると、バージョンが増えるほど「どれが最新版だっけ？」と混乱しがちですよね。

ONES Wikiのページ履歴を使えば、このような課題を解決してくれます。編集して保存するだけで、自動的にバージョンが作成されるので監査などの履歴確認でも利用することができます。また、変更の確認や元に戻す操作もワンクリックで簡単！

これまでファイルで管理していた方は、ぜひONES Wikiのページ履歴機能を活用して、もっとスマートにナレッジを管理してみませんか？生産性がグッとアップすること間違いなしですよ。
📗 Vol.8.17：【Struts2】カスタムタグの拡張応用 〜 共通部品化・UI拡張で保守性アップ 〜

※ 本章は「データ一覧表示の最適化」シリーズとなります

---

## ■ はじめに：カスタムタグの応用が“実務の質”を変える

Struts2のカスタムタグは単なるテンプレート記述の省力化にとどまらず、  
**「共通UI部品」** として設計することで、保守性・再利用性・チーム開発効率が大きく向上します。

本記事では、Struts2のタグライブラリ機能を活用した**実務向け拡張パターン**をご紹介します。

---

## ■ カスタムタグの構成復習（最低限ここだけ押さえる）

| 要素 | 役割 |
|------|------|
| `.tag`ファイル | 実際に出力されるUI部品のテンプレート |
| TLDファイル | カスタムタグの定義情報（属性・名前空間など） |
| `TagSupport`拡張クラス（必要に応じて） | 高度な動的ロジックを扱う場合に使用 |

> ※ `.tag` のみでも多くの共通化は実現可能です

---

## ✅ パターン①：よく使う「ラベル＋入力欄」UIの共通タグ化

### 📌 目的
- 同じような入力UIが各画面に散在している
- 必須マークや幅・エラー対応がバラバラ

### ✅ 例：`labelInput.tag`

```jsp
<div class="form-group">
  <label for="${id}">
    ${label}<s:if test="required"> <span class="required">*</span></s:if>
  </label>
  <s:textfield name="${name}" id="${id}" cssClass="form-control"/>
</div>
```

### ✅ 使用例（JSP側）
```jsp
<my:labelInput name="username" label="ユーザー名" required="true"/>
```
---

### ✅ パターン②：エラー付きフォーム部品の共通タグ化
### 📌 目的
- 入力欄に対して個別に `<s:fielderror>` を毎回書くのが面倒

- スタイリングやマークアップが統一されていない

### ✅ 例：errorInput.tag
```jsp
<div class="form-group <s:if test="hasFieldErrors('${name}')">has-error</s:if>">
  <label for="${name}">${label}</label>
  <s:textfield name="${name}" id="${name}" cssClass="form-control"/>
  <s:fielderror fieldName="${name}" />
</div>
```
---

### ✅ パターン③：繰り返しUI部品（リストアイテムのタグ化）
### 📌 目的
- `<s:iterator>` で表示するリスト内の構造が毎回複雑

- 投稿一覧、コメント、通知など、見た目とロジックが類似している

### ✅ 例：postItem.tag
```jsp
<div class="post">
  <div class="post-header">${post.userName} さん</div>
  <div class="post-body">${post.content}</div>
  <div class="post-footer">${post.timestamp}</div>
</div>
```

### ✅ 使用例（JSP側）
```jsp
<s:iterator value="postList" var="post">
  <my:postItem post="%{#post}" />
</s:iterator>
```
---

### 💡 共通タグ設計のポイント＆落とし穴
- 🔹 属性数が多すぎると逆に使いにくくなる

- 🔹 ロジックと表示の責務を分ける（カスタムタグはUI専用に）

- 🔹 JSPで読みやすさ・書きやすさを両立する命名規則を持つ

---

### 📝 まとめ：業務効率に直結する「共通UI部品化」のすすめ
- フォームや表示UIの「見た目」や「構造」をタグ化することで、
***保守性・再利用性・チーム開発効率が劇的に改善されます。***


- UIの仕様変更にも強く、プロジェクト全体の品質向上にもつながります。
---

[🌟 Vol.8.16〜8.17 総まとめ：Struts2 出力最適化＆拡張編（一覧表示・共通部品化・カスタムタグ）](https://qiita.com/juehara-crypto/items/c13bd0474f71efc7cd28)
OpenHandsをローカルLLM(LMStudio)で動かす Windows11版

# Windows11でOpenHandsとLLMStudio連携してみた

なんてことはないのだが苦戦したので記事に。

## 前提条件

- Windows 11
- LMStudioインストール済
- WSL設定済み
- Docker Desktopインストール済
- 64GB程度メモリある(たぶん32GBでも行けそう)

## compose.yamlの設定

いきなりだがcompose.yamlを作ってdocker-composeで動かす

```compose.yaml
version: "3.8"

services:
  openhands:
    image: docker.all-hands.dev/all-hands-ai/openhands:0.39
    container_name: openhands-app
    ports:
      - "127.0.0.1:3000:3000"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ~/.openhands-state:/.openhands-state
    environment:
      - SANDBOX_RUNTIME_CONTAINER_IMAGE=docker.all-hands.dev/all-hands-ai/runtime:0.39-nikolaik
      - LLM_BASE_URL=http://host.docker.internal:11434
    extra_hosts:
      - "host.docker.internal:host-gateway"
```

## LLMStudioの設定

最近リリースされたDevstralを使ってみる

https://lmstudio.ai/model/devstral-small-2505-mlx


![スクリーンショット 2025-05-23 151628.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133718/1deb32c9-f11b-4cb3-841c-996d439ad24e.png)


Modelのダウンロードが完了したら、DeveloperのSettingsでEnable CORSをONにする
![スクリーンショット 2025-05-23 152048.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133718/0ff0b097-3d11-4ed5-971e-dbcbd89cbe83.png)

次にコンテキスト長をMaxまで引き上げる
**Maxまで引き上げないとコンテキスト長が足りずエラーでます**
![スクリーンショット 2025-05-23 152543.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133718/3367f740-8c81-45b4-a177-e820b4402291.png)

## OpenHandsの設定

上記のcompose.yamlのあるディレクトリ以下を実行し、
http://localhost:3000/settings
にてOpenHandsをブラウザ上で開く

```shell
docker compose up -d
```

- Custom Model: lm_studio/devstral-small-2505
- Base URL: http://host.docker.internal:1234/v1
- API Key: テキトーな値
- Agent: CodeActAgent

に設定する

![スクリーンショット 2025-05-23 153533.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133718/e2ba46ba-60db-4361-8f1e-3051401329b4.png)

続いて

http://localhost:3000/

から
Launch from Scratch
ボタンをクリックし会話を始めてみる

![スクリーンショット 2025-05-23 153633.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133718/41a8ad72-aa45-4b08-9e31-eabe1db4db3a.png)

結構時間がかかるが無事会話できる
![スクリーンショット 2025-05-23 153817.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133718/f84e2cbd-1d7b-4ae1-ac2e-d937a3e3a96b.png)


## 参考記事

https://dev.to/udiko/how-to-run-openhands-with-a-local-llm-using-lm-studio-41j6

## その他

なんかOpenHands経由だとレスポンスが重い気がする
PHP Error tracking

## PHPシステム系のエラートラッキング

php.ini ファイルに追加する
セクション分けされているっぽいのでファイル先頭に入れるのが良いだろう。

/usr/local/etc/php/php.ini

```ini:php.ini
display_errors = ON

[Date]
date.timezone = "Asia/Tokyo"

[mbstring]
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"
```

MediaWiki でMarkdownを使えるようにゴニョゴニョしてると、エラー抑制がかかっていて原因がわからない。
これで解決したから！

## MediaWiki エラー表示

MediaWikiでエラー表示するならコレをしろって言われた。
やったけど意味不明で上のPHP系エラートラッキングを追加して解決。

/var/www/html/LocalSettings.php

```php
#Set $wgShowExceptionDetails = true;
$wgShowExceptionDetails = true;
```

### ここで見た

Call to undefined method Parser::doDoubleUnderscore #17
https://github.com/bharley/mw-markdown/issues/17

This is because many calls from Markdown.php are deprecated or private now (see https://www.mediawiki.org/wiki/Release_notes/1.35):

MediaWiki version 1.35 で仕様変更になり doDoubleUnderscore を含めた一群の関数は諸々使えなくなりました。とのこと。

あー、あー、そんな事は聞きたくないでござる。
つまり バージョン1.35 前後で使えない拡張機能がいっぱいあって、MediaWikiさんが拡張機能として紹介してるもの以外は全部使えませんと。
うむ。心がオロオロしてるでござる。
NIC二枚のPCでのIPアドレス設定

以下のような構成で社内LAN側でメインの通信をしたい場合の
IPアドレス設定について記載します。

```
|バックアップLAN|-------|PC|-------|社内LAN|
```

それぞれのネットワークは以下とします。
　社内LAN側のセグメント：172.16.10.0/24
　バックアップLAN側のセグメント：192.168.1.0/24
また、PCのOSはWindowsを前提とします。

### 社内LAN側のIPアドレス設定
```
IPアドレス：172.16.10.10
サブネットマスク：255.255.255.0
デフォルトゲートウェイ：172.16.10.254
```

仮の値として具体的な値を記載しました。
実際の設定の際はネットワーク管理者から指定があると思います。


### バックアップLAN側のIPアドレス設定
```
IPアドレス：192.168.1.10
サブネットマスク：255.255.255.0
デフォルトゲートウェイ：設定しない
```

こちらも仮の値として具体的な値を記載しました。
ポイントはデフォルトゲートウェイを設定しないこと。
両方にデフォルトゲートウェイを設定すると
通信できなくなるため、NIC二枚ともにIPアドレスを
設定する場合は注意が必要です。


### Linuxだとどうなる？
実はやったことがありません。
ご存知の方いらっしゃれば教えてください。
📘 Vol.8.16：【Struts2】データ一覧表示の最適化   〜 `<s:iterator>` / `<s:property>` 実践パターン 〜

※ 本章は「データ一覧表示の最適化」シリーズとなります

---

## 🔍 本記事の目的
Struts2における「一覧表示」の実装は、あらゆる業務画面に登場します。  
本記事では、実務で役立つ一覧出力パターンを整理し、**UIの見やすさ・実装効率・保守性**を高めるテクニックを紹介します。

---

## ✅ 対象読者
- Struts2での一覧出力に悩んでいる方  
- `<s:iterator>` や `<s:property>` を使いこなしたい方  
- 表構造の整理や出力条件の切り分けに課題を感じている方  

---

## 📌 内容一覧

| セクション | 内容 |
|------------|------|
| 1. `<s:iterator>` の基本構文と使用例 | 単純な繰り返し表示 |
| 2. `<s:iterator>` 内での条件分岐・入れ子表現 | 条件付き出力、ネスト構造対応 |
| 3. 空リスト時のメッセージ表示 | 件数0のときだけ別UI表示する方法 |
| 4. 行番号の付与方法（indexの活用） | 「1, 2, 3,...」の連番表示 |
| 5. escape="false" によるHTML出力制御 | HTML出力を許可する際の注意点 |

---

## 1. `<s:iterator>` の基本構文と使用例

```jsp
<table>
  <tr><th>ID</th><th>名前</th><th>登録日</th></tr>
  <s:iterator value="userList">
    <tr>
      <td><s:property value="id"/></td>
      <td><s:property value="name"/></td>
      <td><s:date name="createdAt" format="yyyy/MM/dd"/></td>
    </tr>
  </s:iterator>
</table>
```

### 2. `<s:iterator>` 内での条件分岐・入れ子表現
```jsp
<s:iterator value="users">
  <tr>
    <td><s:property value="id" /></td>
    <td>
      <s:if test="role == 'admin'">★管理者★</s:if>
      <s:else><s:property value="name" /></s:else>
    </td>
  </tr>
</s:iterator>

```
---

### 3. 空リスト時のメッセージ表示
```jsp
<s:if test="userList.size() == 0">
  <p>データが存在しません。</p>
</s:if>
<s:else>
  <table>...（略）</table>
</s:else>
```
---

### 4. 行番号の付与方法
```jsp
<s:iterator value="users" status="rowStatus">
  <tr>
    <td><s:property value="#rowStatus.index + 1" /></td> <!-- 1始まり -->
    <td><s:property value="name" /></td>
  </tr>
</s:iterator>
```
---

### 5. HTML文字列の出力とescape属性
```jsp
<!-- デフォルトではHTMLエスケープされる -->
<s:property value="comment" /> <!-- <b>強調</b> → &lt;b&gt;強調&lt;/b&gt; -->

<!-- エスケープを無効化（HTMLタグをそのまま表示） -->
<s:property value="comment" escape="false" />
```

***⚠️ escape="false" を使う場合はXSS対策（サニタイズ）を必ず行いましょう！***

---

### 🧩 実務向けTips
- `<s:iterator>` で***複数の一覧表示を1画面にまとめる***場合は、`include`や`入れ子`を活用

- 表のヘッダー・データを `<thead>`, `<tbody`> に分離し、***構造とスタイルの分離***を意識

- 行クリックでの遷移は `<tr onclick="...">` で実装すると自然な操作感に

---

### 💬 次回予告
次回[【Vol.8.17】](https://qiita.com/juehara-crypto/items/7c5b7450e529b866a024)では、***Struts2独自のカスタムUIタグの作成方法***を解説します！
業務にフィットした独自タグを作って、UIロジックの共通化を図りましょう！
MacでのRailsのインストール方法

# 想定読者
* Macユーザー
* rbenvを使ってRailsをインストールしたい人
* ターミナルに`sudo gem install rails`をしろと怒られている人

# はじめに
なぜこの記事を書いているのかというと、Railsのインストールでめちゃくちゃ困ったからです。
インターンで貸していただいたMacにRailsを入れたとき、依存関係がおかしくなってしまいました。また、自分のMacに入れる際にも、エラー対策を一通り試すもののうまくいかなかったりしました。
はい、想定読者は過去の自分です。
そんな過去の自分に向けてこの記事を書きたいと思います。

# やること
主にRailsのインストールまでにやることは以下の通りです。
* Homebrewのインストール
* rbenvのインストール
* Xcode Command Line Toolsのインストール
* Railsのインストール

# Homebrewのインストール
まずはRubyのバージョン管理ツールであるrbenvをインストールします。
ちなみにHomebrewはmacOSに搭載されていないアプリケーションを簡単にインストール、バージョン管理できるので必要不可欠です。

https://brew.sh/ja/

ターミナルで以下のコマンドを実行してください。

```:ターミナル
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```

次にパスを通します。
`.zshrc`に以下のパスを追加してください。
```:.zshrc
export PATH=$PATH:/opt/homebrew/bin/
```

動作確認も兼ねてバージョンを表示させてみましょう。
以下のようにバージョンが表示されたら成功です。
```
% brew --version
Homebrew 4.5.1
```

# rbenvのインストール
ターミナルで以下のコマンドを実行します。

```:ターミナル
brew install rbenv
```
次にパスを通します。
同様に、`.zshrc`に以下のパスを追加してください。
```:.zshrc
export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init -)"
```

先ほどと同じようにバージョンを表示させてみましょう。
```
% rbenv --version
rbenv 1.3.2
```

# Xcode Command Line Toolsのインストール
諸悪の根源、原因はこいつでした。
Xcodeをインストールすると勝手についてくるものなのですが、めちゃくちゃ重いんですよね…
なので、Xcodeはインストールせず、周りのデベロッパーツールだけをインストールします。(ストレージが潤沢な方はXcodeをそのままインストールするのもアリ)

まず、以下のサイトにアクセスしてサインインします。
https://developer.apple.com/download/all/

![スクリーンショット 2025-05-23 13.57.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4016268/dc8c6d21-775f-484b-bc11-3b71297e6d1a.png)

そして、検索窓に`xcode command line tools`と入力して任意のものをダウンロードしてください。

![スクリーンショット 2025-05-23 14.02.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4016268/3195d456-9bed-450d-81e0-c42d745e6165.png)

あとは、ファイルを解凍して手順に沿ってインストールしてください。

# Railsのインストール
最後にRailsをインストールしますが、その前にRubyをインストールします。

以下のようなコマンドで任意のバージョンのRubyをインストールできます。
```:Ruby 3.3.7をインストールする場合
rbenv install 3.3.7
```

インストールが終わったら`rbenv versions`を実行しましょう。
```
% rbenv versions
* system
  3.3.7
```
指定したバージョンが表示されていれば成功です。
なお、`*`がついているものが現在使われているRubyになります。(systemはMac標準のものです)

最後に、`gem install rails`を実行すればRailsがインストールされますが、
**ここで、使用するRubyをMac標準のものからrbenvのものに変更してください。**

:::note alert
特に`sudo gem install rails`は絶対に実行しないでください。
依存関係がおかしくなったのはおそらくここが原因です。
:::

https://qiita.com/jnchito/items/e4872ff5c70a4c2219f1


以下のコマンドでRubyのバージョンを切り替えることができます。
```
全体のバージョンの切り替え
rbenv global 3.3.7

カレントディレクトリのみのバージョンの切り替え
rbenv local 3.3.7
```

再度、`rbenv versions`を実行して、system以外のバージョンが指定されているか確認してください。
```
% rbenv versions
  system
* 3.3.7 (set by /Users/username/.rbenv/version)
```

最後に`gem install rails`でRailsをインストールします。
```
% gem install rails
% rails -v
Rails 8.0.2
```

バージョンが表示されればインストール成功です。

# 最後に
上記の手順を踏めばRailsがインストールできるかと思います。
特に、Xcode Command Line Toolsは見落とされがち？なので必ずインストールするようにしましょう。

先日、新しいMacを買ったのですが、このことを意識していたおかげで滞りなくRailsをインストールすることができました。また、ストレージが512GBのものを買ったのでXcodeをそのままインストールしました。
CursorのClaude Sonnet4がSonnet3.7よりもお得な件

# CursorでSonnet 4が利用可能に

https://x.com/cursor_ai/status/1925594428095561941

# 安い

![スクリーンショット 2025-05-23 15.10.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378609/89e610f3-beef-4313-b68f-31f4753148cc.png)


- gpt-4.5-previewの1/100のリクエスト消費量で使えます
- なぜか3.7よりもリクエストの消費量が少ないです

複雑なタスクでは3.7をメインに使っていましたが、これからは4をメインに使うことになりそう
【ChatGPT＋4o Image Generation】で、元絵の雰囲気を壊さずに新たな画像を生成する方法です。


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

　今回は、4o Image Generationで、元絵の雰囲気を壊さずに新たな画像を生成する方法です。

:::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)
***
　まずは、【ニュース】です。

　ゆうべ（2025/05/23）の1:30に
　　Anthropicから発表がありました。

　[Anthropic公式ポスト](https://x.com/AnthropicAI/status/1925591505332576377?t=LqqLcYN-yUfWJ0b-Qlq-kQ&s=19)

***（GPT-4.5翻訳）***


### Claude 4モデル発表

* **Claude Opus 4**：史上最強モデルで、世界最高峰のコーディング性能。
* **Claude Sonnet 4**：前世代より大幅進化。コーディング・推論能力が向上。

### 主な特徴

* 「即時応答モード」と「拡張思考モード」の2モード搭載。
* 推論とツール（例：ウェブ検索）を交互に使用し、回答精度を向上。
* ソフトウェア問題解決の評価指標「SWE-bench Verified」で業界最高水準を達成。

### 新サービス・拡張機能

* **Claude Code**が一般提供開始。ターミナルやIDE、SDKなど多彩な開発環境に対応。
* コーディングだけにとどまらず、リサーチやプロジェクト計画にも対応可能。

### 提供状況

* 本日より両モデルは有料プランで利用可能。
* **Claude Sonnet 4** は無料プランでも利用可能。

詳細はこちら：

* [公式発表ページ](https://anthropic.com/news/claude-4)
* [発表イベント動画](https://youtube.com/watch?v=nZCy8E…)
***

　これに伴い、
　　APIも発表されました。

　[Anthropic公式ポスト](https://x.com/AnthropicAI/status/1925633118104416587?t=GI_7bJE0oEms5GUZGVuz-w&s=19)

***（GPT-4.5翻訳）***

### Anthropic APIに新機能が登場：強力なAIエージェント開発を支援

以下4つの新機能が追加されました：

1. **コード実行ツール**

   * Claudeをコード生成アシスタントからデータ分析エージェントへ進化させる機能。
   * Pythonコードの実行、データ分析、可視化をAPI内で直接可能に。

2. **MCPコネクター**

   * クライアントコードを書かずに、Claudeを任意のリモートMCPサーバーへ接続可能。
   * APIリクエストにサーバーURLを追加するだけで、ツールの検出・実行・エラー処理をClaudeが自動で対応。

3. **Files API**

   * ドキュメントを一度アップロードすれば、複数の会話で繰り返し参照可能。
   * ナレッジベース、技術文書、データセットの活用を簡単化。

4. **プロンプトキャッシュの延長**

   * 標準の5分キャッシュに加えて、新たに1時間のキャッシュ（TTL）を導入。
   * コストを最大90%、レイテンシを最大85%削減し、長いプロンプトを扱う作業を効率化。
***

　無料版Androidアプリも
　　すでにSonnet 4が
　　　標準になっています。
***
　次に

　こんな騒ぎの中、
　　日本のLLMが発表されました。

　[より高性能になったPLaMo Primeを1/4以下の新価格で提供](https://www.preferred.jp/ja/news/pr20250522/)

　経済産業省とNEDOが
　　日本の生成AI基盤モデルの
　　　開発力向上を目指して
　　　　実施するプロジェクト
　　　　　GENIAC第2期において、
　　　　　　開発されたそうです。

　日本語を多く含む世界最大規模の
　　高品質なデータセットを構築し、
　　　それを利用して学習した
　　　　PLaMo 2.0-31Bを
　　　　　フルスクラッチで開発。

　日本語の生成能力を
　　評価するベンチマークにおいては、
　　　GPT-4oに次ぐ高い評価スコアを
　　　　記録したとか。

　[PLaMo LLM公式ポスト](https://x.com/PLaMoLLM/status/1925410565075472652?t=sv_dVXG_4gUGO7xFwtGJTA&s=19)

　お試しもできましたので、
　　少し触ってみました。

　多機能なGPT-4oと比べるのは
　　無理があるでしょう。

　LLM単体でチェックです。

　自己紹介、
　　ラストナレッジカットオフ
　　　（2022年初頭）、
　　　　それからほかではダメな
　　　　　“スマホ熱中症”もチェック。

　“スマホ熱中症”は
　　ほかではダメでしたが
　　　正解を出してきました。
***
　では、【本題】です。

　今回は、
　　4o Image Generationで
　　　元絵の雰囲気を壊さずに
　　　　新たな画像を生成する方法です｡
　　　
　ほかの画像生成AIで生成された画像を
　　取り込んでみると、
　　　近しいものにはなりますが、
　　　　雰囲気が変わってしまいます。

　できるだけ
　　雰囲気をそのままにして
　　　加工したいところです。
***
　手順は次のとおり。

　❶元画像をアップロード
　❷Prompt入力として
　　　どうしたいかを入力・送信する

　これだけです。

　もちろん、
　　完璧ではなく、
　　　元絵にあったものが
　　　　なくなったり
　　　　　移動してたり
　　　　　　変形していたりします。

　それでも
　　雰囲気はそのまま
　　　加工されます。

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

　今回は、ここまで。
Factory Method パターン


## 1. Factory Method パターンとは？

- **定義**: オブジェクトの生成をサブクラスに委譲するデザインパターン
- **目的**: クラスのインスタンス化を柔軟にし、コードの拡張性と保守性を高める
- **カテゴリ**: 生成パターン（Creational Pattern）

## 2. どんな時に使う？

- オブジェクトの生成ロジックを一箇所にまとめたい
- サブクラスで具体的なオブジェクト生成をカスタマイズしたい
- 実行時にどのクラスをインスタンス化するかを決定したい

## 3. 構造

- **Creator**: ファクトリメソッドを定義する抽象クラス/インターフェース
- **ConcreteCreator**: ファクトリメソッドを実装し、具体的な製品を生成
- **Product**: 生成されるオブジェクトのインターフェース/抽象クラス
- **ConcreteProduct**: 具体的な製品クラス

## 4. サンプルコード（Java）

以下は、ピザの種類を生成するファクトリメソッドの例です。

### Productインターフェース

```java
interface Pizza {
    void prepare();
}
```

### ConcreteProduct

```java
class MargheritaPizza implements Pizza {
    public void prepare() {
        System.out.println("Preparing Margherita Pizza");
    }
}

class PepperoniPizza implements Pizza {
    public void prepare() {
        System.out.println("Preparing Pepperoni Pizza");
    }
}
```

### Creator抽象クラス

```java
abstract class PizzaStore {
    public Pizza orderPizza(String type) {
        Pizza pizza = createPizza(type);
        pizza.prepare();
        return pizza;
    }
    
    abstract Pizza createPizza(String type);
}
```

### ConcreteCreator

```java
class NYPizzaStore extends PizzaStore {
    Pizza createPizza(String type) {
        if (type.equals("margherita")) {
            return new MargheritaPizza();
        } else if (type.equals("pepperoni")) {
            return new PepperoniPizza();
        }
        return null;
    }
}
```

### クライアントコード

```java
public class Main {
    public static void main(String[] args) {
        PizzaStore nyStore = new NYPizzaStore();
        Pizza pizza = nyStore.orderPizza("margherita");
    }
}
```

## 5. メリット

- **柔軟性**: 新しい製品を追加する際、既存のコードを変更せずにサブクラスで対応可能
- **単一責任の原則**: オブジェクト生成ロジックをCreatorに分離
- **拡張性**: 新しいConcreteCreatorを追加することで容易に拡張可能

## 6. デメリット

- クラス数が増える（各製品ごとにConcreteProductやConcreteCreatorが必要）
- シンプルな生成ロジックではオーバーヘッドになる可能性

## 7. 実際の使用例

- GUIフレームワーク（ボタンやウィンドウの生成）
- データベース接続ファクトリ（MySQL、PostgreSQLなど）
- ロギングライブラリ（異なるログ出力方法の生成）

## 8. まとめ

- Factory Methodは、生成ロジックの柔軟性と拡張性を重視する場合に有効
- サブクラスに生成の詳細を委譲し、クライアントコードをシンプルに保つ
- 適切な場面で使用すれば、コードの保守性が向上！
JavaでCSVを読み込むライブラリ

# ライブラリ
### Github
https://github.com/uchicom/csve

### Maven
```
<dependency>
    <groupId>com.uchicom</groupId>
    <artifactId>csve</artifactId>
    <version>1.1.0</version>
</dependency>
```

### Sample
```
var file = new File();
var charset = StandardCharsets.UTF_8;
var columnSize = 10; // csvのカラム数
var isForceSizeFix = false; // trueにすると、指定したcolumnSizeを無視して、カラムを増やす
try (var reader = new CSVReader(file, charset)) {
    String[] record = null;
    while ((record = getNextCsvLine(columnSize, boolean isForceSizeFix)) != null) {
      // ここに一行ごとの処理を記載する.
    }
}
```

# JavaでCSVエディタを作った
Excel買うお金がないし、低スペックPCではLibreOfficeを使用するのは荷が重いという動機で、数年前にJavaのCSVエディタを作りました。すぐに情熱は冷めてしまって放置してしまったのですが。

### CSVReaderを利用する
ただ、このリポジトリには銀行CSVを読み込むためのメソッドをCSVReaderに用意していたので、
CSVの読み込みに使えるということだけを記憶していました。

ちょうど最近の案件でCSVを読み込む内容があったので、１から作るよりも楽だという理由で、上記ライブラリのCSVReaderを使いました。

この案件の単体テストや結合テスト上問題はないのですが、結論から言うとバグがありました。

# なぜCSVReaderにバグがあるとわかったのか
### 既存DBへの不満
同じころ、WEBサービスのデータベースで再起動後にデータが破損するという事態が発生し、
いまも、もやもやしながら、バージョンを落として使用しています。
私の作っているシステムでは、常時大量のアクセスがあるわけでもなく、
業務が発生したら、その都度利用されるようなもので、データ量もそこまで多くありません。

### CSVDBの自作に挑戦
そのようなこともあり、CSVを利用した簡単なRDBを作ろうと思い立ちました。
最初は簡単なSQLを発行して、標準出力に結果行を吐き出すという機能を実装しました。
パフォーマンスを犠牲にすることは承知の上ですが、既存の検索ツールと比べて桁違いで遅いとモチベーションが下がります。
そこで、世の中のCSVをSQLで検索する機能と比較してみることにしました。
ChatGPTに性能のよいものを聞いたところ、DuckDBを提案してきたので、
DuckDBとのベンチマーク比較を行おうと、最初は3万行、次に5万行と試したところ、
5万行の比較の際にcsvdbの検索ツールでエラーが発生しました。

### バグ修正
4Mバイトのキャッシュで処理を行っていたのだけど、
キャッシュの更新がうまくできていないため、4Mバイトのキャッシュを使い切るとエラーになるという状態でした。
客先にリリースしてしまったからには、バグを修正しなければなりません。
もはや他人のソースコードのようでしたが、バグ修正済みです。
ついでに、Java21化してます。
ドキュメント管理の運用方法について

**個人の感想であり、参考程度でお願いいたします。**
**このような事が出来たら良いのではという内容も含まれています。**

## 1. ドキュメント管理のステータス分類
- **UMLなどの標準フォーマットで管理**
  - 共有性が高く、再利用しやすい  
  - 最新状態が維持されているかが重要  

- **ドキュメント管理対象にしないと判定**
  - メンテナンス負荷や利用価値を考慮し、記録しない方が適切な場合がある
  - 対象外と判断した経緯は記録したほうが良い
  
- **非定型ながら記録が残っている**
  - 個人のスタイルに依存しやすく、読み解きが困難な場合がある  
  - 標準化の推進で管理しやすくなる可能性あり  

- **有識者の頭の中にあるが未記録**
  - 知識の属人化が問題になりやすく、流出リスクがある  
  - ナレッジ共有の仕組みが必要（インタビュー記録、Q&A など）  

- **ドキュメントがなく、有識者もいないことは認識している**
  - 作成するかどうかの判断が必要  
  - 必要性の整理と管理方針の決定が重要  

- **ドキュメント管理について考えていない**
  - 情報共有の仕組みを構築することが課題  
  - 長期的に属人的運用になるリスクがある  

- **ドキュメントの有無が不明（調査していない）**
  - 既存の資料を棚卸しし、利用可能か確認することが重要  
  - 必要に応じて統合・更新を進める  

---

## 2. メンテナンス性
- **バージョン管理**
  - Git, SVN などのツールを使用して履歴管理  
  - 変更履歴を追跡可能で、誰が何を変更したかを記録  

- **フォーマットの管理**
  - **PlantUMLやMarkdownなどのテキスト形式**
    - 変更が容易で、コード管理も可能  
    - 権限管理や共同編集がしやすい  

  - **ExcelやWordのメリット**
    - 視認性が高く、構造化しやすい  
    - ただし、ファイル分散・管理負荷が課題  

- **自動生成・管理の仕組み**
  - **PlantUMLやGraphvizで自動化**
    - 仕様書のビジュアル化が容易  
    - 手動編集の負担を軽減できる
🌟 Vol.8.13〜8.15 総まとめ：Struts2 UI制御編（実務向け UI 出し分け・エラー表示制御・再利用設計）

Struts2連載の中でも、**UIの動的制御・エラー表示の最適化・フォーム再利用**といった**実務のUI開発でよく遭遇するニーズ**に直結するのが、Vol.8.13〜8.15 の3本です。

- **フォームのエラーメッセージ出し分け**
- **JSP部品の共通化・再利用設計**
- **ログイン状態や権限に応じたUI切り替え**

など、**保守性・可読性・実装効率**すべてに効くノウハウが詰まった実務派シリーズとなっています！

---

## ✅ 対象読者

- Struts2で実務アプリを開発しており、**UI制御やエラーメッセージ表示を最適化したい**方
- **フォーム設計の重複排除・再利用設計**をしたい方
- **認証・認可ベースのUI出し分け**を取り入れたい方
- Action/JSP両方の視点で、**柔軟な構造設計**をしたい方

---

## 📚 各回まとめ（Vol.8.13〜8.15）

### 📘 Vol.8.13：【Struts2】フィールド単位のエラーメッセージ制御  
**〜 `<s:fielderror>` / `<s:actionerror>` 徹底使い分け 〜**  
📎 https://qiita.com/juehara-crypto/items/51e140db17b955714875  

- `<s:fielderror>` で **フォームフィールド単位**のエラー表示制御
- `<s:actionerror>` で **全体的な業務エラー**メッセージを管理
- **使い分け方のベストプラクティス**と実装例を掲載
- 実務のバリデーション設計にそのまま使えるTipsも多数！

---

### 📗 Vol.8.14：【Struts2】フォーム部品の共通化・再利用  
**〜 入力UIの部品化で保守性UP！〜**  
📎 https://qiita.com/juehara-crypto/items/1d1437d0782f3ece08af  

- `<%@ include %>` や `<s:include>` を使った**フォーム部品の共通化**
- **共通化に適した部品の判断基準**、設計上の注意点
- 実際のアプリで多用する **名前入力欄 / ログイン欄 / エラーブロック** などを例示
- **DRY原則（Don't Repeat Yourself）に基づくフォーム最適化**

---

### 📗 Vol.8.15：【Struts2】状態に応じたUI出し分け制御  
**〜 ログイン状態・権限・入力内容による表示切替 〜**  
📎 https://qiita.com/juehara-crypto/items/9306b1b0ca0053bd0eb6  

- `<s:if>` と OGNL式を使って**ログイン状態やユーザー権限によるUI切替**を実装
- `#session` や `#parameters` を駆使した状態判定の実用例
- **Actionで状態フラグを制御する設計**で、JSPの可読性もUP！
- 管理者用UIやモード切替制御にもそのまま使える設計パターン

---

## 💡 実務アプリにおける活用イメージ

- **ログイン前後でナビゲーション出し分け**
- **エラー時だけ特定ブロックを表示**
- **共通フォーム部品で開発効率と保守性を両立**
- **管理者と一般ユーザーでボタン表示を切り替える** など

---

## 🧭 今後の連載予定

次回以降は「**実務における入力検証と確認画面設計の最適化**」や「**Ajaxを活用した動的フォーム構築**」に進む予定です。

---

## 🧵 関連リンク

- 🔗 [Struts2連載まとめ＆今後の記事リンクポータル](https://qiita.com/juehara-crypto/items/5eed22b909069cd4cb9d)
- 🔗 [🌟 Vol.8.9〜8.12 総まとめ：Struts2タグライブラリ応用編【UI制御・構造最適化・共通化】](https://qiita.com/juehara-crypto/items/e2837f5bbaa50d7aefdd)

---

📌 実務でStruts2を使っている方は、ぜひ **Vol.8.13〜15** を現場に活かしてみてくださいね！今後も実務寄りに振ったStruts2連載、鋭意継続中です。
Markdownで変数展開する方法 - 変数を埋め込んだMarkdownを記述し、呼び出す。 -

# フォルダ構造
まず、以下のフォルダ構造を作成してください。
```
.
└── MyProject
    ├── main.md
    └── Templates
        └── template.md
```

# 目標
- **template.md**に関数展開するMarkdownを記述し、**main.mdに展開**する。
- **template.md**をもとに、新たなファイルを作成して関数展開をする。

# template.mdを編集する
まず、このように書いてください。

```
<%*
const IP_address = "192.168.1.1/24";
const DefaultGateway = "192.168.1.254/24";
const DG = DefaultGateway;

tR=`
サーバのIPアドレスは${IP_address}です。
デフォルトゲートウェイは${DefaultGateway}です。
また、DGは${DG}です。変数はこのように代入を行うこともできます。
`
%>
```

# main.mdに挿入する
- まず、挿入するファイルに移動してください。
- **ctrl + P**のショートカットを使用してコマンドパレットを開いてください。
- 次に、**Templater: Open insert template modal**を選択して**Enter**を押してください。
![スクリーンショット 2025-05-23 142942.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635999/90061017-a265-4206-aa93-6aa0747f842a.png)
- 挿入するテンプレートファイルを選択してください。
![スクリーンショット 2025-05-23 143241.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635999/deb3c8c7-edc7-4b23-b31b-36fa4ff5f95d.png)
- 変数展開した文章が表示されます。![スクリーンショット 2025-05-23 143241.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635999/79a2c4b8-0456-4224-ae5c-ec8d7e223e1c.png)

![スクリーンショット 2025-05-23 143524.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635999/5fdc5e8f-14b3-48b4-a6c7-46dfe10cd481.png)

# テンプレートファイルから新しいファイルを作成する
- **ctrl + P**のショートカットを使用してコマンドパレットを開いてください。
- 次に、**Templater:Create new note from template**を選択して**Enter**を押してください。
![スクリーンショット 2025-05-23 142942.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635999/808e542b-d877-4e2a-a9a9-2b144cafe272.png)
- 作成するテンプレートファイルを選択してください。
![スクリーンショット 2025-05-23 144014.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635999/f84a7471-b9ba-4df9-90dc-dd01f7cc3939.png)

![スクリーンショット 2025-05-23 143241.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635999/f5cf935e-2d6d-438a-af4e-b97a591cf91c.png)

- Untitledというファイル名とともにテンプレートから変数展開された文章ファイルが生成されました。
![スクリーンショット 2025-05-23 144014.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635999/ff65ff06-0fad-4402-93e7-800c333ae263.png)
AWS RDS に dump データを import するには？

# 前提

RDSにdumpファイルをimportさせようとすると「Access Denied」となります。
SUPER USER は一般には配布されませんのでどうにかする必要がありますが、今回は一番手っ取り早い方法を共有します。

# import方法

Workbentch などで dump したフォルダをVSCodeなどのエディタで開き、権限の強い操作を一括置換でコメントアウトし、INSERT文のみのSQLにしてしまいます。

具体的には以下のSET文をコメントアウトするよう置換して下さい。

```diff_sql
- SET @MYSQLDUMP_TEMP_LOG_BIN
+ # SET @MYSQLDUMP_TEMP_LOG_BIN
```

```diff_sql
- SET @@SESSION
+ # SET @@SESSION
```

以上。
ミドルウェアチェーンの仕組みを整理する

## はじめに

フレームワークのミドルウェアを深く理解したくて、PHPで簡単なミドルウェアチェーンのコードを通して、処理の流れをイメージできるようにした。
今回はその中で学んだポイントを整理する。

---

## PHPのアロー関数（fn）は無名関数の短縮形であり、`use`を省略できる

```php
$fn1 = fn($x) => $x + $y;
$fn2 = function($x) use ($y) { return $x + $y; };
```

このように、アロー関数では外部変数を明示的に `use` しなくても、スコープ内にある変数は自動でクロージャとして取り込まれる。

---

## 前処理を a → b → c、後処理を c → b → a の順で行いたい場合、c → b → a の順で関数を包めばよい


以下のような `Middleware` インターフェースを実装した複数のクラス（A, B, C）があるとする。

```php
interface Middleware {
    public function handle(string $request, callable $next): string;
}
```

それぞれの `handle` メソッドで、前後処理を実装する。

```php
class MiddlewareA implements Middleware {
    public function handle(string $request, callable $next): string {
        $request .= "[A:before]";
        $response = $next($request);
        return $response . "[A:after]";
    }
}
```

ミドルウェアは配列で保持しておき、入れ子構造を逆順に構築する。

```php
$middlewares = [new MiddlewareA(), new MiddlewareB(), new MiddlewareC()];
$middlewares = array_reverse($middlewares);

$action = fn(string $request): string => $request;

foreach ($middlewares as $middleware) {
    $action = fn(string $request) => $middleware->handle($request, $action);
}
```

この時点で `$action` は、以下のような構造になる。

```plaintext
A(
  B(
    C(
      BaseAction
    )
  )
)
```

つまり、

* 実行時：A → B → C → Base
* 戻り時：C → B → A（後処理）

という流れが実現される。

---

## まとめ
* アロー関数は `use` を省略できる。
* ミドルウェアで「ある処理の前後に共通の処理を挟みたい」とき、ラップ構造で実現できる
* 実行順と戻り順をコントロールしたいなら、「wrapの順番」を逆に考えること

---

## おわりに
今回の学びを通して、ミドルウェアが「ベースの処理を引数として受け取るメソッド」であることが腑に落ちた。
SEO対策で使える(かもしれない)metaタグ

SEO対策について時々聞かれることがあるので
備忘録として記録します。
よく使うと思われるものに限定しているので、
metaタグについて詳しくしりたい方は
Google先生に聞いてください。

### metaタグを記載する箇所
```
<html>
<head>
　　　　←この場所に記載
</head>
<body>
```


### ページの説明
content="ページの説明"でページの説明を記載。
```
<meta name="description" content="このページはmetaタグについて記載しています">
```

### 検索ワード
content="検索ワード"で検索ワードを記載。
複数記載する場合は,(カンマ)で区切る。
```
<meta name="keywords" content="metaタグ,検索ワード">
```

Googleはmetakeywordsを認識しないようです。
Googleがサポートするmetaタグは以下URLを参照。
https://developers.google.com/search/docs/crawling-indexing/special-tags?hl=ja&visit_id=638835723444424010-3779302321&rd=1



### 文字コードの指定
charaset="文字コード"で文字コードを指定。
SEO対策とは関係ない気がするけど知っていると地味に役立つと思う、
```
<meta charaset="utf-8">
```
📗 Vol.8.15：【Struts2】状態に応じたUI出し分け制御 〜 ログイン状態・権限・入力内容による表示切替 〜

※ 本章は「UI制御編（実務向け UI 出し分け・エラー表示制御・再利用設計）」シリーズとなります

---

Struts2での画面制御において、「誰に」「いつ」「何を」表示するかの出し分けは、実務では欠かせないUIパターンです。

本記事では、ログイン状態や権限、パラメータやActionの状態によって画面要素を出し分けるための代表的な手法を、OGNL式やStruts2タグを活用しながら紹介します。

---

## 🎯 1. はじめに：UI出し分けの必要性

多くの業務システムでは、以下のようなUI出し分けが必要になります：

- 管理者だけに「削除」ボタンを表示する
- 入力が完了したときだけ「確認へ進む」ボタンを表示する
- ログイン中のユーザー専用ナビゲーションを表示する

Struts2では、**OGNL式 + `<s:if>` / `<s:else>`タグ** を組み合わせることで、これらのUI出し分けが柔軟に実現できます。

---

## 💡 2. ログイン状態・ユーザー情報による表示制御

セッション情報に格納されている `user_id` や `user_role` を使って、表示内容を切り替えるのが基本です。

```jsp
<%-- 管理者のみ表示 --%>
<s:if test="#session.user_role == 'admin'">
  <s:submit value="削除する" />
</s:if>
```
`#session.プロパティ名` の形式でアクセスできます。

---

### 🧩 3. 入力内容やパラメータによる出し分け
URLパラメータやフォームパラメータで出し分けたいときは、`#parameters` を使います。

```jsp
<%-- URLパラメータ「mode=edit」のときのみ表示 --%>
<s:if test="#parameters.mode[0] == 'edit'">
  <p>編集中の内容が表示されます。</p>
</s:if>
```

`#parameters.パラメータ名[0]` で、値を取得可能です。

---

### 🔁 4. フラグ（Actionプロパティ）による条件分岐パターン
Actionクラス内に「表示フラグ用のプロパティ」を定義して、JSP側で使う方法も実務で多用されます。

***Actionクラス側：***

```java
private boolean showSubmitButton;

public boolean isShowSubmitButton() {
    return showSubmitButton;
}

```

***JSP側：***
```jsp
<s:if test="showSubmitButton">
  <s:submit value="送信する" />
</s:if>
```

フラグの切り替えをAction側に寄せることで、JSP側のロジックを簡潔に保てます。

---
### 🎨 5. OGNL式で複雑な条件にも対応
OGNLでは、複数の条件を組み合わせた評価式も使用可能です。
```jsp
<s:if test="#session.user_role == 'admin' && editMode == true">
  <s:submit value="管理者編集モードで保存" />
</s:if>
```

条件が複雑になる場合は、***見通しを重視して Action 側に切り出す*** のも良いアプローチです。

---

### 📌 6. Tips：出し分けが増えすぎたときの整理法
UI制御の条件が増えすぎた場合は、以下のようなリファクタリングがおすすめです：

- Action に表示制御用のフラグプロパティを追加

- ViewModel的な中間オブジェクトに分離

- JSP の中で直接ビジネスロジックを記述しすぎない

---

### ✅ 7. まとめ
Struts2では、OGNL式や `<s:if>` タグを活用することで、状態に応じた柔軟なUI出し分けが可能です。

| 状態の種類         | 典型的な出し分け例             |
| ------------- | --------------------- |
| ログイン状態 / 権限   | 管理者用ボタン、ナビゲーション切替     |
| パラメータ / URL情報 | 編集モード vs 閲覧モードのUI出し分け |
| Actionの状態・フラグ | 入力完了時のボタン切替、確認画面UIの出現 |

***実務でのUI制御は「表示対象」「表示条件」「表示タイミング」の3軸で設計する***ことで、わかりやすく保守しやすいコードになります。

📘 次回は [🌟 Vol.8.13〜8.15 総まとめ：Struts2 UI制御編（実務向け UI 出し分け・エラー表示制御・再利用設計）](https://qiita.com/juehara-crypto/items/3e1bac9c86a9e8f2eb70)を予定しています。


---
Markdownで変数展開する方法 - ObsidianとTemplaterの導入編 - 


## 関連記事はこちら

[Markdownで変数展開を実施](https://qiita.com/yuu_v1113v/private/469460bbaae520e443ab)

## はじめに
皆さんはこのような経験はありませんか？

- 手順書を書いているが、値を変更するとき複数個所を変更しなくてはならない。
- 変数が使えないので、手順書として環境にあてはめて使えない。

私もすごく悩みました。

LaTeXは変数としてマクロを使えてきれいに書けるけどコピペするとうまくいかない、、、
Notionは変数が使えない、、、
Wordの差し込み文書はExcelの2行分で管理しなければならず複雑、、、

でもこの悩みが解決するMarkdownで変数展開する方法がありました。

## ツール紹介

今回私が紹介するツールは
- **Obsidian**
- **Templater**

この2つです。

**Obsidian**は**エディタ**です。
**Templater**は**Obsidianのプラグイン**です。

この2つを使うことで**Markdownに変数展開を行うことができる**のです。

## Obsidianをダウンロード及びインストール
- まず、Obsidian公式サイトにアクセスします。
[Obsidian公式サイト](https://obsidian.md/)

- 以下のサイトにアクセスしたら「Get Obsidian for Windows」をクリックします。

![スクリーンショット 2025-05-23 131807.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635999/9084ef33-1eea-4c47-aa44-725d51511815.png)

- クリックすると、ページが飛んでダウンロードボタンが現れますので、「**Download for Windows**」をクリックするとダウンロードが開始されます。

![スクリーンショット 2025-05-23 132741.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635999/3e3b19ad-b11e-4bbe-b23b-70be454e5127.png)

- このようなインストーラーがダウンロードされるので、クリックします。

![スクリーンショット 2025-05-23 133124.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635999/38d6923d-267a-480f-8700-6027911b18f8.png)

- クリックすると、選択項目が現れるので指示に従いながらインストールしてください。

## Templaterの導入

- 設定画面を開きます。
設定画面を開くには、エディタ左下の歯車のアイコンをクリックします。

![スクリーンショット 2025-05-23 133655.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635999/ac262324-dce3-422c-aaed-dae706fa8274.png)

- オプションの「**コミュニティプラグイン**」を選択し、「**コミュニティプラグインを有効化**」をクリックしてください。
![スクリーンショット 2025-05-23 134042.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635999/af047306-6eb5-45ac-9cde-12e77848cdba.png)

- プラグインを導入するには、「**コミュニティプラグイン**」の「**閲覧**」をクリックします。

![スクリーンショット 2025-05-23 134245.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635999/8b42f398-c6ff-497b-97f9-0a1ffe507932.png)

- 検索窓に「**Templater**」と入力すると、「**Templater**」が出てくるのでクリックします。

![スクリーンショット 2025-05-23 134640.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635999/7d988fdd-d2d5-4c2f-8471-e739a36f3bdf.png)

- 「**インストール**」をクリックします。

![スクリーンショット 2025-05-23 134836.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635999/84cfce59-a27e-4a0e-a432-ac15554bf781.png)

- 有効化をクリックします。
![スクリーンショット 2025-05-23 135123.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635999/17e4b0e8-be2e-4330-ae8b-5c3753fe09df.png)

- 「**インストールされたプラグイン**」に表示されていれば導入完了です。
![スクリーンショット 2025-05-23 135510.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635999/5666baf1-b891-44cb-82cd-0c7ec9cd2f15.png)
【5日目】スコープ・マネジメント（Scope Management）とは？【PMBOKを1日10分、半年で！】

# ✅【5日目】スコープ・マネジメント（Scope Management）とは？

スコープ（Scope）とは「範囲」のこと。  
この知識エリアでは、

> **プロジェクトで実施する作業の内容や範囲を明確にし、それを管理すること**

がテーマになる。

## 🧭 なぜスコープが重要？

- 「頼まれてない作業を勝手に増やす（スコープクリープ）」と、コストや納期が破綻する
- 一方で「必要な作業が抜けていた」ら、成果物として不完全

そのため、**最初にきちんとスコープを定義し、変更されないようコントロール**するのが非常に重要。

## 🔧 スコープ・マネジメントの主なプロセス

| プロセス群 | プロセス名                       | 説明                                          |
|------------|-----------------------------------|-----------------------------------------------|
| 計画        | スコープ・マネジメント計画の作成   | スコープの決め方・管理方法をルール化           |
| 計画        | 要求事項の収集                   | 利害関係者のニーズや希望を集める               |
| 計画        | スコープの定義                   | 実施する作業・成果物の範囲を明文化             |
| 計画        | WBSの作成                        | 作業範囲を細かく分解し、管理しやすくする       |
| 監視        | スコープの妥当性確認             | 完成した成果が合意済みの内容と一致するか確認   |
| 監視        | スコープのコントロール           | 計画外の作業が入ってきていないかを監視         |

## 🧱 WBSとは？

**WBS（Work Breakdown Structure）**とは、  
プロジェクトの作業を階層構造で細かく分解した図やリストのこと。

### 例：
Astroで<head>内のスクリプトが消える理由とその対策

Astroで構築したサイトにおいて、`<head>`タグ内に記述したスクリプトがビルド後に消えてしまうという現象が発生することがあります。

Astroは「**最終的に生成されるHTML/CSS/JSをできる限り軽量にする**」という設計思想を持っており、そのために内部では[Vite](https://vitejs.dev/)というビルドツールを利用しています。

このViteには「**使われていないコードを削除する（ツリーシェイキング）**」という最適化機能があります。これは、インポートされたJSモジュールやコンポーネントのうち、実際に参照されていないものを**自動で検出し、最終的な出力から省く**というものです。

本来これは「未使用コードを削ってファイルサイズを減らす」ための便利な仕組みですが、副作用として、次のようなことが起こります：

- `<head>`タグ内に直接書いた `<script>` タグなどが、他のJSやテンプレートから明示的に参照されていないと「使われていない」と判断される
- 結果として、**実際には必要なスクリプトであっても、ビルド後にHTML出力から除外されてしまう**

これは特に、計測タグ・外部ウィジェット・フォント読み込みなどの**直接はどこからも参照されないが、HTMLに含めること自体が目的のコード**にとって致命的です。

調べたところ、この問題に対する確実な対策として、Astroでは次のように記述すると良いようです：

```astro
<Fragment set:html={`<script src="https://example.com/script.js"></script>`} />
````
このようにすることで、スクリプトはHTML文字列として明示的に出力され、ビルド時の最適化処理の対象外となります。

## `<Fragment>`とは

`<Fragment>` は Astro の特殊なタグで、**実際には何のHTMLタグも生成しないラッパー**です。Reactの `<></>`（フラグメント）と同様、構造上複数のノードを返したいときや、**特定の属性を適用するためのダミー要素**として使われます。

Astroでは特に、`set:html` でHTML文字列を差し込むための器として使用されることが多く、`<Fragment>` 自体が出力に現れることはありません。



## `set:html`とは

`set:html` は、指定された文字列をそのままHTMLとして評価し、出力に埋め込むAstro独自の属性です。これはReactにおける `dangerouslySetInnerHTML` と同様に、**エスケープ処理を行わず、与えられた文字列をそのままDOMに描画**します。

このため、通常の`<script>`タグのようにパースされ、Viteのビルドプロセスに干渉されることなく、**確実に出力HTMLに含めることができます**。


## まとめ

Astroでは、`<script>`タグを通常通りに書いても、Viteの最適化処理により削除されてしまう場合があります。これを防ぐために、スクリプトを文字列として差し込む方法として、`<Fragment>` + `set:html` の組み合わせが推奨されます。

参考：[テンプレートディレクティブの概要 | Docs](https://docs.astro.build/ja/reference/directives-reference/)
Cursor で v0 モデルを使うには Premium または Team プランが必要でした

# 結論

Cursor で v0 モデルを追加するには v0 の Premium または Team プランが必要でした

# やったこと

## 前提条件

- Cursor をインストール済みであること
- Vercel アカウントを所有していること
- **v0 の Usage-Based Pricing を設定済み**であること
- **私は v0 の Free プランです**

## v0 API の API Key を発行します

[v0.dev](https://v0.dev/chat/settings/keys) にアクセスする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129148/315d53fd-ad8f-4a48-bd83-cd59f92d57a0.png)

API Key を作成します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129148/2f4e9152-f116-442b-ac7b-779aefb80e26.png)

## Cursor に v0 API Key を設定する

1. Cursor Settings を開きます
1. Models タブを選択します
1. **OpenAI API Key** に v0 API Key を設定します
1. Override OpenAI Base URL に `https://api.v0.dev/v1` を設定します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129148/28fc4c30-c558-4ea8-82b6-dbb7e683d37e.png)

Enable OpenAI API Key を押下します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129148/97c236a3-8770-42c9-b4a3-7ead935472e6.png)

## 以下のエラーがでます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129148/f48fe0d7-7f2f-4a5f-ac8a-4040bdb883f8.png)

```plaintext
(status code 403)
{"success":false,"error":"Premium or Team plan required to access the v0 API: https://v0.dev/chat/settings/billing"}
```

## 参考ドキュメント

https://vercel.com/docs/v0/api#models

https://vercel.com/docs/v0/cursor

## 感想

課金が必要だったわね
良いコード／悪いコードで学ぶ設計入門 第１４章

![ChatGPT Image 2025年5月23日 13_20_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/357904/940552ef-dbf6-44d9-bc1d-72ce07ffd897.png)

# 第14章 リファクタリング ―既存コードを成長に導く技―

この章では、既存コードの可読性や保守性を向上させるためのリファクタリング手法と、それを安全に行うためのユニットテストの重要性、さらには仕様があやふやな場合の対処法まで、実践的かつ丁寧に解説されている。個人的には、単なる「コードの書き換え」ではないリファクタリングの本質が伝わってきて、非常に納得感があった。

---

## 14.1 リファクタリングの流れ

リファクタリングとは、「外から見た挙動を変えずに、コードの内部構造を整理すること」である。その目的は、読みやすさや保守性の向上にある。

### 主な手法
- **ネストの解消**：条件を反転させて早期 `return` などで処理を終了し、ネストを浅くする。
- **ロジックの単位化**：条件チェックと値の代入を分離し、それぞれを意味のあるまとまりにする。
- **条件の可読性向上**：`!` を避け、肯定的なメソッドに置き換える（例：`!isEnabled()` → `isDisabled()`）。
- **目的を表すメソッドへの抽出**：生の条件式を、意図が伝わるメソッド名に置き換える。

こうしたリファクタリングは、可読性やチーム内の共有理解を高めるうえで非常に効果的だと実感した。特に「否定形を避ける」工夫は、コードレビューの負担を減らす観点でも重要だ。

---

## 14.2 ユニットテストでリファクタリングのミスを防ぐ

ユニットテストは、コードを安全にリファクタリングするために欠かせない。特に「**リファクタリングにはユニットテストが必須**」という強調には共感する。

### リファクタリングの流れ（TDD的アプローチ）
1. **構造のひな形クラスを用意**
2. **仕様に基づいたテストコードを書く**
3. **テストの失敗を確認する**
4. **最小限のコードでテストを通す**
5. **既存ロジックを組み込みつつ構造改善**
6. **少しずつリファクタリングしてテストを通す**

この手順は、「壊しては直す」の繰り返しで、安全かつ段階的に構造を改善していける点が非常に良い。特に既存コードの改修時に使えるパターンだと感じた。

---

## 14.3 あやふやな仕様を理解するための分析方法

リファクタリング以前に「仕様が不明」なケースも多い。そうした場合の分析方法として以下の2つが紹介されている。

### 仕様化テスト
- 適当な引数で挙動を確認
- テストを調整して仕様を類推
- 様々なパターンで挙動を観察し、仕様を可視化

### 試行リファクタリング
- 一時的にリファクタして可読性を上げ、仕様を推定
- メソッドやクラスの切り出しを試す
- デッドコードや不要仕様を発見

この2つの方法は、特にレガシーコードと向き合うときに有効だと感じた。特に「テストなしの試行リファクタリング」は、新人時代に直感的にやっていた方法であり、言語化されたことで自信を持てた。

---

## 14.4 IDE のリファクタリング機能

IDEのリファクタリング機能も有用で、ミスを防ぎつつ機械的な変更ができる。

### 主な機能
- **リネーム**：クラス・メソッド・変数名を一括変更
- **メソッド抽出**：長い処理を意味のある単位に切り出す

日々の開発でもよく使う機能だが、「テストコードを書ける単位に分離する目的」での活用は新たな視点だった。

---

## 14.5 リファクタリングで注意すべきこと

### 機能追加とリファクタリングは同時に行わない
- **「2つの帽子」**（機能追加・リファクタリング）を明確に分けることで、作業の目的と結果をはっきりさせる。

### スモールステップで実施する
- コミット単位を細かく保つことで、レビュー・原因特定が容易になる。
- 変更が多くなる前にPRを出すことで、コンフリクトのリスクを減らせる。

### 無駄な仕様の棚卸し
- バグを含む仕様や、他と競合する仕様は削除対象とする。

このあたりの指針は、リファクタリングだけでなく、チーム開発全体に通じる重要な考え方だと感じた。「何のために変更しているのか」を明確にすることが、最終的なコード品質に直結する。

---

## Rails アプリのリファクタリング

Ruby / Ruby on Rails のような動的型付け言語では、リファクタリングの難易度が高くなる。そのため、以下のような工夫が必要となる。

- 型判定の箇所はリスコフの置換原則を意識し、適切に抽象化
- クラス・メソッドはユニークな名前にして検索ノイズを減らす
- ビジネスロジックを疎結合に分離し、フレームワーク機能はカプセル化

Rails 開発経験がある身として、このアドバイスは非常にリアルだった。特に「名前の衝突を避ける」工夫や、フレームワークとの境界設計は、プロジェクトの長寿命化に直結する。

---

## まとめ

第14章を通して、リファクタリングは単なる構文の書き換えではなく、設計の見直し・仕様の再確認・チーム開発における共通理解を深めるためのプロセスであることが伝わってきた。

個人的には、**「壊さないように整える」**という考え方が、日々の開発においてもっと意識されるべきだと感じた。単に美しく整えるだけでなく、意図を明確に、テストとセットで進めることで、コードベース全体がより健全に育っていくのだと思う。

この章は、実践的なリファクタリングの指針として、繰り返し読み返したくなる内容だった。
📗 Vol.8.14：【Struts2】フォーム部品の共通化・再利用 〜 入力UIの部品化で保守性UP！〜

※ 本章は「UI制御編（実務向け UI 出し分け・エラー表示制御・再利用設計）」シリーズとなります

---
Struts2での開発が進む中で、「**同じようなフォームUI** を複数の画面で使い回したい…！」と思ったことはありませんか？

本記事では、**フォームの共通化・再利用**をテーマに、`<s:form>` や `<%@ include %>` を使った**保守性の高い実務的な構成方法**を紹介します！

---

## ✅ 本記事の対象者

- フォーム構造を複数画面で使い回したい
- `<s:form>` の設計を見直したい
- JSPの共通化設計に迷っている
- 画面ごとの保守をラクにしたい

---

## 🏗 共通フォーム構造の必要性

以下のようなケース、よくあります。

- 「ユーザー登録」画面と「ユーザー編集」画面で同じフォーム構造を使いたい
- 「検索条件フォーム」や「投稿フォーム」などを複数画面で再利用したい

> 💡 **ポイント：** 同じUI構造をコピペして管理すると、保守コストがどんどん上がってしまいます！

---

## 📦 解決策：共通JSPとしてフォーム部品を切り出す！

共通フォームは**別ファイル（JSP）として分離**し、呼び出し元で `<%@ include %>` を使って読み込むのが基本です。

### 📁 構成例

```
/view/
├── UserCreateScreen.jsp
├── UserEditScreen.jsp
└── common/
└── userForm.jsp ← 共通フォーム部品！
```


---

## 💻 実装例：ユーザー情報入力フォームを共通化

### 🔹 共通部品（common/userForm.jsp）

```jsp
<%@ taglib prefix="s" uri="/struts-tags" %>

<tr>
  <th>ユーザー名</th>
  <td><s:textfield name="user.username" /></td>
</tr>
<tr>
  <th>メールアドレス</th>
  <td><s:textfield name="user.email" /></td>
</tr>
```

### 🔹 呼び出し元（UserCreateScreen.jsp）

```jsp
<%@ include file="/view/common/userForm.jsp" %>
```

***✅ 複数画面から同じUI部品を使えるように！***

### 🧩 応用編：条件による分岐も可能！

たとえば「編集画面ではIDは表示のみ」といった制御もできます。
```jsp
<%-- 共通フォーム部品の中で条件分岐 --%>
<% boolean isEdit = request.getRequestURI().contains("Edit"); %>

<tr>
  <th>ユーザーID</th>
  <td>
    <% if (isEdit) { %>
      <s:property value="user.id" />
    <% } else { %>
      <s:textfield name="user.id" />
    <% } %>
  </td>
</tr>
```
※上記は JSTLやOGNLを活用してもっと柔軟に設計可能です！

---
### 📌 注意点とベストプラクティス


| 注意点            | 対処法・ベストプラクティス                     |
| -------------- | --------------------------------- |
| フォーム内のタグ名が競合する | name属性をプレフィックス付きに設計しておくなど工夫を      |
| 共通部品が肥大化する     | 用途ごとに `userForm_search.jsp` などに分離 |
| リクエスト属性に依存しすぎる | `model-driven` を使ってActionからしっかり渡す |

---

### ✨ まとめ
- ✅ 同じ構造のフォームはJSPファイルとして共通化しよう

- ✅ <%@ include %> を使って画面側に組み込む

- ✅ 柔軟な制御が必要なら条件分岐やOGNLも活用

- ✅ 保守性・再利用性が劇的に向上！
---
### [🔗 次回予告：Vol.8.15【状態に応じた表示制御】](https://qiita.com/juehara-crypto/items/9306b1b0ca0053bd0eb6)へ！
次回は「***ボタンの表示／非表示の切り替え***」や「***ログインユーザーに応じたUI制御***」など、***状態管理と連動したUI制御Tips***をお届けします！

[📚 前の記事：Vol.8.13：エラーメッセージ制御編](https://qiita.com/juehara-crypto/items/51e140db17b955714875)
[📚 まとめ記事：Vol.8.9〜8.12 総まとめ](https://qiita.com/juehara-crypto/items/e2837f5bbaa50d7aefdd)
Jira Service Management に REST API を用いて Powershell / ロジックアプリからチケット連携させる

# 1. はじめに
Jira Service Management に対して、REST API を用いて Azure 環境から自動起動させる方法を検証してみました。ロジックアプリにはJira 標準コネクタも提供されていますが、カスタマイズが利かないようなので REST API でのチケット作成も活用出来れば応用技が利くようになります。

# 2. 前提条件
前提条件は以下の通りです。

- Jira Service Management で RESTAPI キーが発行されていること（※発行するユーザーも紐づけで必要）

# 2. 試してみる
## 2.1 Powershell
### コードサンプル
RESTAPI では Jira への認証方法として ``(ユーザー名):$(APIキー)`` フォーマットで base64 エンコードされた情報を認証ヘッダに用います。

```powershell
# 認証情報の設定
$UserName = "(Jira ユーザー名)"
$ApiToken = "(Jira API キー)"
$pair = "${UserName}:${ApiToken}"
$bytes = [System.Text.Encoding]::ASCII.GetBytes($pair)
$base64 = [System.Convert]::ToBase64String($bytes)

# リクエストヘッダーの設定
$Headers = @{
    "Authorization" = "Basic $base64"
    "Content-Type" = "application/json"
}

# チケットデータの作成
$body = @{
    fields = @{
        project = @{
            key = "AAAA"  # （必須）プロジェクトキー
        }
        summary = "PowerShellによる自動生成テスト"  # （必須）チケットのタイトル
        description = "このチケットはPowerShellスクリプトで自動生成されました。"  # チケットの詳細
        issuetype = @{
            name = "[System] Incident"  # （必須）課題タイプ
        }
        priority =@{
            name = "High"  # 優先度（任意）
        }
        assignee =@{
            name = "(Jira ユーザー名)"   # 自動アサインする担当者（任意）
        }
        labels = @("Security", "Test")  # ラベル（任意）
        customfield_10097 = "https://www.yahoo.co.jp"   # カスタムフィールド  
    }
} | ConvertTo-Json -Depth 10  # JSON形式に変換

# APIエンドポイントの設定
$JiraUrl = "https://(Jira インスタンス名).atlassian.net/rest/api/2/issue"

# POSTリクエストの送信
$response = Invoke-RestMethod -Uri $JiraUrl -Headers $Headers -Method Post -Body $body

# レスポンスの確認
if ($response) {
    Write-Host "チケットが作成されました: $($response.key)"
} else {
    Write-Host "チケット作成に失敗しました。"
}
```

### 通知例
Summary, Description, Priority, Labels, カスタムフィールド（今回は URL で設定）が反映されていることが分かります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/781596af-97d4-4df3-8b75-e31082d8e7e3.png)

## 4.2 ロジックアプリ
### 設定例
RESTAPI を同じようにロジックアプリで設定した例です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/99d5cdf7-bcfc-41bc-868d-8d2bca77c9ee.png)

# 参考資料

https://qiita.com/Chiri_Tsumo/items/b88764a1e89bd13d57a3

https://developer.atlassian.com/server/jira/platform/jira-rest-api-examples/
忘れちゃいけない、Xubuntu-desktop 

# 忘れて後から入れたけど、Xubuntu-Desktop・・・

UbuntuでXFce環境を構築する際、個別にXFceパッケージを導入する方法と、xubuntu-desktopパッケージを使用する方法では、そこそこ違いがあったので記録。

## 個別にXFceを導入する場合の特徴

XFceコンポーネントを個別にインストールした場合、必要なものだけを入れられるのは良いのだが・・

- **Gnome依存の環境設定**: システム設定の多くがGnome環境に依存した構成となり、XFce本来の軽量性や独立性が損なわれる可能性がある。
- **プラグインの所在不明**: 一部のXFceプラグインの場所が不明確になり、設定やカスタマイズに支障をきたすことがある。
- **Bluetooth GUI の欠如**: Bluetooth関連のグラフィカルユーザーインターフェースが含まれないため、Bluetoothデバイスの管理が困難になる。

## xubuntu-desktopパッケージを使用する場合の利点

一方、xubuntu-desktopパッケージを導入すると、多数の関連パッケージが自動的にインストールされます。これには以下のようなコンポーネントが含まれている。：

- LibreOfficeスイート（Calc、Writer、Draw、Math等）
- ネットワーク管理ツール（OpenVPN、NetworkManager等）
- マルチメディア関連ツール
- システム管理ユーティリティ
- Xubuntu固有の設定とテーマ
- 完全なBluetoothサポート（blueman等）

## 推奨される導入方法

**XFceを主要なデスクトップ環境として使用する場合は、xubuntu-desktopパッケージの導入がおすすめ。** これにより、XFce環境に最適化された統合的なデスクトップ体験を得られるし、「アレがない？これがない？」ということは減る。

## 重要な注意点

**Ubuntuの更新手順との関係で、xubuntu-desktopパッケージを後からインストールする必要が生じる場合がおおい。** システムの更新プロセスやパッケージ依存関係の都合上、最初からxubuntu-desktopを導入できない状況は出てくると思って良い。
* LibreOfficeなどが入れ替えられてしまうので、日本語環境のアドオンも都度入れ直し。

## まとめ

XFce環境の完全性と使いやすさを重視するなら、個別導入よりもxubuntu-desktopパッケージを選択することで、より安定した統合的なデスクトップ環境を享受できるはず。この文を書くまで、ベースOSディストリビューションを更新した後に、xubuntu-desktop の存在をすっかり忘れていたので、備忘録として書いた。
2025年5月版：今注目のAIコードエディタ3選

2025年5月版：今注目のAIコードエディタ3選

AIの進化はIDEの補助を超え、今やIDEそのものになろうとしています。まだAIチャットにコードを貼り付けて回答をコピペしている人もいますが、これは既に時代遅れ。2025年5月時点で、AIを直接コードエディタに統合した開発環境が主流になりつつあります。

今回は特に注目されている3つのAIコードエディタをご紹介します：

⸻

🚀 Windsurf：強力だが粗削りな部分も

WindsurfはスタンドアロンのエディタとJetBrains用プラグインを提供しており、Claude Sonnet 3.7やGPT-4.1など最先端のモデルと連携しています。ただし、JetBrainsとの統合にはやや不便があり、AIによる提案の取り消しや変更の反映がスムーズではありません。

2025年5月には独自モデル「SWE」も発表しましたが、精度はまだ今ひとつ。とはいえ、OpenAIによる買収により、今後の進化には大きな期待が寄せられています。

⸻

⚡ Cursor：VS Codeベースの実用的なAIエディタ

CursorはVisual Studio CodeをベースにしたAI統合エディタです。プロジェクト全体を理解したうえでマルチファイルの編集や説明、リファクタを実行できる点が特長です。レスポンスも早く、VS Codeユーザーには非常に馴染みやすい構成です。

⸻

🛠 JetBrains Junie：可能性はあるが課題も多い

JetBrainsが提供するJunieはIDEと深く統合されたAIアシスタントですが、実際には応答に数分以上かかることもあり、クレジット消費型の料金体系も割高に感じられます。今後の改善に期待がかかります。

⸻

💡 結論：WindsurfとCursorを併用中

私は現在、WindsurfとCursorを併用しています。どちらにも得意分野があり、使い分けることで最大限の効果を発揮します。JunieもJetBrainsユーザーとして期待していますが、今はまだ本格的な導入は見送っています。

📚 関連リンク
	•	📝 [Medium](https://medium.200ok.io/the-best-ai-code-editors-of-may-2025-c549768be875)版 (英語) を読む
	•	🔍 より技術的な[Zenn](https://zenn.dev/ken1618/articles/eb388ffa881d89)版を読む