<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Zacalot.XYZ</title><link>https://zacalot.xyz/</link><description>Recent content on Zacalot.XYZ</description><generator>Hugo</generator><language>en-US</language><copyright>CC BY 4.0</copyright><lastBuildDate>Sat, 04 Nov 2023 12:19:49 -0500</lastBuildDate><atom:link href="https://zacalot.xyz/index.xml" rel="self" type="application/rss+xml"/><item><title>Getting C# Autocomplete on Windows Emacs</title><link>https://zacalot.xyz/post/tech/csharp-lsp-on-windows/</link><pubDate>Sat, 04 Nov 2023 00:00:00 -0500</pubDate><guid>https://zacalot.xyz/post/tech/csharp-lsp-on-windows/</guid><description>&lt;p&gt;I recently started getting back into working in the &lt;a href="https://godotengine.org/"&gt;Godot Engine&lt;/a&gt; some and I wanted to use C# in it, so of course the first step of this was to try and make &lt;a href="https://www.gnu.org/software/emacs/"&gt;Emacs&lt;/a&gt; a usable development environment for this.&lt;/p&gt;
&lt;p&gt;The kind of autocomplete that is desirable for working in C# is something like the IntelliSense that Microsoft offers in their Visual Studio products, as it allows your editor to understand your project&amp;rsquo;s structure in a manner that gives you useful tools such as auto completion, linting, error checking, etc. This functionality can be added to Emacs by installing a package for interfacing with a Language Server Protocol (LSP) server, which runs as a separate program Emacs communicates with by LSP, a JSON-RPC protocol.&lt;/p&gt;</description></item><item><title>Debloating Social Media Platforms</title><link>https://zacalot.xyz/post/tech/debloating-socials/</link><pubDate>Thu, 01 Jun 2023 00:00:00 -0500</pubDate><guid>https://zacalot.xyz/post/tech/debloating-socials/</guid><description>&lt;p&gt;Websites like Twitter, Youtube, and Reddit are becoming increasingly bloated with JS, libraries, trackers, and all sorts of other baggage. So this a simple setup to avoid all that with the Redirector browser extension and some alternative front-ends to these platforms, such as: &lt;a href="https://nitter.unixfox.eu"&gt;https://nitter.unixfox.eu&lt;/a&gt;, &lt;a href="https://www.yewtu.be"&gt;https://www.yewtu.be&lt;/a&gt;, and &lt;a href="https://old.reddit.com"&gt;https://old.reddit.com&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s also worth noting &lt;a href="https://libredirect.github.io/"&gt;LibRedirect&lt;/a&gt; is a simple way to get these redirects and more, but I prefer the flexibility of this method.&lt;/p&gt;
&lt;h2 id="installing-redirector"&gt;Installing Redirector&lt;/h2&gt;
&lt;p&gt;First, install the &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/redirector/"&gt;Redirector&lt;/a&gt; extension. I use FireFox, but it also seems to exist for &lt;a href="https://chrome.google.com/webstore/detail/redirector/ocgpenflpmgnfapjedencafcfakcekcd"&gt;Chrome&lt;/a&gt; as well. This is a neat extension that allows one to redirect any accessed URL to a different one, enabling us to effectively convert all links from these platforms to alternative ones.&lt;/p&gt;</description></item><item><title>Diagramming Org-Mode Headline Hierarchies with Org-Babel</title><link>https://zacalot.xyz/post/tech/diagramming-org-mode-headlines/</link><pubDate>Thu, 01 Jun 2023 00:00:00 -0500</pubDate><guid>https://zacalot.xyz/post/tech/diagramming-org-mode-headlines/</guid><description>&lt;p&gt;A while back the need arose to generate graphs of some hierarchies, so I thought it would be convenient to generate diagrams from org-mode headlines using &lt;a href="https://graphviz.org/"&gt;Graphviz&lt;/a&gt;. Here&amp;rsquo;s an org-mode document capable of generating graphs using org-babel, using Elisp to convert the headline structure into JSON and Python to convert that JSON into a graphviz diagram:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-org" data-lang="org"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#+begin_src &lt;/span&gt;&lt;span style="color:#75715e"&gt;emacs-lisp&lt;/span&gt;&lt;span style="color:#75715e"&gt; :results silent
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(require &lt;span style="color:#e6db74"&gt;&amp;#39;org-element&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(defun pygraphing/get-headline-structure(id)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (json-encode (pygraphing/get-headline-descendents id)))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(defun pygraphing/get-headline-by-id(id)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Returns headline from ID&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (let ((header &lt;span style="color:#66d9ef"&gt;nil&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	(org-element-map (org-element-parse-buffer) &lt;span style="color:#e6db74"&gt;&amp;#39;headline&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	 (lambda (hl)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		(when (string= (org-element-property :ID hl) id)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		 (setq header hl))))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	header))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(defun pygraphing/get-headline-tags(id)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Returns tags of item by ID&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (let (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		(header (pygraphing/get-headline-by-id id)))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	(when header
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	 (&lt;span style="color:#a6e22e"&gt;list&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	 :ID (org-element-property :ID header)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	 ))))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(defun pygraphing/get-headline-children-ids(id)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Returns child ids of a headline by its ID&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (let ((header (pygraphing/get-headline-by-id id)))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	(&lt;span style="color:#a6e22e"&gt;delq&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;nil&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;mapcar&lt;/span&gt; (lambda(child)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;						(org-element-property :ID child))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;					 (org-element-contents header)))))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(defun pygraphing/get-headline-descendents(id)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Returns all descendents of headline&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (let ((header (pygraphing/get-headline-by-id id)))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	(when header
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	 (let ((children (pygraphing/get-headline-children-ids id)))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#f92672"&gt;`&lt;/span&gt;((header &lt;span style="color:#f92672"&gt;.&lt;/span&gt; &lt;span style="color:#f92672"&gt;,&lt;/span&gt;(org-element-property :raw-value header))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		 (tags &lt;span style="color:#f92672"&gt;.&lt;/span&gt; &lt;span style="color:#f92672"&gt;,&lt;/span&gt;(pygraphing/get-headline-tags id))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		 (children &lt;span style="color:#f92672"&gt;.&lt;/span&gt; &lt;span style="color:#f92672"&gt;,&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;delq&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;nil&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;mapcar&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;								 (lambda(childID)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;									(pygraphing/get-headline-descendents childID))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;								 children))))))))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#+end_src&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#+begin_src &lt;/span&gt;&lt;span style="color:#75715e"&gt;python&lt;/span&gt;&lt;span style="color:#75715e"&gt; :results file :dir (org-attach-dir) :var result=(pygraphing/get-headline-structure &amp;#34;1ff8ce7d-be78-4bd2-afa0-05be1fb9d9d2&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;import&lt;/span&gt; graphviz
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;import&lt;/span&gt; json
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; dot &lt;span style="color:#f92672"&gt;=&lt;/span&gt; graphviz&lt;span style="color:#f92672"&gt;.&lt;/span&gt;Digraph()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; root_header &lt;span style="color:#f92672"&gt;=&lt;/span&gt; json&lt;span style="color:#f92672"&gt;.&lt;/span&gt;loads(result)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;graph_header&lt;/span&gt;(header,parent&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;None&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	 nodeName &lt;span style="color:#f92672"&gt;=&lt;/span&gt; header[&lt;span style="color:#e6db74"&gt;&amp;#34;header&amp;#34;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	 dot&lt;span style="color:#f92672"&gt;.&lt;/span&gt;node(nodeName)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	 &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; parent:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		 dot&lt;span style="color:#f92672"&gt;.&lt;/span&gt;edge(parent,nodeName)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	 &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; header[&lt;span style="color:#e6db74"&gt;&amp;#34;children&amp;#34;&lt;/span&gt;]:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		 &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; child &lt;span style="color:#f92672"&gt;in&lt;/span&gt; header[&lt;span style="color:#e6db74"&gt;&amp;#34;children&amp;#34;&lt;/span&gt;]:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			 graph_header(child,nodeName)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; graph_header(root_header)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; dot&lt;span style="color:#f92672"&gt;.&lt;/span&gt;render(outfile&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;diagram.png&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#+end_src&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;*&lt;span style="font-weight:bold"&gt; Root&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;:PROPERTIES:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;:ID: 1ff8ce7d-be78-4bd2-afa0-05be1fb9d9d2
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;:END:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;**&lt;/span&gt; Child A
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;:PROPERTIES:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;:ID: ce64aa4c-3ed1-4535-ab97-7b486884ae05
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;:END:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;***&lt;/span&gt; Child A-A
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;:PROPERTIES:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;:ID: 836d5265-7860-4a36-ab9e-bec1ca2bffd8
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;:END:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;****&lt;/span&gt; Child A-A-A
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;:PROPERTIES:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;:ID: 3f0d25a4-4b1a-49ff-8862-22f2d83631b0
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;:END:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;****&lt;/span&gt; Child A-A-B
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;:PROPERTIES:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;:ID: a53df412-244a-4c35-9dcb-0466bb2d2d40
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;:END:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;***&lt;/span&gt; Child A-B
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;**&lt;/span&gt; Child B
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;:PROPERTIES:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;:ID: 3fc2535b-3fa8-4f05-bfb1-9735bc88d2d8
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;:END:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;***&lt;/span&gt; Child B-A
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;:PROPERTIES:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;:ID: 96b0087c-306f-4b7c-92b2-bcc786bb1491
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;:END:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;***&lt;/span&gt; Child B-B
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;:PROPERTIES:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;:ID: 431857d5-6e64-4bb3-aa67-8eb9369fb776
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;:END:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;***&lt;/span&gt; Child B-C
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;:PROPERTIES:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;:ID: a8f166e1-12e6-4dda-85e7-4d0668dce02e
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;:END:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;(Note: Before continuing, make sure you have the &lt;code&gt;graphviz&lt;/code&gt; package installed for python with &lt;code&gt;python -m pip install graphviz&lt;/code&gt;)&lt;/p&gt;</description></item><item><title>Site Setup</title><link>https://zacalot.xyz/post/tech/site-setup/</link><pubDate>Mon, 29 May 2023 00:00:00 -0500</pubDate><guid>https://zacalot.xyz/post/tech/site-setup/</guid><description>&lt;p&gt;Currently this site is:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Edited with &lt;a href="https://www.gnu.org/software/emacs/"&gt;Emacs&lt;/a&gt; in &lt;a href="https://orgmode.org/"&gt;org-mode&lt;/a&gt; via &lt;a href="https://orgmode.org/manual/Using-capture.html"&gt;org-capture&lt;/a&gt; and exported with &lt;a href="https://ox-hugo.scripter.co/"&gt;ox-hugo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Built through &lt;a href="https://github.com/gohugoio/hugo"&gt;Hugo&lt;/a&gt; with a (bearly) modified &lt;a href="https://github.com/clente/hugo-bearcub"&gt;Bear Cub&lt;/a&gt; theme&lt;/li&gt;
&lt;li&gt;Served with &lt;a href="https://nginx.org/"&gt;nginx&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Accessed through &lt;a href="https://developers.cloudflare.com/cloudflare-one/connections/connect-apps"&gt;Cloudflare Tunnel&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Personals</title><link>https://zacalot.xyz/person/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://zacalot.xyz/person/</guid><description>&lt;h2 id="contact"&gt;Contact&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Email: &lt;a href='mailto:xyz@zacalot.xyz?subject=Reply%20to%20"Personals"'&gt;xyz@zacalot.xyz&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="code"&gt;Code&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/Zacalot"&gt;Github&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="misc"&gt;Misc&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/@zacalot/videos"&gt;Youtube&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://x.com/zacalotxyz"&gt;X Social&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://bsky.app/profile/zacalot.bsky.social"&gt;Bluesky&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>The Legend of Satoshi</title><link>https://zacalot.xyz/project/games/thelegendofsatoshi/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://zacalot.xyz/project/games/thelegendofsatoshi/</guid><description>&lt;p&gt;Click the square below to play &lt;em&gt;The Legend of Satoshi&lt;/em&gt; (Press &lt;code&gt;F11&lt;/code&gt; for fullscreen, requires WebAssembly and WebGL)&lt;/p&gt;
&lt;div style="width: 100%; overflow: hidden;" id="game-border"&gt;
 &lt;div style="width: 100%; height: 100%; background-color: #1a1c2c; cursor: pointer; text-align: center; color: white; display: flex; justify-content: center; align-items: center; " id="game-cover"&gt;&lt;/div&gt;
 &lt;canvas style="width: 100%; height: 100%; image-rendering: pixelated; display: none;" id="canvas" oncontextmenu="event.preventDefault()" onmousedown="window.focus()"&gt;&lt;/canvas&gt;
&lt;/div&gt;
&lt;script type="text/javascript"&gt;
 var Module = 
 {
	 canvas: document.getElementById('canvas'),
	 arguments:['/tic80/the_legend_of_satoshi.tic']
 }

 function resize()
 {
 let gameBorder = document.getElementById('game-border');
 gameBorder.style.height = gameBorder.clientWidth * 144 / 256 + 'px';
 }

 resize();

 document.getElementById('game-cover').addEventListener('click', function()
 {
 document.getElementById('canvas').style.display = 'block'

 let scriptTag = document.createElement('script'),
 firstScriptTag = document.getElementsByTagName('script')[0];

 scriptTag.src = '/tic80/tic80.js';
 firstScriptTag.parentNode.insertBefore(scriptTag, firstScriptTag);

 this.remove();
 })

 window.addEventListener('resize', resize);
&lt;/script&gt;</description></item></channel></rss>