Linuc 101 Linux - 秘密鍵方式の通信と GitHub を例にした認証
秘密鍵と公開鍵
秘密鍵とは
公開鍵暗号(こうかいかぎあんごう、Public-key cryptography)とは、暗号化と復号に別個の鍵(手順)を用い、暗号化の鍵を公開できるようにした暗号方式である。
二つの鍵を用意し、一方の鍵を公開しても良いのとして扱える手法のようだ
Linux や GitHub を使う場合の ssh 通信では自動的に公開鍵暗号を使われる
暗号化したデータの送受信
メッセージのやり取りとして、password zip メールなどより遥かにしっかりしたものとして 共通鍵暗号方式がある。
通信の流れでは
まず、データの受け取り側が 秘密鍵を作り、秘密鍵から公開鍵を生成し、データの送信側に送る。
次に、データの送信側が 公開鍵を受け取り、データを公開鍵で暗号化し、暗号化したデータをデータの受け取り側に送る。
最後にデータを欲しい方が最初に作った自分の秘密鍵で 暗号化を解除する
という流れになる。
認証
認証ではやることが異なる
この「鍵交換」が必要になる。
双方向にお互い鍵ペアを生成して、公開鍵を送り合う。
クライアントが作る鍵のペアが認証鍵
サーバーが作る鍵のペアがホスト鍵
認証鍵
認証では認証データの送信側のユーザーが自分の公開鍵で暗号化させた認証データを送り、その公開鍵も送る。
( GitHub で公開鍵を登録しているのがこれのことだと推量する。)
( GitHub と違って GUI がないサービスでは CUI で ~/.ssh/authorized_keys
に打ち込む)
受け取って認証する側のサーバーが 送信側のユーザーの秘密鍵で「検証」し受け入れる。
とにかく「公開鍵で認証」するのが試験で問われるポイントらしい。
ホスト鍵
ホストでも鍵を作り、逆のことをやる
サーバーが作る鍵のペアがホスト鍵
こちらでは サーバーが作った公開鍵をクライアントの known_hosts
にぶち込む!
... しかし、実際に編集することは少ないらしい。
GitHub では 公開されてる SSH フィンガープリントを対話式で初回ログイン時に貼り付けるらしい。確かやった気がする。
秘密鍵方式と認証まとめ
秘密鍵方式を図示しての復習ができて
ツイートした際に記事の作者様に教えてもらったことによって
認証では双方向に公開鍵の送り合いをしてることがわかってよかった!!!
angel_p_57 さんありがとうございます
ssh の公開鍵は主に認証
https://qiita.com/angel_p_57/items/19eda15576b3dceb7608
またこの人の記事が分かりやすかった
上記の公開鍵 秘密鍵の基礎知識があるとさくっと読める
ssh ではクライアント端末を使ってのサーバーでの CUI コマンド実行、ホームページアクセスなどの通信のトンネル作成、などが出来る
どちらも認証しなければ使えないものであり、その認証に ssh と公開鍵 ニアリーイコール 認証鍵が使われる
公開鍵暗号方式での暗号化は実際にはあまり使われず、公開鍵を主に使うのは認証になる
初めての確定申告@2021.04.01
確定申告とは?
自分の売り上げなどと税金の自己申告 & 自己納税。
2021.04.15 締め切りで
2020.01.01 ~ 2020.12.31 までの給与、事業所得などの
why
業務委託の分。
初めてなので覚え書きしとく
税金のかかり方についての問合せ。
まず横浜の税務署に電話で聞いた。
業務委託の給与は報酬として換算される。そこの金額を売り上げとして計算する
売り上げから基礎控除が 470k くらい引かれる
そこから 経費の額を引く。
その額に
5% の国に収める所得税
10% の地方自治体に収める住民税
がかかることになる。
つまり 売り上げからかかった経費を引いた純粋な収入に、 基礎控除で控除分引いてもらった残りの額に
15% の税金がかかることになるらしい。
払い方
まずは確定申告をする。
id pass方式は事前に税務署で発行が必要
だ、そうです。
両方かったが、確定申告フォームに入力して印刷したものを持っていけばできた。
その 郵送期限と、所得税の支払い期限が 04/15 になるので、 それまでに書類作って郵送か直接渡して税金を払うか還付を受け取る。
コンビニのファミポートなどで支払いできるらしい。 あとは横浜だと関内の何かの施設。
このとき払えるのは国に収める 5% の所得税のみ。
住民税は後ほどになるらしい。
実際に申告と納税をする
公式サイトのフォームで pdf が作成できる。
バイトの給与、個人事業での報酬とそこの源泉徴収の欄などを埋めると、
pdf が作成された
隠すとこ多くて処理をするのが面倒だったので上部ごく一部のみ。
今日は 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
プロセスを 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 ) が便利。
式と文と演算子
文は {} を持つものと輸出輸入と宣言
if などの {} を持つフローや関数と反復処理、
import , export,
var, let, const の 宣言
文としてはこれらがある。
これらは全て console.log() で打ち出そうとしても出力できない。
逆にこれら以外のものは全て「式」であり、cll で打ち出せば何かが出る。
代入演算と式の評価と変数宣言
代入演算の 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);
なんとこんな狂ってる文でも返ってきてしまうのだ...
式と文の区分まとめ
よって const や let を使わない 超グローバル変数宣言は「式」であり
const や let を使う 変数宣言のみが「文」である
他には前述したように、スコープ {} を持つものや im, export が cll で打っても結果が帰ってこない「文」であり、そのほかは全て「式」である。
function の 即時関数は式扱いらしい(要検証)
演算子の例
わかりやすいものには
===, !=, >, <,
などの比較演算子
&&, ||,
の論理演算子
( 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 の逆。
Code Runner の OUTPUT の場所では打てないが、設定で解決できるようだ
設定で 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
これを参考にした
VScode を開いて Extension の Code Runner を入れる
#include <iostream> using namespace std; /** * Hello!VisualStudioCodeを出力 */ int main() { cout << "Hello!VisualStudioCode" << endl; return 0; }
コードを書く
右上の三角ボタンで実行
テキストを書う
ソースコードはあったが
There is no application set to open the document “MKCPP01.LZH”.
apps.apple.com
Unarchiver を install
右クリックで open with で .lzh 圧縮をひらけた〜!!
文字化け
文字化けする.... utf8 でこれだ
shift-jis で開き直してみる
ソスソスソスソスソスソスソスソスソスソスソスソスソスソスソスソスソスソスソスソスソスソスソスソスソス
ソスソスソスソスソスソスソスソスソスソスソスソスソスソスソスソスソスソスソスソスソスソスソスソスソス
ダメだ諦める。手打ちする。
js array.reduce(func, arg) の第二引数がある場合とない場合の処理
why
map とは別のこの処理が必要になった
main
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