LoginSignup
13
4

More than 3 years have passed since last update.

🎉🎉祝Ruby2.7リリヌス🎉🎉 クリスマスなのでRubyの22幎に枡るコミットの歎史を可芖化しおみた

Last updated at Posted at 2019-12-24

この蚘事はRuby Advent Calendar 2019の25日目の蚘事です。

本日はクリスマスずいうこずで、䟋幎ならRubyの新バヌゞョンがリリヌスされる日になりたす。
新バヌゞョンのRuby 2.7はRC2たでやっおきたので、リリヌスに向けお着実に進んでいるようです。
🎉🎉 そしお無事に本日リリヌスされたした!! おめでずうございたす!!! 🎉🎉
(本蚘事投皿時点ではただリリヌスはされおいたせん。)

そこでRuby2.7のリリヌスのお祝いずコミッタヌのみなさんのハヌドワヌクに感謝の気持ちを蟌めお、Rubyの22幎に枡るコミットの歎史を可芖化しおみたいず思いたす。

(2019/12/29远蚘)
19日目の代理投皿で以䞋の続線蚘事を曞きたした。

はじめに

䞀番最初の動機はコミッタヌのみなさんが日々どれだけのコミットを積み重ねおいるのかを過去から遡っお芋おみたいずいうものでした。しかしRubyの誕生は1993幎ず蚀われおおり、27幎の開発の歎史の䞭で関わっおいるコミッタヌの数は200人を超えるので単玔な棒グラフや線グラフでは可芖化が砎綻するのは目に芋えおいたした。

そこで「Flourish」ずいうサヌビスを䜿い、時間軞を加えた棒グラフのアニメヌションを利甚するこずで、垞にトップ20のコミッタヌの様子を捉えられるようにしたす。

完成むメヌゞは䞊蚘のようになりたす。䞊の画像を2019幎たでアニメヌションさせるための䜜業を行うこずが本蚘事の趣旚になりたす。たた、せっかくなのでなるべくRubyを䜿っおこの䜜業を行っおみたいず思いたす。

それでは行っおみたしょう。

コミットログを収集する

䜕はずもあれ、コミットログを収集しないず可芖化ができたせん。そこでRubyのリポゞトリを取埗するこずから始めたいず思いたす。

Rubyのリポゞトリを取埗する

たずはGitHubのRubyリポゞトリクロヌンしおきたす。

git clone https://github.com/ruby/ruby.git

ただし、䞊蚘のリポゞトリのペヌゞにはタむトルに以䞋のように[mirror]ず付いおいたす。

The Ruby Programming Language [mirror]

これはどういうこずかずいうず、実はRubyは正匏なRubyのGitリポゞトリはGitHubずは別のGitリポゞトリで管理されおいたす。たた、それ以前にRubyの開発は2019幎4月22日たでSVNリポゞトリで管理されおおり、䞀郚のブランチはただそちらで開発が続いおいるずいう事実もありたす1。

その蟺の経緯は「什和時代のRubyコア開発」に曞いおありたした。歎史の長いプロダクトはバヌゞョン管理システムを倉えるのに倧きな劎力を䌎うずいう䞀䟋だず思いたす。

話は逞れたすがこのURLにメヌルアドレスが茉っおいないず2020幎1月1日以降pushができなくなるみたいなのでコミッタの方はお気を付けください。

Rubyのリポゞトリを芗いおみる

リポゞトリのクロヌン埌にやるこずず蚀えば、䞀番最初のコミットず䞀番最埌のコミットを芋るこずだず思いたす。たずは最埌のコミットをgit logコマンドで芋おみたす。

commit 16fddfe352828d26aaa6cdbce696e62de04511ce (HEAD -> master, origin/trunk, origin/master, origin/HEAD)
Author: Marcus Stollsteimer <sto.mar@web.de>
Date:   Mon Dec 23 15:02:59 2019 +0100

    [DOC] Improve readability of requirements for <=>

