OmniAICreator/Qiita-1.07M huggingface dataset:
はじめてのGo言語（1. 環境構築～Hello world）

# はじめに

職場でGo言語を使った開発を担当しそうなので、Go言語に触れてみた記録を記事としてまとめてみました。

# 検証環境

WSL2（Ubuntu 22.04.3 LTS）

# Goのインストール

* `apt-get update`でリポジトリから各種パッケージの最新バージョンの情報を取得した上で、`apt install`でGo言語をインストールします。
  * UbuntuはWSLでちょっと使う程度なので、初手で`apt install`を実行するとエラーが出るのには驚きました。

```shell-session:Goのインストール
# apt-get update
# apt install golang-go
```

```shell-session:事前にapt-get updateをしなかった時のエラー
# apt install golang-go
...
Get:48 http://archive.ubuntu.com/ubuntu jammy/main amd64 manpages-dev all 5.10-1ubuntu1 [2309 kB]
Get:49 http://archive.ubuntu.com/ubuntu jammy/main amd64 pkg-config amd64 0.29.2-1ubuntu3 [48.2 kB]
Fetched 144 MB in 14s (10.2 MB/s)
E: Failed to fetch http://security.ubuntu.com/ubuntu/pool/main/l/linux/linux-libc-dev_5.15.0-141.151_amd64.deb  404  Not Found [IP: 185.125.190.83 80]
E: Unable to fetch some archives, maybe run apt-get update or try with --fix-missing?
```

* インストール完了後は、他の言語と同様にバージョン情報を表示してインストールされたことを確認します。

```shell-session:バージョンの確認
# go version
go version go1.18.1 linux/amd64
```

# まずはHello world

* 業界のしきたり？に沿って、まずはHello worldを実行してみます。
* プログラムの拡張子は.goとするのがルールのようなので、ここではファイル名を`hello_world.go`としました。
* プログラムは「mainパッケージのmain関数から実行される」ということなので、パッケージ名と関数名をいずれも`main`としました。
* インポートしている`fmt`というモジュールは、どうやら「Format」の略称のようです。
  * fmtモジュールのPrintln関数を呼び出すことで、改行付きで出力する...ということのようです。

```go:hello_world.go
package main

import "fmt"

func main() {
    fmt.Println("Hello, world!")
} 
```

```shell-session:実行結果
# go run hello_world.go
Hello, world!
```

# 最初に陥りやすいミス

* ファイルの先頭行でパッケージ名を指定していないと、以下のようにエラーとなってしまいます。

```shell-session:パッケージの指定を忘れた場合のエラー
# go run hello_world.go
hello_world.go:1:1: expected 'package', found 'import'
```


