宮水の日記

宮水の日記

主に書評や資格取得について記事を書いています。

エンジニアが「独学大全」を読みました

f:id:kattyan53:20210614164831p:plain
今日は、「独学大全」を読みました。定期的に読み返したいなと思った部分をメモしました。

なぜ読んだのか

エンジニアって学ぶことがたくさんありますよね。「土日のうちに1冊 本を読んでから or ちょっと手元で動かしてみてからこのタスクに取り掛かりたい!」と思うことはしょっちゅうあります。また、常に新しい技術が出てきて「質問したいけど、わからないこともわからない」といったことが頻繁に起こります。今回は、「新しい技術をできるだけ効率よく学びたい!」というモチベーションでこの独学大全を読みました。

どんな本だった?

一言で言うと、巷に溢れかえっている勉強方法のテクニックがギュッとまとめてあり、そのテクニックを辞書のように読むことができる本です。

本のサブタイトルに、「55の技法」と書いてありますがその通り、独学に関するテクニックやフレームワークが55個紹介されています。最後の部では、これまで学んだ独学の技法を使って、国語、外国語、数学の3つのケースについて独学する事例を取り上げています。

個人的には、「目標へのモチベーションの保ち方」「情報の見つけ方」「情報の整理の仕方」「本の読み方」という点において読んで非常に良かったと思いました。もちろん何か新しいことを学びたい人に役立つテクニックも多く載っていましたが、特に「課題などでレポートを書く学生」に向いている本だと思いました。

どんな人に向いてる?

  • 新しいことを学びたい人
  • 学びたいことが決まっているけど、何から手をつけたらいいかわからない人
  • 学生
  • 課題でレポートを書いている人

本の概要

第1部 なぜ学ぶのかに立ち返ろう
継続は力なり。独学で一番難しいのは「続けること」であり、どうやったら続けられるのか、そのテクニックについて紹介されています。

目標遂行へのモチベーションの保ち方
  • 「どうしてそれを学びたいと思ったのか」強い動機を書き出し、それを定期的に見返して原点に立ち返る。
  • 「今の自分の現状と、学習した後にどうなっていたいか」を考え、具体的な目標に落とし込んでいき、学習ロードマップを作る。
やる気がないとき
  • やる気がなかったらとにかく「3行読む」「1分間だけ勉強する」
  • 小さい習慣から始める。その後本当に習慣にしたいことを始める。(例えば、本当の目標が英単語を一日30個覚えたい、だったら、まずは1日1個覚えることから始めてみる)
  • 人に宣言する。
  • 輪読会に参加する(当日までに読んでおき、感想を言い合うのがオススメ)
時間がないとき
  • 独学する時間がとれないと感じたら、理想の予定と実態の予定を書き出し、どうして時間がないのか分析する。
  • ポモドーロ・テクニックを使う。(25分間にセットし、作業を開始する→5分の休憩は作業に関係のないことをして過ごす(スマホSNS NG)4回ポモドーロをしたら、30分間休憩する。)


第2部 何を学べば良いかを見つけよう
全く知らない技術を学ぶとき、自分のレベルに合った技術書を探したり、同じ技術でも自分が求めていることが書いてあるのか見極めるのが難しかったりしますよね。
この部では、知らないことを探し求めるための技術、調べ物のスキルとノウハウ を学べます。
このブログでは紹介しませんが、図書館で調べ物をしてレポートを書かなければならない学生は絶対読んだ方がいい内容が盛りだくさんでした。

知りたいことの発見の仕方

① 取り組もうとしている分野や課題について、なんでもいいから思いつく限り書き出す
② 知っているものを四角で囲む
③ 調べたものを二重四角で囲む
④ 全体像を線で結んでいく
⑤ 気になったものに丸をつける ← これが学びたいことになる

何がわからないのかを整理するフレームワーク
  • hogeは何の一種か?
  • hogeは同じグループの中で他とどこが違うのか?
  • hogeを構成する部分を列挙すると?
  • hogeとは何か?
  • hogeの語源は?
  • hogeの反対は?
  • hogeを生じさせたものは?
  • hogeから生じたものは?
資料を探し出す
  • インターネットは役に立たない。検索キーワードを色々変えてみる。除外するキーワードも考える。
  • 下位概念、上位概念で探索を行う。(ヘミングウェイアメリカの文学者→英米文学者→文学者→人みたいな感じでどんどん抽象的な言葉、もしくは具体的な言葉で調べていく)
  • 文献を読んでいく。
  • 知っていることを書き出す→知らないことを問いに変換する→調査の過程を記録にとる→しつこく繰り返す
資料の整理

① 独学のテーマごとにマトリクスを作る
② 文献のタイトル、著者などを表の左端のますへ入力する
③ 目次から「見出し」を拾い出し、マスへ入力する
④ 必要なら各省の概略を追記する
⑤ 同じ/似た内容をマーキングしたり囲んでつないだりする
⑥ 文献を横断読みしながら気づいたことを抽出し、整理する

第3部 どのように学べば良いか知ろう
ここでは、本の読み方、暗記の仕方、わからない問題に対する対処法について学びます。特に本の読み方が色々あって非常に参考になりました。

本の読み方
  • 転読 ... ページに目を落としたまま、出来るだけ速くページをめくっていく。
  • 掬読 ... 読むべき部分だけを読む。
  • 問読 ... 文献の見出しを拾い出し、問いの形に変換する。(例えば、「マルサスの罠ってなに?」という問いにする)その後、要約を作る。
  • 限読 ... 読む本を決め、費やす時間をあらかじめ設定する。設定した時間内に読む。
  • 黙読 ... 声を出さずに文章を読む。速度、理解度、記憶という面で優れている。
  • 音読 ... 声を出して文章を読み上げる。学習者の身体に刻み込み、反射的・自動的に用いることができるようにする。
  • 指読 ... 今読んでいる箇所を指やペン先で指す。難しい文章を読むときにおすすめ。
  • 刻読 ... あらかじめざっと読み、全体の構成や概要を掴んでおく。必要なところに印を残しておく。印を残したところを辿っていく。
  • 段落要約 ... 段落ごとに1行にまとめていく。
