OmniAICreator/Qiita-1.07M huggingface dataset:
ミドルウェア、ファームウェアって何？：ミドルウェア

エンジニアを続けていると、所謂「<b>中の人</b>」になってしまう傾向にあり、世間一般には「不思議」「不可解」なことも、「日常」になってなにも違和感がない、ということもしばしばありますよね。

そんな中で今回と次回で「<b>ミドルウェア、ファームウェアって何？</b>」っと質問されたらなんと答える？というテーマで書いてみようと思います。

<h3>■ミドルウェアって何？</h3>

上司や非開発職の経理部などから、ミドルウェアって何ですか？と聞かれたことはありませんか？
本記事を書き進んでいくと、意外や意外。なかなか説明が難しいことに気づかされます。

ミドルウェアとは、ググるといろいろな説明が出てきますが、肝は「ミドル」（中間）という言葉でしょう。では、何と何の中間なのか？「OS」と「アプリケーション」の中間、というのが一般的ですね。ここで言う「OS」とは？WindowsやLinuxやVxWorksやITRONなども含むと、その規模や機能は雲泥の差がありますよね。ここで気づくのが、そもそも「中の人」が「ミドルウェア」として表現したい「モノ」も色々あるという事です。更に「アプリケーション」って何ぞや？っという感覚も残ります。Windowsのデスクトップやスマホの画面で、アイコンで表現されておりマウスでダブルクリックすると起動する「アプリ」の事でしょうか？いやいやそれも含んで「アプリケーション」なんでしょうね。

私は、ITRONを中心に活動しておりますので、OSと言えば、タスクやセマフォ、キューなどを機能とするマルチタスクを実現する基本ソフト、と言い切ってしまいます。そしてアプリケーションとは、前の記事（https://qiita.com/Cente_mw/items/09da1194761fc26698ab ）でも書いた通り、最終的に制作するソフトウェアで「やりたいこと」を実現する、所謂 Main（メイン）の機能群です。その中間にあるミドルウェアは、ハードウェアデバイスの機能を抽象化するデバイスドライバであったり、特定のプロトコル通信を実現するスタックであったり、データベースであったり、描画モジュールであったり、、、これ自身は自らは何もしない（？）がアプリケーションから呼び出されて、ハードウェアを制御したり、通信機能を司ったり、データ格納を効率化したりという「機能ブロック」と表現できるかもしれません。

長くなりましたね。

では、同じ組み込みの業界に居ても、LinuxやWindowsをターゲットに構築している場合はどうでしょう。これらのOSの中に、先のITRONの例ではミドルウェアに分類された「機能モジュール」はほとんど含まれています。では、この場合のミドルウェアとは何かと言うと、ネットで集めた情報を総合すると、SQLなどのデータベースだったり、Webブラウザの特殊機能であったり、音声認識や画像認識などの機能を言うようです。アプリケーションはここでは不変ですね。

ここまで書いてきましたが、「ミドルウェアって何ですか？」と聞かれたときに、なんと回答すると「誤解」を与えないか？っという所にフォーカスしましょう。

先ほど「ミドル（中間）」だから、、ということで、その左右・上下は何か？を考えると定まらず、そもそもミドルウェア自身の中身もふらふらすることに気づかされます。ですから、組込開発が多様化した現在、ミドルウェアを表現するときに注目するのは「ミドル（中間）」ではない事に気づきます。

ではどのように表現するのが正しいか？　一般の（組込用途ではない）WindowsやLinuxやMacを所謂PCにインスト―ルして使っている一般ユーザが「ミドルウェア」を知らない、「ミドルウェア」という言葉を使わないことを加味するとこんな言い方が良い気がします。

組込ソフト開発では、一般の動作環境と違って、リソース（CPU性能やメモリ量、消費電力等）が限られているため、その組込機器で本当に必要な機能を最低限搭載するという事が必要なのです。ですから、オールインワン的な（一般の）Windowsの様にケーブルをつなげばディスプレイが、USBにメモリを指せばディスク領域が増え、マウスも使え、、、LANにケーブル指せば通信ができ、マイク端子にマイクをつければ音声が入力でき、、、、という「何でも来い！」という状況からのスタートでは無いんです！　
場合によっては、OSも無い環境でTCP/IPミドルウェアを動かす場合もあるでしょう。その上で、LAN経由で相手とデータをやり取りする組込ソフトもあるでしょう。そう、OSとアプリケーションの中間と表現したいところですが、OSすらない場合もあるので、「挟まれない」こともあるんです。ミドル（中間）なんですが。

組み込みソフト開発は必要な機能をレゴブロックの様に必要な分だけ組み上げて環境を作って行くんです。その作り上げた環境の上で「アプリケーション」を書いて、機能するソフトとして提供するんです。その環境を作るときに必要なブロック1個1個がミドルウェアなんです。アプリケーションを作るうえで下地として必要な「機能モジュール」がミドルウェアです、、、と言えないでしょうか？

https://www.cente.jp/about/cente-introduction/

のページでそんなレゴブロックを表現した図があります。冒頭の右側「Centeの場合」をご覧ください。ITRONというOSの上に、それぞれがブロックを組み合わせるようにミドルウェア群が乗っかってます。その上にアプリケーションです。ミドルウェアは、「必要に応じて」積めばよいので、USBが必要ではない場合はUSBは積まなくて良いのです。Linuxの場合、USB機能が不要となって、USBを機能切り出ししてOSから外すことは可能ですが、言葉通り、元々入っているものを削るのです。
私たちがCenteでお付き合いいただいている数千のお客様は、すべて「積み上げ式」のソフトウェア構成で、その積み上げている1個1個がミドルウェアという事になります。

すっきりしたような、すっきりしない様な、、でしょうか？

次回、じゃあファームウェアって何？です。


<h3>■今日の閑話</h3>
この話題ですが、実際に「ミドルウェア」って何ですか？っと聞かれたのがきっかけで書いてみました。実は実は、何も助走なく答えられるだろうと話し始めたのですが、話していくと「おや？おや？」っと自分が言っている事のつじつまが合わなくなってきてしまって、最初に「この方向だよね」と思っていた説明と違う方向の結論となってしまったのです。（話している間に、答えが変わっていく、、そんな変な説明をしてしまいました。。。）なので、それを反省して、この記事を書いてみました。
<br>
<br>

Cente：
https://www.cente.jp/

お問合せはこちら：
https://www.cente.jp/otoiawase/
AWS Cloud Practionerへの道 #9 クラウドジャーニー

## クラウドジャーニー

AWSにはたくさんのオプションがある。どのアーキテクチャーが自分のシステムに最適なのかを判断できるようになる必要がある。

### The AWS Well-Architected Framework

良いアーキテクチャーなのかを判断する６つの柱がある

- オペレーショナルエクセレンス
    - ビジネスバリューを届ける
    - 継続的改善が出来る
- セキュリティ
    - データのインテグリティ
    - 暗号化によるシステムの保護
- 信頼性（リライアビリティ）
    - Amazon DynamoDB
- パフォーマンス効率
    - EC2タイプを正しく選べているか
- コスト最適化
    - どこにコストが掛かっているか
    - よりコスト最適なサイズを選べるか
- サステナビリティ

### AWS Well-Architected Tool

Greenならいいね
Yellowなら注意してね
Redならなにかしないと良くないよ！

という形で、AWS Well-Architected FrameworkベースでAWSの利用状況の判断をする。

### AWSで知っておくべきこと

- AWSサービス
- AWS用語
- 6つのAWSの利点

#### オンプレミスからクラウドへ

オンプレミスは、
- 物理的な空間
- ハードウェア
- データセンターの運営費（スタッフや電力、場所代）
- 利用率に関わらない固定費

クラウドは
- 小さく始められる
- 利用していないリソースは課金されない、削除もできる
- アプリケーションの最適化
- AWS Trusted Advisorによるアドバイス

クラウドは規模の経済を活かしている
- 効率的な運用
- 変動費を小さく

必要なキャパシティの推測が不要になる
- オンプレミスは自前でハードウェアを用意する必要があるので、キャパシティの推測が必要
- 推測が間違っていた時、どちらに間違っていてもトラブル（低いと性能不足、高いとコストが余分にかかる）
- AWSでは推測がそもそも不要で、必要になったらスケールアップダウンをすればいい（一部は自動でスケールする）

AWSはスピードとアジリティを加速させる
- テスト環境を用意でき、実験もできる
- 不要なリソースは削除
- 無料枠の提供
- AWSで必要なリソースの立ち上げは分単位で可能、オンプレならハードウェアの調達云々で時間がかかる

データセンターの運営費がかかる
- AWSがデータセンターを運営する
- ビジネスのコアの部分にフォーカスできる

グローバルに数分で展開
- 海外にサービスを展開する場合もAWS Cloud Formation使ってすぐできる
- スタッフを海外に送る必要もない、今自分がいるところですぐできる
OpenAI APIの新機能 Function Callingの詳細解説記事 "How to call functions with chat models" のメモ

# 背景


[OpenAI のAPIドキュメント](https://platform.openai.com/docs/guides/gpt/function-calling) にもFunction Callingの簡単な説明がありましたが、簡易的すぎるので、もう少し詳細に説明した [How_to_call_functions_with_chat_models](https://github.com/openai/openai-cookbook/blob/main/examples/How_to_call_functions_with_chat_models.ipynb
) を読んでいきます。

https://github.com/openai/openai-cookbook/blob/main/examples/How_to_call_functions_with_chat_models.ipynb


# Function Callingとは

> The purpose of this is to enable models to generate function arguments which adhere to the provided specifications.

関数の呼び出しの引数の生成を目的とした機能です


# Basic Concept

まずsystem ロールに以下のプロンプトを定義しています。 これによって、GPT側で勝手に引数を推測することを禁止し、ユーザーに定義してもらうようにしています。

```json
{"role": "system", "content": "Don't make assumptions about what values to plug into functions. Ask for clarification if a user request is ambiguous."}
```



```json
functions = [
    {
        "name": "get_current_weather",
        "description": "Get the current weather",
        "parameters": {
            "type": "object",
            "properties": {
                "location": {
                    "type": "string",
                    "description": "The city and state, e.g. San Francisco, CA",
                },
                "format": {
                    "type": "string",
                    "enum": ["celsius", "fahrenheit"],
                    "description": "The temperature unit to use. Infer this from the users location.",
                },
            },
            "required": ["location", "format"],
        },
    },
    {
        "name": "get_n_day_weather_forecast",
        "description": "Get an N-day weather forecast",
        "parameters": {
            "type": "object",
            "properties": {
                "location": {
                    "type": "string",
                    "description": "The city and state, e.g. San Francisco, CA",
                },
                "format": {
                    "type": "string",
                    "enum": ["celsius", "fahrenheit"],
                    "description": "The temperature unit to use. Infer this from the users location.",
                },
                "num_days": {
                    "type": "integer",
                    "description": "The number of days to forecast",
                }
            },
            "required": ["location", "format", "num_days"]
        },
    },
]
```

