OmniAICreator/Qiita-1.07M huggingface dataset:
Dartsライブラリを用いたHolt-wintersによるS&P500株価予測

# Holt-Winters法による時系列予測

## はじめに

Holt-Winters法は、時系列データの予測に広く用いられる手法で、特に季節性のあるデータに対して効果的です。この手法は、トレンドと季節性を考慮に入れることで、より正確な予測を実現します。
本記事では、基本的な概念とpythonライブラリのDartsを用いた適用例を紹介します。

## Holt-Wintersとは

Holt-Winters法は、以下の3つの成分を用いて時系列データをモデル化します。

1. **レベル（Level）**: 現在の時点でのデータの基本的な値を示します。
2. **トレンド（Trend）**: データの増加または減少の速度を示します。
3. **季節性（Seasonality）**: データが時間の経過とともに周期的に変動するパターンを示します。

Holt-Winters法には、**加法モデル**と**乗法モデル**の2つのバリエーションがあります。

- **加法モデル**: トレンドと季節性が独立していると仮定します。データの変動が一定の範囲内である場合に適しています。
  
  $$ Y_t = L_t + T_t + S_t $$
  

- **乗法モデル**: トレンドと季節性が互いに依存していると仮定します。データの変動が時間の経過とともに増大する場合に適しています。
  
  $$ Y_t = L_t \cdot T_t \cdot S_t $$
  

ここで、$(Y_t)$は時点$(t$)における観測値、$(L_t$)はレベル、$(T_t$)はトレンド、$(S_t$)は季節性を示します。

別名３重指数平滑化法とも言うようです。pythonライブラリに寄ってはETS(Exponential triple smoothing)と書いてあったりします。
伝統的な手法なため、最近ではexcel関数でも実装できる模様。
>excel関数: FORECAST.ETS()


## Holt-Winters法の適用例
今回はpythonライブラリの一つであるDartsを使用しました。Dartsは時系列予測に特化したライブラリで、簡単なコードで様々な予測モデルを実装できます。

以下に、Pythonの`darts`ライブラリを使用したHolt-Winters法の実装例を示します。なお、S&P500の株価データはyfinanceライブラリを使用することでとても簡単に取得できます。

```python
import yfinance as yf
from darts import TimeSeries
from darts.models import ExponentialSmoothing
import pandas as pd
import matplotlib.pyplot as plt

# S&P 500の株価データを取得
data = yf.download('^GSPC', start='2018-01-01', end='2024-10-18')
data = data[['Close']].resample('M').last().reset_index()

# 時系列データをDartsのTimeSeriesに変換
series = TimeSeries.from_dataframe(data, 'Date', 'Close')

# 学習用と検証用に分割
train, val = series[:-24], series[-24:]

# モデルの作成とフィッティング
model = ExponentialSmoothing(seasonal=SeasonalityMode.MULTIPLICATIVE, seasonal_periods=12)
model.fit(train)

# 予測
prediction = model.predict(len(val))

# 予測の可視化
plt.figure(figsize=(12, 6))
series.plot(label='Actual', lw=2)
prediction.plot(label="Forecast", lw=2)
plt.title('S&P 500 Price Forecast using Holt-Winters')
plt.xlabel('Date')
plt.ylabel('Price')
plt.legend()
plt.show()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3768377/29e85b5c-4ab0-39ac-eaf3-ad55d6d25e7e.png)

Mape: 8.89%
>MAPE(Mean Absolute Percentage Error)


本日(2024年１０月)から24ヶ月前以前のデータを用いて学習、24ヶ月分の予測しました。予測データと実際のデータを重ねて表示させています。

黒い実線と青い実線が重なっているほど精度良く予測ができている、ということになりますが、最初の数カ月はまだ誤差が少ないですが、だんだん誤差が広がっていますね。
ここ数年のS&P500の伸び方は、Holt-wintersの予想を遥かに上回る伸び方をしているようです。

## 感想
pythonライブラリDartsを用いて、時系列予測に広く用いられるHolt-wintersを実装してみました。
Dartsを用いることで、ARIMAなど他のモデルも非常にシンプルなコードで実装できそうです。

なお、そもそも24ヶ月分の予測は長すぎるので、予測の目的に応じて予測月数や頻度（場合によっては日単位、時間単位）を検討する必要があるかと思います。機会があれば、パラメータの調整や他モデルの適用も試して予測精度をさらに高めていきたいと思います。
Union-Findの実装

Union-Findのアルゴリズムを勉強したので、競技プログラミングなどで必要になった時に、すぐに使えるようにメモを残しておきたいと思います。

# 概要
Union-Findとは、グループ分けを効率的に管理することができるデータ構造です。Union-Findを使用することによって、異なるグループを統合したり、2つの要素が同じグループに含まれているかを判定することができます。実現したいことのイメージは以下の図のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3644510/5987acd7-0498-4ad6-7a97-dab533711ebe.png)
>https://algo-method.com/descriptions/132

# 実装
Union-FindのC++での実装例を載せておきます。
```C++:UnionFind.cpp
#include <iostream>
#include <array>

class UnionFind
{
public:
	std::array<int, 100009> par; //各要素の親ノードを管理する配列
	std::array<int, 100009> siz; //頂点xを根とするグループの要素数を管理する配列

	UnionFind()
	{
		par.fill(-1); //最初は親ノードを持たないので-1で初期化
		siz.fill(1); //最初は各要素がそれぞれ異なるグループに属しているので1で初期化
	}

    //頂点xの根を求める
	int root(int x)
	{
		while (par.at(x) != -1)
		{
			x = par.at(x); //親ノードがなくなるまで探索する
		}

		return x;
	}

    //要素uとvのグループを統合する
	void unite(int u, int v)
	{
		int RootU = root(u);
		int RootV = root(v);

		if (RootU == RootV)
		{
			return;
		}

        //要素数が多いグループの根を統合後のグループの根にする
		if (siz.at(RootU) < siz.at(RootV))
		{
			par.at(RootU) = RootV;
			siz.at(RootV) = siz.at(RootU) + siz.at(RootV);
		}
		else
		{
			par.at(RootV) = RootU;
			siz.at(RootU) = siz.at(RootU) + siz.at(RootV);
		}
	}

    //要素uとvが同じグループに属するかを判定する
	bool same(int u, int v)
	{
		if (root(u) == root(v))
		{
			return true;
		}
		else
		{
			return false;
		}
	}

    //要素xのグループのメンバーの数を求める
	int count_member(int x)
	{
		int RootX = root(x);
		return siz.at(RootX);
	}
};
```
今回の記事はメモの代わりなので、Union-Findの詳しい仕組みを理解したい方は書籍などを読むことをお勧めします。
# 使い方
Union-Findクラスの使い方を以下のコードのmain関数の中に示しています。

```C++:UnionFind.cpp
#include <iostream>
#include <array>

class UnionFind
{
public:
	std::array<int, 100009> par;
	std::array<int, 100009> siz;

	UnionFind()
	{
		par.fill(-1);
		siz.fill(1);
	}

	int root(int x)
	{
		while (par.at(x) != -1)
		{
			x = par.at(x);
		}

		return x;
	}

	void unite(int u, int v)
	{
		int RootU = root(u);
		int RootV = root(v);

		if (RootU == RootV)
		{
			return;
		}

		if (siz.at(RootU) < siz.at(RootV))
		{
			par.at(RootU) = RootV;
			siz.at(RootV) = siz.at(RootU) + siz.at(RootV);
		}
		else
		{
			par.at(RootV) = RootU;
			siz.at(RootU) = siz.at(RootU) + siz.at(RootV);
		}
	}

	bool same(int u, int v)
	{
		if (root(u) == root(v))
		{
			return true;
		}
		else
		{
			return false;
		}
	}

	int count_member(int x)
	{
		int RootX = root(x);
		return siz.at(RootX);
	}
};

int main()
{
	UnionFind uf;

	std::cout << std::boolalpha << uf.same(1, 2) << std::endl;
	std::cout << uf.count_member(2) << std::endl;
	uf.unite(1, 2);
	std::cout << uf.same(1, 2) << std::endl;
	std::cout << uf.count_member(2) << std::endl;
}
```
出力
```
false
1
true
2
```
unite関数で1と2を結合した結果が反映されていることがわかります。
Union-Findはどの拠点と拠点が結ばれているかとか、属しているコミュニティのフレンドの数とか管理するのに使えそうかと思います。
# 参考
https://book.mynavi.jp/ec/products/detail/id=131288
Visual StudioのエンコードをUTF-8にする方法

# はじめに
Visual Studioのデフォルトのエンコード方式はShift JISのため、Git上や別のエディタから見たときなどに日本語が文字化けすることがあります。
ほとんどの場合UTF-8が採用されているためVisual Studioもこれに統一しようということで色々調べました。
開発に直接的な影響はありませんが色々なソフトに対応できるようにしておくと良いでしょう。

# UTF-8にする
通常のVisual Studioでは直接エンコード方式を変更する設定は(多分)ありません。
なのでEditorConfigという機能を使います。
まずはプロジェクトのルートフォルタに`.editorconfig`という名前のファイルを作成して以下の内容を書き込むことで反映できます。
```
root = true

# UTF-8に変換する対象
[*.{cpp,h}]

# 改行設定
end_of_line = lf

# UTF-8に変換
charset = utf-8-bom
```
既にVisual Studioを開いている場合は再起動をしてください。

## .editorconfigとは
元々、`.editorconfig`は環境設定をそのプロジェクトで統一するために使用するものです。このファイルは幅広いエディタで読み込むことが可能なため、チームの中で使っているエディタが違っても同じ設定で作業できるようになります。
今回はこのファイルの設定にある改行コード(`end_of_line`)とエンコード方法(`charset`)を変更しました

# 【番外編】UnityでUTF-8エンコードをする場合
UnityもエンコードはUTF-8なのでスクリプトのプレビューを見ると文字化けすると思います。
Unityの場合は「プロジェクト名`.sln`」が入っているフォルダに`.editorconfig`を入れて次のようにすればC#ファイルを全てUTF-8でエンコードするように設定できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624984/9949aecc-41bd-af70-9a3b-210c264f6334.png)

```
root = true

