OmniAICreator/Qiita-1.07M huggingface dataset:
【C++Builder】C ランタイムライブラリリファレンス (setjmp.h)

# 非局所分岐 (大域ジャンプ) (Set Jump)

| ヘッダ<br>ファイル | [setjmp.h](https://docwiki.embarcadero.com/RADStudio/ja/Setjmp.h%EF%BC%9A%E3%82%A4%E3%83%B3%E3%83%87%E3%83%83%E3%82%AF%E3%82%B9) |
|:---|:---|
| 規格 | ANSI C (C89) / C90 |
| 概要 | 通常の関数呼出し及び関数からの復帰の規則を回避するため、マクロ setjmp を定義し、更に 1 つの関数及び 1 つの型を宣言する。 |

C 言語での **goto** は関数内ジャンプ (ローカルジャンプ) なので、標準 Pascal で言う所の大域ジャンプは許可されません。

```c:C
#include <stdio.h>

int a = 0;

void proc(void)
{
    a++;
    printf("Count: %d\n", a);
    if (a > 9)
        goto jmp; // NG
}

int main(void)
{
    while (1)
        proc();
jmp:
    return 0;
}
```

大域ジャンプは Delphi 等の多くの Pascal 処理系で許可されていません。

```pascal:Pascal/Delphi
program JmpTest(output);
label
  99;
var
  a: Integer;
  procedure proc;
  begin
    a := a + 1;
    writeln('Count: ', a);
    if a > 9 then
      goto 99; { Standard Pascal: OK }
  end;         { Delphi         : NG }
begin
  a := 0;
  while True do
    proc;
99:
end.
```


## プラグマ

## 型

| 名前 | 機能 |
|:---|:---|
| jmp_buf | ローカルでないジャンプ (大域ジャンプ) のためのバッファ (処理系定義の構造体型配列)。 |

## マクロ

## 引数付きマクロ

| 名前 | 機能 |
|:---|:---|
| [setjmp()](https://docwiki.embarcadero.com/RADStudio/ja/Setjmp) | ローカルでないジャンプ (大域ジャンプ) を設定します。 |

## 関数

| 名前 | 機能 |
|:---|:---|
| [longjmp()](https://docwiki.embarcadero.com/RADStudio/ja/Longjmp) | ローカルでないジャンプ (大域ジャンプ) を実行します。 |

非局所分岐 (大域ジャンプ) は主に深くネストした関数呼び出しから抜ける目的で使用されます。

```c
if (setjmp(env) == 0) {
    // 直接呼び出された時
} else {
    // longjmp() が呼び出された時
}
```

先述のうまく動作しなかったコードを `setjmp()` と `longjmp()` で書き替えてみました。

```c
#include <stdio.h>
#include <setjmp.h>

int a = 0;
jmp_buf env;

void proc(void)
{
    a++;
    printf("Count: %d\n", a);
    if (a > 9)
        longjmp(env, 1);
}

int main(void)
{
    if (setjmp(env) == 0) {
        while (1)
            proc();
    }
    return 0;
}
```

## 資料

 - [C 言語 / 標準ライブラリ / setjmp.h (Wikibooks)](https://ja.wikibooks.org/wiki/C%E8%A8%80%E8%AA%9E/%E6%A8%99%E6%BA%96%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA/setjmp.h)
 - [z/OS C/C++ ランタイム・ライブラリー・リファレンス setjmp.h &#x2014; プログラム状態の操作 (IBM)](https://www.ibm.com/docs/ja/zos/3.1.0?topic=files-setjmph-manipulate-program-state)
 - [C 言語の標準ヘッダ一覧 setjmp.h (C 言語)](http://www.c-lang.org/detail/setjmp_h.html)

---

[&#x21E6; インデックスへ](https://qiita.com/ht_deko/items/31f4b37daa97270e2416)

---
【C++Builder】C ランタイムライブラリリファレンス (locale.h)

# 文化圏固有操作 (ロケール) (Locale)

| ヘッダ<br>ファイル | [locale.h](https://docwiki.embarcadero.com/RADStudio/ja/Locale.h%EF%BC%9A%E3%82%A4%E3%83%B3%E3%83%87%E3%83%83%E3%82%AF%E3%82%B9) |
|:---|:---|
| 規格 | ANSI C (C89) / C90 |
| 概要 | 2 つの関数及び 1 つの型を宣言し、幾つかのマクロを定義する。 |

## プラグマ

## 型

| 名前 | 機能 |
|:---|:---|
| lconv | ロケール情報を持つ構造体 |

## マクロ

| 名前 | 機能 |
|:---|:---|
| LC_ALL      | LC_??? フラグすべての集合。 |
| LC_COLLATE  | 文字列比較。[strcoll()](https://docwiki.embarcadero.com/RADStudio/ja/Strcoll%EF%BC%8C_stricoll%EF%BC%8C_mbscoll%EF%BC%8C_mbsicoll%EF%BC%8Cwcscoll%EF%BC%8C_wcsicoll) と [strxfrm()](https://docwiki.embarcadero.com/RADStudio/Athens/ja/Strxfrm%EF%BC%8Cwcsxfrm) に影響します。|
| LC_CTYPE    | 文字セット。1 バイト文字操作関数に影響します。[mbstowcs()](https://docwiki.embarcadero.com/RADStudio/ja/Mbstowcs) と [mbtowc()](https://docwiki.embarcadero.com/RADStudio/ja/Mbtowc) には影響しません。|
| LC_MONETARY | 通貨表記。[localeconv()](https://docwiki.embarcadero.com/RADStudio/ja/Localeconv) による金額の書式設定に影響します。 |
| LC_NUMERIC  | 小数点表記。金額以外のデータの書式設定の小数点に影響します。これには、[printf()](https://docwiki.embarcadero.com/RADStudio/ja/Printf%E3%80%81wprintf) 系の関数と、[localeconv()](https://docwiki.embarcadero.com/RADStudio/ja/Localeconv) から返される情報が含まれます。 |
| LC_TIME     | 日付・時刻表記。[strftime()](https://docwiki.embarcadero.com/RADStudio/ja/Strftime,_wcsftime) に影響します。 |
| [(NULL)](https://docwiki.embarcadero.com/RADStudio/ja/NULL_define)        | 任意のデータオブジェクトポインタと互換性があるヌルポインタ定数です。 |



## 引数付きマクロ

## 関数

| 名前 | 機能 |
|:---|:---|
| [localeconv()](https://docwiki.embarcadero.com/RADStudio/ja/Localeconv) | 数値形式のためのロケールを問い合わせます。 |
| [setlocale()](https://docwiki.embarcadero.com/RADStudio/ja/Setlocale%EF%BC%8C_wsetlocale) | ロケールを選択または問い合わせます。 |


## 資料

 - [C 言語 / 標準ライブラリ / locale.h (Wikibooks)](https://ja.wikibooks.org/wiki/C%E8%A8%80%E8%AA%9E/%E6%A8%99%E6%BA%96%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA/locale.h)
 - [z/OS C/C++ ランタイム・ライブラリー・リファレンス locale.h &#x2014; ロケール設定 (IBM)](https://www.ibm.com/docs/ja/zos/3.1.0?topic=files-localeh-locale-settings)
 - [C 言語の標準ヘッダ一覧 locale.h (C 言語)](http://www.c-lang.org/detail/locale_h.html)


---

[&#x21E6; インデックスへ](https://qiita.com/ht_deko/items/31f4b37daa97270e2416)

---
【C++Builder】C ランタイムライブラリリファレンス (limits.h)

# 整数型の大きさ (Limits)

| ヘッダ<br>ファイル | [limits.h](https://docwiki.embarcadero.com/RADStudio/ja/Limits.h%EF%BC%9A%E3%82%A4%E3%83%B3%E3%83%87%E3%83%83%E3%82%AF%E3%82%B9) |
|:---|:---|
| 規格 | ANSI C (C89) / C90 |
| 概要 | 標準整数型の種々の限界及びパラメタに展開する幾つかのマクロを定義する。フリースタンディング環境で利用可能。 |

## プラグマ

## 型

## マクロ

| 名前 | 機能 |
|:---|:---|
| [CHAR_BIT](https://docwiki.embarcadero.com/RADStudio/ja/CHAR_xxx_define) | char 型のビット数 |
| MB_LEN_MAX | マルチバイト文字の最大バイト数 |


| 整数型 | 符号付き最小値 | 符号付き最大値 | 符号なし最大値 |
|:---|:---|:---|:---|
| char [^1] | [CHAR_MIN](https://docwiki.embarcadero.com/RADStudio/ja/CHAR_xxx_define) | [CHAR_MAX](https://docwiki.embarcadero.com/RADStudio/ja/CHAR_xxx_define) | [CHAR_MAX](https://docwiki.embarcadero.com/RADStudio/ja/CHAR_xxx_define) |
| (signed) char /<br>unsigned char | [SCHAR_MIN](https://docwiki.embarcadero.com/RADStudio/ja/SCHAR_xxx_define) | [SCHAR_MAX](https://docwiki.embarcadero.com/RADStudio/ja/SCHAR_xxx_define) | [UCHAR_MAX](https://docwiki.embarcadero.com/RADStudio/ja/Uxxxx_MAX_define) |
| short /<br>unsigned short | [SHRT_MIN](https://docwiki.embarcadero.com/RADStudio/ja/SHRT_xxx_define) | [SHRT_MAX](https://docwiki.embarcadero.com/RADStudio/ja/SHRT_xxx_define) | [USHRT_MAX](https://docwiki.embarcadero.com/RADStudio/ja/Uxxxx_MAX_define) |
| int /<br>unsigned int | [INT_MIN](https://docwiki.embarcadero.com/RADStudio/ja/INT_xxx_define) | [INT_MAX](https://docwiki.embarcadero.com/RADStudio/ja/INT_xxx_define) | [UINT_MAX](https://docwiki.embarcadero.com/RADStudio/ja/Uxxxx_MAX_define) |
| long /<br>unsigned long | [LONG_MIN](https://docwiki.embarcadero.com/RADStudio/ja/LONG_xxx_define) | [LONG_MAX](https://docwiki.embarcadero.com/RADStudio/ja/LONG_xxx_define) | [ULONG_MAX](https://docwiki.embarcadero.com/RADStudio/ja/Uxxxx_MAX_define) |

:::note
符号なし整数型の最小値はもちろん 0 なので、符号なし整数型のマクロは定義されていません。
:::

## 引数付きマクロ

## 関数

## 資料

 - [C 言語 / 標準ライブラリ / limits.h (Wikibooks)](https://ja.wikibooks.org/wiki/C%E8%A8%80%E8%AA%9E/%E6%A8%99%E6%BA%96%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA/limits.h)
 - [z/OS C/C++ ランタイム・ライブラリー・リファレンス limits.h &#x2014; リソースに関する制限の標準値 (IBM)](https://www.ibm.com/docs/ja/zos/3.1.0?topic=files-limitsh-standard-values-limits-resources)
 - [C 言語の標準ヘッダ一覧 limits.h (C 言語)](http://www.c-lang.org/detail/limits_h.html)


---

[&#x21E6; インデックスへ](https://qiita.com/ht_deko/items/31f4b37daa97270e2416)

[^1]: char 型の範囲を調べるのに `CHAR_MIN` と `CHAR_MAX` を使えば、char 型が符号付きで実装されていても符号なしで実装されていても、正しく範囲を得られます。
【C++Builder】C ランタイムライブラリリファレンス (iso646.h)

# 代替綴り (ISO646)

| ヘッダ<br>ファイル | [iso646.h](https://docwiki.embarcadero.com/RADStudio/ja/Iso646.h%EF%BC%9A%E3%82%A4%E3%83%B3%E3%83%87%E3%83%83%E3%82%AF%E3%82%B9) |
|:---|:---|
| 規格 | C95 |
| 概要 | 11 個のマクロを定義する。これらのマクロは、対応するトークンに展開する。フリースタンディング環境で利用可能。 |

:::note
ANSI C / C90 以降、ソースコードの記述に使われる文字集合は ASCII (基本・拡張) が標準として想定されています。文字集合が ISO/IEC 646 な環境では `iso646.h` をインクルードして **代替綴り** でコードを記述する必要があります。
:::


**See also:**
 
 - [ASCII (Wikipedia)](https://ja.wikipedia.org/wiki/ASCII)
 - [ISO/IEC 646 (Wikipedia)](https://ja.wikipedia.org/wiki/ISO/IEC_646)

## プラグマ

## 型

## マクロ

`!` `&` `^` `|` `~` を入力できない場合の代替綴りが定義されています。

| 代替 | 演算子 | 機能 |
|:---|:---|:---|
| not    | !  | 論理否定演算子 (NOT) |   
| and    | && | 論理積演算子 (AND) |
| or     | \|\| | 論理和演算子 (OR) |
| compl  | ~  | ビット論理否定 (NOT) |
| bitand | &  | ビット論理積 (AND) |
| bitor  | \|  | ビット論理和 (OR) |
| xor    | ^  | ビット排他的論理和 (XOR) | |
| not_eq | != | 非等価演算子 != (NOT EQUAL) |
| and_eq | &= | 複合代入演算子 &= (a = a & b) |
| or_eq  | \|= | 複合代入演算子 \|= (a = a \| b) |
| xor_eq | ^= | 複合代入演算子 ^= (a = a ^ b) |




例えば次のようなコードは、

```c
  if ((a==1) && (b==1)) {
    ...
  }
```

代替綴りを用いて Pascal 風味に書く事ができます。

```c
  if ((a==1) and (b==1)) {
    ...
  }
```

### トライグラフ

C 言語が使う記号のうち、ISO/IEC 646 文字コードセットで表せない可能性のある文字は `#` `[` `\` `]` `^` `{` `|` `}` `~` の 10 個あります。これらの文字を代替するためのトライグラフが用意されている事があります。

| 代替 | 記号 |
|:---:|:---:|
| ??= | # |
| ??( | [ |
| ??/ | \ |
| ??) | ] |
| ??' | ^ |
| ??< | { |
| ??! | \| |
| ??> | } |
| ??- | ~ |

こちらは文字そのものを代替します。文字列リテラル内も代替されるので、

```c
#include <stdio.h>

int main(void)
{
  printf("??(Hello,World.??)\n");
  return 0;
}
```

次のような実行結果になります。

```
[Hello,World.]
```

:::note info
Turbo C++ や古い C++Builder はトライグラフを `TRIGRAPH.EXE` で処理します。
:::


**See also:**

 - [トライグラフ (Wikipedia)](https://ja.wikipedia.org/wiki/%E3%83%88%E3%83%A9%E3%82%A4%E3%82%B0%E3%83%A9%E3%83%95)
 - [C++Builder とトライグラフ (Qiita)](https://qiita.com/ht_deko/items/36115af8a57636257445)

## 引数付きマクロ

## 関数

## 資料

 - [C 言語 / 標準ライブラリ / iso646.h (Wikibooks)](https://ja.wikibooks.org/wiki/C%E8%A8%80%E8%AA%9E/%E6%A8%99%E6%BA%96%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA/iso646.h)
 - [z/OS C/C++ ランタイム・ライブラリー・リファレンス iso646.h &#x2014; 演算子用マクロ (IBM)](https://www.ibm.com/docs/ja/zos/3.1.0?topic=files-iso646h-macros-operators)
 - [C 言語の標準ヘッダ一覧 iso646.h (C 言語)](http://www.c-lang.org/detail/iso646_h.html)


---

[&#x21E6; インデックスへ](https://qiita.com/ht_deko/items/31f4b37daa97270e2416)

---
【C++Builder】C ランタイムライブラリリファレンス (float.h)

# 浮動小数点の特性 (Floating-Point)

| ヘッダ<br>ファイル | [float.h](https://docwiki.embarcadero.com/RADStudio/ja/Float.h%EF%BC%9A%E3%82%A4%E3%83%B3%E3%83%87%E3%83%83%E3%82%AF%E3%82%B9) |
|:---|:---|
| 規格 | ANSI C (C89) / C90 |
| 概要 | 標準浮動小数点型の種々の限界及びパラメタに展開する幾つかのマクロを定義する。フリースタンディング環境で利用可能。 |

## プラグマ

## 型

## マクロ

| 名前 | 機能 |
|:---|:---|
| DECIMAL_DIG [^1]     | 最大精度の浮動小数点型で表現できる 10 進での桁数。 |
| FLT_EVAL_METHOD [^1] | double、float、long double の演算方法。 |
| FLT_RADIX            | 指数表現における基数。 |
| FLT_ROUNDS           | 浮動小数点数の丸めの方法。 |


| double | float | long double | 機能 |
|:---|:---|:---|:---|
| DBL_DIG          | FLT_DIG          | LDBL_DIG         | 10 進数での有効桁数 |
| DBL_EPSILON      | FLT_EPSILON      | LDBL_EPSILON     | 判別限界の最小正値<br>(計算機イプシロン)  |
| DBL_MANT_DIG     | FLT_MANT_DIG     | LDBL_MANT_DIG    | 仮数部のビット数 |
| DBL_MAX          | FLT_MAX          | LDBL_MAX         | 正の最大数 |
| DBL_MAX_10_EXP   | FLT_MAX_10_EXP   | LDBL_MAX_10_EXP  | 10 の指数の最大値 |
| DBL_MAX_EXP      | FLT_MAX_EXP      | LDBL_MAX_EXP     | FLT_RADIX の指数の最大値 |
| DBL_MIN          | FLT_MIN          | LDBL_MIN         | 正の最小数 |
| DBL_MIN_10_EXP   | FLT_MIN_10_EXP   | LDBL_MIN_10_EXP  | 10 の指数の最小値 |
| DBL_MIN_EXP      | FLT_MIN_EXP      | LDBL_MIN_EXP     | FLT_RADIX の指数の最小値 |

**See also:**

 - [計算機イプシロン (Wikipedia)](https://ja.wikipedia.org/wiki/%E8%A8%88%E7%AE%97%E6%A9%9F%E3%82%A4%E3%83%97%E3%82%B7%E3%83%AD%E3%83%B3)
 - [浮動小数点定数の制限 (learn.microsoft.com)](https://learn.microsoft.com/ja-jp/cpp/c-language/limits-on-floating-point-constants?view=msvc-170)

## 引数付きマクロ

## 関数

## 資料

 - [C 言語 / 標準ライブラリ / float.h (Wikibooks)](https://ja.wikibooks.org/wiki/C%E8%A8%80%E8%AA%9E/%E6%A8%99%E6%BA%96%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA/float.h)
 - [z/OS C/C++ ランタイム・ライブラリー・リファレンス float.h &#x2014; 浮動小数点データ型の ISO C/C++ 定数 (IBM)](https://www.ibm.com/docs/ja/zos/3.1.0?topic=chf-floath-iso-cc-constants-floating-point-data-types)
 - [C 言語の標準ヘッダ一覧 float.h (C 言語)](http://www.c-lang.org/detail/float_h.html)


---

[&#x21E6; インデックスへ](https://qiita.com/ht_deko/items/31f4b37daa97270e2416)


[^1]: C99 で追加された。
【C++Builder】C ランタイムライブラリリファレンス (fenv.h)

# 浮動小数点環境 (Floating-Point Environment)

| ヘッダ<br>ファイル | [fenv.h](https://docwiki.embarcadero.com/RADStudio/ja/Fenv.h%EF%BC%9A%E3%82%A4%E3%83%B3%E3%83%87%E3%83%83%E3%82%AF%E3%82%B9) |
|:---|:---|
| 規格 | C99 |
| 概要 | 浮動小数点環境（floating-point environment）へのアクセス手段を提供するための 2 つの型、幾つかのマクロ及び幾つかの関数を宣言する。 |

## プラグマ

| 名前 | 機能 | デフォルト |
|:---|:---|:---:|
| FENV_ACCESS | 浮動小数点環境にアクセスするか？ または<br>規定以外の浮動小数点制御モードで実行されるか？ | 処理系定義 |

:::note
`#pragma STDC FENV_ACCESS ON` は浮動小数点モードを変更する可能性がある事を処理系に伝えます。これにより、浮動小数点演算に関する最適化を可能にします。[FP_CONTRACT プラグマ](https://qiita.com/ht_deko/items/8d27e3713d2b8ecd3f33#%E3%83%97%E3%83%A9%E3%82%B0%E3%83%9E)に影響するかもしれません。
:::

## 型

| 名前 | 機能 |
|:---|:---|
| fenv_t | 浮動小数点環境全体 |
| fexcept_t | 浮動小数点状態フラグの集合 |

## マクロ

### 例外

| 名前 | 機能 |
|:---|:---|
| FE_DIVBYZERO  | 0 除算例外 |
| FE_INEXACT    | 不正確例外 |
| FE_INVALID    | 無効例外 |
| FE_OVERFLOW   | オーバーフロー例外 |
| FE_UNDERFLOW  | アンダーフロー例外 |
| FE_ALL_EXCEPT | すべての例外 (全体集合) |

### 丸め

| 名前 | 機能 |
|:---|:---|
| FE_DOWNWARD   | 下方向への丸め |
| FE_TONEAREST  | 近いものへの丸め |
| FE_TOWARDZERO | 0 方向への丸め |
| FE_UPWARD     | 上方向への丸め |

### 環境

| 名前 | 機能 |
|:---|:---|
| FE_DFL_ENV    | デフォルトの浮動小数点環境 |


## 引数付きマクロ

## 関数

| 名前 | 機能 |
|:---|:---|
| feclearexcept()   | 引数 excepts で指定した浮動小数点例外をクリアします |
| fegetexceptflag() | 引数 excepts で指定したステータスフラグを引数 flagp で指定したオブジェクトに格納します |
| feraiseexcept()   | 引数 excepts で指定した浮動小数点例外を発生させます |
| fesetexceptflag() | 引数 flagp で指定したオブジェクトに格納されている状態を引数 excepts で指定したステータスフラグに設定します |
| fetestexcept()    | 引数 excepts で指定した浮動小数点例外フラグのサブセットのうち、どれが現在設定されているかを判定します |
| fegetround()      | 現在の丸め方向を取得します |
| fesetround()      | 引数 round で表される丸め方向に設定します |
| fegetenv()        | 現在の浮動小数点環境を envp が指すオブジェクトに格納します |
| feholdexcept()    | 引数 envp が指すオブジェクトに現在の浮動小数点環境を保存し、ステータスフラグをクリアした後、ノンストップモード (浮動小数点例外時に続行) に移行します |
| fesetenv()        | envp が指すオブジェクトが表す浮動小数点環境の設定を試みます |
| feupdateenv()     | 現在発生している浮動小数点例外を自動変数に保存し、envp が指すオブジェクトが表す浮動小数点環境を設定してから、保存した浮動小数点例外の発生を試みます |

## 資料

 - [C 言語 / 標準ライブラリ / fenv.h (Wikibooks)](https://ja.wikibooks.org/wiki/C%E8%A8%80%E8%AA%9E/%E6%A8%99%E6%BA%96%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA/fenv.h)
 - [z/OS C/C++ ランタイム・ライブラリー・リファレンス fenv.h &#x2014; 浮動小数点環境 (IBM)](https://www.ibm.com/docs/ja/zos/3.1.0?topic=files-fenvh-floating-point-environment)
 - [C 言語の標準ヘッダ一覧 fenv.h (C 言語)](http://www.c-lang.org/detail/fenv_h.html)


---

[&#x21E6; インデックスへ](https://qiita.com/ht_deko/items/31f4b37daa97270e2416)

---
【C++Builder】C ランタイムライブラリリファレンス (errno.h)

# エラー (Error No)

| ヘッダ<br>ファイル | [errno.h](https://docwiki.embarcadero.com/RADStudio/ja/Errno.h%EF%BC%9A%E3%82%A4%E3%83%B3%E3%83%87%E3%83%83%E3%82%AF%E3%82%B9) |
|:---|:---|
| 規格 | ANSI C (C89) / C90 |
| 概要 | エラー条件の報告に関連する幾つかのマクロを定義する。  |

## プラグマ

## 型

## マクロ

| 名前 | 機能 |
|:---|:---|
| [errno](https://docwiki.embarcadero.com/RADStudio/ja/Errno%EF%BC%88C_%E3%83%A9%E3%83%B3%E3%82%BF%E3%82%A4%E3%83%A0%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9%EF%BC%89) | ライブラリルーチンが指定されたタスクの実行に失敗した場合にエラーメッセージを出力するために、perror によって使用されます |
| [EDOM](https://docwiki.embarcadero.com/RADStudio/ja/EDOM%EF%BC%8CERANGE%EF%BC%8Cdefines) | 定義域エラーのエラーコード (引数の範囲エラー) |
| EILSEQ [^1] | 文字のエンコーディングエラーのエラーコード (表現形式エラー) |
| [ERANGE](https://docwiki.embarcadero.com/RADStudio/ja/EDOM%EF%BC%8CERANGE%EF%BC%8Cdefines) | 値域エラーのエラーコード (戻り値の範囲エラー) |


**See also:**

 - [定義域 (Wikipedia)](https://ja.wikipedia.org/wiki/%E5%AE%9A%E7%BE%A9%E5%9F%9F)
 - [値域 (Wikipedia)](https://ja.wikipedia.org/wiki/%E5%80%A4%E5%9F%9F)
 - [FLP32-C. 数学関数における定義域エラーおよび値域エラーを防止または検出する (JPCERT/CC)](https://www.jpcert.or.jp/sc-rules/c-flp32-c.html)

## 引数付きマクロ

## 関数

## 資料

 - [C 言語 / 標準ライブラリ / errno.h (Wikibooks)](https://ja.wikibooks.org/wiki/C%E8%A8%80%E8%AA%9E/%E6%A8%99%E6%BA%96%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA/errno.h)
 - [z/OS C/C++ ランタイム・ライブラリー・リファレンス errno.h &#x2014; errno のシンボリック定数 (IBM)](https://www.ibm.com/docs/ja/zos/3.1.0?topic=files-errnoh-symbolic-constants-errno)
 - [C 言語の標準ヘッダ一覧 errno.h (C 言語)](http://www.c-lang.org/detail/errno_h.html)
 
---

[&#x21E6; インデックスへ](https://qiita.com/ht_deko/items/31f4b37daa97270e2416)


[^1]: C99 で追加された。
Next.jsでsrc/appディレクトリを使っている場合にサクッとBASIC認証つける

# 概要
Next.jsで作成したサイトを一部の人しか見れないようにするため、
大したものじゃなくて良いけど一応パスワードかけときたいなと思い、方法を検索。

Vercelのオプションでパスワード認証があったけど、高すぎる。
かといって`NextAuth.js`は正直難しそうだったため、`middleware`で簡易的な設定を決意。

しかし、検索してると出てくる情報が、
`middlewareフォルダ`を作って、そこに`middleware.ts`を置くべきあったり、
または、`pages/`下層に`middleware.ts`を置くとあるが、
`src/app`ディレクトリを使っている場合はどうすればええんや等、
初学者には色々と悩むポイントがあったのでここに備忘録としてまとめておく。


# 結論

src下層に`middleware.ts`を直接置けば機能する。

```text:ディレクトリ構成（おおよそのものを表示）
プロジェクトルート
│
├── public/             # 静的ファイル
│
├── src/                # ソースコード
│   ├── app/            # アプリケーションファイル
│   └── middleware.ts   # ミドルウェア（これ）
│
├── package.json        # パッケージ設定
└── tsconfig.json       # TypeScript設定
```

`middleware.ts`のコードは下記にすれば良い。

```ts:サンプルコード（パスワード直書きパターン）
// Next.jsのサーバーサイドルーティング機能から必要な型をインポート
import { NextRequest, NextResponse } from 'next/server';

// ミドルウェアの設定。全てのルート('/')でこのミドルウェアを適用
export const config = {
    matcher: ['/']
};

// ミドルウェア関数を定義。NextRequestオブジェクトを受け取る
export function middleware(request: NextRequest) {
    // リクエストヘッダーからauthorizationを取得
    const basicAuth = request.headers.get('authorization');

    if (basicAuth) {
        // Basic認証の値をデコードしてユーザー名とパスワードを取得
        const authValue = basicAuth.split(' ')[1];
        const [user, password] = atob(authValue).split(':');

        // 正しいユーザー名とパスワードが提供された場合、リクエストを次の処理へ進める
        if (user === 'username' && password === 'password') {
            return NextResponse.next();
        }
    }

    // 認証に失敗した場合、リダイレクト応答を返す
    // ここでリダイレクト先のURLを指定します。例えば、'/'へのリダイレクト
    return NextResponse.redirect('/');
}
```

環境変数から取得する場合は下記。
（もちろんこちらの方が良い）

```ts:.サンプルコード（env.localから取得する場合）
// Next.jsのサーバーサイドルーティング機能から必要な型をインポート
import { NextRequest, NextResponse } from 'next/server';

// ミドルウェアの設定。全てのルート('/')でこのミドルウェアを適用
export const config = {
    matcher: ['/']
};

// ミドルウェア関数を定義。NextRequestオブジェクトを受け取る
export function middleware(request: NextRequest) {
    // リクエストヘッダーからauthorizationを取得
    const basicAuth = request.headers.get('authorization');

    if (basicAuth) {
        // Basic認証の値をデコードしてユーザー名とパスワードを取得
        const authValue = basicAuth.split(' ')[1];
        const [user, password] = atob(authValue).split(':');

        // 環境変数から正しいユーザー名とパスワードを取得
        const envUser = process.env.AUTH_USER;
        const envPassword = process.env.AUTH_PASSWORD;

        // 環境変数の値と一致する場合、リクエストを次の処理へ進める
        if (user === envUser && password === envPassword) {
            return NextResponse.next();
        }
    }

    // 認証に失敗した場合、リダイレクト応答を返す
    // ここでリダイレクト先のURLを指定します。例えば、'/'ページへのリダイレクト
    return NextResponse.redirect('/');
}
```

# 結果
ローカル環境であってもVercel環境であっても認証を求められるようになった。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211946/9fedb377-a91b-12de-a341-88a37346490c.png)
【C++Builder】C ランタイムライブラリリファレンス (ctype.h)

# 文字操作 (Character Type)

| ヘッダ<br>ファイル | [ctype.h](https://docwiki.embarcadero.com/RADStudio/ja/Ctype.h%EF%BC%9A%E3%82%A4%E3%83%B3%E3%83%87%E3%83%83%E3%82%AF%E3%82%B9) |
|:---|:---|
| 規格 | ANSI C (C89) / C90 |
| 概要 | 文字の分類及び文字の変換に有用な幾つかの関数を宣言する。 |

:::note
ワイド文字対応のライブラリ ([wctype.h](https://qiita.com/ht_deko/items/eee62d5208c7718af606)) もあります。
:::


## プラグマ

## 型

## マクロ

## 引数付きマクロ

## 関数

| 名前 | 機能 |
|:---|:---|
| [isalnum()](https://docwiki.embarcadero.com/RADStudio/ja/Isalnum%E3%80%81iscsym%E3%80%81iswalnum%E3%80%81ismbcalnum) | 英数字かどうかをテストします |
| [isalpha()](https://docwiki.embarcadero.com/RADStudio/ja/Isalpha%EF%BC%8C_iscsymf%EF%BC%8Ciswalpha%EF%BC%8C_ismbcalpha) | 英文字かどうかをテストします |
| isblank() [^1] | ブランク文字 (水平タブ, 空白) かどうかをテストします |
| [iscntrl()](https://docwiki.embarcadero.com/RADStudio/ja/Iscntrl%EF%BC%8Ciswcntrl) | 制御文字かどうかをテストします |
| [isdigit()](https://docwiki.embarcadero.com/RADStudio/ja/Isdigit%EF%BC%8Ciswdigit%EF%BC%8C_ismbcdigit) | 10 進数文字かどうかをテストします |
| [isgraph()](https://docwiki.embarcadero.com/RADStudio/ja/Isgraph%EF%BC%8Ciswgraph%EF%BC%8C_ismbcgraph) | 表示可能文字かどうかをテストします (空白を含まない) |
| [islower()](https://docwiki.embarcadero.com/RADStudio/ja/Islower%EF%BC%8Ciswlower%EF%BC%8C_ismbclower) | 小文字かどうかをテストします |
| [isprint()](https://docwiki.embarcadero.com/RADStudio/ja/Isprint%EF%BC%8Ciswprint%EF%BC%8C_ismbcprint) | 表示可能文字かどうかをテストします (空白を含む) |
| [ispunct()](https://docwiki.embarcadero.com/RADStudio/ja/Ispunct%EF%BC%8Ciswpunct%EF%BC%8C_ismbcpunct) | 区切り文字かどうかをテストします |
| [isspace()](https://docwiki.embarcadero.com/RADStudio/ja/Isspace%EF%BC%8Ciswspace%EF%BC%8C_ismbcspace) | 空白文字かどうかをテストします |
| [isupper()](https://docwiki.embarcadero.com/RADStudio/ja/Isupper%EF%BC%8Ciswupper%EF%BC%8C_ismbcupper) | 大文字かどうかをテストします |
| [isxdigit()](https://docwiki.embarcadero.com/RADStudio/ja/Isxdigit%EF%BC%8Ciswxdigit) | 16 進数文字かどうかをテストします |
| [tolower()](https://docwiki.embarcadero.com/RADStudio/ja/Tolower%EF%BC%8C_mbctolower%EF%BC%8Ctowlower) | 文字を小文字に変換します |
| [toupper()](https://docwiki.embarcadero.com/RADStudio/ja/Toupper%EF%BC%8C_mbctoupper%EF%BC%8Ctowupper) | 文字を大文字に変換します |

## 資料

 - [C 言語 / 標準ライブラリ / ctype.h (Wikibooks)](https://ja.wikibooks.org/wiki/C%E8%A8%80%E8%AA%9E/%E6%A8%99%E6%BA%96%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA/ctype.h)
 - [z/OS C/C++ ランタイム・ライブラリー・リファレンス ctype.h &#x2014; 文字種別 (IBM)](https://www.ibm.com/docs/ja/zos/3.1.0?topic=files-ctypeh-character-classification)
 - [C 言語の標準ヘッダ一覧 ctype.h (C 言語)](http://www.c-lang.org/detail/ctype_h.html)


---

[&#x21E6; インデックスへ](https://qiita.com/ht_deko/items/31f4b37daa97270e2416)

[^1]: C99 で追加された。
ECSのCPU使用率が100%を超える理由

# はじめに

AWSのCloudWatchメトリクスでECSのCPU使用率を見ていて、CPU使用率と一言で言っても種類があったり、CPU使用率が100%を超えていることがあって一体どうなっているのかと思ったりしたので、ECSのCPU使用率について整理した。


# ECSのCPU使用率は2種類

ECSのCPU使用率は2種類ある。

#### ①クラスターCPU使用率
クラスターのタスクが使用しているCPUユニット数の合計 ×100 / クラスターのコンテナインスタンスに登録されているCPUユニット数の合計

▼CloudWatchメトリクスで選択するディメンション
・ClusterName

#### ②サービスCPU使用率
タスクが使用しているCPUユニット数の合計 ×100 / （タスクが予約しているCPUユニット数の合計×タスク数）

▼CloudWatchメトリクスで選択するディメンション
・ClusterName
・ServiceName


# クラスターCPU使用率の注意点

クラスターCPU使用率は、あくまでコンテナインスタンス全体で利用可能なCPUユニット数のうち、ECSタスクが利用しているCPUユニット数のことであって、インスタンスでECSタスク以外に動いている処理、例えばインスタンスのOS自体が使用しているCPUユニット数は含まれない。

そのため、クラスターCPU使用率は、コンテナインスタンスのインスタンス自体のCPU使用率とイコールではない点に注意が必要である。


# サービスCPU使用率が100%を超える事象

サービスCPU使用率は、100%を大きく超えることがある。場合によっては1000%を超えることもある。

これはなぜかというと、コンテナインスタンスのCPUユニット数に空きがある場合、タスクがそのCPU予約ユニット数を超えてCPUを使用できるからである。

例えば、登録されているCPUユニット数が2048であるコンテナインスタンス上で、CPU予約ユニット数が128であるタスクAを1つ起動しているとする。
このとき、タスクA以外に起動しているタスクがない場合、タスクAは自身が予約しているCPUユニット数128を超えて、最大でコンテナインスタンスが持つCPUユニット数2048を使用することが可能となる。
このとき、サービスCPU使用率は1600%（2048 / 128）、クラスターCPU使用率は100%（2048 / 2048）となる。

これは飲食店をイメージすると理解しやすい。例えば50席ある店に5人で行こうと思い、5席予約したとする。5席分は予約しているので、5人は確実に入店することができるが、もし他に客が1人もおらず席が空いている場合、さらに知り合いを呼んで、空いている席をすべて使うことができる。

このようにして、コンテナインスタンスのCPUに空きがある場合に、あらかじめ予約した分を超えてCPUを使用できるため、サービスCPU使用率が100%を超えることがあり得る。


# 最後に

AWSでECSのCPU使用率を確認する際はぜひ参考にしてください。
【メモ】Ruby3.3.0をDebian12にインストールするためのコマンド集

## はじめに
AWSのLightsailにてインスタンスを作成し、Rubyの学習環境を構築したいと思い、様々なサイトを見て回りながらついにインストールに成功したので、その時に打ち込んだコマンドを全て以下にまとめました。
未検証ですが、Debianと同じ系統のUbuntuでも使えるかと思います。

## コマンド
コマンドのアップグレード、Gitのインストール。
GitはHomebrewのインストールに必要。
```
$ sudo apt update && sudo apt upgrade
$ sudo apt-get install git-all
```
Homebrewのインストール。
以下の公式サイトを参照。
https://brew.sh/ja/
```
$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
$ (echo; echo 'eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"') >> /home/admin/.bashrc
$ eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"
$ sudo apt-get install build-essential
$ brew install gcc
```
rbenvと必要パッケージのインストールをしてからrubyの最新バージョンのインストールを実行。

```
$ brew install rbenv
$ sudo apt-get install libz-dev
$ sudo apt-get install libffi-dev
$ brew install openssl
$ rbenv install 3.3.0
```
ちなみに以下のコマンドでインストール可能な最新のバージョンを確認できる。
```
$ rbenv install -list
```

## 参照サイト
https://qiita.com/gostachan/items/c3c9b88f120d0c2dce96
https://zenn.dev/tmasuyama1114/articles/rbenv-switch-ruby-versions
https://stackoverflow.com/questions/36374267/how-to-fix-fatal-error-zlib-h-no-such-file-or-directory
https://stackoverflow.com/questions/16248775/cmake-not-able-to-find-openssl-library
【C++Builder】C ランタイムライブラリリファレンス (complex.h)

# 複素数計算 (Complex)

| ヘッダ<br>ファイル | [complex.h](https://docwiki.embarcadero.com/RADStudio/ja/Complex.h%EF%BC%9A%E3%82%A4%E3%83%B3%E3%83%87%E3%83%83%E3%82%AF%E3%82%B9) |
|:---|:---|
| 規格 | C99 |
| 概要 | 複素数計算をサポートする幾つかのマクロを定義し、幾つかの関数を宣言する。 |

**See also:**

 - [複素数 (Wikipedia)](https://ja.wikipedia.org/wiki/%E8%A4%87%E7%B4%A0%E6%95%B0)


## プラグマ

| 名前 | 機能 | デフォルト |
|:---|:---|:---:|
| CX_LIMITED_RANGE | 複素数演算に対する数学公式の使用 | OFF |

:::note
`#pragma STDC CX_LIMITED_RANGE ON` は複素数演算において一般的な数学公式を利用可能であると処理系に伝えます。複素数演算で (内部的に) 数学公式が使われると、中間式において無限大・オーバーフロ・アンダーフロー発生の可能性があります。
:::

## 型

## マクロ

| 名前 | 機能 |
|:---|:---|
| complex | 予約語 `_Complex` のエイリアス |
| _Complex_I | 虚数の `0+1i` を示す定数 (const float _Complex) |
| imaginary | 予約語 `_Imaginary` のエイリアス|
| _Imaginary_I | 虚部の `1i` を示す定数 (const float _Imaginary) |
| I | _Imaginary_I または _Complex_I に展開される、<br>虚数の `0+1i` を示す定数 (const float _Complex)|

## 引数付きマクロ

## 関数

| double | float | long double | 機能 |
|:---|:---|:---|:---|
| csin()  | csinf()  | csinl()       | 複素数正弦  |
| ccos()  | ccosf()  | ccosl()       | 複素数余弦  |
| ctan()  | ctanf()  | ctanl()       | 複素数正接  |
| casin()  | casinf()  | casinl()    | 複素数逆正弦  |
| cacos()  | cacosf()  | cacosl()    | 複素数逆余弦  |
| catan()  | catanf()  | catanl()    | 複素数逆正接  |
| csinh()  | csinhf()  | csinhl()    | 複素数双曲線正弦  |
| ccosh()  | ccoshf()  | ccoshl()    | 複素数双曲線余弦  |
| ctanh()  | ctanhf()  | ctanhl()    | 複素数双曲線正接  |
| casinh()  | casinhf()  | casinhl() | 複素数逆双曲線正弦  |
| cacosh()  | cacoshf()  | cacoshl() | 複素数逆双曲線余弦  |
| catanh()  | catanhf()  | catanhl() | 複素数逆双曲線正接  |
| cexp()  | cexpf()  | cexpl()       | 複素数指数  |
| clog()  | clogf()  | clogl()       | 複素数自然対数  |
| cabs()  | cabsf()  | cabsl()       | 複素数絶対値  |
| cpow()  | cpowf()  | cpowl()       | 複素数累乗  |
| csqrt()  | csqrtf()  | csqrtl()    | 複素数平方根  |
| carg()  | cargf()  | cargl()       | 複素数偏角  |
| cimag()  | cimagf()  | cimagl()    | 複素数虚部  |
| cconj()  | cconjf()  | cconjl()    | 共役複素数  |
| cproj()  | cprojf()  | cprojl()    | リーマン射影  |
| creal()  | crealf()  | creall()    | 複素数実部 |

:::note info
引数 / 戻り値の型 (`double complex`, `float complex`, `long double complex`) によって関数名が異なります。この煩わしさを回避するために  **型総称数学関数** ([tgmath.h](https://qiita.com/ht_deko/items/28042d097f5054c2e45a)) が用意されています。
:::


## 資料

 - [C 言語 / 標準ライブラリ / complex.h (Wikibooks)](https://ja.wikibooks.org/wiki/C%E8%A8%80%E8%AA%9E/%E6%A8%99%E6%BA%96%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA/complex.h)
 - [z/OS C/C++ ランタイム・ライブラリー・リファレンス complex.h &#x2014; 複素数学関数 (IBM)](https://www.ibm.com/docs/ja/zos/3.1.0?topic=files-complexh-complex-math-functions)
 - [C 言語の標準ヘッダ一覧 complex.h (C 言語)](http://www.c-lang.org/detail/complex_h.html)


---

[&#x21E6; インデックスへ](https://qiita.com/ht_deko/items/31f4b37daa97270e2416)

---
【C++Builder】C ランタイムライブラリリファレンス (assert.h)

# 診断機能 (Assert)

| ヘッダ<br>ファイル | [assert.h](https://docwiki.embarcadero.com/RADStudio/ja/Assert.h%EF%BC%9A%E3%82%A4%E3%83%B3%E3%83%87%E3%83%83%E3%82%AF%E3%82%B9) |
|:---|:---|
| 規格 | ANSI C (C89) / C90 |
| 概要 | assert マクロを定義し、マクロ NDEBUG を参照する。 |

## プラグマ

## 型

## マクロ

## 引数付きマクロ

| 名前 | 機能 |
|:---|:---|
| [assert()](https://docwiki.embarcadero.com/RADStudio/ja/Assert) | 条件をテストし、場合により実行を中止します |

**See also:**

 - [#define NDEBUG (DocWiki)](https://docwiki.embarcadero.com/RADStudio/ja/NDEBUG_define)

## 関数

## 資料

 - [C 言語 / 標準ライブラリ / assert.h (Wikibooks)](https://ja.wikibooks.org/wiki/C%E8%A8%80%E8%AA%9E/%E6%A8%99%E6%BA%96%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA/assert.h)
 - [z/OS C/C++ ランタイム・ライブラリー・リファレンス assert.h &#x2014; 診断の挿入 (IBM)](https://www.ibm.com/docs/ja/zos/3.1.0?topic=files-asserth-insert-diagnostics)
 - [C 言語の標準ヘッダ一覧 assert.h (C 言語)](http://www.c-lang.org/detail/assert_h.html)

---

[&#x21E6; インデックスへ](https://qiita.com/ht_deko/items/31f4b37daa97270e2416)

---
マイクラをPythonでプログラムできるようにする


# 概要
pythonでマイクラをうごかしてみようとググりつつ、古い記事だったり、手順が詳細でなかったり、バージョンが不明瞭でうごかなかったりだったため、現時点（2024年2月）で動くまでもっていたっため備忘録として残しておきます

## 前提条件
Windows環境で、マイクラJAVA版はインストール済みの前提の手順になります

現バージョンですでにワールドを作成している場合は事前に退避しておかないと壊れる可能性ありのため仮にワールドを作成している場合は注意が必要です
今回の手順はまっさらな状態で設定したため、そこらへんは記載していません（実施しなかったため）

## 導入方針
マイクラから指定バージョンでワールドを作成します
pythonのModの対応が最も最新でマイクラのVer 1.12.2 のため、それにひきづられModも同一バージョンで構成しています
上記でないとうまくいかなかったため

## pythonインストール
下記からpython3.8系をダウンロードしインストール
※インストールシールドのPATH設定にチェックを入れる
https://www.python.org/downloads/release/python-3917/
※併せてpythonのバージョンもサンプルが動かないケース懸念ありのためリリース時期のバージョンにそろえておく（最新でも動く可能性はあるが未確認）

## javaランタイムをインストール
「Minecraft Forge」インストールの際に必要のため、入っていない場合は事前にインストールしておく
https://www.java.com/en/download/

## Minecraft Forgeをインストール
pythonのMod対応の最新が「1.12.2」のため、「1.12.2」をダウンロードしインストール
https://files.minecraftforge.net/net/minecraftforge/forge/index_1.12.2.html
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172093/d891f117-c035-862a-149d-b62cb76f06fa.png)
※Ver1.12.2から更新がおこなわれていない

デフォルト「client」選択でインストール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172093/e7fdb90a-62fd-8b07-9d67-d982385e96b6.png)


## Rasberry jam Modを導入

下記から対象をダウンロード

https://github.com/arpruss/raspberryjammod/releases
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172093/d010875f-3dad-ef04-a8cb-c64ccd0d208b.png)

### Rasberry jam Modを配置
「mods.zip」を解凍し対象バージョンのフォルダ「1.12.2」内ファイル「RaspberryJamMod.jar」を下記のマイクラディレクトリの配下「mods」フォルダに配置
C:\...\AppData\Roaming\.minecraft\mods
※「mods」フォルダはMinecraft Forgeをインストールした際に作成される
※ マイクラフォルダのパスがわからない場合
   マイクラランチャー「MINECRAFT JAVA Edition」を選択
   「起動構成」を選択し「新規作成」ボタンを押下で、ゲームディレクトリ項目の「参照」ボタン押下のデフォルト選択ディレクトリから確認可能

### pythonスクリプト群を配置
併せて「python-scripts.zip」を解凍し「mcpipy」ディレクトリごと下記のマイクラディレクトリの直下に配置
C:\...\AppData\Roaming\.minecraft

## Minecraft Forgeの起動構成を作成

マイクラランチャー「MINECRAFT JAVA Edition」を選択
「起動構成」を選択し「新規作成」ボタンを押下
名前欄に任意の名前を設定（下記例では「forge」の名称で作成）
バージョン欄で先ほどインストールしたMinecraft Forge(Ver 1.12.2)があるので選択
その他はそのままで「作成」ボタンを押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172093/c42adb1e-f48f-9423-0b44-0c327ad38572.png)

## マイクラからpythonコマンドを実行
先ほど作成したMinecraft Forge」の起動構成の「プレイ」ボタンを押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172093/16bac93c-1cd6-7afe-b73e-ea14aa94384e.png)

「ワールド新規作成」でワールドを作成し「選択したワールドで遊ぶ」でワールドに入る
※マイクラアプリ内の操作のため詳細な説明は割愛しています
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172093/3426615e-e4c6-04ba-0c83-57d891f29bf2.png)

## pythonソースコードを実行

実行したいpythonコードをpythonスクリプト群のディレクトリに配置する
C:\...\AppData\Roaming\.minecraft\mcpipy

マイクラのコマンドプロンプトから下記のコマンドを実施する
```
/py 実行したいpythonファイル名
```
※拡張子.pyは不要

実際に実行するとどうなるかをサンプルコマンドを実行してみる

例としてお城を生成できるコマンドを実施
```
/py castle
```
と打つと下記のようにオブジェクトが生成される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172093/1ab11040-537e-3afc-a1b1-d8a09d784d08.png)

その他、下記もオブジェクト生成を確認（ほかにもあるとおもいます）
チェス　chess
時計　clock
らせん dna
たまど egg
ちきゅう earth
ドーナツ donut
AstropyでFITSファイルの画像とWCS座標をスライスして保存する方法

## はじめに
データ解析や観測結果の処理において、領域をスライスすることは一般的な作業ですが、そのスライスに対応するようにWCS（World Coordinate System）座標を取得したい場合があります。

本記事では、PythonのライブラリであるAstropyを使用して、FITSファイルからデータをスライスし、新しいFITSファイルに保存する方法について説明します。

## 方法

```python
import numpy as np
from astropy.io import fits
from astropy.wcs import WCS
from datetime import datetime

# FITSファイルのパス
infile = 'infile.fits'

# FITSファイルを開く
hdul = fits.open(infile)

# データとWCS情報を取得
image = hdul[0].data
wcs = WCS(hdul[0].header)

# データをスライスするための範囲を定義
view = (slice(100, 151, 1), slice(10, 61, 1))

# データをスライス
sliced_image = image[view]

# WCSをスライスに合わせて更新
sliced_wcs = wcs[view]

# ヒストリー情報を更新
history = "Data sliced using NumPy. Original data shape: {}. Sliced shape: {}. Date: {}".format(image.shape, sliced_image.shape, datetime.now().isoformat())

# 元のヘッダー情報をコピー
original_header = hdul[0].header.copy()

# 新しいFITSファイルにデータとWCS情報を書き込む
outfile = 'outfile.fits'
sliced_hdul = fits.PrimaryHDU(data=sliced_image, header=original_header)
sliced_hdul.header.extend(sliced_wcs.to_header(), update=True)  # WCS情報をヘッダーに追加
sliced_hdul.header.add_history(history)  # ヒストリー情報を追加
sliced_hdul.writeto(outfile, overwrite=True)
```

コードの説明
- 必要なライブラリをインポート
- FITSファイルを開いて、データとWCS情報を取得
- データをスライスするための範囲を定義し、その範囲でデータをスライスします。WCS情報もスライスに合わせて更新
（この例では、スライスの範囲を`[100:151, 10:61:1]`と指定していますが、`sliced_image = image[100:151:1, 10:61:1]`や`sliced_wcs = wcs[100:151:1, 10:61:1]`と書いても同じ結果が得られます。ただ、同じスライス内容を2度書くことは誤解を招く恐れや可読性を下げるため、一つのスライスオブジェクトを使用して書いています。スライスオブジェクトについての説明は、[Pythonのスライスはコロン":"だけじゃない？slice()の活用法](https://qiita.com/yusuke_s_yusuke/items/fc065f7a0ac0d4e3325e)をご覧ください。）
- ヒストリー情報を更新し、新しいFITSファイルにデータとWCS情報を書き込む
- FITSファイルからデータをスライスし、新しいFITSファイルに保存

## 補足: wcs.slice()を使った書き方
``wcs.slice()``メソッドを使用してWCS情報を更新する方法もあります。
```python
# WCSをスライスに合わせて更新
# sliced_wcs = wcs[view]  # numpy_order=Trueの場合、通常のスライスと同じ意味
sliced_wcs = wcs.slice(view, numpy_order=True)
```
`numpy_order=False`に設定すると、WCSはFITS順序でスライスされます。つまり、最初のスライスは、最後のnumpyインデックスに適用されますが、最初のWCS軸に適用されます。

詳しくは[Astropyの公式ドキュメント](https://docs.astropy.org/en/stable/api/astropy.wcs.WCS.html#astropy.wcs.WCS.slice)をご覧ください。

## まとめ
本記事では、Astropyを使用してFITSファイルからデータとWCS座標をスライスし、新しいFITSファイルに保存する方法を説明しました。スライス操作を使用することで、任意の領域のデータを抽出し、解析することが容易になります。また、WCS情報も適切に更新することで、空間座標系の情報を保持したままデータを操作できます。
弱小エンジニアが語るインターンに参加してこれだけは意識しておいて欲しいこと

# はじめに

どうもGadgeloggerだ。前回俺はこんな記事を書いた

https://qiita.com/gadgelogger/items/688c4b146611e610e5c6

今回の記事はこの続き的な感じやで。

# 対象読者
対象とする読者は以下のようにするで。

- インターンに受かった人
- コレからインターン選考を受けようとしている人
- 受かったけど、自分の技術力で業務をこなせるか心配ま人
- 技術力に自信がない人

。。。だいたいこんな感じかな。自分は上の全てにあてはまっているわ。

# その1 挨拶をする
いやいやいやいやwwwwww急にどうしたwwwwwと思うかもしれないがこれは本当に大切。

とりあえずもし対面でのインターンで出社した場合、視界に入った人全員に
「こんにちは！」
と挨拶をしておこう。初対面でコレができていれば社内の人やメンターの方に好印象を与えることができるし、円滑なコミュニケーションを取ることができる。

また印象に残りやすいから、挨拶をした時は別になんともなくても後々メリットにメリットになって帰ってくるはずやで。

意外と挨拶ができる人っているようであまりいないんだよね。

# その2 与えられたタスクに全力で取り組む

当たり前だけど、お金をもらっている（と思う）のでちゃんと与えられたタスクは全力で取り組もう。
メンターや周りの人はしっかりと取り組み方を見ているよ。

特にオンラインのインターンの人は要注意

# その3　15分考えてわからなかったら人に聞く

これは前回の記事でも話してたんやけど、１５分ルールってやつやな。
個人的に一番意識してほしいのはこの考え方だと思うわ。

できなくてずっと考え続けて、終業時刻になって成果があまり出なかった....ではホンマ勿体無いからね。

「自分技術力無いし・・・こんな初歩的な質問するの恥ずかしいな・・・・」
と思ってしまうかもしれない（過去の俺がそれだった）が、人に聞くってことも大切やで？

大抵の場合、メンターの方々は親切に答えてくれるはず。

【質問の仕方がわからない人は以下の記事が参考になると思う】
https://qiita.com/seki_uk/items/4001423b3cd3db0dada7

https://qiita.com/KNR109/items/550b52ff980c0c32bf2a

# その４　定期的に自分の今やっていること・考えていることをSlackに書き込む

多分インターンに参加している場合、コミュニケーションツールはSlackだと思う。
その場合、大抵「times_gadgelogger」みたいに自分専用のチャンネルがあるはずだ。

そこに業務中に悩んでいること・考えていることをメモがわりでいいからガンガン書き殴ろう。
自分の場合は
- 今このタスクを行なっている
- しかしこの部分の実装がよくわからない
- これを調べてみたが、いまいち理解できない

など思ったこと頭によぎったことをリアルタイムでじゃんじゃん書きなぐっていた。
こうすることで、周りに自分の現状を共有することができるので、メンターの方から的確にアドバイスをもらえるし、質問するときに流れがスムーズになる。

# できなくても焦らない

一番最初に思う悩みがこれなんじゃ無いのかな？
インターンに参加すると周りのレベルの高さに驚くと思う。自分より圧倒的に技術力・学力が高い人がいて怖気付くかもしれん。

。。。けど安心してほしい。インターンに参加できている（選考を通過できている）時点で素晴らしいと思うので自分に自信を持って業務に取り組んでほしいね。

あとみんな初めは初心者ってことも忘れずに。



# (まとめ)業務中の行動は早期選考に関係する
なんでこの記事を書いたかっていうと、最終的な理由はコレだね。
インターンの業務中の行動は全部人事の方やメンターの方が記録していたりする。

見ているポイントは
- 業務への取り組み方(技術力が低くても一生懸命頑張っているか？)
- 人間性
- コミュニケーション力(質問の仕方とかな）
- 会社にマッチしているかどうか
の３点だと思う。（だから挨拶とか当たり前のことを書いたんよ）

結果によってはインターン終了後に人事の方から
「gadgeloggerさんは最終面接からご案内します」だとかいきなり内々定をもらえることもあるのでインターンはまじで頑張るべき。

できないならできないなりにがむしゃらに頑張っていれば、何かしら恩恵は受けれると思うし、メンターや人事の方々はしっかりと見ていてくれているはずやで。


インターンは選考とあまり関係ない・・・と言う人もいるけど、ガッチガチの選考だからそこは意識しておいてほしい。
GPU使用率の取得方法【C#】

# はじめに

こんにちは。
ジョジョ好きなXRクリエイターの [もふるね](https://twitter.com/mofurune_k) です。

今回は[CPU使用率をOSC通信でVRChatに送って、アバターの色を変化させてみた](https://qiita.com/mofurune/items/a401f7f16454551c8591)の続きです。

VRChatを遊ぶ際に、CPUとGPUのどちらに負荷がかかるのか疑問に思ったある日。
知人に聞くと、GPUの影響のほうが大きいらしい。
ふぅん、それならGPU使用率のデータを使って遊んでみたいな～。
それじゃ、GPU使用率を取得してみようっ！


# 結果

<blockquote class="twitter-tweet" data-media-max-width="560"><p lang="ja" dir="ltr">GPU使用率をOSC通信でVRChatに送って、アバターの色を変化させてみた <a href="https://t.co/nLKN1XN65Y">pic.twitter.com/nLKN1XN65Y</a></p>&mdash; もふるね𓇶 (@mofurune_k) <a href="https://twitter.com/mofurune_k/status/1757777935560475098?ref_src=twsrc%5Etfw">February 14, 2024</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 

OSCを使ったアバターの色変化は[前回の記事](https://qiita.com/mofurune/items/a401f7f16454551c8591)で解説してるから気になる人は見てくれよな！


# GPU使用率の取得

取得方法を調べてみると、この記事が見つかった。
[C# - Get total usage of GPU in percentage](https://stackoverflow.com/questions/56830434/c-sharp-get-total-usage-of-gpu-in-percentage)
どうやら、CPU使用率を取得したときと同様に、パフォーマンスカウンターを使うといいみたい。
取得方法は以下の通り
- パフォーマンスカウンター内の"GPU Engine"というカテゴリーをリストに収納
- リストから "entype_3D" という名前のついたものを抽出
- 更に "Utilization Percentage" の名前のものを抽出（これでリストに100個くらいの数値が収納される）
- 抽出された数値をすべて合計して導出された値が、GPU使用率だ！

コードで書くとこんなふう
```cs:
using System.Diagnostics;

//パフォーマンスカウンターから[GPU使用率の計算に使う値]を抽出し、リストに入れる
var category = new PerformanceCounterCategory("GPU Engine");
var counterNames = category.GetInstanceNames();
var gpuCounters = counterNames
                    .Where(counterName => counterName.EndsWith("engtype_3D"))
                    .SelectMany(counterName => category.GetCounters(counterName))
                    .Where(counter => counter.CounterName.Equals("Utilization Percentage"))
                    .ToList();

//GPU使用率を計算
float result = 0.0f;
float tmpValue = 0.0f;
foreach (PerformanceCounter gpuCounter in gpuCounters)
{
    tmpValue = gpuCounter.NextValue();
    result += tmpValue;
}

//GPU使用率を出力
Console.WriteLine($"GPU使用率: {result}");
```


# 振り返り

抽出するときのプログラムの構文、
こんなの→　.Where(? => ?)
初めて見た。LINQってものらしい。
簡単に書けて便利だねぇ～
\ﾃﾚﾚﾚｰ/（知識レベルが上がった！）
【VSCode】プラグイン集

# はじめに
VSCodeで実際に使用しているプラグインを記載していきます。
基本的に自分用のメモですが、誰かのお役に立てると嬉しいです。

# プラグインとは
VSCodeの通常機能に加えて、さまざな機能を補完できる拡張機能。
GUI:
Extensions（Ctrl+Shift+x）から検索を行い、インストール。
CUI:
code --list-extensions
code --install-extension [Extension ID]
code --uninstall-extension [Extension ID]


# プラグイン一覧

## HTML

### Prettier - Code formatter [esbenp.prettier-vscode]

### Auto Rename Tag [formulahendry.auto-rename-tag]

## VSCode
### Code Spell Checker [streetsidesoftware.code-spell-checker]

### Live Server [ritwickdey.liveserver]
Railsの学習を終えて

## 初めに
こんにちは、Railsの学習を終えました。そのRailsの学習で感じたことや思ったことなどを書いていきます。

## Railsの学習で思ったこと
Railsの学習で思ったことは、めっちゃ便利だなということです。クエリを書く必要もなければ、コマンドを打てばファイルが生成されるのはすごく便利でした。先月、フレームワークなしでログイン機能や投稿機能などを開発していたのでなおさら便利に感じます。

## Railsの学習で大変だったこと
Railsの学習で感じたことは、環境構築です。特にbundleに何かを追加しようとすると必ずエラーになり大変でした。

## Railsの学習でやったほうが良いと思ったこと
MVCの理解をしておいたほうがいいなと思いました。これが理解できていないとエラーが起きた時にどこをどう直したらいいのかわからなくなるのでどこがどうつながっているのかを理解しながらRailsを使っていくのがいいと思いました。

## 最後に
Railsを初めて触ったときこんなに便利なんだと感動しました。ぜひRailsを勉強しようと思っていたらまず、フレームワークなしでアプリを作ってからRailsで同じアプリを作ってみてください感動します。
VMWare Player 17でマルチモニタが機能しない

Version 16の時から発生しているようです。マルチモニタは認識しているのに反応しません。

パソコン返品だな・・・というほど冷や汗かいたので共有します。

最初に結論（謎の対処方法）です。

```
Player　> ファイル　>　環境設定　>　色のテーマ　>　明るい　>　OK
```

[![Image from Gyazo](https://i.gyazo.com/ef6cbf343b961222a01be14a6836e505.png)](https://gyazo.com/ef6cbf343b961222a01be14a6836e505)

[![Image from Gyazo](https://i.gyazo.com/d3f4fe4e4195929c3ccbd9a1cc4523b6.png)](https://gyazo.com/d3f4fe4e4195929c3ccbd9a1cc4523b6)

以下の悲鳴があふれるQ&Aの末尾に掲載されていました。神！

[Multiple monitors not working with vmware workstation player 16](https://communities.vmware.com/t5/VMware-Workstation-Player/Multiple-monitors-not-working-with-vmware-workstation-player-16/td-p/2313054)

```
We think we might have a solution.

We are now running Workstation Player version 16.2.3. 
If you open Player > File > Preferences and choose the "Color Theme": "Light" rather than using "System" multi monitor starts working again.

This has been successful on multiple computers.
```

## 環境

| 項目 | 値 |
|:-|:-|
| プロダクト | VMWare Player 17  |
| ホスト  | Windows 11   |
| ゲスト  | Ubuntu 2004 |

なお、このゲストは、Windows10 x VMWare Workstation 15で利用していた仮想マシンです。

ずっとアップグレードを拒否してきましたが、新パソコンはWindows 11しか対応してないのでやむをえず。
Windows 11だとVMWare15は、利用できなかった（起動時に100％ブルースクリーン発生）ので、乗り換えた次第です。

## 余談

Windows 11初日ですが、くそ仕様が２つ。

- タスクバーを左に配置できない
    - 横長画面は無駄が多いんだってば！！
- コンテキストメニューが全部表示されない。学習もされない。
    - アクション数増やすってさ・・・。どんな発想
    
毎度のことだけど、なんで大半の人が望んでないであろうことをするのだろうか？
サティア・ナデラによるMicrosoftの復活は見事・驚異的だったけど、OS部門は制御できてなさそう。
Copilot for Microsoft 365 について (2)

前回の記事 [Copilot for Microsoft 365 について (1)](https://qiita.com/tadanok/items/d30e33a9799ed538cc93) が想定よりも多くの方からご覧頂けたことに感謝しております。
それでは「Copilot for Microsoft 365 (以下「Copilot for M365」という)」についてお話を続けて行こうと思います。
今回は Office 文書の生成に関わる機能をお伝えします。

# 前提知識としての Office JavaScript API

「Copilot for M365 の話をしているのに何故 Office JavaScript API?」と訝しがる方もいらっしゃるかも知れませんが、とても大事な関係があるので少しお付き合いください。

[Office JavaScript API について](https://learn.microsoft.com/ja-jp/office/dev/add-ins/develop/understanding-the-javascript-api-for-office)

まず、この API ですが主な役割は Office 向けのアドインを作るために用意されており、アドインから Word や Excel などの Office アプリケーション、正確に言えば現在「Microsoft 365 Apps (以下「M365 Apps」という)」と呼ばれる Microsoft 365 のクラウド環境と併せて使用される Office アプリの内部機能へアクセスするために用意されています。

:::note
余談ですが、古くから Excel の自動化などで使われていた VBA マクロに変わって、Excel の自動化のために「Office スクリプト API」というものも用意されています。

[Office スクリプト API リファレンス](https://learn.microsoft.com/ja-jp/javascript/api/office-scripts/overview?view=office-scripts)

これは Excel の【自動化】メニューから【操作を記録】を選択した際に JavaScript のスーパーセットである TypeScript で操作内容が記録されるというものです。
是非、移行が可能なものから挑戦してみてください。
:::

この Office アプリ (M365 Apps) にとってネイティブな API である Office JavaScript API ですが、汎用言語である JavaScript で記述されているため ChatGPT などでもコードを自動生成できるということをイメージされ、「内部では GPT で Office JavaScript API を呼ぶコードを生成している？」と考えられるかも知れません。

ところが、この API を使ったコード例はまだ少なく、LLM (大規模言語モデル) が自動生成するには心許ない状況です。ただでさえ、LLM はその性質からハルシネーション (幻覚) によってオブジェクトや関数の名前、パラメータを誤って生成することがあります。そのために一工夫したのが、以下の「Office Domain Specific Language (ODSL)」です。

# Office Domain Specific Language (ODSL)

この ODSL に関しては、マイクロソフトの研究者数名によって書かれた論文が製品の一般提供 (GA：General availability) 前の 2023 年 6 月 に発表されています。コーネル大学図書館が運営している arXiv（アーカイヴ) というサイトに載っていますのでご覧になってみてください。

[Natural Language Commanding via Program Synthesis](https://arxiv.org/abs/2306.03460)

この論文の中で、上記の問題へ対処するために、中間言語的な役割で ODSL が開発された背景とその機能の説明が PowerPoint アプリを例に行われています(注：現状もこの論文通りの実装になっているかは保証の限りではありません)。ODSL 自体はネイティブ API に比べて人間が指示する単位に近い表現方法が取られています。それを Office JavaScript API に変換する段階で様々な工夫 (コンパイル時にエラー検出をすることで実行時にエラーが起きないようにするなど) が凝らされています。

これらの処理が前回の記事で触れた RAG (Retrieval-Augmented Generation) の一部で行われていることになります。もちろん、現状でも実行時に思ったような結果が得られないこともあるかと思いますが、こうした仕組みが内部で動いており、発展途上であるということをご理解頂ければと思います。

また、上記の仕組みから Office 文書生成に関しては、現状 Office JavaScript API で実装されていないことは Copilot for M365 にはできないであろうことは想像に難くありません。今後、Office JavaScript API および ODSL の進化が機能向上に強く結び付いていくことと思います。

Office 文書の生成は、ChatGPT の Advanced Data Analysis (旧：Code Interpreter) の中で Python のライブラリなどを使っても実現できる部分はありますが、今後の ODSL やネイティブ API の進化の可能性も含めて Copilot for M365 にアドバンテージがあるのでは無いかと感じています。

今回は Office 文書生成に関連して、Office JavaScript API と Office Domain Specific Language (ODSL) に関して触れました。
次回は、ここまでの記事を元にして少し掘り下げた記事にしたいと考えています。
Riderがアンインストールできない

Riderを最新版にアップデートしようとしたら、エラーのポップアップが出てアンインストールできなかった。既知のバグらしいですが、改善の優先度が低いのかなと思いました。

# エラーメッセージ
```
Uninstall hasn't detected folder of JetBrains Rider installation. Probably uninstall.exe was moved from the installation folder.
```

# 対応方法
uninstall.exeと同じフォルダに、「IdeaWin64.dll」という名前の空のファイルを作って、もう一度アンインストールするとうまくいく。

# 参考
* [How To Manually Uninstall Rider ?](https://rider-support.jetbrains.com/hc/en-us/community/posts/9194379089554-How-To-Manually-Uninstall-Rider)

# おまけ
* ゴミファイルが残っている感じがしたので、結局アンインストール後にフォルダ事削除しました。
『体験しながら学ぶ ネットワーク技術入門』をやってみる@勉強記録①

[体験しながら学ぶ ネットワーク技術入門](https://www.amazon.co.jp/%E4%BD%93%E9%A8%93%E3%81%97%E3%81%AA%E3%81%8C%E3%82%89%E5%AD%A6%E3%81%B6-%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E6%8A%80%E8%A1%93%E5%85%A5%E9%96%80-%E3%81%BF%E3%82%84%E3%81%9F-%E3%81%B2%E3%82%8D%E3%81%97/dp/4815618593)を購入しましたので、こちらの勉強記録を乗せる記事となります。
諸々に気を付けながら、主に自身のモチベーションアップの目的で投稿。

# 意気込み
ネットワーク勉強するぞ！

## Chapter1 検証環境を作ろう
### wslを利用してUbuntuをインストール
まずは検証環境をつくるべく、Hyper-v上WSL2を利用してUbuntu 20.04をインストールする

```powershell:powershell
wsl --install --distribution Ubuntu-20.04
インストール中: Ubuntu 20.04 LTS
Ubuntu 20.04 LTS はインストールされました。
Ubuntu 20.04 LTS を起動しています...
```

上記を実行したところ、別のPorewshell画面が起動したが問題発生、さっそくエラーが、
```powershell:powershell
Installing, this may take a few minutes… WslRegisterDistribution failed with 
error: 0x800701bc Error: 0x800701bc WSL 2 ???????????? ??????????????????????? https://aka.ms/wsl2kernel ?????????
```

調べたところどうやらLinuxカーネルのバージョンが古いようで、下のDocsの通りやると無事エラーが解決。
https://learn.microsoft.com/ja-jp/windows/wsl/install-manual#step-4---download-the-linux-kernel-update-package

パスワードやrootユーザーの設定などもろもろする。
基本この後の作業はrootユーザーで実施。

### セットアップスクリプトの実行
本書用に用意されたセットアップスクリプトをUbuntu上で実行するよう。

規定でWSL上のUbuntuにWindowsのCドライブが/mnt/c/でマウントされるので、Windowsでセットアップスクリプトを落とした後、Ubutuから実行する。
セットアップスクリプトで以下を実施。

- DNSクライアントの設定
DNSサーバの指定をWSLからの生成ファイルでなく、固定で持たせる。
- Ubuntuのアップデート
- Dockerファイルのインストール
- tinetのインストール
- wsl.confの設定
    - ホスト名の変更
    - reslve.confの自動生成の無効化
    - Dockerの自動起動
    - defaultログインユーザーの指定

驚くことに設定ファイルだけでなく、設定が問題なく完了しているか確認するスクリプトも用意されている。。！

### WSL2の使い方
よく使うコマンドを抜粋
WSLは再起動のコマンドがないため、起動停止したのち起動する

```powershell:powershell
wsl --distribution <WSLインスタンス名> #WSLインスタンスの起動(すでに起動している場合はログイン)
wsl --distribution <インスタンス名>　--user <ユーザー名>　#指定したインスタンスに指定したユーザーでログイン
wsl --list --verbose #インスタンスの状態確認
wsl --shutdonw #すべてのインスタンスの停止
wsl --terminate <WSLインスタンス名> #指定したインスタンスの停止　
```

### WSLインスタンスとWindowsのファイルのやり取り

- Windows→WSLへアクセス
エクスプローラで「\\wsl.localhost」配下からアクセスできる
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269528/3802f021-b521-782f-9567-352c7865f1e9.png)

- WSL→WSL
/mnt/c/配下にcドライブがマウントされる

### Doerkerの使い方
よく使うコマンドを抜粋
```docker
docker exec #実行中のコンテナ内でコマンドを実行
docker ps #起動しているコンテナの一覧を表示
docker image #ダウンロードしたイメージの一覧を表示
docker start #起動
docker stop #停止
```
### tinetの使い方
よく使うコマンドを抜粋
```
tinet up -c <設定ファイル> #設定ファイルからネットワーク機器のコンテナを作成できる
tinet conf-c <設定ファイル> #設定ファイルからコンテナの設定をする
tinet test -c <設定ファイル> #設定ファイルからテストコマンドを実行
tinet image -c <設定ファイル> | dot -Tpng <ファイル>　#ネットワーク環境の可視化、事前準備としてGraphvizのインストールが必須
```
### 検証環境構築
用意されているyamlファイルをtinetコマンドからWSLにて実行し検証環境を作成。コマンドや実行ログは無害化が面倒なので割愛。

作成された環境は家庭のPCからインターネット接続する環境に寄せた構成となっている。
家庭内LAN→インターネット→サーバーサイトの3つのブロックに分けてあり、スイッチ、ルーター、FW、DNS、LBなどが配置される。

最終的にはCurlで指定したURLからコンテンツが返ってくるか確認しOKであれば検証環境の構築は完了。
```powershell
curl -k https://www.example.com/
sv1.example.com
```

###
DjangoとReactでAPI疎通確認をしたらめちゃくちゃ沼った件

## やりたいこと

バックエンドをDjango、フロントエンドをReactで構成
DjangoでAPIを作成してReactに渡して表示させたい

DjangoでAPIを作って表示させるところまでは動作確認済み

## 問題点
404エラーが頻発
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680269/a81ad5b7-e3c9-2651-e4a7-464f01b74ee3.png)

開発者ツールで確認すると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680269/46ffd75b-a6fe-12cf-7ec4-efa5278705a6.png)

と、本来はRequest URLがDjangoなので[http://localhost:8000/api/hello/backend/]にならないといけない

## 解決までやったこと

### urls.pyの修正

本来[backend/]とならないといけないのだが、/が読み込まれないので、urls.pyを修正

~~~Python:urls.py
from django.urls import path
from . import views

#app_name = 'app.hello'

urlpatterns = [
    path('backend', views.Backend.as_view()),
]
~~~

しかし結果は変わらず

### CORS の導入
CORS (オリジン間リソース共有、 Cross-Origin Resource Sharing)
つまり今回の場合はDjangoはポート8000でReactは3000でポートが違うので、ブラウザがオリジンをまたぐ。
それを許可する設定を導入

~~~Python
pip install django-cors-headers
~~~

~~~Python:settings.py
INSTALLED_APPS = [
    # ...
    'corsheaders',
    # ...
]

MIDDLEWARE = [
    # ほかのミドルウェアより上に記載
    'corsheaders.middleware.CorsMiddleware',
    # ...
]

CORS_ALLOWED_ORIGINS = [
    "http://localhost:3000",
]
~~~

これでも404エラーは解決できず

### page.tsxのパスを絶対パスに変更

~~~Javascript:page.tsx
'use client'

import axios from 'axios'
import { useEffect, useState } from "react"

export default function Page() {
    const [ data, setData ] = useState({ message: ''})

    useEffect(() => {
        axios.get('http://localhost:8000/api/hello/backend/')
            .then((res) => res.data)
            .then((data) => {
                console.log(data); // データをログに出力
                setData(data)
            })
    }, [])

    return <div>hello {data.message}!</div>
}
~~~

axos.getのパスを絶対パスに変更

## 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680269/c47c6efb-ad60-2061-e04e-c79763cb3962.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680269/eb1fd28a-aa65-2ca8-6acb-c946588b3575.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680269/0c14e118-de9d-c8bf-8cb3-d349612645ea.png)

## 課題
そもそも絶対パスがマジでいけてないと思っている
特にポート番号込みで記載というのは本当に大丈夫か？
相対パスで書きたいのだが....