「わからないルートマップ」で何がわからないのか整理する
  • 不明型のわからない ... わかる部分が全くないかほどんどない。

=> 解決法:部分に分ける→部分ごとの解釈を仮定する

  • 不定型のわからない ... 部分部分は理解できなくはないが、いろんな解釈がありすぎてどれが良いか決められない。

=> 解決法:全体の文脈を仮定する→部分それぞれの解釈を限定する

  • 不能型のわからない ... とりあえずどんな風に理解すればいいのか決まってきたが、まだ不整合や矛盾するところが残っていて首尾一貫した解釈ができていない状態。
難しい問題は...
  • まずは問題を解く→もう一度解いてみる→思考を実況中継しながら解く→誰かに説明する→自分に説明する

第4部 独学の「土台」を作ろう
これまで学んだ独学の道具を使って、国語、外国語、数学について独学する事例を取り上げています。

まとめ

今回は、「新しい技術をできるだけ効率よく学びたい!」というモチベーションでこの本を読みました。
第2部では、何から手をつけたらいいのか考える方法や、自分に合った適切な技術書を探し出す方法を学べました。
第3部では、特に限られた時間で効率よく技術書を読むヒントが得られました。

まずは学びたい技術ごとに学習ロードマップをスプレッドシートに書くところから初めてみようと思います。


以上です。ここまでお読みいただきありがとうございました!

「入門 Kubernetes」を読みました

f:id:kattyan53:20210525204403p:plain

入門 Kubernetesを読みました。

なぜ読んだのか

最近kubernetesの設定ファイルを触ることがあったんですが、コピペして雰囲気でやってしまったので、ちゃんと入門することにしました。全部読んで完全に理解するというよりは、読みながら仕事のコードでよく使う設定ファイルを読んでみようと思います。

対象読者

  • Kubernetes入門したい人
  • (ロードバランサやネットワークストレージの理解があるとより良い)
  • LinuxLinuxコンテナ、Dockerの経験があるとより良い)

この本で学べること

  • Kubernetesクラスタオーケストレータについて
  • 分散アプリケーションの開発、デリバリ、メンテナンスを改善するためにKubernetesのツールおよびAPIがどのように役立つのか

1章 Kubernetes入門

この章では、Kubernetesの利点について学びます。

Kubernetesとは

Kubernetesは、コンテナ化されたアプリケーションをデプロイするための、設定や管理を自動化・自律化するためのシステムのこと。

Kubernetesの利点① 開発速度を上げてくれる

理由① イミュータブルなインフラだから
 Kubernetesは、イミュータブルなインフラです。一度システム上で成果物を作成したら、ユーザによる更新があってもその成果物は変更されません。既存のシステムを更新する代わりに、全く新しいイメージに置き換えます。既存のイメージを変更せずに新しいイメージを構築すると、古いイメージを残しておけるので、ロールバックが簡単になります。

理由② 宣言的設定のオブジェクトだから
 またKubernetesは、宣言的設定のオブジェクトでもあります。「Aを起動、Bを起動、Cを起動してください」とお願いするのではなく、「レプリカ数は3に等しい」という設定を行います。そのため、間違えたときに元に戻すのが簡単です。

理由③ 自己回復するシステムだから
 Kubernetesは、システムが望ましい状態に一致するように継続して動きます。例えばレプリカ数が3になるようにKubernetesに対して操作したとき、私がレプリカをもう一つ増やして4つにすると、Kubernetesは、数を3つに合わせるためにレプリカを一つ削除してくれます。

Kubernetesの利点② サービスもチームもスケールしやすい

Kubernetesでは、Pod、Service、Namespace、Ingress...など、分離されたマイクロサービスアーキテクチャの構築を簡単にする抽象化層やAPIを提供しています。色々分離されているので、サービスも開発もスケールしやすいということみたいです。

2章 コンテナの作成と起動

リポジトリcloneしてきて、Dockerfileもちゃんと書いて立ち上げようと思ったんですけど、結局動かせず...。デバックする気力はありませんでした...😇

この章では、アプリケーションのコンテナ構築について詳しく入門していきます。なぜDockerなのかというと、Kubernetes がサポートしている主要なイメージフォーマットの中で最も使われているのはDockerイメージフォーマットだからのようです。

アプリケーションコンテナ(Dokcerのこと)を使うと、アプリケーションを綺麗に抽象化できます。

(SREさんも「抽象化」という言葉を使っていたのですが、この「抽象化」ってどういう意味なんですかね...。アプリケーションの構成をファイルに落とし込むこと...? )

Dockerを使って、同じOS、同じバージョンのライブラリを使った環境についてビルドもデプロイも配布も簡単になることがわかりました。

3章 Kubernetesクラスタのデプロイ

この章では、先ほど作ったアプリケーションコンテナを、どのようにKubernetesをデプロイするのか、クラスタを作る簡単な方法を学びます。

Google Kubernetes Engine、Azure Container Service、Amazon Web Serviceへのインストール方法や、minikubeを使ったローカルへの Kubernetesのインストール、Raspberry PiKubernetesを動かす方法が紹介されています。

4章 よく使う kubectlコマンド

よく使うkubectlコマンドについて学びます。

Kubernetesオブジェクト

Kubernetes上にあるものは、すべてRESTfulリソースで表せ、これをKubernetesオブジェクトと呼ぶ。

kubectl get pods

