Who's Who dalam Kampanye untuk Mengakhiri Stallman

Kampanye "untuk menghapuskan Stallman", yang dimulai dengan publikasi di Medium, memberi kami banyak data menarik. Karena penandatanganan surat terbuka untuk pembatalan dan dukungan untuk Stallman dilakukan di github, kami dapat menganalisis beberapa karakteristik dari kedua belah pihak menggunakan statistik yang tersedia melalui API.





Ini dibantu oleh fakta bahwa di github sulit untuk mengedit data "secara retroaktif" tanpa kehilangan tanda tangan baru.





Asumsi berikut dapat diuji ("X" dapat berupa proposal untuk membatalkan Stallman atau ekspresi dukungannya):





  • Lawan X lebih sering dikaitkan dengan perusahaan besar daripada pendukung





  • Pendukung X mengkomit kode lebih sering dan lebih banyak dan oleh karena itu lebih berguna bagi komunitas open source.





  • Penentang X secara signifikan lebih kecil kemungkinannya untuk berkomitmen pada repositori dengan lisensi gratis.





  • Lawan X lebih suka Rust (atau JS), pendukung C (atau C ++, Python)





  • Lawan X lebih aktif secara sosial, mereka memiliki akun sosial. jaringan, twitter, mereka sering menulis.





  • Lawan X tidak melakukan kode pada akhir pekan (hanya bekerja selama jam kerja, bukan penggemar)





  • Sebagian besar lawan X terdaftar di github kurang dari setengah tahun yang lalu





Kami telah mencoba menguji beberapa asumsi ini dan mengundang siapa pun yang tertarik untuk menguji asumsi lainnya dan berkontribusi (dan menguji) asumsi lainnya.





Kami telah membuat repositori tempat pekerjaan akan berlangsung. Ini juga berisi artikel ini, salinannya di Habré akan diperbarui saat permintaan tarik ditambahkan. Bergabunglah dengan penelitian!





Lebih lanjut akan ada detailnya.





Catatan tentang kejujuran ilmiah

Setiap hipotesis dan bukti yang dapat diuji akan diterima dan ditambahkan ke artikel. Kami tidak menganggap mungkin untuk menyembunyikan data yang bertentangan dengan posisi kami. Semua interpretasi akan ditambahkan juga. Kami mengundang pendukung kedua posisi untuk bekerja sama (ya, itu mungkin). Repositori kolaborasi .





Kampanye Pembatalan Stallman Berjalan Dari Satu Pusat

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, .





Sekarang mari kita lihat tindakan para pengguna. Ada banyak data yang diunduh dan Anda dapat menganalisisnya dengan berbagai cara. Anda dapat memeriksa aktivitas pengguna berdasarkan hari dalam seminggu untuk melihat bagaimana data ini berkorelasi dengan aktivitas khusus untuk pro dan kontra Stallman.





Kode
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> 
      
      



Dapat dilihat bahwa tren terus berlanjut: aktivitas lawan berkurang tajam pada akhir pekan. Dapat diasumsikan bahwa mereka menggunakan github di tempat kerja dan, mungkin, mengerjakan proyek open source dengan gaji. Jika asumsi ini benar, pendapat mereka mungkin disebabkan oleh pilihan yang dibuat oleh perusahaan yang mempekerjakan programmer untuk mengerjakan proyek open source.








All Articles