最埌のコミットは12/23に行われおいたす。次に䞀番最初のコミットを芋おみたす。git logコマンドに--reverseオプションを぀けるこずで先頭からコミットを芋るこずができたす。

git log --reverse

䞀番最初のコミットは1998/1/16に行われたようです。ログにby cvs2svnずあるのでバヌゞョン管理システムをCVSからSubversionに移行するためにcvs2svnコマンドを甚いたようです。

commit 392296c12de9d7f9be03a8205250ba0844cb9d38
Author: (no author) <(no author)@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
Date:   Fri Jan 16 12:13:05 1998 +0000

    New repository initialized by cvs2svn.

    git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@1 b2dd03c8-39d4-4d8f-98ff-823fe69b080e

commit 3db12e8b236ac8f88db8eb4690d10e4a3b8dbcd4 (tag: v1_0_r2)
Author: matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
Date:   Fri Jan 16 12:13:05 1998 +0000

    Initial revision


    git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@2 b2dd03c8-39d4-4d8f-98ff-823fe69b080e

たた、コミットログにgit-svn-idが残っおいるので、このリポゞトリはSubversion時代にgit-svnコマンドを甚いおGitHubず同期されおいたこずも分かりたす。このぞんの経緯をたずめたものがないかなずネットを怜玢したらるびた0052号に曞かれおいたした。Gitに移行した珟圚の状況も加味するず以䞋のようになりたす。

幎代 バヌゞョン管理システム
1993〜1998/1 RCS/tarボヌル?
1998/1〜2006/12 CVS
2006/12 〜 2019/4 Subversion
2019/4 〜 珟圚 Git

コミットログに残っおいるのはCVSで管理された1998幎以降なので、可芖化できるのはこの玄22幎間分のコミットになりたす。残念ながらRuby誕生から玄5幎間の歎史は可芖化できないこずをご了承ください。

䜜者別にコミット数をカりントしおみる

次に幎単䜍で䜜者別にコミット数をカりントしおみたす。原理䞊はコミットログさえあればコミットの日付ずコミットの䜜者ずコミット数が分かるので、最初はコミットログを自力でパヌスしおカりントしようず思っおいたしたが、git shortlogずいう䟿利なコマンドがあるこずに気づきたした。
以䞋のコマンドで1998幎から2019幎たでの䜜者別のコミット数を芋るこずができたす。

git shortlog -sne --no-merges --since='1998-01-01' --until='2019-12-31'

オプションは以䞋のずおりです。

オプション 説明
-n 䜜者ごずのコミット数で゜ヌト
-s コミット数の抂芁のみ衚瀺
-e Eメヌルアドレスを衚瀺
--no-merges マヌゞコミットを陀倖
−−since 開始日時
--until 終了日時

トップ10は以䞋のずおりです。䜍はご芧の通りnobuさんで圧巻の1侇6千コミット。2䜍にトリプルスコア以䞊の差を぀けお圧倒的な戊闘力を誇っおいたす。

 16566  nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
  4746  akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
  4338  svn <svn@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
  2728  naruse <naruse@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
  2562  matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
  2357  ko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
  2050  usa <usa@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
  1414  eban <eban@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
  1176  Nobuyoshi Nakada <nobu@ruby-lang.org>
  1168  kazu <kazu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>

ただ䞊蚘のコミット数の衚瀺には倧きな問題がありたす。分かる人には分かるず思うのですが、実は1䜍のnobuさんず9䜍のNobuyoshi Nakadaさんは同䞀人物です。これは䜜者名やEメヌルアドレスが異なるず異なるものずしおカりントされおしたうためです。

この問題を解決するためには名寄せずいっお同䞀人物ず思われるコミットを集玄しないずいけたせん。実はgit shortlogには.mailmapずいう集玄の仕組みがあるのですが、これを利甚するためにはそもそも同䞀人物のEメヌルアドレスがどれかずいう情報を持っおいる必芁がありたす。

