Gabriele Lami
Co-founder @ Elif Lab : www.eliflab.com
Una mia attività ricorrente è la ricerca di progetti interessanti su GitHub: sono spesso piacevolmente sorpreso nel trovare progetti o progettini di notevole utilità (o affascinanti, ma magari inutili).
Molto spesso le scoperte di questi progetti sono legate al caso e, in parecchie occasioni, è virtualmente impossibile trovarne alcuni semplicemente navigando in modo lineare.
Riflettendo sulle tecniche che conosco e utilizzo nel mio lavoro in Elif Lab, mi è venuta voglia di tentare di dare una mano alla probabilità. Ho quindi creato un piccolo strumento che mi permette di pescare non completamente alla cieca nel mare dei repository.
L’idea è semplice (più o meno): se un progetto mi interessa, è probabile che interessi anche a un sottoinsieme di persone con gusti simili ai miei.In breve: ho provato a vedere quali network informali si creano intorno a un repository.
Github genera diversi tipi di network grazie ai diversi metodi di interazione fra utenti e le differenti azioni che si possono compiere rispetto ai repository (star, fork, watch ecc.).
Per questo esperimento ho deciso di utilizzare il fork, forse la più basilare azione che un utente di git può compiere.
L’azione di fork permette a un utente di github di creare una copia di un repository per iniziare uno sviluppo indipendente del codice.
I fork possono portare a un arricchimento del progetto iniziale, attraverso l’operazione di merge del codice, oppure possono portare a un fork anche all’interno della comunità attiva.
Perché quindi usare il fork? Perché questa azione segnala l’interesse rispetto ai contenuti di un progetto.
Esperimento
Da dove partire?
Ho deciso di utilizzare uno dei repository che meglio aiuta a orientarsi su altri progetti: Awesome Rust https://github.com/rust-unofficial/awesome-rust
I vari repository Awesome xyz sono liste strutturate di progetti: sono spesso ben fatte e sono ottimi punti di partenza per affrontare un tema.
Awesome Rust è dedicato al linguaggio di programmazione Rust. Un linguaggio interessante, legato a doppio filo al sistema operativo Redox.
Sono partito da tutti gli account che hanno fatto un fork del progetto awesome-rust e ho collezionato la lista dei progetti associati a ogni utente.
Banalizzando molto il processo: ho creato il network formato da user e progetti (quindi gli user sono legati dai progetti che condividono come fork), ho preso il sottonetwork dei nodi con il pagerank più alto e l’ho spezzato in comunità.
Insomma, ho utilizzato diverse tecniche occulte con una scelta arbitraria di alcuni parametri 🙂
Il risultato è un’interessante collezione di piccole reti bipartite che, come speravo, raccolgono diversi progetti che mi piacciono e che risultano divertenti da analizzare.
Qualche dettaglio su quelle per me più interessanti:
Community Rust
Come ci si poteva aspettare, si trova una grande comunità dedicata a Rust con i progetti principali che gravitano attorno a questo linguaggio di programmazione: https://github.com/rust-lang/rust
Alcuni progetti in questa community sono:
https://github.com/rust-lang/cargo il package manager di Rust;
http://rust-lang.github.io/rfcs/ RFCs for changes to Rust.
Da notare anche un clone del gioco 1024 https://github.com/gabrielecirulli/2048 e una parser combinators library scritta in Rust https://github.com/Geal/nom
Community Deep-Learning
Questa comunità è spiccatamente orientata a deep-learning, data science e machine-learning.
Si nota come ci siano importanti progetti in linguaggi diversi da rust come Caffe, tensorflow e neuraltalk.
Repository interessanti sono:
https://github.com/bulutyazilim/awesome-datascience
L’ottimo libro che mostra qualche applicazione interessante dei modelli Bayesiani: https://github.com/CamDavidsonPilon/Probabilistic-Programming-and-Bayesian-Methods-for-Hackers
Awesome Artificial intelligence: https://github.com/owainlewis/awesome-artificial-intelligence
E l’utilissimo https://github.com/BurntSushi/xsv che permette di gestire file csv veramente grandi da linea di comando.
Community Shadowsocks-Rust
Community più legata a Rust dove risulta centrale il port in Rust di Shadowsocks https://github.com/shadowsocks/shadowsocks-rust
Si può trovare il curioso progetto https://github.com/nvbn/thefuck che permette di correggere gli errori da console e un progetto cinese che necessita di una traduzione in inglese (questo è quello che viene richiesto in inglese nel README: https://github.com/rustcc/RustPrimer
Community Awesome
Questa community ha una grossa collezione di progetti awesome tra cui il progetto https://github.com/sindresorhus/awesome perno del movimento.
Da notare i repository:
https://github.com/alex/what-happens-when “This repository is an attempt to answer the age old interview question “What happens when you type google.com into your browser’s address box and press enter?””
https://github.com/avelino/awesome-go Awesome list del linguaggio Go, per certi versi affine a Rust;
http://github.com/souravchk/cheatsheets-ai “Essential Cheat Sheets for deep learning and machine learning researchers”;
https://github.com/Miserlou/Zappa “Serverless Python Web Services”
e https://github.com/sympy/sympy A computer algebra system written in pure Python.
Altri repositories
Alcuni progetti notevoli presenti nelle altre communities:
https://github.com/getify/You-Dont-Know-JS;
https://github.com/EbookFoundation/free-programming-books;
https://github.com/BurntSushi/ripgrep “a line-oriented search tool that recursively searches your current directory for a regex pattern while respecting your gitignore rules”;
https://github.com/papers-we-love/papers-we-love
Metodologia
Sono partito dal repository: https://github.com/rust-unofficial/awesome-rust
Tramite l’API di Github ho raccolto la lista degli account che hanno effettuato un fork al repository. Per ogni account ho raccolto la lista di tutti i repository degli account.
Ho generato quindi il network dei repository.
Nel network i nodi rappresentano i repository e gli archi pesati il numero di account che seguono una coppia di nodi.
Ho calcolato il Pagerank per trovare in nodi più importanti (con un raggio maggiore nell’immagine) e ho estratto il sottonetwork dei nodi più centrali.
Ho utilizzato infine l’algoritmo di Louvain con modello probabilistico standard per fare emergere le comunità.
Sei interessato a questa o altre tecniche di analisi dati?
Vorresti una mano sul tuo progetto? Contattaci info@eliflab.com