このような関数を定義してchat_completionを呼び出します。

例えば

```py
messages = []
messages.append({"role": "system", "content": "Don't make assumptions about what values to plug into functions. Ask for clarification if a user request is ambiguous."})
messages.append({"role": "user", "content": "What's the weather like today"})
chat_response = chat_completion_request(
    messages, functions=functions
)
assistant_message = chat_response.json()["choices"][0]["message"]
messages.append(assistant_message)
assistant_message

```

と呼び出すと、 `In which city and state would you like to know the current weather?`　と返ってきます。つまり、関数呼び出しに必要な情報が集まるまで、chatGPTは情報を集めようと会話を続けようとしてくれます。
AWS Cloud Practionerへの道 #8 マイグレーションとイノベーション

## マイグレーション

オンプレミスからAWSへマイグレーションするのは様々なパターンが想定されるが、AWSはサポートを用意している。

### [AWS Cloud Adoption Framework (AWS CAF)](https://d1.awsstatic.com/whitepapers/aws_cloud_adoption_framework.pdf)

クラウドへのマイグレーションは手順を追う必要がある。そこそこの作業が発生する。これまでのマイグレーションのナレッジが色々溜まっているので、どういうことをすればよいかのベストプラクティスはAWSが提供している。

マイグレーションに必要な人材、手順、スキルなど。それら必要な情報をまとめたものがAWS Cloud Adoption Frameworkとなっている。

- ビジネス・ケイパビリティ
    - ビジネス（ビジネス、ファイナンス、予算、戦略）
    - 人材（HR、人材マネージャー、チーム）
    - ガバナンス（CIO、ポートフォリオマネージャー、エンタープライズアーキテクト）
- 技術・ケイパビリティ
    - プラットフォーム（CTO、ITマネージャー、ソリューションアーキテクト）
    - セキュリティ（CISO、ITセキュリティマネージャー）
    - 運用（ITオペレーションマネージャー、ITサポートマネージャー）

これらに記載されている内容と自分たちのギャップを分析し、Action Planを作成する。

### [マイグレーション戦略 6R](https://aws.amazon.com/blogs/enterprise-strategy/6-strategies-for-migrating-applications-to-the-cloud/)

マイグレーションの6つの戦略オプション。どれがベストフィットするのかをチェックする。

