4 ポイント 投稿者 GN⁺ 2023-10-20 | 1件のコメント | WhatsAppで共有
  • CodeCraftersのBitTorrentチャレンジは、P2Pファイル共有プロトコルを自分で実装し、公開されているファイルをダウンロードする過程を扱う
  • 学習の流れはbencodeのデコードから始まり、.torrentファイルの解析、info hashの計算、ピアの発見、ハンドシェイク、ピースのダウンロードへと進む
  • 基本BitTorrentの11ステップとMagnet Linksの8ステップを合わせ、全19ステップで構成されている
  • ステップ構成と手順は無料で閲覧できるが、コード提出とソリューションの閲覧にはCodeCrafters Membershipが必要
  • 無料でまず試したい場合は、今月の無料チャレンジであるBuild your own Shellを選べる

BitTorrentクライアントの実装目標

  • Build your own BitTorrentは、BitTorrentを大規模データ配信用のP2Pファイル共有プロトコルとして捉え、それを自分で実装するCodeCraftersのチャレンジ
  • 最終目標は、BitTorrentプロトコルで公開されているファイルをダウンロードできるBitTorrentクライアントを作ること
  • 過程の中で、BitTorrentプロトコルと**.torrentファイル**の仕組みもあわせて学ぶ

ステップ構成と難易度

利用条件

  • このチャレンジにはCodeCrafters Membershipが必要
    • チャレンジ全体の構成と各ステップの手順は無料で学習可能
    • コード提出とソリューション閲覧にはメンバーシップが必要
  • 無料チャレンジを希望する場合は、今月無料で提供されているBuild your own Shellを試せる

