KAEDE Hack blog

JavaScript 中心に ライブラリなどの使い方を解説する技術ブログ。

Linuc 101 Linux - 秘密鍵方式の通信と GitHub を例にした認証

秘密鍵と公開鍵

秘密鍵とは

ja.wikipedia.org

公開鍵暗号(こうかいかぎあんごう、Public-key cryptography)とは、暗号化と復号に別個の鍵(手順)を用い、暗号化の鍵を公開できるようにした暗号方式である。

二つの鍵を用意し、一方の鍵を公開しても良いのとして扱える手法のようだ

LinuxGitHub を使う場合の ssh 通信では自動的に公開鍵暗号を使われる

暗号化したデータの送受信

メッセージのやり取りとして、password zip メールなどより遥かにしっかりしたものとして 共通鍵暗号方式がある。

通信の流れでは

f:id:kei_s_lifehack:20210325211924p:plain

まず、データの受け取り側が 秘密鍵を作り、秘密鍵から公開鍵を生成し、データの送信側に送る。

次に、データの送信側が 公開鍵を受け取り、データを公開鍵で暗号化し、暗号化したデータをデータの受け取り側に送る。

最後にデータを欲しい方が最初に作った自分の秘密鍵で 暗号化を解除する

という流れになる。

認証

認証ではやることが異なる

qiita.com

この「鍵交換」が必要になる。

双方向にお互い鍵ペアを生成して、公開鍵を送り合う。

クライアントが作る鍵のペアが認証鍵

サーバーが作る鍵のペアがホスト鍵

認証鍵

f:id:kei_s_lifehack:20210325213327p:plain

認証では認証データの送信側のユーザーが自分の公開鍵で暗号化させた認証データを送り、その公開鍵も送る。

qiita.com

( GitHub で公開鍵を登録しているのがこれのことだと推量する。)

( GitHub と違って GUI がないサービスでは CUI~/.ssh/authorized_keys に打ち込む)

受け取って認証する側のサーバーが 送信側のユーザーの秘密鍵で「検証」し受け入れる。

とにかく「公開鍵で認証」するのが試験で問われるポイントらしい。

ホスト鍵

qiita.com

ホストでも鍵を作り、逆のことをやる

サーバーが作る鍵のペアがホスト鍵

こちらでは サーバーが作った公開鍵をクライアントの known_hosts にぶち込む!

... しかし、実際に編集することは少ないらしい。

qiita.com

GitHub では 公開されてる SSH フィンガープリントを対話式で初回ログイン時に貼り付けるらしい。確かやった気がする。

秘密鍵方式と認証まとめ

秘密鍵方式を図示しての復習ができて

ツイートした際に記事の作者様に教えてもらったことによって

認証では双方向に公開鍵の送り合いをしてることがわかってよかった!!!

qiita.com

angel_p_57 さんありがとうございます

ssh の公開鍵は主に認証

https://qiita.com/angel_p_57/items/19eda15576b3dceb7608

またこの人の記事が分かりやすかった

上記の公開鍵 秘密鍵の基礎知識があるとさくっと読める

ssh ではクライアント端末を使ってのサーバーでの CUI コマンド実行、ホームページアクセスなどの通信のトンネル作成、などが出来る

どちらも認証しなければ使えないものであり、その認証に ssh と公開鍵 ニアリーイコール 認証鍵が使われる

公開鍵暗号方式での暗号化は実際にはあまり使われず、公開鍵を主に使うのは認証になる

初めての確定申告@2021.04.01

確定申告とは?

www.nta.go.jp

自分の売り上げなどと税金の自己申告 & 自己納税。

2021.04.15 締め切りで

2020.01.01 ~ 2020.12.31 までの給与、事業所得などの

why

業務委託の分。

初めてなので覚え書きしとく

税金のかかり方についての問合せ。

まず横浜の税務署に電話で聞いた。

業務委託の給与は報酬として換算される。そこの金額を売り上げとして計算する

売り上げから基礎控除が 470k くらい引かれる

そこから 経費の額を引く。

