nameisxi / outliers-backend

0 stars 0 forks source link

Most active github users by contributions in South Korea #1

Open nameisxi opened 2 years ago

nameisxi commented 2 years ago

Esimerkki 1: https://github.com/gayanvoice/top-github-users Esimerkki 2: https://github.com/lauripiispanen/most-active-github-users-counter

henrinikku commented 2 years ago

Jälkimmäisen esimerkin README.md:

Firstly, GitHub API doesn't allow sorting by contributions, so instead it is first sorted by number of followers to get a larger list, which is then sorted by contributions. This means you need a minimum number of followers to be on this list. Each page shows the minimum number of followers needed.

Eli varmaankin vähiten huono ratkaisu on vaan kerryttää mahdollisimman iso lista henkilöitä ja sortata ne kontribuutioiden määrän mukaan? Mikä on kaiketi se mitä tehdään jo tällä hetkellä?

henrinikku commented 2 years ago

Eikun niin joo nythän ei varsinaisesti tehdä itse mitään käyttäjiä listaavaa kyselyä. Eli varmaan tää olis hyvä korvata suoralla GraphQL-kyselyllä, jotta voidaan hakea enemmän kuin top 1000 eniten seurattua käyttäjää?

henrinikku commented 2 years ago

Toinen puute tossa github haussa on atm se että noi sijaintitiedot taitaa olla vapaata tekstiä. Näköjään github osaa kuitenkin matchata kaupungit niiden sisältämiin maihin (esim. "South Korea" = "Seoul, South Korea") ainakin joissain tapauksissa.

henrinikku commented 2 years ago

Tein tän copy paste-luonnoksen jossain editorissa, koitan lisätä ens viikolla paginaation ja tarvittavat kentät tohon

query {
  search(type: USER, query:"type:user sort:followers-desc location:South Korea location:Republic of Korea location:Seoul, location:Korea",  first:50) {
    userCount
    edges {
      node {
        __typename
        ... on User {
          login
          avatarUrl
          name
          company
          location
          organizations(first: 100) {
            nodes {
              login
            }
          }
          followers {
            totalCount
          }
          contributionsCollection {
            contributionCalendar {
              totalContributions
            }
            totalCommitContributions
            totalPullRequestContributions
            restrictedContributionsCount
          }
        }
      }
      cursor
    }
  }
}
nameisxi commented 2 years ago

tää

Kyllä.

Toinen puute tossa github haussa on atm se että noi sijaintitiedot taitaa olla vapaata tekstiä. Näköjään github osaa kuitenkin matchata kaupungit niiden sisältämiin maihin (esim. "South Korea" = "Seoul, South Korea") ainakin joissain tapauksissa.

Joo ne valitettavasti on vapaata tekstiä. Noi mun linkkaamat resurssit sisältää listan joitain muitakin kaupunkeja, mutta mä voin antaa täyden listan kun tarvetta.

Tein tän copy paste-luonnoksen jossain editorissa, koitan lisätä ens viikolla paginaation ja tarvittavat kentät tohon

query {
  search(type: USER, query:"type:user sort:followers-desc location:South Korea location:Republic of Korea location:Seoul, location:Korea",  first:50) {
    userCount
    edges {
      node {
        __typename
        ... on User {
          login
          avatarUrl
          name
          company
          location
          organizations(first: 100) {
            nodes {
              login
            }
          }
          followers {
            totalCount
          }
          contributionsCollection {
            contributionCalendar {
              totalContributions
            }
            totalCommitContributions
            totalPullRequestContributions
            restrictedContributionsCount
          }
        }
      }
      cursor
    }
  }
}

Tiiätkö miten kallis toi on rate limitin kannalta? Kuinka monta käyttäjää tolla saa per tunti? Ainakin GitHubin Search endpoint on kaikista kallein ja sillä saa vaan 30 kutsua per tunti. Toisaalta se oli muistaakseni erillinen "core" endpointeista joiden quota per tunti on 5000 callia.

nameisxi commented 2 years ago

Tein tän copy paste-luonnoksen jossain editorissa, koitan lisätä ens viikolla paginaation ja tarvittavat kentät tohon