1件のコメント

 
GN⁺ 2023-10-20
Hacker News のコメント
  • こんにちは!Codecrafters の Build your own BitTorrent チャレンジを作った Sarp です
    少し背景を話すと、FAANG の職場を解雇されたあと、戻りたいという意欲がほとんどなくなり、コーディングへの興味を取り戻せるような面白いプログラミングプロジェクトを探し始めました
    デジタルノマド生活の中で Nomadlist で Codecrafters を見つけ、コードを Git に push して段階ごとのテストを通過していく方式が気に入りました。ゲーム化された進行方式が集中する助けになり、SQLite、Git、Redis のように普段使っていたソフトウェアをより深く掘り下げることができました。チャレンジのために Go も新しく学びました
    サイト上のすべてのチャレンジを終えてやることがなくなったとき、投票の多かったアイデアの一つである BitTorrent クライアントを作ることにしました
    BitTorrent クライアントを作る中で、BitTorrent プロトコル、トレントファイルの構造、エンコーディングの問題、ネットワークリクエストのパイプライニング、バイナリ値の URL エンコード、Go のチャネルの使い方など、多くのことを学びました
    チャレンジへのフィードバックをもらいたいですし、質問にも喜んで答えます

    • 招待制トラッカーは、自分たちのプライベートトラッカーでどのトレントクライアントを使えるか/使えないかをかなり厳しく定めていることがよくあります。より広く採用されるには、この壁をどう越えられるのか気になります
    • BitTorrent クライアントの作り方をどう学んだのか気になります。Codecrafters や、何かを自分で作るよう導いてくれる本のアイデアは好きですが、始点がつかめないといつも苦労していました
    • ちょうど BitTorrent 関連のプロジェクトを始めたところです。クライアントを自分で実装することはなさそうですが、もしかしたらやるかもしれませんし、少なくとも .torrent ファイルmagnet リンクの生成は実装する必要があるので、プロトコルを少し学んでいるところです
      こういうものが投稿されていて興味深いですし、進めるうえで役に立つかもしれません
    • 「サイト上のすべてのチャレンジを終えてやることがなくなったとき、投票の多かったアイデアの一つである BitTorrent クライアントを作ることにした」という部分を見ると、今は Codecrafters に雇われているのか気になります
    • チャレンジ自体へのフィードバックかは分かりませんが、Cargo.toml に依存関係を追加できないのが少し残念でした
      bencode チャレンジの一部を nom で解いてみたかったのですが、やりすぎな選択かもしれないものの、楽しみで試そうとしていたことで、現状では不可能です
      リモートビルダーの負荷や実行時間が心配なのであれば、この問題を避けられるようにテストケースをローカルで実行する方法があるとよいと思います
  • Jon Gjengset[1] が今、自分の YT チャンネル[2]で同じチャレンジを Rust でライブコーディングしています
    [1]: https://thesquareplanet.com/
    [2]: https://www.youtube.com/watch?v=jSTkEPPiULs

    • あ、それは私です!
      よりよいリンクは https://www.youtube.com/watch?v=jf_ddGnum_4 で、チャプター表示があり、途中の停電部分もカットしてあります :p
    • YouTube がブロックされている人向けに、Twitch にもライブ配信のコピーがあります
      [0] https://www.twitch.tv/videos/1954769913
    • 彼がコーディングするのを見るのは驚きです。Rust 以外に Python でコーディングする専門家もいるのか気になります
  • なぜログインが必要なのか分かりません。これは有料チュートリアルですか?
    無料チュートリアルならここにあります
    JS - https://allenkim67.github.io/programming/2016/05/04/how-to-m...
    GO - https://blog.jse.li/posts/torrent/
    Python - https://markuseliasson.se/article/bittorrent-in-python/

    • ここにあるチュートリアルも役に立つかもしれません
      https://github.com/codecrafters-io/build-your-own-x
    • これはチュートリアルや講義ではなく、各ステップごとにサーバー側テストが付いた段階的なガイド付きプロジェクトです
  • いったいなぜ何の説明もなく私の GitHub アカウントへのアクセス権を要求するのか分かりません

    • 公平に言えば、メール読み取り権限だけを要求すると書かれてはいますが、私もその段階以降は進みませんでした
    • 理由の一つは、Codecrafters が学習サイトで、ユーザーのコードを直接ホストせず GitHub に保存するためだと思います。この記事は Codecrafters にある一つのプロジェクトについてのものです
      それでも、なぜ必要なのかは説明すべきです
    • 一般的なメール登録のような代替手段を提供せず、GitHub を認証プロバイダーとしてだけ使っているように見えます。普通こうしたサイトは複数の選択肢を提供します
    • 認証に必要です。元のリンクは app.codecrafters.io に行き、codecrafters.io はマーケティングページです :)
    • チャレンジのコードを自分の Git に上げると、その実装に対していくつかのテストが実行される仕組みです
  • 奇妙なことに、アップロード部分が抜けている。ピアであるなら対等な参加者なので、データは双方向に流れるべき。そうでなければ BitTorrent は動作しないはず

    • そのとおり。チャレンジの範囲を絞るために、最初は除外していた。すでに11ステップあってかなり長いから
      アップロード機能はチャレンジの拡張として追加する予定で、コミュニティで多くの票を集めている拡張アイデアの一つ
    • そのとおり。「Seeding files」は拡張機能: https://app.codecrafters.io/vote/challenge-extension-ideas?c...
      まだサポートされていないが、近いうちに提供予定で、新しい拡張はユーザー投票に応じて追加している
  • JavaScript を使う人なら、Feross が作った WebTorrent があり、これはプロトコルをブラウザタブの中に持ち込んだもの
    コードベースは本当に読みやすい。多くの開発者はコードを読むより書くほうが得意だが、コードを読む力を鍛えたいなら、WebTorrent のコードベースほど始めるのに良い場所はあまり見たことがない。読む楽しさでは redis と同じくらいのレベルだと思う
    https://github.com/webtorrent/webtorrent

  • このアイデアは本当に気に入った! 以前、Erlang を学びたくて、友人は Crystal を学びたがっていたので、完全にカスタムのクライアントで互いにファイルを共有できるようにしてみようと話した
    基本プロトコルといくつかの拡張でファイルをやり取りできるようになったときは本当に楽しかった。その拡張は BEP と呼ぶので合っているのかな?
    新しい言語を学ぶ方法としては、おそらく一番好きなやり方。理解して実装するのに十分シンプルだから

    • CodeCrafters には Crystal 対応もある。Build your own Redis ができる
  • 年を追うごとにワクワクさせてくれる小さなプロジェクトアイデアはどんどん減っているが、これはその一つ
    CodeCrafters は初めて聞いたが、データベースを作るような学術的なチャレンジアイデアが気に入った。コンパイラ作りも入るといい

  • Go で BitTorrent クライアントを作っていた記事を思い出す: https://blog.jse.li/posts/torrent/

  • 数年前、以前の職場で、社員が安価なネットブックで使えるカスタムの Linux ライブ OS を作成してサポートしていた
    アップデート配布のために社内用のトレントサーバーをゼロから自作し、イメージ更新の配布に使っていた
    標準に準拠したソフトウェアを作り、既存のクライアント群と動作させた最初の経験の一つで、良い学習過程だった