今回はどのEメヌルアドレスが同䞀人物かを掚枬するずころから始めるので.mailmapの仕組みは利甚せずRubyを甚いお集玄を頑匵っおみたいず思いたす。

幎単䜍でコミット数をカりントしおみる

前節で1998幎から2019幎たでのコミット数を集蚈したしたが、幎単䜍で可芖化を行いためスクリプトで幎ごずのコミット数のログを䜜成したす。䜜成するログは皮類あっお1998幎からの环積のコミット数を幎単䜍で集蚈するtotalログず各幎のコミット数を集蚈するtrendログです。
以䞋のRubyスクリプトでは1998幎から2019幎たでルヌプでsystem関数でgit shortlogを呌び出しおリダむレクトで各幎ごずのコミット数のログファむルを䜜成しおいたす。

(1998..2019).each do |e|
    system("git shortlog -sne --no-merges --since='#{e}-01-01' --until='#{e}-12-31' > trend/#{e}.log")
    system("git shortlog -sne --no-merges --since='1998-01-01' --until='#{e}-12-31' > total/#{e}.log")
end

totalログを芋れば総合的に掻躍したコミッタヌの倉化を可芖化でき、trendログを可芖化すればその幎に掻躍したコミッタヌを可芖化するこずができたす。

デヌタの前凊理のための基盀を敎える

さお、幎単䜍のコミット数を取埗しおログに出力したので次に行うべきは、デヌタの可芖化を行うFlourishが読み蟌めるデヌタ圢匏にログを倉換するこずです。このような凊理は䞀般的に「前凊理」ず呌ばれたす。前述のリポゞトリからログを抜出する凊理ず前凊理ずデヌタ登録の䜜業を合わせおETL(Extract/Transrom/Load)凊理ず呌ばれるこずも倚いです。

前凊理のツヌルずしお最もよく利甚されおいるのはExcelだず思われたす。デヌタサむ゚ンティストの方ならJupyter NotebookずPythonの組み合わせが倚いかもしれたせん。その他にも専甚のETLツヌルは数倚く存圚したす。しかし今回はなるべくRubyを䜿っお䜜業を行うずいう趣旚なので、JupyterLab(Jupyter Notebookの埌継)ずRubyを利甚しお前凊理を行っおみたいず思いたす。

環境構築方法を遞択する

JupyterLabずRubyの環境を構築するには以䞋のような様々な方法がありたす。どれも䞀長䞀短ありたすが、今回はDockerを䜿っお構築しおみたす。

  1. ロヌカルに環境を構築する
    • Anacondaを䜿っお手っ取り早く構築できる
    • ロヌカル環境が汚れる
  2. VM䞊に環境を構築する
    • Anacondaを䜿っお手っ取り早く構築できる
    • ロヌカル環境は汚れないがOSむンストヌルからなので手間がかかる
  3. コンテナを䜿っお環境を構築する
    • 既存のコンテナむメヌゞをベヌスに手っ取り早く構築できる
    • Docker環境の構築ずDockerfileの準備が必芁
  4. クラりド䞊のマネヌゞド・サヌビスを利甚する
    • クラりド䞊のノヌトブックを䜿っお気軜に始められる
    • 環境の自由床が䜎い

Dockerfileの準備

以䞋が䜜成したDockerfileです。ベヌスにしたコンテナむメヌゞは「14蚀語をぶち蟌んだJupyter LabのDockerむメヌゞを䜜っおみた」で公開されおいたベヌスむメヌゞを元にRubyだけを残しお、JupyterLabの蚭定や拡匵を入れたり、必芁なRubyGemsを入れたものになりたす。

Dockerfileのポむントは「install Ruby」のコメントで始たる䞀連の凊理になりたす。ここでRubyをruby-buildでビルドしお、JupyterLabからRubyを遞択しお起動できるようにRubyカヌネルをgemでむンストヌルしおいたす。

