OmniAICreator/Qiita-1.07M huggingface dataset:
境界線のないマウス(MouseWithoutBorders) がうまく動かなくなった際の確認、設定初期化方法 

境界線のないマウスがうまく動かなくなった際に調べたメモ

## 設定初期化方法
PowerToys に付属の境界線のないマウスは、次の場所に設定ファイルがある
```
C:\Users\${ユーザ名}\AppData\Local\Microsoft\PowerToys\MouseWithoutBorders\settings.json
```

1. PowerToys を終了
1. 上記ファイルを削除ないしリネーム
1. PowerToys を起動

すると、再度ファイルが生成され、設定も初期化される。

## ログの確認と、設定修正例

自分の環境の場合、設定初期化のみでは接続ができるようにならなかったため、
次の操作でログの確認を実施した。

1. 境界線のないマウスの設定画面で、「オリジナルの境界線のないマウス UI を表示する」をオンに設定
1. PowerToys を終了
1. PowerToys を起動
1. オリジナルの境界線のないマウス UI において、「Mini Log」をクリック
→クリップボードにログがコピーされる
1. メモ帳などをひらき、貼り付けを行う

ログ内に 「machine id conflict」というメッセージがあったため
settings.json を確認したところ
確かに接続元、先両環境で MachineID の値が一致していることが確認できたため
次のように MachineID を修正した。

1. 接続元環境で PowerToys を終了
1. 接続元環境で settings.json を開き、MachineID の値をメモに残した上で
適当な値に変更する
1. 2 でメモした値が settings.json 内の MachinePool の箇所にもあるため
2 で修正した値に書き換える
1. 接続先環境で PowerToys を終了
1. 接続先環境で settings.json を開き、MachinePool 内に接続元環境のホスト名が記載されているので
ホスト名:2 で修正した値
の形になるように修正する
1. 接続元、接続先両方で PowerToys を起動する

これで無事に接続できるように回復した。
FreePBX構築(内線利用 初期段階)

# FreePBXとは
OSSのPBXサーバ。
WebGUIで設定できる。
基本的にはDocsに従うだけ。Debianを構築して、シェルスクリプト落としてきて実行するだけ。
GUIは日本語にもかなり対応していて分かりやすい。翻訳いただき感謝。
メモリは少なくとも4GBは必要。3クライアント接続しているが安定して3GBを超えて使用している。
CPUは1コアで十分。

https://sangomakb.atlassian.net/wiki/spaces/FP/pages/230326391/FreePBX+17+Installation


# 内線設定方法
次の３項目が必要
- ユーザ名 (内線番号)
- secret (自動生成される)
- FreePBXサーバのIPアドレスorドメイン

UDPで認証する。


# 詰まりポイント1
WebGUIの設定は右上の赤いApplyボタンを押さないと適用されない。
内線ユーザを作成フォームを入力してSubmitするだけではダメ。

# 詰まりポイント2
fail2banが導入されている。
ログインに数回失敗すると締め出される。
SIP Clientでのログインに失敗すると、そのIPはWebGUIからも締め出される。

# アプリ
Android、WindowsにはZoiperがオススメ。
iOSでもZoiperは利用可能ではあるが、アプリを閉じるとサーバとのコネクションが切れ、着信通知が一切届かない。通知を行うためには2つの壁がある。
1. PBXサーバが外部公開されている
1. Push通知機能がある


検証用の環境のため外部公開は難しく、私は断念しました。AndroidとWindowsで検証していきます。
ちなみにPush通知機能があるiOSアプリはZoiperとGroundwireがあります。
Zoiperはサブスク、Groundwireは買い切りの課金が発生します。Push通知サーバを管理頂いているので当然といえば当然ですが無料でPush通知機能があるSIPクライアントアプリは見つけられなかったです。
Next.jsでテストを実行したときにNextRouter was not mountedというエラーが発生したときの解消法

# 概要
現在Next.jsで開発をしており、フロントエンドテストを行っているときにNextRouter was not mountedというエラーが発生。
結論から言うとルーターをモックすることで解決することができたので、それについて書いていきたいと思います。

# エラーの原因
テスト環境ではルーターは自動的にセットアップされず、明示的にルーティングを実行しない限りルーターはマウントされません。
なので、テスト対象のコンポーネントがuseRouterを使ってルーティング情報にアクセスしているにも関わらずテスト環境でルーターがセットアップされていない場合、コンポーネントはNextRouter was not mountedエラーを投げます。
自分の場合、テストでエラーが発生したコンポーネント内で
```typescript
import { useRouter } from "next/router";
```

```typescript
const router = useRouter();
```
このようにuseRouterを使用していたのにも関わらず、テスト環境でルーターをセットアップしていないため今回のエラーが発生したようです。


# エラーの解消方法
テスト内でルーターをモックすることでエラーを解消することができました。
```typescript
jest.mock("next/router", () => ({
    useRouter: jest.fn(),
}))
```

# 参考文献
https://www.devzery.com/post/fixing-nextrouter-was-not-mounted-in-next-js-testing
Vercel AI SDK と OpenAI の o3 との組み合わせを試す

## はじめに

今回、Vercel AI SDK を試します。


●AI SDK
　https://sdk.vercel.ai/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/6fabd17b-7f75-4dcd-9e95-4903ed2415b8.png)


具体的には、AI SDK と OpenAI の o3 とを組み合わせて、簡単なお試しをやってみます。


### 利用するパッケージ

Vercel AI SDK と OpenAI のモデルを組み合わせる場合、2つのパッケージを使う形になるようです。


#### パッケージ 1つ目： ai

1つ目は以下です。

●ai - npm
　https://www.npmjs.com/package/ai

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/059ec761-041b-4c66-97f7-179cf69a720c.png)


#### パッケージ 2つ目： AI SDK Core の OpenAI用のもの

もう 1つは、[AI SDK Core](https://sdk.vercel.ai/docs/ai-sdk-core/overview) になるようです（※ 以下の画像の下部に記載されているもの）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/2d61234d-451c-4c7f-8f2a-f4a05586410a.png)

現時点で [AI SDK Core](https://sdk.vercel.ai/docs/ai-sdk-core/overview) で扱えるのは、以下の赤枠で囲んだ部分に記載されているものや、その他に[「AI SDK Providers」のページ](https://ai-sdk.dev/docs/foundations/providers-and-models#ai-sdk-providers)に記載されたものとなるようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/1cf6329e-970b-4c25-8618-1cb25953ecca.png)

その中の OpenAI用のもの（ `@ai-sdk/openai` ）を使います。


## 実際に試してみる

それでは、実際に試していきます。


### パッケージのインストール

まずは 2つのパッケージのインストールで、以下のコマンドを実行します。

```zsh
npm install ai @ai-sdk/openai
```

これで、今回必要な 2つのパッケージをインストールできました。


### 動作確認

最後に動作確認を行います。
具体的には、以下をベースに内容を少し書きかえたものを作って実行してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/90e7f4cd-23e9-4468-9780-c59930d41bd1.png)


#### 実装内容

実装内容は、以下としました。

```javascript
import { generateText } from 'ai';
import { openai } from '@ai-sdk/openai';

const { text } = await generateText({
  model: openai('o3'),
  system: 'You are a friendly assistant!',
  prompt: 'なぜ空は青い？',
});

console.log(text);
```

なお `@ai-sdk/openai` を使う場合は、環境変数 `OPENAI_API_KEY` に OpenAI の APIキーを設定する必要があります。

#### 実行結果

以下に実行結果を掲載します。
無事、レスポンスを得られました。

https://x.com/youtoy/status/1913249125874704655


## おわりに

今回、Vercel AI SDK と OpenAI の o3 との組み合わせを軽く試しました。

### 今後やってみたいこと

今後、Vercel AI SDK で MCP を扱うものも試せればと思っています。

なお以下の公式の記事によると、バージョン 4.2 から MCP を使う機能が追加されたようです。

●AI SDK 4.2 - Vercel
　https://vercel.com/blog/ai-sdk-4-2#model-context-protocol-(mcp)-clients

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/04e7948b-49c3-48c2-9cb2-18473e999e2e.png)


#### 【追記】 Vercel AI SDK で MCP関連の実装を試しました

その後、以下の記事に書いた内容を試しました。

●Vercel AI SDK でシンプルな MCPクライアント・MCPホストの機能を作る（自作MCPサーバーと組み合わせる） - Qiita
　https://qiita.com/youtoy/items/22fa3faaacd7ae6dd958
[続] Visual Basic 6アプリケーションはいつまでつかえるのか?(2025年4月版)

