OmniAICreator/Qiita-1.07M huggingface dataset:
【GitHub】デフォルトブランチの設定

## はじめに
リポジトリの初期表示ブランチやプルリク作成時のベースブランチの設定がきます。  
開発フローに応じて `main` や `develop` を使い分けたい場合に便利です。


これにより
・プルリク作成時に毎回ベースブランチを変更する手間を省ける。
・リポジトリの初期表示も統一できるため共同開発時の認識ズレを防げる。

## 手順

### 1. リポジトリ設定ページの表示

- GitHubで対象リポジトリを開く  
- 上部メニューから `Settings` をクリック  
- 左メニューの `General` を選択

### 2. デフォルトブランチの変更

- `Default branch`までスクロール  
- プルダウンからブランチ（例：`develop`）を選択  
- `Update` ボタンをクリック  
![スクリーンショット 2025-06-05 232311.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3820411/140e0c28-7937-4069-a0c2-52b9e0917dee.png)


## 補足

- [公式ドキュメント：デフォルトブランチを変更する](https://docs.github.com/ja/repositories/configuring-branches-and-merges-in-your-repository/managing-branches-in-your-repository/changing-the-default-branch)
ブランチ名に脳死で「/」使ってたらコけた。実は「/」には意味があった話

こんちくわ。

皆さんは`Git`ってどれぐらい理解してますか？？
私はずっと生粋の何となくスタイルなので、10分の1も理解してないです。コミット出来てプッシュできればそれでいいと思ってますし、後輩に教える時もそんな感じなので信頼が失墜しています。

<br>

私はここ1年、下記みたいなブランチ名を疑いもせず量産していました：

```bash
issueHoge/fuga
feature/login
bugfix/header
```

スラッシュって“モダン感”あるじゃないですか。知らんけど。
<br>

今まで実務ではケバブやスネークケース(`update-icons`や`feature_hoge`)で命名してました。

しかしネットサーフィン中にスラッシュ区切りのブランチ命名をしてるサイトを見て「なにこれカッコいい☆彡」なんてふざけた印象を持ち、プライベートではもっぱらこの命名で脳死開発してました。

でも先日「issue94/2（issue94 の 2 周目ブランチっていう安直ネーミング）」を push したらコケました：

```text
error: failed to push some refs to 'github.com:your-repo.git'
! [remote rejected] issue94/2 -> issue94/2 (cannot lock ref 'refs/heads/issue94/2': 'refs/heads/issue94' exists; cannot create 'refs/heads/issue94/2')
```

---

### えっ、"cannot lock ref" とは？

> 私の脳内：「は？？？？？」

英語をちゃんと読めばある程度察せるのですが
雑に言うと **「ファイルとして存在するのにフォルダも作ろうとしたら怒られた」** です。

> Git「もうissue94がいるのに同名のフォルダ作れねえよ炙るぞてめえ」
>
>私「す、すいやせん...」

Git はブランチ情報を `.git/refs/heads/` 以下に**パス階層**として保存します。

  ````
  feature/login  → .git/refs/heads/feature/login
  bugfix/header  → .git/refs/heads/bugfix/header
  ``` :contentReference[oaicite:0]{index=0}  
  ````
なので、 **`issue94`** というブランチ（＝ファイル）がある状態で
**`issue94/2`**（＝ディレクトリ＋ファイル）を作ろうとすると
**ファイル**として存在するブランチ名を**ディレクトリ**として扱おうとしてしまい
「ファイルとフォルダがバッティングして無理！」と Git がキレるわけです。

<br>

...てか、階層の概念は`/`区切りの時点で察するべきでした。てへ。

https://docs.github.com/ja/get-started/using-git/dealing-with-special-characters-in-branch-and-tag-names

<br>

試しに`feature/OO`をいくつか量産してみます。

````bash
$ git branch
  develop
* feature/aa
  feature/bb
  feature/oo
````
そして.gitをlsで覗いてみると、
````bash
$ ls .git/refs/heads/
develop  feature/ 

$ ls .git/refs/heads/feature/
aa  bb  oo
````
一応エクスプローラ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782955/3c7c677a-bd0c-4e6b-ab2a-672fef401d6e.png)

こんな感じで確かにブランチが`/`区切りで階層化されてますね。

---


### 学びと対処法

1. **“親子”関係がかぶると作れない**

   * 例：`issue94` がいると `issue94/2` は NG。
2. **どうしても `issue94/2` が欲しい場合**

   * `issue94` を消す or リネーム (`issue94-old`)

     ```bash
     git branch -m issue94 issue94-old   # ローカル
     git push origin --delete issue94    # リモート
     ```
   * もしくはハイフン形式に変更 (`issue94-2`)
3. **そもそも最初から“親”をフォルダ化前提で作る**

   * `issue/94` のように **カテゴリ先頭** を置くと、下にいくらでもぶら下げられる。

---

### おまけ：おすすめ命名テンプレ

| 用途     | 例                          |
| ------ | -------------------------- |
| 機能追加   | `feature/user-login`       |
| バグ修正   | `bugfix/email-sending`     |
| 緊急パッチ  | `hotfix/critical-prod-bug` |
| ドキュメント | `docs/readme-typo`         |
| タスク番号  | `task/issue-xx`            |
| issue  | `issue/xx`            |


## まとめ

> **スラッシュはただのカッコ良さじゃなく内部構造に直結していた**

これからは **“なんとなくスラッシュ族”** から **“構造理解派スラッシュ使い”** へクラスチェンジします。
そして怒られたら **まずエラーメッセージ読む** コレに尽きます。

<br>

なんとなくでGithubを使ってるので、今後もこういうボロは出続けるのでしょうね。
まあここらへんでも読み返したら少しは錆が抜けるでしょうか。

https://git-scm.com/docs/user-manual


おわり。あーねむ
💡 Tailwind CSSのclassNameが長すぎ問題、`.join()`で可読性アップ！

# はじめに

Tailwind CSSを使っていると、`className`がどんどん長くなって読みにくくなってしまうこと、ありませんか？

```jsx
<button className="px-4 py-2 rounded-md border border-gray-300 bg-white text-black shadow-sm font-medium hover:cursor-pointer disabled:opacity-50">
  Next
</button>
```

このように、**基本スタイル・色・状態ごとのクラス**が一列に並ぶと、

* 何がどの用途のスタイルなのか？
* 状態（hover/disabled）に関する記述はどこ？

といった情報が一目で分かりづらくなります。

# 解決策： `.join(" ")`でclassNameを整理する

配列の `.join(" ")` を使えば、**論理的な意味ごとにクラスを分けて読みやすく整理**できます。

**✨ 書き直し例**

```tsx
<button
  className={[
    // 基本の見た目（レイアウト・タイポグラフィ）
    "px-6 py-2 rounded-md border shadow-sm font-medium",
    // 色（背景・枠線・文字）
    "border-gray-300 bg-white text-black",
    // 状態（hover時）
    "hover:bg-gray-100 hover:cursor-pointer",
    // 状態（無効時）
    "disabled:opacity-50 disabled:cursor-not-allowed",
  ].join(" ")}
>
  Next
</button>
```

**👀 こうすることで得られるメリット**

* 構造が視覚的に把握しやすくなる
* 差分の管理がしやすくなる（デザインの微調整や差し替えが楽）
* 状態ごとのスタイルが明確に分離される
* Tailwindの「ユーティリティファースト」の思想にもフィット

# 実例：CTAボタンコンポーネント

たとえば、CTA（Call To Action）ボタンを作る場合、下記のように構成ごとにスタイルを分割するとチームでも読みやすくなります。

```tsx:CTAButton.jsx
interface CTAButtonProps {
  disabled?: boolean;
  children: React.ReactNode;
}

export const CTAButton = ({ disabled, children }: CTAButtonProps) => {
  return (
    <button
      disabled={disabled}
      className={[
        // Layout & Font
        "inline-flex items-center justify-center px-5 py-2 rounded-lg font-semibold",
        // Colors
        "bg-blue-600 text-white",
        // Hover State
        "hover:bg-blue-700",
        // Disabled State
        "disabled:bg-blue-300 disabled:cursor-not-allowed disabled:opacity-60",
        // Transition
        "transition-colors duration-200",
      ].join(" ")}
    >
      {children}
    </button>
  );
};
```

これなら、**クラスの意味が一目でわかる**上、追加・削除・条件分岐も容易です。

# 補足：classnamesやclsxを使ってもOK

より柔軟に条件分岐したいときは `classnames` や `clsx` の使用もおすすめです：

```bash
npm install classnames
```

```tsx
import classNames from "classnames";

const buttonClass = classNames(
  "px-4 py-2 rounded",
  {
    "bg-blue-500 text-white": !disabled,
    "bg-gray-300 text-gray-600 cursor-not-allowed": disabled,
  }
);
```

# おわりに

Tailwind CSSは非常に便利ですが、**長いclassNameを読みやすく保つ工夫**が必要です。
今回紹介した `.join(" ")` を使った書き方はシンプルかつ汎用的で、誰でもすぐに取り入れられます。

チーム開発やデザイン調整の効率も大きく変わってくるので、ぜひ日々の実装で試してみてください！
生天目佳高Tips：爆速でエンジニアになるには？

こんにちわ、生天目佳高です！
※生天目佳高とは？
https://www.atomi.ac.jp/univ/search/?s=%E7%94%9F%E5%A4%A9%E7%9B%AE%E4%BD%B3%E9%AB%98#gsc.tab=0&gsc.q=%E7%94%9F%E5%A4%A9%E7%9B%AE%E4%BD%B3%E9%AB%98&gsc.page=1

---

「最短でエンジニアになりたい」「転職までのスピードを重視したい」――
そう思っている方は少なくないはずです。未経験からエンジニアを目指す人にとって、「爆速でスキルを身につけて現場に出る」ことは大きな目標です。

では、実際にどうすればエンジニアとして最短ルートを進められるのか？今回は、無駄なく実力をつけていくための戦略を紹介します。

## 1. 目的を明確にする

「Webアプリを作りたい」「副業で稼ぎたい」「AI開発がしたい」
まずは、自分がエンジニアとして“何をやりたいのか”をはっきりさせましょう。

なぜなら、目的によって学ぶべき言語やスキルセットが全く変わってくるからです。たとえば、

* Web系：HTML/CSS + JavaScript + PHP or Ruby or Python
* アプリ開発：Flutter, Swift, Kotlin
* AI系：Python + NumPy, TensorFlow など

ゴールが明確であればあるほど、遠回りをせず最短距離で進めます。

---

## 2. 最初の3ヶ月で「作る」ことに集中

爆速で成長したいなら、座学よりも「手を動かす」ことが最重要です。基礎文法をさらっと学んだら、すぐにミニアプリやWebサイト制作に取りかかりましょう。

おすすめは以下のような実践的な課題です：

* TODOアプリ
* ブログ投稿サイト
* 天気予報APIを使った検索アプリ
* ポートフォリオ用Webサイト

アウトプットを繰り返すことで、知識が実力に変わっていきます。

---

## 3. プログラミングスクールは「目的ベース」で選ぶ

独学で挫折しそうな場合は、スクールを活用するのもアリです。
ただし、「何を学べるか」「どのレベルで卒業できるか」をしっかり見極めて選びましょう。

爆速を目指すなら、カリキュラムが実践中心かどうか、現場レベルのコードレビューがあるか、ポートフォリオ制作が含まれているかがカギになります。

---

## 4. エラーと友達になる

初心者が最も時間を奪われるのが「エラー対応」。
でも、これは“学びのチャンス”でもあります。

わからないことはChatGPTやStack Overflowで調べ、原因と解決法をノートにまとめておきましょう。エラーとの向き合い方こそ、成長スピードを左右する最大の要因です。

---

## 5. SNS・コミュニティを活用せよ

エンジニアは「孤独な作業」になりがちですが、成長のコツは人とのつながりにもあります。

* TwitterやQiitaでアウトプット
* DiscordやSlackの開発者コミュニティに参加
* 勉強会やLTイベントに登壇

こうした活動を通じて、自分のレベルを客観視したり、最新情報に触れることができます。

---

## まとめ：エンジニアへの道は、意外と近い

「エンジニアになるには数年かかる」
そんなイメージがあるかもしれませんが、戦略的に学べば、半年以内に案件を受けられるレベルに到達することも十分可能です。

大事なのは、正しい努力を、正しい順番で積み上げていくこと。
そして、何より「やってて楽しい！」と思える環境を作ること。

爆速でエンジニアになるには、情熱と工夫、そして少しの行動力があれば十分です。さあ、あなたも一歩踏み出してみませんか？
Chromeの翻訳機能を使う時にソースコードを翻訳しないまま残す

下記ブックマークレットを使うと、ソースコードを翻訳しないまま残せます。

```
javascript: document.querySelectorAll("pre").forEach(e => e.classList.add("notranslate"));
```

ブラウザで適当なタブを開いて、コンソールで下記実行すると検証用ページを作れます。

```js
document.querySelector("html").innerHTML = `
<html lang="en">
  <body>
    <p>This is awesome code.</p>
    <pre>
      const object = {
        "script": "run test"
      }
    </pre>
  </body>
</html>
`;
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50391/277cc7f0-d95d-409d-81a9-8464e860489f.png)

