From 4f561115943ffa0cb68579e3276f8b599c38eb4f Mon Sep 17 00:00:00 2001 From: Frederik Vanrenterghem Date: Mon, 11 Nov 2024 22:54:45 +0800 Subject: [PATCH 1/4] Add post about punk rock band. --- source/posts/punk-rock.org | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 source/posts/punk-rock.org diff --git a/source/posts/punk-rock.org b/source/posts/punk-rock.org new file mode 100644 index 0000000..df9da73 --- /dev/null +++ b/source/posts/punk-rock.org @@ -0,0 +1,27 @@ +#+date: <2024-11-11 Mon 22:43> +#+title: Punk rock +#+filetags: :music:open_web:musings: +#+OPTIONS: \n:t + +I was searching for some new music yesterday, and stumbled on the latest album of Melbourne punk band [[https://www.amylandthesniffers.com/][Amyl and the Sniffers]]. I listened to a few of their songs and liked their sound and lyrics - they've got that thing going where it feels like it's all very real and not the result of many iterations of refinement. A mood I associate strongly with what punk is all about to me - a rejection of authority. + +The band also released a new music video with their song /Jerkin'/, as I found out reading up on them. + +At this point it is clear I should say the internet helped tremendously in discovering this band. [[https://listenbrainz.org/][Aggregators]] of [[https://www.last.fm/home][listening habits]] helped me find people with similar taste in music so I could learn what they listen to. An [[https://bandcamp.com/][online record store]] allowed me to listen to some of the songs I found out about. A [[https://www.reddit.com/][bulletin board service]] helped me learn more about the band's recent activity. This is where another reality of today's internet / web jumps to the fore though, i.e. how it acts as an amplifier of fringe or outdated morals. The video is, in typical punk fashion, a statement. A statement about bodies being just bodies, not something to be ashamed of nor sexualize whenever seen. See the quote below to understand how the band saw that. + +#+BEGIN_QUOTE +"The level of offence that a vagina or penis can generate is absolutely bizarre. Once, Amy said to me, “If the world wasn’t so fucked up, I’d never wear clothes.” It’s the context we stamp onto our sex organs that makes them innately “offensive.” This is why we wanted to strip away the artifice and examine the body in an open, conversational way. We approached the project as if it were a performance in itself. From concept to crewing to casting, we (the production) let the project evolve in the most natural way possible, allowing our subjects to dictate their level of input based on their comfort on the day. We were learning what it was as we were making it, which is basically the opposite approach I’m used to. But because this idea was driven by people’s personalities, it felt wrong to do it any other way. We just kept pulling things further and further back until we were left with just a white wall and the human body. I want to come out of everything I do with a different perspective. Just as one’s perspective changes with an Amyl song, I want to change in the same way. I think we all walked away from the shoot with an innate need to be less prudish and give less of a shit." + +- John Angus Stewart, Director +#+END_QUOTE + +Ironically maybe, they seem to have had to go to great lengths to make the video available for viewing online, and now might have altogether given up on it. The [[https://www.amylandthesniffers.com/][band's main website]] embeds music videos on [[https://www.youtube.com/][a video sharing site]]. That site has a [[https://support.google.com/youtube/answer/2802002?sjid=3519309259100951039-AP][Nudity policy]], so they might have felt they needed to create a censored version of it to be able to upload it there - even though I believe it falls within what's considered allowed (at the moment). + +The original, i.e. uncensored version is on [[https://jerkin.amylandthesniffers.com]]. I don't see that microsite linked from their main website anymore though, while the censored version still is. To see it, a JavaScript-heavy experience follows, where you've got to confirm being 18 to go through to another page which embeds the video hosted on [[https://www.cdnetworks.com/media-delivery/][yet another media sharing site]] but doesn't allow direct linking or sharing. + +Possibly they first added that verification step and later took down the link based on an interpretation of applicable Australian law. The current rules around the classification of films (of which musical representations are exempt though) would likely classify it as Mature or maybe even Mature Accompanied. A recent review ([[https://www.infrastructure.gov.au/department/media/publications/review-australian-classification-regulation-stevens-review][Stevens review]]) in the classification scheme recommends to do away with the rules around those category for online screenings, as it's recognised to be impractical to enforce the resulting need for an adult to be present during the screening. That's compatible with the Online Safety Act, which only puts limits around online content of a Restricted nature. The simple display of a nude person would not fall under that. + +I like to think the band would have been able to have broader reach with their statement video if the web were still more decentralised and more open, as they would have self-hosted the original video without needing to come up with alternatives to comply with the rules from all the intermediaries currently involved, and challenge some outdated laws that consider any display of genitals as offensive. + +You know, more punk. + -- 2.39.5 From 8189c3b08a7bd316371f9b4dcf49a3dc3875e641 Mon Sep 17 00:00:00 2001 From: Frederik Vanrenterghem Date: Wed, 5 Mar 2025 22:12:21 +0800 Subject: [PATCH 2/4] Voeg post ivm CalDAV en orgmode toe. --- source/assets/caldav-diagram.png | Bin 0 -> 41043 bytes source/posts/emacs_calendar.org | 109 +++++++++++++++++++++++++++++++ 2 files changed, 109 insertions(+) create mode 100644 source/assets/caldav-diagram.png create mode 100644 source/posts/emacs_calendar.org diff --git a/source/assets/caldav-diagram.png b/source/assets/caldav-diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..dddb4e9affb6e2fd4c545854bb07349fd6fc0e89 GIT binary patch literal 41043 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%0A7{LGV+O?VMJl$wS;HMq#^ zZ~XI6(|0KvuQ!GyII73}_XqX=_jeSt>f1ql>;L<@Bz2wD)iuS3Hbv6Jx`5=T=xHC+ K%G0n7{Qm$t9_JGP literal 0 HcmV?d00001 diff --git a/source/posts/emacs_calendar.org b/source/posts/emacs_calendar.org new file mode 100644 index 0000000..0b50e9f --- /dev/null +++ b/source/posts/emacs_calendar.org @@ -0,0 +1,109 @@ +:PROPERTIES: +:CREATED: [2025-03-05 Wed 19:57] +:END: +#+date: <2025-03-05 Wed 22:08> +#+title: Using Emacs Org mode to manage my appointments. +#+filetags: :emacs:Linux:automation:elisp: +#+OPTIONS: \n:t + +#+BEGIN_PREVIEW +~Memento, homo, quia pulvis es, et in pulverem reverteris.~ + +After some months of trying out a prototype approach and tweaking it, I believe to have landed on a viable system to manage my appointments seamlessly from within Emacs, on my Android phone and any other calendar application. + +I use a calendar self-hosted on a Nextcloud instance, accessible through the CalDAV protocol - the Distributed Authoring and Versioning protocol for calendar data that came out of Apple in the early 2000s (interesting details on that in [[https://www.researchgate.net/publication/3419713_Open_Calendar_Sharing_and_Scheduling_with_CalDAV][Dusseault, Lisa & Whitehead, J.. (2005). Open Calendar Sharing and Scheduling with CalDAV. Internet Computing, IEEE. 9. 81 - 89. 10.1109/MIC.2005.43. ]]) + +The calendar data from the server is synchronised with my phone using [[https://www.davx5.com/][DAVx5]] where I currently use the [[https://github.com/FossifyOrg/Calendar][Fossify Calendar]] to display and make or alter appointments, and on my laptop using [[https://github.com/dengste/org-caldav][org-caldav]] in GNU Emacs, writing to a Org mode calendar file. I occasionally also use the web-based view from the Nextcloud web client from within a browser. +#+END_PREVIEW + +Graphically, this results in a a system as shown hereunder: + +#+BEGIN_SRC dot :results file :file ../assets/caldav-diagram.png :exports results + digraph G { + server [label="Nextcloud CalDAV server"]; + org [label="Emacs Org mode", color = "purple"]; + server -> laptop; + laptop -> server; + server -> phone [label = "DAVx5"]; + phone -> server; + laptop -> org [label = "org-caldav", fontcolor = "purple"]; + org -> laptop; + laptop -> Firefox; + Firefox -> server; + } +#+END_SRC + +#+RESULTS: +[[file:../assets/caldav-diagram.png]] + +The Org file accessed through Emacs is set up using a /date tree/ as the outline mode of the file. This creates headings by year and by month that can be folded and unfolded using standard functionality from Org mode. That offers a unique way to access appointments - alternatives to have headlines by week exist as well, but I don't have enough appointments to warrant that level of granularity in the outline of the file. + +#+BEGIN_SRC org + ,* 2025 + ,** 2025-01 January + ,*** New Year lunch + ,:PROPERTIES: + ,:location: Our place + ,:END: + Lunch with family to celebrate the new year. + <2025-01-01 Wed 11:30>--<2025-01-01 Wed 15:00> + ,** 2025-02 February + ,*** New Year's resolutions progress review + <2025-02-01 Sat>--<2025-02-02 Sun> +#+END_SRC + +Alternatively, I can view my appointments on a traditional calendar layout using the [[https://github.com/kiwanami/emacs-calfw][Emacs calendar framework or calfw]]. + +2025 / April + [ < ] [ > ] [Today] [Day] [Week] [Two Weeks] [Month] ++---------------------------+---------------------------+---------------------------+---------------------------+---------------------------+---------------------------+---------------------------+ +| Sunday | Monday | Tuesday | Wednesday | Thursday | Friday | Saturday | ++---------------------------+---------------------------+---------------------------+---------------------------+---------------------------+---------------------------+---------------------------+ +| 30 | 31 | 1 April Fools' Day | 2 | 3 | 4 | 5 | +| | | | | | | | +| | | | | | | | ++---------------------------+---------------------------+---------------------------+---------------------------+---------------------------+---------------------------+---------------------------+ +| 6 | 7 | 8 | 9 | 10 | 11 | 12 | +| | | | | | | | +| | | | | | | | ++---------------------------+---------------------------+---------------------------+---------------------------+---------------------------+---------------------------+---------------------------+ +| 13 Passover | 14 | 15 | 16 | 17 | 18 Good Friday | 19 | +| | | | | | | | +| | | | | | | | ++---------------------------+---------------------------+---------------------------+---------------------------+---------------------------+---------------------------+---------------------------+ +| 20 Easter Sunday | 21 First Day of Ridvan | 22 | 23 | 24 | 25 | 26 | +| | | | | | | | +| | | | | | | | ++---------------------------+---------------------------+---------------------------+---------------------------+---------------------------+---------------------------+---------------------------+ +| 27 | 28 | 29 Ninth Day of Ridvan | 30 | 1 | 2 Twelfth Day of Ridvan | 3 | +| | | | | | | | +| | | | | | | | ++---------------------------+---------------------------+---------------------------+---------------------------+---------------------------+---------------------------+---------------------------+ + +I also set up a new capture template, allowing the quick creation of an appointment using C-c c followed by a. + +#+BEGIN_SRC emacs-lisp + (org-capture-templates + '(("a" "Appointment" entry + (file+olp+datetree "~/Nextcloud/notes/calendar-nextcloud.org") + "* %?\n :PROPERTIES:\n :location: %^{Location}\n :END:\n%(fv/org-capture-appointment-timestam)\n\n" + :jump-to-captured t + :empty-lines 1 + :tree-type month + :time-prompt t))) + + (defun fv/org-capture-appointment-timestamp (&optional duration) + "Get an Org timestamp for an appointment. + Prompt for a start time, calculate the end time by adding DURATION (default 30 + minutes), and return a formatted Org timestamp with start and end times." + (let* ((duration (or duration 30)) + (start-time (org-read-date t t nil "From:")) + (end-time (time-add start-time (seconds-to-time (* duration 60))))) + (concat (format-time-string (org-time-stamp-format t) start-time) + "--" + (format-time-string (org-time-stamp-format t) end-time)))) +#+END_SRC + +One gripe at the moment: the capture template needs a custom function to properly capture a time range, even though the standard Org timestamp can be formatted in a time range easily using syntax like ~2pm+1h~ to create a 1h block starting at 14:00. When using this within a capture template using the shorthand ~%^T~ which prompts for a date, the timestamp is unfortunately simplified using [[https://github.com/tkf/org-mode/blob/c2ebeea6f68f2ef804d387c238e4acccf655dc64/lisp/org-capture.el#L897-L907][some logic in the template engine]] at the moment. + +Full setup can be found in [[http://git.vanrenterghem.biz/Dotty.git/blob/7c1ae2a1b7c0674664d97d06a61c232920a72b90:/emacs/.emacs.d/init.el][Dotty, my dot files repository]]. -- 2.39.5 From 5d2cf7b1efa78078f17ff9471a65087391b1b704 Mon Sep 17 00:00:00 2001 From: Frederik Vanrenterghem Date: Wed, 12 Mar 2025 13:01:12 +0800 Subject: [PATCH 3/4] Tidy up some posts' metadata and line breaks. --- source/posts/Perth_solar_exposure_over_year.org | 7 +++---- source/posts/emacs_calendar.org | 4 +--- source/posts/punk-rock.org | 1 - 3 files changed, 4 insertions(+), 8 deletions(-) diff --git a/source/posts/Perth_solar_exposure_over_year.org b/source/posts/Perth_solar_exposure_over_year.org index b7f190d..41a5c90 100644 --- a/source/posts/Perth_solar_exposure_over_year.org +++ b/source/posts/Perth_solar_exposure_over_year.org @@ -23,10 +23,9 @@ available on our roofs throughout the year. __Table:__ Average solar exposure per m2 in Kings Park, Perth Jan 2017 to Jun 2023. -|__Month__|Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec -|- -|__MJ/m2__|949,152|741,432|642,187|484,428|362,085|280,690|297,863|411,215|548,154|718,831|831,845|958,651 - +| __Month__ | Jan | Feb | Mar | Apr | May | Jun | Jul | Aug | Sep | Oct | Nov | Dec | +|----------------------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| __MJ/m2__ | 949,152 | 741,432 | 642,187 | 484,428 | 362,085 | 280,690 | 297,863 | 411,215 | 548,154 | 718,831 | 831,845 | 958,651 | Right now in June, we're at the low point for the year in expected yield from a solar panel, with just about a third of the energy being diff --git a/source/posts/emacs_calendar.org b/source/posts/emacs_calendar.org index 0b50e9f..878d1c7 100644 --- a/source/posts/emacs_calendar.org +++ b/source/posts/emacs_calendar.org @@ -1,7 +1,5 @@ -:PROPERTIES: -:CREATED: [2025-03-05 Wed 19:57] -:END: #+date: <2025-03-05 Wed 22:08> +#+AUTHOR: Frederik V #+title: Using Emacs Org mode to manage my appointments. #+filetags: :emacs:Linux:automation:elisp: #+OPTIONS: \n:t diff --git a/source/posts/punk-rock.org b/source/posts/punk-rock.org index df9da73..91a40af 100644 --- a/source/posts/punk-rock.org +++ b/source/posts/punk-rock.org @@ -24,4 +24,3 @@ Possibly they first added that verification step and later took down the link ba I like to think the band would have been able to have broader reach with their statement video if the web were still more decentralised and more open, as they would have self-hosted the original video without needing to come up with alternatives to comply with the rules from all the intermediaries currently involved, and challenge some outdated laws that consider any display of genitals as offensive. You know, more punk. - -- 2.39.5 From dd5aea61264c2b3bb3da21640ad3f0da7136f09c Mon Sep 17 00:00:00 2001 From: Frederik Vanrenterghem Date: Wed, 12 Mar 2025 15:00:24 +0800 Subject: [PATCH 4/4] Create an RSS feed with the full content of posts. --- maak-website.el | 99 +++++++++++++++++++++++++++++++++++------------- source/index.org | 2 +- 2 files changed, 73 insertions(+), 28 deletions(-) diff --git a/maak-website.el b/maak-website.el index c93f1cc..0230ab8 100644 --- a/maak-website.el +++ b/maak-website.el @@ -1,12 +1,13 @@ (require 'cl-lib) (require 'org) (require 'ox-publish) -(add-to-list 'load-path "~/.emacs.d/elpa/ox-rss-20230408.231") -(add-to-list 'load-path "~/.emacs.d/elpa/mustache-20230713.514") -(add-to-list 'load-path "~/.emacs.d/elpa/s-20220902.1511") -(add-to-list 'load-path "~/.emacs.d/elpa/dash-20240510.1327") -(add-to-list 'load-path "~/.emacs.d/elpa/f-20240308.906 " ) -(add-to-list 'load-path "~/.emacs.d/elpa/htmlize-20240527.1456") +(let ((default-directory "~/.emacs.d/elpa/")) + (normal-top-level-add-subdirs-to-load-path)) +(require 'mustache) +(require 's) +(require 'dash) +(require 'f) +(require 'htmlize) (require 'ox-rss) (load "~/.emacs.d/lisp/mustache-html.el") @@ -26,6 +27,7 @@ (setq org-export-time-stamp-file nil) (setq org-rss-use-entry-url-as-guid nil) +(setq make-backup-files nil) (defun my-org-get-all-filetags () "Get list of filetags from all org-files in my-blog-posts-folder." @@ -147,18 +149,10 @@ Either the section between #+BEGIN_PREVIEW and +#END_PREVIEW is used, or the fir (date (format-time-string (cdr org-time-stamp-custom-formats) (org-publish-find-date file project-plist))) (preview (my-blog-get-preview abspath)) ) - ;; insert a horizontal line before every post, kill the first one - ;; before saving (insert (concat "* [[file:" relpath "][" title "]]\n")) - ;; add properties for `ox-rss.el' here - (let ((rss-permalink (concat (file-name-sans-extension relpath) ".html")) - (rss-pubdate (format-time-string (cdr org-time-stamp-formats) (org-publish-find-date file project-plist)))) - (org-mode) - (org-set-property "HTML_CONTAINER_CLASS" "card mb-2") ;Bootstrap margin border 2 - (org-set-property "HTML_HEADLINE_CLASS" "card-header card-title border-bottom-0 fs-5 fw-bold text-decoration-none") - (org-set-property "RSS_PERMALINK" rss-permalink) - (org-set-property "PUBDATE" rss-pubdate) - (org-set-property "RSS_TITLE" title)) + (org-mode) + (org-set-property "HTML_CONTAINER_CLASS" "card mb-2") ;Bootstrap margin border 2 + (org-set-property "HTML_HEADLINE_CLASS" "card-header card-title border-bottom-0 fs-5 fw-bold text-decoration-none") ;; insert the date, preview, & read more link (insert "#+ATTR_HTML: :class card-header\n") (insert (concat "Published: " date "\n\n")) @@ -166,16 +160,12 @@ Either the section between #+BEGIN_PREVIEW and +#END_PREVIEW is used, or the fir (insert "

