Linuxのしくみ ~実験と図解で学ぶOSとハードウェアの基礎知識 を読んで

Linuxのしくみ ~実験と図解で学ぶOSとハードウェアの基礎知識 を読んで

著者の武内覚さんから献本(電子書籍)していただいたので、読み終わった感想などを書こうと思います。

目次

http://gihyo.jp/book/2018/978-4-7741-9607-7#toc

一番特徴的と思ったこと

表現方法の工夫です。
全体で、後書きまで入れて、268Pあります。自分は、じっくりというよりも、割と流し読みのかんじですが、PDF形式でパソコン(Mac Book)を使用して、概算で4から5時間の間で読みきりました。だいたい、1分間に1ページくらいのスピードです。これは、決して読むのが早いわけではなく、表現の仕方によるものが大きいです。

  • 説明文
  • 図表
  • 実験
  • ソースコード
  • 画面のコピー(主にコマンドなどの実行結果)
  • チャート

1ページあたりの情報量は決して少なくはないですが、上記のような構成になっていて視覚的にも、思考の流れとしても飲み込みやすい表現になっています。
まず、文章で説明します。この際に、要点を中心にかなり簡潔にまとめています。
その後、概念を図式化します。言葉だけではイメージしづらい部分を中心に、図示が行われます。また、図表も情報量が多くなりすぎないように工夫されています。
その後、説明されたとうりに動くかどうかの実験方法を示唆されます。
実験を行うためのプログラムが提示されます。
実験の結果、実行された結果の実際の「画面」が提示されます。
最後に、実験の結果を読み取りやすい形でチャートにされます。

この一連の流れの中で、概念とイメージ、それを裏付けるために必要な証拠、手に入れるためのツール、実際の動作状況、最後に実験結果を理解するためのチャートと、思考の流れをうまく制御してもらえるので、スムーズに読み進めることができます。

また、これは、「科学の力」を利用する上で、一番大切な、「推測するな計測しろ」の実践方法にもなっています。 なぜ、こういう風に組み立てられると理解できるのか? という、自己体験も、なかなかに、興味深いものでした。

感想


  • 全体的に、とても読みやすく工夫されていて良い本だと思います。久しぶりに、この辺りのことを一気に本で読んだので満足感は大きかったです。メモリの理解のところあたりが、これを読んでいると、他の入門書と個人的に比べると、理解度がずいぶん良いので、この辺りを読むのは楽しかったですねぇ。
    btrfsで一章取っているのは、著者の思い入れなんでしょうか?(笑)
    ファイルシステムと、ストレージを分けて考えさせるところは、とても良い考えだと思いました。この辺りは、よくごっちゃになっているので。


  • Cのソースコードや、Shellのコードなどは、本文には、なくても良かったと思います。
    Githubで、公開されていると記載されていましたし、付録で巻末に入れる形でも良かったかなぁと。
    あ。袋とじもいいかもしれない....。
    やはり、Cのソースがあると、読まなくてはと思ってしまうバイアスがかかりますし、ぱらぱらめくった時に、この部分だけ、異様な迫力を感じます。できれば、Cのソースを見ると、パタンと本を閉じてしまうような人にも、読んで欲しいので、そう思った次第です。

読んで欲しいと思った人

  • コンピュータの初学者
    できれば、コンピュータに触れるようになった後、割と早い段階で、読んで欲しいなぁと思いました。 本文にも書いてありますが、中に記載されている、C言語などのツールの中身は理解できなくとも、全体を通して読むのは、標題にある「 Linuxの仕組み」を理解するだけでなく、「科学の力」をドキュメント上で味わうことができます。

  • 技術的な報告書で人に理解させるのが苦手な人
    この本の表現自体が、教師となってくれます。メタな体験として、かなり良いものかと思います。

  • 経験は長いが、雰囲気できちゃった人
    僕です。

読むのには準備がいる人

全くコンピュータの経験がない人は、辛いかとおもいます。「基本的なコマンドさえ知っていれば」でも、ちょっと辛いかなぁとは、思いました。

  • アプリケーションなら、小さなものでも良いので、OS 上で、何らかの言語を使って組んだ。
  • OSのインストールとかは経験した。

ぐらいは、経験してないとダメかなぁと思います。相当、初期で行けるとは思いますが。

試しに読んでみて欲しい人

PaaSとかしかやったことない人とか、読んでみて、感想聞きたいですねぇ。
後、組み込みとかしかやってなくて、Linux OSに興味ない人とかも。

今後に望むこと