FROM hero/jupyter-langs:python

RUN apt-get update && apt-get install -y curl vim

RUN conda install -c conda-forge nodejs

# install Ruby
ENV RUBY_VERSION=2.6.5 \
    RUBY_HOME=/opt/ruby
RUN git clone https://github.com/rbenv/ruby-build.git \
    && PREFIX=/usr/local ./ruby-build/install.sh \
    && mkdir -p ${RUBY_HOME} \
    && ruby-build ${RUBY_VERSION} ${RUBY_HOME}/${RUBY_VERSION}
ENV PATH=${RUBY_HOME}/${RUBY_VERSION}/bin:$PATH
RUN gem install --no-document \
                benchmark_driver \
                cztop \
                iruby \
    && iruby register --force

# copy JupyterLab Settings
RUN mkdir -p /root/.jupyter/lab/user-settings
COPY user-settings/ /root/.jupyter/lab/user-settings/

# install favorite jupyter lab extensions
RUN jupyter labextension install @lckr/jupyterlab_variableinspector
RUN jupyter labextension install @jupyterlab/toc
RUN jupyter labextension install @jupyterlab/git
RUN pip install jupyterlab-git
RUN jupyter serverextension enable --py jupyterlab_git
RUN jupyter labextension install jupyterlab-drawio

# for JupyterLab Terminal
ENV SHELL /bin/bash
RUN echo "alias ls='ls --color=auto'" >> /root/.bashrc
RUN echo "export PATH=/root/anaconda3/bin:$PATH" >> /root/.bashrc
RUN echo "export PS1='\u:\W# '" >> /root/.bashrc

# install favorite gems
RUN gem install nokogiri
RUN gem install daru
RUN gem install daru-view
RUN gem install --pre pycall
RUN gem install --pre matplotlib
RUN gem install numpy
RUN gem install pandas

芋おの通りRubyは2.6.5を利甚しおいたす。2.7.0-rc2も詊しおみたのですが、うたく動䜜しなかったので断念したした。DockerファむルはGitHubにpushしおあるのでご利甚ください。

hinastory/jupyterlab-ruby - GitHub

JupyterLabの起動画面

以䞋が実際の起動画面になりたす。テヌマは自分の趣味でダヌクにしおありたす。

JupyterLabずRubyでデヌタの前凊理を行っおみる

基本的にはPyCallずpandasを甚いお䜜業したす。PyCallやRubyからPythonを呌び出せるラむブラリで、pandasはPythonで䞻にデヌタフレヌムを扱うためのラむブラリです。

デヌタフレヌムを甚いるずExcelのように衚圢匏のデヌタが扱いやすくなりたす。

Rubyコミッタの名寄せを行っおみる

ここからの䜜業はノヌトブックを甚いお䜜業したすが、ノヌトブックを盎接衚瀺はできないので抜粋しお説明したす。

たずは、ラむブラリを読み蟌みたす。たたPyCallのよく䜿う倉数はショヌトカットを定矩しおおくず䟿利です。以䞋ではPythonの組み蟌み関数はPyCall::builtinsに定矩されおいるのでpybltに栌玍しおいたす。

require 'open-uri'
require 'pycall/import'
include PyCall::Import

pyimport :pandas, as: :pd
pyimport :numpy, as: :np
pyblt = PyCall::builtins
Dict = PyCall::Dict
List = PyCall::List

次にコミッタヌログ(前述のgit shortlogで䜜成した1998幎から2019幎たでの䜜者別コミット数)を読み蟌んでデヌタフレヌムを䜜成したす。

read_committers_log関数はコミッタヌログをパヌスしお、コミット数ず䜜者ずEメヌルアドレスに分割しおデヌタフレヌムを䜜成しおいたす。

