2021年3月にやったこと

コンピュータシステムの理論と実装 ―モダンなコンピュータの作り方

おわった おもしろかった 今触っているコンピューターが何故動いてるのかはわからんが、なんらかのコンピューターが動く、ということに対してなんとなく納得した

NIST SP-800-63

openid-foundation-japan.github.io

とりあえずSP800-63-3までよんだ 対象読者ではないのでこれを読んで何を得ればよいのか、というところは正直ふらふらしている 世の中のすべての個人情報を扱うサービスがAAL2を求めるかというと、そうでもない気がするな、みたいな意味で それとは別に、Identity界隈で出てくる馴染みのない単語に馴染むための文章、という意味ではすごく有効だなと思った EnrollmentとかAssertionとかそういうやつ 読んでてわからんところをどうしたらいいのかわからん 聞く相手がほしい

Identity and Data Security for Web Development: Best Practices

Identityの勉強、何したらいいのかいまいちわからんので読んでみた ちょくちょくしっくりこない部分はあるんだけどパスワード関連のハッシュとかの話は整理できてよかった ざっくり何が書いてあるのかのまとめ

主に以下のような話がかいてあります
* セキュリティ要件にユーザーがかしこいことを求めるな
* in transit、at restなデータに対する暗号化をちゃんとやれ
* パスワードのエントロピーについて
* パスワードのハッシュ、どうする?(ソルトとかの話も含む)
* パスワードに対する攻撃いろいろと対策について
* UXを落とさずにセキュアにしたい(フィンガープリントとかの話)
* OAuth 2.0、OIDCについて(薄め)
* MFAについて
* FIDOについて(薄め)
* セッションの実装について(Express)
* あるあるな攻撃の話(XSSやらCSRFやら)
* SSL/TLSについて(ざっくり)

読んでてレインボーテーブルってよくわかってないなということに気づいたので整理した

zenn.dev

パスワード認証最強論: 貴方の〇〇認証、本当に安全ですか?

www.amazon.co.jp

Kindle unlimitedで読めたのでなんとなくよんだ

序盤の

  • 認証方式(生体、所有、知識)のメリデメ整理
  • クレデンシャルによる認証の実装分類と歴史の話

あたりがよかった

その他

WebIDながめたりした

かいた

dev.classmethod.jp

zennの触り心地がよかったので

zenn.dev

zenn.dev

zenn.dev

これからやること

  • AWS入門する
    • ECS
  • Webエンジニアが知っておきたいインフラの基
  • 入門監視
  • クリーンアーキテクチャ
  • 実践ハイパフォーマンスMySQL 第3版
  • プログラミングコンテスト攻略のためのアルゴリズムとデータ構造
    • 停滞気味
  • Linuxの仕組み
  • Goならわかるシステムプログラミング
  • 英語
  • 中国語
    • Toeic900超えるまで止める予定
  • ここ最近ほとんど業務でプログラミングをしなくなって、調整とかレビューとかばっかしてるがかなり雰囲気でやってるので、マネジメント系の本を読もうとしている
    • なにがいいのかよくわからん
  • Effective Go - The Go Programming Language
  • パタヘネ
  • OAuth2.0のクライアント書く
  • OAuth 2.0/OIDC関連仕様全部読む
  • WebAuthnのドキュメント読む
  • マイクロサービスパターン
  • コンピュータシステムの理論と実装 ―モダンなコンピュータの作り方
  • Identity and Data Security for Web Development: Best Practices
  • NIST SP 800-63
  • 数学やりなおし
  • DBS

2021年2月にやったこと

ダイエットやめた とりあえず自分の意思で体重が落とせることがわかった

会社ではRFC 6749を読む会をはじめた

コンピュータシステムの理論と実装 ―モダンなコンピュータの作り方

1月 NANDから各論理ゲートの実装→加算器実装→ALU実装→ゲートとDフリップフロップからレジスタやらRAMの実装→書いてみようアセンブリレジスタとゲートとALUでCPU実装してRAMと組み合わせてコンピューター実装→作ったコンピューターで動くアセンブラ実装→バーチャルマシン実装(いまここ)