このページをChromeブラウザの翻訳機能で翻訳すると、ソースコードの部分まで和訳されてしまいます。コメントやメッセージ用の文字列ならば翻訳されて有用な場合もありますが、`const`というキーワードや`script`というオブジェクトのキーまで翻訳されてしまうと、文法が壊れてしまったり設定が当たらなくなりコードも読めなくなるので、翻訳されてほしくない時があるとおもいま

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50391/04adec38-0d98-4fdb-a7bf-458c1ea7e0d7.png)

Google翻訳の機能で、`notranslate`というクラスを付与すると翻訳をしなくなります。

https://developers.google.com/search/blog/2008/10/helping-you-break-language-barrier

なんと2008年に登場した歴史ある機能のようです。

冒頭のブックマークレットを実行して`<pre>`タグに`notranslate`クラスを付与することで、ソースコード部分のみを翻訳しないようにできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50391/f563b2dc-ce0e-48f0-b6f0-561253ab2f48.png)
Wordpressのfunction.phpのメモ

```
// メインクエリの実行前に投稿一覧の取得条件をカスタマイズできるフック
add_action( 'pre_get_posts', function( $query ) {
	
  // サブルーチンとしてローカル関数を用意
  $get_my_post_types = function($exclude = array()) {
    $custom = get_post_types( array('public' => true, '_builtin' => false), 'names' );
    return array_merge( array('post'), array_diff( $custom, $exclude ) );
  };

  if ( is_admin() || ! $query->is_main_query() ) return;

  // カテゴリアーカイブ
  if ( $query->is_category() ) {
    $exclude = array();
    $query->set( 'post_type', $get_my_post_types($exclude) );
  }

  // タグアーカイブ
  if ( $query->is_tag() ) {
    $exclude = array();
    $query->set( 'post_type', $get_my_post_types($exclude) );
  }

  // トップページ
  if ( is_home() ) {
	  $exclude = array();
	  $query->set( 'post_type', $get_my_post_types($exclude) );
  }
});

```
---

### ✅ 投稿一覧にカスタム投稿タイプを含めるためのフィルター

---

### 📌 コードの意味を簡単に分解すると：

```php
$get_my_post_types = function($exclude = array()) {
    $custom = get_post_types( array('public' => true, '_builtin' => false), 'names' );
    return array_merge( array('post'), array_diff( $custom, $exclude ) );
};
```

* `public` かつ `builtin` でない投稿タイプ（≒自分で作ったCPT）を取得
* `post`（通常投稿）と一緒に返す

---

### 💡 そして `is_home()` や `is_category()` のときに：

```php
$query->set( 'post_type', $get_my_post_types($exclude) );
```

* 投稿タイプの絞り込みを変更（例：`post`, `youtube`, `news` など複数）
* つまり「ホーム」や「カテゴリ」で、通常投稿だけでなく**CPTも出すようにしている**ということです

---

### 🔎 このコードは **REST API には影響しません**

なぜなら：

* `pre_get_posts` はあくまで「クエリをベースにした画面描画（HTML）」用
* REST API は `WP_REST_*_Controller` が使う `get_items()` メソッドなどでクエリ生成するため、**このフックは無視される**

---

### ✅ まとめ

このコードは **REST APIとは無関係**で、**ブラウザからの表示時のカスタマイズ**です。
いま直面している **API経由で`post_status`が「publish」以外含まれない問題**とは関係ありません。

引き続き、`rest_api_init` + `rest_post_statuses` や `rest_{post_type}_query` の組み合わせで、API挙動側をチューニングする必要があります。

---

ご希望があれば、この `pre_get_posts` を「管理画面でも有効」「REST APIにも類似ロジック適用」などに拡張するコード例もご案内できます。お気軽にどうぞ。
統計検定準1級・第11章 1 標本の平均の検定の導出

# 1 標本の平均の検定
分散 $\sigma^2$ は未知とする. 標本分散 $s^2 = \frac {1} {n-1} \sum_{i=1}^{n} (X_i - \bar{X})^2$ で $\sigma^2$ を推定する. $\frac {(n-1)s^2} {\sigma^2} = \frac {\sum_{i=1}^{n}(X_i - \bar{X})^2} {\sigma^2}$ は自由度 $n-1$ のカイニ乗分布に従う.

帰無仮説 $H_0 : \mu = \mu_0$ のもとで, 検定統計量 $T = \frac {\bar{X} - \mu_0} {s/\sqrt{n}}$ は自由度 $n-1$ の $t$ 分布に従う.

**証明**
```math
\begin{align}
\frac {\bar{X} - \mu_0} {\frac {s} {\sqrt{n}}} &= \frac {(\bar{X} - \mu)\sqrt{n}} {s} \\ 
&= \frac {\frac {(\bar{X} - \mu_0)} {\frac {1} {\sqrt{n}}}} {s} \\
&= \frac {\frac {(\bar{X} - \mu_0)} {\frac {\sigma} {\sqrt{n}}}} {\frac {s} {\sigma}} \\
&= \frac {\frac {(\bar{X} - \mu_0)} {\frac {\sigma} {\sqrt{n}}}} {\sqrt{\frac {s^2} {\sigma^2}}} \\
&= \frac {\frac {(\bar{X} - \mu_0)} {\frac {\sigma} {\sqrt{n}}}} {\sqrt{\frac {(n-1)s^2} {\sigma^2(n-1)}}} \\
\end{align}
```
$$
\frac {(\bar{X} - \mu)} {\frac {\sigma} {\sqrt{n}}} \sim N(0,1)
$$

$$
\frac {(n-1)s} {\sigma} \sim \chi^2(n-1)
$$

よってT分布の定義

$$
T = \frac {Z} {\sqrt{\frac {Y} {n}}}, Z \sim N(0,1), Y \sim \chi^2(n)
$$

から, $T = \frac {\bar{X} - \mu_0} {s/\sqrt{n}}$ は自由度 $n-1$ の $t$ 分布に従う.
(wip) slack appを作ることにした

