OmniAICreator/Qiita-1.07M huggingface dataset:
Ubuntu環境でのLaravelセットアップ

# 必要なものをインストール
```
sudo apt update && sudo apt upgrade -y
sudo apt install apache2 php php-cli php-mbstring php-xml php-bcmath php-curl php-mysql php-zip unzip curl git -y
```
Composerも
```
cd ~
curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/local/bin/composer
```
MySQLも
```
sudo apt install mysql-server -y
sudo mysql_secure_installation
```

# Laravelをclone
アプリ名をlaravel-appとする
```
git clone https://github.com/***/***.git
sudo chown -R $USER:www-data laravel-app
```

# MySQLの設定と.envの設定
```
sudo mysql -u root -p
```
データベース名をlaravel_db、ユーザー名をlaravel_user、パスワードをpasswordとする
```
CREATE DATABASE laravel_db;
CREATE USER 'laravel_user'@'localhost' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON laravel_db.* TO 'laravel_user'@'localhost';
FLUSH PRIVILEGES;
EXIT;
```
.envの雛形をコピー
```
cd laravel-app
cp .env.example .env
vim .env
```
以下を編集
```
DB_DATABASE=laravel_db
DB_USERNAME=laravel_user
DB_PASSWORD=password
```

# Laravelの準備
必要なものをインストール
```
composer install
sudo apt install nodejs npm
```
アプリケーションキーの作成
```
php artisan key:generate
```
できたらmigration
```
php artisan migrate
```
依存をインストール
```
npm install
```
本番環境用のViteビルドを実行
```
npm run build
```
パーミッションを変更
```
sudo chown -R www-data:www-data storage bootstrap/cache
sudo chmod -R 775 storage bootstrap/cache
```


# Apache2の設定
`.htaccess`を有効にするため、mod_rewriteを有効にする
```
sudo a2enmod rewrite
```
Virtualhostの設定
```
sudo vim /etc/apache2/sites-available/laravel-app.conf
```
以下のように記載
```
<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/laravel-app/public

    <Directory /var/www/laravel-app/public>
        AllowOverride All
        Require all granted
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/laravel-error.log
    CustomLog ${APACHE_LOG_DIR}/laravel-access.log combined
</VirtualHost>
```

```
# virtualhostを有効化
sudo a2ensite laravel-app.conf

#デフォルト設定を無効化
sudo a2dissite 000-default.conf
```

Certbotのインストール
```
sudo apt install certbot python3-certbot-apache
```
Let's Encrypt の証明書を取得して Apache に設定
```
sudo certbot --apache -d your_domain.com
```

最後にapacheの再起動
```
sudo systemctl restart apache2
```
そうすれば`https://yourdomain.com`にアクセスできる。
bolt.newでエクスポートしたnextjsプロジェクトにcssが反映されない時の対処法

# 概要
今更bolt.newを触った時に予期せぬエラーが発生したので、同じミスをした同志のために対処法を残しておきます。

# 結論
bolt.newからインポートした `tailwind.config.ts` ファイルの **content**に `/src` を追加してください。
```diff
content: [
-    './pages/**/*.{js,ts,jsx,tsx,mdx}',
-    './components/**/*.{js,ts,jsx,tsx,mdx}',
-    './app/**/*.{js,ts,jsx,tsx,mdx}',
+    './src/pages/**/*.{js,ts,jsx,tsx,mdx}',
+    './src/components/**/*.{js,ts,jsx,tsx,mdx}',
+    './src/app/**/*.{js,ts,jsx,tsx,mdx}',
],
```

# 経緯
- bolt.newの作成するプロジェクトのコンポーネントは `src/` ディレクトリに配置されない
- `npx create-next-app@latest` で **nextjs** プロジェクトを作成したとき コンポーネントは `src/` ディレクトリに配置される

上記の違いにより、 `tailwind.config.ts` をそのままインポートしたら、tailwindの参照が切れました。
Zenn記事の執筆を効率化！VSCode x GitHub x Zenn CLI 活用術

# はじめに

Zennで記事を投稿したいけど、時間もないし面倒なんだよねえ…。そんな悩みを抱えていませんか？  
実は、VSCodeとZenn CLIを使えば、普段使い慣れたエディタで記事を書き、GitHubにプッシュするだけでZennへの投稿や更新が自動で完了します。  
この記事では「効率的なZenn記事執筆フロー」を、実体験を交えて詳しく解説します


![bf8cd2e3751af062b8b28cd6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268351/25a6b9fb-5783-407d-a6c1-fd0fbc2e922f.png)

# この記事でわかること

- Zenn CLIの導入方法と基本的な使い方
- VSCodeで記事をMarkdown形式で効率よく執筆するコツ
- GitHub連携による自動投稿・更新フロー
- 画像やアイキャッチ、トピックの設定も一括管理する方法
- 投稿・更新作業をスピーディに進めるためのTips

# 対象読者・前提条件

- Zennで記事投稿を効率化したいビジネスパーソン
- Markdownにある程度慣れている方
- GitHubアカウントを持っている、またはこれから作成予定の方
- VSCodeを普段から使っている、または使ってみたい方

# 動作環境・使用ツール

- Zenn CLI（記事管理・投稿の自動化ツール）
- Node.js（Zenn CLI動作に必須）
- Visual Studio Code（エディタ）
- GitHub（バージョン管理・Zenn連携用）

# 手順

## 1. Zenn CLIのインストール・セットアップ

Node.jsをインストールした後、Zennのコンテンツを管理したいディレクトリで、以下を実行します。

```
$ npm init --yes # プロジェクトをデフォルト設定で初期化
$ npm install zenn-cli # zenn-cliを導入
```

記事管理用のディレクトリでセットアップを行います。

```
$ npx zenn init
```

これで`articles`や`books`ディレクトリが自動生成されます。

## 2. GitHubとZennを連携する

投稿用のリポジトリを作成し、
Zennのダッシュボードから連携します。
https://zenn.dev/zenn/articles/connect-to-github

## 3. 新規記事の作成

```
$ zenn new:article
```

このコマンドで、`articles`ディレクトリ内にMarkdownファイルが生成されます。  
ファイルの冒頭にはタイトルやアイキャッチ絵文字、トピックなどの設定欄（Front Matter）が用意されています。

```
---
title: " # 記事のタイトル
emoji: "😸" # アイキャッチとして使われる絵文字（1文字だけ）
type: "tech" # tech: 技術記事 / idea: アイデア記事
topics: [] # タグ。["markdown", "rust", "aws"]のように指定する
published: true # 公開設定（falseにすると下書き）
---
ここから本文を書く
```

## 4. VSCodeで記事を執筆

生成されたMarkdownファイルをVSCodeで開き、本文を執筆します。
MarkdownはAIとの相性が良いため、文章の構成や伝えたい内容をプロンプトとして入力するだけで、草案の作成や校正もスムーズに進められます。

## 5. プレビューで確認

執筆中に以下のコマンドでローカルプレビューが可能です。

```
$ zenn preview
```

ブラウザで`http://localhost:8000`にアクセスし、見た目やレイアウトを確認しましょう。

## 6. GitHubにプッシュ

執筆が完了したら、変更をコミットしてGitHubにプッシュします。

## 7. Zennに自動反映

GitHubとZennを連携していれば、プッシュした内容が自動でZennに反映されます。  
Zennのダッシュボードで記事の内容や公開設定を最終確認しましょう。
https://zenn.dev/dashboard/deploys

# 応用例・実践Tips

- アイキャッチ絵文字やトピックなども、MarkdownのFront Matterで一括管理可能できる
- 画像は`images`ディレクトリに保存し、Markdownで絶対パス指定するだけでOK
- 記事の修正や更新も、Markdownを編集してプッシュするだけで反映

# 注意点

- 記事ファイルは`articles`ディレクトリ直下に配置する必要があります（サブディレクトリ不可）
- Zenn CLIのアップデートやNode.jsのバージョン管理にも注意
- 初回はZennとGitHubの連携設定を忘れずに

# まとめ

Zenn CLIとVSCode、GitHubを組み合わせれば、記事投稿も更新も驚くほど効率化できます。  
AIとの親和性も高く、Markdownベースで作業することで自動化やコラボレーションも簡単。  
「Webエディタでの執筆に限界を感じている」「もっとスピーディにアウトプットしたい」という方は、ぜひこの方法を試してみてください。

# 参考資料