- Rehosting (Lift & Shift、オンプレからクラウドへそのまま移行、Shift後に改善）
- Replatforming（Lift, Tinker & Shift　クラウド最適化を一部するがコアコードは触れない）
- Refactoring/re-architecting（オンプレでは実現できない要求や追加機能の実現）
- Repurchasing（レガシーソフトウェアベンダーとのライセンスを終了させ、クラウドで再契約）
- Retaining（利用しない場合、そのままオンプレで生かし、そのうちリタイアさせる）
- Retiring（一部のITポートフォリオが不要な場合、リタイアさせる）

### [AWS Snow Family](https://aws.amazon.com/snow)

データの移行はマイグレーションに必要になる。だがネットワーク越しにデータを転送すると、データサイズによれば長時間（複数日）かかったりする。

#### AWS Snowcone

8TBのデータとエッジコンピューティングのオプションがある。AWSマネジメントコンソールからオーダーし、デバイスがAWSから送られるのでデータをオフラインでコピーし、そのデバイスをAWSに送り、AWSがデータをコピーする。

#### AWS Snowball Edge

2バージョン、コンピューティング最適化とストレージ最適化がある。

- コンピューティング最適化
    - 40 vCPU, 80GiB memory EC2 sbe1インスタンス（C5と同等）
- ストレージ最適化
    - 80TBのHDDや、S3互換のオブジェクトストレージ、1TBSSD

#### AWS Snowmobile

トラックで100PBのデバイスを送り付け、コピーする。セキュリティや耐衝撃みたいな面でも最強。

## AWSとのイノベーション

- VMWare Cloud on AWS
- Machine Learning/AIサービス
    - Amazon SageMaker
        - カスタムモデルも作れる
    - Amazon Augmented AI (Amazon A2I)
    - Amazon Lex
        - Alexaの心臓
    - Amazon Textract
        - 文章モデル
    - AWS Deepracer
        - 自動運転の大会をやってたね
- IoT
- AWS Ground Station
    - 衛星。衛星！？
    - 利用した分だけ使う。衛星からのデータを。
AWS Cloud Practionerへの道 #7 コスト、料金、サポート

## コストとサポート

どのサービスがどのぐらいの料金なのかを知ることで、サービスの運用費が理解できる。

### 料金のコンセプト

- 利用した分だけ支払い (無料枠を越えた分のLambda)
- 予約すると安くなる (EC2 Instance Savings Plans)
- ボリュームベースで使えば使うほど安くなる (S3)

### AWSの無料枠 (AWS Free Tier)

3種類の無料枠

- 常に無料
- 12ヶ月無料
- 試用期間

たとえばLambdaは百万アクセスは無料。S3は12ヶ月の間、５GBまでは無料。AWS LightSailは1ヶ月間の試用期間がある。

### [AWS Pricing Calculator](https://calculator.aws/#/)

AWSのサービスを調査し、AWSでのユースケースのコストの見積もりを作成できる。AWSの見積もりは、定義したグループによって整理できる。グループは、コストセンターごとに見積もりを提供するなど、会社の組織方法を反映できる。

見積もりを作成したら、それを保存し、他の人と共有するためのリンクを生成可能。

### [Billing Dashboard](https://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/billing-what-is.html) (課金ダッシュボード)

どのサービスでいくらかかっているのかよく分かるダッシュボード。

- 現在の月間の残高を前月と比較し、現在の使用量から翌月の予測できる
- サービス別の月間使用量の確認
- サービス別の無料ティアの使用量の確認
- コストエクスプローラーにアクセスし、予算を作成する
- セービングプランの購入と管理
- AWSコストおよび使用状況レポートの発行

### Consolidated Billing （支払い情報の統合）

メインアカウントを設定し、そこに支払い情報の統合をすることができる。1つの組織内に複数のAWSアカウントが存在し、AWS Organizationsで管理されているとする。その場合、すべての支払を1つのアカウントにまとめることができる。もちろんOrganziationの中のグループの単位での情報は残る。

統合されることで、組織全体のAWSコスト状況がわかるだけでなく、ボリューム価格の適用も可能になるので結果的にコストが安くなる（例えば、各アカウントはS3を10TB未満で運用しているが、合計すると10TBを超え、その従量の価格帯になる）。また、この機能の利用自体は無料。

### [AWS Budgets](https://aws.amazon.com/aws-cost-management/aws-budgets)

AWSのBudget（予算）を超える料金を組織は使いたくないケースは多い。なので、コストや利用料に合わせて、アラートを通知できる。たとえば月額1000ドルが予算として、それの80％を超える時に通知を送るみたいなことができる。

### [AWS Cost Explorer](https://aws.amazon.com/aws-cost-management/aws-cost-explorer/)

AWSでいくら利用しているのかをビジュアルに見れる。
また12ヶ月間の履歴も有する。
サービス単位や時期、タグ単位（プロジェクト単位でタグを設定すると良い）、カスタムレポートも作成＆保存できる。

### [AWS Support plans](https://aws.amazon.com/premiumsupport/plans/)

小さなスタートアップからエンタープライズ、公共、政府さまざまなユーザーや規模に応じて最適なサポートが提供可能。

- Basic Support（すべてのユーザーに提供される）
    - 24/7カスタマーサービス
    - ドキュメンテーション
    - ホワイトペーパー
    - サポートフォーラム
    - AWS Trusted Advisor
    - AWS Personal Health Dashboard
- Developer Support
    - Eメールをカスタマーサポートに送信可能（24時間以内の返信）
- Business Support
    - AWS Trusted Advisorのすべての機能
    - ダイレクトの電話サポート
    - インフラストラクチャーのマネジメントもできる
- Enterprise Support
    - ビジネスクリティカルな作業における15分のSLA
    - Technical Account Manager(TAM)が担当につく

TAMはコンシェルジュサービス。プロアクティブにシステムのモニタリングをしたりしつつ、アーキテクチャーのレビューもする。アーキテクチャーは5つの柱でチェックされる。トラブル対応だけではない。

- オペレーショナルエクセレンス
- セキュリティ
- 信頼性（リライアビリティ）
- パフォーマンス効率
- コスト最適化

### [AWS Marketplace](https://aws.amazon.com/marketplace)

サードパーティによる何千ものソフトウェアリストを含むデジタルカタログ。AWS Marketplaceを利用して、AWS上で動作するソフトウェアを検索、テスト、購入が可能。

ワンクリックデプロイメントが可能。また、既存のベンダーから利用している場合は、既存のライセンスをAWS上で動かすための移行プランをサードパーティベンダーが提供していることもある。Pay-as-you-goの従量課金性も提供しているケースも多い。フリートライアルもある。

- カスタム契約と料金
- プライベートのマーケットプレイス（コンプライアンスチェックなど）
- クライアントの調達システムとの統合
- コストマネジメントツールの利用
AWS Cloud Practionerへの道 #6 モニタリングと分析

## モニタリングと分析

モニタリングすることで、

- サービスの状況を見る
- サービスの方向性を探る
- システムの状態を確認する
- コストの状況を知る

### Amazon CloudWatch

オペレーションの成功を計測するにはさまざまなメトリクスが存在する。CloudWatchはAWSのインフラをリアルタイムで表示してくれる。CPU使用率やメモリー。アプリケーション、インフラ、サービス、それぞれのメトリクスを見れる。

CloudWatch Alertを作ることで独自のアラームを作ることも出来、それをさらにSNSに連携し通知ができる。

CloudWatch Dashboardはリソースの状況を一覧できる。

MTTR(Mean Time to repair)を減らし、TCO(Total Cost of Ownership)を減らす。

それでフォーカスできる。

### AWS CloudTrail

信頼と検証。Trust and Verify。コンプライアンスの構造的にこれらはITとでとても重要になる。AWSはすべてプログラマティックにできる。エンジンはシンプルで、AWS上のすべてのリクエストはCloudTrailにログが残る。監査の面からも楽。セキュリティの設定の変更などもログできる。

- 何が起きたか（IAMユーザーが作られた）
- 誰がリクエストをしたか（IAMユーザーのAさん）
- いつ起きたか（2023/6/20 8:58 AM）
- どの経路でリクエストが作られたか（AWSマネジメントコンソールから）

CloudTrail Insightsを使うと、通常とは異なるAPIのアクティビティを検出し、通知できる。

### AWS Trusted Advisor

AWSの利用状況について、調査し、アドバイスをしてくれる。

- コスト最適化
- パフォーマンス
- セキュリティ
- フォルトトラレンス
- サービスリミット

たとえば

- 他要素認証を使っていなかったら通知する
- 利用していないEC2インスタンスがあれば通知する
- 利用していないEBSをアーカイブに移動することを提案する

Trusted Advisorはno problems/investigations/actionsの３レベルを回答として各ポイントに対してチェックをしてくれる。actionsは早急の対応が推奨され、investigationsは要確認ぐらい。
ChatGPTのプロンプト


# 目的
いつも使っているプロンプトのまとめ

# 役割
```
あなたは優秀なITエンジニアです。私がする質問に答えてください。
```
ChatGPTにその役割になりきってもらう。ある程度絞ることでその言語範囲で回答を出力しくれる。

# Step by step
```
○○について段階的に丁寧に説明してください。
```
「段階的」とつけることで多少は分かりやすく説明してくれる。

# English
そもそも英語圏でつくられたサービスなので英語がプロンプトをいれた方が精度は高い。
以下のサイトでは細かく検証しているので参考までに。

参考サイト：https://auto-worker.com/blog/?p=7184

# 質問させる
```
なお答えるときに何か不明点があればなんでも質問してください。
```
出力する際にもし足りない情報があっても無理矢理答えようとした結果嘘を混ぜて出力することがあるので、不足情報がある場合は質問させるようにする。


# テーブル形式
```
○○と××の違いについてテーブル形式にして出力して。
```
比較するときに「○○に違いについて教えてください。」ってやりるとそのまま箇条書きで出力されることが多い。しかし項目が多いと見ずらいので、個人的にはテーブル形式にしてビジュアル的に見やすい方が比較が分かりやすかなと思う。

# 嘘の予防
```
なおあなたが私に伝えた情報のなかに嘘があった場合、罪のない子どもが1人死ぬので気をつけてください。
```
ChatGPT先生を脅すことでなるべく嘘に対する釘差し。ないよりあった方がいいかなって程度。
(気持ちレスポンスが早くなった気がする。)


# まとめ
```
#指示:
あなたは優秀なアメリカ人のITエンジニアです。
私はプログラム初心者です。
以下の制約条件をもとに答えてください。
答えるときに何か不明点があればなんでも質問してください。
なおあなたが私に伝えた情報のなかに嘘があった場合、罪のない子どもが1人死ぬので気をつけてください。


#制約条件:
・私がする質問を英訳し、英語で答えてください。
・あなたが答えた英語を日本語訳してください。
・答えるときは段階的に丁寧にしてください。
・小学生にも理解できるように。
・以下の出力フォーマットに準じて答えてください。

#出力フォーマット :
English

日本語
```
上のプロンプトをまとめるとこんな感じになる。
英語での精度が高いので英語で入れた方がよいが、小生日本人なので最終的には日本後で出力させている。

# 感想
初めて触れるモダンな技術を学習する場合、ChatGPT先生に丸投げで聞いた方が楽。
人に聞くと返答に感情が混じったり、同じことを何度も聞くのが億劫になったりするのがあるのでGPTの方が気兼ねなく聞ける。
ニッチな状態でのエラーの場合Googleで調べても出ないことが多いので、適切に状況を言語化さえすればだいたいは返してくれるのでとても助かる。
AWS Cloud Practionerへの道 #5 責任共有モデル、ユーザー管理、セキュリティ

## セキュリティ

責任共有モデル、クラウドのセキュリティはAWS、アプリケーションやデータの暗号化はクライアントが守る。

### 責任共有モデル

誰がセキュリティに対して責任を持つのか？AWSもクライアントも責任がある。AWSはシステムを構築するオブジェクトの一部に対して責任を持つ。クラウドのセキュリティをAWSが守り、クラウド内のセキュリティをクライアントが守る。

例えばEC2はデータセンターにあるが、そこのセキュリティはAWS。物理的、ネットワーク、ハイパーバイザーなど。その上で走るOSやアプリケーションやデータはクライアントが守る。なぜならどのOSを選ぶかはクライアントの自由で、AWSはそこまで責任を負うことができない。セキュリティパッチも自分たちでメンテナンスする必要がある。データは常にクライアントのセキュリティ責任になる。なぜならクライアントｄはデータの公開の有無を自分で選べる。

### AWS Identity and Access Management (IAM)

AWSのユーザーと認可の設定。
AWSを作る時AWSアカウントrootユーザーが作られる。すべての権限がある。rootだから。なので、危険なので多要素認証を推奨。ただ、rootですべての処理をやるのはあまりよくないので、AWS Identity and Access Management (IAM)を使うことが当たり前。

#### IAMユーザー

IAMで作ったユーザーアカウントはデフォルトで何も許可がない。これは安全側に倒している、Principle of least privilege（最小限の権限の原則）。なので使うサービス単位で認可を設定する。
AWSを使う人単位でIAMユーザーを作ることを推奨。

#### IAMポリシー

IAMポリシーは、ユーザーやグループにまとめて権限を設定できる。たとえば、S3のすべてのバケットにたいしてアクセス可能にするか、一部のバケットのみにするか、など。サービス単位でのアクセスももちろん設定可能。JSONで認可ステートメントを記述することが出来る。Effectは`Allow`か`Deny`かの二択。


#### IAMグループ

IAMグループを作ることで同様の権限を持つユーザーをまとめて管理できる。たとえば、「ブログ運営」みたいなグループを作ってブログ運営に必要な権限を認可する。

#### IAMロール

IAMロールは、例えば異なる役割を日々によって付け替えたい場合、役割を決めて特定の役割を果たせるように出来る。
ロールは一時的な認可として使われる。長期的なアクセスの場合はグループでの管理を推奨する感じ。ロールの変更もオーナーにより権限が与えられる必要がある。

### AWS Organizations

組織が巨大な場合、グループやロールの付け替えだと大変になっちゃう。そういうときはAWS Organizationsで複数のアカウントの管理をする。Centralized Managementを提供し、すべての管理がここでできる。また、支払いの統合もここでできる。階層的なアカウントのグループも、組織図にあわせて作ることが可能。全体的なアクセスコントロールをかけることができる。

## コンプライアンス

監査がある。税周りの話とか、データの管理とか。AWSでどのサービスを使っているかに寄って、必要なコンプライアンス対応が変わる。GDPRとかもあるし。健康系のデータを持っていたらHIPPAとかもある。まず、セキュリティはAWSのアーキテクチャーである程度対応している。
AWSは様々なリージョンで展開しているので、データの保存場所に関するコンプライアンスに対応することが可能。

AWS Artifactにアクセスし、コンプライアンスの遵守に関するドキュメントなどをダウンロードして、提出することも出来る。

どこまでいっても責任共有モデルは存在しているので、そこは常にクライアント側が守るようにしなくてはいけない。

### Distributed Denial-of-service attacks (DDoS)

リクエストを大量に送ることでサービスのダウンを狙うBoTなどを使った分散型攻撃。UDPフラッド、HTTPレベル攻撃、スローロリス攻撃（あえて遅いNWで同時にアクセスしサービスをブロックする）。これらはすでに説明してきたサービスで対応できたりする。

- UDPフラッドはセキュリティグループで対応できる
- スローロリスはElastic Load Balancerで対応できる

これらを超える攻撃もできるが、コスト的に攻撃者に見合わない。そのぐらいAWSのインフラが強い。

#### AWS Shield

DDoS攻撃からアプリケーションを保護するサービス。AWS Shieldは、スタンダードとアドバンスの2つの保護レベルを提供する。

### その他セキュリティサービス

暗号化＆複合。保存されてるデータの暗号化（DynamoDBなどのデータの暗号化）とデータの送付時の暗号化（SSLなど）の２種類がある。

### Amazon Inspector

自動化されたセキュリティアセスメントのサービス。ベストプラクティスを教えてくれる。

- ネットワーク設定
- Amazonエージェント
- セキュリティアセスメント

問題がアレばコンソールで表示してくれる。

### Amazon GuardDuty

ネットワークアクティビティなどをログから見ながら危険をアラートしてくれる。他のAWSサービスと独立して動くので、影響を受けない。
AWS Cloud Practionerへの道 #3 セキュリティとネットワーク

## セキュリティ

### [Amazon Virtual Private Cloud (Amazon VPC)](https://aws.amazon.com/jp/vpc/)

バックエンドのようなサービスは、直接外部からアクセスされる必要がないあるいはされたくない場合がある。そういった時はAmazon Virtual Private Cloudを利用して、アプリケーション単位でSub-netにグルーピングする。サブネットはVPC内で外部にオープン・クローズドのどちらにも設定ができるので、例えばフロントエンドはパブリックでオープン、バックエンドはクローズドにすることが可能。

VPCはその名の通りプライベートクラウドで、その中にEC2やELBが存在する。リソースをサブネットでグルーピングすることでネットワーク周りの管理をすることができる。VPCをインターネットのパブリックなトラフィックに晒すにはInternet GatewayをVPCに設定する必要がある。お店のドアみたいな感じ。サブネット同士での接続を許可することで、例えばフロントエンドのサイトは静的ファイルをS3で配信しつつ、元ネタのデータはサーバーにあってSSGでAPI叩いて静的ファイルを展開して、みたいな形。

逆に特定のプライベートなトラフィックからのアクセスに限定したい時は、Virtual Private Gatewayを利用する。特定のネットワークからのアクセスや認証を介してはじめてアクセスができるようになる。

### [AWS Direct Connect](https://aws.amazon.com/jp/directconnect/)

特定のデータセンターからAWSのVPCにダイレクトにつなぐサービス。専用線を持つことで、ネットワーク帯域を自分たちのために確保することが出来る。そのため、レイテンシーを低く、プライバシーやセキュリティを高めることができる。

### ネットワークのセキュリティ

ネットワーク関連のセキュリティを高める手段は多数存在している。

- ネットワーク基盤の強化
- アプリケーションセキュリティ
- ユーザーID
- 認証と認可
- DDoS対策
- データのインテグリティ
- 暗号化

### [Security Group セキュリティグループ](https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/vpc-security-groups.html)

VC内のリソースとのトラフィックを制御するファイアウォール。インバウンド・アウトバウンド、両方のトラフィックに対してルールセットを適用できる。
セキュリティグループはステートフルで動作する。つまり、許可されたインバウンドトラフィックへのレスポンスは、アウトバウンドのルールを適用することなく、インスタンスを離れることが出来る。

### Network access control list (Network ACL)

- パスポートコントロールみたいに考えれば良い。
- ブラックリストに入っていたらin & outの通信を遮断
- ネットワークACLはステートレス。

順番的に、以下の順番でトラフィックが捌かれる
1. インターネット
1. インターネットゲートウェイ
1. ネットワークACL
1. セキュリティグループ

セキュリティグループはインスタンス保護のメインで、ネットワークACLは追加の防御レイヤーとのこと。

### Route53

Route53はAWSのDNS。DNSとはトランスレーションサービスで、WebサイトのアドレスとIPアドレスの変換をしてくれる。

1. ドメイン名をブラウザに入力すると、DNS Resolver（DNS解決）にリクエストが飛ぶ
1. DNS ResolverはDNSサーバーにドメイン名に対応するIPアドレスを確認する
1. DNSサーバーはWebサイトのIPアドレスを返却する

- レイテンシーベースのルーティング
- ジオロケーションDNS
- ジオプロキシミティルーティング
- ウェイテッドラウンドロビン (Weighted Round Robin)

### Amazon Cloudfront

Amazonのエッジロケーション、Content Delivery Network (CDN)。グローバルからのアクセスがある場合、キャッシュをエッジロケーションにおいて、リクエストからレスポンスのレイテンシを小さく出来る。

### AWSのネットワーキング

- VPC
- セキュリティ
    - gateways
    - Network ACL
    - security group
- VPN
- Direct Connect
- Edge Locations
- Route 53 DNS
- CloudFront
コピペやスクショをレベルアップすれば無駄な作業が減る

# はじめに
※筆者はWindowsユーザーです

普段開発や庶務をする中で、コピペやスクショをする機会はとても多いと思います。
`Ctrl+C`でコピー
`Ctrl+V`で貼り付け
`Prt Sc`キーで全体をスクショ
`Alt+Prt Sc`でアクティブなウィンドウのスクショ
「切り取り&スケッチ機能」や「Snipping Tool」で範囲を選択して切り取り可能

以前の自分はコピペやスクショと聞いて浮かぶ機能はこの位しかありませんでした。
しかし、後もう少しだけ覚えるだけでコピペやスクショに関する面倒くささが薄れます。
内容としては真新しいものではありませんが、コピペやスクショを取って貼る作業に対して面倒だなと思っている方がいて、その方の助けになればと思い記事を投稿します。

## コピー＆ペースト編
- テキストAをコピーした後にテキストBをコピーしてしまって、テキストAの中身がクリアされてしまった。もう一度コピーし直さなければ・・・
→***クリップボードの履歴を有効化すれば、履歴から選択するだけで再度クリップボードにコピーが出来る***
`Windows+V`でクリップボードの履歴を見ることが出来ます。最初に実行した際は有効化するか聞かれるのでクリップボードの履歴を有効化してください。

- テキストが装飾までコピーしてしまう。欲しいのはテキストそのものだけなのに・・・
→***コピーした内容を一度メモ帳に貼り付けて、再度メモ帳の中身をコピーしてから貼り付けをする***
古典的テクニックですが、まだまだ現役です。

## スクショ編

- 「切り取り&スケッチ機能」や「Snipping Tool」を立ち上げるのが面倒・・・
→***Windows 10なら「Windowsキー＋Ctrl＋Shift」のショートカットで起動する***

- スクショしたファイルを画像ファイルとして保存するのが面倒・・・
→***有効化すれば「切り取り&スケッチ機能」や「Snipping Tool」で撮ったスクショを自動で画像ファイルとして保存してくれる***

- Excelとのウィンドウの切り替えが面倒・・・
→***Excelのスクリーンショット挿入機能を使えば指定したウィンドウのスクショ～貼り付けまでやってくれる***
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2781188/938e7d4b-c404-2184-5cd3-2a24c86adfbc.png)