その額に

5% の国に収める所得税

10% の地方自治体に収める住民税

がかかることになる。

つまり 売り上げからかかった経費を引いた純粋な収入に、 基礎控除で控除分引いてもらった残りの額に

15% の税金がかかることになるらしい。

払い方

まずは確定申告をする。

f:id:kei_s_lifehack:20210323231429p:plain

id pass方式は事前に税務署で発行が必要

e-taxマイナンバーカードと専用のカードリーダーがないとできない

だ、そうです。

両方かったが、確定申告フォームに入力して印刷したものを持っていけばできた。

その 郵送期限と、所得税の支払い期限が 04/15 になるので、 それまでに書類作って郵送か直接渡して税金を払うか還付を受け取る。

コンビニのファミポートなどで支払いできるらしい。 あとは横浜だと関内の何かの施設。

このとき払えるのは国に収める 5% の所得税のみ。

住民税は後ほどになるらしい。

実際に申告と納税をする

公式サイトのフォームで pdf が作成できる。

バイトの給与、個人事業での報酬とそこの源泉徴収の欄などを埋めると、

pdf が作成された

f:id:kei_s_lifehack:20210401221314p:plain

隠すとこ多くて処理をするのが面倒だったので上部ごく一部のみ。

今日は 16:00 までの受付だったが滑り込みで会場入りできた。

そこで印刷した申告書をチェックしてもらい、税務署職員の人に書類通りの納税と還付でいいのか確認してもらい、OK が出たので「印刷」の窓口でもらった用紙を引き渡し、還付は2ヶ月後との説明を受け、それで終わった。

還付は 56k ほどだった。納税するつもりで行ったのに帰ってきた...

源泉徴収で既に(10%)引かれていて、年収が少ないから所得税が 10% より低く、その分が返ってくる?という解釈です。

終わってみれば非常に簡単だった!!!

事業所得が 100万に満たないからこんなに簡単なのかもしれないが。

やり忘れたこと

経費申請して売り上げを正当に圧縮すればどれくらい還付が増えたのか確認しなかった

所得税は大丈夫なのがわかったが、後から取られる予定だった住民税がどうなるのか確認しわすれた

Linux Process

why

Linuc 101

プロセスを表示 ps

ps

  PID TTY           TIME CMD
  802 ttys000    0:00.06 -bash
 7328 ttys000    0:00.01 tmux
 7445 ttys001    1:47.95 npm start  

プロセスをユーザーごとに表示 - ps u

ps u

ps u
USER    PID  %CPU %MEM      VSZ    RSS   TT  STAT STARTED      TIME COMMAND
kaede   802   0.0  0.0  4354152   1796 s000  S    Fri08PM   0:00.06 -bash
kaede  7328   0.0  0.0  4283216   1376 s000  S+   Sun02AM   0:00.01 tmux
kaede  7445   0.0  0.2  4667872  35124 s001  S+   Sun02AM   1:48.09 npm start  

Ping-t

プロセスを user と共に表示する

プロセスを 優先度ごとに表示: ps -l

ps -l

  UID   PID  PPID        F CPU PRI NI       SZ    RSS WCHAN     S             ADDR TTY           TIME CMD
  501   802   797     4006   0  31  0  4354152   1796 -      S                   0 ttys000    0:00.06 -bash
  501  7445  7331     4006   0  31  0  4667872  35228 -      S+                  0 ttys001    1:48.38 npm start 

これの NI が Nice Id だと解釈。

PPID などはわからない

JS ES6 の復習 - 複文と単文、式と文、演算子

why

カンマ演算子や式と文など、わかっていないことが多かった

複文と {}

アロー関数で説明すると

{} で括らないで複文を入れた場合

const A = () => console.log('A');
const B1B2 = () => console.log('B1');console.log('B2');

A();

B1B2();

これを実行すると

B2
A
B1

となる。

A の関数は ちゃんと関数の中に入って、呼び出されるようになっているが

B1B2 は 関数の中に入って、その後まとめて順番に実行されていない。

