<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Shaoqing Tan</title>
    <description>The latest articles on DEV Community by Shaoqing Tan (@bettercallshao).</description>
    <link>https://dev.to/bettercallshao</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F505877%2F8a5a12c0-ce3b-4c56-b055-8c46b934205d.png</url>
      <title>DEV Community: Shaoqing Tan</title>
      <link>https://dev.to/bettercallshao</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/bettercallshao"/>
    <language>en</language>
    <item>
      <title>Present with narratives</title>
      <dc:creator>Shaoqing Tan</dc:creator>
      <pubDate>Tue, 06 Apr 2021 23:09:18 +0000</pubDate>
      <link>https://dev.to/bettercallshao/present-with-narratives-3coa</link>
      <guid>https://dev.to/bettercallshao/present-with-narratives-3coa</guid>
      <description>&lt;h1&gt;
  
  
  1. Why talk about presentations?
&lt;/h1&gt;

&lt;p&gt;In teams large or small, meetings often start with a presentation. I sometimes lose attention amongst the slides, because I couldn't understand their relevance to the thesis. It's especially bad in technical design reviews due to the large amount of new information presented. In my &lt;strong&gt;opinion&lt;/strong&gt;, we can improve the audience experience, thus the overall effectiveness, of these meetings by implementing a narrative in the presentation.&lt;/p&gt;

&lt;h1&gt;
  
  
  2. What is a bad presentation like?
&lt;/h1&gt;

&lt;p&gt;For example, the team is considering replacing their database with a SaaS offering, and Kevin is assigned to find out more. Kevin designs the migration and he calls a design review with the team.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Kevin starts the presentation with a block diagram of the SaaS solution.&lt;/li&gt;
&lt;li&gt;Kevin explains the solution details from head to toe.&lt;/li&gt;
&lt;li&gt;The audience start to discuss performance, pricing, and scalability.&lt;/li&gt;
&lt;li&gt;The audience revisit the solution details to find evidence to support their arguments.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In this case, the audience might be disengaged in step 2 because they struggle to digest the details of the solution without context. They wait for Kevin to finish the presentation so the discussion can start, then they end up needing to digest the details in step 2 again to finish the discussion. In other words, Kevin's organization of the material is ineffective such that the audience need to spend extra effort connecting the dots. Lets call this a &lt;strong&gt;subject&lt;/strong&gt; oriented presentation.&lt;/p&gt;

&lt;h1&gt;
  
  
  3. What is a good presentation like?
&lt;/h1&gt;

&lt;p&gt;Kevin could reorganize the presentation to mix in the context with the solution details, and demote inconsequential details to the appendix for the audience to review later if they so choose.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Kevin starts the presentation with a block diagram of the SaaS solution.&lt;/li&gt;
&lt;li&gt;Kevin explains the performance is better (or not) with details.&lt;/li&gt;
&lt;li&gt;Kevin explains the pricing is better (or not) with details.&lt;/li&gt;
&lt;li&gt;Kevin explains the scalability is better (or not) with details.&lt;/li&gt;
&lt;li&gt;The audience discuss performance, pricing, and scalability.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In this case, the audience can better digest the solution details, and are also better prepared for the discussions that follow. The meeting is more fluent and requires less effort from the audience. Lets call this a &lt;strong&gt;narrative&lt;/strong&gt; oriented presentation.&lt;/p&gt;

&lt;h1&gt;
  
  
  4. What is a narrative and why is it better?
&lt;/h1&gt;

&lt;p&gt;A narrative is a storyline in the presentation that the audience can easily follow, it connects the material and promotes effective discussions. A narrative oriented presentation creates and satisfies the train of curiosity of the audience, keeping their precious attention on what matters. It's UX design applied to meetings, where the audience experience is optimized. The presenter needs to see in the audience's perspective to break down the subject, separate the concerns, remove the confusions, and iterate for the best narrative. Subject oriented presentations are easier to create, whereas narrative oriented presentations are easier to receive.&lt;/p&gt;

&lt;h1&gt;
  
  
  5. How to practically create narratives?
&lt;/h1&gt;

&lt;p&gt;I don't think I am "great" at giving presentations in meetings, but I do think the following tips are worth a try.&lt;/p&gt;

&lt;h2&gt;
  
  
  a. Create emphasis
&lt;/h2&gt;

&lt;p&gt;What do the audience care about? What information do they need to carry out the discussion? The trick is to feed the audience important information in a simple way with just enough context such that they can digest it quickly, with unnecessary details omitted. The presentation should contain a series of emphasis instead of a full blueprint.&lt;/p&gt;

&lt;h2&gt;
  
  
  b. Break the subject
&lt;/h2&gt;

