OmniAICreator/Qiita-1.07M huggingface dataset:
Visual Studio C# デバック操作

# デバッグ実行での基本操作
### デバッグ実行(F5)
デバッグなしで実行するにはCtrl+F5
### ブレークポイントの設定解除(F9)
### ステップオーバー(F10)
ブレークポイントで一時停止中の場所から一行一行実行した場合は、F10を押す
### ステップイン(F11)
一時停止中の行にある関数に入りたい場合はF11を押す
### ステップアウト(Shift+F11)
一時停止中の関数から外に出たい場合はShift+F11を押す
### カーソル行の前まで実行(Ctrl+F10)
forループの外まで実行したいときなどに、カーソルを実行した行まで移動してCtrl＋F10を押すことで、そこまで一気に実行する

# ブレークポイントについて
### 特定の条件の時に一時停止する方法
ブレークポイントの赤丸を右クリックで表示されるメニューから「条件」を選ぶと「ブレークポイント設定」というのがインライン(その場に表示される)で表示されるので条件を追加できる
### デバック実行中にリアルタイムに値を確認する方法
一時停止させずにリアルタイムに値を確認したのであれば「アクション」というチェックボックスにチェックを入れ、入力欄に{x}のように表示したい変数を入力すると、出力すると「出力」ウィンドウにxの値が出力される
### 変数の値を確認・変更する方法
ステップ実行をしているときに変数の値を確認した場合はマウスカーソルを変数に重ねるだけで表示できるが、より詳しく見たい場合は、変数の場所で右クリックし「クイックウォッチ」を選ぶか、Shift+F9を押す
### すでに実行中のプログラムに対してデバックする方法
デバッグしたいプログラムが別のプログラムから実行される場合やDLL(DLL（Dynamic Link Library、ダイナミックリンクライブラリ）とは、Windows環境で利用される実行可能なコードのライブラリの一種)の場合は「プロセスにアタッチ」(Ctrl+Alt+P)を使う

# slnとvcxprojの役割
### sln(solutionファイル)の役割
##### 役割と概要
.slnファイルはVisual Studioのソリューションを表すファイルで、ソリューションは複数のプロジェクトをまとめた単位で、一つのアプリケーションやライブラリ、または関連する複数のコンポーネントをひとまとめにして管理するために使われる
##### 主な内容
・プロジェクトの参照
    ソリューションに含まれる各プロジェクトのファイルパスや識別情報が記述されている
・ソリューション固有の設定
    ビルド構成（Debug/Release）や、ソリューション全体に影響する設定、各プロジェクト間の依存関係の情報などが含まれている
・ファイル形式
    プレーンテキスト形式で、Visual Studio によって自動生成・編集されている
### .vcxprojファイル(Visual C++ プロジェクトファイル)
##### 役割と概要
・個別プロジェクトの設定:
    .vcxproj ファイルは、Visual C++ 用のプロジェクトファイルであり、C++ のソースコード、ヘッダーファイル、リソース、コンパイラのオプション、リンカ(プログラムの各部品（オブジェクトファイルやライブラリ）を結合し、実行可能なプログラムを生成する重要なツール)の設定など、プロジェクト固有の情報を管理します
##### 主な内容
・ファイルのリスト
・ビルド設定
・参照設定
・XML形式

## 全体の流れ
ソリューションファイル(.sln)は複数のプロジェクトをまとめるコンテナのようなもので開くと各プロジェクトの情報も自動的に酔いこまれプロジェクト間の関係や全体のビルド設定が反映される。その後プロジェクトファイル(.vcxproj)は実際のコードや設定が記載されたファイルでこれに基づいて、Visual Studioが実際のビルドプロセスを実行する
App RouterとPages Routerを比べてみよう

## 目標
- Next.jsのApp RouterとPages Routerの違いを理解する。
- それぞれのメリットとデメリットを比較する。
- 簡単な例で両者を試してみる。

---

## 1. App RouterとPages Routerとは？
Next.jsには2つのルーティングシステムがあります。**App Router**（Next.js 13以降で導入）は新しいアプローチで、Server Componentsや柔軟なディレクトリ構造が特徴です。一方、**Pages Router**は従来の方法で、シンプルで直感的です。この記事では両者を比較し、どちらを使うべきか考えます。

---

## 2. App Routerの特徴
App Routerは`app/`ディレクトリを使い、最新技術を活用します。

### 例：`app/page.tsx`
```tsx
export default function Home() {
  return (
    <div className="p-6">
      <h1 className="text-2xl font-bold">App Routerのホーム</h1>
      <p>Server Componentsで軽快に動作します。</p>
    </div>
  );
}
```

- **メリット**：
  - Server Componentsで初期ロードが高速。
  - ネストされたレイアウト（`layout.tsx`）が簡単。
  - 動的ルーティングやAPIが統一的。
- **デメリット**：
  - 新しいため学習コストが高い。
  - 一部のライブラリが未対応の場合あり。

---

## 3. Pages Routerの特徴
Pages Routerは`pages/`ディレクトリを使い、従来のNext.js開発者に馴染み深いです。

### 例：`pages/index.tsx`
```tsx
export default function Home() {
  return (
    <div className="p-6">
      <h1 className="text-2xl font-bold">Pages Routerのホーム</h1>
      <p>シンプルで直感的なルーティング。</p>
    </div>
  );
}
```

- **メリット**：
  - シンプルで初心者に優しい。
  - 既存プロジェクトやドキュメントが豊富。
  - クライアントサイドの動作がわかりやすい。
- **デメリット**：
  - Server Componentsが使えない。
  - 大規模アプリでレイアウト管理が煩雑に。

---

## 4. 実践：両者を試す
簡単なブログページを両方で作ってみます。

### App Router版：
1. `app/posts/[id]/page.tsx`を作成：
   ```tsx
   import { supabase } from '../../../lib/supabase';

   export default async function Post({ params }: { params: { id: string } }) {
     const { data: post } = await supabase.from('posts').select('*').eq('id', params.id).single();
     return (
       <div className="p-6">
         <h1 className="text-xl font-bold">{post?.title}</h1>
         <p>{post?.content}</p>
       </div>
     );
   }
   ```

### Pages Router版：
1. `pages/posts/[id].tsx`を作成：
   ```tsx
   import { useRouter } from 'next/router';
   import { supabase } from '../../lib/supabase';

   export async function getServerSideProps({ params }) {
     const { data: post } = await supabase.from('posts').select('*').eq('id', params.id).single();
     return { props: { post } };
   }

   export default function Post({ post }) {
     const router = useRouter();
     if (!post) return <div>投稿が見つかりません</div>;
     return (
       <div className="p-6">
         <h1 className="text-xl font-bold">{post.title}</h1>
         <p>{post.content}</p>
       </div>
     );
   }
   ```

**確認**：
- `npm run dev`で起動し、`http://localhost:3000/posts/1`で動作を比較。

---

## 5. どっちを選ぶ？
- **App Router**：新プロジェクトやパフォーマンス重視の場合。将来性が高い。
- **Pages Router**：既存プロジェクトの継続やシンプルさを求める場合。

---

## まとめ
- App RouterとPages Routerの違いを体験しました。
- プロジェクトのニーズに応じて選択できます。

この記事が役に立ったと思ったら、ぜひ「いいね」を押して、ストックしていただければ嬉しいです！あなたのNext.jsプロジェクトでどちらか試してみてください！
write a program to store and print the roll no name 

https://docs.vultr.com/clang/examples/store-information-name-roll-and-marks-of-a-student-using-structure


write a program to store and print the roll no name , age and marks of a student using structures, structure program in c for student details Here is a simple C program to store and display student details using a structure
#include <stdio.h>