Kubernetesオブジェクトをみる一番基本的なコマンド。動作中のPodのステータスを見ることができる。現在のNamespace内のそのリソースのすべてを一覧表示してくれる。
kubectl get <リソース名> <オブジェクト名> とかもみれる。

kubectl describe <リソース名> <オブジェクト名>

オブジェクトの詳細を人間に読めるフォーマットで複数行にわたって表示。

kubectl apply -f obj.yaml

obj.yamlに書かれたオブジェクトをKubernetes上に作成する。

kubectl delete -f obj.yaml

オブジェクトの削除。

kubectl label pods bar color=red

barという名前のPodにcolor=redというLabelをつける。

kubectl logs

デバッグ用コマンド。

kubectl exec -it --bash

コンテナ内でコマンドを実行したいときに使う。

kubectl help

ヘルプ。

5章 Pod

この章ではPodについて学びます。Podマニュフェストを書いて、Podを動かしたり、Podを一覧表示したり、Podにアクセスしたり、ちゃんと動いてるかチェックしたり、リソース管理をしたりします。

Podとは

Kubernetesクラスタ上では、コンテナではなくPodが最小のデプロイ単位。
「このコンテナはそれぞれ違うマシンに配置されても正常に動作するか」で答えが「動作しない」なら、Podとしてまとめて正解。

Podにアクセスする

Kubernetes APIコマンドラインツールには、ポートフォワード機能が備えられており、以下のようなコマンドを実行すると、このコマンドが動いている間はPodにアクセスできる。

kubectl port-forward kuard 8080:8080

Kubernetesのマスタを経由して、ローカルマシンとワーカノードの内の1台で動いているPodのインスタンスの間にセキュアなトンネルを作ってくれる。

livenessProbe

Podが起動しているかどうかのヘルスチェック。

readinessProbe

Podが応答できるかどうかのヘルスチェック。

resources

Podのリソース管理の設定

volumes

永続的なディスクにアクセス可能にする仕組み。

6章 Labelと Annotation

Label

Kubernetesクラスタ上のオブジェクトを識別したり、グループ化したりするのに使う。

Annotation

Labelと似た機能。ツールやライブラリを便利に使用するために必要になる、オブジェクトを特定しない情報を入れられる。

7章 サービスディスカバリ

サービスディスカバリ

何かを見つけるという問題と、その解決策のこと。(?)
サービスディスカバリツールは、どのプロセスがどのアドレスでどのサービスのために待ち受けているのかを見つける際に起きる問題を解決する。(うーん、難しい。)

Serviceオブジェクト

クラスタ内外に対してサービスを公開するための方法。サービス間を接続したり、サービスをクラスタ外に公開したりできる。

8章 ReplicaSet

ReplicaSet

指定したテンプレートに従った正しい数のPodが常に動いているようにする、クラスタ全体のPodマネージャ。冗長化のためにレプリカを複数作り、サービスを作る方法。

水平スケール

レプリカを追加で作成すること。

垂直スケール

あるPodに必要なリソースを増やすこと。

9章 DaemonSet

DaemonSet

Kubernetesクラスタの全ノード、あるいは特定のノードの集合でPodを動かすための、手軽な抽象化の仕組み。

10章 Job

Jobオブジェクト

一回限りの、短時間だけ動かすタスクを扱うもの。

11章 ConfigMapと Secret

ConfigMapとSercret

アプリケーションで動的な設定を使うのに適した方法。これらの機能によって、コンテナイメージを一度作成したら、開発環境、ステージング環境、本番環境で全く同じイメージを使うことも可能。

kubectl get secrets

Namespace内の全Secretを一覧表示できる。

kuubectl get configmaps

Namespace内のConfigMapを一覧表示できる。

12章 Deployment

Deploymentオブジェクト

新しいバージョンのリリースを管理する仕組み。
DeploymentはReplicaSetを管理する。
kind: Deployment と書いてあったらDeploymentの設定ファイル。

kubectl describe deployments nginx

Deploymentの詳細情報を確認できる。

kubectl rollout history deployments nginx

ロールアウトした履歴が表示できる。

13章 ストレージソリューションとKubernetesの統合

まとめは割愛します\(^-^)/

14章 実用的なアプリケーションのデプロイ

まとめは割愛します\(^-^)/

まとめ

今回は、

  • kubectlコマンドの使い方
  • Podについて
  • 仕事のコードで使われているKubernetes オブジェクト

を中心に本書を読みました。実際に(業務に支障のない範囲で)kubectlコマンドを打ってみたり、kubernetesの用語を確認しながらファイルを読んだりできてとても良かったです。個人的には、マニュフェストファイルにある kind: というところがKubernetesオブジェクトなんだ〜ということがわかっただけでも大きな収穫でした。Kubernetesの全体像に一歩近づくことができました。

しかしながら、自分は泥臭くサーバーを立てたり運用したことがないので、ピンと来ない説明も結構ありました。インフラのカタカナ用語が多くて意味が理解できない文章も結構ありました。これに関しては別の本で、インフラやkubernetesの歴史も補っていこうと思います。

ここまでお読みいただきありがとうございました!

ゼロからのOS自作入門 〜画面描画からマウスの入力受付まで〜

みなさんこんにちは!宮水です。今回は、マウスの作成まで(本書の7章まで)を通して自分なりに分かったことを日記として投稿します。

f:id:kattyan53:20210513081239p:plain

環境構築・ブートローダの作成まではこちら!miyamizu.hatenadiary.jp

ゼロからのOS自作入門

ゼロからのOS自作入門

4章 ピクセル描画とmake入門

この章でやること
  • makeを使ってみる
  • OS本体から絵を描く方法を学ぶ

画面に黄緑色の四角を描くことができました。
f:id:kattyan53:20210513125516j:plain

make