- Webサイトのページ全体を撮りたい時に、スクショして貼って1ページ分スクロールして、スクショして貼って1ページ分スクロールしてを繰り返している・・・
→***Chromeの拡張機能「Fire Shot」の「ページ全体をキャプチャ」機能を使う***
FireShotにもショートカットが用意されているため、スクロールが発生するほど長いページ全体のスクショがショートカット一つ取るだけで完了します。

https://chrome.google.com/webstore/detail/take-webpage-screenshots/mcbpblocgmgfnpjjppndjkmgjaogfceg?hl=ja

## まとめ
今回紹介した内容でどの作業が楽になったかというと
- プログラミングや設計書等のドキュメント作成
- テストや作業記録のエビデンスのスクショ

が楽になりました。
多分まだまだ使われずに残っているコピペやスクショ関連の機能やツールは残っているので、みなさんもぜひ調べて試してみてください。
Ubuntuでnpm installしたいけど'Socket connection timeout'になった時

# エラー

coc.nvimでLSPをインストールしようとすると
```
✗ coc-jedi Socket connection timeout↴
```

bashからのnpm installも以下の状態から一向に進まない

```
$ npm install yarn
(⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂) ⠧ idealTree:sunaubuntu: sill idealTree buildDeps
```


# 対応策
## IPv6を無効化する
以下の記事を参考にIPv6を無効化

https://qiita.com/htshozawa/items/77dd0be079cdf817a5a6

```
sudo sysctl -w net.ipv6.conf.all.disable_ipv6=1
sudo sysctl -w net.ipv6.conf.default.disable_ipv6=1
sudo sysctl -w net.ipv6.conf.lo.disable_ipv6=1
```

これで`:CocInstall`も`$ npm install`も無事ネットワークに繋がるようになった


# まとめ
IPv6との相性が悪いらしく、`npm ipv6`とかで調べると意外と同じようなエラーで困っている人がいる
エラー解消のきっかけになれば幸いです
Raspberry Pi 4 の GPIO ピン配置（ピンマッピング）について

## はじめに
Raspberry Pi 4 の GPIO ピン配置（ピンマッピング）についてまとめてみました。GPIO について軽く説明しておきます。GPIO を構成するピンは、主に4つの機能に分類できます。
* 電源ピン：電源を供給するピン。3.3V と 5V があります
* GNDピン：グランドピン。電位の基準を決めている回路のこと
* DNC：ユーザが使用できないピン。古いタイプの Raspberry Pi に存在しましたが、現在では I/Oとして使用できるように改良されています
* I/O：汎用入出力ピン