この手のスタイルの本は、貴重だと思うので、続編が欲しいです。
できれば、ものすごく難しい題材を料理してみて欲しいです。

謝辞

献本ありがとうございました。
また、このような本を書いて出版してくださった関係者の皆様に、お礼を申し上げます。

最後に

面白かった!!!

Atom Editor の設定変更めも

行末を画面の任意の場所に持ってきたい

Atom で、行末からカーソルが動かなく、画面の一番後ろで入力しなくちゃいけないのを直したかったので直した。

設定のEditorで、Scroll Past end にチェックを入れる。

f:id:Guutara:20180119153627p:plain

FPGA Cloud で、2匹目の泥鰌は狙えるのか?

FPGA Cloud で、2匹目の泥鰌は狙えるのか?

なぜか、Intel AlteraとXilinxの開発者向けイベントに出たので、内容はとりあえず置いといて感想だけ書いておきます。 どっちが、何を、どうした的な話は書かないので、すみません。 両方の話から、こんな風にしようとしてるのかなぁという、感想を書きます。

インテル® FPGA テクノロジー・デイ
ザイリンクス開発者フォーラム 2017

私の知識

FPGA の技術的なことは、ほとんどわかりません。X86 サーバのインフラ周りとか、GPUFPGAの基本的な存在意義みたいなのは知っていると思いますが。ただ、そういう立場の人間にも、声がかかったりすること自体、結構、面白いなぁと思っていってきました。なので、ガチな開発者の方とは全く違った感想になってると思います。

Cloudのお話

Amazon EC2 F1 インスタンス がローンチされてます。で、ここで、FPGAのIPをマーケットプレイスで売れるということになってます。

これって、FPGAの世界で初めてと言っていい出来事なんだそうです。なんか、どんどん作ってガンガン売って金稼ごうゼェーー! みたいな、講演を聞いて、何とかビジネスセミナー見たいだと思ってしまったのは事実だけど。。

いずれにしろ、Cloud での開発と同時にIPを簡単に配布して、しかも課金できる仕掛けができたっていうのが、大きな出来事ってことみたいです。そうなると、既存の開発者の人たちに働きかけると共に、いかに、開発者を増やすかがマーケットの勝負になるんでしょうね。

ということで、C/C++ などの言語から、FPGAの回路設計に落とし込めるよってツール(高位合成)が重要になってくるのかな。無償化やOSSで自由に使えるという部分を増やして、面を広げようという気持ちを感じました。

Deep Learning

じゃぁ、何のIPがいいのかって話になると、やっぱり、Deep Learning を狙っているようです。さっきの、ばらまく系も、CUDAを参考にして、やってるような気がしましたねぇ。

確かに、GPUだけでは、解決できないということで、TPUやFPGAで、推論の部分を行うクラウド事業者の情報が出てますから、ここを狙うっていうのは、正しいと思います。

しかし、これ、二匹目の泥鰌狙いだと思うんだよなぁ。そもそも、DNNでお金が稼げるキラーアプリみたいなのがない状況なので、将来的な展望はよくわからないと思ってるんです、個人的には。。。

ただ、GPU一辺倒っていうのは、健全ではないと思うので、広がると面白いなぁとも思ってます。

DNNのモデルは各社から提供される流れ

今のところ、DNNのモデルは各社から提供されるみたいです。それを使って、TFとかCafeとかから使えるようにするみたいでした。とはいえ、使い勝手はどの程度良いのかは、私には、わかりませんが。

でも、モデルを自分で作成したければ、できるわけだし、とはいえそういうことをする会社はそんなに多くはない気もするし。。

どーなんすかね。。

色々、試せることが増えるのは良い

閑話休題FPGAを、色々な言語で試せるようになるのは、いいことだと思うので、じゃんじゃん、やってほしい。 開発者の選択肢が増えるのは、嬉しいことだと思う。

ただ、これって、結局のところ、X86で起きた手法の繰り返しを狙ってるのかなぁとも思う。制約が多い時には、最適化とか効率良いソフトの設計と実装ができないとだめで、開発者でもできる人は限られるので、量的には増えないんだけど。簡単にかける方向で開発者を増やしていってアプリを量産できるようになると、富豪的なハードで解決するようになってきてしまい、チップやら何やらが儲かるようになる。

ま、それも正しいんだろうけれど。

はたして、FPGAで可能なのかはわからないです、私。

おまけ

お弁当の写真で、終わりにしたいと思います。

弁当
f:id:Guutara:20171011120411j:plain:w300

今半弁当
f:id:Guutara:20171017125226j:plain:w300
今半弁当
f:id:Guutara:20171017125157j:plain:w300

