ΠΠ°ΠΌΠΏΠ°Π½ΠΈΡ "Π·Π° ΠΎΡΠΌΠ΅Π½Ρ Π‘ΡΠΎΠ»Π»ΠΌΠ°Π½Π°", Π½Π°ΡΠ°Π²ΡΠ°ΡΡΡ Ρ ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΠΈ Π² Medium (https://selamjie.medium.com/remove-richard-stallman-fec6ec210794) ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ Π½Π°ΠΌ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΡΡ Π΄Π°Π½Π½ΡΡ . Π’Π°ΠΊ ΠΊΠ°ΠΊ ΠΏΠΎΠ΄ΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΠΎΡΠΊΡΡΡΡΡ ΠΏΠΈΡΠ΅ΠΌ Π·Π° ΠΎΡΠΌΠ΅Π½Ρ (https://rms-support-letter.github.io/) ΠΈ Π² ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΡ Π‘ΡΠΎΠ»Π»ΠΌΠ°Π½Π° (https://rms-support-letter.github.io/) ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΠ΅ΡΡΡ Π½Π° Π³ΠΈΡΡ Π°Π±Π΅, ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ Ρ Π°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΠΈ ΠΎΠ±Π΅ΠΈΡ ΡΡΠΎΡΠΎΠ½, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΡΠ°ΡΠΈΡΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ Π΄Π°Π½Π½ΡΠ΅, ΠΊΠΎΡΠΎΡΡΠ΅ Π΄ΠΎΡΡΡΠΏΠ½Ρ ΡΠ΅ΡΠ΅Π· API.
ΠΡΠΎΠΌΡ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ ΡΠΎ, ΡΡΠΎ Π½Π° Π³ΠΈΡΡ Π°Π±Π΅ Π·Π°ΡΡΡΠ΄Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°ΡΡ Π΄Π°Π½Π½ΡΠ΅ "Π·Π°Π΄Π½ΠΈΠΌ ΡΠΈΡΠ»ΠΎΠΌ" Π±Π΅Π· ΠΏΠΎΡΠ΅ΡΠΈ Π½ΠΎΠ²ΡΡ ΠΏΠΎΠ΄ΠΏΠΈΡΠ΅ΠΉ.
Π‘Π»Π΅Π΄ΡΡΡΠΈΠ΅ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ ("X" ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΊΠ°ΠΊ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ ΠΎΡΠΌΠ΅Π½ΠΈΡΡ Π‘ΡΠΎΠ»Π»ΠΌΠ°Π½Π°, ΡΠ°ΠΊ ΠΈ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ Π΅Π³ΠΎ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΈ):
- ΠΡΠΎΡΠΈΠ²Π½ΠΈΠΊΠΈ X ΡΠ°ΡΠ΅ Π°ΡΡΠΎΡΠΈΠΈΡΠΎΠ²Π°Π½Ρ Ρ ΠΊΡΡΠΏΠ½ΡΠΌΠΈ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΡΠΌΠΈ ΡΠ΅ΠΌ ΡΡΠΎΡΠΎΠ½Π½ΠΈΠΊΠΈ
- Π‘ΡΠΎΡΠΎΠ½Π½ΠΈΠΊΠΈ X ΡΠ°ΡΠ΅ ΠΈ Π±ΠΎΠ»ΡΡΠ΅ ΠΊΠΎΠΌΠΌΠΈΡΡΡ ΠΊΠΎΠ΄ ΠΈ ΡΡΠΈΠΌ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ»Π΅Π·Π½Ρ ΡΠΎΠΎΠ±ΡΠ΅ΡΡΠ²Ρ Π‘ΠΠ.
- ΠΡΠΎΡΠΈΠ²Π½ΠΈΠΊΠΈ X Π·Π½Π°ΡΠΈΠΌΠΎ ΡΠ΅ΠΆΠ΅ ΠΊΠΎΠΌΠΌΠΈΡΡΡ Π² ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΈ ΡΠΎ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΡΠΌΠΈ Π»ΠΈΡΠ΅Π½Π·ΠΈΡΠΌΠΈ.
- ΠΡΠΎΡΠΈΠ²Π½ΠΈΠΊΠΈ X ΠΏΡΠ΅Π΄ΠΏΠΎΡΠΈΡΠ°ΡΡ Rust (ΠΈΠ»ΠΈ JS), ΡΡΠΎΡΠΎΠ½Π½ΠΈΠΊΠΈ ΠΏΡΠ΅Π΄ΠΏΠΎΡΠΈΡΠ°ΡΡ C (ΠΈΠ»ΠΈ C++, Python)
- ΠΡΠΎΡΠΈΠ²Π½ΠΈΠΊΠΈ X Π² Π±ΠΎΠ»ΡΡΠ΅ΠΉ ΡΡΠ΅ΠΏΠ΅Π½ΠΈ ΡΠΎΡΠΈΠ°Π»ΡΠ½ΠΎ Π°ΠΊΡΠΈΠ²Π½Ρ, Ρ Π½ΠΈΡ Π΅ΡΡΡ Π°ΠΊΠΊΠ°ΡΠ½ΡΡ Π² ΡΠΎΡ. ΡΠ΅ΡΡΡ , ΡΠ²ΠΈΡΡΠ΅ΡΠ΅, ΠΎΠ½ΠΈ ΡΠ°ΡΡΠΎ ΠΏΠΈΡΡΡ.
- ΠΡΠΎΡΠΈΠ²Π½ΠΈΠΊΠΈ X Π½Π΅ ΠΊΠΎΠΌΠΌΠΈΡΡΡ ΠΊΠΎΠ΄ ΠΏΠΎ Π²ΡΡ ΠΎΠ΄Π½ΡΠΌ (ΡΠ°Π±ΠΎΡΠ°ΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π² ΡΠ°Π±ΠΎΡΠ΅Π΅ Π²ΡΠ΅ΠΌΡ, Π½Π΅ ΡΠ½ΡΡΠ·ΠΈΠ°ΡΡΡ)
- ΠΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²ΠΎ ΠΏΡΠΎΡΠΈΠ²Π½ΠΈΠΊΠΎΠ² X Π·Π°ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠΎΠ²Π°Π½Ρ Π½Π° Π³ΠΈΡΡ Π°Π±Π΅ ΠΌΠ΅Π½Π΅Π΅ ΠΏΠΎΠ»ΡΠ³ΠΎΠ΄Π° Π½Π°Π·Π°Π΄
ΠΡ ΠΏΠΎΠΏΡΡΠ°Π»ΠΈΡΡ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈΠ· ΡΡΠΈΡ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΈ ΠΏΡΠΈΠ³Π»Π°ΡΠ°Π΅ΠΌ Π²ΡΠ΅Ρ , ΠΊΡΠΎ Π·Π°ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠΎΠ²Π°Π»ΡΡ, ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ ΠΎΡΡΠ°Π»ΡΠ½ΡΠ΅ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΈ Π²Π½ΠΎΡΠΈΡΡ (ΠΈ ΠΏΡΠΎΠ²Π΅ΡΡΡΡ) Π»ΡΠ±ΡΠ΅ Π΄ΡΡΠ³ΠΈΠ΅.
ΠΡ ΡΠΎΠ·Π΄Π°Π»ΠΈ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ (https://github.com/imitron/rms-analytics/), Π² ΠΊΠΎΡΠΎΡΠΎΠΌ Π±ΡΠ΄Π΅Ρ ΠΏΡΠΎΡ ΠΎΠ΄ΠΈΡΡ ΡΠ°Π±ΠΎΡΠ°. Π Π½Π΅ΠΌ ΠΆΠ΅ Π»Π΅ΠΆΠΈΡ ΡΡΠ° ΡΡΠ°ΡΡΡ, Π΅Π΅ ΠΊΠΎΠΏΠΈΡ Π½Π° Ρ Π°Π±ΡΠ΅ Π±ΡΠ΄Π΅Ρ Π°ΠΊΡΡΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡΡΡ ΠΏΠΎ ΠΌΠ΅ΡΠ΅ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΡ ΠΏΡΠ»Π»-ΡΠ΅ΠΊΠ²Π΅ΡΡΠΎΠ². ΠΡΠΈΡΠΎΠ΅Π΄ΠΈΠ½ΡΠΉΡΠ΅ΡΡ ΠΊ ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΡ!
ΠΠ°Π»Π΅Π΅ Π±ΡΠ΄ΡΡ Π΄Π΅ΡΠ°Π»ΠΈ.
ΠΡΠ±ΡΠ΅ Π³ΠΈΠΏΠΎΡΠ΅Π·Ρ ΠΈ Π»ΡΠ±ΡΠ΅ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΠΌΡΠ΅ ΠΏΠΎΠ΄ΡΠ²Π΅ΡΠΆΠ΄Π΅Π½ΠΈΡ Π±ΡΠ΄ΡΡ ΠΏΡΠΈΠ½ΡΡΡ ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ Π² ΡΡΠ°ΡΡΡ. ΠΡ Π½Π΅ ΡΡΠΈΡΠ°Π΅ΠΌ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΠΌ ΡΠΊΡΡΠ²Π°ΡΡ Π΄Π°Π½Π½ΡΠ΅, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΡΠΎΡΠΈΠ²ΠΎΡΠ΅ΡΠ°Ρ Π½Π°ΡΠ΅ΠΉ ΠΏΠΎΠ·ΠΈΡΠΈΠΈ. ΠΡΠ΅ ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠ°ΡΠΈΠΈ Π±ΡΠ΄ΡΡ ΡΠ°ΠΊΠΆΠ΅ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ. ΠΡ ΠΏΡΠΈΠ³Π»Π°ΡΠ°Π΅ΠΌ ΠΊ ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎΠΉ ΡΠ°Π±ΠΎΡΠ΅ ΡΡΠΎΡΠΎΠ½Π½ΠΈΠΊΠΎΠ² ΠΎΠ±ΠΎΠΈΡ ΠΏΠΎΠ·ΠΈΡΠΈΠΉ (Π΄Π°, ΡΡΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ)
API ΠΈ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ github: https://docs.github.com/en/rest
ΠΠ°ΠΌΠΏΠ°Π½ΠΈΡ Π·Π° ΠΎΡΠΌΠ΅Π½Ρ Π‘ΡΠΎΠ»Π»ΠΌΠ°Π½Π° ΡΠΏΡΠ°Π²Π»ΡΠ΅ΡΡΡ ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠ΅Π½ΡΡΠ°
Π Π΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ ΠΏΡΠΎΡΠΈΠ²Π½ΠΈΠΊΠΎΠ² Π‘ΡΠΎΠ»Π»ΠΌΠ°Π½Π° Π±ΡΠ» ΡΠΎΠ·Π΄Π°Π½ Tue 23 Mar 2021 10:42:36 AM PDT, ΡΡΠΎΡΠΎΠ½Π½ΠΈΠΊΠΎΠ² - Tue 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:
ΠΏΠΎΠ»Π΅ | ΠΏΡΠΎΡΠΈΠ²Π½ΠΈΠΊ | ΠΏΡΠΎΡΠΈΠ²Π½ΠΈΠΊ | ΡΡΠΎΡΠΎΠ½Π½ΠΈΠΊ | ΠΏΡΠΎΡΠΈΠ²Π½ΠΈΠΊ |
average | median | average | median | |
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>
ΠΠΈΠ΄Π½ΠΎ, ΡΡΠΎ ΡΡΠ΅Π½Π΄ ΡΠΎΡ ΡΠ°Π½ΠΈΠ»ΡΡ: Π°ΠΊΡΠΈΠ²Π½ΠΎΡΡΡ ΠΏΡΠΎΡΠΈΠ²Π½ΠΈΠΊΠΎΠ² ΡΠ΅Π·ΠΊΠΎ ΡΠ½ΠΈΠΆΠ°Π΅ΡΡΡ Π½Π° Π²ΡΡ ΠΎΠ΄Π½ΡΡ . ΠΠΎΠΆΠ½ΠΎ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°ΡΡ, ΡΡΠΎ ΠΎΠ½ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ Π³ΠΈΡΡ Π°Π± Π½Π° ΡΠ°Π±ΠΎΡΠ΅ ΠΈ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΡΠ°Π±ΠΎΡΠ°ΡΡ Π½Π°Π΄ open source ΠΏΡΠΎΠ΅ΠΊΡΠ°ΠΌΠΈ Π·Π° Π·Π°ΡΠΏΠ»Π°ΡΡ. ΠΡΠ»ΠΈ ΡΡΠΎ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π²Π΅ΡΠ½ΠΎ, ΠΈΡ ΠΌΠ½Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΎΠ±ΡΡΠ»ΠΎΠ²Π»Π΅Π½ΠΎ ΠΎΡΠ±ΠΎΡΠΎΠΌ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΡΠΎΠ²ΠΎΠ΄ΡΡ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ, Π½Π°Π½ΠΈΠΌΠ°ΡΡΠΈΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡΠΎΠ² Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Π½Π°Π΄ open source ΠΏΡΠΎΠ΅ΠΊΡΠ°ΠΌΠΈ.