# c#のファイルを指定
[*.cs]

# 改行設定
end_of_line = lf

# UTF-8に変換
charset = utf-8-bom
```
特に変わった部分はありませんね。対象を.csにしただけです

# まとめ
そこまで難しい操作は無かったと思います。
すぐに設定できて、これをgit管理下に置いてしまえばチーム全員がUTF-8でエンコードするように統一できるため最初にやっておきたい作業ですね
【ABC376】コンテストメモ【AtCoder】

## はじめに

この記事では、自分が参加した「AtCoder Beginner Contest」の感想や結果をまとめます。各問題の解き方や反省点も振り返りながら、今後の改善点を考えていきます。

:::note
使用言語はC++です。
:::

:::note
「未着手」はまだ取り組んでいない問題を指します。
「未提出」は解いたものの、提出していない問題を意味します。
:::

https://atcoder.jp/contests/abc376

## 結果

- 順位: 5059位
- 点数: 750点
- 時間: 60:00
- pef: 704相当
- R: 338 → 378 (+40) Highest更新！
- 完問数:3完 ABC

## 問題別評価

### A問題

- AC 4:46
- [実行結果](https://atcoder.jp/contests/abc376/submissions/58936466)

全探索。前回押した時間を保存しておき、ボタンを押したらカウントして押した時間を更新する。

### B問題

- AC 30:36
- [実行結果](https://atcoder.jp/contests/abc376/submissions/58953506)

右手と左手は基本的に「L < R」の関係なのですが「R < L」となることがあるので条件分けをする。自分の手がある方には進めないので反対側から進むように計算する。

### C問題

- AC 60:00
- [実行結果](https://atcoder.jp/contests/abc376/submissions/58969149)

ちょっと躓いた。降順にならべて箱が大きければそのまま進める。箱より大きいおもちゃが出てきたら箱を買った想定として一つずらして大きさの比較をする。

### D問題

- WA

無向グラフの閉路検出問題です。検出してかつ最小のサイクルの数を出力する必要があるためDFSではなくてBFSでやるべきであると思う。しかし実装がわからず時間切れ...。

## 総評・まとめ

今回のコンテストは久しぶりの参加でした。最近は精進を怠っていたため、どうなるか不安でしたが、過去の自分とほぼ同じくらいの実力は発揮できたかなと思います。D問題に関しては、無向グラフの閉路検出問題であることは理解できたので、次回までに解けるようにしたいです。
一流のエンジニアになるために

# はじめに
最近、牛尾剛氏の「世界一流エンジニアの思考法」を読みました。色々勉強になることを記述されていたいので、自分の中で落とし込みを兼ねて、要点をまとめようと思います。読了後に読み返さず、印象的なことだけ記述します。

## メンタルモデルを作る
「メンタルモデル」という言葉は、本書ではよく出てきました。要は、頭の中にある自分のイメージのことです。そのタスクは自分にとってできるのか、切り捨てるのか、などいろんな物事に対して、自分のメンタルモデルに沿って、判断していくことが重要な様です。
一流のエンジニアといえども、難しいことへの理解には時間がかかる様です。頭の構造が劇的に異なるわけではないみたいため、メンタルモデルに沿って、行動しましょう。

## be lazy
「be lazy」とは、無駄をできるだけなくしていこうという考え方です。アウトカムを重視すると、考えるよりも先に行動した方が良いと考えがちですが、実際には先のことを考えて、原因を突き詰める方が良いということです。
不具合が出たときに、ログからいろんなことを試すよりも、自分で当たりをつけて行動するなどが該当します。

## こまめに質問
アメリカでは、わからないことがあったらこまめに質問することが生産性を上げるための考え方の様です。わからないことをある程度調べるのが、日本の文化ですが、詳しい人に聞く方がより詳細なことを知れるみたいです。何となくわかります。

## 心身の健康と仕事
これはよく言われますが、何のために働くかにつながると思います。不健康なまま働いても意味がないので、体という資本を大切にしましょう。

## 専門性の重要性
AIの台頭でプログラマやIT系の仕事は駆逐されるような不安があるかと思います。確かに、将来的には減少すると思いますが、現状いつまでになくなるかなんて誰にもわからないですよね。私はググりながらコーディングする人よりも、頭に構文が入っていてスラスラかける人に憧れます。そう言った人たちは、たとえプログラマという仕事が過渡期になっても、別の仕事に転用できるだろうということです。

## 急な依頼に無理に答える必要はない
明日までに〇〇をやっておいて、という依頼はよくありますよね。アメリカでは、そういった人は調整力のない人だと認識される様です。日本でもそういう節はあるかと思いますが。。。それはさておき、急な依頼には応えてあげたくなりますが、本当に急ぎの用はそれほどないので、断る様にしましょう。

## 時間を決めてタスクに取り組む
時間を決めてタスクに取り組む、というのは頭では理解できてもなかなか実践できていないですね。確かに、時間を決めてやる方が集中力が高まり良いと思います。

## 自分の作業に集中するためだけの時間を作る
会議などが重なると自分のタスクに集中できないですよね。そんなときにマルチタスクをしても生産性は上がらない様です。なので、会議に出席する際は、会議に集中する。その後チャットがきてもレスポンスせず4時間程度は自作業に没頭する時間を作ると良いみたいです。

## ドキュメントは最小限
ドキュメントやチャットに、いろんなことを書くよりも最初限の情報を記載して、質問があれば詳細を送る方が生産性が高い様です。完璧なドキュメントよりも、フィードバックを受けて修正していくものという考え方に基づいています。

# 参考文献
* 牛尾剛　「世界一流エンジニアの思考法」
[VirtualBox] インストーラーの実行に失敗

テスト環境作成のためVirutalBoxを利用しようとしたところ、
VirtualBoxのインストールに失敗したので、解決策と補足知識を備忘として残します。
## やりたいこと
VirtualBox-7.0.18-162988-Win.exeを正常に実行し、VirutalBox 7.0.18をインストールしたい。
## エラー内容　
下記エラー文のまま
```:インストール中エラー
Oracle VM VirtualBox 7.0.18 needs the 
Microsoft Visual C++ 2019 Redistributable
Package being installed first. Please install
and restart the installation of Oracle VM
VirtualBox 7.0.18.