// Define a structure for student details
struct Student {
［メモ］Vite + Web Worker使用時の留意事項

# dom event
dom event（resize, mousedown等）は、worker内で使用できないので、メインスレッドで発火させて値をpostする。

# workerファイルの読み込み
以下、2パターンある。
[Vite | Web Workers](https://ja.vite.dev/guide/features.html#web-workers)

```ts
const worker = new Worker(new URL('./worker.js', import.meta.url), {
  type: 'module',
})
```
```ts
import MyWorker from './worker?worker'

const worker = new MyWorker()
```

# vite pluginの適用
worker.pluginsを設定しないと、buildエラーになる。
[Vite | worker.plugins](https://ja.vite.dev/config/worker-options.html)

```js
plugins: [glsl(), tsconfigPaths()],

worker: {
  plugins: () => [glsl(), tsconfigPaths()],
},
```

# Three.jsを使う場合の留意点
## OffscreenCanvasにstyle属性を与える

> Three.jsは内部でcanvas要素のstyle属性にアクセスします。しかし、OffscreenCanvasはDOM要素ではないため、style属性を持ちません。Three.jsで使用する場合はランタイムエラーを避けるため、OffscreenCanvasオブジェクトに明示的にstyleプロパティを付加します。
[Three.jsでオフスクリーンキャンバスを使う](https://ics.media/tutorial-three/offscreencanvas/)

```ts
;(offscreenCanvas as any).style = { width: 0, height: 0 };
```

## Textureインポート
three.jsのTextureLoaderは、domに依存した処理のためworker内では使用できない。
代わりにBitmapLoaderを使用する。

~~注意点としては、Bitmapはalpha値を扱えないので、透過画像を扱いたい場合は適宜alpha map（透過情報を白黒で表したmap）を作る必要がある。~~

```ts
  private async loadAssets() {
    const loader = new THREE.ImageBitmapLoader()
    loader.setOptions({ imageOrientation: 'flipY' })
    const bitmap = await loader.loadAsync(import.meta.env.BASE_URL + 'assets/webgl/sample.webp')

    const texture = new THREE.CanvasTexture(
      bitmap,
      THREE.UVMapping,
      THREE.ClampToEdgeWrapping,
      THREE.ClampToEdgeWrapping,
      THREE.LinearFilter,
      THREE.LinearFilter,
      THREE.RGBAFormat,
      THREE.UnsignedByteType,
    )

    return texture
  }
```
[Three.js | ImageBitmapLoader](https://threejs.org/docs/#api/en/loaders/ImageBitmapLoader)
[bitmap options](https://developer.mozilla.org/ja/docs/Web/API/Window/createImageBitmap)
Next.jsを使ってPWAを構築してみよう


## 目標
- Next.jsでPWA（Progressive Web App）の基本を理解する。
- `next-pwa`を使ってPWA機能を追加する。
- ブログをオフライン対応のアプリに変える。

---

## 1. PWAとは？なぜNext.jsで作る？
PWAはウェブアプリをネイティブアプリのように使える技術で、オフライン対応やプッシュ通知が特徴です。Next.jsは簡単にPWA化できるツールがあり、迅速な開発が可能です。この記事では、既存のブログをPWAにしてみます。

---

## 2. 必要なライブラリのインストール
PWAを実現するために`next-pwa`を導入します。

### 手順：
ターミナルで以下を実行：
```
npm install next-pwa
```

---

## 3. PWAの設定
プロジェクトにPWA機能を追加します。

### `next.config.js`の編集：
```js
const withPWA = require('next-pwa')({
  dest: 'public',
  disable: process.env.NODE_ENV === 'development', // 開発中は無効化
});

module.exports = withPWA({
  // 既存の設定があればここに追加
});
```

### マニフェストファイルの作成：
`public/manifest.json`を作成：
```json
{
  "name": "Next.js 2025ブログ",
  "short_name": "Nextブログ",
  "start_url": "/",
  "display": "standalone",
  "background_color": "#ffffff",
  "theme_color": "#1e40af",
  "icons": [
    {
      "src": "/icon-192x192.png",
      "sizes": "192x192",
      "type": "image/png"
    },
    {
      "src": "/icon-512x512.png",
      "sizes": "512x512",
      "type": "image/png"
    }
  ]
}
```

### アイコンの準備：
- `public/`に`icon-192x192.png`と`icon-512x512.png`を配置（任意の画像をリサイズして使用）。

### `app/layout.tsx`の編集：
```tsx
import '../globals.css';
import Link from 'next/link';

export const metadata = {
  title: 'Next.js 2025ブログ',
  description: '2025年の最新技術で作られたブログサイト',
};

export default function RootLayout({ children }) {
  return (
    <html lang="ja">
      <head>
        <link rel="manifest" href="/manifest.json" />
        <meta name="theme-color" content="#1e40af" />
      </head>
      <body className="font-sans antialiased">
        <header className="bg-blue-800 text-white p-4">
          <nav className="max-w-4xl mx-auto flex justify-between items-center">
            <Link href="/" className="text-xl font-bold">ホーム</Link>
            <div className="space-x-4">
              <Link href="/about" className="hover:underline">About</Link>
              <Link href="/add-post" className="hover:underline">投稿追加</Link>
            </div>
          </nav>
        </header>
        <main>{children}</main>
        <footer className="bg-gray-200 p-4 text-center text-gray-600">
          © 2025 Next.js学習シリーズ
        </footer>
      </body>
    </html>
  );
}
```

---

## 4. オフライン対応の確認
Service Workerが動作し、オフラインでもページが表示されるようにします。

### 手順：
1. `npm run build && npm run start`で本番環境をシミュレート。
2. ブラウザで`http://localhost:3000`にアクセス。
3. Chrome DevToolsの「Application」タブでService Workerが登録されているか確認。
4. ネットワークを「Offline」に切り替え、リロードして動作を確認。

---

## 実践：PWAブログ
- **オフライン対応**：ネットワークがなくてもページが表示。
- **インストール可能**：ブラウザから「インストール」オプションが表示。

**確認**：
- Lighthouseの「Progressive Web App」スコアを確認（90以上を目指す）。
- スマートフォンで「ホーム画面に追加」を試す。

---

## まとめ
- `next-pwa`で簡単にPWA化を実現しました。
- ブログがオフラインでも使えるアプリになりました。

この記事が役に立ったと思ったら、ぜひ「いいね」を押して、ストックしていただければ嬉しいです！あなたのNext.jsプロジェクトでもPWAを試してみてください！
初心者の日記1

プログラミング初心者の僕がplaygroundsを使ってswiftUIに触れてみようと思い立ったところ。
折角なので、日々の学びの記録をつけようと思いたち、少しずつ日記としてQiitaへ投稿していくことにしました。
何にも学んで無いじゃん！な回もありそうな気がする…けどそれはそれで。

![IMG_0073.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2201389/109318e7-6057-4e7a-ad70-df71ad21c70e.png)

とりあえず昨晩はここまで。

書き方すごいクセあるな〜って思うなど。
改行して列挙するだけ。おもろ。

特にこちらから指定しなかったら真ん中にドーン！
スペーサー入れるってことは上下に分けたいんでしょ？ドンドーン！！！
スペーサー2個入ってるな？じゃあ上中下ってことでしょ！ドドンがドーーン！！！

ふっ……おもしれーやつ…。

ボタン周りの挙動も面白いなって

僕の数少ない知識の中にあるのは

ボタン
　クリックされたか監視
　ボタンクリックされたらアクションパート発動！
アクションパート
　計算
　ラベル表示の更新
  
これくらいの記述が必要…というざっくりした認識なので、だいぶ面食らってしまった。
WithAnimationの中で全部処理してくれるのおもろすぎるな？オラワクワクすっぞ。
僕の知識分と似たような書き方もできるんだろうけど、どうなんだろな。探してみなきゃ。




それから日記を書こうとして一番最初に「Markdown記法ってなんやねん！！！」と白目を剥いたので、
その辺も含めて普通に使える程度まで学習を進めていきたいところ。

…もしかしてiPhoneからぽちぽちTwitter感覚で書いておくか〜と思ってたの、大きな間違いだった？
作業しながら参考にしたものとかメモしていく感じが良さそう。

こういうのも学び…ということで。
ブラウザから、後で記事を読む「Readeck」を導入したので使い心地を書いてみる。

最近、ネットで「Omnivore.app」なるものを知りました。
今まで全然、知らなかったのですが、ブラウザやモバイルで、後で記事を読む機能があるアプリらしいです。
が、それを導入しようとしたところ、サービスは終了していました。

そこで、Noteの記事を見ると、同じようにお代替サービスがないかを探している記事を見かけました。

https://note.com/p510hv/n/n5cddd75bc237

「Readeck」なんか、よさそう。

## 導入方法

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3304752/188d7331-3ea2-40bf-bbdc-d6f75cbf3877.png)

これが実際の、Readeckを導入したところの場面です。

セルフホスト式なので、自分でサーバーを用意しないといけないのです。
必要であればVPSなども考えてみるといいかもしれません。（モバイル向け）

最初は、DockerDesktopなるものを起動してターミナルで、

```terminal
docker run --rm -ti -p 8000:8000 -v readeck-data:/readeck codeberg.org/readeck/readeck:latest
```

叩いたんです。

が、

データが一時的に消えてしまったので、別の方法を試しました。

### compose.ymalを作る

そのままなので、コードを貼り付けます。


```compose.yml
version: "3.8"

services:
  readeck:
    image: codeberg.org/readeck/readeck:latest
    container_name: readeck
    ports:
      - "8000:8000"
    volumes:
      - readeck-data:/readeck # 名前付きボリューム readeck-data をコンテナ内の /readeck にマウント
    restart: unless-stopped # コンテナが停止した場合、手動で停止しない限り再起動する

volumes:
  readeck-data: {}
```

とこのように、`docker compose up -d` を叩けば

```
http://localhost:8000
```
でみることができます。



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3304752/ed6506e7-523a-443c-9de8-84ecc3c2cdf8.png)

上手く取得すると、こんな感じで後で記事を確認ができるのでおすすめです！

私も、このReadeckで気に入った記事を登録した後に、Obsidianに自分なりにメモを取るのが好きです。


以上。
Next.jsとSupabaseでリアルタイムアプリを簡単に作ってみよう

## 目標
- Next.jsでリアルタイム機能の必要性を理解する。
- Supabaseのリアルタイム機能を使ってデータを即時更新する。
- ブログに新しい投稿が追加された際の通知を実装する。

---

## 1. リアルタイム機能の重要性
企業向けやユーザーエンゲージメントを重視するアプリでは、リアルタイム更新が求められます。Supabaseのリアルタイム機能を使えば、データベースの変更を即座にクライアントに反映できます。この記事では、ブログに新着投稿通知を追加します。

---

## 2. Supabaseリアルタイムの準備
Supabaseはリアルタイム購読をサポートしています。既存のプロジェクトで有効化します。

### 手順：
1. **リアルタイムの有効化**：
   - Supabaseダッシュボードの「Database > Tables」で`posts`テーブルの「Realtime」をオン。
2. **依存関係の確認**：
   - 既に`@supabase/supabase-js`がインストール済み（未インストールなら`npm install @supabase/supabase-js`）。

---

## 3. リアルタイム購読の実装
新着投稿をリアルタイムで検知する仕組みを構築します。

### `lib/supabase.ts`の編集：
```ts
import { createClient } from '@supabase/supabase-js';

const supabaseUrl = process.env.SUPABASE_URL || '';
const supabaseKey = process.env.SUPABASE_KEY || '';
export const supabase = createClient(supabaseUrl, supabaseKey);
```

### `app/page.tsx`の編集：
```tsx
'use client';

import { useEffect, useState } from 'react';
import { supabase } from '../lib/supabase';

export default function Home() {
  const [posts, setPosts] = useState<any[]>([]);
  const [notification, setNotification] = useState<string | null>(null);

  useEffect(() => {
    // 初期データの取得
    const fetchPosts = async () => {
      const { data } = await supabase
        .from('posts')
        .select('*')
        .order('created_at', { ascending: false });
      setPosts(data || []);
    };
    fetchPosts();

    // リアルタイム購読
    const subscription = supabase
      .channel('posts-channel')
      .on('postgres_changes', { event: 'INSERT', schema: 'public', table: 'posts' }, (payload) => {
        setPosts((prev) => [payload.new, ...prev]);
        setNotification(`新着投稿: ${payload.new.title}`);
        setTimeout(() => setNotification(null), 3000); // 3秒後に通知を消す
      })
      .subscribe();

    // クリーンアップ
    return () => {
      supabase.removeChannel(subscription);
    };
  }, []);

  return (
    <div className="min-h-screen flex flex-col items-center bg-gray-100 py-8">
      <h1 className="text-4xl font-bold text-blue-600 mb-8">リアルタイム投稿</h1>
      {notification && (
        <div className="bg-green-500 text-white p-2 rounded mb-4">{notification}</div>
      )}
      <ul className="space-y-4 max-w-2xl w-full">
        {posts.map((post) => (
          <li key={post.id} className="bg-white p-4 rounded shadow">
            <a href={`/posts/${post.id}`} className="text-xl font-semibold text-blue-500 hover:underline">
              {post.title}
            </a>
            <p className="text-gray-600">{post.content}</p>
          </li>
        ))}
      </ul>
    </div>
  );
}
```

---

## 実践：リアルタイムブログ
- **投稿リスト**：新着投稿がリアルタイムで追加。
- **通知**：新投稿時にポップアップ通知を表示。

**確認**：
1. `npm run dev`で起動。
2. Supabaseダッシュボードから`posts`テーブルに手動で投稿を追加。
3. `http://localhost:3000`で通知とリスト更新を確認。

---

## まとめ
- Supabaseのリアルタイム機能でブログを動的に更新しました。
- ユーザー体験を向上させる新着通知を実装しました。

この記事が役に立ったと思ったら、ぜひ「いいね」を押して、ストックしていただければ嬉しいです！リアルタイム機能をあなたのプロジェクトにもぜひ試してみてください！
[環境変数]javacコマンドが認識しない対処

jdkをインストールしたのち、コマンドプロンプトで①「java」と②「javac」コマンドの導入確認をまとめる。

①javaコマンドは、システム環境変数「JAVA_PATH」を作成、パスをjdkの実行環境に設定する。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2759593/b781226e-84c5-4604-8701-00eb7d08cf2d.png)

②javacコマンドは、上記①配下「bin」内にあるjavac.exeのパスを環境変数「path」に追加する。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2759593/eda3477c-9106-466c-a224-279718fd0d2b.png)

これで、①②の導入環境が表示される＝Javaのコンパイルが楽にできるようになったことになる。
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2759593/e4f92d76-a678-4575-b3b0-e823bbe61654.png)


以上
【勉強記録】3月の成果

# はじめに

こんにちは。アメリカに住みながら独学でエンジニアを目指しているTairaです。

本日は3月の勉強成果等を記事にしていこうと思います
3月の勉強時間は87時間でした

## 3月の目標について
2月の記事に立てた目標についてみていきます。


- 時差ぼけ解消、勉強時間を前に戻す 達成！
時差ぼけを解消するには、積極的に日光を浴びる必要があるので毎日日光浴をしていました。
その甲斐もあって、4日くらいで治りました。勉強についても1カ月離れたので、勉強始める抵抗感はありましたが慣れてくればそこまで大変でなく何とか戻すことができました。

- 新しいことを始める 達成！
毎日筋トレの時間を30分とっていますが、筋トレ+30分ウォーキングをするようにしています。
ソフトウェアエンジニアはデスクに座って毎日仕事するので、運動習慣を今のうちからつけておこうかなと思い始めました。

## 4月の目標

- Rails チュートリアルを完走する
- ReactとRailsの開発を始める
- Leetcodeを始める
【python】macで環境構築

# 環境構築
最近pythonの勉強を始めました。こちらのサイトを参考に環境構築を行いました。

https://prog-8.com/docs/python-env

## pyenvのインストール
Homebrewはインストール済みなので、Pythonのバージョン管理ツールであるpyenvをダウンロードしていきます。
```terminal
brew install pyenv
```
正常に処理が終了したらインストールされたか確認
```terminal
pyenv -v
```
次にpyenvの初期設定を行う
```terminal
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc
```
```terminal
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc
```
```terminal
echo 'eval "$(pyenv init -)"' >> ~/.zshrc
```
```terminal
source ~/.zshrc
```

また環境構築の際にいつもなんとなく使用していた.zshrcについてはこちらの記事で理解を深めました。

https://qiita.com/ishidao/items/769b2e9acfc2ce4542b6

## Pyrhonのインストール
まずインストール可能なPythonのバージョンを確認する。
```terminal
pyenv install --list
```
かなりの数が出てきますが、公式サイトを見ながら新しいバージョンをインストールしました。
```
pyenv install 3.13.0
```
インストールできたか確認
```
pyenv versions
```

この状態だとmacにすでにインストールされていた古いバージョンを使用してしまうので、下記コマンドを実行
```
pyenv global 3.13.0
```
一度ターミナルを開き直してから新しいバージョンで切り替わったことを確認
```
python -version
```

以上でmacでの環境構築は完了です。windowsでも環境構築をしてみましたが、windowsの方が楽でした。。。
「FS JAPAN株式会社」S5860・S3950・S5850・S8550シリーズ向け最新ファームウェアを公開 – 機能強化と安定性向上

より優れたユーザー体験の提供と高品質なソフトウェアサービスの実現を目指し、S3950-4T12S-R、S5850およびS8550シリーズのスイッチは最新のソフトウェアバージョンV7.4.12.Rへアップデートされました。また、S5860-48SCスイッチについても、最新のソフトウェアバージョンFSOS 11.0(5)B13S8に更新され、これにより新たにERPS機能が追加されました。詳しくはこちら→https://www.fs.com/jp/blog/new-firmware-release-s5860-s3950-s5850-s8550-17633.html
ByteDance の EffectHouse がすごかった

## EffectHouseとはなにか

https://effecthouse.tiktok.com/

一言で説明すると、TikTok向けのエフェクトが作成できるデスクトップアプリです。
はい、一見プログラミングに関わらないと思われた方！
こちらなんとビジュアルスクリプティング機能を持っています。

そしてその中で
**・画像認識**
**・音声認識**
**・空間トラッキング**
**・AR**
**・ジェスチャー認識**

これら多くのDetection実装をあまりにも簡単に実装できてしまいます。

下記がEffectHouseの制作画面になります。
![スクリーンショット 2025-03-25 20.40.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110418/22b126ec-b8d3-4bda-8da2-882d9b4bb37e.png)

Unityを触ったことがある方は気づくのではないでしょうか。
そう、**ほとんどゲームエンジン**なのです。

## 何がすごいのか

### 1. UXの良さ

とにかくUXが優れています。
左上のトグルボタンでは、４つのウィンドウを表示切り替えできます。

またエフェクトは様々なデバイスで動作するため、パフォーマンスチェックが「Test performance」という一つのボタンで行えるように用意されています。楽！

そして右上のSubmitで最終的な公開のためのレビュー提出が行えます。
一貫して、EffectHouseのアプリ内から出る必要がないように設計されています。

![スクリーンショット 2025-03-28 16.03.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110418/cb1995e3-b0c6-4926-bb00-79226a4b209e.png)

またカメラを使ったテスト用に、さまざまなテスト用動画も用意されておりスマホ端末でのテストをする必要がありません。（例えば、ユーザーが口を開けた時に何かしらアクションするエフェクトをテストする場合、口を開ける動画なども用意されています）

### 2. Detection系の豊富さ・手軽さ

なんといってもdetectionの処理がノード一つで出来てしまうところです。もはや怖い。
音声認識、顔面トラッキング、手のトラッキング、ジェスチャー認識が一瞬で実装出来てしまいます。

![スクリーンショット 2025-03-28 16.07.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110418/9418abf5-bc28-41fb-b082-485ce1ba57bb.png)

また空間認識してのAR機能もノード一つで実現できてしまいます。
これがデスクトップアプリ向けにも展開されたらUnityやUE5を食いかねないなと思いました。

## 最後に
簡単な紹介記事でしたが、ぜひEffectHouseを触ってみてください。
日本ではそこまでEffectHouseクリエイターが飽和してはいない状況のようなので、
市場としてまだまだ成長余地がありそうです。
１つのエフェクトで8MBという制限はありますが、3Dモデルの頂点数が多いものも使用できます。
useMediaQueryのTips


## 1.タッチデバイスであるか

```typescript
export const isTouchDevice(){
  return window.matchMedia('(hover: none)').matches;
}
```

## 2.useMediaQueryフック

```typescript
'use client';

import { useState, useEffect } from 'react';

export const useMediaQuery = (query: string) => {
  const [matches, setMatches] = useState(false);

  useEffect(() => {
    const mediaQueryList = window.matchMedia(query);
    setMatches(mediaQueryList.matches);

    const handleChange = (e: MediaQueryListEvent) => {
      setMatches(e.matches);
    };

    mediaQueryList.addEventListener('change', handleChange);

    return () => {
      mediaQueryList.removeEventListener('change', handleChange);
    };
  }, [query]);

  return matches;
};
```

- SP、Tablet、PCの判断

```typescript
const isSp = !useMediaQuery('(min-width: 768px)');
const isPc = useMediaQuery('(min-width: 1024px)');
const isTablet = useMediaQuery('(min-width: 768px)') && !isPc;
```

## 参考記事

- [Detecting touch devices and detecting 'can hover' with JavaScript in 2020](https://stackoverflow.com/questions/63076960/detecting-touch-devices-and-detecting-can-hover-with-javascript-in-2020)
Entity Framework テーブル作成、更新

# はじめに
業務でアプリケーションで使用するテーブルを**Entity Framework**で実装する機会があったので手順をメモしておく。

# Entity Frameworkとは
以下の特徴がある。
- Entity Framework（EF）は、Microsoftが開発したオブジェクトリレーショナルマッピング（ORM）フレームワークで、これにより、データベースとのやり取りをより簡単かつ効率的にすることができる
- Entity Frameworkを使用することで、開発者はデータベースのテーブルをクラスとしてマッピングし、データベース操作をオブジェクトとして扱うことができる

# テーブル実装
- 以下の2つのテーブルを作成する(EFではテーブルの定義をC#のオブジェクトとして定義する)
    - Product.cs
    - Category.cs

以下のようにEntitiesフォルダーに格納します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935725/fc8f9621-9ab9-4b53-b184-c6a45c3a983b.png)

``` Product.cs
namespace YourNamespace.Entities
{
    public class Product
    {
        public int Id { get; set; } // プライマリキー
        public string Name { get; set; } // プロダクト名
        public decimal Price { get; set; } // プロダクトの価格
        // 他のプロパティを追加
    }
}
```

``` Category.cs
namespace YourNamespace.Entities
{
    public class Category
    {
        public int Id { get; set; } // プライマリキー
        public string Title { get; set; } // カテゴリ名
        // 他のプロパティを追加
    }
}
```

- EFではデータベース接続、エンティティの管理、クエリの実行、およびトランザクションの管理をデータベースコンテキストと呼ばれるクラスを通じて行う

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935725/6b6a8a89-f951-48cd-baa1-fa208ce46814.png)

``` YourDbContext.cs
namespace YourNamespace
{
    public class YourDbContext : DbContext
    {
        public DbSet<Product> Products { get; set; } // 新しく追加
        public DbSet<Category> Categories { get; set; } // 新しく追加

        // コンストラクタ、OnModelCreatingメソッド、その他の設定
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            // モデルの設定があればここに
        }
    }
}
```

- 新しいエンティティとデータベースコンテキストの更新が完了したら、マイグレーションを作成する
↓以下のコマンドをパッケージマネージャーコンソールで実行
```
Add-Migration AddMultipleEntities
```
実行するとマイグレーションファイルがマイグレーションフォルダ内に保存される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935725/d4d12875-9823-4ef5-a018-59d6b9c5a27d.png)