Oracle JDK SE のライセンス等変更 のメモ(2017-10)

Oracle JDK SE のライセンス等変更 のメモ(2017-10)

個人的に確認したものです。保証はできないので、正確な情報が欲しい方は各自ベンダに問い合わせてください。

オラクルのサイト

Oracle Java SEサポート・ロードマップ

利用用途の変更

  • OpenJDKは、OracleJDKと同等の機能をもつバイナリの提供を開始する。 1

  • 無償での利用は(JRE,JDK) OpenJDK を利用することになる。

  • OracleJDK は、他のOracle製品と同様(Oracle Technology Network)に評価利用は可能だが、従来のような無償利用の対象ではなくなる。利用するには、有償サポートの購入が必要。

リリースサイクルの変更

  • 毎年、3月と9月にリリース。

  • リリースは、新機能の追加とは関係なしに定期的なリリースとなる。

  • 新機能2は完成したタイミングでリリースに組み込まれる。

  • OracleJDKの有償サポートは従来と同じライセンス契約の購入となる。Java SE Advancedを購入するか、WebLogic等のOracle製品のJava実行環境のサポートを購入することで可能となる。

  • OracleJDKは、下記の3年サポート対象のリリースをのぞき、新しいリリースが行われると、古いリリースのものはサポートされない。

  • OracleJDK のサポートは、半年のリリース単位と合わせて3年間の長期のリリース対象が提供される。いわゆるLTSライセンス。

リリース名称の変更

  • 年号と月を組み合わせたバージョン番号となる。

  • 最初のリリースは、JDK 18.3の予定。(2018年3月)

  • JDK 18.9 が、LTS(3年長期サポート)の最初のリリースの予定。以降、3年に一度、LTSの対象となる。


  1. 同じバイナリかどうかは未確認だが、違うものであると思われます。

  2. 例:ラムダ式の実装、ProjectJigsaw

Github での今の自分のやり方の覚書

clone して、issueでbranch

$ git clone https://github.com/guutara/hogehoge.git
$ cd hogehoge
$ git config --global user.email xxx@xxxx.xx
$ git config --global user.name "USERNAME"
$ git branch
* master
$ git branch issuXX
$ git branch
  issuXX
* master
$ git checkout issuXX
Switched to branch 'issuXX'
$ git branch
* issuXX
  master
$ git push origin issuXX
$ git pull origin issuXX

修正作業

$ git add FILE
$ git commit -a -m "MESSAGES"
$ git push origin issuXX

issue 番号を紐付けておく 1

番号は、Issuesの標題の最後にある、#N

$ git commit --allow-empty -m "resolve #N"
$ git push origin issuXX

Pull request と marge

Githubの画面で行う。

marge 後

$ git branch
* issuXX
  master
$ git checkout master
Switched to branch 'master'
Your branch is up-to-date with 'origin/master'.
$ git pull
$ git branch -d issuXX

  1. 10-11 追記

あるいはプログラマ以外にプログラムを作る権利を

*1

何か意識高い結論を求めるなら、読んでも無駄でござるよ。。

「どうやったら、プログラムを組めるようになれるんですかね?」

この会話、同じくらいのプログラミングの経験値を共有していた場合は、話が其れなりにあう。

なぜなら、何も知らないところから「プログラムを組む」の状態になるところでどの程度のことができるのか、なんとなく擦りあうからだ。あるいは、擦りあってないなと感じることができるし、あわなければ、あわないなりに、話すことも可能。

その辺りが、いつも難しいなぁと思ってしまうことになる。

で、その会話を書くつもりはないんだけれど。。。

何かを人手をかけずにやろうとした場合の手段として、コンピュータのシステム化がある。で、コンピュータで何かをやらせようとすると、プログラムってやつをかけばいいということになる。

ほら、この時点でも、また、さっきのすり合わせの問題が起きて来てしまってるのだけれど。。

プログラマー、という職種の人に頼まなくても、自分たちでどんどん作れば「改善できる」し、結局のところ利用するのも、やってほしいことが分かっているのも、こちらなんだから、プログラムってやつを覚えてかけばいいんだ。

プログラムを、プログラマー職から、我らの手に!

ってスローガンがあったかどうかは記憶にないけど、似たような話は過去聞いた気はしなくはない。。。

今は、コンピュータの環境としては、クラウドがある。あと、プログラムと呼ぶと怒られるんだろうけど、機械学習用のhhhhh AIようの TensorFlow なんかもある。学習の機会もたくさんあるし、昔とは違いやる気と時間があればできるようになっている、と。