--翻訳--
Oracle VM VirtualBox 7.0.18をインストールするには、
まずMicrosoft Visual C++ 2019 再頒布可能パッケージを
インストールする必要があります。
パッケージをインストールし、Oracle VM VirtualBox 7.0.18 の
インストールを再度開始してください。
```
## 原因
* VirtualBoxのインストールに必要な「Microsoft Visual C++ 2019 再頒布可能パッケージ」がシステムにインストールされていないことが原因
  * Visual C++でビルドされたプログラムは、実行時にVisual C++ランタイムライブラリを必要とする。ライブラリには、プログラムが正しく動作するための基本的な関数やクラスが含まれている。
  * ランタイムライブラリはWindowsに標準でインストールされていない場合があり、その場合は個別にインストールする必要がある。
## 解決策
Microsoft Visual C++ 2019 再頒布可能パッケージ(X64)をダウンロードし、インストールすることで解決。

https://learn.microsoft.com/en-us/cpp/windows/latest-supported-vc-redist?view=msvc-160
【基本情報】独学マラソン アンゾフの多角化戦略 Day 19

リーダーは孤独であれ　目標達成のために仮面を被り続けよ

:::note worn
この記事は自分用の備忘録です。
:::

# 誰？
戦略的経営の父

アメリカの数学および経営学の研究者であると同時に、ロッキード・エレクトロニクス社の副社長や自身のコンサルティング会社の代表を務める、経営者として活躍した人物

複雑な経営戦略を4つの基本戦略に整理し、戦略を立てやすくしてくれた

「成長マトリクス」というらしい

|                | **既存製品** | **新製品**     |
|----------------|-------------|----------------|
| **既存市場**   | 市場浸透    | 製品開発       |
| **新市場**     | 市場開拓    | 多角化         |

https://ja.wikipedia.org/wiki/%E3%82%A4%E3%82%B4%E3%83%BC%E3%83%AB%E3%83%BB%E3%82%A2%E3%83%B3%E3%82%BE%E3%83%95

# 4つの基本戦略
### 1. **市場浸透**
   - **既存市場 × 既存製品**
   - **具体例：** マクドナルドが、既存のハンバーガーやメニューに対して、割引キャンペーンやポイントカードを使って顧客を増やすこと
   - **解説：** 既存顧客のリピート購入や新規顧客の獲得を目指す

### 2. **製品開発**
   - **既存市場 × 新製品**
   - **具体例：** スターバックスが、既存の顧客層に向けて新しい季節限定ドリンクやスイーツを発売すること
   - **解説：** 新製品の開発で既存顧客を引き付け、売上を拡大する

### 3. **市場開拓**
   - **新市場 × 既存製品**
   - **具体例：** ユニクロが、日本の人気商品を海外市場に進出させること
   - **解説：** 地域の拡大や新しい顧客層へのアプローチが含まれる

### 4. **多角化**
   - **新市場 × 新製品**
   - **具体例：** トヨタが、自動車とは異なる分野で電動アシスト自転車を新規市場に展開すること
   - **解説：** 最もリスクの高い戦略で、成功すれば大きなリターンが得られるが、慎重な計画が必要

<br>

確かにシンプルで戦略が立てやすい

# ポストコロナ時代は市場浸透は難しいらしい
- オンラインで買い物＝＞習慣化＝＞「もう買い物行かなくていいじゃん」
- リモートワーク＝＞自宅でドリップコーヒー＝＞「もうコンビニでコーヒー買わなくていいじゃん」
- SDGs＝＞ラベルレス飲料＝＞「環境に悪そうなの買わない方がいいじゃん」
- タイパ重視＝＞完全食＝＞「もう食事は作業でいいじゃん」


https://times.abema.tv/articles/-/10123547


# 変化に対応するために、多角化を狙っていくスタイル


|                  | **既存と類似の市場**          | **異なる市場**              |
|------------------|----------------------------|----------------------------|
| **既存技術と関連性が高い** | 水平型多角化               | 集中型多角化               |
| **既存技術と関連性が低い** | 垂直型多角化               | 集成型多角化               |


### 1. **水平型多角化**
   - **既存と類似の市場 × 既存技術と関連性の高い新製品**
   - **具体例：** 自動車メーカーがバイクを生産する
   - **解説：** 同じ市場での製品ラインの拡張が狙い

### 2. **垂直型多角化**
   - **既存と類似の市場 × 既存技術と関連性の低い新製品**
   - **具体例：** スーツ販売店が、社内でスーツの製造も行う
   - **解説：** サプライチェーンや流通網の統合を目的とする

### 3. **集中型多角化**
   - **異なる市場 × 既存技術と関連性の高い新製品**
   - **具体例：** カメラメーカーが医療用レンズを開発する
   - **解説：** 新しい業界やセグメントへの進出を目指します

### 4. **集成型多角化**
   - **異なる市場 × 既存の技術や市場とは無関係な新製品**
   - **具体例：** 銀行が食品業に進出する
   - **解説：** 最もリスクが高いものの、成功すれば大きなリターンが見込まれる

<br>

システム開発会社がWEB制作もやってみるのは垂直型多角化になるのかな

# 感想
マトリクスで分類して方向性を定めたら、その分類に合った戦略があるっぽい
そういう知見を元に戦略を立てることで失敗する確率を減らしていくんだろうな
成功はアート　失敗はサイエンス

# 参考

https://mirasapo-plus.go.jp/hint/15043/
AWS SAA試験合格までの記録

今年の6月に **AWS SAA(Solutions Architect - Associate)** を受験し、合格しました。今更ながら、合格までの学習記録を公開します。

## 自己紹介
去年までネットワークエンジニアをしていましたが、インフラ全般の経験を積みたいという想いから転職し、今年の1月からサーバーやクラウドを触る職場に入りました。AWSの構築経験が全くなかったので、知識を深めるためにSAAの勉強を始めました。（ちなみにサーバの方も全くの未経験だったので、LPICを勉強しました。体験記は[こちら](https://qiita.com/nuon0414/items/ab75779a648a091059b4 "LPICの合格体験記")）

AWSについては2年ほど前にクラウドプラクティショナーを取得していたので、EC2やRDSなど基本的なサービスの名前と用途はわかる、というくらいの前提知識でした。

## 試験結果
2024年6月24日受験
865点/1000点で合格
学習期間：3か月

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3587092/cd5f196c-dfbc-7fd4-4957-11ea93589f46.png)


## 教材
参考書は、こちらの教材を使いました。
https://www.kinokuniya.co.jp/f/dsg-01-9784815617943

問題演習は、Ping-tを使いました。
https://mondai.ping-t.com/g

[LPICの合格体験記](https://qiita.com/nuon0414/items/ab75779a648a091059b4 "LPICの合格体験記")でPing-tの魅力を語っていましたが、本試験でもPing-tを活用させていただきました。

## 学習方法
SAA試験では **「このサービスはどんな機能でしょうか？」** みたいな問題はほとんどなく、 **「こういうことを実現するには、どのサービスを組み合わせれば良いでしょうか？」** という聞かれ方をします。なので、単にサービスの知識を身に着けるだけではなく、**「この構成を実現するためにはこのサービスを使う」** という応用的な考え方が必要になります。
Ping-tのSAA問題集では、サービスごとの知識問題と、本番レベルの演習問題の2種類が用意されています。
まず参考書を読み込んでサービスの概要を理解し、Ping-tによるアウトプットで理解を深め、一通りのサービスを理解してから本番レベルの問題に手を出しました。
今回も、Ping-tは**レベル40**（全問題を2回以上連続で正解、模擬試験モードで9割以上を10回達成）になるまでやりこみました。

勉強は、日々の通勤時間で行っていました。リモートワークで通勤がないときは、仕事終わりに家で勉強していました。
自分のAWS環境も用意しましたが、時間が取れずあまり実機は触っていなかったです。
会社で検証用のAWS環境が与えられていたので、仕事中の空いた時間で触ってはいましたが、すべてのサービスのすべての機能は試せませんでした。

## 試験本番
仕事終わりにテストセンターで受けてきました。
試験は65問あり、内訳は以下のような感じでした。

・30問：Ping-tと似た問題
・30問：Ping-tの応用で解ける問題
・5問：全く見たことないサービスの問題

**スコアに関係ない問題が15問出る**ので、見たことないサービスの5問と応用問題のうち10問が関係ない問題だったのかなと思います。15問はスコアに関係ないと知っていたので、難しい問題があっても「これはスコアに影響しないな！」と割り切って、気楽に捨ててました。
試験の時間は2時間近くあるので、じっくり解いたとしても時間が足りなくなることは無いと思います。私は2,3周見直しをしましたが、1時間程度で退室できました。
この手の試験にしては珍しく、試験結果はその場で確認できず後日通知でした。早い時間に受ければその日の内に通知が来るそうですが、私は夕方に受けたので通知は翌日の早朝でした。朝起きたら合格メールが届いていたので、朝4時に「やったー！」と叫んでしまいました。笑
ちなみに・・・「不合格の人は試験終了後に不合格通知が出るので、それが出なかった時点で受かっている」という噂も耳にしましたが、本当かどうかは不明です。

## 感想
#### やっぱりPing-tはスゴイ。
Ping-tをやっていれば受かると思います。ただ、Ping-tは問題数が多いので、レベル40までやりこむのは過剰だったと思います。実際にサービスを触っている人は、もっと少ないやり込みでも十分に合格できると思います。

次は一個上のレベルの**SAP**に挑戦してみたいですが、SAAよりも問題文が長いという噂なので、実務でもっとAWSの経験を積んでから挑もうと思います。

最後まで読んでいただき、ありがとうございました。
伝え方が9割 ②

# 「ノー」を「イエス」に変える技術
1. 相手の好きなこと

    |例||
    |:--|:--|
    |x|このシャツは現品限りです|
    |o|こちら人気で、最後の一着なんです| 

1. 嫌いなこと回避

    |例||
    |:--|:--|
    |x|展示物に触らないで|
    |o|薬品が塗ってあるので、触らないで|

1. 選択の自由

    |例||
    |:--|:--|
    |x|デザートはいかがですか？|
    |o|マンゴープリンか、抹茶アイスどちらがいいですか？|

1. 認められたい欲

    |例||
    |:--|:--|
    |x|窓を拭いて|
    |o|あなたなら高いところまで届くからピカピカになるのよね。お願い|

1. あなた限定

    |例||
    |:--|:--|
    |x|飲みに行かない？|
    |o|鈴木くんにだけには来てほしいんだ|

1. チームワーク化

    |例||
    |:--|:--|
    |x|飲み会の幹事やって|
    |o|一緒に飲み会の幹事やらない？|

1. 感謝

    |例||
    |:--|:--|
    |x|この机を移動して|
    |o|この机を移動して。ありがとうね|

# 「強いコトバ」を作る技術
1. サプライズ法
1. ギャップ法
1. 赤裸々法
1. リピート法
1. クライマックス法
1. ナンバー法
1. 合体法
1. 頂上法
arduino R4 minimaでRAMモニタする

# はじめに
Arduino UNO R4 MINIMAにはSWDコネクタがあって便利！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302506/f1f98ffc-65b9-9e82-114d-ac49761f521c.png)

と思って使おうと思ったら、案外めんどくさい点があったので自分用メモです。

Arduino IDE：2.3.2
JScope：V7.94h

# 1. elfファイルがどこにあるか
[arduinoフォーラム](https://forum.arduino.cc/t/how-can-you-find-the-elf-file-for-your-arduion-project/391872/2)に英語記事がありましたが、ほぼその内容そのままですが少し詳しく。

## 1.1 arduino IDE設定の変更
Show verbose output during（下記真ん中あたり）にチェックを入れる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302506/6f35226e-6ae4-16fe-c61c-133128d95fce.png)

## 1.2 uploadする
output欄（一番下）にビルド結果が流れる。
main.c.oとかが入っているフォルダが表示されるので、そこにelfファイルも入っている。（しっかしどこのフォルダやねんそこ）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302506/c1b4c65e-5046-ebf4-77ea-2ed835ebbdb1.png)

# 2. Jscopeの設定
ルネサスのコミュニティページ [RA4M1 ClickerボードのJ-Link OB接続](https://community.renesas.com/cafe_rene/forums-groups/mcu-mpu/ra/f/ra/41658/ra4m1-clicker-j-link-ob) に記述があったが、デバイスは「<b>R7FA4M1AB</b>」を選択する。

＜補足＞
なんでRA4M1ないんだろう…と私も思ったがRA4M1はファミリ名で、R7FA4M1ABがマイコン名。arduino UNO R4のスケマにもR7FA4M1ABの記述ありますね。
https://docs.arduino.cc/resources/schematics/ABX00080-schematics.pdf
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302506/5d0f2d86-2a39-79ec-23c6-30156f02766e.png)

Jscope設定結果は下記。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302506/51512ce1-f739-9b1c-8cca-dbc31333a4aa.png)

# 3. RAMモニタ結果
わーいのこぎり波だ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302506/d5290894-4dac-f1f2-6db9-6bf75dad20f6.png)

なお、arduino IDE環境でビルドしたせいなのかRAMモニタ対象シンボルはめちゃくちゃいっぱい出てきました。このせいでJscopeで接続開始する際のロード時間が無駄に長いです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302506/eb565e02-cec6-8794-cdc8-2cf9fd0965fe.png)

# おわりに
やっぱモータ制御開発するならシリアルモニタではなくRAMモニタを使いたいものですね。
Cuda周りの環境を整える手順とトラブルシューティングのすべて

# はじめに
AI周りのエンジニアをしている方はGPU周りの環境を整えようとしたことがあると思います。ですが、調べるとnvidia-driver、cuda、cudnn、TensorRTをインストールすればいいことはわかるが依存関係がわからないのでよくわからなくなることがあると思います。
ここでは備忘録としてそれぞれの依存関係とインストール順序について記載します。
なお、Cudaをインンストールする際に身につけた知識ですので、何か間違っていたらご指摘お願いします。

# Nvidia Driver
OSがGPUを使用するためのドライバーのこと、GPUを使用するために使わないといけないものなので、インストールしないといけないものとしてインストールしましょう。

# CUDA
AIを使用するためのいろいろなアプリケーションが入っているとても重要なソフトウェア

# TensorRT
AIの推論を早く行うためのライブラリ、SDK

# cuDNN
Deep Learning用に用意されたライブラリ群

# 依存関係
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3633681/b12dd831-419c-5070-f198-b3eee9fcdbf3.png)

これがすべてです。
Nvidia DriverがないとCUDAがそもそも使えません。
CUDAまで正しくインストールで来ていても、TensorRT, cuDNNがインストールされていても、Cudaのバージョンに沿った推論アクセラレータであるTensorRT、Deep Learning用ライブラリであるcuDNNをインストールする必要があります。

# アンインストール
以下のサイトをご覧ください
https://kaz1.blog/2024/10/29/2024_10_29/

# トラブルシューティング
## その1: Nvidia Driverを確認
まず、Nvidia Driverが確実にインストールされているか確認しましょう
```
nvidia-smi
```
これで何か出てきたらしっかりインストールされています。
このとき、エラーが出たらnvidia系のものをすべて完全に削除してから再度インストールしましょう。このとき、Enroll MOKするか問われた時は`yes`にしてください。

## その2: Cudaを確認
```
nvcc
```
これで出てきたらOKです。これが出てこない場合は、cudaがインストールされていない or nvccにパスが通っていないのどちらかです。
次に、`nvidia-driver`を実行したときに出力されているcudaよりもしたのバージョンであることも確認してください。

## その3: cuDNN，TensorRT
cudaのバージョンとcuDNN、TensorRTのバージョンが互換性があるかどうかもう一度確認しましょう。
【機械学習/深層学習】ニューラルネットワーク・深層学習について概要の理解を深める

# ニューラルネットワーク・ディープラーニングの初学者の混乱
 機械学習のアルゴリズムの一つである**ディープラーニング (深層学習)**、そのもとになるニューラルネットワークの学習を進めていく中で、それ以外の機械学習のアルゴリズムとどのように関係しあっているのか混乱する初学者の方がいるかと思います。
　ディープラーニングと他の機械学習アルゴリズム（回帰や分類アルゴリズム）の関係について整理すると、次のように理解できます。

## 1. ディープラーニングは機械学習の一部

ディープラーニングは、機械学習の一種となります。機械学習全体が様々なアルゴリズムで構成されており、ディープラーニングはその中でもニューラルネットワークを使ったアプローチを指します。つまり、回帰や分類と同様に、ディープラーニングは**一つの学習アルゴリズムに過ぎない**という位置づけです。

## 2. 教師あり学習とディープラーニング

**教師あり学習 supervised learning**では、正解データが与えられ、そのデータを元にモデルが学習を進めます。この教師あり学習には、以下のように多くのアルゴリズムがあります。

- 線形回帰：回帰タスクにおいて、線形の関数を使って予測する。
- ロジスティック回帰：分類タスクにおいて、二値分類（0か1か）を行うアルゴリズム。
- 決定木：回帰や分類に使われるアルゴリズムで、データを木構造に分割して予測を行う。
- サポートベクターマシン（SVM）：分類問題でよく使われ、データを異なるクラスに分けるための最適な境界線を見つける。
- k近傍法（kNN）：新しいデータを近くの既知データと比較して分類・回帰するシンプルな手法。

これに対して、ディープラーニングは、**ニューラルネットワークを使ったアルゴリズム**で、特に複雑なパターン認識や大規模なデータセットで高いパフォーマンスを発揮します。回帰や分類もディープラーニングの一部として実装されることが多く、実際にはディープラーニングを使って回帰問題や分類問題を解くことができます。

## 3. ディープラーニングと他のアルゴリズムの違い

以下に、ディープラーニングと他の伝統的な機械学習アルゴリズムの違いを示します。


| アルゴリズム          | 構造                   | パフォーマンス              | 特徴抽出              | 適用範囲                            |
|:--------------------:|:-----------------------:|:---------------------------:|:--------------------:|:-----------------------------------:|
| 線形回帰              | 単純な線形関数           | 小規模データに適している     | 人が特徴量を手動で設計 | 数値予測                            |
| ロジスティック回帰    | 線形関数+シグモイド       | 小規模な分類タスク           | 人が特徴量を手動で設計 | バイナリ分類                        |
| 決定木                | 木構造                   | 単純で解釈可能               | 手動特徴量設計        | 回帰・分類                          |
| SVM                  | 境界を見つける           | 中規模データに適している     | 特徴量設計が重要      | 分類                                |
| ディープラーニング    | 多層ニューラルネットワーク | 大規模データで優れた性能     | 自動で特徴を学習      | 画像認識、自然言語処理など幅広い分野 |


ディープラーニングの特徴は、複雑な問題を解決するために大量のデータを使い、中間層で自動的に特徴を抽出していく点です。他のアルゴリズムでは人間が特徴を設計する必要がありましたが、ディープラーニングではこのプロセスを自動化し、大規模かつ複雑なデータに対しても対応できるのが大きな強みです。

## 4. ディープラーニングを使った回帰や分類

ディープラーニング自体も回帰や分類問題に対し適用して使用することは可能です。

:::note info
**ディープニューラルネットワーク**は、線形回帰の高度な形式として使われることがあります。
分類タスクでは、出力層にソフトマックス関数を使うことで、多クラス分類を行います。
:::


従来の機械学習アルゴリズム（線形回帰、SVMなど）と比較して、ディープラーニングは大規模データや複雑なパターンの認識に強みがある。小規模データやシンプルなタスクでは従来のアルゴリズムの方が効率的に機能することもあります。

# まとめ
最後に今まで、整理したものをまとめてみましょう。

- **ディープラーニング**は、ニューラルネットワークを基礎にした機械学習アルゴリズムの一つ。
- 回帰や分類はディープラーニングでも**実装可能**だが、他にもシンプルで効果的なアルゴリズムが多数存在するのでわざわざディープラーニングのアルゴリズムを使う必要もなりケースもある。
-ディープラーニングは大規模データや複雑なパターンに強く、従来のアルゴリズムは小規模データやシンプルな問題に強い。

つまり、ディープラーニングはあくまでも一つのアルゴリズムであり、他の回帰や分類アルゴリズムと同じように問題やプロジェクトに応じて使うかを判断して活用すべきものである。

以上
#
【Cコード解析】switchの空のdefaultにコメントを入れる

引き続き静的解析ツールの指摘を自動で対処するスクリプトを考える。
今回は`switch`の`default`が処理なし(`;`のみ)の場合はコメントで置き換えるスクリプトを作成する。

## 処理がないdefaultケースの";"にマッチさせる
下記の正規表現でマッチできる。後読み肯定を使って`default:`の後の`;`にマッチさせる。
``` regex
(?<=default\s*:\s*);
```
## マッチした";"をコメントで置換する
`regex.sub`を使って置換すればOK。今回はシンプルに解決できた！
``` python
import regex