&lt;p&gt;To accommodate the delivery of the narrative, details needs to be distributed according to the emphasis of the narrative instead of their natural structure. Imagine in our example, the SaaS offering handles floating point numbers and variable length strings, and they affect performance and scalability respectively. It's natural to put these two details together in a section called "data types", however it's more effective to split them into the "performance" and "scalability" sections.&lt;/p&gt;

&lt;h2&gt;
  
  
  c. Review and iterate
&lt;/h2&gt;

&lt;p&gt;When the entire narrative takes shape, early parts of the narrative might have drifted and become inconsistent. Make sure to review and iterate until the narrative is rid of contradictions, confusions, and complexities.&lt;/p&gt;

&lt;h2&gt;
  
  
  d. Add the opinions
&lt;/h2&gt;

&lt;p&gt;Opinionated narratives promotes more response in the audience. The opinion may end up being incorrect, but it makes the ensuing discussion more productive. Instead of saying the SaaS offering has 2 pros and 2 cons, say the SaaS offering is more competitive because it possesses the key advantage. The audience may disagree right away and start contemplating an argument, therefore warmed up for the discussion.&lt;/p&gt;

&lt;h2&gt;
  
  
  e. Ditch the slides
&lt;/h2&gt;

&lt;p&gt;Slide decks enforce artificial breaks within the narrative, taking away the flexibility in arranging the material. If you are like me who presents in team design reviews instead of conference keynotes, there is no requirement of a slide deck, why put in the effort? I prefer a infinitely scrolled formatted doc, like a Google Doc.&lt;/p&gt;

&lt;h2&gt;
  
  
  f. Promote the questions
&lt;/h2&gt;

&lt;p&gt;Instead of using nouns as headings, use either questions or imperatives. The narrative will be more explicit and the audience will understand what is the take away. If there are questions the audience are expected to have (e.g. how much does this cost?) or questions the presenter wants discussed, make sure to include them as well.&lt;/p&gt;

&lt;h2&gt;
  
  
  g. Shorten the sections
&lt;/h2&gt;

&lt;p&gt;In each section or following each question, make sure the material is short enough that the audience can read through it without losing focus. A meeting presentation is not a Ph.D thesis, the audience has very little time for digestion. So if a section is long, break it. Making material references in discussions will also be easier if sections are short and numbered.&lt;/p&gt;

&lt;h2&gt;
  
  
  h. Read silently
&lt;/h2&gt;

&lt;p&gt;Subject oriented material needs to be narrated by the presenter, whereas narrative oriented material is essentially the script the presenter will read out loud. Because of this quality, we can ask the audience to read the material in silence instead, they will digest the material better controlling their own pace. A silent reading ceremony at the start of the meeting also frees the audience from having to read the material beforehand, and it's something I learned from &lt;a href="https://www.cnbc.com/2019/10/14/jeff-bezos-this-is-the-smartest-thing-we-ever-did-at-amazon.html"&gt;Amazon&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;More on my blog: &lt;a href="https://bettercallshao.com/present-with-narratives/"&gt;https://bettercallshao.com/present-with-narratives/&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>writing</category>
      <category>productivity</category>
      <category>ux</category>
      <category>leadership</category>
    </item>
    <item>
      <title>Organize your command life</title>
      <dc:creator>Shaoqing Tan</dc:creator>
      <pubDate>Thu, 26 Nov 2020 20:35:21 +0000</pubDate>
      <link>https://dev.to/bettercallshao/organize-your-command-life-ohh</link>
      <guid>https://dev.to/bettercallshao/organize-your-command-life-ohh</guid>
      <description>&lt;p&gt;I made &lt;strong&gt;Kut&lt;/strong&gt; to boost CLI productivity by organizing frequently used commands. I recently put lots of work into it and I am looking for testers / contributors / critiques!&lt;/p&gt;

&lt;p&gt;Github: &lt;a href="https://github.com/bettercallshao/kut" rel="noopener noreferrer"&gt;https://github.com/bettercallshao/kut&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Kut reads from a repository of YAMLs of templated commands, and enables the user to render and execute the commands with arguments provided at run-time. It can help to&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Avoid re-typing long commands over and over for routine tasks.&lt;/li&gt;
&lt;li&gt;Version control and share commands.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Installation
&lt;/h2&gt;

&lt;p&gt;Linux &amp;amp; Mac through &lt;a href="https://brew.sh/" rel="noopener noreferrer"&gt;Homebrew&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;brew install bettercallshao/tap/kut
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Windows through &lt;a href="https://scoop.sh/" rel="noopener noreferrer"&gt;Scoop&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;scoop bucket add bettercallshao https://github.com/bettercallshao/scoop-bucket
scoop install bettercallshao/kut
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or download latest zip from &lt;a href="https://github.com/bettercallshao/kut/releases" rel="noopener noreferrer"&gt;releases&lt;/a&gt;, extract, and put the binary files on your system path.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick start
&lt;/h2&gt;

