Heart of Clojure 2024 Conference Schedule
Table of Contents
- 1. Heart of Clojure 2024 Itinerary
- 1.1. Wednesday, September 18, 2024
- 1.1.1. 15:00 - Extra Babashka Workshop
- 1.1.2. 15:05 - The Shoulders of Giants or Uncovering the Foundational Ideas of Lisp
- 1.1.3. 15:55 - Beyond the Hype: Obstacles on the Path to Clojure Adoption
- 1.1.4. 16:00 - Open hearts for diversity
- 1.1.5. 16:30 - Klor: Choreographic Programming in Clojure
- 1.1.6. 16:30 - Clojure in Startups/Scale-ups. The economy of Clojure
- 1.1.7. 17:00 - Jank Office Hours
- 1.1.8. 17:20 - TimeLines: Crafting a Live Coding Musical Instrument with & out of Clojure
- 1.1.9. 18:30 - Speaker/Volunteer Pizzas
- 1.1.10. 20:00 - Overtone / TidalCycles
- 1.1.11. 20:30 - UFORAVE!timewarp
- 1.2. Thursday, September 19, 2024
- 1.2.1. 09:00 - An introduction to application.garden
- 1.2.2. 09:50 - Richer SQL – Steering SQL's Future Towards Clojure's Philosophy
- 1.2.3. 10:30 - Building Conversational Speech Annotation Tool in Clojure
- 1.2.4. 11:00 - Debugging: Taking inline defs to the next level with snitch
- 1.2.5. 11:00 - Cursive office hours
- 1.2.6. 11:00 - Beating the monad curse
- 1.2.7. 11:00 - Exploring lsp4clj
- 1.2.8. 11:30 - Squint: a taste of Clojure for JavaScript devs
- 1.2.9. 12:00 - Lunch
- 1.2.10. 13:00 - Build a Desktop Application with Humble UI
- 1.2.11. 13:30 - XTDB v2 code tour
- 1.2.12. 14:00 - defn podcast LIVE!
- 1.2.13. 15:00 - Babashka in practice
- 1.2.14. 15:30 - Staring into the PLFZABYSS - From the IBM AS/400 to Clojure & Datomic
- 1.2.15. 16:10 - Living With Legacy Code
- 1.2.16. 17:00 - Lightning Talks
- 1.2.17. 18:05 - The Wonders of Abstraction
- 1.2.18. 19:00 - Opening Night: Maarten Ceulemans & Benny Luyckx
- 1.1. Wednesday, September 18, 2024
- 2. Utilities
1. Heart of Clojure 2024 Itinerary
1.1. Wednesday, September 18, 2024
1.1.1. 15:00 - Extra Babashka Workshop
- Notes:
1.1.4. 16:00 - Open hearts for diversity
- Notes:
1.1.5. 16:30 - Klor: Choreographic Programming in Clojure
- Notes:
1.1.7. 17:00 - Jank Office Hours
- Notes:
1.1.9. 18:30 - Speaker/Volunteer Pizzas
- Notes:
1.1.10. 20:00 - Overtone / TidalCycles
- Notes:
1.1.11. 20:30 - UFORAVE!timewarp
- Notes:
1.2. Thursday, September 19, 2024
1.2.1. 09:00 - An introduction to application.garden
- Notes:
1.2.5. 11:00 - Cursive office hours
- Notes:
1.2.6. 11:00 - Beating the monad curse
- Notes:
1.2.7. 11:00 - Exploring lsp4clj
- Notes:
1.2.8. 11:30 - Squint: a taste of Clojure for JavaScript devs
- Notes:
1.2.9. 12:00 - Lunch
- Notes:
1.2.10. 13:00 - Build a Desktop Application with Humble UI
- Notes:
1.2.11. 13:30 - XTDB v2 code tour
- Notes:
1.2.12. 14:00 - defn podcast LIVE!
- Notes:
1.2.13. 15:00 - Babashka in practice
- Notes:
1.2.15. 16:10 - Living With Legacy Code
- Notes:
1.2.16. 17:00 - Lightning Talks
- Notes:
1.2.17. 18:05 - The Wonders of Abstraction
- Notes:
1.2.18. 19:00 - Opening Night: Maarten Ceulemans & Benny Luyckx
- Notes:
2. 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)))