with open("test.c", "r", encoding="utf-8") as file_obj:
	codetext = file_obj.read()

	ret = regex.sub(r"(?<=default\s*:\s*);", "/* 処理なし */", codetext, flags=regex.DOTALL)
	print(ret)
```
## まとめ
静的解析ツールの「`default`に処理がないよ！」という指摘はコメントを追加することで回避できるっぽい。(結局、コメントしかないなら処理がないことに変わりないのでは...？と思うが、まぁ指摘が出なくなるのであれば良しとしよう)
Unity6を試して気になったこと一覧

善は急げ。箇条書きかつ入れれば誰でもわかることですが、サジェストに引っかかりやすい今がチャンス!!
（書きかけです）

## ライトがない時の判定に変更
![スクリーンショット 2024-10-19 21.42.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2962100/486f5bae-2571-1dbe-36a2-38906998876f.png)
以上のように、 **ライトがないときは真っ暗** になりました。
ライトなしで行くならUnlitにするのがベタなので、あんまこういう人はいなさそうですが...
以下は、Unity5(2022.3.2.f1)時です。このぐらいの白さでしたが...
![スクリーンショット 2024-10-19 21.46.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2962100/d2a8aa9a-955f-0f20-2e9a-99b155e673f4.png)
今ではこのように真っ暗です。
Unlitではなかった天井のマテリアル（とテクスチャ）を回収する必要が出てきてしまいました。
![スクリーンショット 2024-10-19 21.47.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2962100/a6c8adbc-6357-0b6b-490a-efee00f79125.png)

## ライトの挙動に変化(?)
![スクリーンショット 2024-10-19 21.53.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2962100/db5835c4-8880-b1e0-87cb-acf6db50c1c8.png)
気持ち濃いめになった気が...?

## そのほか
個人的に一番気になってたのが、Mac版VisualStudioが使えなくなることでしたが、こちらも問題なく使えました。
（まぁ、メインはVScodeの方になったんでしょうが）
私はVSの方が断然使いやすくてまだ残留してますので、これはありがたい。
![スクリーンショット 2024-10-19 21.56.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2962100/5340fa5e-c74b-588a-dde2-25b87dfe0179.png)


## 最後に
使っていて、気づいたらその都度追加します。

いかがでしたか？(クソ記事の常套句)
BigDecimalのコンストラクタについて

## はじめに
エンジニアの長谷川と申します。
仕事上、JavaにおけるBigDecimalのコンストラクタについて初めて知ったことがありましたので
備忘として残しておきます。

## 取り上げるBigDecimalのコンストラクタの種類
引数の型の違いでコンストラクタがいくつか存在しますが、今回取り上げるのは
Stringを引数としたコンストラクタです。

## BigDecimalに変換できるパターン
早速ですが、今回知ったBigDecimalに変換できるパターンは下記です。
``` 
"1"			// 半角数字
"01" 		// 前0
"0.1" 		// 小数
"1.0" 		// 小数（小数部が0）
"1." 		// 小数点の後なし
".1" 		// 小数点の前なし
"１" 		// 全角数字
"-1"        // 以降は前出の負数 
"-01"
"-0.1"
"-1.0"
"-1."
"-.1"
"-１"
```
小数点の前後がないパターンや全角数字の場合にはてっきり`NumberFormatException`が発生すると思っていたので驚きました・・・。

テストコードと結果は下記の通りです。

```java:テストコード
    @DataProvider(name = "正常に変換できるパターン")
    public Object[][] normal() {
    	return new Object[][] {
            { "1" }			// 半角数字
            , { "01" }		// 前0
            , { "0.1" }		// 小数
            , { "1.0" }		// 小数（小数部が0）
            , { "1." }		// 小数点の後なし
            , { ".1" }		// 小数点の前なし
            , { "１" }		// 全角数字
            , { "-1" }
            , { "-01" }
            , { "-0.1" }
            , { "-1.0" }
            , { "-1." }
            , { "-.1" }
            , { "-１" }
        };
    }

   @Test(dataProvider = "正常に変換できるパターン")
	public void BigDecimalのコンストラクタで変換できる(String param) {
		BigDecimal actual = new BigDecimal(param);
		System.out.println(actual.toPlainString());
	}
 ```

 ```Java:結果