確かに、プログラマー職ではなくても、こんなにすごいことができましたっていう情報はたくさん見るようになった気がする。それは凄いなぁと思う。

でも、それって、情報が昔よりも広まりやすくなって、もともとできる人に届きやすくなり、できたことが知りやすくなっただけの気もしないではない。

プログラムが動くには燃料が必要だ

ってことは、今も変わってはいない。クラウドは、たくさんの燃料を使って動いている。その上で動かすプログラムは、それを消費して動いている。どんなに、クラウドがすごくても、提供できる限界はある。今のところ、限界まで使い切ってしまったって話は、具体的には知らない。ま、要するに、たくさんの無駄^h^h余裕があるということだろう。

で、使用するにはお金がかかる。まぁ、クラウドの資源に余裕があるとすれば、あとは、利用者のお金と時間の余裕が限界というわけだ。

使ったら使っただけ課金されるのが標準的な決済の方法なので、同じ結果を得られるのなら、なるべく使わない方が資金の限界を有効に使える。あとは、プログラマー職に頼んだ場合と、自分で作った場合の費用対効果と機会損失で測れば良いだろう。

この辺、やったことがないので、エビデンスを持っていない。誰か、やってみてくれないだろうか。。

下手なプログラムを書くことに関しては、自信のある自分的には、どーも、専門ではなく二足のわらじ的に行うのであれば、あまり、広範囲には有用ではない気はするんだけど。まぁ、経済的な指標なのでなんとも。。

「どうやったら、資源を無駄に食いつぶさないプログラムを組めるようになれるんですかね?」

っていう、最初の会話と同じような話になってしまう。 しかも、これ、きっと終わりないんだろうなぁ。。

ところがオンプレミスだと課金がない

さて、これが一番の問題で、これを解決できる方法は、今んところ聞いたことがない。自社で設備を持ち、自社でメンテナンス要員を社員と外部の会社で賄っている場合だ。

いわゆる、資源の提供者が「プログラム職」とほぼ同等で、解放をのぞむ方は、ただ利用するだけのケースがほとんどではないかなぁ。

この場合、資源の余裕は、当然あるとしても、クラウドの比ではないし、そもそも、そんなに無駄遣いできない。

ただ、有効に使えるのであれば、毎年の現金のやりくりをしなくて良いので(設備は過去に買ってあるものを利用するから)資金の継続的な余裕は担保できる、はず。

しかし、設備のハードの増強やプログラムを動かす為のソフトウエアの改修などのヒトモノカネは、ただ、利用者の利用状況が逼迫してますから、ってだけでホイホイ決済おりないだろうし、おりたとしても、特にヒトは簡単には手に入らない。

なので、有効性がわからないなら、なるべく利用させたくないということになり、ますます、解放せよ! という不満も膨らみ続ける。

データの民主化って奴も同じ問題を抱えてるきがするのよね

ほんこれ。。

*1:趣味嗜好でプログラム書くのは対象外なので悪しからず

Github での今のやり方の覚書 (Clone しないで作業)

Clone しないで作業

あらかじめ、Local にリモートのリポジトリと同名のディレクトリを作成しておく。
そこには、すでに、hello.goが作成済み。

すでに、

$ git config --global user.email xxx@xxxx.xx
$ git config --global user.name "USERNAME"

はやってある。

$ mkdir gohello
$ cd gohello
$ git init

Githubで、リポジトリを作成。URLをコピーする。

$ git remote add origin  https://github.com/guutara/gohello.git

$ git fetch origin master
remote: Counting objects: 3, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), done.
From https://github.com/guutara/gohello
 * branch            master     -> FETCH_HEAD
 * [new branch]      master     -> origin/master

$ git pull origin master
From https://github.com/guutara/gohello
 * branch            master     -> FETCH_HEAD

$ git branch
* master

$ git add hello.go

$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    new file:   hello.go

$ git commit -a -m "First commit"
[master c62e771] First commit
 1 file changed, 7 insertions(+)
 create mode 100644 hello.go

$ git push -u origin master
Counting objects: 3, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 350 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://github.com/guutara/gohello.git
   a72be4a..c62e771  master -> master
Branch master set up to track remote branch master from origin.

2かいめ以降の修正

hello.go 修正後。

$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   hello.go

  no changes added to commit (use "git add" and/or "git commit -a")

$ git commit -a -m "add line "
[master 934a631] add line
 1 file changed, 2 insertions(+), 1 deletion(-)

$ git push origin master
Counting objects: 3, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 350 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://github.com/guutara/gohello.git
  c62e771..934a631  master -> master