2月 バーチャルマシン実装→コンパイラ実装→OSという名の標準ライブラリ実装(いまここ)

OSが微妙に残ってしまい2月中に終わらなかったがかなり終わりが見えてきた

これからやること

  • AWS入門する
    • ECS
  • Webエンジニアが知っておきたいインフラの基
  • 入門監視
  • クリーンアーキテクチャ
  • 実践ハイパフォーマンスMySQL 第3版
  • プログラミングコンテスト攻略のためのアルゴリズムとデータ構造
    • 停滞気味
  • Linuxの仕組み
  • Goならわかるシステムプログラミング
  • 英語
  • 中国語
    • Toeic900超えるまで止める予定
  • ここ最近ほとんど業務でプログラミングをしなくなって、調整とかレビューとかばっかしてるがかなり雰囲気でやってるので、マネジメント系の本を読もうとしている
    • なにがいいのかよくわからん
  • Effective Go - The Go Programming Language
  • パタヘネ
  • OAuth2.0のクライアント書く
  • OAuth 2.0/OIDC関連仕様全部読む
  • WebAuthnのドキュメント読む
  • マイクロサービスパターン
  • コンピュータシステムの理論と実装 ―モダンなコンピュータの作り方
  • Identity and Data Security for Web Development: Best Practices
  • NIST SP 800-63
  • 数学やりなおし
  • DBS

コンピューターシステムの理論と実装12章の除算のサンプルコードが何をしているのかよくわからなかったので整理

大変なことになってしまった