&lt;p&gt;Kick start by ingesting the demo menus.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kut i -s https://raw.githubusercontent.com/bettercallshao/kut-menus/master/python-demo.yaml
kut i -s https://raw.githubusercontent.com/bettercallshao/kut-menus/master/developer-demo.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;See a list of commands by running &lt;code&gt;kut h&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;NAME:
   kut - Run commands easily.

USAGE:
   kut [global options] command [command options] [arguments...]

VERSION:
   v0.5.2-20201123005537

COMMANDS:
   start, s           Starts executor for a menu
   ingest, i          Ingests menu locally from a source
   developer-demo, d  Developer commands for demo
   python-demo, p     Python commands for demo
   help, h            Shows a list of commands or help for one command

GLOBAL OPTIONS:
   --help, -h     show help (default: false)
   --version, -v  print the version (default: false)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;start&lt;/code&gt;, &lt;code&gt;ingest&lt;/code&gt;, &lt;code&gt;help&lt;/code&gt;, &lt;code&gt;--help&lt;/code&gt;, &lt;code&gt;--version&lt;/code&gt; are global arguments.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;python-demo&lt;/code&gt; and &lt;code&gt;developer-demo&lt;/code&gt; are command definitions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Check what is in &lt;code&gt;python-demo&lt;/code&gt; by &lt;code&gt;kut p -h&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;NAME:
   kut python-demo - Python commands for demo

USAGE:
   kut python-demo command [command options] [arguments...]

COMMANDS:
   uuid, u                 Generate a UUID
   forex-rate, f           Print forex rates
   mortgage-calculator, m  Calculate mortgage payment
   bit-expander, b         Convert between decimal, hex, and bit representations
   csv-to-markdown, c      Convert a CSV to markdown table
   help, h                 Shows a list of commands or help for one command

OPTIONS:
   --help, -h     show help (default: false)
   --version, -v  print the version (default: false)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check what &lt;code&gt;forex-rate&lt;/code&gt; does with &lt;code&gt;kut p f -h&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;NAME:
   kut python-demo forex-rate - Print forex rates

USAGE:
   kut python-demo forex-rate [command options] [arguments...]

OPTIONS:
   --base value, -b value     Base currency (default: "USD")
   --symbols value, -s value  Comma separated currency symbol list (default: "CAD,GBP")
   --dry, -d                  render command but don't run (default: false)
   --help, -h                 show help (default: false)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;--dry&lt;/code&gt;, &lt;code&gt;--help&lt;/code&gt; are flags defined by &lt;code&gt;kut&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--base&lt;/code&gt;, &lt;code&gt;--symbols&lt;/code&gt; are input arguments, with default values.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Lets try EUR to JPY and AUD.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ kut p f -b EUR -s JPY,AUD
On 2020-11-13
1 EUR can buy 123.88 JPY
1 EUR can buy 1.63 AUD
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use the &lt;code&gt;--dry&lt;/code&gt; flag to see what actually ran.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ kut p f -b EUR -s AUD -d
template: python3 -u -c "
import urllib.request
import urllib.parse
import json

url = 'https://api.exchangeratesapi.io/latest?base={{.base}}&amp;amp;symbols={{.symbols}}'
r = json.load(urllib.request.urlopen(url))

date = r['date']
rates = r['rates']

print(f'On {date}')
print('\n'.join(
  f'1 {{.base}} can buy {rates[symbol]:.2f} {symbol}'
  for symbol in rates
))
"

rendered: python3 -u -c "
import urllib.request
import urllib.parse
import json

url = 'https://api.exchangeratesapi.io/latest?base=EUR&amp;amp;symbols=AUD'
r = json.load(urllib.request.urlopen(url))

date = r['date']
rates = r['rates']

