OmniAICreator/Qiita-1.07M huggingface dataset:
【AWS】AWSとは

# はじめに
仕事でAWSを扱うことになったので、ゼロからAWSを勉強する初学者による初学者のためのページです。
一応期限が切れそうなAWS SAAは持ってますが、暗記暗記で全然知識が頭に入ってきませんでした。ハンズオンで勉強したわけでもなく。今となっては反省してます。






# AWSとは
AWSとはAmazon Web Serviceの略称で、Amazo社が提供する**クラウドサービス**です。世界で最も利用されており、提供サービスや機能アップデート、コストパフォーマンスがとても充実しています。






# AWSのはじまり
2000年前後、インターネットバブルが弾けた頃に、多くのインターネット系企業が投資家からの資金を得られなくなり、行き詰まり始めます。Amazon社もそのうちのひとつであり、どうにか経費削減をする必要があったそうです。

そこでJeff（Jeff Bezos CEO）は自社DCにて抱えていたSun MicrosystemsのSOlaris/SPARCサーバをHP/Linuxに切り替えるこというアプローチを選択しました。（Linuxカーネルは1994年にリリースされたため、当時はとてもリスキーなアプローチでした。）

HP/Linuxへの移行が完了するまで製品開発は止まったり、移行が失敗もしくはデッドラインを超えたときもれなく倒産というギリギリまで追い込まれましたが、なんと移行を時間通りに完了させました。
そのおかげでインフラコストは大幅に削減でき、さらに無限に拡張可能なインフラストラクチャを手にしました。

さらに小売業は季節によってトラフィックと売り上げの変動があることに気付いたAmazon社は、年間46週分の余ったサーバのキャパシティを他社に貸し出そうと考えました。またそのころ、社内のチームの**デカップリング**に（エネルギー消費と経済成長の相関を切り離すこと）について興味を持ち始めたJeffは、別のチームが未許可でビルドできるようにしました。

この疎結合モデルを可能にするために必要なアーキテクチャの変更が、AWSにとってのAPIの基礎となりました。

https://www.publickey1.jp/blog/21/awsamazonsunhplinux.html

2003年にJeffがAmazonのサーバーインフラの展望について論文を述べました。それは今後のサーバーインフラは標準化、自動化がされ、ストレージなどはWebサービスに依存するという内容でした。

そして**2006年、サービス提供が開始**されました。
現在はIaaSにおける世界的シェアが32％で1位です。

https://www.publickey1.jp/blog/24/aws30ibm20242synergy_research.html











# AWSが提供しているサービス

https://aws.amazon.com/jp/products/?aws-products-all.sort-by=item.additionalFields.productNameLowercase&aws-products-all.sort-order=asc&awsf.re%3AInvent=*all&awsf.Free%20Tier%20Type=*all&awsf.tech-category=*all





# AWSを利用するメリット

- 初期費用ゼロ／低価格
- 継続的な値下げ
- サイジング不要（オートスケーリング）
- マネージド型サービスによる運用負荷の軽減
- セキュリティ
etc...

https://aws.amazon.com/jp/aws-ten-reasons/












## ①初期費用ゼロ／低価格
- 利用量に応じた従量課金型
- 繁忙期など必要なタイミングで必要な分だけ IT リソースの増強が可能
- 利用を予測したうえでの設備投資は不要





## ②継続的な値下げ
- 31のリージョンを運営するスケールメリットにより設備維持費用が低下
- 新たな技術革新、サービス提供によるコスト最適化を継続的に実施
- 透明性のある価格設定


このような形で、サービス開始から 129 回以上の値下げを実施しています。





## ③サイジング不要（オートスケーリング）
- 柔軟に変更可能な IT リソース
- ピークに応じた動的 IT リソースの変更を自動化

数クリック、数分間で柔軟にサーバ台数の増減が可能です。
また現行のサーバーリソース状態を監視し、あらかじめ定められた閾値を超過した場合に自動でサーバーリソースが増強される、といったことが実現できます。


## ④マネージド型サービスによる運用負荷の軽減
- サーバーレス、マネージド型サービスによる生産性の向上
- マネージド型サービスによるコストの効率化

DevOpsを導入することで意思疎通を容易にし、かつ意思決定の迅速化を図りました。
またマネージド型サービスの利用、例えば Amazon Simple Storage Service (Amazon S3) というストレージを利用すると、実際に保存されているデータ量に対してのみ課金が行われているため、さらに高いコスト効率の実現が可能となります。






## ⑤セキュリティ

- セキュリティ機能の実装や厳格なコンプライアンス要件に対応
- 第三者機関による検証

セキュリティとコンプライアンスは AWS とお客様の間で共有される責任のため、AWS が**クラウド環境自体の責任**を、お客様には**クラウド内のセキュリティに対する責任と管理**を担います。

※詳細は以下のページ

https://aws.amazon.com/jp/compliance/

https://aws.amazon.com/jp/security/





# きになり
https://aws.amazon.com/jp/campaigns/manga/vol0-1/
10/19 tecHub（IT交流会）を開催しました！

![image_241019_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670233/996d8aba-4cd7-afcb-3519-08131b6374f4.png)

10月になり、やっと涼しい日が増えてきました。
衣替えの季節です。

システムエンジニアはカジュアルな服装で働けることが多いです。
しかし、そんなSEですが、身だしなみは良くしておきたいものです。

**仕事ができる人は、身だしなみに気を遣っていますし、清潔感があります。**
今回は、オフィスカジュアルでもすぐできる身だしなみの押さえたいポイントをまとめています。

