4 puan yazan GN⁺ 2024-12-16 | 1 yorum | WhatsApp'ta paylaş
  • Map of GitHub, 690 binden fazla GitHub projesini noktalar olarak yerleştiren bir haritadır; ortak stargazer sayısı yüksek olan projeler birbirine daha yakın konumlandırılır
  • Haritanın oluşturulmasında Google BigQuery’nin GitHub etkinlik olaylarına ait herkese açık veri kümesi kullanıldı ve Şubat 2011’den Mayıs 2025’e kadar olan olaylardan yaklaşık 500 milyon star verisi kullanıldı
  • Depolar arasındaki ilişkilerin hesaplanmasında tam Jaccard Similarity kullanıldı; 24 GB RAM’li bir ev bilgisayarı yetersiz kaldığı için işlem, 512 GB RAM’li bir AWS EC2 instance’ında birkaç saat boyunca yürütüldü
  • Kümeleme için çeşitli algoritmalar denendikten sonra Leiden clustering seçildi ve sonuçta yaklaşık 690 bin proje 1.500’den fazla kümeye ayrıldı
  • Render işlemi, özel bir yerleşim aracı ile maplibre, GeoJSON ve tippecanoe birleştirilerek uygulandı; ülke adı etiketlerinin önemli bir kısmı ChatGPT yardımıyla oluşturuldu

Proje özeti

  • Map of GitHub, 690 binden fazla GitHub projesini görselleştiren bir haritadır
  • Her nokta bir projeyi temsil eder
  • Ortak olarak star veren kullanıcı sayısı yüksek olan projeler haritada birbirine daha yakın yerleştirilir

Herkese açık sürümler

Veri toplama ve benzerlik hesaplama

  • İlk aşamada hangi kullanıcının hangi depoya star verdiği alındı
    • Google BigQuery’nin GitHub etkinlik olayları için sunduğu herkese açık veri kümesi kullanıldı
    • Hedef dönem Şubat 2011’den Mayıs 2025’e kadardı
    • Bu süreçte yaklaşık 500 milyon star verisi elde edildi
  • İkinci aşamada her depo çifti arasındaki tam Jaccard Similarity hesaplandı
    • Hesaplama yükü, 24 GB RAM’li bir ev bilgisayarı için fazla büyüktü
    • 512 GB RAM’e sahip bir AWS EC2 instance’ında birkaç saat içinde işlendi
    • Başka benzerlik yöntemleri de denendi, ancak Jaccard en güvenilir sonuçları verdi

Kümeleme ve harita yerleşimi

  • Üçüncü aşamada depoları gruplamak için çeşitli kümeleme algoritmaları denendi
  • Sonunda en çok Leiden clustering tercih edildi ve yaklaşık 690 bin proje 1.500’den fazla kümeye ayrıldı
  • Dördüncü aşamada küme içindeki düğümlerin yerleşimi için özel ngraph.forcelayout kullanıldı
  • Kümelerin genel yerleşimi için ayrı bir yapılandırma kullanıldı

Render yöntemi

  • Beşinci aşama, haritanın render edilmesi sürecidir
  • Önceki projelerin aksine, tekerleği yeniden icat etmemek için maplibre kullanıldı
  • Veriler GeoJSON biçimine dönüştürüldü
  • Tile oluşturmak için tippecanoe kullanıldı
  • Ardından harita gezinti deneyimi oluşturuldu

Ülke adı etiketlerinin oluşturulması

  • Haritada gösterilen birçok ülke etiketi ChatGPT yardımıyla oluşturuldu
  • Hatalı bir etiket fark ederseniz sağ tıklayarak düzeltebilir ve pull request gönderebilirsiniz
  • Etiket oluşturma için kullanılan sistem prompt’u, GitHub depo gruplarını belirli bir programlama topluluğunun “ülkesi” olarak görüp özgün ve akılda kalıcı adlar üretmeyi ister
    • Adlar 1–3 kelimeyle kısa olmalıdır
    • İlgili depo grubunun ortak temasını, teknolojisini ve amacını yakalamalıdır
    • “JSWorld”, “UI”, “Web”, “Forge”, “Archipelago”, “Hub”, “Republic”, “Nexus” gibi genel ifadelerden kaçınılmalıdır
    • Benzer depo adları basitçe birleştirilmemelidir
    • Harita üzerinde anında ayırt edilebilecek kadar diğer ülke adlarından farklı olmalıdır
  • Kullanıcı girdisinde repoList ve repoNamesOnly bulunur; modelden bu depoların somut konularını ve teknolojilerini analiz ederek bir ad üretmesi istenir
  • LLM önceki ada çok benzeyen bir ad döndürürse yeniden denemesi sağlanır ve daha yaratıcı sonuçlar elde etmek için temperature artırılır