- 作成されていることを確認し、以下のコマンドを実行することで、Migrationフォルダ内のマイグレーションファイルが参照されデータベースの作成、更新を行ってくれます
```
Update-Database
```

# まとめ
EFを活用することで、開発者は手動でのスキーマ管理の手間を減らし、エンティティモデルの変更を素早くデータベースに反映させることができます。

参考：https://learn.microsoft.com/ja-jp/ef/core/managing-schemas/migrations/?tabs=vs
ログをテキストに保存する方法

ログにテキスト形式として保存する方法
前記事でログ出力させるフォルダの作成は完成している
そこにテキスト形式でログを保存する方法を紹介

①②とあるが、好きな方法で

# ①
# コマンドの出力をファイルに保存
Get-Timezone | Out-File -FilePath "C:\work\Log\log.txt"

# 追記形式でログを保存
Get-NetFirewallProfile | Out-File -FilePath "C:\work\Log\log.txt" -Append

# ②
# コマンドの出力をファイルに保存
Get-NetConnectionProfile >C:\work\Log\log.txt

# 追記形式でログを保存
Type c:\windows\system32\drivers\etc\hosts >>C:\work\Log\log.txt
AAOS を書き込んだ Google Pixel Tablet をファクトリーイメージに復元する

# はじめに