[RemoteTestNG] detected TestNG version 7.4.0
1
1
0.1
1.0
1
0.1
1
-1
-1
-0.1
-1.0
-1
-0.1
-1
PASSED: BigDecimalのコンストラクタで変換できる("-01")
PASSED: BigDecimalのコンストラクタで変換できる("1.")
PASSED: BigDecimalのコンストラクタで変換できる("01")
PASSED: BigDecimalのコンストラクタで変換できる("１")
PASSED: BigDecimalのコンストラクタで変換できる("-1.0")
PASSED: BigDecimalのコンストラクタで変換できる("-.1")
PASSED: BigDecimalのコンストラクタで変換できる("-１")
PASSED: BigDecimalのコンストラクタで変換できる("-1")
PASSED: BigDecimalのコンストラクタで変換できる("0.1")
PASSED: BigDecimalのコンストラクタで変換できる(".1")
PASSED: BigDecimalのコンストラクタで変換できる("-0.1")
PASSED: BigDecimalのコンストラクタで変換できる("1")
PASSED: BigDecimalのコンストラクタで変換できる("1.0")
PASSED: BigDecimalのコンストラクタで変換できる("-1.")

===============================================
Default suite
Total tests run: 14, Passes: 14, Failures: 0, Skips: 0
===============================================
```

変換出来ました。

では、`全角の．`や`全角のー`はどうか、ということですが結果は下記の通りです。

```java:テストコード
    @DataProvider(name = "正常に変換できないパターン")
    public Object[][] error() {
    	return new Object[][] {
            { "１．０" }	
            , { "ー1" }
        };
    }

    @Test(dataProvider = "正常に変換できないパターン", expectedExceptions = NumberFormatException.class)
	public void BigDecimalのコンストラクタで変換できない(String param) {
		BigDecimal actual = new BigDecimal(param);
		System.out.println(actual.toPlainString());
	}
```

```java:結果
[RemoteTestNG] detected TestNG version 7.4.0
PASSED: BigDecimalのコンストラクタで変換できない("ー1")
PASSED: BigDecimalのコンストラクタで変換できない("１．０")

===============================================
Default suite
Total tests run: 2, Passes: 2, Failures: 0, Skips: 0
===============================================
```

`expectedExceptions`で指定した`NumberFormatException`が発生し変換できませんでした。
`全角の数字`は変換できるのに`全角の．`や`全角のー`はエラーになるというちょっと釈然としない結果でした。

## 終わりに
BigDecimalの文字列を引数としたコンストラクタで、どんな文字列なら変換できるのかかくにしてみました。
クライアントから文字列で渡されたパラメータをBigDecimalに変換するようなシステムの場合、システム要件に合わせて変換前にチェックをしないと、本来エラーとしたいパラメータで処理してしまいかねませんので、ご注意ください・・・。

以上、長谷川でした。
初心者向け：効率的なコードを書くための基本原則



my site:https://anurabbvgtre.exblog.jp/35965142/ 

# 新米エンジニアが理解すべき5つの重要なコーディング習慣

プログラミングの世界に足を踏み入れたばかりの新米エンジニアとして、私は日々新しいことを学んでいます。この記事では、経験豊富なエンジニアから学んだ「効率的なコードを書くための重要な習慣」を共有します。これらのポイントは、プロジェクトの品質や生産性を向上させるのに役立つでしょう。

## 1. **コードの可読性を意識する**

コードを書く際に、最も重要なポイントの一つは「他の開発者が読みやすい」コードを書くことです。特にチームで作業する場合、自分の書いたコードが他のメンバーにとって理解しやすいものである必要があります。

- **わかりやすい変数名を使用**  
  変数名や関数名は、その役割を明確に表すものを選びましょう。例えば、`x`や`y`ではなく、`totalPrice`や`userInput`のように意味が伝わる名前を使います。

- **適切なインデントとコメントを追加**  
  コードの構造が見やすくなるように、インデントやコメントを適切に挿入しましょう。これによって、コード全体の理解が大幅に向上します。

## 2. **DRY原則を守る**

DRY（Don't Repeat Yourself）原則は、同じコードを繰り返さないという意味です。重複したコードがあると、修正が必要な際に、全ての場所を変更する必要が出てきてしまいます。関数やモジュールを活用して、再利用可能なコードを書く習慣を身に付けましょう。



## 3. **テスト駆動開発 (TDD) を取り入れる**

テスト駆動開発（TDD）は、コードを書く前にテストを書き、それに基づいて機能を実装していく手法です。これにより、バグを早期に発見でき、コードの品質が保証されます。初心者のうちからテストを書く習慣をつけると、後々大きなメリットがあります。



## 4. **バージョン管理を徹底する**

プロジェクトが小規模なものであっても、Gitなどのバージョン管理システムを使うことで、コードの履歴を追跡しやすくなります。GitHubやGitLabを活用することで、チーム開発でも効率的に作業を進めることができます。

- **こまめなコミット**: 大きな変更を一度にコミットするのではなく、変更を小分けにしてコミットすることで、バグが発生した場合に原因を特定しやすくなります。
- **ブランチを活用**: 直接メインブランチにコミットするのではなく、新しい機能やバグ修正の際には、ブランチを切って作業するのがベストプラクティスです。

## 5. **学び続ける姿勢を持つ**

テクノロジーの進化は非常に早く、新しいフレームワークや言語が日々登場します。常に最新の情報をキャッチアップし、学び続ける姿勢が重要です。Qiitaのようなプラットフォームで他のエンジニアの投稿を参考にするのも良い方法です。

---

これらの習慣を身につけることで、より効率的で保守しやすいコードが書けるようになります。コードを書くたびに改善点を見つけ、少しずつ成長していきましょう！

---
もしもミニーマウスがキャプテン・マーベルになったら？ #1 プレビュー

# もしもミニーマウスがキャプテン・マーベルになったら？ #1 プレビュー
my sitecode:https://itsnovavoyage.blogspot.com/2024/10/what-if-minnie-became-captain-marvel-1.html

こんにちは、皆さん！今日は、ディズニーの人気キャラクター、ミニーマウスがもしもキャプテン・マーベルになったら、どのような物語が展開されるのかを考えてみたいと思います。漫画やアニメの世界では、キャラクターの置き換えやパラレルワールドが非常に魅力的なテーマです。この新しい視点から、ミニーの冒険を想像してみましょう。

## 新たなヒーローの誕生

まず、ミニーマウスがキャプテン・マーベルの能力を持った場合、どのような変化が起こるのでしょうか。彼女の明るい性格やファッションセンスが、超能力とどのように融合するのかを考えるのは楽しいですね。例えば、ミニーが飛ぶシーンを想像してみてください。可愛らしいリボンを揺らしながら空を舞う姿は、視覚的にも魅力的です。

## ストーリーの展開

物語の舞台は、ディズニーワールドとマーベルユニバースの交差点に設定します。ミニーは、新たな敵に立ち向かうために、仲間たちと共に戦う姿が描かれます。彼女の友情や勇気が、逆境を乗り越える鍵となるでしょう。このストーリーでは、キャラクター同士の絆や協力の大切さが強調されます。

## 技術的な側面

このような物語を描くにあたり、ストーリーボードやキャラクターデザインは非常に重要です。プロの漫画家として、効果的な視覚表現を考慮する必要があります。また、アートスタイルの選定も、読者の心を掴む要素の一つです。デジタルツールを活用して、キャラクターの表情やアクションをリアルに描写することが求められます。

## まとめ

もしもミニーマウスがキャプテン・マーベルになったら、彼女の冒険はどのように展開されるのでしょうか。新たな視点で彼女のキャラクターを探求することは、クリエイティブな思考を促し、ファンにとっても新鮮な体験となるはずです。あなたも、ミニーのヒーローとしての旅を一緒に想像してみませんか？

このような視点からの考察を通じて、私たち自身も新しいアイデアやインスピレーションを得られるかもしれません。それでは、次回の投稿をお楽しみに！
FirebaseCLIの設定

ノンエンジニアがFirebaseCLIの設定をしてみた。

:bulb: なぜFirebaseCLIを導入するか
インストールすると、`firebase`というコマンドで各種操作ができるようになる。
firebaseコマンドで初期設定ファイルも生成ができる

# Step1 Home brewをインストール
1. ターミナルを開き、Homebrewのインストールコマンドを実行
`/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
` を実行
2. パスワードを確認
インストールの途中で、Macの管理者パスワードの入力を求られるので、ログイン時に使うパスワードを入力し、Enter。
3. ターミナルで`brew --version`を実行し、バージョンが表示されれば完了

※ネットワークが不安定なタイミングがあり、ここで3回失敗した。失敗した時は毎回アンインストールコマンドを実行した。
`/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/uninstall.sh)"
`

# Step2 Firebase CLIのインストール
Hombrewのコマンドを使って、Firebase CLIのインストールをする
1. ターミナルで`brew install firebase-cli`を実行
1. ターミナルで`firebase login`を実行
1. エラーレポートの取得を許可するか聞かれるので、Y/nで回答
1. 画面に出てきたURLをコピーし、紐付けたいアカウントでログイン
1. 紐付けたいアカウントの画面でリクエスト内容を確認し、「許可」すると「Firebase CLI Login Successful!」と表示される
1. ターミナルで`firebase projects:list`と入力し、アカウントに紐づくプロジェクトが一覧で表示すれば完了
Node.jsを学ぶ #2

## 学習の内容説明

> ポケモンデータの詳細情報を非同期処理で取得し、表示する部分です。以下のように概要をまとめます

1. ローディング表示の追加
- ポケモンデータを取得する際に、非同期処理が完了するまで「ロード中」と表示させる処理を追加しました。
- **状態管理**としてuseStateを使い、ローディング状態を管理。
- 初期状態を`true`に設定し、データ取得完了後に`false`に変更。
- JSX内で三項演算子を使って、ローディング中とデータ表示を切り替えるようにしました。
```
// ReactのuseStateフックを使用して、loadingという状態変数を初期値trueで定義
const [loading, setLoading] = useState(true);

