OmniAICreator/Qiita-1.07M huggingface dataset:
PG実務の流れ


### 実務の流れ（ざっくり）

1. **要件の理解**
   - ドキュメント（仕様書や要件定義書）を読む
   - チーム内や顧客とすり合わせする（ときには曖昧なところを質問）
2. **設計**
   - データ構造・処理フローを考える
   - フレームワークやAPIの選定、クラス設計など
3. **実装**
   - コーディング。チームのコーディング規約を守りつつ
4. **テスト**
   - 単体テスト、結合テスト（場合によっては自動テストを書く）
5. **レビュー**
   - 他の開発者によるコードレビュー
6. **デプロイ**
   - テスト環境・本番環境へ反映
7. **運用・保守**
   - バグ対応や追加機能など

---

## 🔧 実務に近い教材やサービス

以下の教材・サービスは「実務っぽい体験」ができます：

### 1. **[DevQuest（旧：Paiza開発インターン）](https://devquest.jp/)**
- 実際の業務風のタスクが出される（ドキュメント → コーディング → テスト）
- Gitやチーム開発の流れも体験できる
- 言語：JavaScript, Java, Pythonなど

### 2. **[AtCoder Jobs 実務コーディング体験](https://jobs.atcoder.jp/)**
- 業務を想定したコーディング問題（システム開発風の問題あり）

### 3. **[GitHubの模擬プロジェクト](https://github.com/)**（例：RealWorldアプリ）
- OSSの模擬案件（ToDoアプリやブログCMS）を fork して実装してみる
- 実際にIssueやPull Requestを体験できる

### 4. **[LeetCode Projects / HackerRank Projects]**
- コーディングスキルだけでなく、システム設計・デバッグの力も必要な模擬課題あり

### 5. **[Build Your Own X](https://github.com/danistefanovic/build-your-own-x)**
- 「自分でXを作ってみよう」系のプロジェクト集（例：OS、DB、Gitなど）
- 実際に手を動かしながらシステム全体を理解できる

---

## ✨ より実務に近い学び方のコツ

- **仕様書っぽい課題文を見て、自分でタスクを分解する練習**
- **Gitを使って管理する**
- **実装だけでなく、なぜそう作るのか？を意識する**
- **コードレビューを模擬する（ChatGPTにレビューさせるのも◎）**

---

「実務っぽさ」を感じたいなら、実際のGitHubリポジトリでチーム開発を模倣してみるのがかなりおすすめです。  
興味あるジャンル（Webアプリ、自動化ツールなど）に沿った「練習案件」も一緒に考えることもできるので、よければ方向性教えてください！

どんなことを「実務っぽく」体験してみたいですか？（Webアプリ、デスクトップ、業務ツール など）
Cursorを無料で使ってみた

# Cursorを無料で使ってみた
Cursorを無料で使おうとしてみた記録になります。

私自身、chatGPTのサブスクリプションは登録していますが、Cursorは登録しておらず。。
どちらにも課金するのは嫌だな〜と思っていたところ、、
OpenAPIのサブスクリプション(API Key)を使用してCursorのAgentやAskを使えばいいのでは！と思い、実践してみました。

## 結論から言うと、使えません！！

というのも、
Agentは使用不可。Askは使えますが、使用するたびにコストがかかる従量課金制。

Askは1リクエストあたり約0.02$かかる。
Cursorにもプロ版よりコストがかかると言っています。

Cursor画面より
![スクリーンショット 2025-04-08 9.33.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4007207/42b6b6a5-7350-4f40-9195-db1137dc58b5.png)


Agentを使用しようとした時のメッセージ
> Agent and Edit rely on custom models that require a Pro or Business subscription. Please use a Pro or Business subscription and/or disable API keys. Ask should still work.
(Request ID: 479fec5f-05f9-4728-97f2-d434228e3df2)

なので、
両方課金するか
chatGPTは解約してCursorに完全移行するか
になりますね。。
SPSS Modeler ノードリファレンス 8-2 テキストリンク分析

# 8-2 テキストリンク分析ノード[IBM SPSS Text Analyticsタブ]

![194_161テキストリンク分析.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/29c7b6de-e602-4a4e-9d36-85b27d30d1ff.png)


## 1.ノードの目的
自然言語のコメントからキーワードを抽出し集計用にレコード（行）に展開します。

## 2.解説動画（60秒）

<iframe width="560" height="315" src="https://www.youtube.com/embed/v9U5O12UQak?si=rQbmfvFNxHo-UXaG&amp;start=1" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

## 3.クイックスタート

[可変長ファイル]に[テキストリンク分析]を接続し、[テーブル]に繋ぎます。

![スクリーンショット 2025-03-26 11.51.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/85a459a0-80b2-4cad-9190-d82b223d762b.png)

サンプルデータ（EXCEL）はSPSS Modeler Premiumに同梱されています。

![スクリーンショット 2025-03-26 11.56.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/7fde6919-f712-4d64-86e6-362fb0996a70.png)

対象データの[Text]を自然言語処理します。

![スクリーンショット 2025-03-26 12.57.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/c2826378-4665-4a7a-b1fc-94c758116dc1.png)

[テキストリンク分析]ノードの設定は以下の通りです。

![スクリーンショット 2025-03-26 11.51.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/00fc0217-32be-44ca-99d5-b095000a5f5e.png)

テーブルを[実行]します。抽出したキーワードがレコード（行）に展開されます。これにより[id]に属性がある場合には再結合して集計することができます。

![スクリーンショット 2025-03-26 11.52.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/933f6bde-6d95-4828-b277-ef4feff07765.png)

https://qiita.com/416nishimaki/items/a4c1b32e796d67b8cd65

感情＋係り受けを用いた例をつくります。

![スクリーンショット 2025-03-26 11.52.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/9086bbdb-558f-4c3b-98d4-cd249df431de.png)

[テキストリンク分析]ノードの設定は以下の通りです。

![スクリーンショット 2025-03-26 11.53.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/d4075901-3c65-4cc5-830d-be2a11e69b26.png)

[フィールド作成]ノードの設定は以下の通りです。

![スクリーンショット 2025-03-26 11.53.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/3d55fdbd-c5c0-46be-b9a8-55768ab0ba50.png)

テーブルを[実行]します。ネガティブな意見とその対象が抽出されました。

![スクリーンショット 2025-03-26 11.54.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/bfa1c286-1c85-47cc-994d-4c14925ce690.png)



## 4.Tips

#### 逆引き辞書13章　自然言語の処理

https://qiita.com/416nishimaki/items/4bf813e6cba84b2a1008#13%E8%87%AA%E7%84%B6%E8%A8%80%E8%AA%9E%E3%81%AE%E5%87%A6%E7%90%86:~:text=%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8%E5%9B%B3%E3%81%AF%E3%81%93%E3%81%A1%E3%82%89-,13,-.%E8%87%AA%E7%84%B6%E8%A8%80%E8%AA%9E%E3%81%AE


## 5.参考情報

#### Ver18.5以前はたはModeler Professional版でもテキスト分析する記事はこちら

https://qiita.com/harrowharrow16/items/248ff8fe3879b63e7ae3

#### ノードのヘルプ

https://www.ibm.com/docs/ja/spss-modeler/18.6.0?topic=categories-text-mining-modeling-node

#### SPSS Modeler 逆引きストリーム集（データ加工）

https://qiita.com/416nishimaki/items/4bf813e6cba84b2a1008

#### SPSS Modeler ノードリファレンス目次

https://qiita.com/416nishimaki/private/503037195081d3323eee
Obj-BrowseのSelect Fieldってなに？

## はじめに
アクティビティのObj-Browseを使用して、実装していた際に「Select Field」のチェックボックスがありました。これは何だと気になったため、調べたところわかりやすいサイトが見当たらなかったため、ここで残すことにしました。そのため、間違いなどがある可能性もあるので、もし違うよというものがあれば教えていただけると幸いです。

## Select Fieldってなに？
![Screenshot 2025-04-07 at 11.49.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3815234/3c2494fd-742c-4a58-85f9-6e0e2cef9414.png)
キャプチャはアクティビティのObj-Browseのものです。
フィールドがリストになっていて、Select Fieldのチェックボックスで選択ができるようになっています。
**結論は、基本的にチェックをつければいいです。**
チェックをつけたものは有効になり、つけなかったものは無効のためフィールドリストにないようなものです。そのため、チェックを外すときは、ゴミ箱マークで削除しておくのが良さそうです。
例）
.CustomerID (チェックあり)
.CustomerName (チェックあり)
.EmailAddress (チェックなし)

.CustomerIDと.EmailAddressは値が取得され、Pageに値が含まれる。.CustomerNameは,
値は取得されず、Pageに存在しない状態になる。


ちなみにSelect Fieldでひとつもチェックを入れないと全てのデータを取得しようとするので、パフォーマンスなどに影響します。

## おわりに
詳しい内容まで書いてはいませんが、Select Fieldってこんな感じなんだと理解して使用できるようになってもらえたら嬉しいです。
Shallow Clone 先のテーブルに対する権限不足によるVacuumエラー

