Blog Posts

Tech Posts   tech

Site redesign, new home!

Date: 2023-03-07 Welcome to our new site! This has been a full redesign as we transfer our writings from hugo to org-mode. Hugo is a great project, but it's massive overkill for what we need for our little site here. We love org mode immensely, and decided that moving our site into it would be a great project for expanding our knowledge of how that tool works.

This all is still in the works, things will likely be moved around more in the future. Currently there is not an RSS feed for the site. Getting org-mode to generate one is very possible, but it will take us time to explore and grok the system before we can actually implement one. But also we've considered the fact that we don't necessarily need one. This is a hobby site for us and we will be better served psychologically by doing what we love with it rather than things we feel we ought to do.

Searching the Internet with Privacy

TL;DR

duckduckgo is the standard go to for privacy respecting search engine. It is the most like what people are used to.

Searx is another option. It is pretty easy to use, but there are many different places to find it.

Search Engines

There are so many search engines out there. I'm not going to go through a list because others have done it better than I could given my time restraints. This article lists a good number of privacy respecting search engines: ItsFoss: Privacy Respecting Search Engines.

In this space here I'd like to contemplate together what search engines offer us, and what other tools we might make together that might better serve the needs we have defaulted to using big search engines for.

Beyond Search Engines: Why Search?

What do you search for typically? Here's mine:

  • troubleshooting some device or tool (e.g. )
  • website that I forgot the address for
  • quick facts

Think of the other places that you use search. Any social media site you use has a search option. Wikipedia has it's own search tool. I often end up on the website StackOverflow when troubleshooting things on my computers. It would be better for me privacy wise if I just went to that website directly and searched my question on their platform rather than searching it on Duckduckgo only to click on the top link to StackOverflow. By searching on Duckduckgo, both companies can track what I was looking for; if I went directly to StackOverflow, only one company would.

This is one way we can shift our searching habits to be more privacy respecting, and quite possibly more useful. We can also go a step further and cultivate our own personal respositories of knowledge!

Creating your own searchable repository of information

What do you do when you come across a link to a useful website or resource on social media? Too many times I have shared it as appropriate, and then found myself months later recalling the resource and wanting to view it again, only to be unable to find it.

This habit of assuming I could easily find anything I wanted via a search engine turned out to be really frustrating. So I started writing such things down. I have a file on my computer that I put such things in. That way if people ever ask me for certain kinds of resources, I don't have to go searching on the internet, I already have a list I can copy and paste into whatever platform we are communicating on. Or I can search that document for my own reference.

I was reading in my local paper earlier this week about a Needle Exchange Service in a neighboring county. I copied the information down in my file for future reference. Just now I attempted to search for this information on that county's website. I can't find it. Even in a quick exercise for this blog post I have found a situation where searching did not give me the information I was looking for, but I have it in my notes.

Please don't just consider the privacy implication of the search engines you use. Consider also how you might collect and preserve information in a way that is more useful to you in the long run. And even how that might be useful for your community, or who in your community has important knowledge about how to access various resources.

Org Capture Templates for Block Scheduling   emacs orgmode

Intro

Yesterday I spent several hours hacking away on trying to set up some custom capture templates in Org-Mode trying to streamline my daily block scheduling. I'm not sure what my goal with this post is, I've assumed my audience has not much familiarity with Emacs so it might read a little patronizing. But that's the kind of post I wish I was able to find as I was first exploring Emacs, so that's what I'm doing.

The format for the capture templates is pretty well explained in the documentation, but I really struggled to get it to work properly. A good chunk of that was me messing up syntax, but there was also a fair bit of work I had to do on conceptualizing and actually structuring the template for my uses as well.

So! Onto the code, and I'll point out the stuff that tripped me up along the way.

N.B. Some part of my stack is doing something janky with the code blocks below and overriding my css for the background color of the code blocks. My todo list this morning has working on this blog post, not figuring out that junk :P.

The Code

Org Capture Templates are lists structured like this:

(key description type target template properties)

It looks like a lot but I think it's straight forward once you start building one. key and description are the items that will be displayed to the user. type tells Emacs what kind of thing this template is making. target tells Emacs where to put it, and template is what you want Emacs to write down. properties are extra options, we can ignore it for now.

Let's look at the example given in the documentation:

(setq org-capture-templates
      '(("t"
         "Todo"
         entry
         (file+headline "~/org/gtd.org" "Tasks")
         "* TODO %?\n  %i\n  %a")

        ("j"
         "Journal"
         entry
         (file+datetree "~/org/journal.org")
         "* %?\nEntered on %U\n  %i\n  %a")))

The first line, (setq org-capture-templates, is just the bit of elisp that is telling emacs to set a variable. We're setting the variable org-capture-templates.

Right below that are the lists of templates being set. In the first one the key and description are "t" "Todo". The key is what you press on the keyboard to select that template. The type for both of these templates is entry. There are several other kinds but I haven't used any of them yet. Both of these targets indicate a file (identified by the first string); the first one uses +headline to point to a unique headline in the file, and the second uses +datetree to tell Emacs to find (or create if not already there) the headline for the appropriate date, defaulting to today if not specified. The string in double quotes (") after that is the template itself, the text that will be put in the appropriate file.

The percent signs indicate expansion that Emacs will do. The coolest one is the %a escape, it includes a link back to the place you were when you called the capture template from. This is what makes all of this a "capture". I can open up the file where I have all my projects and their individual todo tasks, point to a particular task I want to do sometime this week and use a capture template to put it in my block schedule with a link. That way when it comes time to work on it I can just look at my schedule and click the link to go directly to the exact spot in the file I need to start doing the work! How cool is that?

So that is the structure of a generic template, here are the templates I made for my block scheduling:

(setq org-capture-templates
     '(("s" "Block Schedule Templates")
       ("s1"
        "05:00 - 09:00"
        entry
        (file+datetree "~/org/blockschedule.org" )
        "* [ ] %a%?\nSCHEDULED:
        <%(org-read-date nil nil org-read-date-final-answer) 05:00-09:00>"
        :time-prompt t)

       ("s2"
        "09:00 - 12:00"
        entry
        (file+datetree "~/org/blockschedule.org" )
        "* [ ] %a%?\nSCHEDULED:
        <%(org-read-date nil nil org-read-date-final-answer) 09:00-12:00>"
        :time-prompt t)

       ("s3"
        "12:00 - 15:00"
        entry
        (file+datetree "~/org/blockschedule.org" )
        "* [ ] %a%?\nSCHEDULED:
        <%(org-read-date nil nil org-read-date-final-answer) 12:00-15:00>"
        :time-prompt t)

       ("s4"
        "15:00 - 18:00"
        entry
        (file+datetree "~/org/blockschedule.org" )
        "* [ ] %a%?\nSCHEDULED:
        <%(org-read-date nil nil org-read-date-final-answer) 15:00-18:00>"
        :time-prompt t)

       ("s5"
        "18:00 - 21:00"
        entry
        (file+datetree "~/org/blockschedule.org" )
        "* [ ] %a%?\nSCHEDULED:
        <%(org-read-date nil nil org-read-date-final-answer) 18:00-21:00>"
        :time-prompt t)
       ))

Some of the have two letters for the key, that just means first I press s and then the appropriate number. Emacs automagically turns that into a nice little sub-menu.

The :time-prompt property was one of the bits that gave me a lot of trouble. It makes it so that a calendar pops up in Emacs so you can select time and day. When I tried to include it Emacs kept throwing errors when I tried to use the capture template. Eventually as I was searching the internet about this issue I ran accross this reddit thread where people were sharing capture templates. I saw someone had used the :time-prompt property but also included the t boolean. I had just assumed because the :time-prompt property was clearly boolean simply providing it was enough to assume that I wanted to turn it on haha.

One other bit was difficult, but I found my answer much more easily.

SCHEDULED: <%(org-read-date nil nil org-read-date-final-answer) 18:00-21:00>

I wanted to include the date in the template, so that I could make things automatically be "Scheduled" in Org-Mode and thus show up in the main agenda. The %t and %T expansions do do this just fine, but they would require me to type out the time codes for my blocks by hand each time, which was THE bit of repetitive work I was trying to avoid with all this from the start. Luckily I found Sacha Chua's blog about doing this exact kind of thing. Ironically she did the work of figuring out how to do this because she didn't know about the %t expansion. The part I yoinked from Sacha was the %(org-read-date nil nil org-read-date-final-answer) snippet. That just pulls the date selected by the time prompt, but does not create the whole timestamp. Ideal for me because I want to construct the full timestamp in the template.

Breadcrumbs in Hugo   hugo

Intro

Changes to the site again! I've been interested in implementing breadcrumbs as a navigational tool on my site for a month or so now ever since I ran across a blog post about them (no idea what I've done with the link at this point, sorry). Breadcrumbs are a navigational tool that typically appear at the top of the content of the page, to indicate where in the site hierarchy the user is.

Seemed like a really cool idea when I first learned of it, and since I have it implemented, I really like the feel of it! Using breadcrumbs to navigate the site for me has this feel of browsing text documents on a webserver that provides just the raw directory listing. I like the feel of it so much that I've just removed my traditional sidebar navigation altogether! I personally feel like my website is simple enough that the breadcrumb navigation alone is adequate. But I'd love to hear your thoughts! Let me know if the breadcrumbs seem good enough, or if site feels less navigable without the sidebar with consistent links.

Explanation

This post is just as much me explaining to myself some details about how Hugo works as much as it is about telling anyone else how this implementation of breadcrumbs works ha. I'm finally grasping how templating using Go works and want to make sure I can remember in the future.

I yoinked this hugo snippet from here. Gandiya does a great explanation of it, but I'm going to do it again in my own words just for the exercise of it ;).

{{ with .Parent }}
    {{ partial "breadcrumb.html" . }}
    {{ if .Parent }}>{{ end }}
    <a href="{{ .Permalink }}">{{ .Title }}</a>
{{ end }}
{{ with .Parent }}
...
{{ end }}

The with statement uses the same logic as an if statement, the block executes only if an if evaluation returns TRUE. That is, only if the provided variable exists. It differs from and if statement in that it also rebinds the scope.

So the code within the with block executes as if it were run on the .Parent page, rather than the page this snippet is called from.

{{ partial "breadcrumb.html" . }}

This bit calls the same partial code again. This recursion means that the block gets run for each page until it ends up with a scope where there is no parent, i.e. the homepage! This one little bit is all that is needed to make sure any page this snippet is called from will return the full hierarchy path from that page to the home page! How cool is that?

{{ if .Parent }}>{{ end }}

This snippet checks if there is a parent page, insert the separator I've chosen before the link, because we're going to be putting more stuff in front of it.

<a href="{{ .Permalink }}">{{ .Title }}</a>

This is what inserts the actual link, using the page title as the link text. In the location where this snippet gets called from, I call the {{ .Title }} bit one more time, so the title of the starting page will also appear. Like so:

<nav class="crumbs">
        {{- partial "breadcrumb.html" . -}}
        {{ if .Parent }}>{{ end }}
        <h1>{{ .Title }}</h1>
</nav>

Trying out Ox-Hugo   hugo

So I've been playing around with my website bits and bobs here and there the past month or so. I initially set up ox-hugo so that I could use my collection of links I've been keeping in an org file as a digital link garden on the site.

That project is going well! You can check it out by clicking on the Links button in the navigation menu. And today since I've been putting off writing up my reviews of books I've been reading I decided to just bang it out using ox-hugo to organize it. It worked pretty well too!

So this is my first post attempting to just write a regular blog post in org and see how it exports. If it goes well I might slowly start migrating all my old posts into an org file, just so that I can have things neatly organized. Or maybe just write future ones in here, that would be way easier.

Tweaking Site Layout   hugo

This post is going live with some tweaks to the website layout! I've moved site navigation stuff to a side bar rather then being pinned to the top. And it moves to the bottom on narrow screens! I really like that behavior, feels very professional ha.

I've also put in displaying tags on individual blog posts like this one. They are displayed in the sidebar on appropriate pages. I'm not sure if tags will actually help people navigate my page better or not. I think it's probably something that's better to have as I continute to post. For now the one really meaningful one is the [book-review](/tags/book-review) tag, since that's the one I've been posting in the most.

I've still got some flow issues to address, some pages look wonky and I'm not sure why. Also I'm planning on adding breadcrumbs to posts, to better signify some site structure.

Permaculture   permaculture

DONE Making My Own Lactobacillus Culture

Why Culture Lactobacillus?

Lactobacillus is the primary microorganism used in bokashi composting. They are used to ferment food scraps (I'm curious to see if it works well on other organic material as well) in order to quickly turn them into compost material. Lactobacillus is also used in yogurt and cheese production, but I'm not cultivating it for that.

How To Get Lactobacillus

You can buy inoculated medium for bokashi online for not too much. In fact I just ordered some earlier today because I wanted to get a bokashi bucket started while I wait for my culture to develop. Look for "bokashi bran" or "bokashi compost starter".

The other way to get the lactobacillus bacteria is to cultivate it yourself! There are three basic steps to get the lactobacillus, and two more steps to preserve it (a useful but not mandatory step!)

  • Step 1: Rice Wash

    All you need to do is combine equal amounts rice and water in a container!

    20220713_110615_web.jpg

    Mix it around and the water should turn cloudy. Drain the water off into a suitable container, this is what you will use to cultivate the lactobacillus. Use the rice in your next meal, we no longer need it for this project.

    20220713_121731_web.jpg 20220713_110729_web.jpg

    Next cover the container with a cloth or otherwise permeable lid to keep foreign materials out, and set it aside in a warm place for a day to go to work.

    20220713_111225_web.jpg 20220713_111233_web.jpg

    This is as far as I've gotten so far! Tomorrow I'll be adding milk to the mixture to feed the lactobacillus, and then we will need to wait a week or two for them to do their thing.

  • Step 2: Add Milk

    After you let the rice wash sit for a day, it's time to add milk. 10:1 milk to rice wash is the recommended ratio. This process will create gas so you need a way to release that. If you have a securely fastened cap you'll need to release it manually. I've placed a non-locking lid on mine with some weight on it, so that as the pressure builds it can release naturally and reseal to keep out stray microorganisms.

    20220714_150824_web.jpg 20220714_150833_web.jpg

  • Step 3: Extract The Whey; Feed The Lactobacillus

    After a week of so curds should develop at the top of the milk. We are interested in the whey however. Either remove the curds to access the whey or use a syringe or siphon.

    At this point some kind of sugar needs to be given to the bacteria to feed it. Molasses was recommended by several folks, although I have seen other types of sugar used as well.

    This should be a completed lactobacillus culture! It's all ready to use now. You can spray it on compost or as you add organic material to a bokashi bucket. If you want to store it for later use however you will want a medium to adhere it to.

  • Step 4: Apply To A Medium

    The medium can be any dry porous woody material. It's often applied to leftover brewing material. Sawdust can also be used, rice husks, etc.

  • Step 5: Dry For Storage

DONE A Tour Of My Porch

I was sitting on my porch last night and I was just overjoyed at all the plant life I've got growing out here. So I figured I would snap some pics and write up a little tour.

So here we go! First up is the left half of my porch.

20220725_212336_web.jpg

First up is a grape vine! I really need to find this gal a forever home.

20220725_212456_web.jpg

I bought a bunch of these purple self watering tubs at the flea market a month ago, they've been working really well! I've got two different kinds of yarrow growing in here (not very visible because their blooms are old and out of frame), a golden shrimp shrub, and a yellow portuluca.

20220725_212450_web.jpg

This is the first planter I got set up out here this year, it's just a plastic 5 gallon bucket that I drilled some drain holes in, and planted some Coelus, a pelargonium citrosum, and a lemon balm! It's all grown up so bushy and I love it so much! The pelargonium releases a wonderful citrus smells when you brush or bruise its leaves. I'm attempting to propagate both the pelargonium and the coelus from cuttings currently.

20220725_212423_web.jpg

Up next is two more plants I need to find forever homes for! On the left is a Aquilegia I bought at a greenhouse, this cultivar is called "Kirigami" and has beautiful purple flowers. Next to it is an English Lavender I bought last week, I'm going to move some of my hostas in front of the porch and put this fellow in sometime.

20220725_212405_web.jpg

The other half of the porch!

20220725_212347_web.jpg

We've been growing radish greens to add to our meals! It's super easy, and this is round two of sowing already. We just sprinkle the radish seeds in, and in a week they are ready to pick and add to our meals!

20220725_212234_web.jpg

We had an extra self watering bucket so we just tossed in some flower seeds. It was kind of late in the season when we did this, so we might not see any of these flower, but it's worth a shot.

20220725_212225_web.jpg

On the left here is a house plant that I really need to move back inside. On the right is a cutting of my pelargonium that I'm trying to propagate. It seems to be doing well, I'm gonna find it a home sometime soonish.

20220725_212150_web.jpg

Here's some mason jars where I'm cultivating several lactobacillus cultures! You can read more about that here. The two on the left are some fresh cultures I'm starting, and the one on the right is an attempt to see if I can take the culture I grew a couple weeks ago and multiply it by feeding it milk.

20220725_212136_web.jpg

Next up is the reason I'm cultivating lactobacillus, a bokashi bucket! I've got this fellow chock full of food waste and other organic material, and I added a generous helping of lactobacillus to break it down. In a day or so I will need to remove the contents and move them to the yard somewhere so they can finish composting.

20220725_212127_web.jpg

Here's a Coelus that I trimmed the other day, and my attempts to propagate the cuttings in a mason jar.

20220725_212311_web.jpg

A planter with several kinds of succulents in it. I need to move these folks back inside, since the Aloe seems to dislike how much sun she gets on the porch.

20220725_212251_web.jpg

Now for the petunias! First up is a veined cultivar that we got so we can mix it with another veined one we already have.

20220725_212217_web.jpg

We picked up these two stripped varieties at a greenhouse last week.

20220725_212412_web.jpg

This hanging basket is Pete! We've been collecting his seeds and using the trimmings in a vase inside the house, fresh cut flowers!

20220725_212428_web.jpg

Last plant is Wirt the Spiderwort! He's been really easy to take care of, and incredibly easy to propagate as well.

20220725_212507_web.jpg

Reflection posts   reflection

DONE On Aging

I'm just throwing out some thoughts I've been mulling over about aging. I am a caretaker for my grandparents, primarily my Grandmother, who has Alzheimer's, so this is something that I ponder fairly often.

People have good things to offer others, even in their old age. My grandparents contribute so much to my life, it simply wouldn't be the same without them. There's the obvious things, the time we get to spend together playing cards, sharing stories from our lives, meal times together. Those things are positives in my life that they contribute.

Perhaps less obvious is how them needing my help is a benefit for me. It has required me to grow as a person, to acquire the skills and attitudes I need to care for them. I have become a better and more well rounded person than I would have without caring for them. Giving help also transforms and helps the giver. Needing help as we age is not a bad thing.

You cannot know what your life will be like decades in the future. It is impossible to know all the ways in which you might have a positive impact on others. If you declare now that future you will have nothing to live for, what will happen when you finally get there?

Do not plan a lack of joy.

DONE Grandma as Therapist   therapy

My partner and I got to talking about therapy theory the other night. They brought up Carl Rodgers and Person Centered Therapy (PCT). The three core concepts of PCT are unconditional positive regard, congruence (authenticity of the therapist), and accurate empathetic understanding. This approach really lines up well with both my partner and I, we both learn towards this kind of humanistic approach to things.

As we were talking about this it occurred to me that Grandma also possesses these qualities. My grandfather and I are the primary caretakers for my grandmother, she has dementia and so needs support to complete many daily tasks. I've been doing this for about five years now, and it has become incredibly important to me that I make sure to highlight and emphasize the healing powers that Grandma has available to her. Just because she has significant dementia does not mean that she only needs support and never contributes to our family system.

Grandma is excellent at unconditional positive regard. She always thinks the best of everyone, and even when people are short or rude with her she has a smile for them. Everywhere we go Grandma makes friends because she is quick to tell people they are doing great and that she is happy to see them. Every nurse and receptionist we interact with at medical appointments remarks how much they love working with Grandma because she's so kind and encouraging.

Grandma cannot help but be congruent either. Whenever you have a conversation with her she can only be who she is. She simply does not have the cognitive capacity to do otherwise. What you see with my Grandmother is what you get.

Accurate empathetic understanding might be difficult for Grandma at times. She might not be able to grasp all the reasons why I'm upset, but she has shown me time and time again that she is keenly able to see and understand the emotions I'm feeling. She is aware of me as a person and is willing to see and participate in whatever emotions I'm having at the time.

Grandma has been a huge help to me, particularly during the pandemic when things have been incredibly tough and I lost a lot of my social supports during quarantine. Many times I have gone to Grandma for comfort and support when I was feeling overwhelmed and she was able to bring all of these qualities to the moment at hand and do a great deal to help me soothe difficult emotions. All human beings have dignity, and all human beings have the capacity to heal those around them. I'm so thankful I have had the opportunity to journey with my grandmother in this.

TODO I Got Out.

tl;dr

I escaped the clutches of abusive family. I had to leave behind my grandparents.

Why am I writing this?

I honestly don't know yet. It has only been two weeks since I fled my blood family, and I have taken very little time for quiet contemplation in that. My normal patterns would be to pressure myself to resume full time work as soon as possible. My partner has encouraged me to keep it at part time and take time to heal and settle. I suppose part of this is keeping my promise to try that.

Why did I have to flee?

Oh. This would be interesting for me to lay out. Even just for myself. Why did I have to flee? The easiest answer is that I could no longer tolerate living next to my birth mother who sexually abused me for approximately the first two decades of my life. Even though the sexual abuse had stopped there was still ongoing emotional and verbal abuse up to the point when I fled two weeks ago.

I also had to leave because I could no longer adequately care for my grandparents. My grandfather and I were the main caretakers for my grandmother, who has Alzheimer's. I also helped my grandfather manage all his medical care. It was a lot.

I was unable to live my life. In my last week living there I finally started wearing the clothes that I want to. It was clear that my gender expression did not please those around me. Particularly my birth mother. Not only that, but my life plans had to be on hold while I cared for them. I could not enact very many long term plans.

What does fleeing allow me to do?

I have space and room to have my own future for the first time in my life. I do not in any way regret the time I spent caring for my grandparents. I cherished it and would do it again in a heart beat. But it was five years of my life. Five years where I could not make any life changing decisions. Five years of what was essentially a 24/7 job.

In addition to having space to make life decisions, I also have space to relax. Caring for Grandma was a job that I couldn't put down as long as I was in the same house. I always had my ear bent to listen for her coughs even if I was doing something at the other end of the house. It also meant frequent interruptions when I was working on anything as well. That is quite the load to bear.

Fleeing allows me to be authentically myself! I am a nonbinary transfem individual. Dressing the way I want was always going to be an issue while living with my grandparents. Because of the semi-rural conservative area we lived in. Because my parents next door didn't approve. Because even when I dared to wear skirts I would always have that fear in the back of my head. Where I'm living now I have so much more freedom and less fear.

Fleeing means I can genuinely tackle my trauma. I can live in a place that is safe, and being safe provides

Poems   poetry

DONE The Heart Cannot Break

The heart cannot split<br> it simply pours out<br> that which you fill it with<br>

my heart is a cup<br> I will pour it out for you if you need<br> but I too must drink from it<br>

so I fill it with kindness<br> as much compassion as I can muster<br> because I need these<br>

I am glad to share<br> drink from my heart<br> but I fill it for me<br>

my heart cannot break in two<br> a wound it may receive<br> but to itself it must be true<br>

my heart is a whole<br> whatever it holds for you<br> it holds for me<br>

perhaps it is strange to say<br> I will always love you<br> because I am tired of not loving me<br>

Emacs 29.2 (Org mode 9.6.15)