OmniAICreator/Qiita-1.07M huggingface dataset:
茶色コーダーによるABC377振り返り

# 最初に
a~c問題が簡単でd問題からが一気に難しくなった
本当になにかの予選かという感じだった
僕はそのa~c早解きゲーに勝利し?緑パフォ出した
そしてチェス関連の問題が多かった

<details><summary>最近あったこと(話さなくていいので折りたたみ)</summary>

* [前回](https://qiita.com/hidehic0/items/de3449147fdf50304ede)で話していた自作ライブラリの調子が良くコーディングスピードがあがりました

* zennに登録してスクラップ機能が良かったので今後も使おうと思う
* ubuntuを2,3週間前に24.10にアップデートしたのだが　今更起動音を聞いてみたら臨場感がエグかった
* yukicoderの作問が面白かったけどtester募集がほぼ無理 Xのアカウントが作れないため(中１だが2月生まれのためまだ12歳) 別に頼んでないので大丈夫です & 問題ストック 一つだけw 

</details>

それじゃ一問ずつ感想書きますか

# [A問題](https://atcoder.jp/contests/abc377/tasks/abc377_a)
長さ3の文字列が与えられそれを並び替えて文字列 ABC ができますかという問題
僕は a b cのカウントを用意してそれがすべて1ならOKみたいなコードを書いた

ACコード(ライブラリ抜粋) [全文](https://atcoder.jp/contests/abc377/submissions/59153129)
関数名はご想像にお任せします(無責任) これがあと2つある

```python
S = s()

a, b, c = 0, 0, 0

for t in S:
    if t == "A":
        a += 1
    elif t == "B":
        b += 1
    elif t == "C":
        c += 1

if a == 1 and b == 1 and c == 1:
    print("Yes")
else:
    print("No")
```
ライブラリ作ってんのならYesNo関数ぐらいは作らなきゃ

# [B問題](https://atcoder.jp/contests/abc377/tasks/abc377_b)
問題文を要約する
$8 \times 8$の盤面の情報が与えられます
(i,j)が.なら空マス　#ならルークが置かれています
ルークはi行目に置かれているコマ と j列目に置かれているコマを取ることができます
あなたはすべてのルークに取られないようにコマを置く方法は何通りありますか

解法の文章化ができないので解説見て下さい　すいません
[解説URL](https://atcoder.jp/contests/abc377/editorial/11232)

ACコード(ライブラリ抜粋) [全文](https://atcoder.jp/contests/abc377/submissions/59159838)
関数名はご想像にお任せします(無責任)

```python
h = [False] * 8
w = [False] * 8

for k in range(8):
    l = list(s())

    if "#" in l:
        h[k] = True

    for i in range(8):
        if l[i] == "#":
            w[i] = True

ans = 0

for i in range(8):
    for k in range(8):
        if not w[k] and not h[i]:
            ans += 1

print(ans)
```

# [C問題](https://atcoder.jp/contests/abc377/tasks/abc377_c)
問題文が複雑なのでパス(~~コイツどんどん甘えてきている~~)

とりあえず取られる場所をすべてsetで保存して
それから条件を満たすマスの数をansに保存する
最終的な答えは$N^2-ans$でOK

ACコード(ライブラリ抜粋) [全文](https://atcoder.jp/contests/abc377/submissions/59169957)
関数名はご想像にお任せします(これで終了)

```python
N, M = il()

L = set()

for _ in [0] * M:
    a, b = il()
    L.add((a, b))

    L.add((a + 2, b + 1))
    L.add((a + 1, b + 2))
    L.add((a - 1, b + 2))
    L.add((a - 2, b + 1))
    L.add((a - 2, b - 1))
    L.add((a - 1, b - 2))
    L.add((a + 1, b - 2))
    L.add((a + 2, b - 1))

ans = 0
n2 = N**2

for a, b in L:
    if 1 <= a <= N and 1 <= b <= N:
        ans += 1

print(n2 - ans)
```

# [D問題](https://atcoder.jp/contests/abc377/tasks/abc377_d)
C問題に続き問題文の要約はパス(コイツ本当に甘々だな)
色々考えたけどわからなかった
diff見たら緑中間ぐらいあった

解説URL

https://atcoder.jp/contests/abc377/editorial/11226

# [E問題](https://atcoder.jp/contests/abc377/tasks/abc377_e)
問題文を要約(コイツ急に復活したけど問題文すごい短い)
$P$iを$P$piで同時に更新する
以下の行動をK回繰り返す

ダブリングだと思ってやってたけど全然違った
そして青diffなめててすいません

# 最後に
やっぱり早解きゲーだった3完だけで緑パフォだった
そしてB問題の感想、**飛車**で説明しようかなと思ったが、自分で混乱してきて結局、問題文のまま説明した。
レートは50ぐらい上がりました
そしてAJLの中１がヤバそうです。青パフォ出した人がいて、今後大変そうです
あと同学年(中１)の同レート帯の方々すごい上がってた　出遅れ組になってしまいました
1. My_Application 備忘録

# 1. My_Application 備忘録
## 1.1. 内容・目的
　どうも最近Flutterをはじめたどこにでもいる理工系の大学生です．　今日は初めて自分で考えたアプリのひな型を作製したのでその備忘録と躓いたポイントのアウトプットとしてまとめた物です．解釈の間違いや理解不足な点がありますがご指摘していただけうと幸いです．
　今回制作しているアプリは友達からのお願いでAIノベリスとの補助用のアプリとして制作しています．講義や休みの合間に制作しているためかなり進捗は遅いですが，実力向上のため頑張ります. 公式ドキュメント等で学んだ内容に対する理解を深めることを目的としています．

　今回の目標アプリの画面にListView型式でassetsフォルダの中の画像をXのUIのように表示すること
### 1.1.1. 対象者
Flutter初学者
## 1.2. 内容
### 1.2.1. 完成コード
　まずはいったん完成した以下コードです．
```dart
import 'package:flutter/material.dart';
import 'dart:io';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  static const List<String> data = [
    "test1",
    "test2",
    "test3",
    "test4",
    "test5",
    "test6",
    "test7",
    "test8",
    "test9",
    "test10",
    "test11",
    "test12",
    "test13",
    "test14",
    "test15",
    "test16",
    "test17",
    "test18",
    "test19",
    "test20"
  ];

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        debugShowCheckedModeBanner: false,
        home: Scaffold(
            appBar: AppBar(title: const Text("Flutter App"), actions: const [
              Padding(
                  padding: EdgeInsets.only(right: 20), child: Icon(Icons.info))
            ]),
            body: ListView.builder(
              itemCount: data.length,
              itemBuilder: (context, index) {
                return Card(
                  child: ListTile(
                    leading:
                        Image.asset('assets/images/${data[index]}.png',
                            errorBuilder: (context, error, stackTrace) {
                      return const Icon(Icons.error);
                    }),
                    title: Text(data[index]),
                    trailing: const Icon(Icons.more_vert), //右に表示されるアイコン
                    isThreeLine: false,
                    dense: true,
                    enabled: true,
                    selected: false,
                    onTap: () {},
                    onLongPress: () {},
                  ),
                );
              },
        )));
  }
}
```
　重要なのは```@override```より下のコードです．
下記の表は私がアプリを作るうえで必要となる要素についてまとめた物です
| 関数・Widget | 内容 |
| ------------ | ---- |
| Widget build |Widgetがどのように描写されるかを表す．UI構築のための親Widgetで，取る引数が構築する為に必要な情報である.|
| 変数宣言     |  そのクラスで使われるインスタンス．変数を宣言するときはインスタンスとして継承する．   |
| Image.assets |   .yamlで記述するとき, pathはフルで--assets/imagesのようにassetsを含んで記述する.   |
### 1.2.2. 勘違いしていたこと
#### 1.2.2.1. Widget
　Widgetについて，htmlやcssのように入れ子構造で考えていたが考え方は同じだが少し異なっていた．
Widgetはどこまで行ってもただのUIを格納する箱であり，一種の変数に近い．ゆえにListView Widgetの中で変数を宣言することは，変数の中で変数を宣言することに等しい．つまりできない.

#### 1.2.2.2. 「,」と「;」の扱い
　「,」 は引数を取る時に使い．「;」はWidgetや関数の区切りとして記述する．どっちを書けばいいか迷ったときはWidgetの中を記述しているのかを考えながらすればコピペしてきても簡単に判断できる.

## 1.3. 今後の展望
　描写されたCardにワンクリックで対応するテキストがコピペできる機能を実装する．またCardにアイコンを実装する．

### 1.3.1. 引用・参考
[公式ドキュメント](https://docs.flutter.dev/ui)
[参考サイト](https://flutter.gakumon.jp/entry/flutter-listview)
【Oracle】表領域について


<h1>１．背景</h1>
今のプロジェクトの会議で表領域の話題が出て気になったので。


<h1>２．環境</h1>
Windows 11 Pro 22H2

Oracle Database 21c Express Edition

Visual Studio Code 1.94.2 (system setup)

<h1>３．Oracleの表領域とは？</h1>

Oracleでテーブルデータを格納する場所。
CREATE TABLE時に表領域を指定でき、
テーブルはその表領域上に作成される。

以下は表領域の種類の例。

<h2>SYSTEM 表領域</h2>

データベースの作成時に自動的に作成される表領域で、
データベースのオープン中は常にオンラインになる。﻿

<h2>一時表領域</h2>

SQL文の処理中に生成された一時データを格納する表領域で、
主にソート処理に使用される。﻿

<h2>SYSAUX 表領域</h2>

データベースの作成時に必ず作成され、
SYSTEM 表領域の補助表領域として機能する。﻿

<h2>余談</h2>

表領域には、複数のスキーマのデータが格納されることがある。

スキーマは論理的なデータベースオブジェクト（テーブル、ビュー、インデックスなど）のまとまりで、ユーザーによって所有される。﻿

表領域を作成する際は、CREATE TABLE時に指定する。指定しない場合は、
各ユーザーに設定されたデフォルト表領域上に作成される。



<h2>４．表領域を確認するSQL</h2>

```
COLUMN 表領域名 FORMAT A20
COLUMN 合計サイズ_MB FORMAT 999,999,999.99
COLUMN 使用済みサイズ_MB FORMAT 999,999,999.99
COLUMN 使用率_パーセント FORMAT 999.99

SELECT
    a.tablespace_name AS 表領域名,
    ROUND(SUM(a.bytes) / 1024 / 1024, 2) AS 合計サイズ_MB,
    ROUND(SUM(a.bytes - NVL(b.bytes, 0)) / 1024 / 1024, 2) AS 使用済みサイズ_MB,
    ROUND((SUM(a.bytes - NVL(b.bytes, 0)) / SUM(a.bytes)) * 100, 2) AS 使用率_パーセント
FROM
    dba_data_files a
LEFT JOIN
    (SELECT tablespace_name, file_id, SUM(bytes) AS bytes
     FROM dba_free_space
     GROUP BY tablespace_name, file_id) b
ON
    a.tablespace_name = b.tablespace_name AND a.file_id = b.file_id
GROUP BY
    a.tablespace_name
ORDER BY
    a.tablespace_name;

```

<h2>５．実行結果</h2>

```
C:\Users\username>sqlplus / as sysdba

SQL*Plus: Release 21.0.0.0.0 - Production on 日 10月 27 16:04:48 2024
Version 21.3.0.0.0

Copyright (c) 1982, 2021, Oracle.  All rights reserved.



Oracle Database 21c Express Edition Release 21.0.0.0.0 - Production
Version 21.3.0.0.0
に接続されました。
SQL> COLUMN 表領域名 FORMAT A20
SQL> COLUMN 合計サイズ_MB FORMAT 999,999,999.99
SQL> COLUMN 使用済みサイズ_MB FORMAT 999,999,999.99
SQL> COLUMN 使用率_パーセント FORMAT 999.99
SQL>
SQL> SELECT
  2      a.tablespace_name AS 表領域名,
  3      ROUND(SUM(a.bytes) / 1024 / 1024, 2) AS 合計サイズ_MB,
  4      ROUND(SUM(a.bytes - NVL(b.bytes, 0)) / 1024 / 1024, 2) AS 使用済みサイズ_MB,
  5      ROUND((SUM(a.bytes - NVL(b.bytes, 0)) / SUM(a.bytes)) * 100, 2) AS 使用率_パーセント
  6  FROM
  7      dba_data_files a
  8  LEFT JOIN
  9      (SELECT tablespace_name, file_id, SUM(bytes) AS bytes
 10       FROM dba_free_space
 11       GROUP BY tablespace_name, file_id) b
 12  ON
 13      a.tablespace_name = b.tablespace_name AND a.file_id = b.file_id
 14  GROUP BY
 15      a.tablespace_name
 16  ORDER BY
 17      a.tablespace_name;

    表領域名               合計サイズ_MB 使用済みサイズ_MB 使用率_パーセント
-------------------- --------------- ----------------- -----------------
SYSAUX                        670.00            607.44             90.66
SYSTEM                      1,350.00          1,343.56             99.52
UNDOTBS1                      115.00             36.06             31.36
USERS                           5.00              2.69             53.75

SQL>

```

<h2>６．参考リンク</h2>

https://blg.dai-it-system.com/2022/08/oracle_tablespace_size/
【JavaScript】PerformanceNavigationに格納される情報についてのメモ

## 概要
今回実現したかったこととして、beforeunloadのイベントが起きた際に、それがリロードなのか別サイトに遷移するかの判定を行うというものです。PerformanceNavigationが使えるのではないかと考えましたが、結論から言うとこれは無理っぽいです。一応なぜ実現困難かについてメモ書きを残しておきます。
なお、beforeunloadの動作については[【JavaScript】俺の書いた離脱防止用beforeunloadイベントがなんかおかしい件](https://qiita.com/shigakin/items/6da92995b8539879bfb7)を参照ください。

## PerformanceNavigationについて
[URLアクセスとページリロードの判定処理について](https://supersoftware.jp/tech/20240402/19446/)にて紹介されていますが、PerformanceNavigationで取得できる情報はあくまで「ユーザがそのページにアクセスした手段を取得」です。したがってbeforeunloadが発火した時の操作ではありません。

## 実験
以下のようにreactでbeforeunloadを実装してみて、PerformanceNavigationの情報を取得してみました。結果としてはあくまでこのページに入ってきた時点の情報であり、beforeunloadで捕捉した状態を取得できるわけではありません。

```react
import { useEffect } from "react";

export default function Home() {
  useEffect(() => {
    const beforeUnloadHandler = (event: BeforeUnloadEvent) => {
      // このnavigationTypeはあくまでこのページに来たときの情報
      const navigationType =
        window?.performance?.getEntriesByType("navigation")[0];
      console.log(navigationType);
      event.preventDefault();
    };

    window.addEventListener("beforeunload", beforeUnloadHandler);
    return () => {
      window.removeEventListener("beforeunload", beforeUnloadHandler);
    };
  }, []);

  return (
    <div>
      <div>test</div>
      <input type="text" id="name" name="name" />
    </div>
  );
}
```

## その他参考
[onbeforeunload onunload performance.navigation.type not working properly](https://stackoverflow.com/questions/45957785/onbeforeunload-onunload-performance-navigation-type-not-working-properly)
KUROKO GearのLANインターフェースアドレスをリモートで設定してみた

KUROKO Gearは、

**ハード＋リモート接続用ソフトウェア＋モバイル閉域SIM**

がオールインワンになったリモート接続用装置です。
KUROKO Gearの特徴は以下の通りです。

**●リモート接続したい現地に設置して、電源とLANケーブルをつなげるだけですぐに**
  **リモート接続することができる**
**●インターネットとの接点がないリモート接続環境を手軽に構築できる**


今回は現地にKUROKO Gearを設置後に、現地のネットワークにアクセスするためのKUROKO Gear LANインターフェースのIPアドレスを実際にリモートから変更してみたいと思います。

現地に設置してから機器のIPアドレス合わせができるなんて、事前準備いらずで非常に便利ですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3869727/f38ec695-935e-a6b4-8b83-5d3713f52dbb.png)


KUROKO GearのLAN側インターフェースはデフォルトで「192.168.254.254/24」に設定されています。今回は、このIPアドレスを変更してみたいと思います。

# 1. ログイン
KUROKO Connectコンソール画面にアクセスし、メニュー＞接続をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3869727/cf34db39-3a37-9935-dfc0-fbc3fcdf0619.png)

# ２. KUROKO Gearの選択
接続したいKUROKO Gearの「選択」をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3869727/65456ec3-6b83-0180-6596-0fb1e5776340.png)

# ３. 接続先の選択
接続先を「管理画面（HTTP：127.0.0.1:8080）」に選択して、接続をクリックします。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3869727/25562dfd-0224-6cec-0f5c-ca2cd22607a7.png)


接続情報が表示されるまで待ちます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3869727/e9cdb21d-db9c-7ef1-edd3-66b1df6ef600.png)

# ４. URLの選択
表示されているURLをクリックすると、現地に設置しているKUROKO Gearの管理画面にアクセス出来ます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3869727/048cb8b2-ac89-27c5-437d-5bd7ee14932b.png)



KUROKO Gearの管理画面はHTTPですが、KUROKO Connectを介して接続するときはHTTPSで接続出来ます。
安全ですね👍

# ５. 管理画面にログイン
KUROKO Gear管理画面にログインします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3869727/7f8d5169-2ba9-5a86-6b19-2c3b08363fe0.png)


# ６. インターフェースの選択
メニュー＞ネットワーク＞　インターフェースをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3869727/95d868d9-3cf9-b7a7-e939-98e75d3c769d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3869727/4d680f79-c359-8850-f759-f3123edafcb3.png)


有線LANインターフェースのIPアドレスを　IPアドレス/CIDRで設定して、「更新」ボタンを押せば、即時IPアドレスが変更＆反映されます。


このように、KUROKO GearのLANインターフェースがKUROKO Connect経由で簡単に変更出来ます。


LAN側のIPアドレスがわならなくなってアクセス出来ない、事前のLANインターフェースのIPアドレスを現地にあわせる時間がなかった・・・など、KUROKO Gearではそういった心配は一切不要です。
Linuxとは

# Linuxとは
LinuxとはOSの一種でオープンソースのOS。
どの種類のPCにもインストールできる。

# Linuxでできること
- WindowsやMacのようにパソコンの操作ができる。
- 操作が早くなるCUI操作を基本としている。

**CUI操作とは**
1. マウスを使わずキーボードだけで操作する方法。
2. コマンドを打って操作をする。
3. Linuxを操作する色々なコマンドがある。

# Linuxのメリット
**1. オープンソースで無料**
Linuxはオープンソースで誰でも無料で使用できる。
ソースコードを自由に閲覧、変更できるためカスタマイズ性も高い。

**2. 低スペックのPCで使える。**
システム要件が低く、軽量なディストリビューションも多いため古いパソコンでも使いやすい。

**3. 多彩なディストリビューション**
用途やユーザーのレベルに応じたさまざまなディストリビューション（例：Ubuntu、Debian、CentOS、Arch Linux）が提供されているため、初心者から上級者まで選択肢が豊富。

**4.プログラミング・開発環境に最適**
Ruby、Python、PHPなどの多くのプログラミング言語のサポートが強力で、開発ツールも豊富。オープンソースソフトウェア開発のための環境が整っている。

**5.コマンドライン操作が豊富**
Linuxはコマンドラインインターフェイス（CLI）が豊富で、スクリプトや自動化の作業がしやすいため、管理者や開発者が効率的に作業できます。
Gitで間違えてプッシュしてしまった時の対処法

# 初めに
開発中に間違えて違うブランチでプッシュしてしまってその修正を行うのに手間取ったのでその解決方法を紹介します

# エラー詳細
```
git push origin main
```
を行った後のエラー
```
To https://github.com/opatu07/todo_maneger.git
 ! [rejected]        main -> main (non-fast-forward)
error: failed to push some refs to 'https://github.com/opatu07/todo_maneger.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. If you want to integrate the remote changes,
hint: use 'git pull' before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
```
deeplでの翻訳結果
```
https://github.com/opatu07/todo_maneger.git へ
 ! [拒否] main -> main (非ファストフォワード)
error: 'https://github.com/opatu07/todo_maneger.git' への参照プッシュに失敗しました。
ヒント: 更新が却下されたのは、現在のブランチの先端が
ヒント: 現在のブランチの先端がリモートのブランチより遅れているため、更新が却下されました。リモートの変更を統合したい場合は
hint: 再度プッシュする前に 'git pull' を使ってください。
hint: 詳細については 'git push --help' の 'ファストフォワードに関する注意' を参照してください。
```
リモートブランチよりローカルブランチが遅れていることが原因らしいです
なので

```
git pull origin main
```
を行いその後でたエラーがこちら
```
From https://github.com/opatu07/todo_maneger
 * branch            main       -> FETCH_HEAD
hint: You have divergent branches and need to specify how to reconcile them.
hint: You can do so by running one of the following commands sometime before
hint: your next pull:
hint:
hint:   git config pull.rebase false  # merge
hint:   git config pull.rebase true   # rebase
hint:   git config pull.ff only       # fast-forward only
hint:
hint: You can replace "git config" with "git config --global" to set a default
hint: preference for all repositories. You can also pass --rebase, --no-rebase,
hint: or --ff-only on the command line to override the configured default per
hint: invocation.
fatal: Need to specify how to reconcile divergent branches.
```
```
https://github.com/opatu07/todo_maneger より
* ブランチメイン -> FETCH_HEAD
hint:分岐したブランチがあり、それらを調整する方法を指定する必要があります。
hint: 次のコマンドのいずれかを、次のプルの前に実行してください。
hint: 次のプルの前に、以下のコマンドを実行します：
を実行します：
ヒント: git config pull.rebase false # マージ
ヒント: git config pull.rebase true # rebase
hint: git config pull.ff only # 早送りのみ
ヒント
hint: 「git config」 を 「git config --global」 に置き換えると、デフォルトを設定できます。
hint: すべてのリポジトリに対する優先順位を設定します。rebase、--no-rebase を渡すこともできます、
を渡すこともできます。
を渡すこともできます。
致命的: 分岐したブランチを調整する方法を指定する必要があります。

DeepL.com（無料版）で翻訳しました。
```
分岐したブランチのために何かの処理を実行しないといけないらしいです
そこで思い出しました
僕はmainブランチを作成後git flowの導入を忘れていたので<br>
developブランチを作成したのでした
その処理の調整をエラーが教えてくれているのだと
# 解決方法
```
git reset
```
を行いました理由は
履歴を残したくなかったからです<br>
mainブランチは本番環境なのでdevelopブランチで通っていないファイルをmainブランチにあげることはチーム開発ではないと考えたからです
そもそもdevelopブランチ作らないとかありえないとは思いますが
履歴を残すrevertをやってもよかったかなとかんがえたのですが最初の段階だったので履歴を残さないresetを選択しました
開発が進んでいたならrevertで履歴を残しました

# 追記
git pull後に同じエラーが出ました。今度はホーム画面の修正中にログイン画面用のブランチを作成したためブランチが分岐しました。
その状態でホーム画面の修正をdevelopブランチに反映しました
その後git pullしたので前回と話が変わってきます。
今回重要なのはホーム画面の修正をログイン画面に反映することだと考えたので
デフォルトのgit config pull.rebase falseを選択しました。
ちょっと個々の理解が曖昧だからもう少し勉強したいと思います
# 最後に
チーム開発なら絶対やってはいけないことなので次からgit flowを意識してやっていきたいです
【備忘録】truthy/falsyと論理演算子

# はじめに
JavaScriptでは変数のデータ型それぞれに真偽っぽいのが設定されており、それぞれ `truthy`/`falsy` と呼ばれている。らしい。
それと論理演算子を利用して変数に値を設定することがあるようだが、全然覚えられなさそうだったため一旦検証した。

# 検証
以下の`val1` / `val2`にそれぞれ `truthy`/`falsy` な値を入れた際、  `result1`/`result2` の値が `val1`/`val2`どちらになったかまとめる。

```js
//ORの検証
const result1 = val1 || val2;
//ANDの検証
const result2 = val1 && val2;
```
## 結果 : result1 = val1 || val2

|val1 ＼ val2|truethy|falsy|
|---|:--:|:--:|
|**truethy**|val1|val1|
|**falsy**|val2|val2|

## 結果 : result2 = val1 && val2
|val1 ＼ val2|truethy|falsy|
|---|:--:|:--:|
|**truethy**|val2|val2|
|**falsy**|val1|val1|

# 結論
val1の `truthy`/`falsy` に注目し、ORならval1、ANDならval2の値を適用すれば良さそう。
【Rails】furimaアプリ　商品情報編集機能　#1

# 実装概要
画像を含む商品の情報を編集する機能を実装

### ルーティングの設定
```ruby:config/routes.rb
# 中略
resources :items, only: [:index, :new, :create, :show, :edit]
```
### editアクションをコントローラーに定義
```ruby:app/controllers/items_controller.rb
# 中略
def edit
  @item = Item.find(params[:id])
end
```
### editページの編集
`new.html.erb`ファイルと同様のコードを記述（コード内容は割愛）

### updateアクションのルーティングを設定
```ruby:config/routes.rb
resources :items, only: [:index, :new, :create, :show, :edit, :update]
```

### updateアクションをコントローラーに定義
```ruby:app/controllers/items_controller.rb
def update
  item = Item.find(params[:id])
  item.update(item_params)
  redirect_to item_path(item.id)
end
```

### `edit.html.erb`ページに遷移した場合「未ログインユーザー：ログインページ」「出品者以外のログインユーザー：トップページ」へ遷移するようにコントローラー内に定義
```ruby:app/controllers/items_controller.rb
before_action :authenticate_user!, only: [:new, :create, :edit, :update]
before_action :correct_user, only: [:edit, :update]

# 中略

private

  def correct_user
    @item = Item.find(params[:id])
    return if current_user.id == @item.user.id

    redirect_to root_path
  end
```
privateメソッド内に`correct_user`メソッドを定義（ログインユーザー＝出品者となっていない場合はトップページへ遷移）し`before_action`でedit,updateアクションが実行される前に判別できるように設定

### 入力が誤っていた際エラーハンドリングができるようにupdateアクションを修正
```ruby:app/controllers/items_controller.rb
def update
  @item = Item.find(params[:id])
  if @item.update(item_params)
    redirect_to item_path(@item.id)
  else
    render :edit, status: :unprocessable_entity
  end
end
```
変数`item`では`<%= render 'shared/error_messages', model: f.object %>`が読み込まれなかったので`@item`に修正しコードを記述

### 同じコードをメソッドとしてまとめる
`@item = Item.find(params[:id])`が`show,edit,updateアクションで使用されていたので、
`set_itemメソッドでまとめる
```ruby:app/controllers/items_controller.rb
# 中略

before_action :set_item, only: [:edit, :show, :update]

# 中略

  def show
  end

  def edit
  end

  def update
    if @item.update(item_params)
      redirect_to item_path(@item.id)
    else
      render :edit, status: :unprocessable_entity
    end
  end

private

  def set_item
    @item = Item.find(params[:id])
  end
```

実装が完了したのでコードレビュー依頼！
リファクタリングの修正依頼あり
### リファクタリング
```app/controllers/items_controller.rb
before_action :set_item, only: [:edit, :show, :update]
before_action :correct_user, only: [:edit, :update]

# 中略
def correct_user
    return if current_user.id == @item.user.id

    redirect_to root_path
end
```

`before_action`の`set_item`を先に実行させることによって`correct_user`メソッドに`@item = Item.find(params[:id])`が渡されるようになるので省略することができる

LGTMいただいてので次回は商品削除機能の実装に取り組んでいきます！！
WSLでGitの認証情報を毎回聞かれないようにする方法

# 手順
1. [Windows上] Git for Windowsのインストール (https://git-scm.com/downloads/win)
2. [WSL上] `git config --global credential.helper "/mnt/c/Program\ Files/Git/mingw64/libexec/git-core/git-credential-wincred.exe"`
3. 初回のgit pushやgit pull時に認証情報を入力すると、以降は同じリポジトリにプッシュしても認証情報は求められない。

これでWSL上でもストレスなくgitを使えるようになりました。めでたしめでたし。

# FAQ
## Q. git pushすると403エラーが返ってきます。
A. すでにGit Credential Managerに誤った認証情報が設定されている可能性があります。[こちら](https://zenn.dev/dzeyelid/articles/51b206dec9f740)のページを参考に認証情報が間違っていないか確認してみてください。
# Next.jsのベストプラクティス（コンポーネント編）

# Next.jsのベストプラクティス（コンポーネント編）

## まずコンポーネントって何？
コンポーネントとはアプリを構成する部品のことです。Webサイトはいろいろな部品から成り立っており、コンポーネント化することでその部品を再利用することができます。

## Next.jsでは部品が作られる場所が重要
- **クライアント側なのか？サーバー側なのか？**

![スクリーンショット 2024-10-27 15.19.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3664061/0717b59a-75e6-c9fd-ad76-465a39582a62.png)


クライアント側はサーバー側にデータが欲しいとリクエストを送ります。Next.jsはサーバー側（サーバー側に近いクライアント）とクライアント側（クライアント側に近いクライアント）があり、サーバーに近いことでデータのやり取りがしやすいです。またクライアント側で画面を切り替えるだけの時はサーバーとやり取りがあまりないです。この2つの場合をどのようにコードに落とし込んだらいいのかを説明します。

### Server Component
Server Componentを使うときには、デフォルトでServer Componentになります。

**ユースケース**
- 非同期処理を使うとき。サーバーからリクエストを送る場合、Server Componentでは`async/await`などを使うことが可能です。

### Client Component
Client Componentを使うときは、ファイルの先頭に`"use client"`をつけます。Client Componentはあまり使わない方がいいです。

**ユースケース**
- **Hooksを使う時**：`useState`, `useEffect`, `useRef`など、これらはクライアント側で状態を管理するため、サーバー側では管理できないものです。
- **イベントハンドラーを使う時**：`onClick`, `onChange`などはクライアント側で動くもので、サーバーとは関係のない動きをします。
- **ブラウザーのAPIを利用する時**：`localStorage` / `sessionStorage`, `window` / `document`を使う時です。
- **クライアント操作が多い時**：フォームコンポーネント、検索コンポーネント、タブ切り替えやハンバーガーメニュー開閉（真偽値）など。

### 注意点：Client Boundary
- Client Componentの子コンポーネントは自動的にClient Componentになります。そのため、意図しないClient Componentに注意が必要です。　

**→対策**：Compositionパターンで回避できます。

https://zenn.dev/akfm/books/nextjs-basic-principle/viewer/part_2_composition_pattern
## ベストプラクティス
- **サーバーコンポーネントを積極的に使う。クライアントコンポーネントは控えめに！**
【小ネタ】Windows Server 2025とAzure File Syncについて

こんばんわ。
久しぶりの投稿です。
情報処理試験や既に取得済みの資格試験の更新作業など現在進行形で忙しいです。
なので小ネタになってしまいますがWindows Server 2025と既存のAzureサービス、Azure File Syncとで面白い情報を仕入れたので公開します。
仕入れたといっても大した情報源ではなく、Microsoft公式の情報です。

# Windows Server 2025とは
現時点(2024年10月27日)まだ公開されていませんが、次期Windows Server OSです。
https://learn.microsoft.com/ja-jp/windows-server/get-started/whats-new-windows-server-2025

# Azure File Syncとは
[過去の記事](https://qiita.com/hidekko/items/d333efdd260a1c66d290)でAWSの同等サービスと比較していますが、Azure FilesとWindows OSとの同期を行うサービスです。
参考までに過去の構成図を再掲します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/3a0b2a46-af40-bea5-2a1d-a23ca9bf8829.png)

# Azure File Sync エージェントの対応OSバージョンについて
こちらが今回の本題の小ネタです。
https://www.microsoft.com/en-us/download/details.aspx?id=57159
こちらにあるように、Windows Server 2025は既に対応OSに含まれています。
現時点の公開情報を魚拓しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/1b250947-41da-1ca0-6e13-43e6a534e5dd.png)
<font color="red">赤枠内</font>の通りWS2025の文字がありますね。
まだWindows Server 2025でインストールを試していませんが、恐らく動作するのでしょう。

# 既存のファイルサーバ系のサービスとの関連性はどうなるの？
この疑問がAzure File SyncエージェントのWindows Server 2025対応を見たときに思い浮かびました。
S2D、記憶域スペースダイレクトがWindows Server 2025ではさらに強化される見込みですが、この機能とAzure File Syncとの組み合わせは更に強力になるのでしょうか？

また時間があれば検証してみます。

本日はここまで。
【Android】ヘルスコネクトから取得可能なデータと権限まとめ

# はじめに
Google Fitのサポートが2025年6月末を持って廃止されることはみなさんご存知でしょうか？
エクササイズ系のサービスを開発されている方であればご存じの方も多いかと思いますが、Fitの代わりにヘルスコネクトを使用する形へ置き換わります。
Fitからのヘルスコネクトへの移行も中々大変ですが、今回はヘルスコネクトから取得ができる情報と取得する際に必要な権限などを合わせてまとめたいと思います。

# 取得可能なデータの種別

### 1. アクティビティおよびエクササイズ

取得に必要な権限：android.permission.ACTIVITY_RECOGNITION
読み取り権限：HealthPermission.getReadPermission(StepsRecord::class)
書き込み権限：HealthPermission.getWritePermission(StepsRecord::class)

- 歩数（Steps）
- 移動距離（Distance）
- 消費カロリー（Calories Burned）
- 運動内容（例：ランニング、ウォーキング、サイクリングなど）

### 2. 身体測定データ

取得に必要な権限：android.permission.BODY_SENSORS
読み取り権限：例として、HealthPermission.getReadPermission(WeightRecord::class)
書き込み権限：例として、HealthPermission.getWritePermission(WeightRecord::class)

- 身長（Height）
- 体重（Weight）
- BMI（Body Mass Index）
- 体脂肪率（Body Fat Percentage）

### 3. 栄養および水分

取得に必要な権限：
android.permission.NUTRITION_READ（読み取り）、
android.permission.NUTRITION_WRITE（書き込み）
読み取り権限：HealthPermission.getReadPermission(NutritionRecord::class)
書き込み権限：HealthPermission.getWritePermission(NutritionRecord::class)

- 摂取カロリー（Calories Consumed）
- 水分摂取量（Hydration）
- 栄養素（例：タンパク質、炭水化物、ビタミン、ミネラルなど）

### 4. 睡眠データ

取得に必要な権限：android.permission.SLEEP
読み取り権限：HealthPermission.getReadPermission(SleepRecord::class)
書き込み権限：HealthPermission.getWritePermission(SleepRecord::class)

- 睡眠時間（Total Sleep Time）
- 睡眠ステージ（例：深い睡眠、浅い睡眠、レム睡眠）

### 5. 生理関連データ

取得に必要な権限：android.permission.CYCLE_TRACKING
読み取り権限：HealthPermission.getReadPermission(MenstruationRecord::class)
書き込み権限：HealthPermission.getWritePermission(MenstruationRecord::class)

- 月経周期（Menstrual Cycle）
- 排卵予測（Ovulation Prediction）

### 6. 生理関連データ

取得に必要な権限：
android.permission.VITALS_READ（読み取り）
android.permission.VITALS_WRITE（書き込み）
読み取り権限：HealthPermission.getReadPermission(HeartRateRecord::class)など
書き込み権限：HealthPermission.getWritePermission(HeartRateRecord::class)など

- 心拍数（Heart Rate）
- 血圧（Blood Pressure）
- 血糖値（Blood Glucose）
- 体温（Body Temperature）
- 酸素飽和度（Blood Oxygen Saturation）

# さいごに
だいぶ涼しくなりましたね、この季節が一番好きかもしれません！
【備忘録】PyQt5からPyQt6へのバージョンアップ

## はじめに
LinuxやPython界隈ではバージョンアップでハマることが多いですね。ラズパイStretchでPython3.5のコードを使っていましたが、アップグレードやらなにやらしているうちに、USBに繋いだArduinoを認識しなくなり、仕方なしにBookwormを再インストールしたら、仮想環境でないとPythonが使えなくなっていたり、Python3.5にライブラリがpip installできなくなっていたり・・・numpyすら入らなかったです。Cythonのバージョンを下げても何してもダメでした。私の力量不足ですが。
そこで、いっそのことPython3.5で書かれたコードをBookwormで標準のPython3.12へ書き換えることに。PyQt5もpip installできず、PyQt6にバージョンアップすることになりました。PyQt5とPyQt6であまり変更はないという話がちらほらありますが、実際は結構違うように思います。備忘録的に変更点を記します。
## 準備
2024年時点で最新のRaspberry Pi osはBookworm。Raspberry Pi 3Bでも問題なく使える。ラズパイに限らず、Bookwormだと仮想環境でないとpipが使えないようになった模様。
~~~console:OSアップデート
sudo apt update
sudo apt upgrade
sudo reboot now
~~~~
~~~console:仮想環境セットアップ
cd
python3 -m venv python3.12
~~~
仮想環境に入る際は
~~~console:
source python3.12/bin/activate
~~~
プロンプトの前に(python3.12)と付くので仮想環境に入ったことが確認できる。

仮想環境を終了するときは
~~~console:
deactivate
~~~
で終了する。
~~~console:PyQt6のインストール
source python3.12/bin/activate
pip install PyQt6
~~~
## PyQt5とPyQt6の変更点
### インポート
あまり差はない。5を6に。
~~~python:PyQt5
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QMainWindow, QApplication, QFileDialog
~~~
~~~python:PyQt6
import sys
from PyQt6 import QtCore, QtGui, QtWidgets
from PyQt6.QtWidgets import QMainWindow, QApplication, QFileDialog
~~~
### .exec_() → .exec()
.exec_()とアンダーバーが付いている箇所からアンダーバーを取る。
~~~python:PyQt5
app = QtWidgets.QApplication(sys.argv)
sys.exit(app.exec_())
~~~
~~~python:PyQt6
app = QtWidgets.QApplication(sys.argv)
sys.exit(app.exec())
~~~

### その他
属性（attribute）エラーがでるので
~~~python:PyQt5
tabWidget = QtWidgets.QTabWidget(self.centralwidget)
tabWidget.setFocusPolicy(QtCore.Qt.TabFocus)
tabWidget.setTabPosition(QtWidgets.QTabWidget.North)
tabWidget.setTabShape(QtWidgets.QTabWidget.Triangular)
~~~
~~~python:PyQt6
tabWidget = QtWidgets.QTabWidget(self.centralwidget)
tabWidget.setFocusPolicy(QtCore.Qt.FocusPolicy.TabFocus)
tabWidget.setTabPosition(QtWidgets.QTabWidget.TabPosition.North)
tabWidget.setTabShape(QtWidgets.QTabWidget.TabShape.Triangular)
~~~
こんな感じで書き換えていく。
変更点がありすぎて網羅することは難しいが、例えばPyQt5でQt.AlignCenterだとattribute errorとなる。そんな時は[Qt公式](https://doc.qt.io/)で、"Qt.AlignCenter"を検索。
Qt::AlignCenterの項で、項目名としてenum Qt::AlignmentFlagとあり、
PyQt6では、Qt.AlignmentFlag.AlignCenterとなる。

その他、継承元の変更もあり、QactionがQtWidgetsからQtGuiに移動。
~~~python:PyQt5
QtWidgets.QAction()
~~~
~~~python:PyQt6
QtGui.QAction()
~~~
下記によると、他にもあるようだ。
https://help.autodesk.com/view/MAYADEV/2025/JPN/?guid=Qt6Migration

## 余談
シリンジポンプ（3連）を自作していて、[Poseidon](https://github.com/pachterlab/poseidon)を使っていました。なぜUSB接続のArduinoが認識されなくなったか全くの謎ですが、OS再インストールでUSB認識が復活し、PythonコードもPython3.5（PyQt5）からPython3.12（PyQt6）に書き換えられ、無事、ステッピングモーターが動きました。Poseidonにはカメラを使う機能があり、私はカメラを使わないのですが、もし使うとしたらOpenCVがバージョンアップしているので結構苦労しそうですね。
Boostrap Motalを使って、ポップアップを作成する

## 紹介
バックエンドエンジニアとして、
最近、フロントエンドに興味があるので、
図書管理システムのプロジェクトを練習として試してみたいと思います
よろしくお願いいたします。
このページは
BoostのMotal,Formを使用する図書追加ページです

## コード

```html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Test Bootstrap</title>
    <link rel="stylesheet" href="https://cdn.staticfile.net/twitter-bootstrap/3.3.7/css/bootstrap.min.css">
	<script src="https://cdn.staticfile.net/jquery/2.1.1/jquery.min.js"></script>
	<script src="https://cdn.staticfile.net/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>
</head>
<body>


<h2>Book Managerment System</h2>
<!-- Button -->
<button class="btn btn-primary btn-lg" data-toggle="modal" data-target="#myModal">
	Add
</button>
<!-- Modal -->
<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
	<div class="modal-dialog">
		<div class="modal-content">
			<div class="modal-header">
				<button type="button" class="close" data-dismiss="modal" aria-hidden="true">
					&times;
				</button>
				<h4 class="modal-title" id="myModalLabel">Add New Book</h4>
			</div>
			<div class="modal-body">
				<form class="form-horizontal" role="form">
                    <div class="form-group">
                      <label for="BookName" class="col-sm-2 control-label">Name</label>
                      <div class="col-sm-8">
                        <input type="text" class="form-control" id="BookName" placeholder="please input book name">
                      </div>
                    </div>
                    <div class="form-group">
                    <label for="BookAuthor" class="col-sm-2 control-label">Author</label>
                    <div class="col-sm-8">
                      <input type="text" class="form-control" id="BookAuthor" placeholder="please input book author">
                    </div>
                    </div>
                    <div class="form-group">
                        <label for="Bookpublisher" class="col-sm-2 control-label">Publisher</label>
                        <div class="col-sm-8">
                          <input type="text" class="form-control" id="Bookpublisher" placeholder="please input book publisher">
                        </div>
                    </div>
                </form>
			</div>
			<div class="modal-footer">
				<button type="button" class="btn btn-default" data-dismiss="modal">Close
				</button>
				<button type="button" class="btn btn-primary">
					Submit
				</button>
			</div>
		</div><!-- /.modal-content -->
	</div><!-- /.modal -->
</div>
</body>
</html>
    
</body>
</html>
```

## 実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3916068/c48858d1-1b1e-d3a9-5136-bddba9fe1b84.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3916068/0dbd3910-bda2-3fcf-7bce-b0f9443ec3e6.png)
[JavaScript] モジュールバンドラー

# 目次
- [モジュールバンドラーとは](#モジュールバンドラーとは)
- [種類](#種類)

# モジュールバンドラーとは
複数のJavaScriptファイルや他の依存ファイルを1つまたは複数のファイルにまとめ、ブラウザで効率的に読み込めるようにするツール
パフォーマンスを改善するために、コードの縮小や動的ロードの最適化なども行う

# 種類
1. Webpack
最も普及しているバンドラーで、豊富なプラグインやローダーを使用して、JSやCSS、画像などの様々なファイルをまとめられる
1. Rollup
ライブラリ向けに最適化されたバンドラーで、ツリーシェイキング機能が優れている
主にESモジュールを効率よく処理できる点が特徴
1. Parcel
設定が不要な「ゼロコンフィグ」で簡単に使えるバンドラー
柔軟な設定も可能で、多くの機能を自動化する
1. Vite
開発サーバーが非常に高速で、モジュールバンドラーとビルドツールの両方の機能を兼ね備えている
ESモジュールをネイティブにサポートし、開発時はESMを使ってブラウザにファイルを直接提供する
生産ビルドでは、Rollupを使用して効率的に最適化したバンドルを作成できる

# 参考リンク
- [モダンJavaScriptの基礎から始める挫折しないためのReact入門
](https://www.udemy.com/course/modern_javascipt_react_beginner)
- [JavaScript人気バンドラーを徹底比較─Rollup、Webpack、Parcelの特徴と違い](https://kinsta.com/jp/blog/rollup-vs-webpack-vs-parcel/)
- [【徹底比較】ViteとWebpackの違いとは](https://kinsta.com/jp/blog/vite-vs-webpack/)
フレームはパケットだった

>イーサネットではデータをイーサネット・フレームに収まる長さに分割していく。最も一般的なIPの例で見てみよう（図1-2）。まず，データをイーサネット・フレームに収まる長さのIPパケットに分割し，それをイーサネット・フレームに入れてネットワークに送り出している。
>
>図1-2●イーサネット・フレームの長さに合わせてデータを分割
IPはアプリケーションから受け取ったデータをイーサネット・フレームの長さに合わせて分割しIPパケットを作る。これをイーサネット・フレームに詰めて，ネットワークに送り出す。
....
　送り出されたイーサネット・フレームがあて先コンピュータに届くと，送信するときとは逆の手順で開かれ，元のデータに組み上げられる。
>
>運べるデータは1500バイト以内
　では，実際にイーサネット・フレームの長さはどれくらいなんだろう。イーサネット・フレーム全体の長さは64～1518バイトと決められている。これを「フレーム長」という。この中には，あて先や送信元を示すMACアドレスなどの制御情報も含む。そのため，一つのイーサネット・フレームで実際に運べるデータは46～1500バイトとなる。

https://xtech.nikkei.com/it/article/COLUMN/20070911/281644/#:~:text=%E3%82%A4%E3%83%BC%E3%82%B5%E3%83%8D%E3%83%83%E3%83%88%E3%81%A7%E3%81%AF%E3%83%87%E3%83%BC%E3%82%BF,%E7%9B%AE%E6%AC%A1%E3%81%B8%E6%88%BB%E3%82%8B

イーサネット・フレーム全体の長さは64～1518バイト

>パケット交換機に送信される。パケット交換機では、パケットを一旦メモリに蓄積し、パケットのヘッダに記載された宛先情報とパケット交換気ないのルーチングテーブルを用いて、パケットの送信経路を決定し、送信回線にパケットを送信する。

https://www.ieice-hbkb.org/files/05/05gun_04hen_03.pdf

イーサネットフレームもパケット同じか

>イーサネットネットワークで送信できるパケットの最大サイズは通常 1,500 バイトです。

https://oip.manual.canon/USRMA-0280-zz-SS-jaJP/contents/05040020.html#:~:text=%E3%82%A4%E3%83%BC%E3%82%B5%E3%83%8D%E3%83%83%E3%83%88%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E3%81%A7%E9%80%81%E4%BF%A1%E3%81%A7%E3%81%8D%E3%82%8B%E3%83%91%E3%82%B1%E3%83%83%E3%83%88%E3%81%AE%E6%9C%80%E5%A4%A7%E3%82%B5%E3%82%A4%E3%82%BA%E3%81%AF%E9%80%9A%E5%B8%B8%201%2C500%20%E3%83%90%E3%82%A4%E3%83%88%E3%81%A7%E3%81%99%E3%80%82

ネットワークに流されるフレームとパケットのサイズが同じだから同じだと思う。
パケット交換方式と書いてあったからインターネット層だと思った。

# 感想
とりあえずパケット交換方式に関して調べます
ActiveRecord::RecordNotFound in CardsController#showを解決した話。

# 『Ruby on Rails6 超入門』(2020年、秀和システム)の207ページで止まってしまいました。

# 前提
`ruby 2.7.7p221 (2022-11-24 revision 168ec2b1e5) [x86_64-linux]`
`Rails 6.1.7.10`

# 詰まっている箇所（Chapter3-4 読書カードを作ろう routes.rbを修正する）

当該箇所のルーティング情報がいけていなかったので、
resourcesを使って、書き直したところ、下記のエラーが出て詰まってしまいました。

ActiveRecord::RecordNotFound in CardsController#show

`resources :cards, only: [:index, :show, :new, :create, :edit, :update, :destroy]
`

# 聞きたいことの一行まとめ

なぜshowアクションを見ることができないのか？

# 問題解決するために試したこと

resourcesに`:add`を加筆する→ダメ

# 解決方法

routesは上から順番に読み込まれていくため、下記のように変更。

`Rails.application.routes.draw do
  get 'cards/add', to: 'cards#add'
  post 'cards/add', to: 'cards#add'
 
  resources :cards, only: [:index, :show, :new, :create, :edit, :update, :destroy]
 
end`


念のため、`rails s`でサーバを再度立ち上げて試したところ問題なく動きました。

以上
TDD の話②


こちらの講演会の内容もよかったです！
前回の TDD の話 と内容が似ている部分も多いので、個人的に学びになった部分をピックアップします。

https://qiita.com/b-yuko/items/577cd8b637aa27be4015

# ネタ元
- [【DXD2024】望ましい自動テストとは：どのようなテストが開発生産性と開発者体験を共に高めるのか](https://www.youtube.com/watch?v=8MiWDWAG1XQ)
スピーカー：t-wada さんこと 和田卓人さん


# テストサイズの話
### 引用元「Google ソフトウェアエンジニアリング」
#### テストサイズ
- Small
- Medium
- Large

#### Small Test の定義
テストの実行が１つのプロセスに収まっているもの

#### Medium Test の定義
１つのプロセスには収まっていないが、１つのマシンに収まっているもの

#### Large Test の定義
１つのマシンに収まっていないもの

![testSize.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3695365/98092b73-2777-183b-7128-98277b14763f.png)

# Test Scope と Test Size
![testScope&testSize.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3695365/0db0ef92-fbf4-319f-d9df-9f0adf126b6d.png)

# 一周回ってピラミッド型
ピラミッド型は古いよねって議論もあり、トロフィー型とかハニカム型がいいんじゃない？って話もあるけど、ユニットテストやインテグレーションテストの解釈がそもそもブレてるよね・・・

![ユニットテストの解釈のブレから生じがち.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3695365/fabe2b60-9118-a9ef-7111-a844974b632d.png)


テストサイズで話をすると、ピラミッド型に戻って来る

![テストサイズで分類.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3695365/f7140445-5770-025f-66ea-5d12a0247e77.png)


# テストサイズを下げるには
## Large から Medium へ
テストダブルを使う。
偽陽性、偽陰性を招きやすいので使い方には注意が必要。

![テストダブル注意.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3695365/74b9cdc2-3bb5-3d0e-f073-08b57872e68b.png)

１つのマシンに収まらないテストを１つのマシンに収めるためには、偽物を作る。
例：DynamoDB なら DynamoDB local などを使う

![Fake.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3695365/4e9b7015-ab41-5991-8e21-048cff0a2f76.png)


## Medium から Small へ
テストしにくいところを薄く切り離して、テストしたいところを大きく露出させることで、１プロセスの中にテストを収める。
テストしたいところを、入出力などから切り離すことによって、１プロセスにテストが収まるようにする。
関数プログラミングだと副作用の分離という。
低結合高凝集の設計をしていくとテストサイズが下げやすくなる。
端的に言うと「良い設計をしましょう」

![テストサイズを下げる.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3695365/bb88043f-8a1b-5eac-11f8-2dad95d339f7.png)


# 良いテスト
変化を支えるテスト。

![単体テストの４本柱.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3695365/13190b56-af35-8528-630f-1eb51c776f1a.png)

様々なレベルで、様々なスコープで変化を支える。

![サイズダウン戦略.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3695365/fc34622b-60e7-e7ad-715a-e28d03f85c1c.png)

# まとめ
ピラミッドはテストサイズで構成しましょう。
テストダブルを使ってテストサイズを下げましょう。
信頼性の高い実行結果に、短い時間で到達する状態を、長期的に維持するようなテスト戦略を立てていきましょう。

![テストをサイズダウンしてピラミッド型へ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3695365/6d2373a8-567c-2c71-cad6-d180c4bcddfc.png)


# おわりに
テストサイズの話を聞いていたら、デトロイト派とかロンドン派とか、なんかどうでもよくなってきました😇
「ロンドン派だからこう書かなきゃ・・・」とかじゃなくて、「どういうテストを書くと変化を支えることができるテストになるのか」のほうが大事なのかなと。

公演の中で何冊かの本から引用して話をしていたのも印象的だった。手を動かしてコーディングするのと同等に本から学ぶことも多いということだろう。読むのは苦手だけど、公演の中で紹介されていた本は読んでみようかな。(和訳のある本だけですが・・・)
ゼロからのOS自作入門 その1

[ゼロからの OS 自作入門](https://zero.osdev.jp/)
こちらの本を少しずつ進めていきます。

# セットアップ

- ubuntu
- WSL

の二つで作業する方法が記載されています。
なので、virtualbox+ubuntuで作業しようとしていたのですが、初めのHello Worldを表示する部分でうまくいかなかったので、[Docker ではじめる "ゼロからのOS自作入門"](https://zenn.dev/sarisia/articles/6b57ea835344b6)
こちらを参考にして、Dockerを使用して作業していくことにしました。

## うまくいかなかったところ

```
sudo mount -o loop disk.img mnt
```
の実行がうまくいかなかった。

上記はループバックデバイスとして、マウントするコマンド。
ループバックデバイスとは、普通のファイルをハードディスクなどのブロック型デバイスであるかのように扱うための機能。

failed invalid argumentのエラーになっていた。
ループバックデバイスがないと表示されていた。
→`losetup -f`で確認してみたら、そのループバックデバイスは存在していた。
いつかは、この原因がわかるといいっすね。

## Dockerでセットアップ

[Docker ではじめる "ゼロからのOS自作入門"](https://zenn.dev/sarisia/articles/6b57ea835344b6)に沿ってセットアップしたら、無事hello worldが表示されるようになりました。

Dockerをインストールするときに、少しわからなかったところをメモ。

### AMDとARM
windowsにはAMDとARMという種類のCPUがあるみたいです。

#### AMD
- **アーキテクチャ**: x86/x64アーキテクチャを使用。
- **主な特徴**: 高性能なデスクトップやノートパソコン向けのプロセッサを提供。マルチコア性能やゲーム性能に優れています。
- **用途**: 主にWindows PCやサーバーに利用される。

#### ARM

- **アーキテクチャ**: ARMアーキテクチャは省電力性に優れた設計。
- **主な特徴**: モバイルデバイスやタブレットで広く使われており、最近ではWindowsもARMプロセッサに対応しています。
- **用途**: 軽量なデバイスやバッテリー駆動の機器に最適。

基本的に、PCであればAMDなんですね。

### devcontainer
vscodeの機能で、開発環境をコンテナ内で構築するための仕組み。
プロジェクトごとに異なる設定を管理することができる。
こうやって、ほかの方が作成した環境をさっと使えて便利ですね。

# おわり

無事、hello worldが表示できて、次に進むことができそうです。
なかなかボリュームがある本なので、ゆっくりと最後まで理解してできるといいっすね。
CrossOverを使ってみた

MacでWindowsソフトを動かすお話です。

Mac歴2.5年です。
Webアプリが多くなり、多くの作業がWebで完結できることが多くなったし
Windows/Mac対応のアプリも増えてきており
Windowsのみでできて、Macで動かせないソフトは減ってきました。
しかし、依然として、Windowsのシェアは大きく、Windowsでしか動かせないソフトはあります。

日本国内OSランキング　2024年1月
- 1位 Windows 68.4%
- 2位 OS X 17.51%
- 3位 Unknown 12.17%
- 4位 Linux 1.37%
- 5位 Chrome OS 0.54%
出展：https://www.arc-c.jp/web/blog/20240910/

### MacでWindowsのソフトを動かそうとすると、大きく3つに分類されると思います。

１つは、HDD上へOSをインストールしてOSをマルチブートにする。

（今のMacではBootCampができなくなったので、事実上不可能）

２つ目は、Mac上に、Windowsの仮想マシンを作る方法。

- Parallels
    
    [Parallels: Mac & Windows Virtualization, Remote Application Server, Mac Management Solutions](https://www.parallels.com/jp/)
    

> Parallels Desktopは、仮想化ソフトウェアです。これにより、Mac上に仮想マシンを作成し、その中でWindowsを実行できます。Windowsが完全に仮想化されているため、Windows環境内で完全なWindowsアプリケーションを実行できます。
> 

- **VirtualBox**
[Oracle VM VirtualBox - ダウンロード| Oracle Technology Network | オラクル | Oracle 日本](https://www.oracle.com/jp/virtualization/technologies/vm/downloads/virtualbox-downloads.html)
などがあります。

3つ目の手法としては、互換性レイヤーを使う方法があります。

- Wine
> Wineは、Windows APIを再実装して、Unix系OS（macOSやLinuxなど）上でWindowsアプリケーションを実行するためのソフトウェアです。つまり、Windowsの仮想マシンを作成するのではなく、直接Mac上でWindowsアプリケーションを実行します。
> 

### 今回は、３つ目の互換性レイヤーを使う方法を試したので紹介します。

互換性レイヤー方式は、Windows環境内での完全なWindowsアプリケーション実行が保証されているわけではないです。

しかし、オープンソース＆WIndowsOSライセンスが不要という点でメリットが有る。

- 仮想化に比べてシステムリソースが比較的少なくて済む
- WindowsOSのライセンスが不要

| 特徴 | Parallels | Wine |
| --- | --- | --- |
| 仕組み | 仮想化 | 互換性レイヤー |
| 得意分野 | OSの仮想化、高い互換性、高性能 | WindowsアプリケーションのLinux/macOS上での実行、軽量性 |
| リソース消費量 | 多い | 少ない |
| 操作性 | 仮想マシン内のOSを操作するような感覚 | ネイティブアプリケーションに近い感覚 |
| 互換性 | 高い | アプリケーションによって異なる |

その中で、今回CrossOverというWineの商用版を試してみました。
https://www.codeweavers.com/crossover

なぜCrossOver(Wineに対して)
- Wineや派生のWhiskyも試したが、面倒な設定が多い。
- 商用でサポートある。（私は買い切りライセンスを購入した。）    
    Wineも細かい設定をすれば、CorssOverと同等になると思います。
- ゲームやオフィスソフトは、検証済みである

今回は、WinMarge

https://sourceforge.net/projects/winmerge/

をうとかしてみたいと思います。

HPより、インストーラー（WinMerge-2.16.42.1-Setup.exe）をダウンロードし、選択するだけで

CrossOverのインストール画面が立ち上がります。
![スクリーンショット 2024-10-27 14.33.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580547/8cdfaf3f-3831-c526-62fa-4271d20f85c9.png)

インストール先のボトル（隔離された環境、仮想環境に似たイメージ、どのOSとするか選択できたりします）
を選択し、インストールします。


![スクリーンショット 2024-10-27 14.38.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580547/6a3e3cb8-7208-3552-0b60-ec98c9e8ef13.png)

一部文字化けもありますが、正常にインストールし、起動できました。

![スクリーンショット 2024-10-27 14.39.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580547/b9bace6b-6cb2-c52e-4853-1705fd872e68.png)


![スクリーンショット 2024-10-27 14.39.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580547/c50f67a5-8cbe-72d8-6037-f70a0bdec33f.png)


あとから、互換性レイヤーなので、あとから指定OSのバージョンを変更することもできます。
(これは助かる)

![スクリーンショット 2024-10-27 14.40.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580547/c02c3169-d763-fb47-bc83-7a52bf82b46f.png)


Windowsの動作検証としては、互換性レイヤーは使えませんが

動くだけで良いと言うのであれば、WineやCrossOver等の互換性レイヤーでも十分なのではないでしょうか。
5分でできるGitHubリポジトリ作成術!

# 初めに
久しぶりにGitHubでリポジトリを作成しようと思ったら意外に忘れてしまっていたので
これを機にやり方をまとめておきたいと思いました
なのでまとめていきたいと思います

# リモートリポジトリの作成
GitHubにサインインまたはサインアップしたら![スクリーンショット 2024-10-22 9.54.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3682713/82907c06-fc12-ce48-2366-1444a9489125.png)
こんな画面が出てくると思います
なのでStart a new repository for ユーザ名の欄に必要な事項を記入していきます
create a new repositoryで作成が完了します

# ローカルリポジトリの作成
リモートリポジトリの作成後このような画面が出てくると思います
![スクリーンショット 2024-10-22 10.03.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3682713/30e2117d-ccd5-6eae-fc5c-1bffcc84b8eb.png)
この画像の...or create a new repository on the command lineの部分の作業をやっていきます
最初に作業用ディレクトリを作成します
ターミナルで以下を入力してください
```
mkdir 作業用ディレクトリ名 (例 todo_manager)
```
作業用ディレクトリは各自適切な場所に作ってください
私はホームディレクトリに作ることを想定しています

次に作成したディレクトリに移動します
```
cd 作業用ディレクトリ名 (例 todo_manager)
```

次にローカルで使うリポジトリを作成します
```
git init 
```
そうすると
```
Initialized empty Git repository in /作業用ディレクトリまでのパス/.git/
```
これが出たらオッケー

# リモートリポジトリとローカルリポジトリの紐付け
次にリモートリポジトリとローカルリポジトリの紐付けを行います
「ローカルリポジトリの作成」の部分で表示した写真の
...or create a new repository on the command lineの6行目にあるコマンドを打ちます
```
git remote add origin ~
```
~の部分は各環境ごとに異なると思います。
これでリモートリポジトリとローカルリポジトリの紐付けができました

# 最後に
gitは初めは慣れないかもしれませんが慣れるととても便利なので使っていきましょう！
これから開発頑張っていきましょう
Ubuntu24.04でDocker desktopが起動しなかった

```
$ sudo sysctl -w kernel.apparmor_restrict_unprivileged_userns=0
$ systemctl --user restart docker-desktop
```

うちの環境ではこれで解決した。
https://askubuntu.com/questions/1511725/ubuntu-24-04-docker-desktop-is-not-starting
【Rails】furimaアプリ　商品詳細表示機能　#1

# 実装概要
 - 商品詳細表示ページにて、商品の詳細情報を表示する

### ルーティングの設定
```ruby:config/routes.rb
# 中略
resources :items, only: [:index, :new, :create, :show]
# 中略
```

### showアクションをコントローラに定義
```ruby:app/controllers/item_controller.rb
# 中略
def show
  @items = Item.find(params[:id])
end
# 中略
```

ここでmainブランチに`「ルーティングの設定」` `「showアクションをコントローラーに定義」`の2つをcommit&pushしてしまっていることに気づく

解決策を下記に記載していく

### 新しいブランチを作成
ターミナル
```
% git checkout -b 商品詳細表示機能
```

###  新しいブランチをプッシュ
ターミナル
```
% git push -u origin 商品詳細表示機能
```

### mainブランチを2つ前のコミットに戻す
ターミナル
```
% git checkout main
% git reset --hard HEAD~2
```

### 変更を強制プッシュ
ターミナル
```
% git push --force origin main
```
#### 注意点
- `--hard` オプションにより、コミット履歴だけでなく作業ツリーも強制的に戻されるため、変更やファイルの状態がすべて2つ前のコミット時点に戻る
- この操作は不可逆的なので、現在のコミットや作業内容が必要な場合は、実行する前にgit branchコマンドで別ブランチを作成し、バックアップを取る等の対応が必要

その後GitHub Desktopで商品詳細表示機能ブランチに変更されていることを確認し、
戻した分のcommit2つをpullして、解決することができた

### `index.html.erb`ファイル、`show.html.erb`ファイルの作成&修正
ターミナルにて`rails routes`コマンドでルートを確認し、下記コードを記述
```ruby:app/views/items/index.html.erb
# 中略
<%= link_to item_path(item.id) do %>
# 中略
```
```ruby:app/views/items/show.html.erb
# 中略
<% if user_signed_in? && current_user.id == @item.user_id %>
  <%= link_to "商品の編集", "#", method: :get, class: "item-red-btn" %>
  <p class="or-text">or</p>
  <%= link_to "削除", "#", data: {turbo_method: :delete}, class:"item-destroy" %>
<% end %>

<% if user_signed_in? && current_user.id != @item.user_id%>
  <%# 商品が売れていない場合はこちらを表示しましょう %>
  <%= link_to "購入画面に進む", "#" ,class:"item-red-btn"%>
  <%# //商品が売れていない場合はこちらを表示しましょう %>
<% end %>
# 中略
```

商品の編集・削除ボタンは出品者のみ表示されるよう`<% if user_signed_in? && current_user.id == @item.user_id %>`を記述

購入ボタンはログインしている出品者以外のユーザーのみ表示されるよう`<% if user_signed_in? && current_user.id != @item.user_id%>`を記述

実際にログイン（出品者、出品者以外）、未ログインにて動作するか確認し、問題ないことを確認
コードレビューを依頼

修正依頼でリファクタリングが必要とのこと
### リファクタリング
`修正前`
```ruby:app/views/items/show.html.erb
# 中略
<% if user_signed_in? && current_user.id == @item.user_id %>
    <%= link_to "商品の編集", "#", method: :get, class: "item-red-btn" %>
    <p class="or-text">or</p>
    <%= link_to "削除", "#", data: {turbo_method: :delete}, class:"item-destroy" %>
<% end %>
<% if user_signed_in? && current_user.id != @item.user_id %>
    <%# 商品が売れていない場合はこちらを表示しましょう %>
    <%= link_to "購入画面に進む", "#" ,class:"item-red-btn"%>
    <%# //商品が売れていない場合はこちらを表示しましょう %>
<% end %>
# 中略
```
`修正後`
```ruby:app/views/items/show.html.erb
<% if user_signed_in? %>
      <% if current_user.id == @item.user_id %>
        <%= link_to "商品の編集", "#", method: :get, class: "item-red-btn" %>
        <p class="or-text">or</p>
        <%= link_to "削除", "#", data: {turbo_method: :delete}, class:"item-destroy" %>
      <% else %>
      <%# 商品が売れていない場合はこちらを表示しましょう %>
      <%= link_to "購入画面に進む", "#" ,class:"item-red-btn"%>
      <%# //商品が売れていない場合はこちらを表示しましょう %>
      <% end %>
    <% end %>
```

`if user_signed_in?`が繰り返し使用されていたので、１つにまとめたコードに修正
商品詳細表示機能実装完了です！！
次回は商品情報編集機能に取り組んでいきます！
Figma Code Connectでネストされたインスタンスのプロパティにアクセスする

## この記事の概要

FigmaのCode Connectにおいて、コンポーネントをネストして作成している場合の書き方が若干複雑（というかドキュメントを読んだときにパッと分かりづらい）気がしたので記事にしました。

## 環境

コード側はReactです。
また、Code Connectのバージョンは1.2.1です。

## 前提

こういった2つのコンポーネントがあるとします。

| Button | Card |
| --- | --- |
| ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214677/13c08af9-1500-120f-b874-8e31e5ee846a.png) | ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214677/45d2b42d-6173-ca36-ea15-ecdadab2b860.png) |

`Card`の中には`Button`のインスタンスがあります。
このとき、`Button`インスタンスのテキスト（`label`という名前のプロパティ）を`acrion`というpropsとして受け取り、Dev Mode上で変更を見たいとします。

## 結論

今回でいうと

```tsx
import figma from "@figma/code-connect";
import { Card } from "./Card";

figma.connect(
	Card,
	YOUR_FILE_URL,
	{
		props: {
			// 他のprops
			action: figma.nestedProps("Button", {
				label: figma.string("label"),
			}),
		},
		example: ({ action, ...props }) => (
			<Card action={action.label} {...props} />
		),
	},
);
```

一般化するとこういう書式です。

```tsx
figma.nestedProps({Figmaコンポーネント名}, {
	{Reactコンポーネントのprops名}: figma.適切なFigmaConnectAPI(Figmaコンポーネントのプロパティ名)
})
```

## 最後に

Figmaでのプロパティ名とReactでのprops名が完全に揃っていても、どの位置になんと書くのかが若干複雑な気がして、整理してみました。

とは言えまだCode Connectに色々な変更が入っていそうで、そのうちもう少し分かりやすくなるのかもしれません。
例えば1.2.0では`figma.instance()`に`getProps`という関数が生えていて、便利になりそうな気がしています。

今後も期待です。
C++の例外処理まとめ

## はじめに

C++の例外処理は、プログラムの実行中に発生するエラーや異常な状態を扱うための重要な機能です。

---

## 1. 例外処理の基礎

### 1.1 例外とは

例外とは、プログラムの実行中に発生するエラーや予期しない状況を通知するための機構です。例外処理を用いることで、エラー発生時に適切な対策を講じ、プログラムのクラッシュを防ぐことができます。

### 1.2 try-catchブロックの基本構文

C++における例外処理は、`try`、`catch`、`throw`のキーワードを使用します。

```cpp
try {
    // 例外が発生する可能性のあるコード
} catch (例外型 変数名) {
    // 例外を処理するコード
}
```

---

## 2. 例外の投げ方とキャッチ方法

### 2.1 例外を投げる（throw）

例外は`throw`キーワードを使って投げます。投げられた例外は、対応する`catch`ブロックでキャッチされるまでスタックを巻き戻します。

```cpp
void divide(int a, int b) {
    if (b == 0) {
        throw std::invalid_argument("ゼロで除算しようとしました。");
    }
    std::cout << "結果: " << a / b << std::endl;
}
```

### 2.2 例外をキャッチする（catch）

`throw`された例外は、対応する型の`catch`ブロックでキャッチされます。

```cpp
try {
    divide(10, 0);
} catch (const std::invalid_argument& e) {
    std::cerr << "エラー: " << e.what() << std::endl;
}
```

---

## 3. 標準例外クラス

C++標準ライブラリには、多くの例外クラスが用意されています。これらを活用することで、一般的なエラー状況を簡潔に扱えます。

### 3.1 主な標準例外クラス

- `std::exception`：すべての標準例外の基本クラス。
- `std::logic_error`：プログラムの論理エラーを示す。
    - `std::invalid_argument`
    - `std::domain_error`
    - `std::length_error`
    - `std::out_of_range`
- `std::runtime_error`：実行時エラーを示す。
    - `std::overflow_error`
    - `std::underflow_error`
    - `std::range_error`

---

## 4. 独自の例外クラスの作成

標準例外クラスでは対応できない特殊なエラー状況には、独自の例外クラスを作成します。

### 4.1 基本的な独自例外クラスの実装

```cpp
class MyException : public std::exception {
private:
    std::string message;

public:
    explicit MyException(const std::string& msg) : message(msg) {}

    const char* what() const noexcept override {
        return message.c_str();
    }
};
```

使用例：

```cpp
try {
    throw MyException("独自の例外が発生しました。");
} catch (const MyException& e) {
    std::cerr << e.what() << std::endl;
}
```

---

## 5. まとめ

- **例外処理はエラーや異常を安全に扱うための重要な機構です。**
- **`try`、`catch`、`throw`を適切に使って、例外を投げてキャッチします。**
- **標準例外クラスを活用し、必要に応じて独自の例外クラスを作成します。**
- **例外安全性を確保するために、リソース管理やプログラムの状態管理に注意します。**