OmniAICreator/Qiita-1.07M huggingface dataset:
Reverse Proxy環境でのStrapiのセットアップ

# リバースプロキシでの Strapi

## 今回のシチュエーション

フロントエンドはPHPに任せて、バックエンドは何かAPIを使って構築するスタイルが最近多いですが、今回は CodeIgniter + Strapi で構築することになり、プロキシの設定で若干はまった部分もあったので、備忘録を兼ねてまとめておきます。

## 設定の流れ

Strapiのインストールはすでに終了しているとして、以下の流れでプロキシを設定していきます。インストールは簡単なので、以下のページ等を参考にしてください。localhostではポート1337でStrapiを起動していると想定しています。（PM2でプロセスを管理しています）

https://qiita.com/aceimpact/items/06cf81f4abb0fd1a4ff0

### リバースプロキシ (OpenLiteSpeed)

Webサーバーでリバースプロキシを設定します。プロキシのプロセッサー名は `strapi` としています。 `extprocessor` 内の `maxConns` 以下は適宜設定してください。今回は、サブドメインでの運用のため、トップディレクトリ `/` にアクセスしてプロキシへ誘導する設定を `context` に記述しています。 `addDefaultCharset` 等は適宜設定してください。

```
extprocessor strapi {
  type                    proxy
  address                 127.0.0.1:1337
  maxConns                10
  pcKeepAliveTimeout      5
  initTimeout             5
  retryTimeout            0
  respBuffer              0
}

context / {
  type                    proxy
  handler                 strapi
  addDefaultCharset       off
}
```

### セキュリティ関連のエラー対処

上記の設定のままStrapiにアクセスすると、ブラウザでセキュリティヘッダーやCORSに関するエラーが噴き出してきますので、これを修正するために、 `config` にある（ハズ）の `middleware.js` を以下のように最低限修正します。（ `<YOUR_HOST_NAME>` は適宜変更してください）

#### Security Header

```
module.exports = [
  ...＜中略＞...
  {
    name: 'strapi::security',
    config: {
      contentSecurityPolicy: {
        useDefaults: true,
        directives: {
          'connect-src': ["'self'", 'http:', 'https:'],
          'script-src': ["'self'", "'unsafe-inline'"],
          upgradeInsecureRequests: null,
        },
      },
    },
  },
  ...＜中略＞...
]
```

#### CORS

```
module.exports = [
  ...＜中略＞...
  {
    name: 'strapi::cors',
    config: {
      enabled: true,
      headers: '*',
      origin: ['http://localhost:1337', '<YOUR_HOST_NAME>'],
    }
  },
  ...＜中略＞...
]
```

### URLの設定
`.env` ファイルを編集して、`URL` と `PUBLIC_URL` を設定します。以下の例で、`<YOUR_HOST_NAME>` は公開URLを、`<PATH_TO_STRAPI>` はトップディレクトリであれば省略か公開URLと同じURLで大丈夫ですが、サブディレクトリに置いている場合（例えば `api` ）、そのサブディレクトリ名を代入します。

```
URL=<PATH_TO_STRAPI>
PUBLIC_URL=<YOUR_HOST_NAME>
```

### Strapiのビルド

以上の設定が終わったら、忘れずに以下のコマンドでビルドしてStrapiを再起動したら完了です。

```
$ npm run build
```
[コーディング演習３] Functions Part 3  -  103  - iOS & Swift - The Complete iOS App Development Bootcamp