B1 のみが B1B2 の関数に入って、B2 は関数のスコープ内で即時実行されてしまう。

これは 関数が {} で処理部を括らない場合は 単文しか入らないからだ。

この B1B2 の処理部分を {} でくくると両方入るようになる。

{} で括って複文を入れた場合

const A = () => console.log('A');
const B1B2 = () => { console.log('B1');console.log('B2');}
A();

B1B2();

実行すると

A
B1
B2

この挙動をする。

前述の {} を使わない 処理部分に抑えめるには単文で済ませる必要がある

その時に演算子 ( operators ) が便利。


式と文と演算子

文は {} を持つものと輸出輸入と宣言

developer.mozilla.org

if などの {} を持つフローや関数と反復処理、

import , export,

var, let, const の 宣言

文としてはこれらがある。

これらは全て console.log() で打ち出そうとしても出力できない。

逆にこれら以外のものは全て「式」であり、cll で打ち出せば何かが出る。

代入演算と式の評価と変数宣言

developer.mozilla.org

代入演算の x = 3

式の評価の 3 + 4 がある

どちらでも演算子、 operators を使う。

演算子を使って結合されたひとまとまりの単文を式... ではなく

「式は返り値を持っている」ので、評価すると値が帰ってくるのに対して、

変数宣言文は 代入演算のようにそれ自体を console.log とかで出力しても 何も帰ってこない

const や let を用いない グローバルな代入文は 値が実はあった。

console.log (x=3)

結果で

3

3 が帰ってくる...

一方 const や let , var ですら

console.log (const x=3)

実行すると

console.log (const x=3)
             ^^^^^
SyntaxError: Unexpected token 'const'

中身がないエラー... だよな?が帰ってくるn

なので 代入演算は 式で、変数宣言のみが文になる。

また「代入演算の右辺には式しか入らない」

const hoge = const ha  = 'hoge';
             ^^^^^

SyntaxError: Unexpected token 'const'

当たり前すぎるが、これも const を抜くと

const hoge = ha  = 'hoge';
console.log(hoge);

hoge

なんとこんな狂ってる文でも返ってきてしまうのだ...

式と文の区分まとめ

よって const や let を使わない 超グローバル変数宣言は「式」であり

const や let を使う 変数宣言のみが「文」である

他には前述したように、スコープ {} を持つものや im, export が cll で打っても結果が帰ってこない「文」であり、そのほかは全て「式」である。

function の 即時関数は式扱いらしい(要検証)

演算子の例

わかりやすいものには

developer.mozilla.org

===, !=, >, <,

などの比較演算子

developer.mozilla.org

&&, ||,

の論理演算子

developer.mozilla.org

( X ? A : B ) で X の条件が true なら A, False なら B を処理する三項演算子

(A , B) を両方処理して右側を返すカンマ演算子がある

カンマ演算子は教材の for ループ以外であまり見ないが

 (a, b)
 (a, b, c)

演算子を使った丸括弧の「式」である

カンマの左側を全て処理してから右側を返す。

だから reduce において (stack + something, stack) が便利。

演算子まとめ

これらは全て値を返すから、「式」!!

JS の知識を前提として C++ を学習する - cin, cout, 関数化

参考

柴田望洋

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

ヘッダ

node.js の import みたいな感じで

include を使う

std と count

using namespace std;

これで std の使用を明示すると

cout をそのまま 使えるようになるらしい。

これがないと std::cout って使うときに std を明示しないといけないらしい。

cout は「標準入力ストリーム」って言うらしい。

数を数えるカウントとは全く別らしい。C OUT !!!! アウト!!!!

これに挿入記号の << を使うことで console.log() ができる

実際に動かすと

#include <iostream>
using namespace std;
int main() {
  cout << "Hello cpp \n";
}

コードがこれで

[Done] exited with code=0 in 0.437 seconds

[Running] cd "/Users/kaede/code/cpp/" && g++ main.cpp -o main && "/Users/kaede/code/cpp/"main
Hello cpp

この結果が出る。

in out stream の ライブラリを import して