[「Ubuntu24.04の環境でAndroid Automotive OSをビルドする」](
https://qiita.com/rairaii/items/a3fc4fca41d169d8a518)で **Pixel Tablet** で **Android Automotive OS** を動作させたが、元に戻す必要がでたので、**ファクトリーイメージに戻して** もとのタブレット用の Android OS に復元する方法のメモを残しておく 

:::note info
リカバリーモードで、**OTA イメージ** を ```adb sideload``` を使ってインストールして復帰させる方法では失敗した。
:::

```terminal: ホストPC側での作業
$ adb sideload tangorpro-ota-ap2a.240905.003-4d96c06a.zip
Total xfer: 1.00x    
```

```terminal: Android側のエラー表示
ERROR: recovery: failed to verify whole-file signature
update package verification tool139.1 s (result 1).
ERROR: recovery: Signature verification failed
ERROR: recovery: error: 21
```

# オフィシャルページ

https://developers.google.com/android/images?hl=ja

# ファクトリーイメージに復帰する

## 1. Android Flash Tool を起動する

[オフィシャルページ](https://developers.google.com/android/images?hl=ja) に **Android Flash Tool を使用する** というセクションがあるので、そのセクションの **フラッシュバックします** リンクを選択する。

WebUSBに対応したブラウザ (例: Chrome) である必要がある


![スクリーンショット 2025-04-01 17.06.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1017489/50f8bcaf-53c8-4a36-b66e-acbc7e7a2bac.png)

## 2. 対象機器とファクトリーイメージを選択

**Android Flash Tool** で **対象機器** と **ファクトリーイメージ** を選択して実行する

![スクリーンショット 2025-04-01 16.53.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1017489/a37ac67d-4df3-4b3f-813d-1c22b6cdb933.png)


## 3. インストール終了

しばらく待っているとインストールが終了する。

![スクリーンショット 2025-04-01 16.59.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1017489/e14bb3c4-128f-4fda-9957-1ee65ad89f6a.png)
生成AIコーディング=Vibe codingで重要なポイント３つ

## 生成AIでコーディングする上で重要なポイントが見えてきた

面倒は省こう．重要な点は下記３つ

+ 常に目的を忘れるな
+ 困難は分割せよ
+ 結局のところ自分の目が一番信用できる

## 常に目的を忘れるな

生成AIで一番重要なのは，最終的に何をやりたかに常に立ち返れることだ．
プロジェクトを立ち上げた際は，必ず目的をまとめたファイルを作成し，それを読み込ませてからコーディングに入ってもらもう．
具体的には，Caludeのプロジェクト機能を利用して，README.mdを読み込ませておくとよい．
そうすることで，チャットが分割されても統一的な指示だしが容易になる．

## 困難は分割せよ

これは，きわめて重要なポイント．
生成AIはプロンプトの長さに限界がある．なので，１セッションで読み込ませる文章や，コードの長さには注意を払う必要がある．
いままで人間は意味ごとにファイルを分割して管理してきたが，生成AI全盛時代は，コード長での分割がおそらくスタンダードになる．一定の文字数に達したら，別のファイルに分割する．つまり今まではutil.pyに細々した処理はすべてまとめていたとしたら，今後はutil1.py, util2.py, util3.pyとコード尾の文字数によって細かく分割する必要が出てくるだろう．人間は読むのが面倒になるが，機能ごとの編集が可能になるので，生成AIが編集するのは容易になる．
また，それらを駆使しても，各チャットの限界文字数はすぐに到達してしまうだろう．
そうすると，チャットを分割する必要がある．
そのために一つ目の，目的を忘れないということが重要になる．
目的や，プロジェクトの構造など，全体情報を常に各チャット（指示だし）ごとに更新して，毎回冒頭で読ませて文脈を把握したうえでコーディングを行ってもらえば，意図の統一されたコーディングが可能になる．
今まででは考えられないが，おそらくREADME.mdすら単一のファイルではなく，各機能ごとに分割する必要が今後出てくるだろう．

## 結局のところ自分の目が一番信用できる

最後のポイントは，特にコードの改修で重要になる．生成AIはそれっぽいコードをものすごい速度で生み出すが，必ずしも正確じゃない．というか大体完全にはいかない．
なので人間も手伝ってデバッグする必要がある．たいていの場合ただエラーコードだけ渡しても変な修正になる．
なので人間がエラーの意味を正確に理解し，どこでエラーが起きたのかを突き止め，改修のための方針を決定する必要がある．方針が決まれば生成AIは非常に優秀な修正能力を持つ．やっていて思うのは，生成AIを使いこなせるのはエンジニアだけだろうということ．サンプルゲームのようなものはワンプロンプトで素人でもすぐに出せるが，細かく調整が必要になったとたん謎のエラーと戦う工程が入る．エラーと戦うセッションは残念ながら生成AIの得意とするところではない．なぜなら，エラーハンドリングが正確に記述されている文章は過去になかなか存在しないからだ．当面，これはまだ人間が担当することになるだろう．エンジニアの諸君．我々の仕事は今後書くことではなく，エラーと戦うことが主戦場になる．一番面倒なところだけはまだ少々手を貸す必要がある．

以上．楽しくVibe codingをしていこう
next.js app routerのGlobal Errorハンドリング

## 概要

next.js[公式docs](https://nextjs.org/docs/app/building-your-application/routing/error-handling#handling-global-errors)に`app/global-error.tsx`はグローバルエラーBoundaryと書かれているが、実際には効かなかったため、メモする。

## appルータの予期せぬエラー処理

- error.tsx
    - appフォルダのサブフォルダにはerror.tsxを利用
- global-error.tsx
    - appフォルダのサブフォルダにはglobal-error.tsxを利用
    - ルートエラーBoundaryとして特別扱い

## 実際は

- 自分が使っているnext.js `v15.1.4`は`global-error.tsx`が効かなかった
- 代わりに`error.tsx`が効く

つまり、`global-error.tsx`の特別扱いがなくなったっぽい。

## 感想
ルートの特別扱いをやめて、すべて`error.tsx`に統一することで、より混乱が少なくて良かったと思う。
youtubeミニプレーヤーを作成しました。

# はじめに
このプレーヤーは、任意のwebページの右上に静かに配置しています。例えば、ブログの記事を作成しながら、右上で、youtube動画の再生を行っています。音楽を聴きながら、ブログを書くことができます。
ポップアップ画面で、ドラッグできますので、どこへでも移動できます。
プレーヤーの下に再生リストがスクロールして表示されます。再生リストのサムネイルをクリックするとその動画から再生が始まります。
ページで作業するときは、リラックスして作業ができます。
以降は、このミニプレーヤーのプログラムについてご説明します。
# サンプル画面
![サンプル.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198006/584c1c87-3562-4828-93dd-6579807fa511.png)
赤の矢印で示した画像がミニプレーヤーです。プレーヤーと再生リストが表示されています。ここでは、yahoo!JAPANページに表示されていますが、URLが「https://」で始まるwebページであれば、表示できます。このミニプレーヤーを表示するには、プラグインが必要です。

# プラグイン
プラグインはGoogleのwebStoreからインストールできます。プラグイン名は、「TinyYoutubePlayerプラグイン v4.0」です。

[chromeウェブストア](https://chromewebstore.google.com/detail/tinyyoutubeplayer%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3-v4/gcbffcbbfefalbicfmlibacichafpnli?authuser=0&hl=ja)

以下はv4.0の画面です。
リストを再ロードするボタンを追加しました。

![改良版.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198006/a235a476-674d-4dbe-b004-3e7e876f7cbb.png)

# コンセプト
このミニブレーヤーのコンセプトは、「さりげなさ」です。親ページの作業を邪魔しないように、さり気なく片隅にいて、ご主人の癒しになるような子犬のようにです。
 
# あとがき
このプレーヤーの再生リストは、アメバの検索で独自に生成したものです。現行は400弱のリストがサーバーにあります。和洋折衷になっています。
リスト数は逐次追加予定です。
ターミナル？知らんけど、とりあえず猫（cat）で中身見た

# 🗂️ ファイルとディレクトリ操作まとめ【ターミナル入門】

ターミナルを使って、ファイルやディレクトリの作成・閲覧・編集・削除・移動などの基本操作を習得し、効率的に開発環境を操作できるようになるためのまとめです。

---

## 🔁 学習の流れとコマンド一覧

| ステップ | コマンド | 英語の意味 | 説明 |
| --- | --- | --- | --- |
| 1. コマンドを出力 | `echo` | 響く、反響する | `echo test` で「test」と表示される。 |
| 2. ファイルを作成 | `touch` | 触れる | 空のファイルを作成。例：`touch runteq.txt` |
| 3. ファイルの中身確認 | `cat` | concatenate（連結） | ファイルの中身を表示する。 |
| 4. ファイルに追記 | `echo >>` | 表示＋追記 | `echo runteq >> runteq.txt` |
| 5. 名前変更・移動 | `mv` | move（移動） | 例：`mv runteq.txt RUNTEQ.txt` |
| 6. ファイル削除 | `rm` | remove（削除） | ゴミ箱に行かないので注意！ |
| 7. フォルダ作成 | `mkdir` | make directory | 例：`mkdir runteq` |
| 8. フォルダの中を見る | `ls` | list（一覧表示） | `-a`で隠しファイル、`-l`で詳細表示。 |
| 9. 現在の場所 | `pwd` | print working directory | 今いる場所を表示。 |
| 10. フォルダ移動 | `cd` | change directory | `cd ..` で1階層上へ。 |
| 11. 空のフォルダ削除 | `rmdir` | remove directory | 中身があると削除不可。 |
| 12. フォルダごと削除 | `rm -r` | remove recursively | フォルダ＋中身を全て削除。 |
| 13. フォルダまとめて作成 | `mkdir -pv` | parents + verbose | 親ディレクトリも含めて作成。 |
| 14. 作業フォルダに移動 | `cd` | change directory | 任意のプロジェクトへ移動。 |

---

## 🧰 補足ポイント

- `>`：上書き / `>>`：追記（これめっちゃ大事！）
- `ls -la`：詳細＋隠しファイル、超便利✨
- `cd`：**相対パス**と**絶対パス**、両方理解しとこ！

---

## 📂 ファイル操作まとめ

```bash
# 文字を表示する
echo "test"

# ファイルに追記する
echo "runteq" >> ~/Desktop/runteq.txt

# 空のファイルを作る
touch ~/Desktop/runteq.txt

# ファイルの中身を見る
cat ~/Desktop/runteq.txt

# ファイル名を変更
mv ~/Desktop/runteq.txt ~/Desktop/RUNTEQ.TXT

# ファイルを削除
rm ~/Desktop/runteq.txt
```

## 📦 ディレクトリ操作まとめ
```
# フォルダを作る
mkdir ~/Desktop/runteq

# フォルダの中身を見る
ls ~/Desktop/runteq

# 今いる場所を確認
pwd

# ディレクトリを移動
cd ~/Desktop/runteq

# 空のフォルダを削除
rmdir ~/Desktop/runteq

# フォルダ＋中身を削除（⚠️注意！）
rm -r ~/Desktop/runteq
```

## 💼 プロジェクト用フォルダの作成と移動
```
# 途中のフォルダも含めて作成、作成ログも表示
mkdir -pv ~/Projects/start_docker

# 作業ディレクトリに移動
cd ~/Projects/start_docker
```

## 🧰 ターミナル便利ワザ
操作	内容
Tab	入力補完（2回押すと候補一覧）
↑ / ↓	コマンド履歴の表示
Ctrl + L	画面クリア（履歴は残る）
Ctrl + C	実行中のコマンドを中断



# ✍️ ちょっとした語呂合わせ＆イメージまとめ
echo：「スピーカーでしゃべる」イメージ → echoがテキストを喋る🗣️

touch：魔法の手で空ファイルを生み出す🪄

cat：猫がファイルを覗く🐈

mv：トラック🚛でファイルを移動

rm：🔥燃やしてファイルを消す

mkdir：工具🛠️でフォルダ作る

ls：リス🐿️が中身を覗く

pwd：コンパス🧭で現在地確認

cd：ワープ移動🔄

rmdir：空のフォルダを🗑️ポイ

rm -r：フォルダごと💥爆破

## ✅ まとめ
ターミナル操作は、最初こそ難しく感じるけど「意味」と「イメージ」を結びつけるとグッと覚えやすくなるで！
家計簿アプリを作る＃２５

まずは、DrawerWidthを渡していきます。
![スクリーンショット 2025-04-02 105320.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4012588/cb6bb44f-cba7-453b-8a96-b05e74987e81.png)

![スクリーンショット 2025-04-02 105358.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4012588/4aba9ef7-014a-469c-bd6e-e52b6c6ecc99.png)
drawerWidthをサイドバープロップスに渡していきます。

![スクリーンショット 2025-04-02 105509.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4012588/5a136607-9523-4796-ac68-e07909db85c4.png)
drawerWidthは、number型なので、

![スクリーンショット 2025-04-02 105558.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4012588/7ab2f03a-4e7b-4158-86d2-4b5f6860d6f8.png)
number型を指定します。
ディレクトリ作成　あるなし判定あり　スクリプト

キッティング作業のエビデンスとしてログを出力させて、設定値があっているか確認することがある
その際、ログ出力させるフォルダないしファイルが必要となる
業務でPowershellを使用することがあるのでそちらを紹介
ほかにやり方はあるかもしれんが慣れているものとして

①
フォルダのパスを指定
$folderPath = "C:\Work\Log"
②
フォルダが存在するか確認
if (-Not (Test-Path -Path $folderPath)) {
    フォルダが存在しない場合は作成
    New-Item -ItemType Directory -Path $folderPath
    Write-Host "フォルダ '$folderPath' を作成しました。"
} else {
    フォルダが既に存在する場合のメッセージ
    Write-Host "フォルダ '$folderPath' は既に存在しています。"
}

①の説明
指定するディレクトリにフォルダを作成させるためのもの
②の説明
if関数を使うことによってフォルダがあるかないかを判定している
なければ作成するし、なければありますよとメッセージとして出力する

実際にPowershellではどんな挙動になるかは下記の画像で

![フォルダ作成と判定のスクリプトの挙動.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3827128/091bd793-9c5c-4605-858d-361eae704af6.jpeg)
【2025年04月版】ARMアーキテクチャの Ubuntu24.04 に Chromiumブラウザをインストールするメモ

# はじめに

ARMアーキテクチャ上のUbuntu 24.04でGoogle Chromeブラウザを直接インストールすることは、公式にはサポートされていません。​

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143127/681b4ac8-1220-4315-acca-213a17caf9d7.png)

Google Chromeは主にAMD64（x86_64）向けに提供されており、ARM向けの公式ビルドは存在しないようです。

Google Chromeのオープンソース版であるChromiumブラウザをインストールすることで、同等の機能を利用するためのメモです。

# 環境

- ARMアーキテクチャ
- Ubuntu24.04 Desktop
 
# インストール

```
sudo apt update
sudo apt install chromium-browser
```

# 起動

アイコンから起動できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143127/dbbd0eb5-a000-4fe0-b98c-2cf18cebd73e.png)

# さいごに

かんたんでしたね
アーキテクチャについてなんでそんなに議論するの？という話

## はじめに
この記事は、社内のLT会で発表した内容をベースにしています。
チームで話して盛り上がったので、「せっかくならQiitaにも載せておこう！」という気持ちで公開しています。
ガッチガチに根拠のある記事ではないので、「こんな考え方もあるんだ〜」くらいの感覚で楽に読んでください。

## 資料の内容
- 個人的なアーキテクチャに対する考え方
- 「アーキテクチャってそんなに大事？」という問いに対する一つの視点
- 「構造」と「振る舞い」の話

コードは出てきません。概念の話がメインです。  
（実装に落とし込んだ話はまた別記事にでも書きます！多分）


## 参考資料

- [Clean Architecture 達人に学ぶソフトウェアの構造と設計](https://www.amazon.co.jp/dp/4048930656)
- [なぜ依存を注入するのか DIの原理・原則とパターン](https://www.amazon.co.jp/dp/4839983062)
- [ソフトウェアデザイン 2023年6月号（技術評論社）](https://www.amazon.co.jp/dp/B0C4K9X2XV)

どれも面白かったので、気になる方はぜひ読んでみてください。おすすめです📕


## スライド
<script async class="docswell-embed" src="https://www.docswell.com/assets/libs/docswell-embed/docswell-embed.min.js" data-src="https://www.docswell.com/slide/KEX78J/embed" data-aspect="0.5625"></script>



## 最後に
アーキテクチャの議論って、正直めんどくさいし、すぐ成果に繋がるわけではありません。
だからこそ「もう実装しちゃおう」となる場面も多いですよね。

投げやりに実装するのが良くないことは間違い無いですが、一方で逆に「構造」の価値に重きを置くあまり開発速度が犠牲になるのも良くないです。「振る舞い」と「構造」のどちらも大事にしつつ、うまくバランスを取って進められるのが理想なんだと思います（当たり前）。

ビジネス的に求められるスピード感の中で、どうやってアーキテクチャの価値を守り、伝えていくか？ということは難しいですけど、未来の自分達とプロダクトの価値のために考えていかなきゃならないんだろうなあと今は思っています。

### P.S
アーキテクチャに関するものでもなんでも「この書籍もおすすめ！」などがあればぜひコメントで教えてください。
Windows10/11で使用できるプログラム　ショートカットコマンド

業務などでPCやSVをキッティング作業する際に何かと設定をいじることがある
マウスで選ぶのもありだが、キーボード使ってショートカットコマンド使えば
多少なりとも便利なものがある
過去の経験から頻発して使っているショートカットコマンドの一覧を掲載したいと思う
設定開くにしても人それぞれやり方あるとはいえ
覚えて損はないのかなと。

WindowsキーとRキーを押して"ファイル名を指定して実行から"下記を入力

#コントロールパネル
control

#システムのプロパティ
sysdm.cpl

#ディスクの管理
diskmgmt.msc

#コンピューターの管理
compmgmt.msc

#ネットワークの管理
ncpa.cpl

#プログラムの機能
appwiz.cpl

#サービス
srvices.msc

#レジストリ
regedit

#システム情報
msinfo32

#イベントビューア
evntvwr

#ローカルグループポリシーエディタ
gredit.msc

#タスクマネージャー
taskmgr.exe

#リモートデスクトップ
mstsc

#デバイスマネージャー
devmgmt.msc

#ローカルセキュリティポリシー
secpol.msc

#電源オプション
powercfg.cpl

#タスクスケジューラー
taskschd.msc

#Windows Defender ファイアーウォール
WF.msc
Firewall.cpl
ライブラリ依存せずyyyy-MM-ddの日付文字列を取得する最短のJavaScriptコード

date-fnsなど流行なライブラリを使えば、yyyy-MM-dd日付文字列を簡単に取得できるが、たまに外部依存をしたくない場合もある。

## 実装例

```typescript
new Date('2025-04-02 07:00:00').toLocaleDateString("ja-JP", {
  year: "numeric",
  month: "2-digit",
  day: "2-digit"
}).replaceAll('/', '-')

// 出力 2025-04-02
```

## 間違いそうな実装例

```typescript
new Date('2025-04-02 07:00:00').toISOString().split('T')[0]

// 出力 2025-04-01
```

## 最短（わかりにくい）実装例

```typescript
new Date('2025-04-02 07:00:00').toLocaleDateString('sv-SE')

// 出力 2025-04-02
```

`sv-SE`はスウェーデンの国コードで、それの日付フォーマットは`yyyy-MM-dd`である。
GoogleスプレッドシートからDatabricksへの接続

こちらのアップデートです。このようなインテグレーションがサポートされるとは。

https://docs.databricks.com/aws/en/release-notes/product/2025/march#databricks-connector-for-google-sheets-public-preview

> **Google Sheets向けDatabricks Connector(Public Preview)**
> Databricks Connector for Google Sheetsによって、Google SheetsからDatabricksワークスペースに接続することができます。[Google スプレッドシートから Databricks に接続する](https://docs.databricks.com/aws/ja/integrations/google-sheets)をご覧ください。

ちなみにExcelからも繋げられます。

https://qiita.com/taka_yayoi/items/c1bab6682c7d1bced20f

ということで、試します。

まずは、Google Marketplaceから[Databricks Connector for Google Sheets](https://workspace.google.com/marketplace/app/databricks_connector_for_google_sheets/465517936903?flow_type=2)をインストールします。

![スクリーンショット 2025-04-02 9.19.28.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/1ea98293-a5a8-46a1-85fe-f0390fd71281.jpeg)

新規スプレッドシートを開いて、**拡張機能**を開きます。
![スクリーンショット 2025-04-02 9.21.08.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/8e6bf0d1-750d-403f-b77a-5e46f1125da0.jpeg)

Databricks Connector for Google Sheetsを展開して、**Launch sidebar**を選択します。
![スクリーンショット 2025-04-02 9.21.16.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/f6e9cb4e-0d9e-46f7-878f-4b33bd5a628a.jpeg)

ワークスペースへのログインが求められるので、URLを指定します。
![スクリーンショット 2025-04-02 9.21.41.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/ff9a1bc4-5599-46cf-9264-28bc1aeada89.jpeg)

ログインが成功するとサイドバーが表示されます。
![スクリーンショット 2025-04-02 9.52.58.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/a41cf3f3-c39e-4fb3-85a9-c2e907fa5d0f.jpeg)

あとは、SQLウェアハウスを選択し、クエリーを入力して実行するだけです。
![スクリーンショット 2025-04-02 9.54.12.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/717c922b-c606-497c-85c4-0722fad67128.jpeg)

データを取得することができました！
![スクリーンショット 2025-04-02 9.55.32.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/1d18ccf9-38db-4ad1-a0af-0bb97cd58f1a.jpeg)

ご活用ください

### はじめてのDatabricks

[はじめてのDatabricks](https://qiita.com/taka_yayoi/items/8dc72d083edb879a5e5d)

### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
Linuxとev3devをBluetoothでつなぐときの備忘録

## 環境
- Arch Linux
- GNOME
- ev3dev

## 問題
新しく導入したLinuxでev3devを制御しようとしたときに、Bluetoothを使おうとしましたがエラーが出ました。
```
GDBus.Error:org.bluex.Error.Failed: Protocol not available
```
ただ、このエラー自体はWindowsで使用していたときにも発生しがちなエラーで、まだ慌てることはありません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883745/0b1c2b11-d58f-4c15-81f3-2c8d7a8c9350.png)
しかし通常(Windows)であればこの下に「Network Connection」というボタンが出て、詳細な設定ができます。

## 解決策
「Wireless and Networks」の中に「Tethering」があるのでBluetoothテザリングをオンにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883745/7fb52709-7930-4af5-94ee-f2e820a96ab0.png)

そのうえでもう一度、Bluetoothでの接続を試みてください。
すると右上のメニューに「Tether」項目が追加されるので、オンにしてあげましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883745/722547cf-64f2-473e-8c91-c9a102b69e27.png)

すると自動的にBluetooth接続が行われ、問題なく使用できるようになります。
ちなみにこの画像の場合は「Bluetooth」項目に「ev3dev」と表記が出ていますが、この表記は再現性がなかったので、「Tether」の接続が成功していればOKです。

この際のEV3のIPアドレスは`10.0.0.1`ではなく、EV3の左上に表示される`192.168.0.1`へ接続してあげてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883745/c0f14c22-6422-4f31-8796-24ebacbc84ac.png)

このようにVSCodeの「ev3dev browser」での接続も確認できました。

## 結論
うまくいかなきゃBluetoothテザリングすればいい。もっとマシな解決策はないものか。
pythonからのインターネットアクセスの問題解決

# 対象とする問題
pythonで書いたプログラムでスクレイピングする際に、以下の3つの問題があることが判明したので、ChatGPTに症状などを伝えて相談し、解決方法を見つけた。
* 使用環境のProxyサーバーがWindowsのユーザーアカウントを用いたWindows統合認証（NTLM）によるユーザー認証を要求するが、`requests`モジュールなど通常のpythonのライブラリーがこれに対応していない
* pythonの標準ライブラリーでは、PAC（Proxy Auto-Config）ファイルに対応していない
* `https`で始まるURLにアクセスした場合に証明書に関するエラーが出る場合がある

# NTLM認証とPACファイルの問題の解決方法
pythonのモジュールpx-proxyによるproxyサーバーを用い、元々のProxyサーバーの手前に入れたいわゆる多段串にすることで解決した。
px-proxyはNTLM認証に対応している。また、私の使用環境では下記の設定ファイル`px.ini`の様に、ユーザー名やパスワードを指定しないでも、px-proxyが認証情報を取得してくれた。この辺は環境によるらしい。
```
[proxy]
server = 
pac = http://hogehoge.com/proxy.pac
pac_encoding = utf-8
port = 3128
listen = 127.0.0.1
gateway = 0
hostonly = 0
allow = 127.0.0.1
noproxy = 
useragent = 
username = 
auth = 

[client]

[settings]
workers = 2
threads = 32
idle = 30
socktimeout = 20.0
proxyreload = 60
foreground = 0
log = 0
```
私の使用環境では、proxyサーバーを自動設定する様になっていたので、`pac =`の行に設定している。proxyサーバーのアドレスを指定する場合には、`server = `の行に書けば良いと思われる。

## px-proxyのインストール
単純に以下で良い。
```
pip install px-proxy
```

## px-proxyによるproxyサーバーの起動
設定ファイル`px.ini`を適当なディレクトリーに起き、以下を実行する
```
python -m px -c hogehogedir/px.ini
```

## python製プログラムでの対応
環境変数`HTTP_PROXY`と`HTTPS_PROXY`に`px.ini`の`listen`に指定したIPアドレスと`port`に指定したポート番号を設定すれば良い。
px-proxyによるProxyサーバーが起動しているかも確認するならば、以下の様な関数を用意すると良い。
```python
import socket
def set_proxy(port=3128, force_set_env = True):
    try:
        with socket.create_connection(("127.0.0.1", port), timeout=2) as sock:
            print(f"[OK] px proxy はポート {port} で起動しています。")
    except (socket.timeout, ConnectionRefusedError):
        raise RuntimeError(
            f"px proxy が 127.0.0.1:{port} で起動していません。\n"
            f"px を起動してください（例: python -m px または px.exe）"
        )
    except Exception as e:
        raise RuntimeError(f"px proxy チェック中に予期しないエラーが発生しました: {e}")

    for x in ["HTTP_PROXY", "HTTPS_PROXY"]:
        if force_set_env or (x not in os.environ):
            os.environ[x] = f'http://127.0.0.1:{port}'
    if True:
        for x in ["HTTP_PROXY", "HTTPS_PROXY"]:
            print(x, os.environ[x])
```

# 証明書に関する問題の解決方法
## 原因
`https`で始まるURLにブラウザからはアクセス出来るのに、python製プログラムからではアクセス時にエラーや警告が出るのは、使用している「信頼済みCAのリスト（証明書ストア）」が異なるからだそうです。
Windows上ではブラウザは、Windowsの証明書ストアを使うのに対し、pythonの標準的なライブラリー（`requests`, `ssl`, `urllib3` など）は、`certifi` というPython向けの独立したCA証明書バンドルを使用するそうです。
`certifi`はMozillaベースですが、更新タイミングが異なるため、最新CAが含まれていない場合があるそうで、この場合に問題が発生します。

## 解決方法
要はpython製プログラムにおいてもWindowsの証明書ストアを用いれば良いです。その方法はいくつかありますが、一番簡単なのはpythonの`pip-system-certs`を使う方法です。

### 注意点
このモジュールをインストールしただけで、pipコマンドが使う証明書ストアもWindowsの証明書ストアを使う様に変更されます。

## `pip-system-certs`のインストール
単純に以下
```
pip install pip-system-certs
```

## python製プログラムでの対応
下記例の様に`requests`モジュールなどより前にimportするだけです。

```python
import pip_system_certs
import requests
```
AWS認定試験 MLA-C01 受けてみた！(2025-04-01)

## はじめに
* CLF/SAA/SOA/DVA/AIFを取得している
* 合格体験記を参考にして、AIFの流れでMLAを受験する事を考えていた
* 実際、勉強してみてAIF重なる部分のあった

## 試験結果
* 初めての900点台
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4045441/7db779d2-cd9c-4f61-8f2d-577b7de48fb3.png)


##　学習期間
* 20時間ほど

## 学習方法
* WebにあるMLAの合格体験記から戦略をねる
* Web問題集のCloudTechを利用　←　ここから7割近く出題した
* 問題集に出てくるワードを生成AIを活用して理解を深めた
* 機械学習に関するYoutubeを沢山見た
* Xで合格者の投稿を見てモチベーションを維持した


## 所感
* 試験に臨む気持ち、行動を今回考えてみた
* 学習を通じて、一番大事だと個人的に思ったことは、ソファーに座って意味もなくTVを見る時間をなるべく作らないようにした事だ
* 習慣を変えることをまずやってみたという事になる
* 無駄だと感じる時間を勉強に回すことが出来れば時間は沢山ある
* そして、日々コツコツと継続することが大切だと改めて感じた
* 次はMLSを受験する(AIF⇒MLA⇒MLSの流れでやってみる)
Laravelの create() メソッドの役割と使い方【Eloquentでのデータ登録】

# はじめに

Laravelでデータベースに新しいレコード（データ）を保存するとき、  
以下のようなコードを見かけたことはありませんか？

```php
Post::create([
    'title' => '新しい投稿',
    'body' => '本文内容',
    'user_id' => 1,
]);
```
この create() メソッド、簡潔で便利ですが「実際に何をしているの？」と疑問に感じる方もいると思います。

この記事では、Laravelの create() メソッドの役割・仕組み・使い方を、まとめました。

# ①create() メソッドとは？
- **Eloquentモデルを使って、1件のレコードを一括で作成・保存できる**メソッドです。
- 内部的には new + fill + save をまとめてやってくれる便利メソッドです。

# ②基本的な使い方
**例）投稿（Post）モデルの場合**

```php
Post::create([
    'title' => 'テスト投稿',
    'body' => 'これは投稿本文です。',
    'user_id' => Auth::id(),
]);
```
これで、posts テーブルに新しい投稿レコードが追加されます。

# ③注意：$fillable が必要！
create() を使うには、**モデル側で代入を許可するカラムを $fillable で明示する必要があります。**

**Postモデルの例（app/Models/Post.php）**

```php
class Post extends Model
{
    protected $fillable = ['title', 'body', 'user_id'];
}
```
これを設定しないと、**MassAssignmentException**  (**大量代入エラー**)が発生します。

# ④なぜ $fillable が必要なの？
Laravelでは「ホワイトリスト方式」でセキュリティを守っています。
つまり、**明示的に許可したカラムしか** **create() で登録できない仕組み**です。

**NGな例（$fillable 未設定）**
```php
Post::create($request->all()); // セキュリティリスクあり！
```
→ 悪意のあるリクエストで admin = 1 などの値が送られてしまう危険があります。

# ⑤コントローラーでの活用例
```php
public function store(Request $request)
{
    $validated = $request->validate([
        'title' => 'required|string|max:255',
        'body' => 'required|string',
    ]);

    $validated['user_id'] = Auth::id();

    Post::create($validated);

    return redirect()->route('posts.index')->with('success', '投稿を作成しました！');
}
```
# ⑥create() の代わりに使える書き方（参考）
```php
$post = new Post();
$post->title = 'タイトル';
$post->body = '本文';
$post->user_id = Auth::id();
$post->save();
```
→ こちらはより「手続き的」な書き方。
細かく処理したいときはこちらの方が適しています。

# ⑦まとめ
![IMG_7750.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2246240/6c2cabe8-7fe8-45e2-a9ab-1765e8593468.jpeg)
create() メソッドは、LaravelのEloquentを使う上でとても重要な基本の1つです。
正しく理解して、セキュアかつ効率的なデータ登録を実現しましょう！
Raspberry pi4 を Google Drive と共有する by Python

***はじめに***
Raspberry pi4 を用いて Google Drive を共有フォルダーとして使う方法について記す。

外部から Raspberry pi に取り込んだデータをサーバ上に置くことを目的としている。調査する中で [Rclone](https://rclone.org/) が比較的ハードルが低い様に感じたので このツールを用いて取り組むことにした。

ここでは、Raspberry pi 上で Python を利用しての プログラム例を示す。
Raspberry pi で、コマンドラインを使用する方法は [こちら](https://qiita.com/ytetsuo/items/686c9b80aafbf4077222) に示した。

尚、このツールは Google Drive だけでなく One Drive など 多くのサービスに対応している。

参考：[Rcloneのページ](https://rclone.org/)

----
1：Rclone for Python を Raspberry pi にインストール
~~~
$ pip install rclone-python
~~~
2：参考：コマンド一覧は、[ここに](https://github.com/Johannes11833/rclone_python)記載されているソースプログラム [rclone_python\recon.py] 内に記載されているので確認出来る。
3：参考プログラム
~~~Test001.py
#!/usr/bin/env python3
import tkinter as tk
from rclone_python import rclone
from rclone_python.remote_types import RemoteTypes

# Google Drive にファイルをコピー
def GoogleCopy():
    try:
        rclone.copy('./Test001.py', 'TestDrive:TestFolder')
        statusbar.config(text="Copy 完了！")
    except Exception as e:
        statusbar.config(text=f"コピー失敗: {e}")

# Google Drive からファイルを削除
def GoogleDel():
    try:
        rclone.delete('TestDrive:TestFolder/Test001.py')
        statusbar.config(text="Delete 完了！")
    except Exception as e:
        statusbar.config(text=f"削除失敗: {e}")

#TestDrive が存在していない場合、以下を作成
#rclone.create_remote('TestDrive', RemoteTypes.drive)

# rootウィンドウ設定
root = tk.Tk()
root.title("This is Test")
root.geometry("350x100")

# Copyボタン
copy_button = tk.Button(root, text="Copy", command=GoogleCopy)
copy_button.place(x=50, y=40)

# Deleteボタン
delete_button = tk.Button(root, text="Delete", command=GoogleDel)
delete_button.place(x=200, y=40)

# ステータスバー
statusbar = tk.Label(root, text="Ready", bd=1, relief=tk.SUNKEN, anchor=tk.W)
statusbar.pack(side=tk.BOTTOM, fill=tk.X)

root.mainloop()
~~~

---

☆2025年 4月2日(水) 午前09時30分 初版(Ver1.00) 作成
☆2025年 4月4日(金) 午前10時30分 初版(Ver1.10) 作成：3：参考プログラムを置換え

---
windows11で、sketchup6 その38

# 概要
windows11に、sketchup6を入れてみた。
rubyで、3Dを書く。
練習問題、やってみた。

# 練習問題
sketchupで、面に穴を開けるrubyスクリプトは

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/01394a7a-49d4-4911-82f8-71223c5def12.png)

# サンプルコード

```

def eraseTest
	ents = Sketchup.active_model.entities
	pt1 = [-100, -100, 0]
	pt2 = [ 100, -100, 0]
	pt3 = [ 100, 100, 0]
	pt4 = [-100, 100, 0]
	pt5 = [-50, -50, 0]
	pt6 = [ 50, -50, 0]
	pt7 = [ 50, 50, 0]
	pt8 = [-50, 50, 0]
	outerLoop = ents.add_face pt1, pt2, pt3, pt4
	innerLoop = ents.add_face pt5, pt6, pt7, pt8
	ents.erase_entities ents[-1]
end


```

以上。
CopilotでD365fOの仮想テーブルをナレッジソースとして使ってみる


Copilotで仮想テーブル(D365fOの仮想エンティティ)をナレッジソースとして使えるようになったので試してみました。

（関連文書）
財務と運用データに関するチャット (プレビュー)
https://learn.microsoft.com/ja-jp/dynamics365/fin-ops-core/dev-itpro/copilot/chat-with-fno-data

FOの環境はUDEの10.0.42

**a. Copilot studioにログインして、ナレッジを追加。**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4043034/9a0cc6f7-d639-4abf-8077-4d6717530d5c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4043034/36bc989e-16d1-4f49-8651-46c31c5ffa45.png)




テーブルとして、FOの仮想テーブルである、購買注文明細行(mserp)を選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4043034/6a8ba525-0fde-47df-873a-ff40f3a0705a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4043034/1b2c4c50-9213-4359-8565-677d106186a7.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4043034/6e0b50c8-8509-440f-bce2-1ffa838076ec.png)






**b.同様の手順で「仕入先」のナレッジを作成。**


**c.トピックを作成**

「生成型の回答を作成する」アクションを追加して、データソースとして、上で作成したナレッジ[購買注文明細行][仕入先]を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4043034/f38403e8-15d8-4798-9120-4194aea9b49b.png)


**d.テスト機能で質問してみて動きを確認。**

**(質問)Let me know total price for vendor 1001 (仕入先1001からの総額は？)**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4043034/95debf95-5d73-4261-8e8e-b7a1bc5ae120.png)



それっぽい回答

**(質問)Which supplier did we purchase from the most?　（最もたくさん購入した仕入先は？）**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4043034/93584366-2632-467a-9aed-8358a4dc58aa.png)



**(質問)What are the top two companies by purchase amount?（最もたくさん購入した上位２つの仕入先は？）**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4043034/f0c5e249-781a-4c8d-bfa2-c8fcdb719631.png)


**質問が難しかったらしい。。**

**(質問)Please tell me the list of vendors of USMF company.（会社USMFの仕入先のリストをおしえて？）**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4043034/fee221c3-d52b-461e-ac88-98b4f5bfbfea.png)



**SQLの簡単なクエリで取得できそうなレベルの質問だと回答が戻ってくる感じ！**
**データエンティティの作り方によっては、いろいろ質問できそうだなと思います**
**これを利用した、どんな標準機能が提供されるのを楽しみしています。**