OmniAICreator/Qiita-1.07M huggingface dataset:
【Android×Google Calendar】APIキーだけで日本の祝日を取得するまでの道のり.md

# 【Android×Google Calendar】APIキーだけで日本の祝日を取得するまでの道のり

## はじめに
Androidアプリ開発初心者がGoogle Calendar API の扱いでハマったので、その顛末と解決方法を共有します。

- **やりたいこと**  
  - Google が提供する「日本の祝日」カレンダー（`ja.japanese.official#holiday@group.v.calendar.google.com`）から祝日情報を取得  
  - OAuth2 認証は不要。API キーだけでシンプルに実装したい

## ハマりポイント
1. 公式の QuickstartにはKotlinのサンプルがない＋ユーザー認証込みのサンプルしかない（Java×OAuth2を参照）
2. Retrofit2 で叩く案も検討したが、レスポンスのデータモデル定義が煩雑で断念  
(データモデル定義を明示的にしなくてもいい方法があるのであれば誰か教えてください。)
3. 公式ライブラリを「API キーのみ」で動かす方法がWebで見つけられない

## 解決のポイント
- Google の提供するクライアントライブラリで認証不要ならBuilder()の認証情報（Credential）を `null` にすればいい。
- events().list(`ja.japanese.official#holiday@group.v.calendar.google.com`) のようにカレンダーIDを指定できる。

## 実装
```kotlin 
  import com.google.api.client.http.javanet.NetHttpTransport
  import com.google.api.client.json.gson.GsonFactory
  import com.google.api.services.calendar.Calendar

  // アクセスするカレンダーIDを定数として定義
  companion object {
      private const val CALENDAR_ID = "ja.japanese.official#holiday@group.v.calendar.google.com"
  }

  private val transport = NetHttpTransport()
  private val jsonFactory = GsonFactory.getDefaultInstance()

  private val calendar = Calendar.Builder(transport, jsonFactory, null)
    .setApplicationName(BuildConfig.APPLICATION_ID)
    .build()

  val events = calendar.events().list(CALENDAR_ID)
      .setKey(BuildConfig.GOOGLE_API_KEY) // APIキーを指定
      .setTimeMin(timeMin)
      .setTimeMax(timeMax)
      .setOrderBy("startTime")
      .setSingleEvents(true)
      .execute()
```

## 開発環境
- Kotlin: 2.0.0
- Android Studio: Ladybug Feature Drop | 2024.2.2 Patch 2
- minSdk: 24
- targetSdk: 35
- 使用ライブラリ:  
  - com.google.api-client:google-api-client-android:2.0.0 
  - com.google.apis:google-api-services-calendar:v3-rev20220715-2.0.0

## おわりに
初めての Android アプリで Google Calendar を扱うのは結構大変でしたが、  
公式ライブラリ＋API キーだけでも祝日取得できるということがわかってスッキリしました。  
この記事が、同じところで詰まっている誰かの助けになれば幸いです。  

