OmniAICreator/Qiita-1.07M huggingface dataset:
ITパスポート勉強法｜難易度、必要な勉強時間、勉強期間

## ITパスポートとは？

### ITパスポートの概要

ITパスポートとはITに関する基礎的な知識が身についていることを証明する資格である。

これを見ているあなたが新卒入社を目指す学生なら「IT系を目指す学生が一番最初にとる基本的な資格」という認識で問題ない。

試験の概要としては以下の通り。

[ITパスポート試験内容（公式サイト）](https://www3.jitec.ipa.go.jp/JitesCbt/html/about/range.html)

試験時間120分とあるが実際は90分くらいで解き終わるので時間に余裕のある試験といえる。

### 試験の難易度

ITパスポート合格率は50％前後となっていて、比較的難易度の低い試験であることが分かる。

### 必要な勉強時間

ITパスポートに合格するのに必要な勉強時間は、理系学生やIT知識のある学生であれば、40~50時間が目安、文系学生であれば、80時間くらいを目安にすると良いだろう。

ネットでITパスポート勉強時間と検索すると100~180時間と言った情報が見つかるが、これは参考書等でシラバスを1周以上する前提で書かれている。参考書を1からやっていては当然時間がかかる。次の章で示す過去問中心の勉強法であれば参考書不要でそこまで時間をかけずに合格できる。

### 必要な勉強期間

ITパスポート合格に必要な勉強期間は、上記の勉強時間と、確保できる勉強時間から逆算して決めれば良い。目安としては、2週間~1ヶ月くらい。

1ヶ月以上を期間に設定するのはオススメしない。なぜなら、試験日が遠くなるのでモチベーションを保つのが難しいから。試験の難易度から考えても、1ヶ月以内を目安に勉強しよう。

## 具体的な勉強法

### まずは過去問を解く

まずは最新年度の過去問を解こう。この時点での自分の点数を知ることで、合格までの距離を確認できる。この段階で800点以上とれる人は明日にでも受験しよう。700~800点の人は過去問を複数回解いたら合格できるだろう。700点以下の人（多くの人はこの点数だと思う）は以下の勉強法に進んでほしい。

### ITパスポートドットコムで各単元を1週する

次にやるべきことは各単元ごとに、過去問を周回してその単元にでる用語や問題の傾向を掴むことだ。

ITパスポートドットコムでは、各単元ごとに過去問がまとめられているので、その各単元のみで30問解こう。

30問解き終わったら必ず、解けなかった問題を復習するを行なって全ての問題が解けるようになるところまでが1セット

例）情報数理を30問→アルゴリズムを30問

全ての単元を解き終わると得意な単元、苦手な単元が分かるはずだ。各単元を1週したら2週目は苦手な単元のみを解いていこう。目安としては苦手な単元が最低5割は取れる程度になったら、次のステップへ進もう。

このやり方のメリットとしては、同じ単元内で30問連続して問題を解くため、同じような問題に当たりやすく用語や傾向を掴みやすいことだ。

### 過去問演習

次はひたすら過去問を周回する。一番最初に過去問をやったときは、全然点数が取れなかったと思うが、各単元を30問ずつ解いた後では、正答率がかなり上がっていると思う。ここまできたらひたすら過去問を解いて点数を上げるだけだ。

解く際の注意点は以下の通り

本番同様に解くこと、ITパスポートドットコムには模擬試験機能があり、それで擬似受験はできるがそれで受験すると1問1問採点されるので、本番とは違った状況になる。当然だが本番は100問全て解いてから採点するため、紙に答えを書く、メモ帳に答えを書くなどをして、本番と同じような状況で解くことを意識しよう。

## 受験本番の注意

受験はテストセンターに行き、そこに設置されているPC上で受験するCBT方式で行われる。問題番号にフラグを付けることができるため、回答が不安な問題はフラグを付けて後回しにすると良い。白紙の紙とシャーペン1本が支給されるので、計算問題はそれを使って解くことになる。

問題を全て解き終わって終了ボタンを押すと、その瞬間に点数が表示される（後にメールにも届くのでメモする必要は無い）

## まとめ

ITパスポートはIT系の資格の中で一番基本レベルの資格であるため、IT企業を目指す学生が最初に取得することが多いだろう。この資格があれば、就活が余裕になるわけではないが、資格無しプログラミング経験無しという状態よりは当然採用確率は上がる。

まずは本記事を参考にITパスポートの取得を目指してほしい。
Adapterパターンを理解する[C#]

 ## Adapter Pattern
アダプターパターンについて勉強した内容を整理します。
　アダプターパターンとは互換性のないインターフェース間での通信を可能にし、既存のクラスを再利用することができるようにするといったところでしょうか。アダプターと聞くと変換器のイメージをします。

以前スマホのバッテリーを買い替えたときにそれがType-Cしか利用できなくて、それまではmicroUSB(B)で充電していたのでアダプターを買って先端につなげて使ってました。

上記のように既に使用している物を、他でも同じように使用できるようにつなぎ合わせるものとのイメージを持っています。

## 構成
chatGPTに何度か解説をお願いいしたら以下のように返ってきました。
アダプターパターンは、以下の主な要素から構成されます：

**Target**（ターゲット）: これは、クライアントが期待するインターフェースを定義します。クライアントはこのインターフェースを使用してオブジェクトとやり取りします。

**Adaptee**（アダプティ）: これは、既存のクラスやコンポーネントです。クライアントは直接Adapteeを使用することはできません。

**Adapter**（アダプタ）: これは、AdapteeのインターフェースをTargetのインターフェースに変換する役割を担います。AdapterはTargetインターフェースを実装し、その内部でAdapteeのメソッドや機能を呼び出します。

## 実装
上記と学習した内容をもとにクラス図を書き実装してみます。
- クラス図（簡易）
![2023-07-02_15h51_12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3131319/9df3ea69-eca3-ef13-cdd0-307d5943a1f0.png)
---
 - **Target**
 
        public interface ICreate
        {
            void Create();
        }
---
 - **Adaptee**
今回は、Adapteeは標準ライブラリで提供されているFileクラス、Directoryクラスを使用します。
Fileクラス、Directoryクラスがそれぞれ持っているファイル、ディレクトリの作成メソッドをAdapterクラスで呼び出し、Targetのインターフェースに変換します。
---
 - **Adapter**(例:CreateDirectoryクラス)

        public class CreateDirectory : ICreate
        {
            public void Create()
            {
                var desktopPath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
    
                var directoryPath = Path.Combine(desktopPath, "アダプターパターンフォルダ");
    
                // フォルダを作成する
                Directory.CreateDirectory(directoryPath);
            }
        }
---
 - **Main**
 
        internal class Program
        {
            static void Main(string[] args)
            {
                var createDirectory = new CreateDirectory();
                var createFile = new CreateFile();
    
                Create〇〇(createDirectory);
                Create〇〇(createFile);
            }
    
            static void Create〇〇(ICreate obj)
            {
                obj.Create();
            }
        }
---

## メリット
ではこのパターンのメリットはなんなのか。chatGPTはこのように教えてくれた。

１．既存のクラスを再利用: 既存のクラスやライブラリがある場合、アダプターパターンを使用してその機能を再利用できます。既存のコードを変更することなく、新しいインターフェースに適合させることができます。

２．互換性のないインターフェースの連携: アダプターパターンにより、互換性のないインターフェース間での通信を実現できます。既存のクラスやコンポーネントが必要なインターフェースを持っていなくても、アダプターを介して相互作用できます。

３・システムの柔軟性: アダプターパターンは、アプリケーションの柔軟性を高めます。新しいクラスやコンポーネントが追加された場合でも、アダプターを使用してそれらを既存のコードに統合できます。

今回実装例はあまり良くなかったかもしれませんが(既存がライブラリのメソッドなので)、実装してみてAdapterを使用すると、既存のコードを変更することなく別クラスで使用することができる点はメリットかなと思いました。
また、**すでにテストコードが書かれたクラス、メソッドであった場合、書き換えてしまうとそちらの修正コストもかかります**が、Adapterパターンを使用すればその心配はなくなりますね。
PythonによるDiscordボットの開発ガイド

概要
このガイドでは、Pythonを使用してDiscordボットを開発する方法について説明します。Discordボットは、Discordサーバーで自動化された機能を提供するためのプログラムです。

前提条件
このガイドを進めるにあたって、以下の前提条件を満たしていることを想定しています。

Pythonの基礎知識
Discordアカウントの作成済み
Discordサーバーの作成済み

ステップ1: 開発環境のセットアップ
Discordボットを開発するためには、開発環境のセットアップが必要です。以下の手順に従ってセットアップを行ってください。

Pythonのインストール: Python公式ウェブサイトから最新バージョンのPythonをダウンロードしてインストールします。 https://www.python.org/

Discord.pyライブラリのインストール: コマンドプロンプト（Windows）またはターミナル（Mac、Linux）を開き、以下のコマンドを実行します。
pip install discord.py

ステップ2: Discordボットの作成
Pythonを使用して、Discordボットのコードを作成します。

新しいディレクトリを作成し、その中にbot.pyというファイルを作成します。

bot.pyファイルをテキストエディタで開き、以下のコードを追加します。

```import discord
from discord.ext import commands

# Discordボットの設定
token = "ここにボットのトークンを入力"

# ボットのインスタンスを作成
bot = commands.Bot(command_prefix="!")

# ボットの準備完了時に実行されるイベント
@bot.event
async def on_ready():
    print(f"We have logged in as {bot.user}")

# ボットのメッセージ受信時に実行されるイベント
@bot.event
async def on_message(message):
    if message.author == bot.user:
        return

    if message.content.startswith("!hello"):
        await message.channel.send("Hello!")

# ボットの動作開始
bot.run(token)
```
token変数に、Discord Developer Portalで取得したボットのトークンを入力します。
ステップ3: ボットの実行
ボットを実行するために、コマンドプロンプト（Windows）またはターミナル（Mac、Linux）で以下のコマンドを実行します。

```
python bot.py
```
これで、Discordボットがオンラインになり、!helloというコマンドに応じてメッセージを返す準備が整いました。

まとめ
このガイドでは、Pythonを使用してDiscordボットを開発する方法を紹介しました。Discord.pyライブラリを使用することで、ボットにさまざまな機能を追加することができます。ボットの開発においては、イベントの処理やコマンドの作成など、さまざまな要素を学ぶ必要があります。継続的な学習と実践を通じて、自分だけのカスタムDiscordボットを作成してみてください！
AWS Fargeteって何？

本記事は、AWS JumpStart 2023レポート企画ということで、筆者が学んだ知識を共有する記事です。
本記事では、AWS Fargateとは何かについて説明して行きます。
本記事に誤りがある場合には、修正をして頂けますと幸いです。

---
ということで結論から言います。
AWS Fargateとは、EC2のコンテナが動く版です。
（端的に伝えたくて、極端な言い方をしています。詳しくは[こちらの記事](https://aws.amazon.com/jp/fargate/)をご参照ください。）

ここで２つの用語を整理します。
1. EC2とは？
1. コンテナとは？

1つ目：EC2とは？
Elastic Compute Cloudの略で、<b>compute（サーバー）</b>を提供するサービスのことです。
[詳しくはコチラから](https://qiita.com/tiger3046/items/f12f40274210c2d0bf74)

2つ目：コンテナとは？
IT用語としての、コンテナとは、ソースコード＋ソースコードを動かすために必要な情報を格納したデータのことです。
[詳しくはコチラから](https://www.topgate.co.jp/blog/techblog/15323)

ここまでの話をした段階で2つの疑問が私には聞こえてきます。
1. じゃーfargateって何なの？EC2と何が違うの？
1. ECSは何？

> じゃーfargateって何なの？EC2と何が違うの？

ご指摘の通りEC2もfargateもサーバーで動きます。しかし、コンテナイメージを動かす場合、コンテナイメージを読み取り、それをもとに環境構築する必要があります。例えば、特定のSQLのミドルウェアをインストールする、特定の言語のバージョンにアプデートする、特定のライブラリをインストールするなどです。EC2は、あくまでもネットワークを介してサーバーを貸してくれるサービスなので、コンテナイメージを読み取り上記のものをインストールしたり、アップデートする機能はありません。なので、ちまちまsudo hoge hogeと打ち込んだり必要なものをインストールするバッチを叩くなどが必要です。このような理由からfargateを使う必要があります。

> ECSは何？

ここでいうECSとは、Elastic Container Serviceのことです。これは、EC2と似ているようで全然違います。ECSは、オーケストレーション、つまりコンテナの管理を行うサービスのことです。
[詳しくはコチラから](https://qiita.com/tiger3046/items/5c82e1905cb06f0765e0)

ということでまとめです。
AWS fargateとは、コンテナイメージをサーバーに格納してシステムを動かすためのサービスのことです。簡単にいうと、コンテナイメージ用のEC2って感じですね。ECS＋Fargateで使います。
ActiveStorageで画像を扱う際のTips

## 画像を加工して表示する

`variant`メソッドを使用する。下記は横幅を512pxにする例。
縦のサイズを指定する場合は、"512x256"などのように"横x縦"で指定する

```ruby

class Post < ApplicationRecord
  has_many_attached :photos do |attachable|
    # 512にリサイズする。:resizedという名前でアクセスできる
    attachable.variant(:resized, resize: "512")
  end
  ...

  # リサイズした画像のURLを返す。
  def photo_urls
    photos.map { |photo| url_for(photo.variant(:resized).processed) }
  end
end
```

## 画像アクセスに有効期限を設ける

- application.rbに以下のように記述

```
# 1時間でアクセスが無効になる
config.active_storage.urls_expire_in = 1.hour
```

## S3にアップロードする

- storage.ymlに設定を記載

```yml
amazon:
  service: S3
  access_key_id: <%= Rails.application.credentials.dig(:aws, :access_key_id) %>
  secret_access_key: <%= Rails.application.credentials.dig(:aws, :secret_access_key) %>
  region: <%= Rails.application.credentials.dig(:aws, :region) %>
  bucket: <%= Rails.application.credentials.dig(:aws, :s3_bucket) %>
```

- production.rb(またはapplication.rb)で使用するActiveStorageのサービスを変更

```ruby
  # Store uploaded files on the local file system (see config/storage.yml for options).
  config.active_storage.service = :amazon
```

- AWSへのアクセスキー等はcredentialで設定

```
EDITOR=vi RAILS_ENV=production ./bin/rails credentials:edit
```

```yml
aws:
  access_key_id: ...
  secret_access_key: ...
  region: ap-northeast-1
  s3_bucket: images
```
Amazon ECSとは？

本記事は、AWS JumpStart 2023レポート企画ということで、筆者が学んだ知識を共有する記事です。
本記事では、AWS Fargateとは何かについて説明して行きます。
本記事に誤りがある場合には、修正をして頂けますと幸いです。

---
ということで、早速結論です。
Amazon ECSとは、簡単にいうとfargateを管理するためのサービスです。
（端的に伝えたくて、極端な言い方をしています。詳しくは[こちらの記事](https://aws.amazon.com/jp/ecs/)をご参照ください。）

Amazon fargateとは、コンテナイメージをサーバー上で動かすためのサービスです。
[詳しくはコチラから](https://qiita.com/tiger3046/items/05a65a4cf4ca465f555d)

ただ、このfargateはサーバー上で格納されたコンテナイメージが動くようになっているだけで、デプロイや管理、スケーリングなどをやってはくれません。
例えば、サービスが人気になり、サービスを増やしたい時スケールする（サーバーの数を増やす、減らす）ことが必要です。
また、サービスをインターネットからアクセスするには、デプロイが必要です。コンテナ化をする際には、[CI/CD](https://www.redhat.com/ja/topics/devops/what-is-ci-cd#:~:text=CI%2FCD%E3%81%A8%E3%81%AF%E3%80%81%E3%80%8C,%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B%E6%89%8B%E6%B3%95%E3%81%A7%E3%81%99%E3%80%82)をしたいという要件があり、コンテナ化する場合が圧倒的に多いです。この場合、デプロイが用意なのはとてもありがたいです。
セットアップ工数激減＆運用が楽に。11.4で追加されたMC認証をクライアントシークレットで実施しよう

## はじめに

いやぁ、BizRobo!の v11.4 が提供開始されましたね。おせーよ、と思っている方もいるでしょう。

これまで DAS の設定に面倒くささを感じたことありませんか？ １つ１つは大した手間ではなくても数が多いと辟易としてきます。
1. [MC] DAS接続のための ユーザを作成し、所属するプロジェクトを指定
1. [DAS] ユーザー名とパスワードを設定

あと、ユーザーアカウントとシステムアカウントがMC上に同居するのもなんか気持ち悪い。

注目の機能はいろいろとあると思いますが、マイナーなところで注目している機能について紹介したいと思います。

:::note
本投稿は BizRobo! v11.4 を前提に記載しています。
:::

## OAuth2によるDASの認証

以前 下記の記事を書きました。

https://qiita.com/ParakeetOnTheHead/items/d66764307f2a5cab45a7

システム設定の延長でつい `admin` アカウントを設定しがちな現状を踏まえ「DAS専用のユーザーアカウントを使いましょう！」という内容でしたが、一転して v11.4 では `OAuth2` に対応しました、是非使いましょう！

少し前に推していた方法をひっくり返すのもアレですが、変わりゆく状況には素早くキャッチアップして常に最良を目指していきたいものです。

### 認証方法による違い

|  | 基本認証 | OAuth2認証 |
|:-:|:-:|:-:|
| 設定画面  | ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090491/a31930dd-1d93-7b99-608d-bd0c142c6f27.png)  | ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090491/3a2940bf-fc67-c03c-c6ed-fd512e16603a.png)  |
| ユーザ情報 | 正式なユーザであることを示すためにMCにユーザを登録する必要がある | MCから発行された`クライアントシークレット` を一律設定するため不要 |
| 所属プロジェクト| 有効なユーザであることを示すためにユーザが所属するプロジェクトを設定する必要がある | 不要  |

DAS接続のための ユーザ と 所属するプロジェクトの設定を MC に対して行う必要がなく、`クライアントシークレット` を設定するだけで `正しいDAS` を認証できるため、非常にセットアップも運用も楽になります。

## 新しいDASの認証設定方法

1. MCの [管理] メニューから [OAuthサーバー] を選択し、[サービスDAS] タブより `クライアントシークレット` を取得します。

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090491/0f1cfead-300a-4eac-b201-f4a7b63818d4.png)

2. DAS を開き、[Management Console] 設定タブの [認証] を `OAuth2` に切り替え、取得した `クライアントシークレット` を入力します。

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090491/3a2940bf-fc67-c03c-c6ed-fd512e16603a.png)

3. 保存して再起動します。

## DAS認証で使われている OAuth2 フロー

Kapplets と同様の `クライアント クレデンシャルズフロー` を用いて DASの認証が行われています。

https://www.authlete.com/ja/resources/videos/oauth2-flows/

## まとめ

とはいえ DASの端末数が多い場合、バージョンアップに伴って全ての DAS を入れ替えるのは大変でしょう。
実は、MCのバージョンを 11.4 にしたからと言って、DASは 11.3 のままでも動きますし、何なら「パッケージをロック」していなければ、11.4 のパッケージを実行時にダウンロードして自動的に適用します。（v11.4で作られたロボットが実行される場合に、ですが。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090491/24263b09-3c4e-bdb8-b091-30d3ae1fc991.png)
今のところは、DASのアップデートをしなくても 11.4 のロボットを動かせるんですよね。[^1] `OAuth2` 認証は利用できませんが。

そういった意味では時間を掛けて段階的にバージョンアップしていけばいいと思います。

[^1]: 事実としては v11.3 のDASで v11.4のパッケージをダウンロードし、そのままv11.4のロボットを動かすことはできましたが、これが仕様上どこまで保証された挙動なのか、どのバージョンまで可能かなどは不明です。
（令和5年）応用情報技術者試験に合格したので勉強法を共有

# はじめに
令和5年の春季応用情報に合格したので、次回以降受験される方へ少しでも参考になるような情報を共有したいと思います。

# 経歴とか
最終学歴は高専専攻科(学士)。専攻は機械・電気であり、ソフトウェアに関する知識全般はあまり無し。
新卒から5年ほど機械メーカーで機械設計を行っていました。現在はIoT系ハード・ファームウェアのエンジニアをしています。
得意領域は組み込みとセンサーなどのハードウェア関連、苦手な領域はデータベースやごりごりのアルゴリズム。

### 基本情報の成績
午前：80％
午後：58% ←1週間ほど対策したつもりですが落ちてます。。。。
基本情報はあと2点で落ちました。午後のシミュレーションを行わず、大問の選択と時間配分を誤り、見直す時間がありませんでした。


# 教材と勉強期間

約2カ月勉強しました。

教材について
午前：過去問道場 5年分
午後：重点対策＋過去問道場 5年分

https://www.amazon.co.jp/%EF%BC%92%EF%BC%90%EF%BC%92%EF%BC%93-%E5%BF%9C%E7%94%A8%E6%83%85%E5%A0%B1%E6%8A%80%E8%A1%93%E8%80%85-%E5%8D%88%E5%BE%8C%E5%95%8F%E9%A1%8C%E3%81%AE%E9%87%8D%E7%82%B9%E5%AF%BE%E7%AD%96-%E5%B0%8F%E5%8F%A3%E9%81%94%E5%A4%AB/dp/4865752757

# 午前対策

過去問道場をひたすら繰り返すのみです。私は約5年分程度を目標に行っていました。

### ポイント
* 暗記なので2カ月かけてコツコツ行う
* 合格は6割でいいので、全問完璧にしようとは思わない(午後の方が重要！！)
* 直前の試験回は直前力試し程度で行う(直前の1~2回は出にくいと聞いた)
* アルゴリズム系は同じ問題は出にくいので、暗記に頼らない。そしてわからないところは飛ばしてもいいと思う。
* 直前は午後を中心に勉強したいため、隙間時間で復習できるように工夫を行う
* 重要キーワード集を見て、その用語と関連する語句を連想できるように対策(下記参照)

### 直前に見てた動画

https://youtu.be/6tAhx5UFz7A


過去問道場の履歴(令5は私が勉強したときは無し)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342722/d995b547-393f-ed0a-a546-c6b35e5d3cb0.png)


# 午後対策

こちらは1カ月半くらい前から午前と平行して対策を行う
### まず、概要と大問の特徴を知るべし
必ず、どのような大問が出るか、その特徴も含めて抑えておきましょう。
できれば1問程度といて自分にどれが合うか確認すべきです。

https://youtu.be/7eufIh2aJFA

## 勉強した大問

#### 優先度高(絶対解く)
* セキュリティ(必須)
* プロジェクトマネジメント
* 組み込み

#### 優先度中(実際に当日解くつもり)
* サービスマネジメント
* システム監査

#### 優先度低(予備の大問、ほぼ対策なし)
* 情報システム開発
* システムアーキテクチャ

## 午後ポイント

### 選択する大問について 
* どのような基準で選択すべきか？
    * 自分の得意な分野でいいと思います。
    * また、私は1問程度解いてみて解きやすい問題をチョイスしました。
    * 経営なども得点源だと言われますが、私は損益暗算でケアレスミスが怖かったのと午後の焦った時間で細かい計算ができないと判断しました。
    * システム監査は万人にはおすすめできません。私は前職で内部監査(よく問題文に出てくる新米担当者ｗ)に参加していたので状況把握しやすいと思いました。
* どの程度対策するか？
    * 大問すべて対策するのはやめましょう。必要数＋1程度でいいと思います。
* 対策する大問少ない場合、難化したらどうするの？
    * 安心してください。難化しているかゆっくり判断できるほど余裕はありません。
    * 下手に迷うより覚悟を決めてその問題を解いた方が時間節約になります。
 
# 当日気を付けること

午前
* 途中退出を目指しましょう。
* わからない問題は消去法で回答しましょう。
* 迷ったら○○にしておくと決めておきましょう。
* 自己採点できるようにマークしておくといいです。

昼休み
* 途中で空腹にならない or 眠くならない食事をしましょう
* 午前の答え合わせはしなくていいです(だいたい迷った問題は間違ってますので。)

午後
* さっと見てどの問題を解くか覚悟を決めましょう。
* 再確認時にすぐ状況を思い出せるように、キーワードになる文言はしっかりマークしましょう。
* 記述はできるだけ埋めること。
python で socket受信を多重化する（サンプルプログラム）

# はじめに
[以前書いた記事](https://qiita.com/naozo-se/items/c1ba06c8c442ef037a78) が、１リクエストずつしか処理できない形になっていたので、マルチスレッド化して多重化（同時処理）できるようにしたサンプルプログラム。
backlog(ドキュメント読んだ限りでは受信可能数)という引数設定があったため、勝手にやってくれるのかと勘違い…。

# 環境
- windows10 pro 
- wsl2(20.04.5 LTS (Focal Fossa))
- Dockerのバージョン
    - Docker version 20.10.18, build b40c2f6
    - docker-compose version 1.29.2, build 5becea4c
※Docker Desktop ではありません
※通信のリクエストは、Windowsからも行っています
- python 3.10.7
- コンテナのポート設定については
```
ports: 
  - 50000:50000
```
　を入れています


## コード
```python:receive.py
import socket
from concurrent.futures import ThreadPoolExecutor
import time

# 受信IP
RCV_HOST = "0.0.0.0"
# 受信ポート
RCV_PORT = 50000
# 受信可能数（指定以上超えると、待ちが発生せずに処理終了？？）
BACKLOG = 10
# 一度の通信受信できる最大データバイト数
BUFSIZE = 1024
# 最大同時処理数
MAXWORKER = 10


# 受信～返信処理
def data_comminicate(conn):
    while True:
        try:
            # 通信を受信
            rcv_msg = conn.recv(BUFSIZE)
            # 内容がないときは、処理をしない
            if not rcv_msg:
                break
            # 受信内容の確認
            print("rcv_msg:", rcv_msg)

            # 多重化しているかの確認(ここに受信データを使った処理を記載)
            print("before sleep:", rcv_msg)
            time.sleep(10)
            print("after sleep:", rcv_msg)

            # 返信処理
            conn.send(b":Received - " + rcv_msg)

        except Exception as e:
            break
        finally:
            conn.close()


if __name__ == "__main__":
    try:
        # ソケット定義
        sct = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        # 再使用設定(３つ目の引数は違う可能性あり)
        sct.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, BACKLOG)
        # 受信設定
        sct.bind((RCV_HOST, RCV_PORT))
        sct.listen(BACKLOG)

        # マルチプロセスで実行
        with ThreadPoolExecutor(MAXWORKER) as executor:
            # 継続受信のため、ループ
            while True:
                try:
                    # コネクション定義(切断処理の判定対策)
                    conn = None
                    # 受信の待機
                    (conn, addr) = sct.accept()
                    # マルチプロセスで データ受信～返信を実行
                    executor.submit(data_comminicate, conn)
                except KeyboardInterrupt as e:
                    # キーボード(ctrl+c等)で抜けたとき
                    print("KeyboardInterrupt", e)
                finally:
                    # 受信せずに終わる場合(ctrl+c等)は、処理を抜けさせる
                    if conn is None:
                        break

    except Exception as e:
        # socketオブジェクトの定義ミス
        print("socket variable error", e)
    finally:
        # socketオブジェクト終了
        sct.close()
```

# 最後に
あまり自分の意向に沿った記事が見つけられなかったため、`bing` の `AI` チャットで `concurrent.futures の ThreadPoolExecutor を使った socketの多重化サンプルプログラムが欲しい` みたいなキーワードで生成させると、かなり意向に沿った感じのサンプルを作成してくれました。
threadpoolexecutor で…とするとpythonのデフォルトパッケージではなく、threadingでやると…というような回答が来ましたので、調整は面倒ですが、なかなか面白くもあるなと思った次第です。
外部キーの考え方

DBテーブルというものを作ってみてPlantUMLでER図を書いてみて腹に落ちたときの事。

ある本(※1)での解説では社員の部署のデータを紐付けるためにある。
メインが社員で、従属するテーブルが部署のデータ。
とあったがこの発想を逆転した時に納得できた。

たとえば、作品を登録してあるリストがのマスターテーブルであり、
そこから自分の好きな作品を取り出すと考えると腹に落ちた。

外部キーとはキーとして作品のリストがある場所の扉を開けるための鍵であると発想すると外部キーの役割が素直に納得できた。

例えば、
本や、アニメ作品のマスターデータが入っているテーブルからデータを引っ張ってくる。
その時に利用するのが外部キー

自分が好きな作品を選んでノートに追加して書いていく感じで増やしていく。
その時に使用するのが外部キー



```plantuml
@startuml master_table_anime
' アニメのマスターテーブル
class Anime {
  + id [PK]
  --
  title
  genre
  director
  studio
}

' ユーザーが好きなアニメを選ぶテーブル
class UserAnime {
  + id [PK]
  --
  user_id [FK]
  anime_id [FK]
}

' 「アニメのマスターテーブル」と「ユーザーが好きなアニメを選んだリスト」のテーブルとの関係
Anime ||--o{ UserAnime : has
@enduml

```


# アニメのマスターテーブル

```
| id | title | genre | director | studio |
|----|-------|-------|----------|--------|
| 1 | Attack on Titan | Action, Dark Fantasy | Tetsurō Araki | Wit Studio |
| 2 | Legend of the Galactic Heroes | Space Opera, Military Science Fiction | Noboru
| 3 | Ashita no Joe | Sports, Drama | Osamu Dezaki | Mushi Production |
Ishiguro | Artland, Magic Bus |
| 4 | Nausicaä of the Valley of the Wind | Adventure, Fantasy, Post-Apocalyptic | Hayao Miyazaki | Topcraft |
| 5 | One Piece | Action, Adventure, Comedy | Kōnosuke Uda | Toei Animation |

```

# ユーザーの好きなアニメ

```
| id | user_id | anime_id |
|----|---------|----------|
| 1 | 1 | 1 |
| 2 | 1 | 2 |
| 3 | 2 | 3 |
| 4 | 2 | 4 |
| 5 | 2 | 5 |

```


# 参考

※1 達人に学ぶDB設計 徹底指南書
CAFA 5 Protein Function Prediction EDAのつもり(2023/07/02)


# はじめに
<!-- 発端や概要を記載 -->
[6/30のメモ](https://qiita.com/taichan003/items/e2ab1d4c70ff715faf05) の続きです。
以下のkaggle コンペについての覚書です。

https://www.kaggle.com/competitions/cafa-5-protein-function-prediction


# 目次
<!-- タイトルとアンカー名を編集 -->
1. [FASTA データのお掃除](#Chapter1)
1. [GO termの出現頻度](#Chapter2)
1. [お掃除後の確認](#Chapter3)
1. [やりたいこと](#Chapter4)


<!-- 各チャプター -->
<a id="#Chapter1"></a>
# FASTA データのお掃除

https://www.kaggle.com/code/thedrcat/cafa-5-protein-function-prediction-eda
https://www.kaggle.com/code/leonidkulyk/eda-cafa5-pfp-interactive-dags-plotly

上のノートによると、訓練データのうち最大配列長 35375、最小 3。
テストデータも似たようなものだった。
長い配列は切ったほうがいい気がするけど、切る位置はよくわからない。99% quantile は2718.55 だったから、これくらい？
<img width="500" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3470253/10ff1f17-fe7a-a1b7-9a43-19341fa70f5b.png">

アミノ酸の配列のうち、登場頻度が少ないものが存在する。
左が全体の登場頻度、右がタンパク質ごとの登場頻度。
Z, B, X, O, U が登場するのを切り捨てる。
<img width="400" alt="Counter1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3470253/3a4493d8-04eb-1be9-bdca-20aa9b5cb0e4.png"><img width="400" alt="Counter2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3470253/ae4bc9c4-829a-ecc1-7405-23b7210f713b.png">

長さが 3000 未満、Z, B, X, O, U を含まないデータに制限すると、教師データは 142246 件 &rarr; 139430 件になる。
これらが本当に外れ値かもわからないけどこのくらいならまあ消してもいいんじゃないかな。

<a id="#Chapter2"></a>
# GO term の出現頻度
訓練データに登場する GO_term は全部で 31466 種類。
ただ、このうち半分以上は 10 回以下しか登場せず、これらを予測するのは難しいだろう(タンパク質は 142246 種類与えられている)。

予測する GO term を「出現頻度が 10% 以上のもの」に制限すると 54 種類が対象となって、逆に少なすぎる。
GO term の間では上下関係が一意に決まっているので(例：molecular function＞binding＞protein binding＞receptor binding)、親の GO term 出現確率予測 $\times$ (親の term をもつという条件の下での)子の出現確率予測としたい。掛け算したら確率が必要以上に小さくなる気がしてるけど、あとで正規化で何とかできたらいいね。しらんけど。
「(親の term をもつという条件の下での)子の出現頻度が 10% 以上のもの」に制限すれば 1454 種類を対象にできる。


<a id="#Chapter3"></a>
# お掃除後の確認
取り除いたアミノ酸のうち、Z, B, O, U は無視できる(4 件とかしかない)。X を含むものは1572件あるからこれは確認したほうがいい。
X を含むタンパク質と、Z, B, X, O, U をどれも含まないタンパク質の GO term の発現割合を比較する。
下図で GO term ごとの発現割合を並べた。橙線が X を含むもののうちの発現割合で、青線がその他の発現割合。その他のグループで並び替えた。
<img width="500" alt="Counter1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3470253/f3a8a369-e5c4-ec36-35cf-0bd28d70c766.png">

ものによっては橙線のほうが発現割合が高かったりするけど、X を含むならこの GO term は必ずもつ！！とか言えるほどの差異ではない。
ほかにも、アミノ酸配列の長さごとに発現割合を比べてみたけど、これも同様にあんまり差がなかった。
・・・じゃあ教師データのお掃除意味なかったかも？(´・ω・｀)


<a id="#Chapter4"></a>
# やりたいこと
* ハイパラチューニングができる気がしない。AutoMLもよくわかんない。
* kaggle 内の discussion を読む。英語だけどがんばる。
AmazonEC2とは？

本記事は、AWS JumpStart 2023レポート企画ということで、筆者が学んだ知識を共有する記事です。
本記事では、AWS Fargateとは何かについて説明して行きます。
本記事に誤りがある場合には、修正をして頂けますと幸いです。

---
このEC2とは、Elastic Compute Cloudの略です。
Elasticとは、可用性のあるという意味です。つまり、可用性のあるクラウドコンピュートサービス、サーバー（コンピューター）をネットワークを介して提供してくれるサービスという意味です。ここでいう可用性とは、柔軟にコンピューターを増やしたり減らしたりしてくれるという意味です。
AWSには、Auto Scalingというサービスがあります。このサービスは、サービスが拡大した時には、サーバーの台数を増やし、サービスが縮小した時にはサーバーの台数を減らしてくれるものです。これにより、自社でサーバーを管理するよりも遥かに手軽にサーバーを増やしたり、減らしたりできます。これが、Elastic（可用性）ということです。
MetalLBでハマった話

# 起きたこと
**一言で言えばk8sクラスタを再起動したらMetalLBが起動しなくなった！** です。
1. kubernetesで動かしているコンテナイメージをアップデートしようとしても動かない。
2. namespaceごと削除しようとしてもフリーズする。
3. どうやらk8sクラスタ全体で変更的なことができなくなっていそう。
4. k8sクラスタを再起動してみる。（今思えばI/O負荷などでファイルシステムがRead-Onlyになっていたかも）
5. kubectlコマンドで操作する感じ、動作しだしているように見える。
6. と思ったら、MetalLBのcontrollerとspeakerが`ImagePullBackOff`で動いていない！（当然サービス停止）

# やったこと
## イメージファイルの確認
とりあえずkubectlで色々情報見てみるが特に新たな発見無し。
`ImagePullBackOff`ってことはイメージが存在していないのかも？と思って調べる。

現在のバージョン
kubernetes v1.17 / MetalLB v0.9.5

最新のMetalLBは v0.13.10

だいぶ古いんだね～、、ということで[最新のマニフェストファイル](https://raw.githubusercontent.com/metallb/metallb/v0.13.10/config/manifests/metallb-native.yaml)のイメージを確認したらパスが違うことが発覚。
V0.13.10のマニフェスト：**quay.io**/metallb/controller:v0.13.10
V0.9.5のマニフェスト：**metallb**/controller:v0.9.5

DockerHub見てみたら、たしかにmetallbが見当たらない！？
`imagePullPolicy`は`Always`だし、今の状態については納得。

## 代替策の模索
んじゃ有る物使おうということで、一旦MetalLBを削除して、v0.13.10のマニフェストからインストール。
動かない。。k8sが古すぎて対応していなっぽい？

では現状と同じバージョンどこかに無いのかな？と探してみたらbitnamiのものを発見！
さすが～と思いながらそちらで現状と同じv0.9.5をインストール。
動き出して各PodのEXTERNAL-IPにもセットされたのでいけた～と思ったが、動作確認したらアクセスできず・・
ログを見るとNICに対してのPermissionエラーが出ている。Bitnamiセキュリティ対策厳し目な影響が何かあるのか？

Bitnamiのイメージを使うための手順を調べる前に、現行のquay.ioにv0.9系のイメージがないものかと、マニフェストファイルのURLを変更しながら調べてみる。
[metallb v0.9.6](https://raw.githubusercontent.com/metallb/metallb/v0.9.6/manifests/metallb.yaml)　→　image: **metallb**/controller:v0.9.6
[metallb v0.9.7](https://raw.githubusercontent.com/metallb/metallb/v0.9.7/manifests/metallb.yaml)　→　image: **metallb**/controller:v0.9.6　※なぜか0.9.6
[metallb v0.9.8](https://raw.githubusercontent.com/metallb/metallb/v0.9.8/manifests/metallb.yaml)　→　image: **quay.io**/metallb/controller:v0.9.8　※**リポジトリが変わった！！**
metallb v0.9.9はNot Found

## そして復旧へ
ということで、発見したv0.9.8のマニフェストを使って再インストール。
以前と同じ手順で設定をして問題なく復旧できました～


# まとめ
他のk8sクラスタは新しいバージョンで動いているのですが、今回のシステムは放置状態でした💦
サポートとセキュリティを意識して定期的にバージョンを追従していかないといけませんね。

---

後で発見しましたが、以下で議論されていました。
https://github.com/metallb/metallb/issues/696
Railsチュートリアル２章まとめ

# 前提
Railsチュートリアル２章の学習を行ったので
簡単に学んだことをまとめます！

# 目次
[章の目的](#章の目的)
[UsersモデルとMicropostモデル](#UsersモデルとMicropostモデル)
[Usersリソースの追加](#Usersリソースの追加)
[クラスの継承](#クラスの継承)
[感想](#感想)

# 章の目的
toy_appアプリケーションを作成する。
ユーザーと短いマイクロポスト（Twitterにおけるツイート）を扱う練習となる

# UsersモデルとMicropostモデル
○Usersモデル
Usersはデータベースのテーブル（table）に相当し、
id、name、 email の属性はそれぞれテーブルのカラム（column: 列）に相当します。

Users
| 名前 | 型 |
|:-:|:-:|
|  Id | integer  |
| name  | string  |
| email  |  string |


○Micropostモデル
user_idという属性を使って、1人のユーザーに複数のマイクロポストが関連付けられています。

| 名前 | 型 |
|:-:|:-:|
| id  |  integer |
| content  | string  |
| user_id  | integer  |


MicropostとUsersはidとuser_idで関連付けられており、
そのためユーザーは複数のMicropostを持っています

# Usersリソースの追加
```
rails generate scaffold User name:string email:string
```
Userリソースを追加することでユーザー管理用のページが多数Railsに追加されます。
このコマンドだけでページまで作られるのはすごい便利だと感じました！


# Userページの動き
①ブラウザから「/users」というURLのリクエストをRailsサーバーに送信する。
↓
②「/users」リクエストは、Railsのルーティング機構（ルーター）によってUsersコントローラ内のindexアクションに割り当てられる。

○該当箇所
config/routes.rbファイルのルートで
Usersコントローラ内のindexアクションに割り当てている。

```
Rails.application.routes.draw do
  resources :users
  root 'users#index'
end
```

↓
③indexアクションが実行され、そこからUserモデルに、「すべてのユーザーを取り出せ」（User.all）と問い合わせる。
④Userモデルは問い合わせを受け、すべてのユーザーをデータベースから取り出す。
⑤データベースから取り出したユーザーの一覧をUserモデルからコントローラに返す。
⑥Usersコントローラは、ユーザーの一覧を@users変数（@はRubyのインスタンス変数を表す）に保存し、indexビューに渡す。

○該当箇所

app/controllers/users_controller.rbファイルのindexアクションの
User.allで問い合わせている（③）
User.allの結果（④）を@usersに保存する（⑤、⑥）
```
class UsersController < ApplicationController
  .
  .
  def index
    @users = User.all
  end
  .
  .
end
```
↓
⑦indexビューが起動し、ERB（Embedded RuBy: ビューのHTMLに埋め込まれているRubyコード）を実行して HTMLを生成（レンダリング）する。
app/views/users/index.html.erbファイルの
<% @users.each do |user| %>でユーザーの数分表示する
```
<p style="color: green"><%= notice %></p>

<h1>Users</h1>

<div id="users">
  <% @users.each do |user| %>
    <%= render user %>
    <p>
      <%= link_to "Show this user", user %>
    </p>
  <% end %>
</div>

<%= link_to "New user", new_user_path %>
```
↓
⑧コントローラは、ビューで生成されたHTMLを受け取り、ブラウザに返す。

# クラスの継承
UserモデルとMicropostモデルはいずれも、ApplicationRecordというクラスを継承しています。
ApplicationRecordクラスは、
Active Recordが提供する基本クラス ActiveRecord::Base を継承しているので、
ApplicationRecordを継承して作成したモデルオブジェクトはデータベースにアクセスできるようになり、データベースのカラムをあたかもRubyの属性のように扱えるようになります。

# 感想
第二章の学習ではデータ取得から画面表示までの流れを学ぶことができました。
usersとmicropostそれぞれの結びつきを理解するのに最初は苦労しましたが
まとめているうちに動きが理解できました。
この調子で３章も進めていきたいです
AtCoder ABC 308: C - Standings を解く書き方8+1個(PythonとC++) ソート比較演算子あれこれ

# Pypy3: Classを作って解く
classに__lt__を作ります。
```Python
class frac:
    def __init__(self, a, b, ind):
        self.a, self.b, self.ind = a, b, ind
    def __lt__(self, other): #<
        if(self.a * other.b > other.a * self.b): return True
        if(self.a * other.b < other.a * self.b): return False
        return self.ind <= other.ind
import sys
read = sys.stdin.read
n = int(input())
dat, ans = [], []
for i in range(n):
    a, b = map(int, input().split())
    dat.append( frac(a, b, i+1))
dat.sort()
for x in dat: ans.append(x.ind)
print(*ans)
```

# Python: Decimalで解く(Pypy3はTLE)

[decimal --- 十進固定及び浮動小数点数の算術演算](https://docs.python.org/ja/3/library/decimal.html)は小数をfloatより正確に扱えます。
ただし、遅いことと、Pypyでは極端に遅くなることに注意します。

[同じコードでPypy3でTLEする例](https://atcoder.jp/contests/abc308/submissions/43173970)

```Python
import decimal
n = int(input())
dat,ans = [], []
for i in range(n):
    a, b = map(decimal.Decimal, input().split())
    dat.append( (-a / (a+b), i+1) )
dat.sort()
print(*[dat[i][1] for i in range(n)])
```

https://atcoder.jp/contests/abc308/submissions/43158373

# Pypy3: Fractionで解く(input高速化, sort手抜き)
Fractionで解きます。ただし、私の場合は以下の高速化をしないとTLEしてしまいました。
- 入力をsys.readによる高速一括読み込み
- sortで[0](pの値)だけを評価対象にする。もともとのデータがlistでindexはsortedなので[0]だけ評価すれば[1]もsortedになっている
後者は不本意なのですがいろいろ試してもsortを[0]だけにしないと通りませんでした。

https://atcoder.jp/contests/abc308/submissions/43174319

# C++: 実はlong doubleで良い
```c++
    vector<pair<long double, int>> d;
    REP(i, n){
        long double a, b; cin >> a >> b;
        d.push_back({-a/(a+b), i+1});
    }
    sort(d.begin(), d.end());
```

https://atcoder.jp/contests/abc308/submissions/43175340

# C++: structを定義し、struct内でoperatorを定義
```c++
struct frac{
    long long a, b, i;
    inline bool operator<(const frac &r){
        if( (a * r.b - b * r.a) < 0) return false;
        if( (a * r.b - b * r.a) > 0) return true;
        return i < r.i;
    }
};
```
https://atcoder.jp/contests/abc308/submissions/43175127

# C++: structを定義し、外でoperatorを定義

```c++
struct frac{ long long a, b, i; };
bool operator<(const frac &l, const frac &r){
    if( (l.a * r.b - l.b * r.a) < 0) return false;
    if( (l.a * r.b - l.b * r.a) > 0) return true;
    return l.i < r.i;
}
```

https://atcoder.jp/contests/abc308/submissions/43175064

# C++: structを定義し、sortにユーザ定義ソート関数を渡す
```c++
    struct frac{ long long a, b, i; };
    auto cmp = [](const frac &l, const frac &r){
        if( (l.a * r.b - l.b * r.a) < 0) return false;
        if( (l.a * r.b - l.b * r.a) > 0) return true;
        return l.i < r.i;
    };
    sort(d.begin(), d.end(), cmp);
```

https://atcoder.jp/contests/abc308/submissions/43175229

# C++: structを定義し、sortにラムダ式を直接書く
```c++
    struct frac{ long long a, b, i; };
    sort(d.begin(), d.end(), [](const frac &l, const frac &r){
        if( (l.a * r.b - l.b * r.a) < 0) return false;
        if( (l.a * r.b - l.b * r.a) > 0) return true;
        return l.i < r.i; });
```

https://atcoder.jp/contests/abc308/submissions/43175272


# 供養: C++: __int128でstructを作って解く
問題を勘違いしlong longに収まらない演算だと思ったので__int128で扱うことにしました。供養のために置いておきます。

https://atcoder.jp/contests/abc308/submissions/43118232
EC2 Instance Connect Endpoint とは何者か

先日リリースされたEC2 Instance Connect Endpoint（EICエンドポイント）は、パブリックIPアドレスを使わずにプライベートサブネット内の EC2インスタンスにSSHおよびRDP接続できる機能です。

## 結論
- EIC はお手軽に SSM と同じ様なプライベートサブネット内の EC2 インスタンスに SSH/RDP ができる機能
- ただし、可用性は SSM に劣るため、コスト重視の場合に利用することを推奨

## Sessiom Manager との違い
Session Manager でプライベートサブネット内のインスタンスに接続を行う場合、以下の様な対応が必要になります

- EC2 インスタンス用のIAMロールを作成し、EC2 インスタンスにアタッチする
- 以下のVPCエンドポイントを作成
    - ec2messages.region.amazonaws.com
    - ssm.region.amazonaws.com
    - ssmmessages.region.amazonaws.com

一方で EIC の場合は、EIC エンドポイントを作成するだけで接続が可能です。

## 参考
https://dev.classmethod.jp/articles/update-ec2-instance-connect-endpoint/
https://dev.classmethod.jp/articles/compare-eic-endpoint-and-session-manager/
Karabiner-Elementsに私の設定を一瞬でインポートする方法

まず結論を。ブラウザで URL スキームを実行するだけです。


## 設定をインポートできる URL スキーム

すでに Karabiner-Elements をインストールしている場合は、以下の URL スキームをコピーし、ブラウザのアドレスバーに貼り付けて実行することで、私と同じ設定をインポートできます。

`karabiner://karabiner/assets/complex_modifications/import?url=https://gist.githubusercontent.com/MANABU0SEC/41de1f884062451a2362f5f589ce5ab1/raw/c539c0f4fa282a3b69eee850d7e69a7fcfdec8be/karabiner_user_share.json`

:::note warn
特殊なキーボードやマウスは、Karabiner-Elements をインストールすることで（特定の設定なしでは）認識しなくなる恐れがあります。
また、ここに書かれた内容および設定によって生じた不具合や損害について、私は一切の責任を負いかねますことをご了承ください。
:::

　
有効化する場合は、Import した後に Enable してください（有効化される設定の内容については後述）。
![Image Imports.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3065008/56ca80f0-3713-88f9-bba6-c05000853194.png)


また、Fn キーを押した際の設定は「何もしない」にしていただくと、OS の他の機能と衝突しません。
（ 左 ｢最新の OS の場合｣、右 ｢以前の OS の場合｣ ）
![Image Settings.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3065008/25de0509-b01c-f7c9-abfe-020d99bc9cff.png)


以下は補足です。


## 実際に有効化される設定 （キーマップ）

上記の URL スキームを実行して有効化される設定（キーマップ）は以下のようになっています（黒文字のキーは他のアプリも必要）。
![Image Keymaps.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3065008/7b5af8a0-4ee5-16cd-59f7-380464c355e6.png)
この内容は、2023年7月7日に開催された「[macOS環境の効率化について話し合う会 #4](https://dtptransit.doorkeeper.jp/events/157958)」というイベントにてお話しました。

この設定について詳しく知りたい場合は、以下の Note 記事をご参照ください。

https://note.com/dtp_tranist/n/n3fb66c2fa8a4

　
また、**Karabiner-Elements のインストール方法** については、以下の記事が詳しいです。

- macOS Ventura の場合
  https://www.monoist.work/entry/karabiner-elements-at-ventura

- macOS Monterey 以前の場合
  https://www.monoist.work/entry/karabiner-elements-at-monterey


## JSON テンプレート

設定の中身は、以下のようなコードの組み合わせになっています。そのファイルを、
`~/.config/karabiner/assets/complex_modifications`
というフォルダに配置すると、Karabiner-Elements の設定アプリで有効化できるようになります。

``` json:Complex Modifications
{ "title": "！ここに設定のタイトルを書く！", "rules": [

    { "description": "ここに書いた説明が Karabiner-Elements アプリ内に表示される", "manipulators": [

        { "description": "例: Fn+N → Enter（こちらはアプリ内に表示されない）",
            "from": { "key_code": "n", "modifiers": { "mandatory": [ "fn" ], "optional": [ "any" ] } }, "type": "basic",
            "to": [ { "key_code": "return_or_enter" } ]
        },

        { "description": "例: 英数 → Fn（こちらはアプリ内に表示されない）",
            "from": { "key_code": "lang2", "modifiers": { "optional": [ "any" ] } }, "type": "basic",
                "to_if_alone": [ { "key_code": "lang2" } ],
            "to": [ { "key_code": "fn", "lazy": true } ]
        }

    ] }

] }
```


## JSON 本文

以下の URL にある JSON ファイルが私の Karabiner-Elements の設定です。
[https://gist.github.com/MANABU0SEC/41de1f884062451a2362f5f589ce5ab1](https://gist.github.com/MANABU0SEC/41de1f884062451a2362f5f589ce5ab1)

該当の Gist にある JSON 本文も埋め込んでおきます。

https://gist.github.com/MANABU0SEC/41de1f884062451a2362f5f589ce5ab1
GKE運用上の注意点・誤解しがちなこと

# はじめに
GKEについてなんとなくで理解していたことがいくつかあり、改めて調べると結構誤解していたので、備忘録的に書き留めていきたいと思います。

# バージョン体系
GKE各バージョンのリリース日、各チャネルの自動アップグレード日、サポート終了日は下記。
https://cloud.google.com/kubernetes-engine/docs/release-schedule?hl=ja

自動バージョンアップのターゲット（リリースノート）は下記。利用可能になったバージョン情報を確認できる。
https://cloud.google.com/kubernetes-engine/docs/release-notes


GKEのバージョンは`x.y.z-gke.N`で表される。

- x: メジャーバージョン
  - 下位互換性のない変更が公開APIに導入された時に上がる。
- y: マイナーバージョン
  - 年3回リリースされる。
  - 過去のマイナーバージョンで利用されていたAPIが非推奨になったり、廃止になったりする。
- z: **Kubernetes**のパッチバージョン
  - 毎週リリースされ、各ゾーンに段階的に適用される。（=各ゾーン内のクラスタが自動アップデートされる）
- N: **GKE**のパッチバージョン
  - （オープンソースのK8s側ではなく）GKE側 のセキュリティやバグ対応のためのアップデート。

**実はパッチバージョンが2種類ある**ので、知っておくとリリースノートが見やすいと思います。

cf: https://cloud.google.com/kubernetes-engine/versioning?hl=ja#versioning_scheme


# リリースチャネルと自動アップデートの関係

**`コントロールプレーン`は、リリースチャネルに登録されているかどうかに関わらず、Google側で自動アップデートされる。これを無効にすることはできない。**

リリースチャネルに登録すると、コントロールプレーンの自動アップデートに追随して、`ノード`も自動アップデートをしてくれる。
リリースチャネルに登録していないクラスタにおいても、Googleのサポート終了したノードを使用している場合は、セキュリティと互換性を維持する目的で、`ノード`が自動アップデートされる。

> クラスタがリリース チャンネルに登録されているかどうかにかかわらず、GKE チームが定期的にクラスタ コントロール プレーンの自動アップグレードを行います。

cf: https://cloud.google.com/kubernetes-engine/upgrades?hl=ja&_ga=2.85136217.-1177760745.1688204946#automatic_cp_upgrades


# アップデート時に注意すること

- コントロールプレーン
そのクラスタ上のワークロードの可用性には影響しない。
ただし、コントロールプレーンのアップデート中はクラスタの設定変更やkubectlコマンドを受け付けなくなるため、エンジニアの作業に支障が出る可能性がある営業時間中などは避けた方が無難。

- ノード
ノードプール中のノードが順番に停止→新規ノードが起動する。
サージアップグレード・Blue/Greenアップグレードいずれを選択しても可用性が大きく低下する可能性は低いが、Podの再起動は必ず発生するため、サービスに対するユーザアクティビティが少ない時間帯にアップデートするべき。



# メンテナンスの時間枠と脆弱性

メンテナンス時間枠と除外時間枠を設定すると、基本的にはそれを守って自動アップデートする。
ただし、重大な脆弱性が発見された場合は、それを無視してアップデートされる可能性がある。

> GKE は、重大なセキュリティ脆弱性に対するメンテナンス ポリシーをオーバーライドする権限を有します。

cf: https://cloud.google.com/kubernetes-engine/docs/concepts/maintenance-windows-and-exclusions?hl=ja#caveats


脆弱性の分類について、`重大`は下記のように定義されている。
> 認証されていないリモートの攻撃者によってすべてのクラスタで簡単に悪用され、システム全体のセキュリティが侵害されることにつながる脆弱性。

cf: https://cloud.google.com/kubernetes-engine/docs/resources/security-patching?hl=ja#how_vulnerabilities_are_classified

[Security bulletins](https://cloud.google.com/anthos/clusters/docs/security-bulletins)にて、脆弱性の情報が発表されている。
※ 日本語表示もできるが、英語版に比べて反映が遅れることがあるので英語版を確認するのが良いと思います。
Linux環境にDockerを導入する



導入対象環境
Mint20

基本は公式の手順に則り実施
https://docs.docker.com/engine/install/ubuntu/


### aptパッケージのインデックス更新
```
$ sudo apt-get update
```

### パッケージをインストール
```
$ sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common
```

### Docker公式GPGキーを追加
```
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
```

### リポジトリを設定
```
$ sudo add-apt-repository \
 "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable"
```
※注意書きにあるように、コマンドを一部変更する必要あり？

### aptパッケージのインデックスを更新する。
```
$ sudo apt-get update
```

### Dockerをインストールする。
```
$ sudo apt-get install docker-ce docker-ce-cli containerd.io
```

### インストールを確認
```
$ sudo docker -v
```
※バージョン確認

### 現在のユーザーをdockerグループに所属
```
sudo gpasswd -a $USER docker
```

### 




参考
https://www.gesource.jp/weblog/?p=8493

https://qiita.com/yoshiyasu1111/items/f2cab116d68ed1a0ce13
querySelector()とは？

# Document: querySelector() メソッド
Document の ```querySelector()```メソッドは、指定されたセレクターまたはセレクター群に一致する、文書内の最初の Element を返します。一致するものが見つからない場合は null を返します。

# セレクタとは？
### あるクラスに一致する最初の要素を探索する
次の例は、クラス "myclass" を持つ文書内の要素の内、最初のものを返します。

```js
const el = document.querySelector(".myclass");
```
### 複雑なセレクター
セレクターは、次の例で示しているように、実に力強いものになり得ます。ここでは、文書内で ```<input>``` に ```"login"``` という名前の付いた最初のもの (```<input name="login"/>```) のうち、 ```<div>```でクラスが "```user-panel main```" (```<div class="user-panel main">```) の中にあるものが返されます。

```js
const el = document.querySelector("div.user-panel.main input[name='login']");
```
### 否定
すべての CSS セレクター文字列が妥当な場合、セレクターを否定することもできます。

```js
const el = document.querySelector(
  "div.user-panel:not(.main) input[name='login']"
);
```
これで、 ```input```要素のうち親に```user-panel```クラスのついた```div```があるものの、```main```クラスがないものを 1 つ選択します。

# 出典
https://developer.mozilla.org/ja/docs/Web/API/Document/querySelector
AWS Cloud Questの全ロールを完了したメモ

AWS Skill Builderで有料サブスクリプションの無料トライアルが行われていたのでその間にCloud Questの6ロールを制覇してみました。ロールは画像の通り。
情報が少ないのでちょっとしたコメントを残します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242735/fb370ef2-47ee-a160-725d-1322d6f6a027.png)

# 分かったこと
- 英語は非常に平易で、最悪説明を読まずともコンソール画像上の指示だけでなんとかなる(と、思います　私は読めるのであくまで参考程度に....)
- Pythonが多いが言語自体に詳しい必要はなく、コメントにヒントがある
- Lab環境はもちろん無料で、クリア後も再プレイ可能
- Lab環境のプロビジョニングには時間がかかる(数秒～10分弱とばらばら)
- Data analyticsの中でもEMRに関するものなどはlab内での待ち時間が長い....(Cloud Questのせいではないですが)

- **2023年6月時点で全て達成できるようにはなっている**
  - 何かエラーが起きたときは、こちら側の細かなミスに起因すると考えて良い。
  - **しかし、一つだけ進行不可能に陥るもの(Data analyticsのstreaming ingestion)があった
    それでもDIYセクションは達成できるのでクリアには問題なし**
- 若干レイアウトが異なる部分もあるが支障ないレベル
- 先にDIYセクションの内容を見るのがよい　値を変えて繰り返すだけのものは、初めからDIYセクション通りの値で進めるのもありだと思う(機械学習など時間のかかるものは特に)


また、1つだけ回答に詰まったものがあるので解法を共有します。
Data analyticsのFederated QueriesのDIYで、CTASコマンドを使うものがありますが、"newtable"フォルダ　ではなく、"newtable"フォルダ内のものをexternal_locationとしているか見ているようで、例えば
```
CREATE TABLE AwsDataCatalog.glue_ticket_db.diy
  WITH (external_location='s3://path-to-your-data-lake-bucket/newtable/????') AS
SELECT *
FROM "athena-federated-dynamodb"."default"."dynamodbtickettable"
```
のようにして、フォルダ内に????フォルダが作成され、その中に目的のファイルがある....といった構成であればクリア認定されました
この場合、glue_ticket_dbとdiyがDIYセクションでの入力です。
これに関しては問題文が少しトリッキーなのか、意図しない挙動なのかは微妙なところです

# 終わりに
同じようなことをクラウド以外でやろうとすると比較にならないくらい時間がかかるのはもちろん承知の上で、すこしプロビジョニングに掛かる時間が長いなぁという印象です。ゲーミフィケーションを取り入れているのはいいのですが、その待ち時間に関しては相性が悪いでしょう。

Cloud Practitionerのクエスト12個は無料でできるので気になる方はどうぞ
https://explore.skillbuilder.aws/learn
Flaskの非同期処理（その２） Pythonのasync, awaitを使う

### 本記事の背景
いままで、マルチスレッドのProcessのやり方でFlaskで非同期を実現したが、本記事は、Pythonのasync, awaitを使ったやり方で実現する

### Pythonでのawait, asyncとは
下記の記事が非常にわかりやすく解説しています。
https://qiita.com/maueki/items/8f1e190681682ea11c98

筆者が作成したコードの構成が同期処理としてとらえています。
つまり、下記の処理は順番に行われているからです。
ダウンロードボタンを押下→ダウンロード処理→ダウンロード完了

### Flask内で存在しているタスクについて
1. ダウンロード処理タスク
1. ダウンロード処理中のページの表示
1. ダウンロード処理が完了したページの表示
筆者は上記の3つの処理をタスクとして捉えているが、
ダウンロード処理は関数として定義できていることに対して、
ページの表示に関しては、下記のような実装されているため、実際にタスクとして定義する関数になりえないと考えています。
```python
# 
def foo():
    return render_template('finish.html')
def bar():
    return render_template('downloading.html')
```

### 実装コード
上記の理由により、筆者は、ダウンロードボタン押下後にダウンロード終了するまでは、ページの遷移を行わず、ダウンロード完了後にページが遷移するという実装にしました。
```python
async def download_mp3(url, file_name):
	ins = networkmusic(url, file_name)
	ins.download()

@app.route('/download', methods=['POST'])
def async_download():
	form = DownloadForm()
	if request.method =="POST":
		url = request.form.get("url")
		tp = request.form.get("tp")
		file_name = request.form.get('file_name')
		if tp == 'mp3' and len(url) > 1:
			# 新規のイベントループを作成する
			loop = asyncio.new_event_loop()
			
			# 同期の場合(1)
			loop.run_until_complete(download_mp3(url,file_name))

			# 同期の場合(2)
			# task_1 = loop.create_task(download_mp3(url,file_name))
			# loop.run_until_complete(asyncio.gather(task_1))
			return render_template('finish.html')
```

### ダウンロード完了

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576081/fae724a8-8337-ef5b-7b87-1674e7dc4753.png)

### 参考文献

https://qiita.com/yasuo-ozu/items/acf341297e05f2b1adc4
非公開のネットワークにQuest2が接続できない時の解決策

Quest2に非公開のネットワーク（SSIDステルス）を追加しても、なぜか接続できなかったのでその際の個人的な解決策です。

**結論、MetaQuestのモバイルアプリでネットワークの追加を行いましょう。**

# 手順
:::note warn
注意
MetaQuestのモバイルアプリでWi-Fiネットワークを追加する際に、そのWi-Fiが既にQuest2のWi-Fi設定画面の保存済みネットワークに含まれている場合、そのWi-Fiを保存済みネットワークから削除しておきましょう。
:::

- スマホのMetaQuestアプリを開いて、Wi-FiとBluetoothをONにしてQuest2と接続済みにする。
<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2700137/311f0c0e-291e-9efc-fccc-a114704e92df.png">

<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2700137/7eb4ece2-1096-ce0b-e046-7190a9b046ab.png">

<img width="50%" src="">

- Menu画面でデバイスを選択。
<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2700137/8893031b-d580-4e7b-e70e-f4a0431684c2.png">

- デバイス画面でwifiを選択。
<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2700137/a3bcdfed-8430-2005-6407-99ccf72d43b3.png">

- `Wi-Fiネットワークを追加`で非公開ネットワークのSSIDを指定して追加し、接続が完了すると、Quest2が非公開のネットワークに接続できているはずです。
<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2700137/a7083ef7-61d9-eacd-5fa9-964d0358a701.png">

Quest2に非公開のネットワークが接続できたら、Quest2のwifi設定で今後そのwifiに自動で接続するようにしておくと非常に便利です。

# まとめ
Quest2が上手くネットワークに繋がらない際は、MetaQuestのモバイルアプリで接続するのがいいと思います。
要件定義で行う事

# 導入
こんにちは、るっちです。
今回は要件定義で行う事に関して、備忘録として残そうと思います。

# 要件定義
### 要件定義の暗黙的な大目的
要件定義の目的は「開発工数を見積もる」ことです。
つまり、要件定義は「『開発工数を見積もる』ために、システムのステークホルダーに対して、システムが必要とする機能や特性を明確に定義する」ことが目的です。
開発工数を見積もれるレベルまで要件を定義できれば要件定義は終了!!!

参考:[初めての設計をやり抜くための本](https://www.amazon.co.jp/%E3%81%AF%E3%81%98%E3%82%81%E3%81%A6%E3%81%AE%E8%A8%AD%E8%A8%88%E3%82%92%E3%82%84%E3%82%8A%E6%8A%9C%E3%81%8F%E3%81%9F%E3%82%81%E3%81%AE%E6%9C%AC-%E7%AC%AC2%E7%89%88-%E6%A6%82%E5%BF%B5%E3%83%A2%E3%83%87%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%8B%E3%82%89%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%80%81%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%80%81%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3%E8%A8%AD%E8%A8%88%E3%80%81%E3%82%A2%E3%82%B8%E3%83%A3%E3%82%A4%E3%83%AB%E9%96%8B%E7%99%BA%E3%81%BE%E3%81%A7-%E5%90%89%E5%8E%9F-%E5%BA%84%E4%B8%89%E9%83%8E-ebook/dp/B09T2NSJS7/ref=sr_1_1?crid=1IJ4IU4N25YLS&keywords=%E3%81%AF%E3%81%98%E3%82%81%E3%81%A6%E3%81%AE%E8%A8%AD%E8%A8%88%E3%82%92%E3%82%84%E3%82%8A%E6%8A%9C%E3%81%8F%E3%81%9F%E3%82%81%E3%81%AE%E6%9C%AC+%E7%AC%AC2%E7%89%88+%E6%A6%82%E5%BF%B5%E3%83%A2%E3%83%87%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%8B%E3%82%89%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3+%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9+%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3%E8%A8%AD%E8%A8%88+%E3%82%A2%E3%82%B8%E3%83%A3%E3%82%A4%E3%83%AB%E9%96%8B%E7%99%BA%E3%81%BE%E3%81%A7&qid=1688275031&s=books&sprefix=%E3%81%AF%E3%81%98%E3%82%81%E3%81%A6%E3%81%AE%E8%A8%AD%E8%A8%88%2Cstripbooks%2C205&sr=1-1)

### 業務フロー分析
業務フローとは一連の作業フロー、関与者、それらの間でのやり取り・目的など示す。
分析では業務の各ステップを詳細に分析します。
どのように実行されるべきかを定義するために業務の順序、関与者、データの流れ、意思決定のポイント、各ステップの目的等が含まれます。
成果物としては、フローチャート、業務フローダイアグラム、業務プロセス図などがあります。これらは、業務の流れ、作業の順序、データの流れ、決定点、関与者などを視覚的に示したものです。

### システムユースケースの抽出
システムユースケースはシステムがユーザーや他のシステムとどのように相互作用するかを示す。
目的を達成するための相互作用をカプセル化。
抽出では、システムが提供すべき機能とその機能がどのように利用されるかを明確にする。
成果物としては、ユースケース図、ユースケース記述、ユースケーススペックなどがあります。これらは、システムとユーザー（または他のシステム）との相互作用を示し、それぞれのユースケースがシステムからどのような動作を引き出すかを詳細に記述します。

以上。
EC2の超基本のネットワーク構成(初心者向け)

## 基本構成の概要
- VPCという仮想ネットワークがあり, インターネットゲートウェイを介して, インターネットとやり取りが行われる.
- サブネットという単位で複数個の領域に区切られ, インスタンスは何かしらのサブネットの中に入ることになる.
- サブネット単位でルートテーブルというものが存在し, サブネット内から特定の宛先に行くときにどこに行けば良いかを教えてくれる.
- インスタンスにはセキュリティグループというファイヤーウォールの機能を司るものがあり, インスタンスからの(に対する)アクセスを制限している.
    ![基本ネットワーク構成 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1690288/e519c73d-d2ca-5d8a-879f-95348397d6ea.png)


## VPCとゲートウェイ
### VPC(Vertual Public Cloud)
- AWSクラウド内でプライベートな仮想ネットワークを構築するためのサービスで, 以下のような機能がある. (イメージ: 家のLANそのもので, Wi-Fiネットワークのようなもの)
    - VPC内にサブネットを作成可能(いくつかの領域に分割可能)
    - インターネットゲートウェイを使用してインターネットに接続可能
   ![VPCとIGW.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1690288/3cc2bd57-5672-e090-72b3-ae171d9042ae.png)


### インターネットゲートウェイ(Internet Gateway, 略称: IGW)
- AWSのVPC内でインターネットとの通信を行うためのゲートウェイのことで, 以下のような特徴がある. (イメージ: あるLANとインターネットを接続する窓口で, 家に置いてあるルータのようなもの)
    - インターネット上で固有のパブリックIPアドレスを持つ
    - 1つのVPCに対して1つのインターネットゲートウェイがある
    - パブリックサブネットはデフォルトゲートウェイがインターネットゲートウェイになっている
    
### NATゲートウェイ
- AWSのVPC内でプライベートサブネットからインターネットに出るときに使われるゲートウェイで, プライベートIPアドレスとパブリックIPアドレスの変換を司る.
- - プライベートサブネットにあるEC2のマシンからインターネットに接続する際には, NATゲートウェイを経由してパブリックIPアドレスを受け取る

## サブネットとルートテーブル
### サブネット
- サブネットとは, VPC内においてIPアドレスの範囲が指定されたネットワークのこと. 
よくあるのは, パブリックサブネット(外部から入ってこれるし外部にも出れる)とプライベートサブネット(外部から入ってこれないが外部には出れる)の二つのサブネットに分けること
    - AWSではCIDRブロックというIPアドレス範囲を指定してVPCを作成するが, このCIDRブロック内で複数のサブネットを作ることができる.
    - CIDRは172.168.10.0/24 みたいなIPアドレスの表記法のことで, この場合は先頭の24ビットがネットワーク部で残りの8ビットがホスト部(個々のコンピュータのアドレス)になり, 2**8 個のデバイスを同時に接続できる
    ![サブネット.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1690288/8051ce23-ef38-8b0a-066e-54b5d5653e77.png)

### ルートテーブル
- サブネット単位に設定されるもので, あるサブネットから特定のアドレスに対するルーティングを行ってくれるもの. 行きたい場所を言えばとりあえずどこに行けば良いか教えてくれる.
    - 0.0.0.0/0 という全アドレスに対するルーティング先をデフォルトゲートウェイと呼ぶ.
    - ルーティング先が被っている場合, 細かく指定されている方が優先される.
    - パブリックサブネットの場合, 同じVPC内に対しては直接行くように, それ以外の場合はインターネットゲートウェイに行くようにされる場合が多い.
    ![ルートテーブル.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1690288/cf1ea813-a8ca-82f0-dfcb-36d4684d3076.png)


## セキュリティグループ
- EC2などのネットワーク機器単位で設定されるもので, どのような通信を許可/拒否するのかを決めてくれるもの. 仮想空間上のファイアウォールサービス.
    - 外部からネットワーク機器に対して通信を行うことを「インバウンド通信」, あるネットワークから外部に対して通信を行うことを「アウトバウンド通信」という.
    - 通信制御の方法はIPアドレスやポート番号, 通信プロトコルなどを指定することにより実施される(インバウンド通信は443番ポートに対するhttps通信しかできませんよ〜とか).
    ![セキュリティグループコンソール.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1690288/e73e5e55-ea81-737d-c648-5833b66758a6.png)
【VSCode Meetup参加ログ】 GitHub Copilotについて

## はじめに
2023年6月26日に開催された「VSCode Meetup」にオンライン参加しました。
この記事はその時のログとなります。
[アーカイブはこちら](https://www.youtube.com/watch?v=0kgl_m4zR1s)

### 今回の議題
今回の議題は注目拡張機能の「GitHub Copilot」です。
GitHubの中の人(@yuhattor さん)を招かれ、お話をお聞きしました。

## GitHub Copilot
[GitHub Copilotの概要](https://docs.github.com/ja/copilot/getting-started-with-github-copilot)
### 基本的な機能について
開発者に大きなアドバンテージを提供してくれます。
- 開発者の生産性向上
- イノベーションの加速
- スキルギャップを埋める
    - スキルギャップとはジュニアエンジニアとシニアエンジニアのアウトプットするコードの質のことです。GitHub Copilotを使用すると最初の段階である程度の質を担保したコードを提案してくれるため、コードの質の均質化が図られます。

プロジェクトの文脈に即したコードを提案してくれます。
- コメントをコードに変換
- 繰り返しコードを補完
- 代替手段の提案

### 内部的な処理について
GitHub CopilotではChatGPTを使用しており、使用している言語モデルについてはLLM Modelを使用しているそうです。
内部でこのモデルから返された応答を処理して適切にコードとして使用できるものを生成するロジックが組まれおり、その際にライセンス汚染などについても考慮されているそうです。

### コードの著作権について
GitHub Copilotで生成されたコードの著作権はGitHub Copilotの使用者になります。

### GitHub CopilotXについて
GitHubではGitHub Nextと称してGitHub Copilotの進化を取り組んでいます。
https://github.com/features/preview/copilot-x

開発中の機能としては以下の通りです。
- Chat: VSCodeなどのエディタ上でスラッシュコマンドで色々なアクションを呼び出せる。
- Pull Request: PRの作成の際のタイトルや内容を自動で生成する。
- Docs: GitHub Docsなどでドキュメントを作成する際に補助をしてくれる。
- CLI: ターミナル上でコマンドを補完・提案してくれる。


## 今回のMeetupでの発見
ここからは今回のVSCode Meetupで学んだことについてまとめていきます。
### コメントをコードに変換してもらう際のコメントの与え方
コメントを作成し、それに対してGitHub Copilotがコードを作成してくれる機能についてはよく利用していたのですが、コメントの与え方によって生成されるコードの質が変わるというのは新発見となりました。
例があまり良くないとは思いますが、下記のようなイメージです。
```javascript
// hogeと出力する関数を作成する
function hoge() {
    var hoge = 'hoge'
    console.log(hoge)
}

// hogeと出力する関数を作成する。
// hogeはこの関数の中でのみ使用できるScopeとする。
function hoge() {
    const hoge = 'hoge' // 条件をコメントで設定したので、constを使用している。
    console.log(hoge)
}

// より複雑な処理
// より細かな条件1
// より細かな条件2
・
・
・
function fukuzatsu() {
    上記で指定された複数の条件を反映した処理
}
```

### コードを生成する際に、参照される箇所について
GitHub CopilotではChatGPTを使用しているため、ChatGPTに対しAPIリクエストを送信します。
その際に、情報としてChatPTに全ての情報を与えているとリクエストが大幅に増加し、費用も莫大なものとなってしまいます。
そのため、開いているタブ(ファイル)の隣接するタブのみ読み込んでいます。
これを利用すると、TypeScriptなどで型定義のファイルを隣接させておくと、生成されるコードの質が向上します。
また、テストを作成する際には、テスト箇所のファイルを横に開いておき、テストコードを書くようにするとテストの質が向上するはずです。
ただし、完璧に書いてくれるわけではないのでシナリオの補完などを人間が行う必要があります。

## [AI Native Development Guide](https://ai-native-development.gitbook.io/docs/v/ja/)
今回登壇された@yuhattor さんよりご紹介頂いたガイドになります。
GitHub CopilotやChatGPTのコーディングおける最適な使い方を解説して頂いているガイドとなります。


## 参加しての感想
普段、業務の中でGitHub Copilotを使用しておりますが、予測変換やコメントでの簡単なコード作成などでしか使えておらず、その恩恵に与れているとはあまり言えない状態でした。
今回のVSCode Meetupに参加し、GitHubの方から効果的な使用方法を伺うことで今後の業務の中でさらに生産性を上げていくことが出来るのではないかと感じております。
機会があれば、また参加したいです！
GitとGitHubの違いは？

Webアプリケーションの開発に役立つGitやGithubですが、両者の違いについてあまり考えた事がありませんでした。

両者の違いについて簡単に調べたことを忘れないように記録しておきます。


# GitとGitHubの違い

```
Gitを使う際に、GitHubもセットで登場してくることが多いので混同する方もいると思いますが、
GitとGitHubは同じものではありません！ 
上記で述べたように、Gitは分散型バージョン管理システムというツールです。 
一方でGitHubはGitの仕組みを利用した、開発支援をしてくれるwebサービスです。
```
引用：Gitとは何か？｜LaunchCartな日々
https://launchcart.jp/blog/git%E3%81%A8%E3%81%AF%E4%BD%95%E3%81%8B%EF%BC%9F


## Gitとは
Gitは「分散型バージョン管理システム」というツールのことである。

## Githubとは
GithubはGitの仕組みを利用した開発の手助けをしてくれるWebサービスのことである。


## まとめ
Githubを利用するには、Gitを利用する必要があるため、両者ともに切っても切れない関係性ではあるようですが、厳密にはこのような違いがあるということなんですね。

心に留めておきたいと思います。