OmniAICreator/Qiita-1.07M huggingface dataset:
アルゴリズム：Java　三角形が作れるかどうかの判定。

## 参考文献
参考: [プログラミングコンテストチャレンジブック [第2版]　～問題解決のアルゴリズム活用力とコーディングテクニックを鍛える～](https://www.amazon.co.jp/dp/B00CY9256C/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)

https://www.amazon.co.jp/dp/B00CY9256C/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1

#三角形が作れるかどうかの判定。
n本の辺をがある。そこから３本選んで最も周の長さが長い三角形の時のその長さを求める。
なお、三角形が作れないときは0を出力。
例　入力　n=5; a=[2,3,4,5,10]; 　出力 12

```java:triangle.java
import java.util.*;
public class Triangle{

	static void triangle() {
		Scanner std = new Scanner(System.in);
		long n = std.nextLong();
		long answer = 0L;
		long[] a = new long[100];//辺の本数は最大で100本
		for(int i = 0; i<n; i++) {
			a[i] = std.nextLong();
		}
		for(int i = 0; i<n; i++) {
			for(int j = i+1; j<n; j++) {
				for(int k = j+1; k<n; k++) {
					long length = a[i]+a[j]+a[k];//周の長さ
					long max = Math.max(a[i], Math.max(a[j], a[k]));//最も長い辺の長さ
					long others = length - max; //他の２辺の長さの和
					
					if(max < others) {
						//answer = length; 2021年10月17日間違い
                        answer = Math.max(answer,length);//2021年10月18日更新。
					}
				}
			}
		}
		System.out.println(answer);
	}
	
	public static void main(String[] args) {
		triangle();
	}
}
```

#Ants
長さLcmの竿の上をn匹のアリが毎秒1cmのスピードで歩いています。アリが竿の端に到達すると竿の下に落ちていきます。また、竿の上は狭くてすれ違えないので、二匹のアリが出会うと、それぞれ反対を向いて戻っていきます。各アリについて、現在の竿の左端からの距離x[i]はわかりますが、どちらの方向を向いているのかはわかりません。すべてのアリが竿から落ちるまでにかかる最小の時間と最大の時間をそれぞれ求めなさい。
例 入力　L = 10 ; n = 3 ; x= [2,6,7]; 出力　min = 4 max = 8 

```java:Ants.java
import java.util.*;
public class Ants{
	static void ants() {
		Scanner std = new Scanner(System.in);
		//棒の長さ
		System.out.print("L = ");
		int L = std.nextInt();
		//アリの数
		System.out.print("n = ");
		int n = std.nextInt();
		int x[] = new int[n];
		//アリの位置
		System.out.print("x[] = ");
		for(int i=0; i<n ; i++) {
			x[i] = std.nextInt();
		}
		
		//最小の時間
		int minT = 0;
		for(int i=0; i<n; i++) {
			minT = Math.max(minT, Math.min(x[i], L-x[i]));
		}
		//最大の時間
		int maxT = 0;
		for(int i=0; i<n;i++) {
			maxT = Math.max(maxT, Math.max(x[i], L-x[i]));
		}
		
		System.out.println("min = "+minT);
		System.out.println("max = "+maxT);
	}
	public static void main(String[] args) {
		ants();
	}
}

```
情報セキュリティマネジメント試験(SG)　勉強メモー01：セキュリティの基礎

情報セキュリティマネジメント試験向けに、セキュリティ初心者が用語をまとめるための勉強メモです。
特にためになるような内容はありません。

#情報セキュリティの要素
## 情報セキュリティの3大要素
頭文字をとって、「CIA」という呼び方をする。

* 機密性（Confidentiality）：許可のない人にはアクセスをさせない
* 完全性（Integrity）：内容が正しい
* 可用性（Availability）：使いたいときに使える

## その他の要素(4つの新要素)
* 否認防止(non-repudiation)
* 真正性(Authenticity)
* 責任追及性(Accountability)
* 信頼性(Reliability)


これらの性質を確保するために対策を体系的に考えていくことを「情報セキュリティマネジメント」という。

#マルウェア
ユーザーのデバイスに不利益をもたらす悪意のあるプログラムやソフトウェアを総称してマルウェアという。

## 代表的なマルウェア
* ウィルス：プログラムファイルの一部を悪意のある内容に書き換えるマルウェア。自己増殖することもできるが、ウィルス単体では存在することが出来ず、プログラムの一部を改ざんして入り込み、分身を作って増殖する。
* ワーム：ウィルスと同様に自身を複製させるマルウェアだが、単独で存在することが出来るもの。ネットワークに接続しただけで感染するものも多い。
* トロイの木馬：一見すると問題のない画像・文章などのファイルやスマートフォンのアプリに偽装し、デバイス内部へ侵入、外部からの指令によって問題を起こすマルウェア。
* スパイウェア：本人も気遣いないうちにPCなどのデバイスにインストールされ、ユーザの個人情報・アクセス履歴などを収集するマルウェア。
    * キーロガー：キーボードの入力内容を外部に流出させる手法。スパイウェアと組み合わせて使われることが多い。
* ランサムウェア：対象のコンピュータ内で不正な挙動を起こし、身代金を要求する手法。

## その他合わせて覚えておきたい用語
* ルートキット(rootkit)：不正アクセスをした証拠を隠滅するためのツール。
* バッグドア：裏口を作る仕組み。
* ボット：コンピュータを外部から遠隔操作するためのウィルス。
    * ボットネット：ボットに感染したコンピュータを束ねてネットワーク化したもの。
    * C&Cサーバ(Command and Control server)：ボットネットに指令を送ったり制御するサーバー。

# 攻撃・不正行為

##代表的な手法
* ソーシャルエンジニアリング：人間心理に付け込んで情報を聞き出す方法。非技術的。
    * 典型的な例）電話で聞き出す
* フィッシング：偽サイトに誘導するなどし、誘導先で情報を聞き出す方法。
* 標的型攻撃：特定の組織を対象に情報を聞き出す方法。
    * 典型的な例1）〇〇部〇〇様のように対象を絞り込みメールを送り、信用させる。
    * 典型的な例2）よく行くサイトを絞り込み、サイトを改ざんする。改ざん先でドライブバイダウンロードさせるなどして情報を盗む。(水飲み場型攻撃)

##代表的な攻撃方法
* SQLインジェクション：SQLを利用して、意図せぬ動作を起こす。
* ディレクトリトラバーサル：脆弱性がある状態のコンピュータでディレクトリのパスを利用して管理者の意図しないディレクトリにアクセスする。
* クロスサイトスクリプティング：不正なコード(javascriptなど)を掲示板などのWEBサイト上で公開させることで第3者のブラウザ上で悪意のあるコードを実行させる。

## その他関連用語
* ポートスキャン：利用しているポートを調査すること。
* ゼロデイ攻撃：OSなどで脆弱性が見つかった際に、対策が行われる前に攻撃を行う攻撃。


# 参考サイト
https://business.ntt-east.co.jp/content/cloudsolution/column-167.html

https://www.ntt.com/business/services/network/internet-connect/ocn-business/bocn/knowledge/archive_19.html

https://eset-info.canon-its.jp/malware_info/trend/detail/150120_3.html
geojson-vt（GeoJSON ファイルをクライアントサイドでベクトルタイル化し表示）

こんにちは
[geojson-vt](https://github.com/mapbox/geojson-vt) とは、中大量位置情報データを地図上表示する有力な手段の一つです。

* GeoJSON ファイルをクライアントサイドでベクトルタイル化することで、処理・表示速度を上げています。

### 参考サイト

* [geojson-vt](https://github.com/mapbox/geojson-vt) (GitHub)
* [Rendering big geodata on the fly with GeoJSON-VT](https://blog.mapbox.com/rendering-big-geodata-on-the-fly-with-geojson-vt-4e4d2a5dd1f2) (blog.mapbox.com)
* 「[Many Polygons with geojson-vt on Leaflet](http://bl.ocks.org/Sumbera/c67e5551b21c68dc8299)」 (∫∪∧∴∋∈⊇∧’s Block)
* 「[GeoJSONをフロントエンドでベクトルタイル化して表示する。](https://gunmagisgeek.com/blog/leaflet-js/5574)」 (GUNMA GIS GEEK)

### 表示例
事例のサンプルソースに従い表示させた例です：
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54617/23c326bf-57aa-9124-f5e8-234a3f2edfee.jpeg">
暗号化技術・暗号方式について

# はじめに
本記事では、`暗号`について記述します。

# 暗号化
データを一定の規則に従って、
`第三者に容易に解読できない`ようにすることす。
暗号化することで、通信経路上でのデータの盗聴を防ぐことができます。

対して、
暗号化したままでは誰もデータの中身を読めないため、
`暗号化されたデータを元に戻す`復号も必要になります。
つまり、`暗号化した後、復号化が発生します`。

復号には、`鍵`というものが必要になります。
この鍵は、データを暗号化した際に一緒に作られます。
作られた鍵を使って、暗号化したデータを復号します。


# 共有鍵暗号方式(AES)
暗号化鍵と復号鍵が共通の`同じ秘密鍵を使う`方式です。

*平文とは、暗号化されていないデータのことです。暗号化されたデータを暗号化と言います。

```
[送信側]
平文
↓暗号化（暗号化鍵、共通の秘密鍵）
暗号文
↓復号(復号鍵、共通の秘密鍵)
平文
[受信側]
```

暗号化鍵は盗まれないようにする必要があります。

`復号と同一の鍵`を使っていることから、
盗まれてしまうと、暗号化していても、復号されてしまいます。

そのため、鍵を安全に配布するための工夫が必要であることから、
`不特定多数の相手`とのデータやりとりには`不向き`です。

メリットとして、ファイルやデータの暗号化にかかる`処理速度が早い`です。

# 公開鍵暗号方式
一方の鍵を公開する暗号方式です。
暗号化鍵と復号鍵が`異なります`。

```
[送信側]
平文
↓暗号化（暗号化鍵、　受信者の公開鍵）
暗号文
↓復号(復号鍵、受信者の秘密鍵)
平文
[受信側]
```

イメージは、`南京錠`です。
誰でも閉めることができるけど、鍵は持っている人しか開けられない。

鍵を受信者が公開していることから、
安全に鍵を配布することができ、共通鍵暗号方式とは違い、
`不特定多数の相手とデータのやりとりをすることに向いています`。

しかし、暗号化や復号には時間がかかります。

# ハイブリッド鍵暗号方式
`共通鍵暗号方式`と`公開鍵暗号方式`を`組み合わせた方式`です。

```
①送信者が「共通鍵」を作成します。

②送信者が作成した「共通鍵」を、受信者の公開鍵で暗号化して受信者あてに送信します。

③受信者が、送信されてきた「共通鍵」を受信者の秘密鍵で復号します。
→ここで受信者は「共通鍵」が手に入ったので、両者が「共通鍵」を持っていることになります。

④これ以降は、データを「共通鍵」で暗号化したり復号したりしてやりとりを開始します。
```

以上です。

# 終わりに
基本的にハイブリッド鍵暗号方式を採用することが良いと思われます。
他に暗号について知識を身につけたらアウトプットする予定です。

以下参考サイトです。
[共通鍵暗号方式(AES)と公開鍵暗号方式(RSA)との違いを解説！](https://cybersecurity-jp.com/column/53774)

明日も頑張ります！
CSVファイルをJSONファイルに変換する ~ pythonの場合 ~

- CSVファイルをJSONファイルに変換する
- 出力ファイル名とインデントの数(半角スペースの数)をパラメータで設定したい

### コード
こちらのサイトのものを改造させていただきました
https://hktech.hatenablog.com/entry/2018/09/10/235725


``` python
import json
import csv
import click
import os


@click.command()
@click.argument('in_file')
@click.option('--out_file', '-o', default='', help='Output JSON file')
@click.option('--indent', '-i', default=0, help='JSON indent')
def main(in_file, out_file, indent):

    # CSV ファイルの読み込み
    json_list = []
    with open(in_file, 'r') as f:
        for row in csv.DictReader(f):
            json_list.append(row)

    # JSON ファイルへの書き込み
    out_file = get_outfile_name(in_file, out_file)

    with open(out_file, 'w') as f:
        if indent == '':
            json.dump(json_list, f, ensure_ascii=False)
            # 非ASCII文字(日本語とか）が含まれている場合に
            # そのまま出力するには ensure_ascii=Falseを指定します。
        else:
            json.dump(json_list, f, indent=indent, ensure_ascii=False)

# 出力ファイル名設定
# out_fileが未指定の場合はin_fileの拡張子をjsonに変更したものとする
def get_outfile_name(in_file, out_file):
    if out_file == '':
        return os.path.splitext(os.path.basename(in_file))[0] + '.json'
    else:
        return out_file

if __name__ == '__main__':
    main()
```

### 実行結果
入力ファイル

```
"id","name"
1,"foo"
2,"baa"
```

インデント無し、ファイル名未指定

``` shell
$ python3 main.py sample.csv
```
``` json
# sample.json
[{"id": "1", "name": "foo"}, {"id": "2", "name": "baa"}]
```

インデント4 ファイル名指定

``` shell
$ python3 main.py sample.csv -o output.json -i 4
```
``` json
# output.json
[
    {
        "id": "1",
        "name": "foo"
    },
    {
        "id": "2",
        "name": "baa"
    }
]
```
### 補足
- いちいちpythonコマンドで実行するのは面倒なので、poetryを使ってパッケージ化 & pip installしてどこからでも使えるようにしています。
javascript演習　2日目、３日目/３０日

覚えたことたち

1秒ごとに１度回転させる


```javascript
const now = new Date();

const seconds = now.getSeconds();
const secondsDegree = ((seconds / 60) * 360);
secondHand.style.transform = `rotate(${secondsDegree}deg)`;

```



ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー


ドキュメントのルート要素にcssの変数を設定する

```css
:root {
  --base: #ffc600;
  --spacing: 10px;
  --blur: 10px;
}

img {
   padding: var(--spacing);
   background: var(--base);
   filter: blur(var(--blur));
}
```


javascriptでhtmlタグのアトリビュートを操作する

```javascrit
//<audio data-key="80">とかのタグをdata-keyで絞り込む
const audio = document.querySelector(`audio[data-key="${e.keyCode}"]`);

//<input data-sizing="px">とかのタグのdata-sizingを取得する
const suffix = this.dataset.sizing || '';

```


ドキュメントのルート要素にcssスタイルをjavascritでつける
これでルートにつけたcssの変数をリアクティブに変更できる。

```javascrit
document.documentElement.style.setProperty(`--${this.name}` , this.value + suffix);
```
vs codeでautoprefixerを使用する setting.jsonも使用して

vs codeを使用し、autoprefixerを使えるようになりましょう。

autoprefixerは、自動的にベンダープレフィックスを描いてくれるもの。

なので、ieやedge(多分)などの別ブラウザ対応のcssを描いてくれるものだって。便利だねー

使用するにはプラグインをinstallしてから、設定をいじります。
settings.jsonというファイルを開きます。

基本設定 > 設定から開きます。
macなら `command + ,`で設定を開きます。
入力欄にsettingと入力。
setting.jsonを編集とどこかに出てくればクリック。

参考：https://qiita.com/y-w/items/614843b259c04bb91495

setting.jsonが開けたら、

```
'autoprefixer.options':{
  'browser':[
    'last 4 versons',
    'ie >=9',
    '> 5%'
  ]
}

```
と入力する。
多分、最新から4version対応でieはversion9以上対応 という意味っぽい。

vs codeのプラグイン autoprefixerをinstallしても動かなった場合に以上の設定を試してみてください。
自分はこれで一旦は動きました。

参考：https://dewcodes.com/tutorials/automatically-add-css-vendor-prefixes-using-visual-studio-code/
TDDで電卓を作ってみた

# はじめに

[前回](https://qiita.com/mickie895/items/f5079f7b6683e71a8381)、Javaの勉強会の資料を作った話をした。
そこで出した、一昔前にはGUIアプリケーションのサンプルの定番だった「電卓」、それをできるだけ丁寧に実装できないか試してみた。

# 結果

せっかくTDDで少しづつ実装するのだから、実装していった過程を日記形式にしてみました。

https://note.com/mickie895/m/m0671be86f61a

そして実際にコーディングした結果がこちら。

https://github.com/mickie895/swing_calc_for_education

# 工夫した部分

* 前回から準備していた、GUI部分と計算部分の処理の分離。
    * GUIはGUIの実装と、計算機能にテキストを送り、結果を受け取っているだけのクラスにした。
* switch文を極力減らす。よくあるサンプルではswitch文にする計算処理はHashMapとクラス化によって振る舞いを分離。
    * クリア周りが実質switch文により実装している状態なのは現時点での課題。
* できるだけ、「オブジェクト指向エクササイズ」に従う状態にしてみた。
    * 実際にエクササイズに従う形にすることより、意識することによりリファクタリングを頻繁に行うようにしたことに意味があったように感じる。

# 今後について

TDDで電卓の実装はここで一旦区切り、他のネタを考えることにする。

なにか「昔はサンプルとして作られていた」ようなサンプルってないかなぁ。
Makefileでできることをすべて列挙してみた

毎日のように1つのMakefileだけで50Mバイトぐらい自動生成しているなのたんです。

Makefileでできるすべてを知る限り列挙してみました。

###makeコマンドはプログラム開発ツールではなく、並列依存解決ツールとして考える

もちろんプログラムを作るにあたっても、ソースコードやライブラリ、ドキュメント等に依存関係ができます。

しかし、それ以外にも以下のようなことにも使えます

・単なる自動画像加工
・OSのビルド
　さすがにOSのビルドについては既にMakefileが定義されています。
・定義されたソースファイルを元に作曲（MIDIファイルやWAVファイルの生成、MP3等への変換）
・テキストにルビをつける
・APIを利用したインターネットの自動検索
・シングルスレッド計算における容易なマルチスレッド実行
・圧縮
・画像・動画変換
・気象状況等の並列計測（要専用ハードウェア）

これだけではまだ語りきれない、古くからある夢のツールとも言えます。


###Makefileにすれば、なんでも実質上のマルチスレッドみたいになる。

	make -j (数字)

Makefileさえかければ、この非常に単純なマジックで、
同時実行プロセスを設定できます。

今のうちの場合、Ryzen7 3700X DDR4-3200メモリですので
8コアにSMTがあって

	make -j 16

とすべきなんですが、
実際はmakeコマンドやOS側の余剰があり、更にスレッドが実行できて、CPU時間がもったいないので

	make -j 20

としています。

###Makefileのターゲットファイルは何個もあってもよい

今手持ちのMakefileを確認したら、74538個もターゲットがありました。

こんなにターゲットがあっても make コマンドはとても軽快に実行してくれます。

###perl版 簡易Makefile生成スクリプト（画像加工用）
	#!/usr/bin/env perl
	my @maketarget;
	my @makecmd;
	my $makefile="Makefile";

	foreach my $loop(@なにかのループ)
		my $target=<<EOM;
	(tab)	$loop \
	EOM
		my $cmd=<<EOM;
	$loop: $loop.src
	(tab) (command) $loop.src > $loop

	EOM
		push(@maketarget, $target);
		push(@makecmd, $cmd);
	}

	open(my $fh, ">$makefile") || die "Can't write $makefile\n";
	print $fh "all: \\";
	foreach(@maketarget) {
		print $fh "$_\n";
	}
	print $fh "\n";

	foreach(@makecmd) {
		print $fh "$_\n";
	}
	close($fh);


###実際の画像自動加工、画像変換のスクショ例

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149448/30f47be8-9eaf-de37-6e03-484e1b27b0da.png)


###さいごに
自分の環境で動かすのであれば、プログラムのマルチスレッド化よりも非常に容易ですので、ぜひ試してみて下さい。
【rails × vue】 ライブラリでフラッシュメッセージを表示する

rails×vueでポートフォリオ作成中の初学者の備忘録です。
vue上でフラッシュメッセージを表示できるライブラリの紹介です。

#vue-flash-messageのインストール

https://www.npmjs.com/package/@smartweb/vue-flash-message/v/next
こちらのサイトからインストールできます。

```
npm i @smartweb/vue-flash-message@next
```
もしくは

```
yarn add  @smartweb/vue-flash-message@next
```

エントリーファイルは下記の通りです。

```application.js
import FlashMessage from '@smartweb/vue-flash-message';
const app = createApp(App);
app.use(FlashMessage);
```

#使い方

ユーザー登録フォームを送信し、成功ならルートURLにアクセス、成功メッセージの挿入、失敗ならページ遷移はせずに失敗メッセージを表示する場合を想定した場合の書き方です。

```Singup.vue
.
.
.
.
 methods: {
      createUser: function () {
        axios.post('/api/users', {
          user: this.user
        })
        .then(response => {
          this.$router.push({ path: '/'}),
          this.$flashMessage.show({
            type: 'success',
            title: 'ユーザー登録が完了しました。',
            text:'アカウント有効化メールを送信しました。',
            time: 5000
          });
        })
        .catch(err => {
            this.$router.push({ path: '/users/new'}),
            this.$flashMessage.show({
              type: 'error',
              title: 'ユーザー登録に失敗しました',
              text: '入力内容に誤りがある可能性があります。',
              time: 5000
            });
        })
      }
    }


```

```
 this.$flashMessage.show({
              type: //メッセージの種類,
              title: //タイトルメッセージ,
              text: //メインメッセージ,
              time: //メッセージを表示する時間
            });
```

this.$flashMessage.showでメッセージの挿入が行えます。

[type:]には４種類のメッセージタイプから選択できます（success, error, info,warning)。

実際の表示はこちらから確認できますhttps://smwbtech.github.io/vue-flash-message/

title欄は省略可能です。

textにはメッセージ内容を挿入できます。

time欄も省略可能ですがメッセージをクリックすればデフォルトで消える仕様になっています。
react-router-domのルーティングについて

# はじめに
今回は業務でルーティングで躓いたので、それについて深掘りをしていきたいと思います。

react-router-domのルーティングで詰まった人の役に立てば幸いです。

# TL;DL

- ルーティングは上から行われていく。
- 上に```/about```があると下の```/about/1```にアクセスしようとしたら```/about```に飛ぶ
- それを避けるには```exact```というプロパティを使用する


# 開発環境
| ライブラリ |   バージョン     |   
|---:|-------------|
| React  |    17.0.2         |          
| typescript |4.1.5|      
| react-router-dom |^5.3.0"|

# 詳細

恐らくNextなどを使わずにReactで開発する時にルーティングのためにreact-router-domを使うことがしばしばあると思います。

その際、ただルーティングを書いても思った通りに動かないことがあります。

例えば以下のようなコードで```/about/1```にアクセスすると何が表示されるでしょうか？

[デモはこちらから](https://isxiw.csb.app/)

```tsx
<Switch>
  <Route path='/about'>
    <h1>aboutTop</h1>
  </Route>
  <Route path='/about/1'>
    <h1>about1</h1>
  </Route>
  <Route path='/'>
    <h1>top</h1>
  </Route>
</Switch>
```

この場合だと**about**が表示されます。

なぜなら```/about/1```にアクセスすると1番上の```/about```と重なり、そこでルーティング処理が終わってしまうからです。(部分一致)


これを避ける方法は2つあります。


## 対処法1


```/about/1 ```を```/about```より先に記述する。

こうすることで先に```/about```される前にルーティングを行うことで回避できます。


```jsx
<Switch>
  <Route path='/about/1'>
    <h1>about1</h1>
  </Route>
  <Route path='/about'>
    <h1>aboutTop</h1>
  </Route>
  <Route path='/'>
    <h1>top</h1>
  </Route>
</Switch>
```

## 対処法2

プロパティ```exact```を使用する。

今回最も解説したかったのはこちらの方法です。

``exact``というプロパティを使用することで部分一致でもルーティングされていたものを完全一致でないとルーティングされないようにすることができます。

```jsx
<Switch>
  <Route exact path='/about'>
    <h1>aboutTop</h1>
  </Route>
  <Route path='/about/1'>
    <h1>about1</h1>
  </Route>
  <Route path='/'>
    <h1>top</h1>
  </Route>
</Switch>;
```

[ドキュメント](https://reactrouter.com/web/api/Redirect/exact-bool)


# まとめ
react-reouter-domのルーティングについてまとめました。

率直に言うと、そこまで難しいことではなかったと思います。ただすぐに引き出せるようにしておかないと意外と悩んだりします。

ご自身のプログラミングノートにメモ、もし良ければQiitaのLGTM・ストックなどをして、すぐに引き出せるようにしておくことをオススメします！

今回のコードのリポジトリはこちらです。
https://github.com/u-Hoshi/React-practice/tree/master/react-router-dom-exact

# 参考文献
- [react-router](https://reactrouter.com/core/guides/quick-start)
MapView 逆ジオコーディング　

#今回の内容

* MapViewに取得してきた緯度や経度を利用して、表示する内容を決める。

#コードと簡単解説

* `MKCoordinateSpan(latitudeDelta: 0.01, longitudeDelta: 0.01)`でMapViewに表示される範囲の倍率を設定します。

* `MKCoordinateRegion(center: locationCordinate, span: mapSpan)`でMapViewに表示する内容を設定します。

* `.setRegion(coordinateRegion, animated: true)`で設定してきた内容をMapViewに表示する。

```Swift:

import MapKit

           ~~~~~~~~~~省略~~~~~~~~~~

    @IBOutlet weak var mapView: MKMapView!

           ~~~~~~~~~~省略~~~~~~~~~~

        let locationCordinate = CLLocationCoordinate2DMake(取得してきた値など(緯度), 取得してきた値など(経度))
        
        let mapSpan = MKCoordinateSpan(latitudeDelta: 0.01, longitudeDelta: 0.01)
        
        let coordinateRegion = MKCoordinateRegion(center: locationCordinate, span: mapSpan)
        
        mapView.setRegion(coordinateRegion, animated: true)

```

# 終わり
ご指摘、ご質問などありましたら、コメントまでお願い致します。
notionの独自ドメインアクセス時のエラー

notionのページURLを独自ドメインに置き換えている時、独自ドメインでアクセスしようとすると「Mismatch between origin and baseUrl (dev).」というエラーが出てしまう時の対処法。

主な原因はエラーメッセージ通り、元のURLと独自のURLが一致してないことです。

なお、私はCloud FlareとFruitionを使用して独自ドメインに置き換えてました。

##1.　notionの元のリンクが変わった
理由はわからないんですが、``https://www.notion.so〜``だったリンクが独自ドメインに置き換えてしばらくしてから``https://efficacious-flare-b6f.notion.site/〜``に変わっていた・・・

なので、[Fruition](https://fruitionsite.com)にアクセスして
少しスクロールし、GetStarted > Step2　の部分で独自ドメインと正しい元のURLを貼って**COPIED**をクリック
![スクリーンショット 2021-10-17 23.12.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722227/97fb3c88-89a1-11fd-14c0-fb90bf82c2e9.png)


[Cloudflare](https://www.cloudflare.com/hp/)にアクセスしてログインして

赤枠を選択
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722227/064637f4-d506-0163-79f7-db0abe30bebb.png)

Workersを選択し、Workersを管理するに進む
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722227/f4947fc1-4479-2aec-4183-6a6ae8cb0771.png)

赤枠を選択
![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722227/56997ce0-5344-fd93-c7b5-7b09f2b0fddb.png)

クイック編集
![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722227/05ebc6b3-ceab-8a21-d85f-024f3ed37d20.png)

赤枠部分を全て削除し、さっきコピーしたのをペースト
![05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722227/dd39d5f8-7bc6-9c8f-8561-285cd12bc9ba.png)


これで直りました

##2. Twitterやインスタに設定しているリンクがおかしい
上記の方法で直しても、Twitterなどのプロフィールに独自ドメインをおいている場合、そこからアクセスするとエラーが直りませんでした。これは単純に、``https://hoge.jp`` と設定してしまったためです。1でFruitionで行った設定では``hoge.jp``と設定しました。この違いのせいでエラーが出ていたようです



以上です。エラーが出てもOKを押せばアクセスできますが、ワンクッション挟まるのが嫌だったので直しました。
React+Material UIにおける、ボタン押下時の@keyframesアニメーション②

# 初めに
ボタン押したときにkeyframeで設定しているアニメーションを発動
①と違って、ページ表示時にアニメーションが動きません

# こんな感じのもの
ボタンを押すと、領域が拡大or縮小します


# コード
``` react
import { useState } from "react";
import { Box, Button } from "@material-ui/core";
import { makeStyles } from "@material-ui/core/styles";

// classオブジェクト定義
const useStyles = makeStyles(() => ({
  // 開閉共通のclass(jsx側に設定)
  commonItem: {
    backgroundColor: "#ff0000",
    width: "200px",
    height: "120px", // 初期値
  },
  // 開いているときのclassオブジェクト(jsx側に設定)
  openedItem: {
    animation: `$openEffect 1000ms`, // 1000ミリ秒
    height: "120px",
  },
  // 閉じているときのclassオブジェクト(jsx側に設定)
  closedItem: {
    animation: `$closeEffect 1000ms`, // 1000ミリ秒
    height: "40px",
  },
  // 開く時の動作
  "@keyframes openEffect": {
    "0%": {
      height: "40px",
    },
    "100%": {
      height: "120px",
    },
  },
  // 閉じるときの動作
  "@keyframes closeEffect": {
    "0%": {
      height: "120px",
    },
    "100%": {
      height: "40px",
    },
  },
}));

// コンポーネント
const TestContents = () => {
  // classオブジェクト生成
  const classes = useStyles();
  // 開閉のフラグ
  const [isOpen, setIsOpen] = useState(false);
  // クラスオブジェクト切り替え
  const [toggleClass, setToggleClass] = useState(null);
  // エリア切り替え
  const ToggleArea = () => {
    if (isOpen) {
      setToggleClass(classes.openedItem);
    } else {
      setToggleClass(classes.closedItem);
    }
    setIsOpen(!isOpen);
  };

  return (
    <>
      {/* 開閉、共通のclassを設定 */}
      <Box className={[toggleClass, classes.commonItem]}>
        {/* 開閉ボタン(設定値と逆のフラグを設定) */}
        <Button onClick={() => ToggleArea()}>開閉</Button>
      </Box>
    </>
  );
};

export default TestContents;
```

# 最後に
ところどころ変数化した方が良い値はあるけど、そこはウマいことやってもらえれば、、、
初回、勝手に動く方が機能を認識できて良いのかも、、？
【Mac】VirtualBoxを使ってCentOS7のWEBサーバー構築

エンジニアの方から「これはできた方がいい」ということで、WEBサーバー構築を始めてやったのですが、途中詰まったところがありながら構築に成功したので、備忘録がてら書いていきたいと思います。
Linuxのコマンドやvimの操作に不慣れな部分があったのですが、その練習にもなったので良かったです！

## 1 VirtualBoxをインストール

[こちら](https://www.virtualbox.org/wiki/Downloads)にアクセスして、VirtualBoxをダウンロードします。

![スクリーンショット 2021-10-14 10.58.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/952495/3dfb748b-eff7-fb1d-89e4-03ed55c3b855.png)

「OS X hosts」をダウンロード。

## 2 CentOSをインストール
## 3 VirtualBoxを開いて、CentOSをインストールする
下記記事を参考に対応しました。

https://gyroibaraki.com/virtualbox_centos_install/

### VirtualBoxを起動のタイミングでエラーが出た

VirtualBoxの設定をした上で「起動」を押すと
「Kernel driver not installed(rc=-1908)」というエラーが表示された。

調べたところ、これはMac側のセキュリティの問題のようなので
Macの「システム環境設定」→「セキュリティとプライバシー」から、
下の方にある「ソフトウェアの読み込み」を許可しなければならない。

これはVirtual Boxをインストールして30分以内でないと表示されないそうなので
30分以上経過して表示されなくなってしまった場合は、
VirtualBoxを再度インストールしなければならない。

「許可」を押すことで、上記エラーは解決しました。


## 4 WEBサーバーを構築
下記記事を参考にしながら、対応しました。

https://gyroibaraki.com/virtualbox-web-server/



### インターネット接続のエラーが出た

無事VirtualBoxの起動もでき、

```
$ sudo yum install httpd
```
を実行したところ、下記のようなエラーが発生しました。

```
sudo yum install httpd could not retrieve mirrorlist
```

調べたところ、DNS設定がうまくいっていないようでした。
下記コマンドを実行して、設定するネットワークファイルの名前を確認。

```
$ ls /etc/sysconfig/network-scripts/ifcfg-*
/etc/sysconfig/network-scripts/ifcfg-enp0s3  /etc/sysconfig/network-scripts/ifcfg-lo
```
enp0s3という名前であることがわかったので、
下記コマンドでインターネット接続されているかを確認。

```
$ ip addr show
```
本来なら先ほど確認したenp0s3という文字が表示されるはずだが、
表示されなかったので、インターネットに接続されていないようだった。
なので、先ほどのネットワークファイルを編集していく。

```
$ sudo vi /etc/sysconfig/network-scripts/ifcfg-enp0s3
TYPE=Ethernet
PROXY_METHOD=none
BROWSWE_ONLY=no
BOOTPROTO=dhcp
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6__FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=enp0s3
UUID=***
DEVICE=enp0s3
ONBOOT=yes
DNS=8.8.8.8
GATEWAY=XXX.XXX.XXX.XXX
IPADDR=XXX.XXX.XXX.XXX
NETMASK=XXX.XXX.XXX.XXX
```
私の場合は「DEVICE」から下の表示の部分がなかったので、追加しました。
ホストOS（自分のPC）のIPアドレスは、「システム環境設定」→「ネットワーク」→「詳細」→「TCP/IP」タブから見ることができます。
``GATEWAY``にはルーターのアドレス、``IPADDR``にIPv4のIPアドレス、``NETMASK``にはネットマスクのアドレスを入力すればOKです。
あとは``ONBOOT``は初期はnoになっていたので、yesに変更しました。

追記できたら、修正を保存します。

あとは[こちら](https://qiita.com/ponsuke0531/items/7e69155e1a2258d444c9#2-networkmanager%E3%82%92%E5%8B%95%E3%81%8B%E3%81%AA%E3%81%84%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B)の部分を参考にしながら、NetworkManagerを動かないように設定。

設定終了後、再度

```
$ sudo yum install httpd
```
を実行したところ、エラーは解消されました。


## 成功！

![スクリーンショット 2021-10-14 11.35.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/952495/16790ea6-9652-2733-847d-885d36673832.png)

自分のPCで　``http://XXX.XXX.XXX.XXX`` と入れて、
このような画面が表示されたので、無事WEBサーバーの構築をすることができました！
アルゴリズム備忘録

※zennに移行
https://zenn.dev/luke256/scraps/96519300fc3ce4

# トポロジカルソート
(前提:多重辺なし)
入力数0の頂点をqueなどで管理(優先度付きで辞書順)しながら答えに追加。その頂点から出る辺の目的地の入力数を全て-1して、そこで入力数が0になったらqueに追加。
queが空になった時に、まだ入力数がある頂点があったらトポロジカルソート不可。

# 01-BFS
BFSの亜種(dequeを使う)
最小の操作回数で目的地につきたい時などに使う。
次の場所が操作なしでいける場合、そのdistは現在の場所と同じでpush_front。操作が必要なら+1してpush_back。pushする時はその条件を確認(chminがtrueか、など)
Internet Explorer から Edge にシームレスに案内するスクリプト

###スクリプト
		var ua = navigator.userAgent.toLowerCase();
		if(ua.match(/msie|trident/) {
			var url=location.protocol + "//" + location.hostname + location.pathname;
			var msg="<span style='font-size:14px;'>当サイトは26年の歴史を歩んできたInternet Exploerのサポートを終了しました。<br><br>";
			msg+="<strong><a target='_blank' href='https://www.microsoft.com/ja-jp/edge#platform'>Edgeのダウンロード</a></strong><br><br>";
			msg+="<strong><a href='microsoft-edge:" + url + "' target='_self'>Microsoft Edge ブラウザーで表示</a></strong>";

			// あとは msg を表示する
		}

###スクリプトの特長
[Microsoftにメール](https://qiita.com/Ischca/items/7749314bbc0a81bfb760)するのとほぼ同等のことをご自身で実装することができます。

・IEであるかどうか判断
・正しいURLの取得
・Microsoft Edgeのダウンロードの促し
・同じページをEdgeで開き直す


###Edgeで強制的に開くためのコツ
リンクのURLの先頭に
**microsoft-edge:**
を加えるのみです。

例えばこの記事をIEでなくEdgeで強制的に開かせるには

	<a href="microsoft-edge:https://qiita.com/nanakochi123456/items/e119a582dac242602d8b">Edgeで開く</a>

にすればよいわけです。

※ちなみに、ChromeでもFirefox でも microsoft-edge: スキーマは反応してしまいます。


##edgeのInternet Explorerでも反応します。
中身は完璧なIEでないInternet Explorerモードでもサーバー側にはIEとして認識されますので、
[Internet Explorerモード](https://docs.microsoft.com/ja-jp/deployedge/edge-ie-mode)も活用するとよいかもしれません。

##Internet Explorerユーザーに対して、edgeをお勧めしたほうが良い理由
chromeやOperaとかの商用ブラウザ、Firefoxとかの非商用ブラウザとか多々ありますが、
edgeはMicrosoftが作った、ということにとても意味があります。

アンケート調査によっても、Microsoftが作ったから安心、というような票もいくつか散見されました。



###Edge対応ブラウザ

https://www.microsoft.com/ja-jp/edge#platform

上記ページを見て頂ければわかりますが
・Windows 7/8/8.1/10（無論Win11も）
・Windows Server 2016/2019
・Intel/Apple M1 Mac
・その他iOS、Android

に対応しています。

##Internet Explorer 26年間も長きとありがとうございます。
少し前の時期ですが、こんな曲まで作ってしまいました。

https://www.nicovideo.jp/watch/sm26877772

当時は常時SSLが浸透していなかったのでこんなことができたのですが、
今ではこういうことするとSSLで跳ねられてしまいます。
【Bootstrap】余白の作り方（margin、padding）

#はじめに
今回は、Bootstrapを用いて余白を作る方法について見ていきましょう。

#Bootstrapを用いた余白の作り方
`margin`はボックスの外側に作る余白、`padding`はボックスの内側に作る余白であることはご存知かと思いますが、Bootstrapでは以下のように記述することで、余白を作ることができます。

#例
###①marginを上下左右に指定する場合（数字部分は0~5の整数が入ります）
####`m-1`
###②paddingを上下に指定する場合  
####`py-2`

#略称の説明
###1文字目
####「m」は`margin`、「p」は`padding`
###部分指定する場合、2文字目
####上は`top`の「t」
####下は`bottom`の「b」
####右は`right`の「r」
####左は`left`の「f」
####上下は`y軸`の「y」
####左右は`x軸`の「x」

#サンプルコード

```html:html
<div class="mb-3">
    <p class="p-1">余白の作り方</p>
</div>
```

#おわりに
たまに、上下って何だったっけって思っちゃいます。
AtCoder ABC223 挑戦！(Python)

ABC223、コンテスト5回目の挑戦です。
なんとかC問題まで完答できました。
前回はさぼりです。プロ野球が熱戦のため、阪神の優勝条件をpythonで計算してました。


```ruby:ABC223A
#100円×1-10までありうる。
X=int(input())

X_list=[i*100 for i in range(1, 11)]
# print(X_list)

#X_listの中にXが存在するかを判定する。
if X in X_list:
    print('Yes')
else:
    print('No')
```
ありうるXのリストを準備して、それが一致するかを判定。
リスト内包表記が無理せず使えるようになってきた。

```ruby:ABC223B
S=input()
S_list=[]
for i in S:
    S_list.append(i)
#循環する文字列をどこで切るか
#ありうる文字列をすべて列挙したうえで、並び替える必要がある。
#ありうる文字列の数は、len(S)個。
S_i=''
S_list_set=[]#シフトでありうる文字列を格納
for i in range(len(S)):
    S_i=''#初期化
    for j in range(len(S)):
        if i+j<len(S):
            S_i+=S_list[i+j]
        else:
            S_i+=S[(i+j)-len(S)]
    # print(S_i)
    S_list_set.append(S_i)

# print(S_list_set)

#リストを辞書順に並び替え
S_list_set=sorted(S_list_set)
print(S_list_set[0])
print(S_list_set[-1])
```

シフト操作で作れる文字列を列挙して、sortedで辞書順に並べた後に、最初と最後を出力すればいい。
ありうる文字列は、循環する文字列と考えたときに、どこで切るか、のlen(S)通りある。切った後の文字は、(i+j)-len（S)番目を持ってくればよい。ここの指定が難しく、時間がかかった。
循環する文字列の取り出しは、なんかうまくできそうだったけど、泥臭くやってしまった。うまい方法がありそうなので要勉強。

```ruby:ABC223C
N=int(input())
#長さAi 1秒あたりBi　で燃える。
A_B_list=[]
for i in range(N):
    A=''
    B=''#初期化
    A,B=map(int, input().split())
    A_B_list.append([A,B])
# print(A_B_list)

#両端で火をつけたときにかかる秒数は、
#片端から火をつけたときの半分である。

sum_A_B=0#両端から火をつけたときのかかる合計秒数
for i in range(N):
    #i本目を燃やすのにかかる秒数は、A/B, 両端からなので2で割る。
    sum_A_B+=(A_B_list[i][0]/A_B_list[i][1])/2

# print(sum_A_B)#かかる秒数
#その秒数を左端から計算して、燃え切る地点を出せばよい。

seconds=0#左端から燃やした時の累計秒数
length=0#左端からの長さ
#秒数が同じになるまで、長さを足していく。if文で

for i in range(N):
    seconds+=A_B_list[i][0]/A_B_list[i][1]#i本目を燃やすときの秒数
    if seconds<=sum_A_B:
        length+=A_B_list[i][0]
        pass
    else:
        #秒数から、i番目の秒数を引く。i本目は、左端からのみでは、燃え切らない。
        seconds-=A_B_list[i][0]/A_B_list[i][1]
        #残りの秒数
        remain=sum_A_B-seconds
        #燃える長さ
        length+=A_B_list[i][1]*remain
        #ループを抜ける。
        break

print(length)
```
導火線に両端に火をつけたときの、左端からの長さを求める問題。
一見複雑そうだが、よく考えてみると意外とシンプルだった。

ポイントは、両端から火をつけたときにかかる秒数は、片端から火をつけたときの半分であるということ。

よって、燃えるのにかかる秒数は求まるので、あとは左端から長さをかかる秒数に達するまで足していく。
ただし、左端のみで完全に燃えきらない最後のi本目については、if文で処理した。

B問題で思いのほか時間がとられて、C問題は40分くらいしかなくてぎりぎりだったが、なんとかACすることができてよかった。

お疲れさまでした。
Digest 認証できる nginx の docker image を作った

個人用に作成したのですが、 DockerHub を軽く検索しても見つからなかったので共有します。 
（※ 筆者のセキュリティリテラシーは「使うモジュールは最新バージョンにしとくか」程度です。 使用は自己責任でお願いします。 Build される [Dockerfile はここにあります](https://github.com/kamuiroeru/nginx-digest-auth-with-docker/blob/main/build/Dockerfile)）

https://hub.docker.com/r/kamuiroeru/nginx-digest-auth-with-docker/tags

```sh
docker pull kamuiroeru/nginx-digest-auth-with-docker:latest
```

# 特徴
- Digest 認証ができる nginx イメージ
- 2022/09/07 現在で latest or stableのバージョンでビルド
    - nginx: `1.23.1`
    - openssl: `3.0.5`
    - zlib: `1.2.12`
- イメージの容量が 30MB 程度と軽量 （本家 nginx と同程度）

# 使い方

https://github.com/kamuiroeru/nginx-digest-auth-with-docker にサンプルファイル置いてます。

```sh
# 1. サンプルファイルがあるリポジトリをコピー
git clone https://github.com/kamuiroeru/nginx-digest-auth-with-docker
cd nginx-digest-auth-with-docker
# 2. .htdigest ファイルを作成
touch .htdigest
htdigest .htdigest "secret_area" username
# Adding user username in realm secret_area
# New password: [パスワードを入力]
# Re-type new password: [パスワードを再入力]
# 3. start with docker-compose
docker-compose up -d
# 4. access to localhost:8888

```

# 作ったモチベーション

1. 色々なサービスのリバースプロキシとして [nginx](http://nginx.org/) をよく使うのだが、公開ページして簡易的に認証させたい
1. でも Basic 認証はパスワードがモロバレになるので Digest 認証を使いたい
1. nginx で Digest 認証するにはビルド必須。結構めんどくさそう
1. docker image あるやろ -> 2つだけ見つかった（1つは不動、もう一つは image 容量 が 300MB と重い）
1. よっしゃ作ったろ。マルチステートビルドで容量も削減しよ

# 参考
https://qiita.com/heiwa_pinf/items/72bd8569320f9362a5b3
Webフォントを高圧縮する

###Webフォントも高圧縮できます。
一般的にはApacheのDEFLATEやnginxのgzipで圧縮することができますが、その圧縮率はあまりよくないようです。

###7zip(p7zip)で圧縮する
通常のgzipより10%程度高圧縮になります。

圧縮一例として
https://icomoon.io/ iconmoonで生成されたフォントを圧縮すると

icomoon.eot 4580bytes→icomoon.eot.gz 2828bytes
icomoon.svg 14417bytes→icomoon.svg.gz 5306bytes
icomoon.ttf 4416bytes→icomoon.ttf.gz 2782bytes
icomoon.woff 4492bytes→icomoon.woff.gz 2799bytes

と半分程度以上の圧縮になります。

###圧縮のコマンドライン
	rm -f output.gz
	7za a -tgzip -mx9 -si output.gz < input

###.htaccessに記載する内容
ついでなので、CSS、JavaScriptの圧縮も含んでいます

	RewriteEngine on
	RewriteCond %{HTTP:Accept-Encoding} gzip
	RewriteCond %{REQUEST_FILENAME}\.gz -s
	RewriteRule .+ %{REQUEST_URI}.gz
	
	<FilesMatch "\.css\.gz$">
		ForceType   text/css
		AddEncoding x-gzip .gz
	</FilesMatch>

	<FilesMatch "\.js\.gz$">
		ForceType   application/x-javascript
		AddEncoding x-gzip .gz
	</FilesMatch>

	<FilesMatch "\.eot\.gz$">
		ForceType   application/vnd.ms-fontobject
		AddEncoding x-gzip .gz
	</FilesMatch>

	<FilesMatch "\.svg\.gz$">
		ForceType   image/svg+xml
		AddEncoding x-gzip .gz
	</FilesMatch>

	<FilesMatch "\.ttf\.gz$">
		ForceType   font/truetype
		AddEncoding x-gzip .gz
	</FilesMatch>

	<FilesMatch "\.woff\.gz$">
		ForceType   application/font-woff
		AddEncoding x-gzip .gz
	</FilesMatch>
socket.ioでCORSを設定する

socket.ioのCORSはv3以降は有効にする必要があるようです。

## サーバ側

「socketio」の引数で「cors」を設定します

```server.js
const socketio = require('socket.io');
const http = require('http');

// origin は function を設定できるようです
// ですので、正規表現を使用し、パターンマッチをさせることもできます。
const socketOptions = {
  cors: {
    origin: function (origin, fn) {
      const isTarget = origin !== undefined && origin.match(/^https?:\/\/www\.test\.net/) !== null;
      return isTarget ? fn(null, origin) : fn('error invalid domain');
    },
    credentials: true
  }
};

const app = function (req, res) {
  res.writeHead(200, { 'Content-Type': 'text/html' });
  res.end('...');
};

// 第一引数のオプションは必要に応じてcertなどを設定
const server = http.createServer({}, app);
const io = socketio(server, socketOptions);

server.listen(8080);
```

## クライアント側

第二引数で「withCredentials」を設定します

```client.js
  socket = io.connect('https://xxx.xxx/xxx', {
    withCredentials: true
  });
```
Udemy「ネットワークエンジニアを目指す初心者はここから始めよう！「ゼロから学ぶネットワーク基礎」1017

Ethernet 概要
・リンク層に相当するプロトコル
・LANのデファクトスタンダード（事実上の標準）
・IEEE 802.3○○

通信方法
・Ethernet　フレームにアドレスを入れて通信する。
・送信元アドレス、Sourceアドレスは自分のこと。
・宛先アドレス、送信先アドレス、Destination アドレスは相手のこと。
・宛先が自分なら受信して上位レイヤーへ、違えば破棄する。


MACアドレス
・Ethernetでは48ビットのMAC(Media Access Control)アドレスを使う。
・16進数表記で00-00-5E-00-53-01や000.05E.005.301のようにハイフンやドットで区切る。
・24ビットずつ意味がある。前半はメーカー識別子（OUI)、後半はメーカー内で付与する。
・FF-FF-FF-FF-FF-FFはBroadcastアドレスを意味する。


Ethernet フレーム
・フォーマットの違いでDIXとIEEE 802.3の2種類がある。
・DIXはEthernet Ⅱ、Ethernet Version Ⅱとも呼ぶ。
・タイプ/長さ 1500以下であれば長さ、1536以上であればタイプを表す。
・LLC       ネットワーク層との制御用管理情報のこと。
・SNAP      上位層で使われるプロトコル情報のこと。
・データ　　　長さは可変長であり、一定ではない。
・FCS       Frame Check Sequenceの略でフレーム誤りを確認する情報のこと。

DIX
宛先MAC      送信元       タイプ(2)  データ(46〜1500)  FCS(4)
アドレス(6)　 アドレス(6)　　

IEEE 802.3
宛先MAC　　　　送信元　　　　長さ（２）　LLC(3) SNAP(5) 
アドレス（6）　アドレス（6）　
データ(38〜1492) FCS（４）



プロトコルタイプ
・タイプは上位層で使われているプロトコルの種類を教えてくれる。
・IPであれば0x0800
・ARPであれば0x0806
・0xは16進数を意味する。



プリアンブルとIFG
・プリアンブルはEthernetフレーム本体が始まることを教えてくれる。
・1と0が7オクテット交互に続き、８オクテッド目は10101011になる。
・最後の11をSFD(Start Frame Delimiter)と呼ぶ。
・Inter Frame Gap
・フレーム間ギャップはフレームとフレームの空き時間（96ビット）のこと。


プリアンブル(8) 宛先MACアドレス(6)　送信元アドレス(6) タイプ（２）　
データ（46〜1500）　FCS(4)


インタフェース/ポート
・インタフェースは論理的、物理的な接点を意味する。
・ポートも類似した意味だがケーブルを接続する口を指すことが多い。


Ethernet規格
・覚えたいポイント。
規格名は　【通信速度】　＋　【通信方式】　＋　【ケーブル種類】

※例　　　　G無しはメガ　　　Base Band方式　　Tはツイストペア
　　　　　G有りはギガ　　　　　　　　　　　  T以外は光ファイバー
　　　　　　　　　　　　　　　　　　　　　　　　（例外は同軸）


通信速度
・一定時間にインターフェースから送り出せるデータ量のこと。
・1秒あたりに何ビット出せるかで表記(単位はbit per second、bps)する。
・２地点間を移動するスピードではない。
・補助単位　K(1,000) M(1,000,000) G(1,000,000,000)を使うことが多い。


通信モード
・同時に送信と受信ができる。
　・全二重、全二重通信、Full Duplex
・送信か受信片方のみできる。
　・半二重、半二重通信、Half Duplex
・双方で統一する。
・設定方法は「固定」と「自動」がある。
　・固定は手動で設定する。
　・自動は機器間で自動検出する。双方が自動であること。
　・自動はAuto、Auto Negotiationと呼ぶこともある。
・不一致でも通信できてしまうこともある。


通信速度と互換性
・1000Base-T/100Base-TX/10Base-Tは互換性がある。
・通信速度をSpeedと書くことがある。
カレントディレクトリ以下の全てのzipファイルを解凍するスクリプト

カレントディレクトリにあるディレクトリ以下にある全てのzipファイルを一度に解凍するスクリプトを紹介します。
今回紹介するスクリプトもまた前回までに紹介したスクリプトの応用となりますが、折角なので備忘録を含めて掲載したいと思います。

#スクリプト本体

```
#!/bin/sh

PWD=`pwd`
ALLFILES=`pwd`'/'*
FINDDIR=`find $ALLFILES -type d`

for NOWDIR in $FINDDIR;
do
 cd $NOWDIR
 for UNZIPFILE in *.zip; do
  unzip -n $UNZIPFILE && rm -f $UNZIPFILE #必要に応じて
 done
done
cd $PWD

exit 0
```

#解説
PWD変数については、スクリプト実行時のカレントディレクトリへ戻るために定義しています。
ALLFILESやFINDDIRについては[前回](https://qiita.com/fy406/items/58eb49962fa6df3466df)紹介したスクリプトとほぼ同じ構造ですが、FINDDIRについては`find`のオプション`-type`を`d`に変更しています。
以降のfindにてループする際の参照対象をファイルではなくディレクトリとしているためです。

for文にはカレントディレクトリに存在しているディレクトリの中身を参照します。
zipファイルを解凍するため、現在参照しているパスへ移動します。
２つめのfor文では現在参照しているディレクトリ内に存在しているzipファイルの数だけループするようになっています。
for文内ではzipファイルの解凍と、元のzipファイルの削除を実施しています。
私が知る限りでは`unzip`コマンドでは解凍後に元のzipファイルの削除するオプションは無いので、`unzip`が正常に実施されたら対象zipファイルを削除するように後ろにコマンドを追加しています。
元zipファイルを残したい場合は単純に`&& rm -f $UNZIPFILE`を削るだけです。

ちなみに参照しているディレクトリ内にzipファイルが存在していない場合、unzipコマンドでエラーが返ってきますが、スクリプトの処理自体は継続されます。
また、解凍時に同名ファイルが存在していた場合に強制的に上書きする場合、`unzip`のオプション`-n`を`-o`へ変更します。
CBTの基本情報技術者試験(午後)を受けた感想

#CBTのメリット
* 受験日時を選べる
* 午前試験、午後試験を別日に受けられる
* 午後試験を先に受けることもできる
* レポートで試験結果がすぐにわかる

このようにメリットいっぱいなのですが、これまで紙で受けていたものをCBTで受けるのは不安もありました。

#CBTの不安
* 問題が公開されていない
* 画面の見やすさや操作
* 問題用紙に書き込みができない
* 集中できるか

などです。これから受ける方の不安を解消できればと思い感想を書きます。なお、出題された問題の内容についての記載は当然禁止されておりますので、CBTという試験方式になったことへの感想です。

#不安の解消
##非公開の問題と改定
CBTの試験期間終了後も、問題内容が公開されていないことが一番の不安要素ですが、午後試験対策としてはこれまで通り、公開されているぶんの過去問の演習で大丈夫です。
それと、これはCBT導入とは関係なかったようですが、**偶然CBTになったタイミングで午後問の改定があった**ようです。そのせいで改定後の問題内容が公開されていないことも二重の不安要素となっています。

##改定内容
必須解答問題(セキュリティ、アルゴリズム)とソフトウェア開発(言語、表計算)の選択問題の配点アップと、テクノロジ、マネジメント・ストラテジ系問題の出題と選択。
テクノロジ、マネジメント・ストラテジ系問題は改訂前は、問2〜問7の6問から4問選択となっていて、6問のうち4問はテクノロジ系、2問はマネジメント・ストラテジ系となっていました。
これが**問2〜問5の4問から2問選択に減少し、うち3問がテクノロジ系、1問がマネジメント・ストラテジ系になった**ようです。

##改定後の試験対策
改訂前からテクノロジ系に絞って勉強していましたが、テクノロジ系は「ハードウェアorソフトウェア」、「データベース」、「ネットワーク」、「ソフトウェア設計」の4分野です。テクノロジ系からは3問が出題され、うち2問を選択して回答すればよいわけですから、**テクノロジ系の中から3分野に絞って勉強しておけばよい**ことになります。(改訂前だとテクノロジ系だけ選択して回答しようとすると4分野すべてを勉強する必要があった)なので私は馴染みの薄い「ソフトウェア設計」の過去問は解きませんでした。
つまり、この改定もテクノロジ系に絞って勉強している受験者にとっては嬉しいものになります。~~マネジメント・ストラテジ系は知らん。~~問の選択数が減少したぶん、1問あたりの難易度や密度のアップが不安でした。が、これも対策としては公開されているぶんの過去問の演習で事足ります。むしろ**選択数の減少だけ見れば、体感としては試験全体のボリュームが減って余裕ができた**気がしました。

##操作や画面
あとはコンピュータで操作することへの不安ですね。
午後問は長文なのでスクロールしながら回答することへの不安がある方もいるかもしれません。が、**問題用紙と回答欄は常に画面2分割で表示されている**ので、問題を読みながらすぐに回答欄にチェックできます。また、**マーカーで色付けもできる**ので、問題用紙をスクロールで戻ったときも重要なところを確認しやすいです。

##書き込みができないこと
唯一、問題用紙に書き込みができないところがネックになるかもしれません。特に図への書き込みはしたいと思う方は多いでしょう。これにネックを感じる方は事前にPCに向かいながらメモ用紙に書く練習をするのがベターだと思われますが、きちんと過去問を解いている方は図表やフローの描画はお手のものだと思います。また、過去問演習が初めての方は、自分で書くことでより理解が深まり、CBTの練習にもなって一石二鳥です。印刷する必要もなくなりますしね。

##会場の環境や雰囲気
あとは今までと違う環境で集中できるか、という点です。他のベンダー試験をテストセンターで受験した際はイヤーマフがあったのでそれを期待したのですが、残念ながら用意はなく、不安になりました。が、よく考えたら紙の試験の際はそんなものないですし、むしろ仕切りがあるテストセンターのほうが周りを気にせずに受験できます。さらに、全員一斉に開始ではなく自分のタイミングで開始ボタンを押して開始できるので、一度PCに向かってしまえば、他の方の退出のタイミングなどで焦ることもないです。(退出した人がいつ開始したのかはわからないから)自分のペースで解き進めることができます。

#結論
CBT、オススメです。

実は午後試験を先に受けて午前試験はまだなので合格体験記ではないですが、午後試験の結果はレポートですぐに確認できて合格ラインに達していたので書くことにしました。
これまで午後試験がネックで何度か落ちていたので、午後試験を先に受けられるように予約し、結果が出てから午前の勉強をする(あるいはしない)計画を立てていました。こんなことができるのもCBTならではですよね。
Heroku + Node.js でウェブアプリ開発した時のメモ書き

初めてHerokuを使ってみました。いろいろ新しい発見があったため、メモを残しておきます。

# 成果物

https://peaceful-dawn-16357.herokuapp.com/

技術文章を入力してボタンをクリックすると、誤字や、修正した方が良い箇所を教えてくれます。

趣味＋勉強を兼ねて開発してみました。

![techtext-lint.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83767/f6f5c00e-2666-2b18-a285-f9bd03552f32.jpeg)

レポジトリはこちら。

https://github.com/Nick-smallworld/techtext-lint


# 構成

* インフラ
    * [Heroku](https://jp.heroku.com/)
* 言語
    * [Node.js](https://nodejs.org/ja/)
* フレームワーク
    * [Vue.js](https://jp.vuejs.org/index.html)
        * 文章入力→校正結果のレンダリングに利用
    * [express](https://expressjs.com/ja/)
        * webアプリのホスティングに利用
* 校正エンジンに採用したライブラリ
    * [textlint]()
    * [textlint-rule-preset-ja-technical-writing](https://github.com/textlint-ja/textlint-rule-preset-ja-technical-writing)
* エディタ
    * [Ace Editor](https://ace.c9.io/)


# Herokuについて

いわゆる PaaS (Platform As A Service) として有名なサービス。サーバー・ミドルウェアなどがワンセットになっており、コードをデプロイするとウェブアプリが公開できる。個人向けの無料プランから、商用のビジネス向けプランまで。

AWSのAmplify、GCPのFirebaseのようなサービス。

Salesforce社のサービスの一つ。2010年前後にSF社がHerokuを買収。


# Herokuの開発、デプロイ

ほぼ公式ドキュメントどおりに進めました。

https://devcenter.heroku.com/ja/articles/getting-started-with-nodejs

* brew で、HerokuのCLIをインストール

```bash
brew install heroku/brew/heroku
```


* npm initして、開発用のディレクトリ作成
* Expressをインストール後、htmlとJSでゴリゴリ開発
* [HerokuのCLIを使い、ローカルでテスト](https://devcenter.heroku.com/ja/articles/getting-started-with-nodejs#-8)

```bash
heroku local web
```
* 開発したアプリをローカルでgit commitして、Herokuへプッシュ

```bash
git push heroku main
```

## HerokuのGitとGitHub

Heroku　CLIでは、ローカルにgitレポジトリを作成して開発します。開発したアプリは、 git push でHerokuにデプロイできます。

…が、デプロイした後に気がついたのですが、[HerokuはGitHubをオリジンのレポジトリとして指定できる。](https://devcenter.heroku.com/ja/articles/github-integration)

GitHubのアカウントをお持ちの方は、レポジトリをGitHubにまとめた方が何かと便利かと思います。


# Aceエディタ

このシステムでは、入力した文章の行番号を検知し 「何行目の※＊が間違っています」と表示するよになっています。

入力欄に行番号を表示する方法を色々調べたのですが、エディタライブラリを使うのが一番簡単に思えたため、OSSのエディタを調査しました。

最終的に [Monaco Editor](https://microsoft.github.io/monaco-editor/) と Ace Editor のどちらかを採用することに。

## Monaco Editor

Visual Studio Code に採用されているエディタ。非常に高機能。

## Ace Editor 

AWS の Cloud9 に作用されているエディタ。 AWS以外にも採用事例が多く、人気が高い

インストールして触った結果、Aceの方がシンプルで個人的に理解しやすかったため、Aceエディタを組み込みました。


# textlint

textlintは、自然言語のチェックができる総合的なライブラリ。辞書エンジンを組み替えることによって、多種多様な言語・ルールを設定することができます。

初めて触った時「こんな便利なライブラリがあるのか」と、本気で感動しました。先人の皆様の知見と情熱に、頭が下がる思いがします。


# 開発してみた感想

Herokuの便利さに驚きました。

Expressを利用した構成をデプロイするだけで、ウェブ上できちんとアプリとして動作します。パスやライブラリの配置変えることなく、そのまま使えました。めっちゃ便利。なんで今まで使ってなかったんだろう。

PaaSサービスって、本当に便利で面白いですね。

今度はぜひ AWS の Amplify や CodeStar で構築してみて、Firebase や Heroku との違いを実感してみたいです。
体温を最速で入力するためのユーザーインターフェースの検討（その1）

体調管理（と会社での感染予防）のために毎朝体温を測るのが習慣化しています。
しかし、朝の1分1秒は非常に貴重な時間です。できればiPhoneでの体温データ入力も極限まで無駄を減らしたいところです。

そこで、体温を最速で入力するためにはどんな入力インターフェースがいいのかを検討してみようと思いました。

HealthKitへの体温データ追加については前回調査しました

[Swift: HealthKitに体温データを入力する。できるだけ公式ドキュメントだけを見て。](https://qiita.com/sYamaz/items/cedfd869f74f14b4b25b)

# 開発環境

* Xcode 13
* swift 5
* 対象プラットフォーム:iOS 14以上（主にiphone）

# 条件

* 主なユーザー：私
    * 体温の単位は摂氏です
    * 平熱は36℃台中盤で、35℃台になることはありません
    * 40℃台になったことはありません。

# タップ数ベースの参考記録

新規入力時

1. ヘルスケアアプリ起動（1タップ）
1. お気に入り登録してある「体温」の項目をタップ（1タップ）
1. 「データを追加」をタップ（1タップ）
1. iOSのソフトウェアキーボードで体温を入力（4タップ:"36.5"など）
1. 「追加」をタップ（1タップ）

合計8タップ



# ユーザーインターフェースの検討

※そもそも体温を測ったらiPhoneと接続して勝手に記録してくれる体温計があればいい話ですがそれは置いておきます。

どんな入力方法があるか考えてみます（実現方法は置いておきます）

## 画像入力

以下の２方法を思いつきました

* 計測後の体温計にカメラをかざして体温の文字列を読み込む方式
* 計測後の体温計の写真を撮って解析する方式

今後Try予定です

## 音声入力

「Hey Siri！ 今日の体温は36.7度だったよ！」と言う方式です

今後Try予定です

## タッチ入力

ソフトウェアキーボードをはじめとしたタッチ操作で入力する方式です。

とはいえソフトウェアキーボードを使用したアプリだと上記参考記録とタップ数は大差なくなってしまうので別の方法を考えてみます。

### ソフトウェアキーボードじゃダメなの？

※1秒を惜しむ人間の思考です

* 仮に体温が「36.5度」だったとして、「3」と「.」は入力しなくて良のではないでしょうか？大抵変わるのは「6」と「5」の部分です。冒頭で示したように40度行くことはほぼないです。
* 修正するときにBackSpace入力するのがめんどくさいという思いもあります

これらに対して、「小数点以上」「小数点以下」それぞれで上書きで入力することができればいいのでは？と思い作成したプロトタイプが以下になります。

![タイトルなし.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2088399/88282c02-a58d-cef4-2a28-33411eafed30.gif)

理想的には

* アプリ起動（1タップ）
* 小数点以上の桁入力（1タップ。平熱の場合タップ無しになることも）
* 小数点以下の桁入力（1タップ）
* 登録ボタン（1タップ）

合計4タップ

小数点以上、以下それぞれ独立して数値を上書きしていくため、入力後の修正もBackSpace不要です

# repository

https://github.com/sYamaz/BodyTempLogger

# 結果

今回は使用者を限定することで理論上ではタップ数が半減するインターフェースとなりました。

次回以降試してみたいことの一覧です

* タッチ入力
    * スワイプなどの操作も活用できないか
* 画像入力
* 音声入力
複数ノードでsocket.ioを使用する


**ALB配下に「socket.io」を使用しているインスタンスを複数立ち上げる際の対応**
※シングルインスタンスで動作していることが前提となります。

https://socket.io/docs/v4/

## シングルインスタンスのみ考慮されている状態の場合

`unknown sid "xxx"` のようなエラーがレスポンスに戻ってきたりします。
「socket.io」は標準で複数インスタンスに対応していません。

※「socketio-sticky-session」を使用すればいけるかもしれませんが、私は試していません。
※「@socket.io/redis-adapter」はメッセージを共有することは出来るそうですが、<font color=red>**「handshake」**</font>時の動作には対応していません

## 対応方法

AWSのALBなら<font color=blue>**「Stickiness」**</font>で、「socket.io」の<font color=red>**「handshake」**</font>に対応が出来ます。
※詳しくは下記ページを参照

https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/application/sticky-sessions.html

また、メッセージ部分は「@socket.io/redis-adapter」で対応が出来ます。
※redisのインストールが必要になります。

https://socket.io/docs/v4/redis-adapter/

## 「unknown sid "xxx"」のメッセージ部分が出力される理由

下記のような形で情報を保持し、判定を行っています。
その為、「handshake」時は同じサーバに接続する必要があります。

```node_modules/engine.io/lib/server.js
    // ソース上の「this.clients」を確認します

    // レスポンスのエラー判定部分
    const sid = req._query.sid;
    if (sid) {
      if (!this.clients.hasOwnProperty(sid)) {
        debug('unknown sid "%s"', sid);
        return fn(Server.errors.UNKNOWN_SID, {
          sid
        });
      }

      ...
    }

    ....

    // 情報を保持している部分
    this.clients[id] = socket;
    this.clientsCount++;
```

## socket.ioのログの確認方法

Chromeブラウザ（クライアント側）なら、DevToolsを開いてコンソールに下記を入力します。
コンソールログにデバッグ情報が表示されます。

```javascript
localStorage.debug = '*';
```

nodejs（サーバ側）なら、下記を「環境変数」に設定します。
ログファイルにデバッグ情報が出力されます。

```javascript
DEBUG="engine,socket.io*"
```

https://socket.io/docs/v4/logging-and-debugging/
【CentOS】CUI環境からGUI環境に変更したい！

# 簡潔に言うと
* `yum groupinstall <パッケージ名>`でGUI環境パッケージをインストール
* `systemctl set-default graphical.target`でGUIに切り替わる

# 概要
「セットアップ時のパッケージインストールでGUIにチェック✔を入れ忘れた！」というときの備忘録として。

# 環境
* ホストOS：Windows 10
* ゲストOS：CentOS 7.9
* 仮想化ソフト：VirtualBox 6.1.18

ネットワークアダプターにホストオンリーアダプターを割り当てて、TeraTermでssh接続。

# コマンド
## グループパッケージ名を確認する
```
[root@localhost ~]# sudo yum grouplist -v
プラグイン「fastestmirror」を読み込んでいます
Config time: 0.011
Yum version: 3.4.3
There is no installed groups file.
Maybe run: yum groups mark convert (see man yum)
Setting up Package Sacks
Loading mirror speeds from cached hostfile
 * base: ftp.jaist.ac.jp
 * epel: mirrors.nipa.cloud
 * extras: ftp.jaist.ac.jp
 * remi-safe: ftp.riken.jp
 * updates: ftp.jaist.ac.jp
pkgsack time: 0.040
group time: 0.101
Available Environment Groups:
   最小限のインストール (minimal)
   インフラストラクチャーサーバー (infrastructure-server-environment)
   コンピュートノード (compute-node-environment)
   ファイルとプリントサーバー (file-print-server-environment)
   Cinnamon デスクトップ (cinnamon-desktop-environment)
   MATE デスクトップ (mate-desktop-environment)
   ベーシック Web サーバー (web-server-environment)
   仮想化ホスト (virtualization-host-environment)
   サーバー (GUI 使用) (graphical-server-environment)
   GNOME Desktop (gnome-desktop-environment)
   KDE Plasma Workspaces (kde-desktop-environment)
   開発およびクリエイティブワークステーション (developer-workstation-environment)
利用可能なグループ
   Cinnamon (cinnamon-desktop)
   Fedora パッケージャ (fedora-packager)
   Haskell のサポート (haskell)
   LXQt Desktop (lxqt-desktop)
   MATE (mate-desktop)
   Milkymist (milkymist)
   TurboGears アプリケーションフレームワーク (turbogears)
   Xfce (xfce-desktop)
   グラフィカル管理ツール (graphical-admin-tools)
   コンソールインターネットツール (console-internet)
   システム管理 (system-management)
   システム管理ツール (system-admin-tools)
   スマートカードサポート (smart-card)
   セキュリティーツール (security-tools)
   レガシーな UNIX 互換性 (legacy-unix)
   互換性ライブラリー (compat-libraries)
   教育用ソフトウェア (education)
   汎用デスクトップ (general-desktop)
   科学的サポート (scientific)
   開発ツール (development)
   電子ラボラトリ (electronic-lab)
完了
```
GUI環境のパッケージはいくつかあるが、今回は`サーバー(GUI 使用)(graphical-server-environment)`をインストールしてみる。

## グループパッケージのインストール
```
[root@localhost ~]# yum groupinstall graphical-server-environment
```
インストール中に`Is this ok [y/d/N]:`と問われるのでy(=yes)を入力しEnter。
（`yum groupinstall graphical-server-environment -y`とすることで、すべてyを選択とみなされインストールが進む。）

## GUIに切り替え
```
systemctl set-default graphical.target
```
VirtualBoxの仮想マシンのウィンドウがGUIに切り替わるはず。
※CUIに戻す場合は`graphical.target`を`multi-user.target`に変えて実行。

# まとめ
GUI環境に切り替えられた！
「CUIなんて無理！やっぱGUIに変えたい！」or「セットアップ時にGUI入れ忘れた！」というときにどうぞ。
デジタルリテラシーの高め方

# はじめに
今年から、10月の10日と11日が[デジタルの日](https://www.digital.go.jp/policies/digital_days)と定められ、日本においてもデジタル化が更に進んでいくと思われるので楽しみなのですが、デジタルリテラシーの格差があまりにも大きいと分断が生まれ、進みが遅くなってしまう懸念があるので、ある程度わかっている人から情報の取得や理解の方法を共有していくことで、歩みを速められればという思いで書いています。

[デジタルリテラシーの定義は色々変わってきている](https://note.com/junsakamoto/n/na67003267ec2)ようなのですが、本記事では「情報検索のための最低限のスキル」を主眼に置いています。


# Google以外の検索
とりあえず**ググる**のは、普段されることが多いと思いますが、キーワードをそもそも知らなかったり思いつかないと必要な情報に辿り着けません。
ある程度必要情報が集まっている場所の在り処を知っておくことが重要になります。


# 人から芋づる式に辿る
情報感度が高い人を見つけ、Twitterなどでフォローしておくと、その人がRTやいいねしたツイートが目に入って来やすいので、類似した情報を得やすくなります。「この人は情報感度が高い」という人を1人見つけられたら、その人がフォローしている人もプロフィールを見つつフォローしていくと効率が良いです。

人から辿る際に「有名な人を知らない。知り合いが居ない」となってしまうのは勿体なく、公の情報から分かる、**立場の上で必ず知識を持っている人たち**が居ます。
[デジタル大臣、デジタル監、デジタル庁のCxO](https://www.digital.go.jp/about/member)、政府CIO補佐官などがその一例です。

もちろん最初からこれらの人達の発言を見ると何を言っているかさっぱり分からないかも知れません。他の記事に対してコメントしている場合は、その記事を実際に見てみる。分からないキーワードが出てきたら、とりあえずWikipediaで調べてみて、関連するキーワードが分かってきたら更にググってみるを繰り返すことです。


# イベントから辿る
各分野で有名なカンファレンスが最低1つはあるので「(何らかのキーワード) カンファレンス」のセットでググることで、ファーストビューに出てくると思います。
※キーワード例：Google、AWS、Facebook、Apple、iOS、Android、Python、アジャイル、IT系 など

カンファレンスの動画や発表資料も重要ですが、登壇者が必ず居るので、人（登壇者）から更に辿っていくことも重要です。

登壇者から辿ると、大規模なカンファレンスだけでなく、[connpass](https://connpass.com)などの中小規模の勉強会イベントにも辿りつけます。


# 団体から辿る
ITに関連する様々な団体が存在します。
[IPA：情報処理推進機構](https://www.ipa.go.jp)、[Code for Japan](https://www.code4japan.org/)、[IT連盟：一般社団法人　日本IT団体連盟](https://www.itrenmei.jp/about-us/)
※IPAは、それぞれの技術情報も豊富ですが、サイト内で「学びのススメ」で検索することで人に辿りつけます


# 書籍から辿る
大型書店で、興味のある分野の本棚にある書籍を眺めるとどんなものがあるか一覧しやすいです。
[Wikipedia：コンピュータに関する出版社](https://ja.wikipedia.org/wiki/Category:コンピュータに関する出版社)
ある程度あたりがつけられてきたら、対象書籍をAmazonで検索や購入すると、関連書籍をレコメンドしてくれるので、新しい書籍がスムーズに得られやすくなります。

人から辿る際、著者も良いですが、コンピュータ関連の書籍は翻訳本も多いため翻訳者の情報も価値が高いです。


# 1次情報(公式からの情報)を見る
人から辿る習慣がついてくると「この人が言ってるからそうだろう」というような、その人のフィルタを通して情報を解釈してしまうことがあります。
理解を早めるために参考にするのは悪くないのですが、ドキュメントや資料など公式のものがある場合は必ず原典を確認する習慣をつけることをオススメします。


# おわりに
調べる入り口がGoogleだけだと必要な情報に辿り着きづらいと感じる方にとって、本記事で、何か1つでも新しい気づきが得られましたら幸いです。
EC2　vscodeのssh接続でipアドレスを変更して再接続する方法

##ssh再接続
EC2ではインスタンスを再起動するとipアドレスを変更されてしまうため前回のipアドレスでは接続できなくなってしまいます。そのため、再接続するためにはipアドレスを変更する必要があります。
##vscodeでconfigを開く
SSH TARGETの+ボタンからconfigを選択し、Hostの新しくipアドレスを変更すれば再接続可能になります。
![スクリーンショット 2021-10-17 21.53.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/712442/3d5b8488-9cff-faa1-d13a-ec6169a61c23.png)
[Docker] M1 Macで「 no matching manifest for linux/arm64/v8 in the manifest list entries」のエラーの対処法

*環境
macOS BigSur バージョン11.6
docker v20.10.8
docker-compose v2.0.0
MySQL5.7*

## やりたいこと
Dockerで開発環境の立上げ

## エラー内容
`% docker-compose up -d`でエラー

```:エラーメッセージ
no matching manifest for linux/arm64/v8 in the manifest list entries

// マニフェストリストのエントリにlinux/arm64/v8に一致するマニフェストがありません
```


## 原因
M1チップのプラットフォームはarm64であるのに対し、
mysql5.7*のイメージのサポートプラットフォームがAMD64で不一致


## 対処
docker-compose.ymlでplatformを指定をする
 `vi docker-compose.yml`で以下を追記。


```yml:
 db:
    platform: linux/x86_64 // この行を追加。
    image: mysql:5.7
    container_name: app_db
(省略)
```

## 参考
[M1Mac環境でDockerのMySQLを動かす](https://qiita.com/toyoyuto618/items/f225e1b2ab22ca5adf33)
[mysqlでサポートされるプラットフォーム](https://www.mysql.com/support/supportedplatforms/database.html)
[「x86-64」「x64」「AMD64」これらは何が違うのか？](https://onoredekaiketsu.com/x86-64-x64-amd64-what-is-the-difference-between-these/)