Arama ve tasarım

  • Arama kutusu, tüm depoların basit bir dökümünün ilk harfe veya yazara göre indekslenmesiyle uygulandı
  • Arama alanına a girildiğinde a ile başlayan depolar bulunur ve istemci tarafında bir fuzzy matcher ile gösterilir
  • Mevcut veri gösterimi beğeniliyor, ancak haritanın görsel tasarımı için hâlâ uygun stil aranıyor
  • Harita tasarımı deneyiminiz veya görsel fikirleriniz varsa paylaşmanız isteniyor

Lisans

  • Depo MIT lisansı ile yayımlandı
  • Verileri başka çalışmalarda kullanırsanız bu projeye attribution vermeyi değerlendirmeniz isteniyor

1 yorum

 
GN⁺ 2024-12-16
Hacker News yorumları
  • Nedense torvalds/linux, JS projeleri, awesome-X listeleri ve frontend kontrol listelerinin yanındaki Fronterra’da yer alıyor
    Ya çekirdek hacker’ları birden frontend’i sevmeye başladı ya da daha yüksek olasılıkla kod yazanlarla GitHub projelerine yıldız verenler pek örtüşmüyor

    • Jaccard benzerliği “ünlü” projeler için pek iyi değil
      Anlamsal olarak ilişkili oldukları için benzer değiller; sadece ikisi de popüler olduğu için benzer görünüyorlar
      reddit haritasında da aynı sorunu yaşadım: https://anvaka.github.io/map-of-reddit/ — popüler subreddit’lerin hepsi birbirine “benzer” oluveriyor
      Yine de küçük ve daha az ünlü projelerde hâlâ iyi çalışıyor :D
    • Projeleri düzenlemek için kod embedding’leri daha iyi olur muydu merak ediyorum
      Ama her dosyayı indirip embedding hesaplamak için gereken kaynakları düşününce muhtemelen pratik olmazdı
    • Bu, ısı haritalarının çoğu zaman fiilen nüfus haritasına dönüşmesine benzer bir nedenden olabilir
      https://xkcd.com/1138/
    • Sebebi React mi?
  • Asıl bağlantı: https://anvaka.github.io/map-of-github/

    • Evet, depo değil bu bağlantı verilmeliydi
  • Among Us bölgesinin adının Sussex olduğunu görünce güldüm

    • Benim gördüğüm en komik olan Lispaña idi
  • Rustland’in bu kadar küçük olmasına şaşırdım. Clouderra içinde ancak bir eyalet kadar
    Bevy ve Veloren’in ikisinin de Rustland’de olması da ilginç. Muhtemelen yıldızlar oyun geliştirme topluluğundan çok Rust topluluğundan gelmiş
    Rust ekosisteminin hâlâ görece küçük olduğu ve “X’i Rust ile yapanlar”ın çok göründüğü düşünülürse anlaşılır

    • nodelandia’nın da bu kadar küçük, hatta bağımsız bir kıta bile olmaması şaşırtıcı
      Herkes kendi balonunun büyüklüğünü abartıyor gibi
    • “PlusPlus Nation”daki diğer çekirdeklerin yakınında çok sayıda işletim sistemi geliştirme Rust projesi görünüyor
      O zaman “X but in Rust”, “RustLand”e değil “X” tarafına girebilir
    • O kadar da şaşırtıcı değil. Rust, sesi yüksek çıkan bir azınlığın savunduğu bir dil olarak da biliniyor
    • OP’ye göre veriler Mart 2023 itibarıyla, bu yüzden daha yeni Rust projelerinin çoğu henüz dahil edilmemiş olabilir
    • Yine de bevy’nin orada görünmesine sevindim :)
  • Kendi projem mapbox-gl-utils’i burada bulabilmek çok eğlenceli
    https://anvaka.github.io/map-of-github/#12/24.78947/18.85186

  • Arama özelliği olmadan, sadece haritayla belirli bir projeyi aramak eğlenceli bir mini oyuna dönüşüyor :-)

    • Ya da bir projeden başlayıp başka bir projeye giden yolu bulabilirsiniz. Deniz rotaları olduğunu hayal edebilirsiniz :)
  • Bir Julia hayranı olarak julialang/julia’ya bu kadar az bağlantı olmasına şaşırdım
    Niş bir dil ama bu haritada bu kadar izole görünmesi, kullanıcı ya da geliştirici deneyiminden çok da uzak değil gibi

    • julialang/julia’nın bulunduğu adanın batısında JuliaLand var
      julialang/julia’nın kendisinin tensorflow ve opencv yakınında olması, gerçek Julia paketlerinin ise başka yerde toplanması “umut edilen kullanıcılar” ile “gerçek kullanıcılar” arasındaki farkı gösteriyor gibi
      Julia projesinin kendisine yıldız veren birçok kişi, yeni bir Python arayan sayısal hesaplama Python kullanıcılarıydı; ama çoğu Python’da kaldı, bu yüzden diğer yıldızları da sayısal hesaplama Python tarafında
      Buna karşılık JuliaLand paketlerine yıldız verenler gerçek Julia kullanıcıları olduğundan, gayet makul biçimde Moleculandia, AstroSpace ve Quantumia yakınında kümelenmişler
  • Çok temiz ve yaratıcı bir yaklaşım, ama ülke/harita metaforunun en iyisi olup olmadığı konusunda açıkçası kararsızım
    Çoğu durumda yalnızca isimden açık olmuyor; neyi temsil ettiğini anlamak için yakınlaştırmak gerekiyor
    Bunun yerine hiyerarşik kümeleme yapıp, daha açıklayıcı ve sadık LLM üretimli etiketler eklemek ve üst kümeler arasındaki ortalama bağlantılılığı çizgilerle göstermek daha ilginç olabilirdi

    • Çizgilerle dolu ağır bir görsel olmaması beni hoş bir şekilde şaşırttı
      90’larda böyle görselleri ilk yapan ve sınırlarını neredeyse hemen öğrenen biri olarak, bunun abartılı iddialarda bulunmamasını seviyorum. Bir makale değil, sadece bir görünüm
      Eksenleri anlam taşıyan grafikleri severim. Çizgiler, şekiller, kutular/gruplar, mesafe, X’e karşı Y, renk, kalınlık, doku, arka plan, ön plan gibi şeyler
      Basit olan da iyi. İnsanlar çok sık hiçbir anlamı olmadan havalı görünsün diye çizgi çekiyor; bu ise sadece biraz grupları olan bir görsel ve karakteri var. Güzel değil mi?
      Elbette çizgileri hâlâ seviyorum, ama her zaman her yerde gerekli değiller
    • Henüz evrensel bir kümeleme algoritması bulamadım
      Veriyi gruplamanın birden fazla yolunun ayrı ayrı anlamlı olduğu durumlar sık görülüyor; bu yüzden hangi nihai kümelemeyi seçerseniz seçin kusursuz olmuyor
      Hmm… belki kuantum kümeleme gibi bir şey yapmak eğlenceli bir proje olabilir
      Şu an biraz bulanık hatırlıyorum ama hdbscan algoritmasını, yani hiyerarşik kümelemeyi denemiştim. GitHub ölçeğindeki grafikte belleğe sığmıyordu
      Sonunda hiyerarşik kümelemeye benzer bir şey; louvain/leiden/kendi yazdığım yöntemlerin karışımını kullandım ve son haritada görünen sonuç bu
    • Öyle de yapılabilirdi, ama bu proje bir harita yapmayı seçmiş
  • Quitlessia ve NeoQuitlessia… isimler şeytani
    Doom Emacs, Emacsia’da değil NeoQuitlessia’da; şaşırtıcı biçimde mantıklı :)

    • Haha! vim’i seviyorum
      Çıkmayacağız
  • Depolar arasındaki bağlantıların nasıl belirlendiğini merak ediyorum
    Kendi depolarımdan birkaçını kontrol ettim; bazı bağlantılarda iki yönde de referans görünmüyor

    • Yazar özgün HN gönderisinde yanıtlamıştı: https://news.ycombinator.com/item?id=35933981
      Temelde başkalarının tahmin ettiği gibi, çizgiler “yıldız veren kişiler” bazında en yüksek benzerlik puanını temsil ediyor ve tüm harita da bu ölçüte göre oluşuyor
      Kafa karıştırabilir: çizgiler yalnızca belirli bir ülkeye tıklandığında görünüyor
    • İlk satırda yazıyor: “Ortak yıldız veren kişi sayısı fazlaysa noktalar birbirine yakın olur”
    • Jaccard benzerliği 0 ile 1 arasında bir değer döndürür. Bu durumda değerlerin çoğu 0’a yakın olacaktır
      Kenar oluşturulup oluşturulmayacağını belirleyen sabit kodlanmış bir eşik olduğunu sanıyorum. Örneğin A ile B arasındaki Jaccard benzerliği 0,2’den büyükse kenar oluşturmak gibi