「Rustでもわかるシステムプログラミング」

Overview

learning-systems-programming-in-rust

『Go ならわかるシステムプログラミング』を Rust で書き直すプロジェクト、その名も「Rust ならわかるシステムプログラミング」。

これは何

進捗状況

作者ががんばって Issue を切るなどの作業をしています…!

実行等について

各コードの実行方法

cargo workspace 等の機能を使用しているので、実行には cargo run 以外にさらにいくつかオプションをつける必要があります。たとえば chapter22_4_1/main.rs を実行したい場合には、下記のように cargo コマンドを打つと実行できます。

cargo run -p chapter2 --bin 2_4_1

Rust バージョン

  • Rust ≥ 1.51.0

参加方法

簡単なコントリビューションガイド

  • Issue に節単位のリプレース要件が書かれています。
  • Issue に自身を自由にアサインして、Pull Request を送っていただければ大丈夫です。
    • コメントで一言担当する旨を書いていただけると、他の方とバッティングせずに済むかもしれません。
    • お気軽にどうぞ。
    • 途中で作業が難しくなった場合は、遠慮なく難しくなった旨をお伝え下さい。
  • 節の Go コードを Rust で書き直します。
  • 書き直しができたタイミングで Pull Request を上げてください。
  • レビュワーがレビューをし、Approve が出たタイミングでマージをします。
    • レビューに関してはどなたでもコメントいただいて大丈夫です。
    • 2〜3 日程度、「オープン期間」として Pull Request を開いておくことにしています。これは、他の参加者の方がレビューするチャンスを残したり、Pull Request を眺めるタイミングを作るためにそうしています。
    • よしななタイミングで Approve して @yuk1ty がマージします。
  • Approve が出たら Issue をクローズしていただけると助かります。

さらに詳しく具体的な実装に関する注意点等を記載しておりますので、こちらの Wiki もご覧ください。

  • 私(@yuk1ty)が保持する『Go ならわかるシステムプログラミング』は第 1 版 1 刷(2017 年 10 月 23 日発行)のものです。したがって、最新の刷と比較すると若干章立てが違う可能性があります。大幅に違うようでしたら Issue にコメントいただけると助かります。

連絡など

  • rust-jp の運営する Slack 上のチャンネル「 #learning-systems-programming-in-rust 」にてやりとりを行っています。
    • ぜひご参加ください。
    • 進め方などの議論を行う予定です。
    • 質問や相談など、もちろん Issue や Pull Request 内で行っていただいていいですが、専用の Slack チャンネルで行っていただくという手もあります。