## 概要
- 簡単にNotebookLMに連携したいので、Slack Appを作ることにした
    - 本当はワークフローで簡単にできたらいいのにね


## HelloWolrdしたい

ひとまず、下記のリンクに従う

https://tools.slack.dev/deno-slack-sdk/tutorials/welcome-bot/

### Slack CLIのインストールをする


```bash
curl -fsSL https://downloads.slack-edge.com/slack-cli/install.sh | bash
```

公式の説明ではうまくいかなかったので個別にインストールする

```bash
# 依存でこけるので、入れておく
brew install deno

curl -fsSL https://downloads.slack-edge.com/slack-cli/install.sh -o install-slack-cli.sh

sudo bash install-slack-cli.sh
```

### slackにログインする
slackにログインしてアクセス可能にする
```bash
slack login

📋 Run the following slash command in any Slack channel or DM
   This will open a modal with user permissions for you to approve
   Once approved, a challenge code will be generated in Slack

/slackauthticket ABC123defABC123defABC123defABC123defXYZ

? Enter challenge code

```

>スラッシュ コマンドをコピーして、開発を行うワークスペース内の任意の Slack 会話に貼り付けます。
>
>スラッシュコマンドを含むメッセージを送信すると、Slack CLI に特定の権限を付与するよう求めるモーダルがポップアップ表示されます。モーダル内の「確認」ボタンをクリックして次のステップに進みます。
>
>チャレンジコードが記載された新しいモーダルが表示されます。そのチャレンジコードをコピーし、ターミナルに貼り付けてください。

公式にあるように、開発用のチャンネルでコマンドを実行してやると、codeがはらわれるのでそれをCLIに貼り付けてやるだけで良い。

```
? Enter challenge code eXaMpLeCoDe

✅ You've successfully authenticated! 🎉
   Authorization data was saved to ~/.slack/credentials.json

💡 Get started by creating a new app with slack create my-app
   Explore the details of available commands with slack help
```

以下のような形で情報が取れればOK
```bash
slack auth list

myworkspace (Team ID: T123ABC456)
User ID: U123ABC456
Last updated: 2023-01-01 12:00:00 -07:00
Authorization Level: Workspace
```

### アプリを作成する
もうすでに完成しているやつがあるっぽいのでそれを利用する
```bash
slack create welcome-bot-app --template https://github.com/slack-samples/deno-welcome-bot
```

この後に実行するだけで良さそう
```bash
slack run
```

そうしたら、生成されたリンクをワークスペースに貼り付けることでワークフローが実行される。

公開自体面倒くさくなりそうなので、一旦ハローできたので公開しちゃう
【Azure】VMの割り当てに失敗する

# はじめに

Azure環境で仮想マシンを起動するために［開始］ボタンを押したところ、直後に以下のように「仮想マシンはエラー状態です」というメッセージが表示されました。
今回はこのエラーへの対応方法について記事をまとめてみました。

![azure_error_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312166/9a5fbe0b-4c10-4efe-b59c-53e98fffc71f.png)

# エラーの詳細

* エラーの詳細を表示すると、以下のように仮想マシンの割り当てに失敗したことが分かりました。

![azure_error_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312166/01b8144a-24b0-448b-bc65-f994a87c35cd.png)

