電気ひつじ牧場

技術メモ

「Rustで始めるネットワークプログラミング」を出版しました。

書籍をkindleとBOOTHで販売開始したので、内容の紹介と出版について書き連ねていきます。

内容紹介

出版したもの

(2020/04/22追記: 現在,BOOTHでの購入者がほとんどいないことから,kindle版のみの販売となっています.)

技術書典6にサークル参加した際、私が担当した部分を大幅に加筆修正したものを独立した書籍として発行しました。差分としては5章を追加+1~4章を魔改造ソースコードの改善、説明文及び図の追加)と行った具合です。

何かを理解する際は実装するのが1番だと考えているので、各章ごとに動くものを作成し、それについて解説しています。

サンプル

1、2章を収録したサンプルを無料で配布しているので購入前に確認するのが良いと思います。*1

teru0x1.booth.pm

対象読者について

  • Rustの基本的な文法を知っている人
  • TCP/IP の基本的な知識がある人
  • Linux の基本的な知識がある人
  • ネットワークプログラミングに興味のある人
  • Rust で何か作りたい人、Rust でネットワークプログラミングに利用できるライブラリ等を知りたい人
  • セキュリティに興味のある人

となっています。2つ目に関しては「マスタリングTCP/IP 入門編」に書いてある内容が大体わかるくらいで十分だと思います。手元に置いておくと安心です。

タイトル的に入門書っぽいのですがTCP/IPやRust、Linuxに関する基本的な知識は前提になっています。書籍中ではRustの文法について解説しているところはほとんどありません(あっても脚注で触れる程度)。Rustの文法に関する本は自転車本などの良書がたくさんあるのでそちらをご覧ください。(私はまだあまり読めていませんが・・・)

実践Rust入門[言語仕様から開発手法まで]

実践Rust入門[言語仕様から開発手法まで]

各章について

5章構成です。各章のプログラムは独立なのでどこから読んでもOKですが、多少前の章の知識を使って解説する箇所があります。その場合は脚注でポインタを示しています。内容は徐々に難しくなるので、筆者的には1章から読み進めるのがいいかと思います。

1章「ようこそソケット通信の世界へ」

f:id:cha-shu00:20190612225714j:plain:w280f:id:cha-shu00:20190612225839j:plain:w280

とりあえずTCP/UDPでソケット通信してEchoサーバを作る章です。簡単に思えて結構大事な章で、TCPを使う場合なぜスレッドを生成するのか、UDPだとなぜ必要ないのかという部分は後の4章にも繋がっていきます。

章の終わりにやたらと長いコラムがあります。「UDPでサイズの大きなデータを送信しようとするとどうなるのか」を実験する事でTCPUDPの特徴の違いについて言及します。

2章「通信を監視する」

f:id:cha-shu00:20190612230020j:plain:w280f:id:cha-shu00:20190612230009j:plain:w280

パケットキャプチャを作る章です。生ソケットを使う事でデータリンク層までいじくりまわし、パケットをレイヤごとに分解して中身を覗きます。IPv6に対応しているので世界のホスト台数が340澗(3.4×1038)くらいになっても安心して利用できます。

3章「手づくりパケットでポートスキャン」

f:id:cha-shu00:20190612230617j:plain:w280f:id:cha-shu00:20190612230736j:plain:w280

ポートスキャンを作る章です。connect()型のポートスキャンだと面白くないのでTCPのヘッダをいじる事で高度なスキャン手法を実装します。2章ではパケットを分解しましたがこの章ではパケットの構築、送信を行います。

ポートスキャンは他人のホストに行ってはいけません。本書の読者から神奈川県警シリーズの新作が出ないことを願っています。

4章「ノンブロッキングなWEBサーバ」

f:id:cha-shu00:20190612230101j:plain:w280f:id:cha-shu00:20190612230047j:plain:w280

シングルスレッド、イベントループ、ノンブロッキングI/Oなどの特性をもつwebサーバを作成します。これらの単語はNginxやNode.jsでよく耳にしますが、それらを実際に作成する事で理解します。サーバが返すHTMLをブラウザで確認できた時の感動というのは言葉にできないものがあります。