std の namespace を明示して

最初に実行される main 関数で、console.log にあたる C OUT に 文字列を打ち込む!!

js との違いとして、' のシングルクォートで文字列をくくるのはダメで、;セミコロンがないと即エラーが出る。

アラート

  cout << "\aHey Guys! We have a gift for you!\n";

VScode だからか警告音が出ない...

文字列の連結

  cout << 
    "ABC"
    "PPP" 
    "XYZ" 
  ;

ABCPPPXY

空白や改行を挟んで文字列を複数入れても、連結されて表示される

文字列 数値 文字列の出力

JS だと

`text ${number} text`

だが

cpp は

  cout << "18 + 63 = "  << 18 + 63 << "some text";

18 + 63 = 81some text

となる。異なる型のをつなげるときは、inserter の << で区切る必要があるらしい

変数と計算複数出力

cpp は型を明示しないといけないので

main の中で宣言して使う

int main() {
  int x = 2;
  int y = 3;
  cout << "x: " << x;
  cout << "\n x + y: " << x + y;
  cout << "\n (x + y) / 2 : " << (x + y) / 2 ;
}
x: 2
x + y: 5
(x + y) / 2 : 2

x と y と 合計と 平均 を出力する

console.log や println と違って改行記号を文末か次の文頭に表示しないといけない。

キーボードからの入力受け付け

C in

さっきの C out の逆。

f:id:kei_s_lifehack:20210311164848p:plain

Code Runner の OUTPUT の場所では打てないが、設定で解決できるようだ

f:id:kei_s_lifehack:20210311170113p:plain

設定で runInTerminal って検索してチェックしたら Terminal で実行できた

コードはこう

  int num = 0;
  cout << "What is your favorite number?\n";
  cin >> num;
  cout << "I will punch you " << num << " times.\n"
What is your favorite number?
5  
I will punch you 5 times.

c out の出力先に

出力先 <- 文字列

で "好きな数字を言え" をターミナルに表示して

入力先 -> 変数

で 変数 number に 入力された数値を突っ込む

出力先 <- 文字列 << 変数の数値

で 文字列と変数の値が出る!!ヨシ!!!

double で小数点まで計算する

main.cpp:4:11: warning: implicit conversion from 'double' to 'int' changes value from 0.25 to 0 [-Wliteral-conversion]
  int x = 0.25; 

int に小数点の入った数値を入れるとエラーが出るので、double を使う

  double x = 1; 
  cout << x/4;

0.25

小数点が出る計算の時は double

コメントアウト

js と同じ単一行

// some code

html と同じ複数行

/*
  double x = 1; 
  cout << x/4;
*/

スラッシュ アスタリスクで初めて

アスタリスク スラッシュで終わらせる。

後から変えられない const

cpp には Math.PI とかがないらしいので 自分で定義する

こう言う後から変わるわけがないものは const で変更できなく定義する。

js ではカジュアルに使っていたが、cpp では デフォルトで使うことにはならないのかな?

ts だと

const App: React.FC = { } 

みたいに const と type を両方使っていた

同じように書く。

const double PI = 3.1416

関数化する

js では とにかく脳死で const に入れていればヨシ!!だった。

入れたい。とにかく入れたい。変数は無理だから関数でもいい。処理を入れたい。

そしてその名前だけで C out に渡したい。

int main() {
  double radius;
  const double PI = 3.1416;
  cout << "Input Radius:";
  cin >> radius;

  cout << 2 * PI * r;
}

これの計算を cout に直接渡しているのを関数化した。

int getCircumference(double radius) {
  const double PI = 3.1416;
  return 2 * radius * PI;
}
int main() {
  double radius;
  cout << "Input Radius:";
  cin >> radius;
  cout << getCircumference(radius);
}

getCircumference(radius) を作って それを main で呼び出すことにした。

cpp では 数値計算の関数は int の型にするらしい。

main で type を宣言した上で、関数で 引数として使う際も再度 type を明示して、

変数は関数内部で宣言して使い、return する。

main で PI を宣言しても 関数内部では使えなかった。

