Update source.org

This commit is contained in:
2025-11-20 16:32:06 +01:00
parent b0910578ce
commit cec99cbdac
70 changed files with 5295 additions and 3335 deletions

View File

@@ -12,200 +12,7 @@ Here's this week's [[./journal/w46-2025.org][journal]]!
** Habits
#+BEGIN_CENTER
/Today is Monday, 10th November./
/Today is Thursday, 20th November./
#+END_CENTER
#+BEGIN_SRC emacs-lisp :exports results :results value html :cache no
(defun akk0/org-to-html (org-string)
"Convert ORG-STRING to HTML."
(with-temp-buffer
(insert org-string)
(org-mode)
(org-export-as 'html nil nil t nil)))
(defun akk0/sort-habits (habit-alist)
"Sort habit-alist by a predefined order of custom-ids."
(let ((order '("dailies-blogging" "dailies-meditation" "dailies-french" "dailies-engineering"
"dailies-exercise" "dailies-drawing" "dailies-reading" "dailies-social")))
(sort (copy-sequence habit-alist)
(lambda (a b)
(let ((pos-a (or (cl-position (car a) order :test #'equal) 999))
(pos-b (or (cl-position (car b) order :test #'equal) 999)))
(< pos-a pos-b))))))
(defun akk0/extract-habits (file)
"Extract habits with date context from FILE.
Returns a list of plists with :custom-id, :todo-state, :date, :day-of-year."
(with-temp-buffer
(insert-file-contents file)
(org-mode)
(let (results)
(org-element-map (org-element-parse-buffer) 'headline
(lambda (hl)
(let ((custom-id (org-element-property :CUSTOM_ID hl))
(todo-state (org-element-property :todo-keyword hl)))
(when (and custom-id todo-state)
;; Get parent properties for context
(let* ((parent (org-element-property :parent hl))
(day-of-year (or (org-element-property :DAILIES-DAY parent)
(let ((grandparent (org-element-property :parent parent)))
(when grandparent
(org-element-property :DAILIES-DAY grandparent)))))
(body (org-element-interpret-data
(org-element-contents hl))))
(push (list :custom-id custom-id
:todo-state todo-state
:day-of-year day-of-year
:file file
:body body)
results))))))
(nreverse results))))
(defun akk0/extract-all-habits (files)
(mapcan #'akk0/extract-habits files))
(setq akk0/journal-files
(directory-files "~/Blog/org/journal/" t "^w.*\\.org$"))
(defun akk0/habits-alist (habits)
"Transform HABITS list into nested alists: custom-id → day-of-year → habit-data."
(let (result)
(dolist (habit habits)
(let* ((custom-id (plist-get habit :custom-id))
(day-of-year (plist-get habit :day-of-year))
(todo-state (plist-get habit :todo-state))
(body (plist-get habit :body))
;; Get the alist for this custom-id
(inner-alist (alist-get custom-id result nil nil #'equal))
;; Store full data instead of just todo-state
(habit-data (list :todo-state todo-state :body body :day-of-year day-of-year))
;; Update the inner alist
(updated-inner (cons (cons day-of-year habit-data) inner-alist)))
;; Update result
(setf (alist-get custom-id result nil nil #'equal) updated-inner)))
result))
(setq habit-alist (akk0/habits-alist (akk0/extract-all-habits akk0/journal-files)))
(defun akk0/get-habit-history (habit-alist custom-id day-number days-back window-size)
(let* ((inner-alist (alist-get custom-id habit-alist nil nil #'equal))
(result nil)
(all-states nil)
(score-for-state (lambda (state)
(cond ((equal state "NO") -1)
((equal state "YES") 1)
((equal state "EXCELLENT") 2)
(t 0)))))
(dotimes (i days-back)
(let* ((current-day (+ (- day-number days-back) i 1))
(current-day-str (number-to-string current-day))
(habit-data (alist-get current-day-str inner-alist nil nil #'equal))
(todo-state (if habit-data
(plist-get habit-data :todo-state)
"NODATA"))
(body (if habit-data
(plist-get habit-data :body)
""))
(doy (if habit-data
(plist-get habit-data :day-of-year)
""))
)
(push todo-state all-states)
(let* ((window-states (seq-take all-states window-size))
(rolling-score (apply #'+ (mapcar score-for-state window-states))))
(push (list :todo-state todo-state
:score (max 1 (min 5 (/ (+ rolling-score 5) 2)))
:body body
:doy doy)
result))))
(nreverse result)))
(defun akk0/habits-to-html-table (habit-alist day-number days-back window-size)
"Generate HTML table of habits with rolling scores.
Rows are custom-ids, columns are days."
(let ((color-map '(("NODATA" . "grey")
("YES" . "green")
("NO" . "red")
("FREED" . "purple")
("EXCELLENT" . "blue")))
(symbol-map '(("NODATA" . "")
("YES" . "")
("NO" . "×")
("FREED" . "")
("EXCELLENT" . "")))
(sorted-habits (akk0/sort-habits habit-alist))
(html ""))
;; Start table
(setq html (concat html "<table style='margin-left: auto; margin-right:auto; margin-bottom: 0.8rem;'>\n"))
;; Header row with day numbers
(setq html (concat html " <tr>\n <th></th>\n"))
(dotimes (i days-back)
(let ((day (+ (- day-number days-back) i 1)))
(setq html (concat
html
(cond ((= day day-number) "<th>●</th>")
((= 0 (% (- day day-number) 7)) "<th>○</th>")
(t "<th />"))))))
(setq html (concat html " </tr>\n"))
;; Data rows - one per habit
(dolist (entry sorted-habits)
(let* ((custom-id (car entry))
(history (akk0/get-habit-history habit-alist custom-id day-number days-back window-size)))
(setq html (concat html (format " <tr>\n <td style='padding-right: 20px; padding-top: 5px; padding-bottom: 5px;'><i>%s</i></td>\n" (capitalize (string-remove-prefix "dailies-" custom-id)))))
;; Cell for each day
(dolist (day-data history)
(let* ((todo-state (plist-get day-data :todo-state))
(score (plist-get day-data :score))
(body (plist-get day-data :body))
(doy (plist-get day-data :doy))
(body-html (if (and body (not (string-empty-p body)))
(akk0/org-to-html body)
""))
(color (alist-get todo-state color-map nil nil #'equal))
(symbol (alist-get todo-state symbol-map nil nil #'equal))
(class (format "habit-brightness-%d" score))
(style-var (format "--%s%d" color score))
(escaped-body (replace-regexp-in-string "\"" "&quot;"
(replace-regexp-in-string "\n" "&#10;" body-html)))
)
(setq html (concat html (format " <td class=\"%s habit-cell\" style=\"background-color:var(%s)\" data-body=\"%s\" onclick=\"showHabitPopup(this)\" data-doy=\"%s\" data-activity=\"%s\"
data-status=\"%s\">%s</td>\n"
class style-var
escaped-body
doy
custom-id
todo-state
symbol)))))
(setq html (concat html " </tr>\n"))))
;; End table
(setq html (concat html "</table>\n"))
html))
(akk0/habits-to-html-table habit-alist 314 30 5)
#+END_SRC
#+BEGIN_EXPORT html
<span class="center"><b>Key:</b>
<span style="color: var(--grey3);">Unknown</span> |
<span style="color: var(--red3);">× No</span> |
<span style="color: var(--green3);">● Yes</span> |
<span style="color: var(--blue3);">♦ Excellent</span> |
<span style="color: var(--purple3);">♣ Freed Up</span>
</span>
<hr />
<div class="habit-popup" id="habitPopup">
<div class="habit-popup-content" id="habitPopupContent">
<span class='center'><i>This section intentionally left blank.</i></span>
</div>
</div>
#+END_EXPORT
#+CALL: source.org:habit-tracker() :results value html :exports results

View File

@@ -1,7 +1,7 @@
#+TODO: NO(n) | YES(y) EXCELLENT(e) FREED(f)
#+title: Journal Week 46, 2025
#+BEGIN_CENTER
[[./w45-2025.org][Previous]] | [[./index.org][Index]]
[[./w45-2025.org][Previous]] | [[./index.org][Index]] | [[./w47-2025.org][Next]]
#+END_CENTER
* Journal Week 46, 2025
** Monday, 10th November :journal:
@@ -33,7 +33,7 @@ I want to start writing my Summer 2025 Anime Retrospective soon. I have my thoug
:PROPERTIES:
:CUSTOM_ID: dailies-drawing
:END:
**** NO Engineering
**** YES Engineering
:PROPERTIES:
:CUSTOM_ID: dailies-engineering
:END:
@@ -41,7 +41,191 @@ I want to start writing my Summer 2025 Anime Retrospective soon. I have my thoug
:PROPERTIES:
:CUSTOM_ID: dailies-french
:END:
**** NO Social
**** YES Social
:PROPERTIES:
:CUSTOM_ID: dailies-social
:END:
**** YES Exercise
:PROPERTIES:
:CUSTOM_ID: dailies-exercise
:END:
**** NO Reading
:PROPERTIES:
:CUSTOM_ID: dailies-reading
:END:
** Tuesday, 11th November :journal:
:PROPERTIES:
:DAILIES-YEAR: 2025
:DAILIES-DAY: 315
:END:
*** YES Journal :jentry:
:PROPERTIES:
:CUSTOM_ID: dailies-blogging
:END:
Happy St. Martin's/End of WWI!
Trying to sell our dry herb vaporizer --- cutting down weed consumption to once-every-few-months tier, and I notice I get much less full-spectrum effects vaporizing vs just smoking leading me to consume more --- but leboncoin took down our listing because something something drug paraphernalia. Nevermind that the product is legally for sale here, nevermind that there's legitimate non-drug uses for it, nevermind that the exact same product is for sale in other listings on leboncoin... of course contacting support for this kind of thing is pointless. Solveable problem but so much ado about nothing. On the flipside, we managed to sell our Roland GI-10 that we got for our [[../events/premier_impact.org][Premier Impact]] show. We bought it for €100 and sold it for €50, which I guess is alright for such an obsolete low-volume item.
This website now runs off [[https://redbean.dev/][Redbean]] (formerly lighttpd) --- one reason being that lighttpd's documentation is an unworkable mess (we were configuring caching) and another reason being that redbean is awesome. [[https://justine.lol/][Justine]] is awesome. On that note, CSS/JS /should/ now be cached for a day while HTML /should/ be uncached, I hope (HTTP caching is confusing).
Starting to get serious about practicing the electronic drum kit that's been standing in the corner for the past year and a half
#+BEGIN_CENTER
#+ATTR_HTML: :width 100%
#+CAPTION: /Tweaking the ergonomics on this thing is a lot of work./
[[../../static/images/journal/2025.11-drums.jpg]]
#+END_CENTER
I've started looking into the Linux FOSS music production stack again... provisional conclusions:
- *Zrythm* looks promising and afaict the backend is good, but the V1 frontend is unusably slow, with V2 in active development with a full GUI rewrite (GTK→QT) but still far from production-ready;
+ Side note: seems like almost nobody is writing major GUIs in GTK anymore, which is understandable given how dogshit GTK has become...
- *Ardour* is still Ardour, as far as I can tell it's a good DAW but just not designed for a MIDI-heavy workflow;
- *LMMS* seems to be under very active development (26 PRs last month according to their forums) but they haven't cut so much as an alpha release since 2020... Very strange, though I get the impression they /are/ working towards a release;
- Right now a primarily *No-DAW* stack still seems the most viable.
I'm gonna give [[https://ubuntustudio.org/][Ubuntu Studio]] another whirl tomorrow.
Still getting less-than-ideal sleep with a lot of nightmares, though it feels like things are starting to normalize a bit again, and at least my circadian rhythm is fine.
*** Habits :autocollapse:habits:
**** NO Meditation
:PROPERTIES:
:CUSTOM_ID: dailies-meditation
:END:
**** NO Drawing
:PROPERTIES:
:CUSTOM_ID: dailies-drawing
:END:
**** YES Engineering
:PROPERTIES:
:CUSTOM_ID: dailies-engineering
:END:
**** YES French
:PROPERTIES:
:CUSTOM_ID: dailies-french
:END:
**** YES Social
:PROPERTIES:
:CUSTOM_ID: dailies-social
:END:
**** YES Exercise
:PROPERTIES:
:CUSTOM_ID: dailies-exercise
:END:
**** NO Reading
:PROPERTIES:
:CUSTOM_ID: dailies-reading
:END:
** Friday, 14th November :journal:
:PROPERTIES:
:DAILIES-YEAR: 2025
:DAILIES-DAY: 318
:END:
*** YES Journal :jentry:
:PROPERTIES:
:CUSTOM_ID: dailies-blogging
:END:
Been pretty dead for a couple days... sleep issues. I'll try and be a bit more dilligent about always adding the journal entries, at least.
Started making a lot of refactors to the website.
*** Habits :autocollapse:habits:
**** YES Meditation
:PROPERTIES:
:CUSTOM_ID: dailies-meditation
:END:
**** NO Drawing
:PROPERTIES:
:CUSTOM_ID: dailies-drawing
:END:
**** EXCELLENT Engineering
:PROPERTIES:
:CUSTOM_ID: dailies-engineering
:END:
**** YES French
:PROPERTIES:
:CUSTOM_ID: dailies-french
:END:
**** YES Social
:PROPERTIES:
:CUSTOM_ID: dailies-social
:END:
**** YES Exercise
:PROPERTIES:
:CUSTOM_ID: dailies-exercise
:END:
**** NO Reading
:PROPERTIES:
:CUSTOM_ID: dailies-reading
:END:
** Saturday, 15th November :journal:
:PROPERTIES:
:DAILIES-YEAR: 2025
:DAILIES-DAY: 319
:END:
*** YES Journal :jentry:
:PROPERTIES:
:CUSTOM_ID: dailies-blogging
:END:
Good gym session today. Worked on formatting my Anki cards. Read about the Three Kingdoms period. Not much else to say.
*** Habits :autocollapse:habits:
**** YES Meditation
:PROPERTIES:
:CUSTOM_ID: dailies-meditation
:END:
**** NO Drawing
:PROPERTIES:
:CUSTOM_ID: dailies-drawing
:END:
**** FREED Engineering
:PROPERTIES:
:CUSTOM_ID: dailies-engineering
:END:
**** EXCELLENT French
:PROPERTIES:
:CUSTOM_ID: dailies-french
:END:
**** YES Social
:PROPERTIES:
:CUSTOM_ID: dailies-social
:END:
**** EXCELLENT Exercise
:PROPERTIES:
:CUSTOM_ID: dailies-exercise
:END:
**** YES Reading
:PROPERTIES:
:CUSTOM_ID: dailies-reading
:END:
** Sunday, 16th November :journal:
:PROPERTIES:
:DAILIES-YEAR: 2025
:DAILIES-DAY: 320
:END:
*** YES Journal :jentry:
:PROPERTIES:
:CUSTOM_ID: dailies-blogging
:END:
Two hours of drums practice today! Started feeling somewhat lethargic after that. Did a bunch of work reorganizing Hydrus.
*** Habits :autocollapse:habits:
**** NO Meditation
:PROPERTIES:
:CUSTOM_ID: dailies-meditation
:END:
**** NO Drawing
:PROPERTIES:
:CUSTOM_ID: dailies-drawing
:END:
**** FREED Engineering
:PROPERTIES:
:CUSTOM_ID: dailies-engineering
:END:
**** NO French
:PROPERTIES:
:CUSTOM_ID: dailies-french
:END:
**** YES Social
:PROPERTIES:
:CUSTOM_ID: dailies-social
:END:

54
org/journal/w47-2025.org Normal file
View File

@@ -0,0 +1,54 @@
#+TODO: NO(n) | YES(y) EXCELLENT(e) FREED(f)
#+TODO: TODO | DONE(d) CANCELLED(c)
#+title: Journal Week 47, 2025
#+BEGIN_CENTER
[[./w46-2025.org][Previous]] | [[./index.org][Index]]
#+END_CENTER
* Journal Week 47, 2025
** Thursday, 20th November 2025
:PROPERTIES:
:DAILIES-YEAR: 2025
:DAILIES-DAY: 324
:END:
*** NO Journal
:PROPERTIES:
:CUSTOM_ID: dailies-blogging
:END:
Oof I have not been good about updating the journal again.
**** Daily Planning
***** TODO Rework "looking for work" page
***** TODO Rework habits??
***** TODO Get akk0{at}webbieweb{dot}org email working again
*** Habits :autocollapse:
**** NO Meditation
:PROPERTIES:
:CUSTOM_ID: dailies-meditation
:END:
**** NO Drawing
:PROPERTIES:
:CUSTOM_ID: dailies-drawing
:END:
**** NO Engineering
:PROPERTIES:
:CUSTOM_ID: dailies-engineering
:END:
**** NO French
:PROPERTIES:
:CUSTOM_ID: dailies-french
:END:
**** NO Social
:PROPERTIES:
:CUSTOM_ID: dailies-social
:END:
**** NO Exercise
:PROPERTIES:
:CUSTOM_ID: dailies-exercise
:END:
**** NO Reading
:PROPERTIES:
:CUSTOM_ID: dailies-reading
:END:

View File

@@ -1,11 +1,13 @@
#+TITLE: Sitemap for project pages
- [[file:source.org][Webbieweb.org Sources]]
- [[file:index.org][Index]]
- [[file:todo.org][To Do]]
- [[file:about.org][About]]
- [[file:friends.org][Friends]]
- [[file:journal/index.org][Journal]]
- [[file:journal/w47-2025.org][Journal Week 47, 2025]]
- [[file:journal/w46-2025.org][Journal Week 46, 2025]]
- [[file:journal/w41-2025.org][Journaly Week 41, 2025]]
- [[file:journal/w44-2025.org][Journal Week 44, 2025]]
@@ -33,10 +35,10 @@
- [[file:events/wroclaw.org][Wrocław/Millennium Strike]]
- [[file:work/index.org][Work]]
- [[file:work/looking_for_work.org][Looking for Work]]
- [[file:work/portfolio.org][Portfolio]]
- [[file:work/toshokan_retrospective.org][Toshokan Retrospective]]
- [[file:work/eris_retrospective.org][Eris Retrospective]]
- [[file:work/looking_for_work.org][Looking for Work]]
- [[file:work/crypto_contracting_reflections.org][Reflections on Independent Contracting in the Cryptocurrency Sector (2021-2022)]]
- [[file:other/index.org][Other]]

1093
org/source.org Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -1,7 +1,7 @@
#+title: Looking for Work
* Looking for Work
** About Me
I'm Akk0, long-term enthusiast software developer, sysadmin, freelancer and this website's webmaster. I've been at this computer thing for a while --- my first =dist-upgrade= was Linux Mint 15 "Olivia" in 2013 --- and I am currently actively looking for work on a freelance, contract or part-time basis, full remote or partially on-site in the Paris area[fn::Although do mind that my French skills albeit improving are still rather minimal.]; I also accept full-time offers.
I'm Akk0, long-term enthusiast software developer, sysadmin, freelancer and this website's webmaster. I've been at this computer thing for a while --- my first =dist-upgrade= was Linux Mint 15 "Olivia" in 2013 --- and I am currently actively looking for work on a freelance, contract or part-time basis, full remote or partially on-site in the Paris area[fn::Although do mind that my French skills albeit improving are still rather minimal.]. I am also open to regular full-time positions at interesting copmanies.
In order to rapidly build connections and get the ball rolling, I am currently offering my skills at a low, flat rate of /€30 per hour./ Additionally, I am offering *2 hours* of /no strings attached free labour/ to anyone reading this /for free/ --- please do keep reading!
** Services Offered