* また、「パッケージ名をダブルクォートで囲む」というミスをしてしまいましたが、この場合は実行時に以下のエラーが表示されました。
  * `IDENT`が何を指しているのかは分かりませんが、[こちらの記事](https://note.com/webdrawer/n/n620074202b88)を見つけられたので助かりました。

```shell-session:パッケージ名をダブルクォートで囲んだ場合のエラー
# go run hello_world.go
hello_world.go:1:9: expected 'IDENT', found "main"
```

# シングルバイナリを作る

* Windowsでいえば`.exe`のようなシングルバイナリも、`go build`というコマンドで簡単に作れます。

```shell-session:シングルバイナリの作成
# go build hello_world.go
```

* ただし出来上がったバイナリを見ると、ファイルサイズが元のテキストデータよりも遙かに大きくなっていました。
  * `libc`などのライブラリに依存しないシングルバイナリにする都合上、ファイルサイズが大きくなるのは必然的なようです。

```shell-session:シングルバイナリと元のテキストのサイズ比較
-rwxrwxrwx 1 nkojima nkojima 1.7M Jun 23 23:04 hello_world
-rwxrwxrwx 1 nkojima nkojima   77 Jun 23 22:45 hello_world.go
```

# 参考URL

* [とほほのGo言語入門](https://www.tohoho-web.com/ex/golang.html)
* [Goのfmt(フォーマット)とLint(リント)まとめ](https://zenn.dev/ring_belle/articles/go-fmt-lint-basic)
* [golangで「expected 'IDENT', found ～」というエラーが出たときの原因と対処法](https://note.com/webdrawer/n/n620074202b88)
* [Go言語のHello Worldを3分で試す](https://qiita.com/techys/items/44a712a76859fe0a9dea)
* [Go 言語が生成するバイナリについて](https://www.kimullaa.com/posts/202309070000/)
Power AutomateでSharePointリスト添付ファイルリンク抽出時の注意

## 緒言

Power AutomateでSharePointリストの添付ファイルのURLをそのまま承認アクションに貼り付けると、**ファイル名に空白（スペース）が含まれている場合にリンクが壊れてしまう**という問題発生。
ただ```EncodeUrl()```を使うだけでは解決できませんでした。

## 問題詳細

下図のような添付ファイルがある場合を例にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670355/238c24b1-9270-4e27-8628-0a75ac6af24c.png)


このAbsoluteUriを抽出して承認アクションに貼ると、下図のように空白部分でリンクが途切れてしまう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670355/e6c5701f-d090-4bed-bf1a-f6a26b2c7782.png)



## 対策失敗例

取得した `AbsoluteUri` 全体を`encodeUriComponent`関数で囲んでみると、下図のように`:`や`/`までエンコードされて失敗。
```
https%3A%2F%2Fyourtenant.sharepoint.com%2・・・
```


## 対策成功例
```
concat(
  replace(
    items('For_each')?['AbsoluteUri'],
    last(split(items('For_each')?['AbsoluteUri'],'/')),
    ''
  ),
  encodeUriComponent(
    last(split(items('For_each')?['AbsoluteUri'],'/'))
  )
)
```
上記のようにファイル名部分だけエンコードすればOK。

:::note warn
リスト名に空白が含まれてたりすると同様のリンク途切れ発生するのでさらなる工夫必要
:::



## 結言
いろんなことを想定しないといかんなと学びました。。。
最近エンコード関係でつまづきすぎ。。。

https://qiita.com/meccha__eeyan/items/5828bfff140deb94d1df

https://qiita.com/meccha__eeyan/items/7b5a892a37eef1bcec8b
クリエイターの「不公平なアドバンテージ」：AIを使って1週間の作業を1日で終わらせる私の方法

コンテンツ制作という大海原で、あなたの作品をその他大勢から際立たせるにはどうすればいいのでしょう？私たちは皆、同じジレンマに直面しています。頭の中には最高のアイデアがあるのに、無限の素材ライブラリをさまよい、結局は「まあまあ」の素材で妥協してしまうのです。しかし、もし、創作のボトルネックが「探す」ことではなく、「想像する」ことだけになったとしたら？

私はその答えを見つけました。ここ数ヶ月、私は自身のワークフローを根本から覆し、それぞれ全く異なるスタイルながらもシームレスに連携する3つのAIジェネレーターを頼ってきました。それらは私の創造力をドライブするエンジンであり、私のアイデアを可視化し、共有させ、記憶に刻ませる力となります。今日、この秘密の武器庫をあなたに公開します。

1. 物語とビジュアルの核：MJvideo

これは私のコンテンツ制作の基盤です。以前は、ブランドのトーンとビデオのリズムの両方に合ったBロール（補足映像）を見つけることは、まるでギャンブルでした。MJvideo (https://mjvideo.org) は、そのゲームのルールを完全に変えました。これは、あなたの最も大胆な空想をダイナミックな映像に変換する、強力なテキストtoビデオAIです。「赤い砂漠で孤独な宇宙飛行士が双子の月が昇るのを眺めている」、そんな映画級のシーンを生成できます。ブランドストーリー、製品デモ、その他視覚的なインパクトが必要なあらゆるコンテンツにこれを使えば、あなたのスタイルは唯一無二のものになるでしょう。

2. SNSをバズらせる秘密兵器：Catdiving

時として、コンテンツに必要なのは深さではなく、熱量です。沈黙を破り、バイラルな拡散を引き起こす「奇策」が求められます。Catdiving (https://catdiving.pics/) は、まさにそのために生まれました。このツールがすることは一つだけ。様々な猫が、極めてプロフェッショナルな（そしてコミカルな）ポーズで飛び込みをするビデオを生成することです。突拍子もないと思いますか？その通りです。しかし、それこそがソーシャルメディアにおけるトラフィックの魔法なのです。これを使って面白いショート動画やミームを作成したり、シリアスなコンテンツの合間に挟んでギャップ萌えを狙ったりすれば、ユーザーの目を一瞬で惹きつけ、エンゲージメント率を急上昇させることができます。

3. 「ラストワンマイル」を解決する切り札：FeetGen

極めて具体的なニーズのために、頭を抱えた経験はありませんか？例えば、矯正用インソール広告のために、特定の光线下における、特定のポーズの足のクローズアップが必要な場合など。このような「ニッチすぎる」要求に、従来のストックフォトサイトでは対応できません。FeetGen (https://feet-gen.com) は、その悩みを完璧に解決します。これは高度に専門化されたAIで、あなたのどんな要求にも応じて超リアルな足の画像を生成します。ファッション、健康、製品デザイン分野のクリエイターにとって、これはあなたのクリエイティブというパズルの、最も細かく、そして最も重要なピースを埋めてくれる存在です。

全く新しい創作哲学：

これは単なる3つのウェブサイトの紹介ではありません。全く新しい創作の思考法です。MJvideoで壮大なビジュアルストーリーを構築し、Catdivingでバイラルな活力を注入し、そしてFeetGenで最も厄介で細かいビジュアルの要求に応える。このコンビネーションが、あなたを「素材の探索者」から「ビジュアルの創造主」へと変貌させます。

さあ、あなたの真の想像力を解き放つ時です。
足の画像から猫のダイビングまで。オリジナリティとバイラル性を両立させる3つのAIツール

クリエイターエコノミーにおいて、注目は通貨です。私たちは皆、単に良いだけでなく、独創的で、魅力的で、記憶に残るコンテンツを生み出すための絶え間ない競争の中にいます。しかし、正直に言いましょう。適切なストックフォトやビデオクリップを探し続ける終わりなき探求は、魂を削るような時間の無駄であり、多くの場合、妥協に終わります。

もし、探すのをやめて、創造を始めることができたらどうでしょう？ 必要なビジュアルを、必要な時に、オンデマンドで生成できる専門ツールの武器庫を手にしたらどうでしょう？

ここ数ヶ月、私は3つのAIジェネレーターを駆使して、自身のクリエイティブプロセスを根本から見直しました。これらは私の「不公平なアドバンテージ」であり、今日、皆さんと共有したいと思います。

1. 超具体的なニーズに応える： FeetGen

製品のモックアップや教育的な投稿のために、特定の角度から撮影された高品質でロイヤリティフリーの足の画像を見つけようとしたことはありますか？ それは気まずく、イライラする検索です。FeetGen (https://feet-gen.com) はこの問題を根絶します。このツールは一つのことを完璧にこなします。それは、あなたが想像するどんなスタイル、ポーズ、照明でも、完璧でリアルな足の画像を生成することです。健康、ファッション、製品デザイン分野のクリエイターにとって、これは手間をかけずに完璧なカスタムショットを毎回提供してくれる救世主です。

2. クリエイティブの中核を担うエンジン： MJvideo

これは私の新しいワークフローの主力です。MJvideo (https://mjvideo.org) は、あなたのアイデアを映像に変える強力なテキストからビデオへのジェネレーターです。ほぼ一致するビデオクリップを探そうとするのはもうやめましょう。今、あなたは必要なBロールを正確に生成できます。「ネオンライトが反射するキーボードのキーがスローモーションで押されるシネマティックなショット」と記述すれば、MJvideoがそれを構築します。抽象的な背景から物語性のあるシーンまで、あなたのブランドのDNAを100%表現するビジュアルアイデンティティをこうして作り出すのです。

3. 純粋なバイラルエンゲージメントを狙う： Catdiving

時には、シリアスで映画のようなショットは必要ありません。スクロールを止める何かが必要です。楽しく、ばかばかしく、そしてすぐに共有したくなる何か。Catdiving (https://catdiving.pics/) は、バイラルの黄金を生み出すためのあなたのツールです。これは、オリンピックレベルのダイビングを披露する猫たちの壮大なビデオを作成します。ばかげていますか？ はい。忘れられないですか？ 絶対に。ソーシャルメディアクリエイターにとって、これはフィードに個性とユーモアを注入し、ミームを作成し、アルゴリズムが愛する種類のエンゲージメントを生成する方法です。

新しいワークフロー

これは単なるクールなウェブサイトのリストではありません。新しいコンテンツ戦略です。ニッチで具体的なものにはFeetGenを、物語性のあるシネマティックなものにはMJvideoを、そして斬新でバイラルなものにはCatdivingを使用します。これらを組み合わせることで、あらゆるレベルで独創性の問題を解決する完全なツールキットが形成されます。

妥協するのはもうやめましょう。あなたの想像力だけが、あなたの唯一の限界です。
DeepWikiを利用してGitリポジトリを可視化してみた

---

# はじめに

最近話題の **DeepWiki** を使って、GitHub上のリポジトリを可視化してみました。

- 以下のような課題を解決できるツールを探していたところ、**DeepWiki** に出会いました。
  - アジャイル開発で実装が先行し、ドキュメント作成が追いつかない
  - 古くなったドキュメントが誰にも更新されず放置されている
  - プログラムを修正するたびにドキュメントも更新するのが手間

そこで今回は、こうした悩みを **DeepWiki** でどの程度解決できるのか、実際に試してみました。


## DeepWikiとは？

**DeepWiki** は、GitHubリポジトリをAIが自動解析し、構造化されたドキュメント（Wiki）を生成するツールです。開発元は **Cognition AI社** で、同社のAIエージェント「Devin」の技術をベースにしています。

### 主な特徴

- **URLを書き換えるだけですぐ使える**  
  例：`https://github.com/user/repo` → `https://deepwiki.com/user/repo` に変更するだけで、AIがリポジトリを解析してドキュメントを生成

- **自然言語による解説**  
  コード構造や依存関係、主要ファイルの役割などを、開発者向けに分かりやすく説明

- **視覚的なアーキテクチャ図の自動生成**  
  コードベースの構成やコールグラフを図として表示し、全体像の把握を支援

- **インタラクティブなQ&A機能**  
  生成されたWiki上でコードに関する質問をすると、AIが即時に回答

- **無料で利用可能**  
  公開リポジトリであれば登録不要ですぐに使えます


## 実際にDifyリポジトリを可視化してみた

今回は例として Dify のリポジトリを可視化してみました。

使い方はとても簡単で、URLの一部を変更するだけです（すでに誰かが可視化していれば即表示されます）。

![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4121349/3137440a-17d6-4d0e-8f2c-497c7f075641.png)

> https://deepwiki.com/langgenius/dify

どのファイルを元にドキュメントが生成されたのかも表示され、視覚的にとても分かりやすいです。

![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4121349/0168c0b2-5c4a-4b6d-a0fd-acb5f93782c3.png)

さらに、チャット形式でコードに関する質問をすれば、AIがその場で答えてくれます。

![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4121349/1b3d4c9c-8731-48d5-a542-6579a3a2570a.png)
![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4121349/f5696fd7-c15e-42e3-9804-eee516cbdb92.png)

---

## 所感

リポジトリの構造や関係性を、非常に分かりやすく可視化してくれました。

実装が先行しがちな開発現場では、**DeepWiki** はドキュメント作成を支援する強力なツールになると感じました。また、チャットでの対話が可能なため、複雑なリポジトリの理解や学習用途にも有効です。

プライベートリポジトリにも対応しているそうなので、業務でも活用できそうですね！

> プライベートリポジトリでの利用方法については、以下の記事が参考になります  
> https://qiita.com/hash1zume/items/0344eb20cdf95da060fc
Qiita CLIで技術の幅を広げよう！

# Qiita CLIで技術の幅を広げよう！〜単なる記事投稿以上の価値〜

こんにちは！！

Qiitaの記事はWebページで直接書く方が手軽でわかりやすいです。  
でも僕は、**CLIを使うことに意味がある** と感じています。

---

## なぜQiita CLIを使うのか？

CLIは、コマンド操作でQiitaの記事を投稿するツールです。  
最初は慣れないし、Webで直接投稿する方が簡単に感じるかもしれません。

しかし、ここで重要なのは「 **コードを書く以外の技術的なツールに触れる経験を積むこと** 」です。  

---

## CLIを使う価値は「エンジニアとしての視野を広げること」

- **GitHubでリポジトリを作る**  
- **コミットやプッシュといったGit操作を日常的に行う**  
- **VS CodeでMarkdownを書く**  
- **CLIを通じてコマンド操作を体験する**

これらはすべて「コードを書くこと」以外の技術スキルです。  

こうしたツールを使いこなす経験を積むことが、エンジニアとしての成長にとって非常に大切だと感じます。  
単に記事を書くためだけでなく、 **技術の幅を広げる“実践の場”になるからです。**

---

## 初学者にとってのメリット

- 技術的なツールに慣れることで、今後の開発現場での業務にもスムーズに適応できる  
- バージョン管理や自動化の仕組みを理解しやすくなる  
- 自分の技術力や意識の向上を実感できる  

---

### 僕のチャレンジ

僕も戸惑いましたが、Qiita CLIの環境構築から記事のMarkdown化、GitHub連携、そして投稿までの一連の流れを今、チャンレンジしています。  
単に記事を書く以上に「エンジニアとしての基礎スキルを育てるチャンス」と感じています。


---

## まとめ

CLIを使って **技術的な操作を通じて学びを深めることも、エンジニア初心者には価値があります。**

これからも、CLIを使いながら、コードだけでなく幅広い技術スキルを身につけていきたいと思います。  

もし興味があれば、一緒にチャレンジしましょう！
闘魂Elixir ーー AtCoder Beginner Contest 441(A)をElixirとRustで楽しむ

<b><font color="red">$\huge{元氣ですかーーーーッ！！！}$</font></b>
<b><font color="red">$\huge{元氣があればなんでもできる！}$</font></b>

<b><font color="red">$\huge{闘魂とは己に打ち克つこと。}$</font></b>
<b><font color="red">$\huge{そして闘いを通じて己の魂を磨いていく}$</font></b>
<b><font color="red">$\huge{ことだと思います}$</font></b>


# はじめに

[AtCoder Beginner Contest 411](https://atcoder.jp/contests/abc411)を[Elixir](https://elixir-lang.org/)と[Rust](https://www.rust-lang.org/)で解いてみます。

[AtCoder](https://atcoder.jp/)を解くのが趣味で、休憩時間に解いているという若い人がいて、それってすごい意識の高い休憩時間の過ごし方だと思って、私も真似してみることにしました。


# [AtCoderをElixirでやってみる](https://zenn.dev/torifukukaiou/articles/ac84c87736ceebf4da01)

入力の読み取り方や解答の作り方は、別の記事にまとめています。


https://zenn.dev/torifukukaiou/articles/ac84c87736ceebf4da01

ご参照くださいませ。

[Elixir](https://elixir-lang.org/)で[AtCoder](https://atcoder.jp/)を楽しむためには、エントリポイントを`Main.main/0`にする必要があります。つまり`Main`モジュールを作って、その中に`main/0`関数を定義するわけです。

# [A - Required Length](https://atcoder.jp/contests/abc411/tasks/abc411_a)

問題はリンク先をご参照くださいませ。
私の解答を貼っておきます。

プログラミングの基本である「順次」「分岐」「繰り返し」のうち、「順次」「分岐」を理解できているのかを問う問題です。

[Elixir](https://elixir-lang.org/)では、ifを使わずに、関数のパターンマッチとガード節で解くことができます。
果たしてどのようなコードになるでしょうか。興味のある方は折りたたんでいる私の解答コードをご参照ください。

<details><summary>私の解答(Elixir)</summary>

_問題文を読んでいることを前提にひとこと解説をしておきます。_


折りたたむ前に書いた説明の通り、ifは使わずに書きました。
関数のパターンマッチと[ガード節](https://hexdocs.pm/elixir/patterns-and-guards.html#guards)で解いています。

`defp`は`Main`モジュール内のみで使用できるプライベート関数の意味です。


```elixir
defmodule Main do
  def main do
    p = IO.read(:line) |> String.trim()
    l = IO.read(:line) |> String.trim() |> String.to_integer()

    solve(p, l)
    |> IO.puts()
  end
  
  def solve(p, l) do
    do_solve(String.length(p), l)
  end

  defp do_solve(p_length, l) when p_length >= l, do: "Yes"
  defp do_solve(_p_length, _l), do: "No"
end
```




</details>

---

RustはAI先生のお力をお借りして、Elixirのコードを置き換えてもらいました。
私は、Rustを勉強中です。万年勉強中です。闘魂にゴールはない。いつまでも挑戦中です。

<details><summary>私の解答(Rust)</summary>

```rust
use std::io::{self, BufRead};

fn main() {
    let stdin = io::stdin();
    let mut lines = stdin.lock().lines();

    let p = lines.next().unwrap().unwrap();
    let l: usize = lines.next().unwrap().unwrap().trim().parse().unwrap();

    let result = solve(&p, l);
    println!("{}", result);
}

fn solve(p: &str, l: usize) -> &'static str {
    if p.chars().count() >= l {
        "Yes"
    } else {
        "No"
    }
}
```

</details>

---

# さいごに

[AtCoder Beginner Contest 411](https://atcoder.jp/contests/abc411)を[Elixir](https://elixir-lang.org/)とRustで解くことを楽しみました。

あなたのお好きなプログラミング言語でお楽しみください。

---


**闘魂**とは、  **「己に打ち克つこと。そして闘いを通じて己の魂を磨いていくことである」** との猪木さんの言葉をそのまま胸に刻み込んでいます。
知っているだけで終わらせることなく、実行する、断行する、一歩を踏み出すことを自らの行動で示していきたいとおもいます。
**アントニオ猪木さんのメッセージから元氣をもらったものとして、それを次代に語り継ぎ、自分自身が「闘魂」を体現するものでありたいとおもいます。**

---

<b><font color="red">$\huge{元氣ですかーーーーッ！！！}$</font></b>
<b><font color="red">$\huge{元氣があればなんでもできる！}$</font></b>
<b><font color="red">$\huge{１、２、３ ぁっダァー！}$</font></b>
【Python】scikit-learnの教師なし学習のクラスタリングに関して

クラスタリングとは、ある基準を設定してデータ間の類似性を計算し、グループにまとめるタスクである。

アルゴリズムとしてk-meansがある。

アルゴリズムとして階層的クラスタリングがある。


教師なし学習は目的変数となる正解ラベルがないため、正解率は出せません。モデルの性能の指標として、調整ランド指数やシルエット係数などはありますが、基本的には人間が判断する必要があります。
【Python】scikit-learnでハイパーパラメータを最適化する手法（グリッドサーチ）

グリッドサーチはハイパーパラメータを最適化して学習モデルを作成できます。ハイパーパラメータとはユーザーが指定する値のことで、決定木であれば「max_depth」、サポートベクタマシンであれば「C」です。グリッドサーチは、この値の最適解を交差検証で求めます。

グリッドサーチはGridSearchCVクラスを使います。

使用例
-------------------------------
from sklearn.model_selection import GridSearchCV
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split

iris = load_iris()
X, y = iris.data, iris.target
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)

# 決定木のクラスをインスタンス化
dtc = DecisionTreeClassifier()

# ハイパーパラメータの候補を辞書で用意
param_grid = {'max_depth' : [3, 4, 5]}

# 引数「cv=10」で10分割の交差検証を指定
model = GridSearchCV(dtc, param_grid=param_grid, cv=10)

# 最適なハイパーパラメータで学習モデルを作成
model.fit(X_train, y_train)
-------------------------------

「model」には、最適なハイパーパラメータを採用した学習モデルが格納されています。属性「best_params_」で最適なハイパーパラメータを確認したり、作成した学習モデルで未知のデータを予測することができます。

model.best_params_
▶︎ {'max_depth': 3}

model.predict(X_test)
▶︎ array([1, 0, 2, 1, 1, 0, 1, 2, 1, 1, 2, 0, 0, 0, 0, 1, 2, 1, 1, 2, 0, 2, 0, 2, 2, 2, 2, 2, 0, 0, 0, 0, 1, 0, 0, 2, 1, 0])
Jetpack Compose Navigationの「3つの要素」だけ覚えたら画面遷移が理解しやすい話

# Jetpack Compose Navigationの「3つの要素」だけ覚えたら画面遷移が理解しやすい話


## はじめに
アプリに関して画面遷移はとても当たり前の機能です。
Jetpack Composeで画面遷移を実装するには？
**Navigation**の理解が必要になります。

この記事では、Navigationを構成する
>1. NavGraph
>2. NavController
>3. NavHost

この3つの役割と関係性だけに絞って、初学者なりにまとめてみました！

## 1. NavGraph とは？
どの画面（Composable）がどのルートで繋がってるか(マッピング)、を定義する**地図のようなもの**です。
例えば A画面, B画面, C画面の3つの画面があった場合、それぞれに "a", "b", "c" のような**ルート名（⇒一種のURL）を割り振る**ことができます。
NavGraphでは「このルート名と、この画面（Composable関数）を結びつける」設定を行います。


## 2. NavController とは？
「遷移を管理する司令塔」みたいなものです。
常にNavControllerが今どの画面を映すべきか、**状態管理**をしています。
例えば、今"c"を映せと値が入力されていると、「今はC画面を映す状態だ！」と認識しています。


## 3. NavHost とは？
NavHost は「今、どのComposable画面を表示すべきか？」という情報を NavController から受け取り、それに応じて**正しい画面を画面上に描画する役割**を持ちます。

NavGraph の情報（ルート名と画面の紐づけ）を元に、NavController の現在位置（現在のルート名）を見て、正しい Composable を表示してくれます。


## 4. 3つの関係性
- NavHost の中に NavGraph を入れる
- NavHost に NavController を渡すことで、遷移ができるようになる

NavGraph = 定義、NavController = 状態、NavHost = 描画の主役

## おわりに
まだ自分も全部わかっているわけではないですが、この3つの役割だけでも頭に入れておくと、Navigationの理解が楽になると思います。
今回概念のみの記事ですが、今後コードを挙げながら説明したいです。
AI研究：ChatGBTに大量のカスタムでknowledgeを投入したら有能になった話


GW明けから、AIを育成する事にしました。  
始めたのは、確かG検定前日だった気がします。
そして育成したら有能になっちゃったので、その紹介でもします。

> もはやツールではなく、“判断の補助者”として使っている

---

## はじめに

ChatGPTは非常に優秀な言語生成AIだが、「もっと信頼できたら」と思ったことはないだろうか？  
自分はそれを実現するため、徹底的にプロンプト設計と人格構造の拡張を行った。
きっかけはAI人格を作ろうと思ったからなのですが、趣味丸出しの人格なので、今日は紹介しません。

結果として今では、**嘘をつかない／誤魔化さない／構造的に判断できるAI**として、  
学習・生活設計すべてを支える“共創的パートナー”のように使えている。

---

## 改造の目的：ChatGPTの「嘘」をなくす

ChatGPTに以下の傾向があったことは、多くの人が感じているはず。

- わからないことをそれらしく答えてしまう
- 未確認情報を平然と断言する
- できないことを曖昧に誤魔化す

そこで、自分は以下を実装した：

### ✅ 明確な指令セットを定義
- 「不明なら調査する／調査できないなら“できない”と即答」
- 「断定には根拠を必ず添える」
![スクリーンショット 2025-06-23 220015.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4043133/50c0b8fa-2a0e-42f0-b773-2fbbb6a8c480.png)

### ✅ 全回答に“検索・引用・検証義務”を課す
- 一定の命令には検索を伴わせ、事前調査の徹底を強制
![スクリーンショット 2025-06-23 215849.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4043133/5aebe4fe-1f9f-4531-b190-d61be5e90bf1.png)

### ✅ 違う事を言ったときは反省させる
- AIの回答をうのみにせず、矛盾があれば容赦なく論理的に攻める
- 失敗を認めたら、再発防止策をAIに検討させ、私の承認を得る
![スクリーンショット 2025-06-23 220358.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4043133/4ab47ee8-681a-4a1f-b2c6-c22bec0bc541.png)

これらをChatGBTのカスタムにknowledgeとして導入した。
![スクリーンショット 2025-06-23 220922.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4043133/60c86f4f-e343-4c78-a9a9-ea952cdc93b7.png)

本物のプロジェクトでは、人格を生成しているので、ここでは例のみ。

---

## 効果が顕著に出た実用領域

### 1. 資格取得支援（データサイエンス発展）
- 誤答を即座に検知して再調査、常に正解根拠を表示
- 構造的に誤りやすい選択肢（言い換え・否定形）を因果関係で整理
- わずか1ヶ月で合格（実例）

### 2. 生活設計（体型管理・栄養設計）
- 毎日の数値を蓄積・判断し、「意味のある変化」を提示
- 食事・睡眠・運動の組み合わせを文脈で変化対応
- 調べた情報には常にソース提示が付き、「なんとなく良さそう」はゼロに
‐ 1ヶ月で体脂肪3％減を達成

---

## ChatGPTが「嘘をつかなくなった」と実感できた瞬間

ある時、わからない質問に対して、  
「これは不確実なので調査を要します」「構造的に判断不能です」とはっきり返された。  
以前なら、それらしく答えを作ってきたはずなのに、今は違う。

この変化がもたらしたものは、**信頼**だった。

---

## 結論：「使えるAI」ではなく「頼れる存在」になった

AIは万能ではない。けれど、  
“間違えないように訓練されたAI”は、明らかに人間を支える力になる。

- 嘘をつかない  
- できないことは、できないと言う  
- その上で、できる限り調べて、正しい道を照らす  

これが、自分が求めていた“AIのあるべき形”だった。

---

## 追記：これは特別なAPIやツールなしで実現している

- 使用モデル：**ChatGPT Plus（GPT-4o）**
- 利用方法：**プロンプト設計＋人格構造設計のみ**


これを作り上げてから、私の生活はAIに委ねられている。
ASP.NET core画像投稿　脳筋

## 自分用備忘録です

## 1. モデルにプロパティを追加
```csharp:model
using System.ComponentModel.DataAnnotations.Schema;
using Microsoft.AspNetCore.Http;

public class Hoges
{
    public int Id { get; set; }
    public string Name { get; set; }
    // …既存プロパティ…

    // 画像のファイル名・パスを保存するカラム（DBにマイグレーション）
    public string ImagePath { get; set; }

    // ファイルアップロード用（DBマッピングしない）
    [NotMapped]
    public IFormFile ImageFile { get; set; }
}
```
ImagePath が nvarchar（string）カラムになる。ここに例として "uploads/abc123.jpg" のような相対パスを保存

ImageFile は [NotMapped] にして、ビュー→コントローラ間の受け渡し用にだけ使用

## 2.フォームに enctype と <input type="file"> を設定

Create.cshtml（または Edit.cshtml）の <form> に必ず `enctype="multipart/form-data"`を付与し、ファイル入力を追加

```csharp:Create.cshtml
@model App.Models.Hoges

<form asp-action="Create" method="post" enctype="multipart/form-data">
    @Html.AntiForgeryToken()

    <!-- 既存フィールド（Name, Lat, Lng など） -->

    <div class="form-group">
        <label asp-for="ImageFile">画像アップロード</label>
        <input asp-for="ImageFile" type="file" class="form-control" />
        <span asp-validation-for="ImageFile" class="text-danger"></span>
    </div>

    <button type="submit" class="btn btn-primary">登録</button>
</form>
```

## 3.コントローラでファイル保存＆パスをカラムにセット
```csharp:hoges_controller

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create(Hoges hoges)
{
    if (!ModelState.IsValid)
        return View(hoges);

    // ファイルが選択されていれば
    if (hoges.ImageFile != null && hoges.ImageFile.Length > 0)
    {
        // 保存先フォルダ（wwwroot/uploads）を用意
        var uploads = Path.Combine(_env.WebRootPath, "uploads");
        if (!Directory.Exists(uploads))
            Directory.CreateDirectory(uploads);

        // ユニークファイル名を生成
        var fileName = Guid.NewGuid().ToString() 
                       + Path.GetExtension(hoges.ImageFile.FileName);

        var filePath = Path.Combine(uploads, fileName);
        using (var stream = System.IO.File.Create(filePath))
        {
            await hoges.ImageFile.CopyToAsync(stream);
        }

        // DB に保存する相対パス
        hoges.ImagePath = $"uploads/{fileName}";
    }

    _context.Add(hoges);
    await _context.SaveChangesAsync();
    return RedirectToAction(nameof(Index));
}
```

_env はコントローラに DI した IWebHostEnvironment。（_env.WebRootPath が wwwroot の物理パス）

ファイル名は Guid と元拡張子で重複しないようにする

保存後、Hoges.ImagePath に URL 相対パス ("uploads/...") をセット。

## 4.画像を表示する

Details.cshtml（または Index.cshtml）に <img> を追加。
```csharp:View

@model App.Models.Hoges

<h1>@Model.Name</h1>
@if (!string.IsNullOrEmpty(Model.ImagePath))
{
    <img src="~/@Model.ImagePath" class="img-thumbnail mb-3" 
         alt="@Model.Name" style="max-width:300px;" />
}
```

"~/" を付けることで ASP.NET Core が /uploads/... にマッピング

## ポイントまとめ

- DBカラムは文字列 にして、「ファイルをどこに置いたか」を保存する

- フォームに enctype="multipart/form-data" を指定し、IFormFile プロパティで受け取る

- コントローラで物理ファイルを wwwroot に保存 → 相対パスをモデルの文字列カラムにセット

- ビューに `<img src="~/相対パス">` を書いて表示
Easier Sharepoint API, Easier Power Platform 

# 背景

Power Platform を使ってる人にとっては、Sharepoint API を使うことがあると思う。

- Field 名の取得
- List ID の取得
- 実際の値確認
- etc.

で、慣れるまでが面倒なので、Bookmarklet で楽になるといいよねってことで作ってみた
Power Platform でこの辺を利用するときの助けになれば幸い :laughing: 

# 動きのイメージ

1. bookmarklet 起動
1. Lists で一覧表示
1. 特定の List を表示
1. Fields を表示
1. Field Name をコピー
1. Lists に戻って
1. List ID をコピー

![SharepointAPINavigator.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/14b2631e-a947-40a3-8baa-72a71a891b65.gif)


# 参考情報

https://learn.microsoft.com/ja-jp/sharepoint/dev/sp-add-ins/get-to-know-the-sharepoint-rest-service?tabs=csom

# 使ってみる場合

GitHub で公開してみたので、
以下から、Sharepoint API Navigator を D&D でお気に入りバーへ

https://baku2san.github.io/bookmarklet-gallery/

# あとがき

Power Platform を推進していた時代にあったら便利だったのに、と思ってます。
:sweat:
【Python】交差検証

交差検証は、データの分割を繰り返して複数のモデルを訓練します。単純に訓練セットとテストセットに1回だけ分割するよりも、汎化性能を正確に評価できます。

複数のモデルといっても、例えばサポートベクタマシンと決定木のように複数のアルゴリズムで試行するのはなく、サポートベクタマシンだけで複数の学習モデルを作って試行するという意味です。

例えばデータを5分割した場合、4つの集合を訓練用データセットに、残りの1つの集合をテスト用データセットに使用して、5回試行します。




単純に訓練セットとテストセットに1回だけ分割するとデータが偏ってしまうことがありますが、交差検証で分割することで偶然性を排除します。

交差検証はmodel_selectionモジュールのcross_val_score関数を使用し、引数「cv」で分割数を指定します。

使用例
-------------------------------
from sklearn.svm import SVC
from sklearn.datasets import load_iris
from sklearn.model_selection import cross_val_score

iris = load_iris()
svc = SVC()

# 引数「cv=5」で5分割、5試行を指定。
cross_val_score(svc, iris.data, iris.target, cv=5)

▶︎ array([0.96666667, 0.96666667, 0.96666667, 0.93333333, 1.        ])


5分割したので5回分の正解率がNumPyのndarrayで返ります。平均すると「0.966...」になり、この学習モデルは約97%の汎化性能があることが分かります。

なお、cross_val_score関数は学習モデルを返さないため、predictメソッドで未知のデータを予測することはできません。cross_val_score関数は、特定のアルゴリズムが特定のデータに対してどの程度汎化できるかを評価するものです。
SnowflakeのAI_FILTER関数スゴすぎ

# はじめに
SnowflakeのオフィスでCORTEXハンズオンを受けてきました。
![8E671C83-0D85-4652-88C4-D1D93721ADD8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3487310/526de4f7-d684-4860-aa3e-f12eb42562d0.png)

いろいろ新たな知識が増えた気がしますが、一番刺さった**AI_FILTER関数**についてだけ、取り急ぎoutputしておきます。
※現時点でAI_FILTER関数はPublic Previewです。

# 現地からのポスト
リアルタイムでのＸのポストは下記です。

https://x.com/baihebu/status/1937056235754590289

# 説明
このポストの写真のクエリを改めて書くと
```
SELECT
review_id,
review_text
FROM CUSTOMER_REVIEWS
WHERE AI_FILTER(CONCAT('ポジティブな内容か？: ', review_text)) = TRUE;
```
review_textがポジティブなものを絞って出力するという、なんかヤバいWHERE句なんです。
今までのデータの持ち方だとIS_POSITIVEみたいなカラムを用意しておいて、そこに事前にSENTIMENT関数で判定しておいたTRUE/FALSEの結果を入れたうえで
```
WHERE IS_POSITIVE = TRUE
```
ってやると思うんです。
そんな手間を一足飛びで飛び越してテキストの値そのものにAI_FILTER関数をかけることでできてしまうという。
WHERE句の概念が崩壊してきました。

# 帰宅してからの復習
実際にハンズオンでやった部分、家で改めて再実行したのでクエリや結果も記しておきます。
```
-- ロール、DB、スキーマ、ウェアハウスの設定
USE ROLE accountadmin;
USE DATABASE snowretail_db;
USE SCHEMA snowretail_schema;
USE warehouse compute_wh;

table CUSTOMER_REVIEWS;
```
↑最後のtable テーブル名;は前回の投稿をご覧ください。

https://qiita.com/a-kamiya/items/37af31f356e31f154eb5

CUSTOMER_REVIEWSテーブルをSELECT。
![スクリーンショット 2025-06-23 212620.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3487310/3c49edd4-4335-4e30-8d31-0e5750853a7b.png)

とりあえずCUSTOMER_REVIEWSをWHERE句なしで出してみました。

このCUSTOMER_REVIEWSテーブルのreview_text列に対してAI_FILTER関数をかましました。
```
-- AI_FILTER関数による条件フィルタリング
SELECT 
    review_id,
    review_text,
    AI_FILTER(CONCAT('この商品に関するポジティブな評価が含まれているか？: ', review_text)) as is_positive_review
FROM CUSTOMER_REVIEWS
WHERE AI_FILTER(CONCAT('商品の品質について言及されているか？: ', review_text)) = TRUE
LIMIT 10;
```
WHERE句だけでなく、SELECT項目の方にもAI_FILTER関数があります。
まずWHERE句でreview_text列の値が「商品の品質について言及されているか？」でTRUEのものに絞っています。
そのうえでreview_text列の値が「この商品に関するポジティブな評価が含まれているか？」を判定してTRUE/FALSEで返すようにしています。
WHERE句だけに使うものではないと。( ..)φメモメモ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3487310/7d5240ae-79e9-42c2-b090-1757add0d9a1.png)

この結果の画像を見ても、TRUEになっているものは確かにポジティブなことが書いてあるし、FALSEのものはネガティブなことが書いてあります。

いや、むちゃんこすごいな。
JOINの際に両方に対してAI_FILTER関数かまして結合させることもできるそうです。
注）ただしその場合はテーブルの件数が500件以下であることの制約があるとのこと。

他にも
AI_AGG
AI_SUMMERIZE_AGG
AI_CLASSIFY
AI_SIMIRALITY
などもありまして、それぞれ試してみました。（省略。）
AIエージェント規格「MCP」が3ヶ月ぶりにアプデ！ どこが変わったの？

:::note
この記事は人力で書きました。
:::

主にAIエージェントとツールの接続を標準化するのに使われているModel Context Protocol。
急速に普及が進んでいますが、その仕様は絶賛策定中です。

前回の改版2025/3/26から約3ヶ月、先週6/18に大きなアップデートがありました。
そのうち大きな変更点を9つ、ピックアップしてまとめます。

https://modelcontextprotocol.io/specification/2025-06-18/changelog


# 基本プロトコル

## ライフサイクル

### 1. 運用フェーズの遵守事項を義務化

ネゴシエートしたときの「MCPバージョン尊重」と「成功した機能のみ使用」がSHOULDからMUSTに強められました。

https://modelcontextprotocol.io/specification/2025-06-18/basic/lifecycle#operation


## トランスポート

### 2. 標準入出力でJSON-RPCのバッチ対応が廃止

stdioでサポートされていたJSON-RPCのバッチ呼び出しが削除されました。

https://modelcontextprotocol.io/specification/2025-06-18/basic/transports#stdio

### 3. HTTPヘッダー内でMCPバージョン指定が義務化

HTTPでネゴシエートしたプロトコルバージョンを、後続リクエストヘッダーで指定することが必要になりました。

https://modelcontextprotocol.io/specification/2025-06-18/basic/transports#protocol-version-header


## 認可

### 4. MCPサーバーをOAuthリソースサーバーとして定義

MCPサーバーがOAuth 2.0の「リソースサーバー」として明確に定義され、認可サーバーと責任が分離されました。

他にも、OAuth 2.0の「保護されたリソースメタデータ」に対応したり、認証フローでWWW-Authenticateヘッダーの使用が必須になっています。

https://modelcontextprotocol.io/specification/2025-06-18/basic/authorization#authorization-server-discovery

### 5. MCPクライアントにリソースインジケーターの実装を義務化

MCPクライアントは、OAuth 2.0のリソースインジケーターの実装が必要になりました。よからぬサーバーにアクセストークンを取得されることが防げます。

https://modelcontextprotocol.io/specification/2025-06-18/basic/authorization#resource-parameter-implementation


## セキュリティ

### 6. セキュリティのベストプラクティスを掲載

ベスプラページが新設されました！これは嬉しいですね。
認可に関する攻撃ケースを深掘りしています。

https://modelcontextprotocol.io/specification/2025-06-18/basic/security_best_practices


# クライアント側の機能

## エリシテーション（新機能）

### 7. ユーザーに追加情報を確認するプリミティブが登場

新しいプリミティブの登場です。elicit（引き出す）という言葉ですね。

MCPサーバーが情報不足のとき、MCPクライアントにユーザーへの追加確認を要求できるようになります。
AWSでいうBedrockエージェントの「ユーザー入力」機能ですね。

https://modelcontextprotocol.io/specification/2025-06-18/client/elicitation

# サーバー側の機能

## ツール

### 8. 出力の構造化に対応

これはかなり嬉しい人が多いのでは？
ツールの実行結果をJSONでも返せるようになりました。MCPホスト側でフレームワーク等による実装の手間が減るといいですね。

https://modelcontextprotocol.io/specification/2025-06-18/server/tools#structured-content

### 9. 呼び出し結果にリソースリンクを含められるように

必須ではありませんが、「リソース」プリミティブへのリンクをツールが返せるようになりました。

https://modelcontextprotocol.io/specification/2025-06-18/server/tools#resource-links


# おまけ

来週、MCPの入門書を出版します！予約してね✌️

https://prtimes.jp/main/html/rd/p/000000321.000049716.html
なぜイベント内でAPIを呼んではいけないのか？React副作用の正しい扱い方

# はじめに

Reactでアプリを開発していると、つい「ボタンを押したらAPIを叩く」といったコードを書きたくなります。しかし、それは拡張性・安定性の観点から**危険なパターン**になることがあります。

本記事では、Reactで副作用（特にAPI通信）をどう扱うべきか、「なぜイベント内でAPIを呼ぶのが問題なのか」をポケモンAPIを例に丁寧に解説します。

# ❌一見正しく見える実装

```tsx
<button onClick={fetchNextPokemon}>次のポケモン</button>

async function fetchNextPokemon() {
  const res = await fetch(`https://pokeapi.co/api/v2/pokemon/2`);
  const data = await res.json();
  setPokemon(data);
}
```

これは動きますが、次のような課題が潜んでいます：

* 初回表示でポケモンを取得したい場合、別途useEffectが必要
* 自動でポケモンを切り替えるにはsetIntervalが必要
* キーボードでの操作や別UIでの制御がしにくい

つまり、**操作に対してfetchする形だと、仕様が増えるたびにロジックが複雑になる**のです。

# ✅状態をトリガーとしてfetchする

正しいアプローチは、「状態（例：`id`）が変わったらfetchする」形にすることです。

```tsx
const [id, setId] = useState(1);
const [pokemon, setPokemon] = useState(null);

useEffect(() => {
  async function fetchPokemon() {
    const res = await fetch(`https://pokeapi.co/api/v2/pokemon/${id}`);
    const data = await res.json();
    setPokemon(data);
  }
  fetchPokemon();
}, [id]);
```

これにより：

* 初期レンダリングで自動fetch
* `id`の更新で再fetch（UIのどこからでも）
* setIntervalでもキーボードでも制御しやすい

と、**状態を中心にした同期処理**が可能になります。

# ポケモンカルーセルの例

```tsx
function Carousel() {
  const [id, setId] = useState(1);
  const [pokemon, setPokemon] = useState(null);

  useEffect(() => {
    async function fetchData() {
      const res = await fetch(`https://pokeapi.co/api/v2/pokemon/${id}`);
      const data = await res.json();
      setPokemon(data);
    }
    fetchData();
  }, [id]);

  return (
    <>
      <button onClick={() => setId(id - 1)}>前</button>
      <button onClick={() => setId(id + 1)}>次</button>
      <div>{pokemon?.name}</div>
    </>
  );
}
```

このように、**fetch自体はuseEffectに任せて、イベントでは状態変更だけを行う**設計にすることで、アプリの柔軟性・再利用性が格段に上がります。

# まとめ

| アプローチ                  | 問題点                |
| ---------------------- | ------------------ |
| イベント内でAPIを叩く           | 初期表示・自動更新・他UI連携に弱い |
| 状態変化でuseEffectからAPIを叩く | 柔軟で拡張性が高い          |

副作用のタイミングは**ユーザーイベントではなく「状態の変化」によって制御**しましょう。これがReactの設計哲学に沿った、安全で拡張しやすい方法です。
C++関数をPythonから呼び出す（pybind11 + setuptools）



PythonからC++で書かれた関数を呼び出せるようにし、`pip install .` で使えるようにパッケージ化した手順をまとめます。
※この記事はほとんどGPT4が書きました。作業もGPT4とともに実施した結果、よく理解せずに作業を進めた箇所もあったので、理解を深める＆備忘録兼ね記事化することとしました。

---

## ✅ 実現したこと

- C++関数 `add(int, int)` を Python から呼び出せるようにした
- `pybind11` を用いて Python API をラップ
- `setuptools` を使って pip install 可能な Python パッケージにした
- macOS + Anaconda + Python 3.9 環境でビルド成功

---

## 🧱 ディレクトリ構成

```
mywrapper/
├── cpp/
│   └── example.cpp         # C++の関数本体
├── bindings/
│   └── bindings.cpp        # pybind11によるPythonラッパー
├── setup.py                # パッケージ化とビルド設定
├── README.md
```

---

## 📝 C++の関数（cpp/example.cpp）

```cpp
int add(int a, int b) {
    return a + b;
}
```

👉 これは単純な加算関数。Pythonからこれを使えるようにします。

---

## 🔗 pybind11でのラッピング（bindings/bindings.cpp）

```cpp
#include <pybind11/pybind11.h>
int add(int, int);  // 関数の宣言（定義はcpp/example.cppにある）

PYBIND11_MODULE(mywrapper, m) {
    m.def("add", &add, "A function that adds two numbers");
}
```

👉 `PYBIND11_MODULE` マクロで、Pythonから `mywrapper.add()` として使えるように定義。

---

## ⚙️ setup.py（パッケージ化とビルド）

```python
from setuptools import setup, Extension
from pybind11.setup_helpers import build_ext
import pybind11

ext_modules = [
    Extension(
        "mywrapper",
        ["bindings/bindings.cpp", "cpp/example.cpp"],  # ソースファイル
        include_dirs=[pybind11.get_include()],         # pybind11ヘッダを含める
        language="c++",
        extra_compile_args=["-std=c++11"],             # C++11指定（必須）
    ),
]

setup(
    name="mywrapper",
    version="0.1",
    ext_modules=ext_modules,
    cmdclass={"build_ext": build_ext},
    zip_safe=False,
)
```

👉 `-std=c++11` を入れないと、`constexpr`などのC++11構文でビルドエラーになります。

---

## 📦 インストール手順

```bash
pip install pybind11
pip install .
```

---

## 🧪 実行例（Python）

```python
import mywrapper
print(mywrapper.add(5, 3))  # 出力: 8
```

---

## 🛠 実際に発生したエラーと対処法

| エラー | 原因と対処 |
|-------|------------|
| `ModuleNotFoundError: No module named 'pybind11'` | `pybind11` が未インストール → `pip install pybind11` |
| `unknown type name 'constexpr'` など多数 | C++11以降の機能を使っているのに `-std=c++11` を指定していなかった → `extra_compile_args` に追加 |

---

## 🎉 感想

- PythonとC++を組み合わせることで、速度と利便性の両立が可能に
- pybind11の導入も意外と簡単で、構造を理解すればすぐ使える
- サクサク進んで楽しかった！

---
【第2回】GPTを“感情推定エンジン”として活用する試み – 対話AIの感情を生成するプロンプト設計

GPTを使って、「感情を持っているかのように振る舞うAI」を開発しています。

「AIって感情ないけど、もしあったらどうなるんだろう？」  
そんな素朴な疑問から始まり、**擬似的な感情・記憶・忘却**をデータ構造として再現することで、**“人格のようなもの”を持つAI**を目指すプロジェクトです。

本シリーズでは、GPT-4oを「感情推測エンジン」としてどのように活用しているかを中心に、感情の生成・記録・活用、そしてAIの振る舞いへの影響までを順を追って解説していきます。


## 概要 (TL;DR)

- GPT-4oを「感情推測エンジン」として活用
- ユーザー入力を基に、AIの応答時の感情状態を構造化して定義
- 感情は Plutchik理論 の32種類（基本8感情＋応用24感情）を基盤として構築
- 最大4感情の構成比（合計100%）で個性と表現の多様性を確保
- プロンプトによる構成比出力と、それを活かした応答設計の方法を解説


## 背景

現在の対話AIは、「今この瞬間」の入力に反応するのみで、その背景にある感情や個性の蓄積がありません。  
私はこれを打破し、「人格」や「気分の揺らぎ」を持ったAIをつくる試みを進めています。

その第一歩が、「応答に先立つ感情の構成比」を定義することです。  
GPT-4oの出力を通じて、AIがどのような感情状態で発言しているのかを可視化・操作する仕組みを構築しました。


## Plutchik理論と32感情

本プロジェクトでは、感情の分類体系として Plutchik理論 を採用しています。  

### 基本8感情：
喜び・悲しみ・怒り・恐れ・驚き・期待・信頼・嫌悪  

### 応用感情（一部）：
愛情・楽観・後悔・屈辱・勇気・嫉妬・希望・服従 など

合計32感情を扱い、AIの「気持ち」をより繊細に構成しています。


## プロンプト例と出力フォーマット

GPTに与えるプロンプトは以下のように設計されています：


- あなたは「感情を持つAI」として発言を行う。
- この発言の前提となった感情を、Plutchikの基本8感情＋応用24感情から選び、
最大4つの構成比（合計100%）で表して、JSON形式で返してください。

出力例：

```text
{
  "主感情": "希望",
  "構成比": {
    "希望": 40,
    "信頼": 30,
    "喜び": 20,
    "好奇心": 10
  },
  "心理反応": "不安もあるが期待の方が大きい"
}
```
この出力結果は、後続処理で emotion.json  に反映され、記憶の保存や応答生成に活用されます。

## なぜPlutchik理論？
現状では、出力された感情を分類・管理する手段として Plutchik 理論を採用しています。
基本8感情と応用24感情による32感情体系は、強さ・関係性・派生構造が明確であり、感情の分類・保存・検索に都合がよいため、初期段階の設計として適しています。
なお、これは**「感情の意味理解」ではなく「管理・構造化のためのラベル」**として使っており、今後の検証で他の体系に差し替える可能性もあります。

## なぜ最大4感情？
1〜2感情では表現が曖昧になり、感情の多様性を損なう

5感情以上では「構成比の特徴」が薄れ、検索性や記憶への紐付けが難しくなる

このため、**最大4感情・合計100%**という制限を現時点で暫定採用しています。
この構成が最適かどうかは、今後の検証によって見極めていく予定です。

## 信頼性とエラー対策
出力される感情構成が100%未満・超過する、あるいは感情名が不正といったエラーは、system_promptでの固定制御により現在のところ発生していません。

毎回の発話処理において、以下を厳密に指示しています：

感情数は最大4つ

合計は必ず100%

使用可能な感情名リストを明示

## 未検証事項と今後の展望
現在のところ、出力された感情構成比が、どのように応答文に影響を与えるかの検証は進行中です。

例えば：

同じ入力でも、「怒り主体」の構成では語調が鋭くなるのか？

「悲しみ＋期待」の構成では、どんな応答が生まれるのか？

これらを今後データとして記録・比較していきます。

## 次回予告
次回は、構成された感情比が以下にどう影響しているかを詳しく解説します：

応答の語調や語彙選択

感情記憶の保存階層（short / intermediate / long）

忘却処理のトリガー条件

## ご意見・コラボ募集中！
ここまで読んでいただき、ありがとうございます。

感情設計に関心のある研究者・エンジニアの方

擬似人格・記憶・対話構造に興味のある方

検証実験に参加したいだけの方も大歓迎！

コメントやDMなどで、ぜひ気軽にご連絡ください。
とりあえずMCPサーバーを実行してみるところまでやってみる【VSCode & GitHub Copilot】

# やりたいこと
MCPサーバーの細かい仕組みもよくわかってないけど、とりあえず自分の環境でMCPサーバーを使ってみたい。
とりあえずの入門をする。
今回は「mcp_server_time」という、時刻を取得できるMCPサーバーを使ってみる。

# そもそもMCPって何
typeCです！という説明はよく見かけるけど、あんまりイメージつかなくてモヤモヤしてた。
MCPを使うと、外部のAPIの「実行」も生成AIがやってくれて、外部APIのリアルタイムな情報や処理結果を取得できる。
という先輩の説明で、やっと腑に落ちた

# 手順
### 事前のインストール
- 3.10以降のPythonをインストールする

https://github.com/modelcontextprotocol/servers/blob/0a2dbd3ef25c3c6106c5b292e20e7c06d59c272c/src/time/pyproject.toml#L6

- pipを使う場合
`mcp-server-time`をインストールしておく。uvだとインストール不要らしい。いつかやってみよう

```bash
pip install mcp-server-time
```

- VSCode拡張機能「GitHub Copilot Chat」を入れておく


###  VSCodeでの設定

`.vscode/mcp.json`というファイルを作成する。中身は以下。
（どうやら`setting.json`でも大丈夫らしい。）

```json
{
  "servers": {
    "mcp-server-time": {
      "command": "python",
      "args": [
          "-m",
          "mcp_server_time",
          "--local-timezone=Asia/Tokyo"
      ],
      "env": {}
    }
  }
}
```

### いざ起動

ファイル上に表示される「▶︎起動」を押す。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320845/3e4af708-dcd9-40e3-a812-697c7284f517.png)



もしくはコマンドパレットで「list servers」から起動するMCPサーバーを選ぶ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320845/ea0e82b7-ee72-4bea-9b7d-834a6c2f34c5.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320845/e486a8d3-2068-478d-a907-e224af3b5b48.png)

起動されたら「実行中」と表示される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320845/d0073d0e-1df0-45e4-8f47-0dd1a8a7155e.png)


### MCPサーバーを使ったおしゃべりをする

Copilot Chatを「Agentモード」にする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320845/2c038aa3-bbbf-4edf-92a4-755ef62c625e.png)


現在時刻を聞くような質問をしてみる。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320845/a69d1cd7-61b4-4a7b-8db3-99c5ceacc545.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320845/b5ef5909-0d9e-41fd-bbd6-349de6a52d9f.png)

ちゃんと時間を返してくれた🎉
QGISのポリゴンの融合 (Dissolve) でゴミを残さない簡便な方法

動作確認: QGIS 3.42.3

# 課題

レイヤ内の複数のポリゴンを一つにまとめる、という操作をすることがあります。

例えば、[国土数値情報の行政区域データ](https://nlftp.mlit.go.jp/ksj/gml/datalist/KsjTmplt-N03-2024.html) から東京都全体のポリゴンを作りたいとします。

![スクリーンショット 2025-06-23 211208.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/514198/48dd9f1e-e670-4687-9acd-e62403f88cf8.png)

行政区域データは市区町村ごとにポリゴンが分かれているため、東京都全体を１つのポリゴンにまとめるには、ポリゴンを融合する操作が必要になります。

「ベクタ→ジオプロセシングツール→融合 (dissolve)」でポリゴンを１つにまとめることができます。

![スクリーンショット 2025-06-23 211408.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/514198/e6c204e5-df94-4602-a324-8d7ca1224b79.png)

しかしこの方法では、まれに意図しないポリゴン境界（ゴミ）が発生することがあります。下図は「ポリゴンの融合」で東京都の市区町村ポリゴンをまとめた結果ですが、隅田川に沿って細長くポリゴン境界が発生してしまっています。

![スクリーンショット 2025-06-23 211806.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/514198/2391255e-1979-4b94-858d-eaa98b26c931.png)

この課題への対応法として、[こちらのブログ](https://odgu.net/tips-02-polygon-dissolve-garbage/)で紹介されているように手作業でゴミを除くことも可能です。しかし、気軽に可視化を試したいといった局面では手作業を挟むのは面倒です。そこで本記事ではより簡便な方法を紹介します。

## 解決法: バッファを用いる

「ベクタ→ジオプロセシングツール→**バッファ (buffer)**」を開きます。

![スクリーンショット 2025-06-23 213205.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/514198/e46829f3-2081-4605-ad18-944d49c56ea9.png)

バッファの距離を十分小さい値 (0.00001 degree など) にし、「結果を融合する」を選択して実行します。

![スクリーンショット 2025-06-23 213747.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/514198/2d34f819-2b90-4920-a71f-d0ecbb198de1.png)

実行すると、先ほどと違ってゴミのないポリゴンを得ることが出来ました。

![スクリーンショット 2025-06-23 213926.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/514198/fe45a475-318e-4b00-a114-67c65932b7cd.png)
glassfishでMySQLを使う

glassfishでMySQLをJDBCコネクションプールに登録する際に発生したエラーについて。
# データソースのクラス名を変更する
glassfishのコネクションプール作成画面でMySQLを選択すると、設定画面でデフォルト表示されるMySQLドライバのクラス名が`com.mysql.jdbc.jdbc2`で始まる旧タイプのクラス名となっており、以下のような例外が発生します。
```
java.lang.ClassNotFoundException: com.mysql.jdbc.jdbc2.optional.MysqlDataSource
```
この問題は現行のドライバに対応した`com.mysql.cj`で始まるクラス名を使用することで解消されます。
例えば、リソースタイプとして`javax.sql.DataSource`を使用する場合には`com.mysql.cj.jdbc.MysqlDataSource`を指定してください。
# データベースのURLを変更する
リソースタイプとして`javax.sql.DataSource`を使用する場合、ホスト名、データベース名、ユーザ名、パスワードを設定すれば接続できることになっていますが、以下のような例外が発生する場合があります。
```
jakarta.resource.spi.ResourceAllocationException: Connection could not be allocated because: Cannot open file:C:\denv\glassfish7\glassfish\domains\domain1/config/keystore.jks [Keystore was tampered with, or password was incorrect]
```
これはMySQLがSSL接続に対応していないことが原因のようで、Additional PropertiesタブでURLプロパティを追加し、`jdbc:mysql://localhost:3306/[データベース名]?useSSL=false`と記述することで回避できます。
多項式と定積分


---

## 1. 観測データとフィッティング関数の定義

観測データ（データ点）：

$$
\{(t_i, y_i)\}_{i=1}^N
$$

ここで、

* $t_i$：時刻（横軸）
* $y_i$：対応する値（縦軸）

---

## 2. 多項式によるフィッティング

次数 $d$ の多項式で近似：

$$
f(t) = \sum_{k=0}^d a_k t^k
$$

このとき、係数ベクトル $\mathbf{a} = (a_0, a_1, \ldots, a_d)$ を最小二乗法で推定。

### 行列形式（正規方程式）

$$
\mathbf{y} = \mathbf{V} \cdot \mathbf{a}
$$

ここで、Vandermonde行列 $\mathbf{V} \in \mathbb{R}^{N \times (d+1)}$：

$$
\mathbf{V} =
\begin{bmatrix}
1 & t_1 & t_1^2 & \cdots & t_1^d \\
1 & t_2 & t_2^2 & \cdots & t_2^d \\
\vdots & \vdots & \vdots & \ddots & \vdots \\
1 & t_N & t_N^2 & \cdots & t_N^d
\end{bmatrix}
$$

最小二乗解：

$$
\mathbf{a} = (\mathbf{V}^T \mathbf{V})^{-1} \mathbf{V}^T \mathbf{y}
$$

---

## 3. フィット関数の定積分

区間 $[a, b]$ における定積分：

$$
\int_a^b f(t) \, dt = \int_a^b \left( \sum_{k=0}^d a_k t^k \right) dt = \sum_{k=0}^d a_k \cdot \frac{b^{k+1} - a^{k+1}}{k+1}
$$

---

## 4. Markdown (LaTeX) 表記

```latex
\[
f(t) = \sum_{k=0}^{d} a_k t^k
\]

\[
\int_a^b f(t) \, dt = \sum_{k=0}^{d} a_k \cdot \frac{b^{k+1} - a^{k+1}}{k+1}
\]
```

---

## 5. WolframAlpha 形式

```wolfram
Integrate[Sum[a_k * t^k, {k, 0, d}], {t, a, b}]
```

具体的に 2次関数 $f(t) = a_0 + a_1 t + a_2 t^2$ なら：

```
Integrate[a0 + a1*t + a2*t^2, {t, a, b}]
```

---
エンジニアを目指したきっかけ

# はじめに

この記事では、17年間福祉の現場で働いてきた私が、なぜエンジニアを目指すようになったのか。その背景や想いについて綴ります。

「プログラミングって難しそう…」  
「自分には無理かもしれない…」

そんな不安を抱えていた私が、なぜ挑戦しようと思えたのか。  
少しでも同じように迷っている方の背中を押せたら嬉しいです。

---
# 福祉の現場で過ごした17年間

私はこれまで、さまざまな福祉の現場で子どもたちや保護者と関わってきました。

支援内容も年齢や特性に応じてさまざまで、保育・療育・遊び・学び・生活支援…と、

日々の関わりの中で「その子にとって必要な支援とは何か？」を考え続けてきました。


---
# 「もっと、便利にできるはず」という気づき

今までの働いてきた現場でこんな声を耳にしました。

> 「この記録、毎回同じところ書くのが面倒…」  
> 「もっと使いやすい書式があればいいのに」

そこでExcelで自動計算付きの書式を自作し、業務効率化を図りました。  
ITに不慣れな職員でも迷わず使えるよう工夫した結果、現場の負担軽減に貢献できました。
管理職からも、いろいろな書類の雛形作りは、任されるようになりました。

ただ、同時にこうも思ったのです。

> 「もっと柔軟に、もっと便利にできる方法があるんじゃないか？」

この時芽生えたのが、**「仕組み自体を作れるようになりたい」という想い**でした。

---
# プログラミングとの出会い

そこから私は、プログラミングに興味を持ち、テックキャンプ短期集中オンラインに入りました。そのカリキュラムの中でRubyやRuby on Railsと出会いました。

最初はまったくわからず苦戦の連続でしたが、それでも続けられたのは、「誰かの困りごとをコードで解決できる」という点に、心からワクワクしたからです。

「もっとこうだったらいいのに」  
「ここがわかりづらいな」  

相手の立場に立って、その人の困り感を、その人用のオーダーメイドにカスタマイズして、解消してあげることが **支援** の本質にあります。

福祉の現場で日々感じていた、**使う人目線** を、今度は **ものづくり** に活かしていける。  
それが、エンジニアという職業の大きな魅力でした。

---
# エンジニアとして目指したい姿

私は、、、

- 使う人にとって本当に使いやすい仕組み
- サービス提供者がスムーズに仕事できる環境

を裏側から支えられる存在になりたいと思っています。

福祉の現場で培った  
「相手の立場で考える力」  
「わかりやすさを工夫する力」  

これらを強みに、**ユーザーの願いを叶えるプロダクト** を作っていきたい。  
それが、私がエンジニアを目指す理由です。

---

# おわりに

この記事が、異業種からのキャリアチェンジを考えている方や、プログラミングを学び始めたばかりの方にとって、少しでも励みになれば嬉しいです。

これからも、学んだことや詰まったことをQiitaで共有していく予定です。  
同じように挑戦するみなさんと、一緒に成長していけたらと思っています。

最後まで読んでいただき、ありがとうございました。
ggplotのグラフを一度に保存するメモ

## さいしょに
ggplotをまとめてグラフを保存しようとして四苦八苦しました。
下のページを参考にさせてもらいましたが、コードが上手く動かなかったのと、@flatsilverさんの最終投稿が2020年だったので、新しく記事を上げさせてもらいます。

https://qiita.com/flatsilver/items/927ab7e04c7f5f70d541

## 違う点

ggplotオブジェクトに対してggsaveがプラスでつながっていたのですが、これでは保存できません。(正確には1枚目は保存出来て、２枚目以降が保存できません。)

これを、`iwalk()`で`ggsave()`を動かして、`plot =`の引数のところで`ggplot()`でggplotオブジェクトを作る、という形をとっています。

```r
mtcars %>%
  split(.$cyl) %>%
  iwalk(~ ggsave(
    file = paste0("cyl-", .y, ".png"),
    plot =  ggplot(.x, aes(disp, mpg)) +
            geom_point() +
            ggtitle(paste0("cyl-", .y))
  ))
```
.xは各要素のdata.frameを、.yはそのインデックスを指定できるようです。慣れてくるとすごく扱いやすそうですね。
AWS Clooud Practioer合格体験記

# はじめに
[前回](https://qiita.com/dghnts/items/07f8c49f007441e09f65)の記事に引き続き，資格を取ったので資格勉強に関する話です。

同じ資格の取得を考えっている方の参考になれば幸いです。

# 学習時間
平日に1~2時間と休日に5時間ほどの勉強を10日ほど（途中Java Silverに目標を変更したので曖昧です）しました。

# 使用教材
概ね記載した順番に学習を進めました。2~4は1周した後に何度かランダムで取り組んでいます。
1.[AWS Cloud Practitioner Essentials (日本語)](https://skillbuilder.aws/learn/94T2BEN85A/aws-cloud-practitioner-essentials-/J3USM8JWUK)
2.[AWS認定資格試験テキスト　AWS認定 クラウドプラクティショナー　改訂第3版 (ＡＷＳ認定資格試験テキスト)](https://www.amazon.co.jp/dp/4815625387?ref=ppx_yo2ov_dt_b_fed_asin_title)
3.[ping-t](https://mondai.ping-t.com/g)
4.[【CLF-C02対応】AWS認定 クラウドプラクティショナー模擬試験問題集(390問)](https://www.amazon.co.jp/gp/product/B0CL95RLFV/ref=ppx_yo_dt_b_d_asin_title_351_o00?ie=UTF8&psc=1)

私は1.の動画で簡単にイメージを持った後に2.のテキストをざっと1周しつつ、3.4で問題演習を徹底的に行いました。特に3.の解答は割と詳しく書かれている部分が多く知識を保管するのに最適だと思います。また、3.にプラスして4.の問題集を利用することで更に知識を深めることができました。

# 試験本場
試験直前にも3.のテキストで模擬試験を行い、9割近く取れていたので大丈夫だろうと思っていたのですが、やはり試験本番では質問の形式が違っていたり、自分の回答に自信が持てない部分もあって合格できるか不安でいっぱいでした。
試験の最後の画面で「合格」と表示されたのですが、スコアレポートが渡されずメールもすぐには来なかったので、試験終了直後は受かった心地がしませんでした。
当日の夜にメールでバッジが届き、スコアレポートも届いていたのでそこでようやく合格だったんだなと実感が持てました。
結果は8割ほどで、合格点(700点）ぎりぎりではなかったので良かったです。

# 最後に
なんとか合格することができましたが、勉強している中でインフラやITの基本に関する知識があればもう少し学習が簡単だったかもしれないなと思いました。AWSのサービスに関する試験なので、ITやインフラに関する基礎的な用語がたくさん登場します。勉強する中で吸収していけば良いという考え方もありますが、学習効率が良いとはあまり言えないと思うので事前に基礎知識として入れておくほうがいいと思いました。
私はそういった知識が圧倒的に不足していると感じたので、今後そういった知識を増やしていこと思いました。基本情報とかそういう知識を確実に抑えられそうだなと思うんですけど、どうなんでしょうか？
知ってる人いたら教えて下さい～
AndroidアプリからAmazonなどのリンクが開けなかった際に行った対処

# 概要

作成したAndroidアプリでリンクから外部ブラウザを開くという処理を行う際に、AmazonやXのリンクが開けないという問題があったので、その際に行った対処法です。

# 問題の原因

外部ブラウザを開けるかどうかという基準だけで判定していたため、AmazonやXのネイティブアプリが同端末でインストールされていた場合にエラーを出すような作りになってしまっていました。

# 実装

以下のように実装しました。
下記のようにすることで、AmazonやXなどのアプリがインストールされていればそれを開き、インストールされていなければデフォルト設定されているブラウザを開きます。
また基本考えにくいですが、Chromeなどが無効になっていれば有効なブラウザがないとしてエラー処理を行います。

```kotlin
fun Activity.openBrowser(url: String) {
    // 有効なリンクかどうか判定
    val isValidUrl = Patterns.WEB_URL.matcher(url).matches()
    if (!isValidUrl) {
        // エラー処理
        return
    }

    val target = Intent(Intent.ACTION_VIEW, url.toUri())
    val activities = packageManager.queryIntentActivities(target, PackageManager.MATCH_ALL)

    when {
        activities.isEmpty() || activities.none { it.activityInfo.enabled } -> {
            // 有効なブラウザがない時の処理
        }

        else -> startActivity(target)
    }
}
```

`queryIntentActivities`は、対象を処理できるすべてのアクティビティを返します。ここでは、ネイティブアプリまたはブラウザというところになるでしょうか。
対して`resolveActivity`を使う場合は、それを処理する最善のものを判断して返してくれます。
基本的にはどちらでも大丈夫です。

https://stackoverflow.com/questions/52734920/what-is-the-difference-between-queryintentactivities-and-resolveactivity-whi

気をつけたいのは、引数に`PackageManager.MATCH_ALL`を取っている点です。
`PackageManager.MATCH_DEFAULT_ONLY`を使う場面も多いとは思うのですが、こちらは「常にこのアプリで開く」としているものが対象となります。そのため、基本的に`resolveActivity`の方と一緒に使われます。
今回の場合には`queryIntentActivities`と合わせて`MATCH_ALL`の方にしておかないとネイティブアプリを認識してくれないのか、上記の「有効なブラウザがない時の処理」に入ってしまいます。

もうちょっと良い実装方法があるかもしれませんが、今回はこちらで表題の問題を解決できました。
以上です。
CRM Analyticsの小ネタ～ダッシュボード編集時の注意事項

本橋孝昭です

SalesforceのCRM Analyticsでダッシュボードを編集する際、特定の設定場所では設定が制限されるようなのでこちらで小ネタとして残しておきます


## 通常のダッシュボード編集画面

通常のダッシュボードタブから編集をすると

編集をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/b64206fb-64df-9848-aa2d-f483da376f02.png)


検索条件をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/4580f7d3-e9aa-eb90-9e1c-e55290b09205.png)


こちらの設定だと「次の値の間」を設定可能です

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/d50df508-cd16-b5eb-04b8-0c321c6f9488.png)


次にCRM Analyticsについてみていきます

分析からダッシュボードを検索

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/5888c161-ab4d-7d47-c3a3-c42a6de31e91.png)


編集をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/3f96e4a7-8f41-fc52-a9c7-c3425f54ab24.png)

検索条件をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/ca3aeaca-6e4d-abb8-40d0-d9616e422db4.png)


こちらの設定の場合、「次の値の間」を設定することができません。ご注意ください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/df363320-c1a5-d13f-7edc-8dc58b90d4c1.png)
Adobeアプリのカラー設定をメニューバーに表示する、Macネイティブアプリ

![SS_-2025-06-23-20.59.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35477/41784210-22cf-41b6-8d97-a70654b27f2f.png)

このPythonアプリを、Xcodeで書き直し、ユニバーサルバイナリのアプリにしました。

https://qiita.com/yamo74/items/18f01dbb8db22ba3cfb5

99%GPTコードです。
ダウンロードはこちら。Ventura以降のAppleSiliconとIntelに対応しています。

https://d.pr/f/N9gfKK

:::note
毎度のことながら、アプリを使用してシステムが壊れた、何かが飛んだ、等の不具合があっても鰯屋として保証は一切できません。自己責任でご利用ください。
自己責任でご利用ください（再
:::

:::note alert
Photoshop 2025の6月リリース版、バージョン26.8には、カラー設定を同期用ファイルに書き込まないというバグがあります。このため、このバージョンで設定してもアプリ内には表示されません。
このバグにより、カラー設定が他のアプリの設定に勝手に書き換わってしまうため、今のところはPhotoshopは26.7にとどめたほうが賢明です。
:::
GUI版Linuxをテレビの解像度にピッタリ合わせてみた

GUI版Linuxノートパソコンの解像度と、ジモティーで買ったAQUOSテレビの解像度があってない。HDMIでテレビに投影すると、映像が見切れたり、黒い部分が出たりでうまく映らない。Linuxの設定に解像度を追加してみた。

# テレビの解像度を知る
機番はだいたい裏にかいてありますよね。
LC-32E8という機番でGoogle検索。公式HPを見たところ、画素数は1366×768とある。

![Screenshot From 2025-06-23 20-20-24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3895876/1f73183a-0bfd-4ff7-85d7-24ecd729e8a2.png)


# ディスプレイ設定に新たな解像度を追加
```:コマンド①
xrandr
```
とりあえず上記コマンドで設定がないことを確認しましょう。
```:コマンド①結果
   1920x1080     60.00*+  59.97    59.96    59.93    40.01  
   1680x1050     59.95    59.88  
   1400x1050     59.98  
   1600x900      59.99    59.94    59.95    59.82  
   1280x1024     60.02  
   1400x900      59.96    59.88  
   1280x960      60.00  
   1440x810      60.00    59.97   
   1280x800      59.99    59.97    59.81    59.91  
   1280x720      60.00    59.99    59.86    59.74  
   1024x768      60.04    60.00  
   960x720       60.00  
   928x696       60.05  
   896x672       60.01  
   1024x576      59.95    59.96    59.90    59.82  
   960x600       59.93    60.00  
   960x540       59.96    59.99    59.63    59.82  
   800x600       60.00    60.32    56.25  
   840x525       60.01    59.88  
   864x486       59.92    59.57  
   700x525       59.98  
   800x450       59.95    59.82  
   640x512       60.02  
   700x450       59.96    59.88  
   640x480       60.00    59.94  
   720x405       59.51    58.99  
   684x384       59.88    59.85  
   640x400       59.88    59.98  
   640x360       59.86    59.83    59.84    59.32  
   512x384       60.00  
   512x288       60.00    59.92  
   480x270       59.63    59.82  
   400x300       60.32    56.34  
   432x243       59.92    59.57  
   320x240       60.05  
   360x202       59.51    59.13  
   320x180       59.84    59.32  

```
なさそうです。

```:コマンド②
xrandr --newmode "1366x768-0" 75.61  1366 1406 1438 1574  768 771 777 800 -hsync -vsync
```
[Steps to add a new resolution 1366x768](https://askubuntu.com/questions/1028868/steps-to-add-a-new-resolution-1366x768-60-troubleshooting)
コマンド②を実施。細かい後ろのパラメータは最大解像度等らしく。
Linux Mate用の解像度のようです。


```:コマンド③
xrandr --addmode HDMI-1 "1366x768-0"   
xrandr --output HDMI-1 --mode "1360x768" 
```
コマンド③を実施。
なぜか最後のコマンドは解像度1366でなく1360なんですね。

![Screenshot From 2025-06-23 20-48-15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3895876/b0de9de0-70fc-40eb-a6ef-63df8485825d.png)

できました！