ストールマンを終わらせるキャンペーンの誰が誰だ

メディアでの出版から始まった「ストールマンを廃止する」キャンペーンは、私たちに多くの興味深いデータを提供してくれます。キャンセルストールマンのサポートのための公開書簡への署名githubで行われるため、APIを通じて利用可能な統計を使用して、両方の当事者のいくつかの特性を分析できます。





これは、githubでは新しい署名を失うことなくデータを「遡及的に」編集することが難しいという事実によって助けられています。





以下の仮定をテストすることができます(「X」はストールマンをキャンセルする提案または彼の支持の表明のいずれかです):





  • Xの反対者は、支持者よりも大企業に関連していることが多い





  • Xの支持者は、コードをますます頻繁にコミットするため、オープンソースコミュニティにとってより有用です。





  • Xの反対者は、無料ライセンスでリポジトリにコミットする可能性が大幅に低くなります。





  • Xの反対者はRust(またはJS)を好み、C(またはC ++、Python)の支持者は





  • Xの対戦相手はより社会的に活発で、ソーシャルアカウントを持っています。ネットワーク、ツイッター、彼らはしばしば書く。





  • Xの反対者は、週末にコードをコミットしません(営業時間中にのみ機能し、愛好家ではありません)





  • Xの対戦相手のほとんどは半年以内にgithubに登録されました





私たちはこれらの仮定のいくつかをテストし、残りの仮定をテストし、他の仮定に貢献(およびテスト)することに興味のある人を招待しようとしました。





作業が行われるリポジトリを作成しましたこの記事も含まれています。プルリクエストが追加されると、Habréのコピーが更新されます。研究に参加してください!





さらに詳細があります。





科学的正直についてのメモ

仮説と検証可能な証拠はすべて受け入れられ、記事に追加されます。私たちは、私たちの立場と矛盾するデータを隠すことが可能であるとは考えていません。すべての解釈も追加されます。両方の立場の支持者が協力することを勧めます(はい、それは可能です)。コラボレーションリポジトリ





ストールマンキャンセルキャンペーンは1つのセンターから実行されます

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





それでは、ユーザーの行動を見てみましょう。ダウンロードされたデータはたくさんあり、さまざまな方法で分析できます。曜日ごとにユーザーのアクティビティをチェックして、このデータがストールマンの長所と短所に固有のアクティビティとどのように相関しているかを確認できます。





コード
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> 
      
      



この傾向は続いていることがわかります。週末には対戦相手の活動が急激に減少します。彼らは仕事でgithubを使用しており、おそらく給与のためにオープンソースプロジェクトに取り組んでいると考えられます。この仮定が正しければ、彼らの意見は、オープンソースプロジェクトに取り組むためにプログラマーを雇う企業によってなされた選択によるものかもしれません。








All Articles