[コーディング演習】関数 その3
出力を持つことができる関数について学んだことを使って、isOdd(n: Int)という関数を作成します。

この関数に渡された任意の整数に対して、例えば次のようにします。

isOdd(n: 5)
この関数は、その数が奇数であるかどうかをテストします。奇数であれば、trueを出力し、そうでなければfalseを出力するはずです。これはブール値であり、文字列ではありません。

ヒント：余り演算子を使って、何かがきれいに分割できるかどうかをチェックすることができます。

https://docs.swift.org/swift-book/LanguageGuide/BasicOperators.html#ID64


解答コード
```swift
func isOdd(n: Int) -> Bool {
    if n%2 == 1 {
        return true
    } else {
        return false
    }
}
```
JavaScriptのES ModuleのExport・Importについて

ES Moduleとは、JavaScriptのファイルを一つをモジュールという単位にして、ファイルごとに機能を管理することを指します。
ファイルはそれぞれ独立していて、ファイル外部から別ファイルに定義された関数を使いたい場合、Importを使用します。

ES Moduleを使用する場合、htmlファイルのscriptタグ内にtype="module"という属性を指定する必要があります。

```.html
<body>
    <script type="module" src="module.js"></script>
</body>
```

関数の頭にexportをつけると、外部ファイルから参照可能な関数になります。
```module.js
//printText1は外部ファイルから参照できない
const printText1 = () => {
    console.log("Happy Holiday");
}

//printText2は外部から参照できる
export const printText2 = () => {
    console.log("Happy Holiday");
}
```

クラスを外部参照可能にするには、exportのオブジェクトリテラルとしてクラスを指定します。
```module.js
class Player {
    constructor(position) {
        this.position = position;
    }
}

export {Player} //この記述により、Playerクラスが外部よりアクセス可能になる。
```

export default は一つのjsファイルに一つだけ定義することができる。
```module.js
const defaultFunction = () => {
    console.log("This is default function.");
}

export default defaultFunction //この記述は一つのjsファイルに一つだけ
```

他ファイルで定義された関数はimportを使用して、呼び出したい関数名をオブジェクトリテラル{}として記述する。
```main.js
import {printText2} from "./module.js";

printText2(); //上のprintText2関数が実行される
```

export defaultを他ファイルで読み込む場合、{}は不要。

```module.js
import defaultFunction from "./module.js"
```

またexport defaultの関数に限って、読み込み元の名前を変更することができる。
(これは、一つのファイルに対してexport defaultが一つしか定義されていないため。）
```main.js
import defaultFunctionRename from "./module.js"
//module.jsではdefaultFunctionと定義されていたが、
//main.jsではそれをdefaultFunctionRenameとして呼び出している。
```
cscの作法 その333

# 概要
cscの作法、調べてみた。
練習問題、やってみた。

# 練習問題
datagridviewで選択したセルの値を取得せよ。


# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/0e2b6f38-596a-f9f8-50f0-fa58f54423a9.png)


# サンプルコード


```
using System;
using System.CodeDom;
using System.CodeDom.Compiler;
using System.Reflection;
using System.Windows.Forms;
using System.Drawing;
using System.Data.OleDb;
using System.Data;

class form1: Form {
	DataGridView dataGrid1;
	TextBox bo1 = new TextBox();
	form1() {
		Text = "DataGridView";
		ClientSize = new Size(500, 300);
		dataGrid1 = new DataGridView();
		dataGrid1.Location = new Point(50, 50);
		dataGrid1.Width = 400;
		ClientSize = new Size(600, 400);
		bo1.Location = new Point(150, 20);
		Controls.AddRange(new Control[] {
			bo1,
			dataGrid1
		});
		dataGrid1.ColumnCount = 3;
		dataGrid1.Columns[0].HeaderText = "ID";
		dataGrid1.Columns[1].HeaderText = "商品";
		dataGrid1.Columns[2].HeaderText = "個数";
		dataGrid1.Rows.Add(new Object[] {1, "みかん", 100});
		dataGrid1.Rows.Add(new Object[] {2, "りんご", 300});
		dataGrid1.Rows.Add(new Object[] {3, "バナナ", 200});
		dataGrid1.Rows.Add(new Object[] {4, "すいか", 300});
		dataGrid1.Rows.Add(new Object[] {5, "いちご", 200});
		dataGrid1.Rows.Add(new Object[] {6, "メロン", 100});
		dataGrid1.CellEnter += new DataGridViewCellEventHandler(dgvControl_CellEnter);
	}
	void dgvControl_CellEnter(object sender, DataGridViewCellEventArgs e) {
		DataGridView grid = sender as DataGridView;
		Console.WriteLine(grid[e.ColumnIndex, e.RowIndex].Value.ToString());
		bo1.Text = grid[e.ColumnIndex, e.RowIndex].Value.ToString();
	}
	[STAThread]
	public static void Main() {
		Application.Run(new form1());
	}
}




```

以上。
1から始めるGo言語のハローワールド

お勉強をしたのでメモ程度にまとめます

## ソースコード
```GO:Helloworld.go
package main

import "fmt"

func main() {
	fmt.Printf("Hello World of GO\n")
}

``` 

## 部品たち

### package main
これは、packageに「main」を指定してやると、そのmain下にある関数mainを実行する的な感じ
packageにはJavaとかみたいにオブジェクト指向を使うときには重宝する

### import "fmt"
これはimportにライブラリを指定してあげることで、そのファイル内でそのライブラリの関数を使うことができるようになる
複数指定したいときは
```GO
import (
    "fmt"
    "os"
)
```
みたいに丸括弧で囲んでやると　複数指定できる

### func main()
func mainはほかの言語と同じmain関数　いつもどおりこいつからプログラムは実行される

### fmt.Printf("Hello World of Go\n")

fmtライブラリの中にあるPrintf関数を呼び出して実行する
基本的には多分C言語のやつと一緒

## まとめ
思ったよりも簡単そうな言語で少し安心した
ネットインフラに強い言語らしいから今後のお勉強も楽しみ
cscの作法 その332

# 概要
cscの作法、調べてみた。
練習問題、やってみた。

# 練習問題
sqliteでdatagridviewでseachボタンを実装せよ。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/57e5f5c7-573e-f569-a2e2-4d821ad6fbfe.png)

# サンプルコード

```
using System;
using System.Text;
using System.IO;
using System.Drawing;
using System.Windows.Forms;
using System.Data;
using System.Data.Common;
using System.Transactions;
using System.Data.SQLite;

class form1: Form {
	private SQLiteDataAdapter dataAdapter = new SQLiteDataAdapter();
	private DataGridView gd0 = new DataGridView();
	private Button sButton = new Button();
	private TextBox bo1 = new TextBox();
	form1() {
		Text = "DataGridView";
		ClientSize = new Size(600, 400);
		bo1.Location = new Point(150, 20);
		bo1.Text = "amazon";
		sButton.Location = new Point(300, 20);
		sButton.Text = "search";
		gd0.Location = new Point(50, 60);
		gd0.Size = new Size(500, 300);
		sButton.Click += new EventHandler(SButton_Click);
		Controls.AddRange(new Control[] {
			bo1,
			sButton,
			gd0
		});
		SQLiteConnection conn = new SQLiteConnection("Data Source=db0.sqlite;");
		conn.Open();
		SQLiteCommand command = conn.CreateCommand();
		command.CommandText = "SELECT * FROM cdata";
		dataAdapter = new SQLiteDataAdapter(command);
		DataTable dt = new DataTable();
		dataAdapter.Fill(dt);
		gd0.DataSource = dt;
		conn.Close();
	}
	private void SButton_Click(object sender, EventArgs e) {
		DataTable dt = (DataTable) gd0.DataSource;
		DataView dv = dt.DefaultView;
		dv.RowFilter = string.Format("[{0}] LIKE '%{1}%'", "biko", bo1.Text);
	}
	[STAThread]
	public static void Main() {
		Application.Run(new form1());
	}
}





```

以上。
FlutterでGoRouterのログを出力する（メモ）

Flutterをはじめ、アプリ開発をしている時、度々画面遷移の前後でエラーが発生することはないでしょうか？<br>
また、それが画面遷移の前なのかあとなのか、
あと、本日紹介するGoRouterの場合、どこで定義したパスで発生したのかなどがわかると原因の特定がしやすくなると思います。

今回はその小ネタを紹介します。

## 対象パッケージ
https://pub.dev/packages/go_router

## コード
実装はとても簡単です。
GoRouterを定義する際に以下のように`debugLogDiagnostics`を定義するだけです

```dart
final router = GoRouter(
  debugLogDiagnostics: true, // trueに設定
  initialLocation: SplashPage.routePath,
  /// ルート定義
  routes: [
    // ...
  ],
);
```

## 挙動

#### ビルド時

このフラグを指定することで、ビルド時は以下のように定義してあるルートを出力してくれます。
nameも定義してある場合、nameとpathを紐づけて出力します。

```dart
[GoRouter] Full paths for routes:
             => /
             => /home
             =>   /home/sample_detail
           known full paths for route names:
             splashpage => /
             homepage => /home
             sampledetailpage => /home/sample_detail
[GoRouter] setting initial location /
[GoRouter] Using MaterialApp configuration
```

#### 遷移時
画面遷移時もnameとpathを出力してくれます。

`goNamed`で遷移した場合
```dart
[GoRouter] getting location for name: "homePage"
[GoRouter] going to /home
```

`pushNamed`で遷移した場合
```dart
[GoRouter] getting location for name: "homePage"
[GoRouter] pushing /home
```

ただし、`url_launcher`パッケージの`launchUrl()`メソッドの場合や`Navigator`で遷移した場合はこのログは出力されません。あくまでGoRouterのメソッドを用いた場合となるのでご注意ください。
ABC304回答メモ

0.はじめに
　A問題から難易度が高く、Cでくじけそうになりつつも
　なんとかジャッジまで持って行ったところなかなか終わらない・・。
　TLEするかと思っていたので、やっぱりかーと思いつつ10分以上たってしまい
　ツイッター等みても同じ現象の人がちらほら。
　試験時間20分延長もちょっとC問題の試行が出来ず終了しました。

　ひさびさにレーティングもつかず、消化不良な感じでした。

1.A - First Player
　Aにしては、難しいなと思いつつ実装。
　【実装内容】
　　・人名を読み込んで保存しつつ、一番若い人の位置を記憶
　　・一番若い人から順番に出力、リストの最後まで行ったら
　　　先頭から残りの人を出力

　https://atcoder.jp/contests/abc304/submissions/41941184

2.B - Subscribers
　こういうのはIF文連ねるのが結局早いんだよな！と取り掛かり始めましたが
　書いているとループさせた方がよいな・・・と気づき素直にそれらしく実装

　【実装内容】
　　・iを3～10の範囲で以下繰り返し
　　　・Nが10のi乗-1以下の時以下の処理、そうでない場合は次のループ
　　　　・Nから、Nを10のi-3乗で割った余りを引く
　　　　・Nを出力してプログラムを終了

　https://atcoder.jp/contests/abc304/submissions/41947639

3.C - Virus
　コンテスト中は、TLE＆提出がうまく働かず断念。
　翌日解説を見ながら実装するもTLEが1つ消えず悩んでましたが
　コンテストで提出した実装で、if文のインデントがずれているのに気づき
　そこを治したら普通にACもらえました。

　【考え方】
　　感染した人1(レベル1)をもとに、人2以降の人間が感染していないかをチェック
　　→距離がD以下の場合感染レベル2という情報をリストに保持
　　次は、感染レベル２の人一人ずつと、感染していない人の距離をチェック
　　→距離がD以下の場合感染レベル3という情報をリストに保持
　　以降繰り返し。
　　チェックレベル内で一人も感染者が出なければループを終了

　いったん感染と判断されればチェックが不要となるので、チェック回数は
　必要最低限で済み、ACとなりました。
　
　https://atcoder.jp/contests/abc304/submissions/41985627


以上
Denoでプロセス置換付きでshellを実行するには

今回は、Denoでプロセス置換付きでshellを実行する方法がわかったのでシェアしたい。
### スニペット：文字列を格納した変数の差分を確認する
```JavaScript
const a = "hello\nworld";
const b = "ola\nworld";
const command = new Deno.Command("bash", {
  args: [
  "-c",
  `diff <(echo -e "${a}") <(echo -e "${b}")`,
  ],
});
const output = await command.output();
const diff = new TextDecoder().decode(output.stdout);
console.log(`diff check \n ${diff}`);
```
上記で、文字列を格納した変数の差分を確認するシェルを実行し結果を確認できる。

### リファレンス
[Deno.run と Deno.spawn と Deno.Command のどれを使えば良いのか](https://qiita.com/kt3k/items/4ac4b6f21895041927aa)
[`Deno.run`は非推奨になるので代替手段（`Deno.Command`、dax）](https://qiita.com/access3151fq/items/00f40c62d756258b93ac)
[bashのプロセス置換機能を活用して、シェル作業やスクリプト書きを効率化する](https://sechiro.hatenablog.com/entry/2013/08/15/bash%E3%81%AE%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E7%BD%AE%E6%8F%9B%E6%A9%9F%E8%83%BD%E3%82%92%E6%B4%BB%E7%94%A8%E3%81%97%E3%81%A6%E3%80%81%E3%82%B7%E3%82%A7%E3%83%AB%E4%BD%9C%E6%A5%AD%E3%82%84%E3%82%B9)
[私の質問のスレッド@Deno Discord](https://discord.com/channels/684898665143206084/1113947079082004550/1113947079082004550)

### 謝辞
Deno Discordで私の素人質問に対して真摯に答えをくださった下記の人々に深く感謝します。
Hexagonさん、dsherretさん
SudoなしでDockerコマンドを実行する



https://docs.docker.com/engine/install/ubuntu/#create-a-docker-group

通常だとroot権限で実行する必要がある。 sudo付けずに実行しようとするとエラーになる。
Dockerの権限もしくは権限グループを変更する必要があるが、公式では後者が推奨されている。


>Receiving errors when trying to run without root?
The docker user group exists but contains no users, which is why you’re required to use sudo to run Docker commands. Continue to Linux postinstall to allow non-privileged users to run Docker commands and for other optional configuration steps.

# 方法

現在のユーザーをDockerグループに所属させる
```
sudo usermod -aG docker ${USER}
```

変更を反映

```
su - ${USER}
```


## 確認

現在のユーザーが所属するグループの中に「docker」がればOK
```
id -nG
```
ElixirでAtCoder参加してみよう(Mapの実行時間を調べてみた）

# はじめに

TupleはO(1)でアクセスがでるが、書き換えが遅い。という記事を書きました。

https://qiita.com/GeekMasahiro/items/c09abb9e4272dfe271ae


zacky1972 さんから、処理時間を測定についてコメントをいただきました。
https://github.com/zacky1972/various_map

Mapのget,putをみてみると、
```
##### With input size 100000 #####
Name              ips        average  deviation         median         99th %
Map get        8.16 M      122.55 ns ±15375.64%          84 ns         209 ns
Map put        6.86 M      145.67 ns  ±2532.76%      120.90 ns      162.50 ns
```

putもgetも1μs以下!!!
つまり10^5実行しても0.1秒
Tupleやets使ってみましたが、Mapでいいんじゃないか？

Tuple/ETSの記事と同じくAtCoderの問題([abc141_c](https://atcoder.jp/contests/abc141/tasks/abc141_c))で試してみました

# マップを使った回答

```Elixir
    def solve(n, k, q, a) do
        t = Enum.reduce(a, %{}, fn
             a,t -> Map.update(t, a, k-q+1, fn x -> x+1 end)
            end)

        (for i <- 1..n, do: Map.get(t,i,k-q))
        |> Enum.map(fn
            x when x>0 -> "Yes"
            x -> "No"
        end)
        |> Enum.join("\n")
        |> IO.puts()
    end
```
# 実行時間

AtCoderのジャッジでの実行時間

| 保存方法|実行時間|
|--------|-------|
| :ets|805ms|
| Map|770ms|

# まとめ

- Mapは、O(logN)なので、Tupleの読み取り時のO(1)よりは遅いが、N=10^5程度なら大きな問題にはならない。
- Tupleは、書き換えが遅い問題があるは、Mapでは問題ない。
- :etsも候補になるが、今回の例では、Mapでも大差はなかった。
- MapはEnumが使えたり、記述も用意なので、Mapの利点は大きい。
ポリシーによって制限されている企業/学校アカウントでWindows HelloのPINを再設定する

# 注意
:::note warn
この記事の内容を実際に試されたことによって発生した損害（システムファイルの破損や賠償問題への発展を含む）について、筆者は責任を負いません。

また、この記事に書かれている内容は、<INS>PCを不正な状態にし、OSの破損やPCの故障を招くものではなく</INS>、そして<INS>PCの不正な操作を推奨するものではない</INS>ことを、ここに記しておきます。
:::

# 筆者の環境
Windows 10 Pro 22H2 ビルド番号:19045.2965

グループポリシーエディタを利用するので、Homeエディションだと厳しいと思われます。
レジストリから弄る方法があればコメントなどで教えていただくか、編集リクエストをいただけると幸いです。

# この記事を書く経緯
私は普段使いしているWindows PCにPINを設定していて、パスワードではなくPINでログインしています。（PINの詳細はこちら → https://solutions.vaio.com/4842）

また、このPCには、教育委員会から配布されたMicrosoftアカウントを「職場または学校アカウント」として連携させていて、そのアカウントでMicrosoft Officeなどを利用しています。しかし、このアカウントは管理者である教育委員会によってポリシーが設定されているため、Windows HelloのPINの再設定時にMicrosoft Authenticatorアプリなどの認証アプリの使用が強制されています。

特に理由はないけどPINを変えたい！ でも認証アプリは(特に理由はないけど)使いたくない！という状態になったので、突破する方法を探しました。

# PINの設定/再設定方法
Win+rを押して「ファイル名を指定して実行」のウィンドウを開き、「gpedit.msc」と入力し、グループポリシーエディタを開きます。

次に、「ローカル コンピューター ポリシー」＞コンピューターの構成＞管理用テンプレート＞Windows コンポーネント＞Windows Hello for Businessまで進みます。

そして、「Windows Hello for Businessの使用」の設定を無効にして適用します。

PINの最小桁数を6桁未満にしたい場合は、
「ローカル コンピューター ポリシー」＞コンピューターの構成＞管理用テンプレート＞システム＞PINの複雑さ＞PINの最小文字数へと進み、希望の数値を設定して適用します。

そしてPCを再起動すると、PINを再設定してくださいと言われるので希望のPINを設定。

その後Windowsの設定からWindows Helloの再設定が出来なくなるので、顔認証や指紋認証の設定をしたい場合は、先ほど無効化したWindows Hello for Businessの設定を有効化すれば大丈夫です。

# この操作についての考察
:::note warn
ここから先の話は完全に予想に基づいており、根拠は一切ありません。
:::

教育委員会はPINに対して認証を要求するポリシーをMicrosoftアカウント経由で設定しているが、Windows Hello for Business=企業/学校アカウントでログインすると使用されるWindows Helloを一度無効化することによって、通常のWindowsに組み込まれているWindows Hello(≠ビジネス向けのWindows Hello)の設定機能を利用できるようになり、ポリシーによる制限を回避できる、ということなのかなと考えています。

# 最後に
ここまで読んでいただきありがとうございました。

念を押しておきますが、決してこの記事の内容を、会社のPCなどの自分が所有権を持たない端末で実行しないでくださいね。

# 参考文献
https://jpazureid.github.io/blog/azure-active-directory/how-to-disable-whfb/
「解像度」という言葉が使いやすい

## はじめに

「解像度」という言葉が、仕事においてここ1年ほどとても便利だなあと感じています。ここでいう「解像度」とは、ひとことでいうと「物事に対する理解の精緻さ」です。何かをあまり深く理解していない自身を表現したり、他者に対する評価として使えますし、自己分析においても使えます。たくさん使っていきましょう。

そこで、1.解像度という言葉はなにか、2.どこが良いのか、について書いてみたいと思います。

## 解像度という言葉はなにか

あらためて「解像度」とは、辞書から引いてきたわけではありませんが、ここでは「物事に対する理解の精緻さ」のこととさせてください。「理解」や「言語化」とかなり近いですが、「解像度」独特のニュアンスを含みます。もちろん、このニュアンスを必要としない場合は不適切ですが、詳細な理解を求めたり、理解が浅いことを示すのに、自他の感情を傷つけず正確に状況を捉えられることが多いと感じます。AさんがXについて解像度が高い、低い、などというように使います。

AさんがXについて解像度が高いというのは、次のような状況（全てを満たさなくても良いが多くを満たしている状況）をいいます。

・AさんはXのことを、シンプルに表現できます。
・AさんはXに関する経験があります。
・AさんはXの大事なポイントを簡潔に説明できます。
・AさんはXについて、さまざまな観点（幅、深さ）からの質問に答えることができます。
・AさんはXについて、Yという他のものごとと比較して差分を説明することができます。
・AさんはXについて、具体的にも抽象的にも色々な質問に答えることができます。

などです。AさんがXについて解像度が低い場合は逆です。

・AさんはXのことを、シンプルに表現できません。
・AさんはXに関する経験がありません。
・AさんはXの大事なポイントを簡潔に説明できません。
・AさんはXについて、さまざまな観点からの質問に答えることができません。
・AさんはXについて、Yという他のものごとと比較して差分を説明することができません。
・AさんはXについて、具体的にも抽象的にも色々な質問に答えることができません。

上記のようなニュアンスを一度に含むのが「解像度」という言葉です。

直感的にも、比喩ですが写真の解像度が低ければ、写真はよく見えません。同じ物事に対する理解として、Aさんの解像度が高い場合はAさんは、その物事に対して色々な角度からの質問に答えられるでしょう。その物事に対して、抽象化して答えることも、具体的に細かな点についても答えられるでしょう。文字通り、見えている世界が他の人と違うのです。

### 使い方の例

* Aさんは、エンジニアキャリアに関する解像度が高い
* Bさんは、自分の好きな食べ物に対する解像度が低い
* Cさんは、自分の体調管理に対する解像度が高い
* Dさんは、ビジネスサイドとエンジニアの違いに関する解像度が高い
* Eさんは、国語ができない人に対する解像度が高い
* Fさんは、自信とはなにか？に対する解像度が高い
* Gさんは、わかりやすい文章に対する解像度が高い

などです。

## どこが良いのか

1. 多くの人に伝わりやすい
私はエンジニアとして普段よくエンジニアと関わりながら仕事をしていますが、エンジニア以外の業界の方、つまりスポーツの方、芸術の方、ビズサイドの方、大学生などさまざまな方に伝わる印象があります。
特に優秀な方と接する中で、解像度という言葉がよく出てくると感じます。
共通言語というのは大切なテーマで、ここがブレるとなかなか5人以上の組織で意思疎通が難しいですが、この言葉は多くを語らずともお互いの中にある具体的な概念を抽象化しているので、伝わりやすさがあります。

2. イメージがしやすい
ニュアンスもある程度具体的なのに汎用性が高い点です。物理的な実体の比喩である点が大きいでしょう。誰であっても、ぼやけている写真は分かりずらいし、解像度にはレベルがありより高い解像度や低い解像度があることも直感的に分かるからです。逆に言えばこのニュアンスを利用したくない場合は、不適切です。

他の言葉とのニュアンスの違いをまとめておきます。

解像度: 写真や動画のアナロジーを強調。
理解: やや抽象的に、分かることを強調。共通言語が少ない。理解が浅いと言われてもピンとこないし、理解が浅いと言われるとバカだと言われているようで腹が立つが、解像度が低いと言われるとあくまで自己を尊重してくれている感覚がある。
言語化: 言葉で表現することを強調。言語化だけだと、薄っぺらくてもただ言語化すればいいというニュアンスを含んでしまう。いくら言葉を尽くせていても、深くないと意味がない場合が多い。
Rails実行時にGemfileとのバージョン違いのエラーが出る

[これ](https://qiita.com/mitsuaki1229/items/c0036bd2e55179673250)の続きをやっていて、
他のPCで作業しているソースを持ってきてたんだけど、エラーでハマったのでメモ。

## 事象

Rails実行時にGemfileとのバージョン違いのエラーが出る。

```shell
$ bundle exec rails s
Your Ruby version is 2.6.8, but your Gemfile specified 3.2.2
```

バージョンを確認しても、2.6.8が存在しない。

```shell
$ ruby --version
ruby 2.6.5p114 (2019-10-01 revision 67812) [x86_64-darwin19]
```

```shell
$ ruby --version
ruby 3.2.2 (2023-03-30 revision e51014f9c0) [x86_64-darwin21]
```

```shell
mitsuaki1229@mitsuaki1229-mba:~/Documents/source/VesselTracking (main *)$ rbenv local
3.2.2
```

```shell
mitsuaki1229@mitsuaki1229-mba:~/Documents/source/VesselTracking (main *)$ rbenv global
2.6.5
```

```shell
$ rbenv versions
  system
  2.6.5
  2.7.1
  3.2.0
* 3.2.2 (set by /Users/mitsuaki1229/Documents/source/VesselTracking/.ruby-version)
```

## 原因

bundle installを忘れていた()

## 対応

```shell
$ bundle install --path=.bundle
```

## 感想

エラーメッセージちょっと分かりづらいかな。
linuxで使用するコマンド一覧

# linuxで使うコマンド一覧

## 階層の移動や位置の確認

**cd**
オプションなしの場合、ホームディレクトリに戻る
cd/folder/file.txtのように一気に移動することもできる


**cd ..**
階層を上がる

**cd -**
一つ前の作業ディレクトリに戻る

**pwd**
現在のディレクトリのパスを表示する

**tree**
階層をツリー形式で表示

## ファイルやフォルダの作成、移動、削除など

**touch**
ファイルを作成

**mkdir**
ディレクトリ（フォルダ）作成

**cat**
ファイルを表示

**mv**
ファイルやディレクトリの移動、名前を変える
｛移動させたいファイル（ディレクトリ）｝｛移動先のファイル（ディレクトリ）｝で移動
｛名前を変えたいファイル（ディレクトリ）｝｛新しいファイル（ディレクトリ）｝リネームも可能

**cp**
 ファイルをコピーする
｛コピーするファイル｝｛新しいファイル｝でコピーができる
 ディレクトリは　**cp -r**　でコピー可能

**rm**
 ファイルを削除
 ディレクトリは　**rm -r**　でコピー可能

**rm**
 ファイルを削除
 ディレクトリは　**rm -r**　でコピー可能

**gzip**
 ファイルを圧縮

**gunzip**
 ファイルを解凍（自動的に圧縮したファイルはさくじょされる）

## その他、覚えておくと便利な機能

**clear**
 入力を全てクリアにする

**less**
 ファイルを1画面ずつ表示。長い内容に使うと良い

**shutdown**
 シャットダウン（使用できるのは本来rootユーザーのみ）
 shutdown -r now ただちにシステムを再起動 
shutdown -h now 　ただちにシステムを停止
shutdown -r 22:30 22時30分に再起動
Azure のメッセージング サービス



## Event Grid

[概要 - Azure Event Grid | Microsoft Learn](https://learn.microsoft.com/ja-jp/azure/event-grid/overview)
> Azure Event Grid は、MQTT および HTTP プロトコルを使用した柔軟なメッセージ消費パターンを提供する、スケーラブルでフル マネージドの 発行/サブスクライブ メッセージ配信サービスです。

## Event Hub

[Azure Event Hubs とは - ビッグ データ インジェスト サービス - Azure Event Hubs | Microsoft Learn](https://learn.microsoft.com/ja-jp/azure/event-hubs/event-hubs-about)

> Event Hubs は、最新のビッグ データ ストリーミング プラットフォームとなるイベント インジェスト サービスであり、Apache Spark などの外部サービスに加えて、Stream Analytics、Power BI、Event Grid などの他の Azure および Microsoft サービスとシームレスに統合できます。

## Service Bus

[エンタープライズ メッセージ ブローカーである Azure Service Bus の概要 - Azure Service Bus | Microsoft Learn](https://learn.microsoft.com/ja-jp/azure/service-bus-messaging/service-bus-messaging-overview)

> Azure Service Bus は、メッセージ キューとパブリッシュとサブスクライブ トピックを (名前空間内に) 備えたフル マネージド エンタープライズ統合メッセージ ブローカーです。 Service Bus は、アプリケーションとサービスを相互に分離するために使用され、次のような利点があります。


## Relay

[Azure Relay とは - Azure Relay | Microsoft Learn](https://learn.microsoft.com/ja-jp/azure/azure-relay/relay-what-is-it)


## Queue Storage
[Azure キュー ストレージの概要 - Azure Storage | Microsoft Learn](https://learn.microsoft.com/ja-jp/azure/storage/queues/storage-queues-introduction)

> Azure Queue storage は、多数のメッセージを格納するためのサービスです。 メッセージには、HTTP または HTTPS を使用して、認証された呼び出しを介して世界中のどこからでもアクセスできます。 

[Azure Storage キューと Service Bus キューの比較 - Azure Service Bus | Microsoft Learn](https://learn.microsoft.com/ja-jp/azure/service-bus-messaging/service-bus-azure-and-service-bus-queues-compared-contrasted)




## 参考
[Azure メッセージング サービスのドキュメント | Microsoft Learn](https://learn.microsoft.com/ja-jp/azure/messaging-services/)
[Azure メッセージング サービスの比較 - Azure Service Bus | Microsoft Learn](https://learn.microsoft.com/ja-jp/azure/service-bus-messaging/compare-messaging-services)
[Azureのメッセージングサービス4種 - Qiita](https://qiita.com/gtracker64/items/b54c43ce5fe41fd4bd47)
[メッセージ キューイング で使われるプロトコル - Qiita](https://qiita.com/e99h2121/items/22257bad8df7030c7904)
Ruby on Railsの開発環境構築で必要なrbenvコマンド

# はじめに
どの言語、フレームワークでもそうですが学習をしようとすると開発環境の構築が必須になります。（常々全部dockerで準備してくれと思う。）
railsの開発環境をローカルに作るのにはrbenvが必須になってきますが、いくつかのコマンドさえ押さえておけば全く問題なく環境構築できるはずです。

# コマンド一覧

## 1. `rbenv -v`
```
$ rbenv -v
```
rubyのバージョン管理のrbenvのバージョン確認
正直バージョンはどうでも良いのですが、rbenvが入っていることの確認に使います。

## 2. `ruby -v`
```
$ ruby -v
```
現在使用しているrubyのバージョンの確認

## 3. `rbenv install --list`
インストールすることができるrubyのバージョン
`rbenv install --list-all`で全表示

## 4. `rbenv install {version}`
```
$ rbenv install 3.1.2
```
インストール

## 5. `rbenv versions`
```
$ rbenv versions
```
使用できるrubyのバージョン確認（現在ローカルにインストール済みのもの）

## 6. `rbenv global {version}`
```
$ rbenv global 3.1.2
```
使用するrubyバージョンを指定
globalをlocalにすると現在のディレクトリでのみ有効なversionを指定できます。

## 7. `rbenv local --unset`
```
$ rbenv local --unset
```
現在のディレクトリのrubyバージョンのリセット

## その他
- 新しいversionをインストールするとbundle installができない
```
The `bundle' command exists in these Ruby versions:
```
このようなエラーが出たら以下でbundlerをインストールする
```
$ gem install bundler
```
2-01ソフトウェア

### 2-01ソフトウェア
#### OS：Operating System
基本ソフトウェア
ハードウェアやアプリケーションソフトウェア（応用ソフトウェア）を管理・制御するソフトウェア
 Windowsやmac OS，UNIX，Linux，Android，iOSなど
#### 制御プログラム
　ハードウェア資源の状態を常に監視し，コンピュータの効率的な
利用を実現するソフトウェア群
ジョブ管理 ジョブをスケジュール管理を行う。ジョブの投入から結果を出るまでの過程を提供する
タスク管理 CPUを効率よく使用するための割り当てを行う
記憶管理　主記憶を効率よく管理する。実記憶管理と仮想記憶管理を提供
ファイル管理　ディレクトリやファイルを管理するファイルシステムの機能を提供する
その他　入出力管理、通信管理、セキュリティ管理、運用管理、障害管理など
#### API
アプリケーションから，OSが用意する各機能を利用するための仕組み

它是一组定义了软件组件之间交互方式的规范。API定义了不同软件组件如何通过预定义的方法或协议进行通信，以便实现特定功能或访问特定服务。API允许不同的应用程序、服务或系统之间共享数据和功能，而无需了解底层的实现细节。通过使用API，开发人员可以将已经开发好的功能集成到自己的应用程序中，而无需重新编写这些功能的代码。
#### OSS
Open Source Software
ソースコードを
公開しているソフトウェアです。無保証を原則として，誰でも自由にソースコードを改変し再頒布できる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3293109/1730785a-d987-1376-5610-d332dc9ce029.png)

### ジョブ管理とタスク管理
#### ジョブとタスク
ジョブは，利用者から見た仕事の単位,タスク（プロセス）は，OSから見た仕事の単位、PCに投入されたジョブは幾つかのタスクに分解される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3293109/3f5897aa-6d09-4448-a2bf-fcb5a88bceef.png)
ジョブ　利用者から見た仕事の単位
タスク　OSから見た仕事の単位
#### ジョブ管理
ジョブ管理の機能の一つに，ジョブのスケジューリングがあり，ジョブの入力と出力を管理します。
PCに投入したジョブは、入力待ち行列に登録され、順番に処理されるのを待つ。
　　　　　　　　　　　　　　↓
処理された後は出力待ち行列に登録され、順番にプリンタなどに処理結果が出力のを待つ。

病院で診察前⇒診察⇒診察後　イメージ
#### スプーリング
　出力データを磁気ディスクに書き込んでから出力する。スループットの向上
#### タスク管理
タスク管理では，タスクの生成から消滅までを，実行可能状態・実行状態・待ち状態の三つの状態で管理しながら，CPUを有効活用
実行可能状態（Ready）
CPUの使用権が割り当てられるのを待っている状態。実行可能状態のタスクが複数存在する場合、待ち行列を形成する
実行状態（Run）
CPUの使用権が割り当てられ，実行している状態。
待ち状態（Wait）
他のタスクが入出力装置を使用しているため，入出力処理が完
了するのを待っている状態
#### タスクの状態遷移
① 生成された直後のタスクは実行可能状態となる
② 実行可能状態のタスクから実行するタスクを選択して，そのタスクにCPUの使用権を割り当てると実行状態へ遷移する。このCPUの割当てをディスパッチという
③ 実行状態中に，他の優先順位が高いタスクが実行可能状態になると，割込みが発生し，優先順位の高いタスクにCPUの使用権が割り当てられる。現在の実行状態のタスクは実行可能状態へ遷移する
④ 実行状態中に，入出力待ちが生じた場合は， 入出力処理が完了するまで待ち状態へ遷移する
⑤ 入出力処理が完了すれば実行可能状態に遷移する
#### タスクのスケジューリング
複数のタスクの中から，どのタスクにCPUの使用権を割り当てるかを決める方式
到着順方式 
実行可能待ち行列の先頭にあるタスクから順に，CPUの使用権を割り当てる
処理時間順方式 
処理予定時間が最も短いタスクから順に，CPUの使用権を割り当てる
優先度順方式 
優先度の高いタスクから順に，CPUの使用権を割り当てる
ラウンドロビン方式
実行可能待ち行列の先頭にあるタスクから順に，CPUの使用権を割り当て，一定時間（タイムスライス）が経過した場合は，実行を中断して，実行可能待ち行列の最後尾に加える
#### マルチタスク
見かけ上，複数のタスクを並行処理する。CPUの有効活用
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3293109/f8f1ea25-f21a-2e6b-56a0-90aeb4636b87.png)
                          ↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3293109/b0870aec-3c1a-f43d-b2fb-b147a6163a5a.png)
#### 割込み処理
割込みは，実行中のプログラムを一時中断し，制御プログラムに制御を移して，必要とする別の処理に切り替えること
データサイエンスのための微分積分 第21回 極限を用いて円の面積を求める

:::note info
本記事は数学講座[2.20極限を用いて円の面積を求める](https://www.matongxue.com/lessons/1225/parts/968)を勉強して投稿したメモです。詳細は元の素晴らしい講座のページをチェックしてください。
:::


# 円の面積はπr²である 

[動画](https://matongxue.oss-cn-hangzhou.aliyuncs.com/media/1654/20220623153335719.mp4)

# 内接正多角形の極限は円である

[動画](https://matongxue.oss-cn-hangzhou.aliyuncs.com/media/5979/20220623153657222.mp4)
データサイエンスのための微分積分 第20回 閉区間上の連続関数の性質

:::note info
本記事は数学講座[2.19閉区間上の連続関数の性質](https://www.matongxue.com/lessons/592)を勉強して投稿したメモです。詳細は元の素晴らしい講座のページをチェックしてください。
:::


# 閉区間上の連続関数 
**定義:** 
関数 $f(x)$ が開区間 $(a,b)$ 上で連続であり、左端点 $a$ で右連続であり、右端点 $b$ で左連続である場合、関数 $f(x)$ は閉区間 $[a,b]$ 上で連続です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327130/50428ea3-b7d0-102d-d35a-55071f387e65.png)


# 最大値、最小値

空間内の最大値、最小値：

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327130/1553b423-8cbc-ca3f-7412-a45fa80c28eb.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327130/6c0b7dce-09f8-b403-21df-24479e912a2e.png)


# 極大値、極小値

局所内の極大値、極小値：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327130/33497a16-1435-05f7-964a-57a6e88127ce.png)

**最大値は区間I上のグローバルな概念であり、極値は近傍上の局所的な概念です。**

# 有界性と最大値最小値定理 (ゆうかいせいとさいだいちさいしょうちていり)

**定理:** 
閉区間上の連続関数は、その区間上で有界であり、**必ず最大値と最小値**を取る。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327130/b6d0512e-ea3d-1a42-ba93-b559c5d53626.png)

# 零点定理

**定理（零点定理）:**
関数$y=f(x)$が閉区間$[a,b]$上で連続であり、かつ$f(a)とf(b)$が異符号（つまり、$f(a)・f(b) < 0$）である場合、開区間$(a,b)$内には少なくとも1点$ξ$が存在し、$f(ξ) = 0 $となる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327130/9167c4e6-f35c-cc9e-bdb0-104bb52456c2.png)

# 介値定理 (かいちていり)

**定理（中間値の定理）:**
関数$f(x)$が閉区間$[a,b]$上で連続であり、この区間の端点で異なる関数値を取る場合、つまり:
$f(a) = A, f(b) = B, A ≠ B$

このとき、$AとB$の間の任意の数$C$に対して、開区間$(a,b)$内には少なくとも1点$ξ$が存在し、$f(ξ) = C$ となる。

**定理:**
閉区間$[a,b]$上で連続な関数$y=f(x)$の値域は閉区間$[m,M]$であり、$mとM$はそれぞれ$f(x)$が$[a,b]$上で取る最小値と最大値です。

# 参考情報

https://manabitimes.jp/math/1183
複数アカウントでDocker Desktop for Macを使っていて/var/run/docker.sockに繋がらないエラー

# はじめに
Docker Desktop for Macで `/var/run/docker.sock` に繋がらないエラーになり、それを解決したのでログとして残しておきます。
**前提として、自分の環境では1つのMacの中にアカウントを2つ作り、その両方のアカウントそれぞれでDocker Desktopを使っていました。**

# 環境情報
Docker Desktop for Macのバージョンは以下です。
```
Version

4.20.0 (109717)

Engine: 24.0.2

Compose: v2.18.1

Credential Helper: v0.7.0

Kubernetes: v1.25.9
```

# エラー発生
ある日、いつもの様にMacを立ち上げ、Docker Desktop for Macを起動し、 `docker-compose up -d` を使うと `/var/run/docker.sock` に繋がらない旨のエラーが出ました。

> permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/containers/json?all=1&filters=%7B%22label%22%3A%7B%22com.docker.compose.config-hash%22%3Atrue%2C%22com.docker.compose.project%3Dproject_name%22%3Atrue%7D%7D": dial unix /var/run/docker.sock: connect: permission denied

# 試行錯誤

permission deniedと言われているので、`/var/run/docker.sock` のパーミッションを調べてみます。

```shell
ls -l /var/run/docker.sock

lrwxr-xr-x 37 root daemon 2023-06-02 14:00 /var/run/docker.sock -> /Users/user_2/.docker/run/docker.sock
```

自分はMacに2つのアカウントがあり（ここでは2つのアカウント名をそれぞれ `user_1`, `user_2` とします）、 `user_1` でログインしているのに、 `user_2` のdocker.sockが参照されているのでこれが怪しそうです。
ググってみると、sudoしてみるといいとあったのでしてみましたが、うまくいきません。

> Cannot connect to the Docker daemon at unix:///Users/user_2/.docker/run/docker.sock. Is the docker daemon running?

シンボリックリンク先が `user_2` のものになってるのがおかしそうなので、 `user_1` のものにすればいいのでは？と思いやってみました。

```shell
sudo ln -si "$HOME/.docker/run/docker.sock" /var/run/docker.sock
```

予想通り、うまくいきました。
しかし、シンボリックリンクがどのタイミングで変わるかはわかりませんが、これ別アカウントにログインするたびに切り替えるのはしんどいよなあと思い解決策をググってみると、Docker Desktop for Macのgithubのissueに興味深い記述が。

> Docker Desktop for Mac removed /var/run/docker.sock per 4.13.0 Release Notes: docs.docker.com/desktop/release-notes/#docker-desktop-4130 "By default Docker will not create the /var/run/docker.sock symlink on the host and use the docker-desktop CLI context instead."

https://github.com/docker/for-mac/issues/6529

バージョン4.13.0から `/var/run/docker.sock` のシンボリックリンクは作らなくなったそうです。
え、ということはもしかして、このsockファイルはいらない...？？

```shell
sudo rm /var/run/docker.sock
```

`user_1` のアカウントでDocker Desktopを起動したまま `user_2` で問題なくDocker Desktopを起動し、 `docker` 関連のコマンドが問題なく動きました。

# 結論
バージョン4.13.0から `/var/run/docker.sock` のシンボリックリンクは作らなくなったので、消してしまいましょう。

```sh
sudo rm /var/run/docker.sock
```
Ubuntu22.04でUnityを使おうとしたときに詰まった

# 環境
```
CPU: i9-13900KF
Memory: 32GB
GPU: RTX4090
OS: Ubuntu 22.04.2 LTS
```

# ぶつかった問題

UnityHubのインストールは公式から落としてくるだけでインストールには成功した。

## その1
いざ新しいプロジェクトを作成し開こうとすると、エラーが出る。
```
Enter Safe Mode?
The project you are opening contains compilation errors.
```
とりあえずSafeModeで開くと、今度は空のエラーメッセージが2つ出てくる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443650/6de674b5-dbff-982b-3a86-32f081088481.png)

対処法としては、OpenSSL(libssl)を入れることだ。
私の場合、[ここ](https://archive.ubuntu.com/ubuntu/pool/main/o/openssl1.0/)から`libssl1.0.0_1.0.2n-1ubuntu5.10_amd64.deb`をダウンロードしてきて、`sudo dpkg -i libssl1.0.0_1.0.2n-1ubuntu5.10_amd64.deb`を実行することによって解決した。

参考: https://dev.to/brenomfviana/installing-unity-hub-on-ubuntu-42l0

## その2
新しいプロジェクトを開けたわけだが、今度は画面が全体的にぼんやりしている。(右上のInspectorが分かりやすい。)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443650/56322e4b-8502-7271-d2a9-e1316a14b4b9.png)

対処法としては、
1. 上のタブのEditからProject Settingsを開く。
2. QualityのAnisotropic TexturesをPer Textureに設定する。
で解決した。

参考: https://forum.unity.com/threads/unity-editor-is-super-blurry.1299021/

## その3
Planeを1枚置くと、186FPSから50FPSに下がる。

今回はUnityが最新のNvidiaのドライバと相性が悪かったように見えた。
```
$ sudo apt-get purge nvidia-* # 現在のドライバをアンインストールする
$ sudo add-apt-repository ppa:graphics-drivers/ppa
$ sudo apt update
$ ubuntu-drivers devices # ここでGPUが対応するドライバのバージョンを確認
$ sudo apt install nvidia-driver-525 # 最新版より1つ古いバージョンを入れた
```

私は1つ古いバージョンのドライバを入れることで正常に動作した。
BGP（Border Gateway Protocol）まとめ

# はじめに
私はオンプレに従事しており、必要なちしきのためメモしました。
AWSのネットワークの勉強や構築をするときにも必要になるためメモしました。

https://aws.amazon.com/jp/blogs/news/creating-active-passive-bgp-connections-over-aws-direct-connect/

https://aws.amazon.com/jp/certification/certified-advanced-networking-specialty/

# BGP（Border Gateway Protocol）まとめ
BGPは、インターネット上の異なるAS間で経路情報を交換するための外部ゲートウェイプロトコルです。以下にBGPの基本的な特徴と設定例を示します。



# 基本概念
+ <b>AS（Autonomous System）</b>: BGPのネットワークを管理する単位であり、一意の番号（ASN）で識別されます。
+ <b>内部BGP（iBGP）</b>: 同一AS内のルータ間でBGPを使用して経路情報を交換するプロトコルです。
+ <b>外部BGP（eBGP）</b>: 異なるAS間でBGPを使用して経路情報を交換するプロトコルです。
BGPの特徴
+ <b>パスベクタ</b>: BGPは経路情報にパスベクタを含め、最適な経路を選択します。
ポリシーベースの経路制御: BGPではフィルタリングや属性の変更などのポリシーを使用して経路制御を行います。
+ <b>相互接続性の保持</b>: BGPはインターネット上の異なる自治システム間で相互接続性を維持する役割を果たします。

# CiscoルータでのBGP設定例
以下にCiscoルータでのBGPの基本的な設定例を示します。

### BGP ASNの設定 
router bgp <ASN>

### eBGPピア設定
neighbor <相手ルータのIPアドレス> remote-as <相手ASN>

### iBGPピア設定
neighbor <ピアルータのループバックアドレス> remote-as <ピアASN>
neighbor <ピアルータのループバックアドレス> update-source <ループバックインターフェース>

### ネットワーク広告
network <広告したいネットワークアドレス>

### デフォルトルートの広告
neighbor <相手ルータのIPアドレス> default-originate


# IXルータでのBGP設定例

### BGP ASNの設定
router bgp <ASN>

### ルータIDの設定
bgp router-id <ルータのID>

### IXピア設定
neighbor <相手ルータのIPアドレス> remote-as <相手ASN>
neighbor <相手ルータのIPアドレス> ebgp-multihop <ホップ数>
neighbor <相手ルータのIPアドレス> update-source <送信インターフェース>

### ネットワーク広告
network <広告したいネットワークアドレス>

# 参考
+ Cisco BGP Configuration Guide:
https://www.cisco.com/c/en/us/support/docs/ip/border-gateway-protocol-bgp
+ Cisco BGP Command Reference:
https://www.cisco.com/c/en/us/td/docs/ios/iproute_bgp/command/reference/
+ Cisco BGP Best Practices:
https://www.cisco.com/c/en/us/td/docs/solutions/Enterprise/WAN_and_MAN/BGP - Best Practices/BGP - Best Practices.html
Pythonでネイピア数を求めてみた

# 前提条件
* Python3
* matplotlib

>ネイピア数eは以下の値を持つとされている。
e = 2.71828 18284 59045 23536 02874 71352 …

>式は以下で定義される。これはネイピア数の定義の一つである。
```math
e = \lim_{n \to \infty} \Big(1 + \frac{1}{n} \Big)^n
```
# 目的
ネイピア数eを求めてみる。

# 環境構築
```
pip install matplotlib
```

# サンプル
```napier.py
# -*- coding: utf-8 -*-
import math
import matplotlib.pyplot as plt


def napier(n):
    return (1+1/n)**n  
    
i = int(1.0e2)
y = []
for j in range(1,i+1):
    y.append(napier(j))

print(y[i-1])
print(math.e)

plt.title("Napier")
plt.plot(y)
plt.show()
```
## 実行結果
```
2.7048138294215285
2.718281828459045
```
## グラフ
![napier.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32439/1ade4e5b-1a45-439c-0cf4-996636a94b4d.png)

## napier.pyの修正
>ネイピア数の別な定義
```math
e =１+1/1!+1/2!+1/3!+1/4!+⋯
```

指摘を受けてnapier.pyを修正

```napier2.py
import math
import matplotlib.pyplot as plt

def napier(n):
    return (1+1/n)**n  

def d_napier(n):
    x = 0
    for i in range(n + 1):
        x += 1 / math.factorial(i)
    return x

i = int(1.0e2)
y = []
for j in range(1,i+1):
    y.append(napier(j))

y1 = []
for k in range(1,i+1):
    y1.append(d_napier(k))

print(y[i-1])
print(y1[i-1])
print(math.e)

plt.title("Napier")
plt.plot(y)
plt.plot(y1)
plt.show()
```
## 実行結果
```
2.7048138294215285
2.7182818284590455
2.718281828459045
```
## グラフ
![napier2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32439/eef3433c-204e-cc41-5c32-d7ae6f17b073.png)



# 参考資料
https://www.amazon.co.jp/%E4%B8%96%E7%95%8C%E3%81%AF%E3%80%8C%EF%BD%85%E3%80%8D%E3%81%A7%E3%81%A7%E3%81%8D%E3%81%A6%E3%81%84%E3%82%8B-%E3%82%AA%E3%82%A4%E3%83%A9%E3%83%BC%E3%81%8C%E8%A6%8B%E5%87%BA%E3%81%97%E3%81%9F%E7%A5%9E%E5%87%BA%E9%AC%BC%E6%B2%A1%E3%81%AE%E8%B6%85%E8%B6%8A%E6%95%B0-%E3%83%96%E3%83%AB%E3%83%BC%E3%83%90%E3%83%83%E3%82%AF%E3%82%B9-%E9%87%91%E9%87%8D%E6%98%8E-ebook/dp/B09NLZW1YY?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=%E3%83%8D%E3%82%A4%E3%83%94%E3%82%A2%E6%95%B0&qid=1686010428&sr=8-1&linkCode=ll1&tag=qiitajinbei23-22&linkId=c3b6671eea1cefda5394130fd3cfc857&language=ja_JP&ref_=as_li_ss_tl

https://www.youtube.com/watch?v=33hDkrU7PgY&t=770s&ab_channel=%E3%83%89%E6%96%87%E7%B3%BB%E3%81%A7%E3%82%82%E6%A5%BD%E3%81%97%E3%81%84%E3%80%90%E3%82%86%E3%81%A3%E3%81%8F%E3%82%8A%E6%95%B0%E5%AD%A6%E3%81%AE%E9%9B%91%E5%AD%A6%E3%80%91

https://ja.wikipedia.org/wiki/%E3%83%8D%E3%82%A4%E3%83%94%E3%82%A2%E6%95%B0

# 編集後記
ゆっくり動画を見て、ネイピア数を計算してみたいと思い立ち、やってみた。
コメントの指摘を受けて、napier.pyを修正しました。
PEルータについてのメモ

# PEルータとは

PEルータ（Provider Edge Router）は、インターネットサービスプロバイダ（ISP）やネットワークプロバイダが管理するネットワークの境界に位置するルータのこと。PEルータは、ネットワークのエッジ部分で顧客との接続を提供し、複数のサービスを統合して顧客に提供する役割を果たす。

# PEルータの機能

+ <b>仮想プライベートネットワーク（VPN）の提供について</b>
PEルータは、VPN接続を提供して異なる顧客間でセキュアな通信を確保する。これにより、顧客のデータは他の顧客と分離され、プライバシーとセキュリティが保護される。

+ <b>ルーティングについて</b>
PEルータは、BGP（Border Gateway Protocol）などのルーティングプロトコルを使用して、ISP内のネットワークと顧客ネットワーク間の経路情報の交換を行う。PEルータは、受け取ったパケットを正しい経路に転送するためのルーティングテーブルを維持する。

+ <b>サービスの提供について</b>
PEルータは、機能モジュールやインターフェースを組み合わせることで、異なるサービスを提供する。たとえば、インターネット接続、音声通信、仮想プライベートネットワーク（VPN）、セキュリティ機能（ファイアウォールや暗号化）などのサービスを統合して提供することができる。

+ <b>トラフィック制御について</b>
PEルータは、トラフィックの制御や品質の維持を行う。トラフィックエンジニアリングを使用してネットワークのリンク使用率を最適化したり、帯域幅の予約を行ったりすることができる。

# イメージ
PEルータがISPのネットワーク（Pルータ）と接続し、複数の顧客（Customer A、Customer B、Customer C）との間に接続。PEルータは、ISPのネットワークと顧客ネットワークを結びつけ、顧客に対して様々なサービスを提供する。

                +----------------+
                |    Internet    |
                +----------------+
                        |
                +----------------+
                |   Pルータ       |
                +----------------+
                        |
                +----------------+
                |   PEルータ      |
                +----------------+
                |   Customer A  |
                +----------------+
                |   Customer B  |
                +----------------+
                |   Customer C  |
                +----------------+

# 特徴を整理
1. インターネットと顧客の接続
PEルータは、ISPのネットワーク（Pルータ）と顧客のネットワークとの接続ポイントに位置する。これにより、顧客はISPを介してインターネットに接続できる。

2. 仮想プライベートネットワーク（VPN）の提供
PEルータは、異なる顧客間でセキュアな通信を確保するためにVPN接続を提供する。VPNにより、顧客のデータは他の顧客と分離され、プライバシーとセキュリティが確保される。

3. ルーティング機能
PEルータは、BGP（Border Gateway Protocol）などのルーティングプロトコルを使用してISP内のネットワークと顧客ネットワーク間の経路情報の交換を行う。これにより、受け取ったパケットを正しい経路に転送するためのルーティングテーブルを維持する。

4. サービスの提供
PEルータは、機能モジュールやインターフェースを組み合わせることで、様々なサービスを顧客に提供する。例えば、インターネット接続、音声通信、VPN、セキュリティ機能（ファイアウォールや暗号化）などが含まれる。

5. トラフィック制御と品質維持
PEルータは、トラフィックの制御や品質の維持にも重要な役割を果たす。トラフィックエンジニアリングを使用して、ネットワークのリンク使用率を最適化し、帯域幅の予約を行うことができる。これにより、ネットワークのパフォーマンスや品質を最適化し、顧客に高品質なサービスを提供する。

6. セキュリティ機能
PEルータは、セキュリティ機能を統合することができる。ファイアウォールや暗号化などのセキュリティ機構を備え、顧客のネットワークやデータを保護する。

7. インターフェースの管理
PEルータは、複数のインターフェースを管理し、顧客との接続ポイントでデータの受け渡しを行う。顧客のネットワークやデバイスとの互換性を確保し、効果的な通信を実現する。

# まとめ
PEルータはISPのネットワークの中核部分のルータ（Pルータ）と連携し、顧客のトラフィックをISPのネットワーク内に引き渡す。顧客との接続ポイントにおいてセキュリティ機能やサービスの統合を行い、顧客に安全で高品質なネットワークサービスを提供する。

PEルータはネットワークインフラストラクチャの重要な要素であり、効率的なデータの転送とサービスの提供を可能にする。
esaで:::infoを使う方法

# この記事は古いです。
2024/3/4に、GitHubで対応していたアラート構文がEsaにも対応されていました。
今までHTMLで書いていたので、改行がされにくいなど少々大変なこともありましたが、Markdownの記法として便利になりました！！
ぜひ、公式リファレンスをご確認を。

https://docs.esa.io/posts/505

# 初めに
HackMDやQiitaでは注意して欲しい部分や、ちょっとした情報を乗っけるために`:::`を用いた枠の作成がありました。
ですがesaの公式リファレンスでは書き方が書いていなく困っていたところ、調べたらやり方があったので、メモがわりに残しておきたいと思います。


# esaでの実際の表示
![スクリーンショット 2023-06-04 2.07.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1209385/16893276-54c5-3a3a-78ec-58ab8ea3d8b4.png)

# コード
```html
<div class="alert alert-success">
<i class="fa fa-info-circle"></i> <b>タイトル</b><br>
内容
</div>
```

```html
<div class="alert alert-danger">
<i class="fa fa-info-circle"></i> <b>タイトル</b><br>
内容
</div>
```

# Qiitaで表示をさせると
:::note
**タイトル**
内容
:::

:::note warn
**タイトル**
内容
:::

# Qiitaでの書き方
```md
:::note
**タイトル**
内容
:::
```
```md
:::note warn
**タイトル**
内容
:::
```




# 感想
結局HTMLを用いて書く感じになっていましたね。
alertというcssが用意されているのなら、あらかじめ:::で設定できるようになるといいなぁと思っています。
Git/GitHubの使い方2(入門)

# Gitの使い方
インストール方法や使用方法について簡単にまとめておこうと思います。　
一般にはGitHubを使うことの方が多いですが、GitHubを使うためにはGitのシステムについて理解しておくべきと思ったので、記録しておきます。　

## Gitとは　
バージョン管理を行うためのシステム。主に個人で開発するときに使われる。

## Gitのインストール　
こちらのサイトを参考にしました。

https://blog.cloud-acct.com/posts/u-homebrew-git-install/　

詳しい手順は上記のサイトを参考にしていただきたいです。
ここでは、掻い摘んで自分の行ったことだけ載せておきます。　
Macユーザーであればデフォでインストールされていますが、Gitのバージョン管理が難しいのでHomebrew経由で再度インストールしました。　

### 1 gitの現状確認　
```
% git --version          
git version 2.37.1 (Apple Git-137.1)
```
(Apple Git-137.1)よりデフォルトのgitを使用していることが分かります。　
このままでは、Gitのバージョン管理が難しいので、HomebrewでインストールしたGitを使うよう変更しましょう。

### 2 HomebrewでGitのインストール　
```
%brew install git
%brew info git
==> git: stable 2.41.0 (bottled), HEAD
Distributed revision control system
```
Homebrew経由でインストールができたことが確認できました。

### 3 使用しているシェルの確認
```
echo $SHELL
/usr/local/bin/zsh
```
私のPCではzshを利用していることが分かりました。
### 4 vimで_zshrcを開いてhomebrewのパスを通す
```
export PATH=/usr/local/bin/git:$PATH  
```
を追記しました。　
### 5 シェルの再起動　
```
% exec $SHELL -l
```
### 6 Gitの現状再確認　
```
% git --version 
git version 2.41.0
```
Homebrew経由でインストールしたものに変更できました。　

## Gitの使い方　
### リポジトリの登録まで
#### 基本用語
**ワークツリー**
作業しているディレクトリのこと
**インデックス**
ワークツリーとリポジトリの間
**リポジトリ**
変更履歴を記憶する領域
*インデックスの存在意義　= 細かく編集履歴を残すことで、後で変更点が分かりやすくする* 

#### 1.ローカルリポジトリの登録
カレントディレクトリをgitリポジトリとして登録(ワークツリー)
```
git init
```
#### 2. インデックスへの追加　
ワークツリーで作成したファイルをインデックスに追加
```
git add "file名"　　　#一つのファイルを追加
git add .　          #全てのファイルを追加
```
#### 3. リポジトリへの追加 
インデックスに追加したファイルをリポジトリへ追加　
```
git commit -m "comments"
```
#### 4. 変更内容の確認 
```
git log
```
とりあえず、上記のステップでGitへの登録はできます。　

### ブランチの利用
詳しくはこちらのサイトで解説されています。

https://git-scm.com/book/ja/v2/Git-のブランチ機能-ブランチとマージの基本

ここでは、簡単に解説していきます。　
**branch**
履歴の流れを分岐して記録するためのもの。同じリポジトリ中で複数の変更を同時に進められる。
**merge**
分岐したbranchを他のbranchへ合流させる処理
**master branch**
branchの中でも最も安定した(開発の元となる)branchのこと　
#### 1.新しいbranchの作成
```
git checkout -b "branch名"
#以下の操作と同じ
git branch "branch名"
git checkout "branch名"
```


#### 2.新しいbranchでファイルの編集・commit
```
vim "編集用ファイル名"
git add  "編集用ファイル名"
git commit "編集用ファイル名" -m "comment"
```
#### 3.master branchへのmerge
元のbranch(master branch)に移動したのち、mergeしたいbranchに対して処理を行う。
```
git checkout master
git merge "branch名"
```

#### 4.不必要なbranchの削除
```
git branch -d "branch名"
```

#### 5.branchの確認
```
git branch -v      #存在しているbranchの確認
git branch status  #conflict時に使用
```
## 参考サイト　

https://blog.cloud-acct.com/posts/u-homebrew-git-install/

https://codezine.jp/article/detail/16559

https://www.youtube.com/watch?v=f4BRgGAXyek

https://git-scm.com/book/ja/v2/Git-のブランチ機能-ブランチとマージの基本
ABC304をPythonで解いてみたよ。(A～E問題)

[AtCoder Beginners Contest 306 (ABC306)](https://atcoder.jp/contests/abc306) をPythonで解きました。
見やすいコードを書く練習も兼ねてます。


# A - (TODO)
## 問題ページ

https://atcoder.jp/contests/abc306/tasks/abc306_a

## 考察


## コード
```Python

```

# B - (TODO)
## 問題ページ

https://atcoder.jp/contests/abc306/tasks/abc306_b

## 考察



## コード
```Python

```

# C - (TODO)
## 問題ページ

https://atcoder.jp/contests/abc306/tasks/abc306_c


## 考察

## コード
```Python

```

# D - (TODO)
## 問題ページ

https://atcoder.jp/contests/abc306/tasks/abc306_d


## 考察


## コード
```Python

```

# E - (TODO)
## 問題ページ

https://atcoder.jp/contests/abc306/tasks/abc306_e

## 考察

## コード
```Python

```
【UE5】MacにUnreal Engine 5.2をインストールしてみた

環境メモ
⭐️MacBook Pro(Apple M2 Pro)
⭐️macOS Ventura 13.4
⭐️Xcode 14.3.1
⭐️Unreal Engine 5.2

↓↓↓インストール完成
![スクリーンショット 2023-06-04 0.33.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/16cb2321-fea3-62f0-ccdb-405bbaae554d.png)

# 1.Epic GamesからUnreal Engine5.2をインストールする

Unreal Engine5.2の公式サイト
https://www.unrealengine.com/ja/blog/unreal-engine-5-2-is-now-available


Epic Gamesにログインし、ランチャーダウンロードする。
（前提として事前にEpic Games登録済み）

https://www.unrealengine.com/ja/download
![001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/785eae83-69f7-70b7-f43e-86dedfda3a9f.png)

# 2.Unreal Engine 5.2をインストールする

Unreal EngineのライブラリタブからUnreal Engine 5.2をインストールする
![002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/46787e7f-c5ec-9230-e72b-0b23761aaeaa.png)

現時点(2023/06/04)で最新版5.2.0を選びインストールする
![003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/74e043ab-71ba-13dd-83f5-710942cd6288.png)

ライセンス契約に同意する
![004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/48484fcd-09df-4f3b-72e6-6ae1c601df7b.png)

インストール場所を設定する（ここではデフォルト設定）
![005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/9fd0f29c-284d-c16d-fe17-788ab764d530.png)

# 3.Unreal Engine 5.2起動
Unreal Engine 5.2を起動する
![006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/25dbca94-6a1c-96d2-55bb-25ecf2618fbd.png)

# 4.Xcodeが必要
Xcodeをインストールしていない場合は、「Xcodeが見つかりません」のメッセージが表示された。
Xcodeをインストールしないと先に進めない

![007.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/034b755e-b664-ff28-e830-7ea34486012c.png)

# 5.Xcodeをインストールする
Apple Storeから最新版のXcodeをインストールする
https://apps.apple.com/jp/app/xcode/id497799835?mt=12
![スクリーンショット 2023-06-04 0.47.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/4629f7ac-7a71-2e79-d2ac-591c80dfd16e.png)

インストールが完了したら、先ほどのメッセージに「xcode-selectコマンドラインツールも実行します」と書いてたので
Xcodeを起動する時に、どのXcodeを指定して起動するのかなぁ。
なので、下記（起動時のXcodeのバージョンを切り替え）コマンドをターミナルで打つ

```
sudo xcode-select --switch /Applications/Xcode.app
```

# 6.Unreal Engine 5.2起動完了

もう一度「3.Unreal Engine 5.2を起動する」を実施する

![2002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/b4ee8096-a09e-eacd-f1cd-ee13b4ed79cf.png)

起動できた！！
![スクリーンショット 2023-06-04 1.04.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/faf8b424-f2ea-394f-1685-fbb96e487f55.png)


完了！！
補足。初期化された YAMAHA ルーター RTX1100, RTX1500, RT702e などを LANケーブルから設定する

# シリアルケーブルを持ってないので、シリアルポートを使わずにLANポートだけで初期化まで持ち込みます。

IPV6アドレスから、LANケーブル経由でアクセスすることで初期化状態のパスワード無しの環境に接続されます。

その基本的な方法は、ここに明記されています。
そのうえで、補足を。
[https://qiita.com/wakanayoshizawa/items/f90f173d15d0bf658a33](https://qiita.com/wakanayoshizawa/items/f90f173d15d0bf658a33)

__ルーターの初期化__
まず、リセットボタンを押しながら電源を入れると初期化されます。

__構成__
WIndows10/11のパソコンを使いました。
普通にLAN接続します。
対向の直結の場合は、パソコン側に固定のIPV4アドレスを付与しないと動きません。
<img width="400px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/866173/0b5f8ac2-43ad-905c-0556-acece16590e2.png" />

__LANポート__
LANポートは複数ありますが、MACアドレスを間違わなければ、どのポートにも接続できます。
LAN1に複数のポートがある場合、どのポートに刺しても接続できます。
<img width="400px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/866173/a44b9408-d8f8-f6ce-0c54-4afffaa4b7d0.jpeg" />

__LANポートごとのMACアドレス__
LAN1が、もっとも小さい値のMAC。
LAN2が、次に小さい値のMAC。
<img width="400px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/866173/f0707959-c50a-e870-7490-606ef8d84cc6.jpeg" />

__Windows側の準備__
Windows10/11のアダプター設定で、IPV6をONにしておきます。
Windowsの初期値は、IPV6はOFFです。
忘れずに。
<img width="400px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/866173/564f2a61-dab5-8e9b-7a77-c7b2d206b877.png" />

__IPV6の算出__
前出のサイトのとおり計算しますが、EXCELで計算できる式を用意しました。
以下のように、A1にMACアドレスを入力し、A2に計算式を貼り付ければ計算されます。
カギカッコは、IPV6アドレスを利用するときのお約束です。
<img width="400px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/866173/942ae509-54bb-1383-5211-38495fdd70a3.png" />

```excel:exel expression
="[FE80::"&LEFT(A1,1)&IF(MID(A1,2,1)="0","2",IF(MID(A1,2,1)="1","3",IF(MID(A1,2,1)="2","0",IF(MID(A1,2,1)="3","1",IF(MID(A1,2,1)="4","6",IF(MID(A1,2,1)="5","7",IF(MID(A1,2,1)="6","4",IF(MID(A1,2,1)="7","5",IF(MID(A1,2,1)="8","A",IF(MID(A1,2,1)="9","B",IF(UPPER(MID(A1,2,1))="A","8",IF(UPPER(MID(A1,2,1))="B","9",IF(UPPER(MID(A1,2,1))="C","E",IF(UPPER(MID(A1,2,1))="D","F",IF(UPPER(MID(A1,2,1))="E","C",IF(UPPER(MID(A1,2,1))="F","D",))))))))))))))))&MID(A1,3,2)&":"&MID(A1,5,2)&"FF:FE"&MID(A1,7,2)&":"&RIGHT(A1,4) & "]"
```

__実際の接続__
SSHは使えません。
telnetを使います。
tera termでも良いです。
Windows標準のtelnetを利用するときは、コントロールパネルから、telnetを追加インストールしておきます。

telnetで接続します。
![image1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/866173/29b5c650-3147-109c-5ae8-b4955e7b6e1e.png)

ENTERキーを一発
![image2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/866173/bd6011ed-f1fd-8de7-1f2d-4f0c59940051.png)

administrator、パスワード無しでログインできます。
適当なアドレスを付けて
これで、IPV4で接続できるようになります。

> administrator
> ip lan1 address 192.168.1.2/24 
> save
> restart

![image9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/866173/18441e64-577e-b2b2-8051-9723fba9bb1e.png)

ここまで。
BCASim（Blockchain Attack Simulator）：ブロックチェーンシミュレータを作成してみた！

# BCASim（Blockchain Attack Simulator）：ブロックチェーンシミュレータ

 BCASimはオープンソースのブロックチェーンシミュレータです。利用者はノードの動作シナリオとプロトコル特性を柔軟にカスタマイズすることができます。このカスタマイズによって、Double spending attack, Selfish mining, Sybil Attackなどを扱うことができます。

・[Github：BCASim（Blockchain Attack Simulator）](https://github.com/bcasim/bcasim)
![Animation.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293587/00eb6096-39c7-557a-71ec-631531fe6d91.gif)
# 特徴
* ノードの動作シナリオのカスタマイズ機能。
* 攻撃の再現に必要なブロックチェーンのデータ構造の再現。
* 合意形成や難易度調節、フォークチョイスルールなどの追加。
* ネットワーク構造とブロックチェーン構造の可視化。



## クイックスタート
```
$ git clone https://github.com/bcasim/bcasim
$ cd bcasim
$ mvn clean install
$ mvn compile
$ java -cp target/bcasim-0.0.1-SNAPSHOT.jar src/main/java/jp/kota/bcasim/main/Main.java
```

## 利用方法の詳細

詳細はドキュメントを確認ください。
シミュレーションパラメータや攻撃シナリオのカスタマイズ方法についてまとめています。
・[English document](https://github.com/bcasim/bcasim/blob/main/docs/english/doc.md)
・[日本語ドキュメント](https://github.com/bcasim/bcasim/blob/main/docs/japanese/doc.md)


## 実験例
以下はシミュレータを利用して行った実験の例です。画像の実線は理論値、バツはシミュレーション結果をプロットしています。左はDouble Spending Attackの攻撃成功確率を対象にした実験です。右はSelfish Miningノードのブロック生成割合を対象にした実験です。

|Double Spending Attack|Selfish Mining|
|---|---|
|![plot1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293587/4ea86f06-3886-1543-5e15-21ac4e14d992.png)|![plot2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293587/3d34e27d-ad72-9770-43e9-88c284e77a74.png)|

## デモ動画
BCASimのシミュレーション結果を可視化したデモです。このデモは関連プロジェクトである[BCASim Visualization](https://github.com/bcasim/bcasim-visualization)ツールによって実現されています。
<br>
![Animation1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293587/00c2eb16-468c-cf03-096b-d06a5c57f20c.gif)


## BCASimの関連プロジェクト
* [BCASim](https://github.com/bcasim/bcasim) - 攻撃分析のためのブロックチェーンシミュレータ
* [BCASim Visualization](https://github.com/bcasim/bcasim-visualization) - BCASimのシミュレーション結果の可視化ツール

## 著者
質問や意見などがございましたらこちらまでお気軽にご連絡ください。

* bigmakiinum@outlook.jp