Adds dates, fixes orders of posts

This commit is contained in:
2024-10-13 17:15:21 -04:00
parent 11cb9f387e
commit 54961ebd1e
3 changed files with 252 additions and 185 deletions

9
assets/wfot.css Normal file
View File

@@ -0,0 +1,9 @@
.post-item {
display: flex;
}
.post-date {
display: block;
margin-right: 16px;
min-width: 100px;
}

362
one.org
View File

@@ -6,55 +6,6 @@
Here's what I'm thinking... Here's what I'm thinking...
* HTTPS @ Homelab
:PROPERTIES:
:ONE: wfot-default
:CUSTOM_ID: /large-companies/
:END:
I run a lot of services at home.
This includes, but isn't limited to
- [[https://archivebox.io/][ArchiveBox]]
- [[https://github.com/dani-garcia/vaultwarden][VaultWarden]]
- [[https://github.com/navidrome/navidrome][Navidrome]]
- [[https://plex.tv][Plex]]
- [[https://github.com/LibrePhotos/librephotos][LibrePhotos]]
- This blog
and a lot more.
Pretty much anything that's served up over HTTP is always nice if not
necessary to have behind TLS.
[[https://letsencrypt.org/][LetsEncrypt]] long ago brought free certs to
the masses and there are a lot of tools for automating that nowadays.
My preferred approach for getting all the unnecessary nonsense I
self-host at home behind TLS is [[https://caddyserver.com][Caddy]].
I have a super straight forward setup, generally:
- Run Caddy in a docker container
- Create a wildcard CNAME record in my DNS pointing at my home's
(effectively) static IP
- Add an entry in my Caddyfile for each services I'm running at home on
its own subdomain
- If it's a service then I add it with a =reverse_proxy= block
- If it's a static site (like this) then there's a block for
- If it's something I want only accessible on my home network then I put
a block like
#+BEGIN_EXAMPLE
@local_network {
path *
remote_ip
}
#+END_EXAMPLE
in the directive. And voila.
Then tell Caddy to reload the config and I'm done.
* Multi-room audio setup * Multi-room audio setup
:PROPERTIES: :PROPERTIES:
:ONE: wfot-default :ONE: wfot-default
@@ -101,44 +52,60 @@ I'd like to get the podcast experience to a more seamless place but it's
pretty OK right now using AirMusic on my phone to play audio to the pretty OK right now using AirMusic on my phone to play audio to the
speakers over AirPlay. speakers over AirPlay.
* vi-editing everywhere * HTTPS @ Homelab
:PROPERTIES: :PROPERTIES:
:ONE: wfot-default :ONE: wfot-default
:CUSTOM_ID: /vi-everywhere/ :DATE: 2022-11-08
:CUSTOM_ID: /large-companies/
:END: :END:
I run a lot of services at home.
For my sake, I prefer to have Vim bindings in as many places as This includes, but isn't limited to
possible.
Most shells can be configured to use Vim bindings by putting =set -o vi= - [[https://archivebox.io/][ArchiveBox]]
somewhere in your shell startup script. - [[https://github.com/dani-garcia/vaultwarden][VaultWarden]]
- [[https://github.com/navidrome/navidrome][Navidrome]]
- [[https://plex.tv][Plex]]
- [[https://github.com/LibrePhotos/librephotos][LibrePhotos]]
- This blog
If you're using ZSH then you'll probably want an additional binding to and a lot more.
restore CTRL-R reverse history search.
=bindkey '^R' history-incremental-search-backward= Pretty much anything that's served up over HTTP is always nice if not
necessary to have behind TLS.
For CLI tools that use the =readline= library then you can configure its [[https://letsencrypt.org/][LetsEncrypt]] long ago brought free certs to
input mode using a =.inputrc= file in your =$HOME= directory. the masses and there are a lot of tools for automating that nowadays.
This affects REPLs like =ghci= and tools like =psql=. My preferred approach for getting all the unnecessary nonsense I
self-host at home behind TLS is [[https://caddyserver.com][Caddy]].
#+begin_src txt I have a super straight forward setup, generally:
set editing-mode vi
$if mode=vi
set keymap vi-command - Run Caddy in a docker container
# these are for vi-command mode - Create a wildcard CNAME record in my DNS pointing at my home's
Control-l: clear-screen (effectively) static IP
- Add an entry in my Caddyfile for each services I'm running at home on
its own subdomain
- If it's a service then I add it with a =reverse_proxy= block
- If it's a static site (like this) then there's a block for
- If it's something I want only accessible on my home network then I put
a block like
set keymap vi-insert #+BEGIN_EXAMPLE
# these are for vi-insert mode @local_network {
Control-l: clear-screen path *
$endif remote_ip
#+end_src }
#+END_EXAMPLE
in the directive. And voila.
Then tell Caddy to reload the config and I'm done.
* AWS Cloudwatch Metric Filters * AWS Cloudwatch Metric Filters
:PROPERTIES: :PROPERTIES:
:ONE: wfot-default :ONE: wfot-default
:DATE: 2022-11-12
:CUSTOM_ID: /large-companies/ :CUSTOM_ID: /large-companies/
:END: :END:
@@ -192,9 +159,65 @@ of your application code to take advantage of. Cloudwatch Metrics is one
of those services and you can get a lot of value out of it with not much of those services and you can get a lot of value out of it with not much
effort. effort.
* vi-editing everywhere
:PROPERTIES:
:ONE: wfot-default
:DATE: 2022-11-13
:CUSTOM_ID: /vi-everywhere/
:END:
For my sake, I prefer to have Vim bindings in as many places as
possible.
Most shells can be configured to use Vim bindings by putting =set -o vi=
somewhere in your shell startup script.
If you're using ZSH then you'll probably want an additional binding to
restore CTRL-R reverse history search.
=bindkey '^R' history-incremental-search-backward=
For CLI tools that use the =readline= library then you can configure its
input mode using a =.inputrc= file in your =$HOME= directory.
This affects REPLs like =ghci= and tools like =psql=.
#+begin_src txt
set editing-mode vi
$if mode=vi
set keymap vi-command
# these are for vi-command mode
Control-l: clear-screen
set keymap vi-insert
# these are for vi-insert mode
Control-l: clear-screen
$endif
#+end_src
* The problem with large companies
:PROPERTIES:
:ONE: wfot-default
:DATE: 2024-09-20
:CUSTOM_ID: /large-companies/
:END:
Organizing people is a difficult problem which only gets more difficult as youmore people need to be organized.
The larger a company is the more of its internal structures, rules, policies, history, etc are devoted _just_ to organizing people.
For me, realizing this was like the first time you hear a flourescent light buzzing in an otherwise quiet room.
Reasonable people can differ on this point, but for my own sake I'd much rather avoid all the people-organizing baggage that comes with large companies.
I don't have a hard-and-fast rule about the size of a place I want to work but the larger a place is then generally the more reason I need to want to be there.
Of course, this is all kind of theoretical at this point, as [[https://flipstone.com][Flipstone]] is my forever home.
* Simple CSS frameworks * Simple CSS frameworks
:PROPERTIES: :PROPERTIES:
:ONE: wfot-default :ONE: wfot-default
:DATE: 2024-09-29
:CUSTOM_ID: /simple-css-frameworks/ :CUSTOM_ID: /simple-css-frameworks/
:END: :END:
@@ -214,6 +237,7 @@ Using tacit is a matter of incluing this link tag in the page's HEAD element:
* Let people fail * Let people fail
:PROPERTIES: :PROPERTIES:
:ONE: wfot-default :ONE: wfot-default
:DATE: 2024-10-02
:CUSTOM_ID: /let-people-fail/ :CUSTOM_ID: /let-people-fail/
:END: :END:
@@ -239,27 +263,108 @@ I'm _not_ saying all collaboration _requires_ building trust. There are times wh
What I am saying is that people frequently misjudge the value in deliberately giving others the space to fail for the sake of fostering trust. What I am saying is that people frequently misjudge the value in deliberately giving others the space to fail for the sake of fostering trust.
Building trust is important and we should do it deliberately. Building trust is important and we should do it deliberately.
* The problem with large companies * TODO Managing Expectations
:PROPERTIES: :PROPERTIES:
:ONE: wfot-default :ONE: wfot-default
:CUSTOM_ID: /large-companies/ :DATE: 2024-10-04
:CUSTOM_ID: /managing-expectations/
:END: :END:
Organizing people is a difficult problem which only gets more difficult as youmore people need to be organized. :DRAFT:
The larger a company is the more of its internal structures, rules, policies, history, etc are devoted _just_ to organizing people. I'll figure this out one day. Until then I'll just keep saying yes and burning myself out making everyone happy.
:END:
For me, realizing this was like the first time you hear a flourescent light buzzing in an otherwise quiet room. * TODO Tools I love
:PROPERTIES:
:ONE: wfot-default
:DATE: 2024-10-07
:CUSTOM_ID: /tools-i-love/
:END:
Reasonable people can differ on this point, but for my own sake I'd much rather avoid all the people-organizing baggage that comes with large companies. I work on a computer all day. I do things from query databases, making
a lot of HTTP API calls, parsing, transforming and generally munging
structured and unstructured data of all kinds. I edit and compile
code. I remote into servers and automate a lot of my daily tasks. I
take, organize, search and refine notes.
I don't have a hard-and-fast rule about the size of a place I want to work but the larger a place is then generally the more reason I need to want to be there. I prefer terminal-based tools because I can use them on any of my
machines remotely without much hassle. I also find that I'm just more
efficient with text-input and keyboard driven interactions, especially
if modal editing is available.
Of course, this is all kind of theoretical at this point, as [[https://flipstone.com][Flipstone]] is my forever home. Fortunately for me we're the golden age of terminal-based tools, IMHO.
Anyway, with all that said, I present the long list of tools I use daily and why I like them:
** Arch Linux
I won't go into too much detail here. Rolling release, Arch Wiki and
AUR. I run Arch with ZFS on 4 machines. My desktop install is over 10
years old at this point. I rarely encounter any sort of bleeding edge
breakage that people seem to think is common with Arch.
** KDE Plasma
It has just enough shortcuts for window management that I can do 90%
of what I would do with tiling WMs like i3 and Sway and I prefer not
having to spend time configuring one of the various i3bar-etc
applications to get the system tray and all that working right.
KDE just works, it looks nice and lets me configure it as much as I want.
I do find myself WM/DE-curious and I try other things from time to
time. [[https://github.com/paperwm/PaperWM][PaperWM]] is on my short list to try out.
** Emacs
Won't elaborate here much either - I like Emacs mostly because of Evil
mode and Org mode but there is a long-tail of other packages and
configurability that also make me prefer it over Vim or Neovim.
I still use Neovim for quick one-off edits from time to time but 90%
of my day is spent in Emacs.
I think newer editors like Helix are interesting, but without full Org
mode support I couldn't imagine switching.
** Nushell
[[https://www.nushell.sh/][Nushell]] is a modern shell written in Rust with first class support for
structured data, syntax and semantics that draw a nice balance between
reasonable programming language and an ergonomic shell UX.
I find myself being willing to automate more complex tasks using
Nushell than I would with Z shell or Bash.
** VisiData
[[https://www.visidata.org/][VisiData]] is a nice terminal spreadsheet and CSV tool. I don't have to
_create_ a lot of spreadsheets but I do have to find data in them and
CSVs often enough, for work, that having something that fits my normal
workflow here is really nice.
While I don't think VisiData will write to XLSX files, it will let you
edit sheets and save them as CSV or TSV.
This tool was the initial motivation for writing this post.
** Konsole
Nothing super interesting to say about it. It just works.
All the modern terminals are nice, I like WezTerm, Alacritty and
Kitty. I switch between them for one reason or another at different
times, but I currently have Konsole bound to my terminal shortcut in
KDE so it's my terminal of choice.
** TODO Unison
** Firefox
There's not a whole lot, I think, that differentiates the browsers from one another these days
** Chrome Emacs
[[https://addons.mozilla.org/en-US/firefox/addon/chrome-emacs/?utm_source=addons.mozilla.org&utm_medium=referral&utm_content=search][Chrome Emacs]] is both a Chrome and Firefox extension that lets you
pretty seamlessly edit text areas in your browser from within
Emacs. Since I find myself [[#/job-description/][writing a lot at work]] these days, it's nice
to be able to edit story details in [[https://www.shorcut.com][Shortcut]] from Emacs with nice
modal editing.
** TODO Syncthing
* TODO Just what is it you do here? * TODO Just what is it you do here?
:PROPERTIES: :PROPERTIES:
:ONE: wfot-default :ONE: wfot-default
:DATE: 2024-10-08
:CUSTOM_ID: /job-description/ :CUSTOM_ID: /job-description/
:END: :END:
@@ -363,100 +468,3 @@ have helped with this immensely.
However, at the same time we've grown the development team so now my However, at the same time we've grown the development team so now my
other responsibility of feeding the machine (i.e. writing stories) has other responsibility of feeding the machine (i.e. writing stories) has
chipped away at some of the focus gains I've made. chipped away at some of the focus gains I've made.
* TODO Managing Expectations
:PROPERTIES:
:ONE: wfot-default
:CUSTOM_ID: /managing-expectations/
:END:
:DRAFT:
I'll figure this out one day. Until then I'll just keep saying yes and burning myself out making everyone happy.
:END:
* TODO Tools I love
:PROPERTIES:
:ONE: wfot-default
:CUSTOM_ID: /tools-i-love/
:END:
I work on a computer all day. I do things from query databases, making
a lot of HTTP API calls, parsing, transforming and generally munging
structured and unstructured data of all kinds. I edit and compile
code. I remote into servers and automate a lot of my daily tasks. I
take, organize, search and refine notes.
I prefer terminal-based tools because I can use them on any of my
machines remotely without much hassle. I also find that I'm just more
efficient with text-input and keyboard driven interactions, especially
if modal editing is available.
Fortunately for me we're the golden age of terminal-based tools, IMHO.
Anyway, with all that said, I present the long list of tools I use daily and why I like them:
** Arch Linux
I won't go into too much detail here. Rolling release, Arch Wiki and
AUR. I run Arch with ZFS on 4 machines. My desktop install is over 10
years old at this point. I rarely encounter any sort of bleeding edge
breakage that people seem to think is common with Arch.
** KDE Plasma
It has just enough shortcuts for window management that I can do 90%
of what I would do with tiling WMs like i3 and Sway and I prefer not
having to spend time configuring one of the various i3bar-etc
applications to get the system tray and all that working right.
KDE just works, it looks nice and lets me configure it as much as I want.
I do find myself WM/DE-curious and I try other things from time to
time. [[https://github.com/paperwm/PaperWM][PaperWM]] is on my short list to try out.
** Emacs
Won't elaborate here much either - I like Emacs mostly because of Evil
mode and Org mode but there is a long-tail of other packages and
configurability that also make me prefer it over Vim or Neovim.
I still use Neovim for quick one-off edits from time to time but 90%
of my day is spent in Emacs.
I think newer editors like Helix are interesting, but without full Org
mode support I couldn't imagine switching.
** Nushell
[[https://www.nushell.sh/][Nushell]] is a modern shell written in Rust with first class support for
structured data, syntax and semantics that draw a nice balance between
reasonable programming language and an ergonomic shell UX.
I find myself being willing to automate more complex tasks using
Nushell than I would with Z shell or Bash.
** VisiData
[[https://www.visidata.org/][VisiData]] is a nice terminal spreadsheet and CSV tool. I don't have to
_create_ a lot of spreadsheets but I do have to find data in them and
CSVs often enough, for work, that having something that fits my normal
workflow here is really nice.
While I don't think VisiData will write to XLSX files, it will let you
edit sheets and save them as CSV or TSV.
This tool was the initial motivation for writing this post.
** Konsole
Nothing super interesting to say about it. It just works.
All the modern terminals are nice, I like WezTerm, Alacritty and
Kitty. I switch between them for one reason or another at different
times, but I currently have Konsole bound to my terminal shortcut in
KDE so it's my terminal of choice.
** TODO Unison
** Firefox
There's not a whole lot, I think, that differentiates the browsers from one another these days
** Chrome Emacs
[[https://addons.mozilla.org/en-US/firefox/addon/chrome-emacs/?utm_source=addons.mozilla.org&utm_medium=referral&utm_content=search][Chrome Emacs]] is both a Chrome and Firefox extension that lets you
pretty seamlessly edit text areas in your browser from within
Emacs. Since I find myself [[#/job-description/][writing a lot at work]] these days, it's nice
to be able to edit story details in [[https://www.shorcut.com][Shortcut]] from Emacs with nice
modal editing.
** TODO Syncthing

View File

@@ -10,7 +10,7 @@
(pico-fluid . "https://cdn.jsdelivr.net/npm/@picocss/pico@2/css/pico.fluid.classless.min.css") (pico-fluid . "https://cdn.jsdelivr.net/npm/@picocss/pico@2/css/pico.fluid.classless.min.css")
(pico . "https://cdn.jsdelivr.net/npm/@picocss/pico@2/css/pico.classless.min.css"))) (pico . "https://cdn.jsdelivr.net/npm/@picocss/pico@2/css/pico.classless.min.css")))
(setq wfot-css (alist-get 'pico-amber wfot-styles)) (setq primary-css (alist-get 'pico-amber wfot-styles))
(defun wfot-default (page-tree pages _global) (defun wfot-default (page-tree pages _global)
"willfullyobtuse default render function "willfullyobtuse default render function
@@ -28,7 +28,8 @@
`(:html `(:html
(:head (:head
(:meta (@ :name "viewport" :content "width=device-width,initial-scale=1")) (:meta (@ :name "viewport" :content "width=device-width,initial-scale=1"))
(:link (@ :rel "stylesheet" :href wfot-css)) (:link (@ :rel "stylesheet" :href primary-css))
(:link (@ :rel "stylesheet" :href "wfot.css"))
(:title ,title)) (:title ,title))
(:body (:body
(:header (:a (@ :href "/") ,website-name)) (:header (:a (@ :href "/") ,website-name))
@@ -51,13 +52,14 @@ Also see `one-render-pages' and `one-default-css'."
'one-ox nil)) 'one-ox nil))
(website-name (one-default-website-name pages)) (website-name (one-default-website-name pages))
;; All pages but the home pages ;; All pages but the home pages
(pages-list (one-default-pages pages "/.+"))) (pages-list (wfot-default-pages pages "/.+")))
(jack-html (jack-html
"<!DOCTYPE html>" "<!DOCTYPE html>"
`(:html `(:html
(:head (:head
(:meta (@ :name "viewport" :content "width=device-width,initial-scale=1")) (:meta (@ :name "viewport" :content "width=device-width,initial-scale=1"))
(:link (@ :rel "stylesheet" :type "text/css" :href wfot-css)) (:link (@ :rel "stylesheet" :href primary-css))
(:link (@ :rel "stylesheet" :href "wfot.css"))
(:title ,title)) (:title ,title))
(:body (:body
(:header (:a (@ :href "/") ,website-name)) (:header (:a (@ :href "/") ,website-name))
@@ -65,6 +67,52 @@ Also see `one-render-pages' and `one-default-css'."
(:div/home-list-pages ,content) (:div/home-list-pages ,content)
(:div/pages (:ul ,(reverse pages-list))))))))) (:div/pages (:ul ,(reverse pages-list)))))))))
(defun wfot-default-pages (pages &optional filter)
"Return `jack-html' list of PAGES component.
If FILTER is non-nil, a page is listed only when its path (value
of `:one-path' property) matches FILTER regexp.
Evaluating the following form
(wfot-default-pages
\\='((:one-title \"HOME\" :one-path \"/\")
(:one-title \"FOO-1\" :one-path \"/foo-1/\")
(:one-title \"FOO-2\" :one-path \"/foo-2/\")))
returns:
(:ul
(:li (:a (@ :href \"/\") \"HOME\"))
(:li (:a (@ :href \"/foo-1/\") \"FOO-1\"))
(:li (:a (@ :href \"/foo-2/\") \"FOO-2\")))
And evaluating the following form with the filter \"/.+\"
(wfot-default-pages
\\='((:one-title \"HOME\" :one-path \"/\")
(:one-title \"FOO-1\" :one-path \"/foo-1/\")
(:one-title \"FOO-2\" :one-path \"/foo-2/\"))
\"/.+\")
returns a list which doesn't include the home page:
(:ul
(:li (:a (@ :href \"/foo-1/\") \"FOO-1\"))
(:li (:a (@ :href \"/foo-2/\") \"FOO-2\")))"
(when-let ((li-items
(delq nil
(mapcar
(lambda (page)
(let ((href (plist-get page :one-path))
(title (plist-get page :one-title))
(date (org-element-property :DATE (plist-get page :one-page-tree))))
(when (string-match-p (or filter ".*") href)
`(:li (@ :class "post-item") (:div (@ :class "post-date") ,date) (:a (@ :href ,href) (:span ,title)) ))))
pages))))
`(:ul ,@li-items)))
(defun wfot-default-home (page-tree pages _global) (defun wfot-default-home (page-tree pages _global)
"Default render function to use in the home page. "Default render function to use in the home page.
@@ -81,7 +129,8 @@ Also see `one-render-pages' and `one-default-css'."
`(:html `(:html
(:head (:head
(:meta (@ :name "viewport" :content "width=device-width,initial-scale=1")) (:meta (@ :name "viewport" :content "width=device-width,initial-scale=1"))
(:link (@ :rel "stylesheet" :type "text/css" :href wfot-css)) (:link (@ :rel "stylesheet" :href primary-css))
(:link (@ :rel "stylesheet" :href "wfot.css"))
(:title ,title)) (:title ,title))
(:body (:body
(:header ,website-name) (:header ,website-name)
@@ -108,14 +157,14 @@ in the HTML string.
This function is meant to be used by `one-default-with-sidebar' This function is meant to be used by `one-default-with-sidebar'
and `one-default-doc' render functions. and `one-default-doc' render functions.
See `one-render-pages', `one-default-css' and `one-default-pages'." See `one-render-pages', `one-default-css' and `wfot-default-pages'."
(let* ((title (org-element-property :raw-value page-tree)) (let* ((title (org-element-property :raw-value page-tree))
(path (org-element-property :CUSTOM_ID page-tree)) (path (org-element-property :CUSTOM_ID page-tree))
(content (org-export-data-with-backend (content (org-export-data-with-backend
(org-element-contents page-tree) (org-element-contents page-tree)
'one-ox nil)) 'one-ox nil))
(website-name (one-default-website-name pages)) (website-name (one-default-website-name pages))
(pages-list (one-default-pages pages)) (pages-list (wfot-default-pages pages))
(headlines (cdr (one-default-list-headlines page-tree))) (headlines (cdr (one-default-list-headlines page-tree)))
(toc (one-default-toc-component headlines)) (toc (one-default-toc-component headlines))
(nav (one-default-nav path pages))) (nav (one-default-nav path pages)))
@@ -124,7 +173,8 @@ See `one-render-pages', `one-default-css' and `one-default-pages'."
`(:html `(:html
(:head (:head
(:meta (@ :name "viewport" :content "width=device-width,initial-scale=1")) (:meta (@ :name "viewport" :content "width=device-width,initial-scale=1"))
(:link (@ :rel "stylesheet" :type "text/css" :href wfot-css)) (:link (@ :rel "stylesheet" :href primary-css))
(:link (@ :rel "stylesheet" :href "wfot.css"))
(:title ,title)) (:title ,title))
(:body (:body
;; sidebar-left and sidebar-main are for small devices ;; sidebar-left and sidebar-main are for small devices