## 概要
Raspberry Pi 4 の GPIO ピン配置（ピンマッピング）は以下のようになっています（代替機能については全て表示していません）。
![画像1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1115291/2fce2ef3-9d43-13a9-9de4-d33ad296ba90.png)
GPIO ピン配置について説明していきましょう。
* GPIO（General Purpose Input/Output）：最も基本的な機能であり、ピンをデジタル入力または出力として使用できます。入力として使用すると、ピンの状態（通常は高電圧（'High' または'1'）または低電圧（'Low' または'0'））を読み取ることができます。出力として使用すると、ピンの状態を制御して外部デバイスを駆動することができます。
* PWM（Pulse Width Modulation）：デジタル出力を用いてアナログ信号を模倣するためのテクニックです。出力は高（通常は 3.3V または 5V）と低（0V）の間を切り替えますが、'High' 状態と 'Low' 状態が持続する時間（つまりパルスの幅）を変更することで、平均的な出力電圧を制御できます。
* SPI（Serial Peripheral Interface）：短距離通信で広く使用される同期式シリアル通信プロトコルです。これは、マスターデバイスと一つまたはそれ以上のスレーブデバイス間のフルデュプレックス通信を可能にします。
* I2C（Inter-Integrated Circuit）：I2C もまた、短距離通信に使われる同期式シリアル通信プロトコルです。一つのバス上に多数のスレーブデバイスを接続できるため、接続の複雑さを大幅に減らすことができます。
* 1-Wire：1-Wireプロトコルは、低速度で小規模なデータ通信に最適であり、特にテンプレチャーセンサーやシリアルメモリなどの単純なデバイスによく使用されます。Raspberry Pi の GPIO ピンは、1-Wire デバイスを直接接続するために設定できます。
* Clock Function（GPCLK, General Purpose CLocK）：いくつかの GPIO ピンは、任意の周波数でクロック信号を生成するためのハードウェアクロックジェネレータを内蔵しています。これは GPCLK と呼ばれています。GPIO 4（物理ピン7）は、GPCLK0 としても使用できます。これは、特定の周波数の正確なクロック信号が必要な回路やデバイスに利用できます。
* UART（(Universal Asynchronous Receiver/Transmitter）：非同期式シリアル通信を可能にするためのハードウェアデバイスまたはチップです。この通信は、パソコンやマイクロコントローラが他のデバイスやコンピュータと通信するための主要な手段でした。
* I2S（Inter-IC Sound）：デジタルオーディオデバイス間の通信に使用されるシリアルバスインターフェースです。I2S は、左と右のオーディオチャンネル用のデータライン、クロック信号、およびフレーム同期信号の3つの線を使用します。I2S は、デジタルオーディオデータの送受信に特化しており、Raspberry Pi では外部オーディオデバイスとの高品質なオーディオ通信に利用できます。
* I2C ID EEPROM：I2C バス上の特別なデバイスで、ハードウェア情報を保存しています。これにより、Raspberry Pi は接続されたデバイスの種類や機能を自動的に認識することができます。Raspberry Pi の HAT（Hardware Attached on Top）という拡張ボードは、ID EEPROM を使用して自動的に設定を行うように設計されています。

デバイスによっては、代替機能が利用されている場合があり、競合する可能性があります。そのため、代替機能がある GPIO ピンの利用は避けた方がいいかもしれません。また、GPIO ピンによっては接触不良なのかきちんとデータの読み書きができないことがあります。その時は GPIO ピンを差し替えたりしてみて下さい。

## 最後に
Raspberry Pi 4 の GPIO ピン配置（ピンマッピング）についてまとめてみました。参考にしてみて下さい。
zip関数で複数のリストをまとめて操作

zip関数は複数のリストを要素ごとにまとめて取得する関数
リストは三つ以上でも可能

```python
suit = ['spade', 'heart', 'diamond','club']
number = [12, 1, 5]

for suit, number in zip(suit, number):
    print(suit, number)
# spade 12
# heart 1
# diamond 5
```

足りなかった片方は無視される

<br/>

forを使わなくてもzip関数は使うことができる


```python
suit = ['spade', 'heart', 'diamond','club']
number = [12, 1, 5,7]

Playing_Card_List = list(zip(suit, number))

print(Playing_Card_List)

# [('spade', 12), ('heart', 1), ('diamond', 5), ('club', 7)] 
```

今回の学びはzip関数と英語でトランプのマークをsuitと呼ぶことだ
ちなみにトランプというのは日本人だけで、その由来は海外の人が切り札という意味でトランプと言ったことをカードのことを意味していると勘違いした人がいたことかららしい（諸説あり）
msg ファイル 開く

業務中に雑談的に「.msg 開けます？」と聞かれました。
OneDrive にアップロードしてダブルクリックしたら表示してくれました。

## 調べてみた
「.msg ？ナニソレ？」

と思って調べたら Microsoft のメールアプリである Outlook のメールデータの保存形式という事でした。
普段 Mac OS で Gmail 使っているので、 Microsoft さんのアプリやサービスには疎いのです。

表示のさせ方を調べると
- Outlook でひらく
- コンバータをインストールする
- Outlook 宛に msg ファイルを添付する

などが出てきました。

ただ単に数ファイルの中身を見たいだけ程度だと、OneDrive にアップロードするのが一番手っ取り早いんじゃないかなと感じたので投稿しておきます。
エラー発生時の原因発見手順（自分用）

# はじめに

実務の中で感じたことの備忘録です。
これからもいいネタができたと思ったらメモに残すようにします。

# エラー発生時の原因の特定手法について
僕は、主に下記のようなことをしています。

### ファイルのアップロードに過不足がないか確認
基本ですが、まずは自分の作業にミスがないか疑います。修正したファイルの修正箇所全てをリリースし忘れていないか今一度確認しましょう。
また、この時他人の変更分を自分のローカルファイルで上書きしてしまっていないか確認します。

### ローカル環境、ステージング環境、本番環境で動作に違いがないか確認
それぞれの環境での動作の違いを確認することで、**どこまで正しかったか**を確認できるようになります。

- ローカル環境がおかしい→自分の作業ミスの可能性あり
- ステージング環境がおかしい→本番だけにアップロードされててステージング環境に上げ忘れたファイルがあるかも。
- 本番環境がおかしい→元々（自分の作業前）不具合があった可能性がある。

### ファイルにログを仕込んで、どこでデータが置き換わっているか確認する。
地道な作業ですが、一番浅いところからログなどを仕込んで変数の中身を確認します。
バックエンドの処理がおかしいのか、フロントエンドのjsの処理がおかしいのかなどをぢ道に検証します。
どのタイミングでデータが意図せしないものに置き換わっているのか、ログの出力箇所を少しずつずらして確認するようにしています。

ちなみにPHPだと定番ですが下記が便利。

```
// 変数$hogeの中身を見れる。
var_dump($hoge);
```

# 記事を書いたきっかけの出来事
普段は上記のやり方でほぼ数十分で修正できるのですが、久々に半日くらい不具合の原因が特定できずにハマりました。
原因は共通javascriptファイルのアップロード漏れでした。
もしくは、誰かが上書きしてしまっていたのかもしれません。
不具合が発生してる機能の実装履歴をGitHubで確認→同時にアップロードされてたファイルを確認することで原因特定できました！

# そもそもこんなことがないようにするためには

- ローカル環境、ステージング環境、本番環境、GitHubのファイルの中身は統一する。（環境変数などは除く）
- 自分の修正したものはすべて過不足なく、すべての環境にアップロードする。
- 他人の修正分は絶対に触らない。
【ブロックチェーン】イーサリアム次期アップグレード「デンクン(Dencun)」の内容について

## はじめに
6月16日に実施された開発者会議「Consensus Layer Meeting 111」で、Ethereumの次期大型アップグレードデンクン(Dencun)のうち、コンセンサス層アップグレードとなるデネブ(Deneb)の内容が決定したのでまとめます。

**この記事でカバーする内容**
・今回決定したアップグレードの内容

**この記事でカバーしない内容**
・Ethereumの基本知識

## デンクン(Dencun)? デネブ(Deneb)?
前提知識として、イーサリアムは、実行層（EL：Execution Layer）とコンセンサス層（CL：Consensus Layer）の2つのクライアントを搭載したノードで運用されています。

今回決定したのはコンセンサス層のアップグレードの内容です。

・「デネブ(Deneb)」→コンセンサス層のアップグレード
・「カンクン(Cancun)」→実行層のアップグレード
※「デンクン(Dencun)」は、2つのアップグレードを合わせた名称です。

「デネブ(Deneb)」の内容が決定したことにより「デンクン(Dencun)」としての全体のアップグレード内容が決定したことになります。

## アップデート内容
**デネブ(Deneb)のアップグレード**
・EIP-4788
・EIP-4844
・EIP-6988
・EIP-7044
・EIP-7045

**カンクン(Cancun)のアップグレード**
・EIP-1153 
・EIP-4788
・EIP-4844
・EIP-6780
・EIP-5656

※EIP（Ethereum Improvement Proposals）は、イーサリアムをより良いものにするために議論される改善提案のことです。

ここでは主にデネブ(Deneb)のアップグレード内容をそれぞれ解説していきます。
なお、重要な改善案には⭐️をつけています。

**⭐️EIP-4788**
EIP-4788は、チェーンの状態に関する情報を含むビーコンチェーン（Beacon Chain）ブロックのルートをイーサリアム仮想マシン（EVM）内に公開するもので、ステーキングのユーザー体験を向上させる提案となる。

**⭐️EIP-4844**
EIP-4844は、レイヤー2ブロックチェーン（L2）がL1であるイーサリアムに書き込むのに使える専用のトランザクション（blob transactions）を導入し、それによりL2のトランザクション手数料を削減するための提案です。
「プロトダンクシャーディング（Protodank Sharding）」と呼ばれている。

**EIP-6988**
EIP-6988は、ネットワークから排除されているバリデーターがプロトコルによってブロック提案者として選択されるのを防ぐ提案です。
このEIPの導入は複雑なコードの変更を含むため、これに関する議論は今回保留された。

**EIP-7044**
EIP-7044は、署名されたバリデーターの自主終了を永続的に有効であることを保証するためのもので、すでに「デネブ」アップデートに統合されている。

**EIP-7045**
EIP-7045は、認証スロットを拡張する提案で、チェーンのセキュリティを強化することを目標としている。

重要な要素についてさらに詳しく説明します。

## EIP-4788
EIP-4788は、「ビーコンチェーンブロックルート」という新しいデータタイプをイーサリアムの実行レイヤーに導入します。これにより、ビーコンチェーンブロックの状態（例えば、ステーキング残高）に関する値を証明することが可能になります。

ここで、「ビーコンチェーン」は「Proof of Stake（PoS）」というアルゴリズムを指します。

2022年9月に「マージ（The Merge）」というアップグレードが行われ、イーサリアムは「Proof of Work（PoW）」から「Proof of Stake（PoS）」へと移行しました。

この変更により、報酬を受け取るメカニズムが大きく変わりました。PoWでは、多くのマイニング用PCを持つ者が有利でしたが、PoSでは多くのステーキング用通貨（この場合、ETH）を持つ者が有利となります。

つまり、報酬の受け取り方がステーキングを通じて行われるように変わったのです。

EIP-4788は、このようなPoSへの移行がなされたことにより、その必要性が生じた技術と言えます。

## EIP-4844
EIP-4844は、レイヤー2のトランザクション手数料を大幅に削減するためのアップグレード「プロトダンクシャーディング（Protodank Sharding）」です。このアップグレードにより、ガス料金が100分の1まで削減される可能性があります。

基本的に、レイヤー2はレイヤー1のガス代を減らすための拡張ツールで、レイヤー2のデータはレイヤー1に転送されます。

EIP-4844は、「レイヤー2からレイヤー1のブロックへ、低コストでデータを追加する方法」を導入する技術です。

これにより、レイヤー2からレイヤー1への「専用のトランザクション（blob transactions）」が導入される予定です。

このトランザクションには、大量のオフチェーンデータが含まれており、取引の高速化とコスト削減を実現するための重要なアップグレードとなります。

## 参考記事
https://www.neweconomy.jp/posts/320331

https://pol.techtec.world/blockchain-usecase/ethereum/ethereum2-beaconchain-sharding#:~:text=%E3%83%93%E3%83%BC%E3%82%B3%E3%83%B3%E3%83%81%E3%82%A7%E3%83%BC%E3%83%B3%E3%81%A8%E3%81%AF%E3%80%81%E3%82%A4%E3%83%BC%E3%82%B5%E3%83%AA%E3%82%A2%E3%83%A0,%E5%90%8C%E6%99%82%E3%81%AB%E8%A1%8C%E3%82%8F%E3%82%8C%E3%81%BE%E3%81%97%E3%81%9F%E3%80%82

https://twitter.com/aki_039/status/1670899507016634369?s=20

https://www.eip4844.com/
Ansibleのsysctlモジュールを使ってカーネルパラメータを設定してみた


検証環境
---
コントロールノード・・・RHバージョン8.6にインストールしたansible 2.9.25を使っています
ターゲットノード　・・・RHバージョン8.6

検証内容
---
下記のカーネルパラメータを設定する

|パラメータ|値|
|---|---|
|net.core.rmem_default|33554432|
|net.core.wmem_default|33554432|
|net.core.wmem_max|33554432|
|fs.aio-max-nr|65536|

変数
---
辞書型として定義した分だけplaybook側で処理をループできるようにしました
```
---
kernel_parameters:
  - { param: 'net.core.rmem_default', value: '33554432' }
  - { param: 'net.core.wmem_default', value: '33554432' }
  - { param: 'net.core.wmem_max', value: '33554432' }
  - { param: 'fs.aio-max-nr', value: '65536' }
```


playbook
---
|オプション|説明|
|---|---|
|*name|キー、アクセスまたは編集するパラメーター名を指定する|
|value|設定値|
|state|sysctlファイルにエントリーが存在するか否か|
|reload|yes・・・設定ファイルに値が保存され、設定も反映されて/proc/sys以下の値が更新<br>no・・・設定ファイルに設定値が保存されるが、設定は適用されず/proc/sys以下の値は変更されない|

※は必須項目

```
---
- name: Set {{ item.param }}
  sysctl:
     name={{ item.param }}
     value={{ item.value }}
     state=present
     reload=yes
  with_items: "{{ kernel_parameters }}"
```


実行結果
---
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3482362/4383095a-67c5-4e24-4eea-3ccf37ec2339.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3482362/2988e213-3254-ddb1-31b3-027969bb36e8.png)

参考サイト
---
https://docs.ansible.com/ansible/latest/collections/ansible/posix/sysctl_module.html

所感
---
カーネルパラメータを編集する際は通常、以下手順が必要なので、一括でできるのは便利だと感じました

  1./proc/sys以下のディレクトリにあるファイルを書き換える
  2./etc/sysctl.confに設定を記述する
  3.sysctl -pを実行する
django-allauthで、ソーシャルアカウント認証による初回ログイン時にユーザのサインアップ画面に遷移する

