<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>shindakun dot dev</title>
    <link>https://shindakun.dev/</link>
    <description>Recent content on shindakun dot dev</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <lastBuildDate>Fri, 28 Jun 2024 09:00:40 -0700</lastBuildDate>
    
	<atom:link href="https://shindakun.dev/index.xml" rel="self" type="application/rss+xml" />
    
    
    <item>
      <title>obsidian-markdown-export-plugin</title>
      <link>https://shindakun.dev/posts/obsidian-markdown-export-plugin/</link>
      <pubDate>Fri, 28 Jun 2024 09:00:40 -0700</pubDate>
      
      <guid>https://shindakun.dev/posts/obsidian-markdown-export-plugin/</guid>
      <description>&lt;h2 id=&#34;intro&#34;&gt;Intro&lt;/h2&gt;
&lt;p&gt;Dusting off my blog has lead me to look again at my posting workflow. Since I want it to be as low friction as possible. Typically I write my posts in Obsidian and then copy the Markdown file to my posts directory. That directory is checked into GitHub. This left a lot to be desired, images were typically left out of the loop and were uploaded separately to my server.&lt;/p&gt;
&lt;h2 id=&#34;a-better-way&#34;&gt;A Better Way&lt;/h2&gt;
&lt;p&gt;Looking to smooth out the process led me to a post from a little while back from &lt;a href=&#34;https://cassidoo.co/post/publishing-from-obsidian/&#34;&gt;Cassidy Williams&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The &lt;a href=&#34;https://github.com/cassidoo/blahg&#34;&gt;repository for this blog&lt;/a&gt; is separate from my Obsidian vault, so normally I have to do some copying and pasting across folders, which is &lt;em&gt;fine&lt;/em&gt; but really slows me down.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Amen to that! But there is a solution the cleverly named &lt;code&gt;obsidian-markdown-export-plugin&lt;/code&gt; which after a &lt;a href=&#34;https://github.com/bingryan/obsidian-markdown-export-plugin/issues/52&#34;&gt;feature request&lt;/a&gt; supports out of the vault exports with attachments no less! Thanks Cassidy for that request. And thanks to &lt;a href=&#34;https://github.com/bingryan&#34;&gt;bingryan&lt;/a&gt; for the plugin!&lt;/p&gt;
&lt;h3 id=&#34;an-even-better-way&#34;&gt;An Even Better Way&lt;/h3&gt;
&lt;p&gt;Problem is it&amp;rsquo;s not quite what I needed for my Hugo blog. I need it to export using the Markdown filename as part of the path and to include the images attachment directory within that.&lt;/p&gt;
&lt;p&gt;So if my content was in&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;/posts
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I would want the output to be&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;/posts/Title of Markdown File/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;/posts/Title of Markdown File/attachments
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;At first I put in a &lt;a href=&#34;https://github.com/bingryan/obsidian-markdown-export-plugin/issues/85&#34;&gt;feature request&lt;/a&gt; of my own. But after a few moments I got the itch to see if I could just hack something together. So I cloned the repo to take a look at the code.&lt;/p&gt;
&lt;p&gt;A bit a sniffing around and I found the couple of places where the code creates the directories and exports the image files.&lt;/p&gt;
&lt;p&gt;A quick path addition later&amp;hellip;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#268bd2&#34;&gt;var&lt;/span&gt; dir &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; file.name.replace(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;.md&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#586e75&#34;&gt;// try create attachment directory
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;&lt;/span&gt;		&lt;span style=&#34;color:#268bd2&#34;&gt;await&lt;/span&gt; tryCreateFolder(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			&lt;span style=&#34;color:#719e07&#34;&gt;this&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			path.join(&lt;span style=&#34;color:#719e07&#34;&gt;this&lt;/span&gt;.settings.output, dir, &lt;span style=&#34;color:#719e07&#34;&gt;this&lt;/span&gt;.settings.attachment),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And we had the right folder structure in place!&lt;/p&gt;
&lt;p&gt;One more quick tweak and we had images saving in the correct spot too!&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;					&lt;span style=&#34;color:#268bd2&#34;&gt;var&lt;/span&gt; dir &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; filename.replace(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;.md&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;					&lt;span style=&#34;color:#268bd2&#34;&gt;const&lt;/span&gt; targetPath &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; path
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;						.join(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;							plugin.settings.output,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;							dir,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;							plugin.settings.attachment,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;							imageLinkMd5.concat(imageExt),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;						)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;						.replace(&lt;span style=&#34;color:#dc322f&#34;&gt;/\\/g&lt;/span&gt;, &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;/&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Alright! That&amp;rsquo;s the end of our journey right?! Well, not quite. In this case I ended up with the output being&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;/posts/Title of Markdown File/Title of Markdown File.md
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;/posts/Title of Markdown File/attachments/randomimage.png
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This seemed to cause Hugo to render extra directories which would make my site look like this&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;http://shindakun.dev/title-of-markdown-file/title-of-markdown-file/index.html
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And that just can&amp;rsquo;t stand! So instead of saving as the filename I had it save directly to &lt;code&gt;index.md&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				&lt;span style=&#34;color:#719e07&#34;&gt;case&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;markdown&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;:&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;					&lt;span style=&#34;color:#268bd2&#34;&gt;const&lt;/span&gt; targetFile &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; path.join(outDir, &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;index.md&amp;#34;&lt;/span&gt;);&lt;span style=&#34;color:#586e75&#34;&gt;// file.name);
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;&lt;/span&gt;					&lt;span style=&#34;color:#268bd2&#34;&gt;await&lt;/span&gt; tryCreate(plugin, targetFile, content);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;					&lt;span style=&#34;color:#719e07&#34;&gt;break&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This tells Hugo to not render any further and instead we end up with the path of&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;http://shindakun.dev/title-of-markdown-file/index.html
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Just what the doctor ordered!&lt;/p&gt;
&lt;h3 id=&#34;wrapping-up&#34;&gt;Wrapping Up&lt;/h3&gt;
&lt;p&gt;Now I just need to decide if I&amp;rsquo;m going to brush off my TypeScript knowledge and clean up the patch I did to actually use a setting and give people the option to have output like this. What do you say? Should I?&lt;/p&gt;
&lt;hr&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&#34;text-align:center&#34;&gt;Enjoy this post?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;&lt;a href=&#34;https://ko-fi.com/shindakun&#34;&gt;How about buying me a coffee?&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
</description>
    </item>
    
    <item>
      <title>go-feedi</title>
      <link>https://shindakun.dev/posts/go-feedi/</link>
      <pubDate>Wed, 26 Jun 2024 20:03:43 -0700</pubDate>
      
      <guid>https://shindakun.dev/posts/go-feedi/</guid>
      <description>&lt;h2 id=&#34;intro&#34;&gt;Intro&lt;/h2&gt;
&lt;p&gt;For months now I&amp;rsquo;ve had a tab open in my browser on my main computer - &lt;a href=&#34;https://olano.dev/blog/reclaiming-the-web-with-a-personal-reader&#34;&gt;Reclaiming the Web with a Personal Reader&lt;/a&gt;. I&amp;rsquo;ve read the article a couple of times and really like the idea of using a personal and extendable feed reader.&lt;/p&gt;
&lt;p&gt;Finally around a week ago I cloned the repo from &lt;a href=&#34;https://github.com/facundoolano/feedi&#34;&gt;GitHub&lt;/a&gt; to check it out. After a couple of tweaks to the Makefile to make it work with my laptops configuration I was up and running. Someone else noticed the thing with the port being in use so they submitted a pull request on the repo so I didn&amp;rsquo;t have to.&lt;/p&gt;
&lt;p&gt;Overall, I really liked it! I did discover a &lt;a href=&#34;https://github.com/facundoolano/feedi/pull/99&#34;&gt;small typo&lt;/a&gt; which kept feeds from syncing when you clicked the sync button. Though to be fair I shouldn&amp;rsquo;t have needed to click sync, I think it should have imported the initial feeds when I ran &lt;code&gt;make feed-load&lt;/code&gt;. But that&amp;rsquo;s just a little thing.&lt;/p&gt;
&lt;p&gt;Python isn&amp;rsquo;t my strongest language so while I can follow along with the code OK I don&amp;rsquo;t feel like I can extend it as I see fit&amp;hellip;&lt;/p&gt;
&lt;h2 id=&#34;desire-to-extend&#34;&gt;Desire to Extend&lt;/h2&gt;
&lt;p&gt;This led me to wanting to create my own version of the &amp;ldquo;personal feed reader&amp;rdquo;. Figuring this would be a good project for me to continue practicing my Go.&lt;/p&gt;
&lt;p&gt;First, I made a list of packages that would get me to most of the basic functionality of the feed reader, leaving off Mastodon for now.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/spf13/cobra&#34;&gt;https://github.com/spf13/cobra&lt;/a&gt;&lt;br&gt;
&lt;a href=&#34;https://git.deanishe.net/deanishe/go-favicon&#34;&gt;https://git.deanishe.net/deanishe/go-favicon&lt;/a&gt;&lt;br&gt;
&lt;a href=&#34;https://github.com/go-shiori/go-readability&#34;&gt;https://github.com/go-shiori/go-readability&lt;/a&gt;&lt;br&gt;
&lt;a href=&#34;https://github.com/go-co-op/gocron&#34;&gt;https://github.com/go-co-op/gocron&lt;/a&gt;&lt;br&gt;
&lt;a href=&#34;https://github.com/mmcdole/gofeed&#34;&gt;https://github.com/mmcdole/gofeed&lt;/a&gt;&lt;br&gt;
&lt;a href=&#34;https://github.com/PuerkitoBio/goquery&#34;&gt;https://github.com/PuerkitoBio/goquery&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m going to stick with using &lt;a href=&#34;https://htmx.org/&#34;&gt;htmx&lt;/a&gt; and &lt;a href=&#34;https://bulma.io/&#34;&gt;Bulma&lt;/a&gt; CSS as it&amp;rsquo;ll be a nice excuse to learn a bit about them.&lt;/p&gt;
&lt;p&gt;To start my hacking away on the project I began with using the Cobra command line tools to stand up a basic app. From here I added skeleton commands, &lt;code&gt;version&lt;/code&gt;, &lt;code&gt;feed-load&lt;/code&gt;, &lt;code&gt;serve&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;version&lt;/code&gt; - doesn&amp;rsquo;t do much of anything at the moment.&lt;br&gt;
&lt;code&gt;feed-load&lt;/code&gt; - reads a local CSV file and prints out the contents.&lt;br&gt;
&lt;code&gt;serve&lt;/code&gt; - starts the HTTP server on 3000 and is slowly being extended to do other tasks.&lt;/p&gt;
&lt;p&gt;What other tasks, you say?&lt;/p&gt;
&lt;p&gt;While right now running &lt;code&gt;serve&lt;/code&gt; will start up the web server, begin the scheduler and schedule a dummy job that just says &lt;code&gt;hello&lt;/code&gt;. It will also load the feed CSV and do some parsing of the included feeds and then use readability on the feed links.&lt;/p&gt;
&lt;h3 id=&#34;databasing&#34;&gt;Databasing&lt;/h3&gt;
&lt;p&gt;My next step is to start working on the database. I need to do some research on properly doing migrations. The Go program/library &lt;a href=&#34;https://github.com/golang-migrate/migrate/&#34;&gt;&lt;code&gt;migrate&lt;/code&gt;&lt;/a&gt; looks like it may be useful in &lt;a href=&#34;https://github.com/golang-migrate/migrate/blob/master/MIGRATIONS.md&#34;&gt;that regard&lt;/a&gt;. At first we&amp;rsquo;ll likely be modeling tables after what&amp;rsquo;s already presented to us as using the base feedi as a design building block.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;0_create_table.down.sql&lt;/code&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;DROP&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;TABLE&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;IF&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;EXISTS&lt;/span&gt; feeds;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;0_create_table.up.sql&lt;/code&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;CREATE&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;TABLE&lt;/span&gt; feeds (
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    id                  &lt;span style=&#34;color:#b58900&#34;&gt;INTEGER&lt;/span&gt;   &lt;span style=&#34;color:#719e07&#34;&gt;NOT&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;NULL&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    user_id             &lt;span style=&#34;color:#b58900&#34;&gt;INTEGER&lt;/span&gt;   &lt;span style=&#34;color:#719e07&#34;&gt;NOT&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;NULL&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    url                 &lt;span style=&#34;color:#b58900&#34;&gt;VARCHAR&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#719e07&#34;&gt;type&lt;/span&gt;                &lt;span style=&#34;color:#b58900&#34;&gt;VARCHAR&lt;/span&gt;   &lt;span style=&#34;color:#719e07&#34;&gt;NOT&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;NULL&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    name                &lt;span style=&#34;color:#b58900&#34;&gt;VARCHAR&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    icon_url            &lt;span style=&#34;color:#b58900&#34;&gt;VARCHAR&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    created             &lt;span style=&#34;color:#719e07&#34;&gt;TIMESTAMP&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;NOT&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;NULL&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    updated             &lt;span style=&#34;color:#719e07&#34;&gt;TIMESTAMP&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;NOT&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;NULL&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    last_fetch          &lt;span style=&#34;color:#719e07&#34;&gt;TIMESTAMP&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    raw_data            &lt;span style=&#34;color:#b58900&#34;&gt;VARCHAR&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    folder              &lt;span style=&#34;color:#b58900&#34;&gt;VARCHAR&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    etag                &lt;span style=&#34;color:#b58900&#34;&gt;VARCHAR&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    modified_header     &lt;span style=&#34;color:#b58900&#34;&gt;VARCHAR&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    filters             &lt;span style=&#34;color:#b58900&#34;&gt;VARCHAR&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    mastodon_account_id &lt;span style=&#34;color:#b58900&#34;&gt;INTEGER&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#719e07&#34;&gt;PRIMARY&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;KEY&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        id
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#719e07&#34;&gt;UNIQUE&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        user_id,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        name
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    )
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;With the up/down files in &lt;code&gt;./migrations&lt;/code&gt; I should be able to add a command &lt;code&gt;migrate&lt;/code&gt; and use the library to do the heavy lifting. I think, we&amp;rsquo;ll have to give it a whirl. Maybe I&amp;rsquo;ll write a small test project&amp;hellip;&lt;/p&gt;
&lt;p&gt;And my small test project was a success it seems. If you are interested here is the code.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;package&lt;/span&gt; main
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;import&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;database/sql&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;log&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;github.com/golang-migrate/migrate/v4&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;github.com/golang-migrate/migrate/v4/database/sqlite3&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;github.com/golang-migrate/migrate/v4/source/file&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	_ &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;github.com/mattn/go-sqlite3&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#268bd2&#34;&gt;main&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#586e75&#34;&gt;// Connect to database
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;&lt;/span&gt;	db, err &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; sql.&lt;span style=&#34;color:#268bd2&#34;&gt;Open&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;sqlite3&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;feeds.db&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; err &lt;span style=&#34;color:#719e07&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#cb4b16&#34;&gt;nil&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		log.&lt;span style=&#34;color:#268bd2&#34;&gt;Panic&lt;/span&gt;(err)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#586e75&#34;&gt;// defer close
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;&lt;/span&gt;	&lt;span style=&#34;color:#719e07&#34;&gt;defer&lt;/span&gt; db.&lt;span style=&#34;color:#268bd2&#34;&gt;Close&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	dbDriver, err &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; sqlite3.&lt;span style=&#34;color:#268bd2&#34;&gt;WithInstance&lt;/span&gt;(db, &lt;span style=&#34;color:#719e07&#34;&gt;&amp;amp;&lt;/span&gt;sqlite3.Config{})
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; err &lt;span style=&#34;color:#719e07&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#cb4b16&#34;&gt;nil&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		fmt.&lt;span style=&#34;color:#268bd2&#34;&gt;Printf&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;instance error: %v \n&amp;#34;&lt;/span&gt;, err)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	fileSource, err &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; (&lt;span style=&#34;color:#719e07&#34;&gt;&amp;amp;&lt;/span&gt;file.File{}).&lt;span style=&#34;color:#268bd2&#34;&gt;Open&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;file://migrations&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; err &lt;span style=&#34;color:#719e07&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#cb4b16&#34;&gt;nil&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		fmt.&lt;span style=&#34;color:#268bd2&#34;&gt;Printf&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;opening file error: %v \n&amp;#34;&lt;/span&gt;, err)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	m, err &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; migrate.&lt;span style=&#34;color:#268bd2&#34;&gt;NewWithInstance&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;file&amp;#34;&lt;/span&gt;, fileSource, &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;feeds.db&amp;#34;&lt;/span&gt;, dbDriver)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; err &lt;span style=&#34;color:#719e07&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#cb4b16&#34;&gt;nil&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		fmt.&lt;span style=&#34;color:#268bd2&#34;&gt;Printf&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;migrate error: %v \n&amp;#34;&lt;/span&gt;, err)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; err = m.&lt;span style=&#34;color:#268bd2&#34;&gt;Up&lt;/span&gt;(); err &lt;span style=&#34;color:#719e07&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#cb4b16&#34;&gt;nil&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		fmt.&lt;span style=&#34;color:#268bd2&#34;&gt;Printf&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;migrate up error: %v \n&amp;#34;&lt;/span&gt;, err)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	fmt.&lt;span style=&#34;color:#268bd2&#34;&gt;Println&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;Migrate up done with success&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&#34;text-align:center&#34;&gt;Enjoy this post?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;&lt;a href=&#34;https://ko-fi.com/shindakun&#34;&gt;How about buying me a coffee?&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
</description>
    </item>
    
    <item>
      <title>Getting Reacquainted With Hugo Again</title>
      <link>https://shindakun.dev/posts/getting-reacquainted-with-hugo-again/</link>
      <pubDate>Tue, 25 Jun 2024 20:55:20 -0700</pubDate>
      
      <guid>https://shindakun.dev/posts/getting-reacquainted-with-hugo-again/</guid>
      <description>&lt;h2 id=&#34;testing-testing-testing&#34;&gt;Testing testing testing&lt;/h2&gt;
&lt;p&gt;It&amp;rsquo;s been a bit since I&amp;rsquo;ve looked at my Hugo blog here on &lt;a href=&#34;https://shindakun.dev&#34;&gt;shindakun.dev&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It happens - life gets in the way of blogging.&lt;/p&gt;
&lt;p&gt;The nice thing about having everything in Git and GitHub is that for the most part all I need to do is make sure Hugo is up to date and works on the server. This post is a part of that process.&lt;/p&gt;
&lt;h2 id=&#34;hugo&#34;&gt;Hugo&lt;/h2&gt;
&lt;p&gt;First I built Hugo&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;➜  shindakun.dev git:&lt;span style=&#34;color:#719e07&#34;&gt;(&lt;/span&gt;master&lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt; ✗ &lt;span style=&#34;color:#268bd2&#34;&gt;CGO_ENABLED&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt; go install -tags extended github.com/gohugoio/hugo@latest
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Easy enough!&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;➜  shindakun.dev git:&lt;span style=&#34;color:#719e07&#34;&gt;(&lt;/span&gt;master&lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt; ✗ hugo version
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;hugo v0.127.0+extended linux/amd64 &lt;span style=&#34;color:#268bd2&#34;&gt;BuildDate&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;unknown
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Hmm&amp;hellip; unknown build date? I mean I just built it so that should be todays date. Funny though, I have to tell you I don&amp;rsquo;t feel like chasing that down at the moment.&lt;/p&gt;
&lt;h2 id=&#34;shindakundev&#34;&gt;shindakun.dev&lt;/h2&gt;
&lt;p&gt;Next lets make sure &lt;code&gt;shindakun.dev&lt;/code&gt; is in a good spot, a quick pull should take care of that.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;➜  shindakun.dev git:&lt;span style=&#34;color:#719e07&#34;&gt;(&lt;/span&gt;master&lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt; ✗ git pull --recurse-submodules
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;warning: redirecting to https://github.com/shindakun/shindakun.dev/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Fetching submodule content/posts
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Fetching submodule themes/solar-theme-hugo
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Fetching submodule themes/solara-hugo-test
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Already up to date.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Everything appears to be in order! Yay.&lt;/p&gt;
&lt;p&gt;Now we&amp;rsquo;ll just finish up this quick post and close the loop.&lt;/p&gt;
&lt;hr&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&#34;text-align:center&#34;&gt;Enjoy this post?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;&lt;a href=&#34;https://ko-fi.com/shindakun&#34;&gt;How about buying me a coffee?&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
</description>
    </item>
    
    <item>
      <title>Attempting to Learn Go - Ghost to Hugo 4</title>
      <link>https://shindakun.dev/posts/attempting-to-learn-go-ghost-to-hugo-4/</link>
      <pubDate>Sat, 01 Oct 2022 13:54:29 -0700</pubDate>
      
      <guid>https://shindakun.dev/posts/attempting-to-learn-go-ghost-to-hugo-4/</guid>
      <description>&lt;h2 id=&#34;intro&#34;&gt;Intro&lt;/h2&gt;
&lt;p&gt;Here we are &lt;a href=&#34;https://shindakun.dev/posts/attempting-to-learn-go-ghost-to-hugo-3/&#34;&gt;once again&lt;/a&gt;! If you missed the last couple of posts I suggest reading them first to get a feeling for how our little prototype has evolved. This time around we&amp;rsquo;re going to be doing some refactoring to clean up a bit. The majority of what we&amp;rsquo;ll be doing is adding methods to our &amp;ldquo;database&amp;rdquo; struct.&lt;/p&gt;
&lt;h3 id=&#34;the-method&#34;&gt;The Method&lt;/h3&gt;
&lt;p&gt;What is a method? Well, you can think of it as a function that is attached to a struct. Or as &lt;a href=&#34;https://go.dev/tour/methods/1&#34;&gt;A Tour of Go&lt;/a&gt; puts it&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A method is a function with a special &lt;em&gt;receiver&lt;/em&gt; argument.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In our code we have a struct &lt;code&gt;GhostDatabase&lt;/code&gt;. We can add methods with the following signature where the receiver is our struct.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;func&lt;/span&gt; (gd &lt;span style=&#34;color:#719e07&#34;&gt;*&lt;/span&gt;GhostDatabase) &lt;span style=&#34;color:#268bd2&#34;&gt;getLength&lt;/span&gt;() &lt;span style=&#34;color:#dc322f&#34;&gt;int&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We could then call the method with the following&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;var&lt;/span&gt; db GhostDatabase
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;...&lt;/span&gt;load JSON code here&lt;span style=&#34;color:#719e07&#34;&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;length &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; db.&lt;span style=&#34;color:#268bd2&#34;&gt;getLength&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;OK so what&amp;rsquo;s our complete method look like? In the case of most of the methods we&amp;rsquo;ll be putting in place is pretty easy to reason about.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;func&lt;/span&gt; (gd &lt;span style=&#34;color:#719e07&#34;&gt;*&lt;/span&gt;GhostDatabase) &lt;span style=&#34;color:#268bd2&#34;&gt;getLength&lt;/span&gt;() &lt;span style=&#34;color:#dc322f&#34;&gt;int&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#719e07&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#b58900&#34;&gt;len&lt;/span&gt;(gd.Db[&lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;].Data.Posts)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;many-methods&#34;&gt;Many Methods&lt;/h3&gt;
&lt;p&gt;Now lets quickly knock out some useful methods. For the most part they do what they say on the tin, so I won&amp;rsquo;t go into detail on each one.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;func&lt;/span&gt; (gd &lt;span style=&#34;color:#719e07&#34;&gt;*&lt;/span&gt;GhostDatabase) &lt;span style=&#34;color:#268bd2&#34;&gt;getMobiledoc&lt;/span&gt;(i &lt;span style=&#34;color:#dc322f&#34;&gt;int&lt;/span&gt;) &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#719e07&#34;&gt;return&lt;/span&gt; gd.Db[&lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;].Data.Posts[i].Mobiledoc
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;func&lt;/span&gt; (gd &lt;span style=&#34;color:#719e07&#34;&gt;*&lt;/span&gt;GhostDatabase) &lt;span style=&#34;color:#268bd2&#34;&gt;getPostId&lt;/span&gt;(i &lt;span style=&#34;color:#dc322f&#34;&gt;int&lt;/span&gt;) &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#719e07&#34;&gt;return&lt;/span&gt; gd.Db[&lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;].Data.Posts[i].ID
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;func&lt;/span&gt; (gd &lt;span style=&#34;color:#719e07&#34;&gt;*&lt;/span&gt;GhostDatabase) &lt;span style=&#34;color:#268bd2&#34;&gt;getPostTitle&lt;/span&gt;(i &lt;span style=&#34;color:#dc322f&#34;&gt;int&lt;/span&gt;) &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#719e07&#34;&gt;return&lt;/span&gt; gd.Db[&lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;].Data.Posts[i].Title
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;func&lt;/span&gt; (gd &lt;span style=&#34;color:#719e07&#34;&gt;*&lt;/span&gt;GhostDatabase) &lt;span style=&#34;color:#268bd2&#34;&gt;getPostSlug&lt;/span&gt;(i &lt;span style=&#34;color:#dc322f&#34;&gt;int&lt;/span&gt;) &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#719e07&#34;&gt;return&lt;/span&gt; gd.Db[&lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;].Data.Posts[i].Slug
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;func&lt;/span&gt; (gd &lt;span style=&#34;color:#719e07&#34;&gt;*&lt;/span&gt;GhostDatabase) &lt;span style=&#34;color:#268bd2&#34;&gt;getPostStatus&lt;/span&gt;(i &lt;span style=&#34;color:#dc322f&#34;&gt;int&lt;/span&gt;) &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#719e07&#34;&gt;return&lt;/span&gt; gd.Db[&lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;].Data.Posts[i].Status
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;func&lt;/span&gt; (gd &lt;span style=&#34;color:#719e07&#34;&gt;*&lt;/span&gt;GhostDatabase) &lt;span style=&#34;color:#268bd2&#34;&gt;getPostCreatedAt&lt;/span&gt;(i &lt;span style=&#34;color:#dc322f&#34;&gt;int&lt;/span&gt;) time.Time {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#719e07&#34;&gt;return&lt;/span&gt; gd.Db[&lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;].Data.Posts[i].CreatedAt
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;func&lt;/span&gt; (gd &lt;span style=&#34;color:#719e07&#34;&gt;*&lt;/span&gt;GhostDatabase) &lt;span style=&#34;color:#268bd2&#34;&gt;getPostUpdatedAt&lt;/span&gt;(i &lt;span style=&#34;color:#dc322f&#34;&gt;int&lt;/span&gt;) time.Time {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#719e07&#34;&gt;return&lt;/span&gt; gd.Db[&lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;].Data.Posts[i].UpdatedAt
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;func&lt;/span&gt; (gd &lt;span style=&#34;color:#719e07&#34;&gt;*&lt;/span&gt;GhostDatabase) &lt;span style=&#34;color:#268bd2&#34;&gt;getPostPublishedAt&lt;/span&gt;(i &lt;span style=&#34;color:#dc322f&#34;&gt;int&lt;/span&gt;) time.Time {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#719e07&#34;&gt;return&lt;/span&gt; gd.Db[&lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;].Data.Posts[i].PublishedAt
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;func&lt;/span&gt; (gd &lt;span style=&#34;color:#719e07&#34;&gt;*&lt;/span&gt;GhostDatabase) &lt;span style=&#34;color:#268bd2&#34;&gt;getPostFeatureImage&lt;/span&gt;(i &lt;span style=&#34;color:#dc322f&#34;&gt;int&lt;/span&gt;) &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#719e07&#34;&gt;return&lt;/span&gt; gd.Db[&lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;].Data.Posts[i].FeatureImage
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;tags&#34;&gt;Tags&lt;/h3&gt;
&lt;p&gt;One thing that we haven&amp;rsquo;t looked into so far is retrieving the tags associated with a post. Since we&amp;rsquo;re working on adding methods now is a great time to work that out. Let&amp;rsquo;s talk through what we need to do.&lt;/p&gt;
&lt;p&gt;First we need to loop through the &amp;ldquo;database&amp;rdquo; of post tags. From here we check to see if the &lt;code&gt;PostID&lt;/code&gt; field matches with the post ID, &lt;code&gt;pid&lt;/code&gt;, we pass into the function. We then assign the tag ID to a variable, &lt;code&gt;tagId&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Next we&amp;rsquo;ll loop our way though the &lt;code&gt;Tags&lt;/code&gt; &amp;ldquo;database&amp;rdquo; and check to see if the current tag id matches with &lt;code&gt;tagId&lt;/code&gt;. If there is a match we append the tag name to a slice &lt;code&gt;r&lt;/code&gt;. Once we&amp;rsquo;re done we return &lt;code&gt;r&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s see what that looks like in practice.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;func&lt;/span&gt; (gd &lt;span style=&#34;color:#719e07&#34;&gt;*&lt;/span&gt;GhostDatabase) &lt;span style=&#34;color:#268bd2&#34;&gt;getTags&lt;/span&gt;(pid &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;) []&lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#268bd2&#34;&gt;var&lt;/span&gt; r []&lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#719e07&#34;&gt;for&lt;/span&gt; i &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;; i &amp;lt; &lt;span style=&#34;color:#b58900&#34;&gt;len&lt;/span&gt;(gd.Db[&lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;].Data.PostsTags); i&lt;span style=&#34;color:#719e07&#34;&gt;++&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; gd.Db[&lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;].Data.PostsTags[i].PostID &lt;span style=&#34;color:#719e07&#34;&gt;==&lt;/span&gt; pid {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			tagId &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; gd.Db[&lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;].Data.PostsTags[i].TagID
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			&lt;span style=&#34;color:#719e07&#34;&gt;for&lt;/span&gt; j &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;; j &amp;lt; &lt;span style=&#34;color:#b58900&#34;&gt;len&lt;/span&gt;(gd.Db[&lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;].Data.Tags); j&lt;span style=&#34;color:#719e07&#34;&gt;++&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				&lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; gd.Db[&lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;].Data.Tags[j].ID &lt;span style=&#34;color:#719e07&#34;&gt;==&lt;/span&gt; tagId {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;					r = &lt;span style=&#34;color:#b58900&#34;&gt;append&lt;/span&gt;(r, gd.Db[&lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;].Data.Tags[j].Name)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#719e07&#34;&gt;return&lt;/span&gt; r
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Not to shabby.&lt;/p&gt;
&lt;h3 id=&#34;next-time&#34;&gt;Next Time&lt;/h3&gt;
&lt;p&gt;That&amp;rsquo;s all of our methods for now. With them out of the way I believe we have all the parts need to actually start writing our Markdown files!&lt;/p&gt;
&lt;hr&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&#34;text-align:center&#34;&gt;Enjoy this post?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;&lt;a href=&#34;https://ko-fi.com/shindakun&#34;&gt;How about buying me a coffee?&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h3 id=&#34;code-listing&#34;&gt;Code Listing&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;package&lt;/span&gt; main
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;import&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;encoding/json&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;io&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;os&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;reflect&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;strconv&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;strings&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;time&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;type&lt;/span&gt; GhostDatabase &lt;span style=&#34;color:#268bd2&#34;&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	Db []&lt;span style=&#34;color:#268bd2&#34;&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		Meta &lt;span style=&#34;color:#268bd2&#34;&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			ExportedOn &lt;span style=&#34;color:#dc322f&#34;&gt;int64&lt;/span&gt;  &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;exported_on&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			Version    &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;version&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;meta&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		Data &lt;span style=&#34;color:#268bd2&#34;&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			Posts []&lt;span style=&#34;color:#268bd2&#34;&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				ID                   &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;id&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				UUID                 &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;uuid&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Title                &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;title&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Slug                 &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;slug&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Mobiledoc            &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;mobiledoc&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				HTML                 &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;html&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				CommentID            &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;comment_id&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Plaintext            &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;plaintext&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				FeatureImage         &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;feature_image&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Featured             &lt;span style=&#34;color:#dc322f&#34;&gt;int&lt;/span&gt;         &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;featured&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Type                 &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;type&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Status               &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;status&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Locale               &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;locale&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Visibility           &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;visibility&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				EmailRecipientFilter &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;email_recipient_filter&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				AuthorID             &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;author_id&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				CreatedAt            time.Time   &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;created_at&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				UpdatedAt            time.Time   &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;updated_at&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				PublishedAt          time.Time   &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;published_at&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				CustomExcerpt        &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;custom_excerpt&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				CodeinjectionHead    &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;codeinjection_head&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				CodeinjectionFoot    &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;codeinjection_foot&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				CustomTemplate       &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;custom_template&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				CanonicalURL         &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;canonical_url&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;posts&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			PostsAuthors []&lt;span style=&#34;color:#268bd2&#34;&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				ID        &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;id&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				PostID    &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;post_id&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				AuthorID  &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;author_id&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				SortOrder &lt;span style=&#34;color:#dc322f&#34;&gt;int&lt;/span&gt;    &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;sort_order&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;posts_authors&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			PostsMeta []&lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;posts_meta&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			PostsTags []&lt;span style=&#34;color:#268bd2&#34;&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				ID        &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;id&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				PostID    &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;post_id&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				TagID     &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;tag_id&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				SortOrder &lt;span style=&#34;color:#dc322f&#34;&gt;int&lt;/span&gt;    &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;sort_order&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;posts_tags&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			Roles []&lt;span style=&#34;color:#268bd2&#34;&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				ID          &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;    &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;id&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Name        &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;    &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;name&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Description &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;    &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;description&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				CreatedAt   time.Time &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;created_at&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				UpdatedAt   time.Time &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;updated_at&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;roles&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			RolesUsers []&lt;span style=&#34;color:#268bd2&#34;&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				ID     &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;id&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				RoleID &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;role_id&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				UserID &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;user_id&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;roles_users&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			Settings []&lt;span style=&#34;color:#268bd2&#34;&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				ID        &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;id&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Group     &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;group&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Key       &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;key&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Value     &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;value&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Type      &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;type&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Flags     &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;flags&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				CreatedAt time.Time   &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;created_at&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				UpdatedAt time.Time   &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;updated_at&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;settings&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			Tags []&lt;span style=&#34;color:#268bd2&#34;&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				ID                 &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;id&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Name               &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;name&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Slug               &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;slug&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Description        &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;description&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				FeatureImage       &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;feature_image&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				ParentID           &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;parent_id&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Visibility         &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;visibility&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				OgImage            &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;og_image&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				OgTitle            &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;og_title&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				OgDescription      &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;og_description&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				TwitterImage       &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;twitter_image&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				TwitterTitle       &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;twitter_title&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				TwitterDescription &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;twitter_description&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				MetaTitle          &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;meta_title&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				MetaDescription    &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;meta_description&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				CodeinjectionHead  &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;codeinjection_head&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				CodeinjectionFoot  &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;codeinjection_foot&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				CanonicalURL       &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;canonical_url&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				AccentColor        &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;accent_color&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				CreatedAt          time.Time   &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;created_at&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				UpdatedAt          time.Time   &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;updated_at&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;tags&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			Users []&lt;span style=&#34;color:#268bd2&#34;&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				ID              &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;id&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Name            &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;name&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Slug            &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;slug&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Password        &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;password&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Email           &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;email&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				ProfileImage    &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;profile_image&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				CoverImage      &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;cover_image&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Bio             &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;bio&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Website         &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;website&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Location        &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;location&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Facebook        &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;facebook&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Twitter         &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;twitter&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Accessibility   &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;accessibility&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Status          &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;status&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Locale          &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;locale&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Visibility      &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;visibility&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				MetaTitle       &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;meta_title&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				MetaDescription &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;meta_description&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Tour            &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;tour&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				LastSeen        time.Time   &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;last_seen&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				CreatedAt       time.Time   &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;created_at&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				UpdatedAt       time.Time   &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;updated_at&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;users&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;data&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;db&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;type&lt;/span&gt; Mobiledoc &lt;span style=&#34;color:#268bd2&#34;&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	Version      &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;          &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;version&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	Markups      []&lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{}   &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;markups&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	Atoms        []&lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{}   &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;atoms&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	Cards        [][]&lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;cards&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	Sections     [][]&lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;sections&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	GhostVersion &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;          &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;ghostVersion&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;func&lt;/span&gt; (gd &lt;span style=&#34;color:#719e07&#34;&gt;*&lt;/span&gt;GhostDatabase) &lt;span style=&#34;color:#268bd2&#34;&gt;getLength&lt;/span&gt;() &lt;span style=&#34;color:#dc322f&#34;&gt;int&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#719e07&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#b58900&#34;&gt;len&lt;/span&gt;(gd.Db[&lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;].Data.Posts)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;func&lt;/span&gt; (gd &lt;span style=&#34;color:#719e07&#34;&gt;*&lt;/span&gt;GhostDatabase) &lt;span style=&#34;color:#268bd2&#34;&gt;getMobiledoc&lt;/span&gt;(i &lt;span style=&#34;color:#dc322f&#34;&gt;int&lt;/span&gt;) &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#719e07&#34;&gt;return&lt;/span&gt; gd.Db[&lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;].Data.Posts[i].Mobiledoc
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;func&lt;/span&gt; (gd &lt;span style=&#34;color:#719e07&#34;&gt;*&lt;/span&gt;GhostDatabase) &lt;span style=&#34;color:#268bd2&#34;&gt;getPostId&lt;/span&gt;(i &lt;span style=&#34;color:#dc322f&#34;&gt;int&lt;/span&gt;) &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#719e07&#34;&gt;return&lt;/span&gt; gd.Db[&lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;].Data.Posts[i].ID
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;func&lt;/span&gt; (gd &lt;span style=&#34;color:#719e07&#34;&gt;*&lt;/span&gt;GhostDatabase) &lt;span style=&#34;color:#268bd2&#34;&gt;getPostTitle&lt;/span&gt;(i &lt;span style=&#34;color:#dc322f&#34;&gt;int&lt;/span&gt;) &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#719e07&#34;&gt;return&lt;/span&gt; gd.Db[&lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;].Data.Posts[i].Title
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;func&lt;/span&gt; (gd &lt;span style=&#34;color:#719e07&#34;&gt;*&lt;/span&gt;GhostDatabase) &lt;span style=&#34;color:#268bd2&#34;&gt;getPostSlug&lt;/span&gt;(i &lt;span style=&#34;color:#dc322f&#34;&gt;int&lt;/span&gt;) &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#719e07&#34;&gt;return&lt;/span&gt; gd.Db[&lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;].Data.Posts[i].Slug
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;func&lt;/span&gt; (gd &lt;span style=&#34;color:#719e07&#34;&gt;*&lt;/span&gt;GhostDatabase) &lt;span style=&#34;color:#268bd2&#34;&gt;getPostStatus&lt;/span&gt;(i &lt;span style=&#34;color:#dc322f&#34;&gt;int&lt;/span&gt;) &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#719e07&#34;&gt;return&lt;/span&gt; gd.Db[&lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;].Data.Posts[i].Status
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;func&lt;/span&gt; (gd &lt;span style=&#34;color:#719e07&#34;&gt;*&lt;/span&gt;GhostDatabase) &lt;span style=&#34;color:#268bd2&#34;&gt;getPostCreatedAt&lt;/span&gt;(i &lt;span style=&#34;color:#dc322f&#34;&gt;int&lt;/span&gt;) time.Time {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#719e07&#34;&gt;return&lt;/span&gt; gd.Db[&lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;].Data.Posts[i].CreatedAt
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;func&lt;/span&gt; (gd &lt;span style=&#34;color:#719e07&#34;&gt;*&lt;/span&gt;GhostDatabase) &lt;span style=&#34;color:#268bd2&#34;&gt;getPostUpdatedAt&lt;/span&gt;(i &lt;span style=&#34;color:#dc322f&#34;&gt;int&lt;/span&gt;) time.Time {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#719e07&#34;&gt;return&lt;/span&gt; gd.Db[&lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;].Data.Posts[i].UpdatedAt
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;func&lt;/span&gt; (gd &lt;span style=&#34;color:#719e07&#34;&gt;*&lt;/span&gt;GhostDatabase) &lt;span style=&#34;color:#268bd2&#34;&gt;getPostPublishedAt&lt;/span&gt;(i &lt;span style=&#34;color:#dc322f&#34;&gt;int&lt;/span&gt;) time.Time {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#719e07&#34;&gt;return&lt;/span&gt; gd.Db[&lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;].Data.Posts[i].PublishedAt
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;func&lt;/span&gt; (gd &lt;span style=&#34;color:#719e07&#34;&gt;*&lt;/span&gt;GhostDatabase) &lt;span style=&#34;color:#268bd2&#34;&gt;getPostFeatureImage&lt;/span&gt;(i &lt;span style=&#34;color:#dc322f&#34;&gt;int&lt;/span&gt;) &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#719e07&#34;&gt;return&lt;/span&gt; gd.Db[&lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;].Data.Posts[i].FeatureImage
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;func&lt;/span&gt; (gd &lt;span style=&#34;color:#719e07&#34;&gt;*&lt;/span&gt;GhostDatabase) &lt;span style=&#34;color:#268bd2&#34;&gt;getTags&lt;/span&gt;(pid &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;) []&lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#268bd2&#34;&gt;var&lt;/span&gt; r []&lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#719e07&#34;&gt;for&lt;/span&gt; i &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;; i &amp;lt; &lt;span style=&#34;color:#b58900&#34;&gt;len&lt;/span&gt;(gd.Db[&lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;].Data.PostsTags); i&lt;span style=&#34;color:#719e07&#34;&gt;++&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; gd.Db[&lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;].Data.PostsTags[i].PostID &lt;span style=&#34;color:#719e07&#34;&gt;==&lt;/span&gt; pid {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			tagId &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; gd.Db[&lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;].Data.PostsTags[i].TagID
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			&lt;span style=&#34;color:#719e07&#34;&gt;for&lt;/span&gt; j &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;; j &amp;lt; &lt;span style=&#34;color:#b58900&#34;&gt;len&lt;/span&gt;(gd.Db[&lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;].Data.Tags); j&lt;span style=&#34;color:#719e07&#34;&gt;++&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				&lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; gd.Db[&lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;].Data.Tags[j].ID &lt;span style=&#34;color:#719e07&#34;&gt;==&lt;/span&gt; tagId {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;					r = &lt;span style=&#34;color:#b58900&#34;&gt;append&lt;/span&gt;(r, gd.Db[&lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;].Data.Tags[j].Name)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#719e07&#34;&gt;return&lt;/span&gt; r
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#268bd2&#34;&gt;main&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	fmt.&lt;span style=&#34;color:#268bd2&#34;&gt;Println&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;ghost2hugo&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	file, err &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; os.&lt;span style=&#34;color:#268bd2&#34;&gt;Open&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;shindakun-dot-net.ghost.2022-03-18-22-02-58.json&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; err &lt;span style=&#34;color:#719e07&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#cb4b16&#34;&gt;nil&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		fmt.&lt;span style=&#34;color:#268bd2&#34;&gt;Println&lt;/span&gt;(err)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#719e07&#34;&gt;defer&lt;/span&gt; file.&lt;span style=&#34;color:#268bd2&#34;&gt;Close&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	b, err &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; io.&lt;span style=&#34;color:#268bd2&#34;&gt;ReadAll&lt;/span&gt;(file)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; err &lt;span style=&#34;color:#719e07&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#cb4b16&#34;&gt;nil&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		fmt.&lt;span style=&#34;color:#268bd2&#34;&gt;Println&lt;/span&gt;(err)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#268bd2&#34;&gt;var&lt;/span&gt; db GhostDatabase
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	err = json.&lt;span style=&#34;color:#268bd2&#34;&gt;Unmarshal&lt;/span&gt;(b, &lt;span style=&#34;color:#719e07&#34;&gt;&amp;amp;&lt;/span&gt;db)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; err &lt;span style=&#34;color:#719e07&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#cb4b16&#34;&gt;nil&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		fmt.&lt;span style=&#34;color:#268bd2&#34;&gt;Println&lt;/span&gt;(err)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#719e07&#34;&gt;for&lt;/span&gt; i &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;; i &amp;lt; db.&lt;span style=&#34;color:#268bd2&#34;&gt;getLength&lt;/span&gt;(); i&lt;span style=&#34;color:#719e07&#34;&gt;++&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		fmt.&lt;span style=&#34;color:#268bd2&#34;&gt;Println&lt;/span&gt;(db.&lt;span style=&#34;color:#268bd2&#34;&gt;getPostTitle&lt;/span&gt;(i))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		fmt.&lt;span style=&#34;color:#268bd2&#34;&gt;Println&lt;/span&gt;(db.&lt;span style=&#34;color:#268bd2&#34;&gt;getPostSlug&lt;/span&gt;(i))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		fmt.&lt;span style=&#34;color:#268bd2&#34;&gt;Println&lt;/span&gt;(db.&lt;span style=&#34;color:#268bd2&#34;&gt;getPostStatus&lt;/span&gt;(i))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		fmt.&lt;span style=&#34;color:#268bd2&#34;&gt;Println&lt;/span&gt;(db.&lt;span style=&#34;color:#268bd2&#34;&gt;getPostCreatedAt&lt;/span&gt;(i))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		fmt.&lt;span style=&#34;color:#268bd2&#34;&gt;Println&lt;/span&gt;(db.&lt;span style=&#34;color:#268bd2&#34;&gt;getPostUpdatedAt&lt;/span&gt;(i))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		fmt.&lt;span style=&#34;color:#268bd2&#34;&gt;Println&lt;/span&gt;(db.&lt;span style=&#34;color:#268bd2&#34;&gt;getPostPublishedAt&lt;/span&gt;(i))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		fmt.&lt;span style=&#34;color:#268bd2&#34;&gt;Println&lt;/span&gt;(db.&lt;span style=&#34;color:#268bd2&#34;&gt;getPostFeatureImage&lt;/span&gt;(i))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		id &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; db.&lt;span style=&#34;color:#268bd2&#34;&gt;getPostId&lt;/span&gt;(i)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		tags &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; db.&lt;span style=&#34;color:#268bd2&#34;&gt;getTags&lt;/span&gt;(id)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		fmt.&lt;span style=&#34;color:#268bd2&#34;&gt;Println&lt;/span&gt;(tags)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		c &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; strings.&lt;span style=&#34;color:#268bd2&#34;&gt;ReplaceAll&lt;/span&gt;(db.&lt;span style=&#34;color:#268bd2&#34;&gt;getMobiledoc&lt;/span&gt;(i), &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;`&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;%&amp;#39;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		cc &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;`&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; c &lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;`&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		ucn, err &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; strconv.&lt;span style=&#34;color:#268bd2&#34;&gt;Unquote&lt;/span&gt;(cc)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; err &lt;span style=&#34;color:#719e07&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#cb4b16&#34;&gt;nil&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			fmt.&lt;span style=&#34;color:#268bd2&#34;&gt;Println&lt;/span&gt;(err, ucn)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		ucn = strings.&lt;span style=&#34;color:#268bd2&#34;&gt;ReplaceAll&lt;/span&gt;(ucn, &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;%&amp;#39;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;`&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#268bd2&#34;&gt;var&lt;/span&gt; md Mobiledoc
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		err = json.&lt;span style=&#34;color:#268bd2&#34;&gt;Unmarshal&lt;/span&gt;([]&lt;span style=&#34;color:#b58900&#34;&gt;byte&lt;/span&gt;(ucn), &lt;span style=&#34;color:#719e07&#34;&gt;&amp;amp;&lt;/span&gt;md)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; err &lt;span style=&#34;color:#719e07&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#cb4b16&#34;&gt;nil&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			fmt.&lt;span style=&#34;color:#268bd2&#34;&gt;Println&lt;/span&gt;(err)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; reflect.&lt;span style=&#34;color:#268bd2&#34;&gt;ValueOf&lt;/span&gt;(md.Cards).&lt;span style=&#34;color:#268bd2&#34;&gt;Len&lt;/span&gt;() &amp;gt; &lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			card &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; md.Cards[&lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;][&lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			bbb &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; card.(&lt;span style=&#34;color:#268bd2&#34;&gt;map&lt;/span&gt;[&lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;]&lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{})
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			fmt.&lt;span style=&#34;color:#268bd2&#34;&gt;Println&lt;/span&gt;(bbb[&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;markdown&amp;#34;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		fmt.&lt;span style=&#34;color:#268bd2&#34;&gt;Println&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;---&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    
    <item>
      <title>Attempting to Learn Go - Ghost to Hugo 3</title>
      <link>https://shindakun.dev/posts/attempting-to-learn-go-ghost-to-hugo-3/</link>
      <pubDate>Tue, 27 Sep 2022 17:00:05 -0700</pubDate>
      
      <guid>https://shindakun.dev/posts/attempting-to-learn-go-ghost-to-hugo-3/</guid>
      <description>&lt;h2 id=&#34;intro&#34;&gt;Intro&lt;/h2&gt;
&lt;p&gt;We&amp;rsquo;re &lt;a href=&#34;https://shindakun.dev/posts/attempting-to-learn-go-ghost-to-hugo-2&#34;&gt;back once again&lt;/a&gt; to continue our work on the &lt;code&gt;ghost2hugo&lt;/code&gt; prototype. So far we can open the JSON file, load the data into memory, and print out the Markdown for the first post. The next step is to make sure we can read and process every post included in the backup.&lt;/p&gt;
&lt;h3 id=&#34;looping&#34;&gt;Looping&lt;/h3&gt;
&lt;p&gt;We&amp;rsquo;re going to replace all the code that prints a single article with a loop that prints out each article. For a refresher, here is the code that prints the first article.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	c &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;`&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; db.Db[&lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;].Data.Posts[&lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;].Mobiledoc &lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;`&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	un, err &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; strconv.&lt;span style=&#34;color:#268bd2&#34;&gt;Unquote&lt;/span&gt;(c)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; err &lt;span style=&#34;color:#719e07&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#cb4b16&#34;&gt;nil&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		fmt.&lt;span style=&#34;color:#268bd2&#34;&gt;Println&lt;/span&gt;(err)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	fmt.&lt;span style=&#34;color:#268bd2&#34;&gt;Printf&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;%v&amp;#34;&lt;/span&gt;, un)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#268bd2&#34;&gt;var&lt;/span&gt; md Mobiledoc
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	err = json.&lt;span style=&#34;color:#268bd2&#34;&gt;Unmarshal&lt;/span&gt;([]&lt;span style=&#34;color:#b58900&#34;&gt;byte&lt;/span&gt;(un), &lt;span style=&#34;color:#719e07&#34;&gt;&amp;amp;&lt;/span&gt;md)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; err &lt;span style=&#34;color:#719e07&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#cb4b16&#34;&gt;nil&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		fmt.&lt;span style=&#34;color:#268bd2&#34;&gt;Println&lt;/span&gt;(err)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	fmt.&lt;span style=&#34;color:#268bd2&#34;&gt;Printf&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;%#v&amp;#34;&lt;/span&gt;, md)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	card &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; md.Cards[&lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;][&lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	fmt.&lt;span style=&#34;color:#268bd2&#34;&gt;Printf&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;\n\ncard: %#v\n&amp;#34;&lt;/span&gt;, card)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	bbb &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; card.(&lt;span style=&#34;color:#268bd2&#34;&gt;map&lt;/span&gt;[&lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;]&lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{})
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	fmt.&lt;span style=&#34;color:#268bd2&#34;&gt;Println&lt;/span&gt;(bbb[&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;markdown&amp;#34;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Most of this will live inside of our new loop.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#719e07&#34;&gt;for&lt;/span&gt; i &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;; i &amp;lt; &lt;span style=&#34;color:#b58900&#34;&gt;len&lt;/span&gt;(db.Db[&lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;].Data.Posts); i&lt;span style=&#34;color:#719e07&#34;&gt;++&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		fmt.&lt;span style=&#34;color:#268bd2&#34;&gt;Println&lt;/span&gt;(db.Db[&lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;].Data.Posts[i].Title)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		fmt.&lt;span style=&#34;color:#268bd2&#34;&gt;Println&lt;/span&gt;(db.Db[&lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;].Data.Posts[i].Slug)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		fmt.&lt;span style=&#34;color:#268bd2&#34;&gt;Println&lt;/span&gt;(db.Db[&lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;].Data.Posts[i].Status)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		fmt.&lt;span style=&#34;color:#268bd2&#34;&gt;Println&lt;/span&gt;(db.Db[&lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;].Data.Posts[i].CreatedAt)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		fmt.&lt;span style=&#34;color:#268bd2&#34;&gt;Println&lt;/span&gt;(db.Db[&lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;].Data.Posts[i].UpdatedAt)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		cc &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;`&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; db.Db[&lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;].Data.Posts[i].Mobiledoc &lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;`&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		ucn, err &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; strconv.&lt;span style=&#34;color:#268bd2&#34;&gt;Unquote&lt;/span&gt;(cc)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; err &lt;span style=&#34;color:#719e07&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#cb4b16&#34;&gt;nil&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			fmt.&lt;span style=&#34;color:#268bd2&#34;&gt;Println&lt;/span&gt;(err, ucn)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		fmt.&lt;span style=&#34;color:#268bd2&#34;&gt;Printf&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;\n\n\n%v\n\n\n&amp;#34;&lt;/span&gt;, ucn)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#268bd2&#34;&gt;var&lt;/span&gt; md Mobiledoc
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		err = json.&lt;span style=&#34;color:#268bd2&#34;&gt;Unmarshal&lt;/span&gt;([]&lt;span style=&#34;color:#b58900&#34;&gt;byte&lt;/span&gt;(ucn), &lt;span style=&#34;color:#719e07&#34;&gt;&amp;amp;&lt;/span&gt;md)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; err &lt;span style=&#34;color:#719e07&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#cb4b16&#34;&gt;nil&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			fmt.&lt;span style=&#34;color:#268bd2&#34;&gt;Println&lt;/span&gt;(err)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		card &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; md.Cards[&lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;][&lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		bbb &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; card.(&lt;span style=&#34;color:#268bd2&#34;&gt;map&lt;/span&gt;[&lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;]&lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{})
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		fmt.&lt;span style=&#34;color:#268bd2&#34;&gt;Println&lt;/span&gt;(bbb[&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;markdown&amp;#34;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And when we run the code this time we see a bunch of articles fly by! Until, that is, we hit an error! The &lt;code&gt;invalid syntax&lt;/code&gt; error indicates this is a problem with &lt;code&gt;strconv.Unquote()&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;invalid syntax 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;unexpected end of JSON input
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;panic: runtime error: index out of range &lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;0&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt; with length &lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;goroutine &lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;running&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;main.main&lt;span style=&#34;color:#719e07&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        /Users/steve/Code/ghost2hugo/main.go:214 +0x769
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#b58900&#34;&gt;exit&lt;/span&gt; status &lt;span style=&#34;color:#2aa198&#34;&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;roadblocks&#34;&gt;Roadblocks&lt;/h3&gt;
&lt;p&gt;Well that&amp;rsquo;s no good, we can&amp;rsquo;t just have our code crash out like that! Let&amp;rsquo;s take a closer look at the problem and see if we can work our way through it. OK, now for the master of all debugging techniques! We add a &lt;code&gt;fmt.Println&lt;/code&gt; to print out the chunk of text.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		fmt.&lt;span style=&#34;color:#268bd2&#34;&gt;Println&lt;/span&gt;(cc)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Running the code again we crash out as expected but this time we&amp;rsquo;re presented with the problem text:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;`{&lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;version&amp;#34;&lt;/span&gt;:&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;0.3.1&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;markups&amp;#34;&lt;/span&gt;:[],&lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;atoms&amp;#34;&lt;/span&gt;:[],&lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;cards&amp;#34;&lt;/span&gt;:[[&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;markdown&amp;#34;&lt;/span&gt;,{&lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;cardName&amp;#34;&lt;/span&gt;:&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;card-markdown&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;markdown&amp;#34;&lt;/span&gt;:&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;\n* Incresed title to 64 characters. Should be more then enough.  \n * ics and other code work over at angstridden dot net tonight.\n\nALTER TABLE `posts` CHANGE `posttitle` `posttitle` VARCHAR( 64 ) NOT NULL\n\n\n&amp;#34;&lt;/span&gt;}]],&lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;sections&amp;#34;&lt;/span&gt;:[[&lt;span style=&#34;color:#2aa198&#34;&gt;10&lt;/span&gt;,&lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;]],&lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;ghostVersion&amp;#34;&lt;/span&gt;:&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;3.0&amp;#34;&lt;/span&gt;}`
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;See the problem? Yeah, it looks like there are back ticks in the Markdown that are causing the string convert to not work as expected. To get around this we&amp;rsquo;re going to do a simple &lt;code&gt;strings.ReplaceAll&lt;/code&gt; before the conversion to change the back tick to something else. We can then reverse that process to get the normal text. We&amp;rsquo;ll replace the back tick with &amp;ldquo;&lt;code&gt;%&#39;&lt;/code&gt;&amp;rdquo;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		c &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; strings.&lt;span style=&#34;color:#268bd2&#34;&gt;ReplaceAll&lt;/span&gt;(db.Db[&lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;].Data.Posts[i].Mobiledoc, &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;`&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;%&amp;#39;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		cc &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;`&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; c &lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;`&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;After we &amp;ldquo;unquote&amp;rdquo; we can run another &lt;code&gt;strings.ReplaceAll&lt;/code&gt; to convert back.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		ucn = strings.&lt;span style=&#34;color:#268bd2&#34;&gt;ReplaceAll&lt;/span&gt;(ucn, &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;%&amp;#39;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;`&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Running again we run into another problem!&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;---
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Archives
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;archives-post
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;published
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2007-07-01 09:46:18 +0000 UTC
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2007-08-12 20:50:02 +0000 UTC
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;`{&amp;#34;version&amp;#34;:&amp;#34;0.3.1&amp;#34;,&amp;#34;markups&amp;#34;:[],&amp;#34;atoms&amp;#34;:[],&amp;#34;cards&amp;#34;:[],&amp;#34;sections&amp;#34;:[[1,&amp;#34;p&amp;#34;,[[0,[],0,&amp;#34;&amp;#34;]]]],&amp;#34;ghostVersion&amp;#34;:&amp;#34;3.0&amp;#34;}`
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;panic: runtime error: index out of range [0] with length 0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;goroutine 1 [running]:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;main.main()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        /Users/steve/Code/ghost2hugo/main.go:214 +0x7a6
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;exit status 2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Argh!&lt;/p&gt;
&lt;h3 id=&#34;more-roadblocks&#34;&gt;More Roadblocks&lt;/h3&gt;
&lt;p&gt;Our naive implementation from the previous post has returned to bite us! We were assuming that cards exist.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		card &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; md.Cards[&lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;][&lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		bbb &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; card.(&lt;span style=&#34;color:#268bd2&#34;&gt;map&lt;/span&gt;[&lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;]&lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{})
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Looking at the returned JSON confirms this.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;version&amp;#34;&lt;/span&gt;:&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;0.3.1&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;markups&amp;#34;&lt;/span&gt;:[],&lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;atoms&amp;#34;&lt;/span&gt;:[],&lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;cards&amp;#34;&lt;/span&gt;:[],&lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;sections&amp;#34;&lt;/span&gt;:[[&lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;,&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;p&amp;#34;&lt;/span&gt;,[[&lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;,[],&lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;,&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;]]]],&lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;ghostVersion&amp;#34;&lt;/span&gt;:&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;3.0&amp;#34;&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now, how do we check to see if the cards field is empty?! I noodled on it a little bit and figured the best way would be to use &lt;code&gt;reflect.ValueOf().Len()&lt;/code&gt;. This will check the length of &lt;code&gt;md.Cards&lt;/code&gt; to ensure we actually have some data.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; reflect.&lt;span style=&#34;color:#268bd2&#34;&gt;ValueOf&lt;/span&gt;(md.Cards).&lt;span style=&#34;color:#268bd2&#34;&gt;Len&lt;/span&gt;() &amp;gt; &lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			card &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; md.Cards[&lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;][&lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			bbb &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; card.(&lt;span style=&#34;color:#268bd2&#34;&gt;map&lt;/span&gt;[&lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;]&lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{})
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			fmt.&lt;span style=&#34;color:#268bd2&#34;&gt;Println&lt;/span&gt;(bbb[&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;markdown&amp;#34;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;On rerunning we get what looks to be all the posts. Except the final draft which looks odd! It turns out this one has no Markdown card. Is this the only one? I certainly hope so since it looks like it may be a pain to convert to Markdown.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Questing
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;questing
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;draft
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2019-08-23 21:26:44 +0000 UTC
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2021-04-12 04:53:26 +0000 UTC
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;`{&amp;#34;version&amp;#34;:&amp;#34;0.3.1&amp;#34;,&amp;#34;atoms&amp;#34;:[],&amp;#34;cards&amp;#34;:[[&amp;#34;paywall&amp;#34;,{}]],&amp;#34;markups&amp;#34;:[[&amp;#34;a&amp;#34;,[&amp;#34;href&amp;#34;,&amp;#34;https://shindakun.dev&amp;#34;]],[&amp;#34;a&amp;#34;,[&amp;#34;href&amp;#34;,&amp;#34;https://dev.to/shindakun&amp;#34;]]],&amp;#34;sections&amp;#34;:[[1,&amp;#34;p&amp;#34;,[[0,[],0,&amp;#34;It&amp;#39;s been quite sometime since I&amp;#39;ve posted anything here. I&amp;#39;ve done a bit of posting over on &amp;#34;],[0,[0],1,&amp;#34;shindakun.dev&amp;#34;],[0,[],0,&amp;#34; and over on &amp;#34;],[0,[1],1,&amp;#34;DEV&amp;#34;],[0,[],0,&amp;#34; which has been kind of nice. But, those don&amp;#39;t really cover gaming at all. But, I updated the site recently and everyone once in a while I use the site to try something out for work and seeing an old post over and over was no good.&amp;#34;]]],[1,&amp;#34;p&amp;#34;,[[0,[],0,&amp;#34;I only seem to have a small sliver of time for gaming now. With everything else I want/need to get done there is only so much time. Heed this warning - don&amp;#39;t get older! Just kidding, it&amp;#39;s not so bad.&amp;#34;]]],[1,&amp;#34;p&amp;#34;,[[0,[],0,&amp;#34;My 5 year old hasn&amp;#39;t been introduced into gaming much outside of some basic games she can play on her tablet. I have discovered that she enjoys watching me play the digital version of Warhammer Quest. Which is good since she&amp;#39;s going to be getting a crash course in some more difficult board games sooner or later. I have a copy of the Gloomhaven digital board game and the boxed game (and expansion) but haven&amp;#39;t actually event opened it yet. Maybe I should fix that this weekend...&amp;#34;]]],[10,0],[1,&amp;#34;p&amp;#34;,[]]],&amp;#34;ghostVersion&amp;#34;:&amp;#34;3.0&amp;#34;}`
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;json: cannot unmarshal string into Go struct field Mobiledoc.sections of type int
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;nil&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Looks like we also have an issue unmarshaling, on that last line there. This is easy enough to fix for now. We just need to update &lt;code&gt;sections&lt;/code&gt; in our &lt;code&gt;Mobiledoc&lt;/code&gt; &lt;code&gt;struct&lt;/code&gt; to use &lt;code&gt;[][]interface{}&lt;/code&gt; and not &lt;code&gt;[][]int&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;type&lt;/span&gt; Mobiledoc &lt;span style=&#34;color:#268bd2&#34;&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	Version      &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;          &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;version&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	Markups      []&lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{}   &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;markups&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	Atoms        []&lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{}   &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;atoms&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	Cards        [][]&lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;cards&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	Sections     [][]&lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;sections&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	GhostVersion &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;          &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;ghostVersion&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;next-time&#34;&gt;Next Time&lt;/h3&gt;
&lt;p&gt;We&amp;rsquo;ve made some good progress over the last few posts. On the first look it seems we&amp;rsquo;re extracting what we need. I think we&amp;rsquo;re ready to do a little refactoring, remove our current debug print statements, and get ready for the next part of our converter.&lt;/p&gt;
&lt;hr&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&#34;text-align:center&#34;&gt;Enjoy this post?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;&lt;a href=&#34;https://ko-fi.com/shindakun&#34;&gt;How about buying me a coffee?&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h3 id=&#34;code-listing&#34;&gt;Code Listing&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;package&lt;/span&gt; main
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;import&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;encoding/json&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;io&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;os&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;reflect&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;strconv&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;strings&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;time&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;type&lt;/span&gt; GhostDatabase &lt;span style=&#34;color:#268bd2&#34;&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	Db []&lt;span style=&#34;color:#268bd2&#34;&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		Meta &lt;span style=&#34;color:#268bd2&#34;&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			ExportedOn &lt;span style=&#34;color:#dc322f&#34;&gt;int64&lt;/span&gt;  &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;exported_on&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			Version    &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;version&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;meta&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		Data &lt;span style=&#34;color:#268bd2&#34;&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			Posts []&lt;span style=&#34;color:#268bd2&#34;&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				ID                   &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;id&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				UUID                 &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;uuid&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Title                &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;title&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Slug                 &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;slug&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Mobiledoc            &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;mobiledoc&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				HTML                 &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;html&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				CommentID            &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;comment_id&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Plaintext            &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;plaintext&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				FeatureImage         &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;feature_image&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Featured             &lt;span style=&#34;color:#dc322f&#34;&gt;int&lt;/span&gt;         &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;featured&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Type                 &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;type&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Status               &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;status&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Locale               &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;locale&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Visibility           &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;visibility&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				EmailRecipientFilter &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;email_recipient_filter&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				AuthorID             &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;author_id&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				CreatedAt            time.Time   &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;created_at&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				UpdatedAt            time.Time   &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;updated_at&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				PublishedAt          time.Time   &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;published_at&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				CustomExcerpt        &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;custom_excerpt&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				CodeinjectionHead    &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;codeinjection_head&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				CodeinjectionFoot    &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;codeinjection_foot&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				CustomTemplate       &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;custom_template&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				CanonicalURL         &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;canonical_url&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;posts&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			PostsAuthors []&lt;span style=&#34;color:#268bd2&#34;&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				ID        &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;id&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				PostID    &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;post_id&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				AuthorID  &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;author_id&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				SortOrder &lt;span style=&#34;color:#dc322f&#34;&gt;int&lt;/span&gt;    &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;sort_order&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;posts_authors&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			PostsMeta []&lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;posts_meta&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			PostsTags []&lt;span style=&#34;color:#268bd2&#34;&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				ID        &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;id&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				PostID    &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;post_id&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				TagID     &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;tag_id&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				SortOrder &lt;span style=&#34;color:#dc322f&#34;&gt;int&lt;/span&gt;    &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;sort_order&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;posts_tags&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			Roles []&lt;span style=&#34;color:#268bd2&#34;&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				ID          &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;    &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;id&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Name        &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;    &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;name&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Description &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;    &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;description&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				CreatedAt   time.Time &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;created_at&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				UpdatedAt   time.Time &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;updated_at&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;roles&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			RolesUsers []&lt;span style=&#34;color:#268bd2&#34;&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				ID     &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;id&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				RoleID &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;role_id&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				UserID &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;user_id&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;roles_users&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			Settings []&lt;span style=&#34;color:#268bd2&#34;&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				ID        &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;id&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Group     &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;group&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Key       &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;key&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Value     &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;value&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Type      &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;type&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Flags     &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;flags&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				CreatedAt time.Time   &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;created_at&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				UpdatedAt time.Time   &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;updated_at&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;settings&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			Tags []&lt;span style=&#34;color:#268bd2&#34;&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				ID                 &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;id&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Name               &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;name&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Slug               &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;slug&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Description        &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;description&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				FeatureImage       &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;feature_image&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				ParentID           &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;parent_id&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Visibility         &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;visibility&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				OgImage            &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;og_image&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				OgTitle            &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;og_title&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				OgDescription      &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;og_description&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				TwitterImage       &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;twitter_image&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				TwitterTitle       &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;twitter_title&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				TwitterDescription &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;twitter_description&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				MetaTitle          &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;meta_title&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				MetaDescription    &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;meta_description&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				CodeinjectionHead  &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;codeinjection_head&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				CodeinjectionFoot  &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;codeinjection_foot&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				CanonicalURL       &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;canonical_url&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				AccentColor        &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;accent_color&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				CreatedAt          time.Time   &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;created_at&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				UpdatedAt          time.Time   &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;updated_at&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;tags&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			Users []&lt;span style=&#34;color:#268bd2&#34;&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				ID              &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;id&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Name            &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;name&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Slug            &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;slug&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Password        &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;password&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Email           &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;email&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				ProfileImage    &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;profile_image&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				CoverImage      &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;cover_image&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Bio             &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;bio&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Website         &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;website&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Location        &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;location&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Facebook        &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;facebook&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Twitter         &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;twitter&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Accessibility   &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;accessibility&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Status          &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;status&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Locale          &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;locale&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Visibility      &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;visibility&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				MetaTitle       &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;meta_title&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				MetaDescription &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;meta_description&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Tour            &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;tour&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				LastSeen        time.Time   &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;last_seen&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				CreatedAt       time.Time   &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;created_at&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				UpdatedAt       time.Time   &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;updated_at&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;users&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;data&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;db&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;type&lt;/span&gt; Mobiledoc &lt;span style=&#34;color:#268bd2&#34;&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	Version      &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;          &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;version&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	Markups      []&lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{}   &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;markups&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	Atoms        []&lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{}   &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;atoms&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	Cards        [][]&lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;cards&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	Sections     [][]&lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;sections&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	GhostVersion &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;          &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;ghostVersion&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#268bd2&#34;&gt;main&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	fmt.&lt;span style=&#34;color:#268bd2&#34;&gt;Println&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;ghost2hugo&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	file, err &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; os.&lt;span style=&#34;color:#268bd2&#34;&gt;Open&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;shindakun-dot-net.ghost.2022-03-18-22-02-58.json&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; err &lt;span style=&#34;color:#719e07&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#cb4b16&#34;&gt;nil&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		fmt.&lt;span style=&#34;color:#268bd2&#34;&gt;Println&lt;/span&gt;(err)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#719e07&#34;&gt;defer&lt;/span&gt; file.&lt;span style=&#34;color:#268bd2&#34;&gt;Close&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	b, err &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; io.&lt;span style=&#34;color:#268bd2&#34;&gt;ReadAll&lt;/span&gt;(file)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; err &lt;span style=&#34;color:#719e07&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#cb4b16&#34;&gt;nil&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		fmt.&lt;span style=&#34;color:#268bd2&#34;&gt;Println&lt;/span&gt;(err)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#268bd2&#34;&gt;var&lt;/span&gt; db GhostDatabase
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	err = json.&lt;span style=&#34;color:#268bd2&#34;&gt;Unmarshal&lt;/span&gt;(b, &lt;span style=&#34;color:#719e07&#34;&gt;&amp;amp;&lt;/span&gt;db)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; err &lt;span style=&#34;color:#719e07&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#cb4b16&#34;&gt;nil&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		fmt.&lt;span style=&#34;color:#268bd2&#34;&gt;Println&lt;/span&gt;(err)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#719e07&#34;&gt;for&lt;/span&gt; i &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;; i &amp;lt; &lt;span style=&#34;color:#b58900&#34;&gt;len&lt;/span&gt;(db.Db[&lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;].Data.Posts); i&lt;span style=&#34;color:#719e07&#34;&gt;++&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		fmt.&lt;span style=&#34;color:#268bd2&#34;&gt;Println&lt;/span&gt;(db.Db[&lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;].Data.Posts[i].Title)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		fmt.&lt;span style=&#34;color:#268bd2&#34;&gt;Println&lt;/span&gt;(db.Db[&lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;].Data.Posts[i].Slug)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		fmt.&lt;span style=&#34;color:#268bd2&#34;&gt;Println&lt;/span&gt;(db.Db[&lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;].Data.Posts[i].Status)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		fmt.&lt;span style=&#34;color:#268bd2&#34;&gt;Println&lt;/span&gt;(db.Db[&lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;].Data.Posts[i].CreatedAt)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		fmt.&lt;span style=&#34;color:#268bd2&#34;&gt;Println&lt;/span&gt;(db.Db[&lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;].Data.Posts[i].UpdatedAt)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		c &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; strings.&lt;span style=&#34;color:#268bd2&#34;&gt;ReplaceAll&lt;/span&gt;(db.Db[&lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;].Data.Posts[i].Mobiledoc, &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;`&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;%&amp;#39;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		cc &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;`&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; c &lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;`&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		fmt.&lt;span style=&#34;color:#268bd2&#34;&gt;Println&lt;/span&gt;(cc)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		ucn, err &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; strconv.&lt;span style=&#34;color:#268bd2&#34;&gt;Unquote&lt;/span&gt;(cc)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; err &lt;span style=&#34;color:#719e07&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#cb4b16&#34;&gt;nil&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			fmt.&lt;span style=&#34;color:#268bd2&#34;&gt;Println&lt;/span&gt;(err, ucn)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		ucn = strings.&lt;span style=&#34;color:#268bd2&#34;&gt;ReplaceAll&lt;/span&gt;(ucn, &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;%&amp;#39;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;`&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#268bd2&#34;&gt;var&lt;/span&gt; md Mobiledoc
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		err = json.&lt;span style=&#34;color:#268bd2&#34;&gt;Unmarshal&lt;/span&gt;([]&lt;span style=&#34;color:#b58900&#34;&gt;byte&lt;/span&gt;(ucn), &lt;span style=&#34;color:#719e07&#34;&gt;&amp;amp;&lt;/span&gt;md)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; err &lt;span style=&#34;color:#719e07&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#cb4b16&#34;&gt;nil&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			fmt.&lt;span style=&#34;color:#268bd2&#34;&gt;Println&lt;/span&gt;(err)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; reflect.&lt;span style=&#34;color:#268bd2&#34;&gt;ValueOf&lt;/span&gt;(md.Cards).&lt;span style=&#34;color:#268bd2&#34;&gt;Len&lt;/span&gt;() &amp;gt; &lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			card &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; md.Cards[&lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;][&lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			bbb &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; card.(&lt;span style=&#34;color:#268bd2&#34;&gt;map&lt;/span&gt;[&lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;]&lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{})
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			fmt.&lt;span style=&#34;color:#268bd2&#34;&gt;Println&lt;/span&gt;(bbb[&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;markdown&amp;#34;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		fmt.&lt;span style=&#34;color:#268bd2&#34;&gt;Println&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;---&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    
    <item>
      <title>Attempting to Learn Go - Ghost to Hugo 2</title>
      <link>https://shindakun.dev/posts/attempting-to-learn-go-ghost-to-hugo-2/</link>
      <pubDate>Thu, 22 Sep 2022 19:27:29 -0700</pubDate>
      
      <guid>https://shindakun.dev/posts/attempting-to-learn-go-ghost-to-hugo-2/</guid>
      <description>&lt;h2 id=&#34;intro&#34;&gt;Intro&lt;/h2&gt;
&lt;p&gt;Welcome back! We are &lt;a href=&#34;https://shindakun.dev/posts/attempting-to-learn-go-ghost-to-hugo-1&#34;&gt;continuing&lt;/a&gt; on our journey to make a prototype program that converts an exported Ghost database to Markdown. With the end goal being that we can get &lt;a href=&#34;https://shindakun.net&#34;&gt;shindakun.net&lt;/a&gt; up and running with Hugo. Last time, we took it pretty easy and focused mostly on reading the file into memory and converting the JSON to a Go struct. From there we printed out the first post.&lt;/p&gt;
&lt;h3 id=&#34;post-data&#34;&gt;Post Data&lt;/h3&gt;
&lt;p&gt;As a recap here is what one of the post fields contain.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;60710b90705967038fe662d6&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;uuid&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;71ba3d71-ac18-4f33-82f7-1962baa83a07&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;title&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;db test&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;slug&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;db-test&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;mobiledoc&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;{\&amp;#34;version\&amp;#34;:\&amp;#34;0.3.1\&amp;#34;,\&amp;#34;markups\&amp;#34;:[],\&amp;#34;atoms\&amp;#34;:[],\&amp;#34;cards\&amp;#34;:[[\&amp;#34;markdown\&amp;#34;,{\&amp;#34;cardName\&amp;#34;:\&amp;#34;card-markdown\&amp;#34;,\&amp;#34;markdown\&amp;#34;:\&amp;#34;\\n&amp;lt;strike&amp;gt;This is a db test&amp;lt;/strike&amp;gt;.\\n\&amp;#34;}]],\&amp;#34;sections\&amp;#34;:[[10,0]],\&amp;#34;ghostVersion\&amp;#34;:\&amp;#34;3.0\&amp;#34;}&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;html&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;&amp;lt;!--kg-card-begin: markdown--&amp;gt;&amp;lt;p&amp;gt;&amp;lt;strike&amp;gt;This is a db test&amp;lt;/strike&amp;gt;.&amp;lt;/p&amp;gt;\n&amp;lt;!--kg-card-end: markdown--&amp;gt;&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;comment_id&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;2&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;plaintext&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;This is a db test.&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;feature_image&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#cb4b16&#34;&gt;null&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;featured&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;post&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;status&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;published&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;locale&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#cb4b16&#34;&gt;null&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;visibility&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;public&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;email_recipient_filter&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;none&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;author_id&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;60710b8d705967038fe66214&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;created_at&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;2004-08-09T19:11:20.000Z&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;updated_at&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;2004-08-09T19:11:20.000Z&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;published_at&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;2004-08-09T19:11:20.000Z&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;custom_excerpt&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#cb4b16&#34;&gt;null&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;codeinjection_head&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#cb4b16&#34;&gt;null&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;codeinjection_foot&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#cb4b16&#34;&gt;null&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;custom_template&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#cb4b16&#34;&gt;null&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;canonical_url&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#cb4b16&#34;&gt;null&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;},
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The majority of the fields we need to craft a post with appropriate frontmatter exist within this the object we&amp;rsquo;re getting back. We can see the title, slug, published date, etc. The section that contains the Markdown is in a format known as Mobiledoc.&lt;/p&gt;
&lt;h3 id=&#34;mobiledoc&#34;&gt;Mobiledoc&lt;/h3&gt;
&lt;p&gt;According to the Ghost documentation Mobiledoc is&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;hellip;a standardised JSON-based document storage format, which forms the heart of publishing with Ghost.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;When extracted from the JSON object and cleaned up we&amp;rsquo;ll have another bit of JSON we can work with.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;version&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;0.3.1&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;markups&amp;#34;&lt;/span&gt;: [],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;atoms&amp;#34;&lt;/span&gt;: [],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;cards&amp;#34;&lt;/span&gt;: [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;markdown&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;cardName&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;card-markdown&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;markdown&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;\n&amp;lt;strike&amp;gt;This is a db test&amp;lt;/strike&amp;gt;.\n&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;sections&amp;#34;&lt;/span&gt;: [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#2aa198&#34;&gt;10&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;ghostVersion&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;3.0&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;sounds-easy&#34;&gt;Sounds Easy&lt;/h3&gt;
&lt;p&gt;First we&amp;rsquo;ll use our favorite site, the &lt;a href=&#34;https://mholt.github.io/json-to-go/&#34;&gt;JSON to Go&lt;/a&gt; converter to convert the JSON object to a struct we can work with.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;type&lt;/span&gt; Mobiledoc &lt;span style=&#34;color:#268bd2&#34;&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	Version      &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;          &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;version&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	Markups      []&lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{}   &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;markups&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	Atoms        []&lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{}   &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;atoms&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	Cards        [][]&lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;cards&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	Sections     [][]&lt;span style=&#34;color:#dc322f&#34;&gt;int&lt;/span&gt;         &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;sections&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	GhostVersion &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;          &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;ghostVersion&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Our code is pretty long now so I&amp;rsquo;m going to leave out the other struct &lt;code&gt;GhostDatabase&lt;/code&gt; struct, it&amp;rsquo;ll be in the complete code listing below though. We&amp;rsquo;re still going to be dumping code to the screen  since we&amp;rsquo;re still working on our decoding logic.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;package&lt;/span&gt; main
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;import&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;encoding/json&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;io&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;os&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;strconv&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;time&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;type&lt;/span&gt; GhostDatabase &lt;span style=&#34;color:#268bd2&#34;&gt;struct&lt;/span&gt; {&lt;span style=&#34;color:#719e07&#34;&gt;...&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;type&lt;/span&gt; Mobiledoc &lt;span style=&#34;color:#268bd2&#34;&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	Version      &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;          &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;version&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	Markups      []&lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{}   &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;markups&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	Atoms        []&lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{}   &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;atoms&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	Cards        [][]&lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;cards&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	Sections     [][]&lt;span style=&#34;color:#dc322f&#34;&gt;int&lt;/span&gt;         &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;sections&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	GhostVersion &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;          &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;ghostVersion&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#268bd2&#34;&gt;main&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	fmt.&lt;span style=&#34;color:#268bd2&#34;&gt;Println&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;ghost2hugo&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	file, err &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; os.&lt;span style=&#34;color:#268bd2&#34;&gt;Open&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;shindakun-dot-net.ghost.2022-03-18-22-02-58.json&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; err &lt;span style=&#34;color:#719e07&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#cb4b16&#34;&gt;nil&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		fmt.&lt;span style=&#34;color:#268bd2&#34;&gt;Println&lt;/span&gt;(err)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#719e07&#34;&gt;defer&lt;/span&gt; file.&lt;span style=&#34;color:#268bd2&#34;&gt;Close&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	b, err &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; io.&lt;span style=&#34;color:#268bd2&#34;&gt;ReadAll&lt;/span&gt;(file)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; err &lt;span style=&#34;color:#719e07&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#cb4b16&#34;&gt;nil&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		fmt.&lt;span style=&#34;color:#268bd2&#34;&gt;Println&lt;/span&gt;(err)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#268bd2&#34;&gt;var&lt;/span&gt; db GhostDatabase
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	err = json.&lt;span style=&#34;color:#268bd2&#34;&gt;Unmarshal&lt;/span&gt;(b, &lt;span style=&#34;color:#719e07&#34;&gt;&amp;amp;&lt;/span&gt;db)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; err &lt;span style=&#34;color:#719e07&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#cb4b16&#34;&gt;nil&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		fmt.&lt;span style=&#34;color:#268bd2&#34;&gt;Println&lt;/span&gt;(err)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Let&amp;rsquo;s continue to focus on the first post for now since once we have that working it should just be a matter of looping through the &amp;ldquo;database&amp;rdquo;. This is where it gets a little tricky. We&amp;rsquo;re working with a couple of nested arrays so to work our way down to the appropriate section we use &lt;code&gt;db.Db[0].Data.Posts[0].Mobiledoc&lt;/code&gt;. This will give use the escaped version of our JSON object.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;{\&amp;#34;version\&amp;#34;:\&amp;#34;0.3.1\&amp;#34;,\&amp;#34;markups\&amp;#34;:[],\&amp;#34;atoms\&amp;#34;:[],\&amp;#34;cards\&amp;#34;:[[\&amp;#34;markdown\&amp;#34;,{\&amp;#34;cardName\&amp;#34;:\&amp;#34;card-markdown\&amp;#34;,\&amp;#34;markdown\&amp;#34;:\&amp;#34;\\n&amp;lt;strike&amp;gt;This is a db test&amp;lt;/strike&amp;gt;.\\n\&amp;#34;}]],\&amp;#34;sections\&amp;#34;:[[10,0]],\&amp;#34;ghostVersion\&amp;#34;:\&amp;#34;3.0\&amp;#34;}&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;lets-go-on-a-trip&#34;&gt;Let&amp;rsquo;s Go On A Trip&lt;/h3&gt;
&lt;p&gt;I knew that there would be a way to unescape the string that we get, checking the &lt;a href=&#34;https://pkg.go.dev/strconv?utm_source=gopls#Unquote&#34;&gt;Go documentation&lt;/a&gt; led me to &lt;code&gt;strconv.Unquote&lt;/code&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Unquote interprets s as a single-quoted, double-quoted, or backquoted Go string literal, returning the string value that s quotes. (If s is single-quoted, it would be a Go character literal; Unquote returns the corresponding one-character string.)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Exactly what we need! Except that when I tried to unquote the string I kept receiving an  &lt;code&gt;invalid syntax&lt;/code&gt; error. This had me confused for a little bit. After puzzling over it I realized if I prepended and appended a back tick to the string it seems to be treated as a raw string literal. This leads to code that looks like the following.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	c &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;`&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; db.Db[&lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;].Data.Posts[&lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;].Mobiledoc &lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;`&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	un, err &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; strconv.&lt;span style=&#34;color:#268bd2&#34;&gt;Unquote&lt;/span&gt;(c)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; err &lt;span style=&#34;color:#719e07&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#cb4b16&#34;&gt;nil&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		fmt.&lt;span style=&#34;color:#268bd2&#34;&gt;Println&lt;/span&gt;(err)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	fmt.&lt;span style=&#34;color:#268bd2&#34;&gt;Printf&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;%v\n&amp;#34;&lt;/span&gt;, un)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Finally! We have the JSON!&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;version&amp;#34;&lt;/span&gt;:&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;0.3.1&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;markups&amp;#34;&lt;/span&gt;:[],&lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;atoms&amp;#34;&lt;/span&gt;:[],&lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;cards&amp;#34;&lt;/span&gt;:[[&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;markdown&amp;#34;&lt;/span&gt;,{&lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;cardName&amp;#34;&lt;/span&gt;:&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;card-markdown&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;markdown&amp;#34;&lt;/span&gt;:&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;\n&amp;lt;strike&amp;gt;This is a db test&amp;lt;/strike&amp;gt;.\n&amp;#34;&lt;/span&gt;}]],&lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;sections&amp;#34;&lt;/span&gt;:[[&lt;span style=&#34;color:#2aa198&#34;&gt;10&lt;/span&gt;,&lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;]],&lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;ghostVersion&amp;#34;&lt;/span&gt;:&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;3.0&amp;#34;&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now, we can unmarshal that into the Mobiledoc struct we set up earlier!&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#268bd2&#34;&gt;var&lt;/span&gt; md Mobiledoc
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	err = json.&lt;span style=&#34;color:#268bd2&#34;&gt;Unmarshal&lt;/span&gt;([]&lt;span style=&#34;color:#b58900&#34;&gt;byte&lt;/span&gt;(un), &lt;span style=&#34;color:#719e07&#34;&gt;&amp;amp;&lt;/span&gt;md)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; err &lt;span style=&#34;color:#719e07&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#cb4b16&#34;&gt;nil&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		fmt.&lt;span style=&#34;color:#268bd2&#34;&gt;Println&lt;/span&gt;(err)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	fmt.&lt;span style=&#34;color:#268bd2&#34;&gt;Printf&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;%#v&amp;#34;&lt;/span&gt;, md)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Checking our dumped result we can see that we&amp;rsquo;ve got the expected data.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;main.Mobiledoc{Version:&amp;#34;0.3.1&amp;#34;, Markups:[]interface {}{}, Atoms:[]interface {}{}, Cards:[][]interface {}{[]interface {}{&amp;#34;markdown&amp;#34;, map[string]interface {}{&amp;#34;cardName&amp;#34;:&amp;#34;card-markdown&amp;#34;, &amp;#34;markdown&amp;#34;:&amp;#34;\n&amp;lt;strike&amp;gt;This is a db test&amp;lt;/strike&amp;gt;.\n&amp;#34;}}}, Sections:[][]int{[]int{10, 0}}, GhostVersion:&amp;#34;3.0&amp;#34;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Right now we&amp;rsquo;re concerned with the section called &lt;code&gt;Cards&lt;/code&gt; which if we naively want to access we can use the following.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	card &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; md.Cards[&lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;][&lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	fmt.&lt;span style=&#34;color:#268bd2&#34;&gt;Printf&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;\n\ncard: %#v\n&amp;#34;&lt;/span&gt;, card)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;card: map[string]interface {}{&amp;#34;cardName&amp;#34;:&amp;#34;card-markdown&amp;#34;, &amp;#34;markdown&amp;#34;:&amp;#34;\n&amp;lt;strike&amp;gt;This is a db test&amp;lt;/strike&amp;gt;.\n&amp;#34;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Let&amp;rsquo;s convert that to something a bit easier to access.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	bbb &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; card.(&lt;span style=&#34;color:#268bd2&#34;&gt;map&lt;/span&gt;[&lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;]&lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{})
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	fmt.&lt;span style=&#34;color:#268bd2&#34;&gt;Println&lt;/span&gt;(bbb[&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;markdown&amp;#34;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-markdown&#34; data-lang=&#34;markdown&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#268bd2&#34;&gt;strike&lt;/span&gt;&amp;gt;This is a db test&amp;lt;/&lt;span style=&#34;color:#268bd2&#34;&gt;strike&lt;/span&gt;&amp;gt;.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;next-time&#34;&gt;Next Time&lt;/h3&gt;
&lt;p&gt;So far so good, we&amp;rsquo;ve extracted the Markdown from the first post as expected. Next time around we&amp;rsquo;ll be writing a small loop to start trying to extract all the posts. I have a feeling that&amp;rsquo;s where the fun will begin.&lt;/p&gt;
&lt;hr&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&#34;text-align:center&#34;&gt;Enjoy this post?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;&lt;a href=&#34;https://ko-fi.com/shindakun&#34;&gt;How about buying me a coffee?&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h3 id=&#34;code-listing&#34;&gt;Code Listing&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;package&lt;/span&gt; main
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;import&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;encoding/json&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;io&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;os&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;strconv&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;time&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;type&lt;/span&gt; GhostDatabase &lt;span style=&#34;color:#268bd2&#34;&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	Db []&lt;span style=&#34;color:#268bd2&#34;&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		Meta &lt;span style=&#34;color:#268bd2&#34;&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			ExportedOn &lt;span style=&#34;color:#dc322f&#34;&gt;int64&lt;/span&gt;  &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;exported_on&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			Version    &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;version&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;meta&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		Data &lt;span style=&#34;color:#268bd2&#34;&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			Posts []&lt;span style=&#34;color:#268bd2&#34;&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				ID                   &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;id&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				UUID                 &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;uuid&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Title                &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;title&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Slug                 &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;slug&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Mobiledoc            &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;mobiledoc&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				HTML                 &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;html&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				CommentID            &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;comment_id&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Plaintext            &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;plaintext&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				FeatureImage         &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;feature_image&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Featured             &lt;span style=&#34;color:#dc322f&#34;&gt;int&lt;/span&gt;         &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;featured&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Type                 &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;type&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Status               &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;status&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Locale               &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;locale&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Visibility           &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;visibility&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				EmailRecipientFilter &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;email_recipient_filter&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				AuthorID             &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;author_id&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				CreatedAt            time.Time   &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;created_at&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				UpdatedAt            time.Time   &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;updated_at&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				PublishedAt          time.Time   &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;published_at&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				CustomExcerpt        &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;custom_excerpt&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				CodeinjectionHead    &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;codeinjection_head&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				CodeinjectionFoot    &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;codeinjection_foot&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				CustomTemplate       &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;custom_template&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				CanonicalURL         &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;canonical_url&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;posts&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			PostsAuthors []&lt;span style=&#34;color:#268bd2&#34;&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				ID        &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;id&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				PostID    &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;post_id&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				AuthorID  &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;author_id&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				SortOrder &lt;span style=&#34;color:#dc322f&#34;&gt;int&lt;/span&gt;    &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;sort_order&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;posts_authors&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			PostsMeta []&lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;posts_meta&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			PostsTags []&lt;span style=&#34;color:#268bd2&#34;&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				ID        &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;id&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				PostID    &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;post_id&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				TagID     &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;tag_id&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				SortOrder &lt;span style=&#34;color:#dc322f&#34;&gt;int&lt;/span&gt;    &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;sort_order&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;posts_tags&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			Roles []&lt;span style=&#34;color:#268bd2&#34;&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				ID          &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;    &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;id&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Name        &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;    &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;name&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Description &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;    &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;description&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				CreatedAt   time.Time &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;created_at&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				UpdatedAt   time.Time &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;updated_at&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;roles&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			RolesUsers []&lt;span style=&#34;color:#268bd2&#34;&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				ID     &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;id&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				RoleID &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;role_id&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				UserID &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;user_id&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;roles_users&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			Settings []&lt;span style=&#34;color:#268bd2&#34;&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				ID        &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;id&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Group     &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;group&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Key       &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;key&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Value     &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;value&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Type      &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;type&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Flags     &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;flags&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				CreatedAt time.Time   &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;created_at&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				UpdatedAt time.Time   &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;updated_at&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;settings&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			Tags []&lt;span style=&#34;color:#268bd2&#34;&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				ID                 &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;id&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Name               &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;name&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Slug               &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;slug&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Description        &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;description&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				FeatureImage       &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;feature_image&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				ParentID           &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;parent_id&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Visibility         &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;visibility&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				OgImage            &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;og_image&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				OgTitle            &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;og_title&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				OgDescription      &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;og_description&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				TwitterImage       &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;twitter_image&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				TwitterTitle       &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;twitter_title&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				TwitterDescription &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;twitter_description&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				MetaTitle          &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;meta_title&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				MetaDescription    &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;meta_description&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				CodeinjectionHead  &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;codeinjection_head&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				CodeinjectionFoot  &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;codeinjection_foot&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				CanonicalURL       &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;canonical_url&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				AccentColor        &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;accent_color&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				CreatedAt          time.Time   &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;created_at&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				UpdatedAt          time.Time   &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;updated_at&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;tags&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			Users []&lt;span style=&#34;color:#268bd2&#34;&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				ID              &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;id&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Name            &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;name&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Slug            &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;slug&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Password        &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;password&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Email           &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;email&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				ProfileImage    &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;profile_image&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				CoverImage      &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;cover_image&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Bio             &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;bio&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Website         &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;website&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Location        &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;location&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Facebook        &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;facebook&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Twitter         &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;twitter&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Accessibility   &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;accessibility&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Status          &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;status&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Locale          &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;locale&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Visibility      &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;visibility&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				MetaTitle       &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;meta_title&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				MetaDescription &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;meta_description&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Tour            &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;tour&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				LastSeen        time.Time   &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;last_seen&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				CreatedAt       time.Time   &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;created_at&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				UpdatedAt       time.Time   &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;updated_at&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;users&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;data&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;db&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;type&lt;/span&gt; Mobiledoc &lt;span style=&#34;color:#268bd2&#34;&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	Version      &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;          &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;version&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	Markups      []&lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{}   &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;markups&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	Atoms        []&lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{}   &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;atoms&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	Cards        [][]&lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;cards&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	Sections     [][]&lt;span style=&#34;color:#dc322f&#34;&gt;int&lt;/span&gt;         &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;sections&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	GhostVersion &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;          &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;ghostVersion&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#268bd2&#34;&gt;main&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	fmt.&lt;span style=&#34;color:#268bd2&#34;&gt;Println&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;ghost2hugo&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	file, err &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; os.&lt;span style=&#34;color:#268bd2&#34;&gt;Open&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;shindakun-dot-net.ghost.2022-03-18-22-02-58.json&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; err &lt;span style=&#34;color:#719e07&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#cb4b16&#34;&gt;nil&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		fmt.&lt;span style=&#34;color:#268bd2&#34;&gt;Println&lt;/span&gt;(err)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#719e07&#34;&gt;defer&lt;/span&gt; file.&lt;span style=&#34;color:#268bd2&#34;&gt;Close&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	b, err &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; io.&lt;span style=&#34;color:#268bd2&#34;&gt;ReadAll&lt;/span&gt;(file)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; err &lt;span style=&#34;color:#719e07&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#cb4b16&#34;&gt;nil&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		fmt.&lt;span style=&#34;color:#268bd2&#34;&gt;Println&lt;/span&gt;(err)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#268bd2&#34;&gt;var&lt;/span&gt; db GhostDatabase
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	err = json.&lt;span style=&#34;color:#268bd2&#34;&gt;Unmarshal&lt;/span&gt;(b, &lt;span style=&#34;color:#719e07&#34;&gt;&amp;amp;&lt;/span&gt;db)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; err &lt;span style=&#34;color:#719e07&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#cb4b16&#34;&gt;nil&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		fmt.&lt;span style=&#34;color:#268bd2&#34;&gt;Println&lt;/span&gt;(err)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	c &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;`&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; db.Db[&lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;].Data.Posts[&lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;].Mobiledoc &lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;`&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	un, err &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; strconv.&lt;span style=&#34;color:#268bd2&#34;&gt;Unquote&lt;/span&gt;(c)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; err &lt;span style=&#34;color:#719e07&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#cb4b16&#34;&gt;nil&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		fmt.&lt;span style=&#34;color:#268bd2&#34;&gt;Println&lt;/span&gt;(err)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	fmt.&lt;span style=&#34;color:#268bd2&#34;&gt;Printf&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;%v&amp;#34;&lt;/span&gt;, un)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#268bd2&#34;&gt;var&lt;/span&gt; md Mobiledoc
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	err = json.&lt;span style=&#34;color:#268bd2&#34;&gt;Unmarshal&lt;/span&gt;([]&lt;span style=&#34;color:#b58900&#34;&gt;byte&lt;/span&gt;(un), &lt;span style=&#34;color:#719e07&#34;&gt;&amp;amp;&lt;/span&gt;md)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; err &lt;span style=&#34;color:#719e07&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#cb4b16&#34;&gt;nil&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		fmt.&lt;span style=&#34;color:#268bd2&#34;&gt;Println&lt;/span&gt;(err)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	fmt.&lt;span style=&#34;color:#268bd2&#34;&gt;Printf&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;%#v&amp;#34;&lt;/span&gt;, md)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	card &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; md.Cards[&lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;][&lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	fmt.&lt;span style=&#34;color:#268bd2&#34;&gt;Printf&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;\n\ncard: %#v\n&amp;#34;&lt;/span&gt;, card)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	bbb &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; card.(&lt;span style=&#34;color:#268bd2&#34;&gt;map&lt;/span&gt;[&lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;]&lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{})
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	fmt.&lt;span style=&#34;color:#268bd2&#34;&gt;Println&lt;/span&gt;(bbb[&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;markdown&amp;#34;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    
    <item>
      <title>Attempting to Learn Go - Ghost to Hugo 1</title>
      <link>https://shindakun.dev/posts/attempting-to-learn-go-ghost-to-hugo-1/</link>
      <pubDate>Sun, 18 Sep 2022 20:54:29 -0700</pubDate>
      
      <guid>https://shindakun.dev/posts/attempting-to-learn-go-ghost-to-hugo-1/</guid>
      <description>&lt;h2 id=&#34;intro&#34;&gt;Intro&lt;/h2&gt;
&lt;p&gt;You probably don&amp;rsquo;t know this but &lt;a href=&#34;https://shindakun.net/&#34;&gt;shindakun.net&lt;/a&gt; has been effectively offline now for months. Currently, visiting it will only show a white page and a pop-up, no content is accessible. This is a side effect to my upgrading to a new server and moving away from Ghost as my platform of choice.&lt;/p&gt;
&lt;p&gt;I love(d) Ghost but it just got too large to effectively run multiple sites on a small instance on Digital Ocean. I want to get the site back up and running but this time using &lt;a href=&#34;https://gohugo.io/&#34;&gt;Hugo&lt;/a&gt;. This seems like a great opportunity to make a new series of ATLG posts&amp;hellip; plus it&amp;rsquo;s been a while since I&amp;rsquo;ve written any Go.&lt;/p&gt;
&lt;h3 id=&#34;post-data&#34;&gt;Post Data&lt;/h3&gt;
&lt;p&gt;Before shutting down the original server I exported a copy of the Ghost database as JSON. I should be able to use this to build out the needed Markdown files to make up the content of the site. Here&amp;rsquo;s the first post.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;60710b90705967038fe662d6&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;uuid&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;71ba3d71-ac18-4f33-82f7-1962baa83a07&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;title&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;db test&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;slug&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;db-test&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;mobiledoc&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;{\&amp;#34;version\&amp;#34;:\&amp;#34;0.3.1\&amp;#34;,\&amp;#34;markups\&amp;#34;:[],\&amp;#34;atoms\&amp;#34;:[],\&amp;#34;cards\&amp;#34;:[[\&amp;#34;markdown\&amp;#34;,{\&amp;#34;cardName\&amp;#34;:\&amp;#34;card-markdown\&amp;#34;,\&amp;#34;markdown\&amp;#34;:\&amp;#34;\\n&amp;lt;strike&amp;gt;This is a db test&amp;lt;/strike&amp;gt;.\\n\&amp;#34;}]],\&amp;#34;sections\&amp;#34;:[[10,0]],\&amp;#34;ghostVersion\&amp;#34;:\&amp;#34;3.0\&amp;#34;}&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;html&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;&amp;lt;!--kg-card-begin: markdown--&amp;gt;&amp;lt;p&amp;gt;&amp;lt;strike&amp;gt;This is a db test&amp;lt;/strike&amp;gt;.&amp;lt;/p&amp;gt;\n&amp;lt;!--kg-card-end: markdown--&amp;gt;&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;comment_id&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;2&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;plaintext&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;This is a db test.&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;feature_image&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#cb4b16&#34;&gt;null&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;featured&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;post&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;status&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;published&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;locale&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#cb4b16&#34;&gt;null&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;visibility&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;public&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;email_recipient_filter&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;none&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;author_id&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;60710b8d705967038fe66214&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;created_at&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;2004-08-09T19:11:20.000Z&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;updated_at&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;2004-08-09T19:11:20.000Z&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;published_at&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;2004-08-09T19:11:20.000Z&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;custom_excerpt&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#cb4b16&#34;&gt;null&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;codeinjection_head&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#cb4b16&#34;&gt;null&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;codeinjection_foot&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#cb4b16&#34;&gt;null&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;custom_template&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#cb4b16&#34;&gt;null&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;canonical_url&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#cb4b16&#34;&gt;null&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;},
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Yes, I have some posts dating back to 2004! Back then I wrote my own custom blog software in PHP. It was a neat time, too bad none of the code survived. It almost makes me want to try and do it again only in Go&amp;hellip; but I&amp;rsquo;ll resist that urge.&lt;/p&gt;
&lt;h3 id=&#34;quick-and-dirty&#34;&gt;Quick and Dirty&lt;/h3&gt;
&lt;p&gt;Alright let&amp;rsquo;s write a program which will read our JSON and spit out a single post. First things first we need a struct that maps to our &amp;ldquo;database&amp;rdquo;. We get this by simply slapping the JSON into the awesome &lt;a href=&#34;https://mholt.github.io/json-to-go/&#34;&gt;JSON to Go converter&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;type&lt;/span&gt; GhostDatabase &lt;span style=&#34;color:#268bd2&#34;&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	Db []&lt;span style=&#34;color:#268bd2&#34;&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		Meta &lt;span style=&#34;color:#268bd2&#34;&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			ExportedOn &lt;span style=&#34;color:#dc322f&#34;&gt;int64&lt;/span&gt;  &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;exported_on&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			Version    &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;version&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;meta&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		Data &lt;span style=&#34;color:#268bd2&#34;&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			Posts []&lt;span style=&#34;color:#268bd2&#34;&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				ID                   &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;id&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				UUID                 &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;uuid&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Title                &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;title&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Slug                 &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;slug&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Mobiledoc            &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;mobiledoc&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				HTML                 &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;html&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				CommentID            &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;comment_id&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Plaintext            &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;plaintext&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				FeatureImage         &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;feature_image&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Featured             &lt;span style=&#34;color:#dc322f&#34;&gt;int&lt;/span&gt;         &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;featured&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Type                 &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;type&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Status               &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;status&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Locale               &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;locale&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Visibility           &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;visibility&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				EmailRecipientFilter &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;email_recipient_filter&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				AuthorID             &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;author_id&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				CreatedAt            time.Time   &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;created_at&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				UpdatedAt            time.Time   &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;updated_at&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				PublishedAt          time.Time   &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;published_at&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				CustomExcerpt        &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;custom_excerpt&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				CodeinjectionHead    &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;codeinjection_head&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				CodeinjectionFoot    &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;codeinjection_foot&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				CustomTemplate       &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;custom_template&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				CanonicalURL         &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;canonical_url&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;posts&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			PostsAuthors []&lt;span style=&#34;color:#268bd2&#34;&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				ID        &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;id&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				PostID    &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;post_id&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				AuthorID  &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;author_id&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				SortOrder &lt;span style=&#34;color:#dc322f&#34;&gt;int&lt;/span&gt;    &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;sort_order&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;posts_authors&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			PostsMeta []&lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;posts_meta&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			PostsTags []&lt;span style=&#34;color:#268bd2&#34;&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				ID        &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;id&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				PostID    &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;post_id&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				TagID     &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;tag_id&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				SortOrder &lt;span style=&#34;color:#dc322f&#34;&gt;int&lt;/span&gt;    &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;sort_order&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;posts_tags&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			Roles []&lt;span style=&#34;color:#268bd2&#34;&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				ID          &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;    &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;id&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Name        &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;    &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;name&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Description &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;    &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;description&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				CreatedAt   time.Time &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;created_at&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				UpdatedAt   time.Time &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;updated_at&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;roles&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			RolesUsers []&lt;span style=&#34;color:#268bd2&#34;&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				ID     &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;id&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				RoleID &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;role_id&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				UserID &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;user_id&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;roles_users&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			Settings []&lt;span style=&#34;color:#268bd2&#34;&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				ID        &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;id&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Group     &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;group&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Key       &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;key&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Value     &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;value&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Type      &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;type&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Flags     &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;flags&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				CreatedAt time.Time   &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;created_at&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				UpdatedAt time.Time   &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;updated_at&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;settings&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			Tags []&lt;span style=&#34;color:#268bd2&#34;&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				ID                 &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;id&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Name               &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;name&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Slug               &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;slug&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Description        &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;description&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				FeatureImage       &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;feature_image&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				ParentID           &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;parent_id&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Visibility         &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;visibility&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				OgImage            &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;og_image&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				OgTitle            &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;og_title&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				OgDescription      &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;og_description&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				TwitterImage       &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;twitter_image&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				TwitterTitle       &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;twitter_title&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				TwitterDescription &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;twitter_description&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				MetaTitle          &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;meta_title&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				MetaDescription    &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;meta_description&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				CodeinjectionHead  &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;codeinjection_head&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				CodeinjectionFoot  &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;codeinjection_foot&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				CanonicalURL       &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;canonical_url&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				AccentColor        &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;accent_color&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				CreatedAt          time.Time   &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;created_at&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				UpdatedAt          time.Time   &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;updated_at&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;tags&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			Users []&lt;span style=&#34;color:#268bd2&#34;&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				ID              &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;id&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Name            &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;name&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Slug            &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;slug&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Password        &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;password&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Email           &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;email&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				ProfileImage    &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;profile_image&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				CoverImage      &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;cover_image&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Bio             &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;bio&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Website         &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;website&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Location        &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;location&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Facebook        &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;facebook&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Twitter         &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;twitter&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Accessibility   &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;accessibility&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Status          &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;status&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Locale          &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;locale&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Visibility      &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;visibility&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				MetaTitle       &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;meta_title&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				MetaDescription &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;meta_description&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Tour            &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;tour&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				LastSeen        time.Time   &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;last_seen&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				CreatedAt       time.Time   &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;created_at&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				UpdatedAt       time.Time   &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;updated_at&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;users&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;data&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;db&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Perfect. Note that not all of the struct is strictly required but I&amp;rsquo;ll leave it in for now. Who knows I might write something to pull the tags for posts too.&lt;/p&gt;
&lt;h3 id=&#34;reading-the-file&#34;&gt;Reading the File&lt;/h3&gt;
&lt;p&gt;To start with we&amp;rsquo;re going to open our file. Note that this is indeed a quick and dirty version, maybe we&amp;rsquo;ll add some proper error handling later.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	file, err &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; os.&lt;span style=&#34;color:#268bd2&#34;&gt;Open&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;shindakun-dot-net.ghost.2022-03-18-22-02-58.json&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; err &lt;span style=&#34;color:#719e07&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#cb4b16&#34;&gt;nil&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		fmt.&lt;span style=&#34;color:#268bd2&#34;&gt;Println&lt;/span&gt;(err)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Once opened we need to read the file into memory as a &lt;code&gt;[]byte&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	b, err &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; io.&lt;span style=&#34;color:#268bd2&#34;&gt;ReadAll&lt;/span&gt;(file)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; err &lt;span style=&#34;color:#719e07&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#cb4b16&#34;&gt;nil&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		fmt.&lt;span style=&#34;color:#268bd2&#34;&gt;Println&lt;/span&gt;(err)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now we&amp;rsquo;ll declare our database variable, &lt;code&gt;db&lt;/code&gt;. Using &lt;code&gt;json.Unmarshal()&lt;/code&gt; we convert the JSON into the struct we will be using.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#268bd2&#34;&gt;var&lt;/span&gt; db GhostDatabase
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	err = json.&lt;span style=&#34;color:#268bd2&#34;&gt;Unmarshal&lt;/span&gt;(b, &lt;span style=&#34;color:#719e07&#34;&gt;&amp;amp;&lt;/span&gt;db)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; err &lt;span style=&#34;color:#719e07&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#cb4b16&#34;&gt;nil&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		fmt.&lt;span style=&#34;color:#268bd2&#34;&gt;Println&lt;/span&gt;(err)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Finally, we print out the text of the first post.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	fmt.&lt;span style=&#34;color:#268bd2&#34;&gt;Printf&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;%#v&amp;#34;&lt;/span&gt;, db.Db[&lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;].Data.Posts[&lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;].HTML)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This leaves us with the output&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;&amp;lt;!--kg-card-begin: markdown--&amp;gt;&lt;/span&gt;&amp;lt;&lt;span style=&#34;color:#268bd2&#34;&gt;p&lt;/span&gt;&amp;gt;&amp;lt;&lt;span style=&#34;color:#268bd2&#34;&gt;strike&lt;/span&gt;&amp;gt;This is a db test&amp;lt;/&lt;span style=&#34;color:#268bd2&#34;&gt;strike&lt;/span&gt;&amp;gt;.&amp;lt;/&lt;span style=&#34;color:#268bd2&#34;&gt;p&lt;/span&gt;&amp;gt;\n&lt;span style=&#34;color:#586e75&#34;&gt;&amp;lt;!--kg-card-end: markdown--&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;next-time&#34;&gt;Next Time&lt;/h3&gt;
&lt;p&gt;This part of our program is relatively easy. We don&amp;rsquo;t want the HTML though, what I&amp;rsquo;d rather do is pull the Markdown out of the &lt;code&gt;mobiledoc&lt;/code&gt; value.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;mobiledoc&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;{\&amp;#34;version\&amp;#34;:\&amp;#34;0.3.1\&amp;#34;,\&amp;#34;markups\&amp;#34;:[],\&amp;#34;atoms\&amp;#34;:[],\&amp;#34;cards\&amp;#34;:[[\&amp;#34;markdown\&amp;#34;,{\&amp;#34;cardName\&amp;#34;:\&amp;#34;card-markdown\&amp;#34;,\&amp;#34;markdown\&amp;#34;:\&amp;#34;\\n&amp;lt;strike&amp;gt;This is a db test&amp;lt;/strike&amp;gt;.\\n\&amp;#34;}]],\&amp;#34;sections\&amp;#34;:[[10,0]],\&amp;#34;ghostVersion\&amp;#34;:\&amp;#34;3.0\&amp;#34;}&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Which, as luck would have it, is just an embedded JSON object. It looks like we&amp;rsquo;ll need to do some cleaning up of the object removing escaped quotes. Once cleaned up it should look similar to&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;version&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;0.3.1&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;markups&amp;#34;&lt;/span&gt;: [],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;atoms&amp;#34;&lt;/span&gt;: [],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;cards&amp;#34;&lt;/span&gt;: [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;markdown&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;cardName&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;card-markdown&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;markdown&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;\n&amp;lt;strike&amp;gt;This is a db test&amp;lt;/strike&amp;gt;.\n&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;sections&amp;#34;&lt;/span&gt;: [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#2aa198&#34;&gt;10&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;ghostVersion&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;3.0&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I haven&amp;rsquo;t looked to closely at the database but I&amp;rsquo;m hoping when I wrote my posts in Ghost they all were in a single &lt;code&gt;card-markdown&lt;/code&gt;. Oh well, we&amp;rsquo;ll cross that bridge eventually.&lt;/p&gt;
&lt;p&gt;Until next time!&lt;/p&gt;
&lt;hr&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&#34;text-align:center&#34;&gt;Enjoy this post?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;&lt;a href=&#34;https://ko-fi.com/shindakun&#34;&gt;How about buying me a coffee?&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h3 id=&#34;code-listing&#34;&gt;Code Listing&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;package&lt;/span&gt; main
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;import&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;encoding/json&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;io&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;os&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;time&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;type&lt;/span&gt; GhostDatabase &lt;span style=&#34;color:#268bd2&#34;&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	Db []&lt;span style=&#34;color:#268bd2&#34;&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		Meta &lt;span style=&#34;color:#268bd2&#34;&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			ExportedOn &lt;span style=&#34;color:#dc322f&#34;&gt;int64&lt;/span&gt;  &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;exported_on&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			Version    &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;version&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;meta&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		Data &lt;span style=&#34;color:#268bd2&#34;&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			Posts []&lt;span style=&#34;color:#268bd2&#34;&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				ID                   &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;id&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				UUID                 &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;uuid&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Title                &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;title&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Slug                 &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;slug&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Mobiledoc            &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;mobiledoc&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				HTML                 &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;html&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				CommentID            &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;comment_id&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Plaintext            &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;plaintext&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				FeatureImage         &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;feature_image&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Featured             &lt;span style=&#34;color:#dc322f&#34;&gt;int&lt;/span&gt;         &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;featured&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Type                 &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;type&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Status               &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;status&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Locale               &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;locale&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Visibility           &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;visibility&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				EmailRecipientFilter &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;email_recipient_filter&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				AuthorID             &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;author_id&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				CreatedAt            time.Time   &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;created_at&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				UpdatedAt            time.Time   &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;updated_at&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				PublishedAt          time.Time   &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;published_at&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				CustomExcerpt        &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;custom_excerpt&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				CodeinjectionHead    &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;codeinjection_head&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				CodeinjectionFoot    &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;codeinjection_foot&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				CustomTemplate       &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;custom_template&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				CanonicalURL         &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;canonical_url&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;posts&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			PostsAuthors []&lt;span style=&#34;color:#268bd2&#34;&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				ID        &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;id&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				PostID    &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;post_id&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				AuthorID  &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;author_id&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				SortOrder &lt;span style=&#34;color:#dc322f&#34;&gt;int&lt;/span&gt;    &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;sort_order&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;posts_authors&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			PostsMeta []&lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;posts_meta&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			PostsTags []&lt;span style=&#34;color:#268bd2&#34;&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				ID        &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;id&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				PostID    &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;post_id&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				TagID     &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;tag_id&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				SortOrder &lt;span style=&#34;color:#dc322f&#34;&gt;int&lt;/span&gt;    &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;sort_order&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;posts_tags&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			Roles []&lt;span style=&#34;color:#268bd2&#34;&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				ID          &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;    &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;id&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Name        &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;    &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;name&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Description &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;    &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;description&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				CreatedAt   time.Time &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;created_at&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				UpdatedAt   time.Time &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;updated_at&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;roles&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			RolesUsers []&lt;span style=&#34;color:#268bd2&#34;&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				ID     &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;id&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				RoleID &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;role_id&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				UserID &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;user_id&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;roles_users&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			Settings []&lt;span style=&#34;color:#268bd2&#34;&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				ID        &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;id&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Group     &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;group&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Key       &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;key&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Value     &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;value&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Type      &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;type&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Flags     &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;flags&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				CreatedAt time.Time   &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;created_at&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				UpdatedAt time.Time   &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;updated_at&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;settings&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			Tags []&lt;span style=&#34;color:#268bd2&#34;&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				ID                 &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;id&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Name               &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;name&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Slug               &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;slug&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Description        &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;description&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				FeatureImage       &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;feature_image&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				ParentID           &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;parent_id&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Visibility         &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;visibility&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				OgImage            &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;og_image&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				OgTitle            &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;og_title&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				OgDescription      &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;og_description&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				TwitterImage       &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;twitter_image&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				TwitterTitle       &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;twitter_title&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				TwitterDescription &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;twitter_description&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				MetaTitle          &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;meta_title&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				MetaDescription    &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;meta_description&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				CodeinjectionHead  &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;codeinjection_head&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				CodeinjectionFoot  &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;codeinjection_foot&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				CanonicalURL       &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;canonical_url&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				AccentColor        &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;accent_color&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				CreatedAt          time.Time   &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;created_at&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				UpdatedAt          time.Time   &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;updated_at&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;tags&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			Users []&lt;span style=&#34;color:#268bd2&#34;&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				ID              &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;id&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Name            &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;name&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Slug            &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;slug&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Password        &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;password&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Email           &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;email&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				ProfileImage    &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;profile_image&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				CoverImage      &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;cover_image&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Bio             &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;bio&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Website         &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;website&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Location        &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;location&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Facebook        &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;facebook&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Twitter         &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;twitter&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Accessibility   &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;accessibility&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Status          &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;status&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Locale          &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;locale&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Visibility      &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;      &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;visibility&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				MetaTitle       &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;meta_title&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				MetaDescription &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;meta_description&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				Tour            &lt;span style=&#34;color:#268bd2&#34;&gt;interface&lt;/span&gt;{} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;tour&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				LastSeen        time.Time   &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;last_seen&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				CreatedAt       time.Time   &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;created_at&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				UpdatedAt       time.Time   &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;updated_at&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;users&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;data&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	} &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;db&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#268bd2&#34;&gt;main&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	fmt.&lt;span style=&#34;color:#268bd2&#34;&gt;Println&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;ghost2hugo&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	file, err &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; os.&lt;span style=&#34;color:#268bd2&#34;&gt;Open&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;shindakun-dot-net.ghost.2022-03-18-22-02-58.json&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; err &lt;span style=&#34;color:#719e07&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#cb4b16&#34;&gt;nil&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		fmt.&lt;span style=&#34;color:#268bd2&#34;&gt;Println&lt;/span&gt;(err)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	b, err &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; io.&lt;span style=&#34;color:#268bd2&#34;&gt;ReadAll&lt;/span&gt;(file)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; err &lt;span style=&#34;color:#719e07&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#cb4b16&#34;&gt;nil&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		fmt.&lt;span style=&#34;color:#268bd2&#34;&gt;Println&lt;/span&gt;(err)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#268bd2&#34;&gt;var&lt;/span&gt; db GhostDatabase
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	err = json.&lt;span style=&#34;color:#268bd2&#34;&gt;Unmarshal&lt;/span&gt;(b, &lt;span style=&#34;color:#719e07&#34;&gt;&amp;amp;&lt;/span&gt;db)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; err &lt;span style=&#34;color:#719e07&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#cb4b16&#34;&gt;nil&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		fmt.&lt;span style=&#34;color:#268bd2&#34;&gt;Println&lt;/span&gt;(err)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	fmt.&lt;span style=&#34;color:#268bd2&#34;&gt;Printf&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;%#v&amp;#34;&lt;/span&gt;, db.Db[&lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;].Data.Posts[&lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;].HTML)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    
    <item>
      <title>WIP Hugo Theme</title>
      <link>https://shindakun.dev/posts/wip-hugo-theme/</link>
      <pubDate>Thu, 15 Sep 2022 20:06:00 -0700</pubDate>
      
      <guid>https://shindakun.dev/posts/wip-hugo-theme/</guid>
      <description>&lt;h2 id=&#34;intro&#34;&gt;Intro&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;ve been putting in some time &lt;a href=&#34;https://indiewebify.me/&#34;&gt;&amp;ldquo;Indiewebifying&amp;rdquo;&lt;/a&gt; my Hugo theme, which started as a fork of the &lt;a href=&#34;https://themes.gohugo.io/themes/solar-theme-hugo/&#34;&gt;Solar theme&lt;/a&gt; by Bake. It&amp;rsquo;s slowly becoming more and more of my own. I&amp;rsquo;m not much of a front end developer so I&amp;rsquo;ve keep most of the basic CSS, removing only small bits and adding things where needed to fit my needs. This little post is just to remind me of what I&amp;rsquo;ve been doing, if you would like to know more just ask.&lt;/p&gt;
&lt;h3 id=&#34;an-indieweb-post&#34;&gt;An IndieWeb Post&lt;/h3&gt;
&lt;p&gt;The first portion of getting the theme updated for the IndieWeb involved adding to the HTML markup to include &lt;a href=&#34;http://microformats.org/wiki/h-entry&#34;&gt;&lt;code&gt;h-entry&lt;/code&gt;&lt;/a&gt;. This adds a nice structure to the posts that is machine readable. This is really just adding specific classes to your HTML elements. So your post template might look something like the following:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#268bd2&#34;&gt;article&lt;/span&gt; class&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;post h-entry&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &amp;lt;&lt;span style=&#34;color:#268bd2&#34;&gt;h1&lt;/span&gt; class&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;post-title p-name&amp;#34;&lt;/span&gt; itemprop&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;name headline&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;&lt;span style=&#34;color:#268bd2&#34;&gt;a&lt;/span&gt; class&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;u-url&amp;#34;&lt;/span&gt; href&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;{{ .Permalink }}&amp;#34;&lt;/span&gt;&amp;gt;{{ .Title }}&amp;lt;/&lt;span style=&#34;color:#268bd2&#34;&gt;a&lt;/span&gt;&amp;gt; {{ if .Draft
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }}(Draft){{ end }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &amp;lt;/&lt;span style=&#34;color:#268bd2&#34;&gt;h1&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  {{ if .Params.cover_image }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &amp;lt;&lt;span style=&#34;color:#268bd2&#34;&gt;div&lt;/span&gt; class&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;image&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;&lt;span style=&#34;color:#268bd2&#34;&gt;img&lt;/span&gt; src&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;{{ .Params.cover_image }}&amp;#34;&lt;/span&gt; /&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &amp;lt;/&lt;span style=&#34;color:#268bd2&#34;&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  {{ end }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &amp;lt;&lt;span style=&#34;color:#268bd2&#34;&gt;div&lt;/span&gt; class&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;post-content e-content&amp;#34;&lt;/span&gt; itemprop&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;articleBody&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {{ .Content | safeHTML }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &amp;lt;/&lt;span style=&#34;color:#268bd2&#34;&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &amp;lt;&lt;span style=&#34;color:#268bd2&#34;&gt;p&lt;/span&gt; class&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;meta&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Posted on
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;&lt;span style=&#34;color:#268bd2&#34;&gt;span&lt;/span&gt; class&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;postdate&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &amp;gt;&amp;lt;&lt;span style=&#34;color:#268bd2&#34;&gt;time&lt;/span&gt; class&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;dt-published&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &amp;gt;{{ .Site.Params.DateForm | default &amp;#34;Jan 2, 2006&amp;#34; | .Date.Format
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }}&amp;lt;/&lt;span style=&#34;color:#268bd2&#34;&gt;time&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &amp;gt;&amp;lt;/&lt;span style=&#34;color:#268bd2&#34;&gt;span&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {{ if .Params.author }} {{ with index .Site.Data.authors .Params.author }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    by
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;&lt;span style=&#34;color:#268bd2&#34;&gt;span&lt;/span&gt; class&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;p-author h-card&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &amp;gt;&amp;lt;&lt;span style=&#34;color:#268bd2&#34;&gt;a&lt;/span&gt; href&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;{{ .link }}&amp;#34;&lt;/span&gt;&amp;gt;{{ .name }}&amp;lt;/&lt;span style=&#34;color:#268bd2&#34;&gt;a&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &amp;lt;&lt;span style=&#34;color:#268bd2&#34;&gt;img&lt;/span&gt; class&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;u-photo avatar&amp;#34;&lt;/span&gt; style&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;display: none;&amp;#34;&lt;/span&gt; src&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;{{ .photo }}&amp;#34;&lt;/span&gt; /&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;/&lt;span style=&#34;color:#268bd2&#34;&gt;span&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {{ end }} {{ end }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &amp;lt;/&lt;span style=&#34;color:#268bd2&#34;&gt;p&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;/&lt;span style=&#34;color:#268bd2&#34;&gt;article&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Alright maybe it&amp;rsquo;s not adding too much to the page. If I were to add full &lt;a href=&#34;https://schema.org&#34;&gt;Schema.org&lt;/a&gt; JSON-LD as well we&amp;rsquo;d worry more about the page size.&lt;/p&gt;
&lt;h3 id=&#34;syndication&#34;&gt;Syndication&lt;/h3&gt;
&lt;p&gt;One other aspect of the IndieWeb is the idea that you are posting your content in multiple locations. This syndication is include in the post with a relatively straight forward partial.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{{ if isset $.Params &amp;#34;syndication&amp;#34; }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {{ $synLen := len $.Params.syndication }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {{ if gt $synLen 0 }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &amp;lt;&lt;span style=&#34;color:#268bd2&#34;&gt;p&lt;/span&gt;&amp;gt;Syndicated to:&amp;lt;/&lt;span style=&#34;color:#268bd2&#34;&gt;p&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &amp;lt;&lt;span style=&#34;color:#268bd2&#34;&gt;div&lt;/span&gt; class&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;syndication&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {{ range $k, $v := $.Params.syndication }}&amp;lt;&lt;span style=&#34;color:#268bd2&#34;&gt;a&lt;/span&gt; class&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;post__syn btn u-syndication syn-link&amp;#34;&lt;/span&gt; rel&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;syndication&amp;#34;&lt;/span&gt; href&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;{{ . }}&amp;#34;&lt;/span&gt;&amp;gt;{{ . }}&amp;lt;/&lt;span style=&#34;color:#268bd2&#34;&gt;a&lt;/span&gt;&amp;gt;&amp;lt;/&lt;span style=&#34;color:#268bd2&#34;&gt;br&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {{ end }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &amp;lt;/&lt;span style=&#34;color:#268bd2&#34;&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {{ end }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{{ end }}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This will loop through any syndicated links found in the posts frontmatter and write the link to the page under the current post.&lt;/p&gt;
&lt;h3 id=&#34;webmentions&#34;&gt;Webmentions&lt;/h3&gt;
&lt;p&gt;I&amp;rsquo;ve already written a bit about &lt;a href=&#34;https://shindakun.dev/posts/adding-webmentions-to-microblog/&#34;&gt;adding webmentions to sites&lt;/a&gt; and this advice works for Hugo. I didn&amp;rsquo;t happen to note who wrote the JavaScript that takes care of fetching mentions sadly. I did track down a similar script in a &lt;a href=&#34;https://gist.github.com/Nooshu/121e5bf7f3d5c6528413c57db257894f&#34;&gt;gist&lt;/a&gt; from Nooshu so maybe that&amp;rsquo;s that.&lt;/p&gt;
&lt;h3 id=&#34;post-types&#34;&gt;Post Types&lt;/h3&gt;
&lt;p&gt;One of the departures from Solar is that I&amp;rsquo;m working on having different post types, either microblog style notes or full on blog posts. I need to break out the code a little bit though as right now the code is just rendered slightly differently depending on post type. I want to take each and move them into individual partials. I&amp;rsquo;ve just updated the code to implement a proper &lt;code&gt;h-feed&lt;/code&gt;. An example of how the feed might look can be found on &lt;a href=&#34;https://monocle.p3k.io/preview?url=https%3A%2F%2Fshindakun.dev&#34;&gt;Monocle&lt;/a&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{{ define &amp;#34;main&amp;#34; }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#268bd2&#34;&gt;main&lt;/span&gt; class&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;h-feed&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  {{ range .Paginator.Pages }} {{ if eq .Type &amp;#34;posts&amp;#34; }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &amp;lt;&lt;span style=&#34;color:#268bd2&#34;&gt;article&lt;/span&gt; class&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;post h-entry&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {{ if .Params.cover_image }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;&lt;span style=&#34;color:#268bd2&#34;&gt;a&lt;/span&gt; href&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;{{ .Permalink }}&amp;#34;&lt;/span&gt;&amp;gt;&amp;lt;&lt;span style=&#34;color:#268bd2&#34;&gt;img&lt;/span&gt; src&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;{{ .Params.cover_image }}&amp;#34;&lt;/span&gt; /&amp;gt;&amp;lt;/&lt;span style=&#34;color:#268bd2&#34;&gt;a&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {{ end }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;&lt;span style=&#34;color:#268bd2&#34;&gt;h1&lt;/span&gt; class&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;p-name&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &amp;lt;&lt;span style=&#34;color:#268bd2&#34;&gt;a&lt;/span&gt; class&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;u-url&amp;#34;&lt;/span&gt; href&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;{{ .Permalink }}&amp;#34;&lt;/span&gt;&amp;gt;{{ .Title }}&amp;lt;/&lt;span style=&#34;color:#268bd2&#34;&gt;a&lt;/span&gt;&amp;gt; {{ if .Draft
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      }}(Draft){{ end }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;/&lt;span style=&#34;color:#268bd2&#34;&gt;h1&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;&lt;span style=&#34;color:#268bd2&#34;&gt;div&lt;/span&gt; class&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;post-content&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &amp;lt;&lt;span style=&#34;color:#268bd2&#34;&gt;p&lt;/span&gt; class&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;e-content&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {{ .Summary | plainify | safeHTML }} {{ if .Truncated }} … {{ end }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &amp;lt;/&lt;span style=&#34;color:#268bd2&#34;&gt;p&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;/&lt;span style=&#34;color:#268bd2&#34;&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;&lt;span style=&#34;color:#268bd2&#34;&gt;p&lt;/span&gt; class&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;meta&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      Posted on
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &amp;lt;&lt;span style=&#34;color:#268bd2&#34;&gt;span&lt;/span&gt; class&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;postdate&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &amp;gt;{{ .Site.Params.DateForm | default &amp;#34;Jan 2, 2006 &amp;#34; | .Date.Format
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }}&amp;lt;/&lt;span style=&#34;color:#268bd2&#34;&gt;span&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;/&lt;span style=&#34;color:#268bd2&#34;&gt;p&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &amp;lt;/&lt;span style=&#34;color:#268bd2&#34;&gt;article&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  {{ end }} {{ if eq .Type &amp;#34;notes&amp;#34; }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &amp;lt;&lt;span style=&#34;color:#268bd2&#34;&gt;article&lt;/span&gt; class&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;note h-entry&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {{ if .Params.cover_image }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;&lt;span style=&#34;color:#268bd2&#34;&gt;a&lt;/span&gt; href&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;{{ .Permalink }}&amp;#34;&lt;/span&gt;&amp;gt;&amp;lt;&lt;span style=&#34;color:#268bd2&#34;&gt;img&lt;/span&gt; src&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;{{ .Params.cover_image }}&amp;#34;&lt;/span&gt; /&amp;gt;&amp;lt;/&lt;span style=&#34;color:#268bd2&#34;&gt;a&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {{ end }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;&lt;span style=&#34;color:#268bd2&#34;&gt;div&lt;/span&gt; class&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;note-content&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &amp;lt;&lt;span style=&#34;color:#268bd2&#34;&gt;p&lt;/span&gt; class&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;p-content&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {{ .Summary | plainify | safeHTML }} {{ if .Truncated }} … {{ end }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &amp;lt;/&lt;span style=&#34;color:#268bd2&#34;&gt;p&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;/&lt;span style=&#34;color:#268bd2&#34;&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;&lt;span style=&#34;color:#268bd2&#34;&gt;p&lt;/span&gt; class&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;meta&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      Posted on
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &amp;lt;&lt;span style=&#34;color:#268bd2&#34;&gt;a&lt;/span&gt; href&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;{{ .Permalink }}&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &amp;gt;&amp;lt;&lt;span style=&#34;color:#268bd2&#34;&gt;span&lt;/span&gt; class&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;postdate dt-published&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &amp;gt;{{ .Site.Params.DateForm | default &amp;#34;Jan 2, 2006 &amp;#34; | .Date.Format
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          }}&amp;lt;/&lt;span style=&#34;color:#268bd2&#34;&gt;span&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &amp;gt;&amp;lt;/&lt;span style=&#34;color:#268bd2&#34;&gt;a&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;/&lt;span style=&#34;color:#268bd2&#34;&gt;p&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &amp;lt;/&lt;span style=&#34;color:#268bd2&#34;&gt;article&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  {{ end }} {{ end }} {{ partial &amp;#34;pagination.html&amp;#34; . }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;/&lt;span style=&#34;color:#268bd2&#34;&gt;main&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{{ end }}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Meanwhile, the core &lt;code&gt;single.html&lt;/code&gt; partial is currently used for both post types, I will want to change that too so I can style the posts slightly differently.&lt;/p&gt;
&lt;h3 id=&#34;css&#34;&gt;CSS&lt;/h3&gt;
&lt;p&gt;As I mentioned I have been staying away from the CSS with the exception of removing styling and setting some defaults that fit what I&amp;rsquo;d like more. I need to go through the SCSS and make sure that each of the class names follow a similar pattern as I&amp;rsquo;ve borrowed some CSS from various sources with wildly different name styles. For instance I have &lt;code&gt;post-content&lt;/code&gt; and &lt;code&gt;post__tags&lt;/code&gt;. I&amp;rsquo;ll probably stick with kebab-case.&lt;/p&gt;
&lt;h3 id=&#34;the-future&#34;&gt;The Future&lt;/h3&gt;
&lt;p&gt;I have a bunch more work to do on the theme to tidy it up then I might release it publicly. I suppose the world could use another IndieWeb compatible theme.&lt;/p&gt;
&lt;hr&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&#34;text-align:center&#34;&gt;Enjoy this post?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;&lt;a href=&#34;https://ko-fi.com/shindakun&#34;&gt;How about buying me a coffee?&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
</description>
    </item>
    
    <item>
      <title>Adding gcc to git bash</title>
      <link>https://shindakun.dev/posts/adding-gcc-to-git-bash/</link>
      <pubDate>Sat, 03 Sep 2022 12:43:41 -0700</pubDate>
      
      <guid>https://shindakun.dev/posts/adding-gcc-to-git-bash/</guid>
      <description>&lt;p&gt;So today I was working on my &amp;ldquo;main&amp;rdquo; computer which didn&amp;rsquo;t have much set up on it. Basically only &lt;a href=&#34;https://git-scm.com/downloads&#34;&gt;git bash&lt;/a&gt;. Problem is I wanted to work on my Hugo site and theme.&lt;/p&gt;
&lt;p&gt;To do that I needed to install the version of Hugo with extended support for SCSS. This requires &lt;code&gt;gcc&lt;/code&gt;. The quickest solution I found was to just install &lt;a href=&#34;https://www.msys2.org/&#34;&gt;&lt;code&gt;msys2&lt;/code&gt;&lt;/a&gt;. Once installed and added to the path it was just a matter of changing to the Hugo directory and running &lt;code&gt;go install --tags extended&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ &lt;span style=&#34;color:#b58900&#34;&gt;cd&lt;/span&gt; /d/Code/hugo/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ go install --tags extended
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ hugo version
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;hugo v0.103.0-DEV-06c3ac67411e2faaf1545427d4df4e326fffd3c0+extended windows/amd64 &lt;span style=&#34;color:#268bd2&#34;&gt;BuildDate&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;2022-09-03T09:38:03Z
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&#34;text-align:center&#34;&gt;Enjoy this post?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;&lt;a href=&#34;https://ko-fi.com/shindakun&#34;&gt;How about buying me a coffee?&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;</description>
    </item>
    
    <item>
      <title>Getting Reacquainted With Hugo</title>
      <link>https://shindakun.dev/posts/getting-reacquainted-with-hugo/</link>
      <pubDate>Mon, 23 May 2022 18:55:20 -0700</pubDate>
      
      <guid>https://shindakun.dev/posts/getting-reacquainted-with-hugo/</guid>
      <description>&lt;h2 id=&#34;testing-testing-testing&#34;&gt;Testing testing testing&lt;/h2&gt;
&lt;p&gt;It&amp;rsquo;s been a bit since I&amp;rsquo;ve looked at my Hugo blog here on &lt;a href=&#34;https://shindakun.dev&#34;&gt;shindakun.dev&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;hugo&#34;&gt;Hugo&lt;/h2&gt;
&lt;p&gt;First things first, I need to get all my repositories in line. When I originally set everything up I had it separated in a couple different repos. The main repo held everything needed to build the base Hugo. I had two submodules for the themes that power the site. Finally, I had a repo just for blog posts. Why I didn&amp;rsquo;t include the blog posts repo as a submodule originally is lost to time though. We&amp;rsquo;re going to add them in as a submodule much like our themes.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git submodule add https://github.com/shindakun/posts
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now we can just run&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git clone --recursive  https://github.com/shindakun/shindakun.dev.git
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And we&amp;rsquo;ll get the entire site. Since the site running behind Nginx we can then just build it and server from the &lt;code&gt;public&lt;/code&gt; directory.&lt;/p&gt;
&lt;h2 id=&#34;nginx&#34;&gt;Nginx&lt;/h2&gt;
&lt;p&gt;The currently deployed version of the site is just a copy of the &lt;code&gt;public&lt;/code&gt; directory and the configuration looks like&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;server {
    server_name shindakun.dev;
    root /var/www/shindakun.dev;
    index index.html;

    location / {
        try_files $uri $uri/ =404;
    }

    listen [::]:443 http2 ssl; # managed by Certbot
    listen 443 ssl http2; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/shindakun.dev/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/shindakun.dev/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}

server {
    if ($host = shindakun.dev) {
        return 301 https://$host$request_uri;
    } # managed by Certbot

    listen 80;
    listen [::]:80;

    server_name shindakun.dev;
    return 404; # managed by Certbot
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;We&amp;rsquo;ll update &lt;code&gt;root /var/www/shindakun.dev;&lt;/code&gt; to be &lt;code&gt;root /var/www/shindakun.dev/public;&lt;/code&gt; once everything is sorted on the server itself.&lt;/p&gt;
&lt;h2 id=&#34;but-why&#34;&gt;But why?&lt;/h2&gt;
&lt;p&gt;Why do any of this? Well, keeping a blog is something I&amp;rsquo;ve always enjoyed - though sometimes I&amp;rsquo;m not very good at it. Mostly because I link to tinker. While I don&amp;rsquo;t fully run my server I manage most aspects of the Digital Ocean droplet I use. I used to use Ghost, but it has slowly gotten to the state where I could only run a single blog on a droplet. Whereas if I use Hugo I can run countless websites with nothing but Nginx.&lt;/p&gt;
&lt;hr&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&#34;text-align:center&#34;&gt;Enjoy this post?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;&lt;a href=&#34;https://ko-fi.com/shindakun&#34;&gt;How about buying me a coffee?&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
</description>
    </item>
    
    <item>
      <title>Polywork Poster in Go</title>
      <link>https://shindakun.dev/posts/polywork-poster/</link>
      <pubDate>Sun, 09 May 2021 17:54:00 -0700</pubDate>
      
      <guid>https://shindakun.dev/posts/polywork-poster/</guid>
      <description>&lt;h2 id=&#34;intro&#34;&gt;Intro&lt;/h2&gt;
&lt;p&gt;A couple of days ago I finally got access to Polywork. Which, for those who don&amp;rsquo;t know, is like a new-aged Linkedin. It allows you to create a timeline of your work and accomplishments. The idea is that people will be able to contact you through the site to offer you work or opportunities.Take a look at &lt;a href=&#34;https://meta.shindakun.dev/&#34;&gt;meta.shindakun.dev&lt;/a&gt; for a simple example timeline.&lt;/p&gt;
&lt;p&gt;One of the things that struck me was that there is no public API at the moment. Which bummed me out as I didn&amp;rsquo;t want to start entering blog posts by hand. So, I decided to poke around a bit and see what the flow is for creating a new post. With the objected being crafting some Go code to create posts.&lt;/p&gt;
&lt;p&gt;This would dovetail nicely into our &lt;a href=&#34;https://shindakun.dev/golang-data-connector-part-1/&#34;&gt;data connector series&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;getting-started&#34;&gt;Getting Started&lt;/h3&gt;
&lt;p&gt;First, we need to look to see how the site lets us put up a new post. This can be done via the network tab in Chromes Dev Tools.&lt;/p&gt;
&lt;p&gt;![[newpost.gif]]&lt;/p&gt;
&lt;p&gt;We can see that clicking on the &amp;ldquo;Post&amp;rdquo; button brings up a form that we can use to enter our details. Looking at the details of the &lt;code&gt;edit&lt;/code&gt; network call shows the entire &lt;a href=&#34;https://turbo.hotwire.dev/handbook/frames&#34;&gt;Turbo Frame&lt;/a&gt; that makes up. &lt;code&gt;new&lt;/code&gt; in this case seems to just redirect to &lt;code&gt;edit&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;![[Pasted image 20210509185610.png]]&lt;/p&gt;
&lt;p&gt;Perfect! This will allow us to grab the details we need from the form. We need both the update ID and the authenticity token. Though at present it seems the authenticity token isn&amp;rsquo;t actually required when posting a new update. 🤷‍♂️  I won&amp;rsquo;t show the complete posting flow via the website since it includes cookies but you get the idea.&lt;/p&gt;
&lt;p&gt;![[Pasted image 20210509185946.png]]&lt;/p&gt;
&lt;h3 id=&#34;our-plan&#34;&gt;Our Plan&lt;/h3&gt;
&lt;p&gt;So here is what we are going to do:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;make a request to &lt;code&gt;https://www.polywork.com/shindakun/highlights/new/&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;extract the update ID and authenticity token&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;create a &lt;code&gt;multipart&lt;/code&gt; form with information we want to post&lt;/li&gt;
&lt;li&gt;&lt;code&gt;POST&lt;/code&gt; to &lt;code&gt;https://www.polywork.com/shindakun/highlights/{{update_id}}&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&#34;text-align:center&#34;&gt;Enjoy this post?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;&lt;a href=&#34;https://ko-fi.com/shindakun&#34;&gt;How about buying me a coffee?&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h3 id=&#34;getting-polywork-to-go&#34;&gt;Getting Polywork to Go&lt;/h3&gt;
&lt;p&gt;As always you can find the full code listing at the bottom of this post. Also, this code is pretty sloppy and a bit brittle since it is just a proof of concept.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;package&lt;/span&gt; main
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;import&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;bytes&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;io&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;log&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;mime/multipart&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;net/http&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;regexp&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;strings&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;github.com/andybalholm/cascadia&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;golang.org/x/net/html&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;const&lt;/span&gt; cookie = &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;_polywork_session=...snip...&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;const&lt;/span&gt; username = &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;shindakun&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We start up by setting our cookie value. This is necessary to be able to &lt;code&gt;POST&lt;/code&gt; to the website. I simply grabbed this value from the network tab in Chrome. We could start with a &amp;ldquo;magic&amp;rdquo; link login but this seemed easier. We&amp;rsquo;ll also set our username.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#268bd2&#34;&gt;main&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	req, err &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; http.&lt;span style=&#34;color:#268bd2&#34;&gt;NewRequest&lt;/span&gt;(http.MethodGet, &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;https://www.polywork.com/&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;username&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;/highlights/new/&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#cb4b16&#34;&gt;nil&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	req.Header.&lt;span style=&#34;color:#268bd2&#34;&gt;Add&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;Cookie&amp;#34;&lt;/span&gt;, cookie)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	req.Header.&lt;span style=&#34;color:#268bd2&#34;&gt;Add&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;Turbo-Frame&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;navbar-post-highlight&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; err &lt;span style=&#34;color:#719e07&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#cb4b16&#34;&gt;nil&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		log.&lt;span style=&#34;color:#268bd2&#34;&gt;Fatal&lt;/span&gt;(err)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	res, err &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; http.DefaultClient.&lt;span style=&#34;color:#268bd2&#34;&gt;Do&lt;/span&gt;(req)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; err &lt;span style=&#34;color:#719e07&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#cb4b16&#34;&gt;nil&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		log.&lt;span style=&#34;color:#268bd2&#34;&gt;Fatal&lt;/span&gt;(err)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#719e07&#34;&gt;defer&lt;/span&gt; res.Body.&lt;span style=&#34;color:#268bd2&#34;&gt;Close&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If you&amp;rsquo;ve worked with Go before this probably looks very familiar. What we are doing is using &lt;code&gt;http.NewRequest&lt;/code&gt; to request to &lt;code&gt;/{{username}}/highlights/new&lt;/code&gt;. Note how we are setting the cookie directly in the header and setting a header for the &lt;code&gt;Turbo-Frame&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Calling &lt;code&gt;http.DefaultClient.Do(req)&lt;/code&gt; makes the request to the remote server and if successful will return that data in &lt;code&gt;res&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	doc, err &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; html.&lt;span style=&#34;color:#268bd2&#34;&gt;Parse&lt;/span&gt;(res.Body)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; err &lt;span style=&#34;color:#719e07&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#cb4b16&#34;&gt;nil&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		log.&lt;span style=&#34;color:#268bd2&#34;&gt;Fatal&lt;/span&gt;(err)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#586e75&#34;&gt;// inputs := cascadia.MustCompile(&amp;#34;input&amp;#34;).MatchAll(doc)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	buttons &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; cascadia.&lt;span style=&#34;color:#268bd2&#34;&gt;MustCompile&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;button&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#268bd2&#34;&gt;MatchAll&lt;/span&gt;(doc)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	re &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; regexp.&lt;span style=&#34;color:#268bd2&#34;&gt;MustCompile&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;`\/shindakun\/highlights\/(.*)\/save_draft`&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	r &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; re.&lt;span style=&#34;color:#268bd2&#34;&gt;FindStringSubmatch&lt;/span&gt;(buttons[&lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;].Attr[&lt;span style=&#34;color:#2aa198&#34;&gt;5&lt;/span&gt;].Val)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Here we&amp;rsquo;re going to get a bit tricky. The first thing we want to do is use the parse our incoming form as HTML. This then allows us to use the  &lt;a href=&#34;https://github.com/andybalholm/cascadia&#34;&gt;&lt;code&gt;cascadia&lt;/code&gt; library&lt;/a&gt; and CSS selectors to grab all the buttons. We don&amp;rsquo;t really need all of them but for this first version what the heck.&lt;/p&gt;
&lt;p&gt;Using the regular expression &lt;code&gt;\/shindakun\/highlights\/(.*)\/save_draft&lt;/code&gt; we extract the ID for the post we are working with.&lt;/p&gt;
&lt;p&gt;This is the main section of the code that is very brittle since I&amp;rsquo;m not doing anything to validate we are looking at the right button key and instead just hard coding the values that I saw during testing.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#586e75&#34;&gt;// _method: patch
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;&lt;/span&gt;	&lt;span style=&#34;color:#586e75&#34;&gt;// authenticity_token: ...snip...
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;&lt;/span&gt;	&lt;span style=&#34;color:#586e75&#34;&gt;// draft_highlight[end_date]: 01-01-2021
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;&lt;/span&gt;	&lt;span style=&#34;color:#586e75&#34;&gt;// draft_highlight[content]: &amp;lt;div&amp;gt;Testing&amp;lt;/div&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;&lt;/span&gt;	&lt;span style=&#34;color:#586e75&#34;&gt;// draft_highlight[activity_ids][]: 76199
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;&lt;/span&gt;	&lt;span style=&#34;color:#586e75&#34;&gt;// commit: Post
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;During testing, I made a copy of the form data &lt;code&gt;POST&lt;/code&gt;ed from Chrome for reference. We&amp;rsquo;ll use this as our base form data. As you&amp;rsquo;ll see below not every field is required. I think I can leave out the &lt;code&gt;_method&lt;/code&gt; field but have not tried as of yet. I mentioned before but you should also note that I&amp;rsquo;m not using the &lt;code&gt;authenticity_token&lt;/code&gt; token as it seems it is not required.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	body &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;&amp;amp;&lt;/span&gt;bytes.Buffer{}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	writer &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; multipart.&lt;span style=&#34;color:#268bd2&#34;&gt;NewWriter&lt;/span&gt;(body)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	fw, _ &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; writer.&lt;span style=&#34;color:#268bd2&#34;&gt;CreateFormField&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;_method&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	_, err = io.&lt;span style=&#34;color:#268bd2&#34;&gt;Copy&lt;/span&gt;(fw, strings.&lt;span style=&#34;color:#268bd2&#34;&gt;NewReader&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;patch&amp;#34;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; err &lt;span style=&#34;color:#719e07&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#cb4b16&#34;&gt;nil&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		log.&lt;span style=&#34;color:#268bd2&#34;&gt;Fatal&lt;/span&gt;(err)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#586e75&#34;&gt;// fw, _ = writer.CreateFormField(&amp;#34;authenticity_token&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;&lt;/span&gt;	&lt;span style=&#34;color:#586e75&#34;&gt;// _, err = io.Copy(fw, strings.NewReader(inputs[1].Attr[2].Val))
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;&lt;/span&gt;	&lt;span style=&#34;color:#586e75&#34;&gt;// if err != nil {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;&lt;/span&gt;	&lt;span style=&#34;color:#586e75&#34;&gt;// 	log.Fatal(err)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;&lt;/span&gt;	&lt;span style=&#34;color:#586e75&#34;&gt;// }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;&lt;/span&gt;	
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	fw, _ = writer.&lt;span style=&#34;color:#268bd2&#34;&gt;CreateFormField&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;draft_highlight[content]&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	_, err = io.&lt;span style=&#34;color:#268bd2&#34;&gt;Copy&lt;/span&gt;(fw, strings.&lt;span style=&#34;color:#268bd2&#34;&gt;NewReader&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;&amp;lt;div&amp;gt;Posting via Golang&amp;lt;/div&amp;gt; :) &amp;lt;a href=\&amp;#34;https://shindakun.dev\&amp;#34;&amp;gt;shindakun&amp;lt;/a&amp;gt;&amp;#34;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; err &lt;span style=&#34;color:#719e07&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#cb4b16&#34;&gt;nil&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		log.&lt;span style=&#34;color:#268bd2&#34;&gt;Fatal&lt;/span&gt;(err)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	fw, _ = writer.&lt;span style=&#34;color:#268bd2&#34;&gt;CreateFormField&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;commit&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	_, err = io.&lt;span style=&#34;color:#268bd2&#34;&gt;Copy&lt;/span&gt;(fw, strings.&lt;span style=&#34;color:#268bd2&#34;&gt;NewReader&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;Post&amp;#34;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; err &lt;span style=&#34;color:#719e07&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#cb4b16&#34;&gt;nil&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		log.&lt;span style=&#34;color:#268bd2&#34;&gt;Fatal&lt;/span&gt;(err)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	writer.&lt;span style=&#34;color:#268bd2&#34;&gt;Close&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;It&amp;rsquo;s a bit awkward to create a form in Go but hey, it works. We make a form field with &lt;code&gt;writer.CreateFormField&lt;/code&gt; and then &lt;code&gt;io.Copy&lt;/code&gt; our data into that field. Right now our payload is hardcoded. We could easily adapt my data connector post to automatically add my Ghost blog posts to Polywork.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	post, err &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; http.&lt;span style=&#34;color:#268bd2&#34;&gt;NewRequest&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;https://www.polywork.com/shindakun/highlights/&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;r[&lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;], bytes.&lt;span style=&#34;color:#268bd2&#34;&gt;NewReader&lt;/span&gt;(body.&lt;span style=&#34;color:#268bd2&#34;&gt;Bytes&lt;/span&gt;()))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; err &lt;span style=&#34;color:#719e07&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#cb4b16&#34;&gt;nil&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		log.&lt;span style=&#34;color:#268bd2&#34;&gt;Fatal&lt;/span&gt;(err)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	post.Header.&lt;span style=&#34;color:#268bd2&#34;&gt;Set&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;Content-Type&amp;#34;&lt;/span&gt;, writer.&lt;span style=&#34;color:#268bd2&#34;&gt;FormDataContentType&lt;/span&gt;())
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	post.Header.&lt;span style=&#34;color:#268bd2&#34;&gt;Add&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;Cookie&amp;#34;&lt;/span&gt;, cookie)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	rsp, _ &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; http.DefaultClient.&lt;span style=&#34;color:#268bd2&#34;&gt;Do&lt;/span&gt;(post)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; rsp.StatusCode &lt;span style=&#34;color:#719e07&#34;&gt;!=&lt;/span&gt; http.StatusOK {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		log.&lt;span style=&#34;color:#268bd2&#34;&gt;Printf&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;Request failed with response code: %d&amp;#34;&lt;/span&gt;, rsp.StatusCode)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And now we do the actual form submit. And that&amp;rsquo;s all there is too it.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;Screen%20Shot%202021-05-11%20at%2010.10.21%20AM.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;whats-next&#34;&gt;What&amp;rsquo;s Next?&lt;/h3&gt;
&lt;p&gt;Next, I think I am going to adapt this code to use with the &lt;a href=&#34;https://shindakun.dev/golang-data-connector-part-1/&#34;&gt;data connector we are working on&lt;/a&gt;. I&amp;rsquo;ll probably try to make it pretty generic so I can use it as its own module.&lt;/p&gt;
&lt;h3 id=&#34;code-listing&#34;&gt;Code Listing&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;package&lt;/span&gt; main
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;import&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;bytes&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;io&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;log&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;mime/multipart&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;net/http&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;regexp&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;strings&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;github.com/andybalholm/cascadia&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;golang.org/x/net/html&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;const&lt;/span&gt; cookie = &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;_polywork_session=...snip...&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;const&lt;/span&gt; username = &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;shindakun&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#268bd2&#34;&gt;main&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	req, err &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; http.&lt;span style=&#34;color:#268bd2&#34;&gt;NewRequest&lt;/span&gt;(http.MethodGet, &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;https://www.polywork.com/&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;username&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;/highlights/new/&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#cb4b16&#34;&gt;nil&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	req.Header.&lt;span style=&#34;color:#268bd2&#34;&gt;Add&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;Cookie&amp;#34;&lt;/span&gt;, cookie)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	req.Header.&lt;span style=&#34;color:#268bd2&#34;&gt;Add&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;Turbo-Frame&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;navbar-post-highlight&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; err &lt;span style=&#34;color:#719e07&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#cb4b16&#34;&gt;nil&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		log.&lt;span style=&#34;color:#268bd2&#34;&gt;Fatal&lt;/span&gt;(err)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	res, err &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; http.DefaultClient.&lt;span style=&#34;color:#268bd2&#34;&gt;Do&lt;/span&gt;(req)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; err &lt;span style=&#34;color:#719e07&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#cb4b16&#34;&gt;nil&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		log.&lt;span style=&#34;color:#268bd2&#34;&gt;Fatal&lt;/span&gt;(err)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#719e07&#34;&gt;defer&lt;/span&gt; res.Body.&lt;span style=&#34;color:#268bd2&#34;&gt;Close&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	doc, err &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; html.&lt;span style=&#34;color:#268bd2&#34;&gt;Parse&lt;/span&gt;(res.Body)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; err &lt;span style=&#34;color:#719e07&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#cb4b16&#34;&gt;nil&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		log.&lt;span style=&#34;color:#268bd2&#34;&gt;Fatal&lt;/span&gt;(err)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#586e75&#34;&gt;// inputs := cascadia.MustCompile(&amp;#34;input&amp;#34;).MatchAll(doc)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	buttons &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; cascadia.&lt;span style=&#34;color:#268bd2&#34;&gt;MustCompile&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;button&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#268bd2&#34;&gt;MatchAll&lt;/span&gt;(doc)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	re &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; regexp.&lt;span style=&#34;color:#268bd2&#34;&gt;MustCompile&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;`\/shindakun\/highlights\/(.*)\/save_draft`&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	r &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; re.&lt;span style=&#34;color:#268bd2&#34;&gt;FindStringSubmatch&lt;/span&gt;(buttons[&lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;].Attr[&lt;span style=&#34;color:#2aa198&#34;&gt;5&lt;/span&gt;].Val)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#586e75&#34;&gt;// _method: patch
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;&lt;/span&gt;	&lt;span style=&#34;color:#586e75&#34;&gt;// authenticity_token: ...snip...
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;&lt;/span&gt;	&lt;span style=&#34;color:#586e75&#34;&gt;// draft_highlight[end_date]: 01-01-2021
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;&lt;/span&gt;	&lt;span style=&#34;color:#586e75&#34;&gt;// draft_highlight[content]: &amp;lt;div&amp;gt;Testing&amp;lt;/div&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;&lt;/span&gt;	&lt;span style=&#34;color:#586e75&#34;&gt;// draft_highlight[activity_ids][]: 76199
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;&lt;/span&gt;	&lt;span style=&#34;color:#586e75&#34;&gt;// commit: Post
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	body &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;&amp;amp;&lt;/span&gt;bytes.Buffer{}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	writer &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; multipart.&lt;span style=&#34;color:#268bd2&#34;&gt;NewWriter&lt;/span&gt;(body)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	fw, _ &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; writer.&lt;span style=&#34;color:#268bd2&#34;&gt;CreateFormField&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;_method&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	_, err = io.&lt;span style=&#34;color:#268bd2&#34;&gt;Copy&lt;/span&gt;(fw, strings.&lt;span style=&#34;color:#268bd2&#34;&gt;NewReader&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;patch&amp;#34;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; err &lt;span style=&#34;color:#719e07&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#cb4b16&#34;&gt;nil&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		log.&lt;span style=&#34;color:#268bd2&#34;&gt;Fatal&lt;/span&gt;(err)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#586e75&#34;&gt;// fw, _ = writer.CreateFormField(&amp;#34;authenticity_token&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;&lt;/span&gt;	&lt;span style=&#34;color:#586e75&#34;&gt;// _, err = io.Copy(fw, strings.NewReader(inputs[1].Attr[2].Val))
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;&lt;/span&gt;	&lt;span style=&#34;color:#586e75&#34;&gt;// if err != nil {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;&lt;/span&gt;	&lt;span style=&#34;color:#586e75&#34;&gt;// 	log.Fatal(err)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;&lt;/span&gt;	&lt;span style=&#34;color:#586e75&#34;&gt;// }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;&lt;/span&gt;	fw, _ = writer.&lt;span style=&#34;color:#268bd2&#34;&gt;CreateFormField&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;draft_highlight[content]&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	_, err = io.&lt;span style=&#34;color:#268bd2&#34;&gt;Copy&lt;/span&gt;(fw, strings.&lt;span style=&#34;color:#268bd2&#34;&gt;NewReader&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;&amp;lt;div&amp;gt;Posting via Golang&amp;lt;/div&amp;gt; :) &amp;lt;a href=\&amp;#34;https://shindakun.dev\&amp;#34;&amp;gt;shindakun&amp;lt;/a&amp;gt;&amp;#34;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; err &lt;span style=&#34;color:#719e07&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#cb4b16&#34;&gt;nil&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		log.&lt;span style=&#34;color:#268bd2&#34;&gt;Fatal&lt;/span&gt;(err)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	fw, _ = writer.&lt;span style=&#34;color:#268bd2&#34;&gt;CreateFormField&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;commit&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	_, err = io.&lt;span style=&#34;color:#268bd2&#34;&gt;Copy&lt;/span&gt;(fw, strings.&lt;span style=&#34;color:#268bd2&#34;&gt;NewReader&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;Post&amp;#34;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; err &lt;span style=&#34;color:#719e07&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#cb4b16&#34;&gt;nil&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		log.&lt;span style=&#34;color:#268bd2&#34;&gt;Fatal&lt;/span&gt;(err)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	writer.&lt;span style=&#34;color:#268bd2&#34;&gt;Close&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	post, err &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; http.&lt;span style=&#34;color:#268bd2&#34;&gt;NewRequest&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;https://www.polywork.com/shindakun/highlights/&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;r[&lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;], bytes.&lt;span style=&#34;color:#268bd2&#34;&gt;NewReader&lt;/span&gt;(body.&lt;span style=&#34;color:#268bd2&#34;&gt;Bytes&lt;/span&gt;()))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; err &lt;span style=&#34;color:#719e07&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#cb4b16&#34;&gt;nil&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		log.&lt;span style=&#34;color:#268bd2&#34;&gt;Fatal&lt;/span&gt;(err)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	post.Header.&lt;span style=&#34;color:#268bd2&#34;&gt;Set&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;Content-Type&amp;#34;&lt;/span&gt;, writer.&lt;span style=&#34;color:#268bd2&#34;&gt;FormDataContentType&lt;/span&gt;())
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	post.Header.&lt;span style=&#34;color:#268bd2&#34;&gt;Add&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;Cookie&amp;#34;&lt;/span&gt;, cookie)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	rsp, _ &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; http.DefaultClient.&lt;span style=&#34;color:#268bd2&#34;&gt;Do&lt;/span&gt;(post)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; rsp.StatusCode &lt;span style=&#34;color:#719e07&#34;&gt;!=&lt;/span&gt; http.StatusOK {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		log.&lt;span style=&#34;color:#268bd2&#34;&gt;Printf&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;Request failed with response code: %d&amp;#34;&lt;/span&gt;, rsp.StatusCode)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    
    <item>
      <title>2020 Roguelikedev Tutorial Week 2</title>
      <link>https://shindakun.dev/posts/2020-roguelikedev-tutorial-week-2/</link>
      <pubDate>Mon, 29 Jun 2020 22:40:26 -0700</pubDate>
      
      <guid>https://shindakun.dev/posts/2020-roguelikedev-tutorial-week-2/</guid>
      <description>&lt;h1 id=&#34;roguelikedev-does-the-complete-roguelike-tutorial&#34;&gt;RoguelikeDev Does The Complete Roguelike Tutorial&lt;/h1&gt;
&lt;h2 id=&#34;week-2---june-23rd---29th-2020&#34;&gt;Week 2 - June 23rd - 29th 2020&lt;/h2&gt;
&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;
&lt;p&gt;That&amp;rsquo;s right - we are continuing our work on the Roguelike Tutorial! This week we&amp;rsquo;ll try to get through parts 2 and 3 (and almost make it). I did have one small update after the last post that I briefly mentioned on Twitter so, I figured I should mention it here.&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;And with that out of the way, let&amp;rsquo;s continue on!&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;part-2---the-generic-entity-the-render-functions-and-the-map&#34;&gt;Part 2 - The Generic Entity, the Render Functions, and the Map&lt;/h2&gt;
&lt;p&gt;Part 2 is jammed packed! I&amp;rsquo;m not going to strictly follow everything but for the most part will keep the basic structure the same.&lt;/p&gt;
&lt;h3 id=&#34;the-generic-entity&#34;&gt;The Generic Entity&lt;/h3&gt;
&lt;p&gt;I&amp;rsquo;ve decided to go with a &amp;ldquo;constructor&amp;rdquo; function that will return a new &amp;ldquo;entity&amp;rdquo; table. Note that I&amp;rsquo;m calling it &lt;code&gt;obj&lt;/code&gt; in the code but it&amp;rsquo;s just a table of key/value pairs. Maybe &lt;code&gt;ent&lt;/code&gt; is a better as a name. 🤔&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-lua&#34; data-lang=&#34;lua&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#268bd2&#34;&gt;new_entity&lt;/span&gt;(typ, name, sp, x, y, spd)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#268bd2&#34;&gt;local&lt;/span&gt; obj &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    typ&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;typ,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    name&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;name,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    sp&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;sp,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    x&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;x,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    y&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;y,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    spd&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;spd,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    move&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;function&lt;/span&gt;(self, dx, dy)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      self.x &lt;span style=&#34;color:#719e07&#34;&gt;+=&lt;/span&gt; dx
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      self.y &lt;span style=&#34;color:#719e07&#34;&gt;+=&lt;/span&gt; dy
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#268bd2&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    attack&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;function&lt;/span&gt;(self, tx, ty)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#586e75&#34;&gt;--&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#268bd2&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#268bd2&#34;&gt;return&lt;/span&gt; obj
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Let&amp;rsquo;s take a closer look at the basic setup. I expect this to grow over time as I add things like damage. We may be limited on what we can squeeze in though.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-lua&#34; data-lang=&#34;lua&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#268bd2&#34;&gt;local&lt;/span&gt; obj &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    typ &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; typ,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    name &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; name,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    sp &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; sp,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    x &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; x,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    y &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; y,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    spd &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; spd,
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;typ&lt;/code&gt; is the &amp;ldquo;type&amp;rdquo; of entity. Right now I only am planing on two entity types, &amp;ldquo;pc&amp;rdquo; (player character) and &amp;ldquo;monst&amp;rdquo; (monster). This could be extended to include things like &amp;ldquo;npc&amp;rdquo;, &amp;ldquo;pet&amp;rdquo;, &amp;ldquo;animal&amp;rdquo; - maybe&lt;/li&gt;
&lt;li&gt;&lt;code&gt;name&lt;/code&gt; the entities &amp;ldquo;name&amp;rdquo;, it may be possible to name your player character. For monsters it would typically say what kind of monster, for instance &lt;code&gt;ant&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sp&lt;/code&gt; holds the number of the sprite on the sprite sheet that should be used for this particular entity&lt;/li&gt;
&lt;li&gt;&lt;code&gt;x&lt;/code&gt;, &lt;code&gt;y&lt;/code&gt; the current coordinates of the entity&lt;/li&gt;
&lt;li&gt;&lt;code&gt;spd&lt;/code&gt; how fast (far) the entity can move in one turn&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-lua&#34; data-lang=&#34;lua&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    move &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#268bd2&#34;&gt;function&lt;/span&gt;(self, dx, dy)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      self.x &lt;span style=&#34;color:#719e07&#34;&gt;+=&lt;/span&gt; dx
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      self.y &lt;span style=&#34;color:#719e07&#34;&gt;+=&lt;/span&gt; dy
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#268bd2&#34;&gt;end&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    attack &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#268bd2&#34;&gt;function&lt;/span&gt;(self, tx, ty)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#586e75&#34;&gt;--&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#268bd2&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The generic entity will have some standard methods which may or may not call out to other functions within the cart. I&amp;rsquo;m not sure exactly what methods they will end up with, maybe just a few basics.&lt;/p&gt;
&lt;p&gt;As a quick and dirty example, this would allow us to do something like the following.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-lua&#34; data-lang=&#34;lua&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  ents&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    new_entity(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;monst&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;ant&amp;#34;&lt;/span&gt;, ant, xpos&lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;16&lt;/span&gt;, ypos&lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;16&lt;/span&gt;, &lt;span style=&#34;color:#2aa198&#34;&gt;8&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    new_entity(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;monst&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;ant&amp;#34;&lt;/span&gt;, ant, xpos&lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;32&lt;/span&gt;, ypos&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;16&lt;/span&gt;, &lt;span style=&#34;color:#2aa198&#34;&gt;8&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now we have two &amp;ldquo;ants&amp;rdquo; which we can then access using &lt;code&gt;all()&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-lua&#34; data-lang=&#34;lua&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#268bd2&#34;&gt;for&lt;/span&gt; e &lt;span style=&#34;color:#268bd2&#34;&gt;in&lt;/span&gt; all(ents) &lt;span style=&#34;color:#268bd2&#34;&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    spr(e.sp, e.x, e.y)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#268bd2&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now, we have two &lt;code&gt;a&lt;/code&gt; ant&amp;rsquo;s on the screen. This will probably evolve over the weeks but that should be good to get started. That brings us to the next step of Part 2.&lt;/p&gt;
&lt;h3 id=&#34;the-render-functions&#34;&gt;The Render Functions&lt;/h3&gt;
&lt;p&gt;The &lt;a href=&#34;http://rogueliketutorials.com/tutorials/tcod/part-2/&#34;&gt;tutorial render functions&lt;/a&gt; are each pretty straight forward.  I think we can use a very similar setup in Lua.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#268bd2&#34;&gt;render_all&lt;/span&gt;(con, entities, screen_width, screen_height):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#586e75&#34;&gt;# Draw all entities in the list&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#719e07&#34;&gt;for&lt;/span&gt; entity &lt;span style=&#34;color:#719e07&#34;&gt;in&lt;/span&gt; entities:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        draw_entity(con, entity)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    libtcod&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;console_blit(con, &lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;, screen_width, screen_height, &lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#268bd2&#34;&gt;clear_all&lt;/span&gt;(con, entities):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#719e07&#34;&gt;for&lt;/span&gt; entity &lt;span style=&#34;color:#719e07&#34;&gt;in&lt;/span&gt; entities:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        clear_entity(con, entity)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#268bd2&#34;&gt;draw_entity&lt;/span&gt;(con, entity):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    libtcod&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;console_set_default_foreground(con, entity&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;color)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    libtcod&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;console_put_char(con, entity&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;x, entity&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;y, entity&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;char, libtcod&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;BKGND_NONE)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#268bd2&#34;&gt;clear_entity&lt;/span&gt;(con, entity):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#586e75&#34;&gt;# erase the character that represents this object&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    libtcod&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;console_put_char(con, entity&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;x, entity&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;y, &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#39; &amp;#39;&lt;/span&gt;, libtcod&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;BKGND_NONE)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We aren&amp;rsquo;t too concerned about clearing at the moment so let&amp;rsquo;s just begin with drawing. Just like the Python example, we&amp;rsquo;ll make &lt;code&gt;render_all()&lt;/code&gt; which will call &lt;code&gt;draw_entity()&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-lua&#34; data-lang=&#34;lua&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#268bd2&#34;&gt;render_all&lt;/span&gt;(ents)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#268bd2&#34;&gt;for&lt;/span&gt; ent &lt;span style=&#34;color:#268bd2&#34;&gt;in&lt;/span&gt; all(ents) &lt;span style=&#34;color:#268bd2&#34;&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    draw_entity(ent)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#268bd2&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#268bd2&#34;&gt;draw_entity&lt;/span&gt;(ent)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  rectfill(ent.x, ent.y, ent.x&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;7&lt;/span&gt;, ent.y&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;7&lt;/span&gt;, &lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  spr(ent.sp, ent.x, ent.y)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;So our drawing snippet from above becomes:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-lua&#34; data-lang=&#34;lua&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  render_all(ents)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We pass in all of our entities, each one is forwarded on for drawing, and then it appears on the screen.&lt;/p&gt;
&lt;p&gt;So far so good! You may have noticed that we&amp;rsquo;re using &lt;code&gt;rectfill()&lt;/code&gt; in &lt;code&gt;draw_entity()&lt;/code&gt;. This is because when the map is drawn, the entire thing is drawn. We need to ensure we remove those elements when they are below an entity.&lt;/p&gt;
&lt;h3 id=&#34;the-map&#34;&gt;The Map&lt;/h3&gt;
&lt;p&gt;The tutorial version now goes off into creating a class for the game map. My Pico-8 version currently just uses &lt;code&gt;_draw()&lt;/code&gt; to fill in our floor &amp;ldquo;tile&amp;rdquo; and our wall &amp;ldquo;tiles&amp;rdquo;. It&amp;rsquo;s pretty brute force for now. We&amp;rsquo;ll improve it while we work on our random generation a bit later on - likely in the next section or two.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;function _draw()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  cls(&lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;for&lt;/span&gt; iy&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;,&lt;span style=&#34;color:#2aa198&#34;&gt;127&lt;/span&gt;,&lt;span style=&#34;color:#2aa198&#34;&gt;8&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#719e07&#34;&gt;for&lt;/span&gt; ix&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;,&lt;span style=&#34;color:#2aa198&#34;&gt;127&lt;/span&gt;,&lt;span style=&#34;color:#2aa198&#34;&gt;8&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; ix &lt;span style=&#34;color:#719e07&#34;&gt;==&lt;/span&gt; xpos &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; iy &lt;span style=&#34;color:#719e07&#34;&gt;==&lt;/span&gt; ypos &lt;span style=&#34;color:#719e07&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#719e07&#34;&gt;--&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#719e07&#34;&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      spr(flor, ix, iy)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#719e07&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;--&lt;/span&gt; fill &lt;span style=&#34;color:#719e07&#34;&gt;in&lt;/span&gt; left &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; right &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;walls&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;for&lt;/span&gt; iy&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;,&lt;span style=&#34;color:#2aa198&#34;&gt;127&lt;/span&gt;,&lt;span style=&#34;color:#2aa198&#34;&gt;8&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    rectfill(&lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;, iy, &lt;span style=&#34;color:#2aa198&#34;&gt;7&lt;/span&gt;, iy&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;8&lt;/span&gt;, &lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    spr(wall, &lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;, iy)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    rectfill(&lt;span style=&#34;color:#2aa198&#34;&gt;120&lt;/span&gt;, iy, &lt;span style=&#34;color:#2aa198&#34;&gt;128&lt;/span&gt;, iy&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;8&lt;/span&gt;, &lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    spr(wall, &lt;span style=&#34;color:#2aa198&#34;&gt;120&lt;/span&gt;, iy)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;--&lt;/span&gt; fill &lt;span style=&#34;color:#719e07&#34;&gt;in&lt;/span&gt; top &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; bottom &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;walls&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;for&lt;/span&gt; ix&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;,&lt;span style=&#34;color:#2aa198&#34;&gt;127&lt;/span&gt;,&lt;span style=&#34;color:#2aa198&#34;&gt;8&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    rectfill(ix, &lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;, ix&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;8&lt;/span&gt;, &lt;span style=&#34;color:#2aa198&#34;&gt;7&lt;/span&gt;, &lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    spr(wall, ix, &lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    rectfill(ix, &lt;span style=&#34;color:#2aa198&#34;&gt;120&lt;/span&gt;, ix&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;8&lt;/span&gt;, &lt;span style=&#34;color:#2aa198&#34;&gt;128&lt;/span&gt;, &lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    spr(wall, ix, &lt;span style=&#34;color:#2aa198&#34;&gt;120&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  spr(plyr, xpos, ypos)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#b58900&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#39;(&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;..&lt;/span&gt;xpos&lt;span style=&#34;color:#719e07&#34;&gt;..&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#39;, &amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;..&lt;/span&gt;ypos&lt;span style=&#34;color:#719e07&#34;&gt;..&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#39;)&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#2aa198&#34;&gt;8&lt;/span&gt;, &lt;span style=&#34;color:#2aa198&#34;&gt;8&lt;/span&gt;, &lt;span style=&#34;color:#2aa198&#34;&gt;5&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  render_all(ents)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This renders a screen similar to the following table:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;0&lt;/th&gt;
&lt;th&gt;1&lt;/th&gt;
&lt;th&gt;2&lt;/th&gt;
&lt;th&gt;3&lt;/th&gt;
&lt;th&gt;4&lt;/th&gt;
&lt;th&gt;5&lt;/th&gt;
&lt;th&gt;6&lt;/th&gt;
&lt;th&gt;7&lt;/th&gt;
&lt;th&gt;8&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;#&lt;/td&gt;
&lt;td&gt;#&lt;/td&gt;
&lt;td&gt;#&lt;/td&gt;
&lt;td&gt;#&lt;/td&gt;
&lt;td&gt;#&lt;/td&gt;
&lt;td&gt;#&lt;/td&gt;
&lt;td&gt;#&lt;/td&gt;
&lt;td&gt;#&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;#&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;#&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;#&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;#&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;#&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;#&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;#&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;#&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;#&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;#&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;#&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;#&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;#&lt;/td&gt;
&lt;td&gt;#&lt;/td&gt;
&lt;td&gt;#&lt;/td&gt;
&lt;td&gt;#&lt;/td&gt;
&lt;td&gt;#&lt;/td&gt;
&lt;td&gt;#&lt;/td&gt;
&lt;td&gt;#&lt;/td&gt;
&lt;td&gt;#&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id=&#34;part-3---generating-a-dungeon&#34;&gt;Part 3 - Generating a dungeon&lt;/h2&gt;
&lt;p&gt;Of course I&amp;rsquo;m a bit behind schedule so I haven&amp;rsquo;t quite finished my implementation of the dungeon carving routine. I&amp;rsquo;ve also have yet to put in collision. &lt;code&gt;create_room()&lt;/code&gt; is a pretty straight forward function. We simply pass in the screen X,Y we want to start at and then the width and height of the room.  The Python implementation takes a &amp;ldquo;room&amp;rdquo; which we&amp;rsquo;re skipping over for now.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#719e07&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#268bd2&#34;&gt;create_room&lt;/span&gt;(&lt;span style=&#34;color:#268bd2&#34;&gt;self&lt;/span&gt;, room):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       &lt;span style=&#34;color:#586e75&#34;&gt;# go through the tiles in the rectangle and make them passable&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       &lt;span style=&#34;color:#719e07&#34;&gt;for&lt;/span&gt; x &lt;span style=&#34;color:#719e07&#34;&gt;in&lt;/span&gt; &lt;span style=&#34;color:#b58900&#34;&gt;range&lt;/span&gt;(room&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;x1 &lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;, room&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;x2):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#719e07&#34;&gt;for&lt;/span&gt; y &lt;span style=&#34;color:#719e07&#34;&gt;in&lt;/span&gt; &lt;span style=&#34;color:#b58900&#34;&gt;range&lt;/span&gt;(room&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;y1 &lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;, room&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;y2):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;              &lt;span style=&#34;color:#268bd2&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;tiles[x][y]&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;blocked &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; false
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;              &lt;span style=&#34;color:#268bd2&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;tiles[x][y]&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;block_sight &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; false
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;For now we are simply going to return our table of X,Y coordinates and the sprite.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-lua&#34; data-lang=&#34;lua&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#268bd2&#34;&gt;create_room&lt;/span&gt;(x,y,w,h)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#268bd2&#34;&gt;local&lt;/span&gt; obj&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;{}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#268bd2&#34;&gt;for&lt;/span&gt; iy&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;y,y&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;h&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;,&lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#268bd2&#34;&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#268bd2&#34;&gt;for&lt;/span&gt; ix&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;x,x&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;w&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;,&lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#268bd2&#34;&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      add(obj,{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       x&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;ix,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       y&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;iy,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       sp&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;flor
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     })
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#268bd2&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#268bd2&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#268bd2&#34;&gt;return&lt;/span&gt; obj
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Let&amp;rsquo;s see if we can get the tunnel functions in real quick. Again, we just have a basic implementation  that returns a table of the coordinates we need to plot our &amp;ldquo;tunnels&amp;rdquo;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-lua&#34; data-lang=&#34;lua&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#268bd2&#34;&gt;create_h_tunnel&lt;/span&gt;(x1,x2,y)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#268bd2&#34;&gt;local&lt;/span&gt; obj&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;{}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#268bd2&#34;&gt;for&lt;/span&gt; x&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;min(x1,x2),max(x1,x2)&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;,&lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#268bd2&#34;&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    add(obj,{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       x&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;x,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       y&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;y,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       sp&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;flor
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     })
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#268bd2&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#268bd2&#34;&gt;return&lt;/span&gt; obj
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#268bd2&#34;&gt;create_v_tunnel&lt;/span&gt;(y1,y2,x)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#268bd2&#34;&gt;local&lt;/span&gt; obj&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;{}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#268bd2&#34;&gt;for&lt;/span&gt; y&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;min(y1,y2),max(y1,y2)&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;,&lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#268bd2&#34;&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    add(obj,{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       x&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;x,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       y&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;y,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       sp&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;flor
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     })
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#268bd2&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#268bd2&#34;&gt;return&lt;/span&gt; obj
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Looks nice, right?&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://shindakun.dev/imgs/rl_tut_03.png&#34; alt=&#34;PICO-8&#34;&gt;&lt;/p&gt;
&lt;p&gt;Yeah, it&amp;rsquo;s missing the walls!&lt;/p&gt;
&lt;h2 id=&#34;wrapping-up-for-now&#34;&gt;Wrapping Up, For Now&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;ll have to try and wrap the last bit of the weeks code and update the GitHub project over the next day or so. I&amp;rsquo;ll also need to change around how we are writing the &amp;ldquo;map&amp;rdquo; so we can take into account impassable terrain and get ready for field of view. Then we&amp;rsquo;ll try and place some more monsters!&lt;/p&gt;
&lt;hr&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&#34;text-align:center&#34;&gt;Enjoy this post?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;&lt;a href=&#34;https://ko-fi.com/shindakun&#34;&gt;How about buying me a coffee?&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
</description>
    </item>
    
    <item>
      <title>2020 Roguelikedev Tutorial Week 1</title>
      <link>https://shindakun.dev/posts/2020-roguelikedev-tutorial-week-1/</link>
      <pubDate>Sun, 21 Jun 2020 23:20:29 -0700</pubDate>
      
      <guid>https://shindakun.dev/posts/2020-roguelikedev-tutorial-week-1/</guid>
      <description>&lt;h1 id=&#34;roguelikedev-does-the-complete-roguelike-tutorial&#34;&gt;RoguelikeDev Does The Complete Roguelike Tutorial&lt;/h1&gt;
&lt;h2 id=&#34;week-1---june-16th---22nd-2020&#34;&gt;Week 1 - June 16th - 22nd 2020&lt;/h2&gt;
&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;
&lt;p&gt;Welcome back! It&amp;rsquo;s been a bit since my last post. The quarantine was not the boon I thought it would be for side projects. I haven&amp;rsquo;t really been motivated to do much of anything.&lt;/p&gt;
&lt;p&gt;I thought I might take part in the Portland Indie Game Squads Summer Slow Jam but, that didn&amp;rsquo;t really work out so far. Instead I&amp;rsquo;m going to try to take part in the ==RoguelikeDev Does The Complete Roguelike Tutorial==&amp;hellip; and I&amp;rsquo;m already behind schedule.&lt;/p&gt;
&lt;p&gt;Beyond that though I&amp;rsquo;ve decided to only loosely follow the tutorial. The first departure will be that I&amp;rsquo;m going to try to do it in &lt;a href=&#34;https://www.lexaloffle.com/pico-8.php&#34;&gt;PICO-8&lt;/a&gt;. Which hopefully won&amp;rsquo;t go that poorly. Since I already have PICO-8 installed I don&amp;rsquo;t really need to do much in the way of setup.&lt;/p&gt;
&lt;p&gt;!arial10x10.png&lt;/p&gt;
&lt;p&gt;Using PICO-8 means I won&amp;rsquo;t be using &lt;code&gt;libtcod&lt;/code&gt; but instead will be hacking away using &lt;code&gt;lua&lt;/code&gt;. I&amp;rsquo;ve only recently started messing with it so hopefully it goes OK. Instead of the Arial font you see above I&amp;rsquo;m going to try to make use of the PICO-8 font.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://shindakun.dev/imgs/pico8fnt.png&#34; alt=&#34;PICO-8 Font&#34;&gt;&lt;/p&gt;
&lt;p&gt;This may not work out though since the font is an odd size. I could always recreate the glyphs I need in the sprite editor and have a nice 8x8 sprite. That may work nicely, I&amp;rsquo;ll have to look into that - for now though lets get on with it.&lt;/p&gt;
&lt;h2 id=&#34;part-0---setting-up&#34;&gt;Part 0 - Setting Up&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://rogueliketutorials.com/tutorials/tcod/part-0/&#34;&gt;http://rogueliketutorials.com/tutorials/tcod/part-0/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The tutorial starts out with getting &lt;code&gt;python&lt;/code&gt; running and then writing ==HELLO WORLD== to verify its working. If you happen to have PICO-8 and want to follow along, boot it up and type in:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-lua&#34; data-lang=&#34;lua&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;print(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;hello world&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Hitting enter should cause the text &amp;ldquo;hello world&amp;rdquo; to be echoed on the next line before returning to the prompt. There we go!&lt;/p&gt;
&lt;p&gt;!PICO-8_2.gif&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;part-1---drawing-the--symbol-and-moving-it-around&#34;&gt;Part 1 - Drawing the ‘@’ symbol and moving it around&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://rogueliketutorials.com/tutorials/tcod/part-1/&#34;&gt;http://rogueliketutorials.com/tutorials/tcod/part-1/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We are going to take the shortest route to completing our second goal for the week. Which might be a bit silly since we&amp;rsquo;ll likely switch over to sprite basing graphics, maybe. I haven&amp;rsquo;t quite decided. Alright lets see what we&amp;rsquo;ve got!&lt;/p&gt;
&lt;p&gt;Upon booting a &amp;ldquo;cartridge&amp;rdquo; the system will run &lt;code&gt;_init()&lt;/code&gt;. This can be used fro &lt;em&gt;initializing&lt;/em&gt; starting variables or &amp;ldquo;constraints&amp;rdquo;. Here we are going to set our base position to the center of the screen. We&amp;rsquo;ll use this when rendering our &lt;code&gt;@&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-lua&#34; data-lang=&#34;lua&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#268bd2&#34;&gt;_init&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  xpos &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;64&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  ypos &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;64&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The PICO-8 &amp;ldquo;console&amp;rdquo; has what amounts to a built in game loop. Which we can make use of by using &lt;code&gt;_draw()&lt;/code&gt;  and &lt;code&gt;_update()&lt;/code&gt;. This allows us to draw to the screen and perform &amp;ldquo;updates&amp;rdquo; every 30 (or 60) frames. As seen below we use &lt;code&gt;_update()&lt;/code&gt; to check for button presses and current position. Depending on what button was pressed and where we currently are on the screen we can then move our &lt;code&gt;@&lt;/code&gt; about.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-lua&#34; data-lang=&#34;lua&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#268bd2&#34;&gt;_draw&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  cls(&lt;span style=&#34;color:#2aa198&#34;&gt;3&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  print(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;@&amp;#34;&lt;/span&gt;, xpos, ypos)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#268bd2&#34;&gt;_update&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#268bd2&#34;&gt;if&lt;/span&gt; (btnp(&lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;) &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; xpos &lt;span style=&#34;color:#719e07&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;) xpos &lt;span style=&#34;color:#719e07&#34;&gt;-=&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#268bd2&#34;&gt;if&lt;/span&gt; (btnp(&lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;) &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; xpos &lt;span style=&#34;color:#719e07&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;127&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;5&lt;/span&gt;) xpos &lt;span style=&#34;color:#719e07&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#268bd2&#34;&gt;if&lt;/span&gt; (btnp(&lt;span style=&#34;color:#2aa198&#34;&gt;2&lt;/span&gt;) &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; ypos &lt;span style=&#34;color:#719e07&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;4&lt;/span&gt;) ypos &lt;span style=&#34;color:#719e07&#34;&gt;-=&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;6&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#268bd2&#34;&gt;if&lt;/span&gt; (btnp(&lt;span style=&#34;color:#2aa198&#34;&gt;3&lt;/span&gt;) &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; ypos &lt;span style=&#34;color:#719e07&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;127&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;9&lt;/span&gt;) ypos &lt;span style=&#34;color:#719e07&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;6&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If you happen to pick up PICO-8 the above code can be copied into the editor. After that simply type &lt;code&gt;run&lt;/code&gt; from the command line and enjoy moving about.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;wrapping-up&#34;&gt;Wrapping Up&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;ll be working over the next couple days to figure out a good release mechanism so I push builds to &lt;a href=&#34;https://shindakun.itch.io/&#34;&gt;itch.io&lt;/a&gt; and &lt;a href=&#34;https://github.com/shindakun&#34;&gt;GitHub&lt;/a&gt;. I suppose I could also release on the PICO-8 BBS once I have a &amp;ldquo;build&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;I am planning on also doing a read-through on the next two parts of the tutorial so I can decide if I need to switch to using sprites or if I should stick with &amp;ldquo;text&amp;rdquo;. If I can stay on track we should also see some more blog posts!&lt;/p&gt;
&lt;h2 id=&#34;additional-resources&#34;&gt;Additional Resources&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://www.lexaloffle.com/pico-8.php?page=manual&#34;&gt;The PICO-8 Manual&lt;/a&gt;
&lt;a href=&#34;https://reddit.com/r/roguelikedev&#34;&gt;/r/roguelikedev&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&#34;text-align:center&#34;&gt;Enjoy this post?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;&lt;a href=&#34;https://ko-fi.com/shindakun&#34;&gt;How about buying me a coffee?&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
</description>
    </item>
    
    <item>
      <title>SDL2 Test 03 - Part 01</title>
      <link>https://shindakun.dev/posts/sdl2-test-03-part-01/</link>
      <pubDate>Tue, 31 Mar 2020 23:33:03 -0700</pubDate>
      
      <guid>https://shindakun.dev/posts/sdl2-test-03-part-01/</guid>
      <description>&lt;h2 id=&#34;background&#34;&gt;Background&lt;/h2&gt;
&lt;p&gt;So here we are at the end of month and what a crazy month it&amp;rsquo;s been. You may not be too surprised to hear that I&amp;rsquo;ve been trying to start this post for the last two weeks. It&amp;rsquo;s been quite crazy around here though so I never actually got around to doing it.&lt;/p&gt;
&lt;p&gt;However, now that we are down to the wire I wanted to make sure at least I got a post up that covers a bit of what I wanted to have up today. We&amp;rsquo;ll have to wait a couple days until the demo programs up on &lt;a href=&#34;https://shindakun.itch.io/&#34;&gt;itch.io&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This post is likely to be even shorter than our February post!&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;cellular-automata&#34;&gt;Cellular Automata&lt;/h2&gt;
&lt;p&gt;This time around I&amp;rsquo;ll be posting up some information on my knock-off rendition of using cellular automata to dig out caves.&lt;/p&gt;
&lt;p&gt;I know this is suppose to be an SDL2 post but we aren&amp;rsquo;t going to make that leap until the second part. A very small scale version might look like the text below.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Hopefully this renders OK. 🤞&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;111111111111111111111111111111111111111111111111111111111111
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;111111111111111111111111111111111111111111000111111111100111
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;111111111111111111001110011111111111111000000011111110000011
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;111111111111111110000000001111111111110000000011111100000001
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;111111111111111100000000000111111111110000000011111100000001
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;111111111111110000000000000011111111110000000011111100000001
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;111111111111100000000000000001100001100000000001111100000001
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;111111111111100000000000000000000000000000000001111110000011
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;111111111111100000000000000000000000000000000001111111000011
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;111111111111000000000000000000000000000000000011111111100011
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;111111111110000000000000000000000000000000000011111111111111
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;111111111100000000000000000000000000000000000001110011111111
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;111111111000000000000000000000000000000000000000000001111111
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;111000000000000000000000000000000000000000000000000001111111
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;110000000000000000000000000000000000000000000000000000111111
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;110000000000000000000000000000000000000000000000000000000111
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;110000000000000000000000000000000000000000000000000000000011
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;110000000000000000000000000000000000000000000000000000000011
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;110000000000000000000000000000000000000000000000000000000011
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;110000000000000000000011000000000000000000000000000000000011
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;110000000000000000000111100000000000000000000000000000000011
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;111000000000000000000111100000000000000000000000000000000011
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;111000000000000000000111100000000000000000001110000000000011
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;111000000000000000000111000000000000000000011111000000000011
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;111000000000000000001111000000000000000000011111100000000011
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;111000000000000000001111100000000000000000011111110000000011
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;111000000000000000000111110000000000000000011111110000000011
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;111100000000000000000111111000000000000000111111110000000111
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;111110000001100110001111111111000111111111111111111001111111
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;111111111111111111111111111111111111111111111111111111111111
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Cellular automata is broken up into several phases. First thing we are going to do is take a grid - which in our case above is I believe 30x60.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;for&lt;/span&gt; x &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;range&lt;/span&gt; l.Grid {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#719e07&#34;&gt;for&lt;/span&gt; y &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;range&lt;/span&gt; l.Grid[x] {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; rand.&lt;span style=&#34;color:#268bd2&#34;&gt;Intn&lt;/span&gt;(max&lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt;min)&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;min &amp;lt; RandFill &lt;span style=&#34;color:#719e07&#34;&gt;||&lt;/span&gt; x &lt;span style=&#34;color:#719e07&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;||&lt;/span&gt; x &lt;span style=&#34;color:#719e07&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#b58900&#34;&gt;len&lt;/span&gt;(l.Grid)&lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;||&lt;/span&gt; y &lt;span style=&#34;color:#719e07&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;||&lt;/span&gt; y &lt;span style=&#34;color:#719e07&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#b58900&#34;&gt;len&lt;/span&gt;(l.Grid[x])&lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        l.Grid[x][y] = &lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      } &lt;span style=&#34;color:#719e07&#34;&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        l.Grid[x][y] = &lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Alright, so, here&amp;rsquo;s our first stop we&amp;rsquo;re going to take our slice &lt;code&gt;Grid&lt;/code&gt; and randomly fill in &lt;code&gt;0&lt;/code&gt; or &lt;code&gt;1&lt;/code&gt;. We loop all the way through (and may need to flip the &lt;code&gt;x&lt;/code&gt; and &lt;code&gt;y&lt;/code&gt; now that I&amp;rsquo;m looking at it) filling in each tile randomly. During this we are also checking to make sure that if we are on an edge that we fill in a &lt;code&gt;1&lt;/code&gt; to wrap our &amp;ldquo;level&amp;rdquo; in walls so we don&amp;rsquo;t need to worry about wrapping around for now.&lt;/p&gt;
&lt;p&gt;Maybe at some point we&amp;rsquo;ll extend this out so it is larger and have a wrapping world. But that&amp;rsquo;s beyond the scope of what I&amp;rsquo;d like to have accomplished by the end of the year.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;give-it-a-try&#34;&gt;Give It A Try&lt;/h2&gt;
&lt;p&gt;Instead of giving it a try now, we&amp;rsquo;re going to need to hang on a couple of days. This months project isn&amp;rsquo;t very exciting as it is more just setting the stage for our next steps. But I&amp;rsquo;ll be putting up the example executables within the next week or so. I am aiming to have a much more in depth post up around the 10th to cover the past months work as well as bridge what is coming next&amp;hellip;.&lt;/p&gt;
&lt;p&gt;Anyway until next time!&lt;/p&gt;
&lt;hr&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&#34;text-align:center&#34;&gt;Enjoy this post?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;&lt;a href=&#34;https://ko-fi.com/shindakun&#34;&gt;How about buying me a coffee?&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
</description>
    </item>
    
    <item>
      <title>SDL2 Test 02</title>
      <link>https://shindakun.dev/posts/sdl2-test-02/</link>
      <pubDate>Wed, 26 Feb 2020 18:39:03 -0800</pubDate>
      
      <guid>https://shindakun.dev/posts/sdl2-test-02/</guid>
      <description>&lt;h2 id=&#34;background&#34;&gt;Background&lt;/h2&gt;
&lt;p&gt;Welcome back! Or welcome for the first time! If you do happen to be stopping by for the first time you may want to read &lt;a href=&#34;https://shindakun.dev/posts/game-dev-2020/&#34;&gt;the first&lt;/a&gt; &lt;a href=&#34;https://shindakun.dev/posts/sdl2-test-01/&#34;&gt;two posts&lt;/a&gt; in this little series.&lt;/p&gt;
&lt;p&gt;Of course if you want to stay here you are most welcome. So, what are we doing?&lt;/p&gt;
&lt;p&gt;Creating prototypes that can form together into something resembling a game.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;lets-get-shaking&#34;&gt;Lets Get Shaking&lt;/h2&gt;
&lt;p&gt;Looking back on our last post I noted at the end that it&amp;rsquo;d be nice to add a screen shake effect. Something say like this one:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://shindakun.dev/imgs/sdl2-test02-01.gif&#34; alt=&#34;sdl2-test02&#34;&gt;&lt;/p&gt;
&lt;p&gt;As it turns out it is quite easy to do.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;camera&#34;&gt;Camera&lt;/h2&gt;
&lt;p&gt;We are going to use the camera position and alter it to achieve a shaking effect. The camera itself is an &lt;code&gt;sdl.Rect()&lt;/code&gt; that is the size of our output resolution. It doesn&amp;rsquo;t need to be an &lt;code&gt;sdl.Rect()&lt;/code&gt;, but this removes the need to declare a struct.&lt;/p&gt;
&lt;p&gt;We calculate the coordinate points of the rectangle relative to the player. Centering it around the “player character”. Unless it is near the edge of the “map”, then the edge is set to the background edge. A chunk of the background is then copied to the renderer using those coordinates. The player &amp;ldquo;sprite&amp;rdquo; is then copied over next. Since we are using the hardware render so we call &lt;code&gt;renderer.Present()&lt;/code&gt; to “flip” the &lt;a href=&#34;https://wiki.libsdl.org/SDL_RenderPresent#Remarks&#34;&gt;back buffer&lt;/a&gt; to the screen.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s see what our current camera looks like.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  camera &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; sdl.Rect{X: &lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;, Y: &lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;, W: wWidth, H: wHeight}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;...&lt;/span&gt;snip&lt;span style=&#34;color:#719e07&#34;&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  camera.X = &lt;span style=&#34;color:#b58900&#34;&gt;int32&lt;/span&gt;((d.posX &lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; d.width&lt;span style=&#34;color:#719e07&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;2&lt;/span&gt;) &lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt; wWidth&lt;span style=&#34;color:#719e07&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;2&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  camera.Y = &lt;span style=&#34;color:#b58900&#34;&gt;int32&lt;/span&gt;((d.posY &lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; d.height&lt;span style=&#34;color:#719e07&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;2&lt;/span&gt;) &lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt; wHeight&lt;span style=&#34;color:#719e07&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;2&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; camera.X &amp;lt; &lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    camera.X = &lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; camera.Y &amp;lt; &lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    camera.Y = &lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; camera.X &amp;gt; bgWidth&lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt;camera.W {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    camera.X = bgWidth &lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt; camera.W
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; camera.Y &amp;gt; bgHeight&lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt;camera.H {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    camera.Y = bgHeight &lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt; camera.H
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  renderer.&lt;span style=&#34;color:#268bd2&#34;&gt;Copy&lt;/span&gt;(bg, &lt;span style=&#34;color:#719e07&#34;&gt;&amp;amp;&lt;/span&gt;sdl.Rect{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    X: camera.X,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Y: camera.Y,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    W: wWidth,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    H: wHeight,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#719e07&#34;&gt;&amp;amp;&lt;/span&gt;sdl.Rect{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      X: &lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      Y: &lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      W: wWidth,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      H: wHeight,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    })
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Not very exciting is it.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;implementation&#34;&gt;Implementation&lt;/h2&gt;
&lt;p&gt;To keep this post short I&amp;rsquo;m not going to repeat all the code. I need to figure out how I&amp;rsquo;m going to put it up on GitHub. Do I want to use a single repo for all the code or split it up into sections? I should get that taken care of.&lt;/p&gt;
&lt;p&gt;We start outside our main game loop and do a bit of setup, with some initial values. Then after our camera bounding code, we check if &lt;code&gt;shaking&lt;/code&gt; is &lt;code&gt;true&lt;/code&gt;. If it is we use the very inelegant &lt;code&gt;shake * rand.Float64() * maxShake&lt;/code&gt; to get our camera offset. This might lead to the following values:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;camerax 184, cameray 228
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;targetx 3.421793651571817, targety 1.0282214265561018
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Adding &lt;code&gt;184+3&lt;/code&gt; (we &lt;code&gt;cast&lt;/code&gt; to &lt;code&gt;int32&lt;/code&gt; which drops the decimals) gives us &lt;code&gt;187&lt;/code&gt; for the &lt;code&gt;X&lt;/code&gt;. Likewise, we add &lt;code&gt;228+1&lt;/code&gt; and get &lt;code&gt;229&lt;/code&gt;. This gives a jitter to the image since the value we&amp;rsquo;re adding will change every frame. We don&amp;rsquo;t have any negative offsets when done this way though. This isn&amp;rsquo;t the perfect screen shake but at this stage it will do. We can look into smoothing it a bit down the road.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  shaking &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#cb4b16&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  targetx &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;0.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  targety &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;0.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  shake &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;0.8&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  maxShake &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;...&lt;/span&gt;snip&lt;span style=&#34;color:#719e07&#34;&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; camera.Y &amp;gt; bgHeight&lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt;camera.H {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    camera.Y = bgHeight &lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt; camera.H
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; shaking {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    targetx = shake &lt;span style=&#34;color:#719e07&#34;&gt;*&lt;/span&gt; rand.&lt;span style=&#34;color:#268bd2&#34;&gt;Float64&lt;/span&gt;() &lt;span style=&#34;color:#719e07&#34;&gt;*&lt;/span&gt; maxShake
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    targety = shake &lt;span style=&#34;color:#719e07&#34;&gt;*&lt;/span&gt; rand.&lt;span style=&#34;color:#268bd2&#34;&gt;Float64&lt;/span&gt;() &lt;span style=&#34;color:#719e07&#34;&gt;*&lt;/span&gt; maxShake
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  renderer.&lt;span style=&#34;color:#268bd2&#34;&gt;Copy&lt;/span&gt;(bg, &lt;span style=&#34;color:#719e07&#34;&gt;&amp;amp;&lt;/span&gt;sdl.Rect{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    X: &lt;span style=&#34;color:#b58900&#34;&gt;int32&lt;/span&gt;(targetx) &lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; camera.X,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Y: &lt;span style=&#34;color:#b58900&#34;&gt;int32&lt;/span&gt;(targety) &lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; camera.Y,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    W: wWidth,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    H: wHeight,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;...&lt;/span&gt;snip&lt;span style=&#34;color:#719e07&#34;&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The &lt;code&gt;render.Copy()&lt;/code&gt; call now uses the original camera value and the shake offset. We don&amp;rsquo;t want to actually mutate the camera values since we need them once the shaking stops. It&amp;rsquo;s not visible here but the current code allows us to enable and disable shaking by pressing the &lt;code&gt;space bar&lt;/code&gt;. In that bit of code I&amp;rsquo;m making sure to reset &lt;code&gt;targetx&lt;/code&gt; and &lt;code&gt;targety&lt;/code&gt; to &lt;code&gt;0.0&lt;/code&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;wrapping-up&#34;&gt;Wrapping Up&lt;/h2&gt;
&lt;p&gt;A short month calls for a short post. We didn&amp;rsquo;t really set out to do to much this month but we accomplished a few things anyway. Besides this post, I finished my &lt;code&gt;makefile&lt;/code&gt;! For now at least. I can build for Windows, macOS, and Linux and release to &lt;a href=&#34;https://shindakun.itch.io/&#34;&gt;itch.io&lt;/a&gt; pretty with no trouble. In theory I can also compile to &lt;a href=&#34;https://github.com/veandco/go-sdl2-examples/tree/master/examples/android&#34;&gt;Android&lt;/a&gt; (and maybe iOS).&lt;/p&gt;
&lt;p&gt;I may switch gears a little and try to accomplish generating a &amp;ldquo;map&amp;rdquo; which will eventually be used as our base for a level. This is going to be &lt;a href=&#34;https://en.wikipedia.org/wiki/Cellular_automaton&#34;&gt;cellular automata&lt;/a&gt; based. I also may try to get an implementation &lt;a href=&#34;https://en.wikipedia.org/wiki/Diamond-square_algorithm&#34;&gt;diamond-square algorithm&lt;/a&gt; completed. At the very least I&amp;rsquo;m hoping to present something on screen for the cellular automata. Where we go after that I&amp;rsquo;m not quite sure yet.&lt;/p&gt;
&lt;p&gt;Anyway until next time!&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;give-it-a-try&#34;&gt;Give It A Try&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;ve added the prototype over on &lt;a href=&#34;https://shindakun.itch.io/sdl2-test02&#34;&gt;itch.io&lt;/a&gt;. It can be download for Windows, macOS, and Linux. Please give them a try and let me know if you have any issues.&lt;/p&gt;
&lt;hr&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&#34;text-align:center&#34;&gt;Enjoy this post?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;&lt;a href=&#34;https://ko-fi.com/shindakun&#34;&gt;How about buying me a coffee?&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
</description>
    </item>
    
    <item>
      <title>SDL2 Test 01</title>
      <link>https://shindakun.dev/posts/sdl2-test-01/</link>
      <pubDate>Fri, 31 Jan 2020 22:27:02 -0800</pubDate>
      
      <guid>https://shindakun.dev/posts/sdl2-test-01/</guid>
      <description>&lt;h2 id=&#34;background&#34;&gt;Background&lt;/h2&gt;
&lt;p&gt;Welcome back! This is the first release of a few bits of SDL2/Go prototype code. The plan is to combine those bits together into a whole at some point. This method may work out well. We&amp;rsquo;ve had a good start on our build and release tooling. As part of that, we also have a very simple example of displaying an image on screen.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;looking-back&#34;&gt;Looking Back&lt;/h2&gt;
&lt;p&gt;The Windows build script worked as expected! You may need to install the &lt;a href=&#34;https://www.libsdl.org/download-2.0.php&#34;&gt;SDL2 binaries&lt;/a&gt; but after that, you should be good to go. We will have to look into distributing the DLLs along with the package. The previous SDL logo test Windows and macOS versions are over on &lt;a href=&#34;https://shindakun.itch.io/sdl2-test00&#34;&gt;itch.io&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;next-steps&#34;&gt;Next Steps&lt;/h2&gt;
&lt;p&gt;This time around we&amp;rsquo;re going to put together a small 240x160 window. It will act window (or camera) into a larger 1440x960 background image. We even have a small 8x16 &amp;ldquo;thing&amp;rdquo; that we can move around the space. This will serve us well down the road and is usable in all types of games.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://shindakun.dev/imgs/sdl2-test01-01.png&#34; alt=&#34;sdl2-test01&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;camera&#34;&gt;Camera&lt;/h2&gt;
&lt;p&gt;&lt;img src=&#34;https://shindakun.dev/imgs/sdl2-test01-camera.png&#34; alt=&#34;wow look at that drawing&#34;&gt;&lt;/p&gt;
&lt;p&gt;The basic idea is we have a large background but we only need to render a small part of that to the screen. First we need our camera, so we use &lt;code&gt;sdl.Rect{}&lt;/code&gt; and create a rectangle the same size as our display window. Note that this is an example, not the full implementation. At some point most of this code should be on &lt;a href=&#34;https://github.com/shindakun&#34;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  camera &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; sdl.Rect{X: &lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;, Y: &lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;, W: wWidth, H: wHeight}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We want to constrain the camera in such a way that the &amp;ldquo;thing&amp;rdquo; we are moving around will be near the center of the window. We do this by taking the &amp;ldquo;things&amp;rdquo; current position (plus half its width/height) and dividing the X and Y by half the windows width and height.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  camera.X = &lt;span style=&#34;color:#b58900&#34;&gt;int32&lt;/span&gt;((d.posX &lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; d.width&lt;span style=&#34;color:#719e07&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;2&lt;/span&gt;) &lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt; wWidth&lt;span style=&#34;color:#719e07&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;2&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  camera.Y = &lt;span style=&#34;color:#b58900&#34;&gt;int32&lt;/span&gt;((d.posY &lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; d.height&lt;span style=&#34;color:#719e07&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;2&lt;/span&gt;) &lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt; wHeight&lt;span style=&#34;color:#719e07&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;2&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We then constrain the camera to keep it from rendering &amp;ldquo;off-screen&amp;rdquo;. This allows the &amp;ldquo;thing&amp;rdquo; to continue moving toward the edges and have the camera unbound so it doesn&amp;rsquo;t follow.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; camera.X &amp;lt; &lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    camera.X = &lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; camera.Y &amp;lt; &lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    camera.Y = &lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; camera.X &amp;gt; bgWidth&lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt;camera.W {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    camera.X = bgWidth &lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt; camera.W
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; camera.Y &amp;gt; bgHeight&lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt;camera.H {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    camera.Y = bgHeight &lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt; camera.H
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now we are free to take a chunk of our background texture, which matches the cameras coordinates. &lt;code&gt;renderer.Copy()&lt;/code&gt; allows us to copy that chunk to the destination is our current renderer.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  renderer.&lt;span style=&#34;color:#268bd2&#34;&gt;Copy&lt;/span&gt;(bg, &lt;span style=&#34;color:#719e07&#34;&gt;&amp;amp;&lt;/span&gt;sdl.Rect{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    X: camera.X,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Y: camera.Y,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    W: wWidth,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    H: wHeight,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#719e07&#34;&gt;&amp;amp;&lt;/span&gt;sdl.Rect{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      X: &lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      Y: &lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      W: wWidth,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      H: wHeight,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    })
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We then do the same thing with our &amp;ldquo;thing&amp;rdquo;. We draw it to the screen on top of the background as centered as need be. And that&amp;rsquo;s all there is to it!&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://shindakun.dev/imgs/sdl2-test01-02.gif&#34; alt=&#34;moving the thing around&#34;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;give-it-a-try&#34;&gt;Give It A Try&lt;/h2&gt;
&lt;p&gt;Like last time I have release the demo version over on &lt;a href=&#34;https://shindakun.itch.io/sdl2-test01&#34;&gt;itch.io&lt;/a&gt;. Both Windows and macOS versions are up for download. Please give them a try and let me know if they run at all. The movement code is a bit off when the &amp;ldquo;thing&amp;rdquo; gets near the edges. I will look into updating that as I have time.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;next-up&#34;&gt;Next Up&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;m not quite sure what I&amp;rsquo;m going to work on next. I do want to do some internal tooling to make the initial project setup easier. But that won&amp;rsquo;t count toward next months release. Maybe I&amp;rsquo;ll work on a little bit of procedural generation. It&amp;rsquo;d be nice to generate the background or map rather then drawing a shoddy picture in Aseprite. Or we could work on adding camera shake - can&amp;rsquo;t call yourself indie if you don&amp;rsquo;t have that massive shake!&lt;/p&gt;


    
    &lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
      &lt;iframe allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&#34; allowfullscreen=&#34;allowfullscreen&#34; loading=&#34;eager&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; src=&#34;https://www.youtube.com/embed/AJdEqssNZ-U?autoplay=0&amp;controls=1&amp;end=0&amp;loop=0&amp;mute=0&amp;start=0&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; title=&#34;YouTube video&#34;
      &gt;&lt;/iframe&gt;
    &lt;/div&gt;

&lt;hr&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&#34;text-align:center&#34;&gt;Enjoy this post?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;&lt;a href=&#34;https://ko-fi.com/shindakun&#34;&gt;How about buying me a coffee?&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
</description>
    </item>
    
    <item>
      <title>Game Dev 2020</title>
      <link>https://shindakun.dev/posts/game-dev-2020/</link>
      <pubDate>Wed, 29 Jan 2020 19:09:12 -0800</pubDate>
      
      <guid>https://shindakun.dev/posts/game-dev-2020/</guid>
      <description>&lt;h2 id=&#34;background&#34;&gt;Background&lt;/h2&gt;
&lt;p&gt;Having grown up with the rise of entertainment software I have a pretty long history with gaming. As part of that, I&amp;rsquo;ve flirted off and on with making games. This takes the form of some general messing around. I&amp;rsquo;ll do that until something else catches my scattered attention.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve been thinking since the beginning of the year that I want to try to cobble something together. I&amp;rsquo;d be a good reason for me to blog and gives me a nice excuse to continue messing around with Go and SDL2. Why Go? Because it&amp;rsquo;s portable, I can compile to Windows, macOS, and Linux with ease.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;the-plan&#34;&gt;The Plan&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;m planning on trying to release something at the end of every month. It will not be a complete game. Only little bits and pieces that we can put together into a whole at some point.&lt;/p&gt;
&lt;p&gt;Each piece will get its own page over at &lt;a href=&#34;https://shindakun.itch.io/&#34;&gt;itch.io&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;As part of this, I want to first tackle a release process. I&amp;rsquo;ve decided to do using a &lt;code&gt;makefile&lt;/code&gt;. Each project will have the same base layout so I&amp;rsquo;ll write a small helper script (in Go) to help with that.&lt;/p&gt;
&lt;p&gt;I imagine I&amp;rsquo;ll end up with something very like the following. It&amp;rsquo;s pretty close to what I already have. macOS and Windows will need to separate build but the Linux build can happen in Docker. That won&amp;rsquo;t come until the second (or third) release. If I do add it, new builds of older releases get updated.&lt;/p&gt;
&lt;p&gt;The layout will look a bit like the following.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sdl2-test00
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;│   main.go
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|   makefile
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;│   README.md
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;└───assets
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;│   │   background.png
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;│
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;└───buildfiles
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|   │   README.md
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;└───macos_buildfiles
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|   │   Info.plist
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;└───windows_buildfiles
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    |   SDL2.dll
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;makefile&#34;&gt;makefile&lt;/h2&gt;
&lt;p&gt;Below you can see an example of my current &lt;code&gt;makefile&lt;/code&gt;. It&amp;rsquo;s not quite done but it&amp;rsquo;s getting close enough. I need to do some tweaking to pull the main &lt;code&gt;BINARY_NAME&lt;/code&gt; from the current directory. To keep this post short I&amp;rsquo;ve trimmed out a bit and only left the macOS related.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-makefile&#34; data-lang=&#34;makefile&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;GOCMD&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;go
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;GOBUILD&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;$(&lt;/span&gt;GOCMD&lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt; build
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;GOCLEAN&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;$(&lt;/span&gt;GOCMD&lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt; clean
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;GOTEST&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;$(&lt;/span&gt;GOCMD&lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#b58900&#34;&gt;test&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;GOGET&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;$(&lt;/span&gt;GOCMD&lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt; get
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;ITCH_ACCOUNT&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;$(&lt;/span&gt;HANDLE&lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;ITCH_GAME_URI&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;$(&lt;/span&gt;notdir &lt;span style=&#34;color:#719e07&#34;&gt;$(&lt;/span&gt;shell &lt;span style=&#34;color:#b58900&#34;&gt;pwd&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;BINARY_VER&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;?=&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;$(&lt;/span&gt;shell git tag&lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;BINARY_NAME&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;sdl2-test00
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;BINARY_DARWIN&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;$(&lt;/span&gt;BINARY_NAME&lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;RELEASE_DARWIN&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;release-darwin
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;all&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;:&lt;/span&gt; clean deps build
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;build&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  @echo 💻 Building
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  @&lt;span style=&#34;color:#719e07&#34;&gt;$(&lt;/span&gt;GOBUILD&lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt; -o &lt;span style=&#34;color:#719e07&#34;&gt;$(&lt;/span&gt;BINARY_NAME&lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt; -v
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;clean&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  @echo 🧹 Cleaning up
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  @&lt;span style=&#34;color:#719e07&#34;&gt;$(&lt;/span&gt;GOCLEAN&lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  @echo ⚠️ Removing binaries
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  @rm -f &lt;span style=&#34;color:#719e07&#34;&gt;$(&lt;/span&gt;BINARY_NAME&lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  @rm -f &lt;span style=&#34;color:#719e07&#34;&gt;$(&lt;/span&gt;BINARY_LINUX&lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  @rm -f &lt;span style=&#34;color:#719e07&#34;&gt;$(&lt;/span&gt;BINARY_WIN&lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;# Danger ;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;&lt;/span&gt;  @echo ⚠️ Removing release directories
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  @rm -rf ./&lt;span style=&#34;color:#719e07&#34;&gt;$(&lt;/span&gt;RELEASE_WIN&lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  @rm -rf ./&lt;span style=&#34;color:#719e07&#34;&gt;$(&lt;/span&gt;RELEASE_LINUX&lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  @rm -rf ./&lt;span style=&#34;color:#719e07&#34;&gt;$(&lt;/span&gt;RELEASE_DARWIN&lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  @echo 🧹 Done cleaning
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;release-darwin&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  @echo 💻 Creating &lt;span style=&#34;color:#719e07&#34;&gt;$(&lt;/span&gt;RELEASE_DARWIN&lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;/&lt;span style=&#34;color:#719e07&#34;&gt;$(&lt;/span&gt;BINARY_DARWIN&lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;-&lt;span style=&#34;color:#719e07&#34;&gt;$(&lt;/span&gt;BINARY_VER&lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;.app folders
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  @mkdir -p &lt;span style=&#34;color:#719e07&#34;&gt;$(&lt;/span&gt;RELEASE_DARWIN&lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;/&lt;span style=&#34;color:#719e07&#34;&gt;$(&lt;/span&gt;BINARY_DARWIN&lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;-&lt;span style=&#34;color:#719e07&#34;&gt;$(&lt;/span&gt;BINARY_VER&lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;.app/Contents/MacOS
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  @mkdir -p &lt;span style=&#34;color:#719e07&#34;&gt;$(&lt;/span&gt;RELEASE_DARWIN&lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;/&lt;span style=&#34;color:#719e07&#34;&gt;$(&lt;/span&gt;BINARY_DARWIN&lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;-&lt;span style=&#34;color:#719e07&#34;&gt;$(&lt;/span&gt;BINARY_VER&lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;.app/Contents/PlugIns
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  @mkdir -p &lt;span style=&#34;color:#719e07&#34;&gt;$(&lt;/span&gt;RELEASE_DARWIN&lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;/&lt;span style=&#34;color:#719e07&#34;&gt;$(&lt;/span&gt;BINARY_DARWIN&lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;-&lt;span style=&#34;color:#719e07&#34;&gt;$(&lt;/span&gt;BINARY_VER&lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;.app/Contents/Resources
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  @echo 💻 Building &lt;span style=&#34;color:#719e07&#34;&gt;$(&lt;/span&gt;RELEASE_DARWIN&lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;/&lt;span style=&#34;color:#719e07&#34;&gt;$(&lt;/span&gt;BINARY_DARWIN&lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;-&lt;span style=&#34;color:#719e07&#34;&gt;$(&lt;/span&gt;BINARY_VER&lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  @GOOS&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;darwin &lt;span style=&#34;color:#268bd2&#34;&gt;GOARCH&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;amd64 &lt;span style=&#34;color:#719e07&#34;&gt;$(&lt;/span&gt;GOBUILD&lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt; -ldflags&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;-s -w&amp;#34;&lt;/span&gt; -o &lt;span style=&#34;color:#719e07&#34;&gt;$(&lt;/span&gt;RELEASE_DARWIN&lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;/&lt;span style=&#34;color:#719e07&#34;&gt;$(&lt;/span&gt;BINARY_DARWIN&lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;-&lt;span style=&#34;color:#719e07&#34;&gt;$(&lt;/span&gt;BINARY_VER&lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;.app/Contents/MacOS/&lt;span style=&#34;color:#719e07&#34;&gt;$(&lt;/span&gt;BINARY_DARWIN&lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;-&lt;span style=&#34;color:#719e07&#34;&gt;$(&lt;/span&gt;BINARY_VER&lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt; -v
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  @echo 💻 Copying assets
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  @cp -r ./assets &lt;span style=&#34;color:#719e07&#34;&gt;$(&lt;/span&gt;RELEASE_DARWIN&lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;/&lt;span style=&#34;color:#719e07&#34;&gt;$(&lt;/span&gt;BINARY_DARWIN&lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;-&lt;span style=&#34;color:#719e07&#34;&gt;$(&lt;/span&gt;BINARY_VER&lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;.app/Contents/MacOS/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  @cp ./macos_buildfiles/Info.plist &lt;span style=&#34;color:#719e07&#34;&gt;$(&lt;/span&gt;RELEASE_DARWIN&lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;/&lt;span style=&#34;color:#719e07&#34;&gt;$(&lt;/span&gt;BINARY_DARWIN&lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;-&lt;span style=&#34;color:#719e07&#34;&gt;$(&lt;/span&gt;BINARY_VER&lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;.app/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  @# cp -r ./macos_buildfiles/icons.icns &lt;span style=&#34;color:#719e07&#34;&gt;$(&lt;/span&gt;RELEASE_DARWIN&lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;/&lt;span style=&#34;color:#719e07&#34;&gt;$(&lt;/span&gt;BINARY_DARWIN&lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;-&lt;span style=&#34;color:#719e07&#34;&gt;$(&lt;/span&gt;BINARY_VER&lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;.app/Contents/Resources/&lt;span style=&#34;color:#719e07&#34;&gt;$(&lt;/span&gt;BINARY_DARWIN&lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;-&lt;span style=&#34;color:#719e07&#34;&gt;$(&lt;/span&gt;BINARY_VER&lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  @echo 💻 Uploading to itch.io
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  @butler push &lt;span style=&#34;color:#719e07&#34;&gt;$(&lt;/span&gt;RELEASE_DARWIN&lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;$(&lt;/span&gt;ITCH_ACCOUNT&lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;/&lt;span style=&#34;color:#719e07&#34;&gt;$(&lt;/span&gt;ITCH_GAME_URI&lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;:mac
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The idea is to make building and releasing easier up front. To that end, I&amp;rsquo;ve worked on building out putting together a &lt;code&gt;.app&lt;/code&gt; package which can then be immediately released to &lt;code&gt;itch.io&lt;/code&gt;. I did my test release last night. It can be found over on &lt;a href=&#34;https://shindakun.itch.io/sdl2-test00&#34;&gt;itch.io&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&#34;text-align:center&#34;&gt;Enjoy this post?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;&lt;a href=&#34;https://ko-fi.com/shindakun&#34;&gt;How about buying me a coffee?&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
</description>
    </item>
    
    <item>
      <title>Adding a Book Cover Shortcode for Hugo</title>
      <link>https://shindakun.dev/posts/adding-a-book-cover-shortcode-for-hugo/</link>
      <pubDate>Wed, 01 Jan 2020 03:05:29 -0800</pubDate>
      
      <guid>https://shindakun.dev/posts/adding-a-book-cover-shortcode-for-hugo/</guid>
      <description>&lt;h2 id=&#34;background&#34;&gt;Background&lt;/h2&gt;
&lt;p&gt;There has been some chatter on the micro.blog timeline about adding some better tools for book covers when sharing book suggestions, etc. &lt;a href=&#34;https://micro.blog/michaelfransen/7433727&#34;&gt;@michaelfransen&lt;/a&gt; started off asking about a gallery of images similar to the way the Photos page works. As the conversation went on &lt;a href=&#34;https://micro.blog/jsonbecker/7446478&#34;&gt;@jsonbecker&lt;/a&gt; brought up the idea of ISBN to cover image inside of a Hugo data page.&lt;/p&gt;
&lt;p&gt;There are a few services that have APIs that should get the image, Goodreads (Amazon) and Google Books are the biggest. Since Hugo can grab JSON when building pages it is possible to just use a short-code to build out what you&amp;rsquo;d need for a naive implementation.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;drawbacks&#34;&gt;Drawbacks&lt;/h2&gt;
&lt;p&gt;While looking into this I noticed that both the Goodreads and Google APIs have their problems. On the Google side of things not every result is going to have larger image sizes:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;imageLinks&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;smallThumbnail&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;http://books.google.com/books/content?id=DRlhnQEACAAJ&amp;amp;printsec=frontcover&amp;amp;img=1&amp;amp;zoom=5&amp;amp;source=gbs_api&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;thumbnail&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;http://books.google.com/books/content?id=DRlhnQEACAAJ&amp;amp;printsec=frontcover&amp;amp;img=1&amp;amp;zoom=1&amp;amp;source=gbs_api&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;},
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You can change the &amp;ldquo;zoom&amp;rdquo; but that doesn&amp;rsquo;t result in an image sadly. Other than that the Google API works pretty much as we&amp;rsquo;d need. &lt;a href=&#34;https://www.googleapis.com/books/v1/volumes?q=isbn:1932234411&#34;&gt;Search for an ISBN&lt;/a&gt; and get an object back with results! Oh but wait&amp;hellip; there are a bunch of ISBNs that return no cover image.&lt;/p&gt;
&lt;p&gt;Not to worry, Goodreads can help us out there. After all, they have the Amazon library of images along with crowd sourced covers. Except in order to look up books on Goodreads you need the ID - and the API call to &lt;a href=&#34;https://www.goodreads.com/api/index#book.isbn_to_id&#34;&gt;look up the ID by ISBN&lt;/a&gt; doesn&amp;rsquo;t work. And, from what I&amp;rsquo;ve read, isn&amp;rsquo;t very reliable when it does. Also, it responds with XML so, that won&amp;rsquo;t help.&lt;/p&gt;
&lt;p&gt;The final draw back would be that the images aren&amp;rsquo;t &amp;ldquo;download&amp;rdquo; they would be linked from the Goodreads or Google hosting where they are stored. That may not seem like a drawback but at some point they will stop allowing the images to be linked from certain referring domains.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;overcoming-obstacles&#34;&gt;Overcoming Obstacles&lt;/h2&gt;
&lt;p&gt;Since Google can&amp;rsquo;t be relied on we going to move them to backup status. We&amp;rsquo;ll use Goodreads as the primary source and fallback as needed.&lt;/p&gt;
&lt;p&gt;That still presents us with the problem of the Goodreads API not working. Well, it turns out the workaround for that is pretty easy. I noticed that if you searched for an ISBN in on the main page you would get a single response with what I was looking for.&lt;/p&gt;
&lt;p&gt;Taking a look in Chrome console I was pleased to discover that the search GET request returns a nice JSON object.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;imageUrl&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;https://i.gr-assets.com/images/S/compressed.photo.goodreads.com/books/1388494987i/38379._SY75_.jpg&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;bookId&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;38379&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;workId&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;1921329&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;bookUrl&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;/book/show/38379.Ring&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;from_search&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#cb4b16&#34;&gt;true&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;qid&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;Xoh78SXtTz&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;rank&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;title&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;Ring (Ring, #1)&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;bookTitleBare&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;Ring&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;numPages&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;282&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;avgRating&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;3.82&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;ratingsCount&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;13682&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;author&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;14465&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;Kōji Suzuki&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;isGoodreadsAuthor&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#cb4b16&#34;&gt;false&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;profileUrl&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;https://www.goodreads.com/author/show/14465.K_ji_Suzuki&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;worksListUrl&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;https://www.goodreads.com/author/list/14465.K_ji_Suzuki&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;kcrPreviewUrl&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#cb4b16&#34;&gt;null&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;html&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;A mysterious videotape warns that the viewer will die in one week unless a certain, unspecified act is performed. Exactly one week after watching the tape, four teenagers die…&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;truncated&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#cb4b16&#34;&gt;true&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;fullContentUrl&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;https://www.goodreads.com/book/show/38379.Ring&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;What&amp;rsquo;s more, we have an image URL right there in the response!&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://i.gr-assets.com/images/S/compressed.photo.goodreads.com/books/1388494987i/38379._SY75_.jpg&#34; alt=&#34;Ring cover&#34;&gt;&lt;/p&gt;
&lt;p&gt;Almost! If only this image was the full cover. It turns out that it is, sort of. If we drop the &lt;code&gt;._SY75_&lt;/code&gt; we&amp;rsquo;ll see the &amp;ldquo;full size image&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://i.gr-assets.com/images/S/compressed.photo.goodreads.com/books/1388494987i/38379.jpg&#34; alt=&#34;Ring cover&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;SY75&lt;/code&gt; seems to be some sort of scaling, maybe. If you play around with that you can get back different size images up to what is likely the maximum size. Now we are getting somewhere and we have enough to create our basic short-code!&lt;/p&gt;
&lt;p&gt;But first, let&amp;rsquo;s talk about the third drawback - the eventual loss of images. The way the short-code would work is to build out an &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; link, Hugo can&amp;rsquo;t download the images. This means the image data remains on a remote server. I can envision one way to work on getting out from under that which would not require attempting to mirror all the images. A simple proxy which looked locally for downloaded images before passing the request upstream would work. This would be &amp;ldquo;easy&amp;rdquo; to setup I think - but it&amp;rsquo;s beyond what we are trying to do right now.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;shortcode&#34;&gt;Shortcode&lt;/h2&gt;
&lt;p&gt;I am still new to working with Hugo templating so there may be better methods to accomplish this but it works. In my theme I have a file at &lt;code&gt;layouts/shortcodes/book.html&lt;/code&gt;. Here we&amp;rsquo;ll take a closer look at what is in it, the complete code can be found a bit further down. I think I may need to make a short-code repo on GitHub as well. I&amp;rsquo;ll add a link here if/when I do.&lt;/p&gt;
&lt;p&gt;First, we&amp;rsquo;ll declare a variable and assign the URL to an image that says &amp;ldquo;image not available&amp;rdquo;. We&amp;rsquo;ll use this as our image if nothing comes back from the API.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{{ $fin := &amp;#34;https://books.google.com/books/content?id=DRlhnQEACAAJ&amp;amp;printsec=frontcover&amp;amp;img=1&amp;amp;zoom=2&amp;amp;source=gbs_api&amp;#34; }}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Next we will set our API URLs. We&amp;rsquo;ll also put together our query parameters. This sets us up to use &lt;code&gt;getJSON&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{{ $grUrlPre := &amp;#34;https://www.goodreads.com/book/auto_complete&amp;#34; }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{{ $googUrlPre := &amp;#34;https://www.googleapis.com/books/v1/volumes&amp;#34; }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{{ $grIsbn := printf &amp;#34;%s%s&amp;#34; &amp;#34;?format=json&amp;amp;q=&amp;#34; .Params.isbn }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{{ $googIsbn := printf &amp;#34;%s%s&amp;#34; &amp;#34;?q=isbn:&amp;#34; .Params.isbn }}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We make two calls out to the APIs. I thought about checking one and then the other only if needed. In the end though I think it keeps the snippet much easier to read. After all what&amp;rsquo;s one more &lt;code&gt;GET&lt;/code&gt; request? Anyway, we store the resulting object in a variable.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{{ $grJ := getJSON $grUrlPre $grIsbn }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{{ $googJ := getJSON $googUrlPre $googIsbn }}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Since we are more concerned with Goodreads we&amp;rsquo;ll check that first to make sure that the length of the object is larger then 0. If it is then we next assign the first object within the response to a variable. Within that object we&amp;rsquo;ll pull out the &lt;code&gt;imageUrl&lt;/code&gt; value and using regular expression select and replace the &amp;ldquo;scaling&amp;rdquo; tag, &lt;code&gt;._SY75_.&lt;/code&gt; with just a &lt;code&gt;.&lt;/code&gt;. That&amp;rsquo;s the end so just write out or final HTML.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{{ if gt (len $grJ) 0 }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  {{ $i := index $grJ 0 }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  {{ $fin := replaceRE &amp;#34;._.*_.&amp;#34; &amp;#34;.&amp;#34; $i.imageUrl }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &amp;lt;&lt;span style=&#34;color:#268bd2&#34;&gt;img&lt;/span&gt; src&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;{{ $fin }}&amp;#34;&lt;/span&gt; class&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;book_cover&amp;#34;&lt;/span&gt;/&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;But, what if?! Well, we can carry on over to the Google API response if needed. We start of the same, checking that the response has data. If it does have data again we assume that the first portion of the object is what we want. In this example, because we can&amp;rsquo;t be sure if a larger image exists I am using &lt;code&gt;volumeInfo.imageLinks.thumbnail&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{{ else if gt ($googJ.totalItems) 0 }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  {{ $i := index $googJ.items 0 }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &amp;lt;&lt;span style=&#34;color:#268bd2&#34;&gt;img&lt;/span&gt; src&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;{{ $i.volumeInfo.imageLinks.thumbnail }}&amp;#34;&lt;/span&gt; class&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;book_cover&amp;#34;&lt;/span&gt;/&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And if all that went off the rails? The we default to displaying our image not available image.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{{ else}}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &amp;lt;&lt;span style=&#34;color:#268bd2&#34;&gt;img&lt;/span&gt; src&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;{{ $fin }} class=&amp;#34;&lt;/span&gt;book_cover&amp;#34;&amp;#34;/&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{{ end }}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;layouts/shortcodes/book.html&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{{ $fin := &amp;#34;https://books.google.com/books/content?id=DRlhnQEACAAJ&amp;amp;printsec=frontcover&amp;amp;img=1&amp;amp;zoom=2&amp;amp;source=gbs_api&amp;#34; }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{{ $grUrlPre := &amp;#34;https://www.goodreads.com/book/auto_complete&amp;#34; }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{{ $googUrlPre := &amp;#34;https://www.googleapis.com/books/v1/volumes&amp;#34; }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{{ $grIsbn := printf &amp;#34;%s%s&amp;#34; &amp;#34;?format=json&amp;amp;q=&amp;#34; .Params.isbn }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{{ $googIsbn := printf &amp;#34;%s%s&amp;#34; &amp;#34;?q=isbn:&amp;#34; .Params.isbn }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{{ $grJ := getJSON $grUrlPre $grIsbn }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{{ $googJ := getJSON $googUrlPre $googIsbn }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  {{ if gt (len $grJ) 0 }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {{ $i := index $grJ 0 }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {{ $fin := replaceRE &amp;#34;._.*_.&amp;#34; &amp;#34;.&amp;#34; $i.imageUrl }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;&lt;span style=&#34;color:#268bd2&#34;&gt;img&lt;/span&gt; src&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;{{ $fin }}&amp;#34;&lt;/span&gt; class&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;book_cover&amp;#34;&lt;/span&gt;/&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  {{ else if gt ($googJ.totalItems) 0 }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {{ $i := index $googJ.items 0 }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;&lt;span style=&#34;color:#268bd2&#34;&gt;img&lt;/span&gt; src&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;{{ $i.volumeInfo.imageLinks.thumbnail }}&amp;#34;&lt;/span&gt; class&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;book_cover&amp;#34;&lt;/span&gt;/&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  {{ else}}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;&lt;span style=&#34;color:#268bd2&#34;&gt;img&lt;/span&gt; src&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;{{ $fin }}&amp;#34;&lt;/span&gt; class&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;book_cover&amp;#34;&lt;/span&gt;/&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  {{ end }}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;usage&#34;&gt;Usage&lt;/h2&gt;
&lt;p&gt;That&amp;rsquo;s great but how does it work? Next time you are writing a post add:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-txt&#34; data-lang=&#34;txt&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{{&amp;amp;lt; book isbn=&amp;#34;9781493415465&amp;#34; &amp;amp;gt;}}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;Note, that Hugo was having a heck of a time not actually using this as a short-code. You may need to covert the great-than and less-than signs back to symbols&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;If all goes well you should see your cover image. Note that we have done no styling so you could end up with an image that&amp;rsquo;s to larger (or even too small).&lt;/p&gt;
&lt;p&gt;Over the next little while I&amp;rsquo;ll see if we can get our covers to display as a gallery, like the photos do. Until next time&amp;hellip;&lt;/p&gt;
&lt;hr&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&#34;text-align:center&#34;&gt;Enjoy this post?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;&lt;a href=&#34;https://ko-fi.com/shindakun&#34;&gt;How about buying me a coffee?&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
</description>
    </item>
    
    <item>
      <title>Webmentions are Great (Mostly)</title>
      <link>https://shindakun.dev/posts/webmentions-are-great-mostly/</link>
      <pubDate>Thu, 26 Dec 2019 22:54:29 -0800</pubDate>
      
      <guid>https://shindakun.dev/posts/webmentions-are-great-mostly/</guid>
      <description>&lt;h2 id=&#34;oh-no&#34;&gt;Oh No&lt;/h2&gt;
&lt;p&gt;Why are there two author icons?! We&amp;rsquo;ll get back to that in a moment.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;webmetion-bliss&#34;&gt;Webmetion Bliss&lt;/h2&gt;
&lt;p&gt;After setting up and &lt;a href=&#34;https://shindakun.dev/posts/adding-webmentions-to-microblog/&#34;&gt;documenting&lt;/a&gt; how I deployed webmentions on micro.blog it got picked up by a few people on the site! That was really nice - especially since it worked for the most part. I attempted to make it as clear as possible so others could follow in my footsteps and I succeeded - a few people got set up and were running with mentions. There is a great example over on &lt;a href=&#34;https://miraz.me/2019/12/21/thanks-to-shindakun.html&#34;&gt;Miraz Jordan&amp;rsquo;s&lt;/a&gt; site, which you can see a snippet of below.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://shindakun.dev/imgs/webmentions-great-01.png&#34; alt=&#34;webmentions-great-01&#34;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;the-troubles&#34;&gt;The Troubles&lt;/h2&gt;
&lt;p&gt;All is not perfect though. So, I thought I&amp;rsquo;d touch on some of that here. First, if you were to look at the interactions on Miraz&amp;rsquo;s site you would see some &amp;ldquo;likes&amp;rdquo; down near the bottom that rendered with just an icon and a data. Those posts came from &lt;a href=&#34;https://www.mathewpacker.com/2019/12/2523/&#34;&gt;Mathew Packer&lt;/a&gt; testing out site to site replies.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://shindakun.dev/imgs/webmentions-great-02.png&#34; alt=&#34;webmentions-great-02&#34;&gt;&lt;/p&gt;
&lt;p&gt;For some reason those are coming out of webmention.io with what looks to be incorrectly parsed values. Note the &lt;code&gt;&#39;&#39;&lt;/code&gt; where you would expect a comment or, more likely, a title to appear.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sentence: &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;https://www.mathewpacker.com/2019/12/2523/ posted &amp;#39;&amp;#39; linking to https://miraz.me/2019/12/21/thanks-to-shindakun.html&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Though in this case it doesn&amp;rsquo;t matter since we are not rendering the &lt;code&gt;sentence&lt;/code&gt; (or &lt;code&gt;sentence_html&lt;/code&gt;). I believe the JSON issue might be why the original implementation for webmention.js didn&amp;rsquo;t show &amp;ldquo;shares&amp;rdquo; or &amp;ldquo;likes&amp;rdquo; with text and just showed an author picture and name. I don&amp;rsquo;t use Wordpress so I am not sure just how far I may troubleshoot that - seems like the &amp;ldquo;Post Kinds&amp;rdquo; plugin might not be formatting the post 100% correctly.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;problems-at-home&#34;&gt;Problems at Home&lt;/h2&gt;
&lt;p&gt;That brings us back to the header image. A few days after the post went up I back ported my changes to my local Hugo theme and pushed them live. Within a day or so I had a few interactions.&lt;a href=&#34;https://boffosocko.com/2019/12/22/55762703/&#34;&gt;Chris Aldrich&lt;/a&gt; posted a reply to a post by &lt;a href=&#34;https://jlelse.blog/thoughts/2019/12/indieweb-dream/&#34;&gt;Jan-Lukas Else&lt;/a&gt; which linked back to the implementation post. However, it was showing two author photos.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://shindakun.dev/imgs/webmentions-great-00.png&#34; alt=&#34;webmentions-great-00&#34;&gt;&lt;/p&gt;
&lt;p&gt;At first I figured that the JavaScript parsing the webmention data was incorrect. However, nothing jumped out as an issue. I then used a &lt;a href=&#34;https://pin13.net/mf2/?url=https%3A%2F%2Fboffosocko.com%2F2019%2F12%2F22%2F55762703%2F&#34;&gt;microformat2 parser&lt;/a&gt; to see if I could pin down the cause from the original mention.&lt;/p&gt;
&lt;p&gt;Behold! It turns out that within the reply post &lt;a href=&#34;https://jetpack.com/support/lazy-images/&#34;&gt;Jetpack Lazy Image&lt;/a&gt; loading is causing the reply-to author block to end up with an array of images. This seems to bubble back up through the content that webmentions.io is sending to my page.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://shindakun.dev/imgs/webmentions-great-03.png&#34; alt=&#34;webmentions-great-03&#34;&gt;&lt;/p&gt;
&lt;p&gt;In this case I could render the &lt;code&gt;sentence_html&lt;/code&gt; and not the content but then I&amp;rsquo;d lose out some nice conversation context.&lt;/p&gt;
&lt;p&gt;I noticed one other thing that I&amp;rsquo;ll need to keep an eye out for and see if I can work around. Most replies aren&amp;rsquo;t going to have a title so you may end up with something like the following, where what we are replying to is blank.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://shindakun.dev/imgs/webmentions-great-05.png&#34; alt=&#34;webmentions-great-04&#34;&gt;&lt;/p&gt;
&lt;p&gt;I have some off looking replies on the webmention post mostly due to bad CSS. And the fact that I appear to have messed up the CSS I was using for content with no author image isn&amp;rsquo;t great. It makes it difficult to see if the issue is something I&amp;rsquo;ve done.&lt;/p&gt;
&lt;p&gt;I should get those fixed up&amp;hellip; and then I need to take a much closer look at the &lt;code&gt;webmention.js&lt;/code&gt; and it&amp;rsquo;s associated CSS.&lt;/p&gt;
&lt;p&gt;Ack! Seems rendering the entire content load of a &amp;ldquo;share&amp;rdquo; means an entire article might get shared. Will have to look at that closer as well, maybe tomorrow.&lt;/p&gt;
&lt;hr&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&#34;text-align:center&#34;&gt;Enjoy this post?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;&lt;a href=&#34;https://ko-fi.com/shindakun&#34;&gt;How about buying me a coffee?&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
</description>
    </item>
    
    <item>
      <title>Adding Webmentions To micro.blog</title>
      <link>https://shindakun.dev/posts/adding-webmentions-to-microblog/</link>
      <pubDate>Fri, 13 Dec 2019 23:16:31 -0800</pubDate>
      
      <guid>https://shindakun.dev/posts/adding-webmentions-to-microblog/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Last update 12/21/19&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;removed reply count buttons HTML and JS&lt;/li&gt;
&lt;li&gt;adding a note about switching to native micro.blog webmentions in the future&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Past updates&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;added &lt;code&gt;&amp;lt;ul&amp;gt;&lt;/code&gt; for shares back in&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;background&#34;&gt;Background&lt;/h2&gt;
&lt;p&gt;As part of getting back into using micro.blog I&amp;rsquo;ve been working to customize my hosted site. One of the things I wanted to do was add webmentions rather then comments like Disqus. Webmentions are coming to MB at some point and most themes already contain references to them:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#268bd2&#34;&gt;link&lt;/span&gt; rel&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;webmention&amp;#34;&lt;/span&gt; href&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;https://micro.blog/webmention&amp;#34;&lt;/span&gt; /&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I didn&amp;rsquo;t want to wait though and we don&amp;rsquo;t need to thanks to &lt;a href=&#34;https://webmention.io/&#34;&gt;Webmention.io&lt;/a&gt;! I&amp;rsquo;m going to try and document exactly what I did through this post. Parts of it will be specific to the theme I&amp;rsquo;m using, &lt;a href=&#34;https://github.com/microdotblog/theme-hello&#34;&gt;Hello&lt;/a&gt; in this case but, hopefully will have enough detail that anyone can follow.&lt;/p&gt;
&lt;h3 id=&#34;to-be-clear-if-you-use-this-method-you-may-lose-some-mentions-sent-to-the-external-endpoint-if-you-switch-from-webmentionsio-back-to-the-native-microblog-webmention-endpoint-once-its-live&#34;&gt;To be clear, if you use this method you may lose some mentions sent to the external endpoint if you switch from webmentions.io back to the native micro.blog webmention endpoint once it&amp;rsquo;s live&lt;/h3&gt;
&lt;p&gt;This isn&amp;rsquo;t new territory but I thought it&amp;rsquo;d be nice to record exactly what I did to get this working on micro.blog. In fact, I hacked most of this in place based on code released by &lt;a href=&#34;https://keithjgrant.com/posts/2019/02/adding-webmention-support-to-a-static-site/&#34;&gt;Keith Grant&lt;/a&gt;. Thanks Keith!&lt;/p&gt;
&lt;h2 id=&#34;pre-requisites&#34;&gt;Pre-requisites&lt;/h2&gt;
&lt;p&gt;To get started you really only need a few things:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;a micro.blog hosted blog or a static website you want to add webmentions to&lt;/li&gt;
&lt;li&gt;a custom theme&lt;/li&gt;
&lt;li&gt;basic web development skills (some HTML/JavaScript)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;As I mentioned in the &lt;a href=&#34;https://shindakun.dev/posts/adding-an-image-lightbox-to-microblog/&#34;&gt;lightbox post&lt;/a&gt;, @manton has a great &lt;a href=&#34;https://www.youtube.com/watch?v=MLUWnrMKVdg&#34;&gt;YouTube video&lt;/a&gt; which covers the basics of getting up and running with a theme. I will be referring to the web based editor but you don&amp;rsquo;t really need to use that if you want to make changes locally and then push to Git.&lt;/p&gt;
&lt;h2 id=&#34;webmention&#34;&gt;Webmention&lt;/h2&gt;
&lt;p&gt;First thing to do is to visit &lt;a href=&#34;https://webmention.io/&#34;&gt;Webmention.io&lt;/a&gt;. Here we&amp;rsquo;re going to paste in our Micro.blog URL.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://shindakun.dev/imgs/webmentions-01.png&#34; alt=&#34;webmention-01&#34;&gt;&lt;/p&gt;
&lt;p&gt;After signing in we&amp;rsquo;ll be brought to the dash board. We are currently only concerned about the to &lt;code&gt;&amp;lt;link&amp;gt;&lt;/code&gt;&amp;rsquo;s in the setup section.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://shindakun.dev/imgs/webmentions-02.png&#34; alt=&#34;webmention-02&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;headspace&#34;&gt;HeadSpace&lt;/h2&gt;
&lt;p&gt;Step one out of the way we&amp;rsquo;ll need to edit our theme header to include these links. In this example I&amp;rsquo;m using the Hyde theme. From here on this will vary from theme to theme but hopefully not too much.&lt;/p&gt;
&lt;p&gt;We need to, at this point make sure we&amp;rsquo;ve read up on &lt;a href=&#34;https://help.micro.blog/2019/about-themes/&#34;&gt;custom themes&lt;/a&gt;. I can wait, take your time. Go head and switch over to a custom theme if you aren&amp;rsquo;t already using one.&lt;/p&gt;
&lt;p&gt;Alight lets continue.&lt;/p&gt;
&lt;p&gt;To get to the micro.blog theme editor goto your &amp;ldquo;Posts&amp;rdquo; page, then click on &amp;ldquo;Design&amp;rdquo;. Scroll down and click on &amp;ldquo;Edit Custom Themes&amp;rdquo;. Now choose the theme you want to edit.&lt;/p&gt;
&lt;p&gt;You should now see something similar to the following.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://shindakun.dev/imgs/webmentions-03.png&#34; alt=&#34;webmentions-03&#34;&gt;&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;ll first edit &lt;code&gt;layouts/partials/head.html&lt;/code&gt;. Again this may be slightly different for the theme you are using. Our first change is to pull out the micro.blog webmentions placeholder. So find:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://shindakun.dev/imgs/webmentions-04.png&#34; alt=&#34;webmentions-04&#34;&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#268bd2&#34;&gt;link&lt;/span&gt; rel&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;webmention&amp;#34;&lt;/span&gt; href&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;https://micro.blog/webmention&amp;#34;&lt;/span&gt; /&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Found it! Now paste our webmentions.io links in it&amp;rsquo;s place. For me that would be:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#268bd2&#34;&gt;link&lt;/span&gt; rel&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;webmention&amp;#34;&lt;/span&gt; href&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;https://webmention.io/shindakun-test.micro.blog/webmention&amp;#34;&lt;/span&gt; /&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#268bd2&#34;&gt;link&lt;/span&gt; rel&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;pingback&amp;#34;&lt;/span&gt; href&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;https://webmention.io/shindakun-test.micro.blog/xmlrpc&amp;#34;&lt;/span&gt; /&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Click &amp;ldquo;Update Template&amp;rdquo; button to save changes. One down.&lt;/p&gt;
&lt;h2 id=&#34;htmling&#34;&gt;HTMLing&lt;/h2&gt;
&lt;p&gt;Alright, now we should get some stuff into the template in order to actually show the mentions. This will be kind of barebones and may not be very pretty, I&amp;rsquo;ll leave the CSSing to the reader - that comes later though. For now we need to edit our single post HTML. For Hyde that is &lt;code&gt;layouts/post/single.html&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://shindakun.dev/imgs/webmentions-05.png&#34; alt=&#34;webmentions-05&#34;&gt;&lt;/p&gt;
&lt;p&gt;If you look at the screenshot above you&amp;rsquo;ll see about where we are going to add our HTML. For now we&amp;rsquo;ll put it after the &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; that is just under &lt;code&gt;{{ .Content }}&lt;/code&gt;. And below you can find that HTML - I decided it was easiest to just include it here, even though its quite a big block.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;&amp;lt;!-- First we have out reply and like template HTML --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#268bd2&#34;&gt;template&lt;/span&gt; id&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;reply-template&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &amp;lt;&lt;span style=&#34;color:#268bd2&#34;&gt;li&lt;/span&gt; class&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;h-entry&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;&lt;span style=&#34;color:#268bd2&#34;&gt;div&lt;/span&gt; class&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;comment-note&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &amp;lt;&lt;span style=&#34;color:#268bd2&#34;&gt;div&lt;/span&gt; class&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;comment-note__avatar&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &amp;lt;&lt;span style=&#34;color:#268bd2&#34;&gt;a&lt;/span&gt; class&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;js-author&amp;#34;&lt;/span&gt; href&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &amp;lt;&lt;span style=&#34;color:#268bd2&#34;&gt;img&lt;/span&gt; class&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;comment-avatar u-photo js-avatar&amp;#34;&lt;/span&gt; src&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;/&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &amp;lt;/&lt;span style=&#34;color:#268bd2&#34;&gt;a&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &amp;lt;/&lt;span style=&#34;color:#268bd2&#34;&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &amp;lt;&lt;span style=&#34;color:#268bd2&#34;&gt;div&lt;/span&gt; class&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;comment-note__body&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &amp;lt;&lt;span style=&#34;color:#268bd2&#34;&gt;div&lt;/span&gt; class&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;p-author&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &amp;lt;&lt;span style=&#34;color:#268bd2&#34;&gt;a&lt;/span&gt; class&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;comment-author u-author js-author-name&amp;#34;&lt;/span&gt; href&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&amp;gt;&amp;lt;/&lt;span style=&#34;color:#268bd2&#34;&gt;a&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &amp;lt;&lt;span style=&#34;color:#268bd2&#34;&gt;a&lt;/span&gt; class&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;comment-timestamp u-url js-date js-source&amp;#34;&lt;/span&gt; href&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&amp;gt;&amp;lt;/&lt;span style=&#34;color:#268bd2&#34;&gt;a&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &amp;lt;/&lt;span style=&#34;color:#268bd2&#34;&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &amp;lt;&lt;span style=&#34;color:#268bd2&#34;&gt;div&lt;/span&gt; class&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;comment-body js-content e-entry&amp;#34;&lt;/span&gt;&amp;gt;&amp;lt;/&lt;span style=&#34;color:#268bd2&#34;&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &amp;lt;/&lt;span style=&#34;color:#268bd2&#34;&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;/&lt;span style=&#34;color:#268bd2&#34;&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &amp;lt;/&lt;span style=&#34;color:#268bd2&#34;&gt;li&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;/&lt;span style=&#34;color:#268bd2&#34;&gt;template&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#268bd2&#34;&gt;template&lt;/span&gt; id&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;like-template&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &amp;lt;&lt;span style=&#34;color:#268bd2&#34;&gt;li&lt;/span&gt; class&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;h-entry&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;&lt;span style=&#34;color:#268bd2&#34;&gt;div&lt;/span&gt; class&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;reply h-card p-author&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &amp;lt;&lt;span style=&#34;color:#268bd2&#34;&gt;a&lt;/span&gt; class&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;reply__bar u-url js-source&amp;#34;&lt;/span&gt; href&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &amp;lt;&lt;span style=&#34;color:#268bd2&#34;&gt;div&lt;/span&gt; class&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;reply__author p-name js-sentence js-author-name&amp;#34;&lt;/span&gt; href&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&amp;gt;&amp;lt;/&lt;span style=&#34;color:#268bd2&#34;&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &amp;lt;&lt;span style=&#34;color:#268bd2&#34;&gt;div&lt;/span&gt; class&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;reply__date js-date&amp;#34;&lt;/span&gt; href&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&amp;gt;&amp;lt;/&lt;span style=&#34;color:#268bd2&#34;&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &amp;lt;/&lt;span style=&#34;color:#268bd2&#34;&gt;a&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &amp;lt;&lt;span style=&#34;color:#268bd2&#34;&gt;a&lt;/span&gt; class&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;reply__avatar u-author js-author&amp;#34;&lt;/span&gt; href&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &amp;lt;&lt;span style=&#34;color:#268bd2&#34;&gt;img&lt;/span&gt; class&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;u-photo js-avatar&amp;#34;&lt;/span&gt; src&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;/&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &amp;lt;/&lt;span style=&#34;color:#268bd2&#34;&gt;a&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;/&lt;span style=&#34;color:#268bd2&#34;&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &amp;lt;/&lt;span style=&#34;color:#268bd2&#34;&gt;li&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;/&lt;span style=&#34;color:#268bd2&#34;&gt;template&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;&amp;lt;!-- The webmentions.js file we look at in a bit will fill out our lists --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#268bd2&#34;&gt;ul&lt;/span&gt; class&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;replies&amp;#34;&lt;/span&gt; id&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;replies&amp;#34;&lt;/span&gt;&amp;gt;&amp;lt;/&lt;span style=&#34;color:#268bd2&#34;&gt;ul&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#268bd2&#34;&gt;ul&lt;/span&gt; class&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;likes&amp;#34;&lt;/span&gt; id&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;likes&amp;#34;&lt;/span&gt;&amp;gt;&amp;lt;/&lt;span style=&#34;color:#268bd2&#34;&gt;ul&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#268bd2&#34;&gt;ul&lt;/span&gt; class&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;shares&amp;#34;&lt;/span&gt; id&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;shares&amp;#34;&lt;/span&gt;&amp;gt;&amp;lt;/&lt;span style=&#34;color:#268bd2&#34;&gt;ul&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#268bd2&#34;&gt;div&lt;/span&gt; id&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;comments&amp;#34;&lt;/span&gt;&amp;gt;&amp;lt;/&lt;span style=&#34;color:#268bd2&#34;&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;&amp;lt;!-- I&amp;#39;m including this here to make sure it&amp;#39;s only used on the single post page. We&amp;#39;ll get into this a bit later. --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#268bd2&#34;&gt;script&lt;/span&gt; type&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;text/javascript&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#b58900&#34;&gt;document&lt;/span&gt;.addEventListener(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#39;DOMContentLoaded&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#268bd2&#34;&gt;function&lt;/span&gt; () {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    fetchWebmentions({{ .Permalink }}, {{ .Aliases }});
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  });
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;/&lt;span style=&#34;color:#268bd2&#34;&gt;script&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Once more, click on &amp;ldquo;Update Template&amp;rdquo; to save our changes. Saving brings us back to the template file list - which works out quite nicely.&lt;/p&gt;
&lt;h2 id=&#34;javascripty&#34;&gt;JavaScripty&lt;/h2&gt;
&lt;p&gt;On the file list screen click the &amp;ldquo;New Template&amp;rdquo; button. This should really say &amp;ldquo;New File&amp;rdquo; since we&amp;rsquo;re not creating a whole new template but&amp;hellip; We should now be looking at an empty text-box. This time we need to note where we want this file to be, in my case to stick with the theme convention I&amp;rsquo;ll use &lt;code&gt;static/js/webmentions.js&lt;/code&gt;. This path may change slightly depending on how the theme or you want it to be - for instance in the Hello theme it might be &lt;code&gt;static/assets/webmentions.js&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://shindakun.dev/imgs/webmentions-06.png&#34; alt=&#34;webmentions-06&#34;&gt;&lt;/p&gt;
&lt;p&gt;Into the actual code text-box we&amp;rsquo;ll need to paste the following JavaScript. There&amp;rsquo;s quite a bit. I&amp;rsquo;ve tested this on two micro.blog sites and it seems to work OK, your milage may vary though. I&amp;rsquo;m going to put a few comments in just to try and describe a bit of what&amp;rsquo;s happening in places. I&amp;rsquo;m not going to go to crazy though so a little JavaScript to general programming knowledge is probably helpful here.&lt;/p&gt;
&lt;p&gt;You&amp;rsquo;ll need to supply you&amp;rsquo;re own anonymous avatar image for any mentions that don&amp;rsquo;t have an image.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;// You will need to supply an image, for MB hosted blogs I
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;// recommend uploading  to the image gallery and then pasting
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;// the link in here
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;const&lt;/span&gt; ANON_AVATAR &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#39;/images/anon-avatar.png&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;// fetchWebmentions retireves the actual messages for the URL
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;// passed in. First we check to see if we&amp;#39;re on a page that
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;// has a comment `div` and then if no URL is passed in we&amp;#39;ll
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;// put one together from the current page and fetch webmentions.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;function&lt;/span&gt; fetchWebmentions(url, aliases) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#719e07&#34;&gt;!&lt;/span&gt;&lt;span style=&#34;color:#b58900&#34;&gt;document&lt;/span&gt;.getElementById(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#39;comments&amp;#39;&lt;/span&gt;)) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#719e07&#34;&gt;return&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#719e07&#34;&gt;!&lt;/span&gt;url) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    url &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#b58900&#34;&gt;document&lt;/span&gt;.location.origin &lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#b58900&#34;&gt;document&lt;/span&gt;.location.pathname;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#268bd2&#34;&gt;const&lt;/span&gt; targets &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; getUrlPermutations(url, aliases);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#268bd2&#34;&gt;var&lt;/span&gt; script &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#b58900&#34;&gt;document&lt;/span&gt;.createElement(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#39;script&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#268bd2&#34;&gt;var&lt;/span&gt; src &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#39;https://webmention.io/api/mentions?perPage=500&amp;amp;jsonp=parseWebmentions&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  targets.forEach(&lt;span style=&#34;color:#268bd2&#34;&gt;function&lt;/span&gt;(targetUrl) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    src &lt;span style=&#34;color:#719e07&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#586e75&#34;&gt;`&amp;amp;target[]=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#b58900&#34;&gt;encodeURIComponent&lt;/span&gt;(targetUrl)&lt;span style=&#34;color:#2aa198&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;`&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  });
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  src &lt;span style=&#34;color:#719e07&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#586e75&#34;&gt;`&amp;amp;_=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#b58900&#34;&gt;Math&lt;/span&gt;.random()&lt;span style=&#34;color:#2aa198&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;`&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  script.src &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; src;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  script.&lt;span style=&#34;color:#268bd2&#34;&gt;async&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#cb4b16&#34;&gt;true&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#b58900&#34;&gt;document&lt;/span&gt;.getElementsByTagName(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#39;head&amp;#39;&lt;/span&gt;)[&lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;].appendChild(script);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;// getUrlPermutations builds up a list of potential URLs to
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;// check for mentions on. You will need to update the URLs
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;// to point to your own MB instance. The `localhost:1313` one
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;// can probably be removed unless your going to be testing
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;// the theme locally with Hugo.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;function&lt;/span&gt; getUrlPermutations(url, aliases) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#268bd2&#34;&gt;const&lt;/span&gt; urls &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; [];
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  url &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; url.replace(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#39;http://localhost:1313&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#39;https://shindakun-test.micro.blog/&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  urls.push(url);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  urls.push(url.replace(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#39;https://&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#39;http://&amp;#39;&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; (url.substr(&lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;) &lt;span style=&#34;color:#719e07&#34;&gt;===&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#39;/&amp;#39;&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#268bd2&#34;&gt;var&lt;/span&gt; noslash &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; url.substr(&lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;, url.length &lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    urls.push(noslash);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    urls.push(noslash.replace(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#39;https://&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#39;http://&amp;#39;&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; (aliases) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    aliases.forEach(&lt;span style=&#34;color:#268bd2&#34;&gt;function&lt;/span&gt;(alias) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      urls.push(&lt;span style=&#34;color:#586e75&#34;&gt;`https://shindakun-test.micro.blog/&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;${&lt;/span&gt;alias&lt;span style=&#34;color:#2aa198&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;`&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    });
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;return&lt;/span&gt; urls;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;function&lt;/span&gt; parseWebmentions(data) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#268bd2&#34;&gt;var&lt;/span&gt; links &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; data.links.sort(wmSort);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#268bd2&#34;&gt;var&lt;/span&gt; likes &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; [];
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#268bd2&#34;&gt;var&lt;/span&gt; reposts &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; [];
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#268bd2&#34;&gt;var&lt;/span&gt; replies &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; [];
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  links.map(&lt;span style=&#34;color:#268bd2&#34;&gt;function&lt;/span&gt;(l) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#719e07&#34;&gt;!&lt;/span&gt;l.activity &lt;span style=&#34;color:#719e07&#34;&gt;||&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;!&lt;/span&gt;l.activity.type) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      console.warning(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#39;unknown link type&amp;#39;&lt;/span&gt;, l);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#719e07&#34;&gt;return&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#719e07&#34;&gt;!&lt;/span&gt;l.verified) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#719e07&#34;&gt;return&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#719e07&#34;&gt;switch&lt;/span&gt; (l.activity.type) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#719e07&#34;&gt;case&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#39;like&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        likes.push(l);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#719e07&#34;&gt;break&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#719e07&#34;&gt;case&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#39;repost&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#719e07&#34;&gt;case&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#39;link&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        reposts.push(l);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#719e07&#34;&gt;break&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#719e07&#34;&gt;default&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        replies.push(l);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#719e07&#34;&gt;break&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  });
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  renderLikes(likes);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  renderReposts(reposts);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  renderReplies(replies);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  showInteractions();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#b58900&#34;&gt;window&lt;/span&gt;.parseWebmentions &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; parseWebmentions;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;function&lt;/span&gt; wmSort(a, b) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#268bd2&#34;&gt;const&lt;/span&gt; dateA &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; getWmDate(a);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#268bd2&#34;&gt;const&lt;/span&gt; dateB &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; getWmDate(b);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; (dateA &lt;span style=&#34;color:#719e07&#34;&gt;&amp;lt;&lt;/span&gt; dateB) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#719e07&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  } &lt;span style=&#34;color:#719e07&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; (dateB &lt;span style=&#34;color:#719e07&#34;&gt;&amp;lt;&lt;/span&gt; dateA) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#719e07&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;function&lt;/span&gt; getWmDate(webmention) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; (webmention.data.published) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#719e07&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#b58900&#34;&gt;Date&lt;/span&gt;(webmention.data.published);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#b58900&#34;&gt;Date&lt;/span&gt;(webmention.verified_date);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;var&lt;/span&gt; months &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#39;Jan&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#39;Feb&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#39;Mar&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#39;Apr&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#39;May&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#39;Jun&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#39;Jul&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#39;Aug&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#39;Sep&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#39;Oct&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#39;Nov&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#39;Dec&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;function&lt;/span&gt; renderLikes(likes) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#268bd2&#34;&gt;var&lt;/span&gt; t &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#b58900&#34;&gt;document&lt;/span&gt;.getElementById(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#39;like-template&amp;#39;&lt;/span&gt;).content;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#268bd2&#34;&gt;var&lt;/span&gt; list &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#b58900&#34;&gt;document&lt;/span&gt;.getElementById(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#39;likes&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  likes.map(&lt;span style=&#34;color:#268bd2&#34;&gt;function&lt;/span&gt;(l) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    console.log(l)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    fillTemplate(t, {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      photo&lt;span style=&#34;color:#719e07&#34;&gt;:&lt;/span&gt; l.data.author.photo &lt;span style=&#34;color:#719e07&#34;&gt;||&lt;/span&gt; ANON_AVATAR,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      name&lt;span style=&#34;color:#719e07&#34;&gt;:&lt;/span&gt; l.data.author.name,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      authorUrl&lt;span style=&#34;color:#719e07&#34;&gt;:&lt;/span&gt; l.data.author.url,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      url&lt;span style=&#34;color:#719e07&#34;&gt;:&lt;/span&gt; l.data.url,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      sentence&lt;span style=&#34;color:#719e07&#34;&gt;:&lt;/span&gt; l.activity.sentence,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      date&lt;span style=&#34;color:#719e07&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#b58900&#34;&gt;Date&lt;/span&gt;(l.data.published &lt;span style=&#34;color:#719e07&#34;&gt;||&lt;/span&gt; l.verified_date),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    });
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#268bd2&#34;&gt;var&lt;/span&gt; clone &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#b58900&#34;&gt;document&lt;/span&gt;.importNode(t, &lt;span style=&#34;color:#cb4b16&#34;&gt;true&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    list.appendChild(clone);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  });
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;function&lt;/span&gt; getHostName(url) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#268bd2&#34;&gt;var&lt;/span&gt; a &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#b58900&#34;&gt;document&lt;/span&gt;.createElement(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#39;a&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  a.href &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; url;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;return&lt;/span&gt; (a.hostname &lt;span style=&#34;color:#719e07&#34;&gt;||&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;).replace(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#39;www.&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;function&lt;/span&gt; renderReposts(reposts) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#268bd2&#34;&gt;var&lt;/span&gt; t &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#b58900&#34;&gt;document&lt;/span&gt;.getElementById(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#39;like-template&amp;#39;&lt;/span&gt;).content;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#268bd2&#34;&gt;var&lt;/span&gt; list &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#b58900&#34;&gt;document&lt;/span&gt;.getElementById(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#39;shares&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  reposts.map(&lt;span style=&#34;color:#268bd2&#34;&gt;function&lt;/span&gt;(l) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#268bd2&#34;&gt;let&lt;/span&gt; data;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; (l.data.author) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      data &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        photo&lt;span style=&#34;color:#719e07&#34;&gt;:&lt;/span&gt; l.data.author.photo &lt;span style=&#34;color:#719e07&#34;&gt;||&lt;/span&gt; ANON_AVATAR,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        name&lt;span style=&#34;color:#719e07&#34;&gt;:&lt;/span&gt; l.data.author.name,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        authorUrl&lt;span style=&#34;color:#719e07&#34;&gt;:&lt;/span&gt; l.data.author.url,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        url&lt;span style=&#34;color:#719e07&#34;&gt;:&lt;/span&gt; l.data.url,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        date&lt;span style=&#34;color:#719e07&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#b58900&#34;&gt;Date&lt;/span&gt;(l.data.published &lt;span style=&#34;color:#719e07&#34;&gt;||&lt;/span&gt; l.verified_date),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      };
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    } &lt;span style=&#34;color:#719e07&#34;&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      data &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        photo&lt;span style=&#34;color:#719e07&#34;&gt;:&lt;/span&gt; ANON_AVATAR,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        name&lt;span style=&#34;color:#719e07&#34;&gt;:&lt;/span&gt; getHostName(l.data.url) &lt;span style=&#34;color:#719e07&#34;&gt;||&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#39;inbound link&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        authorUrl&lt;span style=&#34;color:#719e07&#34;&gt;:&lt;/span&gt; l.data.url,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        url&lt;span style=&#34;color:#719e07&#34;&gt;:&lt;/span&gt; l.data.url,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        date&lt;span style=&#34;color:#719e07&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#b58900&#34;&gt;Date&lt;/span&gt;(l.data.published &lt;span style=&#34;color:#719e07&#34;&gt;||&lt;/span&gt; l.verified_date),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      };
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    fillTemplate(t, data);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#268bd2&#34;&gt;var&lt;/span&gt; clone &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#b58900&#34;&gt;document&lt;/span&gt;.importNode(t, &lt;span style=&#34;color:#cb4b16&#34;&gt;true&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    list.appendChild(clone);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  });
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;function&lt;/span&gt; renderReplies(replies) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#268bd2&#34;&gt;var&lt;/span&gt; t &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#b58900&#34;&gt;document&lt;/span&gt;.getElementById(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#39;reply-template&amp;#39;&lt;/span&gt;).content;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#268bd2&#34;&gt;var&lt;/span&gt; list &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#b58900&#34;&gt;document&lt;/span&gt;.getElementById(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#39;replies&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  replies.map(&lt;span style=&#34;color:#268bd2&#34;&gt;function&lt;/span&gt;(l) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#268bd2&#34;&gt;let&lt;/span&gt; data;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; (l.data.author) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      data &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        photo&lt;span style=&#34;color:#719e07&#34;&gt;:&lt;/span&gt; l.data.author.photo &lt;span style=&#34;color:#719e07&#34;&gt;||&lt;/span&gt; ANON_AVATAR,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        name&lt;span style=&#34;color:#719e07&#34;&gt;:&lt;/span&gt; l.data.author.name,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        authorUrl&lt;span style=&#34;color:#719e07&#34;&gt;:&lt;/span&gt; l.data.author.url,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        url&lt;span style=&#34;color:#719e07&#34;&gt;:&lt;/span&gt; l.data.url,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        date&lt;span style=&#34;color:#719e07&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#b58900&#34;&gt;Date&lt;/span&gt;(l.data.published &lt;span style=&#34;color:#719e07&#34;&gt;||&lt;/span&gt; l.verified_date),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        content&lt;span style=&#34;color:#719e07&#34;&gt;:&lt;/span&gt; l.data.content,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      };
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    } &lt;span style=&#34;color:#719e07&#34;&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      data &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        photo&lt;span style=&#34;color:#719e07&#34;&gt;:&lt;/span&gt; ANON_AVATAR,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        name&lt;span style=&#34;color:#719e07&#34;&gt;:&lt;/span&gt; getHostName(l.data.url) &lt;span style=&#34;color:#719e07&#34;&gt;||&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#39;inbound link&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        authorUrl&lt;span style=&#34;color:#719e07&#34;&gt;:&lt;/span&gt; l.data.url,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        url&lt;span style=&#34;color:#719e07&#34;&gt;:&lt;/span&gt; l.data.url,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        date&lt;span style=&#34;color:#719e07&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#b58900&#34;&gt;Date&lt;/span&gt;(l.data.published &lt;span style=&#34;color:#719e07&#34;&gt;||&lt;/span&gt; l.verified_date),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        content&lt;span style=&#34;color:#719e07&#34;&gt;:&lt;/span&gt; l.data.content,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      };
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    fillTemplate(t, data);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#268bd2&#34;&gt;var&lt;/span&gt; clone &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#b58900&#34;&gt;document&lt;/span&gt;.importNode(t, &lt;span style=&#34;color:#cb4b16&#34;&gt;true&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    list.appendChild(clone);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  });
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;// fillTemplate marries a signle webmention to the
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;// template. The completed template is used in the
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;// render functions to actually display on the page.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;function&lt;/span&gt; fillTemplate(template, vals) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  template.querySelector(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#39;.js-avatar&amp;#39;&lt;/span&gt;).src &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; vals.photo;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  template.querySelector(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#39;.js-author&amp;#39;&lt;/span&gt;).href &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; vals.authorUrl;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  template.querySelector(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#39;.js-author-name&amp;#39;&lt;/span&gt;).innerHTML &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; vals.name;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  template.querySelector(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#39;.js-author-name&amp;#39;&lt;/span&gt;).href &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; vals.authorUrl;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  template.querySelector(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#39;.js-source&amp;#39;&lt;/span&gt;).href &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; vals.url;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; (vals.sentence) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    template.querySelector(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#39;.js-sentence&amp;#39;&lt;/span&gt;).innerText &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; vals.sentence;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#268bd2&#34;&gt;const&lt;/span&gt; date &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; template.querySelector(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#39;.js-date&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; (date) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    date.innerHTML &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; formatDate(vals.date);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; (vals.content) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    template.querySelector(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#39;.js-content&amp;#39;&lt;/span&gt;).innerHTML &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; vals.content;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;// formatDate formats the date.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;function&lt;/span&gt; formatDate(date) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#719e07&#34;&gt;!&lt;/span&gt;date) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#719e07&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#586e75&#34;&gt;`&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;${&lt;/span&gt;date.getDate()&lt;span style=&#34;color:#2aa198&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#586e75&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;${&lt;/span&gt;months[date.getMonth()]&lt;span style=&#34;color:#2aa198&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#586e75&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;${&lt;/span&gt;date.getFullYear()&lt;span style=&#34;color:#2aa198&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;`&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;// This is leftover from the original implmentation,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;// commented out since I don&amp;#39;t use it in my version.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;// Maybe I should just remove it for clarity sake.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;// ¯\_(ツ)_/¯
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;function&lt;/span&gt; showInteractions() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#586e75&#34;&gt;// document.getElementById(&amp;#39;comments-loader&amp;#39;).classList.add(&amp;#39;is-hidden&amp;#39;);
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;&lt;/span&gt; &lt;span style=&#34;color:#586e75&#34;&gt;// document.getElementById(&amp;#39;comments&amp;#39;).classList.remove(&amp;#39;is-hidden&amp;#39;);
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I recommend reading it through even if you don&amp;rsquo;t understand all of it &amp;hellip;&lt;/p&gt;
&lt;p&gt;Now save the file which brings us back to the file list.&lt;/p&gt;
&lt;h2 id=&#34;back-to-the-head&#34;&gt;Back to the Head&lt;/h2&gt;
&lt;p&gt;JavaScript in place we now need to go back into the header file &lt;code&gt;layouts/partials/head.html&lt;/code&gt;. Scroll all the way down and just before the &lt;code&gt;&amp;lt;/head&amp;gt;&lt;/code&gt; past in:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#268bd2&#34;&gt;script&lt;/span&gt; src&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;{{ &amp;#34;&lt;/span&gt;js/webmentions.js&amp;#34; | relURL }}&amp;#34;&amp;gt;&amp;lt;/&lt;span style=&#34;color:#268bd2&#34;&gt;script&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And save the file.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://shindakun.dev/imgs/webmentions-07.png&#34; alt=&#34;webmentions-07&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;mission-accomplished&#34;&gt;Mission Accomplished&lt;/h2&gt;
&lt;p&gt;We did it! Technically we&amp;rsquo;re all done at this point. If we were to look at a post on our side we should see something like the following from my &lt;a href=&#34;https://shindakun-test.micro.blog/2019/11/28/testing.html&#34;&gt;test site&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://shindakun.dev/imgs/webmentions-08.png&#34; alt=&#34;webmentions-08&#34;&gt;&lt;/p&gt;
&lt;p&gt;Neat!&lt;/p&gt;
&lt;p&gt;Alright but how can we tell if it&amp;rsquo;s really working? &lt;a href=&#34;https://webmention.rocks/&#34;&gt;Webmention Rocks&lt;/a&gt; will help us make sure everything is actually working as it should. The site has a number of tests to ensure your site is set up and ready to go. But for the purposes of this post we are mostly interested in the receiver tests. First one is first I suppose - visit &lt;a href=&#34;https://webmention.rocks/receive/1&#34;&gt;https://webmention.rocks/receive/1&lt;/a&gt; and enter the URL of your site to sign-in.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://shindakun.dev/imgs/webmentions-09.png&#34; alt=&#34;webmentions-09&#34;&gt;&lt;/p&gt;
&lt;p&gt;Perfect! Now lets enter a URL from one of our MB posts.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://shindakun.dev/imgs/webmentions-10.png&#34; alt=&#34;webmentions-10&#34;&gt;&lt;/p&gt;
&lt;p&gt;If all went well you should see something similar to the following image.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://shindakun.dev/imgs/webmentions-11.png&#34; alt=&#34;webmentions-11&#34;&gt;&lt;/p&gt;
&lt;p&gt;Awesome! Now go over to the same page on MB and refresh&amp;hellip;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://shindakun.dev/imgs/webmentions-12.png&#34; alt=&#34;webmentions-12&#34;&gt;&lt;/p&gt;
&lt;p&gt;Yes the image Webmention Rocks uses is pretty big by default but, who cares we have one webmention! Alright, I care&amp;hellip; For best results you&amp;rsquo;ll want to use some CSS to style the replies. I have left that out since that&amp;rsquo;s a but outside what we are trying to do and I don&amp;rsquo;t really enjoy mucking about with CSS.&lt;/p&gt;
&lt;hr&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&#34;text-align:center&#34;&gt;Enjoy this post?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;&lt;a href=&#34;https://ko-fi.com/shindakun&#34;&gt;How about buying me a coffee?&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
</description>
    </item>
    
    <item>
      <title>Adding an Image Lightbox To micro.blog</title>
      <link>https://shindakun.dev/posts/adding-an-image-lightbox-to-microblog/</link>
      <pubDate>Fri, 06 Dec 2019 23:15:31 -0800</pubDate>
      
      <guid>https://shindakun.dev/posts/adding-an-image-lightbox-to-microblog/</guid>
      <description>&lt;h2 id=&#34;background&#34;&gt;Background&lt;/h2&gt;
&lt;p&gt;A day or so ago someone posted in one of the micro.blog slack channels asking how to add a lightbox. I had been meaning to update my setup here on the blog and add a lightbox since my current images weren&amp;rsquo;t linked. Mostly though, I wanted to get rid of jQuery. So with that in mind we&amp;rsquo;re going to go through the first steps of adding a lightbox. We&amp;rsquo;ll first add it so images in individual post are linked. This also lays some of the ground work for us to extend the &amp;ldquo;photos&amp;rdquo; page to include a lightbox.&lt;/p&gt;
&lt;h2 id=&#34;finding-a-lightbox&#34;&gt;Finding A Lightbox&lt;/h2&gt;
&lt;p&gt;The first step was to find a &amp;ldquo;modern&amp;rdquo; lightbox solution. As I mentioned the majority of older solutions used jQuery and I don&amp;rsquo;t want another dependancy. jQuery is great and all but, I&amp;rsquo;m trying to watch my overall page weight. After some searching around I settled on &lt;a href=&#34;https://biati-digital.github.io/glightbox/&#34;&gt;GLightbox&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;hugo-themes&#34;&gt;Hugo Themes&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://micro.blog&#34;&gt;micro.blog&lt;/a&gt;, like this site, uses &lt;a href=&#34;https://gohugo.io/&#34;&gt;Hugo&lt;/a&gt; for hosted blogs. This setup allows to have control over the theme so we can easily pick a custom theme and extend it with our gallery script. One thing to take note of - I am using the &lt;a href=&#34;https://github.com/microdotblog/theme-hello&#34;&gt;Hello&lt;/a&gt; and while this should work on any Hugo there will be differences if you are using another theme.&lt;/p&gt;
&lt;h2 id=&#34;glightbox-js-and-css&#34;&gt;GLightbox JS and CSS&lt;/h2&gt;
&lt;p&gt;GLightbox is very easy to install which makes it perfect for this. We&amp;rsquo;ll need to edit our theme so I recommend first going through the steps in the &lt;a href=&#34;https://help.micro.blog/2019/about-themes/&#34;&gt;help.micro.blog&lt;/a&gt; section on custom themes.&lt;/p&gt;
&lt;h3 id=&#34;css&#34;&gt;CSS&lt;/h3&gt;
&lt;p&gt;Assuming you are using the Hello theme we now need to edit &lt;code&gt;layouts/partials/head.html&lt;/code&gt; and include our CSS and the actually Glightbox JavaScript. This is relatively easy though, just follow the instructions on the Micro.blog help (Manton has a great &lt;a href=&#34;https://www.youtube.com/watch?v=MLUWnrMKVdg&#34;&gt;YouTube video&lt;/a&gt; which covers the basics).&lt;/p&gt;
&lt;p&gt;Once in the editor, we&amp;rsquo;ll want to add the following two lines:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#268bd2&#34;&gt;link&lt;/span&gt; rel&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;stylesheet&amp;#34;&lt;/span&gt; href&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;https://cdn.jsdelivr.net/npm/glightbox/dist/css/glightbox.min.css&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#268bd2&#34;&gt;script&lt;/span&gt; src&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;https://cdn.jsdelivr.net/gh/mcstudios/glightbox/dist/js/glightbox.min.js&amp;#34;&lt;/span&gt;&amp;gt;&amp;lt;/&lt;span style=&#34;color:#268bd2&#34;&gt;script&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;javascript&#34;&gt;JavaScript&lt;/h3&gt;
&lt;p&gt;So far so good! I have a feeling the next part is going to be different with every theme, so it might not be as easy. When adding an image to a post through the micro.blog website it is simply included as an &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; tag. The last thing I want to do is have to go in and add all the tags to images as I post them.&lt;/p&gt;
&lt;p&gt;With that in mind I crafted a passible bit of JavaScript which will pull out any images that appear within post content and automatically link them so they will be shown in the lightbox.&lt;/p&gt;
&lt;p&gt;Neat.&lt;/p&gt;
&lt;p&gt;To add the JavaScript we&amp;rsquo;ll again need to edit part of the theme. In this case we&amp;rsquo;ll want to open &lt;code&gt;static/assets/main.js&lt;/code&gt; for editing. Once open we can added the following JavaScript to the top. Feel free to take out the comments, I&amp;rsquo;ve just added them for this post.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;// First we&amp;#39;ll grab all the images inside a post paragraph
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;let&lt;/span&gt; ims &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#b58900&#34;&gt;document&lt;/span&gt;.querySelectorAll(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#39;.post-content p img&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;// If ims === 0 lets not do anything
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; (ims.length &lt;span style=&#34;color:#719e07&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#586e75&#34;&gt;// Now we&amp;#39;ll loop through all of the images that were picked up
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#586e75&#34;&gt;// Note that I&amp;#39;m doing no real error handling, you might want to clean this up
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#268bd2&#34;&gt;let&lt;/span&gt; i &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;; i &lt;span style=&#34;color:#719e07&#34;&gt;&amp;lt;&lt;/span&gt; ims.length; i&lt;span style=&#34;color:#719e07&#34;&gt;++&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#586e75&#34;&gt;// For each image we get the parent element, in this case it will be &amp;lt;p&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#268bd2&#34;&gt;let&lt;/span&gt; parentElm &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; ims[i].parentElement;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#586e75&#34;&gt;// Using the paraent element and the image object we replace the innerHTML
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#586e75&#34;&gt;// with our image with the class &amp;#34;glightbox&amp;#34; and a link to the image
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;&lt;/span&gt;    parentElm.innerHTML &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#39;&amp;lt;a href=&amp;#34;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; ims[i].src &lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#39;&amp;#34;&amp;gt;&amp;lt;img src=&amp;#34;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; ims[i].src &lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#39;&amp;#34; class=&amp;#34;glightbox&amp;#34;&amp;gt;&amp;lt;/a&amp;gt;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;// Finally we call GLightbox and if all went well...
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;const&lt;/span&gt; lightbox &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; GLightbox({});
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src=&#34;https://shindakun.dev/imgs/lightbox-01.png&#34; alt=&#34;babby Yoda&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;caveats&#34;&gt;Caveats&lt;/h2&gt;
&lt;p&gt;&amp;ldquo;This code works on my computer!&amp;rdquo; Hopefully, if everything went smoothly then the image above should be clickable and should appear in the lightbox. The JavaScript image selection code is likely extremely brittle and probably won&amp;rsquo;t work for many themes. There should be enough information here for others to follow. For best results you will probably want to keep to only one image per post (though it should work with more).&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;update&#34;&gt;Update&lt;/h2&gt;
&lt;p&gt;As &lt;a href=&#34;https://micro.json.blog/2019/12/30/223827.html&#34;&gt;Jason Becker&lt;/a&gt; points out since we are using Hugo we can take advantage of &lt;a href=&#34;https://gohugo.io/content-management/shortcodes&#34;&gt;custom shortcodes&lt;/a&gt;. Also as &lt;a href=&#34;https://micro.blog/bix/7502311&#34;&gt;@bix&lt;/a&gt; noted, the docs for Glightbox indicate that the class is added to the &lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt; anchor tag and not the image itself. It seems to work OK either way in my testing but if you are having an issue that could be why.&lt;/p&gt;
&lt;hr&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&#34;text-align:center&#34;&gt;Enjoy this post?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;&lt;a href=&#34;https://ko-fi.com/shindakun&#34;&gt;How about buying me a coffee?&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
</description>
    </item>
    
    <item>
      <title>Attempting to Learn Go - Issuer 04 - Addendum</title>
      <link>https://shindakun.dev/posts/attempting-to-learn-go-issuer-04-addendum/</link>
      <pubDate>Sat, 13 Jul 2019 10:52:32 -0700</pubDate>
      
      <guid>https://shindakun.dev/posts/attempting-to-learn-go-issuer-04-addendum/</guid>
      <description>&lt;h2 id=&#34;whoops&#34;&gt;Whoops&lt;/h2&gt;
&lt;p&gt;Our last Issuer post left out one small bit of code. Let&amp;rsquo;s fix that and wrap this up. Also, let&amp;rsquo;s cover how to test the webhook before moving to Google Cloud Functions.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;missed-if&#34;&gt;Missed &lt;code&gt;if&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;As I &lt;a href=&#34;https://shindakun.dev/posts/attempting-to-learn-go-issuer-03-cloud-function-go/&#34;&gt;published Issuer&lt;/a&gt; to Google Cloud Functions I meant to update the code. The idea is to only create new issues when the originating payload action was &lt;code&gt;opened&lt;/code&gt;. The final revision of the post left that out though so here we go. Let&amp;rsquo;s look at our updated &lt;code&gt;HandleWebhook()&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#268bd2&#34;&gt;HandleWebhook&lt;/span&gt;(res http.ResponseWriter, req &lt;span style=&#34;color:#719e07&#34;&gt;*&lt;/span&gt;http.Request) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#268bd2&#34;&gt;var&lt;/span&gt; Payload Payload
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;defer&lt;/span&gt; req.Body.&lt;span style=&#34;color:#268bd2&#34;&gt;Close&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  p, err &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; github.&lt;span style=&#34;color:#268bd2&#34;&gt;ValidatePayload&lt;/span&gt;(req, []&lt;span style=&#34;color:#b58900&#34;&gt;byte&lt;/span&gt;(Secret))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; err &lt;span style=&#34;color:#719e07&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#cb4b16&#34;&gt;nil&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    http.&lt;span style=&#34;color:#268bd2&#34;&gt;Error&lt;/span&gt;(res, &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;bad request: &amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;err.&lt;span style=&#34;color:#268bd2&#34;&gt;Error&lt;/span&gt;(), &lt;span style=&#34;color:#2aa198&#34;&gt;400&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    log.&lt;span style=&#34;color:#268bd2&#34;&gt;Printf&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;bad request: %v&amp;#34;&lt;/span&gt;, err.&lt;span style=&#34;color:#268bd2&#34;&gt;Error&lt;/span&gt;())
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#719e07&#34;&gt;return&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  err = json.&lt;span style=&#34;color:#268bd2&#34;&gt;Unmarshal&lt;/span&gt;(p, &lt;span style=&#34;color:#719e07&#34;&gt;&amp;amp;&lt;/span&gt;Payload)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; err &lt;span style=&#34;color:#719e07&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#cb4b16&#34;&gt;nil&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    http.&lt;span style=&#34;color:#268bd2&#34;&gt;Error&lt;/span&gt;(res, &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;bad request: &amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;err.&lt;span style=&#34;color:#268bd2&#34;&gt;Error&lt;/span&gt;(), &lt;span style=&#34;color:#2aa198&#34;&gt;400&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    log.&lt;span style=&#34;color:#268bd2&#34;&gt;Printf&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;bad request: %v&amp;#34;&lt;/span&gt;, err.&lt;span style=&#34;color:#268bd2&#34;&gt;Error&lt;/span&gt;())
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#719e07&#34;&gt;return&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Here we are - we check &lt;code&gt;Payload.Action&lt;/code&gt; to ensure it&amp;rsquo;s &lt;code&gt;opened&lt;/code&gt; and if so then we create out new issue.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; Payload.Action &lt;span style=&#34;color:#719e07&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;opened&amp;#34;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    err = &lt;span style=&#34;color:#268bd2&#34;&gt;createNewIssue&lt;/span&gt;(&lt;span style=&#34;color:#719e07&#34;&gt;&amp;amp;&lt;/span&gt;Payload)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; err &lt;span style=&#34;color:#719e07&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#cb4b16&#34;&gt;nil&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      log.&lt;span style=&#34;color:#268bd2&#34;&gt;Printf&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;bad request: %v&amp;#34;&lt;/span&gt;, err.&lt;span style=&#34;color:#268bd2&#34;&gt;Error&lt;/span&gt;())
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#719e07&#34;&gt;return&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;testing-webhooks&#34;&gt;Testing Webhooks&lt;/h2&gt;
&lt;p&gt;Before pushing to GCF it was necessary to test the webhooks to ensure I was receiving what I needed. This is actually pretty easy thanks to &lt;a href=&#34;https://ngrok.com/&#34;&gt;&lt;code&gt;ngrok&lt;/code&gt;&lt;/a&gt;. &lt;code&gt;ngrok&lt;/code&gt; is a command line tool which allows us to access our internal program from an external network. No need to worry about setting up your firewall or tunneling.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;ngrok&#34;&gt;&lt;code&gt;ngrok&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;To do this we&amp;rsquo;ll need to make sure we have &lt;code&gt;ngrok&lt;/code&gt; installed. On a Mac, which is where I tend to do most of my development lately, it&amp;rsquo;s a simple matter of installing via &lt;code&gt;brew&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;brew install ngrok
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If you happen to be using Windows, you can download from the &lt;code&gt;ngrok&lt;/code&gt; website, &lt;a href=&#34;https://ngrok.com/download&#34;&gt;https://ngrok.com/download&lt;/a&gt;. Follow the instructions to install on the website. Once installed you should be able to open a command prompt or terminal window and run &lt;code&gt;ngrok&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;➜  ~ ngrok
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;NAME:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   ngrok - tunnel &lt;span style=&#34;color:#b58900&#34;&gt;local&lt;/span&gt; ports to public URLs and inspect traffic
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;DESCRIPTION:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ngrok exposes &lt;span style=&#34;color:#b58900&#34;&gt;local&lt;/span&gt; networked services behinds NATs and firewalls to the
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    public internet over a secure tunnel. Share &lt;span style=&#34;color:#b58900&#34;&gt;local&lt;/span&gt; websites, build/test
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    webhook consumers and self-host personal services.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Detailed &lt;span style=&#34;color:#b58900&#34;&gt;help&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;for&lt;/span&gt; each &lt;span style=&#34;color:#b58900&#34;&gt;command&lt;/span&gt; is available with &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#39;ngrok help &amp;lt;command&amp;gt;&amp;#39;&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Open http://localhost:4040 &lt;span style=&#34;color:#719e07&#34;&gt;for&lt;/span&gt; ngrok&amp;#39;s web interface to inspect traffic.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id=&#34;now-what&#34;&gt;Now What&lt;/h3&gt;
&lt;p&gt;Now what? That&amp;rsquo;s easy! Let&amp;rsquo;s run&amp;hellip;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ngrok http &lt;span style=&#34;color:#2aa198&#34;&gt;3000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Assuming you are running the code we wrote last time, that runs on port 3000. Now open a new terminal window and lets run our code.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;go run main.go
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now we&amp;rsquo;re up and running, lets enable some webhooks on GitHub and do some actual testing.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;github-webhooks&#34;&gt;GitHub Webhooks&lt;/h3&gt;
&lt;p&gt;With both &lt;code&gt;ngrok&lt;/code&gt; and our code running we go to GitHub! Pick a repo, or create a test one. Under the settings tab, chose &amp;ldquo;Webhooks&amp;rdquo; on the left. Click &amp;ldquo;Add webhook&amp;rdquo; on the upper right. Enter our &lt;code&gt;ngrok&lt;/code&gt; URL, ex: &lt;code&gt;https://9ba7d0f6.ngrok.io&lt;/code&gt; and add &lt;code&gt;/webhook&lt;/code&gt;. In &amp;ldquo;Content type&amp;rdquo; make sure you select &lt;code&gt;application/json&lt;/code&gt;. For this project I chose &amp;ldquo;Let me select individual events&amp;rdquo; and then selected only &amp;ldquo;Issues&amp;rdquo;. Then click &amp;ldquo;Add webhook&amp;rdquo; at the bottom.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://shindakun.dev/imgs/webhook-01.png&#34; alt=&#34;ngrok running on the command line&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://shindakun.dev/imgs/webhook-02.png&#34; alt=&#34;github webhook settings&#34;&gt;&lt;/p&gt;
&lt;p&gt;GitHub will send off a test post, we should see something right away.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://shindakun.dev/imgs/webhook-03.png&#34; alt=&#34;running issuer&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://shindakun.dev/imgs/webhook-04.png&#34; alt=&#34;test webhook&#34;&gt;&lt;/p&gt;
&lt;p&gt;And there we have it! It&amp;rsquo;s mostly blank because it&amp;rsquo;s just a test but it&amp;rsquo;s enough to show that we&amp;rsquo;re working as expected.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;You can find the code for this and most of the other Attempting to Learn Go posts in the repo on GitHub.&lt;/p&gt;
&lt;p&gt;{% github shindakun/atlg %}&lt;/p&gt;
&lt;hr&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&#34;text-align:center&#34;&gt;Enjoy this post?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;&lt;a href=&#34;https://ko-fi.com/shindakun&#34;&gt;How about buying me a coffee?&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
</description>
    </item>
    
    <item>
      <title>Attempting to Learn Go - Issuer 03 - Cloud Function Go!</title>
      <link>https://shindakun.dev/posts/attempting-to-learn-go-issuer-03-cloud-function-go/</link>
      <pubDate>Sat, 22 Jun 2019 16:39:49 -0700</pubDate>
      
      <guid>https://shindakun.dev/posts/attempting-to-learn-go-issuer-03-cloud-function-go/</guid>
      <description>&lt;h1 id=&#34;functioning-in-the-cloud&#34;&gt;Functioning In The Cloud&lt;/h1&gt;
&lt;p&gt;Welcome back! We are just done with our GitHub TODO issue creator thing. This time around we&amp;rsquo;re going to go through the steps to deploy it as a Google Cloud Function. To do this we&amp;rsquo;ll need to alter the code. But before we dive into the code itself we&amp;rsquo;ll need to get setup to use Go modules.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;go-mod&#34;&gt;Go Mod&lt;/h2&gt;
&lt;p&gt;First, we&amp;rsquo;ll need to get our &lt;code&gt;mod&lt;/code&gt; file ready. You may or may not already have modules enabled. If you do you should be able to leave off the &lt;code&gt;GO111MODULE=on&lt;/code&gt; part of the command.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;GO111MODULE&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;on go mod issuer
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now, we need to make sure we&amp;rsquo;ve got all the modules we need.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;➜  issuer &lt;span style=&#34;color:#268bd2&#34;&gt;GO111MODULE&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;on go mod tidy
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;go: finding github.com/google/go-github/v25/github latest
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;go: finding golang.org/x/oauth2 latest
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;go: downloading google.golang.org/appengine v1.4.0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;go: extracting google.golang.org/appengine v1.4.0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;go: downloading github.com/golang/protobuf v1.2.0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;go: extracting github.com/golang/protobuf v1.2.0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;go: downloading golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;go: extracting golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Looking good so far! Next we want to vendor our dependancies. This copies the modules we downloaded in the previous step into our code directory.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;GO111MODULE&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;on go mod vendor
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We should now see the vendor directory.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;➜  issuer ls
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;go.mod  go.sum  main.go vendor
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id=&#34;alterations&#34;&gt;Alterations&lt;/h3&gt;
&lt;p&gt;Now let&amp;rsquo;s make a few changes to our code to get it ready for deploying as a Cloud Function. We&amp;rsquo;ll be starting off the same as last time. You may notice that I&amp;rsquo;ve removed the ability to query &lt;code&gt;/status&lt;/code&gt;, it is not longer needed.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;package&lt;/span&gt; issuer
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;import&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;context&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;encoding/json&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;log&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;net/http&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;os&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;strconv&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;github.com/google/go-github/v25/github&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;github.com/shindakun/envy&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;golang.org/x/oauth2&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Note that I&amp;rsquo;ve pulled out our constants and replaced them will variables. This allows us to make the code a bit more generic and so others can use it. We&amp;rsquo;ll cover how we are setting up these variables a bit later on. Note, some people may not like the use of global variables here. Since our function is so small and we have a good idea what&amp;rsquo;s happening in each step it&amp;rsquo;s OK to use them for now.&lt;/p&gt;
&lt;p&gt;Of course if you&amp;rsquo;d rather not have globals feel free to remove them. You can hard code as constants or load them inside our main function call.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;// RepoOwner is the owner of the repo we want to open an issue in
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;var&lt;/span&gt; RepoOwner &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;// IssueRepo is the repo we want to open this new issue in
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;var&lt;/span&gt; IssueRepo &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;// ProjectColumn is the TODO column number of the project we want to add the issue to
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;var&lt;/span&gt; ProjectColumn &lt;span style=&#34;color:#dc322f&#34;&gt;int64&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;// Token is the GitHub Personal Access Token
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;var&lt;/span&gt; Token &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;// Secret is used to validate payloads
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;var&lt;/span&gt; Secret &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;// Payload of GitHub webhook
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;type&lt;/span&gt; Payload &lt;span style=&#34;color:#268bd2&#34;&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Action &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;action&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Issue  &lt;span style=&#34;color:#268bd2&#34;&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    URL           &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;url&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    RepositoryURL &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;repository_url&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Number        &lt;span style=&#34;color:#dc322f&#34;&gt;int&lt;/span&gt;    &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;number&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Title         &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;title&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Body          &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;body&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  } &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;issue&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Repository &lt;span style=&#34;color:#268bd2&#34;&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Name &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;name&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  } &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;repository&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I&amp;rsquo;ve also changed &lt;code&gt;handleWebhook()&lt;/code&gt; to &lt;code&gt;HandleWebhook()&lt;/code&gt;. Exporting the function is what allows us to call it as the cloud function.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#268bd2&#34;&gt;HandleWebhook&lt;/span&gt;(res http.ResponseWriter, req &lt;span style=&#34;color:#719e07&#34;&gt;*&lt;/span&gt;http.Request) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#268bd2&#34;&gt;var&lt;/span&gt; Payload Payload
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;defer&lt;/span&gt; req.Body.&lt;span style=&#34;color:#268bd2&#34;&gt;Close&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  p, err &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; github.&lt;span style=&#34;color:#268bd2&#34;&gt;ValidatePayload&lt;/span&gt;(req, []&lt;span style=&#34;color:#b58900&#34;&gt;byte&lt;/span&gt;(Secret))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; err &lt;span style=&#34;color:#719e07&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#cb4b16&#34;&gt;nil&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    http.&lt;span style=&#34;color:#268bd2&#34;&gt;Error&lt;/span&gt;(res, &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;bad request: &amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;err.&lt;span style=&#34;color:#268bd2&#34;&gt;Error&lt;/span&gt;(), &lt;span style=&#34;color:#2aa198&#34;&gt;400&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    log.&lt;span style=&#34;color:#268bd2&#34;&gt;Printf&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;bad request: %v&amp;#34;&lt;/span&gt;, err.&lt;span style=&#34;color:#268bd2&#34;&gt;Error&lt;/span&gt;())
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#719e07&#34;&gt;return&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;As @kunde21 pointed out last week we are better off using &lt;code&gt;json.Unmarshal()&lt;/code&gt; here. This also allows us to remove the imports for &lt;code&gt;bytes&lt;/code&gt; and &lt;code&gt;io/ioutil&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  err = json.&lt;span style=&#34;color:#268bd2&#34;&gt;Unmarshal&lt;/span&gt;(p, &lt;span style=&#34;color:#719e07&#34;&gt;&amp;amp;&lt;/span&gt;Payload)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; err &lt;span style=&#34;color:#719e07&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#cb4b16&#34;&gt;nil&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    http.&lt;span style=&#34;color:#268bd2&#34;&gt;Error&lt;/span&gt;(res, &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;bad request: &amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;err.&lt;span style=&#34;color:#268bd2&#34;&gt;Error&lt;/span&gt;(), &lt;span style=&#34;color:#2aa198&#34;&gt;400&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    log.&lt;span style=&#34;color:#268bd2&#34;&gt;Printf&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;bad request: %v&amp;#34;&lt;/span&gt;, err.&lt;span style=&#34;color:#268bd2&#34;&gt;Error&lt;/span&gt;())
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#719e07&#34;&gt;return&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  err = &lt;span style=&#34;color:#268bd2&#34;&gt;createNewIssue&lt;/span&gt;(&lt;span style=&#34;color:#719e07&#34;&gt;&amp;amp;&lt;/span&gt;Payload)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; err &lt;span style=&#34;color:#719e07&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#cb4b16&#34;&gt;nil&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    log.&lt;span style=&#34;color:#268bd2&#34;&gt;Printf&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;bad request: %v&amp;#34;&lt;/span&gt;, err.&lt;span style=&#34;color:#268bd2&#34;&gt;Error&lt;/span&gt;())
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#719e07&#34;&gt;return&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#268bd2&#34;&gt;createNewIssue&lt;/span&gt;(p &lt;span style=&#34;color:#719e07&#34;&gt;*&lt;/span&gt;Payload) &lt;span style=&#34;color:#dc322f&#34;&gt;error&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  log.&lt;span style=&#34;color:#268bd2&#34;&gt;Printf&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;Creating New Issue.\n&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  log.&lt;span style=&#34;color:#268bd2&#34;&gt;Printf&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;  Name: %#v\n&amp;#34;&lt;/span&gt;, p.Repository.Name)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  log.&lt;span style=&#34;color:#268bd2&#34;&gt;Printf&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;  Title: %#v\n&amp;#34;&lt;/span&gt;, p.Issue.Title)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  log.&lt;span style=&#34;color:#268bd2&#34;&gt;Printf&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;  Body: %#v\n&amp;#34;&lt;/span&gt;, p.Issue.Body)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  log.&lt;span style=&#34;color:#268bd2&#34;&gt;Printf&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;  URL: %#v\n&amp;#34;&lt;/span&gt;, p.Issue.URL)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  ctx &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; context.&lt;span style=&#34;color:#268bd2&#34;&gt;Background&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  ts &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; oauth2.&lt;span style=&#34;color:#268bd2&#34;&gt;StaticTokenSource&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#719e07&#34;&gt;&amp;amp;&lt;/span&gt;oauth2.Token{AccessToken: Token},
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  )
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  tc &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; oauth2.&lt;span style=&#34;color:#268bd2&#34;&gt;NewClient&lt;/span&gt;(ctx, ts)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  client &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; github.&lt;span style=&#34;color:#268bd2&#34;&gt;NewClient&lt;/span&gt;(tc)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  title &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; fmt.&lt;span style=&#34;color:#268bd2&#34;&gt;Sprintf&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;[%s] %s&amp;#34;&lt;/span&gt;, p.Repository.Name, p.Issue.Title)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  body &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; fmt.&lt;span style=&#34;color:#268bd2&#34;&gt;Sprintf&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;%s\n%s/%s#%d&amp;#34;&lt;/span&gt;, p.Issue.Body, RepoOwner, p.Repository.Name, p.Issue.Number)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  issue &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;&amp;amp;&lt;/span&gt;github.IssueRequest{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Title: &lt;span style=&#34;color:#719e07&#34;&gt;&amp;amp;&lt;/span&gt;title,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Body:  &lt;span style=&#34;color:#719e07&#34;&gt;&amp;amp;&lt;/span&gt;body,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  ish, _, err &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; client.Issues.&lt;span style=&#34;color:#268bd2&#34;&gt;Create&lt;/span&gt;(ctx, RepoOwner, IssueRepo, issue)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; err &lt;span style=&#34;color:#719e07&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#cb4b16&#34;&gt;nil&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    log.&lt;span style=&#34;color:#268bd2&#34;&gt;Printf&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;error: %v&amp;#34;&lt;/span&gt;, err)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#719e07&#34;&gt;return&lt;/span&gt; err
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  id &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;*&lt;/span&gt;ish.ID
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  card &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;&amp;amp;&lt;/span&gt;github.ProjectCardOptions{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ContentID:   id,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ContentType: &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;Issue&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  _, _, err = client.Projects.&lt;span style=&#34;color:#268bd2&#34;&gt;CreateProjectCard&lt;/span&gt;(ctx, ProjectColumn, card)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; err &lt;span style=&#34;color:#719e07&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#cb4b16&#34;&gt;nil&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    log.&lt;span style=&#34;color:#268bd2&#34;&gt;Printf&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;error: %v&amp;#34;&lt;/span&gt;, err)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#719e07&#34;&gt;return&lt;/span&gt; err
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#cb4b16&#34;&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now we get to one of the biggest changes. Since the cloud function is going to call &lt;code&gt;HandleWebhook()&lt;/code&gt;, we no longer need our &lt;code&gt;main()&lt;/code&gt;. But that presents an issue, we have some environment variables we want to use. We could load them in the &lt;code&gt;HandleWebhook()&lt;/code&gt; call it&amp;rsquo;s more appropriate to make use of &lt;a href=&#34;https://golang.org/doc/effective_go.html#init&#34;&gt;Go&amp;rsquo;s &lt;code&gt;init()&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;init()&lt;/code&gt; runs before main (or our handler in this case), which allows us to load our variables as normal.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#268bd2&#34;&gt;init&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  log.&lt;span style=&#34;color:#268bd2&#34;&gt;Println&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;Issuer&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#268bd2&#34;&gt;var&lt;/span&gt; err &lt;span style=&#34;color:#dc322f&#34;&gt;error&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Token, err = envy.&lt;span style=&#34;color:#268bd2&#34;&gt;Get&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;GITHUBTOKEN&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; err &lt;span style=&#34;color:#719e07&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#cb4b16&#34;&gt;nil&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;||&lt;/span&gt; Token &lt;span style=&#34;color:#719e07&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    log.&lt;span style=&#34;color:#268bd2&#34;&gt;Printf&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;error: %v&amp;#34;&lt;/span&gt;, err)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    os.&lt;span style=&#34;color:#268bd2&#34;&gt;Exit&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Secret, err = envy.&lt;span style=&#34;color:#268bd2&#34;&gt;Get&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;SECRET&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; err &lt;span style=&#34;color:#719e07&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#cb4b16&#34;&gt;nil&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;||&lt;/span&gt; Secret &lt;span style=&#34;color:#719e07&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    log.&lt;span style=&#34;color:#268bd2&#34;&gt;Printf&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;error: %v&amp;#34;&lt;/span&gt;, err)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    os.&lt;span style=&#34;color:#268bd2&#34;&gt;Exit&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  RepoOwner, err = envy.&lt;span style=&#34;color:#268bd2&#34;&gt;Get&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;REPOOWNER&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; err &lt;span style=&#34;color:#719e07&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#cb4b16&#34;&gt;nil&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;||&lt;/span&gt; RepoOwner &lt;span style=&#34;color:#719e07&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    log.&lt;span style=&#34;color:#268bd2&#34;&gt;Printf&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;error: %v&amp;#34;&lt;/span&gt;, err)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    os.&lt;span style=&#34;color:#268bd2&#34;&gt;Exit&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  IssueRepo, err = envy.&lt;span style=&#34;color:#268bd2&#34;&gt;Get&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;ISSUEREPO&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; err &lt;span style=&#34;color:#719e07&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#cb4b16&#34;&gt;nil&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;||&lt;/span&gt; IssueRepo &lt;span style=&#34;color:#719e07&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    log.&lt;span style=&#34;color:#268bd2&#34;&gt;Printf&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;error: %v&amp;#34;&lt;/span&gt;, err)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    os.&lt;span style=&#34;color:#268bd2&#34;&gt;Exit&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;ProjectColumn&lt;/code&gt; requires a bit more setting up since I never extended &lt;code&gt;envy&lt;/code&gt; to return &lt;code&gt;int&lt;/code&gt;s. So we need to convert to an &lt;code&gt;int64&lt;/code&gt; before we can use the column numeric ID to create our TODO card on the kanban board.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  n, err &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; envy.&lt;span style=&#34;color:#268bd2&#34;&gt;Get&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;PROJECTCOLUMN&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; err &lt;span style=&#34;color:#719e07&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#cb4b16&#34;&gt;nil&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;||&lt;/span&gt; n &lt;span style=&#34;color:#719e07&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    log.&lt;span style=&#34;color:#268bd2&#34;&gt;Printf&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;error: %v&amp;#34;&lt;/span&gt;, err)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    os.&lt;span style=&#34;color:#268bd2&#34;&gt;Exit&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ProjectColumn, err = strconv.&lt;span style=&#34;color:#268bd2&#34;&gt;ParseInt&lt;/span&gt;(n, &lt;span style=&#34;color:#2aa198&#34;&gt;10&lt;/span&gt;, &lt;span style=&#34;color:#2aa198&#34;&gt;64&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; err &lt;span style=&#34;color:#719e07&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#cb4b16&#34;&gt;nil&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;||&lt;/span&gt; ProjectColumn &lt;span style=&#34;color:#719e07&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    log.&lt;span style=&#34;color:#268bd2&#34;&gt;Printf&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;error: %v&amp;#34;&lt;/span&gt;, err)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    os.&lt;span style=&#34;color:#268bd2&#34;&gt;Exit&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;go-to-the-cloud&#34;&gt;Go To The Cloud&lt;/h2&gt;
&lt;p&gt;I am going to assume that you have the Google Cloud command line tools installed and a project set up. If you do not Google has some very good tutorials. Checkout &lt;a href=&#34;https://cloud.google.com/functions/docs/quickstart&#34;&gt;https://cloud.google.com/functions/docs/quickstart&lt;/a&gt; for more&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Note: You wouldn&amp;rsquo;t want to have the secret and the token deployed like this in production. You would instead want to use &lt;a href=&#34;https://cloud.google.com/kms/docs/secret-management&#34;&gt;Cloud KMS&lt;/a&gt; or &lt;a href=&#34;https://cloud.google.com/deployment-manager/runtime-configurator/&#34;&gt;Runtime Configurator&lt;/a&gt;. I&amp;rsquo;m living dangerously.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;➜  issuer gcloud functions deploy issuer --entry-point HandleWebhook --runtime go111 --trigger-http --memory&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;128MB --set-env-vars &lt;span style=&#34;color:#268bd2&#34;&gt;SECRET&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;secret,GITHUBTOKEN&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;token,REPOOWNER&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;shindakun,ISSUEREPO&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;to,PROJECTCOLUMN&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;5647145&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Deploying &lt;span style=&#34;color:#719e07&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;(&lt;/span&gt;may take a &lt;span style=&#34;color:#719e07&#34;&gt;while&lt;/span&gt; - up to &lt;span style=&#34;color:#2aa198&#34;&gt;2&lt;/span&gt; minutes&lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;...done.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;availableMemoryMb: &lt;span style=&#34;color:#2aa198&#34;&gt;128&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;entryPoint: HandleWebhook
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;environmentVariables:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  GITHUBTOKEN: token
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  ISSUEREPO: to
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  PROJECTCOLUMN: &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#39;5647145&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  REPOOWNER: shindakun
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  SECRET: secret
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;httpsTrigger:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  url: https://us-east1-golang-slackbot.cloudfunctions.net/issuer
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;labels:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  deployment-tool: cli-gcloud
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;name: projects/golang-slackbot/locations/us-east1/functions/issuer
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;runtime: go111
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;serviceAccountEmail: golang-slackbot@appspot.gserviceaccount.com
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sourceUploadUrl: https://storage.googleapis.com/gcf-upload-us-central1-eeb5af0e-fd09-4fe7-30851592ebba/bcc11c6f-55fc-4d73-864a-6a89813206a6.zip?GoogleAccessId&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;service-84452958925@gcf-gserviceaccount.com&amp;amp;&lt;span style=&#34;color:#268bd2&#34;&gt;Expires&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;1561244032&amp;amp;&lt;span style=&#34;color:#268bd2&#34;&gt;Signature&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;QX%2BKy5j6YTA6%D%3D
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;status: ACTIVE
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;timeout: 60s
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;updateTime: &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#39;2019-06-22T22:24:37Z&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;versionId: &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#39;1&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;next-time&#34;&gt;Next time&lt;/h2&gt;
&lt;p&gt;And there we have it! We&amp;rsquo;re now live and update any source repos to use our trigger URL. That makes this stage of our issuer complete. New issues will appear in our target repo and on the TODO section of the kanban board!&lt;/p&gt;
&lt;p&gt;What should we tackle next time? I&amp;rsquo;ll have to take a look at the kanban board and see if any ideas jump out at me. Until then feel free to let me know if you spot something to refactor.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;You can find the code for this and most of the other Attempting to Learn Go posts in the repo on GitHub.&lt;/p&gt;
&lt;p&gt;{% github shindakun/atlg %}&lt;/p&gt;
&lt;hr&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&#34;text-align:center&#34;&gt;Enjoy this post?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;&lt;a href=&#34;https://ko-fi.com/shindakun&#34;&gt;How about buying me a coffee?&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
</description>
    </item>
    
    <item>
      <title>Attempting to Learn Go - Issuer 02</title>
      <link>https://shindakun.dev/posts/attempting-to-learn-go-issuer-02/</link>
      <pubDate>Sat, 15 Jun 2019 12:12:44 -0700</pubDate>
      
      <guid>https://shindakun.dev/posts/attempting-to-learn-go-issuer-02/</guid>
      <description>&lt;h1 id=&#34;github-issuer&#34;&gt;GitHub Issuer&lt;/h1&gt;
&lt;p&gt;Welcome back! Though if you haven&amp;rsquo;t read the first part, you may want to. We&amp;rsquo;re expanding on the code that we write last time. Adding in the ability to actually create new issues in our TODO repository and add them to the kanban board. Yes the most over-engineered TODO &amp;ldquo;system&amp;rdquo; is going to get an upgrade. With that out of the way lets get right into it.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;lets-go&#34;&gt;Lets Go&lt;/h2&gt;
&lt;p&gt;Our imports have expanded as we&amp;rsquo;re pulling in a bunch of bits from the standard library and a few external packages. The &lt;code&gt;go-github&lt;/code&gt; package is going to do a quite a bit of heavy lifting for us. &lt;code&gt;oauth2&lt;/code&gt; is coming along for the ride so we can use a GitHub personal access token to authorize our requests.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;package&lt;/span&gt; main
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;import&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;bytes&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;context&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;encoding/json&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;io/ioutil&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;log&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;net/http&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;os&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;github.com/google/go-github/v25/github&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;github.com/shindakun/envy&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;golang.org/x/oauth2&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Currently, we&amp;rsquo;re setting a few constants. We may bring theses up out of the code and make them environment variables in the &amp;ldquo;production&amp;rdquo; version. For local testing though it&amp;rsquo;s probably fine. The token however, is already set as an environment variable, which should keep me from accidentally committing it to GitHub. It&amp;rsquo;s good practice to keep tokens out of the code whenever possible.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;const&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#586e75&#34;&gt;// RepoOwner is the owner of the repo we want to open an issue in
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;&lt;/span&gt;  RepoOwner = &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;shindakun&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#586e75&#34;&gt;// IssueRepo is the repo we want to open this new issue in.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;&lt;/span&gt;  IssueRepo = &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;to&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#586e75&#34;&gt;// ProjectColumn is the TODO column number of the project we want to add the issue to
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;&lt;/span&gt;  ProjectColumn = &lt;span style=&#34;color:#2aa198&#34;&gt;5647145&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;// Token is the GitHub Personal Access Token
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;var&lt;/span&gt; Token &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;// Secret is used to validate webhook payloads
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;var&lt;/span&gt; Secret &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Our &lt;code&gt;Payload&lt;/code&gt; is pretty much set, we don&amp;rsquo;t need anything else from the responses for now. Our &lt;code&gt;status&lt;/code&gt; handler will remain the same as well.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;// Payload of GitHub webhook
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;type&lt;/span&gt; Payload &lt;span style=&#34;color:#268bd2&#34;&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Action &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;action&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Issue  &lt;span style=&#34;color:#268bd2&#34;&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    URL           &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;url&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    RepositoryURL &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;repository_url&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Number        &lt;span style=&#34;color:#dc322f&#34;&gt;int&lt;/span&gt;    &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;number&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Title         &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;title&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Body          &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;body&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  } &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;issue&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Repository &lt;span style=&#34;color:#268bd2&#34;&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Name &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;name&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  } &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;repository&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#268bd2&#34;&gt;status&lt;/span&gt;(res http.ResponseWriter, req &lt;span style=&#34;color:#719e07&#34;&gt;*&lt;/span&gt;http.Request) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  fmt.&lt;span style=&#34;color:#268bd2&#34;&gt;Fprintf&lt;/span&gt;(res, &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;Hello!&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The webhook handler starts off the same. But quickly deviates.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#268bd2&#34;&gt;handleWebhook&lt;/span&gt;(res http.ResponseWriter, req &lt;span style=&#34;color:#719e07&#34;&gt;*&lt;/span&gt;http.Request) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#268bd2&#34;&gt;var&lt;/span&gt; Payload Payload
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;defer&lt;/span&gt; req.Body.&lt;span style=&#34;color:#268bd2&#34;&gt;Close&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We take our incoming request and pass it and our &lt;code&gt;Secret&lt;/code&gt; into &lt;code&gt;github.ValidatePayload()&lt;/code&gt;. The &lt;code&gt;X-Hub-Signature&lt;/code&gt; on the incoming request comes with a signature compare against our calculated signature. If it matches we&amp;rsquo;re good to go.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The HMAC hex digest of the response body. This header will be sent if the webhook is configured with a secret. The HMAC hex digest is generated using the sha1 hash function and the secret as the HMAC key.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This protects us from some one accidentally finding our endpoint and submitting requests. Sure the chances are low but why take chances. If the request doesn&amp;rsquo;t pass validation we simply return and carry on.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  p, err &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; github.&lt;span style=&#34;color:#268bd2&#34;&gt;ValidatePayload&lt;/span&gt;(req, []&lt;span style=&#34;color:#b58900&#34;&gt;byte&lt;/span&gt;(Secret))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; err &lt;span style=&#34;color:#719e07&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#cb4b16&#34;&gt;nil&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    http.&lt;span style=&#34;color:#268bd2&#34;&gt;Error&lt;/span&gt;(res, &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;bad request: &amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;err.&lt;span style=&#34;color:#268bd2&#34;&gt;Error&lt;/span&gt;(), &lt;span style=&#34;color:#2aa198&#34;&gt;400&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    log.&lt;span style=&#34;color:#268bd2&#34;&gt;Printf&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;bad request: %v&amp;#34;&lt;/span&gt;, err.&lt;span style=&#34;color:#268bd2&#34;&gt;Error&lt;/span&gt;())
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#719e07&#34;&gt;return&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;github.ValidatePayload()&lt;/code&gt; returns a &lt;code&gt;[]byte&lt;/code&gt; of the payload which we need to wrap in a &amp;ldquo;ReadCloser&amp;rdquo; which we can then pass to &lt;code&gt;jsonNewDecoder()&lt;/code&gt; so we can parse the JSON object as our final &lt;code&gt;Payload&lt;/code&gt;. Again, if anything goes wrong we&amp;rsquo;ll log the error and return. If all goes well, we pass our &lt;code&gt;Payload&lt;/code&gt; to &lt;code&gt;createNewIssue()&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  decoder &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; json.&lt;span style=&#34;color:#268bd2&#34;&gt;NewDecoder&lt;/span&gt;(ioutil.&lt;span style=&#34;color:#268bd2&#34;&gt;NopCloser&lt;/span&gt;(bytes.&lt;span style=&#34;color:#268bd2&#34;&gt;NewBuffer&lt;/span&gt;(p)))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  err = decoder.&lt;span style=&#34;color:#268bd2&#34;&gt;Decode&lt;/span&gt;(&lt;span style=&#34;color:#719e07&#34;&gt;&amp;amp;&lt;/span&gt;Payload)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; err &lt;span style=&#34;color:#719e07&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#cb4b16&#34;&gt;nil&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    http.&lt;span style=&#34;color:#268bd2&#34;&gt;Error&lt;/span&gt;(res, &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;bad request: &amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;err.&lt;span style=&#34;color:#268bd2&#34;&gt;Error&lt;/span&gt;(), &lt;span style=&#34;color:#2aa198&#34;&gt;400&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    log.&lt;span style=&#34;color:#268bd2&#34;&gt;Printf&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;bad request: %v&amp;#34;&lt;/span&gt;, err.&lt;span style=&#34;color:#268bd2&#34;&gt;Error&lt;/span&gt;())
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#719e07&#34;&gt;return&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  err = &lt;span style=&#34;color:#268bd2&#34;&gt;createNewIssue&lt;/span&gt;(&lt;span style=&#34;color:#719e07&#34;&gt;&amp;amp;&lt;/span&gt;Payload)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; err &lt;span style=&#34;color:#719e07&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#cb4b16&#34;&gt;nil&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    log.&lt;span style=&#34;color:#268bd2&#34;&gt;Printf&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;bad request: %v&amp;#34;&lt;/span&gt;, err.&lt;span style=&#34;color:#268bd2&#34;&gt;Error&lt;/span&gt;())
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#719e07&#34;&gt;return&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;createNewIssue()&lt;/code&gt; first starts by logging out the details of our payload. This is just for testing purposes and will be removed I think.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#268bd2&#34;&gt;createNewIssue&lt;/span&gt;(p &lt;span style=&#34;color:#719e07&#34;&gt;*&lt;/span&gt;Payload) &lt;span style=&#34;color:#dc322f&#34;&gt;error&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  log.&lt;span style=&#34;color:#268bd2&#34;&gt;Printf&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;Creating New Issue.\n&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  log.&lt;span style=&#34;color:#268bd2&#34;&gt;Printf&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;  Name: %#v\n&amp;#34;&lt;/span&gt;, p.Repository.Name)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  log.&lt;span style=&#34;color:#268bd2&#34;&gt;Printf&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;  Title: %#v\n&amp;#34;&lt;/span&gt;, p.Issue.Title)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  log.&lt;span style=&#34;color:#268bd2&#34;&gt;Printf&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;  Body: %#v\n&amp;#34;&lt;/span&gt;, p.Issue.Body)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  log.&lt;span style=&#34;color:#268bd2&#34;&gt;Printf&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;  URL: %#v\n&amp;#34;&lt;/span&gt;, p.Issue.URL)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;First things first, we&amp;rsquo;ll get our oauth2 and GitHub client ready to go. This is as recommended by the &lt;a href=&#34;https://github.com/google/go-github&#34;&gt;&lt;code&gt;go-github&lt;/code&gt;&lt;/a&gt; repo.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  ctx &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; context.&lt;span style=&#34;color:#268bd2&#34;&gt;Background&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  ts &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; oauth2.&lt;span style=&#34;color:#268bd2&#34;&gt;StaticTokenSource&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#719e07&#34;&gt;&amp;amp;&lt;/span&gt;oauth2.Token{AccessToken: Token},
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  )
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  tc &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; oauth2.&lt;span style=&#34;color:#268bd2&#34;&gt;NewClient&lt;/span&gt;(ctx, ts)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  client &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; github.&lt;span style=&#34;color:#268bd2&#34;&gt;NewClient&lt;/span&gt;(tc)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now it&amp;rsquo;s time to build our new issue. I wanted the title to reflect which repo it was coming from.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[From repo] Remember to write a post&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The body of the repo holds whatever was originally entered and a link back to the source repo. We then pack the title and body into &lt;code&gt;github.IssueRequest&lt;/code&gt; and create the new issue!&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  title &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; fmt.&lt;span style=&#34;color:#268bd2&#34;&gt;Sprintf&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;[%s] %s&amp;#34;&lt;/span&gt;, p.Repository.Name, p.Issue.Title)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  body &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; fmt.&lt;span style=&#34;color:#268bd2&#34;&gt;Sprintf&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;%s\n%s/%s#%d&amp;#34;&lt;/span&gt;, p.Issue.Body, RepoOwner, p.Repository.Name, p.Issue.Number)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  issue &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;&amp;amp;&lt;/span&gt;github.IssueRequest{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Title: &lt;span style=&#34;color:#719e07&#34;&gt;&amp;amp;&lt;/span&gt;title,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Body:  &lt;span style=&#34;color:#719e07&#34;&gt;&amp;amp;&lt;/span&gt;body,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  ish, _, err &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; client.Issues.&lt;span style=&#34;color:#268bd2&#34;&gt;Create&lt;/span&gt;(ctx, RepoOwner, IssueRepo, issue)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; err &lt;span style=&#34;color:#719e07&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#cb4b16&#34;&gt;nil&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    log.&lt;span style=&#34;color:#268bd2&#34;&gt;Printf&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;error: %v&amp;#34;&lt;/span&gt;, err)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#719e07&#34;&gt;return&lt;/span&gt; err
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We are not quite done though. I want to make sure the new issue is added to the TODO kanban board. So we take the details from the new issue, extract the issue ID number and setup a new &amp;ldquo;card&amp;rdquo; with &lt;code&gt;github.ProjectCardOptions&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  id &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;*&lt;/span&gt;ish.ID
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  card &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;&amp;amp;&lt;/span&gt;github.ProjectCardOptions{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ContentID:   id,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ContentType: &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;Issue&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We aren&amp;rsquo;t to concerned with the details return from this call so we just check for an error and return if need be.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  _, _, err = client.Projects.&lt;span style=&#34;color:#268bd2&#34;&gt;CreateProjectCard&lt;/span&gt;(ctx, ProjectColumn, card)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; err &lt;span style=&#34;color:#719e07&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#cb4b16&#34;&gt;nil&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    log.&lt;span style=&#34;color:#268bd2&#34;&gt;Printf&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;error: %v&amp;#34;&lt;/span&gt;, err)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#719e07&#34;&gt;return&lt;/span&gt; err
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#cb4b16&#34;&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And that brings us to our updated &lt;code&gt;main()&lt;/code&gt;. We&amp;rsquo;ve added a bit of code to grab our environment variables and if not set we&amp;rsquo;ll bail out with an error.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#268bd2&#34;&gt;main&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  log.&lt;span style=&#34;color:#268bd2&#34;&gt;Println&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;Issuer&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#268bd2&#34;&gt;var&lt;/span&gt; err &lt;span style=&#34;color:#dc322f&#34;&gt;error&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Token, err = envy.&lt;span style=&#34;color:#268bd2&#34;&gt;Get&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;GITHUBTOKEN&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; err &lt;span style=&#34;color:#719e07&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#cb4b16&#34;&gt;nil&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;||&lt;/span&gt; Token &lt;span style=&#34;color:#719e07&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    log.&lt;span style=&#34;color:#268bd2&#34;&gt;Printf&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;error: %v&amp;#34;&lt;/span&gt;, err)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    os.&lt;span style=&#34;color:#268bd2&#34;&gt;Exit&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Secret, err = envy.&lt;span style=&#34;color:#268bd2&#34;&gt;Get&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;SECRET&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; err &lt;span style=&#34;color:#719e07&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#cb4b16&#34;&gt;nil&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;||&lt;/span&gt; Secret &lt;span style=&#34;color:#719e07&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    log.&lt;span style=&#34;color:#268bd2&#34;&gt;Printf&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;error: %v&amp;#34;&lt;/span&gt;, err)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    os.&lt;span style=&#34;color:#268bd2&#34;&gt;Exit&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  http.&lt;span style=&#34;color:#268bd2&#34;&gt;HandleFunc&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;/&amp;#34;&lt;/span&gt;, status)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  http.&lt;span style=&#34;color:#268bd2&#34;&gt;HandleFunc&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;/webhook&amp;#34;&lt;/span&gt;, handleWebhook)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  http.&lt;span style=&#34;color:#268bd2&#34;&gt;ListenAndServe&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;:3000&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#cb4b16&#34;&gt;nil&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;running&#34;&gt;Running&lt;/h2&gt;
&lt;p&gt;Alright lets run it and make a new issue in our test &amp;ldquo;from&amp;rdquo; repo.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;SECRET&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;TESTSECRET &lt;span style=&#34;color:#268bd2&#34;&gt;GITHUBTOKEN&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;1234567890&lt;/span&gt; go run main.go
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2019/06/15 11:23:32 Issuer
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2019/06/15 11:24:42 Creating New Issue.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2019/06/15 11:24:42   Name: &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;from&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2019/06/15 11:24:42   Title: &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;asdfasdf&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2019/06/15 11:24:42   Body: &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;asdfasdfasdfasdfasdf&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2019/06/15 11:24:42   URL: &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;https://api.github.com/repos/shindakun/from/issues/13&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Perfect! Now all we need to do is throw it on a box and point our GitHub repos webhook settings at the proper URL.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;next-time&#34;&gt;Next time&lt;/h2&gt;
&lt;p&gt;That went pretty smooth! Next time I think we&amp;rsquo;ll convert this into something we can deploy on Google Cloud Functions! Which will make it much easier to deploy.&lt;/p&gt;
&lt;p&gt;Questions and comments are welcome!&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;You can find the code for this and most of the other Attempting to Learn Go posts in the repo on GitHub.&lt;/p&gt;
&lt;hr&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&#34;text-align:center&#34;&gt;Enjoy this post?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;&lt;a href=&#34;https://ko-fi.com/shindakun&#34;&gt;How about buying me a coffee?&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
</description>
    </item>
    
    <item>
      <title>Attempting to Learn Go - Issuer 01</title>
      <link>https://shindakun.dev/posts/attempting_to_learn_go_-_issuer-01/</link>
      <pubDate>Sat, 08 Jun 2019 10:49:37 -0700</pubDate>
      
      <guid>https://shindakun.dev/posts/attempting_to_learn_go_-_issuer-01/</guid>
      <description>&lt;h1 id=&#34;github-issuer&#34;&gt;GitHub Issuer&lt;/h1&gt;
&lt;p&gt;If you didn&amp;rsquo;t happen to &lt;a href=&#34;https://shindakun.dev/posts/working-on-a-new-flow/&#34;&gt;read the last post&lt;/a&gt; I&amp;rsquo;ll give you a brief overview. I&amp;rsquo;m trying out a new system to tackle my project load and my TODO list.&lt;/p&gt;
&lt;p&gt;The problem is that the current setup is very manual. Each &amp;ldquo;thing&amp;rdquo;, or project, I want to do gets its own repository with its own automated kanban board. I open an issue in the repo, assign it to the project board and &amp;ldquo;bam&amp;rdquo;, new task. But, I then need to add that issue to my master &amp;ldquo;TODO&amp;rdquo; repo by hand.&lt;/p&gt;
&lt;p&gt;We can&amp;rsquo;t have that! It makes the system more work than it should be. That means we won&amp;rsquo;t use it.&lt;/p&gt;
&lt;p&gt;But, we have a solution! GitHub repositories can have webhooks enabled. So, on every new issue, a POST request with the issue details goes to our webhook. That&amp;rsquo;s where &lt;code&gt;Issuer&lt;/code&gt; is going to come in. It will live on a server waiting for incoming POST events. Once one comes it will use the GitHub API to create an issue in the TODO repo.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;lets-go&#34;&gt;Lets Go&lt;/h2&gt;
&lt;p&gt;OK! Let&amp;rsquo;s jump right in and see what we are dealing with. If you read the second or third articles in the &lt;code&gt;Uploader&lt;/code&gt; series then parts of the base code will look similar. We&amp;rsquo;re using a very standard approach to a Go web server.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;package&lt;/span&gt; main
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;import&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;encoding/json&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;log&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;net/http&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The GitHub issue payload is &amp;ldquo;massive&amp;rdquo; compared to what we actually need from it. So our &lt;code&gt;Payload&lt;/code&gt; struct is only going to include exactly what we need to create a new issue.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;type&lt;/span&gt; Payload &lt;span style=&#34;color:#268bd2&#34;&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Action &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;action&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Issue  &lt;span style=&#34;color:#268bd2&#34;&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    URL           &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;url&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    RepositoryURL &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;repository_url&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Number        &lt;span style=&#34;color:#dc322f&#34;&gt;int&lt;/span&gt;    &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;number&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Title         &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;title&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Body          &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;body&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  } &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;issue&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Repository &lt;span style=&#34;color:#268bd2&#34;&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Name     &lt;span style=&#34;color:#dc322f&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;name&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  } &lt;span style=&#34;color:#2aa198&#34;&gt;`json:&amp;#34;repository&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Hello! This isn&amp;rsquo;t needed but I like to have it as a small health check. In a more robust application you may want to return some sort of metrics from the server. Then if I wanted I could point Uptime Robot at &lt;code&gt;/&lt;/code&gt; to alert if its down.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#268bd2&#34;&gt;status&lt;/span&gt;(res http.ResponseWriter, req &lt;span style=&#34;color:#719e07&#34;&gt;*&lt;/span&gt;http.Request) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  fmt.&lt;span style=&#34;color:#268bd2&#34;&gt;Fprintf&lt;/span&gt;(res, &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;Hello!&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I&amp;rsquo;ll cover how to enable webhooks in a repo and how we can test a bit later on. For now, let&amp;rsquo;s take a closer look at our webhook handler function. We begin by setting up our &lt;code&gt;Payload&lt;/code&gt; variable and &lt;code&gt;defer&lt;/code&gt; closing the request body. We then use &lt;code&gt;json.NewDecoder()&lt;/code&gt; to get ready and decode our JSON payload. If &lt;code&gt;decode.Decoder()&lt;/code&gt; returns an error we&amp;rsquo;ll first return a &lt;code&gt;400&lt;/code&gt; to the originating server. We then log out the error to the console and then return from the function.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#268bd2&#34;&gt;handleWebhook&lt;/span&gt;(res http.ResponseWriter, req &lt;span style=&#34;color:#719e07&#34;&gt;*&lt;/span&gt;http.Request) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#268bd2&#34;&gt;var&lt;/span&gt; Payload Payload
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;defer&lt;/span&gt; req.Body.&lt;span style=&#34;color:#268bd2&#34;&gt;Close&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  decoder &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; json.&lt;span style=&#34;color:#268bd2&#34;&gt;NewDecoder&lt;/span&gt;(req.Body)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  err &lt;span style=&#34;color:#719e07&#34;&gt;:=&lt;/span&gt; decoder.&lt;span style=&#34;color:#268bd2&#34;&gt;Decode&lt;/span&gt;(&lt;span style=&#34;color:#719e07&#34;&gt;&amp;amp;&lt;/span&gt;Payload)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;if&lt;/span&gt; err &lt;span style=&#34;color:#719e07&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#cb4b16&#34;&gt;nil&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    http.&lt;span style=&#34;color:#268bd2&#34;&gt;Error&lt;/span&gt;(res, &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;bad request: &amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;err.&lt;span style=&#34;color:#268bd2&#34;&gt;Error&lt;/span&gt;(), &lt;span style=&#34;color:#2aa198&#34;&gt;400&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    log.&lt;span style=&#34;color:#268bd2&#34;&gt;Printf&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;bad request: %v&amp;#34;&lt;/span&gt;, err.&lt;span style=&#34;color:#268bd2&#34;&gt;Error&lt;/span&gt;())
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#719e07&#34;&gt;return&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Assuming all has gone well we print the webhook details in to the console.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  log.&lt;span style=&#34;color:#268bd2&#34;&gt;Printf&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;%#v\n&amp;#34;&lt;/span&gt;, Payload.Repository.Name)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  log.&lt;span style=&#34;color:#268bd2&#34;&gt;Printf&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;%#v\n&amp;#34;&lt;/span&gt;, Payload.Issue.URL)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  log.&lt;span style=&#34;color:#268bd2&#34;&gt;Printf&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;%#v\n&amp;#34;&lt;/span&gt;, Payload.Issue.Title)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  log.&lt;span style=&#34;color:#268bd2&#34;&gt;Printf&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;%#v\n&amp;#34;&lt;/span&gt;, Payload.Issue.Body)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  log.&lt;span style=&#34;color:#268bd2&#34;&gt;Printf&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;%#v\n&amp;#34;&lt;/span&gt;, Payload.Issue.Number)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  log.&lt;span style=&#34;color:#268bd2&#34;&gt;Printf&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;%#v\n&amp;#34;&lt;/span&gt;, Payload.Issue.RepositoryURL)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;For this basic example, our main consists of two handlers and &lt;code&gt;http.ListenAndServe()&lt;/code&gt;. We may want to extend this at some point to allow the use of alternative HTTP clients. To keep the code simple for now we&amp;rsquo;ll leave it.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#268bd2&#34;&gt;main&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  log.&lt;span style=&#34;color:#268bd2&#34;&gt;Println&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;Issuer&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  http.&lt;span style=&#34;color:#268bd2&#34;&gt;HandleFunc&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;/&amp;#34;&lt;/span&gt;, status)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  http.&lt;span style=&#34;color:#268bd2&#34;&gt;HandleFunc&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;/webhook&amp;#34;&lt;/span&gt;, handleWebhook)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  http.&lt;span style=&#34;color:#268bd2&#34;&gt;ListenAndServe&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;:3000&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#cb4b16&#34;&gt;nil&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;next-time&#34;&gt;Next time&lt;/h2&gt;
&lt;p&gt;When next we meet we&amp;rsquo;ll be adding the ability to create an issue based on the payload received. If that goes well - we&amp;rsquo;ll even add the code to add issues to the TODO project. 🎉&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;You can find the code for this and most of the other Attempting to Learn Go posts in the repo on GitHub.&lt;/p&gt;
&lt;p&gt;{% github shindakun/atlg %}&lt;/p&gt;
&lt;hr&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&#34;text-align:center&#34;&gt;Enjoy this post?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;&lt;a href=&#34;https://ko-fi.com/shindakun&#34;&gt;How about buying me a coffee?&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
</description>
    </item>
    
    <item>
      <title>Working On A New Flow</title>
      <link>https://shindakun.dev/posts/working-on-a-new-flow/</link>
      <pubDate>Tue, 04 Jun 2019 15:08:36 -0700</pubDate>
      
      <guid>https://shindakun.dev/posts/working-on-a-new-flow/</guid>
      <description>&lt;h2 id=&#34;new-flow&#34;&gt;New Flow&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;ve realized over the last couple of weeks that I have way more projects that I want to work on then time in the day. I just don&amp;rsquo;t have as much free time as I used to and can&amp;rsquo;t seem to burn the midnight oil anymore.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve tried a few methods to try and keep my projects well defined and under a manageable scope. Each has had its drawbacks and never quite worked. My suspicion is that they have been too tailored too whoever thought of it.&lt;/p&gt;
&lt;p&gt;A few days back &lt;a href=&#34;https://dev.to/ben&#34;&gt;@ben&lt;/a&gt; posted about limiting procrastination which brought me back to thinking about this.&lt;/p&gt;
&lt;p&gt;My attention will always be focused on what I shouldn&amp;rsquo;t be doing at any time - it&amp;rsquo;s taken me at least 10 minutes to get back to this sentence. With some practice and a system that works for me maybe I can tackle that and squeeze in getting some more projects done.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;repo-madness&#34;&gt;Repo Madness&lt;/h2&gt;
&lt;p&gt;After some brainstorming, I decided I would try a different approach. I already keep most of my post ideas in a repo. Why can&amp;rsquo;t I keep all my todo&amp;rsquo;s in repo as well? This approach allows me to continue using tools I already use, no adding new services is a plus.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve just started planning this out but here is what I&amp;rsquo;ve got so far. It&amp;rsquo;s a bit manual at this point while I figure it out but bits should be automated as it comes into focus.&lt;/p&gt;
&lt;p&gt;Each repo has a project with an automated kanban board. Issues from each repo need to bubble up to the TODO repo which I&amp;rsquo;ll use as my master todo list. From there I can shuffle them around to any other columns I might need as needed. At the start I think we&amp;rsquo;ll stick to just &amp;ldquo;To Do&amp;rdquo;, &amp;ldquo;In Progress&amp;rdquo;, and &amp;ldquo;Done&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Example repos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;TODO Repo&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TODO Project (automated kanban board)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Posts Repo&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Posts Project (automated kanban board)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Hugo Theme Repo&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Theme Project (automated kanban board)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Reading Repo&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Reading Project (automated kanban board)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;OK, let&amp;rsquo;s say we want to write this post. We first make an issue in the Posts repo. For now, we&amp;rsquo;ll also need to manually make a post in the TODO repo. In that issue, we&amp;rsquo;ll refer back to the posts repo &lt;code&gt;shindakun/posts#1&lt;/code&gt;. This will link back so we can open the TODO kanban board and quickly move around to the other repos.&lt;/p&gt;
&lt;p&gt;We can then do the same in our Hugo repo. Or if I have a new book I want to read, &lt;a href=&#34;https://www.amazon.com/Procedural-Generation-Design-Tanya-Short-ebook/dp/B071GL6NRD/&#34;&gt;Procedural Generation in Game Design&lt;/a&gt;. I can throw an issue into the reading repo.&lt;/p&gt;
&lt;p&gt;I can create issues from my phone if I need to, or jot them down in a notebook to be entered later. I&amp;rsquo;d need to remember to sync any issues to the TODO repo at first. Which leads us to&amp;hellip;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;the-flaw&#34;&gt;The Flaw&lt;/h2&gt;
&lt;p&gt;There is one major flaw - it&amp;rsquo;s too manual. But that shouldn&amp;rsquo;t stop us! It&amp;rsquo;s just another opportunity to write some code. This way we can enable webhooks on each of our repos, these will ping a small service which will, in turn, open a new issue in the TODO repo. This can be done with cloud functions or on a server. I&amp;rsquo;ll probably do a server version but, that can be easily converted to a cloud function I believe. This should be a nice refresher for some of the API stuff we worked on in the past.&lt;/p&gt;
&lt;p&gt;Once this is setup I expect that the system could actually work - at least for me.&lt;/p&gt;
&lt;p&gt;Example JSON Payload:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;title&amp;#34;&lt;/span&gt;:&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;read PCG in game design&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;body&amp;#34;&lt;/span&gt;:&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;it&amp;#39;s on the kindle should probably read it\n\nshindakun/reading#1&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;It will need to be added to the TODO kanban board as well. That should just be a matter of using details from the newly created issue. I&amp;rsquo;ll worry about that once we get the first part working.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve been trying out the manual setup and it kind of works. For non-code tasks, I can close an issue then click through to the source repo and close that. That can probably be automated as well. For code related TODOs I can simply use the &lt;code&gt;closes shindakun/todo#1&lt;/code&gt; shorthand to close the TODO issue and &lt;code&gt;closes #2&lt;/code&gt; shorthand to close the &amp;ldquo;local&amp;rdquo; issue.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;next-time&#34;&gt;Next time&lt;/h2&gt;
&lt;p&gt;Just us next time as we embark on the most &amp;ldquo;over-engineered&amp;rdquo; TODO system I could come up with. We&amp;rsquo;ll be writing the first part of the code portion of this project - a service to accept webhooks from GitHub.&lt;/p&gt;
&lt;hr&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&#34;text-align:center&#34;&gt;Enjoy this post?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;&lt;a href=&#34;https://ko-fi.com/shindakun&#34;&gt;How about buying me a coffee?&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
</description>
    </item>
    
    <item>
      <title>Hello World!</title>
      <link>https://shindakun.dev/posts/hello-world/</link>
      <pubDate>Sat, 01 Jun 2019 00:00:00 +0000</pubDate>
      
      <guid>https://shindakun.dev/posts/hello-world/</guid>
      <description>&lt;h1 id=&#34;heading&#34;&gt;👋&lt;/h1&gt;
&lt;p&gt;Just getting ready to launch my Hugo powered blog.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;package&lt;/span&gt; main
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#268bd2&#34;&gt;main&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     fmt.&lt;span style=&#34;color:#268bd2&#34;&gt;Println&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;Hello World!&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;notes&#34;&gt;Notes&lt;/h2&gt;
&lt;p&gt;I suppose I should make some notes on what I&amp;rsquo;m doing. This likely won&amp;rsquo;t be complete but should capture all the major steps.&lt;/p&gt;
&lt;p&gt;First, I dug through the Hugo site looking for a good starter theme. I eventually decided on &lt;a href=&#34;https://github.com/bake/solar-theme-hugo&#34;&gt;Solar&lt;/a&gt; a Hugo riff on a &lt;a href=&#34;https://ghost.org/&#34;&gt;Ghost&lt;/a&gt; theme.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m planning on using them as a starting point and will be expanding it out in an off-shoot theme. I don&amp;rsquo;t think it will be too crazy, just changes to page headers and footers maybe.&lt;/p&gt;
&lt;p&gt;I hadn&amp;rsquo;t updated my local Hugo install in a while so I grabbed it via &lt;code&gt;go get&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;go get github.com/gohugoio/hugo
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Next, I made sure all the modules were installed. I&amp;rsquo;m on my Windows machine at the moment which doesn&amp;rsquo;t have Go modules enabled by default as of yet so we turn that on.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;GO111MODULE&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;on go mod tidy
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now to create the base site and grab the theme.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;hugo site new shindakun.dev
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#b58900&#34;&gt;cd&lt;/span&gt; shindakun.dev
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git submodule add https://github.com/bake/solar-theme-hugo
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I then created my sub-theme &amp;ldquo;Solara&amp;rdquo;, which is in a private repo for now and added it to my site.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git submodule add https://github.com/shindakun/solara-hugo
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We need to add both themes to the config so we edit &lt;code&gt;config.toml&lt;/code&gt; and add the line:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-toml&#34; data-lang=&#34;toml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;theme = [&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;solara-hugo-test&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;solar-theme-hugo&amp;#34;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This will load my modifications first and then fall back to the basic theme. I imagine that at some point mine will be customized enough that I can remove the base.&lt;/p&gt;
&lt;h2 id=&#34;quick-updates&#34;&gt;Quick Updates&lt;/h2&gt;
&lt;p&gt;I wanted to make a few quick changes but didn&amp;rsquo;t want to think to hard so I borrowed some ideas for a few things from another Hugo theme &lt;a href=&#34;https://github.com/Vimux/Binario&#34;&gt;Binario&lt;/a&gt;. This is mostly so I can get a handle on the best set up for a theme and make some tweaks pretty quickly. I borrowed Binario&amp;rsquo;s 404 page and its basic 404 CSS. This also allows me to test including a custom CSS file just for Solara. It works exactly as expected so, that&amp;rsquo;s nice.&lt;/p&gt;
&lt;h2 id=&#34;post-content&#34;&gt;Post Content&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;m thinking I&amp;rsquo;ll have &lt;code&gt;content/posts&lt;/code&gt; as a &lt;del&gt;submodule&lt;/del&gt; separate repo so I can keep that repo separate. I have been toying with a new method of working on posts and that may fit in nicely. It also keeps much of the raw content on its own so it can basically be dropped in anywhere.&lt;/p&gt;
&lt;h2 id=&#34;install&#34;&gt;Install&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Clone &lt;code&gt;shindakun.dev&lt;/code&gt; repo&lt;/li&gt;
&lt;li&gt;Install submodules, Solar and Solara&lt;/li&gt;
&lt;li&gt;Clone posts repo&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;build&#34;&gt;Build&lt;/h2&gt;
&lt;p&gt;The site will be living on a Digital Ocean server and will be deployed from there.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;hugo -d /path/to/site
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;No fancy deploy process for now. I&amp;rsquo;ll probably over engineer some sort of CI thing. Or maybe a commit webhook that will fetch and build the latest site.&lt;/p&gt;
&lt;hr&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&#34;text-align:center&#34;&gt;Enjoy this post?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;&lt;a href=&#34;https://ko-fi.com/shindakun&#34;&gt;How about buying me a coffee?&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;</description>
    </item>
    
    <item>
      <title>Better Static Glitch Sites</title>
      <link>https://shindakun.dev/posts/better-static-glitch-sites/</link>
      <pubDate>Tue, 23 May 2017 20:33:44 -0700</pubDate>
      
      <guid>https://shindakun.dev/posts/better-static-glitch-sites/</guid>
      <description>&lt;p&gt;Here&amp;rsquo;s a small tip that comes out of the &lt;a href=&#34;https://support.glitch.com/t/support-static-json/1499/6?u=shindakun&#34;&gt;Glitch support forums&lt;/a&gt;. By default Glitch will start a static web server on your &lt;code&gt;./app/&lt;/code&gt; directory once it does not find a &lt;code&gt;package.json&lt;/code&gt; file in the root of the app folder. This is not always the desired result - for instance what if the site generation is kicked off using &lt;code&gt;grunt&lt;/code&gt; (or one of the countless other build tools) and you can&amp;rsquo;t remove &lt;code&gt;package.json&lt;/code&gt;? In a case like this, the start script in your &lt;code&gt;package.json&lt;/code&gt; may be something related to that build or attempting to start a static server of it&amp;rsquo;s own. Take the following snippet:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;scripts&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;build&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;grunt build&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;start&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;grunt connect:server:keepalive&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;test&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;grunt test&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;postinstall&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;make build&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Grunt is going try and start it&amp;rsquo;s own static server but, on Glitch we&amp;rsquo;re likely not able to reach that from the internet at large.&lt;/p&gt;
&lt;p&gt;What can we do instead? Well, as luck would have it Glitch uses &lt;a href=&#34;https://www.npmjs.com/package/local-web-server&#34;&gt;local-web-server&lt;/a&gt; as it&amp;rsquo;s static web server. This allows us leave the &lt;code&gt;package.json&lt;/code&gt; in place - so the default server won&amp;rsquo;t start but, by updating the start command to be&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;start&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;ws --port 3000 --directory &amp;#39;./&amp;#39; --forbid &amp;#39;/.env&amp;#39; --forbid &amp;#39;/.data&amp;#39; --log-format combined&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;we&amp;rsquo;ll start the local-web-server on our own and leaving it accessible to the public. Make sure you do not leave off the forbid switches if you use &lt;code&gt;.env&lt;/code&gt; or &lt;code&gt;.data&lt;/code&gt;, it would not do to have those leak.&lt;/p&gt;
&lt;p&gt;Finally, if your static site needs to start in a different directory just update the &lt;code&gt;directory&lt;/code&gt; switch, for example &lt;code&gt;--directory &#39;./www&#39;&lt;/code&gt; and you should be good to go.&lt;/p&gt;
&lt;hr&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&#34;text-align:center&#34;&gt;Enjoy this post?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;&lt;a href=&#34;https://ko-fi.com/shindakun&#34;&gt;How about buying me a coffee?&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
</description>
    </item>
    
    <item>
      <title>Uses</title>
      <link>https://shindakun.dev/uses/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>https://shindakun.dev/uses/</guid>
      <description>&lt;h2 id=&#34;websites&#34;&gt;Websites&lt;/h2&gt;
&lt;p&gt;This website is built using &lt;a href=&#34;https://gohugo.io&#34;&gt;Hugo&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;main-computer&#34;&gt;Main Computer&lt;/h2&gt;
&lt;p&gt;Dell XPS something or other, with an RTX something and 32gb of RAM&lt;/p&gt;
&lt;h2 id=&#34;laptop&#34;&gt;Laptop&lt;/h2&gt;
&lt;p&gt;2014 MacBook Air&lt;/p&gt;
&lt;h2 id=&#34;webcam&#34;&gt;Webcam&lt;/h2&gt;
&lt;h2 id=&#34;microphone&#34;&gt;Microphone&lt;/h2&gt;
&lt;h2 id=&#34;headset&#34;&gt;Headset&lt;/h2&gt;
</description>
    </item>
    
  </channel>
</rss>