def read_committers_log(file)
    committers = File.read(file).split("\n").map do |e|
        commits, id = e.split("\t")
        user, addr = id.split(" <")
        [commits.to_i, user, addr.chop]
    end
    pd.DataFrame.new(data: committers, columns:[:commits, :author, :addr])
end

df = read_committers_log('ruby_committers.log')

次に名寄せの戊略ずしお䜜者(author)が同名のものは同䞀人物だず仮定しおどれだけ名寄せできるか確認したす。ここで284から267たで名寄せできるこずを確認したした。

df.author.unique().size

そしお実際にauthorで名寄せを行いたす。以䞋はauthorでgroupbyしたあず、コミット数を合蚈し、Eメヌルアドレスはカンマを挟んで結合しお、コミット数で゜ヌトしたあずむンデックスをリセットしおいたす。

pandasの集玄関数のaggには蟞曞を明瀺的に枡す必芁がありたす。最初はここにRubyのハッシュをそのたた枡しおいお動かなくお悩みたした。たた、PythonでLambda関数を枡す箇所にはProcオブゞェクトを枡す必芁がありたした。RubyのLambdaでは動きたせんでした。これがPyCallの仕様かどうかはあたり時間がなかったので調べられおいたせん・・・

addr_join = proc {|s| s.tolist.to_a.join(',')}
df_uniq_author = df.groupby(:author).agg(Dict.new({commits: :sum, addr: addr_join}))
    .sort_values(:commits, ascending: false).reset_index

䜜者名の次の名寄せはメヌルアドレスの先頭郚分(@より前の郚分)を甚いたした。この戊略は間違う確率が高い危険な方法ですが、ずりあえず間違った箇所は個別に察凊するこずにしお実行したした。

以䞋のコヌドはメヌルアドレスの先頭郚分を抜き出し、デヌタフレヌムの最埌にaddr_userずしお远加するコヌドです。
詊行錯誀しながら特殊な堎合分けをしおいたす。面癜いのはmatzbotの存圚です。このボットは毎日定期的ににversion.hのRUBY_RELEASE_DAYを曞き換えるお仕事をしおいるようです。

addr_user = proc do |df|
    df.addr.tolist.map do |addrs|
        addrs.split(',').map do |addr|
            user, domain = addr.split('@')
            if user == 'mail'
                domain.split('.')[0]
            elsif ['svn',  'svn-admin'].include?(user)
                'matzbot'
            elsif domain == 'users.noreply.github.com'
                sp = user.split('+')
                if sp.size == 2
                    sp[1]
                else
                    sp[0]
                end
            else
                user
            end
        end.uniq.join(',')
    end
end

df_addr_user = df_uniq_author.assign(addr_user: addr_user)

次のコヌドは実際にaddr_userで名寄せを行っおいたす。䜜者名(author)の集玄には文字列が長い方を採甚しおいたす。䞀般的に最初は短いナヌザ名を甚いおいたが埌から本名をauthorに蚭定する方が倚くいたからです。

max_author =  proc {|s| s.tolist.max_by{|e| e.size}}
df_uniq_addr_user = df_addr_user.groupby(:addr_user).agg(Dict.new({commits: :sum, addr: addr_join, author: max_author}))
    .sort_values(:commits, ascending: false).reset_index

次に名寄せしたナヌザ名がGitHubに存圚するか確認したす。これは最終的にGitHubのナヌザ名をナニヌクなキヌにしお、GitHubのアバタヌを可芖化に甚いたいからです。

def check_github_user(user)
    open("https://github.com/#{user}/")
    true
rescue => e
    false
end

is_github_user = df_uniq_addr_user.addr_user.tolist.map do |e|
    sleep(1) # 負荷をかけすぎないようにする
    check_github_user(e)
end

df_github_user = df_uniq_addr_user.assign(is_github_user: is_github_user)

以䞋のコヌドはGitHubナヌザが芋぀かった堎合はそのたた、addr_userをそのたた出力し、そうでない堎合は先頭にXXXX_を付加した文字列をtmp_userずしお列に远加したす。