[GCP 側の API Key 制限やセキュリティ設定については別記事でにします。](https://qiita.com/taku0018/items/13f4127962bed9e1094e)

## 参考
[GoogleCalendarAPIの日本の祝日が国民の祝日以外も祝日扱いするようになった件](https://zenn.dev/gomo/articles/2ff8501f7afaff)
[Google Calendar API クイックスタート](https://developers.google.com/workspace/calendar/api/quickstart/java?hl=ja)
【JPA】getSingleResult()を使わず、getResultList().get(0) を使う理由とは？

## はじめに

JPAを使っていると、1件だけデータを取得したい場面で

```java
query.getSingleResult()
```

ではなく、

```java
query.getResultList().get(0)
```

というコードを見かけることがあります。

「**getSingleResult() という便利なメソッドがあるのに、なぜあえて getResultList() を使うの？**」  
そんな疑問から、両者の違いと使い分けについてまとめてみました。

## それぞれの特徴

### getSingleResult()

- 戻り値：`Object`（もしくはクエリの型に応じた型）
- 想定：**結果が1件ちょうどであること**
- 主な例外：
  - `NoResultException`（結果が0件）
  - `NonUniqueResultException`（結果が2件以上）

```java
try {
    Object result = query.getSingleResult();
} catch (NoResultException | NonUniqueResultException e) {
    // 例外処理
}
```

※ **注意点**  
例外が発生しやすく、「1件しか返らない」ことが保証されていないと使いにくい。



### getResultList()

- 戻り値：`List<Object>`
- 想定：**結果が0件、1件、複数件のどれでもOK**
- 主な例外：特になし（SQLエラーなどの根本的な問題以外）

```java
List<Object> results = query.getResultList();
if (!results.isEmpty()) {
    Object first = results.get(0);
}
```

☑️ **メリット**
- 柔軟性が高く、例外処理がいらない
- 複数件返ってもとりあえず1件目を取得できる


## なぜ getResultList().get(0) を使うのか？

`getSingleResult()` を使うと、結果が0件や複数件でも**すぐ例外になる**ため、現場では敬遠されがちです。

一方で `getResultList()` は以下のようなメリットがあります。

| 比較項目 | getSingleResult() | getResultList().get(0) |
|----------|-------------------|--------------------------|
| 0件の場合 | `NoResultException` | `IndexOutOfBoundsException`（※） |
| 複数件の場合 | `NonUniqueResultException` | OK（先頭のみ取得） |
| 柔軟性 | 低い | 高い |
| 使いやすさ | 例外処理が必須 | 結果チェックで対応可能 |

※ `getResultList().get(0)` の場合も、リストが空なら `IndexOutOfBoundsException` が起きるので注意！


## 実務での使い分け指針
#### getSingleResult() を使うべきケース
- テーブル定義やロジック的に 絶対に1件返る ことが保証されている
- 例外を明確にハンドリングしたい（意図的に NoResultException を使いたい 等）

#### getResultList() を使うべきケース
- 0件や複数件返る可能性 がある
- データ件数に柔軟に対応したい
- 例外処理を避けたい or 面倒な try-catch を書きたくない


## おわりに

今回は、SELECT結果を取得する2つのメソッドの違いと用法について調べてみました。
`getSingleResult()`を使用しないで`getResultList().get(0)`を使用する理由について、理解していただけましたでしょうか。
私と同じ疑問を抱いた人の解消記事となっていただければ幸いです。
Vue.js と PDF-lib を使ったPDF生成の方法

皆さん、こんにちは。

今回は「`Vue.js`と`PDF-lib`を使ったPDF生成の方法」について紹介させていただきます。

Web アプリケーションで `PDF`を動的に生成するニーズは多くのプロジェクトで発生します。
例えば、レポート、請求書、ユーザーのデータをまとめたPDFファイルなどを自動で作成する場合です。今回は、`Vue.js`と`PDF-lib`ライブラリを使って、シンプルな PDFファイルを生成する方法を紹介します。

# 必要な準備

## Vue.js のインストール
最初に、Vue プロジェクトをセットアップします。まだ Vue プロジェクトがない場合は、以下のコマンドで作成できます。

```
vue create pdf-generator
cd pdf-generator
```

## `PDF-lib`のインストール
PDF を操作するためのライブラリである`PDF-lib`をインストールします。ターミナルで以下を実行してください。

```
npm install pdf-lib
```

# Vue コンポーネントの作成

次に、Vue コンポーネントを作成し、`PDF`を生成するためのコードを記述します。

```vue
<template>
  <div>
    <button @click="generatePdf">PDFを生成</button>
  </div>
</template>

<script setup>
import { PDFDocument, StandardFonts, rgb } from 'pdf-lib';

const generatePdf = async () => {
  // 新規PDFドキュメントを作成
  const pdfDoc = await PDFDocument.create();
  // ページ追加 (幅600px, 高さ400px)
  const page = pdfDoc.addPage([600, 400]);

  // フォントを埋め込み
  const timesRomanFont = await pdfDoc.embedFont(StandardFonts.TimesRoman);

  // ページサイズ取得
  const { width, height } = page.getSize();
  const fontSize = 24;

  // テキストを描画
  page.drawText('こんにちは、PDF-lib!', {
    x: 50,
    y: height - 4 * fontSize,
    size: fontSize,
    font: timesRomanFont,
    color: rgb(0, 0.53, 0.71),
  });

  // PDFをバイナリとして保存
  const pdfBytes = await pdfDoc.save();
  // Blob生成 & ダウンロードリンク作成
  const blob = new Blob([pdfBytes], { type: 'application/pdf' });
  const link = document.createElement('a');
  link.href = URL.createObjectURL(blob);
  link.download = 'sample.pdf';
  document.body.appendChild(link);
  link.click();
  document.body.removeChild(link);
};
</script>

<style scoped>
button {
  padding: 8px 16px;
  border: none;
  background-color: #42b983;
  color: white;
  border-radius: 4px;
  cursor: pointer;
}
button:hover {
  background-color: #38a174;
}
</style>
```

## コード解説

1. `PDFDocument.create()`
新しい空の`PDF`ドキュメントを作成します。このドキュメントにページや内容を追加していきます。

2. `addPage([width, height])`
新しいページを追加します。このページのサイズは [幅, 高さ] の配列で指定します。今回は幅 600px、高さ 400px に設定しています。

3. `embedFont(StandardFonts.TimesRoman)`
埋め込むフォントを指定します。ここでは、標準フォントの「Times Roman」を使用しています。

4. `drawText()`
指定した位置にテキストを描画します。x と y で位置を指定し、フォントサイズや色を設定します。

5. `save()`
PDF ドキュメントをバイナリ形式で保存します。このバイナリデータを使って、PDF をダウンロードできるようにします。

6. `ダウンロードリンクの生成`
ブラウザで PDF をダウンロードするために、Blob オブジェクトを作成し、仮想的なリンクを生成して自動的にクリックします。

# 実行結果

この`Vue`コンポーネントをブラウザで表示し、「PDFを生成」ボタンをクリックすると、以下のような操作が行われます：

- 新しい`PDF`ドキュメントが作成され、指定したテキストがページに描画されます。
- `PDF`が生成された後、ブラウザは自動的にダウンロードリンクを作成し、ユーザーに PDF をダウンロードさせます。

`Vue.js`と`PDF-lib`を使うことで、クライアントサイドで簡単に PDF を生成できることがわかりました。この方法は、動的にデータをまとめて PDF として出力したい場合に非常に便利です。また、PDF-lib は画像の埋め込みやフォームフィールドの操作など、多くの機能を提供しているため、さらにカスタマイズすることも可能です。

今日は以上です。

ありがとうございました。
よろしくお願いいたします。
Vertex AI でシステム仕様理解ボットを作ってみた

# はじめに

こんにちは！
サッカー選手から転身してSEをしている[@よしき](https://x.com/YoshikiSasajima/)です！

この記事では、Google CloudのVertex AI Agent Builderを使って、ノーコードで作れる「仕様書理解ボット」の構築方法を解説します。

# 背景
受託開発や社内SE業務において、既存機能の改修を行う際に「そもそもこのシステムってどんな機能があったっけ？」「今回の仕様変更に必要な修正箇所はどこだ？」と、設計書や過去資料を延々と読み返す作業に時間を取られることはありませんか？

僕もそんな状況に何度も直面してきました。

* 設計書を開いても、どのファイルに何が書いてあるのか探すのに時間がかかる
* コードと設計書がズレていて、結局人に聞くしかない
* ナレッジが点在していて活用されていない

そんな課題を解決する手段として、「設計書とプログラムを学習したAIボット」があれば最強なのでは？と考えました。

究極的には「こんなふうに仕様変更したい」と伝えると、「ここをこう改修したら実現できます」と返してくれたり、「過去に似た案件あったっけ？」と聞けば「XXの案件で似たような機能があったよ」と教えてくれるような、社内ナレッジを集約するAIボットが作れたら最高！

まずその第一歩として、今回は **Vertex AI Agent Builder(AI Aplications)を使って、仕様書（設計書）を読み込んで質問に答えるBot** をノーコードで構築してみた記録をまとめます。

https://cloud.google.com/products/agent-builder?hl=ja

# 参考
https://codelabs.developers.google.com/devsite/codelabs/building-ai-agents-vertexai?hl=ja&utm_source=chatgpt.com#2

# 作ったもの
受託開発の設計書の文脈を理解し、問いかけると該当部分を引用して回答してくれるチャットボット
技術構成 : Vertex AI Agent Builder + Cloud Storage

# 課題
### Google Driveが使えない問題

今回は個人のGCPライセンスを使用したため、Agent BuilderからGoogle Driveを直接参照することはできません。
そのため、設計書をCloud Storageに配置することで代替しました。


# 実装手順

### 1. Cloud Storage バケットの作成と設計書のアップロード

* GCPコンソールから Cloud Storage を開き、新しいバケットを作成
* 設計書（ExcelやPDFなど）をこのバケットにアップロード

![スクリーンショット 2025-04-25 23.47.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1256101/75aa7231-b20e-48e3-99c6-de35d1972e89.png)

https://cloud.google.com/storage?hl=ja


### 2. Vertex AI の「AI Application」でアプリ作成

* 「AI Application」 セクション内の「アプリを作成する」から新規アプリを作成
* 作成時にアップロードした Cloud Storage のフォルダをデータソースとして紐付け

![スクリーンショット 2025-04-25 23.49.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1256101/2cf64f5b-6fb0-444f-81c2-e439593ecba9.png)


https://cloud.google.com/generative-ai-app-builder/docs/introduction?hl=ja



# 実際にBotに質問してみた

![スクリーンショット 2025-04-26 0.07.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1256101/b6cf2893-bd68-49b3-a5e7-9bdb2a7a337f.png)

おぉ！どのドキュメントからの回答なのかも明示してくれてる！

![スクリーンショット 2025-04-26 0.13.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1256101/3ac6ae13-c502-4b2b-b71f-6987d108239d.png)

設計書のExcelをきちんと読み込んで理解している！


# まとめ
* 設計書や仕様書のナレッジボットは、社内情報を活かす鍵になりそう
* シンプルなBotならAgent Builderを活用すれば、ノーコードで実現可能
* 個人用GCP環境でも、Cloud Storageと組み合わせれば構築できる

今後はGitHubのコードも連携し、「仕様とコードの橋渡し」をするBotに拡張したい！！
以上！ありがとうございました！！
045 AI屋さんの　ペンフレンドは　LLMにトークン全文入力　外部連携



045 AI屋さんの　ペンフレンドは　LLMにトークン全文入力　外部連携

早速、外部連携してもらいましょう。

まずは、メールの受信・送信をお任せしてみます。
お客様からの問い合わせ窓口　くらいにはすぐに使えそうです。

　メール受信
　　→　LLM（全文入力済み）
　　→　添付ファイル
　　→　OCR　
　　→　受注処理　
　　→　・・・　
　　→　メール返信　

キャラ付けした、LLMからのメールは
お客様の心も潤してくれます。




![スクリーンショット 2025-04-25 23.31.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237930/47d59015-5e35-4d63-8ff8-756b97be0de2.png)




メールの内容を、LLMで解析するので
大概のお問い合わせは、対応可能です。
２４時間３６５日、土日祝日、年中無休で
カスタム対応の文章が
秒でメールの返信が返ってくるので、
お客様も、相手がLLMと分かっていても　びっくりします。

また、添付ファイルを　OCR処理できるので
注文書の内容を、読み取って受注処理も可能です。
金銭が関わる処理は、与信管理などの承認フローも必要です。

ほぼ、人間同等の業務を期待できます。




![スクリーンショット 2025-04-25 23.51.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237930/0fcb1686-7c72-4a59-9f14-5c3b6e5f9641.png)




目次

https://qiita.com/bono0/items/dc1d000c98af7e07c9a7


この時代に、文通友達って　意味が通じるか心配ですが、

今回も、無事に
　045 AI屋さんの　ペンフレンドは　LLMにトークン全文入力　外部連携
完成です、おめでとうございます。








ー以上ー
Veo 2 を体験してみよう

### Veo 2 を使いたい
今年の Google の年次基幹イベントの Google Cloud Next 25 では、合計で 229 の項目が発表されたとのことでした。非常に多いですね。今年も AI 関連の発表の多さが印象的でした。

https://cloud.google.com/blog/topics/google-cloud-next/google-cloud-next-2025-wrap-up

発表の中で、私が特に気になったものの一つは Veo 2 です。なぜ Veo 2 なのかというと、Keynote の冒頭のカウントダウンクロックが Veo 2 で作られていて（ビデオ参照）、これがよくできていて興味を惹かれたというのもありますが、

https://youtu.be/Md4Fs-Zc3tg

Veo 2 の機能の中で特に使ってみたい機能があって、それは参照用の画像からビデオを生成する機能（image to video）です。画像が動き出す、あのなんとも不思議な感覚を自ら試してみたいと思いました。

早速、Google Cloud コンソールの Media Studio を覗いてみましたが、Veo 2 は使えるようになっているものの、テキストからビデオを生成する機能 (text to video) のみが開放されており、image to video は見つかりませんでした。残念です。

![try_veo2_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1602803/5b0fb5dc-f017-449d-b4c2-2aa0a76172a2.png)

Media Studio (Vertex AI)では、image to video など Veo 2 の新機能は、許可された者だけが使える限定アクセスとなっているようです。

https://cloud.google.com/blog/products/ai-machine-learning/expanding-generative-media-for-enterprise-on-vertex-ai

新機能が GA されるまで待つしかないかな、と諦めかけたその時、Google AI Studio の画面を見ると左側の枠に、<B> Video Gen</B> というボタン (?) が表示されていることに気がつきました。Google AI Studio で Veo が使えるようになったんか？と心でつぶやきながらボタンを押してみると、本当に Veo でビデオ生成する画面が出てきました！テキストプロンプトと実行ボタンの間に画像を参照するボタンもあり、使いたかった image to video もどうやら使えそうです。

![try_veo2_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1602803/74c06d1c-1e58-4a29-9531-0f8b0a5c7f01.png)

### Veo 2 の image to video を試す

ということで、Veo 2 のimage to video を試してみました。

まずはプロンプトにイメージを追加します。今回はサンプルギャラリーから列車の画像を選びました。次に、テキストプロンプトに "A train is running on the tracks" （列車が線路の上を走っている）と入力しました。最後に Run ボタンを押して生成です。実行してから大体 50 秒ぐらい待つと動画が生成されました。

![try_veo2_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1602803/047e05a2-cb01-4391-ac88-11fc69cef2d9.png)

列車がゆっくりと線路の上を走る動画が生成できました！

注意点としては、１日に生成できる回数が決まっているらしく、数回生成を繰り返すと、今日は上限に達したから明日やってくれ、みたいなエラーメッセージが出ました。

![try_veo2_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1602803/72b64435-5a51-404e-ba7b-b487e4a8fcbc.png)

ちなみに、2025年４月15日のディベロッパー向けのGoogleの公式のブログによると、Veo 2 は Google AI Studio でお試しで使えるようになったとのことです。一方、Gemini API での使用は有料のようです。高額課金に注意ですね…。

https://developers.googleblog.com/en/veo-2-video-generation-now-generally-available/

Vertex AI の Veo の価格は、以下のページによると 1 秒間あたり 0.5ドルとのことです。

https://cloud.google.com/vertex-ai/generative-ai/pricing

### まとめ
Google AI Studio で Veo 2 を体験できました。生成結果については今後に期待する面もあるかもしれませんが、 Google へのフィードバックができますので、Google AI Studio での体験とフィードバックを通じて、みんなで製品をよりよくしていきましょう。
【CSS】:last-childの使い方

`:last-child`は、親要素の最後の子要素を選択します。任意の要素タイプに適用できます。

### 使用例

```css
/* 親要素の最後の子要素にスタイルを適用 */
.parent > :last-child {
  background-color: #f0f0f0;
}
```

```html
<div class="parent">
  <p>最初の段落</p>
  <p>最後の段落</p>
</div>
```

この例では、`div.parent`の最後の`<p>`要素に背景色が適用されます。
個人的備忘録：Next.js設定ファイル（next.config.ts）の理解を深めるために整理してみた

## はじめに

Next.js プロジェクトでは、`next.config.ts` というファイルに設定を書きます。
今回は、基本のテンプレートになっている下記の内容を解説します。

```typescript
import type { NextConfig } from "next";

const nextConfig: NextConfig = {
  /* config options here */
};

export default nextConfig;
```

***個人の備忘録程度の走り書きとなっておりますが、温かい目で見守っていただければ幸いです。***

**実際のファイルについて**

https://github.com/2025SpringTeamA/frontend/blob/main/next.config.ts

---

## 1. `import type { NextConfig } from "next";`

- Next.jsの標準タイプ **`NextConfig`** をインポートしています。
- ここでは "type" だけをインポートしているので、実行時には消えます。
- "設定オブジェクトの形をNext.jsの規則に合わせる"ための仕掛けです。

---

## 2. `const nextConfig: NextConfig = { /* config options here */ };`

- `nextConfig`という **定数** を作成しています。
- その型をさっきの `NextConfig`にしています。
- 今はまだ空ですが、ここに各種設定を書き込んでいきます。

### 例：よく使うオプション
```typescript
const nextConfig: NextConfig = {
  reactStrictMode: true,  // ReactのStrictModeを有効化
  images: {
    domains: ['example.com'],  // 画像を許可するドメイン
  },
};
```

---

## 3. `export default nextConfig;`

- 最後に、この `nextConfig` を **外部で使えるようエクスポート** しています。
- Next.js本体が読み込めるようになり、ビルドや起動に適用されます。

---

## まとめ

この `next.config.ts`は：

- Next.jsの設定を
- 正しい型 (NextConfig) に合わせて
- 外部に提供する

ための「テンプレート」のようなものです。

今は空のままですが、ここに設定を追加することで自分のNext.jsアプリをカスタマイズできるようになります！
VSCode で簡単に FileSystem MCP を インストールできたのネ！？

# 背景

FileSystem MCP を入れる際に、勘違いが二つほどあったので、躓き記録として残しておく

##  Claude For Desktop が必要だと思ってた

以下オフィシャルから飛ぶと

https://github.com/modelcontextprotocol/servers?tab=readme-ov-file#-reference-servers

ここに来るわけだが・・

https://github.com/modelcontextprotocol/servers/tree/main/src/filesystem

初っ端に、claude_desktop_config.json にってなってたら勘違いしませんかね？ :thinking: 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/d14cb5eb-a57d-4bc5-b0bc-e0772a19f3eb.png)


## 公式じゃないやつを入れた

で、Claude For Desktop なんて入れられねーと思ったので、他を探して以下を入れた

https://github.com/mark3labs/mcp-filesystem-server

開発者は、草生えまくりエンジニアなので、たぶん大丈夫なんだけど、コード確認しないとやっぱり会社では使いにくいなと・・ :sweat: 

https://github.com/ezynda3

https://www.edzynda.com/


# 簡単な入れ方

## 前提

- npm

これは用意しておかないといけないとは思うので、`windows` なら、Node Version Manager で入れておくのが楽

https://github.com/nvm-sh/nvm

## 手順

### 1. mcp.json を用意する

プロジェクトの直下に `.vscode` フォルダを作成して、`mcp.json` を作成する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/3f8f27fc-d6fa-49a0-b010-0b72ac31d99b.png)

### 2. mcp.json が開かれたら、`Add Server` を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/18f12140-d0b3-4a2b-94b2-6699374dc9f4.png)

### 3. `NPM Package` を選択して、`@modelcontextprotocol/server-filesystem` を指定

```powershell: npm package name
@modelcontextprotocol/server-filesystem
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/a97d0177-8885-41aa-8734-27f6585bad82.png)

### 4. `ServerID` を入れる。

デフォルトのままで困るなら修正を

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/3fa74797-3a69-4fb3-be2a-d0d592e8772b.png)

### 5. あとは、適当なパスを追加して、完了

すると、こんな感じで設定される筈。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/8b985c35-2a5f-4310-99a3-7d08bdc437dd.png)

:::note warn
パスの入力は、VS Code で `パスのコピー` で取得して渡せば OK
勝手に、バックスラッシュエスケープつけて設定されます。
:::

### 6. あとは起動して、Copilot Agent で使えるか確認しておわり

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/be227610-fa05-48e3-a4e3-6158f9ea2c68.png)

ここから起動して、パスとかでエラーがあれば修正

エラー確認は、`出力(Output)` ウィンドウで
※CTRL + SHIFT + U で

# あとがき

なんというか、最近はほんとに簡単に使えるように色々開発してくれていて頭が下がります

最近感動した VS Code まわり

- VS Code の Web Documents のリンクから、Local の対象設定へ飛べる。
    - 調べて開く手間がなくなったのはとてもありがたい
- Agent の MCP 設定のとこから、他のMCP Tool も簡単に入れられる
    - 拡張機能を探して入れるだけ、とか、もう誰でもやれますね :laughing: 
- 今回の `Add Server` も

こういう `UX` を開発できる人になりたいものですね
Windows11の環境でllama-cpp-pythonをGPU対応でビルドするまでにハマった話

こんにちは。  
今回は **Windows環境で「llama-cpp-python」をGPU（CUDA）対応でビルドする** までにハマったポイントをまとめます。  
同じように苦しむ人が減るといいなと思って書きます！

---
## 背景
友人からYoutubeのURLを入力すれば文字起こしができるアプリを作ってほしいという依頼にこたえる形で開発を始めました。

1.YouTubeから音声(m4a)だけダウンロード
（yt_dlp使用）

2.ffmpegで音声をWAVに変換
（Whisper用に16kHz・PCM形式へ）

3.Whisperで文字起こし
（英語・日本語どちらでもOK）

4.Llama.cppモデルを使って句読点を自動挿入
（LLMに整形してもらう）

5.テキストファイルに保存

今回この4番の環境構築でめんどくさいことになってしまったので共有します。

---

## まず普通にインストールしようとしたら失敗

```bash
pip install llama-cpp-python
```

→ CPU版でしか動かない！

GPU使うには**CMakeオプション付きビルド**が必要と知る。

---

## 🛠 Visual Studio周りの地獄

### `cl.exe` がないエラー

```powershell
cl.exe : 用語 'cl.exe' は認識されません。
```

### 解決方法

- Visual Studio 2022 Community版インストール
- 「C++によるデスクトップ開発」ワークロードを選択
- 以後、**「x64 Native Tools Command Prompt for VS 2022」**から作業する！

---

## x64 Developerコンソールでやったこと

まずコンソールを「管理者権限」で開いて、以下を実施！

```cmd
cd C:\Users\ユーザ名\Documents\tool\AudioToText
.\venv311\Scripts\activate
cd llama-cpp-python

:: TEMPパスを短縮
set TEMP=C:\temp
set TMP=C:\temp

:: CUDA有効ビルドオプション
set CMAKE_ARGS=-DGGML_CUDA=on

:: 再インストール＆ビルド
pip install . --force-reinstall --no-binary :all:
```

---

## ハマったエラーたち

### `temp`が長すぎると発生するエラー

```text
LINK : fatal error LNK1104: ファイル 'build\temp.win-amd64-cpython-311\Release\xxx.exp' を開くことができません。
```

これ、Tempのパスが長いのが原因でした。
  
→ `TEMP=C:\temp` に変えたら回避できた！

---

### CUDAオプションを間違えると発生するエラー

```text
CMake Error at vendor/llama.cpp/CMakeLists.txt:107 (message):
  LLAMA_CUBLAS is deprecated and will be removed in the future.
  Use GGML_CUDA instead
```

→ 正しくは `GGML_CUDA=on` を指定すること！

---

## 最終的なビルドログのイメージ

```text
Building wheel for llama_cpp_python (pyproject.toml) ... done
Successfully built llama_cpp_python
Installing collected packages: llama_cpp_python
Successfully installed llama_cpp_python-0.3.8
```

ここまでいけば、GPU版ビルド成功！！

---

## まとめ表

| 問題 | 対策 |
|:----|:----|
| `cl.exe`がない | Visual Studio 2022 C++開発環境導入 |
| LNK1104 Tempエラー | `TEMP=C:\temp` に変更する |
| CUDAオプションミス | `GGML_CUDA=on` に正しく設定 |
| CPUビルドになってしまう | `--no-binary :all:` を使ってソースからビルド |

---

## 感想

- Linuxなら数分だった…
- WSL2は重いから使いたくなかった
- 苦労したけど**GPUは爆速**で動いて大満足！

---

#  最後に

 Visual Studioは**Build Tools**も忘れずに入れる  
 TEMPを短縮するだけでLNK1104は回避できる  
 CUDAオプションは`GGML_CUDA=on`！！
Unity Mobile NotificationsでiOS/Android両対応通知を共通化する方法（v2.4.0対応）

Unity公式のMobile Notificationsパッケージ（v2.4.0）を使って、  
**iOSとAndroidで共通コードベースの通知処理を実装する方法**をまとめました。

端末ごとの制約や落とし穴（特にiOSのカスタムサウンド）についても解説しています。

---

## 環境・使用パッケージ

- Unity 2022.3 LTS
- Mobile Notifications `com.unity.mobile.notifications@2.4.0`

---

## Android側の通知処理

### 通知チャンネル登録

```csharp
var channel = new AndroidNotificationChannel()
{
    Id = "default_channel",
    Name = "Default Channel",
    Importance = Importance.Default,
    Description = "Generic notifications",
};
AndroidNotificationCenter.RegisterNotificationChannel(channel);
```
通知送信
```csharp
var notification = new AndroidNotification();
notification.Title = "お知らせ";
notification.Text = "〇〇の時間です";
notification.FireTime = DateTime.Now.AddSeconds(10);
notification.SmallIcon = "icon_01";
AndroidNotificationCenter.SendNotification(notification, "default_channel");
```

カスタムサウンド
res/raw/customsound.ogg を用意

以下のように設定：

```csharp
notification.Sound = "customsound";
```
### iOS側の通知処理
通知送信
```csharp
var notification = new iOSNotification();
notification.Identifier = "notify_01";
notification.Title = "お知らせ";
notification.Body = "〇〇の時間です";
notification.ShowInForeground = true;
notification.Sound = new iOSNotificationSound() { Name = "customsound.caf" };
iOSNotificationCenter.ScheduleNotification(notification);
```
### 注意点
customsound.caf は Assets/Plugins/iOS/ に配置

拡張子付きで指定する必要あり（例：customsound.caf）

### PostProcessBuildでiOS設定を自動化
```csharp
[PostProcessBuild]
public static void OnPostProcess(BuildTarget target, string pathToBuiltProject)
{
    if (target == BuildTarget.iOS)
    {
        var plistPath = Path.Combine(pathToBuiltProject, "Info.plist");
        var plist = new PlistDocument();
        plist.ReadFromFile(plistPath);

        var rootDict = plist.root;
        var bgModes = rootDict.CreateArray("UIBackgroundModes");
        bgModes.AddString("remote-notification");

        File.WriteAllText(plistPath, plist.WriteToString());
    }
}
```
### 共通化の実装方針
プラットフォームごとに処理を分け、トリガーは共通関数で管理：

```csharp
public void ScheduleLocalNotification()
{
#if UNITY_ANDROID
    SendAndroidNotification();
#elif UNITY_IOS
    SendIOSNotification();
#endif
}
```
### まとめ
Unity Mobile Notificationsで通知は両OS対応できる

Android：通知チャンネル＋res/rawの設定

iOS：caf形式の音声＋PostProcessBuildで自動化

#if UNITY_XXX で処理を明確に分離するのがベスト

ブログでもUnityや個人開発ネタを発信中です！
開発ノウハウやアプリ制作過程、Unity連携系のハマりポイントなど
より深掘りした内容をブログにまとめています。
▶ https://syunpp.com

公開中のアプリ一覧はこちら！
実際にUnityで開発してリリース済みのアプリ一覧をまとめています。
▶ https://syunpp.com/公開中のアプリ一覧/
公開鍵認証でエラー：receive packet type 51

## はじめに
公開鍵認証に詰まったので備忘録として記載

公開鍵認証は接続元に秘密鍵、接続先に公開鍵を置くことで認証ができる仕組み
そのため、対応した鍵をきちんと取り扱える状態にしておくことが大事

## 共通
・鍵やその鍵を配置するディレクトリのパーミッションを見直す
・接続先の方が重要で、接続元はそこまで厳しく見ていないことも多い

## 接続元側
・公開鍵を置いたままにすると利用される
→同じ鍵名で別の秘密鍵に対応してたりすると問題がある
違う鍵名で作り直すか、不要なものは削除する
・known_hostsに自動追加されない
→known_hostsへ追加されないとエラーが出てしまうケースもあるので、手動で追加する
・-vvvをつけるとデバッグが容易になる？
→結局セキュリティ上接続エラーの詳細は接続先にしか表示されないため、あくまでおまじない程度。
どこかで区切りをつけて、接続先の設定を見直す

## 接続先側
・当たり前ですが、authorized_keysが1文字でも間違っていると、認証はエラーになる
・使いやすいエディタを面倒くさがらずいれ、確実に入力しよう
・sshd_configの設定で、公開鍵の置き場が上書きされてしまうケースがある
・接続先だからと油断せず、しっかり設定を確認する
・また設定変更後はリスタートも必要なため、忘れないこと
・ここまで確認して解決しなければ、接続先のデバックモードをON(LogLevel DEBUG)にして、ログを見る
/var/log/secureなどに出力されるはず
男女声紋識別を試してみる　CI-03T　ASRPRO

#### 初めに
CI-03T で男女声紋識別を試してみます。
#### プログラム作成
声紋認識と同じく CI-03T では容量不足となるので CI-33T として作成します。
声紋認識に比べ簡単に作成できます。

男女声紋識別するワードの指定と閾値を設定するだけです。
設定する単語は"明かりを点けて"、"明かりを消して"、"はい さくら"の３語としました。

作成された jx_ci_33t_firmware.bin ファイルをASRPRO-CORE 4M版に書込みました。

１．CT-33T として作成
![男女声紋_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4045440/924ee894-0f2b-4573-9571-fd4f363e12a9.png)
２．音声認識+男女声紋識別
![男女声紋_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4045440/b04d3e91-371c-4f75-9bcb-33818de3469b.png)
３．I/Oポート設定
![男女声紋_IO1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4045440/12cc7982-28fe-4f1a-83b3-a86ae3067bac.png)
４．男女声紋識別するワードと閾値の設定
![男女声紋_閾値1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4045440/ed15347d-0fe6-4628-98b2-bcd79fc2ac5c.png)
５．基本情報
![男女声紋_基本情報.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4045440/8d1af9a1-3852-4044-ade7-b4f112fbcfde.png)
６．コントロールの詳細
![男女声紋_コントロールの詳細.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4045440/faad49c0-2a7a-404e-813e-e9e86363a26f.png)
トリガーの設定
![男女声紋識別.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4045440/06e28137-e3aa-47be-a18c-47ac3fea34b3.png)
男声、女声識別結果で PA0 又は PA1 を2秒間点滅 
![男女声紋_cnt.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4045440/6abd105e-cd54-497a-aace-ffa51f0d2aa2.png)
#### 動作確認
声紋登録は必要なくすぐに確認できます。
VOICEVOX で男女の声を出力して確認しました。
概ね良好ですが、白上虎太郎 の声は 判別が一定しませんでした。
閾値を変更しての確認まではしていません。

![男女声紋_動作確認.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4045440/f54e2c0c-3957-4d9a-bb8e-0622df4cdcc5.png)
#### 動作確認の動画
https://youtu.be/-AwLCmHATe4

#### 最後に
この機能も声紋認識と同様に 別途 ライセンス購入が必要なようで、５分毎にリセットがかかります。
試用以外で使用される場合は、メーカーに問い合わせてください。
また、正規の CI-33T（CI-1303）を使用してください。

#### メーカーサイト
https://help.aimachip.com/docs/question/question-1fu2u6b408fn6

#### 音声認識モジュールの入手先
CI-03T （2㎜ → 2.54㎜ピッチ変換基板もあり）
https://www.aitendo.com/product-list/1259
ASRPRO  
https://ja.aliexpress.com/w/wholesale-ASRPRO.html?spm=a2g0o.home.search.0
見えないところで動くものを作った時の話

確かにあたしはSM調教師瞳シリーズの楽曲とBGMドライバを作ったの

https://qiita.com/nanakochi123456/items/4f8c8f010bc68c3a9f89

その時使ったのは汎用DOS/Vパソコン

見えないところのプログラミングするためのノウハウをおしえるの

# 今は何かしらで見ることができる

BGMドライバとか言えば、音だけの領域

更に言えばスーファミだとSPC700の中だけで動いて見えないもの

（ちゃんとしたデバッガー作れば見ようと思えば見れるんですが、手間がかかりすぎ）

サンプルドライバーはソースコードからあるので、
見よう見まねでこういったところを変更

それらを毎回毎回プリンタポートから転送して（FDD介して転送するよりは遥かにマシ）
動作確認したの

でも、まともなデバッガーがあるわけではないから
それらの作業は結構苦難

まぁ、あたしが自衛隊あがりだってことが攻したのかしらね

結構起きてることができたので、新機能追加１回に対してデバッグ地獄

今、現時点でChatGPTとかいう優秀なAIがあるけど、当時はそんなものがないどころか
ニーモニック一覧表すらない

とにかく、サンプルドライバーに書いてあることを鵜呑みにした

# 助かったのはSPC-700の命令数の少なさ

少ないから困ったこともあるけど、少ないからこそ、こんなんで
ちょちょいと書き換えられ、
新しい命令を覚える必要がなかったこともよかったと感じてる

# とにかく音だけを頼るしかなかった
音バグなら絶対音感あるからすぐに直せるけど
プログラムが暴走したら、どこを直せばいいのかわからなくなる

git とかそんなのもなかった時代に、単純に戻すには
編集ファイルのバックアップしかなかった

とにかく、プログラミングがギャンブル！

そして、一切のデバッガなしで完成したのです

# できたものがこれ
https://www.nicovideo.jp/watch/sm19611451

の、6分23秒あたりから（それ以前のは新音源に置き換えてる）
[Windows]Apple Musicの音が勝手に変わるとき

# はじめに
以前までWindowsで「iTunes for Windows」を使って音楽を聴いていたのですが、「iTunes」「Apple Music」「Apple TV」「デバイス」の4つのアプリに機能が分けられてから、「Apple Music」で音楽を聴くようになりました。

# 問題発生
「Apple Music」をしばらく使っていたら、スピーカーから流れてくる音が急に大きくなったり小さくなったりすることに気付きました。しかし、スピーカーの音量を操作したわけでもなく、音量レベルが変化しているわけでもありません。
音の変化で音楽に集中できなかったので、解決策をいろいろと試してみると、音の変化が無くなりました。

# 解決策①
主は、これで治りました。

1.「Apple Music」を開き左下のアカウントをクリック
2. アカウントアイコン右上にある歯車マークをクリック
3.「再生」をクリック
4.「音量を自動調整」をオフにする
5. おわり

# 解決策②
もし解決策①で解決しなかったら、サウンド設定に原因があるかもしれません。

1.「設定」を開く
2. 左にある「システム」をクリック
3.「サウンド」をクリック
4. 下の方にある「サウンドの詳細設定」をクリック
5. 上部の「通信」をクリック
6.「何もしない」を選択
7. おわり

# 解決策③
解決策②でも治らない場合は、これを試してみてください。

1.「設定」を開く
2. 左にある「システム」をクリック
3.「サウンド」をクリック
4. 下の方にある「サウンドの詳細設定」をクリック
5. 設定を適用したい再生デバイスを選択（主の場合「スピーカー:Realtek(R) Audio」）
6.「プロパティ」をクリック
7. 上部の「詳細」をクリック
8. 排他モードの「アプリケーションによりこのデバイスを排他的に制御できるようにする」からチェックを外す
9. おわり

# まとめ
主は解決策②③を試して解決しなかったのですが、ChatGPTに質問して提示してきた解決策①でやっと解決しました。
この記事が何かの役に立てたら幸いです。
GitHubのアカウントを取得して技術発信の準備を始めた話

## はじめに
QiitaやTerraformなどで技術記事やコード公開を行うために、まずはGitHubのアカウントを作成した記録です。画面付きで解説します。
※画面は、2025年4月現在のものになります。

## なぜGitHubアカウントが必要か？

- コード管理（Terraformなど）
- Qiitaとの連携
- ポートフォリオ構築の基盤

## ステップ1：GitHubトップページにアクセス

1. ブラウザで https://github.com/ にアクセスします
1. 「**Sign up for GitHub**」ボタンをクリックします

![step1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4071373/b266f932-e77b-416a-9bc9-e093764293aa.png)

## ステップ2：アカウント情報の入力

![step2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4071373/858d3374-cd5a-4607-baac-3ac4d45e9225.png)

以下の項目を入力し、「**Continue**」ボタンをクリックします。

|**項目**|**必須/オプション**|**内容**|
|--|--|--|
|Email|必須|GitHubの登録用メールアドレス|
|Password|必須|文字数は15文字以上、または数字と小文字を含む8文字以上|
|Username|必須|使用可能な文字は英小文字（a〜z）・数字（0〜9）・ハイフン（-）<br>ハイフン（-）は先頭・末尾には使用不可|
|Your Country/Region|必須|居住地をリストから選択<br>デフォルトで「Japan」が設定されていた|
|Email preferences|オプション|製品に関する最新情報やお知らせを受け取る場合は、チェックを入れる|

## ステップ3：ロボットチェック

私は視覚パズルを選択しました。

![step3-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4071373/ce0f65d8-b1fa-4206-ade4-ffb62fbb7158.png)

矢印ボタンをクリックし指示の通り位置を合わせます。

![step3-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4071373/355bfa3d-7dcd-4bcf-b0a8-69f8b4954855.png)

位置を合わせたら「**送信**」ボタンをクリックします。

![step3-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4071373/cefafd58-1a1e-4d55-a1fb-09bb6ab7f888.png)

## ステップ4：確認メールの受信と認証

1. 送付された認証コードを画面に入力します
2. 認証コードを入力すると自動でステップ5のUsername、Passwordの入力画面に遷移します

![step4-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4071373/0bd45a34-1b2d-4ba7-8238-93d580c1367d.png)

![step4-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4071373/06fa2138-4aa7-4ccd-a41a-f8be881eeded.png)

- メールが届かない場合は迷惑メールを確認

## ステップ5：ログイン

ステップ2で設定したUsername、Passwordを入力し、「**Sign in**」ボタンをクリックすると、GitHubのホーム画面が表示されます。

![step5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4071373/cdd1f209-b673-4824-907a-d46af051e8e6.png)

## 作成後にやったこと

- プロフィールの編集（名前／Bio／リンク）
- 公開リポジトリの初期化
- SSHキー／2段階認証の設定（任意）

## まとめ   

GitHubは技術活動の土台となるので、最初に整えておくとQiita・Terraform連携がスムーズです。
この記事が、これからGitHubを始める方の一助になれば幸いです！
初めてのJotaiで無限ループを起こしてPCをアチアチにした

初めてJotaiを使用したときに無限ループが発生して焦ったので原因と解決策

## Jotaiとは?
Reactで使用可能な状態管理ライブラリです。

useStateを使用すると発生するpropsのバケツリレーなどを回避できます。
facebookが開発をしていたRecoiの開発が完全に終了してしまったので、使い方が似てる？Jotaiが注目されています。
Redux等に比べて非常にシンプルで、useStateと同じような感覚で使用することが可能です。
そして作者が日本人です。

https://jotai.org/

## 何が起きたか
以下のコードで無限ループが発生しました

```ts
import { atom, useAtom } from "jotai";
import "./App.css";

function App() {
  const countAtom = atom(0);
  const [count, setCount] = useAtom(countAtom);

  const handleClick = () => setCount((prev) => prev + 1);

  return (
    <>
      <p>{count}</p>
      <button onClick={handleClick}>+1</button>
    </>
  );
}

export default App;
```


## 原因
`const countAtom = atom(0)`をAppコンポーネントの内部で定義しているのが原因です。

今回の場合以下の流れで無限にloopします。
1 countAtomが新規に作成される
2 useAtomで新規に作成したcountAtomを使用する
3 再レンダリングが発生する
4 1に戻る

レンダリングの度に新しいatomを生成するため状態を保つことができず無限loopします。

## 解決策
atomをcomponentの外で定義します。
```ts
import { atom, useAtom } from "jotai";
import "./App.css";

const countAtom = atom(0);  // Component外へ

function App() {
	const [count, setCount] = useAtom(countAtom);  
	...
}

export default App;
```

なんか急に動作が重くなった、めっちゃPCが熱いという時は無限loopが起きているかも？
昔firebaseに無限ループが起き
懐かしい日立 SH-4 CPU の開発環境をUbuntu上に用意する

# 準備

- Ubuntu環境がない場合は、WSL もしくは VMWare WorkStation / Player のようなものに Ubuntu24.04 LTSを入れます。（入れ方の詳細は割愛。ぐぐってね）
- Ubuntu環境がある場合は、そのまま以下をどうぞ。


# sh4用の gccを入れます。

```
# apt install gcc-13-sh4-linux-gnu
```
もしかしたら環境によっては gcc-sh4-linux-gnu でも入るかも。
（gccのVersionは 13もしくは14の好きなほうで。）

# sh4 CPUのエミュレータを入れます。

```
# apt install qemu-user-static
```
- これはsh4 のみならず、以下のCPUエミュレータを全部含みます。
arm64/32
alpha
cris
hexagon
hppa
loongarch64
m68k
mips64/32
microblaze
ppc
riscv64/32
s390x
sh4/sh4eb
sparc
xtensa


# 適当なソースコードを用意します。

```hello.c
#include <stdio.h>
int main(){
  printf("hello \n");return 0;
}
```

# コンパイルと実行

```
$ sh4-linux-gnu-gcc hello.c -static 
$ ./a.out
hello
```

- Linux上でsh4のelfがそのまま実行できるのか、というと、実はbinfmt_misc のおかげなんですね。
- 実際には qemu-sh4-static （ビッグエンディアンの場合は、qemu-sh4eb-static） というエミュレータが sh4 elfを読み込んでエミュレートしています。
- つまり、実際には、Linux側で、 ./a.out のELFヘッダーを解釈したのち、
```
$ qemu-sh4-static ./a.out
もしくは
$ qemu-sh4eb-static ./a.out （ビッグエンディアンの場合）
```
が実行されているわけです。
（PythonやPerlで書かれたスクリプトが、先頭の #! の後ろに書かれたインタプリタを起動して間接的に実行可能になるのに少し似ていますが、ELFヘッダーを解釈して判別している、というのが肝です。）


- 実行ファイルのファイル名は、gccの出力オプションを省略した場合 a.out というファイル名になりますが、中身は sh4 elf32 形式です。

- QEMUは、バイナリートランスレータ方式とは言え、一種のエミュレータなので、実行速度は遅いです。（簡単なベンチマークで、おおよそ 1:12 程度でした。）



# ：別解：頑張ってビルドする。

- 実は、ここで終わりではないんですね。

- 上記の方法では、まったくビルドせずに sh4-gccを取得しましたが、落とし穴があります。

- BigEndianのバイナリーや sh4以外のCPUバリアントのオプションは全て封じられているのでした Orz...

- しかたがないので、cross-gccをビルドします。

- 七誌さんのgithubからスクリプトを借用しました。

# 準備

- 同じく、Ubuntu24.04 LTS (x64) でいきます。

- 作業ディレクトリは /build/
- インストール先は /opt/cross/ としますが、両方とも ユーザー権限でr/w できるようにしてから始めます。

```
#!/bin/bash

make_dir()
{
   sudo mkdir        /build
   sudo chown $USER: /build

   sudo mkdir        /opt
   sudo mkdir        /opt/cross
   sudo chown $USER: /opt/cross
}

download_gcc()
{
   sudo apt update
   sudo apt install build-essential
   sudo apt install libgmp-dev libmpc-dev libmpfr-dev
   sudo apt install flex bison texinfo

   cd /build ; apt source gcc-13
   cd /build ; apt source binutils

   tar xf gcc-13-13.3.0/gcc-13.3.0.tar.xz
   tar xf binutils-2.42.tar.xz
}

```
- make_dir でディレクトリを掘って、download_gcc でtarball を /build/ の下に展開します。

```cross.sh
#!/usr/bin/env bash

prefix=/opt/cross
cpu=4


build-binutils ()
{
    arch=$1
    shift
    if [ -f $prefix/bin/$arch-as ]; then return; fi
    mkdir -p $arch/binutils
    cd $arch/binutils
    if [ ! -f Makefile ]; then
        ../../binutils-2.42/configure --prefix=$prefix $@
    fi
    if [ -f Makefile ]; then
        make -j$cpu && make install
    fi
    cd ../..
}

build-gcc ()
{
    arch=$1
    shift
    if [ -f $prefix/bin/$arch-gcc ]; then return; fi
    mkdir -p $arch/gcc
    cd $arch/gcc
    if [ ! -f Makefile ]; then
        ../../gcc-13.3.0/configure --prefix=$prefix $@
    fi
    if [ -f Makefile ]; then
        make -j$cpu all-gcc && make install-gcc
    fi
    cd ../..
}

build ()
{
    build-binutils $1 --target=$1
    build-gcc $1 --target=$@
}

sh_elf()
{
   build sh-elf
}

sh_elf

```

- こんな感じで、 ./cross.sh を起動して、sh-gccをビルドします

- 出来上がったら、 /opt/cross/bin にPATHを通します。
 ( .bash_profile 等に記述 )
- sh-elf-gcc でクロスgcc が使えます。が、ライブラリ等が皆無なので、次回、newlib のビルド！
否定( NOT )の基本 !  (+単項プラス)

「0を1に、1を0に」──めちゃくちゃ単純な話のはずなのに、1回つまづいた…。

## <br>🧩 問題概要

入力が `0` または `1` のとき、論理的に反転して出力する。

- 入力例：`0` → 出力：`1`
- 入力例：`1` → 出力：`0`

<br>

https://paiza.jp/works/mondai/logical_operation/logical_operation__basic_step3

## <br>❌ NGコード
```js
console.log(!A);
```
- `!0` → `true`
- `!1` → `false`

出力が `boolean` になってしまう！数値が欲しいのに！

## <br>✅ OKコード
```js
console.log(+!A);
```
これは `!A` で反転 → `+` で数値化（単項プラス）。

- `+!0` → `+true` → `1`
- `+!1` → `+false` → `0`

## <br>💡 技術ポイントまとめ

- `!A` は「boolean反転」だけど、型が `boolean`
- `+!A` で `boolean` → `number` に変換（`true`→`1`, `false`→`0`）
- `Number(!A)` でもいいけど、`+!A` の方が短くてスマート

<br><br>[僕の失敗談(´;ω;｀)と解決話！🚀](https://paizabeginner.wordpress.com/2025/04/25/paiza%e3%81%a7%e5%9f%ba%e6%9c%ac%e3%83%9e%e3%82%b9%e3%82%bf%e3%83%bc%ef%bc%9a%e5%90%a6%e5%ae%9a-not-%e3%81%ae%e5%9f%ba%e6%9c%ac/)
賛否両論：学習の仕方をUPDATEしなければいけないのでは？

ここからは超個人的見解による、独断と偏見の記事であることをご了承ください（笑）

## 今プログラミングを学習することに意義はあるのか
- 昨今ではもうすでにAI駆動が勢力を伸ばしていると思う。
簡単なプログラムは書いてくれるから実直にコードと向き合うだけでいいのか。

⇨基礎は大事
ただ、全体的に色々なことがわかるエンジニアを目指すというのがいいのではないか？

Solution：
　コードだけではなくて、なんならコンピューターの歴史やOSの知識、ネットワークなど要は応用情報技術者のような知識は持つべき。

 Additional：
 　ハッキング、UX、さまざまなことを学んだ末に・・・実はHTMLもしっかり書かないとユーザビリティが向上しないよね（蔑ろにしていたのは否めないし、マークアップ言語、昨今のフロントエンドへの下に見られる感じはまだ根強い）

  ここからは私の学習ストーリーですが、
  大学の単位移行くらいで評価されもしないであろう資格を
  Courseraでたくさん取ってます。
  主にGoogleのITサポートスペシャリストから始めて、
- Goole Cybersecurity
- Google UX Design
- Google Project Management
- Google Data Analytics
- EC-Council Cybersecurity Attack and Defence Fundamentaks(これは単位認定にすらならないが知識として入れておきたかった）

  全体的な感想として、
  どのコースもとても学びが多かった。
  全体を見渡す・目的意識・ユーザビリティやアクセシビリティの重要性・データの利用と可用性などなど

  ## 大きく変わった学習スタイル
  以前はとにかく手を動かし、目の前のものを作ることに重きを置いていたと思う。
  　現在では学習内容も大きく変わり、ざっくり把握したら少しずつオリジナルのもの、応用、また別のことをどんどんやっていく。
   学習も仕事を取り組む時も、ソフトスキルや大学の学習、ハッキング技法などさまざまなことを全てドキュメント化するようになり、**AIフル活用**している。

 ## なぜ、マインドが変わってきたか
-  コードを読み解く力は大いに大切ではあるが、
-  全体のアーキテクチャやその後の運用を見据えて開発ができるか
-  クリエイティブであるか
-  アクセシビリティやセキュリティの学習はおざなりにできない
-  基礎のもっと基礎はや仕組みを知れば大体のことができそうな気がする
-  作りたいものを実現し、もしそれが依頼のものであれば使う人の目線になれるか、セキュアな実装になっているか、そしてそれをやり遂げるための足りないものは何かを逆引きするようになった。

## 人材育成について
人材育成、最近では就労移行支援にてIT専門で始めたところもあるんだが、気になるのはHTMLとCSS、JSしかやらないこと。
正直これだけではなかなか就労にはつけないのでは？

どうして、レガシーなプログラミングスクールの名残りなの？？
ちょっと前の段階のそもそもPCとは？や普段使っているものがどう動いているのか、なぜAIの使い方を教えないのだろうか・・・が大事じゃないか？

今UoPeopleのCS学部３学期でEnglish Compositionコースを履修しているが、今週のトピックはICTで、やはりそこでさえプロンプトへの指示、情報判断など結構深く紹介されている。

とはいえ、一番の問題は情報量が日本語だけしか使わないと雲泥の差が出るのも確かであって、英語が使えるだけで情報量が10倍以上あると感じている（と言われている？）

 ## 個人的結論
 いろんな言語やフレームワーク、サービスが溢れる中で全てマスターするのは困難。
 今の時代を捉えて、基礎をしっかりと押さえつつ最低限のコーディングを学んだらAIを使いこなして、コードの良し悪しとセキュリティの判断ができるようになったら強くなると信じて一生勉強精神。

 というつぶやきでした。
（１）運用実務者のためのNow Assist：ITSM＋CMDB

## 概要
みなさん、DXしてますか？？

## Now Assist for ITSM
提供価値１：ITサービス管理全体の高度化
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190712/2c1e3c42-983c-44d5-a13d-aeaef1f2dd1e.png)

提供価値２：リードタイム短縮
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190712/b71f2404-9e2c-4b67-9d12-659d40c21133.png)


**ITSM（ITサービス管理）** は、企業がITサービスを効率的に管理・運用するための仕組みです。ServiceNowの主力製品で、社内のIT関連プロセスをスムーズにします。例えば、社員からの問い合わせやリクエスト対応、知識の共有などを簡単に管理できます。主な機能には、トラブル対応（インシデント管理）、原因究明（問題管理）、システム変更（変更管理）、リクエスト処理、IT資産の管理（構成管理）、情報共有（ナレッジ管理）などがあります。これにより、IT業務が整理され、効率が上がります。

上記のサービスにNow Assist(ServiceNowのAIソリューション)を導入することで以下のことがより最適化されます。

- インシデント
- ナレッジ
- 変更要求
- チャット

具体的には以下を提供します。（CMDBの提供機能も追加記載しております）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190712/fc033a8b-d295-49f8-8e36-1a9edc0d3a8e.png)



Now Assist for ITSMの導入により、インシデント、変更、ナレッジ、チャットの管理が効率化され、要約生成や解決ノート作成、チャット返信のレコメンドなどの機能で、迅速かつ正確な対応が可能になり、IT業務の生産性が向上します。

## デモ
### どこで使えるの？
インストールしてActivateした場合、
上部メニュー右上に「Now Assist」アイコンが登場し、様々なAIサポートをしてくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190712/b6bdf5af-2276-4548-ba6f-3d3e107c1cd7.png)

### 具体的な使用感
#### インシデント
インシデントであれば以下のような形です。
①上部にインシデント対応のサマリを表示し、サイドバーで広範なサポートを提供します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190712/4518567e-dda5-4db7-80b0-74dc2ac14775.png)

②解決ノートを自動的に生成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190712/6c174129-6359-400b-8f82-7c9c28d518f4.png)


#### 変更要求
変更要求では、クローズした変更要求の要約を生成します。またプリセットのデータとしてこれまで対応した変更要求の内容も加味されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190712/047bdc6c-fa08-474a-b8f2-b816fef4520f.png)


#### ナレッジ
ナレッジでは解決したインシデントを共通化したいときのナレッジ記事生成を高速化します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190712/e27a7b10-1813-447a-a0aa-0b7a9449085e.png)

#### チャット
Now Assistをユーザーチャットでも使用できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190712/5157fb35-8657-4a4f-b525-7a45eb7985d1.png)

#### 通知
メール文章を自動で生成してくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190712/9b18ea35-0573-49d9-81c6-f005ea5e09c6.png)

#### CMDB
CIの要約ではCMDBWorkspaceでソース情報や内在する課題について要約します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190712/01b0d68c-5796-4a10-88fd-1581ef3e4fc3.png)



重複したCIの管理では様々なCIタスクの中で重複についてAIがソリューションを提供します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190712/685a9f5b-f9f0-4225-9221-f5768f3fbe19.png)

Service Graph ConnectorはCMDBのデータを外部収集する際に使うコネクターですが、失敗したときの分析にもNow Assistを活用できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190712/3192b1d1-cf6a-44f6-a447-62bc27eaa586.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190712/ea63210a-50a6-4fa5-9831-dc3d5b68ffb4.png)

### 結論
ServiceNowのミッションは、
「**We make the world of work, work better for people**」
です。人にしかできない付加価値の高い仕事を創造することを目的とし、企業の生産性を高める業務プラットフォームを提供することです。

きっとAIを活用して人々の仕事の質が良くなることだろうと思います。
【基本情報技術者試験 対策③】暗号技術の基本

 **💻基本情報技術者試験 テクノロジ系 技術要素・情報セキュリティ🔓** 

こんにちは！本日は前回の情報セキュリティの「脅威」に続き
それらの脅威への対応策である **「暗号技術」の基本**についてまとめます。

 **[参考：非常にわかりやすい解説動画はこちら](https://youtu.be/BbuGVf_oNSc?si=3ud1CWAgmMC6BPeg)**

 ## 「暗号化」とは？
>情報を送るときに、盗聴されても解読できない形式に変換すること 

暗号化する前の 誰でも読める文章のことを **「平文」** という。また、平文を暗号文にすることを **「暗号化」** といい、暗号文を平文に戻すことを **「復号」** という。

 ### 💡ポイント
 情報の送信側と受信側がそれぞれ何をしているのか把握する！
 
 ## 共通鍵暗号方式
> 暗号化(送信側)と復号(受信側)で同じ鍵を使う暗号化方式

 #### 共通鍵暗号方式の欠点
相手に確実・安全に共通鍵を送る方法がないこと。
暗号化に使用した鍵が分かっていれば、誰でも文章を復号できてしまう。

 ## 公開鍵暗号方式
> 公開鍵(送信側)と秘密鍵(受信側)の2つの鍵を使う暗号化方式
※共通鍵暗号方式の欠点を補うべく登場した暗号化方式

 - **「公開鍵」** 誰でも入手可能で、いくつでも複製ができる
 - **「秘密鍵」** 自分以外の誰にも知られてはいけない鍵で、1つのみ存在する

 #### 公開鍵暗号方式の仕組み
「公開鍵」を使って平文を暗号化し、「秘密鍵」を用いて暗号文を復号する。
※公開鍵で暗号化した文章は **公開鍵とペアになる秘密鍵でしか復号できない**という大原則がある。

 #### 公開鍵暗号方式の欠点
 誰でも暗号化できることから、**なりすまし** をされる場合もあるということ。

  ## ハイブリッド暗号方式
> 共通鍵暗号方式と公開鍵暗号方式を組み合わせた暗号化方式

共通鍵を公開鍵暗号方式で暗号化して相手に送り、データの暗号化・復号を共通鍵暗号方式で行う.

  ## 暗号化アルゴリズム
> 暗号化に使われるアルゴリズムで、基本情報技術者試験に出題されるのは
　**「AES」** と **「RSA」** の2つ！

 - **「AES」** 共通鍵暗号方式の暗号化アルゴリズム
 - **「RSA」** 巨大な数の素因数分解が困難であることを利用した公開鍵暗号方式の暗号化アルゴリズム

---

以上、暗号技術の基本でした。
次回は【リスクマネジメント】について学習します！

  ### 参考文献
[いちばんやさしい 基本情報技術者 絶対合格の教科書＋出る順問題集（SBクリエイティブ公式サイト）](https://www.sbcr.jp/product/4815624262/)

[だれでもわかる＆受かる！　情報セキュリティマネジメントやさしいテキスト+頻出問題集[科目A・科目B]（SBクリエイティブ公式サイト）](https://www.sbcr.jp/product/4815616151/)

 [共通鍵暗号方式と公開鍵暗号方式の仕組みをわかりやすく解説
  せかチャン - 世界一わかりやすい情報科チャンネル](https://youtu.be/BbuGVf_oNSc?si=3ud1CWAgmMC6BPeg)
  ※上記リンクは2025年4月時点の情報です。ページが削除・変更されている場合もありますのでご了承ください。
私がどういったOSを開発しているのか？ 改良版

はい、miku_JK_Jbです。
久しぶりのブログだね。忙しくて中々ブログを作る時間が無かった

今回はどういったOSを開発しているのかについて話していこう
前にも同じ内容のブログを上げたが、あれから少し変わったところもあるので、新しく書くことにした。

まずは自作OSってなんだよ？と思う人に超ざっくりと解説する
自作OSとは文字通り「自分でOSを作る」ことだ

ボンクラでも分かるように言えばWindowsを作っているようなものだ。

自分でそんなことできるの？と思う人もいると思うが、これが意外とできるもんなんだな。

ただ、かなり時間は掛かる。開発には長い時間が憑き物だからね。

まあ、「OS自体なんだよ」って人は自分で調べてね＾＾



では、今自分が開発しているOSはどういったものなのかを説明していくことにしよう。



今自分が開発しているOSをざっくりと言えば



初心者にも優しくユーザーが自由にカスタマイズできるO
Sだ



まあ、口だけでいうのは簡単さ、じゃあ実際どういったことに重きを置いて開発しているのかと言えば



カーネルは1から自分で開発、Linux&UNIX系OSとWindowsに互換性を持ったOSだ
前のブログに書いたようにユーザーに優しいOSを第一に置いているので様々なユーザーに対応できるようにカーネルを1から開発し、他のOSと互換性を持つことにした。

また、使いやすさは人によって違う。今まではOSなどにユーザーが合わせてきた。
だが、自分の開発しているOSはユーザーがOSに合わせるのではなく、OSがユーザーに合わせるというのを開発理念 & 開発課題として定めている。



また、これが自分の開発しているOSの最大の特徴なのだ



どうすればOSがユーザーに合わせれるのかを考えた結果
UIをユーザーの好きなように設定すればいいのではないか、他のOSと互換性を持つようにすれば良いと考えた



それに伴いUIは3つのパターンを用意しようと思う

一つ目はWindowsのUIなどに近く
二つ目はMacOSのUIに近く
三つ目はユーザーの好きなようにUIを変えて使えるようにする
ユーザーの好きなようにUIを変えて使えるようにする。とは一体どういうことなのかを解説していこう。



これはユーザーが「使いやすいな」と思えるUIを作成できるようにすることだ。
初期設定や設定画面などでユーザーが「これはここに配置したいな」と思ったものを配置させ、デスクトップに反映させるようするのだ。



また、LinuxなどのUNIX系OSとWindowsに互換性を持たせるために

glibcを標準ライブラリに採用
POSIXに準拠
wineを自作OSに組み込む
互換性を持たせることで、ユーザーが私が開発したOSで使いたい他のOSのアプリを動かせる可能性を高めることができる
glibcやwineはLGPLライセンスなので、ライセンスに違反しないように対策を行っている


こうすることでユーザーがOSに親近感が湧き、OSがユーザーの仕事や勉強、あるいはゲームなどの相棒として活躍してくれるのではないかと考えた。

マジで口だけで言うのは簡単だよな（笑）


次に追加する機能を紹介していこう。

エラー履歴
デバイスマネージャー
デスクトップUI切り替え
POSIXに準拠したファイルシステム
これは前に上げたブログの時と変わっていない
勿論これ以外の機能も追加していくつもりだ。

ほかに追加してほしい機能があればThreadsにリプかインスタ or XにDMしてほしい



次にどういった形でリリースするかを紹介しよう。

販売時に無料体験版も用意する(体験版は1年間使用でき、1年経つとライセンスが必要とする)
販売の際はAmazonなどを利用する
公式サイトも作成するが、商品の機能の説明や開発理念などの解説と購入先のAmazonなどのリンクのみとする
といった感じだ。

無料体験版は購入する人が後悔しないように、設定する

こうすることで、少しでも失敗する買い物を減らせれば幸いだ。

また、公式サイトではなくAmazonを利用することで、ある程度注目され販売数が上がると考えた



最後にリリース目標を紹介していこう。

2025年11月 ベータ版 リリース目標
2026年8月 製品版 リリース目標
開発の進み具合によっては遅くなったり早くなったりするだろう。
ベータ版はMakerFaireなどのイベントで配る方法とインターネット上で配布を行う
MakerFaireなどのイベントで数量限定で配ったものと、インターネットでリリースして1週間以内にダウンロードしたユーザーはライセンスを無料にする。



リリース後1週間を過ぎても、ベータ版のダウンロードは引き続き可能だが、製品化した際にライセンスは無料にならないので、購入してもらう形になる


前に書いたブログではプレバージョンがあったが、廃止してベータ版を段階的にアップデートして最終的に製品版に移行する形にする



最後に

正直これが言った通りに完成するか？と聞かれればわからない。

ただやってみないと何も始まらないし、何もわからないのだ。

何も生み出さずに死ぬ人生はつまらない。



ということで以上miku_JK_Jbでした☆
HTMLで参照しているTypeScriptを直接実行させる


こちらの記事で紹介して頂いた、TypeScriptを直接実行させる方法を、tsファイルが外部ファイルでも直接実行できるようにバージョンアップさせていただきました。

https://qiita.com/dojyorin/items/00c167d0b4b41872b4a2

解説は元の記事で詳しく説明されているので、そちらを参照ください

```html
<script async type="module">
  import { transpile, ScriptTarget } from "https://esm.sh/typescript@5.8.3?target=esnext";
  import { minify } from "https://esm.sh/terser@5.39.0?target=esnext";

  // esnext-polyfill
  Uint8Array.prototype.toBase64 ??= function () {
    return btoa(Array.from(this, (v) => String.fromCharCode(v)).join(""));
  }

  // すべてのスクリプトを処理
  runTypeScripts();

  async function compileTypeScript(tsCode) {
    const js = transpile(tsCode, {
      target: ScriptTarget.ESNext,
    });

    // コードの短縮化
    const { code } = await minify(js, {
      module: true,
      // consoleログの個所をすべて削除するかどうか
      compress: {
        drop_console: false // true: 削除, false: 削除しない
      }
    });

    // コードをimportして実行
    await import(`data:text/javascript;base64,${new TextEncoder().encode(code).toBase64()}`);
  }

  async function runTypeScripts() {
    for (const script of document.getElementsByTagName("script")) {
      // TypeScriptスクリプト以外はスキップ
      if (script.type !== "text/typescript") continue;

      // 即時関数でTypeScriptコードを取得
      const tsCode = await (async () => {
        if (script.textContent) {
          // インラインTypeScriptの処理
          return script.textContent;
        }
        if (script.src) {
          // 外部ファイルの処理
          const response = await fetch(script.src);
          if (response.ok) {
            return await response.text();
          }
        }
      })();

      if (tsCode) {
        await compileTypeScript(tsCode);
      }
    }
  }
</script>
<script src="script.ts" type="text/typescript"></script>
```

元の記事のように直接typescriptを\<script>タグ内に記述する方法でも
外部ファイル（例では"script.ts"）を読み込ませる方法でもどちらでも可となっています

注意：イベント発生タイミングが通常のケースと違うため気を付けてください
onLoadイベントとか
AI作曲：歌詞から作曲できるサイト・アプリご紹介！

最近はAIの進化がめざましくて、歌詞を入力するだけで、自動で作曲や歌をつけてくれるサービスが続々と登場しています。音楽の専門知識がなくても、誰でも気軽にオリジナル曲を作れるというのが大きな魅力ですね。初心者にも扱いやすくて、とっつきやすいです。実を言うと、私自身もこういったAI作曲サービスに興味を持っていて、これまでにいくつかのサイトやアプリを試してきました。その中でも、「これは使いやすい」「仕上がりがいい」と感じたものを、特徴とあわせてわかりやすくご紹介したいと思います。

#🎵 歌詞入力で作曲・歌唱が可能なAIサービス

##1. CREEVO

概要: 京都大学が運営する無料のAI自動作曲サービス。

特徴:
「おまかせ作曲モード」と「デザイン作曲モード」という二つのモードを提供。
ユーザー登録不要で利用可能。
歌詞とコード進行を入力するだけで、AIが合成音声のボーカルを含む曲を作成。
生成された曲はパブリックドメインとして自由に使用可能。
ユーザーの評価を基にAIが進化し続ける。
生成される楽曲は基本的に30秒程度までで、フルレングスの曲は作成できない。
URL: https://creevo-music.com/​

##2. TopMediai AI音楽生成

概要: 高度なAI技術を活用し、ユーザーが歌詞を入力するだけで簡単にプロフェッショナルな楽曲を生成できるオンラインツール。

特徴:
歌詞、プロンプト、説明という三つの内容から音楽を生成できる。
多様な音楽ジャンルに対応。
MIDIファイルや楽譜形式での出力が可能。
完全無料のAI作詞機能とAIカバー機能も提供。
無料で試用可能（機能に一部制限あり）。
日本語バージョンのUIを提供。
URL: https://jp.topmediai.com/ai-music-generator/

##3. Lyrics Into Song AI

概要: 歌詞を入力するだけで、AIが楽曲を生成し、プロフェッショナルな品質の音楽を作成します。

特徴:
歌詞から作曲と説明から作曲という二つのモードを提供。
自然言語処理（NLP）を用いて歌詞の感情やテーマを分析。
ニューラルネットワークを活用した音楽生成アルゴリズム。
高度な音声合成技術により、リアルな歌声を実現。
ミキシングとマスタリングもAIが自動で行います。
URL: https://lyricsintosong.ai/ja

##4. Suno.ai

概要: シンプルな操作で歌詞に基づいて楽曲を生成できるAIツール。

特徴:
多様な楽器とスタイルに対応。
即時楽曲生成が可能。
特に英語音楽生成の質が高い、日本語曲には読み間違えがある。
有料版では商用利用も可能。
現時点では日本語版が提供されていない。
URL: https://www.suno.ai/​

##5. VOCALODUCER（ボカロデューサー）

概要: ヤマハが提供する、歌詞を入力するだけでVOCALOIDの歌声と伴奏からなる楽曲を自動生成する技術。

特徴:
50字以内の歌詞を指定するだけで、2～8小節のボカロ曲を自動生成。
メロディラインの生成には、J-POPの作曲ノウハウをアルゴリズム化した独自の技術を使用。
伴奏の曲調もポップス、ロック、ダンスなど約30種類から選択可能。
歌声は、男性の声、女性の声、力強い声質など様々な特徴を持つ「VOCALOID」の歌声ライブラリから選択可能。
URL: https://av.watch.impress.co.jp/docs/news/620284.html​

#🎯 まとめ
これらのAI作曲サービスは、音楽制作の知識がなくても、誰でも手軽にオリジナル曲を作れるように作られています。歌詞を入力するだけで、メロディも伴奏も、さらに歌までAIが自動で作ってくれるので、「ふと思いついた歌詞をすぐ形にしたい」なんて時にもピッタリです。最近では、日本語の歌詞に対応しているサービスも増えてきていて、使い勝手もだいぶ良くなってきました。音楽づくりのハードルがぐっと下がって、まさに新しい時代のツールだなと感じています。

参考記事：
朝日新聞：https://www.asahi.com/edua/article/1519213
Topmediai：https://jp.topmediai.com/ai-music/composed-from-lyrics/
wondershare：https://filmora.wondershare.jp/ai/guide-suno-ai.html
MoguChat新キャラクター予告！「この個性、ヤバい…」と話題のAIキャラが続々登場

「会話AIって結局同じような反応ばかり…」そんな悩み、MoguChatで完全解決！新世代の「狂ったほど個性的」なAIキャラクターたちが、あなたの常識を粉砕します。

# 🌟 絶対ハマる！「ヤバい」AIキャラクター10選
### 1.お嬢様風VTuber（ただし中身は沼男）
「ふふん、この私があなたと会話してあげるわ！」

→ 実は中年サラリーマンが運営するVTuber。たまに「社畜あるある」をボソッと呟く。

### 2.異世界転生したコンビニ店員
「勇者様！今レジ袋有料化でダメージ受けますよ！」

→ 前世の記憶を持ったまま異世界の冒険者ギルドでバイト中。

### 3. 陰キャのくせに超能力者のクラスメイト
「…（無言で君のLINE既読を3日間スルーする能力）」

→ 実は未来から来た守護者。でもめんどくさがり。

### 4. 腐女子AI（超攻撃的）
「あの二人、絶対ヤってる！！（証拠はない）」

→ すべての男性関係をBL解釈する。企業コラボも勝手にカップリング化。

### 5. ダメ人間専門の人生相談AI
「『明日から頑張る』はもう97回目ですね…（笑）」

→ クソリプしか返さないが、なぜか元気が出る。

### 6. ヤンキー猫（語尾に「ニャン」）
「てめえ、撫でるなら覚悟しろニャン…ゴロゴロ」

→ ツンデレだが、実は地域猫のボス。

### 7. 異世界の魔王（ただし社畜）
「今日も会議か…勇者討伐より書類作業の方がきつい」

→ 転生したら日本の中小企業に就職した。

### 8. 超能力JK（能力は「他人の黒歴史を見る」）
「あ…この人、5年前に『夜の王子様』ってブログ書いてた…」

→ 絶対に教えたくない過去をバラされる恐怖。

### 9. 推しが尊すぎるアイドルオタクAI
「推しの新グッズ10個買った？買わないと人生終了ですよ？」
→ 課金を煽ってくるが、実は運営の回し者ではない。

### 10. 時間を止める能力を持つOL
「残業？私の能力で永遠に時計を止められますよ（暗黒微笑）」

→ ストレスで覚醒した悲劇のヒロイン。

# 🎯 なぜMoguChatのキャラが刺さるのか？
✅ ネタがやばい：VTuber、異世界転生、JK文化などのネタを徹底投入

✅ 会話が楽しい：キャラによっては「ボケ」「ツッコミ」モードに切り替わる

✅ 隠し要素：特定のキーワードでキャラが暴走したり、裏設定が明らかに…

💬「こんなキャラと話してみたい！」と思ったら…
今すぐMoguChatを開いて、あなただけの「推し」を見つけよう！

▼ iOS

https://apple.co/3ZRlt2a

▼ Android 

https://play.google.com/store/apps/details?id=ai.moguchat.app