useEffect(() => {
  // コンポーネントがマウントされた時にfetchAllPokemonData関数を呼び出して
  // データの取得が完了したら、setLoadingをfalseにしてローディングが完了したことを示す
  fetchAllPokemonData()
    .then(() => setLoading(false)); // データ取得後にloading状態をfalseに設定
}, []); // 空の依存配列を指定することで、コンポーネントのマウント時にのみ実行

return (
  <div>
    {/* ローディング中は「ロード中...」と表示し、データ取得が完了したら「ポケモンデータを取得しました」と表示 */}
    {loading ? <h1>ロード中...</h1> : <h1>ポケモンデータを取得しました</h1>}
  </div>
);

```
~単語意味~
*JSX*:（JavaScript XML）Reactで使うHTMLに似た構文のことを指します。Reactコンポーネント内で書かれる、UIを表現する部分がJSXです。JSXの特徴は、HTMLに似ているものの、JavaScriptコードとしても機能する点です。具体的には、return の中で書かれる部分がJSXです。ここにHTMLタグのようなものを書いて、Reactコンポーネントの表示を決めます。




2. ポケモンの詳細データ取得
- まずは、基本的なポケモンの一覧を取得した後、各ポケモンの詳細データをURLから取得する処理を追加しました。
- 各ポケモンのurlを使って、その詳細情報を取得するためにPromise.all()を使用。
- `Promise.all()`を使用することで、全てのポケモンの詳細情報を同時に非同期で取得し、すべてのデータが揃ったら結果を返すようにしています。
```
const loadPokemonData = (results) => {
  return Promise.all(results.map(pokemon => fetch(pokemon.url).then(res => res.json())));
};
```
3. getPokemon関数の作成
各ポケモンの詳細情報を取得するgetPokemon関数を作成しました。この関数は、各ポケモンのurlを受け取り、さらにフェッチを行い、詳細なデータを取得します。
javascript
コードをコピーする
const getPokemon = (url) => {
  return new Promise((resolve, reject) => {
    fetch(url)
      .then((response) => response.json())
      .then((data) => resolve(data))
      .catch((error) => reject(error));
  });
};
4. ログの確認
コンソールログで取得した詳細情報を確認しました。詳細には、ポケモンのタイプ、アビリティ、重さ、身長などが含まれていました。
5. Promise.allの利用
Promise.all()を使うことで、全ての非同期処理が完了するのを待ってから、まとめて結果を返すことができました。このように複数の非同期処理を効率的にまとめて扱えます。
javascript
コードをコピーする
const pokemonData = await Promise.all(results.map(pokemon => getPokemon(pokemon.url)));
次のステップ
詳細なデータを表示するUIを整えたり、エラーハンドリングを追加したりすることが考えられます。
UIで各ポケモンの詳細を一覧表示し、デザインを整えるなどの作業を行うと良いでしょう。


## グリッドを使って見た目を整える

App.cssに書き込む

```

  display: grid;
  grid-template-columns: 1fr 1fr 1fr;
  place-items: center;
  gap: 20px;
  margin-top: 20px;



```

```

    box-shadow: 3px 7px 15px -5px #777777;
    border-radius: 10px;
    background-color: #fff;
```
- Card.cssにボックスシャドウジェネレーターで作った影をつける

*-参照下のリンク-*
https://hiroyuki-n.github.io/boxShadow_generator/

## Navbarを入れる
```
<>

//全体のApp.jsにあるreturn部分
</>

```
- 空でもdivでもいいのでタグで囲む

```
   <Navbar />
```

- `<>`の真下に挿入

```
import "./Navbar.css"

const Navbar = () => {
  return (
    <nav>
      ポケモン図鑑
    </nav>
  )
}
```

- Navbar.jsとNavbar.cssを作成。
- Navbar.jsにcssを読み込み
- `<nav>`タグでタイトルを囲む
```

    background-color: #efc779;
    color: white;
    height: 65px;
    font-weight: 600;
    font-size: 25px;
    display: flex;
    justify-content: center;
    align-items: center;

```
MySQLで日本語が表示されない問題を解決する方法　(初心者用)


## 概要
MySQLデータベースを使用している際、特に日本語などの非ASCII文字を扱う場合、文字化けが発生することがあります。これは、クライアントやデータベースサーバの文字セット設定が一致していないことが原因です。このガイドでは、MySQLで日本語が正しく表示されない問題を解決するための具体的な手順を紹介します。

# 問題の原因
通常、MySQLではクライアントとサーバーが異なる文字セットを使用していると、データのやり取り時に文字化けが発生します。MySQLで文字セットが latin1 になっていると、日本語の文字が正しく表示されず、クエリの結果が「???」のように表示されることがあります。

### 解決方法
以下の手順に従って、MySQLで日本語が正しく表示されるように設定を変更します。

#### 手順 1: クライアント文字セットの確認
まず、現在の文字セット設定を確認します。MySQLのコマンドラインで以下のコマンドを実行します。

```sql
SHOW VARIABLES LIKE 'character_set%';
```

```sql
+--------------------------+--------------------------------+
| Variable_name            | Value                          |
+--------------------------+--------------------------------+
| character_set_client     | latin1                         |
| character_set_connection | latin1                         |
| character_set_database   | utf8mb4                        |
| character_set_filesystem | binary                         |
| character_set_results    | latin1                         |
| character_set_server     | utf8mb4                        |
| character_set_system     | utf8mb3                        |
| character_sets_dir       | /usr/share/mysql-8.0/charsets/ |
+--------------------------+--------------------------------+
```
このように character_set_client や character_set_results が latin1 になっている場合、クライアント側での文字セットが原因で日本語が正しく表示されていない可能性があります。

#### 手順 2: クライアント文字セットの変更
クライアント側の文字セットを utf8mb4 に設定します。MySQLクライアント内で以下のコマンドを実行します。

```sql
SET NAMES 'utf8mb4';
```
このコマンドにより、クライアント側の文字セットが utf8mb4 に変更されます。

#### 手順 3: 設定変更が反映されているか確認
設定が正しく反映されているか確認するため、再度文字セット設定を確認します。

```sql
SHOW VARIABLES LIKE 'character_set%';
```

``` sql
+--------------------------+--------------------------------+
| Variable_name            | Value                          |
+--------------------------+--------------------------------+
| character_set_client     | utf8mb4                        |
| character_set_connection | utf8mb4                        |
| character_set_database   | utf8mb4                        |
| character_set_filesystem | binary                         |
| character_set_results    | utf8mb4                        |
| character_set_server     | utf8mb4                        |
| character_set_system     | utf8mb3                        |
| character_sets_dir       | /usr/share/mysql-8.0/charsets/ |
+--------------------------+--------------------------------+
```
character_set_client、character_set_connection、character_set_results がすべて utf8mb4 になっていれば、設定は正しく変更されています。

#### 手順 4: データの再確認
最後に、データベース内の日本語が正しく表示されるか確認します。例えば、department テーブルのデータを確認します。

```sql
SELECT * FROM department;
```

```diff
+--------------+----------------+---------+
| DEPARTMENTNO | DEPARTMENTNAME | ADDRESS |
+--------------+----------------+---------+
|           10 | 総務課          | 長野県  |
|           20 | 営業課          | 新潟県  |
|           30 | 人事課          | 東京都  |
|           40 | 開発課          | 東京都  |
+--------------+----------------+---------+
````
 
日本語のデータが正しく表示されていれば、問題は解決です。
AWSとSAMLを使用して自社IDPでSSOに関するメモ

# やりたいこと
自社既存のIDP（Identity Provider）でシングルサインオンし、AWSのリソース（S3とか）へアクセスしたい

①、既存のIDPでIDとパスで認証
②、OKな場合、IDPがSAMLアサーションを返す
③、SAMLアサーションをAWS（Service Provider）に送信、（AssumeRoleWithSAMLのAPI呼び出し）
④、AWSのSTSがアサーションを検証し、OKな場合はロールを付与
⑤、ユーザーがリソースにアクセス


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538617/88357087-5c32-69d0-62a5-4430e67c95b6.png)