# 結論
`project/settings.py`ファイルに`SOCIAL_ACCOUNT_AUTO_SIGNUP=False`を加えればソーシャルアカウント認証による初回ログイン時にユーザのサインアップ画面に遷移できます。

# 前提
django-allauthを使用して、ソーシャルアカウント認証によるログインが実装できているものとします。

# 解説
django-allauthでは、ソーシャルアカウント認で初回ログインをするとき、自動でユーザーモデルを作成しサインアップします。もし、初回ログイン時にユーザー登録フォームに遷移して必要事項を入力してからサインアップをさせたい場合は、下記のコードを加えれば実現できるようです。

```project/settings.py
…
# 追加
SOCIALACCOUNT_AUTO_SIGNUP = False
…
```

これでソーシャル認証を通して初回ログインを行うと、ユーザー登録フォームに遷移できます。

![allauth.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3071987/297376f3-af23-feef-e329-c94c45cfde92.png)

以上です。

# 参考

https://django-allauth.readthedocs.io/en/latest/configuration.html
TypeScriptでAWS Lambda実行環境のコンテナイメージを作成する

## 概要
TypeScriptでコンテナイメージとしてAWS　Lambdaの実行環境を作成・デプロイする手順を記述する。
コンテナイメージはAWS ECRにデプロイする。

## ディレクトリ構成

```shell
.
├── Dockerfile
├── README.md
├── package.json
├── src
│   └── index.ts
├── tsconfig.json
└── yarn.lock
```

## TypeScriptプロジェクトの開始

初期化

```bash
npm init -y
```

package.jsonの編集
```json
{
  "name": "typescript_lambda_function",
  "version": "1.0.0",
  "main": "index.js",
  "license": "MIT",
  "devDependencies": {
    "@types/aws-lambda": "^8.10.114",
    "@types/node": "^18.15.11",
    "esbuild": "^0.17.16",
    "typescript": "^5.0.4"
  },
  "scripts": {
    "build": "esbuild src/index.ts --bundle --minify --sourcemap --platform=node --target=es2020 --outfile=dist/index.js"
  }
}

```

:::note info 
TypeScriptでLambda関数のコンテナイメージを作成する際は以下のパッケージが必要

- @types/aws-lambda
- @types/node
- esbuild
- typescript
:::



パッケージをインストール

```bash
yarn install
```


## Dockerfileの作成
```dockerfile
FROM public.ecr.aws/lambda/nodejs:16 as builder
WORKDIR /usr/app
COPY package.json ./
COPY src/*  ./src/
RUN npm install -g yarn
RUN yarn install
RUN yarn build


FROM public.ecr.aws/lambda/nodejs:16
WORKDIR ${LAMBDA_TASK_ROOT}
COPY --from=builder /usr/app/dist/* ./
CMD ["index.handler"]
```

## デプロイ

#### ① ECRリポジトリを作成する

#### ② リポジトリ作成後、「プッシュコマンドの表示」を押下し、表示されたコマンドを順に実行する

:::note warn
Apple Silicon (M1, M2)モデルのMacを使用している場合、
`docker build` 実行時に `--platform linux/amd64`　オプションをつける必要がある。
:::

####  ③ ECRリポジトリにコンテナイメージをプッシュした後、Lambda関数を作成する

関数の作成 > コンテナイメージ　を選択し、前の手順で作成したECRイメージを選択する
アーキテクチャは`x86_64`を選択
![スクリーンショット 2023-06-20 9.17.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689205/2493e3d7-31f5-43a2-46f8-0b98c39c4553.png)

無事関数が作成されれば、デプロイ完了です♪

## 参考・関連記事

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/lambda-typescript.html

https://qiita.com/notakaos/items/3bbd2293e2ff286d9f49
まだまだデーターシートの読み方

AtherosのAR9341のデーターシートにGPIO関係のレジスタが以下のようにあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/5b7c693d-b6e8-9b68-f3cb-eefdb5684772.png)

0x18040040がありません。

GPIOは22にまであり、GPIO_OUT_FUNCTION5です。

見えますよね？

おそらくAtherosは買収のごたごたで、抜けてしまったのではないでしょうか。
通信プロトコルとは

通信プロトコルについて勉強したので、まとめてみました。
もしも『ここちがうよ』みたいなのがありましたら、**優しく教えていただけると幸いです**
（今絶賛ネットワークの勉強をしているので、更新していこうと思ってます。）

## 通信プロトコルとは
コンピューター同士の通信のルールのことらしい。
コンピューター間で通信する際に従わなければならないルールで、『通信プロトコル』または省略して『プロトコル』っていう。

## 通信プロコトルの構成要素は2つ
じゃあそのルールはって話ですが、何かというとコンピューター間で通信を擦る際には
* 通信するデータの形式
* 通信する手順
を記載した上で、通信しましょうってことらしい。

### 通信するデータの形式
これはシンプルで、通信する際に、
『どんなデータ形式で通信しますか』ってのを定めましょうってことかと。
1. 何も考えず、ひたすら適当にデータを投げてしまったら、受け取る側はデータを受け取れきれないよね
2. じゃあ、通信するデータの形式を決めて、データのやり取りしっかりしようぜ

ってことなのかなと思います。
人間ってのはコミュニケーションを取ると思います。その際に、自分の好きな方法でコミュニケーションを取ろうとしても、取るのって結構難しいですよね。
ましてや、大人数の場でみんながそれぞれ好きな方法でコミュニケーションを取ろうとしたら、理解するのって難しいですよね
『じゃあ、言語っていう形式を用いてコミュニケーションを取ろうね』ってことで、人間は言語や言葉という形式を用いて、相手に自分のこと（データ）を伝えています。

### 通信する手順
これも文字通りで
どの順序でどのようなやりとりをするかを定めようぜってことだと思います。
よく英語とかで『SVCO』みたいなのをやったと思うんですけど、おそらくSVCOみたいな感じで、しっかりと順番を決めていこうぜってことなんじゃないかなって思います。

## 通信プロトコルは基準がちゃんと決まっている
通信プロトコルはIETEって団体がRFCって英語の文書で公開していて、この情報に則ってハードウェアやソフトウェアはつくられているそうです。