コンパイルやリンクなどの作業を自動化するツール

GOP (Graphics Output Protocol)

グラフィックス表示プロトコルの一つ。(ググっても全然情報が出てこなかった…)

System V AMD64 ABI

プログラムとCPUの相互作用を機械語レベルで規定する。プログラムが動作するにあたり必要なレジスタやメモリの使い方が決まっている。重要な項目に呼出規約があり、引数、戻り値、関数の中で変更していいレジスタなどを定めている。

5章 文字表示とコンソールクラス

この章でやること
  • OS本体から画面に文字を表示する
  • フォントを読み込んだりする
  • 出力専用のコンソールを作る

こんな感じで、フォントを適用して文字が表示されるようになりました!
f:id:kattyan53:20210515184014p:plain

バッファ

データを一旦蓄えておける場所のこと。

リンカ

リンカとは、機械語のプログラムの断片を適切に結合し、実行可能なプログラムとして生成するためのプログラムです。

リンカ – プログラミング用語解説|Unity高校&ゲームスクールのG学院

ld.lldコマンド(3章の復習)

オブジェクトファイルから実行ファイルを作成する。

6章 マウス入力とPCI

この章でやること

マウス入力を受け付けられるようにします。

  • マウスカーソルの描画
  • PCIバイスの列挙
  • xHCを探して初期化
  • ポーリング方式でマウスカーソルが動くようにする

USB接続されたマウスでも、ThinkPadタッチパッドでもカーソルが動くようになりました!
f:id:kattyan53:20210515184001p:plain

PS/2のエミュレーション

PS/2は接続の規格。エミュレーションとは、ポインタを動かしたり、クリック操作をしたりマウスを動かす操作のことのようです。

バス

電気信号を送る

シリアル

1本の信号線を使って信号うが1ビットずつ送られるという意味。

ドライバ

制御チップのようなハードウェアを扱うためのソフトウェアのこと。

xHC(Extensible Host Controller Interface)

xHCIと同義…なんですかね…?これもググってもあんまり出てこなかったです…)

xHCIとは、USB接続の周辺機器とコンピュータ本体の通信を制御するUSBコントローラの種類の一つで、USB 3.x規格に対応したもの。

https://e-words.jp/w/xHCI.html


https:/https://e-words.jp/w/xHCI.html
/e-words.jp/w/xHCI.html

PCI(Peripheral Component Interconnect)

部品とマザーボードを繋ぐための規格

PCI コンフィギュレーション空間

PCIバイスのベンダIDやクラスコードなどPCIバイスに関する基礎的な情報が書かれている。

ポーリング方式

イベントが来ているかどうか問い合わせる方式。

7章 割り込みとFIFO

この章でやること
  • 先ほどポーリング方式で作ったマウス入力を割り込み方式にする

割り込み処理は、以下のサイトの図がわかりやすかったです。
「マウスが動きましたか?」と毎回問い合わせるのではなく、マウスが動いたらそのときやっている処理を一時中断してマウスを動かし、元の処理に復帰するようにコードを書き換えていくそうです。
割り込み処理 | 東芝デバイス&ストレージ株式会社 | 日本

割り込み方式

イベントが到達したときにハードウェアがOSに通知する方式。

割り込みハンドラ

割り込み発生時に実行される関数のこと。

割り込みベクタ

割り込みには色々種類がある。割り込みの種類ごとに異なる割り込み要因番号が割り振られている。これを割り込みベクタという。

IDT(割り込み記述子テーブル)

割り込み要因番号と割り込みハンドラを対応付けるための表のこと。

MSI 割り込み

PCI規格が定める割り込みの発生方法。

FIFO

先入れ先出し。キューのこと。本書ではこの方式を使って割り込み処理を高速にする。

FILO

先入れ後出し。スタックのこと。

まとめ

今回は、文字表示やマウス入力の受け付けが終わりました!
画面に何か表示されると達成感があって楽しいですね☺️

また、基本情報でなんとなく丸暗記していた単語が多く出てきました。
実際に実装されているところを見るとより意味がわかったような気がします☺️ それでもやっぱり難しいですが...。

ゼロからのOS自作入門

ゼロからのOS自作入門

ここまでお読みいただきありがとうございました!

ゼロからのOS自作入門 〜環境構築からブートローダの作成まで〜

ゼロからのOS自作入門を購入しました!このブログでは、環境構築からブートローダの作成まで(本書の3章まで)を通して自分なりに分かったことを日記として投稿します。(調べながら書いたので、である調とですます調が混ざってますが、大目にみてください。)

ゼロからのOS自作入門

ゼロからのOS自作入門

f:id:kattyan53:20210430134705p:plain

読んだ理由

この本をTwitterのタイムラインで見かけて、元々〇〇自作にとても興味があり、面白そうだと思ったので購入しました。普段当たり前のようにお世話になっているOSですが、全く知らないのでこの本を通して学んでいきたいと思いました。

対象読者

本書によると、「簡単なプログラムを書いたことがある人」とのこと。

この本で学べること

  • CやC++を使って"全部自分で"OSを自作する

私のスペック

  • 普段はよくRubyを書いており、ソフトウェアエンジニアをしています。CやC++は今回初めてです。
  • よく使っているOSはmacOSです。
  • Vim、Git/Githubは調べながら使えます。
  • 基本情報技術者に2年くらい前にギリギリで合格しました。
  • 自作は全く初めてです。(mountコマンドの意味さえ知りませんでした。)

3章までやった感想としては、「とりあえず動かせるので楽しいけど、前提知識がなさすぎて解説が80%くらい理解できない」という感じです。

開発環境の構築

本書によると、2012年以降に発売されたパソコンを使うことが推奨されており、UbuntuWindowsで仮想環境を作ってLinuxが使えるようになるWSL (Windows Subsystem for Linux) 、QEMU(仮想環境)を使うやり方が紹介されています。