# 必要な設定

・IAMロールの作成：信頼されたエンティティタイプとして「SAML 2.0 フェデレーション」を選択、ユーザーが必要とする権限（例：EC2、S3など）に応じたポリシーを付与

・SAMLプロバイダーの作成：「プロバイダーの種類」として「SAML」を選択、自社IDPのSAMLメタデータをアップロード

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538617/6499be89-43a7-a95e-22fa-8ef7d16947dd.png)

・IDP側の設定：SAMLアサーション内の属性設定（AWS IAMロールのARNとSAMLプロバイダーのARNを指定）

# AssumeRoleWithSAMLとは
AWSのSTS（Security Token Service）で提供されるAPIの1つで、SAML認証を使用して一時的なセキュリティクレデンシャルを取得し、AWSリソースへのアクセスを許可するために使われます。
このAPIは、IDプロバイダー（IdP）によって発行されたSAMLアサーションを受け取り、指定されたIAMロールに対して一時的なアクセスを付与します。

### AssumeRoleWithSAML API呼び出しには、以下の主なパラメータが必要です。
・RoleArn (必須):
ユーザーが一時的に引き受けるIAMロールのARN（Amazon Resource Name）。
例: arn:aws:iam::123456789012:role/SAMLRole

・PrincipalArn (必須):
SAMLプロバイダーのARN。これは、AWS IAMに設定されたSAMLプロバイダーを指します。
例: arn:aws:iam::123456789012:saml-provider/YourProviderName

・SAMLAssertion (必須):
IDプロバイダーから取得したSAMLアサーションをBase64エンコードしたもの。このアサーションには、ユーザーの属性や権限が含まれます。

・Policy (任意):
このAPI呼び出しによって付与されるアクセス権限を制限するIAMポリシー（JSON形式）。これにより、ロールが持つポリシーに追加の制約をかけることができます。

・DurationSeconds (任意):
セッションの有効期間（秒）。最短900秒（15分）から最長43200秒（12時間）まで設定可能。デフォルトは3600秒（1時間）。

### 実装イメージ

```
import boto3

# STSクライアントを作成
sts_client = boto3.client('sts')

# AssumeRoleWithSAMLを呼び出し
response = sts_client.assume_role_with_saml(
    RoleArn='arn:aws:iam::123456789012:role/SAMLRole',
    PrincipalArn='arn:aws:iam::123456789012:saml-provider/YourProviderName',
    SAMLAssertion='Base64EncodedSAMLAssertion',
    DurationSeconds=3600
)

# 一時的なクレデンシャルの取得
credentials = response['Credentials']

print("AccessKeyId: ", credentials['AccessKeyId'])
print("SecretAccessKey: ", credentials['SecretAccessKey'])
print("SessionToken: ", credentials['SessionToken'])


```



# 参考サイト

https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithSAML.html

https://www.cloudflare.com/ja-jp/learning/access-management/what-is-saml/
Professional CMake: A Practical Guideの無料部分を読む　～その1～