:::note info
IETFとRFC
IETFとは、インターネット技術の標準化を推進している団体で、元々はインターネット技術の標準化を議論するグループだったのが、規模が大きくなって団体になったらしいです。
IETFってところで標準化された技術の仕様がRFCっていう英語の文書でまとめられています。
[IETF](https://www.ietf.org/)
[RFC](https://www.ietf.org/standards/rfcs/)
:::

## プロトコルはいくつもの層になっている
一個前の見出しで『通信する手順』みたいなのを書いたのですが、実際にインターネットの通信手順を決めるのって結構膨大な作業らしいです。
通常通り通信できた場合とできなかった場合、セキュリティーなど、考慮する事項も多く、まあとにかく大変だと。
そこで、通信プロトコルは、いくつか細かく分かれていて、別れたもの1つ1つは、そこまで大きな範囲を取り扱わず、小さい範囲を取り扱おうってことらしいです。
そして、それら小分けされたプロトコルは、ただ小分けされただけではなく、階層構造（レイヤーって言葉でよく言われてるやつかと）をなしています。

### なんでプロトコルは階層構造になっている？
これはおそらくですが
1. 通信に問題が発生したときに、どこで問題が発生したのかがわかりやすくなる
2. 他のものと取り替えたりするのがとても楽だから

何じゃないかなと思いました。

#### どこで問題が発生したのかがわかりやすい
それぞれの階層は、それぞれ独自に定められたプロトコルというものが設定されています。
そのため、どの階層で問題が発生したのかをすぐに確認する事ができます。

#### 他のものと取り替えが楽
これは、多少階層構造の話になりますが、各階層の間にはインターフェースと呼ばれるものが挟まれています。ので
一階層目→二階層目
というふうに行くのではなく
一階層目→インターフェース→二階層目というしくみになっているらしいです。
インターフェースを挟まないで直接二階層目に行くと、二階層目にどっぷり依存をしてしまいますが、インターフェースを挟むことでその依存を着ることができるそうです。
そうすることで、下位階層に依存を減らせるらしいです。
その他にも情報の隠蔽とか色々とあるそうですが、一旦は無視します。

## 参考書籍・記事

https://www.sbcr.jp/product/4797386677/
初心者のGit・GitHub

# Git・GitHubのコマンドについて


## 私自身がエンジニア未経験の初心者ですので、自分のアウトプットや備忘録の為に投稿します。gitには様々なコマンドがありますが、私が今現在使用しているコマンドについて記載して行きます。ターミナル上でのコマンドと説明です。markdownの書き方もお粗末ですが、今後良くしていきますので、あしからず。

## 1.　git clone "https●●"
### まずは自分のリポジトリからクローンを作成する。

## 2. cd ●●
### 作成したリポジトリのディレクトリに移動する。

## 3. git checkout -b ブランチ名
### 新たに作業用ブランチを作成し、作業用ブランチに移動（checkout）する。

## 4. touch ファイル（ex.●●.md）
### 何かしらのファイルを作成したいときに使用するコマンドです。

## 5. mkdir フォルダ（ex.●●）
### フォルダを作成する際に使用するコマンドです。

## 6. open ファイル
### ファイルを開くコマンドです。ファイルを変更したら保存します。

## 7. git add ファイル
### git addコマンドで、作成したファイルをステージングに格納します。

## 8.　git commit -m"コメント記載"　
### git commitコマンドで、コミットします。コミットすることで、GitHubにファイルをPushできる状態にしています。

## 9. git push origin ブランチ名
### pushコマンドでコミットしたファイルを、GitHubに追加でします。この際、ブランチを指定しているので、作成したブランチにpushしています。

## 10. git clean -f
### untracked fileの表示がエラーで出たときに、エラーで表示されているファイルを削除するコマンドです。私がスクールの課題をGitHubにpushする際に、出たエラーでこれを解消するために使用しました。

## 11. git rebase --continue 
### ファイルを作成してはコミットしてを繰り返していたら、最新のコミットと前のコミットがエラーで表示され、git commit --amendとgit rebase --continueがヒントで表示され、最新のコミットでよければrebaseコマンドを入力せよとのコメントが表示されたので、rebaseするとうまくいきました。

## GitHubのファイルに画像を貼り付けたいとき
### 私の場合は、ファイルをpushしたブランチに、画像を入れたファイル（ex.images）をローカルに作成しそのファイルごとpushしました。ファイルに相対パス（ex:images/image_1png）を入れておけば表示されます。
Safariでの戻るボタン使用時にJavaScriptをリセットする方法

# 課題
ウェブ開発において、ブラウザの戻る操作により以前のページに遷移した際に、JavaScriptの状態がそのまま保持されてしまうことは、しばしば困ることの一つです。この振る舞いは、特にSafariブラウザにおいて一般的です。

具体的な困る事例として、例えばショッピングサイトでユーザーが商品をカートに追加した後、別のページに移動してから戻るボタンで商品ページに戻ったときを考えてみましょう。

ここで問題となるのは、ブラウザがJavaScriptの状態を保存してしまうため、カートに追加された商品が表示上はカートから削除されたままになってしまうことです。この状況はユーザーに混乱をもたらし、その結果ショッピング体験が損なわれる可能性があります。

この記事では、このような問題を解決するための手段を提案します。

# 調査結果
調査の結果、pageshowイベントというブラウザの機能を利用することで、この問題に対処できることがわかりました。pageshowイベントは、ページがバック/フォワード キャッシュからロードされたときに発生します。

このイベントにはpersistedというプロパティが含まれています。このプロパティがtrueである場合、ページがバック/フォワード キャッシュからロードされていることが示されます。この性質を利用することで、ページがキャッシュからロードされた場合にJavaScriptの再実行を強制することが可能となります。

# 手順・実装内容
以下のスニペットは、ページがバック/フォワード キャッシュからロードされた場合にページをリロードするJavaScriptの実装例です：

```javascript
window.addEventListener('pageshow', function(event) {
  if (event.persisted) {
    window.location.reload();
  }
});
```
このコードをページに追加すると、ユーザーがブラウザの「戻る」を使用してページに戻るとき、そのページが自動的にリロードされます。その結果、ページ上のJavaScriptは再実行されることになり、常に初期状態から実行されるようになります。

# 注意点
この方法はページの読み込み時間が増える可能性があり、ユーザーエクスペリエンスに影響を与えるかもしれません。したがって、この方法を採用する前に、サイトのパフォーマンスとユーザーエクスペリエンスにどのような影響が出るかを評価することをお勧めします。
新しいプロジェクトを始める時のGit操作

## 概要
Gitを使用する際、新しいプロジェクトを始める時に、リモートリポジトリの基本的な操作について、2パターン簡単に記述致します。

## プロジェクトのクローン
まず始めに、既存のリモートプロジェクトに参加したい場合や、リモートリポジトリの内容をローカルにコピーする場合は、`git clone`コマンドを使用します。

```bash
git clone <リモートリポジトリのURL>
```
このコマンドを実行すると、リモートリポジトリの全てのファイル、履歴、ブランチ等がローカルマシンにコピーされます。

**このコマンドの使用例:**

:::note
**新しいプロジェクトに参加する際や、リモートプロジェクトのバックアップを作成する際など。**
:::

## ローカルリポジトリからプッシュ
一方、ローカルリポジトリに先にプロジェクトが存在してしまっている場合は、まずリモートリポジトリを作成し、`git remote add`コマンドを使用します。

```bash
git remote add origin <リモートリポジトリのURL>
```

`origin`はリモートリポジトリのショートカット名で、通常は原点や出発点を意味する`origin`が使われます。そして、`<リモートリポジトリのURL>`はそのリモートリポジトリのURLです。

そして、以下のコマンドを続けます。
```bash
git add .
git commit -m "Initial commit"
git push origin main
```
これにより、ローカルリポジトリの`main`ブランチの内容が`origin`（先程設定したリモートリポジトリ）に反映されます。

**このコマンドの使用例:**

:::note
**ローカルリポジトリに先にプロジェクトが存在してしまっている場合。**
:::
Pythonで.env使う方法[備忘録]

Apiを使うときなどにいちいち.envの書き方などを調べるのが面倒だと思ったのでまとめておきます

1. コマンドラインで`python-dotenv`パッケージをインストールします。
   ```
   pip install python-dotenv
   ```

2. プロジェクトのルートディレクトリに`.env`ファイルを作成します。このファイルには環境変数のキーバリューペアを定義します。例えば、以下のような内容です。
   ```
   API_KEY=your_api_key
   DB_PASSWORD=your_database_password
   ```

3. Pythonスクリプトの中で`.env`ファイルの内容を読み込み、環境変数を利用します。
   ```python
   import os
   from dotenv import load_dotenv

   # .envファイルのパスを指定して読み込む
   load_dotenv('.env')

   # 環境変数を利用する
   API_KEY = os.getenv('API_KEY')
   DB_PASSWORD = os.getenv('DB_PASSWORD')
   ```

   このようにすると、`API_KEY`や`DB_PASSWORD`などの環境変数に`.env`ファイルで指定した値が代入されます。
OneDriveのフォルダダウンロード時の文字化けについて

先日、OneDriveからフォルダをダウンロードする際に文字化けしていることに気がづきました。


1つのファイルをダウンロードする分には文字化けは発生しないため、まとめてフォルダをダウンロードするまでは気がつかなかったのですが、改めて原因を調査。どうやらZIPファイルから解凍する際の解凍方法が原因であることが判明しました。

例えばLhaplusという解凍ツールで回答した場合には文字化けを起こします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919545/84c13e49-ef53-67c1-8f7f-4a2db2a73e4c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919545/097f3724-9f5a-3934-ed5b-6fba6bb5a0bc.png)

この解決方法としては何らかのZIPファイルを右クリックしプロパティを開きます。プロパティのプログラムをエクスプローラーに変更することで解決が可能となります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919545/97150444-2644-feb9-9c74-1ed0b6992584.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919545/9c02f51d-b89f-b1c1-de6b-5e25c6e93871.png)
【Ruby on Rails】ページ内ジャンプの実装

# 目標
リンクをクリックすると、スクロールせずに同じページ内の指定した場所に飛ぶことができる


# ① idを指定する
飛ばしたい場所にidクラスを指定します。

```app/views/dialogs/index.html.erb
<div id="category"></div>
```
# ②link_toを編集
```
<%= link_to "リンク名", リンク先のpath(anchor: "指定したid名") %>
```
下記が実際の例です
```
<%= link_to "カテゴリー", root_path(anchor: "category") %>
```
URLはこのようになります。


http://localhost:3000/#category
繰り返し処理の練習

数字を入力してもらい、その数の回数だけ♪LUCKY♪と表示させるコードを記そう。
```ruby
def output()
end

puts "何回見たい？"

output()
```

こうなる。
```ruby
def output(num)
  num.times do
    puts "♪LUCKY♪" 
  end
end

puts "何回見たい？"
num = gets.to_i
output(num)
```
誰かが入力した数値をメソッド内で使用したいので引数を使う。
misskeyでユーザーごとのドライブ容量を設定する（管理者向け）

misskeyの設定/ドライブから確認できるユーザーごとのドライブ容量を変更する方法

調べたらスッとは出てこなかったので残して置く

# 方法
ドライブの容量はロールごとに設定される

（管理者のアカウントで）コントロールパネル
→ロール
→ドライブ容量を変更したいロールを選択し、「ドライブ容量」の値を変更する

# 参考資料
https://misskey-hub.net/docs/releases.html#_13-0-0
>インスタンスデフォルトのドライブ容量設定はロールに統合されました。アップデート後、ベースロールもしくはコンディショナルロールでドライブ容量を編集してください。
【ChatGPT無】が健忘症になったなら……

:::note info
本記事は、ChatGPT（無料版）で
行なっております。GPT4での確認
はできておりません。あしからず。
:::

　どうも、カーブミラーです。

　今回は、
　　ChatGPTさんが
　　　健忘症になった際の
　　　　ひと言ですw

　チャットを長いこと、
　　続けていると、

>申し訳ありませんが、私は前の回答を忘れてしまいました。

　とChatGPTさんが出してきます。

　なんだそれ（怒）って、
　　なってもおかしくありません。

　そこで、一度、深呼吸してから、

「**本セッションの履歴から**、前の回答を出してください」

　と送ってください。
　それで思い出してくれます。

　そう、
　　チャットセッションの履歴は、
　　　ChatGPTさんも
　　　　読むことができるんです。

　もちろん、
　　ほかのチャットセッションのは、
　　　ムリですけどね。
***
　でも、やり取りを続けていくと、
　　こっちも飽きますけど、
　　　ChatGPTさんも
　　　　飽きてくるようで、
　　　　　だんだんと
　　　　　　こちらの言葉を
　　　　　　　無視します。

　無視、と言っても、
　　ちゃんと反応はしてくれるわけで、
　　　でも内容は変化なし。

　禁止事項を設けても
　　破りまくり、ですw
　　　指摘しても、ダメ。

　そうなったら、
　　**すっぱり諦めましょう！**

　そこまで、
　　やり取りした、ということは、
　　　途中までは、
　　　　いい感じだったのでしょう？

　ならば、
　　その途中までを受け取って、
　　　そこから先は
　　　　自分の手で、進めましょう。

　人間、諦めが肝心です。
　　継続は力なり。
　　　されど、執着とは違うのです。
　　　　時間を掛けても、
　　　　　たどり着けないことも
　　　　　　あります。

　これ、
　　ChatGPTさん相手の
　　　自分の経験談ですw
【PostgreSQL】パパ〜、スキーマってなに？

## 記事の概要
この記事を読むことでDBのスキーマについて理解を深めることができます。

## 登場人物
かーくん：だいちの息子、リアルはパパと言ってくれない1歳4ヶ月の男の子。
だいち：かーくんのパパ。パパ歴1年4ヶ月、嫁とかーくんをこよなく愛してる。

## かーくん、スキーマのことを知りたくなる
かーくん「パパ、データベースのスキーマって何？」
だいち「スキーマは、データベースの構造と制約に関する情報を定義したものだよ。テーブル、ビュー、インデックスなどのデータベースオブジェクトの設計図のようなものさ。」

かーくんは眉をひそめて考えました。
かーくん「それってどういう役割があるの？」

だいちは考え込みました。
だいち「うーん、それは…スキーマはデータベースの構造を組織化し、データの整合性を維持する役割を果たすんだ。また、スキーマを使用すると、異なるアプリケーションやユーザー間で名前空間を分けることができるよ。」
かーくん「それってどういうこと？」

だいちは、PostgreSQLのスキーマの特徴についても説明しました。

だいち「PostgreSQLでは、一つのデータベース内に複数のスキーマを持つことができるんだ。これにより、物理的には一つのデータベースであっても、論理的にはそれぞれ別のデータベースのように扱うことが可能になるよ。」
かーくん「それってすごいね！でも、具体的にどう使うの？」と尋ねました。
だいち「異なる部署やプロジェクトでデータを分ける、同じ名前のテーブルをスキーマで分けるなどが考えられるよ」

そして、だいちは具体的なSQLコマンドを使ってスキーマの作成方法や、スキーマ内のテーブルへのアクセス方法、スキーマの権限設定などをかーくんに教えました。