* 上記の「割り当てに失敗しました」というエラーメッセージについて、[こちらのページ](https://learn.microsoft.com/ja-jp/troubleshoot/azure/virtual-machines/windows/error-messages)を見ると以下のように書かれていました。
* **「別のAzureの場所にデプロイ」** というのは、おそらく **「別のリージョンに仮想マシンを引っ越しさせる」** ということを指しているのだと思います。


```
AllocationFailed
内部エラーが発生したため、VM を割り当てることができませんでした。 後で再試行するか、別の場所にデプロイしてみてください。
```

# 対策

* 今回は急ぎの作業というわけではなかった上、別のリージョンに引っ越すには少々時間と手間がかかるので、20分ほど待ってみると以下のように仮想マシンを正常に起動できました。
  * 1時間は待たされるかと思いましたが、30分かからずにリソースを確保できるとは思いませんでした。
  * 引っ越すのが面倒だったので、比較的短時間でリソースを確保できたのは幸いでした。
* 今回のようにリソースが回復するまで待たずにリージョン間で仮想マシンを移動させる場合は、[Azure Resource Mover](https://learn.microsoft.com/ja-jp/azure/resource-mover/overview)というサービスを活用すると良さそうです。
  * [こちらの記事](https://zenn.dev/microsoft/articles/d5999f8faa6fdc)を見ると、仮想マシンだけでなくネットワーク（VNET）も併せてリージョン間で移動できるそうです。

![azure_error_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312166/7410be8c-552a-45db-ae19-90acfdbdcd4d.png)

# その他

* リソースの割り当てに失敗した仮想マシンはそこまで大きなものではない（Standard D4as v5）ですが、仮想マシンのサイズが大きいほどリソースを確保しづらくなると思うので、同種のエラーが発生しやすいと思われます。

# 参考URL

* [Azure で仮想マシンを管理するときの一般的なエラー メッセージを理解する](https://learn.microsoft.com/ja-jp/troubleshoot/azure/virtual-machines/windows/error-messages)
* [Azure Resource Mover - Microsoft Learn](https://learn.microsoft.com/ja-jp/azure/resource-mover/overview)
* [Azure Resource MoverでVMをいろいろお引越ししてみる](https://zenn.dev/microsoft/articles/d5999f8faa6fdc)
「第53回MLOps勉強会MCP Ops LT大会」で気になった部分のまとめ

動画
https://www.youtube.com/watch?v=eSUbFcZ8dsk&t=1690s

# [CrewAI](https://github.com/crewAIInc/crewAI)
- AgentごとにTaskを定義
- Taskの実行の仕方をCrewとして定義
    - Sequential
    - Hierarchical
        - Manager Agentを定義する、A2Aが簡単に実装できる

# [DeerFlow](https://github.com/bytedance/deer-flow)
- DeepResearchに特化したマルチエージェントフレームワーク
- MCP連携も機能として提供

 # MCP Clientをチャットアプリに実装した話
 ## 構成
 - ApplicationがMCP Serverとやり取りする
     - Tool一覧を取得してLLMに一緒に渡す
     - **ユーザーメッセージに特定パターンがあったときに、Promptを呼び出す**
         - /searchで専用のPromptを呼び出す

## 課題
- MCP Serverとのセッション管理
    - 最初に全部取っておく（キャッシュ）
- 複数のMCP Serverの管理
    - Tool一覧のキャッシュで半分解決
    - {Server名}__{Tool名}で管理

# Langfuseの結果(Clickhouse)をMCP経由で利用して改善レポートを作成するAIエージェント
- Agent Development Kitを利用
- 利用したMCP
    - Clickhouse MCP
        - [これ？](https://github.com/ClickHouse/mcp-clickhouse)
    - Generation HTML MCP(自作): ClaudeのArtifactみたいなもの？
- LLMOpsにおける評価の進化
    - スコアリング中心→具体的な改善アクション提示が中心
        - さらに進めば自動改善の実行まで任せられるかも？（今度はそれの監視が必要そうだが）
- まずはトレース情報を**収集することが大事**
スプレッド構文を使った「条件付き挿入」のテクニック（オブジェクト & 配列）

# はじめに

JavaScriptやTypeScriptで開発をしていると、**「ある条件を満たすときだけ、オブジェクトや配列に値を追加したい」** というケースは多々あります。

そんなときに役立つのが、**スプレッド構文（`...`）と条件演算子**を組み合わせた書き方です。

本記事では、次の2つのパターンを紹介します：

* ✅ オブジェクトへの条件付きプロパティ追加
* ✅ 配列への条件付き要素追加

# 1. オブジェクトへの条件付き追加

**基本形**

```ts
const name = "Alice"; // 空文字やnullになることもある

const userData = {
  age: 30,
  ...(name ? { name } : {}),
};

console.log(userData);
```

**結果**

* `name` が `"Alice"` のとき：

```ts
{ age: 30, name: "Alice" }
```

* `name` が `""`（空文字）のとき：

```ts
{ age: 30 }
```

**よくある使い道**

* APIリクエストパラメータの生成
* フォーム送信時に「入力された項目だけ送る」
* 検索クエリを動的に組み立てる など

**実用例（APIパラメータ）**

```ts
function buildParams(subject?: string) {
  return {
    limit: 10,
    ...(subject ? { $search: `subject:${subject}` } : {}),
  };
}
```

# 2. 配列への条件付き追加

**基本形**

```ts
const includeExtra = true;

const items = [
  "item1",
  ...(includeExtra ? ["extraItem"] : [])
];
```

**結果**

```ts
// includeExtra = true
["item1", "extraItem"]

// includeExtra = false
["item1"]
```

**よくある使い道**

* クラス名の切り替え（`className`）
* ボタンの表示条件（`["OK", "Cancel", ...(isAdmin ? ["Delete"] : [])]`）
* フィルターやタグの動的追加 など

**実用例（クラス名の切り替え）**

```ts
const isActive = true;
const classes = [
  "base-class",
  ...(isActive ? ["active"] : []),
].join(" ");
```

結果 → `"base-class active"`

# 👀 補足：読みやすさの注意点

この書き方は非常にコンパクトで**関数型っぽい記法**として人気ですが、**複雑な条件が絡む場合は可読性が下がる**ことがあります。

可読性が気になる場合は、事前に変数を用意してから展開するのも手です：

```ts
const searchQuery = subjectFilter ? { $search: `subject:${subjectFilter}` } : {};
const query = { foo: "bar", ...searchQuery };
```

下記でも全然OKです。ただ、**スプレッド構文を使えば「そのまま定数として宣言できる」**　のが便利なポイント。

```ts
const roles = ["user"];
if (isAdmin) {
  roles.push("admin");
}
```



# おわりに

スプレッド構文と条件式を組み合わせることで、**シンプルかつ柔軟なコード**を書くことができます。特に、ReactやAPIリクエストのパラメータ構築など、UIロジックにおいて非常に便利なテクニックです。

* オブジェクト → `{ ...条件 ? { key: value } : {} }`
* 配列 → `[ ...条件 ? [value] : [] ]`

ちょっとしたコードを短く・読みやすくしたいときに、ぜひ使ってみてください！
using namespace std;を使うのを避けよう

:::note info
`std::`を書くのを省略したい場合は、使う関数のみを`using`を使って宣言しましょう。

例: `using std::cout;`と記述すればコード中で`cout`をそのまま使うことができます。
:::

## なんで？

次のようなコードを考えましょう：
```c++
namespace A
{
    void func(int);
}

namespace B
{
    void func(int);
}
```

名前空間（name space）`A`に属する`A::func()`と名前空間`B`に属する`B::func()`を定義しました。

さて、これで
```c++
using namespace A;
using namespace B;

int main()
{
    func(1);
}
```
とした場合、`A::func()`と`B::func()`どちらが呼び出されるでしょうか？
（これはコンパイルエラーになる）

そもそも`std::`(standard)名前空間で分けれられているのは、**他の関数などと名前がかぶるかしれないから分けられている** のです。
(実際、`std::abs`などの被りそうな名前がたくさんある)

たくさん書くからなどの理由で名前空間を省略したい場合は、**明示的に** 使う関数やクラスなどを宣言しましょう：
```c++
using A::func;  // 明示的に省略する関数を宣言する

int main()
{
        func(1);  // A::func()が呼ばれる

        B::func(1);  // B::func()も呼び出せる
}
```

`std::`の中に入っている関数や定数の名前を全部知っているようであれば話は別ですが、意図せず別の関数を呼び出してしまうかもしれないので気をつけましょう。

## ちなみに

コードのその部分だけで名前空間を省略したい場合は、

```c++
int main()
{
    {
        using namespace A;
        func(1);  // A::func()が呼ばれる
    }
    {
        using namespce B;
        func(1);  // B::func()が呼ばれる
    }
}
```

のようにスコープの中でのみ関数を使えるようにできます。
チャットbotお試し用アプリ開発_3日目


# 目次
・開発の流れ（願望）
・本日の成果・考え

### 本日の成果

前回の機能一覧をもとに、PGで使用するクラス図を作成。

![スクリーンショット 2025-06-03 20.58.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3338426/ab09bdbc-9161-4532-9f33-2a915d1b019b.png)

作成にあたりを以下を意識して行いました。

:::note info

**・各クラスの責任を可能な限り分離**

**・Singleton(シングルトン)パターン**
設定ファイルDtoは、共通で使用するため「アプリ実行」クラスで呼び出して、「ログDto」「ウィンドウDto」で共用する予定です。

**・Factory Method**
Dto生成用のセット処理を用意することで、インスタンス生成の手段を制限して、生成時に必要なフィールドの作成漏れの予防を考えています。

**・Facade（ファサード）**
各処理とその実行処理で分けています。起動と処理を分けることで、修正時の範囲縮小やクラス内でのソースコードを少なくして、可読性が良くなることを期待しています。
また、クラスの単体テストを行う際、確認項目を少なくして行いやすくなることを期待しています。

**・各処理のDtoは、「セット処理」が引数付きコンストラクタ（private修飾子）を実行する流れ**
生成と同時に設定ファイルの値を各Dtoに格納する形を想定しています。
:::

### 最後に
設計の訓練でしたので、「Gofのデザインパターン」を可能な限り組み込んでみました。
正直、この規模のアプリ開発ではシングルトンなどは不要かもしれません。
設定ファイルDtoのインスタンスを生成するのは1回のみですし…
※なんなら自分の現場では別にシングルトンじゃないです。
まあ、実際にPGやUTする上でどのような影響が出るかも体験してみたいので、大きく困らない限りはこの構成でPGしたいと思います。
今回から、設計図を含めてGithubにプッシュしていきます。
基本はdevelopブランチを使用し、テスト完了したものからmasterブランチにマージする予定です。


次は、クラス図をもとに、クラス設計書で各処理の内容を設計したいと思います。
WinUI3 カスタムタイトルバーで、最大化、最小化、閉じるボタンを非表示にする

## WinUI3でライト、ダークのテーマの切り替えを、システムボタンにも反映させたい！
こちらの投稿に触発されて、アプリにテーマ切り替えを導入したい！と再び思いました。

https://qiita.com/kashin777/items/4ac62cefaebfba175fcf

カスタムタイトルバーを利用していたのですが、以前、テーマ切り替えボタンを試した時は、なんだか中途半端な色変えで、アレ？？と思っていたのですが、どうやらxamlで背景の指示をしていなかったためのようです。

```xml
<Grid x:Name="RootGrid" Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
・・・
    <AppBarButton Click="ToggleThemeButton_Click" Margin="8,0,0,0" ToolTipService.ToolTip="Change Theme">
        <AppBarButton.Icon>
            <FontIcon Glyph="&#xE793;"/>
        </AppBarButton.Icon>
    </AppBarButton>

```

```csharp
private void ToggleTheme()
{
    // ルートの Grid（ここでは RootGrid）の ActualTheme プロパティで、現在のテーマをチェック
    if (RootGrid.ActualTheme == ElementTheme.Light)
    {
        RootGrid.RequestedTheme = ElementTheme.Dark;
    }
    else
    {
        RootGrid.RequestedTheme = ElementTheme.Light;
    }
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3679605/ecf62937-f723-4251-94e4-bc05a1106cd7.png)

テーマ変更の☀ボタンを押すと↓

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3679605/cf467f32-da2c-48c9-b08a-05c43342ef98.png)

いたはずの最大化、最小化、閉じるボタンがいなくなった！
・・・のではなくて、マウスを持っていくと見える！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3679605/7cd6fe8a-3733-4ee5-9513-0a599775f762.png)

最大化、最小化、閉じるボタンはシステムボタンで、アプリでのテーマ切り替えには左右されず、Windowsのシステム設定値のままらしい。

## カスタムタイトルバーを使えばできますよ？
とCopilotは言うけれど、これがなかなか実現できなくて。
で、いろいろ遠回りして、最終的に`WinUI 3 Gallery`に載ってた方法で実現できそうな目途がついたので、おすそ分け。
最近更新されたのか、Windowing > TitleBar にありました。

```csharp
// Retrieve the main window and extend its content into the title bar for custom styling.
Window window = App.MainWindow;
window.ExtendsContentIntoTitleBar = true;

// Set the preferred height option for the title bar
window.AppWindow.TitleBar.PreferredHeightOption = TitleBarHeightOption.Collapsed;
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3679605/72bfc2f2-55c4-4aa4-b86e-df491b1345f7.png)
（設定した内容が、リアルタイムに反映されるので、すごいですよね、このアプリ）

手順的には、
1. カスタムタイトルバーを作る
1. 上記のコードでシステムボタンの高さを無しにする
1. 必要に応じて閉じるボタン、最大化、最小化ボタンをつくる

この手順がWinUI3で完結していて、スッキリと実装できそうです。
暫定で、雑に閉じるボタンだけ実装してみましたが、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3679605/36f0a2f9-2024-4041-a9d4-dc14952fe534.png)
テーマ切り替えしても、アプリのボタンなので、ちゃんと色変えに追従してくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3679605/6f91f13f-b624-4e47-8068-d7153e3c49c9.png)


## その他の方法（3つ全てを無効にできなかった方法）
最大化、最小化の無効化は、次の記事を参考にできました。

https://tera1707.com/entry/2022/04/24/220519

閉じるボタンはどのようにするのかと探して、下記を見つけたのですが、結局うまくいきませんでした。

https://stackoverflow.com/questions/77096488/how-to-disable-window-close-button-and-image-in-winui3

他にも、システムボタンの色を透明にしようとするなど、いくつか試してみたのですが結局うまくいかず、ボタンをいい感じに重ねるしかないのかなー？
と思っていた矢先、`TitleBarHeightOption.Collapsed`を見つけました。

あとはいい感じに閉じるボタンとかをレイアウトするだけ・・・！
Gem作成個人メモ(2025/06時点)

0. Gitのリポジトリ作っておいてクローン
1. (option)bundlerを適当にアップデート
2. Gemの雛形作成。上記で作っておいたリポジトリの名前を入れる。
     * rspec,rubocopが適当に入る
        ```
        bundle gem gem_name --mit --test=rspec
        ```
3. gem_name.gemspec, README.mdを適切に編集。
    * 実行に必要なGemなども追加。開発環境でのみ必要なものはGemfileへの追加で良い。railsでよく使い便利なメソッド等は`activesupport`を入れる必要があったりする。
        ```
        spec.add_dependency 'activesupport'
        spec.add_dependency 'json'
        ```
4. コード書く。 
    * requireやrequire_relativeはgem_name.rbに集約した方が見やすい
        ```
        require 'active_support/core_ext/hash/keys'
        require_relative 'gem_name/version'
        ```
    * ディレクトリはこういう感じがよさそう
        ```
        lib/gem_name/hoge_module/hoge.rb
        lib/gem_name/version.rb
        lib/gem_name.rb
        ```
    * rspecも簡単に書いておいた方が良さそう
5. テストする
    * `bin/setup`で環境構築できるので`ruby examples/sample.rb`とか適当にテストのファイル作って実行してデバック等する
    * `bundle exec rspec`, `bundle exec rubocop`あたりもやっておく

6. テストで動確問題なければ、gitにpushしてリリース
7. リリース
    * `bundle exec rake release`でリリース(Gitのタグ付け&Rubygemへ登録)が行われる。`VERSION`に設定した値でタグづけとリリースが行われるのでgitにpushする際に忘れずにバージョンアップなど等しておく。
findとgrepを組み合わせたファイル検索に便利なコマンド集

# これは？
ログファイルの検索などでfindとgrepを使うことがありますが、いつも使い方を忘れるので、自分用のメモを兼ねて便利なコマンドをまとめました。

# 特定ディレクトリ以下の全ファイルから文字列検索

```bash
find /var/log -type f -exec grep "error" {} \;
```
/var/log 以下の全てのファイルから error を検索します

# ファイル名の条件付きで文字列を検索

```bash
find ./logs -name "*.log" -type f -exec grep "fatal" {} \;
```
カレントディレクトリ下の .log 拡張子のファイル内で fatal を検索します

# 該当箇所のファイル名を表示する（grep -l使用）

```bash
find /var/www -type f -exec grep -l "Timeout" {} \;
```
マッチしたファイル名のみ表示しますします

# 大文字小文字を無視して検索

```bash
find ./app -type f -exec grep -i "Failed" {} \;
```
大文字小文字を区別しないで検索します

# 検索した結果の前後の行も表示

```bash
find ./logs -type f -exec grep -A3 -B3 "Exception" {} \;
```
該当行の前後3行ずつ表示します

# 複数キーワードを同時に検索（正規表現）

```bash
find . -type f -exec grep -E "error|fatal|critical" {} \;
```
複数のキーワードをOR検索します

# 巨大なログを扱う場合

```bash
find ./logs -type f -name "*.log" -exec grep -H -e "timeout" -- {} +
```

findで見つかったファイルをまとめてgrepｎ渡すことで、高速かつ効率的にログ検索します


# 直近24時間に変更されたファイルから検索

```bash
find /var/log -type f -mtime -1 -exec grep "error" {} \;
```
最近のログを優先して検索します

# テキストファイルのみを対象に検索

```bash
find . -type f -exec grep -I "error" {} \;
```
バイナリファイルを自動的に除外します

# 最後に
他にもあれば追記していく予定です。
【Data Engineering Podcast要約】AI時代に欠かせない「セマンティックレイヤー」とは？

こんにちは。今回は、Data Engineering Podcastの中でもとくに興味深かった回をご紹介します。

ゲストは、データガバナンスとメタデータ管理のプロフェッショナル、Select StarのCEO・Shinji Kimさん。テーマは「セマンティックレイヤーの現在地とAI時代の役割」について。

# **セマンティックレイヤーとは？——売上の“意味”を統一する仕組み**
Shinjiさんが何度も強調していたのは、「セマンティックレイヤー（Semantic Layer）」の重要性です。

例えば、ある部署では「売上」とは税込の合計金額を指していて、別の部署では割引後の金額を指している…そんな食い違い、データ活用の現場ではよくある話ですよね。

そこでセマンティックレイヤーを使えば、「売上＝このテーブルのこのカラム、こういう条件付き」といった意味をコードやモデルで統一できます。AIに正確なSQLを生成させたいなら、この“意味の定義”こそが土台になるんだなと納得しました。

# **AIアナリスト時代に必須の“ガードレール”**
最近話題の「AIアナリスト」。自然言語で「今月の解約率は？」と聞いたら、AIがSQLを書いて答えてくれるというやつです。

でも、Shinjiさん曰く、こうしたAIは**「セマンティックモデル」がちゃんとあるかどうかで精度が大きく変わる**とのこと。

なぜなら、AIが自動で選ぶテーブルやカラムには「微妙な間違い」が混ざりやすく、セマンティックレイヤーが“ガイド”になってくれることで、精度が80%→98%まで上がるという話も。これはすごく実践的な示唆でした。

# **Semantic Layerは「ファイル」から「システム」へ**
面白かったのは、セマンティックレイヤーがまだYAMLファイルとして定義されることが多い、という話。でもそれだと管理が大変で、モデルが更新されなくなって使われなくなることも…。

将来的にはもっと動的に、システムとしてAIと連携してアップデートされていく方向へ進むべきという指摘も印象的でした。

# **こんな人におすすめのエピソードです**
AIを導入して「自然言語でデータ分析」がしたい人

チームごとにバラバラな指標定義にモヤモヤしている人

dbt, Looker, Snowflakeなどを使っているエンジニア・PM

セマンティックレイヤーの実装に悩んでいるBIチーム

# 💡 専門用語・キーワードまとめ
| 用語                                  | 意味                                       |
| ----------------------------------- | ---------------------------------------- |
| セマンティックレイヤー                         | ビジネス用語（例：売上、アクティブユーザーなど）を明示的に定義した中間レイヤー。 |
| メトリックレイヤー                           | KPIなど集計指標に特化したセマンティックモデル。                |
| AIアナリスト                             | ChatGPTのように自然言語からSQLを生成してくれるAI。          |
| RAG（Retrieval-Augmented Generation） | AIが質問に答える際、関連する情報を検索・補完して答える手法。          |
| YAML定義ファイル                          | セマンティックレイヤーを記述するフォーマット。                  |
| Snowflake Semantic View             | セマンティックモデルをSQL Viewとして扱えるSnowflakeの新機能。  |
| LookML / dbt semantic layer / Cube  | 各社が提供するセマンティックモデリングの実装方法。                |

## 参考

[21 May 2025
From Data Discovery to AI: The Evolution of Semantic Layers - E465](https://www.dataengineeringpodcast.com/episodepage/from-data-discovery-to-ai-the-evolution-of-semantic-layers)
スタックとキュー

# 備忘録
C++でスタックとキューの簡単な実装を行なった．

### スタックとキューの簡単な説明
#### スタック
後入れ先出しのデータ構造

操作
push(item) 配列の最後にitemを挿入する．
pop() 配列の最後の要素を消去する．
peek() 配列の最後の要素を取り出す．
isFull() 配列が満タンかどうかをチェックする．
isEmpty() 配列に要素があるかチェックする．
#### キュー
先入れ先出しのデータ構造
enqueue() 配列の最後に要素を挿入する．
dequeue() 配列の最初の要素を取り出す．
isFull() 配列が満タンかどうかをチェックする．
isEmpty() 配列に要素があるかチェックする．

スタックとキューはほとんど同じように実装できるがキューの場合はdequeueをする度にデータの始まりがどんどん変化していくため，注意が必要である．
リングバッファとみなして実装することもできる．

## スタックの実装
``` C++:stack.cpp
template<typename T>
class stack
{
    private:
    T data[1000];
    int index=0;
    public:
    void push(T item)
    {
        if(!isFull())
        {
            data[index]=item;
            index++;
        }
    }
    void pop()
    {
        if(!isEmpty())
        {
            data[index]==NULL;
            index--;
        }
    }
    T peek()
    {
        return data[index-1];
    }
    bool isEmpty()
    {
        if(index==0)
        {
            return true;
        }
        return false;
    }
    bool isFull()
    {
        if(index>=1000)
        {
            return true;
        }
        return false;
    }

    int Index()
    {
        return index;
    }
};
```

## キューの実装
``` C++:queue.cpp
template<typename T>
class queue
{
    private:
    int start=0;
    int last=0;
    T data[100];
    public:
    void dequeue(T item)
    {
        if(!isFull())
        {
            last++;
            data[last]=item;
        }
    }
    T enqueue()
    {
        if(!isEmpty())
        {
            start++;
            return data[start--];
        }
    }
    bool isEmpty()
    {
        if((last-start)==0)
        {
            return true;
        }
        return false;
    }
    bool isFull()
    {
        if((last-start)>=100)
        {
            return true;
        }
        return false;
    }

};
```
【Shell】引数によって処理を分けるシェルスクリプトの書き方

# 【Shell】引数によって処理を分けるシェルスクリプトの書き方

Bashスクリプトで「引数に応じて処理を分けたい」というケースはよくあります。
この記事では、`case` 文を使って実現する基本的な書き方を紹介します。

---

## ✅ サンプルコード

```bash
#!/bin/bash

case "$1" in
  1) echo "1の処理" ;;
  2) echo "2の処理" ;;
  3) echo "3の処理" ;;
  4) echo "4の処理" ;;
  5) echo "5の処理" ;;
  *) echo "その他の処理" ;;
esac
```

---

## 💡 解説

- `$1` はスクリプト実行時に渡す第1引数です。
- `case` 文は複数の条件分岐を簡潔に書ける構文です。
- `;;` は各条件の終端を表します。
- `*` はすべての条件に当てはまらなかった場合のデフォルト処理です。

---

## 🔧 実行方法

例：
```bash
bash script.sh 2
```

結果：
```
2の処理
```

```bash
bash script.sh xyz
```

結果：
```
その他の処理
```

---

## 🛠 活用例

- テスト番号によって異なるテスト処理を呼び出す
- 引数でモード（dev/test/prod）を切り替える
- 引数でログレベルや設定を変える CLI ツールに応用

---

## ✅ まとめ

`case` 文を使えば、複数の条件を読みやすく書けるので、
シェルスクリプトのメンテナンス性が向上します。

簡単なツールや自動化スクリプトを作るときにぜひ使ってみてください！
[VRChat] Unityで座らせたり, 寝かせたり

## ⭐️目的

Unityで座りモーションや中腰モーションや寝るモーションを確認したい

## ⭐️参考

https://note.com/mint_milkshake/n/n7624d970f18a

https://qiita.com/YukiLulu0229/items/e43d243153e6bd1c87ee

### ☂️公式

https://github.com/BlackStartx/VRC-Gesture-Manager



## ⭐️インストール

https://github.com/BlackStartx/VRC-Gesture-Manager

https://qiita.com/YukiLulu0229/items/e43d243153e6bd1c87ee



## ⭐️使い方

### ☂️ジェスチャーマネージャーを起動する

![スクリーンショット 2025-06-03 21.21.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610706/d094b980-65cb-41ba-b5f1-98ce88a72935.png)

- 本体を選択する
- Gesture Manager コンポーネントを開く
- Debugのタブを選択する


![スクリーンショット 2025-06-03 21.23.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610706/ad0053d4-ab40-4f9e-a8ac-fa069491cdcf.png)


- paramaterのdefaultまで移動する
- ここのUprightの数値を変更する
- - 1.0立ち
- - 0.6 中腰
- - 0.4 座り
- - 0.0 寝る
【git-spice】スタックにPRが複数存在する場合のみナビゲーションコメントをつける方法


デフォルトではスタックに1つのプルリクエストしか存在しない場合でもナビゲーションコメントがつきます。

これを変更するためには以下の設定をする必要があります。

## プルリクエストが複数存在する場合のみ

プルリクエストが複数存在する場合にのみナビゲーションコメントをつける場合には以下のコマンドを実行します。

```terminal
git config --global spice.submit.navigationComment　multiple
```

現在のリポジトリのみを対象とする場合には次のコマンドを実行します。

```terminal
git config --local spice.submit.navigationComment　multiple
```

## コメントをつけない

プルリクエストにナビゲーションコメントをつけないようにするには以下のコマンドを実行します。

```terminal
git config --global spice.submit.navigationComment　false
```

現在のリポジトリのみを対象とする場合には次のコマンドを実行します。

```terminal
git config --local spice.submit.navigationComment　false
```

## 参考

https://abhinav.github.io/git-spice/cli/config/#spicesubmitnavigationcomment
【Python】Shell Scriptを実行する方法（Mac/Linux向け）

# 【Python】Shell Scriptを実行する方法（Mac/Linux向け）

PythonからShell Script（例: bashの`.sh`ファイル）を実行する方法を紹介します。

## ✅ サンプルコード

```python
import subprocess

# capture_output=True: 標準出力・標準エラー出力を取得する
# text=True: 出力をバイト列ではなく文字列として扱う
result = subprocess.run(['bash', 'test.sh'], capture_output=True, text=True)
print(result.stdout)
```

## 📝 説明

- `subprocess.run()` は外部プログラムを実行する関数です。
- `['bash', 'test.sh']` は bash 経由で `test.sh` を実行しています。
- `capture_output=True` にすると標準出力・エラー出力を Python 側で取得できます。
- `text=True` を指定すると、出力をバイトではなく文字列として扱えます。

## 📌 注意点

- `test.sh` に実行権限が必要な場合があります（`chmod +x test.sh`）。
- 実行するスクリプトは相対パスまたは絶対パスで指定してください。
- 同じディレクトリ内にtest.shが存在する場合のコードです

---

Mac や Linux での自動化処理やCI環境などで便利に使えます！
地方公務員が法律を守るためにしていること

地方公務員で法律に基づいて仕事をする場合に、

１　出先では、本庁に問い合わせる。
　出先だけで、判断できることは、条例などで出先に権限があることを規定している。

 ２　監督官庁に問い合わせる

 例１：　日本の自動車のナンバープレートじゃない車が、違法駐車してかつ出入りの邪魔になっているときに、どう警告すればいいかわからず、外務省に問い合わせた。

 長期でなければ、どこの誰の車かを調べるより、よしなに対応してもらえるとありがたそうな感じで忖度して電話を切った。

 例２：　自治体がやとっている公務員以外の身分の方の保険類の扱いの考え方。
 都道府県で答えてもらえそうな内容は、都道府県にお聞きし、都道府県で国の管轄だという話をお聞きしたら、国に問い合わせの電話をした。

 例３：　口座振替手続きで、銀行で処理の仕方に違いがあり、どちらが国の指導方針に近いかをお聞きし、銀行に取り扱いの改善を求める根拠（表むきは国に聞いた）といわずに、お願いをした。

 例４：　港湾関係の事務で、管理組合にお聞きしたところ、国の判断とのことで、国に連絡した。

 例５：　産業標準の取り扱い方について、国に問い合わせた。細かい内容については、その標準を決めた団体にも問い合わせることにした。




# 憲法
公務員は、憲法の趣旨に剃っていれば、そんなに怒られることはない。

法律は、それぞれの分野ごとに閉じている場合があり、
ある法律は右へ行けと書いてあり、
別の法律は左へ行けと書いてある。

ある法律と別の法律は、適用する想定が違えば、二つの法律の間に矛盾はない。
部分だけ切り離して考えるとまずいだけ。

# 地方自治法、地方公務員法
地方自治体は、地方自治法と、地方公務員法が大事。
本当は、地方税法が大事で、実際に税金をお支払いたいただいている方にどれだけ貢献しているかが命かもしれない。

いずれにしても、憲法の範囲内であることが条件。

# 民法、商法、刑法
地方公務員でも、警察は刑法がむちゃくちゃ大事。
残念ながら、警察の仕事はしたことがない。

# 刑事訴訟法、民事訴訟法、行政事件訴訟法
司法は原則国家公務員。司法にかかわる地方公務員は知り合いではいない。

行政訴訟法ではなく、行政事件訴訟法だといちづけはよくわかっていない。

# 道路、建築、交通、水道、下水
国土交通省、厚生労働省系の地方自治体の活動は大きな割合を占める。


# その他法律
六法全書　なにをどう処理するとよいか 官(124)
https://qiita.com/kaizen_nagoya/items/a6b9e44609bbc906582b

プログラマが知っていると良い「公序良俗」官（４）
https://qiita.com/kaizen_nagoya/items/9fe7c0dfac2fbd77a945

プログラマが知っているとよいかもしれない法律1000を目標に収集中。
https://qiita.com/kaizen_nagoya/items/eeffde5e7ee049f0adeb

情報技術にまつわる法令
https://qiita.com/kaizen_nagoya/items/95f83d0251c134429649

IT業の前に立ちはだかるか。融資・法律・規格
https://qiita.com/kaizen_nagoya/items/e2dab1d27ee0b799e952

T系技術資格における法律問題の勉強の仕方。官（６）
https://qiita.com/kaizen_nagoya/items/ca2d115d428f406bd2dc

公序良俗との関係が説明できない計画・規則は有効か
https://qiita.com/kaizen_nagoya/items/7356189bf1644c4b6313

条約・法律・判例
https://qiita.com/kaizen_nagoya/items/4d51f059669ef6606b3c

情報技術，電気通信の試験研究機関の業務に関連する条約、法律（改版）官（８）
https://qiita.com/kaizen_nagoya/items/9b3546f6ca1238467cfc

"natural law" "positive law" or "written law" "common law"検索 :英語(50)
https://qiita.com/kaizen_nagoya/items/3f8bd23f5dd014cf81f6

権利と義務の前に。仮説（147）官（５）
https://qiita.com/kaizen_nagoya/items/47d4e992d0fd340403fd

社会保険労務士関連法規・資料
https://qiita.com/kaizen_nagoya/items/699549fc9fca897b33f3
初めてNeovimプラグインを作ってみた感想

## はじめに

最近、yadm を使って dotfiles を管理し始めました。普段から Neovim を使って設定ファイルを編集しているのですが、ある問題に直面しました。
yadmはYet Another Dotfiles Managerの略でdotfilesを管理するためのgitのラッパープログラムです。

## 解決したかったこと

- Neovimでファイルを開いてもyadm管理下であることを検出できず、git系プラグイン（例えばgitsigns.nviなど）が動作しない。
- `yadm enter`してから nvim を起動すれば動くが、正直めんどい。
- yadm関連のプラグインがあまりない。[telescope-yadm](https://github.com/pschmitt/telescope-yadm.nvim)というプラグインがあるが、`yadm list`の結果をtelescope.nvimに渡している。それならgitとして認識させて `telescope.builtin.git_files`を使うほうが良くないか？

→ と考えて「Neovim側で yadm の git repo を認識させれば良くない？」と思ったのが出発点です。

## 作ったもの

https://github.com/Kohei-Wada/yadm-git.nvim

yadm管理下だとプラグインが判定したら、Neovim に「これはgit repoですよ」と認識させるだけのプラグインです。

## 中でやっていること

- `git rev-parse --is-inside-work-tree`
- `yadm rev-parse --is-inside-work-tree`

を実行してyadm環境下かどうかを判定したあと、git関連の環境変数をNeovimに設定するだけです。

## テスト

[telescope.nvim](https://github.com/nvim-telescope/telescope.nvim)のテスト構成を参考にしました。Makefile + plenary.nvimでテスト実行するだけです。
外部コマンドの実行をモックする方法などはほぼChatGPTに聞いただけです。
CI、Linterなどの設定もほぼパクリです。

## 疑問: Neovimのプラグイン開発に関して

プラグインを開発するのが初めてだったので、正直スタンダードなやり方がわからない。
例えば、telescope.nvimでは自動テストの実行で最低限の環境を整える[minimal_init.vim](https://github.com/nvim-telescope/telescope.nvim/blob/master/scripts/minimal_init.vim)というファイルがありますが、これを見ると、同じ階層にあるplenary.nvimやtreesitter.nvimをパスに登録している。

```lua
set rtp+=../plenary.nvim/
set rtp+=../tree-sitter-lua/
```

これは、Neovimのプラグイン開発はある程度決まったやり方があるのかなーという気がした。
lazy.nvim 使ってる自分としては、.local/share/nvim/lazy 配下で開発した方がいいのか？

誰かの開発ベストプラクティスを知りたい……

## READMEの作成

書くのが面倒だったので ChatGPT に任せた。意外と整っていたのでそのまま使った。

## yadmとWindows

yadm自体がWindows未サポートなので、Windowsでのテストは対象外としました。

## これから考えたいこと

- もっと効率的にyadmリポジトリだと判定する方法はないのか？
- 外部コマンドをNeovim内で一番早く実行する方法は？

## 終わりに

小さなユースケースから始まったプラグイン開発でしたが、Neovimの拡張の自由さ、テストの難しさ、READMEの重要さ、いろいろ勉強になりました。
yadm を使っている人は少ないかもしれませんが、同じ悩みを抱える人の助けになれば嬉しいです！
【Playwright】「Add/Remove Elements」のボタン操作を練習する

# 🔘 Playwrightで「Add/Remove Elements」のボタン操作を練習する

[E2E テストやブラウザ自動化] を学ぶ際、実際の動作を確認しながら学べるデモサイトがあると非常に便利です。  
その中でも今回は、「[Add/Remove Elements](https://the-internet.herokuapp.com/add_remove_elements/)」という、シンプルながらも **要素の追加と削除** を学べるページを使って、**Playwright でのボタン操作**を試してみます。

---

## 🌐 対象ページ

📎 [https://the-internet.herokuapp.com/add_remove_elements/](https://the-internet.herokuapp.com/add_remove_elements/)

このページでは、以下のような UI 操作が体験できます：

- 「Add Element」ボタンをクリックすると、「Delete」ボタンが追加される  
- 追加された「Delete」ボタンをクリックすると、それが削除される

---

## 🧪 Playwright スクリプト例

以下は、Playwright を使ってボタンを操作し、要素の追加と削除を検証するコード例です：

```ts
import { test, expect } from '@playwright/test';

test.use({ headless: false });

test('Add/Remove Elements のボタン操作をテストする', async ({ page }) => {
  // 対象ページへ移動
  await page.goto('https://the-internet.herokuapp.com/add_remove_elements/');

  // Add Element ボタンをクリック
  await page.waitForTimeout(2000);
  await page.getByRole('button', { name: 'Add Element' }).click();
  await page.waitForTimeout(2000);

  // Delete ボタンが表示されていることを確認
  const deleteButton = page.getByRole('button', { name: 'Delete' });
  await expect(deleteButton).toBeVisible();

  // Delete ボタンをクリックして削除
  await deleteButton.click();
  await page.waitForTimeout(2000);

  // Delete ボタンがなくなったことを確認
  await expect(deleteButton).toHaveCount(0);
});
```

---

## 📕 補足

目視で動作確認がしやすいように、以下のように 2 秒のスリープを入れています。

```ts
await page.waitForTimeout(2000);
```

本番テストでは `waitForSelector()` などを使って、より安定した動作に置き換えるのが推奨されます。

---

## ✅ まとめ

このページは、Playwright の基本的なボタン操作や動的要素の検出・操作に慣れるための良い練習になります。  
特に「動的に生成・削除される要素」の扱いは自動化の中でも頻出のパターンなので、しっかり理解しておきましょう！
【実体験から語る】フリーランスから会社員に戻ってしまう人の特徴3選

【免責事項】
本投稿は正確性・完全性を保証するものではありません。
万が一、本情報に基づいて被ったいかなる損害についても、一切の責任を負いかねます。
あらかじめご了承ください。


---

## 🎥 動画で確認したい方はこちら（サムネイル付きリンク）
[![【実体験から語る】フリーランスから会社員に戻ってしまう人の特徴3選](https://img.youtube.com/vi/frp51bRNJMk/maxresdefault.jpg)](https://www.youtube.com/watch?v=frp51bRNJMk)

---

## ✅ 概要

フリーランスとして独立したものの、「やっぱり会社員に戻りたい」と感じてしまう人は少なくありません。
本記事では、**IT系フリーランス7年目の筆者が実際に見てきた“出戻り”の共通パターン3つ**を紹介します。

---

## 🚩 特徴1：漠然とした将来の不安から戻る

* 周囲にフリーランスが少なく、孤独を感じやすい
* 正社員という“安心感”に引き戻されてしまう
* 特に「人と違うのが不安」「他人の意見に流されやすい人」は注意！

> 💬 **対策のヒント：** 情報収集・相談できるコミュニティを持つ

---

## 💍 特徴2：結婚などライフイベントを機に戻る

* 「安定＝正社員」という思い込みやプレッシャーが影響
* 実際には、**フリーランスの方がリスク分散型**の働き方になるケースも多い
* 会社員は1社依存＝「切られたら終わり」

> 💬 **対策のヒント：** 数年単位の収支・生活設計を“自分で管理”する力が重要

---

## 🎯 特徴3：フリーランスになること自体が目的になっている

* SNSの「自由でオシャレな働き方」に憧れただけで独立
* 実際は：自由だが責任も大きく、**やることは増える**
* 明確な目標がないと、やがてモチベーション低下・収入低下 → 会社員に戻る流れに

> 💬 **対策のヒント：** フリーランスになって「何を実現したいか」を明確にしておく

---

## 🔁 まとめ：3つの特徴おさらい

| No. | 特徴                     |
| --- | ---------------------- |
| 1   | 将来の不安に負けて戻る            |
| 2   | 結婚や家族の事情で「安定」を選ぶ       |
| 3   | フリーランスになること自体が目的で、続かない |

---

## 📝 フリーランスを目指す方へ

これから独立を考えている方は、自分が上記のどれかに当てはまらないか一度立ち止まって考えてみてください。
**目的・キャリア設計・メンタル面の準備**が大切です。

---

## 🎥 関連動画（再掲）

[![フリーランスから会社員に戻ってしまう人の特徴3選](https://img.youtube.com/vi/frp51bRNJMk/maxresdefault.jpg)](https://www.youtube.com/watch?v=frp51bRNJMk)

---
## ✨ おわりに
この記事が役立ったら、いいねやストックいただけると嬉しいです！

## 主のコンテンツ
<a href="https://www.udemy.com/course/active-directory-p/?referralCode=1BC8474484DCD2814852">Active Directoryの基礎※ハンズオン形式</a>
<a href="https://www.udemy.com/course/active-directory-n/?referralCode=FF51293A35539D596A6A">Active Directoryの基礎 グループポリシー編※ハンズオン形式</a>
<a href="https://www.udemy.com/course/joshishelp/?referralCode=7ECEB242C114FA3736F8">情シスヘルプデスク入門※一部ハンズオン形式</a>
<a href="https://twitter.com/naoya_itbegin">X</a>
<a href="https://www.youtube.com/@%E7%A4%BE%E5%86%85%E3%83%8D%E3%83%83%E3%83%88%E3%83%8A%E3%83%93">Youtube</a>
リーダブルコード（第9章）の学び　パート2

## はじめに

第9章の後半では、「変数の生存期間」の重要性について学んだ。
その学びを整理する。

## なぜグローバル変数は避けるべきなのか

* 同じ名前の変数を定義してしまうことを避けるため
* どこで変数が使われているかが把握しやすくするため

しかし、この章ではそれだけではなく、さらに「変数の生存期間」を意識することの重要性が書いてあった。

### スコープは短く保つ

スコープが短いほど、その変数がどこで使われているのか理解しやすくなる。

### イミュータブルな変数を使う

変数の再代入を避ける。つまり、イミュータブルな値を使うことで、安心感が生まれる。

## おわりに
なんとなくグローバル変数はできる限り使わないほうがいいことは知っていたし意識していたが、今回は「変数の寿命」を意識することの重要性を学んだ。日々意識していく。
SwiftUIのAnimations基礎の使い方【初心者向け🔰】

アニメーションの基本
--
SwiftUIでは、withAnimationや.animation()修飾子を使ってアニメーションを実装します。
状態の変化にアニメーションをつけたい場合は、withAnimationで囲みます。
//ざっくり簡単に作ると、、こんな感じです

```swift
struct AnimationExample1: View {
    @State var isScaled = false

    var body: some View {
        VStack {
            Spacer()
            Circle()
                .fill(Color.blue)
                .frame(width: 100, height: 100)
                .scaleEffect(isScaled ? 1.5 : 1.0)
                .animation(.easeInOut, value: isScaled)
            Spacer()
            Button("アニメーション") {
                withAnimation {
                    isScaled.toggle()
                }
            }
            .padding()
        }
    }
}
```
scaleEffectと.animation()とのコンボを使って、タップで大きさが変わるアニメーションを実現しました

.animation()修飾子の使い方
--
.animation()は、状態変化にアニメーションを適用したいViewに直接つけます
```swift
.animation(.default, value: 変化させる状態)
```
- value:に変化対象の状態（@Stateなど）を指定するのがポイントです


よく使うアニメーションの種類
---
| アニメーション名     | 説明             |
| ------------ | -------------- |
| `.easeIn`    | ゆっくり始まり速く終わる   |
| `.easeOut`   | 速く始まりゆっくり終わる   |
| `.easeInOut` | ゆっくり始まりゆっくり終わる |
| `.linear`    | 一定の速さで動く       |
| `.spring()`  | バネのような動き（跳ねる）  |

withAnimation vs .animation()の違い
---
| `withAnimation` | `.animation()`             |
| --------------- | -------------------------- |
| アクションの中に書く      | Viewの修飾子として使う              |
| 状態の変化に対して即時適用   | どの状態に反応してアニメーションさせるかを指定できる |


animationをつけることによってグッとUIが良くなると思います！初心者の方はぜひ使ってみてください！🤌
Pythonで構造化されたサンプルログを自動生成するスクリプトを作ってみた【テスト・検証・負荷試験に】


## 🔰 背景と課題

ログ解析や監視ツールの検証を行う際、**実際のログファイルを使うのは難しい**ことがあります。  
なぜなら、実ログには機密情報や個人情報が含まれていることが多く、テストや外部共有には不向きだからです。

そこで今回は、**Pythonでダミーログを構造的に自動生成するスクリプト**を作ってみました。

---

## 🛠 このスクリプトでできること

- ログ1行の**本文サイズ（文字数）帯ごとに件数を指定**して生成
- **タイムスタンプ/IP/ログレベル/アプリ名/メッセージ**を含んだ構造化ログ
- CSVではなく、実際のログに近い**スペース区切り形式**
- 各行で**1秒ずつタイムスタンプを進めて出力**
- すべてを1ファイルにまとめて出力

---

## 🧱 ログの出力形式

以下のような形式で1行ごとのログを出力します：

2025-06-02 16:20:00 192.168.0.10 INFO auth aF84jK3qA...


| 項目       | 内容                         |
|------------|------------------------------|
| timestamp  | ログ時刻（1秒ずつ増加）     |
| ip         | ランダムなIPアドレス         |
| priority   | INFO / WARN / ERRORなど      |
| app_name   | アプリ名（auth, paymentなど）|
| message    | 指定サイズのランダム文字列   |

---

## ⚙️ 出力サイズの調整方法

以下のようにサイズ帯と件数を定義することで、出力されるメッセージの長さをコントロールできます：

```python
size_distribution = [
    ((20, 30), 2),
    ((31, 50), 3),
    ((51, 80), 3),
    ((81, 128), 2),
]
この例では合計10行のログを出力し、それぞれの長さをランダムに分布させています。

サンプルスクリプト（loggen.py）
import random
import string
from datetime import datetime, timedelta

# ======== 設定 ========

output_file = "sample_log.txt"  # 出力ファイル名
total_entries = 10              # 出力件数（自動算出）

size_distribution = [
    ((20, 30), 2),   # 短めログ 2件
    ((31, 50), 3),   # 中間ログ 3件
    ((51, 80), 3),   # 長めログ 3件
    ((81, 128), 2),  # 超長ログ 2件
]

ip_list = ["192.168.0.10", "10.0.0.1", "172.16.5.23"]
app_names = ["auth", "payment", "core"]
priorities = ["INFO", "WARN", "ERROR"]

# ======== エントリ生成 ========

log_entries = []
for (min_len, max_len), count in size_distribution:
    log_entries += [(min_len, max_len)] * count

start_time = datetime.now()

# ======== ログ出力 ========

with open(output_file, "w", encoding="utf-8") as f:
    for i, (min_len, max_len) in enumerate(log_entries):
        timestamp = (start_time + timedelta(seconds=i)).strftime("%Y-%m-%d %H:%M:%S")
        ip = random.choice(ip_list)
        priority = random.choice(priorities)
        app = random.choice(app_names)
        msg_len = random.randint(min_len, max_len)
        message = ''.join(random.choices(string.ascii_letters + string.digits, k=msg_len))

        line = f"{timestamp} {ip} {priority} {app} {message}"
        f.write(line + "\n")

print(f"ログ出力完了: {output_file}（{len(log_entries)}件）")
```

## ログの出力例
```python
 $ python loggen.py
ログ出力完了: sample_log.txt（10件）

$ cat sample_log.txt
2025-06-02 20:38:00 172.16.5.23 WARN payment 1nlWJdXK4yV4LTPiJAycaGjeEHG8X
2025-06-02 20:38:01 192.168.0.10 INFO payment R1GITPCDSnOFg1OFtvStq0TZF8rM
2025-06-02 20:38:02 172.16.5.23 WARN payment 4wVgF8IrNMtYQ6TF4NrIAjvuxrA912riN
...
```
2025年 Windows Insiders メモ帳がMarkdown対応！するとのこと

# Windows Insiders メモ帳 Markdown対応
新しいアップデートは、メモ帳に軽量書式設定機能を導入し、ファイル全体のコンテンツをより柔軟に構造化できるようになるようです

直接操作したいユーザー向けに、Markdown形式の入力とファイルをサポートしています。
新しい書式設定ツールバーを使って、入力時または選択したテキストに太字や斜体のスタイル、ハイパーリンク、シンプルなリストや見出しなどの書式設定を適用できるようですね

https://ameblo.jp/mojeld/entry-12907993626.html

https://blogs.windows.com/windows-insider/2025/05/30/text-formatting-in-notepad-begin-rolling-out-to-windows-insiders/
Asagi-VLMをggufに変換する手順

　Asagi-VLMは日本語に特化したオープンなVision&Languageモデル（VLM）で、出力物の利用に制限のあるLLM（GPT-4oなど）を合成プロセスにおいて使用していないという利点があり、2.3B、4.2B、7.8B、14.2Bの複数モデルがあります。日本語対応のVLMは貴重なモデルなので色々試してみようと思ったのですが、GGUF化されたモデルが見当たらなかった為（MLX-VLM等への変換も失敗しました）、GGUF化を自力でやってみた手順を紹介します。
 
 https://uehara-mech.github.io/asagi-vlm?v=1
 

 # １.GGUF化の準備

 　Llama.cppを使うので下記等を参考にインストーします。

  https://qiita.com/suzukiyukizi/items/955660a7f44be1da2581

  AsagiのモデルをLlama.cpp直下のmodelフォルダにダウンロードしておきます。

  https://huggingface.co/MIL-UT/Asagi-2B

  　AsagiはLLMにllm-jp-3を、画像系にはGoogle/Siglipを使っており、変換処理に必要なllm-jp-3用のtokenizer.model(「llm-jp-tokenizer-100k.ver3.0b1.model」)をmodelフォルダにダウンロードしておきます。
  
  https://note.com/npaka/n/n3e99d2a45a4b

  https://github.com/llm-jp/llm-jp-tokenizer/tree/main/models/ver3.0


# ２. 手順　①
 　Llama.cppのGithubにあるLlava用の[公式手順](https://github.com/ggml-org/llama.cpp/blob/master/docs/multimodal/llava.md)ではうまく行かなかったので、詳しく解説します。
まず最初にLlama.cppのtools/mtmd/llava_surgery_v2.pyを使って元のモデルからprojectorとclipを取り出します（llava_surgery.pyはpytorch_model.bin専用で、model.safetensorsには未対応らしい）。



 ``` 
python tools/mtmd/llava_surgery_v2.py -C -m {Path to your Asagi model}
 ``` 
　正常に動作すればモデルフォルダ内にllava.clipとllava.projectorの2つのファイルが生成されますので、llava.clipをpytorch_model.binに名前を変更します。


 # ３. 手順　②
 　次に下記コマンドでimage_encoderをGGUFに変換します。

 ``` 
python convert_image_encoder_to_gguf.py -m {Path to your Asagi model} --llava-projector {Path to your Asagi model}/llava.projector --output-dir {Path to your Asagi model} --clip-model-is-siglip
 ``` 

　公式の説明はsiglip前提の記載になっていない為、最後のargsが--clip-model-is-visionになっており、かなりエラーで悩まされましたが上記でうまくいくはずです。また、この処理でconfig.jsonの各パラメータを参照しており、公式のように他からconfig.jsonを持ってくると失敗する可能性大ですので、Asagiの元のconfig.jsonをそのまま使えば上手くいくはずです。もしエラー等が出る場合は、下記のgoogle/siglip2-so400m-patch14-384のconfig.jsonを使う方法もありますが、この場合はパラメータを追加する必要がありました（"layer_norm_eps": 1e-06と、"hidden_act": "gelu_pytorch_tanh"）。

 https://huggingface.co/google/siglip2-so400m-patch14-384

# ４. 手順　③

　最後にLLM部分のGGUF化をしますが、準備に記載した通り予めtokenizer.modelを同じフォルダに配置しておいて下さい（無い場合はエラーが出ます）。公式ではconvert_legacy_llama.pyを使うようになってますがエラーで失敗するので、下記のように最初からconvert_hf_to_gguf.pyで普通に実行します。

 ```
python convert_hf_to_gguf.py {Path to your Asagi model}
 ```
  
　これでLLMのGGUF化が完了しました。Ollamaで利用する場合はModelfileにllmとmmprojの両方のGGUFファイルをFROMで読み込んで使います。

``` Modelfile_asagi   のサンプル.
FROM ./model/asagi-1.9B-F16.gguf
FROM ./model/mmproj-model-f16.gguf
　　　　　・・・・・
```

　最後にOllamaでcreateしてrunで実行します。

  ```
ollama create {Ollamaのモデル名}　-f Modelfile_asagi (量子化したい場合は’-q q4_K_M’を付与)

ollama run {Ollamaのモデル名}　
 ```
 
 # ５.　まとめ
 　今回はAsagi-VLMのGGUF化の手順を紹介させてもらいました。日本語対応のビジョン系モデルが盛り上がって行くことに少しでも手助けになれば幸いです。BF16のGGUFファイルは下記にアップロードしてありますので、良かったら使ってみて下さい。

https://huggingface.co/aipib/Asagi-vlm-gguf