## はじめに
Shallow Clone 元テーブル（nation）に対してVacuumを実行する際に、Shallow Clone 先のテーブル（nation_clone）に対する権限不足によるエラーが発生しましたので、再現方法と解決策を紹介します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478068/229f78fd-4dd7-40c1-9585-fc495214e3f5.png)

このエラーが発生する想定シチュエーションとしては、ジョブ実行用ユーザでメダリオンアーキテクチャの Silver テーブルの作成から最適化まで実行しており、一般ユーザがその Silver テーブルを Shallow Clone してしまうという状況が考えられるかなと思います。

## 権限確認
* Shallow Clone 元テーブル（nation）に対して ユーザAに ALL PRIVILEGES 権限を付与

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478068/1bbeff64-a85c-42a5-a32c-d348c0cca134.png)


* Shallow Clone 先テーブル（nation_clone）に対してはユーザAの権限なし

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478068/71731ab2-0a88-4a8f-b858-d83d98f8069a.png)

## Vacuum実行
* ユーザAの専用アクセスモード（シングルアクセスモード）クラスターを使用する
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478068/c0e1dc14-47b8-4646-86e6-cd991795fcc1.png)

* Shallow Clone 元テーブル（nation）に対してVacuumを実行すると、Shallow Clone 先テーブル（nation_clone）にSELECT権限がないというエラーが発生
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478068/2f556aa4-6b94-4eda-9281-145c71d4ccd5.png)

## 解決策
* クラスターを標準アクセスモード（共有アクセスモード）にして、Vacuumを実行すると成功する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478068/842f03ea-aae0-47e9-b959-3858fdef66ac.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478068/e01ac97d-a821-406a-956e-828efa1501c3.png)

* もしくは、Shallow Clone 先のテーブル（nation_clone）にSELECT権限を付与すると成功する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478068/68454fcc-a87b-483e-b232-8f989f12f288.png)

## おわりに
ドキュメントにも以下の記述が記載されていましたので、Shallow Clone テーブルの操作は標準アクセスモードのクラスターを使用するべきのようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478068/7d2ad30b-eba3-42f3-8d50-b22f734d1d5f.png)

https://learn.microsoft.com/ja-jp/azure/databricks/delta/clone-unity-catalog#single-user
【AWS DVA】AWS Certified Developer - Associate 合格体験記

# はじめに
AWS DVAに合格したので、勉強法などを記録しておきます。
今後受験する予定の方に少しでも参考になれば幸いです。

# 前提
- 約一年前にAWS CLFに合格
- 業務ではすでに構築されたものを使うことはあるが、自力で構築することはほとんどない

# 受験までの学習
## 勉強法
1. udemyの動画視聴
    - 各サービスの概要を学ぶ
    - DVAで重要なサービスを重点的に学習した
1. 問題集（Cloud License）
    - 4080円/3か月
    - 現時点で7問×64セットある
    - わからないサービスや用語をメモして、5~10セット単位で調べて、問題を解いて、を繰り返した
1. AWS公式問題セット（AWS Certified Developer - Associate Official Practice Question Set (DVA-C02 - 日本語)）
    - 20問しかないので最終確認程度にしかならないが、全問正解できるようにするべし

https://www.udemy.com/share/108N6a3@0W93b3mXn1c3ZJa4hb8o2n_N3steTlwP4igA8Jj_xpeU2D4kDCcu7uxn_0d3JfA3KQ==/

https://cloud-license.com/

https://explore.skillbuilder.aws/learn/catalog

## 勉強時間
諸々の事情もあり勉強開始から1か月で取得しました。
勉強時間としては35時間程度でした。

# おわりに
以上、AWS DVAの合格体験記でした。
最後までご覧いただきありがとうございました。
Secure Boot (Fedora41)

# Fedora 41での Secure Boot 設定手順

> 参考ドキュメント: `/usr/share/doc/akmods/README.secureboot`

## 1. 前提条件

### SecureBoot keyの保存場所
- `/etc/pki/akmods`

## 2. Secure Boot鍵の作成と登録手順

### 2.1 必要なツールのインストール
```bash
sudo dnf install kmodtool akmods mokutil openssl
```

### 2.2 鍵の作成
```bash
sudo kmodgenca -a
```

### 2.3 MOKへの公開鍵登録
```bash
sudo mokutil --import /etc/pki/akmods/certs/public_key.der
```
※ この時点でパスワードの入力を求められます

### 2.4 システムの再起動
```bash
systemctl reboot
```

## 3. MOKの登録手順

1. システム再起動後、MOK管理画面が表示されます
2. **「Enroll MOK」** を選択
3. **「Continue」** を選択
4. **「Yes」** を選択
5. 先ほど設定したパスワードを入力
6. システムを再起動して完了
CloudFront+S3構成でのBasic認証(CloudFrontFunctions版)

CloudFront + S3の構成でBasic認証を入れる作業があったので、方法を残しておきます。

## やりたいこと

S3でホスティングした静的ページに対してBasic認証をしたい。
ただ、Lambda@Edgeまでは利用したくはない。
(Lambda@Edgeでも可能)

## 手順1

CloudFrontFunctionsを利用します。

CloudFront > 関数を選択

![スクリーンショット 2025-04-08 8.55.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113764/64c24113-c165-41fc-991e-9839d7378446.png)

## 手順2

「関数を作成」からjsの関数を作成していく

![スクリーンショット 2025-04-08 8.55.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113764/9f70b693-9a68-4c58-b97d-cffd2d428954.png)

![スクリーンショット 2025-04-08 8.57.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113764/9ce038f6-729e-4e56-b90d-a7315cce54be.png)

## 手順3

コードを記述

```js

function handler(event) {
  var request = event.request;
  var headers = request.headers;

  var authHeader = headers['authorization'];
  var validUser = 'user'; // ユーザID
  var validPass = 'password'; // パスワード
  var expected = 'Basic ' + encodeBase64(validUser + ':' + validPass);

  if (!authHeader || authHeader.value !== expected) {
    return {
      statusCode: 401,
      statusDescription: 'Unauthorized',
      headers: {
        'www-authenticate': { value: 'Basic realm="Restricted Area"' }
      }
    };
  }
}

function encodeBase64(str) {
  var base64 = '';
  var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';

  for (var i = 0; i < str.length;) {
    var a = str.charCodeAt(i++) || 0;
    var b = str.charCodeAt(i++) || 0;
    var c = str.charCodeAt(i++) || 0;

    var enc1 = a >> 2;
    var enc2 = ((a & 3) << 4) | (b >> 4);
    var enc3 = ((b & 15) << 2) | (c >> 6);
    var enc4 = c & 63;

    if (!b) enc3 = enc4 = 64;
    else if (!c) enc4 = 64;

    base64 += chars.charAt(enc1) + chars.charAt(enc2) +
              chars.charAt(enc3) + chars.charAt(enc4);
  }

  return base64;
}

```

## 手順4

作成した関数を公開する

![スクリーンショット 2025-04-08 9.01.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113764/edaf0000-4b1a-451f-9995-8aa438b3275c.png)

![スクリーンショット 2025-04-08 9.01.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113764/14e7ef80-4046-459c-b08d-77858cfde89c.png)

## 手順5

CloudFrontにの「ビヘイビア」で関連付けを行う

![スクリーンショット 2025-04-08 9.03.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113764/ef199a45-8727-44c6-96fa-ae18fbb4848a.png)

## まとめ

今までLambda@Edgeを利用してBasic認証を追加していたが、今回はCloudFrontFunctionsを試しで利用してみました。
簡単に利用できたので、今後もどんどん使っていきたいと思います
#0098（2025/04/08） 依存性逆転の原則（Dependency Inversion Principle: DIP）

# 依存性逆転の原則（Dependency Inversion Principle: DIP）

依存性逆転の原則（Dependency Inversion Principle: DIP）は、SOLID原則の中でも特にアーキテクチャ設計に直結する重要な概念です。DIPは以下の2つの要点を含んでいます：

1. 高水準モジュールは低水準モジュールに依存すべきではない。両者は抽象に依存すべきである。
2. 抽象は詳細に依存すべきでなく、詳細が抽象に依存すべきである。

本記事では、上級プログラマー向けにDIPを満たしていないコードと、それをDIP準拠の設計にリファクタした例を **Python** と **TypeScript** で紹介します。

---

## DIPの本質

DIPは、実装（詳細）に依存するのではなく、**抽象（インターフェース）に依存する**ことで、モジュール間の結合度を下げ、拡張性やテスト容易性を高める設計原則です。

「**従来の自然な依存の向きを“意図的に逆転させる”のが正しい**」という原則です。

---

## Pythonによる例（ログ出力システム）

### ❌ DIPが守られていない例

```python
class FileLogger:
    def log(self, message: str):
        with open('log.txt', 'a') as f:
            f.write(message + '\n')

class UserService:
    def __init__(self):
        self.logger = FileLogger()  # 具体クラスに依存

    def create_user(self, username):
        # ユーザー作成処理
        self.logger.log(f"User {username} created")
```

`UserService` は `FileLogger` という低水準の実装に直接依存しており、拡張やテストが困難です。

### ✅ DIPが守られている例