1年弱前に [Visual Basic 6.0アプリケーションはいつまで使えるのか？](https://qiita.com/yamayamaya/items/bf900153b093c8074cb3) という記事を投稿しましたがその続編です。

## Visual Basic 6.0ベースのアプリケーションの実行は、2034年10月10日まで"Supported"で利用可能
です。

2024年11月1日にリリースされたWindows Server 2025にも、Visual Basic 6.0のランタイムが含まれているのがその理由。

実際に、[Support Statement for Visual Basic 6.0 on Windows](https://learn.microsoft.com/en-us/previous-versions/visualstudio/visual-basic-6/visual-basic-6-support-policy)内のリストでも、Windows Server 2025が含まれています。

そして、[Windows Server 2025のExtend Support]()は2034年10月10日まで続きます。
誰でもできる！AI切り抜きで切り抜き画像も動画も一瞬加工｜無料ツール7選

YouTubeのサムネイル、TikTokの背景除去、Instagramのバナー作成。
そんなSNSクリエイターや動画編集者に欠かせないのが「AI切り抜き」です。

今やPhotoshopを使わずとも、無料アプリで画像や動画の背景を一瞬で自動削除できる時代。

AIを活用すれば、作業時間を大幅に短縮しながらクオリティを上げることができます。

本記事では、SNS活用や動画制作に役立つAI切り抜きの活用法やツールを、初心者向けに徹底解説します。

スマホ1台でできるアプリも充実しており、初心者からプロまで、幅広いユーザーに活用されています。

無料版のAI切り抜きを使用したい方は、下記のサイトを参考にしてください。

https://ai.tencho-ex.com/


# 1. AI切り抜きとは？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4028918/fd93d59e-a386-428e-85ce-e3597042f5bd.png)

AI切り抜きは、人工知能（AI）が画像や動画の中から特定の対象（人物・物体など）を自動で検出し、背景を削除する技術です。以前はPhotoshopなどで「ペンツール」や「レイヤーマスク」を使って、時間をかけて切り抜きしていました。

しかし、AIの登場により、クリック一つで自然な切り抜きが可能になりました。画像処理に不慣れな人でも、プロ級の編集が短時間でできる時代です。

# 2. AI切り抜きが使える場面とは？
以下のような場面で特に重宝されています。

# ● SNS投稿やバナー制作
インスタグラムやTikTok用のビジュアル素材に。背景を除去した被写体に文字やスタンプを重ねることで、視線を引きつけるデザインにできます。

# ● ECサイトの商品画像
商品だけを綺麗に切り抜き、白背景にすれば、プロっぽい商品ページが完成します。Amazonや楽天での売上アップにも効果的。

# ● プレゼン資料やサムネイル
画像内の人物やアイコンだけを抽出して、資料やYouTubeのサムネに活用。オリジナル感を出せるので、差別化できます。

# 3. おすすめのAI切り抜きアプリ・ツール
## ◆ R◆ [ai.tencho](https://ai.tencho-ex.com)（無料＆高精度）
URL：

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4028918/e90d31fd-7f0d-442e-a173-d1aebddee63a.png)


https://ai.tencho-ex.com/



画像をアップロードするだけで即切り抜き

無料でも十分使えますが、高画質で保存するには有料プランが必要

## ◆ PhotoRoom（スマホアプリ）
iOS / Android両方に対応

EC向け機能が豊富（影の追加・背景の自動生成）

インスタ風おしゃれ加工もできる

## ◆ Adobe Express
簡単操作で切り抜き＋デザインが可能

Adobe製なので信頼感あり

Webブラウザ＆アプリで利用可

# 4. PhotoshopのAI切り抜き機能の使い方
Photoshopはプロ向けですが、最近はAIのおかげで初心者にもやさしくなりました。

## 手順（例：人物の背景を切り抜く）
「被写体を選択」ボタンをクリック

自動的に人物や動物などを認識して選択

「レイヤーマスク」で背景を消去

必要に応じて「選択とマスク」で微調整

特に「髪の毛」や「透明な服」などの繊細な部分も自然に処理できるのが魅力です。

# 5. Canva（キャンバ）のAI切り抜き機能
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4028918/5c98343a-0551-4c15-b9be-458ee8f1240d.png)

Canvaは、デザイン初心者でも使える無料ツールとして人気ですが、有料プラン（Canva Pro）ではAI切り抜きも搭載。

## 特徴
画像を選択 → 「背景リムーバー」ボタンを押すだけ

自動的に被写体を検出＆背景を削除

背景に新しいデザインや写真を合成できる

スマホアプリでも同じ機能が使える！

デザインまで一貫して行えるのが強み。Instagram投稿やYouTubeサムネづくりにぴったりです。

# 6. 動画編集におけるAI切り抜き技術
動画でもAIによる切り抜きが可能になってきました。特に以下のような編集に使われています。

## ● 背景除去（自動グリーンスクリーン）
例えば、人物を背景から切り抜いて、別の映像と合成（ニュース風、バーチャル背景など）

## ● おすすめツール
Runway ML：ブラウザベースのプロ向け動画編集。自動で人物の背景を削除

CapCut（無料アプリ）：TikTok公式ツール。背景をワンタップで削除可能

Unscreen：動画をアップロードするだけ。AIが自動で背景を取り除いてくれる

# 7. AI切り抜き動画の作り方と活用例
## 作り方（CapCutの例）
動画を読み込む

「切り抜き」→「背景を削除」ボタンを押す

エフェクト・文字・音楽を追加して完成！

## 活用アイデア
YouTubeショート動画：背景を透明にして、解説テロップを後ろに配置

商品紹介動画：人物＋商品を切り抜いて背景をブランドカラーに統一

ダンス動画：背景を除去してグラフィック演出を追加

再生回数が伸びる編集テクニックとして、多くのクリエイターに使われています。

# 8. よくある質問（FAQ）
Q1. 無料だけで十分？
→ はい。Remove.bgやCanvaは無料でも機能が充実しています。高画質での保存や商用利用が必要な場合は、有料プランの検討を。

Q2. スマホだけでも使える？
→ 多くのアプリ（PhotoRoom、CapCut、Canvaなど）はスマホ完全対応。外出先でも使えます。

Q3. 商用利用して大丈夫？
→ ツールによって異なりますが、多くは有料プランで商用利用がOKになります。利用規約を事前に確認しましょう。

# 9. まとめ
AI切り抜きを活用してクリエイティブを加速しよう！
AI切り抜きは、「難しい」作業を「誰でもできる」ようにする魔法のツールです。SNS運営・プレゼン・動画編集・EC販売など、あらゆる場面であなたのコンテンツ制作を効率化してくれます。

▶ 今すぐできること：
Remove.bgやCanvaで画像を試してみる

CapCutでショート動画を1本編集してみる

SNSにアップして反応をチェック！

https://ai.tencho-ex.com/
[Unity][R3] AddTo(this)がなぜかできないとき


NuGetだけでなく、PackageManagerのほうでもR3をインストールする必要があります（1敗）

### 詳しいやり方
https://github.com/Cysharp/R3?tab=readme-ov-file#unity

### このミスに気づかせてくれた偉大な記事
https://naninunenoy.hatenablog.com/entry/2024/03/07/001818
Geminiで盾を使う魔法少女を描いてみた。

# 概要

Geminiで盾を使う魔法少女を描いてみました。

# 実装

プロンプトと実行結果は以下の通りです。

```
炎の盾を使う魔法少女を描いてみてください。
```
![炎の盾を使う魔法少女_20250419.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/4f373630-3929-4bfd-8d96-edc01ade8186.png)


```
氷の盾を使う魔法少女を描いてみてください。
```
![氷の盾を使う魔法少女_20250419.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/e0dff064-a0bd-4724-a9a9-577a37c64dc0.png)


```
電撃の盾を使う魔法少女を描いてみてください。
```
![電撃の盾を使う魔法少女_20250419.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/0c148d76-cee1-464e-9d54-402847ce4e5e.png)


# まとめ

電撃の子が可愛いかも。
何かの役に立てばと。
良いコード／悪いコードで学ぶ設計入門 第１１章

# 第11章 コメント ―保守と変更の正確性を高める書き方―

コメントは、コードの理解を促進するための重要な手段ですが、メンテナンスされなければ誤解を生む原因にもなります。本章では、誤解を避けつつ、保守性を高めるコメントの書き方について学びました。

## 11.1 退化コメント

**退化コメント**とは、コードと乖離して古くなり、正しく動作を説明しなくなったコメントのことです。コメントはコードに比べて更新されにくく、意図せず偽情報になることがあります。

コードに関する言葉は、会話でも文書でも「伝えたい人の意思の劣化コピー」でしかありません。意図が劣化することを前提に、コメントや命名は可能な限り正確かつ明確にすべきです。

特に、ロジックをなぞるだけのコメントは、理解に寄与しないばかりか、誤った情報として害になりかねません。  
つい無意識にそういったコメントを書いてしまう場面もありますが、「そもそも呼び出し側が内部ロジックを気にしなくてもいい設計にする」という視点も忘れずにいたいところです。

## 11.2 コメントで命名をごまかす

命名が適切でない場合に、意味を補うようなコメントでごまかしてしまうケースがありますが、これはコメントとコードが乖離しやすくなり、結果として劣化コメントにつながります。

再説明が必要なほどの命名は、そもそも命名自体をリファクタリングすべきです。  
よくある例として、日本語の補足コメントを付けてしまうことがありますが、それが必要な時点で命名の段階で迷子になっている可能性があります。

とはいえ、ドキュメントコメント（Document comment）は例外で、特にAPIなど外部とのインターフェースに対しては再説明や補足も有効です。ただし、その場合も適切な命名が前提であることは変わりません。

## 11.3 意図や仕様変更時の注意点を読み手に伝えること

コードが読まれる最大のタイミングは、「保守」や「仕様変更」のときです。そのとき開発者が気にするのは以下の2点です：

- このロジックは**なぜ**このように書かれているのか？
- 仕様を変更する場合に**どこに気をつければよいか？**

これらの意図や注意点をコメントとして明示しておくことは、読み手の理解を助ける有益な手段となります。

コメントに対して「これは意図を表す」「これは変更時の注意点」などラベル的な明示があれば、さらに読みやすくなるかもしれません。共通認識を前提に、チームでスニペットを用意してフォーマットを統一するのも有効なアプローチだと感じました。