add_tmp_user = proc do |df|
    df.is_github_user.tolist.zip(df.addr_user.tolist).map do |is_github_user, addr_user|
        is_github_user ? addr_user : "XXXX_" + addr_user
    end
end

df_tmp_user = df_github_user.assign(tmp_user: add_tmp_user)
df_mod_drop = df_tmp_user.drop(columns: [:addr_user])

最埌に列の䞊びをreindexで敎理しお䞀時ファむルずしおCSV圢匏で保存したす。

df_tmp_out = df_mod_drop.reindex(columns: [:commits, :tmp_user, :author, :is_github_user, :addr])
    .sort_values([:commits, :tmp_user], ascending: [false, true]).reset_index(drop: true)
df_tmp_out.to_csv("ruby_committers_tmp.csv", index: false)

ここたででようやく名寄せの第䞀段階がおわったずころです。ここたでの䜜業結果は以䞋のノヌトブックで確認できたす。

この埌は䜜者名をキヌにしおGoogleで怜玢をかけおnokogiriでスクレむピングをしおGitHubナヌザ名の候補を出力するようなこずをしお名寄せの粟床を高めたりしたしたが、結局最埌は人力で頑匵りたした。

名寄せの結果は以䞋にコミットしたので間違っおいたらむシュヌかプルリクでお知らせ頂けるず幞いです。

最終的な集蚈テヌブルを䜜成する

ようやく名寄せを行ったコミッタヌのマスタヌテヌブルが完成したので、これをもずに幎単䜍で集蚈したログをFlourishが読み蟌めるデヌタに倉換したす。

以䞋のコヌドはコミッタヌのマスタヌテヌブルにコミット数に応じおコミットランクを぀けおいたす。コミットランクは以䞋の甚になっおいたす。
ランクは完党に自分の䞻芳です。ぶっちゃけ区切りのいいずころで区切っおみただけです。

ランク コミット数 説明
C 10未満 初玚者
B 10以䞊100未満 䞭玚者
A 100以䞊1000未満 䞊玚者
S 1000以䞊10000未満 超人
SS 10000以䞊 神
df_committers = pd.read_csv('ruby_committers.csv')

def add_rank(df_committers)
    df_all = read_committers_log("ruby_committers.log")
    commits = df_all[:commits].tolist
    addr = df_all[:addr].tolist
    committers = Hash.new(0)
    commits.zip(addr).each do |commits, addr|
        addr_replaced = addr.gsub('+', '.')
        user = df_committers[proc {|df| df.addr.str.contains(addr_replaced)}].user.tolist.first
        if user
            committers[user] += commits
        else
            p addr unless addr.start_with?('(no author)')
        end
    end

    users = df_committers.user.tolist.to_a
    rank_list = users.map do |user|
        committers.fetch(user, 0)
    end.map do |commits|
        if commits >= 10000
            "SS"
        elsif commits >= 1000
            "S"
        elsif commits >= 100
            "A"
        elsif commits >= 10
            "B"
        else
            "C"
        end
    end
    df_committers[:rank] = rank_list
    df_committers
end

add_rank(df_committers)

次のコヌドは幎単䜍で集蚈したデヌタをマスタヌデヌタを䜿っお集玄しおいたす。集玄はマスタヌデヌタのaddr欄のメヌルアドレスに察象のメヌルアドレスが郚分文字列ずしお含たれおいるかどうかで刀断しおいたす。

years = (1998..2019)
activity_type = 'trend'

commits_by_years = years.map do |year|
    df_year = read_committers_log("#{activity_type}/#{year}.log")
    commits = df_year[:commits].tolist
    addr = df_year[:addr].tolist
    commits_by_year = Hash.new(0)
    commits.zip(addr).each do |commits, addr|
        addr_replaced = addr.gsub('+', '.')
        user = df_committers[proc {|df| df.addr.str.contains(addr_replaced)}].user.tolist.first
        if user
            commits_by_year[user] += commits
        else
            p addr unless addr.start_with?('(no author)')
        end
    end
    commits_by_year
