OmniAICreator/Qiita-1.07M huggingface dataset:
Datadogのコストを削減！ログフォワーディングのアーカイブ機能を使いこなす

## はじめに

こんにちは、23卒でバックエンドエンジニアをしている高橋です。
業務ではAWSなどのクラウドやDevOpsの促進などを行っております。

私がチームに配属された時、Datadogは既に導入済みでした。そのため、実際に設定を変更する機会に恵まれることはほとんどありませんでした。
そのため、実際に設定を変更する機会はほとんどありませんでした。
今回、この記事を通じてDatadogについて学ぶ良いきっかけを得たと感じています。


## Datadogの概要

Datagdogは**クラウドスケールのモニタリングサービス**です。

リアルタイムのデータ分析と可視化を重点を置いておりインフラストラクチャ、アプリケーションパフォーマンス、ログ管理など幅広い機能を提供しているサービスです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2033092/ea67df0b-4c7e-73fb-9012-685faae1bfc5.png)



## ログ管理

その中でも主要機能の一つである**ログ管理**はDatadogを活用しているチームであれば、必ずといっても良いほど使われていると思われます。

ログはシステムの**健全性、セキュリティ、パフォーマンス**を理解するために不可欠です。

詳細については以下を参照してください↓
https://docs.datadoghq.com/ja/logs/


## 問題点

ログはセキュリティ分析、原因調査などの重要な資産になります。
そのため「永久に保存しよう」としたいところですが、長期間の保存は特にコストが高くなる可能性があります。

そこで、、
**Datadogのアーカイブ機能は、このコストを最適化するのに役立ちます！**


## ログアーカイブとは

https://docs.datadoghq.com/ja/logs/log_configuration/archives/

アーカイブ機能は、Datadogで収集されたログデータを長期保存するための効率的な方法であり、必要なデータを安全に保管しながら、ストレージコストを大幅に削減することができます。

重要なログのみを選択してアーカイブし、不要なデータは破棄することで、ストレージを最適化することができ、必要に応じてアーカイブからデータを簡単に取り出し、分析やレポート作成に活用することもできます


## Datadogでのアーカイブ設定手順

**1. Log Forwarding ページを開く**
![スクリーンショット 2023-12-21 午後7.33.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2033092/40dcf13c-c2e3-cced-f3bb-00b69154c4a5.png)

**2. New Archiveで新規作成**
![スクリーンショット 2023-12-21 午後7.35.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2033092/7cf1588c-4843-4416-7b77-1771ce7d224e.png)

**3. アーカイブ先を指定します**
保存先としてS3バケットやAzure Blob Storageなどを選択することができます
※保存期間なども適宜指定してください

**4. フィルタリングルールを設定**
フィルタリングルールを設定する際に使用できるクエリは、ログの特定の属性やパターンに基づいています。

以下にいくつかのフィルタリングクエリの例を記述します
- **ログレベル**： `status:error` - エラー状態のログのみアーカイブ。
- **サービス指定**： `service:service-name`
- **期間指定**： `@timestamp:[2023-01-01 TO 2023-01-31]`
- **キーワード検索**： `message:"Out of Memory"`
- **複合クエリ**： `status:error AND service:database`

## アーカイブからのリハイドレート

アーカイブされたログデータを再度Datadogで分析や検索を行いたいケースもあると思います。その際には**Rehydrate**という機能を使うことでDatadogのログエクスプローラに戻して利用することができます。

**1. Rehydrate From Archives ページを開く**

**2. New　Historical View**

![スクリーンショット 2023-12-22 午前7.46.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2033092/af00fc87-5ac1-c26f-8527-ec1f24e8df6c.png)

**3. 期間選択**
リハイドレートするログイベントの期間を選択

**4. クエリ入力**
ログエクスプローラー検索と同じ構文のクエリを指定

**5. ログの最大数を定義**

**6. 保有期間の定義**

https://docs.datadoghq.com/ja/logs/log_configuration/rehydrating/?tab=amazons3


## まとめ

Datadogに触れる機会がなかったのですが、この記事を通じて少しでも第一歩を踏み出す助けになればと思います。
今回はログのアーカイブとリハイドレート機能に焦点を当てましたが、今後はDatadogの他の機能にも触れていきたいと思います。
【MSX0】WIFILVL.PAS【Turbo Pascal】

# はじめに
『MSX0 Stack』付属の IoT BASIC サンプルを『Turbo Pascal』へ移植してみます。

 - [【MSX0】IoT BASIC サンプルの移植【Turbo Pascal】(Qiita)](https://qiita.com/ht_deko/items/2362488c5c99aec4afbf)

# WIFILVL.BAS
◆WiFi値取得

| 項目 | 説明 |
|:---|:---|
| 概要 | 接続中の Wi-Fi AP の RSSI (受信信号強度) 値を表示します。 |
| ファイル名 | WIFILVL.BAS |
| 対応デバイス |  |
| コメント | M5Stack の内部パラメータを取得するプログラムの一例になります。 |

**See also:**

 - [『MSX0 Stack』の操作方法 - ハードウェア (Qiita)](https://qiita.com/ht_deko/items/cdb1594e9879a5e9e660)

## MSX0 Stack での挙動

`WIFILVL.BAS` をロードして、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/6ae1f591-d2eb-450f-91aa-3f3512afaa6e.png)

実行してみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/b99edb92-b31a-b9c0-42cd-1debce316d73.png)

RSSI 値が表示されます。

:::note info
プログラムは〔Ctrl〕+〔Stop〕(リモートコントロールパネルからは〔Ctrl〕+〔F12〕) で中断できます。
:::

## Turbo Pascal へ移植

別途、`SYSUTILS.LIB`、`IOT.LIB` が必要です。

 - [【MSX0】IOT.LIB (Qiita)](https://qiita.com/ht_deko/items/a5c0bf6e7969093beb3c)

```pascal:WIFILVL.PAS
program WIFILVL;
type
  LibStr = string[80];
{$I SYSUTILS.LIB}
{$I IOT.LIB}
begin
  ClrScr;
  while not KeyPressed do
  begin
    GotoXY(4, 4);
    Writeln(IoTGetInt('host/wifi/level'));
    Delay(100);
  end;
end.
```

実行してみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/dc4b3784-5bc2-4916-60bb-c440143dcc4a.png)

RSSI 値が表示されます。

:::note info
任意のキーで中断できます。
:::

### 解説

#### Delay()
全力でブン回すようなものでもないと思ったので、Delay() を入れてみました。


# おわりに
今回の移植に関して難しい所は特にありませんでした。
カラペース、スキーマ管理を強化