## 11.4 コメントのルール まとめ

以下が本章で示された、コメントに関する推奨ルールの一覧です：

- ロジックを変更したときは、**必ずコメントも更新する**
- ロジックの挙動をただなぞるだけのコメントは避ける
- 可読性の悪いロジックを補足するコメントを書くのではなく、**ロジックそのものを改善する**
- **ロジックの意図**や**仕様変更時の注意点**は、コメントとして残すと価値がある

このようなルールに沿うことで、コメントによる誤解や混乱を防ぎつつ、保守性の高いコードを維持することができます。

## 11.5 ドキュメントコメント

**ドキュメントコメント**は、コードにメタ情報を持たせ、エディタでの補助やドキュメント生成に活用されるものです。

- PHP → [PHPDoc](https://phpdoc.org/)
- JavaScript → [JSDoc](https://jsdoc.app/)
- TypeScript → [TSDoc](https://tsdoc.org/)

こういったフォーマットに従ったドキュメントコメントは、コードの保守性・再利用性に大きく貢献します。

特に、例外の扱いに関しては `@throws` で意図的に明記することで、呼び出し元に安全性のヒントを与えることができます。

## まとめ

コメントは「書くこと」以上に「劣化させないこと」が重要であると、改めて認識させられました。読み手の視点を想像し、コードを読む場面（保守・変更）でどんな情報が必要になるかを意識してコメントすることが大切です。

また、コメントが必要になる前に「命名・設計・粒度」などを見直すという意識も忘れずに持ちたいと感じました。

ドキュメントコメントのように、コメントそのものに構造を与えることで保守しやすくなる工夫もあるので、チームやプロジェクトのルールとして取り入れていく価値は高いでしょう。

「良いコメント」はコードと共に生き、変更にも耐えうる情報設計の一部である。そんな意識を持って、これからのコードを書いていきたいと思います。
2025-04-19 共有記事ログ

# 概要
現職の開発部のメンバーに共有した記事のログ

# 技術系
## [【初心者向け】Datadogのインテグレーションを試してみた！やり方・注意点まとめ【AWS編】](https://techblog.ap-com.co.jp/entry/2025/04/03/123848)
Datadogインテグレーションのやり方紹介記事です
以前はおそらく権限周りとパラメータ設定の問題で、一度失敗したことで発生したことでできたゴミデータの影響も含めてスムーズに行きませんでしたが、初心者向けにやり方を紹介してくれているので、今度は詰まることなくできるのではと思います！

## [GitHub操作を時短！ショートカットキーが便利なので広めたい](https://qiita.com/mu7kata/items/3dd9066ce3ae084b9ac0)
Githubで利用可能なショートカットの紹介記事です
知っていると少し効率が上がりそうだと思いましたので共有いたします！

## [MySQLのロック機構を深掘り - 月間14万件の入居申込データを安全に扱うための最適化戦略](https://tech.itandi.co.jp/entry/2025/04/10/143846)
MySQLのロックの仕組みについて説明している記事です
普段あまり意識しないでトランザクションや暗黙的なロックを用いているかと思いますが、しばしばデッドロックやSlow Query による問題に直面することと思います
そう言った時の原因把握の理解の助けになるかと思いましたので共有いたします！

# その他
## [「実質メソッド」を活用したら目指していたキャリアを実現できた話](https://tech.pepabo.com/2025/04/04/really-method/)
自分は実質⚪︎⚪︎ですと言って、その通りに振る舞う「実質メソッド」の紹介記事です！
自分も皆さんが目指すキャリアや姿がよくわかっていません
是非実質メソッドを用いて、どのようになりたいかをアピールしてもらえると嬉しいです！
そしてなりたい姿になっている前提の振る舞いをすることは、間違いなく自身をレベルアップさせてくれるものだと思います！

## [評価制度において自己評価をまとめる方法](https://dev.classmethod.jp/articles/preparing-self-evaluation/)
自己評価のまとめ方についての記事です
評価を受ける際に、今まで「主観で評価されている」「自分の成果を見てくれていない」「うまく丸め込まれた」等を思ったことは幾度となくあると思います
そういったギャップを避けるためには、自己評価をしっかり伝える必要があるかと思います
目標シートには「自己評価」の欄も用意されていますので、しっかりアピールするためにうまくこの記事の内容を活用してみてください！

## [評価フィードバックを活用すること](https://dev.classmethod.jp/articles/utilizing-evaluation-feedback/)
評価のフィードバックをどのように受け止めて、今後にどう活かすべきなのかを記した記事です
評価とは結局は評価者の主観で決まることです
そのため、何故そのようになったのかの確認と、伝わってほしいことが伝わっていなかった時に、次にどう活かしていくのかが大切なのかなと思いました


# 共有するほどではないけど興味があったもので読んだもの
* [OrbStack で快適な Docker 開発を始めよう！](https://zenn.dev/fukurou_labo/articles/cda418f8985a56)
    * インストールと移行は超簡単
    * D-Bus問題が再浮上したので一旦利用は保留
* [Stage. チームの開発を支える基盤と手法のご紹介](https://tech.uzabase.com/entry/2025/04/03/154953)
    * TDDは理解できるけど、落ちるテストコードをmainにマージすることには驚いた
* [【GitHub Actions】デバッグに備える！ワークフローを時系列に可視化しよう！](https://techblog.ap-com.co.jp/entry/2025/04/03/183000)
    * 色々なことをやる場合には可視化できるのは良さそう
* [開発リーダーに近い役割を経験して学んだこと](https://techblog.openwork.co.jp/entry/learning-from-sub-development-leader)
    * 開発と並行してテスト項目を洗い出すのは良さそう
* [【新卒おめでとう】今こそおすすめするvimという選択肢](https://ramble.impl.co.jp/8431/)
    * 普段 vim を使っている自分としては、Vimmer が増えると嬉しい
* [Datadog Learning Center 全77コースをすべて受講して得た、実務に活かせる知識と技術](https://techblog.ap-com.co.jp/entry/2025/04/09/110000)
    * 日本語でコンテンツが充実しているなら…
* [火の用心！NULL値1個、バグの元！](https://zenn.dev/ourly_tech_blog/articles/668904e717aef2)
    * 確かにNULLの扱いには気をつけておく必要がありそう
* [「楽しくやる文化」を浸透させたい―新卒エンジニアチームが作ったコミュニケーション支援アプリ「へぷこ」](https://qiita.com/misola-441/items/0640372d14c1b73c3c70)
    * 作ってみた系紹介記事
* [「試験は暗記より理解 〜効果的な試験勉強とその後への活かし方〜」というタイトルで登壇しました。](https://dev.classmethod.jp/articles/ai_practioner_learn_deep_not_cram/)
    * AWSがAIの認定資格を出していたのは知らなかった
* [ドキュメント作成が苦手なエンジニア！集まれ！](https://tech.unifa-e.com/entry/2025/04/11/070000)
    * 先に設計することが重要そう
* [エンジニアがブログを書き続ける方法](https://zenn.dev/fukurou_labo/articles/e4ae5d06d03a29)
    * 読み手視点のネタ探しはありかも
* [大量の経路検索が一瞬で！？最強オープンソース「R5R」](https://qiita.com/ko_wa/items/b2f906fd16f538f706be)
    * 色々なものが世の中には転がっているので、しっかりと性能評価を行って、メリットデメリットを洗い出す必要があるなと思った
* [💻孤独感ゼロ！エンジニアのための「リモートワーク環境×メンタルケア」実践術10選](https://qiita.com/mnoguchi/items/2cd6203ae0e55a973ba5)
    * 個人的には業務時間外の通知と仕事が終わってない感が最も辛く感じるが、これはリモートワーク関係ないかも笑
【自分用】Stable Diffusion プロンプト例: サンプルと表現の違いをチェック【服装編】

# はじめに

元記事のプロンプトを実際に使用した場合の違いについて、実例で紹介します。

https://qiita.com/comty/items/fb06a2e9f730e3f1617b

この記事では服装を扱います。

元々の画像はこちら。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4006596/391e55fa-eefe-4891-ab26-08662bb15809.png)

プロンプトはこのようになっています。
```
best quality, beautiful girl, 18yo, (1girl:1.4), (anime coloring, anime screencap),
(gray eyes:1.4), (blond hair:1.4), realistic eye,
BREAK

bangs,

BREAK
spring park, golden hour, ((pink shirt))
blush, smile, look at viewer, dynamic angle, cowboy shot, top of head, from below, heart pause,

Negative prompt: worst quality, low quality, normal quality, messy drawing, bad anatomy, bad hands, mutated hands, (extra_fingers:1.2), extra digit, extra_arms, extra_legs, mosaic censorship, fat, text, (two shot:1.2), (mesh hair)

```

今回は「pink shirt（ピンクシャツ）」となっている部分を変えてみましょう。

| カジュアルな服装<br>casual wear | イブニングドレス<br>evening gown | トレンチコート<br>trench coat | 浴衣<br>yukata | 鎧<br>armor |
| ---- | ---- | ---- | ---- | ---- |
| ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4006596/ad6e5142-33a8-402d-adb1-3c2dcf99b702.png) | ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4006596/1230badf-6dc4-4c7d-b7d8-73e0c108e396.png) | ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4006596/9f077574-90f0-4865-861d-52ad3ac32a28.png) | ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4006596/c8e2d286-0431-4ab5-874b-155f4db3e36e.png) | ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4006596/f3d1815d-4caf-4160-893a-b7889bf48478.png) |
---
服装を変えてキャラクターのイメージを変えることができます。
服装のプロンプトにつられてコートでは秋っぽい背景になったりしましたが、ポーズや背景、髪型なども細かく指定したり強度を変えたりしてみてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4006596/fdb4aa6e-fbc7-4d12-938d-632a7eb64521.png)

```
((Business Suits)), necktie,
```
このように、ビジネススーツとネクタイなど、プロンプトを足し算していくこともできます。

---

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4006596/f2482761-c601-4785-8f37-26bde5b6a6dc.png)

necktie → (red necktie:1.4) に変えるなど、カラーバリエーションや模様も適用できます。

使用するモデルによっては、学習の方向性などで表現できない服装があったりもしますが、いろいろとチャレンジしてみましょう。

---
# まとめ

多様なシーンに応用できるため、クリエイティブな表現の幅を広げる一助として活用してください。
キャラクターのイメージに合った服装や衣装をプロンプトで指定して、画像生成を楽しんでいきましょう！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4006596/d53608fc-8414-41d4-9980-6b387dcfb050.png)
Nest.js その３  AppDataSource

AppDataSource


```typescript
import { DataSource } from 'typeorm';
import { UsersEntity } from '../entities/users.entity';
import { TodosEntity } from 'src/entities/todos.entity';
import { NewsEntity } from 'src/entities/news.entity';

export const AppDataSource = new DataSource({
  type: 'mysql',
  host: 'localhost',
  port: 3306,
  username: 'test',
  password: 'test',
  database: 'test',
  synchronize: true,
  entities: [UsersEntity,TodosEntity,NewsEntity],
});
```


<br><br><br>
TypeORM を使ってデータベース接続を設定するコード


TypeORMとは
JavaScript/TypeScriptのクラスを使って、データベースを操作できる仕組みのこと。
```typescript
export const AppDataSource = new DataSource
```

<br><br>
TypeORMでデータベース接続の設定を作るための構文
```typescript
new DataSource
```
<br><br>
type: データベースの種類
host: 接続先
port: 通信に使う番号　MySQLは通常[3306]
username: データベースログインに使う情報
password: データベースログインに使う情報
database: 接続するデータベースの名前
synchronize: 　true にすると、TypeORMが自動でテーブルを作ってくれる
(いちいち SQL書かなくてもよい、開発環境のみで使用→本番環境で実行時に既存のテーブルを勝手に変更・削除される可能性がある,予期しないデータ消失が起こる可能性がある)

entities: どのクラスをテーブルとして使うかをTypeORMに教えるリスト

```typescript
type: 'mysql',
  host: 'localhost',
  port: 3306,
  username: 'test',
  password: 'test',
  database: 'test',
  synchronize: true,
  entities: [UsersEntity,TodosEntity,NewsEntity],
});
```



<br><br>
docker-compose.yml
docker-compose.yml ファイルで、MySQL コンテナを立ち上げるための設定
<br><br>

services:mysql　 mysql というサービス名でデータベースコンテナを立ち上げる定義
image 　　　　　ベースになるDockerイメージ
container_name　コンテナ名
volumes　　　　 データの永続化→自分のPCの./mysql-data フォルダを
　　　　　　　　コンテナ内のMySQL のデータフォルダ /var/lib/mysql にくっつける
         　　　　　　　　Dockerのコンテナは削除すると中のデータも消えるのが基本
                 
ports:- 3306:3306　自分のPCの3306番に来たアクセスをMySQLコンテナの3306番とつなぐ

MySQL の初期設定 　Docker Compose で MySQL の初期設定を自動化するための環境変数（environment:） のセット
environment:
      MYSQL_ROOT_PASSWORD: test　管理者ユーザーのパスワード
      MYSQL_DATABASE: test　　　　自動で作ってくれるデータベース名
      MYSQL_USER: test　　　　　 　ユーザーの名前
      MYSQL_PASSWORD: test 　　　 ユーザーのパスワード        

```yml
version: '3.8'

services:
  mysql:
    image: mysql:8.0
    container_name: mysql
    volumes:
      - ./mysql-data:/var/lib/mysql
    ports:
      - 3306:3306
    environment:
      MYSQL_ROOT_PASSWORD: test
      MYSQL_DATABASE: test
      MYSQL_USER: test
      MYSQL_PASSWORD: test
```
【Cドライブの容量圧迫…】WSLをDドライブへ移行する

下記記事でWindowsマシンにWSL2環境を構築しました。

https://qiita.com/k-koga/items/f87151070a5c9e88cb42

快適にWSL環境で開発作業をしていたのですが、気づけばいつの間にかCドライブの容量が不足していることに気づきました。。

原因はWSLで、使っているうちに徐々にディスク容量が増えていき容量を圧迫してしまっていました。

WSLをインストールすると標準ではCドライブにLinuxディストリビューションがインストールされます。

CドライブはDドライブに比べて割り当ててある容量が少ないため、なんとかDドライブに移せないかなーと調べてみたところ、意外と簡単にできたので、その方法を整理しておきます。

## WSLのドライブ移行
### WSLの容量確認
まずは現状、普段使っているLinuxディストリビューションがどのくらいのディスク容量となっているか確認しましょう。
```bash
df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sdc       1007G   13G  943G   2% /
```
Ubuntuの場合、`/dev/sdc`を確認するとわかるのですが、確認してみたところ13GBも使っている・・・

### WSLの停止
さっそくドライブを移行するために、まずは、現在使用しているWSLを停止しす。

```powershell
$ wsl --shutdown
```

停止していることを確認。
```powershell
$ wsl --list --verbose
  NAME      STATE           VERSION
* Ubuntu    Stopped         2
```
すべてのディストリビューションが`Stopped`になっていればOKです。

### WSLのエクスポート
停止が済んだら現在のWSL環境をエクスポートします。
```powershell
$ wsl --export Ubuntu D:\WSL\UbuntuBackup.tar
```
`--export`オプションにはエクスポートしたいディストリビューションの`NAME`を指定し、引数に`エクスポートする場所`を指定します。

### WSLのインポート
エクスポートが完了したら、移行先のドライブのフォルダへインポートしましょう。
```powershell
$ wsl --import Ubuntu-2 D:\WSL\Ubuntu D:\WSL\UbuntuBackup.tar --version 2
```
このとき`--import`オプションにはディストリビューションの新しい名前を指定します。
この名前はすでに存在するディストリビューションの名前と重複しないものであれば、任意の名前付けで大丈夫です。

第一引数に`インポートする場所`を指定し、第二引数に`エクスポートしたファイル`を指定します。

※`--version`オプションを指定し`2`を設定することも忘れないようにしましょう。

インポートできたか`wsl --list --verbose`コマンドで確認します。

```powershell
$ wsl --list --verbose
  NAME      STATE           VERSION
* Ubuntu    Stopped         2
  Ubuntu-2  Stopped         2
```
インポート時に指定した名前（`Ubuntu-2`）が表示されていればOKです。

念の為、インポートしたディストリビューションでwslを起動しログインしてみましょう。
```powershell
$ wsl -d Ubuntu-2
```
無事ログインでき、内容も問題なさそうであればOKです。

### 移行済みのディストリビューションの削除
CドライブからDドライブへの以降が完了したので、Cドライブにある（エクスポートした）ディストリビューションは削除します。
```powershell
$ wsl --unregister Ubuntu
```
削除できたか確認します。
```powershell
wsl --list --verbose
  NAME      STATE           VERSION
* Ubuntu-2  Stopped         2
```
エクスポートしたディストリビューション（`Ubuntu`）が表示から消えましたね。

これで、Cドライブで容量を圧迫していたWSLのディストリビューションをDドライブに移行することができました。

Cドライブの容量に空きができたことも確認できるかと思います。

意外と簡単にWSLのディストリビューションのドライブ移行ができました。

引き続き、快適なWSLライフをご満喫ください。

以上
【Mac】特定のファイルやフォルダを非表示にする方法


## ファイルやフォルダを非表示にする

以下のコマンドを実行するとファイルやフォルダを非表示にできます。

```terminal
chflags hidden ファイルやフォルダのパス
```

## 再度表示する

非表示にしたファイルやフォルダを再度表示するには以下のコマンドを実行します。

```terminal
chflags nohidden ファイルやフォルダのパス
```
DatabricksのDelta Sharingでデータを共有してみた

## 前提
・利用環境：Databricks

https://www.databricks.com/jp/try-databricks?scid=7018Y000001Fi15QAC&utm_medium=paid+search&utm_source=google&utm_campaign=17377047998&utm_adgroup=138148229998&utm_content=trial&utm_offer=try-databricks&utm_ad=732035937815&utm_term=databricks%20%E3%83%88%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%AB&gad_source=1&gclid=CjwKCAiA8Lu9BhA8EiwAag16b8b3zbkIb3V7gp-8VUwKukXnhtVZRQ-1RY8SbETmGVgNT4bQramYmRoCX5wQAvD_BwE#account

## 参考ドキュメント

https://www.databricks.com/resources/demos/videos/data-sharing/delta-sharing?itm_data=demo_center

https://docs.databricks.com/gcp/ja/delta-sharing/create-recipient

## 参考ブログ
https://qiita.com/taka_yayoi/items/5d340b814fd560d67cf6?utm_campaign=post_article&utm_medium=twitter&utm_source=twitter_share

## 操作手順（動画）
<iframe width="100%" height="315" src="https://www.youtube.com/embed/SHcp40TkID0?si=1aMkddjEYdvXUIxE" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
【HTML】inputタグのfileでユーザーがアップロードしたファイル情報取得

# HTML構造
inputタグのfileタイプのhtmlにユーザーが画像アップロード

```html
<input id="uploader" name="fileupload" type="file" />
```

## アップロードしたファイル情報取得

type=fileのinputタグのElementの中のfilesプロパティで取得する

```javascript
const upload_image = document.getElementById("uploader")
var Fileinput = upload_image.files
console.log(Fileinput)

<input id="uploader" name="fileupload" type="file" accept="image/png, image/jpeg" />
```

.filesプロパティで返ってくるのはFileListという独自オブジェクト
こいつが結構めんどくさかった

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3801383/3024d068-2fd8-46fc-bcf3-c81168977779.png)

### FileListの構造

●FileListに関するMDNのドキュメントは下記リンク参照
https://developer.mozilla.org/ja/docs/Web/API/FileList
（つーかこっち見た方が早い。。。）


FileListの構造は以下の通り
アップロードしたファイルごとに0,1,2...のようにインデックスが付与
最後にファイルの数を表すlengthプロパティが保持

```javascript
FileList {
  0: File { name: "file1.jpg", size: ..., type: "image/jpeg", ... },
  1: File { name: "file2.png", size: ..., type: "image/png", ... },
  2: File { name: "file3.pdf", size: ..., type: "application/pdf", ... },
  length: 3
}
```

例えば、1番目のファイルにアクセスするときは下記

```javascript
const first_file = upload_image.files[0]
const size = first_file.size //サイズ確認
```

アップロードされたファイル数を取得する場合は下記
```javascript
const length = upload_image.files.length
```

### 具体的な処理

⭐ユーザーがアップロードしたファイルをforで処理

```javascript
for (var i = 0; i < files.length; i++) {
 //処理
}
```

⭐ユーザーがファイルをアップロードしているか検知
```javascript    
        var upload_image = document.getElementById("uploader")
        upload_image.addEventListener("change", (e) => {
            var Fileinput = upload_image.files
            console.log(Fileinput)
            console.log(Fileinput.length)

            if (Fileinput.length >= 1){
             // 処理
            }
         }
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3801383/f88102ea-99ab-467c-a85c-e28afe11cc56.png)
↑ アップロードするとlengthが１になり、ファイルサイズ・ファイル名も取得かのう
#0127（2025/05/08）OSS ライセンス早見表

# OSS ライセンス早見表


## 1. パーミッシブ系ライセンス

*(ソース公開義務なし／著作権表記を残すだけで商用利用可)*

| ライセンス                       | 商用利用 | 主な義務                              | ひと言メモ         |
| --------------------------- | ---- | --------------------------------- | ------------- |
| **MIT**                     | 〇    | ・著作権表示と全文ライセンスを同梱                 | 世界標準。最小限の条件   |
| **BSD 2-Clause / 3-Clause** | 〇    | MIT +（3‑Clause は広告禁止条項）           | 大学系プロジェクトに多い  |
| **Apache 2.0**              | 〇    | MIT 条件＋特許ライセンス付与<br>NOTICE ファイル保持 | 特許面で企業が好む     |
| **ISC**                     | 〇    | MIT と同等、さらに簡潔                     | BIND などで採用    |
| **Boost 1.0**               | 〇    | MIT 相当＋独自表記                       | C++ ライブラリ群標準  |
| **zlib/PNG**                | 〇    | 著作権表示保持のみ                         | 画像・圧縮系で定番     |
| **Unlicense / CC0**         | 〇    | 事実上パブリックドメイン                      | 出典が消えると由来追跡困難 |

---

## 2. 弱コピーレフト系ライセンス

*(条件付きでクローズド利用可／改変部分のソース公開義務あり)*

| ライセンス                 | 組み込み可否    | 要件                   | 実務 Tips      |
| --------------------- | --------- | -------------------- | ------------ |
| **LGPL 2.1 / 3.0**    | ○ (動的リンク) | 改変ソース公開・再リンク手段提供     | DLL/so 分離で対応 |
| **MPL 2.0 / EPL 2.0** | ○         | 変更した **該当ファイルのみ** 公開 | ファイル分割で影響局所化 |

> 🔍 **ポイント**: "weak" でも **静的リンク**やコード埋め込みは強コピーレフト相当の扱いになるため要注意。

---

## 3. 強コピーレフト & 非商用ライセンス（避けるべき）

| ライセンス              | 商用クローズド組み込み | 理由                       |
| ------------------ | ----------- | ------------------------ |
| **GPL v2/v3、AGPL** | ✕           | 派生物全体を GPL で公開する義務       |
| **CC‑BY‑NC 4.0**   | ✕           | Non‑Commercial 条項で営利利用禁止 |

---

## 4. ライセンスの見方 & 必要チェックリスト

1. **ライセンス種別の識別**

   * *Permissive* (MIT/BSD/Apache) か *Copyleft* (GPL 系) かをまず確認。
2. **義務条項の把握**

   * Attribution（著作権表示）、特許ライセンス、変更有無の告知など。
3. **配布形態の影響**

   * デスクトップ配布 vs SaaS 提供で義務が変わるケース（→ LGPL/AGPL）。
4. **改変／リンク方法**

   * 動的リンクなら LGPL 可、静的リンクならソース公開要。
5. **再頒布する物の範囲**

   * バイナリに重みやデータセットを同梱する場合、そのライセンスも確認。
6. **特許リスク**

   * Apache 2.0 には明示的特許ライセンスが付く。MIT/BSD には基本なし。
7. **依存ツリーの棚卸し**

   * SBOM（Software Bill of Materials）を生成し、下位依存ライセンスも網羅。

---

## 5. 実務上の注意事項

* **About ダイアログや OSS クレジットファイル**を用意し、第三者ライブラリのライセンス全文を同梱する。
* LGPL/MPL ライブラリを改変した場合、**自社の GitHub リポジトリなどでパッチを公開**しておくと楽。
* **社内 PoC でも商用解釈される** ことがあるため、正式リリース前に法務レビューを。
* アプリ形態変更（オンプレ→クラウド化など）時は **再度ライセンスを精査**。
* **OSS 以外の有償 SDK（CUDA、MKL、FFmpeg GPL ビルド等）** のライセンスも忘れずチェック。

---

## まとめ

**MIT / BSD / Apache 2.0** ならほぼ安全、**LGPL/MPL** は分離運用で対応可、**GPL / CC‑BY‑NC** は組み込み NG と思え。必ず法務と二重チェック！
ChatGPTでjw_cadをマスターし、店舗平面図を作成！！

こんにちは。
小売業で建築業務について半年のペーペー会社員です。

今回は、**ChatGPT**にjw-cadの基本操作を教わり、
架空では御座いますが、新店の平面図を作成してみました。

背景には、
建築業務に携わっている以上、ある程度のレベルでjw-caを扱えないと何も出来ないという現状から、独学でガッツリ学ぼうと本を買ったものの手つかず状態でモヤモヤしていました・・・

そんな状況の中、**ChatGPT**を教わる機会があり、
対話しながら行えることに感銘を受け、チャレンジしてみたという次第です！！

## 完成品
![Inked完成品_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4051385/d243ce71-bf52-43e2-b55a-74954528b2f5.jpeg)
売場面積が200坪程度の比較的小さめな小売店を想定して書いてみました！！

:::note warn
作業場の仕様などは営業秘密になりますのであくまでの一般的な部分のみ公開させて頂いております。
:::


## 使ったもの
[ChatGPT](https://chat.openai.com/)
jw_cad
既存店の平面図

## 作成の流れ
### ①基本操作を教えてもらいます。
![基本操作.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4051385/d8861813-db27-4bf8-a063-409931a087fd.png)
画像は一部しか掲載しておりませんが、質問すると凄く長々と色々な操作方法が載っております。


### ②次に、既存店舗の平面図を見て、壁の厚さを把握し、壁を書く。
例えば、1,200坪程度の敷地であれば延べ400坪の建物を建て、100台程度の駐車場が必要などの目安があると思います。

参考程度に教えてもらいます。
![壁の書き方.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4051385/ec59557f-22dd-49eb-ba3d-c8f551509a08.png)


～割愛～


### ③売場什器を書く。

:::note warn
冷ケースの寸法は、業者ごとに異なるから要注意！！
※各社のカタログ見て寸法調べてたら日が暮れます(笑)
:::

寸法を間違えて、予定していた尺数が確保出来ないと
色々な部署やお取引様にも迷惑を掛けるので、**必ず**教えて貰いましょう。



![パナソニック.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4051385/1e844db0-889d-4ceb-a167-bf3f170319fe.png)
↑
パナソニックの冷凍冷蔵ケースの6尺タイプの寸法を教えて下さいと入力しました。

そして、
平面を冷ケースで覆い、ゴンドラや島の内蔵ケースを書いていく順番になります。

### ④部門ごとに色塗りを行う。（弊社の場合）
参考程度に教えて貰いましょう。
![塗りつぶし.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4051385/f373877e-d5d3-4071-a312-cd9e121e391f.png)

上記のようにやれば、
確かに、塗りつぶしは出来ました。


![塗りつぶし.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4051385/3c8edf34-7877-495a-8812-906c6e6db365.png)



## 気づいたこと
**ChatGPT**に教わった通りに、塗りつぶしを行いましたが、
私が知っているやり方の方が速し楽ではないかと思った！！

私のやり方（参考程度）
「多角形→任意の選択→ソリッド図形」焦点で囲い、enterで塗りつぶしをしています。

確かに、
ChatGPTが教えてくれたやり方は、王道なのかもしれないが、
作業時間を短縮させたいという視点から見れば、
私のやり方の方が理想だと思います✌✨

そこで最後に、
ChatGPTに「ソリッド図形の方が早いのではないか」と聞いたところ、
以下の回答がありました。

![1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4051385/af4f1519-4100-4974-acb3-999094da3dc3.png)
![2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4051385/baab8b62-ec01-42d5-aaf8-508b36c663d2.png)
![3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4051385/00692ea3-80dc-4b67-bcfb-b9556bde964e.png)
![4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4051385/ceb8dded-efe5-45bd-a3b8-f083486f31b1.png)

その通りです！なんていう真摯な返答が来るとは思ってなかったので驚きましたが、
最初から、素早く色塗りする方法を教えて下さい。などと言えば、
ソリッド図形経由の色塗りを提案してくれたのかもしれません・・・

つまり、
ChatGPTは使う側が特性を理解し、上手く（適切に）使いこなせば、
真のパートナーになるのかもしれません！！


皆さんも、上手く（適切に）ChatGPTを活用し、業務等に活かしてみて下さい。
エフェクトのためのメッシュを作ろう　その１

エフェクト作成時にメッシュの使用は基本的に避けて通れない。
今回使用するツールはblender。　現場ではmayaが一般的、しかしPJ次第では確認の元使用できることも多いので私はblenderを使用している


# 作るときのルールを考える。
基本的にX1.0,y1.0,z1.0（単位は仮にmとする）にしておくと、パーティクルシステム内で５倍すると大きさは5mになる。
などわかりやすくなる。

## 下準備
UVチェッカー画像を用意しよう
https://uvchecker.vinzi.xyz/
素敵なサイトがあるのでここで作ったり。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4079054/ef8f98db-bddd-4ab4-955f-98fc511fc527.png)
自前でつくったり。とにかくUVチェッカーに使える画像を用意しよう

## マテリアルを作ろう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4079054/dac65362-6502-4dfb-8c88-077ed2d0b3dd.png)
なんでもいいのでオブジェクトを作る。（標準で出ているboxでも可）

オブジェクトからマテリアルを新規で作成。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4079054/f7e39e7e-5631-4f3e-8290-d706d08b294c.png)

マテリアル名をUVcheckなどわかりやすいものに
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4079054/aa806d43-c4fd-4655-97ce-5570d526ee3e.png)

マテリアルに先ほど作ったuvcheck用のテクスチャを割り当て
![10.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4079054/2854a184-0270-478d-ade4-6d8a17feb6e7.gif)

ビューポートのシェーディングをマテリアルプレビューに変更するとテクスチャが割り当てられているがわかる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4079054/e8e0952f-eb8c-42bf-93aa-e62cc922f529.png)

以降新規でオブジェクトなどにマテリアルが割り当てられる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4079054/7ba92d0e-47e2-4c86-a6ce-913d1ffac8eb.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4079054/771302b0-6176-4ccd-98ea-4510121b9f71.png)

:::note warn
作成したマテリアルは、フェイクユーザーを設定しておくことをお勧めします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4079054/f12b07e8-26ef-4faf-99da-9044ecd80068.png)

:::


## 1mのガイド用箱を用意しよう
新しく立方体を作る
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4079054/b6e57eda-4808-4e8e-af74-5dc85b9c8d9b.png)

新しく作成した箱のサイズを1mにリサイズ　寸法に数値を入れればOK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4079054/aced9b46-0868-4dc0-a1ec-5f2f8709142a.png)

サイズだけでもいいけど、メッシュ編集中に邪魔になるので　選択できないようにして面も見えなくする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4079054/6634e4af-9f45-4a47-8c24-61e3ba64e1c8.png)

選べない箱ができる
![11.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4079054/3d784940-2078-4beb-8a12-1cda38dbbcf7.gif)

ファイルを保存する
名前を付けるときに、SM_vfx_000など　複製して名前を付けやすいものにする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4079054/4b228ebb-9cf9-4e58-9cbf-159c81753678.png)

:::note info
ファイルを読み取り専用にしておくと、誤って編集してしまうことを防げて便利
![hozon.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4079054/0cb11303-17b9-4a35-85d5-c80d62dd9140.jpeg)

:::


## 実際にちょっと作ってみる
![12.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4079054/65c252c4-4a8a-4461-8bdf-bcdbe921d5f3.gif)
地味に便利なWindowsショートカットまとめ

そんなに有名じゃないけど地味に便利なショートカットをまとめます。

# 便利

- Win+E：エクスプローラーを起動（複数起動可能）
- Win+I：設定を起動
- Win+L：パソコンの画面をロック（キーボードの掃除をするときに使ってます笑）
- Win+R：ファイル名を指定して実行（例：cmd, powershell, notepad, calc, regedit, shell:startup）
- Win+Q：Windowsの検索窓に移動
- Alt+Tab：開いているソフトの切替
- Ctrl+Shift+N：フォルダ作成、シークレットタブを開く
- Ctrl+N：新しいウィンドウを開く
- Win+Shift+左（右）：アクティブウィンドウのモニター間移動
- Ctrl+L：ブラウザでアドレスバーにフォーカス、ターミナルのクリア

# たまに使う

- Win+X：クイックアクセスメニュー（M：デバイスマネージャー、I：ターミナル、A：管理者としてターミナル、P：インストールされているアプリ）
- Win+数字：タスクバーのアプリを起動（Win+1でタスクバーの一番左のソフトを起動）
- Win+左（右）：アクティブウィンドウを左（右）半分に配置
- Win+上（下）：アクティブウィンドウを最大化（最小化）
- Win+D：デスクトップの表示／非表示を切り替え
- Ctrl+クリック：複数のファイルを選択
- Ctrl+Shift+Esc：タスクマネージャー起動
- Alt+Enter：プロパティ表示
- Alt+左（右）：戻る（進む）
- - Ctrl+Shift+A：ブラウザで開いているタブの検索

他にもブラウザのショートカット、エディターのショートカットも暇なときに手持ちを増やしていきたいです。
Python開発時にpush/commit時に作業用のコードを消した後に復元する（自分用）

# ✅ 目的
- 開発中：debug.print(...) を自由に使いたい
- 本番push前：debug.print(...) を一時的に削除し、push後に復元したい
- 理想：安全に・自動化されたプロセスで行う

# 🗂️ 構成ファイル一覧
```bash
project-root/
├── main.py              # あなたのコード（debug.printあり）
├── debug_tools/
│   └── debug_printer.py # DebugPrinterクラス（.gitignore推奨）
├── remove_debug_prints.py   # debug.print を削除するスクリプト
├── push_clean.sh            # 一連の処理を行うシェルスクリプト
├── .gitignore
```

# ① debug.print(...) を削除するスクリプト（remove_debug_prints.py）
```python
# remove_debug_prints.py
import re
from pathlib import Path

def remove_debug_prints():
    pattern = re.compile(r'^\s*debug\.print\(.*?\)\s*$', re.MULTILINE)

    for path in Path('.').rglob('*.py'):
        if path.name in {"remove_debug_prints.py", "debug_printer.py"}:
            continue
        text = path.read_text(encoding='utf-8')
        new_text = pattern.sub('', text)
        path.write_text(new_text, encoding='utf-8')

if __name__ == "__main__":
    remove_debug_prints()
```

🔸 行全体が debug.print(...) の場合のみ削除します。
🔸 条件を追加して debug.print("!important") を残すなども可能。

# ② 一連の操作を実行するスクリプト（push_clean.sh）

```bash
#!/bin/bash

set -e  # エラーが出たら止める

echo "🌱 stash current changes..."
git stash push -m "debugあり"

echo "🧹 removing debug.print(...)..."
python3 remove_debug_prints.py

echo "📦 add and commit cleaned code..."
git add .
git commit -m "本番用push：debug.print除去"

echo "🚀 pushing..."
git push

echo "♻️ restoring debug付き作業コード..."
git stash pop

echo "✅ 完了しました！"
```

🔸 実行権限を与える: chmod +x push_clean.sh

# ③ .gitignore に debug_printer.py を追加（任意）
```.gitignore
# .gitignore
debug_tools/debug_printer.py
```

🔸 debug_printer.py は個人の開発用としてGitに含めないことを想定

# ✅ 使用方法（毎回のpush）
```
./push_clean.sh
```
🔸 これだけで「削除 → push → 元に戻す」一連の処理が完了します。

# ✨ 拡張アイデア（必要に応じて）
- remove_debug_prints.py に --dry-run や --backup オプション追加
- debug.print("!keep") だけ残すなどの指定
- Makefile に統合： make push_clean
Linucレベル１勉強メモ　＃25

＃ 第二章　ファイル・ディレクトリの操作と管理

練習問題2.10
lessコマンドの絶対パスのみを表示した場合、実行すべきコマンドを選択してください。

A. locate less

B. which less

C. whereis less

D. find / -name less

（解答）B

（解説）whereisコマンドをオプションなしで使うと、ソースコードやマニュアルのあるディレクトリも検索されます。したがって、選択肢Cは不正解です。findコマンドやlocateコマンドを使うと、「less」という名のついたディレクトリやファイルをすべて検索することになります。したがって、選択肢A, Dは不正解です。正解は選択肢Bです。whichコマンドは、指定されたコマンドを探し出して絶対パスを表示します。

whichコマンド
コマンドを検索して、その絶対パスを表示します。
whichコマンドは環境変数PATHに基づいて検索を行うため、一般ユーザーが管理者用のコマンドを検索することはできない方があります。（PATHに/sbinや/usr/sbinが含まれていれば可能です。）

（わからない単語解説）
・ ソースコード
　コンピュータに命令を与えるために、
 プログラミング言語で記述された
 テキストファイル

 ・ 絶対パス
 ファイルやフォルダの場所を、階層の最上位 (ルート) から完全に、省略せずに記述する方法
[Python]ModuleNotFoundErrorから脱出しよう(環境変数の設定方法)

## 背景

Pythonで開発をしていると、main.py以外のファイルからコードを実行しようとしたときに、他階層にある関数やクラス等をimportしようとして`ModuleNotFoundError`が発生することがよくあります。特にデバッグ等をするときにmain.pyへimportして実行するのは面倒です。この記事では、どの階層のファイルからでも実行できる方法を紹介します。

## 本記事の対象者
Python開発中で`ModuleNotFoundeError`地獄から抜け出したい方

## エラーの原因

main.pyのようにルートにあるファイルからは実行できるのに、他の階層にあるファイルではエラーになる理由は、Python実行時のカレントディレクトリ（実行パス）に依存しているためです。

Pythonは、実行されたスクリプトの位置を基準にしてsys.pathが設定されます。そのため、importしようとしたファイルが見つからず、ModuleNotFoundErrorが発生します。


## 解決方法

Pathが通っていないことが原因であるため、`PYTHONPATH`という環境変数にプロジェクトのルートディレクトリを明示的に追加することで解決できます。


### 例): devディレクトリがプロジェクトのルートであるとき

```
// ディレクトリ構成
dev/
└── src
    ├── main.py
    └── service
        ├── hoge.py
        └── piyo.py
```


### `dev`ディレクトリからimportしたい場合
```bash
# 環境変数PYTHONPATHにdevディレクトリまでのパスを追加(Pathは調整してください)
export PYTHONPATH="/Users/kikudesuyo/directory/dev:$PYTHONPATH"
```

```hoge.py
# devディレクトリを起点としたimport
from dev.src.handler.piyo import handle_piyo
```


### `src`ディレクトリからimportしたい場合
```bash
# 環境変数PYTHONPATHにsrcディレクトリまでのパスを追加(Pathは調整してください)
export PYTHONPATH="/Users/kikudesuyo/directory/dev/src:$PYTHONPATH"
```
```python
# srcディレクトリを起点としたimport
from src.handler.piyo import handle_piyo
```

***すべてのファイルで統一したimportパスを記述する必要があります。中途半端に相対パスや異なる起点としてimport文を混在させると混乱のもとになります**

## チーム開発でのベストプラクティス
仮想環境(venv等)を構築する場合は、`bin/activate`ファイルに`PYTHONPATH`を設定しておくことで、環境を有効化する度に自動で反映されます。

以下のように`activate`スクリプトの下部に追記してください。
activateファイル(venv/bin/activateの下の方に追記させます)
```sh
export PYTHONPATH="/Users/kikudesuyo/directory/dev/src:$PYTHONPATH"

# Call hash to forget past commands. Without forgetting
# past commands the $PATH changes we made may not be respected
hash -r 2> /dev/null
```

こうすることで、チーム内の全員が共通の環境構成で開発・実行が可能になります。
※ プロジェクト全体でどのディレクトリを起点にimportを行うかを事前に決めておくことが重要です。READMEやドキュメントなどで明示しておくと、チーム内の認識齟齬を防げます。環境構築のスクリプト等に入れ込んでも良いかもしれないです。



### さいごに
複雑なアプリケーションを開発する際に開発体験が大幅に向上しました。是非試してみてください!
AtCoderをPythonで取り組んだ振り返り(ABC404 A、解けなかったけどBとCも少しだけ)

どうもこんにちは！

5月3日のAtCoderのコンテストに参加しましたので記録します。
今回はAのみ完答。BよりCの方が解けそうと思って取り組みましたが解ききれず。

# 問題

問題は以下のリンクから。完答できたAと途中までやったB,Cを振り返ります。

https://atcoder.jp/contests/abc404/tasks

https://atcoder.jp/contests/abc404/editorial

## A - Not Found -
25文字以下の英小文字列のうち、この文字列に含まれない文字をひとつ出力するという問題。含まれない文字が2個以上ある場合はいずれか1つを出力すればOKとしています。
シンプルに、aからzの英小文字の列を用意して、for文で含まれない文字が見つかったら出力するという形で実装しました。
~~~Python
s = input()
c = 'abcdefghijklmnopqrstuvwxyz'

for i in c:
  if i not in s:
    print(i)
    break
~~~

## B - Grid Rotation -
N行N列の配列で構成するグリッドが2つ与えられるので、一方のグリッドを加工して一致させるのに最小で何回の操作が必要かを出力する問題。グリッドに対してできる加工は以下の2つ。
1\. グリッドの任意の1マスの値を変更する
2\. グリッドを90°右回転させる
回転しないのであれば、2つのグリッドを比較して異なっているマスの数が必要回数です。同様に回転してからグリッドを比較すれば回転した場合の必要回数もわかります。問題はグリッドをどうやったら回転させられるかで、方法が思いつかず断念しました。
さて、解説によると配列の回転は下記の1行でできるようです。調べてみると過去にまとめている人がいて、まず*S[::-1]で配列を上下逆にして、次にzip関数で上下逆にした配列を転置したら回転した状態になるとのこと。なるほど。
~~~Python
list(zip(*S[::-1]))
~~~

https://qiita.com/rudorufu1981/items/5341d9603ecb1f9c2e5c

これらを踏まえて以下のコードを作ったら完答となりました。
~~~Python
n=int(input())
s = [list(input()) for _ in range(n)]
t = [list(input()) for _ in range(n)]

ans = 10000000000
for i in range(4): # iは回転の回数
    count = i

    # グリッドの差異の個数をカウント
    for j in range(n):
        for k in range(n):
            if s[j][k] != t[j][k]:
                count += 1

    # sを回転
    ans = min(ans,count)
    s = list(zip(*s[::-1]))

print(ans)
~~~

## C - Cycle Graph? -
与えられたN頂点M辺の単純無向グラフがサイクルグラフか否かを判定して出力する問題。サイクルグラフは全部の辺と頂点で1つの輪っかとなるようなグラフというイメージです。頂点や辺の最大数は$2 × 10^5$個で、計算量を考えないといけないC問題の定番ですね。
輪っかのようになるということは、1つの頂点につながる辺は2個なので、少なくともそれ以外の頂点があるグラフはサイクルグラフではないとなります。これを満たしたうえで、あと何を満たせばよいかわからず断念。なお解説によると、これは想定される間違いの1つとのこと。もう1つの条件が連結であることで、これら2つの条件を満たすかはDFSやBFS、Union-Findを使って判定できるということでした。


# おわりに
過去問を解いてないためと思いますが、問題のバリエーション多くてなかなか安定した成績を残せないところです。まぁ落ち着いてやっていきたいと思います。

ではでは。
LLMとRAGとAGENT何が違うのか？図解で理解するAIの進化形

LLMの活用が進む今、より実用的で賢い使い方として**RAGやAGENTの導入**が広がっています。

##  1. LLMとは？

**LLM（Large Language Model）** は、大量のテキストデータをもとに事前学習されたAIです。
ユーザーからの質問（プロンプト）に対して、あらかじめ学習した知識だけを使って文章を生成します。

### 例：

* GPT-4, Claude, Gemini, LLaMA 3 などが代表的なLLMです。
* インターネット検索や最新情報の取得は行いません。

### 特徴：

* 高速に反応できる
* 最新情報には弱い


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155256/b0ef97ea-ef86-4186-9e8f-3f07efbfffd6.png)
[LLM（大規模言語モデル）とは？
生成AIとの違いや仕組みを解説](https://www.nec-solutioninnovators.co.jp/sp/contents/column/20240229_llm.html)
## 2. RAGとは？

**RAG（Retrieval-Augmented Generation）**は、LLMに**外部情報を追加する仕組み**です。

ユーザーの質問に対して、まず関連する外部データを検索して取得（例：ElasticsearchやベクトルDBから）。その情報をもとにLLMが回答を生成します。

### 例：

* 社内ドキュメント、FAQ、最新ニュースなどの情報をAIが参照して答えてくれる

### 特徴：

* 最新の・正確な情報に基づいた回答が可能
* 少し処理が重く、コストも高くなることがある

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155256/53508680-028c-45fc-bced-ec625b56a594.png)

[RAG（Retrieval-Augmented Generation：検索拡張生成）とは？](https://atmarkit.itmedia.co.jp/ait/articles/2403/13/news035.html)


## 3. AGENTとは？

AGENT（エージェント）は、LLMに「記憶（Memory）」「ツール（Tools）」「推論（Reasoning）」の機能を追加した、より自律的に行動するAIです。

### できること：

* Webブラウザで情報収集
* APIや計算ツールの利用
* 長期記憶（ユーザー情報や過去の会話など）を保持
* 自分で判断して行動を決定する

### 特徴：

* 「タスクを丸ごと任せる」ことが可能
* 自動化に強く、業務支援やRPA的な使い方に向いている

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155256/2ff28306-43bb-4d6e-afc9-cb16d08ecbb7.png)

[RAG と AI Agent は何が違うのか？](https://www.flywheel.jp/topics/rag-and-ai-agent/)


## 比較表

| 項目    | LLM          | RAG          | AGENT             |
| ----- | ------------ | ------------ | ----------------- |
| 外部情報  | 使用しない        | 検索して使用する     | 使用 + ツールや記憶も併用    |
| 精度    | 学習時の知識に依存    | 最新情報を参照できる   | 外部情報 + 自律判断でさらに強力 |
| 処理速度  | 速い           | 中程度          | タスクにより時間がかかる場合もある |
| 適した用途 | チャット、要約、文章生成 | FAQ、検索付きチャット | 自動処理、複雑なワークフローの代行 |


https://www.ibm.com/jp-ja/think/topics/agentic-rag
https://polaris-lab.net/t9HxPA_V/Xc0UCIw_
https://qiita.com/zhao-xy/items/995c885f2778ec7551b1
https://atmarkit.itmedia.co.jp/ait/articles/2403/13/news035.html
【自分用】Stable Diffusion プロンプト例: サンプルと表現の違いをチェック【表情編】

# はじめに

元記事のプロンプトを実際に使用した場合の違いについて、実例で紹介します。

https://qiita.com/comty/items/fb06a2e9f730e3f1617b

この記事では表情を扱います。

元々の画像はこちら。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4006596/3b66bee5-a537-49cf-a9b5-4ccb0e6d3f86.png)


プロンプトはこのようになっています。
```
parameters

best quality, beautiful girl, 18yo, (1girl:1.4), (anime coloring, anime screencap),
(((blond hair))), bangs, long hair,
((gray eyes)), realistic eye,

BREAK


summer, beach, golden hour, ((pink casual wear)), collared shirt
look at viewer, portrait, top of head, from front,
Negative prompt: worst quality, low quality, normal quality, messy drawing, bad anatomy, bad hands, mutated hands, (extra_fingers:1.2), extra digit, extra arms, extra legs, mosaic censorship, fat, text, (two shot:1.2), (mesh hair:1.3)

```

まだ表情に関するプロンプトはありません。BREAKの次にプロンプトを入れてみましょう。

| 照れ笑い+赤面<br>embarrassed grin, blush | 泣き顔+涙<br>cry, tear streaks | 激しい睨み+開いた口<br>furious glare, open mouth | ミステリアス<br>mysterious | 目を閉じる<br>Close your eyes |
| ---- | ---- | ---- | ---- | ---- |
| ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4006596/530901b5-a8dc-4c93-ba44-d67eae343c37.png) | ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4006596/6fadf012-22cb-43e4-82e4-8b94ecf2d7a0.png) | ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4006596/c9826f84-7fa5-458a-989d-49849c39d272.png) | ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4006596/3dc5acb8-a354-4bca-beb7-18f7d9dcd765.png) | ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4006596/101277cd-e6f6-4aed-be12-398708d25ff0.png) |
---
表情によってシチュエーションを変えることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4006596/b3a0ad62-c597-45f1-b61a-d6589578cd58.png)

```
((laughing hard)), ((open mouth)), blush
```
このように、爆笑と口を開ける、赤面など、プロンプトを足し算していくこともできます。

---

使用するモデルによっては、学習の方向性などで表現できない表情があったりもしますが、いろいろとチャレンジしてみましょう。

---
# まとめ

多様なシーンに応用できるため、クリエイティブな表現の幅を広げる一助として活用してください。
キャラクターのイメージに合った表情をプロンプトで指定して、画像生成を楽しんでいきましょう！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4006596/4ffe0486-b705-4a4e-89a5-9b956673aa53.png)
証明書のメール検証ができず、メール転送サービスを利用した

2025.05.08
いろいろ間違えているかもですけど、以下の理解です。

# 現状
+ [no-ip](https://www.noip.com/)でpecode.comというドメイン名を購入しています
+ Amazon Route 53で、EC2のロードバランサ―のIPをpecode.comに割り当てる
+ AWS Certificate Manager (ACM)で証明書を作成する
+ 証明書はメールによる更新とする

これまでは登録された所有者に記載されているgmail等のアドレスに検証メールが送られてきてApprovalしていた。

# 問題点
1. メール検証が登録されている所有者ではなく、ドメイン名から勝手に（？）作られるアドレスであるadmin[at]pecode.comに送信されるように、AWSの仕様が変更される（これは、どこかで見た情報です）
1. pecode.comではメールサーバを立てていないので、admin[at]pecode.comを受信できない

# 最初に試したこと
+ メール検証ではなく、DNS検証の証明書を新しく作成する
+ おそらくno-ipでCNAMEを追加するのだが、いくら調べてもやり方がよく分からない

# 解決策
+ メールサーバをたてなくてもadmin[at]pecode.comのメールを受信できる方法があること知る
+ Amazon SES等のメール転送サービスがあるが、no-ipでドメインを管理しているので、no-ipのメール転送サービスを使用することにする（1年間14.99ドルがかかる😭）

# その他
証明書の有効期限は、2026年6月5日23:59:59(UTC)なので、1年後にもメール転送サービスを使う必要がある。
MCPを使ってClineにConfluenceのドキュメントを読み込ませる

## はじめに

Cline（Roo Code）便利ですね！
最近の開発ではClineなしでは考えられなくなってきています。

自分の開発チームではドキュメント管理にConfluenceをしようしていますが、ClineにいちいちConfluenceのドキュメントをコピペするのは非効率なので、MCPでドキュメントを取得するようにした際の備忘です。

## 環境

```
•	M1 Mac (Apple Silicon)
•	OS: macOS Sonoma
•	python: 3.11.1(pyenv)
```

## 手順

### uvxのインストール

今回はuvというパッケージ管理ツールを利用します。
以下のコマンドでインストールします。

```sh
curl -LsSf https://astral.sh/uv/install.sh | sh
```
https://docs.astral.sh/uv/

### mcp-atlassianのインストール

atlassianのmcpサーバーを立ち上げるためにmcp-atlassianをインストール&実行します。

```sh
uvx mcp-atlassian 
```

### .roo/mcp.jsonの設定

roo codeにMCPサーバーの設定をします。
今回はプロジェクトMCPの設定にしたので、.roo/mcp.jsonに以下の内容を追記します。
※ hoge, fuga, piyoの部分は定義置き換えてください。


```json
{
  "mcpServers": {
    "mcp-atlassian": {
      "command": "uvx",
      "args": [
        "mcp-atlassian"
      ],
      "env": {
        "CONFLUENCE_URL": "https://{hoge}.atlassian.net/wiki",
        "CONFLUENCE_USERNAME": "{fuga}",
        "CONFLUENCE_API_TOKEN": "{piyo}"
      },
      "alwaysAllow": [
        "confluence_get_page_children",
        "confluence_get_comments",
        "confluence_get_labels",
        "confluence_get_page"
      ]
    }
  }
}

```

## いざ実行！

今回はサンプルとして、最近作ったMCPについての勉強会資料を読み込ませてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2527942/c547ab3c-4a05-4f08-83a8-61f485a5bd2b.png)


タスクは以下です。（URLは適当に変えています。）

```
コンフルエンスからhttps://hogehoge.atlassian.net/wiki/spaces/20250508_MCP のドキュメントを取得し、要約して
```

できてそう！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2527942/15f140c3-5842-4659-b0fe-3db0050a1838.png)


## おわりに

今回はテストだったので適当なファイルを読み込ませましたが、実際の開発の際には要件定義書や設計書を読み込ませることによって、よりClineを使った実装がスムーズになりそうです。
ちなみにCursorでも.cursor/mcp.jsonの設定をすることで同じことができます！
ローカル環境Difyのワークスペース名をGUIから変更する方法

# はじめに
OSS版のローカル環境に構築したDifyのワークスペース名が、デフォルトでは、```オーナー名's Workspace```となる。これを変更する方法を紹介する。[こちらの記事](https://qiita.com/hanaya/items/311ac8d0bfd6c7a83d6c)の時は、GUIから変更できなかったが、2025.5.1時点ではGUIから変更可能になっていたのでGUIからの変更方法を紹介する。

# 動作確認環境
* Ubuntu 22.04 x86_64
* [Dify v1.3.1](https://github.com/langgenius/dify/releases/tag/1.3.1)

# 方法

オーナーの「設定」↓「メンバー」から、鉛筆マークをクリックして、「ワークスペース情報を編集」から編集する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638977/8781287a-d250-4934-9d6d-827be9c18c0f.png)

「確認」ボタンを押して、ワークスペース名が変更されれば成功。


# まとめ

OSS版のローカル環境に構築したDifyのワークスペース名を変更する方法を紹介した。GUIで簡単に変更できるようになっていたので試してほしい。Difyはリリース周期が早く、次々に改善されていくのでキャッチアップしていくのが重要だと感じた。


# 参考

https://qiita.com/hanaya/items/311ac8d0bfd6c7a83d6c

https://zenn.dev/yksn/articles/14ffecff63a8cd

https://docs.dify.ai/ja-jp/learn-more/faq/install-faq#7-%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E5%B1%95%E9%96%8B%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E3%81%A7%E3%82%B9%E3%83%9A%E3%83%BC%E3%82%B9%E3%81%AE%E5%90%8D%E5%89%8D%E3%82%92%E5%A4%89%E6%9B%B4%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95%E3%81%AF%EF%BC%9F