4 puan yazan GN⁺ 2023-10-20 | 1 yorum | WhatsApp'ta paylaş
  • CodeCrafters’ın BitTorrent challenge’ı, P2P dosya paylaşım protokolünü doğrudan uygulayarak herkese açık dosyaları indirme sürecini ele alır
  • Öğrenme akışı bencode çözümleme ile başlar; .torrent dosyası ayrıştırma, info hash hesaplama, peer keşfi, handshake ve parça indirme ile devam eder
  • Temel BitTorrent için 11 adım ve Magnet Links için 8 adım olmak üzere toplam 19 adımdan oluşur
  • Adım yapısı ve yönergeler ücretsiz görülebilir, ancak kod gönderimi ve çözümleri görüntüleme için CodeCrafters Membership gerekir
  • Önce ücretsiz denemek isterseniz, bu ayın ücretsiz challenge’ı olan Build your own Shell’i seçebilirsiniz

BitTorrent istemcisi uygulama hedefi

  • Build your own BitTorrent, BitTorrent’i büyük ölçekli veri dağıtımı için bir P2P dosya paylaşım protokolü olarak ele alan ve bunu doğrudan uygulattıran bir CodeCrafters challenge’ıdır
  • Nihai hedef, BitTorrent protokolüyle herkese açık dosyaları indirebilen bir BitTorrent istemcisi oluşturmaktır
  • Süreç boyunca BitTorrent protokolünü ve .torrent dosyalarının nasıl çalıştığını da öğrenirsiniz

Adım yapısı ve zorluk seviyesi

Kullanım koşulları

  • Bu challenge için CodeCrafters Membership gerekir
    • Tüm challenge yapısı ve adım yönergeleri ücretsiz olarak incelenebilir
    • Kod gönderimi ve çözümleri görüntüleme için üyelik gerekir
  • Ücretsiz bir challenge istiyorsanız, bu ay ücretsiz sunulan Build your own Shell’i deneyebilirsiniz