私は最初ベストな環境構築が分からなくて、1週間くらいハマりました。本当はMacで開発しようと思っていたのですが自分がよく分からないものは入れたくなかったので、フリマアプリで壊れてもいいパソコンを買って、本書で紹介されているLinux環境を作ることにしました。パソコンのスペックとUSBは以下です。

Lenovo Thinkpad X121e

  • 8500円
  • CPU:Core i3-2357M 1.3GHz
  • メモリ:DDR3 4GB
  • HDD:320GB
  • wifi繋げられる
  • USB挿せる
  • OS:Windows 10 Home 64bit

② USB

  • 数百円
  • 8GB
  • 規格はUSB3.0(私の買ったLenovo Thinkpad X121e はUSB2.0しか使えないので、3.0のUSBを買っても2.0の速さしか出ないらしいです。よくわかってませんが。)

Windows10を完全に削除してUbuntuをインストールして開発を進めました。以下の記事が参考になりました。
yoshinorin.net

BIOSの設定は、「ThinkPadロゴが出たらF1を長押し」でいけました。私が購入した機種ではセキュアブートは設定されていなかった(設定できない?)ようで、BIOSのStartupのBootの設定から、起動時の設定でUSBの優先度をあげると、USBからでも無事起動できました☺️

試行錯誤した結果、最終的に開発環境と動作確認用端末が一緒になってしまったので、今はQEMUを使って開発を進めています。

1章 PCの仕組みとハローワールド

この章でやること

バイナリファイルを書いてUSBに配置して起動させます。

ブートローダ

ブートローダとは、OSをメインメモリに読み込み、起動させるプログラムのこと。

BOOTX64.EFIファイル

実行可能ファイルといって、CPUが実行可能な機械語を含んだファイルのこと。

CPU

デジタル回路で構成されており、電圧の高低、すなわち2進数を扱う。今回バイナリファイルを16進数で書いたのは、16進数の方が2進数に変換しやすいから。

UEFI

オペレーティングシステム(OS)とプラットフォームファームウェアとの間のソフトウェアインタフェースを定義する仕様のこと。OSを起動するために必要な機能を提供するブートサービスと、OS起動前、起動後どちらでも使える機能を提供するランタイムサービスから構成されている。
Unified Extensible Firmware Interface - Wikipedia(ja)

UEFI BIOS

UEFIという標準仕様に従って作られたBIOSのこと。本書でやったファイルシステムFATでフォーマットされた起動ディスクの \EFI\BOOT\ ディレクトリ下に配置されたファイルで起動するというのは、UEFIの仕様のひとつ。

mount

脳死でumountとかmountとかコマンドを打っていました。
f:id:kattyan53:20210430135226p:plain

どうして普通にUSBにファイルを置くだけでは起動しないのか分からなかったので、teratailで質問してコマンドの丁寧な解説までいただきました😢 USBメモリのルートディレクトリ下にただコピーしただけでは、PCのUEFIからOSを起動することはできないそうです。UEFIの仕様に従ってBIOSを起動するために、USBをFATでフォーマットし、mountして起動ディスクの \EFI\BOOT\ ディレクトリ下にファイルを配置したということでした。(難)
Linux - デバイスファイルにアクセスしてコピーしないと起動しないのはどうしてですか|teratail

mountの説明は以下の通りです。

「mount」は、HDDやUSBメモリ、DVD-ROMなどのフォーマット済みの領域(ファイルシステム)を指定したディレクトリ(マウントポイント)と一時的に結び付けてアクセスできるようにするコマンドです
引用元:
【 mount 】コマンド――ファイルシステムをマウントする:Linux基本コマンドTips(183) - @IT

2章 EDK Ⅱ 入門とメモリマップ

この章でやること
  • EDK Ⅱという開発ツールを使ってみる。C言語で書かれたファイルをBuildして、上記で書いたバイナリファイルと同じものを作り、これをUSBメモリからメインメモリに読み込ませます。
  • UEFIの機能を使ってOSにメモリマップを渡すための準備として、メモリマップを取得したりファイルに一時保存してみたりします。

EDK Ⅱ

UEFI BIOS自体の開発、UEFI BIOS上で動くアプリケーションの開発などにも使える開発キット。

メインメモリ

メインメモリとは、プログラムやデータを一時的に蓄えておくための装置で、CPUの命令で直接アクセスできる装置のことです。

メインメモリとは何? Weblio辞書

メモリマップ

メインメモリのどの部分がどんな用途で使われているか載っている地図のことです。

ポインタ

ポインタとは、変数のアドレスを記憶する変数のことです。

納得C言語 [第13回]ポインタ - ほぷしぃ

構造体

C言語では、複数のデータ型を複数格納することができる箱を作ることができます。

納得C言語 [第14回]構造体 - ほぷしぃ

3章 画面表示の練習とブートローダ

この章でやること
  • main.cppを書く→clang++コマンドでソースコードコンパイルし、オブジェクトファイルmain.oを作成→ld.lldによってオブジェクトファイルから実行可能ファイル(kernel.elfファイル)を作成する。→edk2を使ってブートローダをbuildする→カーネルが起動する

Main.cファイルがブートローダで、main.cppがカーネルなんですね☺️



レジスタ

CPUに内蔵された記憶領域のこと。容量が小さく読み書きが速い。

カーネル

カーネル(英: kernel)は、階層型に設計されたオペレーティングシステム (OS) の中核となる部分である。

カーネル - Wikipedia

オブジェクトファイル

ソースコードコンパイルした結果の機械御命令を含んだファイル。

まとめ