\n") (insert "#+END_export\n") (insert preview) - ;(insert (concat "#+INCLUDE: \"" relpath "\" :only-contents t :lines \"1-10\"\n")) (insert "\n") (insert (concat "[[file:" relpath "][Read More...]]\n")) (insert "#+BEGIN_export html\n") (insert "
\n") (insert "#+END_export\n") )) - ;; kill the first hrule to make this look OK - ;(goto-char (point-min)) - ;(let ((kill-whole-line t)) (kill-line)) ;; insert a title and save (insert "#+OPTIONS: title:nil\n") (insert "#+TITLE: Frederik Vanrenterghem's blog\n") @@ -215,10 +205,55 @@ representation for the files to include, as returned by "tag-index.org")) (org-export-to-buffer 'mustache-html (current-buffer) nil nil nil t nil) (replace-string "href=\"posts" "href=\"/posts")) + ;; Delete the sitemap and rss files created so they don't get picked up as original files in future publish actions. (delete-file (file-name-concat my-blog-source-folder "sitemap.org")) (delete-file (file-name-concat my-blog-posts-folder "sitemap.org")) - (delete-file (file-name-concat my-blog-posts-folder "sitemap.org~"))) - + (delete-file (file-name-concat my-blog-posts-folder "rss.org"))) + +;; Define some custom functions to create the RSS feed. Main reason is the website has "read more" functionality, +;; which is not nice to have in RSS. + +(defun fv/format-rss-feed (title list) + "Generate RSS feed, as a string. +TITLE is the title of the RSS feed. LIST is an internal +representation for the files to include, as returned by +`org-list-to-lisp'. PROJECT is the current project." + (concat "#+TITLE: " title "\n" + "#+AUTHOR: Frederik Vanrenterghem\n" + "#+EMAIL: frederik@vanrenterghem.biz\n" + "#+OPTIONS: ^:nil\n" "\n" + (org-list-to-subtree list 1 '(:icount "" :istart "")))) + +(defun fv/format-rss-feed-entry (entry style project) + "Format ENTRY for the RSS feed. +ENTRY is a file name. STYLE is either 'list' or 'tree'. +PROJECT is the current project." + (cond ((not (directory-name-p entry)) + (let* ((file (org-publish--expand-file-name entry project)) + (title (org-publish-find-title entry project)) + (date (format-time-string "%Y-%m-%d %H:%M" (org-publish-find-date entry project))) + (link (concat (file-name-sans-extension entry) ".html"))) + (with-temp-buffer + (org-mode) + (insert (format "* [[file:%s][%s]]\n" file title)) + ;; add properties for `ox-rss.el' here + (org-set-property "RSS_PERMALINK" link) + (org-set-property "PUBDATE" date) + (org-set-property "RSS_TITLE" title) + ;; We simply chuck in the entire file. + ;; This assumes the file doesn't for instance start with a PROPERTIES drawer. + (insert-file-contents file) + ;; Ensure the list doesn't accidentally end due to blank lines at the end of + ;; entries. Still leaves problems when the entry has a double blank line in it + ;; as that ends an org list. + (goto-char (point-max)) + (delete-blank-lines) + (buffer-string)))) + ((eq style 'tree) + ;; Return only last subdir. + (file-name-nondirectory (directory-file-name entry))) + (t entry))) + (setq org-publish-project-alist `(("landing" :base-directory ,my-blog-source-folder @@ -245,7 +280,7 @@ representation for the files to include, as returned by :publishing-function org-mustache-html-publish-to-html :mustache-template ,(file-name-concat my-blog-mustache-folder "post.mustache") :preparation-function my-blog-create-tags-files - :exclude "html*\\|assets*\\|index.org\\|sitemap.org" ;"assets*\\|sitemap.org\\|index.org" ;; regexp + :exclude "html*\\|assets*\\|rss.org\\|index.org\\|sitemap.org" :html-content-class nil :section-numbers nil :with-toc nil @@ -295,16 +330,26 @@ representation for the files to include, as returned by ("rss" :base-directory ,my-blog-posts-folder :base-extension "org" + :recursive nil + :exclude ,(regexp-opt '("rss.org" "index.org" "sitemap.org")) :publishing-directory ,(file-name-concat my-blog-target-folder "posts") - :publishing-function org-rss-publish-to-rss + :publishing-function org-rss-publish-to-rss :with-author t :title "Frederik Vanrenterghem's blog" :html-link-home ,my-blog-target-url :html-link-use-abs-url t + :html-link-org-files-as-html t :section-numbers nil - :exclude ".*" - :include ("sitemap.org") + :exclude ".*" + :include ("rss.org") :table-of-contents nil + :auto-sitemap t + :sitemap-filename "rss.org" + :sitemap-title "Frederik Vanrenterghem's blog" + :sitemap-style list + :sitemap-sort-files anti-chronologically + :sitemap-function fv/format-rss-feed + :sitemap-format-entry fv/format-rss-feed-entry ) ("website" :components ("posts" "rss" "tags" "landing" "assets")))) diff --git a/source/index.org b/source/index.org index 237312e..a088e3d 100644 --- a/source/index.org +++ b/source/index.org @@ -25,7 +25,7 @@ was born and raised in Belgium, but except for a year back in 2013 where he live
  • - +
  • -- 2.39.5