```python
from abc import ABC, abstractmethod

class Logger(ABC):
    @abstractmethod
    def log(self, message: str):
        pass

class FileLogger(Logger):
    def log(self, message: str):
        with open('log.txt', 'a') as f:
            f.write(message + '\n')

class ConsoleLogger(Logger):
    def log(self, message: str):
        print(message)

class UserService:
    def __init__(self, logger: Logger):  # 抽象に依存
        self.logger = logger

    def create_user(self, username):
        # ユーザー作成処理
        self.logger.log(f"User {username} created")

# 利用例
service = UserService(ConsoleLogger())
service.create_user("alice")
service = UserService(FileLogger())
service.create_user("beta")
```

`UserService` は `Logger` という抽象に依存しているため、将来ログ出力方法を変更しても `UserService` 自体は影響を受けません。

---

## TypeScriptによる例（通知システム）

### ❌ DIPが守られていない例

```typescript
class EmailNotifier {
    send(message: string): void {
        console.log(`Sending email: ${message}`);
    }
}

class OrderService {
    private notifier = new EmailNotifier(); // 具体クラスに依存

    placeOrder(orderId: number): void {
        // 注文処理
        this.notifier.send(`Order ${orderId} has been placed.`);
    }
}
```

`OrderService` が `EmailNotifier` に強く依存しており、他の通知方法への変更が難しい構造です。

### ✅ DIPが守られている例

```typescript
interface Notifier {
    send(message: string): void;
}

class EmailNotifier implements Notifier {
    send(message: string): void {
        console.log(`Sending email: ${message}`);
    }
}

class SlackNotifier implements Notifier {
    send(message: string): void {
        console.log(`Sending Slack message: ${message}`);
    }
}

class OrderService {
    constructor(private notifier: Notifier) {} // 抽象に依存

    placeOrder(orderId: number): void {
        this.notifier.send(`Order ${orderId} has been placed.`);
    }
}

// 利用例
const service = new OrderService(new SlackNotifier());
service.placeOrder(123);
```

インターフェース `Notifier` によって `OrderService` と通知手段が疎結合になり、柔軟な差し替えやテストが可能になります。

---

## まとめ

依存性逆転の原則を守ることで、アプリケーションのモジュールは実装の詳細ではなく、その**契約（インターフェース）**に依存する構造になり、保守性・再利用性・テスト容易性が劇的に向上します。上級開発者としては、常に "抽象との会話" を意識した設計を行うことが、堅牢なアーキテクチャ実現の鍵となります。
streamlitで作成した表の特定列だけ書き込み禁止処理

# Webページに作成した表の任意列だけ書き込みできないようにしたい

下に示すような表をpandasデータフレームで作成して，Webブラウザ上にstreamlitを用いて表示させた時に，特定の列（この場合：名前，年齢，職業）をプルダウンメニューで選択して，**編集できない**ようにしたい．

![スクリーンショット 2025-04-04 6.10.16.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1979979/7fa7506e-7276-4701-bf27-3955d0f636e4.jpeg)

**以下がそのサンプルプログラム**

```edit_column_checkbox.py
# -*- coding: utf-8 -*-
import streamlit as st
import pandas as pd

# サンプルデータフレームの作成
data = {'名前': ['山田', '田中', '佐藤'],
        '年齢': [25, 30, 28],
        '職業': ['エンジニア', 'デザイナー', '営業']}
df = pd.DataFrame(data)

# 編集不可にする列を選択するチェックボックス
disabled_cols = st.multiselect('編集不可にする列を選択してください', df.columns)

# 表の表示と編集
edited_df = st.data_editor(df, disabled=disabled_cols)

# 編集結果の表示
st.write('編集結果:')
st.write(edited_df)
```

**steramlitの実行方法：**　コマンドプロンプト（ターミナル）で，
　　streamlit run edit_column_checkbox.py
を実行（入力してリターンキー）するとWebブラウザが起動し，上記のような編集を禁止したい選択プルダウンメニューが表示される．
選択したものは，編集できなくなる．
html メモ

🌐 1. ドキュメントの基本構造
~~~html
<!DOCTYPE html>
<html>
  <head>
    <title>ページのタイトル</title>
    <meta charset="UTF-8">
  </head>
  <body>
    <!-- コンテンツ -->
  </body>
</html>
<!DOCTYPE html>：HTML5を使う宣言
<html>：HTML文書全体を囲む
<head>：メタ情報（文字コード、タイトル、CSSなど）
<body>：実際にブラウザに表示されるコンテンツ
~~~
📝 2. テキスト関連
~~~html
<h1>〜<h6>	見出し（数字が小さいほど重要）
<p>	段落
<br>	改行（空の要素）
<strong>	強調（太字）
<em>	強調（イタリック）
<span>	インライン要素（装飾用など）
<hr>	区切り線（水平線）
~~~
📋3. リスト
~~~html
<ul>	順序なしリスト（●など）
<ol>	順序付きリスト（1. 2. 3.）
<li>	リスト項目
~~~~
🔗 4. リンク & メディア
~~~html
<a href="">	ハイパーリンク
<img src="">	画像表示
<video> / <audio>	動画・音声の埋め込み
<iframe>	別ページの埋め込み（例：YouTube）
~~~
📦 5. レイアウト・構造
~~~html
<div>	ブロック要素のコンテナ（レイアウトに使う）
<section>	セクション（意味的な区切り）
<article>	記事など独立した内容
<header>	ページやセクションのヘッダー
<footer>	フッター
<nav>	ナビゲーションリンク
<main>	メインコンテンツ
~~~~
🧾 6. フォーム
~~~html
<form>	フォーム全体を囲む
<input>	ユーザー入力欄（type属性で種類が変わる）
<textarea>	複数行の入力欄
<button>	ボタン
<select> + <option>	プルダウンメニュー
<label>	入力欄のラベル指定
~~~~
🎨 7. テーブル（表）
~~~~
タグ	説明
<table>	表全体
<tr>	表の行
<th>	表のヘッダーセル（太字、中央揃え）
<td>	表のデータセル
~~~~
🧩 8. その他
~~~html
<details> + <summary>	開閉可能な詳細表示
<code>	コードの表示（等幅フォント）
<pre>	整形済みテキスト（スペース・改行保持）
<script>	JavaScriptの埋め込み
<style>	CSSの埋め込み
~~~
サンプル
✅ 1. テキスト表示（見出しと段落）
🧱 通常HTML
~~~html
<h1>こんにちは！</h1>
<p>これは普通のHTMLです。</p>
~~~
🧩 Vue版（テンプレート内）
~~~html
<template>
  <h1>{{ title }}</h1>
  <p>{{ message }}</p>
</template>

<script>
export default {
  data() {
    return {
      title: 'こんにちは！',
      message: 'これはVueで表示した段落です。'
    };
  }
}
</script>
~~~
✅ 2. ボタン + クリックイベント
🧱 通常HTML + JavaScript
~~~html
<button onclick="alert('クリックされました')">クリック</button>
~~~
🧩 Vue版
~~~html
コピーする
編集する
<template>
  <button @click="showAlert">クリック</button>
</template>

<script>
export default {
  methods: {
    showAlert() {
      alert('クリックされました');
    }
  }
}
</script>
~~~
✅ 3. フォーム入力 + バインディング
🧱 通常HTML + JavaScript
~~~html
<input type="text" id="name" oninput="document.getElementById('output').textContent = this.value">
<p id="output"></p>
~~~
🧩 Vue版（双方向バインディング）
~~~html
<template>
  <input type="text" v-model="name">
  <p>{{ name }}</p>
</template>

<script>
export default {
  data() {
    return {
      name: ''
    };
  }
}
</script>
~~~
✅ 4. 配列からリストを表示
🧱 通常HTML（配列のループはJavaScriptで）
~~~html
<ul id="list"></ul>

<script>
  const fruits = ['りんご', 'バナナ', 'みかん'];
  const ul = document.getElementById('list');
  fruits.forEach(fruit => {
    const li = document.createElement('li');
    li.textContent = fruit;
    ul.appendChild(li);
  });
</script>
~~~
🧩 Vue版（v-for で簡単ループ）
~~~html
<template>
  <ul>
    <li v-for="fruit in fruits" :key="fruit">{{ fruit }}</li>
  </ul>
</template>

<script>
export default {
  data() {
    return {
      fruits: ['りんご', 'バナナ', 'みかん']
    };
  }
}
</script>
~~~
✅ 5. 条件表示（if文）
🧱 通常HTML + JavaScript
~~~html
<p id="message" style="display: none;">条件が満たされました！</p>
<script>
  const show = true;
  if (show) {
    document.getElementById('message').style.display = 'block';
  }
</script>
~~~
🧩 Vue版（v-if）
~~~html
<template>
  <p v-if="show">条件が満たされました！</p>
</template>

<script>
export default {
  data() {
    return {
      show: true
    };
  }
}
</script>
~~~
URLパース卒業！kintoneの新APIでゲストスペース判定が一瞬に【APIラボ（開発中の新機能）】

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