関数はなぜか 6章の内容でいくまで遠いので、自分から探しに行ってよかった。

( const の章は 1.4 章 )

C++ の環境構築 - 文字化け

why

完全に趣味、気分転換

競技プログラミングに Node より向いてそうだから

VScode

qiita.com

これを参考にした

VScode を開いて Extension の Code Runner を入れる

#include <iostream>
using namespace std;
/**
* Hello!VisualStudioCodeを出力
*/
int main()
{
    cout << "Hello!VisualStudioCode" << endl;
    return 0;
}

コードを書く

右上の三角ボタンで実行

f:id:kei_s_lifehack:20210311151343p:plain

テキストを書う

柴田望洋の新 明解 C++ を買った

www.bohyoh.com

ソースコードはあったが

There is no application set to open the document “MKCPP01.LZH”.

f:id:kei_s_lifehack:20210311152044p:plain

The Unarchiver

The Unarchiver

  • MacPaw Inc.
  • ユーティリティ
  • 無料
apps.apple.com

Unarchiver を install

右クリックで open with で .lzh 圧縮をひらけた〜!!

文字化け

f:id:kei_s_lifehack:20210311152856p:plain

文字化けする.... utf8 でこれだ

www.atmarkit.co.jp

shift-jis で開き直してみる

f:id:kei_s_lifehack:20210311153254p:plain

ソスソスソスソスソスソスソスソスソスソスソスソスソスソスソスソスソスソスソスソスソスソスソスソスソス

ソスソスソスソスソスソスソスソスソスソスソスソスソスソスソスソスソスソスソスソスソスソスソスソスソス

ダメだ諦める。手打ちする。

js array.reduce(func, arg) の第二引数がある場合とない場合の処理

why

map とは別のこの処理が必要になった

main

developer.mozilla.org

MDN のサンプルを読み解く

accumlator は「計算に使う貯めておくもの」

だけど stack の方がわかりやすいので stack にします!!!ただの名前なので!!!

currentValue は現在の値。

reduce の 引数が 1つの場合

const arr = [1,2,3,4]
const reducer = ( stack, currentValue ) =>{
  console.log(`stack: ${stack}`);
  console.log(`currentValue: ${currentValue}`);
  return stack+ currentValue;
}
console.log(arr.reduce(reducer));

これの処理の結果が

node main.js 
stack: 1
currentValue: 2
stack: 3
currentValue: 3
stack: 6
currentValue: 4

になる。順に見ていくと

ます、最初の「スタック」には配列の一つ目 1 が入ることになる。

それに「現在値」として配列の次の値に当たる二つ目の 2 が使われる。

そしての 「スタック」と「現在値」で引数の関数の処理が行われる。

この場合は二つを足す。その結果が「スタック」に入る。

なので「スタック」は 3 になる。

次の「現在値」は配列の次の値に当たる三つ目の 3 が使われ

「スタック」に加算されて 6 になる

最後に 配列の4つめの 4 が足されて 10。


reduce の引数2つめを入れる場合

今度は 引数の 2つめに 2 を入れてみよう。

arr.reduce(reducer, 2)

全体は

const arr = [1,2,3,4]
const reducer = ( stack, currentValue ) =>{
  console.log(`stack: ${stack}`);
  console.log(`currentValue: ${currentValue}`);
  return stack + currentValue;
}
console.log(arr.reduce(reducer, 2));

計算結果として

stack: 2
currentValue: 1
stack: 3
currentValue: 2
stack: 5
currentValue: 3
stack: 8
currentValue: 4
12

となり、最初に

2(reduceの第二引数) + 1 ( 配列の一つ目)

が実行されている。

そのあとは 配列の2つめ、3つめ、4つめ、と func の処理をしていく。

つまり array.reduce(func, arg2)

の第二引数は最初の stack の値になる。

式と文は違う

式:返り値を持っている 文:制御構造の1単位

semicolon で区切られる処理の一つ 式の方が役割が広い

{}

にも複文と、function 定義と、object literal 、jsont