web版執筆中に技術書典頒布版のコードだとバグる事が判明し、部屋の中で1人「うぎゃあああ」のような奇声を上げるなど私も苦戦を強いられた章です。(技術書典版でのバグ箇所については書籍中の最後に記述があります。)

5章「RFCから作るDHCPサーバ」

f:id:cha-shu00:20190612230125j:plain:w280f:id:cha-shu00:20190612230108j:plain:w280

web版で追加された章です。章題からして不穏ですがDHCPサーバをRFCから実装に起こします。この章を読むと必要以上にDHCPについて詳しくなれますが、真の目的は「RFCに対する心の壁を取っ払う事」です。RFCって英語だし専門用語ばっかりだしなんか怖いじゃないですか。なので適度にボリュームのあるRFCから実際に動くものを作ってやれば、「なんだ、案外読めるじゃないか」という気持ちになると思ったのです。

最終的には自宅LANのPCやスマホなどにIPアドレスを割り当てる様子が確認できると思います。

執筆あれこれ

ここからは本の内容とは関係ないどうでもいい話です。

執筆期間について

web版のベースとなる技術書典版を脱稿したのが4月の頭なので、そこからweb版を執筆し始めました。Twitterでは技術書典版に対する反応がそこそこあったので、熱が冷めないうちにweb版を出してやると意気込んでいたのですが、案の定研究室で色々あったり大学院の出願周りで色々あったり*2して随分ずれ込んでしまいました。

少なくとも連休中には脱稿しようと、10連休中10日を全て実装と執筆に全振りするという事をやりのけたにも関わらず終わりませんでした。忙しさのあまり平成から令和になったのにも気が付かないほどでした。*3

連休後もちまちまとやり続け、5月の半ばくらいにようやく脱稿できたのでした。そこからレビューをしていただける方に声をかけ、ありがたいことに良いアドバイスをたくさん頂戴したので訂正し、出版に至ります。

執筆はブログへのアウトプットとは異なりとても時間がかかります。特に「よしできた」と思ってからが長いですね。

執筆ツールについて

技術書典版の資産があったので再びRe:Viewを使わせて頂きました。最初は難しいツールですが使えるようになるととても便利です。

ただしkindle販売する際にepubへと変換すると色々とずれたり見た目が今ひとつだったりします。これは自分で修正する必要があるのですが、初心者にはなかなか難しく辛い作業でした。そんな中、「最強の電子書籍執筆ツール Re:VIEW解説」が非常に役に立ちました。この本無しにkindle出版はできなかったと思います。著者の方には感謝です。

表紙について

いらすとやでネタに走るという案もあったのですが、よく考えると自分ならいらすとやが表紙の本は絶対に買わないなと思ったので普通に作成しました。

この表紙、フリー素材を引き伸ばしただけなのですが結構それっぽくて気に入っています。

価格について

¥500で販売しています。¥1000くらいにして一儲けしてやるぜうへへなどと思っていたのですが、拙書よりもはるかにボリュームがあってクオリティも高そうな本が¥500~¥1000くらいだったので完全にチキりました。でも実際あの質と量なら¥500くらいが相場だと思います。

プラットフォームについて

kindleとBOOTHという2つのプラットフォームに出しています。検索エンジンからの流入とユーザー数の多さに利点があるのはkindle、収益率および配布フォーマット(pdf)に利点があるのがBOOTHだと思ったので両方で販売しました。

因みにkindleは独占販売をした場合(KDPセレクト)の収益率は70%、しない場合は35%です。これに対してBOOTHの場合なんと約96%です。

終わりに

技術書執筆は辛いけど楽しいぞ

*1:因みにこのサンプル、全く購入されていません。大丈夫なのか・・・

*2:言い訳である。現にこいつはGitHubじゃんけんなどを作る暇があった。

*3:嘘である。現にこいつはhttps://twitter.com/teru0x1/status/1123191512433479680のようなツイートをしている