今回は、kintone REST APIで「このアプリがゲストスペースかどうか」を判定し、処理を切り替える必要があるシーンで、**つい最近API Labで先行公開された開発中の新API `kintone.space.get()` を使うと、どれだけコードがシンプルになるか**を紹介します。


# 背景：なぜゲストスペースの判定が必要？

kintoneでは、ゲストスペース内にあるアプリに対してREST APIを使う際、通常とは異なるURLが必要です。

### 通常の kintone REST API
たとえば、 **通常のkintone REST API** でゲストスペースのアプリにアクセスする場合は、以下のようなパスを使い、 **URL内にguest/{spaceId}を含める必要があります。**

* 通常: `/k/v1/record.json`
* ゲストスペース: `/k/guest/{spaceId}/v1/record.json`

https://cybozu.dev/ja/kintone/docs/rest-api/records/get-record/


### kintone-rest-api-client
一方、　**@kintone/rest-api-client（KintoneRestAPIClient）**　を使う場合には、new KintoneRestAPIClient() の初期化時に guestSpaceId を明示的に渡す必要があります。

``` javascript
const client = new KintoneRestAPIClient({
  auth: { apiToken: 'xxxxx' },
  guestSpaceId: '123' // ← ここが必要！
});
```

https://www.npmjs.com/package/@kintone/rest-api-client

このように、どちらの方法を使うにせよ、 **「今自分が操作しているアプリがゲストスペースかどうか」そして「そのスペースIDはいくつか」** という情報が必要になります。


そのため、**今操作しているアプリがゲストスペースなのかどうかを判定し、APIの呼び出し方を変える必要があります。**

これまでは、この判定を自前で書く必要があり、以下のようなコードが定番でした。


# 従来の方法（旧コード）

```javascript
/**
 * ゲストスペース判定 & ゲストスペースID取得
 */
const getGuestSpaceId = () => {
    const url = kintone.api.url("/k/v1/app", true);
    if (url.indexOf("guest") === -1) return null;

    const spaceId = url.split("/").at(5);
    return spaceId;
}

/**
 * レコード一括更新
 */
const guestSpaceId = getGuestSpaceId();
const param = { auth: { apiToken: appCode } };
if (guestSpaceId) param.guestSpaceId = guestSpaceId;

await new KintoneRestAPIClient(param).record
    .updateAllRecords({
        app: kintone.app.getId(),
        records: records,
    })
    .catch(error => {
        throw new Error(error);
    });
```

---

このように、URLから無理やりスペースIDを取り出す方法は、**パス構造に依存して壊れやすい**上に、読みやすさや保守性にも欠けます。


# 新APIで一気にシンプルに！
:::note warn
注意：この記事で紹介している kintone.space.get() は、2025年4月8日時点では正式リリースされたAPIではなく、「開発中のAPI（API Lab）」として先行公開されている機能です。将来的に仕様が変更されたり、正式サポートされるタイミングで使い方が変わる可能性もありますので、導入の際は十分ご注意ください。
::: 

新しいkintone Javascript API `kintone.space.get()` を使えば、驚くほどスッキリしたコードにできます。

```javascript
/**
 * レコード一括更新
 */
const spaceInfo = kintone.space.get();
const param = { auth: { apiToken: appCode } };
if (spaceInfo.isGuest) param.guestSpaceId = spaceInfo.id;

await new KintoneRestAPIClient(param).record
    .updateAllRecords({
        app: kintone.app.getId(),
        records: records,
    })
    .catch(error => {
        throw new Error(error);
    });
```

なんと、たったこれだけ。**ゲストスペースかどうか、そしてスペースIDの取得まで1行で完了**します！

公式のAPIリファレンスはこちら:  

https://cybozu.dev/ja/kintone/docs/api-lab/js-api/get-space/

:::note warn
補足：kintone.space.get() は、現在アクセスしている自アプリに対するリクエストにのみ有効です。別のアプリに対してREST APIを使う場合には、そのアプリが属するスペースの情報を別途取得して、guestSpaceId を指定する必要があります。
:::


# Before / After 比較

| 項目 | 旧API | 新API |
|------|-------|-------|
| 判定方法 | URL解析 | `kintone.space.get()` |
| コード量 | 多い | 少ない |
| 可読性 | △ | ◎ |


# まとめ

`kintone.space.get()` のおかげで、ゲストスペース判定は爆速＆確実にできるようになりました。

kintoneカスタマイズをしている方は、今後このAPIを前提に処理を組むことで、よりシンプルかつ安全なコードが書けるはずです。

ぜひ新APIを使ってみましょう！
ソケットって何？　


皆さま、こんにちは！ 今、独学でサーバについて勉強しています！

突然ですが、**「ソケットって何？ ストリームって何？ 結局どういうことなの？」** ってなっていませんか？

まさしく今の私です、、笑　自分なりに簡単にまとめて将来見返せる記事にしたいと思い、今回書きました！

### 1. クライアントとサーバの関係をおさらい

まずは、クライアントとサーバの関係を整理します。

*   **クライアント:** サービスを「お願い」する側（例：Webブラウザ）
*   **サーバ:** サービスを「提供」する側（例：Webサイト）

クライアントがサーバに「〇〇が見たい！」とお願いすると、サーバは「はいよ！」とデータを返す。これが基本的な流れになります。

### 2. 「パイプ」と「ソケット」の違いをイメージで理解！

*   **パイプ:** 一方向の通信路（クライアント → サーバ）

    *   例：手紙をポストに入れる（一方通行）
*   **ソケット:** 双方向の通信路（クライアント ⇆ サーバ）

    *   例：電話で会話する（双方向）

**「1つの接続でデータの送信と受信を行いたい場合にソケットを使用する」**

まさに電話と同じで、ソケットを使えば、クライアントとサーバが**リアルタイム**で、**双方向**にデータをやり取りすることができます。

### 3. ストリームって何？ データの流れをイメージ化！

ソケットの説明で出てくる「ストリーム」。これもよくわかりません。。笑

*   **ストリーム:** クライアントとサーバの間で確立された、**信頼性のある連続的なデータの流れ**

    *   例：川の流れのように、途切れることなくデータが流れていくイメージ

### 4. なぜソケットが必要なの？ 具体例で理解！

ソケットは、クライアントとサーバが**リアルタイム**で、**双方向**にデータをやり取りする必要がある場合に必須です。

*   **オンラインゲーム:** プレイヤーの動きをリアルタイムでサーバに伝え、他のプレイヤーの動きをサーバから受け取る
*   **チャットアプリ:** メッセージをリアルタイムで相手に送り、相手からのメッセージをリアルタイムで受け取る
*   **Webサーバ:** クライアントからのリクエストに応じて、Webページや画像などのデータを送信する

### 5. ソケット通信の仕組みをざっくり解説！

1.  **ソケットの作成:** クライアントとサーバがそれぞれソケットを作成
2.  **接続:** クライアントがサーバのソケットに接続を要求
3.  **データ送受信:** 接続が確立したら、ストリームを通じてデータを送受信
4.  **接続終了:** データ送受信が終わったら、接続を終了

### 6. まとめ：ソケットは双方向通信の要！

ソケットは、クライアントとサーバがリアルタイムでデータをやり取りするための、非常に重要な技術になります。

次回はソケットの種類について書こうと思います！
043 AI屋さんの　LLMにトークン全文入力　マルチモーダル出力　なんとか風


043 AI屋さんの　LLMにトークン全文入力　マルチモーダル出力　なんとか風

Geminiさんもマルチモーダル出力を頑張ってます。
なんとか風　画像生成　めっちゃ得意です。
個人でお楽しみください。


似てないから、許される範囲と
似ているから、許されない場合と
どっちを行きましょうかね。


---


![ENTER_FILE_NAME-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237930/20fd950b-7bb8-4025-9056-93869586fd8c.png)

---

---

![スクリーンショット 2025-04-08 172035.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237930/9bdf0950-07bf-4649-b9ac-de5acfc1bbb4.png)


---

目次

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


無限に生み出せる画像生成プログラムは完成済みですが、
アプリにして、公開するのはやめておきます。
個人でお楽しみください。



今回も無事に
　043 AI屋さんの　LLMにトークン全文入力　マルチモーダル出力　なんとか風
完成です。おめでとうございます。

ー以上ー
WIP　elixir　コードリーディング 個人メモ

elixirの文法に対する理解が乏しいので基礎的な理解を行うためにコードリーディングを実行する。
なお大雑把に読み飛ばすことを防ぐために少数の行を抜粋して理解を深める

# 目的
基礎構文の癖を掴む

# 読み込み箇所
lib配下のelixir/lib/access.ex

```elixir
# SPDX-License-Identifier: Apache-2.0
# SPDX-FileCopyrightText: 2021 The Elixir Team
# SPDX-FileCopyrightText: 2012 Plataformatec
```

## SPDX-License-Identifierとは？

> SPDXという単語の由来は「Software Package Data Exchange」の頭文字から来ており、直訳すると「ソフトウェアパッケージのデータ交換」

> SPDXとは"Software Package Data Exchange"の略で、Linux Foundationが中心になって取り決めた、ソフトウェアのライセンスなどに関するメタ情報をやりとりするための規格

