Heart of Clojure 2024 Conference Schedule

Table of Contents

Heart of Clojure 2024 Itinerary

Wednesday, September 18, 2024

15:00 - Extra Babashka Workshop

  • Notes:

15:05 - The Shoulders of Giants or Uncovering the Foundational Ideas of Lisp

  • Notes:

15:55 - Beyond the Hype: Obstacles on the Path to Clojure Adoption

  • Notes:

16:00 - Open hearts for diversity

  • Notes:

16:30 - Klor: Choreographic Programming in Clojure

  • Notes:

16:30 - Clojure in Startups/Scale-ups. The economy of Clojure

  • Notes:

17:00 - Jank Office Hours

  • Notes:

17:20 - TimeLines: Crafting a Live Coding Musical Instrument with & out of Clojure

  • Notes:

18:30 - Speaker/Volunteer Pizzas

  • Notes:

20:00 - Overtone / TidalCycles

  • Notes:

20:30 - UFORAVE!timewarp

  • Notes:

Thursday, September 19, 2024

09:00 - An introduction to application.garden

  • Notes:

09:50 - Richer SQL — Steering SQL's Future Towards Clojure's Philosophy

  • Notes:

10:30 - Building Conversational Speech Annotation Tool in Clojure

  • Notes:

11:00 - Debugging: Taking inline defs to the next level with snitch

  • Notes:

11:00 - Cursive office hours

  • Notes:

11:00 - Beating the monad curse

  • Notes:

11:00 - Exploring lsp4clj

  • Notes:

11:30 - Squint: a taste of Clojure for JavaScript devs

  • Notes:

12:00 - Lunch

  • Notes:

13:00 - Build a Desktop Application with Humble UI

  • Notes:

13:30 - XTDB v2 code tour

  • Notes:

14:00 - defn podcast LIVE!

  • Notes:

15:00 - Babashka in practice

  • Notes:

15:30 - Staring into the PLFZABYSS - From the IBM AS/400 to Clojure & Datomic

  • Notes:

16:10 - Living With Legacy Code

  • Notes:

17:00 - Lightning Talks

  • Notes:

18:05 - The Wonders of Abstraction

  • Notes:

19:00 - Opening Night: Maarten Ceulemans & Benny Luyckx

  • Notes:

Utilities

  (require 'org)
  (require 'cl-lib)

  (defun event/parse-sessions ()
    "Parse event sessions from the current Org buffer."
    (org-element-map (org-element-parse-buffer) 'headline
      (lambda (headline)
        (let ((title (org-element-property :raw-value headline))
              (properties (org-element-property :properties headline)))
          (when (and (org-element-property :LOCATION properties)
                     (org-element-property :SCHEDULED properties))
            (list :title title
                  :time (org-element-property :SCHEDULED properties)
                  :location (org-element-property :LOCATION properties)
                  :duration (org-element-property :DURATION properties)
                  :speaker (or (org-element-property :SPEAKER properties)
                               (org-element-property :ORGANIZER properties))
                  :id (org-element-property :ID properties)))))))

  (defun event/parse-time (time-string)
    "Parse TIME-STRING and return a cons of (hours . minutes)."
    (when (string-match "\\([0-9]+\\):\\([0-9]+\\)" time-string)
      (cons (string-to-number (match-string 1 time-string))
            (string-to-number (match-string 2 time-string)))))

  (defun event/format-time (time)
    "Format TIME as HH:MM."
    (format "%02d:%02d" (car time) (cdr time)))

  (defun event/get-tracks (sessions)
    "Get unique tracks from SESSIONS."
    (delete-dups
     (mapcar (lambda (session) (plist-get session :location))
             sessions)))

  (defun event/sort-sessions (sessions)
    "Sort SESSIONS by time."
    (sort sessions
          (lambda (a b)
            (time-less-p
             (org-time-string-to-time (plist-get a :time))
             (org-time-string-to-time (plist-get b :time))))))

  (defun event/generate-table-by-track (sessions)
    "Generate a table of SESSIONS organized by track."
    (let* ((tracks (event/get-tracks sessions))
           (sorted-sessions (event/sort-sessions sessions))
           (table (list (cons "Time" tracks))))
      (dolist (session sorted-sessions)
        (let* ((time (event/parse-time (plist-get session :time)))
               (formatted-time (event/format-time time))
               (track (plist-get session :location))
               (title (plist-get session :title))
               (speaker (plist-get session :speaker))
               (row-index (cl-position formatted-time table
                                       :key #'car :test #'string=))
               (cell-content (format "%s\n%s" title (or speaker ""))))
          (if row-index
              (setf (nth (1+ (cl-position track tracks :test #'string=))
                         (nth row-index table))
                    cell-content)
            (let ((new-row (make-list (1+ (length tracks)) "")))
              (setf (car new-row) formatted-time)
              (setf (nth (1+ (cl-position track tracks :test #'string=)) new-row)
                    cell-content)
              (setq table (append table (list new-row)))))))
      (concat "| "
              (mapconcat #'identity
                         (mapcar (lambda (row)
                                   (mapconcat #'identity row " | "))
                                 table)
                         " |\n| ")
              " |")))

  (defun event/write-table-to-file (table-string filename)
    "Write TABLE-STRING to FILENAME."
    (with-temp-file filename
      (insert "#+TITLE: Heart of Clojure 2024 Schedule\n\n")
      (insert table-string)))

  (defun event/generate-schedule-table ()
    "Generate a schedule table from the current Org buffer and save it to a file."
    (interactive)
    (let* ((sessions (event/parse-sessions))
           (table-string (event/generate-table-by-track sessions))
           (output-file (concat (file-name-sans-extension (buffer-file-name))
                                "-schedule-by-track.org")))
      (event/write-table-to-file table-string output-file)
      (message "Schedule table written to %s" output-file)))

Author: Jason Walsh

j@wal.sh

Last Updated: 2025-07-30 13:45:27

build: 2025-12-23 09:11 | sha: a10ddd7