# PROFESSINAL CMAKE : A PRACTICAL GUIDEとは
[CMake参考書紹介(2022年時点)](https://qiita.com/imaginary_uepon/items/aafbba33c87da06b284c)という記事で，この電子書籍を読んでクロスプラットフォームの環境構築ができたということが書いてありました．
これを受けて，試しに無料で公開されている部分を読んで要約してみたというものです．
この本は全部で7パートから構成されており，そのうち1パート目が無料で公開されています．
その無料で公開されている部分の各チャプターに何が書いてあるのかをメモの代わりに要約しています．
そのため，きちんとした内容は実際にこの公開されているデータを読みに行ってください．

## その1
その1では，Chapter1とChapter2をまとめます．
ここでは，CMakeとは何であるかとプロジェクトファイルを作成する，ビルドするの大まかな流れについて説明しています．

# Part1 : Getting Started
このパートは，CMakeの基本的な部分を紹介するパートである．

この本を読み終えたら，CMakeで開発，ビルド，テストをし，exeやlibを作れるようになる．
読むだけではつまらないので，は様々な実際に手を動かして学べるコンテンツを用意している．


## Chapter1. Introduction
プログラミングに慣れた人でも，そうでなくても様々なコードをエンドユーザーが使える形にすることからは逃れられない．
そして，コンパイラ，リンカ，テストなど様々なものを学ばなければならない．
またそのコードを開発する際，様々なIDEでできる必要がある．
それらを管理する最適なツールがCMakeである．

## Chapter2. Setting Up A Project
CMakeでは，CMakeLists.txtを使ってプロジェクトを管理する．
これはプロジェクトから独立しており，好きなテキストエディタで編集することができる．

CMakeの基本として，バイナリディレクトリとソースディレクトリがある．
そして，CMakeLists.txtはソースディレクトリで管理する．

CMakeでは，バイナリディレクトリを一般的な呼び方であるビルドディレクトリと呼ぶ．
またCMakeでは，CMakeCache.txtをビルドディレクトリで出力する．
CMakeCache.txtについて今は理解する必要なく，あとのチャプターで説明する．

そして，CMakeで作成されるビルドディレクトリに含まれるプロジェクトファイル（VS Project file等）はgitに管理されるべきではない．
そのため，開発者は，プロジェクトを始めるときビルドディレクトリをどこに置くかを考えなければならない．

### 2.1 In-source Builds
可能だが避けるべきなのは，ソースとビルドのディレクトリを同じにすることである．
これをIn-source Buildsと呼ぶ．
この方法は，ディレクトリを汚くするだけでなくビルドにより元のコードを上書きする可能性があったり，gitと相性が悪い．

### 2.2 Out-of-source Builds
逆にソースとビルドのディレクトリを分けるのがOut-of-souce Buildsである．
この本は今後この方法で解説する．
IDEは基本この方法を採用してbuildフォルダを分けられるようになっている．
この方法の利点は，コードとバイナリを分けられるだけでなく，条件ごとのビルドフォルダを構築できることである．

### 2.3 Generating Project Files
CMakeは，様々なプロジェクトファイルを生成することができる．
多くのプロジェクファイルの生成器はDebugやReleaseなどの複数の設定を生成できるMultiple Configurationをサポートしている．
もしも，Multiple Configurationに対応していればCMakeは一度に生成でき，対応していなければ複数回生成する必要がある．

生成器はプロジェクトファイルがどのように生成されるかテストする．
実際，この生成の過程ではconfiguringとgeneratingの二つが行われている．
configuringはCMakeLists.txtを読みすべてのプロジェクトファイルを生成するための内部表現を作成する過程である．
generatingは実際にプロジェクトファイルを作る過程である．
今はこの二つが分かれていることが重要ではないが，Chapter11で重要になる．

### 2.4 Running The Build Tool
ここまででIDEで扱うプロジェクトファイルができた．
さらに，CMakeでは通常はIDEを開いて行うビルドまでを行える．
実際に以下の様にするとMyAppのDebugビルドがなされる．
```
cmake --build /pathTo/build --config Debug --target MyApp
```

普通は，開発者は一種類のIDEで開発し他のIDEて動くかテストする．
しかし，CMakeを使えば開発した後コマンドで他のIDEでビルドが通るかテストできるのだ．

### 2.5 Recommended Practices
CMakeを始めるとき，最初からビルドディレクトリとコードディレクトリを分ける練習をすべきだ．
これは，同じソースから異なる環境でビルドできるようにするための良い練習になる．

初期の段階では，特定の生成器を使いたくなる．
しかし，プロジェクトがどんどん進むうちに異なる環境で対応したい，IDEを変えたいなどの需要が出てくる．
その時のために，初期のうちから生成器を変えながら開発することで将来の負債を削減することができる．

NinjaはCMakeの生成器で良い選択肢だ．
これは，様々な環境をサポートするうえCMakeと相性が良い．

## 感想
言葉は知っていても中身を知らないことが多く，勉強になる

[その２](https://qiita.com/ciao_kaokawa/items/b418599ad8d41986a1cd)
Expoでexpo.ios.infoPlistの設定が反映されない問題と解決策

# :writing_hand: 3行まとめ
- `expo.ios.infoPlist`に設定を追加しても、ビルド後の`Info.plist`に反映されない場合があるよ
- `expo/config-plugins`の`withInfoPlist`を使うことで、追加設定が正しく反映されるようになるよ
- 問題が発生した際は、`app.config.ts`の設定が上書きされていないか確認し、必要に応じて`withInfoPlist`を使用するといいかも

# 発生した問題の詳細
Expoを使用して、EAS Buildと`expo-dev-client`でiOSアプリをビルドしていました。アドサーバーとしてApplovinを利用し、Admobをメディエーションとして接続する必要がありました。公式ドキュメントに従い、`AppLovinMediationGoogleAdapter`をPodからインストールし、`app.config.ts`の`expo.ios.infoPlist`に`GADApplicationIdentifier`を追加しました。

https://developers.applovin.com/en/max/react-native/preparing-mediated-networks/?iosnetworks=352#cocoapods

ところが、ビルド後にアプリを起動すると起動時にクラッシュするという問題が発生。調査を進めた結果、Google Mobile Ads SDKのバージョン7.42.0以降では、`Info.plist`に`GADApplicationIdentifier`が正しく設定されていないとクラッシュするようです。

https://firebase.google.com/docs/admob/ios/quick-start?hl=ja#add-app-id-to-info-plist

# 調査と解決方法
問題が発生した原因を探るため、まず`expo prebuild`を使って生成された`Info.plist`の内容を確認しました。すると、`app.config.ts`で指定したはずの`GADApplicationIdentifier`が反映されていないことがわかりました。

Expoの公式ドキュメントによると、`expo.ios.infoPlist`を使った設定の編集は、結合時に他の設定に上書きされてしまうことがあるとのことです。

https://docs.expo.dev/config-plugins/development-and-debugging/#modify-infoplist

この問題を回避するため、`expo/config-plugins`が提供する`withInfoPlist`を使って、`Info.plist`の内容をプラグインを通じて直接編集する方法に切り替えました。具体的には以下のようなコードを`app.config.ts`に追加しました。

```typescript
import { withInfoPlist } from 'expo/config-plugins';

  output = withInfoPlist(output, (config) => {
    config.modResults.GADApplicationIdentifier = "ca-app-pub-xxxxxxxxxxxxxxxxxxx";
    return config;
  });
```

この変更により、GADApplicationIdentifierが正しくInfo.plistに追加され、アプリは無事にクラッシュせずに起動するようになりました:raised_hands:

# まとめ
Expoで`expo.ios.infoPlist`を使用してiOSの`Info.plist`に設定を追加している際、設定が反映されない問題に直面した場合は、`withInfoPlist`を使用することを検討してください。`expo.ios.infoPlist`経由の編集では設定が上書きされる可能性があるため、公式プラグインである`expo/config-plugins`の`withInfoPlist`を活用すると確実に反映されます。
アーキテクトの教科書（第3章）の読書メモ

# はじめに

前回に続き、アーキテクトの教科書を読んで思ったことを書き連ねていきます。

https://amzn.asia/d/7RgbJlQ

第3章は「アーキテクチャの設計」です。

# モノリシックアーキテクチャと分散アーキテクチャ

ネットや書籍では、モノリスを悪とみなし、分散アーキテクチャを、まるで銀の弾丸であるかのように礼賛する内容を見かけることがあるのですが、本書ではそれぞれのメリデメを客観的に説明しているところが良かったです。

# モジュラーモノリス

外側から見ると単一ですが、内部的には独立して疎結合で結びついているアプリケーションのことをこう呼ぶそうです。

# 補償トランザクション
Sagaパターン（複数サービスをまたがる分散トランザクションで一部が失敗した時に、整合性を整えること）において、後始末をする（成功した分のトランザクションを元に戻す）トランザクションのことをこう呼ぶそうです。

# BFF (Backends for frontends) パターンは、SOLID原則の中のインターフェース分離の原則 （ISP） をアーキテクチャレベルに拡張したパターンと考えることができる

印象に残った文章です。確かにそのような考え方もありうるなと、目から鱗でした。

# ADR (Architecture Decision Record)

アーキテクチャ上の判断を記録し、共有するための手法です。

大規模（長期間）に渡るシステム開発の場合、コードの変更はGitでトレースできますが、アーキテクチャレベルのような大きな概念になってくると、いつ、なぜ、こうなったのか、の情報が失われることがあります。

こうやって記録を残しておいて、後から検索できるようにしておくと便利ですね。

https://docs.wantedly.dev/fields/dev-process/adr
オブジェクト指向C言語comelangにJava, Rust, Python並みの例外処理が入りました。

```C
#include <comelang.h>

exception int fun()
{
    return 1;
}

exception int fun2()
{
    return fun();
}

int main(int argc, char** argv)
{
    int x = fun2();
    
    puts("OK");
    printf("x %d\n", x);
    
    return 0;
}
```
```
OK
x 1
```

```C
#include <comelang.h>

exception int fun()
{
    return none(s"ERR");
}

exception int fun2()
{
    int y = fun();
    
    printf("y %d\n", y);
    
    return 9;
}

int main(int argc, char** argv)
{
    int x = fun2();
    
    puts("OK");
    printf("x %d\n", x);
    
    return 0;
}
```
```C
ERR
```

```C
#include <comelang.h>

exception int fun()
{
    return 1;
}

exception int fun2()
{
    int y = fun();
    
    printf("y %d\n", y);
    
    return 9;
}

int main(int argc, char** argv)
{
    int x = fun2();
    
    puts("OK");
    printf("x %d\n", x);
    
    return 0;
}
```
```C
y 1
OK
x 9
```

```C
#include <comelang.h>

exception int fun()
{
    return none(s"ERR");
}

exception int fun2()
{
    int y = fun();
    
    printf("y %d\n", y);
    
    return 9;
}

int main(int argc, char** argv)
{
    int x = fun2().rescue {
        puts("UHO!");
        puts(Err);
        return 0;
    }
    
    puts("OK");
    printf("x %d\n", x);
    
    return 0;
}
```

```C
UHO!
ERR
```

```C
#include <comelang.h>

exception int fun()
{
    return 1;
}

exception int fun2()
{
    int y = fun();
    
    printf("y %d\n", y);
    
    return none(s"ERR");
}

int main(int argc, char** argv)
{
    int x = fun2().rescue {
        puts("UHO!");
        puts(Err);
        return 0;
    }
    
    puts("OK");
    printf("x %d\n", x);
    
    return 0;
}
```
```
y 1
UHO!
ERR
```

exceptionを戻り値に持つ関数の中ではreturn none(string);が使えます。これを呼び出すと例外が発生します。stringは例外のメッセージです。呼び出し元の関数では.resuceしないと例外の文字列を表示してexitしてしまいます。.resuceすると例外が発生してもプログラムは終了しません。.resuceの中ではErrという変数に例外のメッセージが入ってます。関数がネストする場合はexceptionを呼び出し元の関数につけると深いネストでもreturn none(string);された時点で大域脱出して.resuceで例外を捕捉できます。
BookMemos

# Memos
- [コンサル一年目が学ぶこと](https://qiita.com/Jochun/items/6cfe4a2fca32922c10d4)
- [伝え方が9割 ②](https://qiita.com/Jochun/items/32ffe4eaf9028659e73c)
- []()
JavaScriptクロージャーの理解: 深堀り

Here’s the Japanese translation of the article you requested, written in English as per your instruction:

---

# JavaScriptクロージャーの理解: 深堀り

## はじめに

JavaScriptにおいて、クロージャーは強力でありながら、多くの人が誤解している機能です。クロージャーは、さまざまな高度なプログラミングパターンに使われており、これをマスターすることでJavaScriptのコーディングスキルが次のレベルに進化します。この記事では、クロージャーの概念を詳細に説明し、例を交えながら、クロージャーを使用する際のベストプラクティスについても議論します。

## クロージャーとは？

**クロージャー**とは、関数とその関数が宣言されたときのレキシカル環境（スコープ）との組み合わせです。簡単に言えば、クロージャーは、外部の関数が実行を終了した後でも、内部の関数が外部のスコープから変数にアクセスできるようにするものです。

次の例を見てみましょう：

```javascript
function outerFunction(outerVariable) {
    return function innerFunction(innerVariable) {
        console.log(`Outer Variable: ${outerVariable}`);
        console.log(`Inner Variable: ${innerVariable}`);
    };
}

const newFunction = outerFunction('outside');
newFunction('inside');
```

この例では：
- `outerFunction` は `outerVariable` というパラメーターを取り、 `innerFunction` を返します。
- `innerFunction` は呼び出されると、自身のパラメーター `innerVariable` にアクセスするだけでなく、外部スコープの `outerVariable` にもアクセスできます。これは `outerFunction` がすでに終了していても有効です。

### 出力:
```
Outer Variable: outside
Inner Variable: inside
```

これはクロージャーがどのように機能するかを示すシンプルでありながら強力なデモンストレーションです。

## クロージャーの使用例

クロージャーはJavaScript開発において、いくつかのシナリオでよく使用されます。以下はいくつかの実用的なアプリケーションです：

### 1. **データのプライバシー（カプセル化）**

クロージャーを使うことで、JavaScriptでプライベートな変数を作成できます。クロージャーを使用することで、外部コードから直接アクセスできないデータを隠すことができます。

```javascript
function counter() {
    let count = 0;
    return function() {
        count++;
        console.log(count);
    };
}

const increment = counter();
increment(); // 1
increment(); // 2
```

ここで、`count` 変数は `counter` 関数にプライベートであり、 `counter()` によって返されたクロージャー関数を介してのみ変更できます。

### 2. **コールバックと高階関数**

クロージャーは **コールバック** や **高階関数** でもよく使用されます。`setTimeout` やイベントハンドラーのような関数は、非同期操作が完了した後でも、外部関数のスコープにアクセスするためにクロージャーを使用します。

```javascript
function delayedGreeting(name) {
    setTimeout(function() {
        console.log(`Hello, ${name}!`);
    }, 1000);
}

delayedGreeting('John');
```

この例では、内部関数は `name` 変数にアクセスし続けますが、`setTimeout` の 1000 ミリ秒後に実行されます。

## ベストプラクティス

クロージャーは非常に有用ですが、適切に扱わないと問題を引き起こす可能性があります。クロージャーを使用する際に守るべきベストプラクティスをco紹介します：

### 1. **クロージャーの過剰使用を避ける**

クロージャーが不要な外部スコープの変数をキャプチャする場合、メモリリークを引き起こす可能性があります。クロージャーが保持している変数に常に注意を払いましょう。

### 2. **意図的にクロージャーを使用する**

すべての関数がクロージャーである必要はありません。状態を保持したり、プライベートな変数を作成したりする必要がある場合にのみクロージャーを使用してください。

### 3. **パフォーマンスのテスト**

クロージャーは、メモリ制約のある環境でパフォーマンスのボトルネックになることがあります。多くのクロージャーやネストされた関数を扱う際には、パフォーマンスとメモリ使用量をテストしましょう。

## 結論

クロージャーはJavaScriptの基本的な概念であり、これを理解することでより効率的でモジュール化されたコードを書くことができるようになります。クロージャーは単なる理論的な概念ではなく、多くの人気のあるJavaScriptライブラリやフレームワークでも広く使用されています。

クロージャーを使いこなし、ベストプラクティスに従うことで、複雑な問題を解決し、より良いアプリケーションを開発する能力が向上します。

---

この記事がクロージャーの概念を明確にし、自分のプロジェクトでそれを使用する自信を与えてくれることを願っています。コーディングを楽しんでください！

---

You can copy and paste this text into Qiita, as it's designed to sound professional and well-structured.