1 yorum

 
GN⁺ 2023-10-20
Hacker News yorumları
  • Merhaba! Codecrafters’ın Build your own BitTorrent meydan okumasını hazırlayan Sarp ben.
    Biraz arka plan anlatmak gerekirse, FAANG’deki işimden çıkarıldıktan sonra geri dönme isteğim pek kalmamıştı ve kodlamaya olan ilgimi yeniden canlandıracak eğlenceli bir programlama projesi aramaya başladım.
    Dijital göçebe olarak yaşarken Nomadlist’te Codecrafters’ı keşfettim; kodu Git’e push edip adım adım testleri geçme yaklaşımı hoşuma gitti. Oyunlaştırılmış ilerleme biçimi odaklanmama yardımcı oldu; SQLite, Git, Redis gibi zaten kullandığım yazılımları daha derinlemesine kurcalayabildim. Meydan okumaları yapmak için Go’yu da sıfırdan öğrendim.
    Sitedeki tüm meydan okumaları bitirip yapacak işim kalmayınca, çok oy alan fikirlerden biri olan bir BitTorrent istemcisi yapmaya karar verdim.
    BitTorrent istemcisi yaparken BitTorrent protokolü, torrent dosya yapısı, kodlama sorunları, ağ isteklerinde pipelining, ikili değerlerin URL encoding’i, Go’da channel kullanımı gibi pek çok şey öğrendim.
    Meydan okuma hakkında geri bildirim almak isterim; soruları da memnuniyetle yanıtlarım.

    • Davetle girilen tracker’lar, kendi özel tracker’larında hangi torrent istemcilerinin kullanılıp kullanılamayacağı konusunda çoğu zaman epey katı kurallar koyuyor. Daha geniş kabul görmek için bu engelin nasıl aşılabileceğini merak ediyorum.
    • BitTorrent istemcisi yapmayı nasıl öğrendiğini merak ediyorum. Codecrafters ya da bir şeyi kendin yaparak ilerlemeyi anlatan kitap fikrini seviyorum ama nereden başlayacağımı kestiremediğimde hep zorlanıyorum.
    • Tam da BitTorrent ile ilgili bir projeye yeni başladım. Muhtemelen istemciyi kendim uygulamayacağım ama belki yaparım; en azından .torrent dosyası ve magnet linki üretmeyi uygulamam gerekeceği için protokolü biraz öğreniyorum.
      Bunun paylaşılması ilginç oldu; ilerlememe yardımcı olabilir.
    • “Sitedeki tüm meydan okumaları bitirip yapacak işim kalmayınca, çok oy alan fikirlerden biri olan bir BitTorrent istemcisi yapmaya karar verdim” kısmına bakınca, şu anda Codecrafters’ta çalışıp çalışmadığını merak ettim.
    • Bunun doğrudan meydan okumanın kendisiyle ilgili bir geri bildirim olup olmadığını bilmiyorum ama Cargo.toml’a bağımlılık ekleyememek biraz hayal kırıklığı yarattı.
      bencode meydan okumasının bir kısmını nom ile çözmeyi denemek istemiştim; belki abartılı bir seçimdi ama eğlencesine yapacaktım ve şu anda mümkün değil.
      Uzaktaki builder’ın yükü ya da çalışma süresi konusunda endişe varsa, bu sorunu aşmak için test case’lerini yerelde çalıştırmanın bir yolu olsa güzel olurdu.
  • Jon Gjengset[1] şu anda kendi YT kanalında[2] aynı meydan okumayı Rust ile canlı kodluyor.
    [1]: https://thesquareplanet.com/
    [2]: https://www.youtube.com/watch?v=jSTkEPPiULs

  • Neden giriş gerektiğini anlamıyorum. Bu ücretli bir tutorial mı?
    Ücretsiz tutorial burada var:
    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/

  • Neden hiçbir açıklama olmadan GitHub hesabıma erişim izni istediğini hiç anlamıyorum.

    • Adil olmak gerekirse yalnızca e-postayı okuma izni istediği yazıyor ama ben de o aşamadan sonra devam etmedim.
    • Sebeplerden biri, Codecrafters’ın bir öğrenme sitesi olması ve kullanıcı kodunu kendisi barındırmayıp GitHub’da saklaması gibi görünüyor. Bu yazı Codecrafters’taki bir projeyle ilgili.
      Yine de neden gerekli olduğunu açıklamaları gerekir.
    • Normal e-posta ile kayıt gibi bir alternatif sunmadan, GitHub’ı yalnızca kimlik doğrulama sağlayıcısı olarak kullanıyor gibi görünüyor. Genelde bu tür siteler birden fazla seçenek sunar.
    • Kimlik doğrulama için gerekli. Orijinal link app.codecrafters.io’ya gidiyor; codecrafters.io ise pazarlama sayfası :)
    • Meydan okuma kodunu kendi Git’ine yüklediğinde, o uygulama üzerinde bazı testlerin çalıştırıldığı bir yapı.
  • Garip şekilde yükleme kısmı eksik. Peer ise eşit bir katılımcı demektir, dolayısıyla verinin iki yönde de akması gerekir. Aksi halde BitTorrent çalışmaz

    • Doğru. Challenge’ın kapsamını daraltmak için başta hariç tuttuk. Zaten 11 adım olduğu için epey uzun
      Yükleme özelliğini challenge genişletmesi olarak eklemeyi planlıyoruz; topluluktan en çok oy alan genişletme fikirlerinden biri
    • Evet, “Seeding files” bir genişletme özelliği: https://app.codecrafters.io/vote/challenge-extension-ideas?c...
      Henüz desteklenmiyor ama yakında sunulacak; yeni genişletmeleri kullanıcı oylarına göre ekliyoruz
  • JavaScript kullananlar için Feross’un yaptığı WebTorrent var; bu, protokolü tarayıcı sekmesinin içine taşıdı
    Kod tabanını okumak gerçekten çok keyifli. Birçok geliştirici kod okumaktan çok kod yazmada daha iyi; kod okuma becerinizi geliştirmek istiyorsanız WebTorrent kod tabanı kadar iyi bir başlangıç noktası pek görmedim. Okuma keyfi açısından redis ile aynı seviyeye koyarım
    https://github.com/webtorrent/webtorrent

  • Bu fikri gerçekten çok sevdim! Eskiden Erlang öğrenmek istiyordum, bir arkadaşım da Crystal öğrenmek istiyordu; tamamen özel istemcilerle birbirimizle dosya paylaşabilir hale getirmeyi deneyelim demiştik
    Temel protokol ve birkaç genişletmeyle dosya alıp gönderebilir hale geldiğimizde gerçekten eğlenceliydi. O genişletmelere BEP deniyordu, değil mi?
    Yeni bir dil öğrenmenin muhtemelen en sevdiğim yolu bu. Çünkü anlamak ve uygulamak için yeterince basit

    • CodeCrafters’ta Crystal desteği de var. Build your own Redis yapabilirsiniz
  • Yıllar geçtikçe beni heyecanlandıran küçük proje fikirleri giderek azalıyor; bu da onlardan biri
    CodeCrafters’ı ilk kez duydum ama veritabanı yapmak gibi akademik challenge fikirleri hoşuma gitti. Derleyici yapmak da eklense güzel olurdu

  • Go ile BitTorrent istemcisi yapmayı anlatan yazı aklıma geldi: https://blog.jse.li/posts/torrent/

  • Birkaç yıl önce önceki iş yerimde, çalışanların ucuz netbook’larda kullanabileceği özel bir Linux live OS geliştirip destekliyorduk
    Güncellemeleri dağıtmak için sıfırdan şirket içi bir torrent sunucusu yazdık ve imaj güncellemelerinin dağıtımında kullandık
    Standartlara uygun yazılım geliştirip varsayılan istemcilerle çalışır hale getirdiğim ilk deneyimlerden biriydi; iyi bir öğrenme süreciydi