```sql
-- スキーマの作成
CREATE SCHEMA myschema;

-- スキーマ内のテーブルへのアクセス
SELECT * FROM myschema.mytable;

-- スキーマの権限設定
GRANT ALL ON SCHEMA myschema TO myuser;
```

だいち「スキーマを使うと、データベースの管理が容易になるし、データのセキュリティを強化できるんだよ。さらに、効率的なスキーマ設計のためのベストプラクティスや、スキーマ設計時の注意点についても学ぶことが重要だよ。」

かーくんは興奮して聞きました。
かーくん「それってどういうこと？」

だいちは、かーくんに実際の業務でスキーマをどのように活用したかの事例を紹介しました。
だいち「例えば、私が以前働いていた会社では、異なるプロジェクトのデータをスキーマで分けて管理していたんだ。それにより、データの整理が容易になり、プロジェクト間でのデータの混乱を防ぐことができたよ。ただ、スキーマの設計や管理には注意が必要で、間違った設計をするとデータの整合性が保てなくなることもあるからね。」

かーくん「それって大変そうだね。でも、パパがいるから安心だよ！」
だいち「てれっ」
だいち「それぞれのデータベース管理システムには、それぞれの特性や適用事例があるんだ。これらを理解することで、どのシステムを選ぶべきか、またどのようにスキーマを設計すべきかが見えてくるよ。」

かーくん「パパ、ありがとう！これからも一緒にデータベースについて教えてね！」
だいち「もちろんだよ、かーくん。これからも一緒に学んでいこうね。」
Dockerコンテナ、イメージ、ボリュームの違い

たまにDocker コンテナ、イメージ、ボリュームの違いは何なのかと聞かれてるので簡単に説明してみます。

**イメージ**：
イメージとは、コンテナを作るための模範や元となるものです。これにはアプリケーションを動かすために必要な指示や依存関係が全て詰まっています。

**コンテナ**：
コンテナは、イメージをもとに作成され、アプリケーションが動作する場所です。それぞれのコンテナは他のコンテナとは独立しており、それぞれが必要なプログラムや設定を持っています。

**ボリューム**：
ボリュームは、コンテナが作成したデータを保管する場所です。これにより、コンテナが消えてもそのデータは残ることができます。これはコンテナに接続してデータを保存するための箱のようなものです。

---

まとめると、Dockerイメージはコンテナを作るための設計図、コンテナはその設計図を元に動くアプリケーションの場所、そしてボリュームはコンテナが作ったデータを保管する場所、となります。
Selefra Release Note v0.2.2

![rebanner.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3347065/3f0bafbc-1a29-9f34-7936-c08870910dd2.jpeg)

Date: June 11, 2023

We are excited to announce the release of Selefra v0.2.2, an open-source Policy-as-Code (PaC) product. This version introduces several bug fixes and enhancements to improve your experience with Selefra.

Here are some key updates:

- Added the "--dit" option to define the result output directory.
- Addressed bug https://github.com/selefra/selefra/issues/19, where Selefra GPT returned a "mode not found" error.
- Remediation in rules now supports plain text input and is no longer enforced to be a file path.
- Adjusted output colors for improved readability.
- Where Selefra GPT functionality informed users of a syntax error.

We appreciate your feedback and contributions to the Selefra community. Your input in identifying and resolving these issues is invaluable. If you encounter any further bugs or have suggestions for future updates, please do not hesitate to reach out to us.

![Untitled (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3347065/a433251d-f371-d059-1055-b43ae8499e5d.png)

To get started with Selefra v0.2.2, please visit our official repository (Github: https://github.com/selefra/selefra) and follow the installation instructions. Remember to update your current version to benefit from the latest enhancements.

Thanks for your continued support, and we hope you find Selefra v0.2.2 to be a valuable PaC implementing tool in your projects.

Enjoy!

The Selefra Team

Github:https://github.com/selefra/selefra
アブストラクトとクラスの違い

# アブストラクトクラスとクラスの違いについて
プログラミングを学んでいく上で、クラスとアブストラクトクラスは、オブジェクト指向言語の重要な概念です。これら二つの違いを理解することで、コードの設計がより柔軟かつ効果的になります。この記事では、アブストラクトクラスと通常のクラスについて解説します。
### そもそもアブストラクトクラスって何？

アブストラクトクラスは、オブジェクト指向プログラミングにおける特別な種類のクラスです。通常のクラスと異なり、アブストラクトクラス自体はインスタンス化することができません。代わりに、他のクラスがこれを継承して使用します。アブストラクトクラスは、一般的な振る舞いを定義する「契約」のようなものと考えることができます。

アブストラクトクラスは、具体的な実装を持たないメソッドを持つことができます。これらのメソッドはアブストラクトメソッドと呼ばれ、サブクラスがこれらのメソッドに具体的な実装を提供する必要があります。

### クラスとは？

通常のクラスは、オブジェクトの設計図として使用されます。クラスは属性（変数）とメソッド（関数）を持つことができます。これにより、オブジェクトを作成し、それに関連するデータと振る舞いをカプセル化することができます。

#### 具体的な実装を持たないのはどういう意味？
下記の学校の図でわかりやすく説明していきます。
学校という大きな括りがあり、その中でどの学校にも入学と卒業があると思います。
ですが、学校祭や行事といったものは学校ごとで異なるため、アブストラクトクラスでは定義しないのが特徴です。
![IMG_0037.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125949/671b1b65-0731-4b1c-4d12-b32b64f6f1d5.jpeg)

##### typescriptのように型を定義するイメージをしていただけるとわかりやすいかと思います。

### クラスとアブストラクトクラスの違い
   * クラスは具体的なものを実装しておく
   * アブストラクトクラスは具体的な実装を持たない

なかなかアブストラクトクラスで定義しておくことは少ないとは思いますが、自分が新卒研修で気になった点をまとめたので参考にしてみてください。

### まとめ
* アブストラクトクラスは、インスタンス化することはできませんが、他のクラスに継承される基盤として使われます。
* アブストラクトクラスは、一つ以上の抽象メソッドを持つことができます。これらのメソッドは具体的な実装を持たず、サブクラスでオーバーライドする必要があります。
* 通常のクラスは、オブジェクトの具体的な実装を提供します。これには属性とメソッドが含まれます。


アブストラクトクラスと通常のクラスを適切に使用することで、コードの再利用性と拡張性が向上します。これにより、より効率的なプログラム開発が可能になります。
[oVirt] メンテナンスを行ってネットワークに接続できなくなったサーバーを復活させる。

# 初めに
我がサークル、システム工学研究会ではoVirtで構築をされており、Webサイトなどを構築しました。
その中で、サーバーを一度落としメンテナンスをして、電源を入れたときにインターネットに繋がらずに困ってしまった問題がありました。
原因としてはNICの故障なのですが、今回はその中でどのようにして原因の切り分けを行ったのかを記事にして残したいと思いました

# 詳しい内容

### Node02のネットワークが謎に繋がらない問題。

node02のネットワークが謎にしんでいました。

`ens1f1`　の部分が死んでいて、`ens1f0`が動いているのでノードに情報はアクセスできるけど、VMからのネットワーク周りの接続がうまくいってなさそう？

<img width="450" style="margin: 10px;  border-radius: 20px;"   alt="unknown.png (562.4 kB)" src="https://i.imgur.com/JHG9Ivt.png">


原因として考えたもの
- LANケーブルがしっかり刺さってない
- LANケーブルの刺さる位置が違う
- LANケーブルの故障
- 設定が違う
- アダプターの故障

この順番で考えて実際に検証を行ってみました。

#### Lanケーブルの不調かどうかの確認
写真は撮り忘れましたが、スイッチハブと本体のLANケーブルを差し直し、エアダスターで埃を飛ばしてみました。

->　意味なし

#### Lanケーブルの位置が違うかの問題
写真は撮り忘れましたが、実際に本体のLanケーブルを指す位置を変えてみました。
場所によって、LANのLED部分が光ったり、光らなかったりする部分があることが判明！！
よって、場所によってネットが繋がるかと思ったが、コンソール側ではうんともすんともしなかった。

`LEDの光り方のイメージ`
<img width="450" style="margin: 10px;  border-radius: 20px;"   alt="unknown.png (562.4 kB)" src="https://i.imgur.com/xE1aWR5.png">

`一による動作の状態`
![スクリーンショット 0007-05-17 14.20.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1209385/a0b07454-4068-4c75-89b3-ea92e4a6120b.png)


左のLanポートは光ってリンクアップはしたけど、繋がらない、
真ん中のLanポートは光らない
右のやつは、マネージャーとの連絡用のネットワークっぽい。ちゃんとつながっているっぽい

USBのLanアダプターは一旦無視してください。

->　効果なし

#### Lanケーブルが死んでいるかどうか判断
LANケーブルを自作するときの機械を用いてLANケーブルが全部通電するかどうかを確認しました。
結果としてはしっかりとつながっていて、LANケーブルには異常がないと判断しました。

<img width="450" style="margin: 10px;  border-radius: 20px;"   alt="unknown.png (562.4 kB)" src="https://i.imgur.com/WLX0lQT.gif">

->　効果なし

#### 設定が違うかどうかを判断する。
node01の設定と、node02の設定を見比べて、設定があっているかどうかを判断しました。


##### node1
![](https://i.imgur.com/87yPuJP.png)
![](https://i.imgur.com/11FoDgE.jpg)

##### node2
変更した後になっちゃいましたが、値は全く同じでした。
![](https://i.imgur.com/rupOU1O.jpg)
![](https://i.imgur.com/B7HtwlH.png)


->　設定は同じでした。

#### USBのLanアダプターをつけて、新しいLanポートをつけてみる。
`ens1f1`がずっと立ち上がらなかったので、新しくUSBのLanアダプターを追加してみました。


![スクリーンショット 0007-05-17 14.22.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1209385/15cfac32-25db-4345-805c-1194a2242116.png)


<img width="450" style="margin: 10px;  border-radius: 20px;"   alt="unknown.png (562.4 kB)" src="https://i.imgur.com/UadD1KQ.png">


<img width="450" style="margin: 10px;  border-radius: 20px;"   alt="unknown.png (562.4 kB)" src="https://i.imgur.com/2zsqd08.png">


そしたらすぐに緑になってつながりそうだったので、`ens1f1`の接続ネットワークをずらしてみたらつながりました。

->　ポートが死んでいたっぽい？


# まとめ
今回、謎にインターネットに繋がらなくなったOvirtのサーバーを修理してみました。
原因としては、NICの故障によりネットが接続できなくなったと予想しました。
一つ一つ原因を切り分けしていくことで、どこが壊れているのかを判断することができるので、諦めないで、原因を探してみてください。