Die Kampagne "Abschaffung von Stallman", die mit der Veröffentlichung auf Medium begann, liefert uns viele interessante Daten. Da die Unterzeichnung offener Briefe zur Stornierung und Unterstützung von Stallman auf Github erfolgt, können wir einige Merkmale beider Parteien anhand von Statistiken analysieren, die über die API verfügbar sind.
Dies wird durch die Tatsache unterstützt, dass es auf Github schwierig ist, Daten "rückwirkend" zu bearbeiten, ohne neue Signaturen zu verlieren.
Die folgenden Annahmen können getestet werden ("X" kann entweder ein Vorschlag zur Stornierung von Stallman oder ein Ausdruck seiner Unterstützung sein):
Gegner von X sind häufiger mit großen Unternehmen verbunden als Unterstützer
X-Befürworter schreiben Code immer häufiger fest und sind daher für die Open-Source-Community nützlicher.
Gegner von X verpflichten sich mit deutlich geringerer Wahrscheinlichkeit zu einem Repository mit kostenlosen Lizenzen.
Gegner von X bevorzugen Rust (oder JS), Befürworter von C (oder C ++, Python)
Gegner von X sind sozial aktiver, sie haben soziale Konten. Netzwerke, Twitter, schreiben sie oft.
Gegner von X schreiben an Wochenenden keinen Code fest (arbeiten nur während der Geschäftszeiten, keine Enthusiasten)
Die meisten Gegner von X waren vor weniger als einem halben Jahr auf Github registriert
Wir haben versucht, einige dieser Annahmen zu testen und alle Interessierten einzuladen, den Rest der Annahmen zu testen und andere beizutragen (und zu testen).
Wir haben ein Repository erstellt, in dem die Arbeit stattfinden wird. Es enthält auch diesen Artikel, seine Kopie auf Habré wird aktualisiert, wenn Pull-Anfragen hinzugefügt werden. Mach mit bei der Recherche!
Weiter wird es Details geben.
Ein Hinweis zur wissenschaftlichen Ehrlichkeit
Alle Hypothesen und überprüfbaren Beweise werden akzeptiert und dem Artikel hinzugefügt. Wir halten es nicht für möglich, Daten zu verbergen, die unserer Position widersprechen. Alle Interpretationen werden ebenfalls hinzugefügt. Wir laden Unterstützer beider Positionen zur Zusammenarbeit ein (ja, das ist möglich). Collaboration-Repository .
Die Stallman-Stornierungskampagne läuft von einem Zentrum aus
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, .
Schauen wir uns nun die Aktionen der Benutzer an. Es werden viele Daten heruntergeladen und Sie können sie auf viele Arten analysieren. Sie können die Benutzeraktivität nach Wochentag überprüfen, um festzustellen, wie diese Daten mit Aktivitäten korrelieren, die für die Vor- und Nachteile von Stallman spezifisch sind.
Der 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>
Es ist zu erkennen, dass sich der Trend fortgesetzt hat: Die Aktivität der Gegner ist am Wochenende stark reduziert. Es ist davon auszugehen, dass sie Github bei der Arbeit verwenden und möglicherweise für ein Gehalt an Open-Source-Projekten arbeiten. Wenn diese Annahme richtig ist, kann ihre Meinung auf die Auswahl von Unternehmen zurückzuführen sein, die Programmierer einstellen, um an Open-Source-Projekten zu arbeiten.