**目次▼**
<INS>[身だしなみを大切にしているITエンジニアは仕事ができる！](#身だしなみを大切にしているitエンジニアは仕事ができる)</INS>
<INS>[毎日、清潔感に気をつける](#毎日清潔感に気をつける)</INS>
<INS>[服、靴、鞄に気を遣う](#服靴鞄に気を遣う)</INS>
<INS>[ニオイ対策](#ニオイ対策)</INS>
<INS>[2024年9月のtecHubを開催しました！](#2024年10月のtechubを開催しました)</INS>
<INS>[tecHubは毎月イベント開催しています！](#techubは毎月イベント開催しています)</INS>
<INS>[参加者の声](#参加者の声)</INS>
<INS>[次回の開催](#次回の開催)</INS>

<h3>身だしなみを大切にしているITエンジニアは仕事ができる！</b>

![image_1019_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670233/1b2ec0fb-7ef8-345f-4002-23f341252e1b.png)

SEに限りませんが、仕事ができる人は外見も綺麗にしています。
**自分が考えている以上に外見は、よく見られているものです。**
「第一印象は、一生残る」とも言われています。

しかし、急に外見を良くする方法は分からないですよね。
ここからは、今日からできる身だしなみのポイントをまとめて紹介していきます！
**ポイントは次の3つです。**

**1.毎日、清潔感に気をつける**

**2.服、靴、鞄に気を遣う**

**3.ニオイ対策**

<h5>毎日、清潔感に気をつける</h5>
普段からちょっとした工夫で、清潔感は出せます。
今日からできることとしては、次の3つがあります。

・髪の毛の手入れ

・爪の手入れ

・シャツにアイロンをかける

**髪の毛の手入れは、髪の毛が伸びすぎていないか、1ヶ月おきに美容室で整えているか、整髪料で整えているか、寝癖は直しているか、** です。
ちょっとしたことですが、見た目の印象をガラッと変えることができます。

次に、爪の手入れです。
**伸びすぎている爪は、意外と目立ちます。**
「伸びてきたかな？」と思ったら、定期的に整えておきましょう。

そして、シャツにアイロンをかけるです。
**シワがないだけで印象は良くなりますし、シワのない服で仕事をしていると自分の気持ちも上がります。**

<h5>服、靴、鞄に気を遣う</h5>

服の清潔感は、すでに上述で書いていますが、**身に付けるものを綺麗にしておくだけで”できるエンジニア”感が出ます。**
服以外でできるものとしては、靴と鞄です。

靴と鞄の綺麗さは、意外と見られています。
**汚れが付いていたり、傷んでいる時は、すぐに綺麗にしておきましょう。**
少し磨くだけでも綺麗になります。

<h5>ニオイ対策</h5>
最近は涼しくなってきたので、気になりにくくなってきましたが、汗のにおいはケア必須です。
また、口臭や強過ぎる香りの香水も気を付けたいです。

口臭のケアは、歯ブラシだけでなく歯間ブラシやデンタルフロスを使うのも効果的です。
コーヒーの飲みすぎも要注意ですね。

**ニオイの影響は、非常に大きいです。**
外見だけでなく、ニオイの対策もしましょう。

<h3>2024年10月のtecHubを開催しました</h3>

10/19にtecHubを秋葉原で開催しました。
参加者は59名となり、大盛況でした。

日付：10/19(土)　14:00～16:30
場所：LIFORK秋葉原
参加者：59名
内容：IT交流会

<h3>tecHubは毎月イベント開催しています！</h3>

毎月60〜80名ほどの方が参加している人気のイベントです。

3ヶ月に1度：LT（ライトニングトーク）と懇親会の2部構成イベント
他の月：リアルでIT交流会イベント

今回のIT交流会では、ピザを片手にITエンジニア同士の情報交換で賑わいました。
キャリアの相談や、システム開発・インフラなど各分野の専門的な話もできました。

<h3>参加者の声</h3>

![image_241019_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670233/03b84555-2c97-878d-ccb5-90dd4a0e4093.png)

今回も幅広い分野のIT関係者が集まり、会社員からフリーランス、法人化まで様々なエンジニアが参加していました。

IT交流会では参加者一人一人の実体験から来る仕事の話で盛り上がり、参考になる話を聞ける時間でした。
「今後のキャリアをどうするか？」考えている話も多かったです。
幅広い分野と様々なキャリアの話は、異なる視点や考え方を知る機会になっているようでした。

参加者からは、
**「参加してよかった」
「転職やフリーランス転向などキャリアアップを考えるきっかけになった」
「自分にとって身近な体験談を聞くことができた」**
などの声をいただいています。

tecHubは、今後も毎月イベントを開催していきます。
**他にもITエンジニアがより活躍し、理想のキャリアを切り拓けるように、tecHubはコミュニティサイトも始めました。**
会社員、フリーランス、法人の方向けに、オフラインコンテンツと人脈形成の機会を提供しています。

https://www.navi56.com/communities/tecHub

<h3>次回の開催</h3>

次回の開催は、以下の日程を予定しております。
日時：11/16(土)　14:00～17:00
場所：SOCIAL SPACE 赤坂
内容：LT＋懇親会

詳細とお申込みは、上記のコミュニティサイト、または下記のconnpassのページからご確認お願いします。
※イベントの申込みは、tecHubコミュニティに参加後にサイト内の"イベント検索"から「11/16 tecHub (LT＋懇親会)」を検索してお申込みください。

https://tecworks.connpass.com/event/331279/
【Java】うるう年の判定をJavaで実装してみる【アルゴリズム】

## はじめに
基礎的なアルゴリズムをJavaで実装していきます。
今回は **「うるう年の判定」** です。

## うるう年の判定
目的：
西暦4桁の数値を受けとり、その年がうるう年か平年かを判定します。

手段：
「西暦が4で割り切れ、かつ100で割り切れなければうるう年。
　ただし400で割り切れればうるう年。
　どちらでもなければ平年。」というアルゴリズムです。

## 設計
[手段]で書いたロジックをそのままUrudoshiExec()に書いています。
値の入力と表示はUrudoshiStarter()に集め、そこからUrudoshiExec()を呼び出してうるう年の判定処理をしています。

## ソース
### フォルダ構成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524566/1dd917c6-8a51-f265-a341-e3677264ab6c.png)

### ソースコード
```java:main.java
package main;

import process.Urudoshi;

public class Main {

	public static void main(String[] args) throws InterruptedException {
		// うるう年クラスをインスタンス化して処理をスタート
		Urudoshi urudoshi = new Urudoshi();
		urudoshi.UrudoshiStarter();
	}
}
```

```java:Urudoshi.java
package process;

import java.util.Scanner;

public class Urudoshi {
	public void UrudoshiStarter() {

		int a = 0;

		// ユーザーに数を2つ入力してもらう
		Scanner sc = new Scanner(System.in);

		System.out.println("【うるう年判定】");
		System.out.println("西暦の年を入れると、うるう年かどうか表示します。");
		System.out.println("4桁の値を整数で入力してください。");
		a = Integer.parseInt(sc.nextLine());

		sc.close();

		boolean result = UrudoshiExec(a);

		if (result) {
			System.out.println("うるう年です。");
		} else {
			System.out.println("平年です。");
		}

	}

	private boolean UrudoshiExec(int a) {
        boolean Ans = false;
        
		if (a % 4 == 0 && a % 100 != 0) {
			Ans = true;
		} else if (a % 400 == 0) {
			Ans = true;
		} else {
			Ans = false;
		}

		return Ans;
	}
}
```
## 実行
![うるう年動作.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524566/a332c86a-13b2-59c5-2186-173026460173.gif)

## おわりに
アルゴリズム実装2本目でした。
関数の戻り値に真偽値を使うと、if文の条件式の中がシンプルにかけて良いですね。


## 参考図書
基本情報技術者試験のアルゴリズム問題がちゃんと解ける本 第2版 [矢沢 久雄]

## その他の記事リンク
https://qiita.com/lipton2018/items/bd3e3002d70df7d98672

## 更新履歴
2024/10/23 [ソースコード] 変数Ansの初期化位置を、クラス直下からUrudoshiExec()内に移動
はじめに

# はじめに
## ポストしていく予定の記事
自分で学んだり習得したりといった知見をメモしておく場が必要かな…と思い立ち。自分のサーバでWordPressでもよかったんですけど広く広めたほうがいいかな？という目的もあります。主に環境構築や言語に関する基本的な事項、Tipsなどを載せていく予定です。
対象は初学者向けとさせてください。ベテラン向け書くほど知見ないもので…。
1. 環境構築など
1. 言語の基本的な利用メモ
1. その他
また、公開できる成果物は順次[GitHub](https://github.com/shibukawa-yoshiyuki)にあげていきます。
## 著者略歴
### 略歴
1974年埼玉県生まれ。学卒後都内某SIerに勤務するも事務部門だったため一念発起して[JAIST](https://www.jaist.ac.jp)へ飛び込みシステムエンジニアに鞍替え、以降SEというなのソルジャーを22年間やってます。
### 主な技術
#### 言語
1. c
これが根幹ですかねえ。なんやかやで一番多く携わっているかも。
1. c++
1. Javascript
もともとはJQueryだったんですが今や絶滅危惧種なのでNode.jsやNext.jsを嗜んでおります。
1. PL/SQL
1. VC#
1. VB.net
1. PHP
この辺は最近やってません。VC#は一応やってはいますがほぼ忘れた。
#### ミドルウェア
1. DB
仕事ではOracle、プライベートだとSQLiteなど。
1. MQ
そういえばやってましたね。20年くらい触れてませんが。
#### プラットフォーム
1. Windows
1. Windows Server
1. Linux
主にRHEL系。Debian/GNUはほぼ触ってません。
1. UNIX
1. Arduino
### 主な分野
1. 科学技術演算系
なぜか社会人になってからのほうが数学一生懸命やっているという。
1. 航空・宇宙分野
ミッションから管制あたりまでやってますがほぼプログラマとしての参加が多いです。
1. 地理情報システム
QZSS(準天頂衛星システム)などにもかんでいたりガラケー用の地図情報サービスをやっていたり。
1. その他
もともと財務や経理に携わっていたためか最近はそちらが多いです。
## お仕事を依頼したいという奇特な方
所属なしなのでご連絡ください。詳細な経歴を別途お送りいたします。
フロントエンド苦手克服記1

# 始めに
私はフロントエンドよりバックエンドが好きだ。ビジネスロジックを組むのが面白くて好きというポジティブな理由もあるが、それよりも画面上のUIやUXに興味がなく、やる気がしないという側面が強い。
しかし、画面側が全くできないのはWebアプリケーション開発に携わっているエンジニアとして流石に恥ずかしいと思った。そこで、現代のWebアプリケーションに使用されている技術の棚卸を行い、最低限体裁のあるアプリケーションを作成できるようにしようと考えた

# 調査
全世界で使用されているサイトが参考になると思い、Youtubeのホーム画面を各パーツごとに分解し、調査した
1つ1つ注意深く見るために簡易的な画面定義書を作成し、部品ごとの動きや機能を記録した

業務の画面定義のように部品ごとに番号を振り、各部品の特徴を記録
サムネやアイコンは何かに触れると思ったので割愛
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3508744/01a0bdaa-38e3-7899-6c31-2e981b3d2dcf.png)

この他にいくつかのサイトを確認し、使用されている技術を確認した

# 最低限必要な技術
いくつかのサイトを調査した中で必要だと感じた技術
#### 1. 共通のレイアウト
この調査の際にいくつかのサイトを閲覧した際に、ページによってレイアウトが異なるサイトがあった。そのサイトでは他ページを探したり、ページ内のコンテンツを確認することに少しストレスを感じた。同サイト内で共通のレイアウトを使用することで、このような負担の軽減に繋がるため必要だと感じた。

#### 2. ヘッダー
今回確認したどのサイトでも使用されていたため必須と判断

#### 3. サイドバー
今回確認したどのサイトでも使用されていたため必須と判断

#### 4. フッター
YoutubeやTwitterなどのWebアプリケーションでは確認できなかったが、企業のHPでは使用されていた

#### 5. カーソルの位置の表示
文字や画像上のマウスカーソルがある際に、その部品の色や表示が変化すること。
今回確認したどのサイトでも使用されていたため必須と判断

#### 6. レスポンシブなデザイン
閲覧者が使用している端末の画面幅に応じて適切な表示に切り替える機能。
使用しやすいと感じたサイトには使用されていたため必要と判断

# 必須ではないが優れていると感じた技術
#### 1. SVG
Webアプリケーション上のアイコンはimgやcss(bootstrap)と思っていたため、svgだと気付いたときは非常に感動した。Qiitaのアイコンもsvg。どうやって作っているのか非常に気になっている
imgと異なり描画する際にサーバから画像を取得する必要がないことが利点だと考えている

#### 2. ロード前フォーマット
サーバからデータを取得し画面に表示するまでの間に表示する灰色の仮置きされた部品。形や大きさから何が表示されるかや、現在ロード中であることが一目で把握できることに優れていると感じた。

# あとがき
普段使用しているサイトを注意深く確認したところ、新しい発見があり面白かった
複数のサイトを閲覧したことで私の中で最低限の基準を作ることができた。まずはこの基準に達するためにフロントエンドの学習を進めようと思う
【Python】eval関数の使い方とリスク、第二引数・第三引数を活用した制限方法

# 概要
文字列を式として認識してくれる`eval`関数を使ってみたので紹介します。

# サンプルコード
`eval`関数は、文字列として渡されたPython式を評価し、その結果を返す関数。
以下公式ドキュメント。

https://docs.python.org/ja/3.6/library/functions.html#eval

以下、作成したサンプルコードです。

```py
expression = "1 + 2 * 3"
eval_result = eval(expression)
print(f"Expression: {expression}, Eval_Result: {eval_result}")
# Expression: 1 + 2 * 3, Eval_Result: 7
```

上記の通り、`Expression`の方では単なる文字列として出力されていますが、`Eval_Result`では文字列が式として評価されています。

ただし、こちら検索するとすぐに「脆弱性」「リスク」と言うワードが目に入ります。
と言うのも、計算式だけではなく、コマンドも実行できてしまうからです。

実際、悪意のあるコードが実行される可能性もあるため、使用する際は注意が必要です。

https://qiita.com/tkmz/items/717d524083b71a4af75f

## グローバル変数とローカル変数
上記のリスク回避のために、グローバル変数とローカル変数を指定することができます。
それぞれ、`eval`関数の第二、第三引数です。

以下、それらを追加したサンプルコード。

```py
allowed_globals = {"__builtins__": None}
allowed_locals = {"x": 1, "y": 2, "z": 3}

expression = "x + y * z"
result = eval(expression, allowed_globals, allowed_locals)
print(f"Expression: {expression}, Result: {result}")
```

`__builtins__`を`None`に設定することで、`eval`関数がデフォルトの組み込み関数にアクセスできないようになります。例えば`os.remove`などでファイル削除するようなコマンドが実行できなくなります。

### `__builtins__`とは...
`builtins`モジュールを使えるグローバル変数です。
`builtins`モジュールとは以下の通りで、組み込み関数へアクセスできます。

> Python の全ての「組み込み」識別子に直接アクセスするためのもの
https://docs.python.org/ja/3/library/builtins.html

また、`allowed_locals`に「名前空間」を指定しそこで変数を設定したことで、特定のローカル変数のみの使用制限が実現できています。これで予期しない変数や関数へアクセスされることがなくなります。

上記で実行すると出力結果は以下のようになります。

```
Expression: x + y * z, Result: 7
```

ただし、上記Qiita記事はじめ、実運用に使う場合はリスクを払拭し切れるわけではないようですので、利用の際は他の方法も検討することをお勧めします。
メモリと仮想メモリの概念

## はじめに
1日1時間1項目学ぼうの会
今回学んだ内容は**メモリと仮想メモリについて**です。

## メモリとは
コンピュータにおけるメモリは、データやプログラムを一時的に保持し、CPU（中央処理装置）が迅速にアクセスできるようにするための重要なハードウェア要素です。

## メモリの役割
１、プログラムの実行をサポート
プログラムやアプリケーションを実行する際、そのコードやデータを一時的にメモリに読み込んで使用します。
例
ブラウザを開くと、プログラムのコードや開いているページのデータがメモリにロードされるため、スムーズな操作が可能になります。

２、データの一時保存
メモリは一時的な保存領域として使われます。作業中のファイルの編集や計算結果がメモリに保持され、必要に応じてディスクに保存されます。
例
ワードプロセッサで文章を編集している間、そのデータはメモリ上に保存され、ファイルを保存したときに初めてHDDやSSDに書き込まれます。

## 種類別の役割
・RAM
コンピュータの一時記録装置で、電源が切れるとデータが消える。
主に作業中のデータやプログラムを保持する。
・ROM
基本的なシステムの設定や、ブート時に必要なプログラムを格納します。電源を切ってもデータが保持されます。

## メモリ容量の影響
・**メモリ容量が多い場合**：一度に多くのアプリケーションやデータを処理でき、システムがスムーズに動作します。
・**メモリ容量が不足する場合**：アプリケーションの動作が遅くなります。
例 PCを使用していて「動作が遅い」と感じるとき、その原因の多くはメモリ不足です。メモリが足りなくなると仮想メモリが使用されますが、その分、動作が遅くなります。

## 仮想メモリとは
仮想メモリとはコンピュータのメモリ(RAM)が不足した時にHDDやSSDの一部のようにメモリをように使う仕組みです。

## 仮想メモリの仕組み
仮想メモリはメモリ(RAM)とディスクの一部を組み合わせて使います。
あまり使わないデータやプログラムはディスクに保存しておいて重要なデータやプログラムのために
メモリ(RAM)を空けておきます。
これをページングと言います。

## 仮想メモリのメリット
・アプリケーションを複数実行できる。
仮想メモリのおかげで、RAMの容量に依存せず、複数のプログラムを実行できます。
動画視聴のアプリを起動しながらメールを送ったり、ゲームを起動してもメモリ不足にならずに済みます。

・メモリ不足によるエラーの防止
RAMが不足しても、仮想メモリを活用することでシステムがダウンすることを防ぎます。

## 仮想メモリのデメリット
・ディスク容量が少なくなる
ディスク容量が32GBの場合、仮想メモリを使うことで、そのうちの数GBがメモリとして使用されることになります。
そのため動画や写真を保存できる容量が少なくなります。

・速度低下
仮想ディスクに使うHDDやSSDはRAMに比べて圧倒的に遅いため、頻繁に仮想メモリにアクセスするとパフォーマンスが低下します。

## まとめ
普段、ExcelやWordを利用していても、データがどこに保存されるのかを意識することは少ないでしょう。しかし、メモリと仮想メモリの役割を理解することで、以下のような工夫ができるようになります。

・不要なオブジェクトや変数を解放して、プログラムのメモリ消費を最小限に抑える。
・仮想マシンの構成では、メモリ不足によるスワップ発生を防ぐため、適切なメモリサイズを設定する。
これらの知識を活用し、システムの最適なパフォーマンスを意識した開発・運用を心がけたいと思います。

## 参考
https://lab.techhub.jp/waht-computer/#index_id2

https://aotan-tsushin.com/explanation-of-virtual-memory/

https://www.nec-lavie.jp/products/contents/pc-memory-101.html#anc3_1
TypeScript ~備忘録~

## TSの記法を見返す用
私が学んだTSの記法を記します。ほかにも便利な記法、これは知っとけがあったら教えてください。

### TSの特徴
1. JSに変換されてから実行（TSはブラウザ上で実行できない,tscongi.jsonファイルに変換設定が書いてある。）
2. 型の敵が可能
3. JSにない記述が使用可能

### メリット
　型適宜によるチーム開発の円滑化
 公開用ライブラリへの型定義
 バグの事前検知
 VSCodeの自動補間

### デメリット
型を定義しなければならない
JavaScript特有の柔軟で簡易な記述の損失

### TSを使う方法
```
npx create-react-app {プロジェクト名} --template typescript
```
※コンポーネントを定義するときはtsx

### プリミティブな値の型定義
```ts
let str: string = "hello"
```
ユニオン型
```ts
let strOrNum: string | number = "hello";
strOrNum = 12;
```

### 型推論(type inderence)
```ts
let str = "hello";
```
※あまり使わない。使うのであれば関数の中でのみ使う。

### ジェネリクス
型引数を受け取る関数を作る機能のこと
```tsx
const repeat = <T>(value: T, times: number): T[] => {
    return new Array(times).fill(value);
};
//numberは省略可能
const num2Array = repeat<number>(10, 7);
console.log(num2Array);
```
slurm federationを使ってaws parallel clusterと連携する（準備③）

### 今回行う事

①ではオンプレ同士でslurm federation機能を有効にしました。
②ではUIを使ってaws parallel clusterを構築しました。
今回の③ではawsとオンプレ環境をVPNで接続していきます。

ただし現状問題があります。


### 課題

本来はfortigateなどを使ってSite to SiteのVPNを作成する必要があります。

![site to  site](https://docs.aws.amazon.com/ja_jp/vpn/latest/s2svpn/images/vpn-how-it-works-vgw.png)

できればそこまで大かがりにするとめんどいので、client vpnをRockyLinux/CentOSにインストールして検証をしようと考えていましたが、vpn clientのアプリがlinux版だとubuntuしかなく、さらに20.04と古いバージョンにしか対応してなさそう。(インストール可能かもしれませんが試してません）


一応clientvpnで接続出来るかmacosで確かめたところあっさり1時間ほどで作成出来ました。
このワークショップサイトは非常にお勧めです
https://catalog.us-east-1.prod.workshops.aws/workshops/be2b90c2-06a1-4ae6-84b3-c705049d2b6f/ja-JP


https://aws.amazon.com/jp/vpn/client-vpn-download/


![client vpn](https://static.us-east-1.prod.workshops.aws/public/f5a229c4-04c5-487f-baf6-f765c871ff04/static/images/hands-on-mutal.png)

ただし私の環境下では、slurmマスターはrhel8系のためawsのクライアントソフトは使えず、別に用意する必要があります。

awsのドキュメントでもOpenVPNについて記載されていたので、今回はこれを採用することにしました。
しかしawsドキュメントではOpenVPNもubuntuでのやり方しか記載されていなかった。
https://docs.aws.amazon.com/ja_jp/vpn/latest/clientvpn-user/linux.html

クライアントのインストール自体は大して難しくないので、他のサイトを見ながら設定することにします。

### ワークショップを参考にカスタマイズ

- セグメント：subnet255(10.255.255.0)ひとつしか作成しなかった事  
- ec2を作成するセグメントはsubnet255にしたこと
- クライアントツールをopenvpnにしたこと

### openvpn

書くほどでもないですが一応
```bash
sudo dnf install epel-release -y
sudo dnf install openvpn -y

#/etc/openvpn/clientにawsからダウンロードしたdownloaded-client-config.ovpnを保存
#名前が分かり難いので、aws-slurmvpn.ovpnに変更

#コマンドラインから接続する場合
sudo openvpn --config /etc/openvpn/client/aws-slurmvpn.ovpn

#自動起動にする場合
sudo systemctl enable --now openvpn-client@aws-slurmvpn
```

これでrocky linux/centosからssh接続出来ました。

これでようやく準備が終わったので次回はオンプレ ー aws parallel cluster間で以下の検証を行う予定です。

### 検証項目

1）federationが正常に動作するか
2）オンプレからparallel clusterにジョブを投入出来るか？
3) オンプレからジョブをキャンセル出来るか？
4) 障害検証、VPNがダウンした場合　
5）障害検証、EC2(parallel cluster headnode）がダウンした場合
【JDA】エオルゼア時間のリマインドbotを作る【第1弾】企画をする

## はじめに
この記事にたどり着いたヒカセンの貴方、「FF14のアラームに設定できる数が少ない!!」と思ったことはありませんか？

特にギャザクラをやっている人であれば伝説、刻限、未知を取りた過ぎて、設定できるアラームの数が足りないといった経験があるかもしれません。

そんなあなたにエオルゼアリマインダーbot
Discord上で指定した時刻にエオルゼア時間でリマインドをしてくれるボットです。
プログラマたるもの、欲しい機能は自分で作ってエオルゼアライフを便利にしていきましょう。

今回は企画編です
どんな機能を作っていくのか考案/紹介するフェーズになります。
また、個人開発においてどのような機能を優先的に作っていくか考える際の参考例になれば幸いです。

## 目的

1. FF14のアラームに登録できる個数が少なくて困っているヒカセン(主に自分)を救う
2. Discordのbotの作り方を学ぶ
3. Javaの勉強(個人的なもの)

## 必要な機能についての整理

まずはざっくばらんに必要そうな機能についてあげていきます。

* リアル時間でのリマインド設定
* エオルゼア時間でのリマインド設定
* リマインド一覧
* リマインド削除
* リマインド編集
* リマインドメッセージの設定
* リマインドのメンション設定
* 一回きりのリマインド機能
* 定期的なリマインド機能
* 特定のチャンネルに(通知専用チャンネル？)通知
* 特定のロールにメンション
* ゲーム内のコマンドをそのまま使えるようにする
* エオルゼア時間の表示

ざっと13機能です。
これらを機能優先度順で3段階に分けます。

## 優先度:高
実装しないとbotとして動かないような機能になります。
この機能群が完成すればデモ版として出せるものが出来上がることを想定

* エオルゼア時間でのリマインド設定
* リマインド一覧
* リマインド削除
* 一回きりのリマインド機能
* 特定のチャンネルに(通知専用チャンネル？)通知

## 優先度：中
エオルゼアリマインダーとして必要となる機能

* リアル時間でのリマインド設定
* リマインドメッセージの設定
* 定期的なリマインド機能

## 優先度：低
リリース後に追加しても問題ない機能

* リマインド編集
* リマインドのメンション設定
* ゲーム内のコマンドをそのまま使えるようにする
* 特定のロールにメンション
* エオルゼア時間の表示

## 最後に

次回以降、実際にbotを作っていきます。
エオルゼアリマインダーとしてこんな機能があったら便利!!等の意見がありましたら遠慮なくお申し付けください。
良さそうなものは組み込みます。
keyball39のケースとkeycapを3Dプリンターで作成

![img.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138090/fa07a102-01e2-ac3e-5754-ba4a2cc4531b.jpeg)

# 概要
3Dプリンターで下記を作成しました
- テンティング可能+アームレスト付きのkeyball39のケース
- キーキャップ


# 利用方法
https://github.com/masashi2ueda/keyball39uedam

# 使ったもの
- [bambulabP1S 3D プリンター](https://jp.store.bambulab.com/products/p1s?gad_source=1&gclid=CjwKCAjw1NK4BhAwEiwAVUHPUIpf5Ls_KnHSjKl2rj6zLr3eTgKgz7EQLOlgLGGXZAqSBZOodKARWBoCR-4QAvD_BwE)
- [openscad](https://openscad.org/)

# 参考
- [OpenScad library. Threads for screws and nuts V1](https://www.thingiverse.com/thing:3131126#google_vignette)
- [keyball](https://github.com/Yowkees/keyball)
- [キーキャップ設計による OpenSCAD 入門](https://qiita.com/zk_phi/items/ab99315ebaef66e84aa0)
【C#】BGR形式をRGB形式に変換する

## BGRとRGBの仕様
BGRやRGBは色を表現する際のビット列の順序形式です。

### BGR (Blue, Green, Red)
24bitで表現され、上位から
|bit|解釈|
|:-:|:-:|
|1-8|青の輝度|
|9-16|緑の輝度|
|17-24|赤の輝度|

16進数で表すと
0xBBGGRR

### RGB (Red, Green, Blue)
24bitで表現され、上位から
|bit|解釈|
|:-:|:-:|
|1-8|赤の輝度|
|9-16|緑の輝度|
|17-24|青の輝度|

16進数で表すと
0xRRGGBB

## コード
```C#
public static int BGRtoRGB(int bgr) 
{           
    int red = (bgr & 0x0000FF) << 16;
    int green = (bgr & 0x00FF00);
    int blue = (bgr & 0xFF0000) >> 16;

    return red | green | blue;
}
```

### 解説

やっていることは単純で、「赤と青のbitを入れ替える」という挙動になっています。
図示するとこんな感じ
![BGRtoRGB.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597961/f3dd8df1-836c-079b-8101-337eddbaedae.png)

この挙動を実現するためにAND演算、OR演算、シフト演算の3種類の演算を組み合わせて使っています。

**AND演算**
AND演算とは2つのbitを比べて、両方が1の時は1、それ以外は0になるような演算のことです。
論理積とも呼ばれることがあります。

![bit-and.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597961/83bcbafa-34c8-b466-6203-ecd2cd0bb0c3.png)

例えばbgrでbgr(例では0x921E16)の赤色の輝度を算出したいときには
```C#
bgr & 0x0000FF
```
とすると

```Text
000000000000000011111111    // 0x0000FF
100100100001111000010110    // rgb(0x921E16)
000000000000000000010110    // 赤色の輝度(0x000016)
```
赤色(17bit目から24bit目)までが算出できます。

**シフト演算**
シフト演算はbit列を左または右にずらす演算のことです。
左にずらすことを左シフト、右にずらすことを右シフトといいます。

```TEXT
000000000000000000010110 << 16    // 左シフト
000101100000000000000000          // シフト演算結果
```
上の例では16bit分だけ左シフトしたものになります。
左へずらした際に桁があふれたビットは廃棄され、0のビットが右から入ります。
これによってBGR <=> RGBの変換をする際にBとRの入れ替えを行っています。

**OR演算**
OR演算は2つのbitを比べて、両方が0の時は0、それ以外は1になるような演算のことです。
論理和とも呼ばれることがあります。

![bit-or.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597961/d7b41109-ae80-e17f-0e63-8cd82b121148.png)

下記のようなbit列があったとして
```Text
RRRRRRRR0000000000000000    // redのbit列(Rは0か1)
00000000GGGGGGGG00000000    // greenのbit列(Gは0か1)
0000000000000000BBBBBBBB    // Blueのbit列(Bは0か1)
```
これをOR演算すると
```Text
RRRRRRRRGGGGGGGGBBBBBBBB    // RGBのbit列(R,G,Bは0か1)
```
となる
【Rails】render nothing: trueでエラーが出る

## 問題
コード
```ruby
class UsersController < ApplicationController
  def index
    render :nothing => true, :status => 200
  end
end
```

エラー文
```ruby
ActionView::MissingTemplate
```

## 解決方法
以下のように修正します。
```ruby
class UsersController < ApplicationController
  def index
    render body: nil, status: 200
  end
end
```

## 参考
https://ponpoko-nalplus.hatenablog.com/entry/2019/02/27/175641
【bash】`ls --color | grep "mhoge"`で`hoge`が引っかかるんじゃが

```bash
$ ls --color
hoge  hoge2  hoge3

$ ls --color | grep "mhoge"
mhoge2
mhoge3
```

![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26088/9952c92b-4328-bf23-dd8c-b738e1d6766f.png)

なんやこれ？？？？？？


ちなみにm以外の文字だと検索に引っかかりません。

```bash
$ ls --color | grep "nhoge"
```


`ls -l --color`でも同じように変なのが出てきます。

```bash
$ ls -l --color
-rw-rw-r--  1  hoge
-rwxrwxrwx  1  hoge2
drwxrwxr-x  2  hoge3

$ ls -l --color | grep "mhoge"
-rwxrwxrwx  1 mhoge2
drwxrwxr-x  2 mhoge3
```

![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26088/10e5d403-58bb-6aa7-396d-8bf0d96a4eff.png)

ここまで見ると、まあ色を付けるコードが悪さをしているのではなかろうかと予想がつきますね。


```bash
$ ls --color | cat -v
hoge
^[[0m^[[01;32mhoge2^[[0m
^[[01;34mhoge3^[[0m
```

![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26088/7987fc70-558c-9b6b-5b00-9dca2fd7007a.png)


なんか奇妙な文字が出てきました。
このよくわからない文字がおそらく色を付ける制御コードであり、grepではこちらも引っかかってしまうということなのでしょう。
これ、想定外の文字列が引っかかるのは仕様ということでいいんだろうか。

なお、`--color`を付けなくても色が付く環境で`--color`を外したところ、grepで表示されませんでした。
catすると制御コードが一切ありませんでした。

```bash
$ ls | grep "mhoge"


$ ls | cat -v
hoge
hoge2
hoge3
```

![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26088/e7e97acb-98c6-1364-bb26-bbbf2edb573c.png)

むしろ、こちらがいったいどうやって色を付けているのかのほうがわかりません。


# おまけ

`ls`のパイプは[万一事故るとたいへんなことになる](https://qiita.com/yabako_kobayashi/items/8113e682408c06066db4)ので[お勧めされません](https://qiita.com/ko1nksm/items/fb42b741f5d176996ec1)。

## それじゃあどうすればいいんだ？

[find -print0を使え](https://qiita.com/ko1nksm/items/fb42b741f5d176996ec1#posix-%E3%81%AB%E3%81%93%E3%81%A0%E3%82%8F%E3%82%8B%E3%81%AE%E3%82%92%E3%82%84%E3%82%81%E3%81%A6-find--print0-%E3%82%92%E4%BD%BF%E3%81%86)らしいよ。
findは使い方がめんどくさいので、なんか簡単に使える方法を用意してほしいところですね。

というかlsのパイプで事故るのであれば、他コマンドのパイプでも事故るんじゃないのだろうか？
よく知らないけど。
【基本情報】独学マラソン GPT先生と復習③ Day 21

緑視率を10-15%にすると作業効率が最も上がる
観葉植物を置こう


# GPT先生、問題出して！

### **問題 1:**  
割り込み処理に関する説明として正しいものを選びなさい。

A. メモリの断片化を解消するための処理  
B. CPUの処理速度を最適化するためのプロセス  
C. 予期しないイベントが発生したとき、現在の処理を中断して優先度の高いタスクを処理する仕組み  
D. データの圧縮アルゴリズムを効率化するための手法  

### **問題 2:**  
データマイニングの主な目的はどれですか？

A. データのバックアップとリストアの速度を向上させる  
B. 大量のデータからパターンや規則性を見つけ出す  
C. データベースの構造を最適化する  
D. データの暗号化レベルを向上させる  

### **問題 3:**  
データウェアハウスの役割として正しいものを選びなさい。

A. データの保存形式を圧縮するための技術  
B. ビジネス上の意思決定を支援するために、異なるシステムから集めたデータを一元化して分析するためのデータベース  
C. データの高速な読み書きを実現するためのキャッシュ技術  
D. データの冗長性を排除するためのプロセス  

### **問題 4:**  
LTE（Long Term Evolution）の特徴として正しいものを選びなさい。

A. 音声通話のみを高速化する通信技術  
B. データ通信速度を向上させ、4Gネットワークの基盤となる技術  
C. 5Gにおいても完全な互換性を持つ通信技術  
D. インターネット接続のみを対象とした通信方式  

### **問題 5:**  
アンゾフの多角化戦略に関する説明として正しいものはどれですか？

A. 既存の市場で既存の商品をさらに拡大する戦略  
B. 既存の商品を新しい市場に投入する戦略  
C. 新しい商品を既存の市場で展開する戦略  
D. 新しい商品を新しい市場に投入する戦略  

### **問題 6:**  
CRM（Customer Relationship Management）の役割として適切な説明はどれですか？

A. 新規顧客の開拓のみに特化したシステム  
B. 顧客情報を統合・分析し、顧客との関係を最適化する管理手法  
C. 製品の品質管理を効率化するためのツール  
D. サプライチェーンの最適化を目指す管理手法  

## 答えと解説

### **問題 1の答え:**  
**正解:** C  
**解説:**  
割り込みは、予期しないイベント（例: 入力デバイスからの信号やエラーメッセージ）により、CPUが現在の処理を中断し、優先度の高いタスクを処理する仕組みです。これにより、効率的なタスク管理が可能になります。

---

### **問題 2の答え:**  
**正解:** B  
**解説:**  
データマイニングは、大量のデータからパターンや規則性を発見するプロセスです。ビジネスの意思決定やマーケティング戦略の改善に役立つ情報を得ることができます。

---

### **問題 3の答え:**  
**正解:** B  
**解説:**  
データウェアハウスは、ビジネス上の意思決定を支援するために、異なるシステムから集めたデータを一元的に管理し、分析するためのデータベースです。これにより、複数のデータソースを統合して分析することが可能になります。

---

### **問題 4の答え:**  
**正解:** B  
**解説:**  
LTEは、4Gネットワークの一部であり、データ通信の速度を向上させることを目的とした通信技術です。音声だけでなく、データ通信全般の高速化を図るもので、次世代通信技術の基盤となっています。

---

### **問題 5の答え:**  
**正解:** D  
**解説:**  
アンゾフの多角化戦略は、新しい商品を新しい市場に投入することで、ビジネスの成長を目指す戦略です。この戦略は、リスクが高い一方で、成功すれば新しい収益源を確保できる可能性があります。

---

### **問題 6の答え:**  
**正解:** B  
**解説:**  
CRM（顧客関係管理）は、顧客情報を統合・分析し、顧客との関係を最適化する管理手法です。顧客満足度を向上させるとともに、売上の増加や顧客維持率の向上を目指します。

<br>

# 感想
ずっと経験則を元にした直感で生きてきたので、データを使ってロジカルに物事を判断できる要素を取り入れたいな
tupleの使い方メモ

## おことわり

クソ雑魚初心者のメモです．

## 問1

**(Q)**
`A` 型 N 個から成るよ．個数 N は静的に決まるよ．どう実装すればいいか？
↓
**(A)**
それは単純に
`A As[5]; //Aが5個` とか
`std::array<A,3> As; //Aが3個` とかでいいんですかね．

**(Q)**
その場合，全ての要素についてメソッド `A::F()` 呼ぶには？
↓
**(A)**
こんなすかね？
`for( A &a : As )a.F();`

## 問2

**(Q)**
`A`, `B`, `C` から成るよ．要素の個数と，何番目が何型なのかは静的に決まるよ．
例えば `{ A,A,B }` とか `{ C,B,A,B,B }` とか．どう実装すればいいか？
↓
**(A)**
えっと…？？？
ああ，
`std::tuple<A,A,B>` とか `std::tuple<C,B,A,B,B>` とかでいいのか…な？

**(Q)**
その場合，全ての要素についてメソッド `F()` を呼ぶには？
（ `A`,`B`,`C` は全てメソッド `F()` を持つ型なのだとして）
↓
**(A)**
んん？？？
すいません，わかりません．ググります……

（そして２時間後……）

なんか↓で動いた気がするけど……難しすぎない？

```C++
//---------------------------
//(*1)tupleの要素を先頭から順に引数として用いて Func を呼ぶ，というのを
//ググった結果，見様見真似で書いたもの

template< std::size_t TupleIndex=0, typename Func, typename... TupleItemTypes >
inline typename std::enable_if_t< TupleIndex == sizeof...(TupleItemTypes) >
Tuple_for_each( const std::tuple<TupleItemTypes...> &, Func & ){}

template< std::size_t TupleIndex=0, typename Func, typename... TupleItemTypes >
inline typename std::enable_if_t< TupleIndex < sizeof...(TupleItemTypes) >
Tuple_for_each( const std::tuple<TupleItemTypes...> &t, Func &f )
{
	f( std::get<TupleIndex>(t) );
	Tuple_for_each< TupleIndex+1, Func, TupleItemTypes...>( t, f );
}

//---------------------------

//A,B,C
struct A{	void F() const {	std::cout << "A ";	}	};
struct B{	void F() const {	std::cout << "B ";	}	};
struct C{	void F() const {	std::cout << "C ";	}	};

//
int main()
{
	//(*2)「ジェネリックラムダ」とかいう不可思議存在
	auto Func = [](auto &X){	X.F();	};

	{//{A,A,B}
		std::tuple<A,A,B> T;
		Tuple_for_each( T, Func );
	}
	std::cout << '\n';
	{//{C,B,A,B,B}
		std::tuple<C,B,A,B,B> T;
		Tuple_for_each( T, Func );
	}
}

```

(*1) のところ， 最初，自力で

```C++
template< std::size_t TupleIndex=0, typename Func, typename... TupleItemTypes >
void My_Tuple_for_each( const std::tuple<TupleItemTypes...> &t, Func &f )
{
	f( std::get<TupleIndex>(t) );

	if( TupleIndex+1 < std::tuple_size_v< std::tuple<TupleItemTypes...> > )
	{	My_Tuple_for_each< TupleIndex+1, Func, TupleItemTypes...>( t, f );	}
}
```

とか書いてみたんだけど，これだと
`My_Tuple_for_each< TupleIndex+1, Func, TupleItemTypes...>( t, f );` で TupleIndex が範囲外のものを実体化しようとしてしまうのでダメであった．
`enable_if` だの何だのいうのを持ってくるのは馬鹿丸出し初心者には厳しいです．C++難しすぎ．

(*2)のところでは，`Tuple_for_each` を使おうにも「 `Func` には何を渡せばいいんだよ？」っていうのがまた謎であった．
あと，

```C++
//こうですか？　わかりません＞＜
std::tuple<A,A,B> T;
Tuple_for_each( T, [](auto &X){	X.F();	} );  //←コンパイルエラー
```

とか書いてコンパイル通らなくてしばらく躓いていたが，それは単に引数の型が `Func &` だからコレじゃ渡せないっていうだけの話だった．
（`Tuple_for_each` をコピペして `const Func &` なやつも用意すれば良いのかな．）

---

## 追記

むむ？
自力で書いて失敗した `My_Tuple_for_each` についてだが，

> `if( TupleIndex+1 < std::tuple_size_v< std::tuple<TupleItemTypes...> > )`

のところを `if constexpr` とすればいけるのではあるまいか…？
↓
試してみたらＯＫっぽい雰囲気．
AWS Client VPNのための証明証を作成する

# 環境
・Windows Server 2022
・OpenVPN 2.6.10

# OpenVPNのダウンロードとインストール
以下のURLからOpenVPNのインストーラーをダウンロードしてください。

https://www.openvpn.jp/

インストール時にカスタマイズで **「EasyRSA 3 Certificate Management Scripts」** を追加でインストールするのを忘れずに！！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1303641/23b1cba2-bdac-270c-bf30-79694e244300.png)


# サーバーとクライアントの証明書とキーを作る
## [任意] 証明書の有効期限を変更する
OpenVPNフォルダのeasy-rsaフォルダ内の`vars.example`をメモ帳などのエディタで開いて以下のように編集します。
`set_var`の前の`#`を消してコメントアウトを外すのを忘れないようにしましょう。
```:vars.example
# In how many days should the root CA key expire?
#
set_var EASYRSA_CA_EXPIRE	[指定の日数]


# In how many days should certificates expire?
#
set_var EASYRSA_CERT_EXPIRE	[指定の日数]
```
上が認証局(CA)の有効期限で
下が証明書の有効期限です。

ファイルを保存すると、証明書を発行するときに指定した有効期限が設定されているはずです。


## コマンドプロンプトを起動
接続したいサーバーやPC（EC2など）でコマンドプロンプトを開きます。

以下のコマンドでOpenVPN内のeasy-rsaファイルまで移動します。当たり前ですがPathは人それぞれです。
```:ファイル移動
cd C:\Program Files\OpenVPN\easy-rsa
```
コマンドでEasyRSA3 Shellを開きます。
```:Shellを開く
.\EasyRSA-Start.bat
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1303641/c34d5ada-c1b1-32d6-37e1-5c2bda84b667.png)

PKI環境を初期化します。
```:初期化
./easyrsa init-pki
```

## 認証局の証明書
新しい認証局（CA）の証明書を作ります。
途中でCommon Nameを入力する必要があるので、ドメイン等を判別できる適当な名前を設定します。
```:認証機関証明書
./easyrsa build-ca nopass
```

## 証明書とキー
以下のコマンドでサーバー証明書とキーを作ります。
```:サーバー証明書とキー
./easyrsa --san=DNS:server build-server-full server nopass
```

以下のコマンドでクライアント証明書とキーを作ります。
```:クライアント証明書とキー
./easyrsa build-client-full client1.domain.tld nopass
```

途中で`Type the word 'yes' to continue, or any other input to abort.
  Confirm request details:`と聞かれるので`yes`と答えましょう。

全て終わったら`exit`でシェルを終了しましょう。

# 証明書とキーの場所
以上の手順で以下の場所に証明書とキーが作られているはずです。

| 名前 | 場所 |
|:-:|:-|
| 認証局証明書  | .\pki\ca.crt  |
| サーバー証明書  | .\pki\issued\server.crt  |
| サーバーキー | .\pki\private\server.key  |
| クライアント証明書  | .\pki\issued\client1.domain.tld.crt  |
| クライアントキー  | .\pki\private\client1.domain.tld.key  |

# 証明書の有効期限確認
EasyRSA3 Shellを起動した状態で以下のコマンドをそれぞれ入力すると確認できるはずです。Pathは合わせて変更してください。
```
openssl x509 -text -noout -in pki/issued/server.crt
openssl x509 -text -noout -in pki/issued/client1.domain.tld.crt
```

# 参考資料
https://docs.aws.amazon.com/ja_jp/vpn/latest/clientvpn-admin/client-auth-mutual-enable.html
Windows App SDK のバージョン違い

何もし無しいのにエラー

This application requires the Windows App Runtime Version 1.5 (MSIX package version >= 5001.275.500.0)
Do you want to install a compatible Windows App Runtime now?

で、
https://learn.microsoft.com/ja-jp/windows/apps/windows-app-sdk/downloads
へ、リダイレクトされるが、ここからダウンロードして Windows App SDK を更新しても駄目

nugetから更新するのね
AWS Amplify sandbox で Segmentation fault (core dumped) が出たときの対処方法

表題の通りです、サクッと行きましょう。

# 実行コマンド
```shell
npx ampx sandbox 
```

# エラー
```shell
Segmentation fault (core dumped)
```

# 原因
node のバージョンが 20 とかだと発生するようです、18 系に変更することでエラーを回避可能。
1. node のバージョン変更（nodenv 利用時の例）
```shell
# 18 系のインストール
nodenv install 18.20.4

# ローカル環境で利用するバージョンに設定
nodenv local 18.20.4

# バージョン確認
node -v
```

``v18.20.4`` と出力されればOK

無事デプロイが実行されるようになりました。
```shell
$ npx ampx sandbox     

  
  Amplify Sandbox
  
  Identifier:   hoge
  Stack:        amplify-awsamplifygen2-hoge
  
  To specify a different sandbox identifier, use --identifier


✨  Synthesis time: 0.02s

⚠️ The --hotswap and --hotswap-fallback flags deliberately introduce CloudFormation drift to speed up deployments
⚠️ They should only be used for development - never use them for your production Stacks!
<以下略>
```

以上です、バージョン起因のエラーって気付くの時間かかりますよね。
ShaderGraphでマーブルノイズを実装【Unity、ShaderGraph、マーブル模様、マーブルノイズ、ノイズ】

# ■ 概要
本記事ではUnityのShaderGraphを使った
**「マーブルノイズ（マーブル模様）の実装」**
を紹介します。

# ■ 環境

Unityバージョン：Unity2022.3.44f1
プロジェクトテンプレート：Universal 3D

**今回はShaderGraphの機能が標準で搭載されている「URP」レンダリングパイプラインのプロジェクトで実装しています。**

※ビルトインのレンダリングパイプラインでも、パッケージを後からインストールしてShaderGraphを使用することができます。
[その手順はこちらの記事が参考になります。](https://ekulabo.com/unity-built-in-shader-graph)

# ■ 実装

Game画面：
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730387/1b7a1cb8-7ec3-db37-7d0a-e018352810cc.gif" width="1920">

ShaderGraphファイル：
![スクリーンショット 2024-10-21 184914.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730387/13fc7923-3bc6-c2ff-7cb3-2e25f4bfb60b.png)

## ① 2種のノイズを生成
異なるベクトルにスクロールするUV座標から2種類のノイズを生成する。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730387/a1d3e410-cd6e-3795-f9da-b4c1f8871bbe.gif" width="300">

## ② ノイズを合成
①で生成された2種類のノイズを加算合成する。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730387/ccf1d909-2260-a1ac-2659-d3314da6baa6.gif" width="300">

## ③ 静止したノイズを合成
②で合成されたノイズに、静止したノイズを加算合成する。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730387/3d2c4ab3-5eb8-8f65-7d39-3b3242d214c6.gif" width="300">

## ④ ノイズの最終アプトプットを生成
③の出力結果のままだと加算合成によってほとんど真っ白になってしまっているため、新たなノイズを生成して、③の出力結果でオフセットさせる。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730387/e0819a97-67df-e3bf-90fc-d02644dc497c.gif" width="300">

## ※ ノイズの調整 1
ノイズにもう少し複雑さを加えるために、③の出力結果を合成する。乗算合成によってコントラストもいい感じに調整されます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730387/49712ab7-d8ab-c7c0-9e9f-ec50361ef3b4.gif" width="300">

## ※ ノイズの調整 2
よりコントラストをはっきりさせるために「Smoothstep」ノードを使用し、閾値を調整します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730387/542d960f-bc53-049c-c38b-9f95cad65210.gif" width="300">

## ⑤ 2色を線形補間
最終的なノイズの出力結果をパラメーターとして、2色のカラーを線形補間する。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730387/0eb5be65-98ff-cba1-1b4d-9e6d5c5aa19c.gif" width="300">


# ■ 最後に （感想）

「Simple Noise」ノードを組み合わせて比較的簡単に実装することができました。
次回はこのマーブルノイズの実装を応用して、画面タップの座標を使ったインタラクティブなシェーダー表現を実装してみたいと思います。

ご覧いただきありがとうございました。
Kendra retrieveAPIで返戻のページ数のデフォルト値を変える方法

## 結論
デフォルトでは10件が返戻されますが、以下のように、PageSizeを指定することで最大値100個までパッセージを取得することが出来ます。

以下の例ではPageSize＝30とすることで、最大30件分のパッセージをresponseに含めるように設定しています。

```python
import boto3
(省略)

kendra = boto3.client('kendra', region_name="ap-northeast-1")

(省略)
    response = kendra.retrieve(
        QueryText=query_text,
        IndexId=index_id,
        AttributeFilter={
            "EqualsTo": {
                "Key": "_language_code",
                "Value": {"StringValue": "ja"},
            },
        },
        PageSize=30,
    )
    # Kendraの応答から上位30件の結果を抽出 
    results = response['ResultItems'][:30] if response['ResultItems'] else []
    
(省略)

```

## 背景
KendraとBedrockを利用したRAG実装を試みた際のこと。
RAGの実装に際して、AWSのKendraに対してLambdaから検索をかけるRetrieve部分の処理を実装する際に、検索結果のパッセージを何件取得するかプログラム側で制御するのですが、当初返戻が10件以上得られず上限値を変える方法を少し調べることとなりました。
ドキュメントを読み込むことも重要かとは思いますが、情報を見つけにくい部分もあったため、誰かの助けとなればと思い本記事を執筆しました。

## Query APIとRetrieve API について

Kendraでは、検索結果を取得する方法としてQueryAPIとRetrieve APIの二通りがあります。
これらの二つのAPIでは、出来ることや検索結果の取得方法が異なります。詳細についてはこちらの記事が参考になりました。
https://dev.classmethod.jp/articles/rag-knowledge-on-real-projects/

RAGの実装では、基本的に Retrieve APIの利用が推奨されています。Retrieve APIについては返戻件数のデフォルトの値は10件となっており、上記の通りPageSizeを指定することで10件以上の返戻を得ることができます。

※Query API のドキュメントは以下。
https://docs.aws.amazon.com/kendra/latest/APIReference/API_Query.html

※Retrieve APIのドキュメントは以下。
https://docs.aws.amazon.com/kendra/latest/APIReference/API_Retrieve.html

## まとめ
KendraではRetrieveAPIを利用することでデフォルトでは10件が返戻されますが、リクエストのPageSizeパラメータを指定することで最大値100個までパッセージを取得することが出来ました。
実装する上で公式ドキュメントのRequest Syntax の各項目は把握しておくと良いですね。

以上、最後までお読みいただきありがとうございました。

## その他参考記事

https://docs.aws.amazon.com/kendra/latest/dg/searching-retrieve.html

https://docs.aws.amazon.com/kendra/latest/APIReference/API_Retrieve.html

https://dev.classmethod.jp/articles/amazon-bedrock-kendra-lambda-rag/
「SQLアンチパターン」の気づき（DB物理設計1）

## はじめに

こんにちは。小川です。
以前から気になっていた「SQLアンチパターン」という本を読みました。
とても良い本で今まで気づかずにやっていたことがSQLアンチパターンなんだと知ることができました。
勉強になったので、学んだことを言語化して量が多いのでいくつかの記事に分けて紹介していこうと思います。
今回は第Ⅱ部のDB物理設計のアンチパターンについて記載します。
この記事は[「SQLアンチパターン」の気づき（DB論理設計3）](https://qiita.com/pesysyon/items/1a6074c96084017e3b88)の続きになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/edfcea05-fe0b-f2b8-c4c9-0881241eae1e.png)

## 9章.ラウンディングエラー（丸め誤差）

#### アンチパターン
小数値のデータが必要な場合に、FLOAT型を設定するアンチパターンです。

#### デメリット
1. 丸目誤差が生じてしまう
SQLのFLOAT型では「IEEE754標準」という規格に従って、実数を2進数形式でエンコードされます。
浮動小数点数を2進数形式で表現するため、無限精度が必要な値は「丸め誤差」が生じてしまいます。

#### 解決策：NUMERICデータ型を使う
FLOATや類似したデータ型の代わりに、SQLデータ型のNUMERICまたはDECIMALを用いて、固定制度の小数点を表すようにする。

## 10章.サーティワンフレーバー（31のフレーバー）

#### アンチパターン
限定する値を列定義で指定するアンチパターンです。
例)
```sql
CREATE TABLE Bugs (
 --他の列...
 status CHECK (status IN ('NEW', 'IN PROGRESS', 'FIXED')
);
```
例のように列にはCHECK制約を定義できます。制約条件がFALSEになるような値の挿入や変更を拒否します。
他にもENUM型の定義、ドメインやユーザー定義型を使って列に入力する値を特定のどれかに限定する方法もあります。

#### デメリット
1．どんなデータが入っているのかわかりずらい
→status列に現在許可されている列挙値を取得するのに以下のSQLを実行する
```sql
SELECT DISTINCT status FROM Bugs;
```
現時点のすべてのバグステータスがNEWである場合、このクエリからではNEWしか返されない。
2．値の追加、変更、削除をする際に再定義する必要がある
3．移植が困難
→各種データベース製品間で列定義の仕様が統一されていないため移植が困難

#### 解決策：限定する値をデータで指定する
今回の例だとBugsテーブルに紐づく、BugStatusテーブルを作成する。
```sql
CREATE TABLE BugStatus (
 status VARCHA(20) PRIMARY KEY,
);
CREATE TABLE Bugs (
 --他の列...
 status VARCHA(20),
 FOREIGN KEY (status) REFERENCES BugStatus(status)
  ON UPDATE CASCADE
);
```
このようにBugsテーブルに行の挿入や更新を行うときは、BugStatusテーブルに存在するstatus値を使わなければならないようにできます。

## まとめ
今回は第Ⅱ部のDB物理設計のアンチパターンについて一部まとめてみました。
この記事はこの本を読んで、私がこういう理解をしましたということを言語化してみました。
とても勉強になる本なので皆様もぜひ読んでみてください。

以上、小川でした。
Windowsがなぜか重い時の魔法の言葉

## はじめに
教えてもらったことを次回以降困ったときにも使えるようにめも

## 内容
1. PowerShellを管理者として実行
1. 以下のコマンドを実行
    ```
    sfc /scannow
    ```
1. 完了したら以下のコマンドを実行
    ```
    dism /online /cleanup-image /restorehealth
    ```
## おわりに
タスクマネージャーなど確認しても特に異常がなさそうで重くなって困っている人がいたら、参考にしてみてください。なお実行は自己責任でお願いします。指摘などがあればコメントを頂けると嬉しいです。
「SQLアンチパターン」の気づき（DB論理設計3）

## はじめに

こんにちは。小川です。
以前から気になっていた「SQLアンチパターン」という本を読みました。
とても良い本で今まで気づかずにやっていたことがSQLアンチパターンなんだと知ることができました。
勉強になったので、学んだことを言語化して量が多いのでいくつかの記事に分けて紹介していこうと思います。
今回は第Ⅰ部のDB論理設計のアンチパターンについて記載します。
この記事は[「SQLアンチパターン」の気づき（DB論理設計2）](https://qiita.com/pesysyon/items/81ba5fb1da036a5aa8b9)の続きになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/edfcea05-fe0b-f2b8-c4c9-0881241eae1e.png)

## 7章.マルチカラムアトリビュート（複数列属性）

#### アンチパターン
複数の値を持つ属性を格納するために、複数の列を定義する。

例)
```sql
CREATE TABLE Bugs (
    bug_id        SERIAL PRIMARY KEY,
    description VARCHAR(1000)
);
```
↓　バグテーブルにタグ機能を追加する
```sql
CREATE TABLE Bugs (
    bug_id        SERIAL PRIMARY KEY,
    description VARCHAR(1000),
    tag1             VARCHAR(20),
    tag2            VARCHAR(20),
    tag3            VARCHAR(20)
);
```
上記のように１つのテーブルに複数のタグをつけられるようにする

#### デメリット
1. 値の検索や追加、削除が困難になる
1. 一意性の保証ができなくなる
1. 増加する値の処理を行う必要がある
    →タグが3列では足りなくなった場合、新たに列を追加する作業が必要になる

#### 解決策：従属テーブルを作成する
バグテーブルにタグ列を追加するのではなく、新しくタグテーブル(従属テーブル)を作成してバグテーブルに紐づける。
```sql
CREATE TABLE Tags (
    bug_id        BIGINT UNSIGNED NOT NULL,
    tag              VARCHAR(20),
    PRIMARY KEY (bug_id, tag),
    FOREIGN KEY (bug_id) REFERNCES Bugs(bug_id)
);
```

## 8章.メタデータトリブル（メタデータ大増殖）

#### アンチパターン
どのようなデータベースクエリでもデータの容量が増加してきた場合、パフォーマンスは低下します。
そのため私たちは行数が少ないテーブルへのクエリ実行の方が、行数が多い場合よりも早く処理できることを知っています。
しかしこれは、求めている処理が何かにかかわらず「すべてのテーブルの行は少ない方がいい」という誤った考えを導きます。
その結果以下の2つのアンチパターンに陥ってしまいます。
1. 行数の多いテーブルを、複数のテーブルに分割する
1. 行を複数列に分割する

例）年ごとにテーブルを分ける
```sql
CREATE TABLE Bugs_2016 (...);
CREATE TABLE Bugs_2017 (...);
CREATE TABLE Bugs_2018 (...);
```

#### デメリット
1. データベースへ行を挿入する際に、挿入する値に応じて、挿入先テーブルを選択しなくてはならない
1. データの整合性を管理する必要がある
→テーブル名に関連するデータが自動的に入るように制限する方法がないので、各テーブルでCHECK制約などを設ける必要がある
1. アプリケーション側で処理を間違えていた場合、データを同期させる必要がある
1. 分割されたすべてのテーブルの間で、主キーが一意であることを保障する必要がある
1. テーブルをまたいだクエリの実行に手間がかかる
1. メタデータの同期
→列の追加が必要になった際、全てのテーブルに対する操作が必要になる

#### 解決策：パーティショニングと正規化を行う
1．水平パーティショニングの使用
水平パーティショニングとは行を分割するいくつかのルールを定義して、分割する方法です。
テーブル作成時にパーティション分割を行うことで、物理的には分割されているがあたかも１つのテーブルを扱うかのように見えます。

例）
```sql
CREATE TABLE Bugs (
  bug_id SERIAL PRIMARY KEY,
  -- 他の列
  date_reported DATE
) PARTITION BY HASH (YEAR(date_reported) )
PARTITIONS 4;
```
この例では「PARTITIONS 4」と記述しているため、物理的なテーブル数が4つに固定されています。
データベースが４年を超える期間のデータを扱う場合は、どれか1つのパーティションに2年以上の期間のデータが格納されることになります。

2．垂直パーティショニングの使用
水平パーティショニングは行で分割するのに対し、垂直パーティショニングは列で分割を行います。

3．従属テーブルの導入
7章のマルチカラムアトリビュートと同様の解決策となっています

## まとめ
今回は第Ⅰ部のDB論理設計のアンチパターンについて一部まとめてみました。
この記事はこの本を読んで、私がこういう理解をしましたということを言語化してみました。
とても勉強になる本なので皆様もぜひ読んでみてください。

以上、小川でした。
.m3uからurlを取得してaudioで再生する方法

# きっかけ
インターネットラジオが好きなんだけど自作のオシャレなプレイヤーを作ってインテリアにしたかった。
# ストリーミングするにはどうしたらいい？
SHOUTcastという海外の完全無料のインターネットラジオのサイトを発見。
ここでは.m3uというファイルでストリーミングができるurlを配ってるらしい。
[SHOUTcast](https://directory.shoutcast.com)

### リンクに飛ぶ
好きなステーションを見つけたらダウンロードボタンを押して.m3uを選択
新しいタブが開くのでリンクをコピー

# コーディング

### fetchして中身を取得
urlからfetch、変換して返す
```react
const fetchStreamUrl = async () => {
  const response = await fetch(
    {url}
  );
  const playlistText = await response.text();
  const lines = playlistText
    .split("\n")
    .filter((line) => line.trim() !== "" && !line.startsWith("#"));
  console.log(lines);
  return lines.length > 0 ? lines[0] : "";
};
```

### audio置く
再生するためのaudioをおく
この時に`/steream`を忘れない
これで音楽ファイルに潜ることができて再生できる。
筆者はこれにつまづいて2,3時間迷った。
```react
<audio id="audio-player" src={streamUrl+"/stream"}></audio>
```

### 再生ボタンの配置
再生停止の関数を作成
これでコントロールする。
```react
const handlePlayPause = () => {
    const audioElement = document.getElementById(
      "audio-player"
    ) as HTMLAudioElement;
    if (!audioElement) {
      console.error("Audio element not found.");
      return;
    }

    if (audioElement.paused) {
      audioElement.play();
      setIsPlaying(true);
    } else {
      audioElement.pause();
      setIsPlaying(false);
    }
  };
```

# 終わりに
なかなかマニアックなニーズだと思うがもし似たようなことを考えている人がいたら参考にしてくれると嬉しい。
time変換

`str` 型を `datetime` 型に変換するには、`datetime.strptime()` メソッドを使用します。`strptime` は指定された文字列とフォーマットに基づいて `datetime` オブジェクトを生成します。

以下は例です。

```python
from datetime import datetime

# 文字列
date_str = "2024-10-21 14:30:45"

# 文字列をdatetime型に変換
date_obj = datetime.strptime(date_str, "%Y-%m-%d %H:%M:%S")

print(date_obj)
```

このコードでは、`"2024-10-21 14:30:45"` という文字列が `datetime` 型に変換されます。

### 使用する主なフォーマット指定子:
- `%Y`: 4桁の年
- `%m`: 2桁の月
- `%d`: 2桁の日
- `%H`: 24時間形式の時
- `%M`: 分
- `%S`: 秒

必要に応じて、文字列のフォーマットを変更して試してください！
`datetime` 型のフォーマットを確認するには、`strftime` メソッドを使用して指定したフォーマットに変換できます。以下は主なフォーマット指定子です。

- `%Y`: 4桁の年 (例: 2024)
- `%m`: 2桁の月 (例: 10)
- `%d`: 2桁の日 (例: 21)
- `%H`: 24時間形式の時 (例: 14)
- `%M`: 分 (例: 30)
- `%S`: 秒 (例: 45)

例えば、`datetime` オブジェクトを "2024-10-21 14:30:45" の形式で表示したい場合、次のように使います。

```python
from datetime import datetime

now = datetime.now()
formatted_date = now.strftime("%Y-%m-%d %H:%M:%S")
print(formatted_date)
```

このコードは現在の日付と時刻を `2024-10-21 14:30:45` のようにフォーマットして表示します。

他にも必要なフォーマットがあれば教えてください！
システムコール、ユーザーモード、カーネルモードの関係を理解しよう！

## はじめに  
プログラミングやOSの動作に関わると、「システムコール」「ユーザーモード」「カーネルモード」という用語を目にすることが多くなります。これらの概念は、プログラムがOSとやり取りし、システムリソースにアクセスするために重要な役割を果たしています。

この記事では、システムコール、ユーザーモード、カーネルモードの関係性をわかりやすく解説し、その仕組みを理解していきます。


## 1. ユーザーモードとカーネルモードとは？

### 1.1. ユーザーモードとは？
ユーザーモードとは、アプリケーションが動作する「制限された環境」です。アプリケーションは直接ハードウェアにアクセスできず、OSを通してシステムリソースを操作します。この制限によって、プログラムが誤ってシステム全体に影響を与えることを防ぎ、セキュリティと安定性を保ちます。

- **特徴**: ハードウェアに直接アクセスできない、安全なモード。
- **例**: ブラウザ、テキストエディタ、ゲームなどの一般的なアプリケーションが動作する環境。

### 1.2. カーネルモードとは？
カーネルモードは、OSが動作するモードであり、ハードウェアやシステムリソースに直接アクセスできる特権を持ちます。OSカーネルはこのモードで動作し、メモリ管理やプロセス制御、ファイル操作など、システム全体の管理を行います。

- **特徴**: ハードウェアやメモリに直接アクセスでき、システム全体を制御する。
- **例**: メモリの割り当て、プロセスの作成・終了、ファイルの読み書きなど、OS内部での処理。

## 2. システムコールとは？

システムコールは、**ユーザーモードのアプリケーションがカーネルモードにアクセスするための手段**です。アプリケーションはシステムコールを使用して、OSに対して「ファイルを開く」「メモリを割り当てる」「プロセスを作成する」といった要求を行います。

ユーザーモードのプログラムは直接ハードウェアにアクセスできないため、システムコールを介してカーネルに処理を依頼します。

### システムコールの流れ
1. **ユーザーモード**のプログラムがシステムコールを呼び出す。
2. カーネルに処理が渡され、**カーネルモード**に切り替わる。
3. カーネルがリクエストされた操作（ファイルの開閉、メモリの割り当てなど）を実行する。
4. 処理が完了した後、カーネルモードから**ユーザーモード**に戻り、プログラムに結果が返される。


## 3. なぜモードを分ける必要があるのか？

### 3.1. 安全性の確保
ユーザーモードでは、アプリケーションが誤ってシステム全体に影響を与えないように、アクセスできるリソースや操作を制限しています。これにより、プログラムがバグやセキュリティホールを引き起こしても、システム全体がクラッシュするリスクを低減します。

### 3.2. システムリソースの効率的な管理
カーネルモードでは、システム全体のリソース（CPU、メモリ、デバイス）を効率的に管理し、各プロセスが必要なリソースを公平に使えるようにしています。カーネルが直接リソースを管理することで、競合や無駄な使用を防ぎ、システムの安定性を保っています。

## 4. システムコールの実際の例

システムコールは、OSが提供する様々な機能を利用するために使われます。以下は、一般的なシステムコールの例です。

| システムコール | 説明                           |
| --------------- | ------------------------------ |
| `open()`        | ファイルを開く                  |
| `read()`        | ファイルからデータを読み込む    |
| `write()`       | ファイルにデータを書き込む      |
| `close()`       | ファイルを閉じる                |
| `fork()`        | プロセスを複製する              |
| `exec()`        | プログラムを実行する            |
| `wait()`        | 子プロセスの終了を待つ          |
| `exit()`        | プログラムを終了する            |
| `kill()`        | プロセスにシグナルを送る        |


## 5. ユーザーモードとカーネルモードの切り替え

システムコールを使用するたびに、CPUは**ユーザーモード**から**カーネルモード**に切り替わり、OSが処理を行います。このモードの切り替えには若干のオーバーヘッドが発生するため、頻繁にシステムコールを使用するとパフォーマンスに影響を与える可能性があります。


## 6. システムコール、ユーザーモード、カーネルモードの関係をまとめる

- **ユーザーモード**: アプリケーションが動作するモード。ハードウェアには直接アクセスできない。
- **カーネルモード**: OSが動作するモード。ハードウェアやメモリに直接アクセスできる。
- **システムコール**: ユーザーモードのプログラムがカーネルにリソースやサービスを依頼する手段。

システムコールを理解することで、アプリケーションがどのようにしてOSやハードウェアとやり取りをしているかを理解することができます。また、システムの安定性やセキュリティを保つために、ユーザーモードとカーネルモードが分けられている理由も明確です。

---

**参考文献**:  
- [Linux カーネルとは](https://www.redhat.com/ja/topics/linux/what-is-the-linux-kernel)
【提案】コメントif


## もにょる！！！！！

こんなとき、もにょる。

typeに「炎」「水」の概念があり、それ以外の値は今のところないものとして、
以下のコードを見てほしい。

```js
if (type === "炎") {
    fireFunc();
}
else {
    waterFunc();
}
```

このコードのelseの箇所は事実上、`type === "水"`の分岐であるのだが、
それが**パっと見**では分かりづらくなっている。

それを嫌って以下のようにするとどうだろうか。

```js
if (type === "炎") {
    fireFunc();
}
else if (type === "水") {
    waterFunc();
}
else {
    throw new Error(`typeの分岐に不備があります: type = ${type}`);
}
```

別にこれでもいいが、冗長な気もしないでもない。
そして、このコードにいちいち「なんでこんな書き方してんの？elseでいいじゃん。馬鹿なの？」と思う人が90%の確率で発生すると思われる。（無根拠）

別に以下でもいいのだが…
なんかダサい。

```js
if (type === "炎") {
    fireFunc();
}
else {
    // ここは実質「type === "水"」の時にしか実行されません。
    waterFunc();
}
```

## 【提案】コメントif

そこで以下の方法を思いついた。

```js
if (type === "炎") {
  fireFunc();
}
else /*if (type === "水")*/ {
  waterFunc();
}
```

これで`type === "水"`の分岐であることの分かりやすさと、処理として多少の冗長性がなくなっていることが実現できる。

ただ、**何も知らない人のリファクタで消される可能性が非常に高い。**

## ついでに

[TSのsatisfies](https://qiita.com/chelproc/items/c0017cfa268409d2748b)や[Swiftのswitch](https://qiita.com/imaizume/items/bdd4286c6c4351a97118)のように網羅性チェックをしてくれる言語だとこんなこと気にしなくていいです。
pysqlite3のインストールで「sqlite3_load_extension」のエラーが出た場合の対処方法

pipでサクッと入るはずですが、

```error.sh
 rc = sqlite3_enable_load_extension(self->db, onoff);
      |          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      |          pysqlite_enable_load_extension
```

といったエラーに

検索するものの情報が少なく、環境依存かなーと思いましたが、中々解決に至らず
やっと見つけたのが環境変数の設定
下記で治りました
(fishですので、それ以外はexportでセットしてください)

 ```fix.sh
set -gx LDFLAGS "-L/opt/homebrew/opt/sqlite/lib" 
set -gx CPPFLAGS "-I/opt/homebrew/opt/sqlite/include"
set -gx PYTHON_CONFIGURE_OPTS "--enable-loadable-sqlite-extensions"
```

同じエラーで苦しんでいる方の参考になりましたら
【Ruby】初学者向け－例外処理について

## 例外処理について

本記事では例外処理についてまとめていきます。
　※例外…プログラムの実行中に発生する異常やエラーのこと。

### p
…例外オブジェクトの確認を行う

### beginとrescueとensure
…beginブロック内で発生した例外をとらえ、適切に処理をするために
　rescueブロックを用いる。ensureブロック内に記載された処理は
 　例外が発生してもしなくても実行される。
  　beginブロックで行った処理の後処理が必要な場合に用いられる。

```ruby:example_1.rb
    begin
    # 例外が発生する可能性のある処理
        result = 10 / 0 # ゼロ除算が発生してエラーになるコード
    
    # rescue単体でも使用できるが、下記のように特定のエラーが発生した場合にも使用できる
    rescue ZeroDivisionError => e
        # 例外発生時の処理
        puts "エラーが発生しました: #{e.message}" 

    # 必ず実行される処理
    ensure
        puts "処理が完了しました"
    end

```

### retry　
…例外処理内部に入ったときに使用する。
```ruby:example_2.rb
    a = 0
    
    begin
        b =  1 / a
    rescue ZeroDivisionError
        a += 1
        # もしZeroDivisionErrorが発生した場合、beginの先頭処理に戻って再び処理を行う
        
        retry
    ensure
        p b
        => 1
    end

```

### raise
…明示的に例外を発生させたい場合に使用する。

```ruby:example_3.rb
    # rails <エラー名>でも使用できるが、引数にエラーメッセージを設定することができる
    raise ArgumentError, "引数が不正です"
    => ArgumentError
    
    raise ArgumentError.new, "引数が不正です"
    => ArgumentError

```
### バックトレースメソッド
…「p e.backtrace」をソースコード内に記述する。
　どのようにエラーが発生したかを確認できる。
 ```ruby:example_4.rb
    begin
        1 / 0
    rescue ZeroDivisionError = > e
        p e.backtrace
    end

```

### フルメッセージメソッド
…「p e.full_message」をソースコード内に記述する。
　エラーの発生個所とエラーの発生源を確認できる。
 ```ruby:example_5.rb
    begin
        1 / 0
    rescue ZeroDivisionError = > e
        p e.full_message
    end

```

上記のメソッド等を用いて例外がシステム上で発生した際に
システムエラーが発生しないようにコードを記載することが大事です。

### 主な例外クラスの一覧
| 例外クラス名　　 　| 発生する場面の例 | 
|:-----------:|:------------|
| SyntaxError       | 文法エラーがあった場合        |
| SignalException     | 捕捉していないシグナルを受けた場合      |
| ArgumentError       | 引数の数が合わない場合や、値が正しくない場合        |
| RuntimeError         | 特定の例外クラスには該当しないエラーが発生した場合や、例外クラスを省略したraiseの呼び出し          |
| NameError       | 未定義のローカル変数や定数を参照した場合       |
| NoMethodError       | 未定義のメソッドを呼び出した場合       |
| ZeroDivisionError       | 整数に対し、整数の０で除算を行った場合       |