Comments
  • 4-2の実装を行う

    4-2の実装を行う

    #28

    • 4.2.1: https://github.com/yurakawa/learn-system-programming-with-go/blob/master/ch4/s2-1/main.go
    • 4.2.3: https://github.com/yurakawa/learn-system-programming-with-go/blob/master/ch4/s2-3/main.go
    • 4.2.4: https://github.com/yurakawa/learn-system-programming-with-go/blob/master/ch4/s2-4/main.go
    • 4.2.5: https://github.com/yurakawa/learn-system-programming-with-go/blob/master/ch4/s2-5/main.go

    の実装を行いました。

    goroutineのコードの置き換えの方針は以下で行っています。

    | go | rust | | --- | --- | |go func() {} | tokio::spawn(async {})| |chan T| (tokio::sync::mpsc::Receiver<T>, tokio::sync::mpsc::Sender<T>)| |ch <- value| tx.send(value) | | value <- ch | rx.recv() | |context.With*| tokio::sync::Notifyとかもろもろを利用して自前で実装 |

    このPRでメインのコントリビューターのAcceptがあった場合に #40 の議論が収束する認識でいます。

    レビュー待ち 
    opened by higumachan 14
  • 10.2 節をリプレースする

    10.2 節をリプレースする

    節タイトル

    ファイルのロック

    対象コード

    https://github.com/yurakawa/learn-system-programming-with-go/tree/master/ch10/s2-1

    補足説明

    Go の syscall をどう Rust 向けに変換していくかを現在議論中です。

    実装追加 コメントを募集 10章 
    opened by yuk1ty 10
  • goroutine の箇所には tokio を使うかどうか決めたい

    goroutine の箇所には tokio を使うかどうか決めたい

    goroutine の特徴は下記にまとめられる:

    Rust の場合は tokio::task が goroutine と同様に軽量スレッドを扱える。かつ、tokio も M:N モデルでワークスティーリングを採用している。Rustの非同期プログラミングをマスターする

    tokio::task https://docs.rs/tokio/1.5.0/tokio/task/index.html

    したがって、tokio::task をランタイムとして、基本的には tokio の機能を使っていくのが goroutine の置き換えにはベストなのではないかと考えている。

    opened by yuk1ty 9
  • 4.3.1: signal-hook の Signals イテレータを使い、SIGINTを待受けて終了するプログラム

    4.3.1: signal-hook の Signals イテレータを使い、SIGINTを待受けて終了するプログラム

    Fixes: #30

    https://github.com/yuk1ty/learning-systems-programming-in-rust/issues/30#issuecomment-831653136 で書いたことを考え、libcクレートの導入は(重たくてCIや手元ビルドを遅くするので)やめ、signal-hook クレートを使うことにしました。

    システムプログラミングとしては面白みに欠けますが...

    動作確認

    % cargo run --bin 4_3_1
        Finished dev [unoptimized + debuginfo] target(s) in 0.01s
         Running `target/debug/4_3_1`
    Waiting SIGINT (CTRL+C)
    ^CSIGINT arrived
    
    オープン期間 
    opened by laysakura 7
  • ファイルの変更監視 (10.1節) のexampleコードの追加

    ファイルの変更監視 (10.1節) のexampleコードの追加

    対象の Issue

    #69

    動作確認結果

    • ファイル変更側のログ
    $ touch test.txt
    $ 
    
    • 監視側のログ
    $ cargo run
        Finished dev [unoptimized + debuginfo] target(s) in 0.47s
         Running `/home/denjiry/code/rust/sysrust/target/debug/10_1`
    RawEvent { path: Some("/home/denjiry/code/rust/sysrust/chapter10/./test.txt"), op: Ok(CREATE), cookie: None }
    RawEvent { path: Some("/home/denjiry/code/rust/sysrust/chapter10/./test.txt"), op: Ok(CHMOD), cookie: None }
    RawEvent { path: Some("/home/denjiry/code/rust/sysrust/chapter10/./test.txt"), op: Ok(CLOSE_WRITE), cookie: None }
    $ 
    
    opened by denjiry 6
  • 3.2追加

    3.2追加

    3.2追加

    #10

    皆様に相談ですが、

    • 本筋から外れるかと思いエラーを基本panicに向けているが、ハンドリングするべきか
    • 現状main内にfnを書いてしまっているが分けた方が良いか

    ご意見ありましたらお願いします。


    動作ログ

    3.2.1.1

    $cargo run --bin main_3_2_1_1
        Finished dev [unoptimized + debuginfo] target(s) in 0.24s
         Running `target/debug/main_3_2_1_1`
    [97, 98, 99, 100, 101, 102, 103, 97, 98, 99, 100, 101, 102, 103, 97, 98, 99, 100, 101, 102, 103, 97, 98, 99, 100, 101, 102, 103, 97, 98, 99, 100, 101, 102, 103]
    

    3.2.1.2

    $cargo run --bin main_3_2_1_2
        Finished dev [unoptimized + debuginfo] target(s) in 0.64s
         Running `target/debug/main_3_2_1_2`
    [97, 98, 99, 100]
    

    3.2.2.1

    $cargo run --bin main_3_2_2_1
        Finished dev [unoptimized + debuginfo] target(s) in 0.11s
         Running `target/debug/main_3_2_2_1`
    [104, 101, 108, 108, 111, 33]
    

    3.2.2.2

    $cargo run --bin main_3_2_2_2
        Finished dev [unoptimized + debuginfo] target(s) in 0.11s
         Running `target/debug/main_3_2_2_2`
    [104, 101, 108]
    

    3.2.2.3

    $cargo run --bin main_3_2_2_3
        Finished dev [unoptimized + debuginfo] target(s) in 0.56s
         Running `target/debug/main_3_2_2_3`
    3584000 bytes written.
    
    オープン期間 
    opened by Saffrontea 6
  • 3.9 節をリプレースする

    3.9 節をリプレースする

    節タイトル

    問題

    対象コード

    • [x] Q3.1: https://github.com/yurakawa/learn-system-programming-with-go/tree/master/ch3/q3-1
    • [x] Q3.2: https://github.com/yurakawa/learn-system-programming-with-go/tree/master/ch3/q3-2
    • [x] Q3.3: https://github.com/yurakawa/learn-system-programming-with-go/tree/master/ch3/q3-3
    • [x] Q3.4: https://github.com/yurakawa/learn-system-programming-with-go/tree/master/ch3/q3-4
    • [x] Q3.5: https://github.com/yurakawa/learn-system-programming-with-go/tree/master/ch3/q3-5
    • [x] Q3.6: https://github.com/yurakawa/learn-system-programming-with-go/tree/master/ch3/q3-6

    補足説明

    実装追加 3章 
    opened by yuk1ty 5
  • implement chapter3_9 other than problem 3_9_6

    implement chapter3_9 other than problem 3_9_6

    ref: https://github.com/yuk1ty/learning-systems-programming-in-rust/issues/16

    3.9節の1~5までの実装を行いました。

    3.9.6に関しては、golangだとio.multiReader, io.SectionReaderを使って得問題のようで、Rust標準には代替のものがボクの知る限りありません。multiReader, SectionReaderを実装するのは骨が折れますし問題の趣旨からずれそうなので一旦スキップしました。

    Proof

    以下動作確認ログになります。

    3.9.1

    ❯ cargo run -p chapter3 --bin 3_9_1 chapter3/src/3_9_1/old.txt new.txt
        Finished dev [unoptimized + debuginfo] target(s) in 0.03s
         Running `target/debug/3_9_1 chapter3/src/3_9_1/old.txt new.txt`
    
    ❯ cat new.txt
    old text
    

    3.9.2

    ❯ cargo run -p chapter3 --bin 3_9_2
        Finished dev [unoptimized + debuginfo] target(s) in 0.02s
         Running `target/debug/3_9_2`
    
    ❯ wc -c random.txt
        1024 random.txt
    

    3.9.3

    ❯ cargo run -p chapter3 --bin 3_9_3
        Finished dev [unoptimized + debuginfo] target(s) in 0.02s
         Running `target/debug/3_9_3`
    
    ❯ unzip file.zip
    Archive:  file.zip
      inflating: file.txt
    
    ❯ cat file.txt
    zipzipzipzipzipzipzipzipzipzipzipzipzipzipzipzip
    

    3.9.4

    ❯ cargo run -p chapter3 --bin 3_9_4
    

    localhost:8080にアクセスすると次のファイルがダウンロードできる

    スクリーンショット 2021-05-01 17 53 58

    3.9.5

    ❯ echo "testtest" > test.txt
    
    ❯ cargo run -p chapter3 --bin 3_9_5
        Finished dev [unoptimized + debuginfo] target(s) in 0.03s
         Running `target/debug/3_9_5`
    
    ❯ cat new_test.txt
    test
    
    opened by k-nasa 4
  • 3.2 節をリプレースする

    3.2 節をリプレースする

    節タイトル

    • 3.2 io.Reader の補助関数

    対象コード

    • [ ] 3.2.1
    • [ ] 3.2.2

    補足説明

    • ioutil.ReadAll と同等の処理をする関数を Rust で探して書く?
    • io.Copy の方は https://doc.rust-lang.org/beta/std/io/fn.copy.html ?
    実装追加 3章 
    opened by yuk1ty 4
  • 2.4節をリプレースする

    2.4節をリプレースする

    節タイトル

    2.4 io.Writer を使う構造体の例。

    対象コード

    • [x] 4-1: https://github.com/yurakawa/learn-system-programming-with-go/blob/master/ch2/s4-1/main.go
    • [x] 4-2: https://github.com/yurakawa/learn-system-programming-with-go/blob/master/ch2/s4-2/main.go
    • [x] 4-3: https://github.com/yurakawa/learn-system-programming-with-go/blob/master/ch2/s4-3/main.go
    • [x] 4-4: https://github.com/yurakawa/learn-system-programming-with-go/tree/master/ch2/s4-4
    • [x] 4-5: https://github.com/yurakawa/learn-system-programming-with-go/blob/master/ch2/s4-5/main.go
    • [x] 4-6: https://github.com/yurakawa/learn-system-programming-with-go/blob/master/ch2/s4-6/main.go

    補足説明

    この節は内容が多そうなので、担当したい場所をちょっとずつやるでもよいです。

    4-1, 4-2 は一旦私がやってしまっていました。

    実装追加 2章 
    opened by yuk1ty 4
  • 10.2: `nix::fcntl::flock()` を使って `Cargo.toml` に排他ロックを掛け、10秒sleepするプログラム

    10.2: `nix::fcntl::flock()` を使って `Cargo.toml` に排他ロックを掛け、10秒sleepするプログラム

    対象の Issue

    Fixes: #78

    動作確認結果

    期待出力がわかりやすいので、Goの方は動作確認していません 🙇

    Rust

    コンソール1:

    %  cargo run --bin 10_2
    try locking...
    locked!  <- ここまで一気に出る。この時点でコンソール2でも起動。
    unlock  <- 10秒後に出る。
    

    コンソール2:

    %  cargo run --bin 10_2
    try locking...  <- ここでしばらく止まる。
    locked!  <- コンソール1が終わったら出る。
    unlock  <- コンソール2でロックを取得してから10秒後に出る。
    
    オープン期間 
    opened by laysakura 3
  • 13.7 節をリプレースする

    13.7 節をリプレースする

    節タイトル

    sync パッケージ

    対象コード

    • 13.7.1: https://github.com/yurakawa/learn-system-programming-with-go/blob/master/ch13/s7-1/main.go
    • 13.7.2: https://github.com/yurakawa/learn-system-programming-with-go/blob/master/ch13/s7-2/main.go
    • 13.7.3: https://github.com/yurakawa/learn-system-programming-with-go/tree/master/ch13/s7-3
    • 13.7.4: https://github.com/yurakawa/learn-system-programming-with-go/blob/master/ch13/s7-4/main.go
    • 13.7.5: https://github.com/yurakawa/learn-system-programming-with-go/blob/master/ch13/s7-6/main.go

    補足説明

    全部 goroutine の中でロックをかけるなどしているので、tokio 前提でいきたいと思います。

    • 13.7.1 は tokio::sync::Mutex と tokio::sync::RWLock を用いれば実装できる?https://docs.rs/tokio/1.6.1/tokio/sync/struct.Mutex.html
    • 13.7.2 は tokio::sync::Barrier が似てる→https://users.rust-lang.org/t/does-rust-have-an-equivalent-to-gos-waitgroup/41095
    • 13.7.3 は tokio::sync::OnceCell で書き直しできそう→https://docs.rs/tokio/1.6.1/tokio/sync/struct.OnceCell.html
    • 13.7.4 は tokio には Condvar がなさそうなので、どうしようかと思っています。
    • 13.7.5 は https://github.com/jonhoo/flurry などを使うとできそうだけど、無理して実装しなくてもいいと思っています。
    実装追加 
    opened by yuk1ty 0
  • 12.5 節をリプレースする

    12.5 節をリプレースする

    節タイトル

    シグナルの応用例

    対象コード

    • [ ] https://github.com/yurakawa/learn-system-programming-with-go/blob/master/ch12/s5-3/server.go

    補足説明

    こっちは tokio を使ったらすべて実装できそうです

    実装追加 12章 
    opened by yuk1ty 0
  • 12.4 節をリプレースする

    12.4 節をリプレースする

    節タイトル

    シグナルのハンドラを書く

    対象コード

    • [ ] https://github.com/yurakawa/learn-system-programming-with-go/tree/master/ch12/s4/main.go
    • [ ] https://github.com/yurakawa/learn-system-programming-with-go/blob/master/ch12/s4-1/main.go
    • [ ] https://github.com/yurakawa/learn-system-programming-with-go/tree/master/ch12/s4-4

    補足説明

    実装追加 12章 
    opened by yuk1ty 0
  • 11.5 節をリプレースする

    11.5 節をリプレースする

    節タイトル

    exec.Cmd によるプロセスの起動

    対象コード

    • [ ] 5: https://github.com/yurakawa/learn-system-programming-with-go/blob/master/ch11/s5/main.go
    • [ ] 5.1: https://github.com/yurakawa/learn-system-programming-with-go/tree/master/ch11/s5-1

    補足説明

    実装追加 11章 
    opened by yuk1ty 0
Owner
Yuki Toyoda
Software Engineer 🇯🇵; they/them
Yuki Toyoda