https://www.hitachi-solutions.co.jp/sbom/blog/2021120101/

https://gihyo.jp/article/2022/11/ganshiki-soushi2-0044

## 考察
この行では規格情報について記載されている。
moodleの問題バンクの次年度への移行

# はじめに

moodleで小テストを活用している場合、次年度に移行する時の一般的なやり方です。



- 前年度のコースに入る（「マイコース＞」）
- 「さらに」のプルダウンメニューから「問題バンク」を選ぶ
- 問題バンクのカテゴリを選ぶ（通常トップ）
- プルダウンメニューから「エクスポート」を選ぶ
- ファイルフォーマットで「moodle XMLフォーマット」のラジオボタンを選ぶ
- 「問題をファイルにエクスポートする」ボタンを押す。ファイルがダウンロードされる。
- 今年度のコースに入る
- 「さらに」のプルダウンメニューから「問題バンク」を選ぶ
- プルダウンメニューから「インポート」を選ぶ
- ファイルフォーマットで「moodle XMLフォーマット」のラジオボタンを選ぶ
- ファイルをアップロードする
- 「インポート」ボタンを押す。問題バンクがインポートされる
ハッカソン個人備忘録⑭：Git pull ができない！？原因はキャッシュファイルだったので、ひとまず stash しました

## はじめに
Gitで `git pull` を実行した際に発生するエラーについて、対応方法をまとめました。

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

特に `.pyc` ファイル（Pythonのキャッシュファイル）に関連した問題の対処法です。

## 書こうと思ったきっかけ
開発中に `git pull` が失敗し、エラー内容を調べたところ `.pyc` ファイルのローカル変更が原因でした。このような問題はチーム開発でも起こりうるため、再発防止と共有のために記録しました。

## Git Pull エラー対応メモ

### エラー概要
```
error: Your local changes to the following files would be overwritten by merge:
        app/__pycache__/main.cpython-311.pyc
Please commit your changes or stash them before you merge.
Aborting
```

### 原因
- Gitはマージ前に、ローカルの変更があるファイルがリモートで変更されていると上書きの可能性があるため、処理を止める。
- 今回の対象ファイルは `.pyc` ファイル（Pythonのバイトコードキャッシュ）で、通常Gitで管理するべきではない。

### 解決策

#### ✅ 方法①: `.pyc` ファイルをGit管理対象から除外（推奨）
```bash
git rm --cached app/__pycache__/main.cpython-311.pyc
echo "__pycache__/" >> .gitignore
git add .gitignore
git commit -m "Ignore __pycache__ directory"
git pull origin main
```

#### ✅ 方法②: 一時的に変更を退避（stash）
```bash
git stash
git pull origin main
git stash pop
```

#### ✅ 方法③: 変更を破棄（変更が不要な場合）
```bash
git restore app/__pycache__/main.cpython-311.pyc
git pull origin main
```

### 補足
- `.pyc` ファイルや `__pycache__/` ディレクトリは通常 `.gitignore` に追加し、Gitで追跡しないのが一般的。
- すでにリポジトリに含まれている場合は、一度 `git rm --cached` で削除して、`.gitignore` に追加することで以後無視できる。

### 備考
- チームメンバーにも `.gitignore` 更新をプッシュして共有すると良い。
- もし他にも `.pyc` が混入している場合は、一括除外も検討。

## まとめ

ここまで読んでいただきありがとうございました！最後に簡単に箇条書き程度でまとめメモを残しておきます。

- `.pyc` ファイルはGitで管理しないのが基本。
- pullできないときは、まず `stash` または `restore` を検討。
- `.gitignore` を整備し、トラブルの再発を防ぐのが重要。
- チーム開発では早めに共有・対応しておくと安心。
【初心者向け】トークナイザーを学習させるとどんなメリットがある？

# トークナイザーを「学習させる」とは？  

こんにちは。今回は、自然言語処理（NLP）の世界でよく出てくる「**トークナイザーを学習させる**」というテーマについて、初心者の方向けに分かりやすく解説します。

特に、「なぜトークナイザーをわざわざ訓練する必要があるのか？」といった疑問に対し、**実際の企業事例を交えて**、深掘りしていきます。


## 目次

