Skip to content

sbcl contributors over time

I took a break from the day-to-day work (maybe giving Visual Studio’s a timeout will solve it’s “Generation of designer file failed: Unknown server tag…” problem), and noticed jsnell posted a list of SBCL contributors to #lisp, and decided to do some graphing:


Of course, since I’ve never graphed this before, I found 2 bugs. I copied the text from jsnell paste and used cl-ppcre to split it up into data sets. I had to do a little math to get the months to line up nicely with the yearly sums, but it was all pretty straightforward.

Code, excluding the copied text from lisppaste:

(defun make-months ()
  (loop for month in '("Jan" "Feb" "Mar" "Apr" "May" "Jun"
		       "Jul" "Aug" "Sep" "Oct" "Nov" "Dec")
	counting T into val
	collect (list month (float (/ val 12)))))

(defun yearly-data ()
  (let (result)
	(cl-ppcre:do-register-groups (year contribs)
	    ("(\\d+):(\\d+)" +yearly-raw-data+)
	  ;;add 1 so the yearly totals line up with
	  ;;december monthly data
	  (push (list (+ 1 (parse-integer year))
		      (parse-integer contribs))

(defun monthly-data ()
  (let ((months (make-months))
	(cl-ppcre:do-register-groups (year monthname contribs)
	    ("(\\d+)-(\\w{3}):(\\d+)" +monthly-raw-data+)
	  (push (list
		 (+ (parse-integer year)
		     (assoc monthname months
			    :test #'string=)))
		 (parse-integer contribs))

(defun yearly-graph ()
  (with-line-chart (600 400)
    (add-series "Yearly Contributors" (yearly-data))
    (add-series "Monthly Contributors" (monthly-data))
    ;;so the yearly totals line up, the data is offset by 1
    (set-axis :x nil :draw-gridlines-p nil :data-interval 1
	      :label-formatter #'(lambda (y)
				   (princ-to-string (1- y))))
    (set-axis :y nil)
    (save-file "yearly.png")))


  1. Rahul Jain wrote:

    (defparameter *months* ‘(“Jan” “Feb” “Mar” “Apr” “May” “Jun” “Jul” “Aug” “Sep” “Oct” “Nov” “Dec”))

    (defun yearly-data ()
    (loop for entry in +yearly-raw-data+
    for year = (parse-integer entry :end 4)
    for contribs = (parse-integer entry :start 5)
    collect (list year contribs)))

    (defun monthly-data ()
    (loop for entry in +monthly-raw-data+
    for (year year-end) = (parse-integer entry :end 4)
    for month = (position entry *months* :test (lambda (x y) (string= x y :start1 5 :end1 8))
    for contribs = (parse-integer entry :start 9)
    collect (list (+ year (/ month 12)) contribs)

    (defun yearly-graph ()
    (with-line-chart (600 400)
    (add-series “Yearly Contributors” (yearly-data))
    (add-series “Monthly Contributors” (monthly-data))
    ;;so the yearly totals line up, the data is offset by 1
    (set-axis :x nil :draw-gridlines-p nil :data-interval 1
    :label-formatter #'(lambda (y)
    (princ-to-string (1- y))))
    (set-axis :y nil)
    (save-file “yearly.png”)))

    Haven’t tried the code, or even seen if it parses, so caveat emptor.

    Wednesday, February 6, 2008 at 12:33 pm | Permalink
  2. Just to clarify, those results are produced by a very stupid perl script groveling over the CVS logs, mainly for the purpose of having some number available when doing a presentation/paper/survey on sbcl. So I wouldn’t read too much into the numbers.

    Wednesday, February 6, 2008 at 1:03 pm | Permalink
  3. For a clearer graph, I would suggest plotting the two lines on different scales, so that the monthly-contributors curve has a vertical scale 12 times as big as the yearly-contributors.

    This would allow a reader of your graph to infer at a glance what proportion of contributors are one-off and what proportion are repeat, by seeing how much of the monthly curve is above the yearly one.

    Wednesday, February 6, 2008 at 1:09 pm | Permalink
  4. John Wiseman wrote:

    Along similar lines see

    Thursday, February 7, 2008 at 5:56 pm | Permalink
  5. Antonio wrote:

    Yellow on grey? What about making a white background and grey dashed lines? Much more legible, I think

    Saturday, February 23, 2008 at 8:40 am | Permalink