Wer ist wer in der Kampagne gegen Stallman?

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.








All Articles