OpenTRFoundation / OpenTR

OpenTR website
https://opentr.foundation/
Apache License 2.0
4 stars 6 forks source link

Veri madenciği araştırması - ilk iterasyon #20

Closed aliok closed 7 months ago

aliok commented 1 year ago

https://github.com/OpenTRFoundation/OpenTR/issues/18 'in alt görevidir.

Anket dışında, online bulabileceğimiz veri kaynakları var mıdır?

altuga commented 11 months ago

Github da yaptığım araştırmada tag üzerinden iki kırılım buldum - https://github.com/topics/turkey ve https://github.com/topics/turkish ama bu tagleme ne kadarı opensource kapsamına girer bilemiyorum.,


StackOverflow üzerinden çok sağlıklı bir veri bulamadım


turkiyeacikkaynakplatformu üzerinden 5 proje buldum

1 - https://www.turkiyeacikkaynakplatformu.com/turkce-dogal-dil-isleme-projesi/ 2 - https://www.turkiyeacikkaynakplatformu.com/pardus-yayginlastirilmasi-projesi/ 3 - https://www.turkiyeacikkaynakplatformu.com/acik-kaynak-sistemleri-yayginlastirma-akasya-projesi/ 4 - https://www.turkiyeacikkaynakplatformu.com/skill-badge-projesi/ 5 - https://www.turkiyeacikkaynakplatformu.com/kubernetes-orkestrasyonu-sistemi-projesi/

Şimdilik bulabildiklerim bu kadar

aliok commented 11 months ago

Benim bulabildiğim veri kaynakları şunlar:

GitHub Search

Örnek olarak, Konumuna Türkiye yazan GitHub kullanıcıları: https://github.com/search?q=location%3Aturkey&type=users&p=1

https://github.com/search/advanced adresindeki şeyleri kullanarak aratılacak query üretilebiliyor. Mesela, Türkiye'den en az 200 public repo'su olan ve en az 150 follower'ı olan kişiler: https://github.com/search?q=location%3ATurkey+repos%3A%3E200+followers%3A%3E150&type=users&ref=advsearch

Buradan ama PR ve profil detayları birleştirilemiyor. Mesela, en az 5K star' olan bir projeye Türkiye'den PR açanları aramak mümkün değil. Bunun için GitHub'ın GraphQL API'sini kullanmak gerekebilir.

Aynı zamanda, kullanıcılar üye oldukları tarihe göre sıralanabiliyor. Bu sayede, yeni kullanıcıları da "incremental" olarak bulmak mümkün.

Mesela, Türkiye'den üye olan en son 20 kullanıcı: https://github.com/search?q=location%3ATurkey+&type=users&ref=advsearch&s=joined&o=desc

Bu arama hem pagination destekliyor, hem de, belirli bir kullanıcıdan sonra üye olanları bulmak için "after" parametresi kullanılabiliyor. Yani, belirli bir periyotta, son bulunan kullanıcıdan sonra üye olanları bulmak mümkün. Ancak, bu zaman zarfında eğer kişi ülke bilgisini değiştirmiş olabilir. O yüzden, sona geldikten sonra tekrar en başa gelip taramak gerekir.


Screenshot 2023-09-16 at 23 35 41
Screenshot 2023-09-16 at 23 35 30
Screenshot 2023-09-16 at 23 57 43

GitHub REST API

GitHub Search kullanmak için REST API kullanılıyor.

https://docs.github.com/en/rest/search/search?apiVersion=2022-11-28

GitHub GraphQL API

https://docs.github.com/en/graphql/overview/explorer adresindeki GraphQL API'sini kullanarak değişik verileri birleştirebiliriz.

Kullanıcılar, açtıkları PR'lar, PR'ların repository'leri vs. birleştirilebiliyor, ama filtreleme yapılamıyor. Yani, Türkiye'den olan kullanıcıların PR'ları ve PR'ların repolarının tamamını çekebiliyoruz, ama sadece 2K star olan repolara açılan PR'ları getir diyemiyoruz.

Kullanıcıları çekip, filtreleme yapıp, sonra 2. bir çekme yapacaksak, normal GitHub search de kullanabiliriz; emin değilim.

GraphQL API'de bazı şeyler mevcut değil.

Örnek sorgu:

query{
  search(query: "location:Turkey", type: USER, last: 3) {
    edges {
      node {
        __typename
        ...on User {
          login
          company
          name
          pullRequests(last:3, states:[MERGED, OPEN]){
            nodes{
              __typename
              ...on PullRequest{
                merged
                state
                repository{
                  url
                  stargazers{
                    totalCount
                  }
                  collaborators{
                    totalCount
                  }
                  forks{
                    totalCount
                  }
                  isFork
                  nameWithOwner
                  pullRequests{
                    totalCount
                  }
                  issues{
                    totalCount
                  }
                  stargazerCount
                  watchers{
                    totalCount
                  }
                }
              }
            }
          }
        }
      }
    }
    userCount
  }
}

Cevap:

"node": {
            "__typename": "User",
            "login": "metatimeofficial",
            "company": "Metatime Technology Inc.",
            "name": "Metatime",
            "pullRequests": {
              "nodes": [
                {
                  "__typename": "PullRequest",
                  "merged": true,
                  "state": "MERGED",
                  "repository": {
                    "url": "https://github.com/ethereum-lists/chains",
                    "stargazers": {
                      "totalCount": 6841
                    },
                    "collaborators": null,
                    "forks": {
                      "totalCount": 2355
                    },
                    "isFork": false,
                    "nameWithOwner": "ethereum-lists/chains",
                    "pullRequests": {
                      "totalCount": 2311
                    },
                    "issues": {
                      "totalCount": 865
                    },
                    "stargazerCount": 6841,
                    "watchers": {
                      "totalCount": 441
                    }
                  }
                }
              ]
            }
          }

Bazı özet bilgileri buradan kolayca alabiliriz ama. Mesela, Türkiye'den 2'den fazla reposu olanların PR sayısı:

query{
  search(query: "location:Turkey repos:>2", type: USER, last: 100) {
    edges {
      node {
        __typename
        ...on User {
          login
          company
          name
          pullRequests(states:[MERGED, OPEN]){
            totalCount
          }
        }
      }
    }
    userCount
  }
}
"edges": [
        {
          "node": {
            "__typename": "User",
            "login": "f",
            "company": "@teknasyon",
            "name": "Fatih Kadir Akın",
            "pullRequests": {
              "totalCount": 145
            }
          }
        },
        {
          "node": {
            "__typename": "User",
            "login": "sadikturan",
            "company": null,
            "name": "Sadık Turan",
            "pullRequests": {
              "totalCount": 0
            }
          }
        },

Google GitHub public data set

https://github.blog/2016-06-29-making-open-source-data-more-available/

Google ve GitHub'in sağladığı bir public data set. Bunu Google BigQuery'ye yüklemişler ve oradan doğrudan sorgulamalar yapılabiliyor. Örnek sorgular var internette. Ama bu datasette daha çok kod içeriğine yönelmişler, kullanıcılar ve repolardan çok. Kullanıcı ve repo verisi de var, ama sampled şekilde.

Mevcut tablolar:

Screenshot 2023-09-17 at 02 00 57

Örnek sorgu - içinde "This should never happen" metni geçen dosya sayısı:

SELECT count(*)
FROM (SELECT id, repo_name, path
        FROM `bigquery-public-data.github_repos.sample_files`
      ) AS F
JOIN (SELECT id
        FROM `bigquery-public-data.github_repos.sample_contents`
       WHERE NOT binary
         AND REGEXP_CONTAINS(content, 'This should never happen')) AS C
ON F.id = C.id;
Screenshot 2023-09-17 at 02 12 12

gharchive

https://www.gharchive.org/ uzun zamandır GitHub datası toplayan ve bunu paylaşan bir site. Tuttuğu veri oldukça güvenilir. İçinde GitHub event'leri bulunuyor. Repo, kullanıcı bilgileri gibi daha detaylı bilgiler sadece event'in payload'unda gelenler.

Yani, buradan bir aggregation yaptığımız zaman, yine başka bir yerden kullanıcı ve repo bilgilerini çekmemiz gerekecek.

Örnek event:

❯ head 2015-01-01-15.json | jq
{
  "id": "2489651051",
  "type": "PushEvent",
  "actor": {
    "id": 3854017,
    "login": "rspt",
    "gravatar_id": "",
    "url": "https://api.github.com/users/rspt",
    "avatar_url": "https://avatars.githubusercontent.com/u/3854017?"
  },
  "repo": {
    "id": 28671719,
    "name": "rspt/rspt-theme",
    "url": "https://api.github.com/repos/rspt/rspt-theme"
  },
  "payload": {
    "push_id": 536863970,
    "size": 1,
    "distinct_size": 1,
    "ref": "refs/heads/master",
    "head": "6b089eb4a43f728f0a594388092f480f2ecacfcd",
    "before": "437c03652caa0bc4a7554b18d5c0a394c2f3d326",
    "commits": [
      {
        "sha": "6b089eb4a43f728f0a594388092f480f2ecacfcd",
        "author": {
          "email": "5c682c2d1ec4073e277f9ba9f4bdf07e5794dabe@rspt.ch",
          "name": "rspt"
        },
        "message": "Fix main header height on mobile",
        "distinct": true,
        "url": "https://api.github.com/repos/rspt/rspt-theme/commits/6b089eb4a43f728f0a594388092f480f2ecacfcd"
      }
    ]
  },
  "public": true,
  "created_at": "2015-01-01T15:00:01Z"
}

Yukarıdan anlaşıldığı gibi, payload'da kullanıcı bilgisi var ama kullanıcının ülkesi yok.

gharchive bigquery

gharcive.org verilerini yine Google BigQuery'ye yüklüyorlar daimi olarak. Oradan da sorgulama yapılabilir.

BigQuery üzerinde yapılan örnek bir aggregation - 22 Aralık 2020'de açılan PR'ların repolara göre sayısı:

SELECT author, repository, COUNT(*) as cnt
FROM (
         SELECT type, repo.name as repository, actor.login as author
         FROM `githubarchive.day.20221222`
         WHERE type = 'PullRequestEvent' and JSON_EXTRACT(payload, '$.action') = '"opened"'
     )
GROUP by author, repository
ORDER BY author ASC;

Sonuç:

author repository cnt
0-vortex open-sauced/api.opensauced.pizza 1
000yesnt 0XMagic/BluTape 1

Bu sorgu toplam 15 GB veri process ediyor. Google BigQuery üzerinde 1 TB'a kadar ücretsiz. Sonrasında her 1 TB için 6$ ödemek gerekiyor. Yani, çok masraflı!

DevStats

Devstats, CNCF tarafından yazılan bir uygulama. CNCF projelerindeki GitHub verilerini çekip, grafikler çıkartıyor.

Örnek bir grafik, ülkelere göre contribution sayısı: https://all.devstats.cncf.io/d/9/developer-activity-counts-by-repository-group-table?orgId=1&var-period_name=Last%20year&var-metric=contributions&var-repogroup_name=All&var-country_name=Turkey

DevStats, gharchive datasını yayınlandıkça çekiyor, işliyor, başka yerlerdeki verilerle birleştiriyor (mesela şirket verisi) ve sonrasında kendi veritabanına kaydediyor.

Biz de benzer bir yaklaşım izleyebiliriz.

aliok commented 11 months ago

GitHub verisi ile elde edilebilecek analizler:

  1. Türkiye'deki GitHub kullanıcı sayısı ve diğer ülkeler ile kıyaslaması
    • Ancak, sadece konumuna Türkiye yazan kullanıcıları bulabiliriz. Herkes yazmıyor ama, boş bırakan sayısının oranını kabataslak tahmin etmeye yönelik bir yöntem gerekiyor.
  2. Türkiye'den açık kaynak projelere katkı yapan kişi sayısı
    • Türkiye'den PR açan kişi sayısını bulabiliriz.
    • Ancak, PR'ların açıldığı proje gerçekten bizim ilgimizi çeken açık kaynak projelerden mi?
    • Mesela, ben kendi boş repo'ma bir PR açtığımda o da çıkacak.
    • Proje belirlemek için farklı kriterler geliştirmemiz gerekiyor. Mesela şunların birleşimi:
    • Bazı bilindik GitHub organizasyonlarının listesi (mesela ASF, tüm projelerini github.com/apache altına koyuyor)
    • Bazı bilindik projelerin listesi (CNCF projeleri ayrı GitHub organizasyonlarının altında, ama CNCF'te bir organizasyon/proje listesi var)
    • Belirli sayıdan fazla star almış olan GitHub organizasyonları ve/veya projeleri
    • Belirli bir sayıdan fazla forklanmış olan GitHub organizasyonları ve/veya projeleri
    • ...
  3. Türklerin liderlik/committer'lık/vb. yaptığı projeler
    • Üstteki projelerde bir kişinin commit sayısını, toplam commit sayısına bölerek belki bir oranı kullanabiliriz.
altuga commented 11 months ago

Eline sağlık, epey detaylı veriler var. Türkiye 'de açık kaynak proje destek vermek ne demek, tanımı iyi ortaya koymak lazım. Dediğin gibi geliştirici kendi açtığı veya okul projesine PR açmış olabilir.
Kriter olarak turkiyeacikkaynakplatformu üzerinden 5 proje eklemiştim. Senin bahsettiğin kriterlerle ile genişletebilir ama bir şekilde belirli varsayımlara dayanmak zorundayız.

Br sonraki plan nedir?

aliok commented 11 months ago

@altuga hocam selamlar,

Türkiye 'de açık kaynak proje destek vermek ne demek, tanımı iyi ortaya koymak lazım. Dediğin gibi geliştirici kendi açtığı veya okul projesine PR açmış olabilir.

Aynen hocam. Buna kafa yormamız lazım.

Biraz terminoloji uydurmaya ihtiyacımız var aslında. Çünkü, GitHub'daki her public proje aslında bir açık kaynak proje. Ama, bu demek değil ki bunlar bizim için önemli. Bizim için önemli olan, katkıcı sayısını artırmak istediğimiz projelere bir isim bulmamız lazım. Mesela, "stratejik açık kaynak proje" gibi bir şey.

Stratejik proje terminolojisini devam ettirecek olursam, benim hep aklımdan geçen ASF, JCP, CNCF gibi yerlere katkı yapan kişilerin sayısını artırmak idi. Yani bu kişileri ben "açık kaynağa katkı veren kişiler" olarak tanımlıyordum kafamda. Bunları da stratejik açık kaynak projeler. Ama, çok fazla yer ve proje var.

Sanırım, üstte de bahsettiğim organizasyonlar gibi hardcoded bir listedeki organizasyonların repo'larına belirli bir PR'dan fazla açan kişileri "stratejik proje contributor'u" sınıfına dahil edebiliriz.

Hardcoded listemizde olmayan, atladığımız projeler mutlaka olacaktır (hatta çoğunluğu öyle olacaktır).

Burada da, bir kriter geliştirebiliriz. Atıyorum, aşağıdaki kriterleri sağlayan projeler "stratejik proje"dir diyebiliriz:

Br sonraki plan nedir?

Ben üstteki yorumdaki analizimde, hep kullanıcı odaklı gittim. Yani Türkiye'den kullanıcı sayısı, 20'den fazla PR açanların sayısı vs. gibi şeyler. Hatta bunun için ayrı bir issue açtım: https://github.com/OpenTRFoundation/OpenTR/issues/28 Bu bilgilerle, Türkiye'den açık kaynak katkısı değil de, genel olarak Türkiye'deki GitHub aktivitesi ile ilgili bilgiler edinebiliriz.

Paralelde, üstteki uydurduğum terminolojideki "stratejik açık kaynak proje"nin tanımını yapıp, bu projelerin bilgilerini toplamak için bir çalışma yapmamız gerekiyor. Hatta mümkünse listesini... Yani, şöyle diyebilsek çok güzel olur: "OpenTR olarak, 17 Eylül 2023'te şu 15000 repository bizim için stratejik açık kaynak projedir.". Devamında da, "Türkiye'den bu projelere 1000 kişi katkı vermiş" diyebilsek :) Belirli periyotlarla takip edip, rapor yayınlayabiliriz. Katkıcı sayısını artırmak için yapacağımız çalışmalarda da kullanabiliriz buradan bazı çıkarımlar yapabilirsek.

Biraz uzun oldu yine, ama yorumlarını bekliyorum.

cc @mugekocahan

aliok commented 11 months ago

@altuga @mugekocahan Ayrı bir issue açtım "stratejik proje" tanımı için: https://github.com/OpenTRFoundation/OpenTR/issues/29

Not: hedef proje veya başka bir şey de diyebiliriz. Terminoloji uydurmamız şart ama.

mugekocahan commented 11 months ago

Merhaba,

“Odak proje” de bir alternatif olabilir.

Selamlar Müge

19 Eyl 2023 Sal, saat 01:45 tarihinde Ali Ok @.***> şunu yazdı:

@altuga https://github.com/altuga @mugekocahan https://github.com/mugekocahan Ayrı bir issue açtım "stratejik proje" tanımı için: #29 https://github.com/OpenTRFoundation/OpenTR/issues/29

Not: hedef proje veya başka bir şey de diyebiliriz. Terminoloji uydurmamız şart ama.

— Reply to this email directly, view it on GitHub https://github.com/OpenTRFoundation/OpenTR/issues/20#issuecomment-1724499414, or unsubscribe https://github.com/notifications/unsubscribe-auth/ANPLDNA3IWGS5BUYYIMNLATX3C6GRANCNFSM6AAAAAA2UDSQFM . You are receiving this because you were mentioned.Message ID: @.***>

aliok commented 7 months ago

Bu tamamlandı.

"State of OSS contribution in Turkey" raporu yayınlandı.

Linkler:

Özetleyecek olursak: