922 lines
38 KiB
XML
922 lines
38 KiB
XML
<?xml version="1.0" encoding="UTF-8" ?>
|
|
<rss version="2.0"
|
|
xmlns:content="http://purl.org/rss/1.0/modules/content/"
|
|
xmlns:wfw="http://wellformedweb.org/CommentAPI/"
|
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
|
xmlns:atom="http://www.w3.org/2005/Atom"
|
|
xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
|
|
xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
|
|
xmlns:georss="http://www.georss.org/georss"
|
|
xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#"
|
|
xmlns:media="http://search.yahoo.com/mrss/">
|
|
<channel>
|
|
<title>Open Thoughts</title>
|
|
<atom:link
|
|
href="https://judah.freedomland.xyz//feed.xml"
|
|
rel="self" type="application/rss+xml" />
|
|
<link>https://judah.freedomland.xyz//</link>
|
|
<description><![CDATA[]]></description>
|
|
<language>en</language>
|
|
<pubDate>Thu, 18 Jan 2024 00:00:00 -0500</pubDate>
|
|
<lastBuildDate>Thu, 18 Jan 2024 13:08:51 -0500</lastBuildDate>
|
|
<generator>weblorg 0.1.0 (https://emacs.love/weblorg)</generator>
|
|
<webMaster>Judah Sotomayor</webMaster>
|
|
<image>
|
|
<url>https://judah.freedomland.xyz//media/img/8bitme.png</url>
|
|
<title>Blog Author</title>
|
|
<link>https://judah.freedomland.xyz//</link>
|
|
</image>
|
|
|
|
|
|
<item>
|
|
<title>Missions Trip to Southeast Asia</title>
|
|
<link>https://judah.freedomland.xyz//posts/missions-trip-southeast-asia.html</link>
|
|
<author>author@mail.com (Blog Author)</author>
|
|
<guid isPermaLink="false">https://judah.freedomland.xyz//posts/missions-trip-southeast-asia.html</guid>
|
|
|
|
<pubDate>Thu, 18 Jan 2024 00:00:00 -0500</pubDate>
|
|
|
|
<description><![CDATA[<p>
|
|
In May I plan to go on missions to a nation in Southeast Asia with a small team.
|
|
We will bring the good news of Jesus, and the reconciliation that He brings.
|
|
On this trip we will declare the salvation and freedom Jesus brings.
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>
|
|
For we do not proclaim ourselves, but Christ Jesus as Lord, and ourselves as your slaves for the sake of Jesus.
|
|
– 2 Corinthians 4:5
|
|
</p>
|
|
</blockquote>
|
|
|
|
<p>
|
|
It is this proclamation that will change hearts and minds in Southeast Asia.
|
|
We go in humility, willing to subject ourselves to all indignity for the sake of Jesus' kingdom.
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>
|
|
17 Therefore if anyone is in Christ, he is a new creation; the old things have passed away; behold, new things have come.
|
|
18 And all these things are from God, who has reconciled us to himself through Christ, and who has given us the ministry of reconciliation,
|
|
19 namely, that God was in Christ reconciling the world to himself, not counting their trespasses against them, and entrusting to us the message of reconciliation.
|
|
20 Therefore we are ambassadors on behalf of Christ, as if God were imploring you through us. We beg you on behalf of Christ, be reconciled to God.
|
|
21 He made the one who did not know sin to be sin on our behalf, in order that we could become the righteousness of God in him.
|
|
</p>
|
|
|
|
<p>
|
|
– 2 Corinthians 5:17-21
|
|
</p>
|
|
</blockquote>
|
|
|
|
<ul class="org-ul">
|
|
<li>We will bring this truth into places characterized by darkness and lies.</li>
|
|
<li>We will tell those who believe no one loves or knows them that God knows and loves them.</li>
|
|
<li>We will tell those who seek to prove their goodness through works that Christ can give them true righteousness.</li>
|
|
<li>We will tell those who believe they are broken beyond repair that Jesus is ready and willing to heal them.</li>
|
|
<li>We will encourage the church, which is strong and alive in Southeast Asia.</li>
|
|
</ul>
|
|
|
|
|
|
<p>
|
|
The spiritual needs in Southeast Asia are intense.
|
|
No team can hope to be adequate for the situation–instead, we know that Jesus is enough for Southeast Asia!
|
|
We rely on the Holy Spirit, trusting in Him to give us wisdom and words as we encounter the people in Asia.
|
|
</p>
|
|
|
|
<p>
|
|
Please pray for Southeast Asia in these ways:
|
|
</p>
|
|
|
|
|
|
<ul class="org-ul">
|
|
<li>Openness: Pray that the people we encounter will be open to the message of Jesus Christ.</li>
|
|
<li>Favor: Pray for favor with governing authorities.
|
|
We go in humility and obedience.
|
|
It is not our goal to subvert legitimate authority or take a political stance.
|
|
Pray that those in power would recognize the power and blessing of the gospel.</li>
|
|
<li>Focus: Pray that the team would remain focused on glorifying Jesus Christ. Pray that we would not turn from this even a step, and that we would work in unity to achieve our mission.</li>
|
|
<li>Love: Pray that we would have genuine love for all we encounter. We have encountered a love that changed our lives–pray that it would change the lives of those around us!</li>
|
|
<li>The Church: we're going to Southeast Asia for just two weeks. While we want to reach people for Jesus Christ, we are not staying long-term. We can't disciple people in two weeks.
|
|
The Church in Southeast Asia is alive and well, even if underground. Pray that they would continue to stand strong in the faith.</li>
|
|
</ul>
|
|
|
|
|
|
<div class="note" id="org715574e">
|
|
<p>
|
|
If you would like to partner with me, please consider donating through <a href="https://overlandmissions.com/donate/sotomayor">Overland Missions</a>
|
|
</p>
|
|
|
|
</div>
|
|
]]></description>
|
|
</item>
|
|
|
|
<item>
|
|
<title>Writing a Resume with Org-Mode</title>
|
|
<link>https://judah.freedomland.xyz//posts/writing-resume-org.html</link>
|
|
<author>author@mail.com (Blog Author)</author>
|
|
<guid isPermaLink="false">https://judah.freedomland.xyz//posts/writing-resume-org.html</guid>
|
|
|
|
<pubDate>Tue, 09 Jan 2024 00:00:00 -0500</pubDate>
|
|
|
|
<description><![CDATA[<div id="table-of-contents" role="doc-toc">
|
|
<h2>Table of Contents</h2>
|
|
<div id="text-table-of-contents" role="doc-toc">
|
|
<ul>
|
|
<li><a href="#setup">1. Setup</a>
|
|
<ul>
|
|
<li><a href="#installing-the-template">1.1. Installing the Template</a></li>
|
|
<li><a href="#preparing-org-mode">1.2. Preparing Org-Mode</a>
|
|
<ul>
|
|
<li><a href="#custom-class-org">1.2.1. Custom Class</a></li>
|
|
<li><a href="#lualatex-as-pdf-processor">1.2.2. Lualatex as PDF Processor</a></li>
|
|
<li><a href="#ox-extra-for-ignore-tags">1.2.3. ox-extra for ":ignore:" tags</a></li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="#creating-the-macros">1.3. Creating the Macros</a></li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="#writing-your-resume">2. Writing your Resume</a></li>
|
|
<li><a href="#future-improvements">3. Future improvements.</a></li>
|
|
<li><a href="#revision">4. Revision</a></li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
<p>
|
|
I use org-mode as my document production software.
|
|
This means that I produce everything in Org.
|
|
Notes, papers, presentations, and now my resume.
|
|
</p>
|
|
|
|
<p>
|
|
When I began looking at resume production with Org, I noticed the lack of straightforward packages and user guides.
|
|
I'm sure there's something out there, but I sure couldn't find it.
|
|
</p>
|
|
|
|
<p>
|
|
The simplest raw-org method I found is the use of <a href="https://orgmode.org/manual/Macro-Replacement.html">macros</a>, along with a custom export-template.
|
|
</p>
|
|
|
|
<div class="alert" id="orgc141467">
|
|
<p>
|
|
I've found a better way. Check out the <a href="#revision">revision</a>.
|
|
</p>
|
|
|
|
</div>
|
|
|
|
|
|
<p>
|
|
This approach is nice because it can be adapted to any standard LaTeX template.
|
|
In my case, <a href="https://github.com/dnl-blkv/mcdowell-cv/blob/master/mcdowellcv.cls">McDowell CV</a> by Daniil Belyakov is perfect.
|
|
</p>
|
|
|
|
<div id="outline-container-setup" class="outline-2">
|
|
<h2 id="setup"><span class="section-number-2">1.</span> Setup</h2>
|
|
<div class="outline-text-2" id="text-setup">
|
|
</div>
|
|
<div id="outline-container-installing-the-template" class="outline-3">
|
|
<h3 id="installing-the-template"><span class="section-number-3">1.1.</span> Installing the Template</h3>
|
|
<div class="outline-text-3" id="text-1-1">
|
|
<p>
|
|
First, get the <code>.cls</code> for your desired template.
|
|
If it's on texlive, just install it the usual way.
|
|
Since the template I want is on Github, I'll just put the <code>.cls</code> into <code>/home/user/texmf/tex/latex/</code>.
|
|
</p>
|
|
</div>
|
|
</div>
|
|
<div id="outline-container-preparing-org-mode" class="outline-3">
|
|
<h3 id="preparing-org-mode"><span class="section-number-3">1.2.</span> Preparing Org-Mode</h3>
|
|
<div class="outline-text-3" id="text-preparing-org-mode">
|
|
</div>
|
|
<div id="outline-container-custom-class-org" class="outline-4">
|
|
<h4 id="custom-class-org"><span class="section-number-4">1.2.1.</span> Custom Class</h4>
|
|
<div class="outline-text-4" id="text-custom-class-org">
|
|
<p>
|
|
I add a custom entry to <code>org-latex-classes</code> to make use of McDowellcv:
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-emacs-lisp">(add-to-list 'org-latex-classes
|
|
'(<span class="org-string">"mcdowellcv"</span>
|
|
<span class="org-string">"\\documentclass[]{mcdowellcv}</span>
|
|
<span class="org-string"> \\usepackage{amsmath}</span>
|
|
<span class="org-string"> \\usepackage[]{multicol}</span>
|
|
<span class="org-string"> \\usepackage[hidelinks]{hyperref}</span>
|
|
<span class="org-string"> [NO-DEFAULT-PACKAGES]</span>
|
|
<span class="org-string"> [NO-PACKAGES]"</span>
|
|
(<span class="org-string">"\\section{%s}"</span> . <span class="org-string">"\\section*{%s}"</span>)
|
|
(<span class="org-string">"\\subsection{%s}"</span> . <span class="org-string">"\\subsection*{%s}"</span>)
|
|
(<span class="org-string">"\\subsubsection{%s}"</span> . <span class="org-string">"\\subsubsection*{%s}"</span>)
|
|
(<span class="org-string">"\\paragraph{%s}"</span> . <span class="org-string">"\\paragraph*{%s}"</span>)
|
|
(<span class="org-string">"\\subparagraph{%s}"</span> . <span class="org-string">"\\subparagraph*{%s}"</span>)))
|
|
|
|
</pre>
|
|
</div>
|
|
<p>
|
|
Note that I prevent Org-mode from adding any extra packages to this.
|
|
Then I custom-add the <code>multicol</code> and <code>hyperref</code> packages.
|
|
</p>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-lualatex-as-pdf-processor" class="outline-4">
|
|
<h4 id="lualatex-as-pdf-processor"><span class="section-number-4">1.2.2.</span> Lualatex as PDF Processor</h4>
|
|
<div class="outline-text-4" id="text-1-2-2">
|
|
<p>
|
|
This template requires lualatex a its pdf producer.
|
|
While you could set this as a per-document setting, I like it well enough for everything.
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-emacs-lisp">(after! ox-latex
|
|
(<span class="org-keyword">setq</span> org-latex-pdf-process
|
|
'(<span class="org-string">"lualatex --output-directory=/home/user/Documents -shell-escape -interaction nonstopmode %f"</span>)))
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-ox-extra-for-ignore-tags" class="outline-4">
|
|
<h4 id="ox-extra-for-ignore-tags"><span class="section-number-4">1.2.3.</span> ox-extra for ":ignore:" tags</h4>
|
|
<div class="outline-text-4" id="text-1-2-3">
|
|
<p>
|
|
I want to be able to ignore headings on export.
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-emacs-lisp"> (use-package! ox-extra
|
|
<span class="org-builtin">:after</span> (org)
|
|
<span class="org-builtin">:config</span>
|
|
(ox-extras-activate '(latex-header-blocks ignore-headlines)))
|
|
(add-to-list 'org-tags-exclude-from-inheritance <span class="org-string">"ignore"</span>)
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-creating-the-macros" class="outline-3">
|
|
<h3 id="creating-the-macros"><span class="section-number-3">1.3.</span> Creating the Macros</h3>
|
|
<div class="outline-text-3" id="text-1-3">
|
|
<p>
|
|
At the top of my resume file I use a config block to keep my macro definitions tidy:
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-org"><span class="org-org-drawer">:CONFIG:</span>
|
|
<span class="org-org-meta-line">#+LATEX_CLASS: mcdowellcv</span>
|
|
<span class="org-org-meta-line">#+OPTIONS: toc:nil title:nil</span>
|
|
<span class="org-org-meta-line">#+MACRO: cvsection \begin{cvsection}{$1}</span>
|
|
<span class="org-org-meta-line">#+MACRO: end-cvsection \end{cvsection}</span>
|
|
<span class="org-org-meta-line">#+MACRO: cvsubsection \begin{cvsubsection}{$1}{$2}{$3}</span>
|
|
<span class="org-org-meta-line">#+MACRO: end-cvsubsection \end{cvsubsection}</span>
|
|
<span class="org-org-drawer">:END:</span>
|
|
</pre>
|
|
</div>
|
|
<p>
|
|
Other options can be set here as well, of course.
|
|
</p>
|
|
|
|
<p>
|
|
If you're using some other resume template, or even some unrelated LaTeX template,
|
|
you can see how easy it would be to adapt the macro workflow.
|
|
</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-writing-your-resume" class="outline-2">
|
|
<h2 id="writing-your-resume"><span class="section-number-2">2.</span> Writing your Resume</h2>
|
|
<div class="outline-text-2" id="text-2">
|
|
<p>
|
|
After you've set up your macros, use is simple.
|
|
You use standard org headlines with the <code>ignore</code> tag to structure your document, and then macros to manage the cv content.
|
|
<img src="https://judah.freedomland.xyz//static/img/edu-record-sample.svg" alt="image" />
|
|
Notice that I separate the ending macros using another header line.
|
|
I'm not sure why that's necessary, but when I attempt to remove it, export breaks.
|
|
</p>
|
|
|
|
<p>
|
|
I like to keep my resume on a single sheet.
|
|
This requires some content juggling, but it forces me to filter out everything that is unimportant.
|
|
Of course, being young I have little content and so I can fit just about everything.
|
|
</p>
|
|
|
|
<p>
|
|
If you're in school, the careers department can almost certainly help you out with more specific style guides.
|
|
</p>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-future-improvements" class="outline-2">
|
|
<h2 id="future-improvements"><span class="section-number-2">3.</span> Future improvements.</h2>
|
|
<div class="outline-text-2" id="text-3">
|
|
<p>
|
|
Back when configuring the <a href="#custom-class-org">custom class</a> you may have noticed the rows of cons cells underneath the header-string.
|
|
These define what each level of org-header is to translate into.
|
|
If you're paying attention you've also noticed that McDowellCV provides a set of commands <code>cvsection</code> and <code>cvsubsection</code> that would work perfectly in this scenario.
|
|
You're right, except that these commands require extra properties to specify dates and other features.
|
|
</p>
|
|
|
|
<p>
|
|
<del>At some point I'll figure out how to pass parameters into them through the default header-export mechanism. For now I'm comfortable with my macros.</del>
|
|
</p>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-revision" class="outline-2">
|
|
<h2 id="revision"><span class="section-number-2">4.</span> Revision</h2>
|
|
<div class="outline-text-2" id="text-revision">
|
|
<p>
|
|
I have spent some more time configuring, and I've figured out the appropriate settings.
|
|
</p>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-emacs-lisp">(add-to-list 'org-latex-classes
|
|
'(<span class="org-string">"mcdowellcv"</span>
|
|
<span class="org-string">"\\documentclass[]{mcdowellcv}</span>
|
|
<span class="org-string"> \\usepackage{amsmath}</span>
|
|
<span class="org-string"> \\usepackage[]{multicol}</span>
|
|
<span class="org-string"> \\usepackage[hidelinks]{hyperref}</span>
|
|
<span class="org-string"> [NO-DEFAULT-PACKAGES]</span>
|
|
<span class="org-string"> [NO-PACKAGES]"</span>
|
|
(<span class="org-string">"\\begin{cvsection}{%s}"</span> <span class="org-string">"\\end{cvsection}"</span>)
|
|
(<span class="org-string">"\\begin{cvsubsection}{%s}"</span> <span class="org-string">"\\end{cvsubsection}"</span>)))
|
|
</pre>
|
|
</div>
|
|
|
|
<p>
|
|
Now, as I mentioned above, each section takes just one argument.
|
|
I need a way to shoehorn multiple arguments into the <code>cvsubsection</code> command.
|
|
Fortunately, org-mode provides a subtle set of symbols to do just that:
|
|
<img src="https://judah.freedomland.xyz//static/img/edu-record-sample-after.svg" alt="revised image" />
|
|
</p>
|
|
|
|
<p>
|
|
<a href="https://orgmode.org/manual/Quoting-LaTeX-code.html">Org manual reference</a>
|
|
</p>
|
|
|
|
<p>
|
|
It took me an hour to discover this piece of syntax.
|
|
Next time I'll check the manual first!
|
|
</p>
|
|
</div>
|
|
</div>
|
|
]]></description>
|
|
</item>
|
|
|
|
<item>
|
|
<title>In Pursuit of an Efficient Org-Agenda</title>
|
|
<link>https://judah.freedomland.xyz//posts/efficient-org-agenda.html</link>
|
|
<author>author@mail.com (Blog Author)</author>
|
|
<guid isPermaLink="false">https://judah.freedomland.xyz//posts/efficient-org-agenda.html</guid>
|
|
|
|
<pubDate>Wed, 27 Dec 2023 00:00:00 -0500</pubDate>
|
|
|
|
<description><![CDATA[<div id="table-of-contents" role="doc-toc">
|
|
<h2>Table of Contents</h2>
|
|
<div id="text-table-of-contents" role="doc-toc">
|
|
<ul>
|
|
<li><a href="#first-iteration">1. First Iteration</a></li>
|
|
<li><a href="#second-iteration">2. Second Iteration</a></li>
|
|
<li><a href="#finally">3. Final</a></li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
<p>
|
|
After beginning my Emacs and Org-Mode adventures I quickly realized the insufficiency of the standard agenda.
|
|
It is wonderful at producing a list, but I am quickly approaching over 1000 notes.
|
|
The agenda tooling is incapable of searching this many files efficiently, and it took over thirty seconds to generate an agenda.
|
|
</p>
|
|
|
|
<p>
|
|
This was intolerable. I had two options:
|
|
</p>
|
|
<ol class="org-ol">
|
|
<li>Place all my TODO items into a single file.</li>
|
|
<li>Narrow the number of files the agenda mechanism needs to search</li>
|
|
</ol>
|
|
|
|
<p>
|
|
I find the first option undesireable for reasons I mentioned in my <a href="https://judah.freedomland.xyz//posts/reflections-zettelkasten-tooling.html">post</a> about zettelkasten tools.
|
|
I like to have my todo items mixed with the context where they were born.
|
|
A student of the <i>Getting Things Done</i> methodology might ask, "Doesn't this violate the central todo-list principle?"
|
|
Yes, it does.
|
|
Org-agenda allows me to have my cake and eat it too.
|
|
I can create a centralized todo-list out of all my todo items, and then immediately jump into the context of my next task.
|
|
</p>
|
|
|
|
<p>
|
|
It took several iterations of configuration to reach a seamless workflow.
|
|
If you'd like to jump straight to the final setup, <a href="#finally">here's the link.</a>
|
|
</p>
|
|
|
|
<div id="outline-container-first-iteration" class="outline-2">
|
|
<h2 id="first-iteration"><span class="section-number-2">1.</span> First Iteration</h2>
|
|
<div class="outline-text-2" id="text-1">
|
|
<p>
|
|
The first piece of tooling I used came from <a href="https://d12frosted.io/posts/2021-01-16-task-management-with-roam-vol5.html">this post</a> and <a href="https://gist.github.com/d12frosted/a60e8ccb9aceba031af243dff0d19b2e">this Gist</a>.
|
|
Essentially it creates a function <code>vulpea-project-files</code> that can easily query for a tag, and then sets the org-agenda files to all the files containing this tag.
|
|
</p>
|
|
|
|
<p>
|
|
Coupled with a helper-function that adds the tag <code>hastodos</code> to any file containing a TODO entry, it functioned well.
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-emacs-lisp">(<span class="org-keyword">defun</span> <span class="org-function-name">vulpea-project-files</span> ()
|
|
<span class="org-doc">"Return a list of note files containing '</span><span class="org-doc"><span class="org-constant">hastodos</span></span><span class="org-doc">' tag."</span> <span class="org-comment-delimiter">;</span>
|
|
(seq-uniq
|
|
(seq-map
|
|
#'car
|
|
(org-roam-db-query
|
|
[<span class="org-builtin">:select</span> [nodes:file]
|
|
<span class="org-builtin">:from</span> tags
|
|
<span class="org-builtin">:left-join</span> nodes
|
|
<span class="org-builtin">:on</span> (= tags:node-id nodes:id)
|
|
<span class="org-builtin">:where</span> (like tag (<span class="org-keyword">quote</span> <span class="org-string">"%\"hastodos\"%"</span>))]))))
|
|
(<span class="org-keyword">setq</span> org-agenda-files (vulpea-project-files))
|
|
</pre>
|
|
</div>
|
|
|
|
<p>
|
|
This solution is great because it is pure elisp.
|
|
Anywhere you're running Emacs it should function just fine.
|
|
It also works well with one of my needs: transparent file encryption.
|
|
Emacs has extensions for both <code>gpg</code> and <code>age</code> encryption that allow files to be transparently encrypted and decrypted.
|
|
This solution can make use of that where a standard <code>grep</code> could not.
|
|
</p>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-second-iteration" class="outline-2">
|
|
<h2 id="second-iteration"><span class="section-number-2">2.</span> Second Iteration</h2>
|
|
<div class="outline-text-2" id="text-2">
|
|
<p>
|
|
Eventually, I grew tired of seeing the entire solution in my config file.
|
|
All told, it is about 170 lines.
|
|
This is a lot for a small utility!
|
|
</p>
|
|
|
|
<p>
|
|
I decided to try using <code>ripgrep</code> to fix this:
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-emacs-lisp">(<span class="org-keyword">defun</span> <span class="org-function-name">set-org-agenda-files-ripgrep</span> ()
|
|
(<span class="org-keyword">setq</span> org-agenda-files (split-string (shell-command-to-string <span class="org-string">"rg -torg -l TODO /home/user/org"</span>))))
|
|
</pre>
|
|
</div>
|
|
<p>
|
|
This worked nicely.
|
|
It takes just a few lines, runs just as fast–probably faster–than pure elisp, and is much easier to read and understand.
|
|
</p>
|
|
|
|
<p>
|
|
The only difficulty is encryption.
|
|
<code>ripgrep</code> does not operate on open emacs buffers, instead it operates on what is saved to disk.
|
|
Naturally, this means that it only sees the encrypted files.
|
|
</p>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-finally" class="outline-2">
|
|
<h2 id="finally"><span class="section-number-2">3.</span> Final</h2>
|
|
<div class="outline-text-2" id="text-finally">
|
|
<p>
|
|
The solution to file encryption is ripgrep preprocessing.
|
|
I owe this solution to <a href="https://www.reddit.com/r/emacs/comments/q4e2az/full_text_search_of_gpg_encrypted_files/">this reddit post</a>.
|
|
</p>
|
|
|
|
<p>
|
|
Ripgrep can run a command (or shell script!) to files before processing.
|
|
While the original poster was using <code>gpg</code> to encrypt files, just a few modifications allowed me to use <code>age</code>.
|
|
</p>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-zsh">#!/usr/bin/env zsh
|
|
case "$1" in
|
|
*.age)
|
|
# The -s flag ensures that the file is non-empty.
|
|
if [ -s "$1" ]; then
|
|
exec /usr/bin/age --decrypt -i ~/.age/personal $1
|
|
else
|
|
exec cat
|
|
fi
|
|
;;
|
|
*)
|
|
;;
|
|
esac
|
|
</pre>
|
|
</div>
|
|
<p>
|
|
This script operates on all <code>.age</code> files, decrypting them to stdout.
|
|
When using a preprocessor, ripgrep will simply search the output of the command.
|
|
</p>
|
|
|
|
<p>
|
|
I often have a mix of files in my notes directory, so I use filetypes to restrict ripgrep.
|
|
This means I have to add a new filetype to allow <code>.age</code> files through the filter.
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-sh">rg --type-add <span class="org-string">'aorg:*.org.age'</span> <span class="org-sh-escaped-newline">\</span>
|
|
-torg -taorg <span class="org-sh-escaped-newline">\</span>
|
|
--pre ~/age-preprocessor.zsh --pre-glob <span class="org-string">'*.age'</span> -l TODO /home/user/org
|
|
</pre>
|
|
</div>
|
|
|
|
<p>
|
|
Finally, we have our completed function:
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-emacs-lisp">(<span class="org-keyword">defun</span> <span class="org-function-name">set-org-agenda-files-ripgrep</span> ()
|
|
(<span class="org-keyword">setq</span> org-agenda-files (split-string (shell-command-to-string <span class="org-string">"rg --type-add </span><span class="org-string"><span class="org-warning">\</span></span><span class="org-string">'aorg:*.org.age</span><span class="org-string"><span class="org-warning">\</span></span><span class="org-string">' -torg -taorg --pre ~/age-preprocessor.zsh --pre-glob </span><span class="org-string"><span class="org-warning">\</span></span><span class="org-string">'*.age</span><span class="org-string"><span class="org-warning">\</span></span><span class="org-string">' -l TODO /home/user/org "</span>))))
|
|
</pre>
|
|
</div>
|
|
|
|
<p>
|
|
Hope this helps!
|
|
</p>
|
|
</div>
|
|
</div>
|
|
]]></description>
|
|
</item>
|
|
|
|
<item>
|
|
<title>Reflections on a year of Zettelkasten: Tooling</title>
|
|
<link>https://judah.freedomland.xyz//posts/reflections-zettelkasten-tooling.html</link>
|
|
<author>author@mail.com (Blog Author)</author>
|
|
<guid isPermaLink="false">https://judah.freedomland.xyz//posts/reflections-zettelkasten-tooling.html</guid>
|
|
|
|
<pubDate>Fri, 22 Dec 2023 00:00:00 -0500</pubDate>
|
|
|
|
<description><![CDATA[<p>
|
|
Back in 2021 I began a zettelkasten using guides from <a href="https://zettelkasten.de">zettelkasten.de</a>.
|
|
It has grown to over 723 notes in less than two full years.
|
|
</p>
|
|
|
|
<p>
|
|
<img src="https://judah.freedomland.xyz//static/img/filetypes.svg" alt="image" />
|
|
</p>
|
|
|
|
<p>
|
|
I'll cover this topic in several posts.
|
|
This first post will discuss the tools I've used to grow and maintain my second brain.
|
|
</p>
|
|
|
|
|
|
<p>
|
|
I have shifted between note-taking systems multiple times between now and the genesis of my Zettelkasten.
|
|
Different strengths and weaknesses have left me uncomfortable in every system, up until the last: Emacs.
|
|
Before I get to that, I'll cover the pieces of the system, what's changed, and what hasn't.
|
|
</p>
|
|
|
|
|
|
|
|
<div id="outline-container-text-editing" class="outline-2">
|
|
<h2 id="text-editing">Text editing</h2>
|
|
<div class="outline-text-2">
|
|
<p>
|
|
Text editing is at the heart of the zettelkasten.
|
|
A proper text editor will support links, backlinks, note search, and tagging.
|
|
It acts as the gateway into your notes, the control panel for your interaction and editing.
|
|
</p>
|
|
</div>
|
|
|
|
<div id="outline-container-vimwiki" class="outline-3">
|
|
<h3 id="vimwiki">Vimwiki</h3>
|
|
<div class="outline-text-3">
|
|
<p>
|
|
The first version was the amazing <a href="https://vimwiki.github.io/">vimwiki</a>, a system simple and elegant.
|
|
It provided most of the features needed for a zettelkasten, and supported standard markdown.
|
|
During this period I grew comfortable with Vim, which I consider <i>the</i> premier editing experience.
|
|
</p>
|
|
|
|
<p>
|
|
I began to use <a href="https://taskwarrior.org/">Taskwarrior</a>, an amazing command-line task management tool.
|
|
<a href="https://github.com/tools-life/taskwiki">Taskwiki</a> is another amazing vim extension that maps tasks between vimwiki and taskwarrior, allowing you to create "viewports" with various Taskwarrior filters.
|
|
The combination of Vimwiki and Taskwarrior is exceptionally comfortable, and taught me my first important lesson: <i>tasks</i> and <i>data</i> are inseparable.
|
|
It is impossible to provide sufficient information to do a task if that task is separated from its context, its data and metadata.
|
|
</p>
|
|
|
|
<p>
|
|
Eventually I grew tired of the limitations of editing text in a terminal.
|
|
Vim doesn't support graphical things very well, and I wanted to view images inside my notes.
|
|
While various extensions solve this problem, and adjacent problems, I had at this time noticed <a href="https://www.dendron.so/">dendron</a>.
|
|
</p>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-dendron" class="outline-3">
|
|
<h3 id="dendron">Dendron</h3>
|
|
<div class="outline-text-3">
|
|
<p>
|
|
Dendron features a mixed hierarchical/networked note setup, which (according to the creators) scales well with heavy use.
|
|
While I still have not reached the ~10k note count that the authors asserted Dendron would survive, the structure appealed to me because at the time I was working with several sorts of knowledge that a hierarchy represents well–things like programming language concepts in multiple languages.
|
|
Dendron also features a note-graph, which represents both the hierarchy of notes and the links between notes.
|
|
This feature was most attractive to me, as inside Vim I was having trouble visualizing my entire zettelkasten.
|
|
</p>
|
|
|
|
<p>
|
|
Overall, the featureset provided enough value that I made the change.
|
|
I adapted all of my vimwiki links (or most!) to Dendron's format, and began to implement some of Dendron's more advanced features in my daily use.
|
|
I installed VSCode and a Vim emulation plugin, and away I went.
|
|
</p>
|
|
|
|
<p>
|
|
The first snag I ran into was the limitations of Vim emulation plugins, so I switched that plugin to <a href="https://github.com/vscode-neovim/vscode-neovim">vscode-neovim</a>, which embeds neovim into VSCode.
|
|
I learned a value here: closer to Vim is more comfortable.
|
|
Vim truly allows you to "edit text at the speed of thought".
|
|
Its modal paradigm turns the keyboard into a uniquely fluid control panel, optimized for text editing.
|
|
Extensions often miss features or have subtle bugs.
|
|
The closer I can get to actual Vim, the more comfortable I am when it is time to edit.
|
|
</p>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-vim-v2" class="outline-3">
|
|
<h3 id="vim-v2">Vim (V2)</h3>
|
|
<div class="outline-text-3">
|
|
<p>
|
|
After Vim emulation, VSCode+Dendron's most significant problem was its lack of serious todo functionality.
|
|
Taskwarrior and its sister program Timewarrior had previously handled my todo lists, while Vimwiki handled documentation and project management.
|
|
Dendron had no such extension.
|
|
VSCode's slow startup time wore at me, and I decided I didn't appreciate all of the higher-order features of Dendron.
|
|
Additionally, around this time development on Dendron ceased, and while the project leader declared it good enough to manage his personal projects, several rough edges and missing features took away from its initial promise.
|
|
</p>
|
|
|
|
<p>
|
|
I switched to Vim again for a short time, and tried to find plugins to piece together some of Dendron's features while avoiding the pain points.
|
|
Around this time I discovered another innovation, "Emacs Org-mode."
|
|
<a href="https://www.youtube.com/watch?v=SzA2YODtgK4">This video</a> by Harry Schwartz from thoughtbot showed up in my feed.
|
|
Reluctantly, I watched it.
|
|
After seeing the power of Org-mode I decided to give it a try.
|
|
</p>
|
|
</div>
|
|
</div>
|
|
<div id="outline-container-org-mode" class="outline-3">
|
|
<h3 id="org-mode">Org-mode</h3>
|
|
<div class="outline-text-3">
|
|
<blockquote>
|
|
<p>
|
|
This entire post will probably devolve into a shill for Emacs and org-mode at this point, but bear with me as I explain my use-case and needs first.
|
|
</p>
|
|
</blockquote>
|
|
|
|
<p>
|
|
So, here we go again.
|
|
Another transition.
|
|
Each of the last has cost me more than a few hours of troubleshooting and problems and configuration.
|
|
Theoretically, I was using markdown the entire time, but the unique link formats from Vimwiki and Dendron made transitions difficult.
|
|
</p>
|
|
|
|
<p>
|
|
Now I'm preparing to switch to another format, one with completely incompatible links, formatting, and functionality.
|
|
</p>
|
|
|
|
<p>
|
|
In fact, all of my links broke.
|
|
All my code-blocks broke.
|
|
All my LaTeX math snippets broke.
|
|
</p>
|
|
|
|
<p>
|
|
It took me weeks to reach the same level of productivity.
|
|
But Org-mode's features are amazing, and it was well worth the transition.
|
|
</p>
|
|
|
|
<p>
|
|
The ability to write and evaluate code, mixed in with all my notes, is amazing.
|
|
</p>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-python"><span class="org-builtin">print</span>(<span class="org-string">"Hello!"</span>)
|
|
<span class="org-builtin">print</span>( 2 <span class="org-operator">+</span> 2 )
|
|
</pre>
|
|
</div>
|
|
|
|
<pre class="example">
|
|
Hello!
|
|
4
|
|
</pre>
|
|
|
|
|
|
<p>
|
|
Emacs' power and scriptability far outstrips everything that Vim had to offer, and Evil mode satisfies my desire for Vim's editing model.
|
|
</p>
|
|
|
|
<p>
|
|
Emacs also handles task management.
|
|
The default org-mode todo manager is fine, but with the addition of <a href="https://www.nongnu.org/org-edna-el/">edna</a> for better dependency management and <a href="https://gist.github.com/d12frosted/a60e8ccb9aceba031af243dff0d19b2e">d12frosted's</a> little hack for todo-items in hundreds of files, it becomes much easier to manage projects spread across a zettelkasten of knowledge.
|
|
<a href="https://www.orgroam.com/">org-roam</a> is the final piece of the puzzle, integrating the best of ID-based linking and backlink features into emacs.
|
|
</p>
|
|
</div>
|
|
|
|
<div id="outline-container-kill-write-ten-zettels" class="outline-4">
|
|
<h4 id="kill-write-ten-zettels">KILL Write ten zettels</h4>
|
|
<div class="outline-text-4">
|
|
</div>
|
|
</div>
|
|
<div id="outline-container-rewrite-d12frosted-s-absurd-code-into-a-simple-ripgrep-script" class="outline-4">
|
|
<h4 id="rewrite-d12frosted-s-absurd-code-into-a-simple-ripgrep-script"><span class="todo TODO">TODO</span> Rewrite d12frosted's absurd code into a simple ripgrep script</h4>
|
|
</div>
|
|
<div id="outline-container-finish-up-this-post" class="outline-4">
|
|
<h4 id="finish-up-this-post"><span class="done DONE">DONE</span> Finish up this post</h4>
|
|
<div class="outline-text-4">
|
|
<p>
|
|
Org-mode provides far too many features to cover here, but suffice it to say I am very happy with this setup.
|
|
I have complete freedom to do anything I need to do, all in plain-text, all with an easily-hackable and infinitely customizeable interface.
|
|
</p>
|
|
|
|
<p>
|
|
It has many issues, and I'll put out another blog post some day detailing the problems I've encountered so far, along with what I have as far as mitigations.
|
|
Despite the issues, I heartily recommend Emacs to anyone looking for the ultimate endgame in text-editing capability.
|
|
</p>
|
|
|
|
<p>
|
|
Other editors are great. VSCode is easy to use, Vim is wicked fast, and Neovim is great.
|
|
Emacs is superior in extensibility, it is superior in user-focus, and it is ultimately the most comfortable editor I've ever used.
|
|
If you think you can handle the learning curve, I invite you to dive in.
|
|
</p>
|
|
|
|
<p>
|
|
At the least, don't waste as much time as I did trying to find the perfect setup.
|
|
</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
|
|
<div id="outline-container-misc-software" class="outline-2">
|
|
<h2 id="misc-software">Misc. Software</h2>
|
|
<div class="outline-text-2" id="text-misc-software">
|
|
</div>
|
|
<div id="outline-container-version-control" class="outline-3">
|
|
<h3 id="version-control">Version Control</h3>
|
|
<div class="outline-text-3">
|
|
<p>
|
|
I began using git around halfway through my wiki process.
|
|
I wasn't very familiar with it when I began, but I've come to value it as a part of my daily workflow.
|
|
It certainly makes data recovery easy, and coupled with a personal <a href="https://git.freedomland.xyz/judahsotomayor">gitea</a> instance it allows me to back up and access my projects from anywhere.
|
|
</p>
|
|
</div>
|
|
</div>
|
|
<div id="outline-container-document-production" class="outline-3">
|
|
<h3 id="document-production">Document Production</h3>
|
|
<div class="outline-text-3">
|
|
<p>
|
|
Half of org-mode's appeal is perfectly typset documents with LaTeX.
|
|
I have a full texlive install on my writing machine, along with an extensive configuration for APA, MLA, and Turabian.
|
|
I also have Citar set up with org-cite and Zotero to make citations a breeze.
|
|
So far, manual formatting has been a thing of the past.
|
|
</p>
|
|
</div>
|
|
</div>
|
|
<div id="outline-container-encryption" class="outline-3">
|
|
<h3 id="encryption">Encryption</h3>
|
|
<div class="outline-text-3">
|
|
<p>
|
|
I use GPG and <a href="https://github.com/FiloSottile/age">age</a> to encrypt sensitive documents such as my journal files.
|
|
It works fairly well with org-roam, which supports transparent file encryption.
|
|
</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
]]></description>
|
|
</item>
|
|
|
|
<item>
|
|
<title>RSS Feed</title>
|
|
<link>https://judah.freedomland.xyz//posts/rss-feed.html</link>
|
|
<author>author@mail.com (Blog Author)</author>
|
|
<guid isPermaLink="false">https://judah.freedomland.xyz//posts/rss-feed.html</guid>
|
|
|
|
<pubDate>Thu, 21 Dec 2023 00:00:00 -0500</pubDate>
|
|
|
|
<description><![CDATA[<p>
|
|
Rather than an email-based subscription service, I'll be using <a href="https://en.wikipedia.org/wiki/RSS#:~:text=RSS%20(RDF%20Site%20Summary%20or,standardized%2C%20computer%2Dreadable%20format.">RSS</a>.
|
|
It's an amazing subscription mechanism used by a lot of blogs and podcasts.
|
|
All you need to subscribe is an RSS client, which you can pass my <a href="https://judah.freedomland.xyz//feed.xml">link</a>.
|
|
</p>
|
|
]]></description>
|
|
</item>
|
|
|
|
<item>
|
|
<title>My SSH Key</title>
|
|
<link>https://judah.freedomland.xyz//posts/my-ssh-key.html</link>
|
|
<author>author@mail.com (Blog Author)</author>
|
|
<guid isPermaLink="false">https://judah.freedomland.xyz//posts/my-ssh-key.html</guid>
|
|
|
|
<pubDate>Wed, 08 Nov 2023 00:00:00 -0500</pubDate>
|
|
|
|
<description><![CDATA[<p>
|
|
In the interest of integrity, here is my public ssh key.
|
|
This is the key I use to sign all of my commits.
|
|
If any project purports to be from me, and is <i>not</i> signed by this key, there is a strong chance it is disingenuous.
|
|
</p>
|
|
|
|
<div id="outline-container-key" class="outline-2">
|
|
<h2 id="key">Key:</h2>
|
|
<div class="outline-text-2">
|
|
<pre class="example" id="org74569d5">
|
|
|
|
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAII0YkBVeeBhoCm/+6mCteO7Ikv528ZDmg/tYtWc6O1qP
|
|
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-fingerprint" class="outline-2">
|
|
<h2 id="fingerprint">Fingerprint:</h2>
|
|
<div class="outline-text-2">
|
|
<pre class="example" id="orgb9c3ae5">
|
|
|
|
SHA256:9Dq4ppxhfAjbX+7HLXEt+ROMiIojI6kqQgUyFUJb9lI
|
|
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-directions" class="outline-2">
|
|
<h2 id="directions">Directions</h2>
|
|
<div class="outline-text-2">
|
|
<p>
|
|
If you're cloning a project off a major git platform, you can check that the latest commit states "Verified" or "Signed".
|
|
Then you can check that my key fingerprint matches with the one above.
|
|
</p>
|
|
|
|
<p>
|
|
If you've gotten ahold of source code some other way, run <code class="src src-sh">git verify-commit HEAD</code> to ensure that the latest commit has been signed.
|
|
</p>
|
|
</div>
|
|
|
|
<div id="outline-container-example" class="outline-3">
|
|
<h3 id="example">Example</h3>
|
|
<div class="outline-text-3">
|
|
<div class="org-src-container">
|
|
<pre class="src src-bash">git verify-commit HEAD
|
|
</pre>
|
|
</div>
|
|
<pre class="example">
|
|
|
|
Good "git" signature for development@freedomland.xyz with ED25519 key SHA256:9Dq4ppxhfAjbX+7HLXEt+ROMiIojI6kqQgUyFUJb9lI
|
|
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-website-repo" class="outline-2">
|
|
<h2 id="website-repo">Website repo</h2>
|
|
<div class="outline-text-2">
|
|
<p>
|
|
<a href="https://git.freedomland.xyz/judahsotomayor/website">This link</a> directs to my website's source code.
|
|
You can check that the latest commits are signed with my key.
|
|
</p>
|
|
</div>
|
|
</div>
|
|
]]></description>
|
|
</item>
|
|
|
|
<item>
|
|
<title>QubesOS Signing Key</title>
|
|
<link>https://judah.freedomland.xyz//posts/qubesos-signing-key.html</link>
|
|
<author>author@mail.com (Blog Author)</author>
|
|
<guid isPermaLink="false">https://judah.freedomland.xyz//posts/qubesos-signing-key.html</guid>
|
|
|
|
<description><![CDATA[<div class="alert" id="org8bc54db">
|
|
<div class="alert-heading" id="org99298ed">
|
|
<p>
|
|
Double check your keys!
|
|
</p>
|
|
|
|
</div>
|
|
<p>
|
|
Do not blindly trust me.
|
|
Find another website or another source for the key.
|
|
</p>
|
|
|
|
<p>
|
|
Find a photograph or other item that is difficult to forge.
|
|
</p>
|
|
|
|
</div>
|
|
|
|
<p>
|
|
This is the signature for the Qubes master signing key.
|
|
I provide it here as another copy of a currently known-good key.
|
|
The QMSK is the root of trust for all QubesOS development.
|
|
Qubes release keys and developer keys are all signed with the QMSK.
|
|
</p>
|
|
|
|
<p>
|
|
Please see <a href="https://www.qubes-os.org/security/verifying-signatures/#how-to-import-and-authenticate-the-qubes-master-signing-key">the Qubes website</a> for more information.
|
|
</p>
|
|
|
|
<pre class="example" id="orgdad35a8">
|
|
|
|
427F 11FD 0FAA 4B08 0123
|
|
F0IC DDFA 1A3E 3687 9494
|
|
|
|
</pre>
|
|
]]></description>
|
|
</item>
|
|
|
|
|
|
</channel>
|
|
</rss>
|