f:id:inabajunmr:20210222013304p:plain

  • ざっくり言ってしまえば、割り算の筆算を2進数でやっている
  • qは現時点で埋まった解答
  • x - 2 * q * y は、x - 今までの計算で引いてきた値を合計したやつ
  • 表の4段目の状態だと、qは10で、ここまで引いてきた値の合計は 10 * 110000000 + 0 * 110000000であらわせる(3段目の2つの★)
    • これが2 * q * y
      • 1つ前の表で計算したy * qをする必要があって桁を上げるために * 2している(4段目であれば q2 * y2 をしたいが、この時点でyはy3なのでy2に戻している
  • x - 2 * q * y < y の場合、今の桁の解答を1にして次の桁に進む(これが 2 * q + 1+1
    • 結果、次の計算のqは101になる(最後の1が+1の1)

おんなじようなことを10進数でやるとこんな感じになる

function devide(x:number, y:number, d:number):number {
    if(y > x) return 0
    let q = devide(x, 10 * y, d * 10)
    var i = 9
    if(y * i <= x - (q * y)) {
        return i * d + q
    }
    i--
    if(y * i <= x - (q * y)) {
        return i * d + q
    }
    i--
    if(y * i <= x - (q * y)) {
        return i * d + q
    }
    i--
    if(y * i <= x - (q * y)) {
        return i * d + q
    }
    i--
    if(y * i <= x - (q * y)) {
        return i * d + q
    }
    i--
    if(y * i <= x - (q * y)) {
        return i * d + q
    }
    i--
    if(y * i <= x - (q * y)) {
        return i * d + q
    }
    i--
    if(y * i <= x - (q * y)) {
        return i * d + q
    }
    i--
    if(y * i <= x - (q * y)) {
        return i * d + q
    }
    return q
}

2021年1月にやったこと

ダイエットしていた

f:id:inabajunmr:20210201221136j:plain

PICTのクローン書く

github.com

order増やすと返ってこなくなるのでそのへんの改善をいろいろしていた

あとサブモデル実装したら公開しようかなと思っているが止まっている

コンピュータシステムの理論と実装 ―モダンなコンピュータの作り方

今月はほぼこれ

前半は基本情報でやったやつが実際何に使われてるのかを勉強する会って感じ

NANDから各論理ゲートの実装→加算器実装→ALU実装→ゲートとDフリップフロップからレジスタやらRAMの実装→書いてみようアセンブリレジスタとゲートとALUでCPU実装してRAMと組み合わせてコンピューター実装→作ったコンピューターで動くアセンブラ実装→バーチャルマシン実装(いまここ)

ペース的に2月に終わるか微妙なライン

これからやること

  • AWS入門する
    • ECS
  • Webエンジニアが知っておきたいインフラの基
  • 入門監視
  • クリーンアーキテクチャ
  • 実践ハイパフォーマンスMySQL 第3版
  • プログラミングコンテスト攻略のためのアルゴリズムとデータ構造
    • 停滞気味
  • Linuxの仕組み
  • Goならわかるシステムプログラミング
  • 英語
  • 中国語
    • Toeic900超えるまで止める予定
  • ここ最近ほとんど業務でプログラミングをしなくなって、調整とかレビューとかばっかしてるがかなり雰囲気でやってるので、マネジメント系の本を読もうとしている
    • なにがいいのかよくわからん
  • Effective Go - The Go Programming Language
  • パタヘネ
  • OAuth2.0のクライアント書く
  • OAuth 2.0/OIDC関連仕様全部読む
  • WebAuthnのドキュメント読む
  • マイクロサービスパターン
  • コンピュータシステムの理論と実装 ―モダンなコンピュータの作り方
  • Identity and Data Security for Web Development: Best Practices
  • 数学やりなおし
  • DBS

Chrome拡張でお絵かきしたい

欲しい話

  • Chrome拡張からキャンバスが開いてお絵描きできる
  • 描いた絵をドラッグしてブラウザ側にもってける
  • たとえばNotion編集中にお絵かきして描いた絵をそのままNotionにアップロードできる

2020年12月にやったこと

AWSのDatabaseの資格とろうかなと思ってRDSのドキュメント読んでたけどまったくやる気がでないので一旦やめてTypeScriptに入門していた

相変わらずこれからやることリストを無視している

仕事ですぐに使えるTypeScript

TypeScriptやるならこのへんがよいというのを社の人に教えてもらったのでこれを読んだ

なんとなくざらっと書けるようになったのでよかった

一通り読んでとりあえずスネークゲームを書いた なんとなくかけた

起動周りめちゃくちゃなのでバグっている

github.com

PICTのクローン書く

冬休みはこれしかやっていない

ほんとうは

を冬休みの宿題にしようと思って12月頭に注文していたが、届かずに年が明けた

PICTは社のブログで知って最近ちょくちょく使うようになった

dev.classmethod.jp

便利

で、CLIじゃなくてブラウザでいじりたい(だいたいテストケース考えてるときはブラウザをみているのとGoogleスプレッドシートといい感じに連携したい)気持ちになった あとしらないサーバーに業務で書くコードのテストケース送りたくないなとか

inabajunmr.hatenablog.com

なのでTypeScriptでまるごとクローンしようと思って書いている

TypeScriptのチュートリアルをやっていたのはこれをやるため

とりあえずX組の因子でテストケースを出す、みたいのはかけた

Constraintsはサポートしてない機能がありつつもなんとなく動く、くらいまでかけたが、Constraintsを実装したらコードがかなり終わった だいたいそんな状況

かいている

github.com

冬休みで一段落させたい

DBS

RDSのドキュメント読んでた

モチベーションが全然でないのでこまった

その他

クソアプリアドベントカレンダーのネタ

inabajunmr.hatenablog.com

Base64エンコードの実装をした

しました

これは多分実際に実装なり何なりをしていたのは10月とか

ポエム

かいた

inabajunmr.hatenablog.com

ソフトウェアデザイン 2021年1月号

レビューの話をかいた

これは多分10月とか11月とかにしていたので12月はとくにしていない

レビューのインセンティブが偏るとレビューする人も偏るよねとかそういうのを書きました

眺めた

kratosが100パーAPIファーストでログインとか提供してるというfeatureが書いてあったのでどうやってんだろと思ってながめていた

ついでにsupertokensもみていた

github.com

github.com

これからやること

  • AWS入門する
    • ECS
  • Webエンジニアが知っておきたいインフラの基
  • 入門監視
  • クリーンアーキテクチャ
  • 実践ハイパフォーマンスMySQL 第3版
  • プログラミングコンテスト攻略のためのアルゴリズムとデータ構造
    • 停滞気味
  • Linuxの仕組み
  • Goならわかるシステムプログラミング
  • 英語
  • 中国語
    • Toeic900超えるまで止める予定
  • ここ最近ほとんど業務でプログラミングをしなくなって、調整とかレビューとかばっかしてるがかなり雰囲気でやってるので、マネジメント系の本を読もうとしている
    • なにがいいのかよくわからん
  • Effective Go - The Go Programming Language
  • パタヘネ
  • OAuth2.0のクライアント書く
  • OAuth 2.0/OIDC関連仕様全部読む
  • WebAuthnのドキュメント読む
  • マイクロサービスパターン
  • コンピュータシステムの理論と実装 ―モダンなコンピュータの作り方
  • DBS

Hannya64

本記事はクソアプリ2 Advent Calendar 2020の24日目の記事です。

Hannya64

https://inabajunmr.github.io/Hannya64/

デモ

f:id:inabajunmr:20201201235121g:plain

Base64の実装

注意

  • 筆者は普段こういうコードを全く書かないので、なんか間違ってたら教えて下さい
  • 効率とかは全然意識してないです
  • パディングとかURLエンコードの話とかはないです

基本的な方針

バイト列を先頭から3バイト取り出し、6ビット4つに変換する。6ビット(0〜63)を、文字列にマッピングしていく。

こちらを参考にさせてもらいました。

Algorithm Implementation/Miscellaneous/Base64 - Wikibooks, open books for an open world

実装

エンコード前のバイト配列を以下とする。

10000000 11000000 11100000 11110000 11111000 11111100

3バイトずつ処理する。最初は先頭の3バイトを処理する。

10000000 11000000 11100000

3バイトをくっつけて24ビットにする。 まず1バイト目を16ビット左シフトする。

10000000 << 16

結果右に0が16個くっついて以下になる。

        <---------------
100000000000000000000000

2バイト目を8ビット左シフトする。

                <-------
000000001100000000000000

3バイト目はそのまま。

000000000000000011100000

1つ目と2つ目をORでつなぐ。

100000000000000000000000 |
000000001100000000000000

ビット演算子のORは、いずれかが1だったら1になるので、以下のようになる。

100000001100000000000000

つないだ結果と3つ目もORでつなぐ。

100000001100000000000000 |
000000000000000011100000

結果、24ビットの列ができる。

100000001100000011100000

24ビットの列を18ビット右シフトして6ビット取り出す。

100000001100000011100000 >> 18

右シフトすると、左から0が詰められて右側のビットはあふれて消えるので、以下のようになる。

----------------->
000000000000000000100000

24ビットの列を12ビット右シフトして次の6ビットを取り出す。

----------->
000000000000100000001100

001100 だけを取り出したいので、111111 とANDで右から6桁だけ取り出す。

000000000000100000001100 &
000000000000000000111111

ANDは両方とも1だった時だけ1になるので以下になる。

000000000000000000001100

同じようにして次の6ビットも取り出す。

100000001100000011100000 >> 6 & 000000000000000000111111

最後の6ビットも同様に取り出す。最初の24ビットのうち、最後の6ビットを取り出せばよいので右シフトは不要となる。

100000001100000011100000 & 000000000000000000111111

この結果、この3バイトが

10000000 11000000 11100000

6ビット4つに変換できる。

100000 001100 000011 100000

6ビットなので、ここで得たそれぞれの値は000000(0)から111111(63)の64パターンになる。 10進数に変換すると以下になる。

32 12 3 32

以下のような文字列を用意する。

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/

A が0で、/ が63として文字列のインデックスと数値の対応を変換すると以下になる。

gMDg

残った3バイトも同じ方法で変換していくと以下になる。

gMDg8Pj8

コード

Hannya64/hannya64.js at main · inabajunmr/Hannya64 · GitHub