<font color="Grey">*[Karapace strengthens schema management](https://aiven.io/blog/karapace-strengthens-schema-management)の翻訳です。*</font>

2022年3月21日

# カラペースがスキーマ管理を強化

Confluent Schema RegistryとApache Kafka®用REST APIに代わるオープンソースとして、Aivenが立ち上げたKarapaceに注目する企業が増えている。

Apache Kafka®は、今日のデジタルサービス構築において不可欠な技術です。企業は幅広いデータストリームにアクセスする必要があります。さらに、予測分析、パーソナライズされたウェブ体験、IoTセンサーの取り込み、顧客行動分析、オンライン詐欺の検出など、リアルタイムのビジネスユースケースを可能にするためには、それらのデータをうまく統合する必要があります。


## なぜスキーマが重要なのか


Apache Kafkaのコアは、単にデータをバイト形式で転送するだけであり、送受信されるデータの種類は気にしない。Kafkaは流れるデータを "理解 "しないが、プロデューサーとコンシューマーは "理解 "する必要があるので、プロデューサーとコンシューマーがお互いを理解するためには、共通のデータ型を定義する必要がある。そこでKarapaceの出番となる。


[Karapace](https://karapace.io/)は、Kafkaクラスタの外部に存在し、スキーマの配布と進化を処理するソフトウェアだ。Karapaceは、Confluent Schema RegistryとApache Kafka RESTプロキシに代わるオープンソースです。このプロジェクトにより、Aivenは企業がオープンソースの世界でApache Kafkaを使用したアプリケーションやサービスを構築することを可能にする。


## AivenとKarapace


Aivenは、2018年にConfluent Schema Registryのライセンスが変更されたことを受け、[2020年7月にKarapace](https://aiven.io/blog/aiven-launches-karapace-for-kafka-schema-and-cluster-management)を発表しました。私たちは、Kafka RESTプロキシとSchema Registryを扱うために、私たちの顧客であるかどうかにかかわらず、すべてのApache Kafkaユーザーに対して、十分にメンテナンスされ、サポートされたオープンソースの代替手段を提供し続けられるようにしたかったのです。


(そして、Apache Kafkaのユーザーである私たち自身も、当然その機能を望んでいました）。


Aivenのオープンソースの使命は、企業がベンダーロックインを回避できるよう、ツールや環境の進化を支援することであり、これはその道における重要な一歩となった。


## カラピースの未来


AivenはKarapaceの開発をオープンで継続し、Confluent Schema RegistryとKarapaceの1:1の互換性を可能な限り確保することを約束します。


Instaclustrがプロジェクトに参加することで、Karapaceの未来はさらに強固なものになります。彼らの最近の貢献により、Karapaceスキーマレジストリの[Google Protocol Buffer (Protobuf)[](https://en.wikipedia.org/wiki/Protocol_Buffers) フォーマットのサポートが追加されました。Protobufは、コード生成のための言語間サポートを可能にし、これは複数のプログラミング言語を使用する組織にとって価値がある。このような組織では、データ品質が強力に保証されたイベントストリーミングプラットフォームを構築することは、選択されたエンコーディングフォーマットがこれらの言語間で相互運用可能でなければならないことを意味する。


AivenがKarapaceをオープンソースプロジェクトとして開始したことは、他の企業や個人が新機能を提供し、Karapaceをより堅牢で柔軟かつ多用途なものにするための招待状です。オープンソースのツールが改善されれば、誰が改善しているかに関わらず、誰もが利益を得ることができます。オープンソースは、[coopetition](https://en.wikipedia.org/wiki/Coopetition)の典型的な例である。そこでは、企業が製品の市場シェアを巡って競争し続けながらも、知識やリソースを共有するために協力し合う。この2つの相互作用は、バリューチェーンの異なる段階で行われる。企業は、（現在共有されている）基盤の上に構築された自社の製品やサービスを維持しながら、例えば、より低レベルの研究洞察やコンポーネントを共有する。


このような理由から、私たちAivenは、オープンソースへの共同コミットメントの精神に基づき、Instaclustr社とのコラボレーションを実現できたことを嬉しく思っています。これは、AivenとInstaclustrの顧客、そしてApache Kafkaの他のすべてのユーザーに等しく利益をもたらすでしょう。結局のところ、我々は顧客に最高のオープンソース技術を提供するビジネスをしているのです。
Amazon Detectiveを使って本気でAWSアカウントを守る

# はじめに
この記事はDevOps on AWS大全の一部です。
DevOps on AWS大全の一覧は[こちら](https://qiita.com/tech4anyone/items/b06f88035d27c6ef13b2)。

この記事ではAmazon Detectiveに関連する内容を超詳細にまとめています。

具体的には以下流れで説明します。

- Amazon Detectiveとは
- Amazon Detectiveの仕組み
- Amazon Detectiveの活用
- Amazon Detectiveのベストプラクティス

AWSの区分でいう「Level 200：トピックの入門知識を持っていることを前提に、ベストプラクティス、サービス機能を解説するレベル」の内容です。

# この記事を読んでほしい人
- Amazon Detectiveがどういうサービスか説明できるようになりたい人
- Amazon Detectiveを採用するときのベストプラクティスを説明できるようになりたい人
- AWS Certified DevOps Engineer Professionalを目指している人


# Amazon Detectiveとは
Amazon Detectiveは、AWSのセキュリティサービスの一つで、セキュリティインシデントの分析と調査を支援するサービスです。
Amazon Detectiveは、AWSのログデータを収集し、機械学習や統計分析を用いて、異常なアクティビティやパターンを検出し、可視化できるので、セキュリティインシデントの原因や影響範囲を迅速に特定し、対策や予防策を立てるのに役立ちます。

# Amazon Detectiveの仕組み
Amazon Detectiveは、VPCフローログ、AWS CloudTrail、Amazon GuardDutyのデータを自動的に収集します。
これらのデータは、ネットワークトラフィックやAPIコール、セキュリティアラートなどの情報を含みます。

そして、収集したデータを加工し、グラフモデルと呼ばれる関連性の高いデータセットに変換します。
グラフモデルは、リソースやエンティティ（例えばIPアドレスやユーザー）、アクションやイベント（例えばログインやアクセス）などの要素と、それらの間の関係性を表します。

その後、グラフモデルに対して機械学習や統計分析を適用し、異常なアクティビティやパターンを検出します。
例えば、通常と比べて異常に高いネットワークトラフィックやAPIコールの回数、不審なIPアドレスやユーザーからのアクセスなどです。

最終的にAmazon Detectiveは、検出した異常なアクティビティやパターンをダッシュボードやインタラクティブなグラフで可視化します。
これにより、セキュリティ担当者は、セキュリティインシデントの原因や影響範囲を迅速に特定し、詳細な分析や調査を行うことができます。

# Amazon Detectiveの活用
Amazon Detectiveは、以下のような場合に活用できます。

## セキュリティインシデントが発生した場合
Amazon Detectiveは、セキュリティインシデントが発生した時点から遡って90日間分のログデータを保持しています。

これにより、セキュリティインシデントがいつから発生していたか、どのようなアクティビティが行われていたか、どのリソースやエンティティが関係していたかなどを確認できます。

また、Amazon Detectiveではセキュリティインシデントに関連する異常なアクティビティやパターンをハイライトして表示できます。
これにより、セキュリティインシデントの原因や影響範囲を迅速に特定できます。
加えて、セキュリティインシデントに関連する要素や関係性をインタラクティブなグラフで可視化できるためセキュリティインシデントの詳細な分析や調査を行うことができます。

## セキュリティポスチャーの改善や最適化の場合
Amazon Detectiveは、AWSのログデータを継続的に収集し、分析し、可視化します。

これにより、セキュリティ担当者は、AWS環境のセキュリティポスチャーを常に把握できます。

また、Amazon Detectiveはセキュリティポスチャーに影響を与える可能性のある異常なアクティビティやパターンを検出し、通知できるため、セキュリティ担当者は、セキュリティポスチャーの改善や最適化に必要な対策や予防策を立てることができます。

# Amazon Detectiveのベストプラクティス

Amazon Detectiveを効果的に利用するためには、以下のベストプラクティスに従うことが推奨されます。

| ベストプラクティス | 説明 |
| --- | --- |
| Amazon Detectiveを有効化する | Amazon Detectiveは、AWSアカウントごとに有効化する必要があります。有効化すると、Amazon Detectiveは自動的にVPCフローログ、AWS CloudTrail、Amazon GuardDutyのデータを収集し始めます。 |
| Amazon DetectiveとAmazon GuardDutyを連携する | Amazon DetectiveとAmazon GuardDutyを連携すると、Amazon GuardDutyで検出されたセキュリティアラートに対して、Amazon Detectiveで詳細な分析や調査を行うことができます。Amazon GuardDutyのコンソールから、セキュリティアラートの詳細ページにある「Amazon Detectiveで分析」ボタンをクリックすると、Amazon Detectiveのダッシュボードやグラフが表示されます。 |
| Amazon DetectiveとAWS Security Hubを連携する | Amazon DetectiveとAWS Security Hubを連携すると、AWS Security Hubで集約されたセキュリティ情報に対して、Amazon Detectiveで詳細な分析や調査を行うことができます。AWS Security Hubのコンソールから、セキュリティ情報の詳細ページにある「Amazon Detectiveで分析」ボタンをクリックすると、Amazon Detectiveのダッシュボードやグラフが表示されます。 |
| Amazon DetectiveとIAMロールを連携する | Amazon Detectiveは、ログデータを収集するためにIAMロールを使用します。このIAMロールは、Amazon Detectiveが自動的に作成し、管理します。このIAMロールには、必要最小限の権限が付与されています。このIAMロールを変更したり削除したりしないように注意してください。 |

# まとめ
この記事ではAmazon Detectiveに関連する内容を超詳細にまとめました。

- Amazon Detectiveとは
- Amazon Detectiveの仕組み
- Amazon Detectiveの活用
- Amazon Detectiveのベストプラクティス

次回はAmazon Inspectorを超詳細解説します。
PyScriptで超簡単なWebサービスを作ってみる

## PyScriptとは
HTMLの中でPythonを動かせる魔法みたいな技術です．
2022年の4月に出たそうで，かなり新しく日本語記事もまだ少ないです．

Python環境が無くとも，ブラウザ上でPythonコードを実行できるのは魅力的です．

詳細：[WebブラウザでPythonが動作する！PyScriptの詳解](https://gihyo.jp/article/2023/04/monthly-python-2304)

Examples：[PyScript@examples](https://pyscript.com/@examples)...様々なデモがあり，とても面白いです．ソースコードも付いていて，実際にPythonが動いているのがわかります．

特に面白いデモが[Bokeh](https://examples.pyscriptapps.com/bokeh/latest/)です．可視化のライブラリであるBokehが使用されています．ブラウザ上でインタラクティブな操作ができることに驚きました，

## PyScriptを使ってみる
Web技術に関する知識は全然ありませんが，PyScriptを使用してみたく簡単なサイトを作成してみました．

作成したサイトは[こちら](https://zingy-beijinho-c881b3.netlify.app/)です．
netlifyを使用しています．index.html（を入れたフォルダ）をドロップするだけで作れました．なんて便利なんだ．

<img width="400" alt="image" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3583007/c528b355-e83b-c0af-7580-ac6b6ffe7dce.png">

文章を打ち込むと，自動で文字数をカウントしてくれます．

同様のサービスはありますが，カウントするためにボタンを押す必要があったり，自動でカウントはしてくれるが広告でいっぱいだったりと，欲しいサイトが無かったので作成しました．

## ソースコード
以下にソースコードを示します．むちゃくちゃ簡単です．

不気味な空白は，表示される数字の場所を調整するためなので無視してください．

index.html
```html
<head>
    <title>オート文字列カウンター</title>
    <link rel="stylesheet" href="https://pyscript.net/latest/pyscript.css" />
    <script defer src="https://pyscript.net/latest/pyscript.js"></script>
    <style>
        body {
            text-align: center; /* テキストを中央揃えにする */
        }
        #text_area {
            font-size: 20px;
            width: 600px;
            height: 400px;
            padding: 10px;
            margin: 0 auto; /* 中央に配置する */
        }
        #line_count_display, #length_display, #length_display_no_spaces {
            font-size: 24px;
            margin: 10px 0;
        }
    </style>
</head>

<body>
    <!-- ここからPyScript -->
    <py-script>
        from js import document

        # 入力の度に呼び出す関数
        def update_counts():
            text_input = document.getElementById('text_area').value

            # 空白ありの文字数を取得
            length_with_spaces = len(text_input.replace("\n", ""))

            # 空白なしの文字数を取得
            length_without_spaces = len(text_input.replace(" ", "").replace("\n", ""))
            
            # 行数の取得
            lines = text_input.split("\n")
            line_count = len(lines)
            
            # 要素を取得して，内容を更新
            document.getElementById('length_display').innerText =           f"文字数（空白含む）　　： {length_with_spaces}"
            document.getElementById('length_display_no_spaces').innerText = f"文字数（空白含まない）： {length_without_spaces}"
            document.getElementById('line_count_display').innerText =       f"行数　　　　　　　　　： {line_count}"
    </py-script>

    <!-- py-inputで，入力の度に呼び出す関数を指定する． --> 
    <textarea id="text_area" py-input="update_counts()"></textarea>

    <!-- 初期値はすべて0 --> 
    <p id="length_display">文字数（空白含む）　　： 0</p>
    <p id="length_display_no_spaces">文字数（空白含まない）： 0</p>
    <p id="line_count_display">行数　　　　　　　　　：  0</p>

</body>

```


PyScirptを使うと，
```html
<py-script> ここにpythonコードを書くだけで動かせる <py-script>
```
んです．


PyScriptを使うと，簡単に面白いサービスが作れそうですね．少しずつ勉強していきたいところです．


この記事は以上です．ご覧いただきありがとうございました．
Japanese Tar Heel, Inc.

こんにちは，千代 浩之（ちしろ ひろゆき）です．

私のアメリカの会社[「Japanese Tar Heel, Inc.」](https://japanesetarheel.com/)では，[英語ブログ](https://japanesetarheel.com/blog/category/blog/)を運営しています．

英語ブログには，以下の6つのカテゴリーがあります．

    ・AI
    ・CRYPTO
    ・NORTH CAROLINA
    ・BASKETBALL
    ・TOKYO SIGHTSEEING
    ・MIND

本記事では，主に技術に関連する[AIカテゴリー](https://japanesetarheel.com/blog/ai/)と[CRYPTOカテゴリー](https://japanesetarheel.com/blog/crypto/)を深く解説します．

# AIカテゴリー

[AIカテゴリー](https://japanesetarheel.com/blog/ai/)では，以下のような最先端のAI技術を解説します．
* ChatGPT/Gemini（旧Bard）等の生成AI
* プロンプトエンジニアリング
* AIの専門用語

英語でAIを学びたいあなたにおすすめです！

# CRYPTOカテゴリー

[CRYPTOカテゴリー](https://japanesetarheel.com/blog/crypto/)では，以下のような最先端の仮想通貨技術を解説します．
* 日本や日本人に関連する仮想通貨
* スマートコントラクトのプログラミング
* 仮想通貨の専門用語

英語で仮想通貨を学びたいあなたにおすすめです！

# まとめ

私の会社のブログのAIカテゴリーとCRYPTOカテゴリーを紹介しました．
是非，私の会社のブログで学びましょう！

[Japanese Tar Heel, Inc.](https://japanesetarheel.com/)
カレントディレクトリでファイルを検索して、そのファイル名とともに出力する

# あいさつ
こんにちは。今年はAIの発展が著しい年でしたね。
中でも、ChatGPTとCursorにはお世話になっています。
今回は私がCursorの「with codebase」でファイルを探すのを、
シェル（bash）のコマンドで実現できないかを考えたものになります。

よろしくお願いします。

# 結論
せっかちな方のために、結論を先に記述します。
```
$ find . -type f -name "*" -exec grep -rn "hoge" {} \;
```

# 解説
まず、カレントディレクトリ（現在のディレクトリ）のファイル形式のものすべてを探しています。
findコマンドは、検索のコマンドです。カレントディレクトリのファイルを出力する準備をするのに使っています。
「-type -f」でファイル形式のもの、「-name "\*"」ですべての名前のファイルをという意味にになります。
「*」はワイルドカードと呼ばれます。
「-exec command」もfindコマンドのオプションで、見つけたファイルやディレクトリに対して指定されたコマンドを実行します。

「grep -rn "hoge"」は、MacOSのマニュアルでは、

> Recursively search subdirectories listed.

となっており、日本語で「リスト化されたサブディレクトリを再起的に検索します」という意味ですが、
ここではカレントディレクトリからのパスを表示するのに使っています。
"hoge"という文字列を抽出して出力するようになっていますので、用途に合わせてご変更ください。

「{}」はプレースホルダーです。findで見つけたファイルやディレクトリのパスを置き換えます。
ここでは、findで「-f」としているので、ファイルのみですね。
「\\;」は、findの「-exec」オプションにおいて、コマンドの終了を示すセミコロンです。
「{}」と「\;」はしばしば、同時に使われることが多いです（個人的な意見です）。

# 終わりに
Cursorの「with codebase」は、大変便利な機能ですが、無料版だとトークンに制限があることがネックになっています。
このコマンドはファイルを探して文字列を抽出するだけですが、それでも私は無料で使える割に十分な機能があると思います。

以上です。お疲れ様でした。

# 追記
行数を表示するために、grepの「-n」オプションを追加しました。
FetchでPostするときの、headers部分を共用化する方法

指定を繰り返すことなく、共通のオプションを利用する方法として、カスタムのHTTPクライアントやユーティリティ関数を作成して再利用することができます。以下にその一例を示します。

```typescript
// utils/httpClient.ts

const BASE_URL = 'https://api.example.com';

export const postRequest = async (endpoint: string, data: any) => {
  const url = `${BASE_URL}/${endpoint}`;

  try {
    const response = await fetch(url, {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
        // 他に必要なヘッダーがあればここで指定
      },
      body: JSON.stringify(data),
    });

    if (!response.ok) {
      throw new Error(`HTTP error! Status: ${response.status}`);
    }

    return await response.json();
  } catch (error) {
    throw new Error(`Error in postRequest: ${error}`);
  }
};
```

上記の例では、postRequestという共通の関数を作成し、それを他のファイルで利用できるようにしています。この関数にはエンドポイントとデータを渡すことで、POSTリクエストを行えます。

使用する側では、この関数をインポートして使います。

```typescript
// 他のファイルでの利用例

import { postRequest } from 'utils/httpClient';

async function postData() {
  const endpoint = 'post';
  const dataToSend = {
    key: 'value',
  };

  try {
    const data = await postRequest(endpoint, dataToSend);
    console.log('Data:', data);
  } catch (error) {
    console.error('Error posting data:', error);
  }
}

// 関数を呼び出し
postData();
```
このようにすることで、共通のオプションを1か所にまとめて再利用でき、コードを簡潔に保つことができます。
【MSX0】TREE.PAS【Turbo Pascal】

# はじめに
『MSX0 Stack』付属の IoT BASIC サンプルを『Turbo Pascal』へ移植してみます。

 - [【MSX0】IoT BASIC サンプルの移植【Turbo Pascal】(Qiita)](https://qiita.com/ht_deko/items/2362488c5c99aec4afbf)

# TREE.BAS
◆ノードリスト表示

| 項目 | 説明 |
|:---|:---|
| 概要 | ノードを再帰的にスキャンしてリスト表示します。 |
| ファイル名 | TREE.BAS |
| 対応デバイス |  |
| コメント | CALL IOTFIND を利用すると、ノードが持つアイテムの個数や名前のリストを取得できます。<br>リストの内容が動的に変化するものに対してはアイテムの個数を取得したときにリストの更新が行われます。 |

**See also:**

 - [『MSX0 Stack』の操作方法 - ハードウェア (Qiita)](https://qiita.com/ht_deko/items/cdb1594e9879a5e9e660)

## MSX0 Stack での挙動

`TREE.BAS` をロードして、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/dcc0bb0c-0302-a4af-17e1-97f9826d2f5e.png)

実行してみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/cb51f137-2296-e12e-cbf4-e0e7df7b9ace.png)

IoT ノードリストが表示されます。

:::note info
プログラムは〔Ctrl〕+〔Stop〕(リモートコントロールパネルからは〔Ctrl〕+〔F12〕) で中断できます。
:::

## Turbo Pascal へ移植

別途、MDL-LIB と `SYSUTILS.LIB`、`IOT.LIB` が必要です。

 - [MDL-LIB version 2.2 の使い方 (Qiita)](https://qiita.com/ht_deko/items/6f15aee0bd25b550e4df)
 - [【MSX0】IOT.LIB (Qiita)](https://qiita.com/ht_deko/items/a5c0bf6e7969093beb3c)

```pascal:TREE.PAS
program TREE;
{$A-}
type
  LibStr = string[255];
{$I SYSUTILS.LIB}
{$I IOT.LIB}
var
  Flg: Boolean;
  procedure GetNodes(Node: LibStr);
  var
    List, Last, p: PItem;
    CC: Integer;
  begin
    if Flg then
      Exit;
    Writeln(Node);
    List := nil;
    CC := IotFindCount(Node);
    IoTFind(Node, List, Last);
    p := List;
    while (p <> nil) and (not Flg) do
    begin
      GetNodes(Node + '/' + p^.Data);
      p := p^.Next;
      Flg := Flg or KeyPressed;
    end;
    ClearListItem(List);
  end;
begin
  Flg := False;
  GetNodes('host');
  GetNodes('device');
  GetNodes('msx');
  GetNodes('conf');
end.
```

実行してみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/8a51d975-7099-8732-d9b0-348564d1b222.png)

IoT ノードリストが表示されます。

:::note info
任意のキーで中断できます。
:::

### 解説

#### 再帰
こういうのは再帰で書くのが簡単です。CP/M-80 版『Turbo Pascal』で再帰プログラムを書く時には `{$A-}` コンパイル指令を指定します。

**See also:**

 - [コンパイル指令 {$A} (Qiita)](https://qiita.com/ht_deko/items/f9f394dc2342afd2ea7b#-再帰-cpm-80-版のみ)

#### IotFindCount()
最初、BASIC プログラムの 120 行目が何を意味しているか解りませんでした。ノードのアイテム数を変数 CC に入れているのですが、この CC という変数は他で参照されていないからです。

```
120 _IOTFIND(N$,CC)
```

ドキュメントを読んで意味が解りました。

> リストの内容が動的に変化するものに対してはアイテムの個数を取得したときにリストの更新が行われます。

リストが可変のノードに対しては個数を空読みしてリストを更新する必要があるのですね。

# おわりに
今回の移植に関して難しい所は特にありませんでした。

記事に関連しますが、以前 MSX-DOS で Wi-Fi の AP リストを登録するトランジェントコマンド **M0SETAP** を作った事があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/e7b661cf-10f4-0cee-7bee-5e29a7805823.png)

 - [M0SETAP - 【MSX0】IOT.LIB (Qiita)](https://qiita.com/ht_deko/items/a5c0bf6e7969093beb3c#-m0setap)

同様に、I<sup>2</sup>C デバイスを検索するトランジェントコマンド **M0I2CSCN** も作った事があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/8c778b80-0db8-861a-154b-79615696d88d.png)

 - [M0I2CSCN - 【MSX0】IOT.LIB (Qiita)](https://qiita.com/ht_deko/items/a5c0bf6e7969093beb3c#-m0i2cscn)
Azure Logic Apps および Power Automate ワークフロー式関数芸

[式関数のリファレンス ガイド - Azure Logic Apps | Microsoft Learn](https://learn.microsoft.com/ja-jp/azure/logic-apps/workflow-definition-language-functions-reference)

この辺を駆使した色々集です。

https://zenn.dev/e99h2121/articles/logicapps-function



## 固定長 → CSV

```TXT:固定長ファイル
1234567890ｱｲｳｴｵｶｷｸｹｺAAAAAAAAAA
1234567890ｻｼｽｾｿﾀﾁﾂﾃﾄAAAAAAAAAA
1234567890ﾅﾆﾇﾈﾉﾊﾋﾌﾍﾎAAAAAAAAAA
```

### 改行で Array 化
```
@split(replace(replace(outputs('作成'), decodeUriComponent('%0D'), ' '), decodeUriComponent('%0A'), ' '), ' ')
```

### Array を順に固定桁で取得
```
@{substring(item(), 0, 10)},@{substring(item(), 10, 10)},@{substring(item(), 20, 10)}\n
```


## FizzBuzz

```
"For_each_1": {
    "actions": {
        "Append_to_string_variable": {
            "inputs": {
                "name": "Val",
                "value": "@{items('For_each_1')} / @{if(equals(mod(items('For_each_1'), 3), 0), 'Fizz', ' ')}@{if(equals(mod(items('For_each_1'), 5), 0), 'Buzz', ' ')}"
             },
             "runAfter": {
                "Invoke_a_workflow_in_this_workflow_app": [
                    "SUCCEEDED"
                ]
            },
            "type": "AppendToStringVariable"
        }
    },
    "foreach": "@range(1,100)",
    "runAfter": {
        "Initialize_variable": [
            "SUCCEEDED"
        ]
    },
    "runtimeConfiguration": {
         "concurrency": {
                 "repetitions": 1
         }
    },
    "type": "Foreach"
}
```

## csv 2 json / json 2 csv

https://jpazinteg.github.io/blog/LogicApps/FileFormatConversion/#4%EF%BC%8ECSV-%E2%86%92-JSON

https://qiita.com/e99h2121/items/4b523757b1e5a1ac3ba9


## 日付

https://jpazinteg.github.io/blog/LogicApps/LogicApps-Functions/


## 第 n foo 曜日



https://vicugna-pacos.github.io/azure/logic-apps/recurrence-nth-weekday/

https://mizusibuki.com/pa-1-5th-weekday/

https://idea.tostring.jp/?p=7143

https://automate.sct.co.jp/knowledge/11065/
NVIDIAのドライバをUbuntuにインストールするときにハマった話

CUDAのインストール
https://developer.nvidia.com/cuda-downloads?target_os=Linux&target_arch=x86_64&Distribution=Ubuntu&target_version=20.04&target_type=deb_local

UEFI Secure Bootだったので、ドライバインストール時にMOKのパスワード聞かれる。
ドライバインストールして、再起動してみる。
ここで、ミスって"Enroll MOK"ではなく、"Continue boot"で通常ブート
Ubuntu起動するがドライバが動作しないっぽい。
nvidia-smiコマンド動作せず。

ここに、「その場合はドライバアンインストールして、やり直し。」とか書いてあるが、再インストールしたって治らない。
https://qiita.com/junkoda/items/0c58e0c996b56b773d50
ウソつき

何度再起動しても、"Enroll MOK"の画面は表示されず。

正解はこちら
https://nanbu.marune205.net/2021/12/ubuntu-secure-boot.html?m=1

sudo mokutil --import /var/lib/shim-signed/mok/MOK.der
input password: xxx
input password again: xxx

やっと、"Enroll MOK"画面表示に辿り着く...

もう1人の残念さん
https://qiita.com/kiwsdiv/items/3e8dac099cb27c7c4b01
OS再インストールまでしなくてよかったかも？
招待されたAzure ADユーザーのみがアクセスできるようにすーる（Azure Static Web Apps、Vue3）

# はじめに
[がちもとさんアドベントカレンダー](https://qiita.com/advent-calendar/2023/gachimoto3)22日目の記事です。
昨日は[スクショを取得し、S3にアップロード、マークダウン形式のリンクを発行するやつ](https://qiita.com/SatoshiGachiFujimoto/items/fda8e5fcf9f9ef275db2)をVue3で作りました。今日は、招待されたAzure ADユーザーのみがアクセスできるようにしていきます。

# 開発環境
- Windows 11 PC
- Vue3 
- Azure Static Web Apps

# 導入

1．Vue3プロジェクト直下にstaticwebapp.config.jsonを配置してプッシュします。

~~~staticwebapp.config.json
{
  "routes": [
    {
      "route": "/",
      "allowedRoles": ["administrator"]
    }
  ],
  "responseOverrides": {
    "401": {
      "redirect": "/.auth/login/aad",
      "statusCode": 302
    }
  }
}
~~~

2．ロール管理から招待リンクを作成します。
![20231221-175511-97673337.png](https://gachimoto-qiita-storage.s3.amazonaws.com/20231221-175511-97673337.png)

3．招待リンクからサインインするとユーザーロールに登録されます。
![20231221-175618-0b32ff2c.png](https://gachimoto-qiita-storage.s3.amazonaws.com/20231221-175618-0b32ff2c.png)

4．アプリを開いたときにサインインが表示されるようになります。
![20231221-175836-89fd41e3.png](https://gachimoto-qiita-storage.s3.amazonaws.com/20231221-175836-89fd41e3.png)

5．登録されたユーザーロールでサインインすると、表示されます。
![20231221-175955-a9120ad6.png](https://gachimoto-qiita-storage.s3.amazonaws.com/20231221-175955-a9120ad6.png)

6．別のアカウントでサインインすると、きちんとForbiddenされます。
![20231221-175340-2a9847a1.png](https://gachimoto-qiita-storage.s3.amazonaws.com/20231221-175340-2a9847a1.png)

結構簡単ですね。
お疲れさまでした。
【MSX0】TOUCH_G.PAS【Turbo Pascal】

# はじめに
『MSX0 Stack』付属の IoT BASIC サンプルを『Turbo Pascal』へ移植してみます。

 - [【MSX0】IoT BASIC サンプルの移植【Turbo Pascal】(Qiita)](https://qiita.com/ht_deko/items/2362488c5c99aec4afbf)

# TOUCH_G.BAS
◆M5LCD タッチパネル

| 項目 | 説明 |
|:---|:---|
| 概要 | 本体の LCD タッチパネルを使って簡単なお絵描きができます。 |
| ファイル名 | TOUCH_G.BAS |
| 対応デバイス |  |
| コメント | MSX0 の設定で TouchPad が Joy2 になっていない場合は、[Setup Utility](https://qiita.com/ht_deko/items/2ccf08e3014fbe46e913) などで Joy2 に変更してください。<br>MSX の 汎用ポート B に MSX 用のタブレットデバイスが接続された想定で動作します。<br>スワイプで Unit が切り替わらないように、左上のボタンを長押しして[タッチパッド優先モード](https://qiita.com/ht_deko/items/cdb1594e9879a5e9e660#%E3%82%BF%E3%83%83%E3%83%81%E3%83%91%E3%83%8D%E3%83%AB%E3%83%A2%E3%83%BC%E3%83%89)にしてください。 |

:::note info
MSXの 汎用ポート B とは Grove の Port B の事ではなく、ジョイスティックポート #2 の事です。
:::

**See also:**

 - [『MSX0 Stack』の操作方法 - ハードウェア (Qiita)](https://qiita.com/ht_deko/items/cdb1594e9879a5e9e660)

## MSX0 Stack での挙動

`TOUCH_G.BAS` をロードして、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/1df54cff-6aa5-56a7-47af-14a015019bde.png)

実行してみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/f88db0b2-1521-e858-ab4c-7c5785ebe6c5.png)

ドキュメントにあったように、[タッチパッド優先モード](https://qiita.com/ht_deko/items/cdb1594e9879a5e9e660#%E3%82%BF%E3%83%83%E3%83%81%E3%83%91%E3%83%8D%E3%83%AB%E3%83%A2%E3%83%BC%E3%83%89)に変更して画面を触ると...

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/42f32d59-d298-26e6-c7f3-eb5ab8b310c5.png)

お絵描きできます。

:::note info
プログラムは〔Ctrl〕+〔Stop〕(リモートコントロールパネルからは〔Ctrl〕+〔F12〕) で中断できます。
:::

## Turbo Pascal へ移植

別途、MDL-LIB と `SYSUTILS.LIB`、`IOT.LIB` が必要です。

 - [MDL-LIB version 2.2 の使い方 (Qiita)](https://qiita.com/ht_deko/items/6f15aee0bd25b550e4df)
 - [【MSX0】IOT.LIB (Qiita)](https://qiita.com/ht_deko/items/a5c0bf6e7969093beb3c)

```pascal:TOUCH_G.PAS
program TOUCH_G;
{$I MDLLIB.LIB}
{$I VRAM2.LIB}
{$I GRAPMSX2.LIB}
{$I GAMEIO.LIB}
var
  A: Boolean;
  S: Byte;
begin
  S := sys_scrmod;
  ScrMode(5);
  A := True;
  repeat
    while (Pad(4) = 0) and (not KeyPressed) do
      A := True;
    if A then
    begin
      Plot(Pad(5), Pad(6), 15);
      A := False;
    end
    else
      DrawTo(Pad(5), Pad(6), 15);
  until KeyPressed;
  ScrMode(S);
end.
```

実行してみました。今度はリモートコントロールパネルで。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/7e3bf76f-48da-b575-d006-52bd918330b2.png)

:::note info
任意のキーで中断できます。
:::

### 解説

#### タッチパッド
`Pad(4)` は汎用 I/O ポート (ジョイスティックポート) #2 に接続されたタッチパッドの押下を検出しています。`Pad(5)` と `Pad(6)` は押された座標です。汎用 I/O ポート #2 に何を接続するかは [[Setup Utility]](https://qiita.com/ht_deko/items/2ccf08e3014fbe46e913#input) で変更可能なので、タッチパッドを `JOY2` に設定していないと、お絵描きできません。

#### スクリーンモード
起動時のスクリーンモードを終了時に戻しています。

**See also:**

 - [PAD() - MDL-LIB version 2.2 の使い方 (Qiita)](https://qiita.com/ht_deko/items/6f15aee0bd25b550e4df#pad)

# おわりに
今回の移植に関して難しい所は特にありませんでした。

この記事は IoT BASIC サンプルの移植シリーズなのですが、このサンプルって IoT 関連の機能は全く使われていないので、**タッチパッドを持っていれば実機の MSX2 でも動作します**よね？
PowerShellのプロンプトに時計を表示する

# 時計の絵文字について

|コードポイント|絵文字|時|分|
|---|---|---|---|
|128336|🕐|1|0|
|128337|🕑|2|0|
|128338|🕒|3|0|
|128339|🕓|4|0|
|128340|🕔|5|0|
|128341|🕕|6|0|
|128342|🕖|7|0|
|128343|🕗|8|0|
|128344|🕘|9|0|
|128345|🕙|10|0|
|128346|🕚|11|0|
|128347|🕛|12|0|
|128348|🕜|1|30|
|128349|🕝|2|30|
|128350|🕞|3|30|
|128351|🕟|4|30|
|128352|🕠|5|30|
|128353|🕡|6|30|
|128354|🕢|7|30|
|128355|🕣|8|30|
|128356|🕤|9|30|
|128357|🕥|10|30|
|128358|🕦|11|30|
|128359|🕧|12|30|

つまり文字コードを得るには？

- `128335 + 時 % 12`
    - 12時, 24時は0じゃなく12
- 30分のときは + 12
 
 # 関数を作る

 ```powershell
function clockEmojiNow {
  $now = Get-Date
  clockEmoji $now.Hour $now.Minute
}

function clockEmoji($h, $m){
  $h = $h % 12
  $code = 128335
  $code += $h -ne 0 ? $h : 12
  $code += $m -lt 30 ? 0 : 12
  [char]::ConvertFromUtf32($code)
}
 ```

> ```
> PS [C:\]> clockEmoji 5 55
> 🕠
> PS [C:\]> clockEmojiNow
> 🕝
> PS [C:\]> get-date
> 
> 2023年12月22日 2:54:07
> ```

よさげ

# プロンプトに追加

`code $profile`でPowerShellの`bashrc`的なものを開く。
ここに`prompt`って関数を作って文字列返せばプロンプトをカスタマイズできる。
さっきの関数も書き込んでプロンプトを作成。

```powershell
function prompt(){
  "PS $(clockEmojiNow)[$((get-item $pwd).Name)]> "
}
```

こんな感じ

> ```
> PS 🕝[C:\]>
> ```

# おまけ: 時計を回す

```powershell
function rotateClock {
  $delayMs = 100
  for ($i = 0; $i -lt 12; $i++) {
    Write-Host "`b`b$(clockEmoji $i)" -NoNewline
    Start-Sleep -Milliseconds $delayMs
    Write-Host "`b`b$(clockEmoji $i 30)" -NoNewline
    Start-Sleep -Milliseconds $delayMs
  }
  Write-Host "`b`b$(clockEmoji 0 0)"
}
```

上記関数を`$profile`に書き込んで`rotateClock`すれば時計が回る
30分刻みだから回ってる感じしないし月のほうが分かりやすい

```powershell
function rotateMoon($delayMs = 100, $rotate = 3) {
  for ($i = 0; $i -lt 8 * $rotate; $i++) {
    $code = $i % 8 + 127761
    $char = [char]::ConvertFromUtf32($code)
    Write-Host "`b`b$char" -NoNewline
    Start-Sleep -Milliseconds $delayMs
  }
  Write-Host "`b`b🌑" -NoNewline
}
```

## tips
- `Write-Host`で改行無くすには`-NoNewline`
- powershellの文字のエスケープは`\`じゃなくバッククォートらしい
  - `bがバックスペース。前の文字を消去する
  - 絵文字なので二文字分を消す
超便利なメモNotion

## Notionとは
様々な機能を一元管理できるクラウドツールです。その用途は多様でありタスクを管理したり、チェックリスト、マニュアル、メモ帳として活用できます。私は就活をテンプレを使用してまとめています。
## 便利な機能
### 1.TODOリスト
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3344837/a7c8b223-088d-0d21-3bb7-615e892b01ea.png)
最もシンプルな使い方です。割り当て者名やステータス、期限、優先度等の設定ができます。
### 2.ブレストページでアイデアをまとめる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3344837/fb7e64a2-0f4d-3213-fd54-e94f15ef88cf.png)
Notionで業務を効率化するためにブレストページでアイデアをまとめられます。Notionは情報やアイディアをまとめやすく、トグルリストを使うことで階層構造で文章を整理したり折り畳みができたりします。
### 3.読んだ本を記録する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3344837/d7b35c7c-4648-fadc-28ac-80efccdfb145.png)
Notionで業務を効率化するために読んだ本を記録できます。Notionでは次のように読んだ本の表紙画像を表示することにより、本だなのように設定可能です。
### 4.データを一元管理する
Notionでは業務を効率化するためにデータを一元管理できます。ファイルやスケジュール、プロジェクト、ロードマップなどさまざまな要素を1つのツールで管理できるので情報を検索しやすいのが特徴です。
### 5.複数人で情報共有する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3344837/742d5a83-d070-b897-70cd-bd1feb7e58b2.png)
ワークページ内において共有できる他、同時に作業する場合メンションやコメントの機能を使うことでよりスムーズに作業を進められます。
### 6.テンプレート
![スクリーンショット 2023-12-22 024527.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3344837/0b4b29d6-a57e-01af-fb5f-5ee035d37e79.png)
既存のテンプレートを、自分の使いやすいように編集して使用しましょう。
### 7.AIの活用
![スクリーンショット 2023-12-22 024923.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3344837/5081bc3c-f8a5-80cf-6805-c375648a91d6.png)
AIに文を書いてもらうこともできます。
![スクリーンショット 2023-12-22 025041.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3344837/42610b29-b522-fa31-8913-5f98ca0620e6.png)
## 最後に
最近使い始めたばかりでわからないことだらけでしたが、とても便利なので是非使ってみてはいかがでしょうか。
スト6のために9ボタンアケコンを自作してみた。

※この記事は鈴鹿高専アドベントカレンダー2023用の記事です。

# はじめに
さて皆さん最近(執筆時点では約半年前)話題のストリートファイター6をご存知でしょうか？
うん!!知っていますね!!!!!!
僕はCRカップや友達の勧めからやり始めました。

スト6は簡単にいうと1v1のゲームで人を倒すと勝ちになります。
キャラを操作するのには様々なコントローラーの種類があり、
- キーボード
- PAD(代表例:PSのコントーラー)
- アケコン(ゲームセンターにあるタイプ)
等々たくさんあります。この中でロマンがあるコントローラーはやっぱり

 
 **アーケードコントローラー**

でしょ!!!
その中でもレバーレスというタイプのアケコンがありまして、それを買おうとおもったんです。さぁ密林のページに行くと...

![スクリーンショット 2023-11-18 6.56.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953889/b054731e-1594-e7ba-772b-b17b12a4be10.png)

なんと15000以上が大半....
さらに僕が現在使っているキーボードは攻撃のボタンが全部で9個いるので一般に販売されている11ボタンアケコンを見ると...
<img width="250" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953889/6f117196-38a2-3cee-47d2-a22c88dfa70c.png">


[](
task.上の画像を中央にする
)


高い...高すぎる!!!!(あと、11ボタンレバーレス評価低...)

学生の自分には少し痛い。ということで、みんな大好きな**ラズパイpico**で自作しましょう。
ラズパイは基本的に600円前後で購入可能です。

私は基本的に秋月電子のサイトを使いました。
https://akizukidenshi.com/catalog/

必要なものをリストアップしましょう。
- ラズパイpico
- ボタン
- 電線
- ファストン端子#110
- 箱
- ビニールテープ(何か固定用と簡易絶縁用)

くらいですかね。この中で、圧倒的にボタンが高いです...どれくらい高いのか見ていくと、
https://www.sengoku.co.jp/mod/sgk_cart/detail.php?code=25BU-8AL6
上のリンクを踏むと値段が262円です。今回ほしい個数は13個なので、3276円します。本当に高いです。
ファストン端子付きケーブルは秋月でファストン端子と銅線を買って、自作していきましょう。


さて、次に必要になるのは箱になりますが、今回はそこら辺にあったダンボールの箱で代用します。必要になれば箱を変更すれば良いだけです。

# ラズパイpicoの設定と書きこみ

今回使ったものは有志がつくったGP2040を使います。(GP2040は通信速度が速くて使いやすいため)
以下はgitのリンクです。使いたい人は是非使っていってください。
https://github.com/FeralAI/GP2040/releases
とても良いですね。なんといっても、とても分かりやすい説明で、どのピンがどのような信号を出力しているのかが書いてあるので、ささっと作れます。
bootボタンを押しながらPCに接続するとドライブとしてラズパイpicoが認識されますので、そこに上のリンクからダウンロードしたラズパイようのファイルをそのまま移動させましょう。
設定に関しては何もいじらずにラズパイpicoに書き込んでいきましょう。下記の表は、pinの対応表です。

![スクリーンショット 2023-12-22 2.37.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953889/00be3f33-f930-d334-cadd-80d0fbc94579.png)





# ラズパイpicoにI/Oソケットをつける
さて、ラズパイに書き込みができたら(最初にこれをやっても良い)I/Oソケットをつけいきましょう。
基本的に半田付けになるため、持ってない方は借りるか借りパクをしましょう。
半田付けの際はハンダゴテのやけどに気をつけてください。

# 天板を設計する
天板設計ができるのは、自作最大のメリットです。ボタンの位置や素材などを一から自分で考えたりできます。もし合っていなければ再度作り直せばよいだけです。
まずノギスや定規でボタンの直径を測ります。今回ははめ込み式のボタンなので、測る部分を間違えないようにしてください。
設計図などが完成したら、早速天板に穴をあけていきます。ダンボールなのでそこそこの精度で大丈夫です。小さかったら捻じ込めば入ります。

![tenban.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953889/a5eb253e-9893-829f-39f1-e7807ad40eba.png)

# ボタンとラズパイpicoの接続
さて、大体出来上がってきましたので次はファストン端子を使って接合していきましょう。
今回使用したのは#110のファストン端子です。先がとんがっているのが邪魔なので一旦ぶつ切りにします。
被膜ケーブル内の銅線を剥き出しにして圧着ペンチもしくはテープなどでぐるぐる巻きにします。
本来ならファストン端子に適合した絶縁カバーみたいなのがあるのですが、今回はそれを買うのを忘れてたのでビニールテープで代用しています。

# 動作確認
とういうことでボタンを箱に詰め込んだら、動作確認を行いましょう。
無事に動いたら完成です。

![IMG_0030.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953889/5dd8e058-2c57-77fe-10df-07e29000a2e4.png)




# おまけ
ちなみにこれはswitchゲームにも使えますのでぜひ使ってみてください。これでクラスのスマブラプレイヤーをボコボコにしましょう。(書いている人はスマブラ激よわです。)
【python入門】OpenCVを使うその２　画像にモザイクをかける

この記事は、[【完走したい】楽しくいろいろやる Advent Calendar 2023](https://qiita.com/advent-calendar/2023/notbeginner)の１４日目です。
# 画像処理がしたい
pythonに画像が入れられることは確認できたので、画像の中の顔を認識できるかやってみます。
画像処理もします。
# 画像から顔と目を検出する
ぬいぐるみの顔は検知できませんでした。なので、余っていた証明写真を使いました。

https://www.codexa.net/opencv_python_introduction/

ここのサイトを参考に、
```
import cv2
import numpy as np
import matplotlib.pyplot as plt
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_alt.xml')
eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml')
faces = face_cascade.detectMultiScale(original_image, 1.1, )
for (x,y,w,h) in faces:
    original_image = cv2.rectangle(original_image,(x,y),(x+w,y+h),(1,1,1),2)
    roi_color = original_image[y:y+h, x:x+w]
    eyes = eye_cascade.detectMultiScale(roi_color)
 
for (ex,ey,ew,eh) in eyes:
    cv2.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(255,255,255),1)
converted_image= cv2.cvtColor(original_image, cv2.COLOR_BGR2RGB) 
fig = plt.figure()
plt.imshow(converted_image)
```
こんな感じで書いたら、ちゃんと顔と目を認識してくれました。
# 本題
顔と目を認識できたので、モザイクをかけていきます。

https://note.nkmk.me/python-opencv-mosaic/

モザイクの仕方が乗ってたので参考しました。
最終的に、
```
import cv2
import matplotlib.pyplot as plt
src = cv2.imread('pic2023.jpg')
def mosaic(src, ratio=0.1):
    small = cv2.resize(src, None, fx=ratio, fy=ratio, interpolation=cv2.INTER_NEAREST)
    return cv2.resize(small, src.shape[:2][::-1], interpolation=cv2.INTER_NEAREST)
def mosaic_area(src, x, y, width, height, ratio=0.1):
    dst = src.copy()
    dst[y:y + height, x:x + width] = mosaic(dst[y:y + height, x:x + width], ratio)
    return dst
face_cascade_path = 'haarcascade_frontalface_alt.xml'
face_cascade = cv2.CascadeClassifier(face_cascade_path)

src_gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)

faces = face_cascade.detectMultiScale(src_gray)

for x, y, w, h in faces:
    dst_face = mosaic_area(src, x, y, w, h)
converted_image = cv2.cvtColor(dst_face, cv2.COLOR_BGR2RGB) 
fig = plt.figure()
plt.imshow(converted_image)
```
こうなりました
眼にモザイクを書けようとしたけど、まだ勉強が足りませんでした。
# まとめ

参考
https://www.codexa.net/opencv_python_introduction/

https://note.nkmk.me/python-opencv-mosaic/

https://pystyle.info/opencv-mosaic-processing/
クリーンアーキテクチャについて考える　後半

## 概要
前回クリーンアーキテクチャついて考えたので、実現するための構成を考える。

## 注意事項
今回、完璧なクリーンアーキテクチャの実現は目指しません。
理由としては、今回はワンオペに近い運営を想定しています。
（個人で作るもののために考えているのでご理解ください）
そのためチーム運営を考慮せずに、簡易的な実現を目指します。

## 構成検討
![base_arch.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688298/d53d576f-3efd-a748-4a64-f87468400237.png)
引用元：[Clean Architecture 達人に学ぶソフトウェアの構造と設計](https://www.amazon.co.jp/dp/4048930656)

クリーンアーキテクチャで有名な構成図といえばこちらなはず。
今回APIのみの利用なので少し置き換えて考える必要があるが、この図を純粋に実装するのが大変なのでその点を課題点として挙げていく

#### データのやりとり
クリーンアーキテクチャでは、依存性の逆転の実現に目を向けがちではあるが、
レイヤー間のデータのやりとりもむずあkしい問題ではある。
先ほどの構成図を見ても
ControllerからInput DataとInput Boundaryと2種類でており、
UseCaseを介してParsenterに変えるのもOutput BoudaryとOubput Dataとなっており、
依然性が密にならないように個別に定義しなければいけない。
当然、Controllerの数があればその分宣言する必要もあるので実はかなりの労力になりやすい。
この点に関しては、クリーンアーキテクチャを採用するには覚悟する点でもあるのである程度必要だが、
採用にあたってはシンプルに採用する方針。

#### Entitiesの立ち位置
Entitiesとは何なのか？
実は、クリーンアーキテクチャではビジネスルールをカプセル化することも認められているし、データ構造の集合であることも認められている。
しかし、円の中心にいるために外の変更があったときに影響がないことも補償される必要がある。
具体的なことで考えるとユーザー情報を例にして考える。
ユーザー情報として

- ユーザーID
- ログインID
- パスワード
- 生年月日

を持ってるとする。
DBもこの構成のTableがあるものとしたときに
ユーザー情報にメールアドレス情報を追加することを考える
ユーザー情報に追加されないと他の処理で利用するときに使えないし、当然DBにもデータそして保管されている必要がある。
では、DBのユーザー情報Tableに登録日時の情報を追加するときはどうなるのか？
内部であつかうユーザー情報に必要かといわれるとそうではないでしょう。
データの種類的にもデータ管理面で必要なカラムであって、処理面では必要ない情報でしょう。
と内部で処理するのに必要な構造をもつものをEntitiesとして扱うことにする。
そのため、DBのTable構成とは別に扱うことにする。
これはTable構成の変更が直接ビジネスルールに影響を与えないことでワンオペによる作業ミスの予防策として採用した。
この辺りは、サービスにとってDBのデータと処理側での扱いの関係性で考えたほうがいい。
処理とDBのデータ関係が重要になるような分析系のシステムなら近くにしたほうが運用しやすくなるケースはあると思うし、複雑な分析時には別途Entitiesを用意するといったルールを採用してもいいと思う。

## 課題点を考慮して今回考える構成
作成してみた構成はこちら
今回APIでのみの利用なのでViewはなくしている。

![clean_now.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688298/54c042eb-c7e6-6118-4014-054b82d48391.png)


- レイヤー間のデータに関してはInputとOutputをまとめたUsercase Objectとして扱うこととした。
  - 大量の構造体を用意せずにやり取り用の構造体を設けるようにしてできるようにした。
  - Repositoryにもつながることを想定しており、共通にしてやり取りが行いやすくした。
- EntitiesはDomain ServiceとObjectを用意し、内部での処理に適した変換などもこちらに含める形にした。
  - 問題点としは、変換処理は外のレイヤーの影響を受けやすいので依存性の逆転が崩れている要素でもあるので自覚して扱う必要がある。
- Table側の影響が直接内部処理に影響を与えないためにDatabase Access Objectを宣言し、DBの変更を直接受けない構成にした。

## フォルダ構成
今回は以下のようなフォルダ構成で考えている。

```　go
app/
   ├── consts
   ├── controllers/
   │   └── ci
   ├── entities
   ├── infra/
   │   ├── database
   │   ├── di
   │   ├── logger
   │   └── server
   ├── repositories/
   │   └── ri
   └── usecases/
      └── ui
```

要点を整理すると
- controllers、repositories、usecasesは依存性の逆転のためInterfaceを記載する箇所をもうける。
  - 1ファイルですべて宣言することも可能だが、Interfaceの特性を考えて別ファイルで宣言することにした。
  - 命名はいろいろ考えてたが、usecase interfaceとして略してuiと扱うようにした。
  - Interfaceは変更は具象側と比較すると少ないと思われるので1階層奥にしている。
- infra層に関して
  - 一番外側の要因に対する設定を設ける場所にしている。
  - databaseは今回ORMであるsqlboilerを使う要諦なので出力先としても採用している。
- constsフォルダ
  - 定数の置き場として採用しているが、Entitiesにセットにしたほうが実用的な様子もあるのでここは様子見ではあります。

## 最後に
クリーンアーキテクチャについて軽く触れつつ、今回作るサービスのための構成に採用してみました。
最初に注意事項として書いていますが、厳密には正しいクリーンアーキテクチャではありません。
どちらかというとテストコードの書きやすさを考慮したものになっています。
しかし、完全に準拠したクリーンアーキテクチャの実装はできないという声もあるので
どの部分を許容するのか、採用しないのかをちゃんと考慮して選択する必要があるのだと感じました。
標準ライブラリとの衝突に備えよ！！！！

例えば自作のpow関数を作ったとして、名前をそのままpowにしていると、
標準ライブラリのpowに持っていかれて、%MODが出来ずにヘンテコな答えを返し続ける地雷と化します！！気を付けようね！！！！（３敗）


```
ll MOD=1000000007;
mint pow_mint(ll x, ll n) {
    mint ret=1;
    while(n>0){
        if (n&1) ret*=(int)x;
        x = x*x %MOD ;
        n >>= 1;
    }
    return ret;
}
```

多分茶色の頃のメモ書き
GitLabからGitHubへ3コマンドで簡単に移行する方法

# はじめに
面倒なので、コマンドでばばんと移行する話です

# やり方
## 前準備
1. gitHubリポジトリを作成しておきます。
1. 移行先のgithub側に、`リポジトリにコミットした関連者全員アカウント`を作っておいてもらいましょう

## コマンド適用
```
% git clone --mirror <GitLab repository URL>
% cd hogehoge
% git push --mirror <GitHub repository URL>
```
これだけです。
えっへん感だしてますが、chatgptが全部教えてくれました（cd以外)

### 補足
git clone --mirrorを行うと、gitlabのリポジトリ名`のhogehoge.git`というディレクトリが出来上がります。
ここにcdで移動してから、git pushをする必要があることに注意します。

また、この方法では、MRとissueは移動できません。

# ツールは使えるか？
https://github.com/piceaTech/node-gitlab-2-github

というツールがあります。
MRやissueも移行できるとありますが、うまく行かないケースが有るようです。

https://blog.sunl.jp/gitlab-to-github/

- Source Branchが無いMerge RequestをPull Requestに移行できない
- IssueやMergeRequestの添付ファイルは移行できない
- IssueのOwner情報は引き継げない
- 対象ユーザーがいないIssueは移行できない

しょーがないので、過去は過去においてくることに・・・。
「活動」機能をどのように業務利用するか？

#### まえおき
本稿では、「活動」機能をどのように業務利用するか？についての自らの備忘として残します。
（関連投稿に、機能使い分けについてまとめましたので、そちらもご覧ください）。

#### 本題
これまでわたしが導入してきた、各企業様において、「活動」機能をどのように業務利用するか？が、必ず議論にあがり毎度苦慮するところです（なかなか、お客様にとってはイメージがしずらいと思います）。
営業活動といったなかでも、「宴会やゴルフといった営業活動以外」のものも含め、『活動』としてどのように登録し、その後の業務分析の対象にするかまで考えておく必要がありますが、本稿では、主に、以下の機能使い分け説明と機能利用前に検討と定義すべきこととして、記載します。

#### 機能①：ToDo
SFA領域と申しますか、営業担当が、具体的な営業活動していく中で、パイプラインといった商談化～受注に至るまでの過程における「提案やヒアリングなどの営業活動」を主に登録。※受注に向けて実施すべきこと＝ToDo、タスク。

#### 機能②：行動(カレンダー) 
「①」における、各ポイントの “イベント” 扱いとなるもの。「宴会やゴルフといった営業活動以外」のもの。どちらかというと、CRM領域でもあると考えていますが、あくまで、営業活動でもあるでしょうけども、“顧客とのリレーション構築” の観点での活動という位置づけで、きちんと、顧客企業（取引先）のいち担当者（取引責任者）との関係構築を定期的に、行えているか？という イベント化されたスケジュールを 行動として登録。

#### 機能の使い分け
上記①、②をひとつのくくりとして『活動』と定義して、必要に応じて、『ToDo、行動』を使い分けと、レポート抽出による業務分析を行っていました。

ですので、『活動』を上記の「①、②」として、まずは定義して使おう。としたときに、それにともなうそれぞれの「区分」をどの用に細分化しておこうか。との議論はしやすくなると考えています。

#### 補足
なお、この「区分」は細分化すればするほど、メンテナンスや分析観点でややこしくもなるため、「①、②」の機能使い分けを定義するとともに、本当に「①、②」それぞれで異なる区分を設けるか必要があるのか？は議論すべきかと思います（理由が無ければ、「①、②」とも機能の使い分けはするものの、区分は共通化しておき、選択リスト値としても、同じものを利用する。ことも良い選択だと考えます。

#### 関連投稿
https://qiita.com/d-utsunomiya/items/17f85afb21eaa1dfe29c

#### 参考記事
サクセスナビ：行動（スケジュール）、ToDo（やるべきこと）を入力する
https://successjp.salesforce.com/article/NAI-000032
これですっきり！活動と行動とToDoを攻略しよう！！
https://note.com/koji_matae/n/n43c42db4abfb
gitlabのMRテンプレートでreviewer指定する

# gitlabにおけるMRテンプレートの作成

repositoryの下記場所に作成。
ファイル名は何でも良い。

```
.gitlab/merge_request_templates/default_template.md
```

# reviewer指定方法
```default_template.md
/assign_reviewer @bluelemmon
```

こんな感じで指定すればOK。
デフォルトのブランチに対して、入っていれば、MR時に引っ張ってこれる
AWS CDK(TypeScript)のFormater/LinterはBiomeから始めよう

:::note info

この記事は[AWS CDK Advent Calendar 2023](https://qiita.com/advent-calendar/2023/aws-cdk)の22日目の記事です。

:::

NTTテクノクロスの渡邉です。

今回はAWS CDKをTypeScriptで運用する人向けのTipsを書いてみます。

## What’s Biome?

TypeScript/JavaScriptの定番のFormater/Linterと言えば、だいたいはPrettierとESLintです。
ただ最近、Formater/Linterを統合した「Biome」が注目されています。

このようなニュースもあり、少なくともPrettier的には公式のライバルといったところでしょうか。(乃木坂？)

https://zenn.dev/sosukesuzuki/articles/e1e47e2a760e9d

ESLintとの対応はこの記事が参考になりそうです。

https://zenn.dev/cybozu_frontend/articles/biome-eslint-compatibility

### 特徴

#### Faster

Rust製なのもあって、とにかく速いです。

具体的に[baseline-environment-on-aws(BLEA)](https://github.com/watany-dev/baseline-environment-on-aws)で速度を試した結果がこれです。

- Format

```bash
# Prettier
time bun run format

real    0m4.932s
user    0m5.289s
sys     0m2.201s

# Biome
time bun run format:b

real    0m0.180s
user    0m0.095s
sys     0m0.055s

```

- Lint

```bash
# ESLint
time bun run lint

real    0m11.330s
user    0m14.535s
sys     0m1.157s

# Biome
time bun run lint:b

real    0m0.153s
user    0m0.163s
sys     0m0.059s
```

圧倒的にBiomeが速いことがわかります。

#### Zero or Few Config

Prettier, ESLintそれぞれ設定ファイルがあるのに対し、BiomeはZero Configでそれなりに動きます。

満足できない人も`biome.json`という1ファイルでシンプルに管理できるのも強みです。

https://biomejs.dev/reference/configuration/

## CDKにおけるFormater/Linter

CDKを導入するときに`npx cdk init`で入れるとFormater/Linterが入っていない状態です。
前述のBLEAではその辺がよしなに設定されているので、それをパクります！というのも一つの解だと思います。ツールとしては安定しています。

ただ設定値に責任を持たなくてはいけない実際の現場で、この2つのツールの設定を扱ったり、conflictを対応するのが面倒なんですよね。ぶっちゃけAWS CDKからTypeScriptはじめました！という層（昔の私）には荷が重いところがあります。

その点Biomeは1つのツールなので、競合などを考える必要はありません。設定もシンプルで速いです。こだわりがない人にとってはBiomeでほとんど十分ではないでしょうか？

## CDK With Biome

作成したCDKプロジェクトに、ここを参考に導入するだけです。

https://biomejs.dev/guides/getting-started/

### Install

コマンド一つで入ります。

```bash
# npm
npm install --save-dev --save-exact @biomejs/biome

# yarn
yarn add --dev --exact @biomejs/biome

# bun
bun add --dev --exact @biomejs/biome
```

### usage

またBLEAを参考にしていますが、このように置き換わります。
コマンド的には打ちづらいのでnpmスクリプトに登録しておきましょう。

```diff_json:package.json
{
-   "lint": "eslint --fix .",
+   "lint": "npx @biomejs/biome lint --apply-unsafe ./",
-   "lint:ci": "eslint .",
-   "format": "prettier --write .",
+   "format": "npx @biomejs/biome format ./ --write",
-   "format:ci": "prettier --check .",
+   "ci": "npx @biomejs/biome ci .",
}
```

### Setting

Zero Configとはいえ、フィットしないところはBiomeの設定を変えましょう。このように設定ファイルを作ります。

```bash
# npx
npx @biomejs/biome init

# yarn
yarn dlx @biomejs/biome init
```

設定方法は、まずはこの記事で大局をつかんでから始めると無駄がなさそうです。某所で採用した際にも、そのまま参考にできるところも多いと感じました。

https://zenn.dev/voluntas/scraps/31de0e6155b43e


## まとめ

CDKのためにTypeScript始めたけど、Formater/Linterなんかよくわかんないよ。って人にほど刺さるBiome。CDKユーザにも実は向いているのです。よかったら試してみてください。
bin/devでrails sを起動するとbinding.pryなどの標準入力が見えなくなる

# Rails 7でbin/devでデバッグ時の問題と対処法

Rails 7系でbin/devを使用してサーバーを起動している際に、binding.pryやdebugを利用すると、プロンプトに入力した文字が表示されない問題があります。
具体的には、コードにbinding.pryを挿入しても、入力した文字が見えず、入力が空白のように見えます。


この問題の原因は、Rails 7でbin/devによって使用されているForemanが標準入力を適切にハンドリングできないためです。

## 現状の対処法
### pry-remoteの使用

- Gemfileにgem 'pry-remote'を追加し、bundle installを実行します。
- binding.pryの代わりに、binding.remote_pryをコードに挿入します。
- 別のターミナルから$ pry-remoteを実行すると、そのターミナルでデバッグが可能になります。

**デメリット**：多くのターミナルを開く必要があり、手間がかかる。


### ForemanとRailsサーバーを別々に実行

bin/devを使用すると、Procfile.devがForemanで実行されます。これはCSSおよびJSのウォッチャーによって引き起こされますが、これらはファイルの変更のみを監視するため、サーバー自体には関与しません。

Procfileからweb: unset PORT && bin/rails serverを削除します。これにより、CSSウォッチャーとJSウォッチャーのみが残り、以下のようになります。

```
js: yarn build --watch
css: yarn build:css --watch
```

この方法では、2つのターミナルを開く必要があります。
```
bin/rails s
bin/dev
```
このセットアップにより、pryはサーバーターミナルで通常通り動作し、ウォッチャーも問題なく機能します。



## 参考
https://stackoverflow.com/questions/72532475/binding-pry-not-works-with-command-bin-dev
https://scrapbox.io/ruby-jp/bin%2Fdev_%E3%81%A7%E8%B5%B7%E5%8B%95%E3%81%99%E3%82%8B%E3%81%A8_debug.gem_%E3%81%8C%E4%BD%BF%E3%81%88%E3%81%AA%E3%81%8F%E3%81%AA%E3%82%8B
Prismaでの多対多（Many-to-Many）リレーションが便利だった

# 岩手アドベントカレンダー
ちょっと今年は過疎ってますが、岩手在住のエンジニアとして参加します。

https://qiita.com/advent-calendar/2023/ipu

# Prismaで多対多（Many-to-Many）のリレーションを行う

本来、多対多のリレーションを行うに中間テーブルの作成を行う必要があります。
ですが、Prismaでは自動で中間テーブルの作成を行ってくれます。
その他クエリの扱いも楽になるので非常に便利です。

# 実践
公式ドキュメントを例として記述します。

## データモデルの設定
例としてPOSTとCategoryというテーブルを設定します。
それぞれのテーブルにリレーションを追加してあげます。

これでマイグレーションすると`_CategoryToPost` というテーブルが自動で作成されます。(`_テーブルA To テーブルB`)

```
model Post {
  id         Int        @id @default(autoincrement())
  title      String
  categories Category[]　←追加
}

model Category {
  id    Int    @id @default(autoincrement())
  name  String
  posts Post[]　←追加
}
```

実際のマイグレーションファイル

```
CREATE TABLE "_CategoryToPost" (
    "A" integer NOT NULL REFERENCES "Category"(id) ,
    "B" integer NOT NULL REFERENCES "Post"(id)
);
CREATE UNIQUE INDEX "_CategoryToPost_AB_unique" ON "_CategoryToPost"("A" int4_ops,"B" int4_ops);
CREATE INDEX "_CategoryToPost_B_index" ON "_CategoryToPost"("B" int4_ops);

CREATE TABLE "Category" (
    id integer SERIAL PRIMARY KEY
);

CREATE TABLE "Post" (
    id integer SERIAL PRIMARY KEY
)
```

## クエリの方法

自動で生成された中間テーブルですが、どのように扱うのでしょうか？


### create(connect)
connectを使用することで中間テーブルへ自動で紐づけを行ってくれます。

```
const newPost = await prisma.post.create({
  data: {
    title: '新しいポストのタイトル',
    categories: {
      connect: [
        { id: 1 }, // 既存のカテゴリーID
        { id: 2 }  // 別のカテゴリーID
      ]
    }
  }
});
```

### Update
updateはsetを使うといいです。setを使用すると、関連付けられたすべての既存のレコードが新しいレコードで置き換えられます。

```
const newPost = await prisma.post.create({
  data: {
    title: '新しいポストのタイトル',
    categories: {
      set: [
        { id: 1 }, // 既存のカテゴリーID
        { id: 2 }  // 別のカテゴリーID
      ]
    }
  }
});
```

### delete
postレコードの削除によって自動で削除されます。(べんり～)


# connect,setってなに？
Prismaで多対多のリレーションシップを扱う際に使用する主要な機能には、connect、disconnect、setなどがあります。これらの機能は、関連するレコード間のリンクを管理するために使用されます。

* connect: 追加する場合
* disconnect: 一部を削除する
* set: 新しいレコードへ置き換える
「活動」についてのまとめ

#### まえおき
本稿では、「活動」で出来ることについての自らの備忘として残します。
（参考記事が大変分かりやすく、参考とさせていただきました。有り難うございます！）。
要点としては次のようになります。

#### 前提
すべての元は「活動（①）」。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3658343/c095832d-f9fd-2feb-9eca-dfa26be04fb5.png)

#### 用途
利用者がこれまでのこと、これからのことを忘れないため、活動記録（見える化）しておくもので利用者とマネージャーとのコミュニケーションのきっかけに使用する。

#### 表現の説明
「行動（②）」と「ToDo（③）」とは、上記「活動（①）」の表現方法としたもの。

#### 出来ること(機能)
②『新規行動』タブ：「行動」と「カレンダー」は同様のもの（開始日・終了日のあるカレンダーに予定登録するようなもの）と考えてください。
③『新規ToDo』タブ：“未来のToDo（これからすべきこと）”です。※カレンダーには表示されません。
④『活動の記録』タブ：“現在から過去のToDo”です。今行ったこと、さっき行ったことを登録します。※カレンダーには表示されません。
⑤カレンダー：②で予定登録したものを、カレンダー形式で見ることができます。

#### 参考記事
サクセスナビ：行動（スケジュール）、ToDo（やるべきこと）を入力する
https://successjp.salesforce.com/article/NAI-000032
これですっきり！活動と行動とToDoを攻略しよう！！
https://note.com/koji_matae/n/n43c42db4abfb