今回は、3章まで進めました。正直なところ、CとC++で書かれたファイルはあんまりちゃんと読めていません。 しかしながら、何をやっているか抽象的に理解しつつ、書き写して実行するだけでも楽しいです👍 これからも少しずつ進めていこうと思います。

ゼロからのOS自作入門

ゼロからのOS自作入門

ここまでお読みいただきありがとうございました!

エンジニアが「メモの魔力」を読みました

f:id:kattyan53:20210503012037p:plain
メモの魔力を読みました。

◽️なぜ読んだのか

3年前くらいに周りの人が「すごいよかった」と口を揃えて仰っていたので、DMMブックスのセールをきっかけに読むことにしました。

◽️ざっくり本の概要

メモを取る理由

著者がメモを取る理由は、「記録するため」ではなく「知的生産」のためだそうです。
筆者がオススメする方式のメモをとることによって、アイデアを生み出せるようになったり、いつもは素通りしてしまう情報をキャッチできたり、話の骨組みがよくわかるようになったり、曖昧な感覚や概念を言葉にできるようになります。

メモの取り方

じゃあどんな風にメモを取るかというと、「ファクト→抽象化→転用」というフレームワークを使ったり、「日付・サマリー・標語」を書いたり、4色ボールペンを使い分けたりします。

とったメモで思考を深める方法

便利なフレームワークでメモをとったあとは、そのメモで思考を深めていきます。
例えば、「このお店すごく居心地がよかったな(ファクト)」と思ったら、感想で終わらずにどうして居心地がよかったのか書き出しておきます(抽象化)。するとその経験が、居心地のいい別のコミュニティを作る際にうまく応用できたりするそうです。

メモで自分探し

このメモは、自分探しにも応用できます。「自分」とはどういう人なのか、人生でやりたいことはなんなのかなど列挙していきます。
3章に渡って自分が本当にやりたいことを探っていく方法が書かれているのですが、この章が、本書で「メモで人生が変わる」と言われている所以です。

◽️エンジニアの勉強で応用できそうだなと思ったこと

仕事に直接関係ない、よくわからなかった単語をとりあえずメモしておく

自分の心に刺さった語彙、引っかかる表現があったら、なるべくすべて、メモしておきましょう。

本書では、「何気なくメモしたことが自身の表現を豊かにする肥やしになる」とありました。このことを普段の仕事に応用してみると、例えば違う職種の方が呟いていたこと、全然ついていけなかった(直接仕事に関係ない)技術トークで出てきた単語などなど、そういうことをメモして、時間ができたときに深掘りしてみると良さそうだと思いました。

例えば、先日「抽象構文木」という単語をメモしていました。仕事で使わないし、そのときはよくわからなかったのですが、調べてみると基本情報の問題で解いたことあったし、言語を作るときに必要であることがわかりました。全く別の日に新しく本を読み進めていたら、まさに「抽象構文木」の話が出てきてびっくりしました。こんな感じで、一見関係なさそうな単語でもとりあえずメモしておくと別の場所で出会ったときに便利だなと思いました。

ファクトを個人開発のアイデアに繋げてみる

通常のメモであれば、ここまでに聞いた「ファクト」を書くだけで終わりでしょう。
〜中略〜
「ここで書いた具体的な情報を受けて、何か言えることはないか。そこに気づきはないか。他に応用可能な法則はないか。」
こうした思考作業を僕は「抽象化」と呼んでいますが...

今日私は、ホットクックの購入を検討していました。ホットクックを買ってもあんまり使わなくなるのが怖くて、「自分でレシピを応用できるのか」気になっていました。すると、「ホットクック部」なるものがあることを知りました。ホットクック専用のクックパッドみたいなサービスです。この本を読むまでは、「へー便利だなー」だけで終わってたんですけど、「他に応用可能な法則はないか」考えてみたときに、現在私が開発している個人プロダクトに応用できそうだと思いました。

「一調理器のためにレシピを投稿するのは面倒だと思うけど、どうしてみんなわざわざ会員登録して自分のレシピを投稿するんだろう...」という疑問が湧いてきました。買って使ってみるまでまだ調査はできませんが、レシピをわざわざ投稿したくなる仕掛けがあって、私たちのサービスの口コミ投稿を増やしたい課題にも参考にできるんじゃないかと思いました。

技術書は「構造を読む」

例えば僕は、人より早く本を読むことができます。それは、「本の具体ではなく、抽象を読んでいるから」です。個別具体のエピソードではなくて、「抽象レベルでは何を言っているか」という観点で読む。構造を読む、ということです。

技術書って、自己啓発本とは違って読むのに本当に体力がいりますよね。読んでてわからないところがあると、挫折してしまいがちです。でも、この「構造を読む」というのはとてもいいやり方だと思いました。例えば、「アンダースタンディングコンピューテーション」という難しい本を読むことにしたとします。

1章1章の話は難しくても、「はじめに」と「対象読者」を注意深く読むと、この本は、「計算とは何か」という問いに対して、難しい数学の知識を利用をせず、Rubyを使って実際にプログラムを作りながら解説してくれる本なんだな、 ということだけはまずわかります。

次に目次を眺めると、1章では「Rubyの構文についておさらいするんだな...」 2章では「意味を記述する様々な方法を調べることで、おもちゃレベルのプログラミング言語を設計するんだな...」と大枠だけ理解することができます。実際にプログラムを作りながら理解して読まないといけないと思うとしんどいですが、まず章ごとの要約をしてからより細かいところを読んで手を動かしていくのもアリだと思いました。

読みたい本や資格はとりあえずメモしておく

この本では、人生で本当にやりたいことを見つけるために、なんでもいいからやってみたいことを列挙して優先順位をつけてみる章があります。
私も、とりあえず気になった本や資格は、読む/読まない・取る/取らないに関わらずTrelloにメモしておこうと思いました。

まとめ