1. [トークナイザーとは？](#トークナイザーとは)
2. [「トークナイザーを学習させる」とは？](#トークナイザーを学習させるとは)
3. [なぜ学習が必要？目的と効果を深掘り解説](#なぜ学習が必要目的と効果を深掘り解説)
    - [専門用語や略語に強くなる（医療業界の例）](#専門用語や略語に強くなる医療業界の例)
    - [新語・俗語に対応（SNS分析ツールの例）](#新語俗語に対応sns分析ツールの例)
    - [多言語対応（グローバルチャットボットの例）](#多言語対応グローバルチャットボットの例)
    - [トークン数を削減しコスト最適化](#トークン数を削減しコスト最適化)
4. [どうやって学習させるの？](#どうやって学習させるの)
5. [まとめ](#まとめ)


## トークナイザーとは？

トークナイザーとは、文章を「意味のある単位（トークン）」に分割する仕組みのことです。

たとえば：

> 文章：「今日はいい天気ですね」  
> トークン：「今日」「は」「いい」「天気」「です」「ね」

このように、文章を構成する小さなパーツに分けることで、AIは言葉を理解しやすくなります。


## 「トークナイザーを学習させる」とは？

一般的にトークナイザーは、既存のデータ（Wikipediaやニュース記事など）で訓練されています。

しかし、**専門的な業界や新しい分野では、この「汎用トークナイザー」が合わない**ことがあります。  
だからこそ、「自分たちのデータに合わせて、トークナイザーを再学習させる」ことで、より正確で効果的な言語処理ができるようになります。


## なぜ学習が必要？目的と効果を深掘り解説

### 専門用語や略語に強くなる（医療業界の例）

**課題：** 製薬企業が保有する文書には「CYP3A4」「ADME」「用量依存性」など、一般向けのトークナイザーが認識できない専門用語が多く含まれます。

**対応：** 製薬会社が自社データでトークナイザーを再学習。  
**結果：** モデルの理解力が約15〜20%向上したという報告も（例：ファイザー社の論文より）。

---

### 新語・俗語に対応（SNS分析ツールの例）

**課題：** SNSでは「ぴえん」「草」「バズる」など、日々新しい言葉が登場します。

**対応：** SNSデータを使ってカスタムトークナイザーを学習。  
**結果：** 未知語を「不明扱い」にせず処理できるため、感情分析や流行検出の精度が飛躍的にアップ。

---

### 多言語対応（グローバルチャットボットの例）

**課題：** 英語ベースのトークナイザーを日本語やアラビア語に使うと、無駄にトークンが増え、処理効率が低下します。

**対応：** 言語ごとに最適なトークナイザーを再学習。  
**結果：** トークン数が最大30%削減され、処理速度も改善。

---

### トークン数を削減しコスト最適化

生成AI（ChatGPTなど）では、処理するトークン数に応じて**料金やリソース消費**が変わります。

**課題：** 同じ文章でも、トークナイザーによってトークン数が大きく変わる。

**対応：** より効率よく分割するカスタムトークナイザーを設計。  
**結果：** 企業によっては月数十万円単位でAPIコストを削減できたという実例もあります。


## どうやって学習させるの？

トークナイザーの学習には主に以下のようなステップがあります。

1. **自社データの収集・クリーニング**
2. **サブワード分割アルゴリズムの選定（例：Byte-Pair Encoding、WordPieceなど）**
3. **トークナイザーの再訓練（HuggingFace Tokenizers などを活用）**
4. **既存モデルへの適用・精度検証**

技術的には少し複雑ですが、近年はHuggingFaceのようなフレームワークが整っており、比較的簡単に取り組めるようになってきています。

## まとめ

| 項目 | 内容 |
|------|------|
| **目的** | 特定用途・業界に合わせた高精度な言語理解を実現 |
| **主な効果** | ・専門用語や新語の認識<br>・多言語対応<br>・処理効率とコストの最適化 |
| **向いているケース** | 医療、法律、金融、SNS分析、グローバル展開のチャットボットなど |

---

トークナイザーの学習は、まさにAIの理解力を高める「土台づくり」のような存在です。

ちょっと地味に見えるかもしれませんが、ここをしっかり整えることで、
**AIが賢く・効率よく・コストを抑えて動いてくれる**ようになるんです。

少しでも「なるほど！」と思ってもらえたらうれしいです♪
ポートの確認とプロセス終了

## コマンド一覧

ポート一覧確認
`netstat -ano`

リスニング中のポート番号を確認
`netstat -ano | findstr LISTENING`

特定のポートを確認する。(例.ポート3000番）
`netstat -ano | findstr :3000`

閉じたいポートのプロセスIDをtaskkillコマンドする。(例.プロセスID 12345)
`taskkill /PID 12345 /F`


何回かやったのに、時間を空けると調べなおしていたので記録。
ハッカソン個人備忘録⑬：リモートが先に進んでいた！Gitで push に失敗した話を、忘れないように記録しておく

## はじめに
Gitを使って開発をしていると、pushやpullでエラーに遭遇することがあります。

:::note info
**特にチーム開発では、自分の知らないうちにリモートに変更が加わっていることも。**
:::

今回は、Git pushが失敗した状況と、その復旧方法についてメモとしてまとめました。

## 書こうと思ったきっかけ
実際の開発中にGit pushが失敗し、原因や対処法を探すのに時間がかかったため、今後同じようなトラブルに遭遇したときにスムーズに対応できるようにするためです。また、同じようなエラーに悩む人の参考にもなればと思い、記録を残すことにしました。

## 状況の整理
開発中に以下のようなGit操作を行った際、pushが失敗しました。

```bash
git push origin main
```

表示されたエラー：

```
Updates were rejected because the remote contains work that you do not have locally.
```

つまり、リモートに自分のローカルにはない変更があるということ。
これは、他の開発者や別の環境からリモートに先にpushされていた場合によくある現象です。

---

## 実行したコマンドとその意味
| コマンド | 説明 |
|----------|------|
| `git add .` | すべての変更をステージング（準備） |
| `git commit -m "page.tsxの修正"` | page.tsx の修正をコミット |
| `git push origin main` | 失敗：リモートとの差分が原因で拒否された |
| `git remote -v` | リモートURLの確認（問題なし） |
| `git stash` | 作業中の変更を一時退避（※今回は何もなかった） |
| `git pull origin main` | 失敗：リモートとの分岐をどう統合するか未設定でエラー |
| `git config pull.rebase false` | 解決の鍵：pull動作を「マージ」に設定 |
| `git pull origin main` | 成功：ローカルとリモートの履歴をマージ |
| `git stash pop` | 一時退避していた変更を戻す（※内容なし） |
| `git push origin main` | 成功：pushが通った！ |

---

## 解決の決め手は？
```bash
git config pull.rebase false
```
この1行で、Gitが「リモートとの差分をマージで統合する」と判断できるようになり、git pull のエラーが解消されました。
その後の git push もスムーズに成功。

---

## まとめ

ここまで読んでいただきありがとうございました！最後に簡単に箇条書き程度で残しておきます。

- Pushできない原因は「リモートとの差分」だった。
- 解決には `git config pull.rebase false` でpull動作を明示。
- 今後に備えて `--global` オプションで設定するのがおすすめ。
- トラブル時は焦らず、エラーメッセージを読み解くことが重要。
- 同じ現象に出会ったときのために、記録を残しておくと安心です。
オンプレのgitサーバにアクセスできなかった対処(safe directory)

 ## 起きたこと
PC交換で新しいPCを初期設定した後gitでpullしたら、以下のようなメッセージがでた。
社内のオンプレGitサーバのリモートリポジトリに接続できないよう。

    fatal: unsafe repository ('D:/workspace' is owned by someone else)`
    To add an exception for this directory, call:
        git config --global --add safe.directory 'D:/workspace'

## 解決方法 
`git config --global --add safe.directory リモートリポジトリの場所`
コマンドを実行する。

`safe.directory`のあとにリモートリポジトリのパスを入れる。

 注意
'で囲んだりしない(囲んでいたのが間違いだった。)
間違い例 `git config --global --add safe.directory 'リモートリポジトリの場所'`

## 設定の削除
' で囲んで増やしてしまった設定はどちらかで対応
1. .gitconfigを直接編集する
2. `git config --unset-all safe.directory`　でまるまる削除

1の場合、.gitconfigの場所はWindowsの場合
`C:\Users\<ユーザー名>\. gitconfig`
にあるので、テキストエディタなんなり。

最初のPC設定の時もひっかかったので記録。
windows11で、sketchup6 その57

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

# 練習問題
rubyスクリプトでカメラを動かせ。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/c6e66d16-083f-47a0-a2f7-ad21d9a05a99.png)

# サンプルコード

```
def camera_vp_targ
	model = Sketchup.active_model
	view = model.active_view
	camera = view.camera
	eye = camera.eye
	vx = eye.x
	vy = eye.y
	vz = eye.z
	target = camera.target
	tx = target.x
	ty = target.y
	tz = target.z
	vfovdeg = camera.fov
	w = Float(view.vpwidth)
	h = Float(view.vpheight)
	vfovrad = vfovdeg * Math::PI / 180.0
	f = (h / 2) / Math.tan(vfovrad / 2.0)
	hfovrad = 2.0 * Math.atan2((w / 2), f)
	hfovdeg = hfovrad * 180.0 / Math::PI
	prompts = ["Position X", "Position Y", "Position Z", "Target X", "Target Y", "Target Z", "angle focal"]
	values = [vx, vy, vz, tx, ty, tz, hfovdeg]
	results = inputbox prompts, values, "Point de vue Camera / Mire"
	vx, vy, vz, tx, ty, tz, hfovdeg = results
	eye.x = vx 
	eye.y = vy 
	eye.z = vz 
	target.x = tx
	target.y = ty
	target.z = tz
	up = camera.up
	up.set!(0.0, 0.0, 1.0)
	camera.set eye, target, up
	hfovrad = hfovdeg * Math::PI / 180.0
	f = (w / 2) / Math.tan(hfovrad / 2.0)
	vfovrad = 2.0 * Math.atan2((h / 2), f)
	vfovdeg = vfovrad * 180.0 / Math::PI
	camera.fov = vfovdeg
end 
```

以上。
Geminiでロードを描いてみた。

# 概要

Geminiでロードを描いてみました。

# 実装

プロンプトと生成結果は以下の通りです。

```
炎の剣を使うロードを描いてみてください。
```

![炎の剣を使うロード_20250408.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/bab3b86b-1997-4759-9ecd-d9bb083c63e3.png)

```
氷の剣を使うロードを描いてみてください。
```

![氷の剣を使うロード_20250408.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/b673005a-8ade-4bdd-ab85-90157888b576.png)

```
電撃の剣を使うロードを描いてみてください。
```

![電撃の剣を使うロード_20250408.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/3d633717-fc67-49b5-ab1d-163181a9fad9.png)

```
光の剣を使うロードを描いてみてください。
```

![光の剣を使うロード_20250408.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/2867a933-298a-4c45-ae52-169120d75cf8.png)

```
水の剣を使うロードを描いてみてください。
```

![水の剣を使うロード_20250408.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/7a32dddc-4433-46a3-80c1-e42772ed808b.png)

```
闇の剣を使うロードを描いてみてください。
```

![闇の剣を使うロード_20250408.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/48a1480a-3643-4311-86f6-a5fd5952984b.png)

```
聖なる剣を使うロードを描いてみてください。
```

![聖なる剣を使うロード_20250408.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/6af383a3-4712-4da0-bb85-1f2e47d49802.png)

どれも興味深いです。

# まとめ

何かの役に立てばと。
windows11で、sketchup6 その56

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

# 練習問題
rubyスクリプトでカメラを動かせ。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/ada4efbc-43cc-42a6-b33c-0a5decbbfbfc.png)

# サンプルコード

```
def testcam3
	view = Sketchup.active_model.active_view
	camera = view.camera
	eye = camera.eye
	vx = eye.x.to_cm
	vy = eye.y.to_cm
	vz = eye.z.to_cm
	target = camera.target
	prompts = ["Position X", "Position Y", "Position Z"]
	values = [vx, vy, vz]
	results = UI.inputbox( prompts, values, "Camera")
	if results
		vx, vy, vz = results
	else
		UI.messagebox "dame"
		return
	end
	eye.x = vx.cm
	eye.y = vy.cm
	eye.z = vz.cm
	up = camera.up
	camera.set eye, target, up
	UI.messagebox "ok"
end

```

以上。
(Adafruit_NeoPixel)M5StampS3、RGB LEDで遊ぶ


いろいろ、注意
----


- 過去ログをみょ!!!
- Adafruit NeoPixelをインストール


目的
----

M5Stack社製のGROVEシステム RGB LEDを光らせて遊ぶ


結果
----

![image_original (78).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/f6cf1c9b-5e3f-437e-a3a8-859c2e883ed6.jpeg)



プログラム
----

```c++



//rgb_led_s3_2


//インクルド
#include <Arduino.h>
#include <Adafruit_NeoPixel.h>


//定義
#define NUM_LEDS 3
Adafruit_NeoPixel strip(NUM_LEDS, 13, NEO_GRB + NEO_KHZ800);


//初期化
void setup() {
  // put your setup code here, to run once:

  //ネオピクセルの設定
  strip.begin();
  strip.show();

  //カラーセット
  strip.setPixelColor(0, strip.Color( 5, 0, 0));
  strip.setPixelColor(1, strip.Color( 0, 5, 0));
  strip.setPixelColor(2, strip.Color( 0, 0, 5));
  
  strip.show();//再表示

}//setup


//メインループ
void loop() {
  // put your main code here, to run repeatedly:

  delay(3); //ダミー

}//loop


```
Codewars 5 kyu Extract the domain name from a URL

# Codewars 5 kyu Extract the domain name from a URL
https://www.codewars.com/kata/514a024011ea4fb54200004b/train/python
Task
Write a function that when given a URL as a string, parses out just the domain name and returns it as a string. For example:
* url = "http://github.com/carbonfive/raygun" -> domain name = "github"
* url = "http://www.zombie-bites.com"         -> domain name = "zombie-bites"
* url = "https://www.cnet.com"                -> domain name=”cnet”

# Verbalization
replace “http://” to “”
replace “https://” to “”
Replace “www.“ to “”
Extract left side of “.” 
idx = s.find(“.”)  #find the index of “.”
r = s[:idx]  # slice the index of “.”
 
# Code 
```py
def domain_name(url):
    name = url.replace("http://","").replace("https://","").replace("www.","")
    idx = name.find(".") 
    name = name[:idx]  

    return name
```

# Reference
https://atmarkit.itmedia.co.jp/ait/articles/2103/23/news022.html
【徹底解説】Bolt.new x Figma連携：Next.js (App Router) 開発を加速



## はじめに

Next.js (App Router) でWebアプリを開発する際、Figmaデザインを効率的にコード化したいと思いませんか？
AI搭載プラットフォーム**Bolt.new**と**Figma**の連携機能を使えば、Figmaフレームをワンクリックでピクセル忠実なNext.jsコードに変換できます。

https://x.com/boltdotnew/status/1900197121829331158

## 1. Bolt.new x Figma連携とは？

Bolt.newは、テキストやデザインからNext.jsアプリを自動生成するAI開発プラットフォームです。
2024年以降、Figma連携機能（Figma-to-codeで実績のある**Anima**技術を利用）が追加され、Figmaフレームを高精度にコード化できるようになりました。

## 2. Figma取り込み手順 (簡単3ステップ)

1.  **Figma:** コード化したい**フレーム**を選択し、「Copy link」でURLをコピーします。
2.  **Bolt.new:** 「Import from Figma」を選び、コピーしたURLを貼り付けてインポートを実行します。
3.  **完了:** 数十秒でFigmaデザインが反映されたNext.jsプロジェクトが生成され、ライブ実行されます。

**ポイント:**

* **フレームのリンクのみ**有効です（ページ全体やファイルURLは不可）。
* Figmaファイルに**閲覧権限**が必要です。
* アドレスバーに `bolt.new/ + FigmaフレームURL` を直接入力してもインポート可能です。
* 初回はFigmaへのアクセス許可を求められることがあります。

### 3. Figma要素からNext.jsコードへの変換

Bolt.new (Anima) はFigmaのデザイン要素を解析し、HTML/JSX構造とCSS（主に**Tailwind CSS**）を生成します。
特に**Auto Layout**や**コンポーネント**を適切に使うと、より整理されたコードが期待できます。

| Figma要素/機能       | Bolt.newでのコード変換 (Next.js / Tailwind)                                            |
| :------------------- | :----------------------------------------------------------------------------------- |
| **フレーム** | Next.jsの**ページコンポーネント** (`app/page.tsx`等) に。複雑な場合は子コンポーネント化。 |
| **Auto Layout** | **CSS Flexbox** (Tailwindクラス `flex`, `gap-*`等) でレイアウトを再現。               |
| **レスポンシブ設定** | Animaプラグイン設定に基づき、**メディアクエリ付きコード**を生成。                      |
| **コンポーネント** | **Reactコンポーネントファイル**として出力される傾向あり。                              |
| **バリアント** | 表示中の状態のみ**静的にコード化**。他状態 (Hover等) は別途実装が必要。             |
| **画像・アイコン** | `<img>` または Next.js `<Image>`。SVGはコード化されることが多い。                      |
| **テキスト** | HTML要素 + スタイルは**Tailwindユーティリティクラス**で適用。                          |
| **エフェクト** | CSS (`box-shadow`等) で再現可能な範囲でコード化。                                  |
| **プロトタイプ挙動** | **引き継がれません**。インタラクションは別途実装が必要です。                           |

### 4. 生成されるNext.jsコードの特徴

* **構造:** Next.js (App Router) 構成 (`src/app/`以下) に準拠。
* **スタイリング:** 主に**Tailwind CSS**を使用。設定ファイルも含まれます。
* **品質:** 高いデザイン再現性。TypeScriptベースの関数コンポーネント。
* **考慮点:**
    * Next.js規約 (`use client`等) の誤りを含む可能性があり、**手動修正やAIへの修正指示**が必要な場合があります。
    * チームの規約に合わせ、**リファクタリング** (コンポーネント分割、命名規則統一、Tailwindクラス整理等) を推奨します。
    * UI以外のバックエンド連携コードが生成されることもあります。

初期実装としては高品質ですが、最終的な調整は開発者が行う前提です。

### 5. 注意点・制限事項

* インポートは**1フレームずつ**行う必要があります（一括インポート不可）。
* Figmaのデザインを更新しても、Bolt.new上のコードは**自動更新されません**（再インポート or 手動修正）。
* 生成されたレスポンシブコードは、特定の画面幅で**微調整が必要**になる場合があります。
* スマートアニメーション、GIF、Figma Variables、プロトタイプのインタラクション設定などは**非対応**です。
* Bolt.new自体が比較的新しいサービスのため、**生成結果の検証は必須**です。

### 6. まとめ：Bolt.new Figma連携の活用

Bolt.newのFigma連携は、UIの初期実装を劇的に高速化できる強力な機能です。

**活用ポイント:**

* **Figma側:** Auto Layoutやコンポーネントを活用し、構造化されたデザインを作成する。
* **開発側:** 生成コードをレビューし、Next.js規約遵守、レスポンシブ調整、チームスタイルへの適合を行う。インタラクションは別途実装する。

これらを意識することで、デザイナーと開発者の連携を強化し、開発プロセス全体の効率化が期待できます。
Next.jsプロジェクトでの活用を検討してみてはいかがでしょうか。

---
### 会社紹介

**株式会社 Mosaica**  
最先端テクノロジーで社会課題を解決し、持続可能な未来を創造する IT カンパニー。
AI ソリューション、クラウド統合、DX 推進、経営コンサルティングなど包括的なサービスでビジネス変革を支援しています。  

詳しくは [公式サイト](https://mosaica.co.jp/) までお気軽にご相談ください。
公式サイト： https://mosaica.co.jp/
windows11で、sketchup6 その55

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

# 練習問題
セレクトしたオブジェクトをコンポーネント化せよ。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/3b71843c-89d1-49b8-aea9-0f039261c59a.png)
 
# サンプルコード

```
def o2c
	model = Sketchup.active_model
	entities = model.active_entities
	obj = model.definitions.add("MyCompo")
	ss = Sketchup.active_model.selection
	ss.each { |e|
		if e.is_a?(Sketchup::Face)
			face = obj.entities.add_face(e.vertices)
			#face.reverse! if face.normal.z < 0
		end
		if e.is_a?(Sketchup::Edge)
			#obj.entities.add_edges(e.vertices)
		end
	}
	#entities.erase_entities(ss)
	trans = Geom::Transformation.new([15, 15, 5])
	entities.add_instance(obj, trans)
end
```

以上。
AccessToSQLite

# AccessDBからSQLiteへテーブルを移行する方法
AccessDBのテーブル定義をCREATE文にして出力します。
```Accessマクロ
Sub ExportTableDefinitionsWithComments()
    Dim db As DAO.Database
    Dim tdf As DAO.TableDef
    Dim fld As DAO.Field
    Dim sql As String
    Dim output As String
    Dim firstField As Boolean
    Dim comment As String

    Set db = CurrentDb

    For Each tdf In db.TableDefs
        If Left(tdf.Name, 4) <> "MSys" And Left(tdf.Name, 1) <> "~" Then
            sql = "CREATE TABLE " & tdf.Name & " (" & vbCrLf
            firstField = True

            For Each fld In tdf.Fields
                If Not firstField Then sql = sql & "," & vbCrLf
                comment = GetFieldDescription(fld)
                sql = sql & "  " & fld.Name & " " & AccessTypeToSQL(fld.Type, fld.Size)
                If comment <> "" Then
                    sql = sql & " -- " & comment
                End If
                firstField = False
            Next fld

            sql = sql & vbCrLf & ");" & vbCrLf & vbCrLf
            output = output & sql
        End If
    Next tdf

    ' 出力をファイル or イミディエイトウィンドウ
    Debug.Print output
End Sub

Function AccessTypeToSQL(accessType As Integer, size As Integer) As String
    Select Case accessType
        Case dbBoolean: AccessTypeToSQL = "BOOLEAN"
        Case dbByte: AccessTypeToSQL = "TINYINT"
        Case dbInteger: AccessTypeToSQL = "SMALLINT"
        Case dbLong: AccessTypeToSQL = "INTEGER"
        Case dbSingle: AccessTypeToSQL = "REAL"
        Case dbDouble: AccessTypeToSQL = "DOUBLE"
        Case dbCurrency: AccessTypeToSQL = "NUMERIC(19,4)"
        Case dbDate: AccessTypeToSQL = "DATETIME"
        Case dbText: AccessTypeToSQL = "TEXT(" & size & ")"
        Case dbMemo: AccessTypeToSQL = "TEXT"
        Case dbGUID: AccessTypeToSQL = "GUID"
        Case Else: AccessTypeToSQL = "TEXT"
    End Select
End Function

Function GetFieldDescription(fld As DAO.Field) As String
    On Error GoTo NoDescription
    GetFieldDescription = fld.Properties("Description")
    Exit Function
NoDescription:
    GetFieldDescription = ""
End Function

```
### 手順
1. Accessを開く
2. Alt + F11 でVBAエディタを開く
3. 上記コードを挿入
4. ExportTableDefinitionsAsSQL を実行
5. イミディエイトウィンドウにCREATE TABLE文が出力される（コピペ可能）
2025/4/8主にITとかセキュリティの記事

ディープシークのＡＩ、火炎瓶の作り方やウイルス設計図も回答…安全対策ないがしろか(4/6)
https://www.yomiuri.co.jp/national/20250405-OYT1T50147/

クレカ不正使用対策セミナー開催　「クレジットカード・セキュリティガイドライン［6.0 版］」に基づき解説(4/6)
https://wellness-news.co.jp/posts/250406-2/

WinRARに新たな脆弱性　MotW警告を回避しコード実行の恐れ(4/6)
https://reinforz.co.jp/bizmedia/78273/

「二要素認証」強制 顧客離れ懸念も(4/6)
https://www.nikkei.com/article/DGKKZO87850920V00C25A4EA5000/

証券口座の乗っ取り被害、各社で…楽天証券は中国株式５８２銘柄の買い注文を一時停止(4/5)
https://topics.smt.docomo.ne.jp/article/yomiuri/nation/20250405-567-OYT1T50132

口座乗っ取り、国内株売買　楽天や野村証券など5社被害
犯罪集団「フィッシング」急増　複数銘柄で相場操縦疑い(4/6)
https://www.nikkei.com/nkd/company/article/?DisplayType=1&ba=1&ng=DGKKZO87850880V00C25A4EA5000&scode=4704
https://www.nikkei.com/article/DGKKZO87850880V00C25A4EA5000/

2025年3月6日～26日に報告されたWordPress関連の脆弱性情報(4/6)
https://news.mynavi.jp/techplus/article/wordpressvulnerability-1/

iPhoneが「ハッキングされていないか」を判断する6つのサイン(4/6)
https://forbesjapan.com/articles/detail/78166

PyPI上の悪意あるPythonパッケージが3.9万回ダウンロード – WooCommerceを標的とするカーディング攻撃ツールを発見(4/6)
https://innovatopia.jp/cyber-security/cyber-security-news/50717/

マカフィーから「Microsoft Defender」への移行は今からでも遅くない？(4/6)
https://news.yahoo.co.jp/articles/a76cbb103b50ae00f13716ef8f46d11d56c3535a

Ryzen 9800X3Dに致命的欠陥　ASRock製マザーボードとの組み合わせで故障多数報告(4/6)
https://reinforz.co.jp/bizmedia/78280/

Azure DNSでDNSSECがGAしたので試してみた(4/5)
https://zenn.dev/mrt/articles/93912bc913ff97

上場企業が注視している国内で優先的に対処すべきリスク、3位異常気象、自然災害、2位サイバー攻撃、1位は？(4/6)
https://dime.jp/genre/1950879/

Meta、「Llama 4」シリーズを発表 – 1000万トークンの超長文理解と革新的MoEアーキテクチャを実現(4/6)
https://innovatopia.jp/ai/ai-news/50725/

フィッシング詐欺等による不正取引(4/6)
https://www.kenbiya.com/blog/c1=1/jakusho-honobono/244176/

AWS CDKでSecurity Hubつくってみた(4/5)
https://dev.classmethod.jp/articles/aws-cdk-security-hub/

日本が「米ＩＴ企業攻撃」
スマホアプリ規制法に懸念(4/6)
https://www.hokkoku.co.jp/articles/-/1708144
https://www.hokkoku.co.jp/articles/tym/1708144
https://www.the-miyanichi.co.jp/news/World/2025040601000345.php

元米大統領補佐官「米IT企業への攻撃」　公取委のアプリ規制に(4/6)
https://mainichi.jp/articles/20250406/k00/00m/030/101000c

英国 議会 政府におけるAIの活用 (2025.03.26)(4/6)
http://maruyama-mitsuhiko.cocolog-nifty.com/security/2025/04/post-8ae6f2.html

Bluetoothとは？ 仕組みと歴史、最新の「Auracast」まで(4/6)
https://wired.jp/article/what-is-bluetooth/

「中国が米国にとって最大の脅威」と米情報機関、中国側は「誇張」と反論―海外メディア(4/6)
https://news.livedoor.com/article/detail/28498942/

「命がけで秘密を教えてくれる人が殺される」リストラされたCIA職員をロシアがリクルート？【報道1930】(4/6)
https://nordot.app/1281556599040802870

サイバー法案を修正可決＝国会監視強化、今国会成立見通し―衆院委(4/4)
https://www.risktaisaku.com/articles/-/101407

“14秒に1回”サイバー攻撃　国会で「新たな切り札」審議(4/6)
https://topics.smt.docomo.ne.jp/article/ntv_news24/politics/ntv_news24-2025040601213745?fm=topics&fm_topics_id=4fc22bdae307b3c13026dd0289e3af69

香川 高校などのタブレット端末 不正操作でアカウント削除か(4/5)
https://www3.nhk.or.jp/matsuyama-news/20250405/8000021025.html

ビジネス戦略にメンタルヘルスが欠かせない理由(4/5)
https://www.shopify.com/jp/blog/entrepreneurship-and-mental-health

「あなたの個人情報が流出」　携帯に不審電話　佐賀県小城市の女性に着信(4/5)
https://news.livedoor.com/article/detail/28498095/

睡眠不足、運動不足、不規則な食生活…うつ病を発症する人の共通点(4/4)
https://news.livedoor.com/article/detail/28489501/

技能五輪国際大会に向けて選手の支援を強化へ 厚労省(4/6)
https://www3.nhk.or.jp/news/html/20250406/k10014771821000.html
【Rails初心者】ルーティングって何？実際のコードで学んだこと

# 【Rails初心者】ルーティングって何？実際のコードで学んだことまとめておく

こんにちは。
Rails初学者の私が、ルーティングを学びながらつまずいた事をまとめてみました。


## ルーティングって何？

Railsのルーティングは、**URLとコントローラーのアクションを結びつける役割**を担う。 
例えば `/articles` にアクセスしたときに、どのコントローラー・アクションを呼び出すのか？というのを決めている。

## 基本の形

```ruby
Rails.application.routes.draw do
  resources :articles
end
```
上記のように書くと、articles_controller に対して以下のようなルートが自動で作成される。
| HTTPメソッド | パス                | アクション |
|--------------|---------------------|------------|
| GET          | /articles           | index      |
| GET          | /articles/:id       | show       |
| POST         | /articles           | create     |
| PATCH        | /articles/:id       | update     |
| DELETE       | /articles/:id       | destroy    |
| GET          | /articles/new       | new        |
| GET          | /articles/:id/edit  | edit       |

## ネストしたルーティング

親リソースの中にネストすることで、例えば「あるアカウントのフォロー・アンフォロー機能」を実装できる。

```ruby
resources :accounts, only: [:show] do
  resources :follows, only: [:create]
  resources :unfollows, only: [:create]
end
```
こんなURLになる
`/accounts/:account_id/follows`
`/accounts/:account_id/unfollows`

## scope module で名前空間を分ける

```ruby
scope module: :apps do
  resources :favorites, only: [:index]
  resource :profile, only: [:show, :edit, :update]
  resource :timeline, only: [:show]
end
```
URLはそのまま`/favorites`などになるが、呼び出されるのは`Apps::FavoritesController`のように`Apps`名前空間配下のコントローラーとなるらしい。
※名前空間という意味もあまりわかっていないですが

## 実際のコントローラー例
```ruby
class Apps::FavoritesController < Apps::ApplicationController
  def index
    @articles = current_user.favorite_articles
  end
end
```
共通の認証処理も`Apps::ApplicationController`にまとめて書くことが可能
```ruby
class Apps::ApplicationController < ApplicationController
  before_action :authenticate_user!
end
```

## APIのルーティング
`/api/articles/1/comments`にアクセスしたとき、JSON形式でコメント一覧を返したり、新しいコメントを作成したりできる。
```ruby
namespace :api, defaults: {format: :json} do
  scope '/articles/:article_id' do
    resources :comments, only: [:index, :create]
    resource :like, only: [:show, :create, :destroy]
  end
end
```
## JavaScriptと連携する
APIを使った処理を`JavaScript`から呼び出す例
```JavaScript
axios.get(`/api/articles/${articleId}/comments`)
  .then((response) => {
    const comments = response.data
    comments.forEach((comment) => {
        appendNewComment(comment)
    })
  })
```
Railsのルーティングと連携して、非同期通信（Ajax）でコメントを取得・表示している

----

Railsのルーティングは奥が深く、まだまだ理解しきれていない部分もありますが、少しずつ学んでいます。
間違いがありましたら、申し訳ございません。

---

## 参考リンク

- [Railsガイド（ルーティング）](https://guides.rubyonrails.org/routing.html)