La campagne «pour abolir Stallman», qui a débuté avec la publication sur Medium, nous fournit de nombreuses données intéressantes. Étant donné que la signature des lettres ouvertes pour l'annulation et le support de Stallman se fait sur github, nous pouvons analyser certaines caractéristiques des deux parties à l'aide de statistiques disponibles via l'API.
Ceci est facilité par le fait que sur github, il est difficile d'éditer les données "rétroactivement" sans perdre de nouvelles signatures.
Les hypothèses suivantes peuvent être testées ("X" peut être soit une proposition d'annulation de Stallman, soit une expression de son soutien):
Les opposants à X sont plus souvent associés aux grandes entreprises qu'aux supporters
Les promoteurs de X commettent du code plus souvent et plus et sont donc plus utiles à la communauté open source.
Les adversaires de X sont beaucoup moins susceptibles de s'engager dans un référentiel avec des licences gratuites.
Les adversaires de X préfèrent Rust (ou JS), les partisans du C (ou C ++, Python)
Les adversaires de X sont plus actifs socialement, ils ont des comptes sociaux. réseaux, Twitter, ils écrivent souvent.
Les adversaires de X ne commettent pas de code le week-end (ne travaillent que pendant les heures de bureau, pas les passionnés)
La plupart des adversaires de X étaient enregistrés sur github il y a moins de six mois
Nous avons essayé de tester certaines de ces hypothèses et invitons toute personne intéressée à tester le reste des hypothèses et à contribuer (et tester) toutes les autres.
Nous avons créé un référentiel dans lequel le travail aura lieu. Il contient également cet article, sa copie sur Habré sera mise à jour au fur et à mesure de l'ajout de pull requests. Rejoignez la recherche!
De plus, il y aura des détails.
Une note sur l'honnêteté scientifique
Toutes les hypothèses et toutes les preuves vérifiables seront acceptées et ajoutées à l'article. Nous ne considérons pas possible de cacher des données qui contredisent notre position. Toutes les interprétations seront également ajoutées. Nous invitons les partisans des deux positions à travailler ensemble (oui, c'est possible). Référentiel de collaboration .
La campagne d'annulation de Stallman s'exécute à partir d'un seul centre
23 Mar 2021 10:42:36 AM PDT, - 23 Mar 2021 01:23:39 PM PDT. , . , , ( ) .
$ cat get-stars.sh
#!/bin/bash
set -ue
page=1
owner_repo=$1
while true; do
curl -s -H "Authorization: token $GITHUB_OAUTH_" \\
-H "Accept: application/vnd.github.v3.star+json" \\
"<https://api.github.com/repos/$owner_repo/stargazers?per_page=100&page=$page>"| \\
jq -r .[].starred_at_ | grep . || break
((page++)) || true
done
$ echo "epoch,con" >con.stars.csv
$ ./get-stars.sh 'rms-open-letter/rms-open-letter.github.io'|while read a; do date -d $a +%s; done|sort -n|cat -n|awk '{print $2","$1}' >>con.stars.csv
$ echo "epoch,pro" >pro.stars.csv
$ ./get-stars.sh 'rms-support-letter/rms-support-letter.github.io'|while read a; do date -d $a +%s; done|sort -n|cat -n|awk '{print $2","$1}' >>pro.stars.csv
$ join -t, -e '' -o auto -a1 -a2 con.stars.csv pro.stars.csv >joined.stars.csv
, . , , / .
, -, . , - .
1345 5000+ . :
$ cat get-commits.py
#!/usr/bin/env python
import os
import requests
import json
import sys
repo = sys.argv[1]
headers = {'Authorization': 'token {}'.format(os.environ["GITHUB_OAUTH"])}
commits = []
page = 0
while page < 300:
page += 1
data = requests.get('https://api.github.com/repos/{}/commits?per_page=100&page={}'.format(repo, page), headers=headers).json()
if len(data) == 0:
break
commits += data
print(json.dumps(commits, indent=4))
$ ./get-commits.py 'rms-open-letter/rms-open-letter.github.io' >con.commits.json
$ ./get-commits.py 'rms-support-letter/rms-support-letter.github.io' >pro.commits.json
:
$ jq -r .[].commit.author.date pro.commits.json|sort -u|cat -n|awk '{print $2","$1}'|sed -e 's/T/ *' -e 's/Z/*' >pro.commits.csv
$ jq -r .[].commit.author.date con.commits.json|sort -u|cat -n|awk '{print $2","$1}'|sed -e 's/T/ *' -e 's/Z/*' >con.commits.csv
$ join -t, -e '' -o auto -a1 -a2 con.commits.csv pro.commits.csv >joined.commits.csv
, . . .
.
$ jq -r .[].commit.author.date con.commits.json |./weekday-from-date.py >con.rms_commits.csv
$ jq -r .[].commit.author.date pro.commits.json |./weekday-from-date.py >pro.rms_commits.csv
$ join -t, con.rms_commits.csv pro.rms_commits.csv >joined.rms_commits.csv
A , . , no meeting day.
.
, 100 :
$ jq -r .[].author.login con.commits.json|sort -u >con.logins
$ jq -r .[].author.login pro.commits.json|sort -u >pro.logins
$ cat get-user-events-data.sh
#!/bin/bash
set -ue
script_dir=$(dirname $(realpath $0))
get_data() {
local data_dir=$script_dir/$1 userdata events
for x in $(cat $1.logins); do
userdata=$data_dir/$x.userdata
[ -r $userdata ] && continue
curl -s -H "Authorization: token $GITHUB_OAUTH" "<https://api.github.com/users/$x>" >$userdata
sleep 1
events=$data_dir/$x.events
[ -r $events ] && continue
curl -s -H "Authorization: token $GITHUB_OAUTH" "<https://api.github.com/users/$x/events?per_page=100>" >$events
sleep 1
done
}
get_data $1
$ ./get-user-events-data.sh con
$ ./get-user-events-data.sh pro
, :
{
"login": "zyxw59",
"id": 3157093,
"node_id": "MDQ6VXNlcjMxNTcwOTM=",
"avatar_url": "https://avatars.githubusercontent.com/u/3157093?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/zyxw59",
"html_url": "https://github.com/zyxw59",
"followers_url": "https://api.github.com/users/zyxw59/followers",
"following_url": "https://api.github.com/users/zyxw59/following{/other_user}",
"gists_url": "https://api.github.com/users/zyxw59/gists{/gist_id}",
"starred_url": "https://api.github.com/users/zyxw59/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/zyxw59/subscriptions",
"organizations_url": "https://api.github.com/users/zyxw59/orgs",
"repos_url": "https://api.github.com/users/zyxw59/repos",
"events_url": "https://api.github.com/users/zyxw59/events{/privacy}",
"received_events_url": "https://api.github.com/users/zyxw59/received_events",
"type": "User",
"site_admin": false,
"name": "Emily Crandall Fleischman",
"company": "Commure",
"blog": "",
"location": null,
"email": "emilycf@mit.edu",
"hireable": null,
"bio": null,
"twitter_username": null,
"public_repos": 24,
"public_gists": 0,
"followers": 2,
"following": 12,
"created_at": "2012-12-31T05:33:30Z",
"updated_at": "2021-03-14T01:53:51Z"
}
, twitter_username, company, bio blog:
|
|
|
|
twitter_username |
31% |
8% |
company |
48% |
20% |
bio |
53% |
31% |
blog |
63% |
31% |
. ( , , .
public_repos, public_gists, followers following:
|
|
|
|
||
|
|
|
|
|
|
public_repos |
62 |
34 |
21 |
9 |
public_gists |
18 |
4 |
4 |
0 |
followers |
105 |
23 |
16 |
2 |
following |
30 |
8 |
14 |
1 |
. followers, , . followers / following 3, 1.1.
events_url, .
Jetons maintenant un œil aux actions des utilisateurs. Il y a beaucoup de données téléchargées et vous pouvez les analyser de plusieurs manières. Vous pouvez vérifier l'activité des utilisateurs par jour de la semaine pour voir comment ces données sont en corrélation avec l'activité spécifique aux avantages et aux inconvénients de Stallman.
Le code
cat weekday-from-date.py
#!/usr/bin/env python
import datetime
import sys
out = [0] \* 7
total = 0
for line in sys.stdin.readlines():
weekday = datetime.datetime.strptime(line.strip(), '%Y-%m-%dT%H:%M:%SZ').weekday()
out[weekday] += 1
total += 1
for day, count in enumerate(out):
print("{},{}".format(day, count / total))
$ jq -r .[].created<sub>at</sub> con/\*.events|./weekday-from-date.py >con.event<sub>day.normalized.csv</sub>
$ jq -r .[].created<sub>at</sub> pro/\*.events|./weekday-from-date.py >pro.event<sub>day.normalized.csv</sub>
$ join -t, con.event<sub>day.normalized.csv</sub> pro.event<sub>day.normalized.csv</sub>
On constate que la tendance s'est poursuivie: l'activité des adversaires est fortement réduite le week-end. On peut supposer qu'ils utilisent github au travail et, éventuellement, travaillent sur des projets open source pour un salaire. Si cette hypothèse est correcte, leur opinion peut être due à la sélection faite par les entreprises qui embauchent des programmeurs pour travailler sur des projets open source.