print(f'On {date}')
print('\n'.join(
  f'1 EUR can buy {rates[symbol]:.2f} {symbol}'
  for symbol in rates
))
"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;First the command template was printed, then the command rendered with input arguments. The command is defined in &lt;code&gt;$HOME/.kut/menus/python-demo.yaml&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;python-demo&lt;/span&gt;
&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;v0.1.0&lt;/span&gt;
&lt;span class="na"&gt;help&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Python commands for demo&lt;/span&gt;
&lt;span class="na"&gt;actions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;forex-rate&lt;/span&gt;
  &lt;span class="na"&gt;help&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Print forex rates&lt;/span&gt;
  &lt;span class="na"&gt;template&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
    &lt;span class="s"&gt;python3 -u -c "&lt;/span&gt;
    &lt;span class="s"&gt;import urllib.request&lt;/span&gt;
    &lt;span class="s"&gt;import urllib.parse&lt;/span&gt;
    &lt;span class="s"&gt;import json&lt;/span&gt;

    &lt;span class="s"&gt;url = 'https://api.exchangeratesapi.io/latest?base={{.base}}&amp;amp;symbols={{.symbols}}'&lt;/span&gt;
    &lt;span class="s"&gt;r = json.load(urllib.request.urlopen(url))&lt;/span&gt;

    &lt;span class="s"&gt;date = r['date']&lt;/span&gt;
    &lt;span class="s"&gt;rates = r['rates']&lt;/span&gt;

    &lt;span class="s"&gt;print(f'On {date}')&lt;/span&gt;
    &lt;span class="s"&gt;print('\n'.join(&lt;/span&gt;
      &lt;span class="s"&gt;f'1 {{.base}} can buy {rates[symbol]:.2f} {symbol}'&lt;/span&gt;
      &lt;span class="s"&gt;for symbol in rates&lt;/span&gt;
    &lt;span class="s"&gt;))&lt;/span&gt;
    &lt;span class="s"&gt;"&lt;/span&gt;
  &lt;span class="na"&gt;params&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;base&lt;/span&gt;
    &lt;span class="na"&gt;help&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Base currency&lt;/span&gt;
    &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;USD&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;symbols&lt;/span&gt;
    &lt;span class="na"&gt;help&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Comma separated currency symbol list&lt;/span&gt;
    &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;CAD,GBP&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add to this file or create more YAMLs in &lt;code&gt;$HOME/.kut/menus/&lt;/code&gt; to add more commands.&lt;/p&gt;

&lt;h2&gt;
  
  
  Web interface
&lt;/h2&gt;

&lt;p&gt;Kut can also be run in conjunction with kutd to give a web based user interface to the menus. Kutd is installed as part of the kut package and runs without arguments.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[kutd] 2020/11/24 01:42:01 version: v0.5.2-20201123005537
[kutd] 2020/11/24 01:42:01 starting kutd ...
[kutd] 2020/11/24 01:42:01 listening on http://127.0.0.1:7171
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It is recommended to install kutd as a start up service for convenience with the official helper menus.&lt;/p&gt;

&lt;p&gt;For Windows (see help for more commands).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kut i -s https://raw.githubusercontent.com/bettercallshao/kut-menus/master/windows-kutd.yaml
kut windows-kutd startup-add
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For Mac (see help for more commands).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kut i -s https://raw.githubusercontent.com/bettercallshao/kut-menus/master/mac-kutd.yaml
kut mac-kutd startup-add
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once kutd is running, visit &lt;a href="http://127.0.0.1:7171" rel="noopener noreferrer"&gt;http://127.0.0.1:7171&lt;/a&gt; in browser to find three sections.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Channels - each channel is a placeholder for a kut executor to connect to. If visited without active connection, it shows a blank message.&lt;/li&gt;
&lt;li&gt;Menus - each available menu can be viewed as a JSON.&lt;/li&gt;
&lt;li&gt;Ingestion - ingesting menus same as kut.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As an example, we will run the &lt;code&gt;csv-to-markdown&lt;/code&gt; command in the web interface. First open a terminal (with python3 available) and connect a kut executor to kutd (on channel 0 by default) declaring the &lt;code&gt;python-demo&lt;/code&gt; menu.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kut s -m python-demo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Logs are printed and the command should block and occupy the terminal. Now visit channel 0 on the page, click on &lt;code&gt;csv-to-markdown&lt;/code&gt;, copy the following into the &lt;code&gt;data&lt;/code&gt; param, press execute, then toggle markdown to render it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Name,Icon,Website
Facebook,[![Website shields.io](https://img.shields.io/website-up-down-green-red/http/shields.io.svg)](),https://facebook.com/
Twitter,[![Website shields.io](https://img.shields.io/website-up-down-green-red/http/shields.io.svg)](),https://twitter.com/home
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.imgur.com%2FhQcheIU.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.imgur.com%2FhQcheIU.gif" alt="Drag Racing"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Develop
&lt;/h2&gt;

&lt;p&gt;To build, install golang and run &lt;code&gt;make&lt;/code&gt;. The CI is powered by &lt;a href="https://goreleaser.com/" rel="noopener noreferrer"&gt;GoReleaser&lt;/a&gt; and CircleCI.&lt;/p&gt;

&lt;h2&gt;
  
  
  Further info
&lt;/h2&gt;

&lt;p&gt;I wrote a blog series on kut &lt;a href="https://bettercallshao.com/tags/kut/" rel="noopener noreferrer"&gt;https://bettercallshao.com/tags/kut/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Please contact me via &lt;a href="https://bettercallshao.com/author/" rel="noopener noreferrer"&gt;https://bettercallshao.com/author/&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