やっぱり普段とは違うジャンルの本を読んでみると、仕事や勉強に応用できそうな新しい発見があって面白かったです。
ぶっちゃけノートに愚直にメモを取ることは私にはできなさそうなので、Trelloなどを活用してメモを取っていこうかなと思いました。

ここまでお読みいただきありがとうございました!

Rubyの多重代入でハマって、抽象構文木の出力の仕方が学べた話

最近ハマったのでメモです。

困ったこと

まずは以下のコードをご覧ください。

class HogeHogeService
  def self.call(*a, **k)
    new(*a, **k).tap { |s| s.call }
  end

  def initialize(a_code:, b_code:, c_code:)
    @a_code = a_code,
    @b_code = b_code,
    @c_code = c_code
  end

  attr_reader :a_code, :b_code, :c_code

  def call
    p a_code
  end
end

HogeHogeService.call(a_code: 'a', b_code: 'b', c_code: 'c')
    # => 期待する値: "a"なのに、なぜか["a", "b", "c"]になる

a_codeを参照したとき、"a"だけ出て欲しいのになぜか身に覚えのない配列が表示されて困りました...。





















答え

class HogeHogeService
  def self.call(*a, **k)
    new(*a, **k).tap { |s| s.call }
  end

  def initialize(a_code:, b_code:, c_code:)
    @a_code = a_code  # <=ここにカンマがついていたから!
    @b_code = b_code # <=ここにカンマがついていたから!
    @c_code = c_code
  end

  attr_reader :a_code, :b_code, :c_code

  def call
    p a_code
  end
end

# => "a"
HogeHogeService.call(a_code: 'a', b_code: 'b', c_code: 'c')

Rubyって、こんな風にカンマをつけて変数を定義すると、配列として解釈してくれるんですね。
多重代入の1種だそうです。
docs.ruby-lang.org

a_code = 'a', 'b', 'c'

 # ["a", "b", "c"]
p a_code


今回のコードでも同じパターンの多重代入が行われていました。

a_code = 'a',
b_code = 'b',
c_code = 'c'

# ...!?  b_codeとc_codeの出力どういうことなの...
p a_code #=> ["a", "b", "c"]
p b_code #=>"b"
p c_code #=>"c"

会社の方に教えていただいたのですが、AST(抽象構文木)によると、代入式の左辺にカンマがなく右辺にカンマがある場合、右辺は配列として解釈されるそうです。
RubyのソースのASTを見る方法 - Qiita


全然読めません👼が、@ NODE_ARRAY (line: 1, code_range: (1,9)-(1,40)) って書いてありますね!

❯ ruby -e "a_code = 'a', b_code = 'b', c_code = 'c'" --dump=parsetree
###########################################################
## Do NOT use this node dump for any purpose other than  ##
## debug and research.  Compatibility is not guaranteed. ##
###########################################################
# @ NODE_SCOPE (line: 1, code_range: (1,0)-(1,40))
# +- nd_tbl: :a_code,:b_code,:c_code
# +- nd_args:
# |   (null node)
# +- nd_body:
#     @ NODE_PRELUDE (line: 1, code_range: (1,0)-(1,40))
#     +- nd_head:
#     |   (null node)
#     +- nd_body:
#     |   @ NODE_DASGN_CURR (line: 1, code_range: (1,0)-(1,40))
#     |   +- nd_vid: :a_code
#     |   +- nd_value:
#     |       @ NODE_ARRAY (line: 1, code_range: (1,9)-(1,40))
#     |       +- nd_alen: 3
#     |       +- nd_head:
#     |       |   @ NODE_STR (line: 1, code_range: (1,9)-(1,12))
#     |       |   +- nd_lit: "a"
#     |       +- nd_head:
#     |       |   @ NODE_DASGN_CURR (line: 1, code_range: (1,14)-(1,26))
#     |       |   +- nd_vid: :b_code
#     |       |   +- nd_value:
#     |       |       @ NODE_STR (line: 1, code_range: (1,23)-(1,26))
#     |       |       +- nd_lit: "b"
#     |       +- nd_head:
#     |       |   @ NODE_DASGN_CURR (line: 1, code_range: (1,28)-(1,40))
#     |       |   +- nd_vid: :c_code
#     |       |   +- nd_value:
#     |       |       @ NODE_STR (line: 1, code_range: (1,37)-(1,40))
#     |       |       +- nd_lit: "c"
#     |       +- nd_next:
#     |           (null node)
#     +- nd_compile_option:
#         +- coverage_enabled: false

上記は読めなかったので、rprという抽象構文木を画像にしてくれるgemを使ってみました。

hoge.rb(ファイル名は任意)に解析したいコードを書いて、同じディレクトリ上で以下を実行します。

sudo gem install rpr
rpr hoge.rb -f dot | dot -Tpng -oast.png
open ast.png


これなら読みやすいですね!ちゃんとarrayとして解釈してることもわかりました☺️
f:id:kattyan53:20210425143654p:plain

Rubyの多重代入は奥が深いこと、抽象構文木についても触れることができた良い機会になりました。以上です!

「イラストでわかる DockerとKubernetes」を読みました

イラストでわかる DockerとKubernetesを読みました。
f:id:kattyan53:20210322140440p:plain

gihyo.jp

なぜ読んだのか

私は、Dockerの使い方はなんとなくわかりますが、仕組みについて全然知りません。kubernetesに関しては、何をやっているのかもよくわかりません。弊社SREさんに、この本をおすすめしていただいたので、読むことにしました!仕組みを知るにはどうやら、”コンテナ技術”というところに注目する必要があるようです。

対象読者

  • コンテナ技術に始めて触れる方
  • DockerとKubernetesの基本的な機能の概要を、コンテナの仕組みをふまえつつ とらえられるようになりたい方