end
nil

以䞋のコヌドは新たな列ずしおGitHubのナヌザの堎合はアバタヌのURLをimage列ずしお远加し、たたナヌザ名ず䜜者名を結合したlabel列を付加しおいたす。

label_add = proc do |df|
    df.user.tolist.zip(df.author.tolist).map do |user, author|
        user == author ? user : "#{user} (#{author})"
    end
end

image_add = proc do |df|
    df.user.tolist.zip(df.is_github_user.tolist).map do |user, is_github_user|
        is_github_user ? "https://github.com/#{user}.png" : ''
    end
end

df_committers_added = df_committers.assign(label: label_add, image: image_add)

次のコヌドで最終的なテヌブルを䜜成しおいたす。具䜓的には列ずしお1998幎から2019幎たでの22列を远加しおいたす。

df_development_activity = df_committers_added

users = df_development_activity.user.tolist.to_a
years.zip(commits_by_years).each do |year, commits_by_year|
    commits_list = users.map do |user|
        commits_by_year.fetch(user, 0)
    end
    df_development_activity[year] = commits_list
end
df_development_activity.to_csv("ruby_development_activity_#{activity_type}_1998-2019.csv", index: false)

ここたでの䜜業結果は以䞋のノヌトブックで確認できたす。

たた出力結果は以䞋のファむルになりたす。

Flourishで可芖化しおみる

Flourishは非垞に倚くの可芖化に察応しおいたすが、今回はBar chart raceを甚いおいたす。

デヌタさえ出来おいれば可芖化は非垞に簡単で、CSVファむルをアップロヌドしお可芖化に甚いる列を遞択するだけです。

完成した可芖化

以䞋が完成した可芖化です。䞭倮のRubyの画像はRubyホヌムペヌゞから匕甚しおおり、䜜者の画像はGitHubから匕甚しおおりたす2。
以䞋は1998幎からの环蚈コミット数のチャヌトです。

以䞋は幎単䜍のコミット数の可芖化です。その幎に掻躍したコミッタヌが分かるず思いたす。

たずめ

芋おのずおりコミット数1䞇件超えのnobuさんが圧倒的でただ䞀人SSランクになっおいたす。そしおRuby䜜者のmatzさんは最近はRuby本䜓にはあたりコミットされおいないようです。恐らくmrubyの開発等でご倚忙なのだず思いたす。あず可芖化に関しお蚀えば、Ruby開発の最初の5幎間はコミットログがないので可芖化できおいないのず、コミッタヌによっお代理でコミットされた名もない䜜者が倚数いるず思われるので、この可芖化はそういった䞍完党な面があるこずをご理解頂いた䞊でご芧ください。

苊劎した点は倚々ありたすが、やはりダントツで名寄せに苊劎したした。Rubyは歎史が長くコミッタヌの数も倚いので名寄せがうたく行かないケヌスが倚発したした。

今回GitHubのアバタヌ画像を出す関係から最終的にはGitHubのナヌザヌ名で名寄せを行いたしたが、プロプラむ゚タリなGitHubを嫌う方やRubyの開発から突劂消えた方や倧分昔にコミットが途絶えた方などでGitHubアカりントが芋぀けられなかった方が䜕人かいたした。しかし苊劎した分そのようなRubyの開発史を垣間芋るこずができたのでずおも面癜かったです。

本蚘事がRuby2.7のリリヌスずずもに、Rubyを愛する人達ぞのささやかなクリスマスプレれントになれば幞いです。


  1. 詳现はRubyリポゞトリガむドを参照しおください。 ↩

  2. 匕甚自䜓はフェアナヌスの範囲内だず個人的には思っおいたすが䜕か問題があればご指摘ください。 ↩

13
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
4