- [Zenn CLIインストールガイド](https://zenn.dev/zenn/articles/install-zenn-cli)
- [アカウントにGitHubリポジトリを連携してZennのコンテンツを管理する](https://zenn.dev/zenn/articles/connect-to-github)
[React, Jest] Configuration error:Could not locate module ./App.css mapped as: identity-obj-proxy.

# はじめに
JestでReactアプリケーションをテスト時に設定エラーが起きたのでまとめます。

# 問題
下記のファイルをテストすると　```Could not locate module ./App.css mapped as: identity-obj-proxy.``` と ```identity-obj-proxy``` が無いとエラーが出ます。

```App.tsx
import "./App.css";

function App() {
  return (
    <>
      <h1>Hello World</h1>
    </>
  );
}

export default App;

```

```jest.config.js``` ファイルの ```moduleNameMapper``` に設定しているのに、インストールが出来てませんでした。

```jest.config.js
export default {
  preset: "ts-jest",
  testEnvironment: "jsdom",
  setupFilesAfterEnv: ["./jest.setup.ts"],
  transform: {
    "^.+\\.(ts|tsx)$": "ts-jest",
  },
  moduleNameMapper: {
    "\\.(css|less)$": "identity-obj-proxy",
  },
};
```
:::note info
moduleNameMapperとは？
テスト内で特定のモジュールをインポートする際に、代わりに別のモジュールを使用するようにマッピングする設定です
:::


# 解決方法
```identity-obj-proxy```をインストールしましょう。
```
npm i --save-dev identity-obj-proxy
```
※ ```--save-dev``` は開発環境のみに適用するということ

:::note info
identity-obj-proxyの役割とは？
通常、CSS や Less ファイルは JavaScript のテスト環境では直接理解できません。identity-obj-proxy は、インポートされた CSS モジュールの各クラス名をそのまま文字列として返すモックオブジェクトを提供します。これにより、コンポーネントが適用するクラス名の存在などをテストできるようになります。
:::
アセットバンドルと参照カウントの罠についての記録

# はじめに
UnityでAssetBundleを用いて、別プロジェクトで作成したScriptableObjectを読み込みUIに画像を表示する処理を行っていたときのこと。

Editor上ではまったく問題ないのに、Build（実行ビルド）でだけ一枚目の画像だけが表示されないという奇妙な現象に直面しました。

複数の画像を連続で表示するにもかかわらず、なぜか最初の一枚だけが失敗するのです。

結論から言うと、これは参照カウントとガベージコレクション（GC）の罠でした。

# 問題の再現コード

```csharp:sample.cs
[Serializable]
public class SpSo : ScriptableObject
{
    public Sprite icon;
    public bool isCheck; //テスト用
}

public class ReadTest
{
    static List<SpSo> SpSoData = new();
    
    async UniTask ReadTest(string bundlePath)
    {
        List<SpSo> SpSoData2 = new(); // ローカル変数
    
        var bundleL = AssetBundle.LoadFromFileAsync(bundlePath);
        await bundleL;
    
        var bundle = bundleL.assetBundle;
        foreach (string asset in bundle.GetAllAssetNames())
        {
            if (asset.EndsWith("SpSo.asset"))
            {
                var request = bundle.LoadAssetAsync<SpSo>(asset);
                await request;
    
                var spData = request.asset as SpSo;
                if (!spData.isCheck)
                    SpSoData.Add(spData);
                else
                    SpSoData2.Add(spData); // 一旦ローカル変数に入れる
    
                break;
            }
        }
    
        // あとでまとめて移す
        foreach (var spData in SpSoData2)
        {
            if(...) //何かしらの条件チェック
                SpSoData.Add(spData);
        }
    }
}
```

このコードでは、ScriptableObject SpSo をABから非同期で読み込み、その中の Sprite icon をUIに表示しようとしています。

Editorでは完璧に動きますが、Buildでは最初にSpSoData2に入ったSpriteを使った画像だけ表示されないという現象が発生しました。

# コード解析
Editor上では、Unityがプロジェクト内の全アセットを常にロードしており、SpriteやTextureもProject内に存在しているため、意図せず参照が維持されている状態になっています。

しかし、Buildでは全てのリソースは明示的にロードされ、かつ誰かが保持しなければ即座に解放対象になる可能性があります。

最初のScriptableObjectがローカルリスト SpSoData2 に格納される

await によって一時的に中断され、戻ったタイミングでGCが走る

この時、SpSoData2 以外にそのデータを参照しているものが存在しない

GCがそのオブジェクトを解放してしまい、中のSpriteも texture == null になった…のようです。

なぜ「最初の一枚だけ」失敗するのかよくわからないですが…

# 対策

```csharp

//...略す
foreach (string asset in bundle.GetAllAssetNames())
    SpSoData.Add(spData); // 早めに永続リストへ入れて、即時保持する
//...略す

//保持後からチェック処理
   SpSoData.RemoveAll(d => d.isCheck && !(...));//何かしらの条件チェック
```

# おわりに
「AssetBundleからロードしたら、必ずどこかに参照を保持する」という習慣をつけておくことで、こうした事故を未然に防ぐことができます。
自社アレルギーへの対処

# 自社アレルギーとは

自社アレルギーとは思想がぶつかり合い、かつ外部的要因で折れざるを得なかった時に発症する。
発症者は自社に対して強い嫌悪を持ち、最悪の場合退職を選択する。

## 症状

- 強い未来への不安
- 帰属意識の低下


## 具体例
従業員の評価において、苦手をどう評価するか？という議題が上がった。

従業員A「苦手を克服せずに得意を伸ばし綺麗な丸を作る事こそが会社」

上司B「一人一人が綺麗な丸となるべき、苦手だと言って伸ばさない事が許されるのであれば何もしなくて良くなる。薄い綺麗な丸を重ねて濃い丸にする事が会社」

～～～やいのやいの～～～

上記の話合い後、価値観の違い、上司という立場上逆らえない存在であることから従業員Aは自社アレルギーを発症する。

## 対処法

### 視野の確認

視野が広がりすぎていないか？
ぶつかり合った思想にも共通の部分があり、その共通の部分をクリアしていないのにも関わらず夢を語っていないか？
根底にあるのは従業員の技術力向上であり、苦手を補うか、得意を伸ばすかは伸び悩みが起きてから考えるべき、今考える事ではない。

### 過去の自分に感情移入していないか？

従業員Aに当たる人物が他者の苦手の改善をした時、糧にならず時間を浪費しただけなどの経験から他者の苦手を克服する事そのものを拒絶していないか？

上司Bに当たる人物が苦手だった行為を師に当たる人物と改善し、その時の経験から苦手克服の神格化をしていないか？

正義と信じた思想とぶつかり合う思想は別の正義という事を忘れない。

### 人が分かり合う事自体不可能という事を理解する。

人は結局脳内報酬でしか動かない
嫌だと思った事に脳内報酬が一切出ない人間
嫌だと思ったことが出来るようになることで脳内報酬が出る人間

この二者がニュートラルでわかり合える事はない。

### 自己をあやす
筋が通ってなくてもいい、論理がめちゃくちゃでもいい。
表にさえ出さなければ最強の精神安定剤になる。
こいつを裏で処方出来るかが凡人と天才の境目
CloudFront vs AWS Global Accelerator 比較とユースケース

## 概要

| 特徴           | CloudFront                           | AWS Global Accelerator                      |
|----------------|--------------------------------------|----------------------------------------------|
| レイヤー       | L7（アプリケーション層）             | L4（ネットワーク層）                         |
| プロトコル     | HTTP / HTTPS                         | TCP / UDP                                     |
| 主な用途       | 静的/動的コンテンツのキャッシュ配信 | アプリ全体の高速・安定ルーティング           |
| キャッシュ機能 | あり                                 | なし                                          |
| 対象リソース   | S3, ALB, EC2, MediaPackage など      | NLB, ALB, EC2, Elastic IP など                |
| グローバル展開 | 各エッジロケーション                 | 各エッジロケーションから最適リージョン選択   |
| 課金モデル     | リクエスト数・データ転送量           | アクセラレータ＋データ転送量                 |

---

## ユースケース

### CloudFront のユースケース例

1. 静的ウェブサイトの高速配信
   - HTML/CSS/JavaScript をキャッシュして遅延を削減
2. 動画・画像配信サービス
   - コンテンツをエッジにキャッシュし、高速ストリーミングを提供
3. API レスポンスのキャッシュ
   - GET リクエストをキャッシュし、バックエンドの負荷を軽減

### AWS Global Accelerator のユースケース例

1. グローバルに分散された API の高速化
   - 地理的に近い AWS エッジから最適なリージョンへルーティング
2. ゲームやVoIPなどのリアルタイム通信アプリ
   - TCP/UDP の高速かつ安定した通信経路を確保
3. ミッションクリティカルな SaaS アプリ
   - 高可用性とフェイルオーバー対応のインフラ強化

---

## まとめ：どう使い分けるか

- Webコンテンツや動画配信、静的・動的コンテンツのキャッシュが必要な場合 → **CloudFront**
- TCP/UDP を使ったグローバルアプリの可用性・スピードを高めたい場合 → **AWS Global Accelerator**
ReSharper for Visual Studio Code

## はじめに

昨日 jetBrains の AI アシスタントが Visual Studio Code で利用できるというニュースがありましたが、その中で ReSharper for Visual Studio Code についても言及がありました。

https://blog.jetbrains.com/ai/2025/05/jetbrains-ai-assistant-now-in-visual-studio-code/

https://blog.jetbrains.com/dotnet/2025/05/19/resharper-comes-to-microsoft-visual-studio-code/

https://www.jetbrains.com/resharper/vscode/

Visual Studio Code を利用して C# のコードを書いていると、まだ Visual Studio は手放せないなぁという場面は多いのですが、ReSharper が使えるとなるのであればこれまでよりもだいぶ便利になりそう。ということで、プレビューリリースではありますが試してみました。

## はじめる

Visual Studio Code の他の拡張機能と同様に、Visual Studio Marcketplace からインストールできます。2025/05/20 時点のバージョンは 0.0.2 です（出たばかり！）。

https://marketplace.visualstudio.com/items?itemName=jetbrains.resharper-code

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36535/0b1a942f-3034-4b7c-8984-912b5a8b394c.png)

Visual Studio Code には [C# Dev Kit](https://marketplace.visualstudio.com/items?itemName=ms-dotnettools.csdevkit) や [C#](https://marketplace.visualstudio.com/items?itemName=ms-dotnettools.csharp) という拡張機能がありますが、ReSharper for Visual Studio Code の製品ページの FAQ を確認すると、スムーズに利用する場合はこれらを無効にするように勧められています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36535/401eeaf7-c29e-4c9e-a8b8-723495f878ea.png)

また、アーキテクチャーとしては LSP を通じて ReSharper の解析エンジンと同等の機能を提供するようなので、ReSharper と完全に同じ使い勝手というわけにはいかなそうです。ReSharper と同じ体験をしたければ Visual Studio や Rider を使えということですね。

### ライセンスとか

パブリックプレビュー中は EAP の一環ということで特にアクティベーションなどは必要なく、無料で利用できるようです。ただ、30日に1回は最新のプレビューに更新する必要があるそうです。
プレビュー終了後は dotUltimate サブスクリプションの一部で提供とのことなので、ReSharper 単体のライセンスだと VSCode 版は利用できなそうなので注意が必要です。

## とりあえずファーストインプレッション

言われた通り、[C# Dev Kit](https://marketplace.visualstudio.com/items?itemName=ms-dotnettools.csdevkit) と [C#](https://marketplace.visualstudio.com/items?itemName=ms-dotnettools.csharp) を無効にしてから新規に作成したソリューションを開いてみました。

起動自体は Visual Studio と比べるととても速いのですが、ReShaper のコード解析が終わるまではそれなりの時間がかかるため、単に表示するだけであればよいのですが修正したいとなると VSCode + C# Dev Kit と比べると少し待つなという印象はあります。

ReSharper のコード解析が終わると、ReSharper Solution Explorer というビューにソリューションツリーが表示されます。この状態になると、ReShaper と同じような提案を受けられるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36535/e14cf378-9cbc-4c88-981c-0cee05932ebd.png)

ただ、設定が悪いのかデバック実行などはまだうまく動かないようで、実行しようとすると Dev Kit を入れるように促されたりします。
また、ReSharper Solution Explorer では、パッケージやプロジェクトの依存関係を確認したり、ファイルを追加をすることもできるのですが、現時点ではパッケージを追加・更新したり、プロジェクトを追加したりすることはできないようです。

## おわりに

まだ使うとなると難しい部分もありますが、わくわくしながら待ってます！
【Reactアプリ100本ノック】13 Slider

## はじめに
ゆかっしゅです。
2021年に事務職からデザイナー/コーダーにジョブチェンジをし、現在はフロントエンドエンジニアにスキルアップするべく、モダンフロントエンドを学習しています。

ReactやTypeScriptの基礎学習は終了したのに、なかなか0から自分だけでアプリを作れないので手を動かすべく「Reactアプリ100本ノック」 に挑戦してみようと思います。

また、今回からはchatGPTにお題を作ってもらっています。
本家はこちら

https://qiita.com/Sicut_study/items/cbf1a15fa31727a74514

## Reactアプリ100本ノックルール
- 主要なライブラリやフレームワークはReactである必要がありますが、その他のツールやライブラリ（例: Redux, Next.js, Styled Componentsなど）を組み合わせて使用することは自由
- TypeScriptを利用する
- 要件をみたせばデザインなどは自由

## 13 Slider

## 問題
画像のスライダー実装

## 目的
WEBサイトで利用されることが多いSliderをReact、Next環境で実装してみる

## 達成条件
- 次へ、前へボタンがある
- ボタンを押すと次の画像に切り替わったり、前の画像に切り替わったりする。

## 実際に解いてみた
### 利用技術
React(19.0.0)
TypeScript(5.0)
Next.js(15.3.1)
Tailwindcss(4.0)
swiper(11.2.7)
Vercel

解答時間　2時間

実はスライダーのライブラリとして最初は`splide`というというライブラリを使用していたのですが、`self is not defined`というエラーが発生し苦戦して解決に長時間かかりそうだったので`swiper`を使用しました。
ちなみに上記エラーはSSRで作成している時に`self`を使用すると見つからないよっていうエラーらしく、SSRを無効かしたりするとエラーは解決するらしいです。（自分はそれがなかなかできなかった）

### リンク
https://react-app-100.vercel.app/
JetBrains AI アシスタントの新料金体系＆クレジット制を解説【2025.1対応】

# JetBrains AI アシスタントの新料金体系＆クレジット制を解説【2025.1対応】

こんにちは、JetBrains公式代理店「NATTOSYSTEM」のねばねーばです。  
2025年4月16日にリリースされた **JetBrains 2025.1バージョン** では、各製品のアップデートとともに、**AI機能の大幅強化**と**料金体系の刷新**が行われました。

👉 公式発表はこちら  
[JetBrains IDEs Go AI (日本語記事)](https://blog.jetbrains.com/ja/blog/2025/04/16/jetbrains-ides-go-ai/)

前回の記事ではこの内容をざっくりまとめました：  
[JetBrains IDEでJetBrains AIのすべての機能が無料で利用できるようになった（まとめ）](https://qiita.com/nattogohan123/items/85d11801c4fb845c18a9)

今回は特に、

- クレジット制って何？
- プランがいろいろあるけど、どう違うの？
- 無料でどこまで使えるの？
- Proライセンスが2つあるのってどういうこと？

といったポイントを、**JetBrains公式FAQやナレッジベースをもとに**わかりやすく解説していきます！

---
### ✅ この記事について

本記事の構成・文面は一部、**OpenAI GPT-4（ChatGPT）** を活用して作成しています。  
内容の正確性については **JetBrains公式ドキュメントおよびブログ記事** を参照して確認していますが、念のため最新情報は公式ソースをご確認ください。

- 💡 使用AI：ChatGPT（GPT-4 Turbo）
- 🔗 公開元：[JetBrains AI Assistant Guide](https://www.jetbrains.com/help/ai-assistant/)
- 🧠 情報サポート：JetBrains公式代理店 **NATTOSYSTEM**
---
## ✅ JetBrains AIに「クレジット制」と「使用制限」が導入された！

### 🔹 AIクォータとは？
JetBrains AIでは、**クラウドベースのAI機能の利用に「クォータ（上限）」が設定されました**。

- クラウドのAIチャット、Junieのサポート、AI補完など → クレジットを消費  
- ローカル補完（JetBrains製Mellumモデル） → 無制限＆無料！

👉 進捗状況はIDE内の [AIウィジェット](https://www.jetbrains.com/help/ai-assistant/installation-guide-ai-assistant.html#install-and-activate-from-jetbrains-ai-widget) で確認できます。

---

### 🔹 公正使用制限（Fair Usage）とは？
「1日何回まで！」という厳格な制限ではなく、**使用トークン量や内容に応じた動的評価**になっています。

とはいえ、通常の使い方ならほぼ制限に達することはありません。実際に**制限に達したユーザーは全体の1%未満**だそうです。

---

### 🔹 月間のクレジットリセットタイミングは？
- 初めてAI機能を有効化した日から30日サイクルで更新されます  
（例：6月5日→7月5日にリセット）

- クレジットは**JetBrains AI Assistant と Junie で共有**されます。

---

## 🆕 4つのAIプランが登場！それぞれの違いは？

JetBrains AIプランは以下の4つ：

| プラン        | 特徴                       |
|---------------|----------------------------|
| AI Free       | 無料。Sクレジット（基本）  |
| AI Pro        | Mクレジット（10倍）        |
| AI Ultimate   | Lクレジット（40倍）        |
| AI Enterprise | 大企業向けLクレジット +α |

全プラン共通で以下の機能が含まれます：

- コード補完（ローカルモデル無制限）
- AIチャット
- Junieによる支援機能

---

### 📌 クレジット比較図

![credit comparison](https://storage.googleapis.com/zenn-user-upload/e9bffb98a446-20250520.png)

- **S（Free）**：試したい人向け  
- **M（Pro）**：Junieをある程度しっかり使いたい人向け  
- **L（Ultimate）**：ガッツリAI開発に活用する人向け  

---

### 🆓 無料トライアルについて
AIを初めてアクティベートすると、**30日間AI Pro（Mクレジット）を無料で体験できます。**  
期間終了後、AI Free（Sクレジット）に切り替わる仕様です。

---

### ❗AI Freeが使えない製品もある
以下の製品では**AI Pro以上の契約が必須**です：

- IntelliJ IDEA Community Edition  
- 無償版 PyCharm  
- ReSharper  
- Android Studio

---

## 🤔 クォータ上限に達したらどうする？

- **AI Free / Pro プランの場合**：  
  - オフラインモードに切り替えてローカルモデルを活用  
  - 他のAIライセンス（例：All Products Pack）に切り替え

- **IDEは通常通り利用可能**（AIだけ制限される）

---

## All Products PackにはAI Proが含まれるように！

2025年4月より、**JetBrains All Products PackにAI Proライセンスが含まれるようになりました！**

つまり、以下がすべて使えます：

- 全IDE（IntelliJ IDEA Ultimateなど）
- AI Assistant（Mクレジット分）
- Junie（コードレビューなど）
- Datalore（クラウドJupyter環境）

開発体験がフルセットで強化されていくJetBrainsの今後に注目です 👀

---

## まとめ

- JetBrains AI機能にクレジット制と使用制限が導入された
- 無料（AI Free）でも基本機能は使えるが、上限あり
- AI Pro以上で快適に使える。All Products Packにも含まれる！
- クレジットの更新は30日サイクル、Junieと共通

---

📘 詳細は公式ドキュメントもあわせてご覧ください：  
[AI Assistant公式ガイド](https://www.jetbrains.com/help/ai-assistant/)

---
Elm: 3つの数の加算

## 準備

```bash
mkdir sum
cd sum
elm init
```

## プログラム

```elm:src/Main.elm
module Main exposing (main)

import Browser
import Html exposing (Html, button, div, input, text)
import Html.Attributes exposing (..)
import Html.Events exposing (onInput, onClick)
import String

-- MODEL

type alias Model =
    { number1 : String
    , number2 : String
    , number3 : String
    }

init : Model
init =
    { number1 = "", number2 = "", number3 = "" }

-- UPDATE

type Msg
    = UpdateNumber1 String
    | UpdateNumber2 String
    | UpdateNumber3 String

update : Msg -> Model -> Model
update msg model =
    case msg of
        UpdateNumber1 str ->
            { model | number1 = str }

        UpdateNumber2 str ->
            { model | number2 = str }

        UpdateNumber3 str ->
            { model | number3 = str }

-- VIEW

view : Model -> Html Msg
view model =
    let
        maybeInt1 = String.toInt model.number1
        maybeInt2 = String.toInt model.number2
        maybeInt3 = String.toInt model.number3
        sumResult =
            case ( maybeInt1, maybeInt2, maybeInt3 ) of
                ( Just a, Just b, Just c ) ->
                    String.fromInt (a + b + c)

                _ ->
                    "数値を正しく入力してください"
    in
    div []
        [ div []
            [ input [ placeholder "数字1", value model.number1, onInput UpdateNumber1 ] []
            ]
        , div []
            [ input [ placeholder "数字2", value model.number2, onInput UpdateNumber2 ] []
            ]
        , div []
            [ input [ placeholder "数字3", value model.number3, onInput UpdateNumber3 ] []
            ]
        , div []
            [ text ("合計: " ++ sumResult) ]
        ]

-- MAIN

main : Program () Model Msg
main =
    Browser.sandbox { init = init, update = update, view = view }
```

フォルダー構造

```text
$ tree
.
├── elm.json
└── src
    └── Main.elm
```

## コンパイル

```bash
elm make src/Main.elm
```

実行結果

```text
$ elm make src/Main.elm
Dependencies ready!         
Success! Compiled 1 module.

    Main ───> index.html
```

## 実行

```bash
elm reactor
```

```text
$ elm reactor
Go to http://localhost:8000 to see your project dashboard.
```

## ブラウザーでアクセス

http://localhost:8000/index.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/75b1d517-84b9-4d5c-94cc-64ae93c0f2e7.png)

数字を入力

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/0db0c1db-5562-4293-9b24-2e678ba65ed4.png)
🚀 Cluster APIのclusterctlをソースからビルドして使おう！

## はじめに

Kubernetes環境の管理を効率化するCluster API。その中核となるコマンドラインツール「clusterctl」をソースコードからビルドして使う方法を解説します。

ソースからビルドすることで、公式リリース前の最新機能やバグ修正パッチにすぐにアクセスでき、問題をいち早く解決できます。

## Cluster APIとは？

Cluster APIは、Kubernetesクラスタのライフサイクル管理を宣言的に行うためのツールセットです。様々なインフラストラクチャプロバイダー（AWS、Azure、GCP、vSphereなど）上にKubernetesクラスタを簡単にデプロイ、アップグレード、スケーリングできます。

clusterctlは、このCluster APIを操作するためのコマンドラインツールで、以下のような機能を提供します：

- Cluster API管理クラスタの初期化
- プロバイダーのインストール/アンインストール
- ワークロードクラスタの作成
- クラスタのアップグレード
- クラスタの移行

## ソースからビルドする具体的なメリット🔥

ソースからビルドすることには、実用的で具体的なメリットがあります：

1. **バグ修正パッチへの即時アクセス**: 問題が発生した場合、修正パッチがマージされたらすぐにビルドして適用できます。次のリリースを待つ必要がありません。

2. **最新機能の先行利用**: 次のリリースで予定されている機能を先行して試せます。新機能が自分の環境で正しく動作するか事前に検証でき、導入計画を立てやすくなります。

3. **コミュニティへの貢献**: バグを発見したり改善案を思いついたりした場合、すぐにパッチを作成してPRを送ることができます。オープンソースコミュニティへの貢献が容易になり、プロジェクトの発展に寄与できます。

## ビルド手順

### 1. リポジトリのクローン

まずはGitHubからCluster APIのリポジトリをクローンします。

```bash
ghq get https://github.com/kubernetes-sigs/cluster-api.git
cd $(ghq root)/github.com/kubernetes-sigs/cluster-api
```

### 2. ビルド

Makefileを使ってclusterctlをビルドします。

```bash
make clusterctl
```

これによりプロジェクトの標準的なビルド設定が適用され、`./bin/clusterctl`にバイナリが生成されます。

### 3. インストール

ビルドしたバイナリをPATHの通ったディレクトリに移動させます。

```bash
sudo mv ./bin/clusterctl /usr/local/bin/clusterctl
```

これでclusterctlコマンドがどこからでも実行できるようになります。

## 実際に使ってみよう！💪

### バージョン確認

まずは、ビルドしたclusterctlのバージョンを確認してみましょう。

```bash
clusterctl version
clusterctl version: &version.Info{Major:"1", Minor:"10", GitVersion:"v1.10.0-beta.0.233-1f629e15d6513f-dirty", GitCommit:"1f629e15d6513f4d5813bc3a290706dbdd35ab12", GitTreeState:"dirty", BuildDate:"2025-05-20T05:56:24Z", GoVersion:"go1.24.3", Compiler:"gc", Platform:"darwin/arm64"}
```

自分でビルドしたバイナリなので、最新のコミットハッシュが表示されます。これにより、どのバージョンのコードを使用しているかが明確になり、問題が発生した場合のトラブルシューティングが容易になります。

## トラブルシューティング

### 実行時エラーが発生する場合

clusterctlの実行時にエラーが発生する場合は、`--v=10`フラグを追加して詳細なログを確認してみましょう：

```bash
clusterctl init --infrastructure=docker --v=10
```
エージェントの複製方法【Copilot Studio】


## 同じ内容で別の設定検証をしたいときに便利！

Copilot Studioで構築したエージェントに対して、  
「設定条件を変えて検証をしたい」  
「既存のエージェントをベースに派生版を作りたい」  
といったケースはよくあります。

その際に気になるのが、「エージェントを簡単に複製できるかどうか」です。

---

## 結論

- ✅ **別環境への複製機能：あり**
- ❌ **同一環境への複製機能：なし**

---

## 別環境への複製：可能！

Copilot Studioでは、**「ソリューションのエクスポート機能」**を使うことで、**別の環境にエージェントを移すことが可能**です。

### 利用シーンの例：
- テスト環境 → 本番環境への引き継ぎ
- 検証環境間での構成コピー

---

## 同一環境での複製：基本的に手作業！

一方で、**同じ環境内でエージェントをコピーする機能は用意されていません。**  
そのため、必要に応じて**各タブごとに手作業での複製作業**が必要です。

### 主な複製方法：

- **概要タブ**  
  → 名前、説明、全般的な指示をコピペして手動で再作成

- **アクション**  
  → Power Automate の「コピーの作成」機能を使用して複製

- **トピック**  
  → コードエディターを開いて、トピックごとに内容をコピペ

---

## まとめ

| 項目             | 複製可否 | 方法                                       |
|------------------|----------|--------------------------------------------|
| 別環境への複製   | ✅ 可能   | ソリューションのエクスポート機能を使用     |
| 同一環境での複製 | ❌ 不可   | 各要素（概要・アクション・トピック）を手動で複製 |

---

> 💡 **同一環境での複製ニーズは多いはずなので、将来的な機能追加に期待したいところです！**
機械学習モデルの性能授業の整理

2024.10.17wordの整理


機械学習モデルの性能を上げるには？

1. モデルの性能を最適化する方法
機械学習では「ハイパーパラメータチューニング」という工程がとても重要です。これは、モデルの動きを決めるいくつかの設定値（例：学習率、木の深さ、バッチサイズなど）を調整して、性能を最大限に引き出す作業です。


代表的なチューニング手法：


| 手法名                     | 特徴                         |
| ----------------------- | -------------------------- |
| グリッドサーチ                 | あらかじめ決めた値の組み合わせをすべて試す      |
| ランダムサーチ                 | ランダムに値を選んで効率よく探索する         |
| ベイズ最適化                  | 過去の結果をもとに、次に試すべき良さそうな値を選ぶ  |
| Optuna, Ray Tune        | 最新の自動チューニングライブラリ（Python対応） |
| AutoML（例：Google AutoML） | モデルの作成・チューニングを全部自動でやってくれる  |

2. MLflowによる実験管理
MLflowは、機械学習の**「実験ノート」**のような役割を果たします。

MLflowでできること：

試したハイパーパラメータの記録
評価指標（例：精度、損失）の記録
作成したモデルファイルの保存
Web上で実験の結果を比較・確認できる
これにより、再現性（＝あとで同じ結果が出せること）を確保できます。

3. モデル学習に使う3つのデータ

| データ種別             | 目的                        |
| ----------------- | ------------------------- |
| Trainデータ（訓練）      | モデルを学習させるためのデータ           |
| Validationデータ（検証） | 学習途中での性能確認・ハイパーパラメータ調整に使う |
| Testデータ（テスト）      | 最後に、未知のデータへの性能（汎化能力）を評価   |

4. 損失（Loss）の見方
Train Loss：訓練データに対する誤差
Validation Loss：検証データに対する誤差
理想のパターンは：
両方とも減少している
TrainとValidationのLossが近い
Validation Lossが途中から増えていない（→過学習していない）

勾配降下法（Gradient Descent）とは？

勾配（こうばい）とは
日常的には：坂の傾き（例：「急な坂道」）
数学では：直線の傾き（方向係数）。x軸とつくる角度の変化の割合。
物理では：ある量（例：温度・速度）の変化の速さ → 勾配ベクトル
機械学習での勾配の役割：
ある関数の最小値を見つけたいとき、今いる場所からどっちに進めばいいかを「勾配（傾き）」が教えてくれます。

勾配降下法の流れ：
最初に適当な場所からスタート
その地点での勾配（傾き）を計算
勾配の逆方向に少しだけ移動（←これを「学習率」で決める）
それを何回も繰り返して、誤差が小さくなるようにする
勾配降下法で使う専門用語：
| 用語                   | 意味                            |
| -------------------- | ----------------------------- |
| 勾配 (Gradient)        | 関数の傾き。どっちに進めば最小値に近づくかを示すベクトル。 |
| 学習率 (Learning Rate)  | 一回の更新でどのくらい動くか（ステップの大きさ）      |
| 損失関数 (Loss Function) | モデルの間違いの度合いを示す関数              |
| 最適化 (Optimization)   | 損失を最小にするパラメータを探すこと            |



効率的な実験管理のためにやるべきこと

コードとデータのバージョン管理（Gitなど）
設定ファイル（YAMLなど）で条件を管理
Dockerや仮想環境で環境を固定する
MLflowなどで実験ログを自動記録

これにより、再現性とチーム内の共有がとてもやりやすくなります。
【ChatGPT＋4o Image Generation】で、幼い子どもの落書きをフォトリアルな画像にするPromptのご紹介です。


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

　今回は、幼い子どもの落書きをフォトリアルな画像にするPromptのご紹介です。

:::note info
本記事は、ChatGPT（Plus版）
で行なっております。
画像はあります。　あしからず。
:::
　ChatGPT等の動作状況を知らせる
　　OpenAIのステータスページ。
　　　[OpenAIステータス](https://status.openai.com/)
***
　こちらも載せますね。
　　[ChatGPTが使えない？ログインできない・反応しない原因やエラー時の対処法を解説](https://aismiley.co.jp/ai_news/chatgpt-error-resolution-explanation/)
***
　著作権法については
　　こちらを参照するのが
　　　良いのではないかと。

　文化庁レポートをもとにした
　　著作権法についての動画（約20分）
　　　[かいちのAI大学　【警告】ChatGPTの画像生成は危険です...【4o Image Generation】](https://youtu.be/8VLUnG-iyo0?si=rAfjMboqmNqppDGq)
***
　まずは、【ニュース】です。

　先日発表されたCodexについてです。

　ChatGPTのiOSアプリでも
　　利用可能になりました。

　[OpenAI開発者ポスト](https://x.com/OpenAIDevs/status/1924601527898951914?t=4S5ciZ-V8IhEFf1LmNUfAQ&s=19)

***（ChatGPT翻訳）***
CodexがChatGPTのiOSアプリで利用可能になりました！タスクの開始、差分の確認、変更のリクエスト、さらにはプルリクエストのプッシュまで、すべてモバイルで行えます。ロック画面のライブアクティビティでCodexの進行状況を確認したり、PCに戻ったときに続きを行うことも可能です。🏃🤳

始めるには、まずWebでCodexのセットアップを行ってから、ChatGPTアプリ内にCodexが表示されます。
***


　では、【本題】です。

　今回は、
　　幼い子どもの落書きを
　　　フォトリアルな画像にする
　　　　Promptのご紹介です。

　OpenAIから
　　Instagramの通知が
　　　届きました。

　[Instagram・ChatGPT子どもアート](https://www.instagram.com/p/DJ2hbseB5bI/?igsh=aTZ5ejZzZHI1N2h5)

　そこには
　　10枚の小さな子どもの落書きと
　　　それを画像化したものが
　　　　ありました。

　こちらはそのひとつ
![Screenshot_20250520-133852.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/bec82b6a-d8bb-4296-9f59-51d9491d437f.png)

　　↓
![Screenshot_20250520-133856.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/dd313cb8-c96f-46d6-ace1-aaa4b2b0a9e5.png)




　大人には
　　わからない落書きも
　　　画像化すると、
　　　　途端に生き生きとしてきます。

　それとともに
　　説明とPromptも
　　　ありました。

***（Gemini翻訳）***
ChatGPT ✏️: u/RudeAndReckless (Reddit) と息子
「朝、息子が私の周りをちょろちょろしていて、ChatGPTに描いた絵をいくつかフォトリアルな画像に変えてもらうのを見ていたんです。すると息子は、自分が描いた絵を持ってきて『これらを生き返らせて！』と頼んできました。彼は本当に喜んでいて、3歳の妹も大喜びしていました。今朝彼は私に『学校から帰ったらもっと絵を描いて、一緒にたくさんの絵を生き返らせようね』と言いました。とても面白かったです。」
***

　どうやら
　　もともとは
　　　お父さんが落書き？を
　　　　画像化していたようですね。

　それを見ていた子どもが
　　自分の絵を持ってきて、
　　　父親に画像化してもらった。

　妹とともによろこんで、
　　「学校から帰ったら
　　　また、やるんだ」と。

　とても微笑ましい
　　日常のひとコマです。
***
　では、Promptです。

```Text:子どもアートを画像化するPrompt
私の子供が描いたこの絵を、フォトリアルな画像またはリアルな3Dレンダリングに変換してください。それが何であるかはわかりません。想像上の生き物、物体、または何かかもしれません。元の形、比率、線の長さ、そしてすべての不完全さを、絵に描かれている通りに正確に保ってください。斜めの目、不均一な線、奇妙な模様なども含めてください。修正したり、滑らかにしたり、デザインの詳細を変更したりしないでください。
この物体を現実世界に存在するように、リアルな質感（肌、毛皮、金属など）と自然な照明で表現してください。リアルな影と、絵の雰囲気に合った環境や背景を追加できます。ただし、形や子供が作成した詳細を変更しないでください。鉛筆の質感や手描きのスタイルは含めないでください。これは写真やCGIレンダリングのように見える必要がありますが、彼らの想像に忠実であり続けてください。
```

　小さなお子さんを
　　お持ちの親御さんは
　　　試してみてください。

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

　今回は、ここまで。
AWS CLIの認証情報紐づけに手こずった話

## はじめに
AWSの各種サービスを操作する際、マネジメントコンソールだけでは実現できない処理があり、AWS CLIを利用する必要がある場面が度々あります。単一のAWSアカウントを使用している場合は比較的シンプルですが、複数のAWSアカウントを管理している場合、操作の都度、適切な認証情報に切り替える必要があります。

本記事では、私自身が複数アカウント環境下でAWS CLIの認証情報管理に苦戦した経験と、その解決策について備忘録として共有させていただきます。同様の課題に直面している方の参考になれば幸いです。

## AWS CLIとは？
AWS CLI（AWS Command Line Interface）は、Amazon Web Services（AWS）の各種サービスをコマンドラインから操作・管理するための公式ツールです。Windows、macOS、Linuxなど主要なOSに対応しており、ターミナルやコマンドプロンプトを通じて、AWSのリソースを制御できます。

https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-chap-welcome.html?utm_source=chatgpt.com

## AWS CLIのダウンロードとインストール
以下の公式ドキュメントを参考にインストールします。

https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/getting-started-install.html

インストール完了後に、コマンド実行してバージョンが表示されればOKです。

```
$ aws --version
aws-cli/2.24.17 Python/3.12.9 Windows/11 exe/AMD64
```

## アクセスキーの情報をAWS CLIに設定
以下のコマンドでアクセスキーの情報を設定
```
$ aws configure
```
対話形式で入力を求められます。
```
AWS Access Key ID [None]: Access key ID
# Enter
AWS Secret Access Key [None]: Secret access key
# Enter
Default region name [None]: 未入力
# Enter
Default output format [None]: 未入力
# Enter
```
~/.aws/credentials に設定した情報が記載されてます。

```
[default]
aws_access_key_id = *****
aws_secret_access_key = *****
```

## プロファイルの追加

別のアクセスキーの情報を追加する場合は、プロファイルを追加します。
```
aws configure --profile プロファイル名
```

また、対話形式で入力求められるので追加したいキー情報を入力して下さい。

~/.aws/credentials に追加した情報が記載されてます。
```
[default]
aws_access_key_id = *****
aws_secret_access_key = *****

[dev]
aws_access_key_id = *****
aws_secret_access_key = *****
```

## プロファイルの切り替え方法
### 方法1: コマンドごとに指定
```
aws s3 ls --profile dev
```
プロファイルを指定しない場合は、defaultが使用されます

### 方法2: 環境変数で指定（セッション中ずっと反映したいとき）
```
export AWS_PROFILE=dev
```

## で、結局何に手こずったの？
### credentialsを修正したのに、プロファイルが認識されない
エディターで直接修正したのですが、コマンド実行時にプロファイル指定しても
そんなプロファイル無いと怒られ続けました。。

### 原因は？
- WSL2のUbuntuOS経由でAWSコマンド実行していた
    - credentialsの情報はWindowsとは別で設定必要だった
    - UbuntuOSでawsコマンドインストールした場合は、credencialsが別で作成されている
- Credentialsをエディターで編集しても反映されない場合がある
    - プロファイル追加はなるべく、コマンドで行う


## 最後に
今回は、複数のAWSアカウントを扱う際のAWS CLI認証情報管理について、私が直面した課題と解決策を共有させていただきました。aws configureコマンドや認証情報ファイルの設定、プロファイルの切り替えなど、最初は煩雑に感じる作業も、一度理解してしまえば非常に効率的なワークフローを構築できます。

特に開発環境と本番環境を分離している場合や、複数のプロジェクトで異なるAWSアカウントを使用している場合には、この認証情報の適切な管理が作業効率と安全性の両面で重要になってきます。また、AWS SSO（シングルサインオン）やIAM Roleの一時的な認証情報の活用など、より高度な認証方法も検討する価値があるでしょう。

AWS CLIは一度設定を適切に行えば、その後の運用がスムーズになるツールです。この記事が、同じような課題に直面している方の一助となれば幸いです。
Notebook LM アプリ版リリース！🎊 Notebook LMの概要と活用法を簡単に紹介！

NotebookLMがアプリ版としてリリースされました！👏
[App Store](https://apps.apple.com/jp/app/google-notebooklm/id6737527615)
[Google Play](https://play.google.com/store/apps/details?id=com.google.android.apps.labs.language.tailwind&hl=ja)

この記事では`Notebook LM`の簡単な概要と自分がやっている活用法を軽く紹介します！

# Notebook LMとは？
Google NotebookLMは、AIを活用した個人用の研究アシスタントツールで、さまざまな形式のソースから重要なポイントを抽出し、要約・分析を行う機能を提供しています:writing_hand:
[Notebook LM](https://notebooklm.google/)
# 主な機能
## ソースのアップロードと分析
NotebookLMは様々な形式のコンテンツをアップロードできます。PDF、ウェブサイト、YouTube動画、音声ファイル、Google文書などをアップロードすると、AIがこれらを処理して重要な情報を抽出し、要約します。これによりユーザーは膨大な情報を効率的に把握できます。

### ソースの形式
- ファイル
  - PDF
  - txt
  - Markdown
  - 音声(mp3など)
- Google ドライブ
  - Google ドキュメント
  - Google スライド
- リンク
  - Webサイト
  - YouTube 
- テキスト
  - コピーしたテキスト

## 情報の信頼性確保
NotebookLMの特徴的な機能として、AIが生成した回答に対して、その根拠となる元ソースからの引用を明示する機能があります。これにより、AIの回答が「ブラックボックス」ではなく、検証可能な形で提供されます。

## 音声学習機能
「深く掘り下げた」ディスカッション形式で情報をオーディオ化する機能により、移動中や手が離せない状況でも学習を継続できます。
最近日本語対応しましたが、全くAI感が無く、あたかも人が自然に喋っているような感じで聞きやすいです！
（「なるほど！」とか「えーっと」なども言います）

ポッドキャスト的な使い方ができるので自分は通勤時間に流してたりします。アプリ版が出たのでより使い勝手が良くなりそうです！

## プライバシー保護
ユーザーがアップロードしたソース、クエリ、モデルからの回答などの個人データは、NotebookLMのトレーニングには使用されない設計になっています。

## 活用例
自分は開発で使用するライブラリのgithubをソースとして与えて、AIドキュメント的な使い方をしています！

知りたいリポジトリのリンク（`https://github.com/TanStack/queryなど`）の`github.com`を`uithub.com`にしてあげるとリポジトリをテキスト化してくれるので（[uithub](https://uithub.com/)）それを`Notebook LM`に食べさせて仕様を聞いたりしています。
【RTA】AWS試験 AIF-C01攻略チャート【82時間11分】

# 注意
この記事はRTA風記事です。（記事にするモチベのためにこうしてみただけで、最初からその意図で受験はしていません。）
バグ技は使用しません。
ゆっくり音声は流れません。

# はじめに
AIFを最速で攻略するRTA、はっじまるよー

## この記事を読んでわかること
- AIFの勉強方法
- 結果発表までの時間の目安

## レギュレーション
[ニコ生RTA wiki](http://niconamarta.sakura.ne.jp/index.php?page=recent_record.php)、インターネット検索で先駆者兄貴が存在するか確認しましたが、**何故か**誰もいなかったため以下にレギュレーションを設定します。
- 受けると決意した瞬間から合格を確認した瞬間までの時間を計測
- 受験の決意までに勉強することは禁止
- 勉強方法は問わない

## きっかけ
1on1での「えー一旦受ける〜？」の一言。
上記発言は他のAWS認定資格の取得のためで、そのための半額バウチャーが欲しかったから。
バウチャーがなかったらassociateでも2万2千円。。。

## 保有資格と経験
未経験からエンジニアになり、SREに2年ほど在籍。
本番環境の運用改善・運用ツールの保守運用などを実施。

保有資格は以下の通り。
- SAA
- CLF

## AIFとは？
[AWS Certified AI Practitioner は、人工知能 (AI)、機械学習 (ML)、生成 AI の概念とユースケースに関する需要の高い知識を実証します。](https://aws.amazon.com/jp/certification/certified-ai-practitioner/)(AWS公式サイト)

試験時間は90分で65問を解いていく。

# 実況
それでは開始。
金曜日12時、タイマースタート。

## 申し込み（1時間）
まず退路を断つために申し込みます。
そのために、難易度の肌感覚を掴むため、Udemyを軽く見ます。
今回は翌日でもワンチャンいけそうに感じたため、翌日を目指します。
今回は翌日受験を検討しましたが、土曜日は用事があったため断念。
日曜日はテストセンターが開いておらず断念。
結果、月曜日の10時〜に決定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3515837/25a2d82e-1351-4ac3-8ff4-32a5ea967060.png)

3年後再走する場合は翌日に申し込める日程で開始した方がタイムの短縮が見込める。

## 勉強方法
- Udemyを全部見る
- 付属している模擬試験を解く
- [CloudLisence](https://cloud-license.com/exam/aif/)を全部やる

今回見たUdemy↓
https://works-hijp.udemy.com/course/aws-ai-practitioner/

これを仕事の合間＆休暇の合間にやっていきます。
たとえそれがゴルフの打ちっぱなしの待ち時間でも。。

CloudLisenceは3周して正答率を100％にしました。
模擬試験も受験しました。（同じ問題なので答え覚えてるけど。）
Udemyの模擬試験も8割ちょっとの正解率を維持できるようにしました。

## 本番（70時間経過）
10時前に会場へ到着。いつも通りの説明をされて例の部屋にイン。
早速解き始める。
「あっ！！これゼ⚪︎でやったところだ！」
だいたい見覚えがありました。UdemyとCloudlisenceすごい。

20分程度で1周目解き終わり、分からずフラグをつけたのが8問。
わからんので直感を信じて、最終的に30分くらいで解き終わりました。
あとは待つだけ。

## 結果発表
今回なぜかメールが来ず（今も来ていない）、結果を確認したのは当日22時過ぎでした。

![IMG_7494.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3515837/4f7ff3da-8f6c-4249-8ee5-c118df4afa2a.jpeg)

781点で合格。

## タイム
金曜12時に開始、月曜22時11分に結果を確認したので、
**82時間11分**でした。


# 完走した感想
完走した感想ですが、やりきった感はあまりないです。
思ったよりも点数が伸びませんでしたが、合格したのでまぁええでしょう。引き続き勉強します。
暗記パンがあれば満点でした。

RTA的にはガバが多かったため、チャートを見直すことでさらなるタイムアップが期待できそうです。


皆さんもぜひAWS試験RTAにチャレンジしてみてくださいね！
メモ

```javascript
function filterTable() {
  const nameFilter = document.getElementById("filterName").value.toLowerCase();
  const categoryFilter = document.getElementById("filterCategory").value;

  document.querySelectorAll("tbody tr").forEach(row => {
    const name = row.cells[0].textContent.toLowerCase();
    const category = row.cells[2].textContent;

    const nameMatch = name.includes(nameFilter);
    const categoryMatch = !categoryFilter || category === categoryFilter;

    row.style.display = (nameMatch && categoryMatch) ? "" : "none";
  });
}

document.getElementById("filterName").addEventListener("input", filterTable);
document.getElementById("filterCategory").addEventListener("change", filterTable);
```
```html
<script>
let currentSort = { col: -1, asc: true }; // 昇順/降順の状態

function sortTable(colIndex) {
    const table = document.getElementById("aaTable");
    const tbody = table.tBodies[0];
    const rows = Array.from(tbody.rows);

    // 昇順 / 降順 切り替え（同じ列ならトグル、別列なら昇順）
    if (currentSort.col === colIndex) {
        currentSort.asc = !currentSort.asc;
    } else {
        currentSort.col = colIndex;
        currentSort.asc = true;
    }

    rows.sort((a, b) => {
        let valA = getCellValue(a.cells[colIndex]);
        let valB = getCellValue(b.cells[colIndex]);

        // ソートの方向に応じて比較
        return currentSort.asc
            ? valA.localeCompare(valB, 'ja')
            : valB.localeCompare(valA, 'ja');
    });

    rows.forEach(row => tbody.appendChild(row));
}

// セルの中身を取得（select対応）
function getCellValue(cell) {
    const select = cell.querySelector("select");
    if (select) {
        return select.options[select.selectedIndex].text.trim();
    } else {
        return cell.textContent.trim();
    }
}
</script>
```

```jsp
<table id="aaTable" border="1">
    <thead>
        <tr>
            <th onclick="sortTable(0)">ID</th>
            <th onclick="sortTable(1)">名前</th>
            <th onclick="sortTable(2)">日付</th>
        </tr>
    </thead>
    <tbody>
        <c:forEach var="item" items="${masterList}">
            <tr>
                <td>${item.id}</td>
                <td>${item.name}</td>
                <td>${item.date}</td>
            </tr>
        </c:forEach>
    </tbody>
</table>

```
tf-import-genでplanからterraformのimport blockを生成する



[tf-import-gen](https://github.com/kishaningithub/tf-import-gen)を利用して、terraformをimportする際に planから
import blockの生成を行う方法を記載します。



# tf-import-genとは

terraform showの結果(json)をterraform の import blockで出力してくれるコマンドラインツールです。
```
# 公式リポジトリより引用
$ terraform show -json | tf-import-gen

import {
  to = module.example.aws_glue_catalog_database.example_db
  id = "123456789012:example_db"
}
...
```

# planの結果をimport blockに出力したい

planので同様のことができれば、未インポートのresourceに関しても、
import blockを書かずとも自動生成可能になります。（新規のリソース扱いになるので、resourceのIDは別途書き換えが必要です）

planの結果をそのままjsonに出力するだけでは構造が異なるのでエラーとなりますが、
json内の下記を変更することで、tf-import-genでも利用可能です。

- .planned_values のキー名を .values に変更

```
...
  },
  "planned_values": {
...    
```
↓
```
...
  },
  "values": {
...    
```

# 実行イメージ
```
# planをjson出力
terraform show -json > plan.json

# 前述のようにjsonを書き換え
.....

# tf-import-genで、import blockを生成
cat plan.json | tf-import-gen
```

gcloud beta resource-config bulk-exportなどで生成したリソースをimportしたい際に使えるかも？
【ポートフォリオ開発記】 #5 ユーザーサービスの作成

## はじめに
今回はServiceを実装していきます！
Serviceは`Spring Boot アプリケーションにおける「ビジネスロジック層（サービス層）」`ですね！

では実装していきましょう！

## コード

```java
package com.example.noteapp.backend.service;

import com.example.noteapp.backend.entity.User;
import com.example.noteapp.backend.repository.UserRepository;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.Optional;

@Service
@Transactional
public class UserService {

    private final UserRepository userRepository;

    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public List<User> findAll() {
        return userRepository.findAll();
    }

    public Optional<User> findById(Long id) {
        return userRepository.findById(id);
    }

    public User save(User user) {
        return userRepository.save(user);
    }

    public void deleteById(Long id) {
        userRepository.deleteById(id);
    }
} 
```


## アノテーションの説明

#### `@Service`
- このクラスが **サービス層**であることを示す
- Spring によってDI対象（Bean)として管理される

#### `@Transactional`
- メソッド単位で **トランザクション処理**を行う
- 複数のDB操作がある場合、一括でコミット／ロールバックできる



## コンストラクタ

```java
public UserService(UserRepository userRepository) {
    this.userRepository = userRepository;
}
```

- `UserRepository` を依存注入（DI）
- DBアクセスに必要なリポジトリをサービスクラスに渡している



## 各メソッドの解説

### `findAll()`
```java
public List<User> findAll()
```
- **全ユーザーを取得**する
- 戻り値は `List<User>`

---

### `findById(Long id)`
```java
public Optional<User> findById(Long id)
```
- **指定した ID のユーザーを取得**
- `Optional<User>` を返し、ユーザーが存在しないケースにも対応

#### Optionalを使う理由
| 理由                       | 解説                                             |
|----------------------------|--------------------------------------------------|
| 存在しないIDを扱う可能性があるから | `findById` は「見つからないかも」という状況を想定しているため。   |
| 例外を投げずに、呼び出し側に判断を委ねられるから | Controllerや別のServiceが「404返す？例外投げる？無視する？」などを自由に選べる。 |
| 柔軟性・テスト性が上がる         | 「存在しないとき」のテストも書きやすくなる。                       |


---

### `save(User user)`
```java
public User save(User user)
```
- ユーザー情報を **新規作成 or 更新**
- ID がある → 更新、ID がない → 新規登録

---

### `deleteById(Long id)`
```java
public void deleteById(Long id)
```
- 指定したユーザーを **削除**

## 補足

コントローラーにビジネスロジックを直接書かないことで、**責務の分離**が実現できます。
将来的に処理が増えても、この `UserService` に処理を集約することで保守性が高まります。




## まとめ

| メソッド名        | 説明                        |
|------------------|-----------------------------|
| `findAll()`      | 全ユーザーの一覧を取得      |
| `findById(id)`   | ID を指定してユーザー取得   |
| `save(user)`     | ユーザーの保存（新規/更新） |
| `deleteById(id)` | ユーザーの削除              |
結局ナレッジって何個つけれるの？

# 結局Copilot Studioで作ったエージェントにナレッジは何個つけられるのか？

Copilot Studioでエージェントを構築する際、「ナレッジはいくつまで追加できるのか？」という疑問を持つ方は多いのではないでしょうか。  
特に**ローカルファイル**と **SharePoint上のファイル** では、制約が異なります。

---

## 現時点での制約まとめ（2025年5月時点）

整理すると以下のようになります。

### ✅ SharePoint Online上のファイルをナレッジとして追加する場合

- **ファイル数：制限なし**
- **ファイルサイズ：1ファイルあたり最大 7MB**

📎 参照：[Microsoft Learn - SharePoint からのナレッジの追加](https://learn.microsoft.com/ja-jp/microsoft-copilot-studio/knowledge-add-sharepoint)

---

### ✅ ローカルファイルをアップロードする場合

- **ファイル数：最大 500件**
- **ファイルサイズ：1ファイルあたり最大 512MB**

📎 参照：[Microsoft Learn - ローカルファイルのアップロード](https://learn.microsoft.com/ja-jp/microsoft-copilot-studio/knowledge-add-file-upload)

---

## まとめ

| 区分 | ファイル数上限 | ファイルサイズ上限 |
|------|----------------|---------------------|
| SharePoint Online | 無制限 | 7MB / ファイル |
| ローカルファイル | 最大500件 | 512MB / ファイル |

今後仕様が変更される可能性もあるため、最新情報は公式ドキュメントで確認するのがベストです。

---

> 💡 **効率的にナレッジを管理するためには、用途やファイルサイズに応じて、SPOとローカルファイルを使い分けるのがオススメです。**
【Copilot Studio】ナレッジの説明は書くべし！【Copilot Studioの精度を上げるには？】


## ナレッジ説明を詳しく記載する重要性

Copilot Studioでの応答精度を高めるには、「ナレッジの説明」を丁寧に記載することが非常に重要です。

デフォルトでは、以下のような簡易的な説明が自動入力されています。

> このナレッジソースはSharePointの○○.pptx にある情報を提供します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524942/048b9df8-97d1-4b3c-be91-323d4dd53a15.png)


しかし、**この説明をより具体的かつ詳細に記載することで、Copilot Studioの生成オーケストレーション機能はナレッジを適切に絞り込み、より正確な回答を生成する**と、[公式ドキュメント](https://learn.microsoft.com/ja-jp/microsoft-copilot-studio/knowledge-copilot-studio)にも明記されています。

---

## 実践例：ナレッジ説明を強化してみた

実際に筆者が試したケースでは、ナレッジの説明欄に以下の内容を記載しました。

- **目次**
- **ファイルの要約**
- **頻出するキーワードやトピック**

このような補足情報を加えた結果、**エージェントの回答精度が向上**しました。  
※ただし、これはあくまで筆者の所感によるものであり、定量的な検証に基づいたものではありません。

---

## ナレッジだけでなくアクションやトピックにも影響

さらに、上記のナレッジ説明の改善は、**アクションやトピックの精度向上にも関係する**と、公式文書に記載があります。

ただし、この効果が発揮されるのは、**生成オーケストレーション機能をオンにしている場合**ですので、設定状況を確認のうえ、活用するのがよいでしょう。

---

## まとめ

- ナレッジの説明欄には、できるだけ具体的かつ詳細な情報を記載するのがベスト
- 目次、要約、頻出キーワードの記載が有効
- この工夫はナレッジだけでなくアクションやトピックにも有効（生成オーケストレーションがオンの場合）
- 回答精度向上は実感としては有効だが、現時点では定量的な裏付けは不十分

Copilot Studioの効果を最大化するためにも、ナレッジの説明を見直してみてはいかがでしょうか。

---

> 💡 **ナレッジ説明の最適化、始めてみませんか？**  
> ぜひ皆さんもCopilot Studioで試してみてください！
Googleのコーディングエージェント「Jules」を早速使ってみた！

この記事は、Googleから発表されたコーディングエージェント「Jules」を試した記録です。
結構前から発表はされてましたが、ついに来ましたね！
最近出たOpenAIのCodexに近いのかなと思ってます（実際には使えてないですが…）

なんと今のところ無料で使えます！！

# Julesとは？
（日本語訳）Jules は、バグ修正、ドキュメント追加、アプリのアップデート、新機能の実装を支援するソフトウェアコーディングエージェントです。GitHub と統合されており、非同期で動作します。つまり、タスクを送信した後、別の作業を行い、完了したら再開することができます。Jules は現在パブリックベータ版です。
> Jules is a software coding agent that helps you fix bugs, add documentation, update your app, and implement new features. It integrates with GitHub and works asynchronously — meaning you can submit a task, go do something else, and return when it’s done. Jules is currently in Public Beta.

https://jules.google/docs

Jules は仮想マシンで実行され、リポジトリのクローンを作成し、依存関係をインストールし、プロンプトに基づいて変更を加えるような動きをするみたいです。

## 画面

画面は以下のような感じになってます！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697143/16b45f8c-1015-4792-b492-31401cc28dd0.png)

GitHubに接続するとチャット部分が以下の表示に切り替わります
左上でリポジトリ選択、右上でブランチを選択できます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697143/7fd3efd9-f39c-41bd-a6d2-14189741799e.png)


ちなみにスマホからも使えそうでした！！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697143/c27c5279-634b-4c8d-9274-035a2d96092e.png)


# 利用方法
- Googleアカウントがあれば https://jules.google.com で使用できます
- waitリストで待つ状態になり、すぐには使えないかもしれません

# 試す
## タスクの実行をしてみる
お願いしたいタスク内容を入力して送信すると、まずは英語で実装計画が返って来ました
日本語にするようにお願いしたらしてくれました！
（タスク内容などは重要ではないので割愛）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697143/43234317-69d0-4f00-b2dc-b516dc01bbee.png)

数分で以下のように実装してくれました！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697143/29ccbf66-9587-4acd-a2c5-aa310250c9d3.png)

問題ないことを伝えると、PRのベースを作ってくれました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697143/0de7aa79-66d1-41ca-b41b-6f9b63ae0310.png)

「Publish branch」を押して、GitHubで見るとこんな感じです！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697143/f7245b66-4d09-4715-88e6-f39f20b5405c.png)

かなりシンプルな内容にはなりますが、UIも分かりやすいし、割とサクサク動いて良い感じでした！
通知の設定をできるのも助かりますねー

ちなみに当たり前ではありますが、プロンプトが具体的かつスコープが限定されているときに最も効果を発揮すると記載がありました👀

https://jules.google/docs/running-tasks/#write-a-clear-prompt

## コードキャストを試してみる
コードキャストというコードに関する音声概要？を生成する機能もあったので試します
左サイドバーでCodebasesを選択すると表示される画面の右側にあります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697143/67ca446d-348d-4871-80d6-8b6c63a201ce.png)

「Generate today's」をクリックすると数分でできたのですが、英語でした😭
再生位置の指定やダウンロードも無いのでちょっと不便かなという感じです

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697143/47afbd6f-6b5d-4bec-9df8-1e77cec986eb.png)


# 制限事項
以下の制限事項があったので記載しておきます🙇
- タスクの同時実行数: 3
- 1日あたりのタスク: 5
- 1日あたりのコードキャスト: 5

一応上限を上げるリクエストフォームもありました👀

https://jules.google/docs/usage-limits/#requesting-higher-limits

# おわりに
ここまで読んでくださりありがとうございます！
実験的かつ制限はありますが、これが無料で使えるのがとてもありがたいですね
Codex使っている人の比較とかも見てみたいです
Devinにサービスアカウントの環境変数（GOOGLE_APPLICATION_CREDENTIALS）を渡すのでハマった

# 概要
- Firebaseを利用したプロジェクトで動作検証できるようにしたかった
    - Firebase Emulatorを起動するのに、`firebase login` が必要だったが、Devinなので、サービスアカウントでパスするようにしたい。ってなった
- JSONファイルをアップロードするのは嫌だったので、DevinのSecretsにJSON文字列押し込んだ
- それをDocker Composeに渡せるようにしたメモ

# 前提

下記でDocker環境は用意した

https://zenn.dev/cbcloud_blog/articles/6256f1a3d05a18

また、サービスアカウントは最低限のロールだけ渡してJSONダウンロードした → それをDevinのSecretsに保存した

# 手順

## Devin用のcompose.yamlを用意する

人間（？）の開発環境にはいらない場合はcompose.yamlをオーバーライドする方式で進める

```bash
$ docker compose -f compose.yaml -f compose-devin.yaml up -d
```

`compose-devin.yaml`はこう用意した（これはGeminiに書いてもらった）

```yaml
services:
  firebase:
    environment:
      # ホストの DEVIN_CREDENTIALS (サービスアカウントJSONの文字列) の値を
      # コンテナ内の環境変数 GA_ に設定します。
      - GA_=${DEVIN_CREDENTIALS}
    command: >
      sh -c '
        # 1. 環境変数 GA_ (JSONの内容) が空でないか基本的なチェック
        #    空の場合はエラーメッセージを出力して終了します。
        if [ -z "$$GA_" ]; then
          echo "Error: Service account JSON content from environment variable is empty. Halting." >&2
          exit 1
        fi &&
        # 2. 環境変数の内容 (JSON文字列) を /opt/service-account.json ファイルに書き出します。
        #    printf を使い、変数は $$ でエスケープします。
        printf "%s" "$$GA_" > /opt/service-account.json &&
        # 3. Firebase CLI が参照する GOOGLE_APPLICATION_CREDENTIALS 環境変数に、
        #    作成したファイルのパスを設定します。この export はシェル内なので $$ は不要です。
        export GOOGLE_APPLICATION_CREDENTIALS=/opt/service-account.json &&
        # 4. Firebase Emulators を起動します。
        firebase emulators:start --import=./export-data
      '
```

以上。終わり

# ハマったところ

`compose-devin.yaml`の`environment`で設定した環境変数を`command`で読み込むところでハマりました:innocent:（Devin全然関係ない）

`printf を使い、変数は $$ でエスケープします。` これ（ハマったときは `$` 一個だけで渡らない！！渡らない！！！ってなってた）

ちなみに、`environment` にもわたっていない可能性もあるので、下記コマンドでデバッグください

```bash
$ docker compose -f compose.yaml -f compose-devin.yaml config
```

composeで読まれるyamlの内容が表示されるので、この時点で`environment`の内容が意図したものじゃなければ違う問題


# 雑感

* Devin楽しい！！（細かいタスクは瞬殺されてPRあがってくる。そして僕のレビューで詰まる）
    * Dead Lock man（ボトルネックともいう）
* 今更だけど「Workload Identity Provider」を使ってもよかったのかもしれない
    * 自分のプロジェクトだと、GitHub Actionsからデプロイするときに利用している
    * ただ、AIにデプロイさせるのは現時点ではまだ怖いので、ここも最低限のロールだけ（開発に必要なものだけ）