この本で学べること

  • コンテナ技術の概要
  • Dockerとkubernetesの持つ基本的な機能
  • コンテナランタイム(コンテナ技術における最も基礎的なソフトウェア。「コンテナを作り出し管理すること」という役割がある)について

本の概要

第1章 コンテナ技術の概要

第1章では、「コンテナ技術」の概要について書かれています。

コンテナ技術とはその名から想像されるとおり、1つの共有されたOS上(ホストOS)で複数の独立したアプリケーションの実行環境を作成する技術です。

DockerとKubernetesはどちらも”コンテナ”に関するツールです。
Dockerは単一マシン上でコンテナ群を管理・コンテナイメージの作成・共有などに関するツールで、Kubernetesは、複数のマシンで構成される環境でのコンテナ管理に用いられるツールです。

コンテナには、

  • 軽量な実行環境
  • 高いポータビリティ(どんな環境でも同じように動く、コマンドなどの使い方が一緒)
  • 巨大なエコシステム(OSS化されており、バックにちゃんとした組織がある)

という利点があります。詳しくは本書をご覧ください。

第2章 Dockerの概要

2章では、Dockerのコンテナへの基本的な操作である「Build、Ship、Run」について、そしてコンテナのレイヤ構造・について書かれています。

Dockerは、単一のマシン上でのコンテナ群の管理や、コンテナイメージの作成、そしてそのイメージのチーム・組織間での共有など、コンテナにまつわる基本的なワークフローをサポートするツールです。

Build ... コンテナイメージの作成
Rub ... コンテナの実行
Ship ... レジストリを用いたコンテナの配布

一番最後には、Dockerのアーキテクチャの概要と、Dockerがコンテナの実行環境を作成するために用いる低レベルなコンテナランタイムである「OCIランタイム」の概要について述べられていましたが、私には難しかったです。笑

第3章 Kubernetesの概要

第3章では、Kubernetes の特徴、kubectlについて、基本的な機能について述べられています。

Kubernetes は、複数のマシンで構成される環境でのコンテナ管理に用いられる、「オーケストレーションエンジン」と呼ばれるツールです。

これもKubernetes 初学者の私には難しかったので、出てきた単語を出来るだけまとめます。

Kubernetesはステートレス/ステートフル/バッチ処理などの様々なデプロイ方針に対応できる」
ステートレス ... 書き込まれたデータをその終了とともに破棄し、それ自体に永続的なデータや長期的な状態を持たせない方針のこと。
ステートフル ... たとえばデータベースなどコンテナ自身の寿命よりも長期的な状態やデータを管理するアプケーションを実行すること。

クラスタ ... コンテナ群を実行するマシンの集合
ノード ... 各コンテナが実行されるマシン
ノードコンポーネント ... そのノード上のコンテナ群の実行管理やイメージの管理、通信の管理などを行う。Dockerなどのコンテナランタイムも含まれている。
コントロールプレーン ... Kubernetesクラスタ全体の管理を担うコンポーネント
リソース ... クラスタ全体の管理情報

Pod ... Kubernetes におけるもっとも基本的なデプロイ単位。複数のコンテナ群を一つにまとめたもの。
ラベル ... クラスタ上で稼働するPod群をグルーピングして扱えるようにしたもの

「Pod群をクラスタ上に配置するためにKubernetesがサポートする機能のうち基本的な6つのリソース」
Deployment ... Pod群を一定数維持しながらクラスタ上に展開するリソース。
StatefulSet ... ステートフルなPod管理に有用なリソース。ノード故障やスケールインによりPodが終了し、その後そのPodを再実行する場合にも、終了前の状態を引き継ぐように動作させることが可能。
DaemonSet ... ノード上でのログ収集やモニタリングなど、アプリケーションによってはノードと密接に関係し、各ノード上でいわゆるデーモンプロセスのように1台ずつ稼動させるのが適するデプロイで使われるリソース。(難)
JobとCronJob ... Podをジョブ的に単発に実行するときに有用なJob。
ConfigMapとSecret ... Podとして実行されるアプリケーションとその実行時に必要となる設定項目・秘匿情報とを独立に管理できるようにするリソース
Service ... Kubernetesクラスタ上でPod群へのサービスディスカバリを行う上で重要なリソースの1つ。Serviceを用いることで、あるサービスを提供する複数のPodに共通のIPアドレスを付与し、まさに1つの「サービス」のようにアクセスできるようになる。

コンテナランタイムとコンテナの標準仕様の概要

DockerやKubernetes上でコンテナを実行するとき、コンテナはどんなソフトウェアがどのようにして作り出しているのでしょうか。──その役割を担っているのは「コンテナランタイム」というソフトウェアです。コンテナランタイムは、Kubernetesのような上位のオーケストレータから指示を受け、マシン上でPodやコンテナの作成・管理を担います。

この文章しかわかりませんでした。笑

まとめ

Dockerは普段から使っているので、仕組みがわかってよかったです。
Kubernetesに関しては、その特徴やkubectl、いろんなデプロイ方法に対応できることがわかりました。何より、よく使われている用語が一気に学べてよかったです。
コンテナの話に関しては全体的に、私には難しすぎました。複雑なデプロイ環境を自分で作ったことがないので、「こんなデプロイ方法に対応してるんだよ!」と言われてもあんまりピンときませんでした。本が悪いわけではありません!!

この本は、「コンテナの仕組みをふまえつつDockerやKubernetesの仕組みを知りたい方」向けの本だったので、まずはDockerとKubernetesの使い方を別の本で学んで、自分でデプロイ環境を作ってみてから「なるほど、こういう仕組みで動いていたのかー」と納得できる本なのかなぁと思います。インフラの勉強の道のりはまだまだ長いです!!

gihyo.jp

ここまでお読みいただきありがとうございました!