{"data":{"site":{"siteMetadata":{"title":"IJHDev Blog","author":"Ian Hayward"}},"markdownRemark":{"id":"86a5e2ae-fd7a-524d-ae81-18b65d307d4d","html":"<p>How to teach yourself a new language and the advantages of a middleware API (TurtleWare 2.0 pt1)</p>\n<!-- end -->\n<h3>History time</h3>\n<p><img src=\"./images/trtlwear.jpeg\" alt=\"Watch\"></p>\n<p>A couple of years ago, I knocked together a little watch app for the guys at <a href=\"https://turtlecoin.lol\" target=\"_blank\">Turtlecoin</a>. I wanted to understand both Wear OS and Kotlin better, so a simple watch face that pulls data from a few exchanges for a price seemed easy enough.</p>\n<p>An issue I had at the time was the watch face needed to be able to deal with all the API calls, parsing, sorting the value out, reacting to user settings and displaying. The version of Wear OS at the time didn’t even let you make API calls, which ended up forcing me down a companion app route on Android. This move, unfortunately, made all iOS or Wear only users unable to use the watch face. This was something that always bothered me, but I was working on other projects so I didn’t have time to really come back to it. </p>\n<p>Move ahead to the present, with WearOS now allowing Http requests, most of the exchanges I used for grabbing the price of the coin had vanished, and Google had started depreciating their weather API, the watch face needed a lot of work to be usable.</p>\n<h3>Middleware</h3>\n<p><img src=\"./images/mmim.jpeg\" alt=\"MiddleMan\"></p>\n<p>History lesson aside, why build a middleware API?</p>\n<p><strong>No need to redeploy the app</strong> - In the time my app was out, almost every API it accessed was either gone or under threat of deprecation. This requires me to make a new version of the app, release it as an update to the app store, and the whole userbase to update or else their watch face will continue to not work. With a middleware, all I would need to do is update the API it with a new source, deploy, and all the watch faces instantly get back in action.</p>\n<p><strong>Improve readability of app</strong> - A good 50% of the watch face app was JSON parsing and working out the price. When you move all that parsing and logic to the middleware, all the watch face needs to do is receive the API info and display it. With all that code removed, what’s left is far easier to read.</p>\n<h3>Get Go(lang)ing</h3>\n<p><img src=\"./images/gopher.jpeg\" alt=\"Gopher\"></p>\n<p>The best way I find for learning new languages is just trying things out based on how I think it will work, getting it wrong, looking up how to make it work, and finally fixing it. It’s a great feeling as you go through your project and you notice you are getting more and more right first time.</p>\n<p>So for example when I first built this handler for listening and serving Http. I had set it up like this:</p>\n<div class=\"gatsby-highlight\" data-language=\"go\"><pre class=\"language-go\"><code class=\"language-go\"><span class=\"token keyword\">func</span> <span class=\"token function\">serveCoinValue</span><span class=\"token punctuation\">(</span>w http<span class=\"token punctuation\">.</span>ResponseWriter<span class=\"token punctuation\">,</span> r <span class=\"token operator\">*</span>http<span class=\"token punctuation\">.</span>Request<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        Usd<span class=\"token punctuation\">:</span> <span class=\"token string\">\"$\"</span> <span class=\"token operator\">+</span> priceCalculator<span class=\"token punctuation\">.</span><span class=\"token function\">PriceCalc</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"USD\"</span><span class=\"token punctuation\">,</span> \n        priceCalculator<span class=\"token punctuation\">.</span>ExchangeOgre<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> \n\t\tcoinval <span class=\"token operator\">:=</span> coinValue<span class=\"token punctuation\">{</span><span class=\"token string\">\"$\"</span> <span class=\"token operator\">+</span> priceCalculator<span class=\"token punctuation\">.</span><span class=\"token function\">PriceCalc</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"USD\"</span><span class=\"token punctuation\">,</span> \n\t\tpriceCalculator<span class=\"token punctuation\">.</span>ExchangeOgre<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n        Btc<span class=\"token punctuation\">:</span> <span class=\"token string\">\"₿\"</span> <span class=\"token operator\">+</span> priceCalculator<span class=\"token punctuation\">.</span><span class=\"token function\">PriceCalc</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"BTC\"</span><span class=\"token punctuation\">,</span> \n        priceCalculator<span class=\"token punctuation\">.</span>ExchangeOgre<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"₿\"</span> <span class=\"token operator\">+</span> \n        priceCalculator<span class=\"token punctuation\">.</span><span class=\"token function\">PriceCalc</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"BTC\"</span><span class=\"token punctuation\">,</span> priceCalculator<span class=\"token punctuation\">.</span>ExchangeOgre<span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span>\n\n\tjs<span class=\"token punctuation\">,</span> err <span class=\"token operator\">:=</span> json<span class=\"token punctuation\">.</span><span class=\"token function\">Marshal</span><span class=\"token punctuation\">(</span>coinval<span class=\"token punctuation\">)</span>\n\t<span class=\"token keyword\">if</span> err <span class=\"token operator\">!=</span> <span class=\"token boolean\">nil</span> <span class=\"token punctuation\">{</span>\n\t\thttp<span class=\"token punctuation\">.</span><span class=\"token function\">Error</span><span class=\"token punctuation\">(</span>w<span class=\"token punctuation\">,</span> err<span class=\"token punctuation\">.</span><span class=\"token function\">Error</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> http<span class=\"token punctuation\">.</span>StatusInternalServerError<span class=\"token punctuation\">)</span>\n\t\t<span class=\"token keyword\">return</span>\n\t<span class=\"token punctuation\">}</span>\t\t<span class=\"token punctuation\">}</span>\n\t<span class=\"token keyword\">return</span> bk<span class=\"token punctuation\">,</span> <span class=\"token boolean\">nil</span>\t\n\tw<span class=\"token punctuation\">.</span><span class=\"token function\">WriteHeader</span><span class=\"token punctuation\">(</span>http<span class=\"token punctuation\">.</span>StatusOK<span class=\"token punctuation\">)</span>\n\tw<span class=\"token punctuation\">.</span><span class=\"token function\">Header</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">Set</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Content-Type\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"application/json\"</span><span class=\"token punctuation\">)</span>\n\tw<span class=\"token punctuation\">.</span><span class=\"token function\">Write</span><span class=\"token punctuation\">(</span>js<span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span></code></pre></div>\n<p>It worked, as in it passed JSON over, but there were some issues. Firstly, if I want a handler for another call like getting the weather, I will have to make a second handler. Secondly, this call reacts to any Http request with this response, no thought about malformed requests or proper error handling. So with some googling and refactored my second pass looked like this:</p>\n<div class=\"gatsby-highlight\" data-language=\"go\"><pre class=\"language-go\"><code class=\"language-go\"><span class=\"token keyword\">func</span> <span class=\"token function\">handleEvent</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> http<span class=\"token punctuation\">.</span>HandlerFunc <span class=\"token punctuation\">{</span>\n\t<span class=\"token keyword\">return</span> <span class=\"token keyword\">func</span><span class=\"token punctuation\">(</span>w http<span class=\"token punctuation\">.</span>ResponseWriter<span class=\"token punctuation\">,</span> \n\tr <span class=\"token operator\">*</span>http<span class=\"token punctuation\">.</span>Request<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\t<span class=\"token keyword\">var</span> <span class=\"token punctuation\">(</span>\n\t\t\tjs <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token builtin\">byte</span>\n\t\t\terr <span class=\"token builtin\">error</span>\n\t\t<span class=\"token punctuation\">)</span>\n\n\t\t<span class=\"token keyword\">switch</span> r<span class=\"token punctuation\">.</span>URL<span class=\"token punctuation\">.</span>Path <span class=\"token punctuation\">{</span>\n\t\t<span class=\"token keyword\">case</span> <span class=\"token string\">\"/coin\"</span><span class=\"token punctuation\">:</span>\n\t\t\tjs<span class=\"token punctuation\">,</span> err <span class=\"token operator\">=</span> json<span class=\"token punctuation\">.</span><span class=\"token function\">Marshal</span><span class=\"token punctuation\">(</span>price<span class=\"token punctuation\">.</span><span class=\"token function\">Calc</span><span class=\"token punctuation\">(</span>price<span class=\"token punctuation\">.</span>TradeOgre<span class=\"token punctuation\">,</span> \n\t\t\tprice<span class=\"token punctuation\">.</span>BtcFiatPrice<span class=\"token punctuation\">,</span> \n\t\t\tgetjson<span class=\"token punctuation\">.</span>Map<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n\t\t<span class=\"token keyword\">case</span> <span class=\"token string\">\"/weather\"</span><span class=\"token punctuation\">:</span>\n\t\t\tlat <span class=\"token operator\">:=</span> r<span class=\"token punctuation\">.</span>Header<span class=\"token punctuation\">.</span><span class=\"token function\">Get</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"lat\"</span><span class=\"token punctuation\">)</span>\n\t\t\tlon <span class=\"token operator\">:=</span> r<span class=\"token punctuation\">.</span>Header<span class=\"token punctuation\">.</span><span class=\"token function\">Get</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"lon\"</span><span class=\"token punctuation\">)</span>\n\t\t\t<span class=\"token keyword\">if</span> <span class=\"token function\">len</span><span class=\"token punctuation\">(</span>lat<span class=\"token punctuation\">)</span> <span class=\"token operator\">&lt;=</span> <span class=\"token number\">0</span> <span class=\"token operator\">||</span> <span class=\"token function\">len</span><span class=\"token punctuation\">(</span>lon<span class=\"token punctuation\">)</span> <span class=\"token operator\">&lt;=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">{</span>\n\t\t\t\thttp<span class=\"token punctuation\">.</span><span class=\"token function\">Error</span><span class=\"token punctuation\">(</span>w<span class=\"token punctuation\">,</span> \n\t\t\t\t<span class=\"token string\">\"Missing Lat Lon Headers\"</span><span class=\"token punctuation\">,</span> \n\t\t\t\thttp<span class=\"token punctuation\">.</span>StatusInternalServerError<span class=\"token punctuation\">)</span>\n\t\t\t<span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n\t\t\t\tjs<span class=\"token punctuation\">,</span> err <span class=\"token operator\">=</span> json<span class=\"token punctuation\">.</span><span class=\"token function\">Marshal</span><span class=\"token punctuation\">(</span>weather<span class=\"token punctuation\">.</span><span class=\"token function\">Getter</span><span class=\"token punctuation\">(</span>lat<span class=\"token punctuation\">,</span> lon<span class=\"token punctuation\">,</span> \n\t\t\t\tweather<span class=\"token punctuation\">.</span>OpenWeather<span class=\"token punctuation\">,</span> getjson<span class=\"token punctuation\">.</span>Map<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n\t\t\t<span class=\"token punctuation\">}</span>\n\t\t<span class=\"token keyword\">default</span><span class=\"token punctuation\">:</span>\n\t\t\tw<span class=\"token punctuation\">.</span><span class=\"token function\">WriteHeader</span><span class=\"token punctuation\">(</span>http<span class=\"token punctuation\">.</span>StatusNotFound<span class=\"token punctuation\">)</span>\n\t\t\t<span class=\"token boolean\">_</span> <span class=\"token punctuation\">,</span> err <span class=\"token operator\">=</span> w<span class=\"token punctuation\">.</span><span class=\"token function\">Write</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token function\">byte</span><span class=\"token punctuation\">(</span><span class=\"token string\">`{\"error\": \"nothing found\"}`</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n\t\t<span class=\"token punctuation\">}</span>\n\n\t\t<span class=\"token keyword\">switch</span> r<span class=\"token punctuation\">.</span>Method <span class=\"token punctuation\">{</span>\n\t\t<span class=\"token keyword\">case</span> <span class=\"token string\">\"GET\"</span><span class=\"token punctuation\">:</span>\n\t\t\tw<span class=\"token punctuation\">.</span><span class=\"token function\">WriteHeader</span><span class=\"token punctuation\">(</span>http<span class=\"token punctuation\">.</span>StatusOK<span class=\"token punctuation\">)</span>\n\t\t\tw<span class=\"token punctuation\">.</span><span class=\"token function\">Header</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">Set</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Content-Type\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"application/json\"</span><span class=\"token punctuation\">)</span>\n\t\t\t<span class=\"token boolean\">_</span> <span class=\"token punctuation\">,</span> err <span class=\"token operator\">=</span> w<span class=\"token punctuation\">.</span><span class=\"token function\">Write</span><span class=\"token punctuation\">(</span>js<span class=\"token punctuation\">)</span>\n\t\t<span class=\"token keyword\">default</span><span class=\"token punctuation\">:</span>\n\t\t\tw<span class=\"token punctuation\">.</span><span class=\"token function\">WriteHeader</span><span class=\"token punctuation\">(</span>http<span class=\"token punctuation\">.</span>StatusNotFound<span class=\"token punctuation\">)</span>\n\t\t\t<span class=\"token boolean\">_</span> <span class=\"token punctuation\">,</span> err <span class=\"token operator\">=</span> w<span class=\"token punctuation\">.</span><span class=\"token function\">Write</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token function\">byte</span><span class=\"token punctuation\">(</span><span class=\"token string\">`{\"error\": \"nothing found\"}`</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n\t\t<span class=\"token punctuation\">}</span>\n\n\t\t<span class=\"token keyword\">if</span> err <span class=\"token operator\">!=</span> <span class=\"token boolean\">nil</span> <span class=\"token punctuation\">{</span>\n\t\t\thttp<span class=\"token punctuation\">.</span><span class=\"token function\">Error</span><span class=\"token punctuation\">(</span>w<span class=\"token punctuation\">,</span> err<span class=\"token punctuation\">.</span><span class=\"token function\">Error</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> http<span class=\"token punctuation\">.</span>StatusInternalServerError<span class=\"token punctuation\">)</span>\n\t\t<span class=\"token punctuation\">}</span>\n\t<span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>This allows to have a single error handler that handles different calls and gives the correct response and is easy to call or mock out for tests.</p>\n<p>Another important thing when learning a language is to avoid 3rd party libraries where possible. While Gorilla Mux makes complicated handlers and routers easier and setting everything to work as a AWS lambda function is really cool, you won’t really understand the problem they fix if you use them from the very beginning.</p>\n<h3>Test all the things</h3>\n<p><img src=\"./images/testing.jpeg\" alt=\"Testing\"></p>\n<p>Writing and covering your project in tests is another great way to refine your knowledge and improve your code. While TDD/BDD is great for languages you are comfortable in, when learning a new language, building your unit tests after you’ve built your project works better. Writing tests for something you can’t even conceptualize is really hard and could triple the time before you get that first “it works!” moment. If you write the tests after you have that moment then you can refactor that code down to work with the tests and learn mistakes you made earlier on. As an added bonus, I think doing it this way when learning really gives you an appreciation of how unit tests can help you write better code and make sure it’s working before it goes to production.</p>\n<p>Writing tests in go is also super simple, by passing functions in your code you can create mock versions easily in your tests, like below:</p>\n<div class=\"gatsby-highlight\" data-language=\"go\"><pre class=\"language-go\"><code class=\"language-go\"><span class=\"token keyword\">func</span> <span class=\"token function\">TestOpenWeather</span><span class=\"token punctuation\">(</span>t <span class=\"token operator\">*</span>testing<span class=\"token punctuation\">.</span>T<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\nresult<span class=\"token punctuation\">,</span> result2 <span class=\"token operator\">:=</span> <span class=\"token function\">OpenWeather</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"12\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"12\"</span><span class=\"token punctuation\">,</span> testJsonRetriever<span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">if</span> result <span class=\"token operator\">!=</span> <span class=\"token string\">\"test\"</span> <span class=\"token operator\">||</span> result2 <span class=\"token operator\">!=</span> <span class=\"token string\">\"47\"</span> <span class=\"token punctuation\">{</span>\n\tt<span class=\"token punctuation\">.</span><span class=\"token function\">Error</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"OH NO\"</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">func</span> <span class=\"token function\">testJsonRetriever</span><span class=\"token punctuation\">(</span>fullUrl <span class=\"token builtin\">string</span><span class=\"token punctuation\">,</span> \nclient <span class=\"token operator\">*</span>http<span class=\"token punctuation\">.</span>Client<span class=\"token punctuation\">)</span> <span class=\"token keyword\">map</span><span class=\"token punctuation\">[</span><span class=\"token builtin\">string</span><span class=\"token punctuation\">]</span><span class=\"token keyword\">interface</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span> <span class=\"token punctuation\">{</span>\n\tstubbedResponse <span class=\"token operator\">:=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token function\">byte</span><span class=\"token punctuation\">(</span><span class=\"token string\">`{\"weather\": [{\"main\": \"test\"}, \n\t{\"main\": \"fail\"}],\n\t\"main\": {\"temp\": 47}}`</span><span class=\"token punctuation\">)</span>\n\t<span class=\"token keyword\">var</span> result <span class=\"token keyword\">map</span><span class=\"token punctuation\">[</span><span class=\"token builtin\">string</span><span class=\"token punctuation\">]</span><span class=\"token keyword\">interface</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span>\n\tjsonErr <span class=\"token operator\">:=</span> json<span class=\"token punctuation\">.</span><span class=\"token function\">Unmarshal</span><span class=\"token punctuation\">(</span>stubbedResponse<span class=\"token punctuation\">,</span> <span class=\"token operator\">&amp;</span>result<span class=\"token punctuation\">)</span>\n\t<span class=\"token keyword\">if</span> jsonErr <span class=\"token operator\">!=</span> <span class=\"token boolean\">nil</span> <span class=\"token punctuation\">{</span>\n\t\tlog<span class=\"token punctuation\">.</span><span class=\"token function\">Fatal</span><span class=\"token punctuation\">(</span>jsonErr<span class=\"token punctuation\">)</span>\n\t<span class=\"token punctuation\">}</span>\n\t<span class=\"token keyword\">return</span> result\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h3>Finishing up</h3>\n<p><img src=\"./images/flowmap.jpeg\" alt=\"Middleware flow\"></p>\n<p>The end result for me was a nice little 350ish line Golang project. Which <a href=\"https://github.com/seperot/turtle-wear-api\">you can check out the code for here</a> or if your interested in seeing it working <a href=\"https://app.swaggerhub.com/apis-docs/ijhdev/turtle-wear-api/1.0.0\">you can use the swagger doc here</a>. I would love to get feedback on ways to improve what’s here or why I’m wrong.</p>\n<p>This is part 1 of a 3 part blog talking about making version 2 of the watch app. In part 2, I will be going into the WearOS and Kotlin work of the watch app. Part 3 will be about containerizing, automating and deploying everything.</p>","frontmatter":{"title":"Making a middleware API layer in GO","date":"September 21, 2019","featuredImage":{"childImageSharp":{"sizes":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAIABQDASIAAhEBAxEB/8QAFwABAAMAAAAAAAAAAAAAAAAAAAIDBP/EABYBAQEBAAAAAAAAAAAAAAAAAAEAAv/aAAwDAQACEAMQAAAB0VgyFn//xAAaEAACAgMAAAAAAAAAAAAAAAABAgAEEhMU/9oACAEBAAEFAnsHHaUPRP/EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABsQAAEEAwAAAAAAAAAAAAAAAAEAAhARISJR/9oACAEBAAY/AjRyhs432P/EABsQAAICAwEAAAAAAAAAAAAAAAABESFBUWFx/9oACAEBAAE/IVqrBlqW2zPT0f/aAAwDAQACAAMAAAAQg/8A/8QAFhEAAwAAAAAAAAAAAAAAAAAAARAx/9oACAEDAQE/EBF//8QAFhEAAwAAAAAAAAAAAAAAAAAAARAx/9oACAECAQE/EDV//8QAGhAAAgMBAQAAAAAAAAAAAAAAAREAITFh0f/aAAgBAQABPxC80C0RJTUo6BYGFGKYeZDf3P/Z","aspectRatio":2.4518388791593697,"src":"/static/gopherbig-1a7217f26b87bff249249410e928e717-6b3a1.jpg","srcSet":"/static/gopherbig-1a7217f26b87bff249249410e928e717-182ff.jpg 213w,\n/static/gopherbig-1a7217f26b87bff249249410e928e717-7f5c7.jpg 425w,\n/static/gopherbig-1a7217f26b87bff249249410e928e717-6b3a1.jpg 850w,\n/static/gopherbig-1a7217f26b87bff249249410e928e717-45cc1.jpg 1275w,\n/static/gopherbig-1a7217f26b87bff249249410e928e717-055dc.jpg 1400w","sizes":"(max-width: 850px) 100vw, 850px"}}}}}},"pageContext":{"slug":"/middlewear-go/","previous":{"fields":{"slug":"/simple-trade-bot/"},"excerpt":"A guide on making a simple bot that can trade while you focus on the hard stuff\n","frontmatter":{"title":"Making a simple crypto trade bot","date":"May 26, 2019","featuredImage":{"childImageSharp":{"sizes":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAIABQDASIAAhEBAxEB/8QAFwABAAMAAAAAAAAAAAAAAAAAAAEDBf/EABQBAQAAAAAAAAAAAAAAAAAAAAD/2gAMAwEAAhADEAAAAdSAqB//xAAXEAEAAwAAAAAAAAAAAAAAAAABABAR/9oACAEBAAEFAmnZ/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPwE//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPwE//8QAHhAAAQEJAAAAAAAAAAAAAAAAABEBAjFBQlFhkaH/2gAIAQEABj8Ct0xuYxFhS8f/xAAaEAADAQEBAQAAAAAAAAAAAAABESEAQTFR/9oACAEBAAE/IYJKRlqPRzCEKNyMgtfgW//aAAwDAQACAAMAAAAQcA//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAEDAQE/ED//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAECAQE/ED//xAAcEAEAAgMAAwAAAAAAAAAAAAABEUEAITFRgbH/2gAIAQEAAT8QEAkdMRu6n5kUWJ2sqdj5aw6TigB6zvP/2Q==","aspectRatio":2.4518388791593697,"src":"/static/simplebot-04af69521f9190b864115bb22aac72be-6b3a1.jpg","srcSet":"/static/simplebot-04af69521f9190b864115bb22aac72be-182ff.jpg 213w,\n/static/simplebot-04af69521f9190b864115bb22aac72be-7f5c7.jpg 425w,\n/static/simplebot-04af69521f9190b864115bb22aac72be-6b3a1.jpg 850w,\n/static/simplebot-04af69521f9190b864115bb22aac72be-45cc1.jpg 1275w,\n/static/simplebot-04af69521f9190b864115bb22aac72be-055dc.jpg 1400w","sizes":"(max-width: 850px) 100vw, 850px"}}}}},"next":{"fields":{"slug":"/making-magic-mirror/"},"excerpt":"A smart mirror build with spotify added in\n","frontmatter":{"title":"Making a Smart Mirror","date":"October 10, 2019","featuredImage":{"childImageSharp":{"sizes":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAIABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFQEBAQAAAAAAAAAAAAAAAAAAAAH/2gAMAwEAAhADEAAAAcGyIB//xAAWEAADAAAAAAAAAAAAAAAAAAAAECH/2gAIAQEAAQUCIv/EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAABD/2gAIAQEABj8Cf//EABgQAAMBAQAAAAAAAAAAAAAAAAABIREx/9oACAEBAAE/IVhSXDLD/9oADAMBAAIAAwAAABADz//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8QP//EABYRAQEBAAAAAAAAAAAAAAAAAAABEf/aAAgBAgEBPxCtf//EABkQAQEBAQEBAAAAAAAAAAAAAAERACExYf/aAAgBAQABPxD0WfMEiEe3KqBLyJv/2Q==","aspectRatio":2.4518388791593697,"src":"/static/mirrormain-eb95d453870867599e5ae2f96e0ab091-6b3a1.jpg","srcSet":"/static/mirrormain-eb95d453870867599e5ae2f96e0ab091-182ff.jpg 213w,\n/static/mirrormain-eb95d453870867599e5ae2f96e0ab091-7f5c7.jpg 425w,\n/static/mirrormain-eb95d453870867599e5ae2f96e0ab091-6b3a1.jpg 850w,\n/static/mirrormain-eb95d453870867599e5ae2f96e0ab091-45cc1.jpg 1275w,\n/static/mirrormain-eb95d453870867599e5ae2f96e0ab091-055dc.jpg 1400w","sizes":"(max-width: 850px) 100vw, 850px"}}}}}}}