query {
  search(type: USER, query:"type:user sort:followers-desc location:South Korea location:Republic of Korea location:Seoul, location:Korea",  first:50) {
    userCount
    edges {
      node {
        __typename
        ... on User {
          login
          avatarUrl
          name
          company
          location
          organizations(first: 100) {
            nodes {
              login
            }
          }
          followers {
            totalCount
          }
          contributionsCollection {
            contributionCalendar {
              totalContributions
            }
            totalCommitContributions
            totalPullRequestContributions
            restrictedContributionsCount
          }
        }
      }
      cursor
    }
  }
}

Ja kiitti organisaatioiden lisäyksestä! Yhden asiakkaan kaks main halua oli nähdä organisaatiot ja ohjelmointikielien käyttömäärä vuosi vuodelta -- jälkimmäinen on luultavasti liian kallis toteuttaa, mut kerron siitä lisää myöhemmin

henrinikku commented 2 years ago
henrinikku commented 2 years ago

https://github.com/nameisxi/outliers-backend/tree/main/scratch Täällä datat ja käytetty skripti. Github sallii max 100 rivin palauttamisen per request. Toi search-endpointti palauttaa max 1000 käyttäjää per kysely (eli 10 requestia/sivua).

Ainoa keino kiertää rajoitusta on käyttää tavallaan manuaalista paginaatiota siinä päällä sorttaamalla ja rajaamalla jonkun kentän perusteella. followers toimisi muuten, mutta niin harvalla käyttäjällä on yhtään seuraajaa että suunnilleen 1000 seuratuimman käyttäjän jälkeen rajaus ei enää tuota tuloksia.

Sain ton nyt kuitenkin toimimaan sorttaamalla ja rajaamalla repojen määrän perusteella. Numerot ei ihan täsmää githubin ilmoittamaan käyttäjämäärään verratessa, eli datassa on varmasti jonkun verran duplikaatteja johtuen github apin outouksista, mutta sain ladattua noin 50k käyttäjää, eli käytännössä kaikki Korean sijainnikseen merkinneet käyttäjät joilla on yli 6 repoa.

henrinikku commented 2 years ago

Tiputin kyselystä aika paljon kenttiä pois rate limitin välttämiseksi (GraphQL-apin kohdalla rate limit lasketaan vähän jännästi), mutta ainakin käyttäjänimet tms löytyy.

nameisxi commented 2 years ago

Täällä datat ja käytetty skripti. Github sallii max 100 rivin palauttamisen per request. Toi search-endpointti palauttaa max 1000 käyttäjää per kysely (eli 10 requestia/sivua).

Eli jos ymmärsin oikein, niin kun search endpoint palauttaa 1000 resulttia, niin core API määrää, että joudut vielä paginoimaan ne 100 paloissa?

Sain ton nyt kuitenkin toimimaan sorttaamalla ja rajaamalla repojen määrän perusteella. Numerot ei ihan täsmää githubin ilmoittamaan käyttäjämäärään verratessa, eli datassa on varmasti jonkun verran duplikaatteja johtuen github apin outouksista, mutta sain ladattua noin 50k käyttäjää, eli käytännössä kaikki Korean sijainnikseen merkinneet käyttäjät joilla on yli 6 repoa.

IMO parempi kun follower count joka ei meinaa mitään. Mut tohon pitää ehkä keksiä vielä joku "on ollut aktiivinen viimeisenä kolmena vuotena" ehto, kuten contributionCallendarin käyttö, jos näyttää siltä että liian moni noista käyttäjistä on täysin inaktiivinen.

nameisxi commented 2 years ago

Tiputin kyselystä aika paljon kenttiä pois rate limitin välttämiseksi (GraphQL-apin kohdalla rate limit lasketaan vähän jännästi), mutta ainakin käyttäjänimet tms löytyy.

Ai, mut ainakin mun käsityksen mukaan ne kentät joita oon valinnu "kuuluu" jo siihen User datan piiriin, eikä vaatinu ylimääräsiä kyselyitä. Ehitkö testaan tota ratelimit ongelmaa ja millä kentillä? Voisin tsekata tota lisää.

Edit: puhuit varmaan näistä kentistä:

organizations(first: 100) {
  nodes {
    login
  }
}
followers {
  totalCount
}
contributionsCollection {
  contributionCalendar {
    totalContributions
  }
  totalCommitContributions
  totalPullRequestContributions
  restrictedContributionsCount
}