<?xml version= "1.0" encoding= "utf-8" standalone= "yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"
  xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Scdug on Spinning Code</title>
    <link>https://spinningcode.org/tags/scdug/</link>
    <description>Recent content in Scdug on Spinning Code</description> <generator>Hugo -- 0.157.0</generator>
    <language>en-US</language> <lastBuildDate>Fri, 16 Jul 2021 12:30:00 +0000</lastBuildDate> <atom:link href= "https://spinningcode.org/tags/scdug/feed.xml" rel= "self" type= "application/rss+xml" /> <item>
      <title>SC DUG July 2021 - Queries on Queries</title>
      <link>https://spinningcode.org/2021/07/sc-dug-july-2021-queries-on-queries/</link>
      <pubDate>
        Fri, 16 Jul 2021 12:30:00 +0000
      </pubDate> <guid
        isPermaLink="false">https://spinningcode.org/?p=1680</guid>  <description>For the July 2021 SC DUG, I gave my new talk titled &amp;#34;Queries on Queries&amp;#34; which poses questions to ask yourself when migrating data between systems.</description> <content:encoded><![CDATA[<p>For the July 2021 SC DUG, I gave my new talk titled &ldquo;Queries on Queries&rdquo; which poses questions to ask yourself when migrating data between systems. Data migrations are often critical to project success, but all too often that are treating as a throw-away process. This talk is intentionally platform agnostic building from my experience with both Drupal and Salesforce.</p>
<div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
      <iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/4yyRwjO3nXA?autoplay=0&amp;controls=1&amp;end=0&amp;loop=0&amp;mute=0&amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"></iframe>
    </div>

<p>If you would like to join us please <a href="https://www.meetup.com/SC-Drupal-Users-Group/">check out our up coming events</a> on MeetUp. You’ll find our meeting times and, once you RSVP, remote connection information.</p>
<p>We frequently use these presentations to practice new presentations, heavily revised versions, and test out new ideas with a friendly audience. So if some of the content of these videos seems a bit rough please understand that is some of the point. If you want to see a polished version checkout our group members’ talks at camps and cons.</p>
<p>If you are interested in giving a practice talk, leave me a comment here, <a href="https://www.drupal.org/u/acrosman/">contact me through Drupal.org</a>, or find me on Drupal Slack. We’re excited to hear new voices and ideas. We want to support the community, and that means you.</p>
]]></content:encoded> </item> <item>
      <title>SC DUG June 2021 - MQTT and Drupal</title>
      <link>https://spinningcode.org/2021/07/sc-dug-june-2021-mqtt-and-drupal/</link>
      <pubDate>
        Fri, 09 Jul 2021 22:56:34 +0000
      </pubDate> <guid
        isPermaLink="false">https://spinningcode.org/?p=1676</guid>  <description>In June for the SC DUG meeting Will Jackson from Kanopi Studios gave a talk about using his new MQTT module for Drupal 8/9 to connect to local IoT devices.</description> <content:encoded><![CDATA[<p>In June for the SC DUG meeting <a href="https://www.drupal.org/u/wjackson">Will Jackson</a> from <a href="https://www.kanopistudios.com/">Kanopi Studios</a> gave a talk about using MQTT with Drupal to connect to local IoT devices. A fan of home automation, Will has created a <a href="https://github.com/willjackson/mqtt">Drupal 8/9 version of the MQTT module</a>. He is hoping to encourage more people in the Drupal community to join the fun.</p>
<div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
      <iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/qB2rqyYaSuI?autoplay=0&amp;controls=1&amp;end=0&amp;loop=0&amp;mute=0&amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"></iframe>
    </div>

<p>If you would like to join us please <a href="https://www.meetup.com/SC-Drupal-Users-Group/">check out our up coming events</a> on MeetUp. You&rsquo;ll find our meeting times and, once you RSVP, remote connection information.</p>
<p>We frequently use these presentations to practice new presentations, heavily revised versions, and test out new ideas with a friendly audience. So if some of the content of these videos seems a bit rough please understand that is some of the point. If you want to see a polished version checkout our group members’ talks at camps and cons.</p>
<p>If you are interested in giving a practice talk, leave me a comment here, <a href="https://www.drupal.org/u/acrosman/">contact me through Drupal.org</a>, or find me on Drupal Slack. We’re excited to hear new voices and ideas. We want to support the community, and that means you.</p>
]]></content:encoded> </item> <item>
      <title>SCDUG March 2021 – AWS: How an online retailer came to conquer the Internet</title>
      <link>https://spinningcode.org/2021/03/how-an-online-retailer-came-to-conquer-the-internet/</link>
      <pubDate>
        Thu, 11 Mar 2021 03:40:00 +0000
      </pubDate> <guid
        isPermaLink="false">https://spinningcode.org/?p=1638</guid>  <description>Chris Zietlow from Mindgrub gave his new talk on AWS: How an online retailer came to conquer the Internet.</description> <content:encoded><![CDATA[<p>Chris Zietlow from <a href="https://www.mindgrub.com/">Mindgrub</a> gave his new talk on AWS: <em>How an online retailer came to conquer the Internet</em>. He explores the Genesis of Amazon Web Services, how it became widely adopted, and a birds eye view of some of the more common problems their services can solve.</p>
<div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
      <iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/TOMKiiWqqxc?autoplay=0&amp;controls=1&amp;end=0&amp;loop=0&amp;mute=0&amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"></iframe>
    </div>

<p>If you would like to join us please <a href="https://www.meetup.com/SC-Drupal-Users-Group/">check out our up coming events</a> on MeetUp for meeting times, locations, and remote connection information.</p>
<p>We frequently use these presentations to practice new presentations, try out heavily revised versions, and test out new ideas with a friendly audience. So if some of the content of these videos seems a bit rough please understand we are all learning all the time and we are open to constructive feedback. If you want to see a polished version checkout our group members’ talks at camps and cons.</p>
<p>If you are interested in giving a practice talk, leave me a comment here, <a href="https://www.drupal.org/u/acrosman/">contact me through Drupal.org</a>, or find me on Drupal Slack. We’re excited to hear new voices and ideas. We want to support the community, and that means you.</p>
]]></content:encoded> </item> <item>
      <title>SC DUG October 2020: Getting Started in Consulting</title>
      <link>https://spinningcode.org/2020/10/sc-dug-october-2020-getting-started-in-consulting/</link>
      <pubDate>
        Sat, 24 Oct 2020 22:03:02 +0000
      </pubDate> <guid
        isPermaLink="false">https://spinningcode.org/?p=1507</guid>  <description>This month&amp;#39;s SC DUG featured Mauricio Orozco posing questions about getting started as a consultant to long-time members who have all done some work with Drupal as a consultant.</description> <content:encoded><![CDATA[<p>This month&rsquo;s SC DUG featured Mauricio Orozco posing questions about getting started as a consultant to long-time members who have all done some work with Drupal as a consultant.</p>
<div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
      <iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/4NG5lgDOFzs?autoplay=0&amp;controls=1&amp;end=0&amp;loop=0&amp;mute=0&amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"></iframe>
    </div>

<p>If you would like to join us please check out our <a href="https://www.meetup.com/SC-Drupal-Users-Group/events/">upcoming events on Meetup</a> for meeting times, locations, and remote connection information.</p>
<p>We frequently use these presentations to practice new presentations, try out heavily revised versions, and test out new ideas with a friendly audience. So if some of the content of these videos seems a bit rough please understand we are all learning all the time and we are open to constructive feedback. If you want to see a polished version checkout our group members’ talks at camps and cons.</p>
<p>If you are interested in giving a practice talk, leave me a comment here, <a href="https://www.drupal.org/u/acrosman/">contact me through Drupal.org</a>, or find me on Drupal Slack. We’re excited to hear new voices and ideas. We want to support the community, and that means you.</p>
]]></content:encoded> </item> <item>
      <title>SCDUG August 2020 –  &#34;Good Enough&#34; Testing Plans</title>
      <link>https://spinningcode.org/2020/08/scdug-august-2020-good-enough-testing-plans/</link>
      <pubDate>
        Sat, 15 Aug 2020 22:33:54 +0000
      </pubDate> <guid
        isPermaLink="false">https://spinningcode.org/?p=1460</guid>  <description>This month I gave a talk at SCDUG on encouraging creating testing plans for teams that have been resistant for any number of reasons.</description> <content:encoded><![CDATA[<p><figure>
  <a href="/wp-content/uploads/2019/05/scdug-11-150x150.png" target="_blank" rel="noopener noreferrer">

    
    
    
    
    

    
    











<noscript>
  <img class="rcf-image" src="/wp-content/uploads/2019/05/scdug-11-150x150.png" alt="Drupal SC Logo" loading="lazy" />
</noscript>

<img class="rcf-image lazyload show-if-js"
     data-srcset="/wp-content/uploads/2019/05/scdug-11-150x150.png 150w"
     data-src="/wp-content/uploads/2019/05/scdug-11-150x150.png"
     src="data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAArkklEQVR4nOy9Z2xkWXYffu59sXIVi8XQ7Bxnpntmdme0u9JqpdXu/v&#43;2EhayINlyggDZMAwDtgB/MATog6EPBuRvsj/YsGEIMAQFS4ACVlhDskar1XrT7OTQ0zmw2cyh4os3GOe8V2SxWGQ3u1nk9JAHqK5m1auX7u&#43;e8zvpPg5HcqjlCACHXI4AcMjlCACHXI4AcMjlCACHXI4AcMjlCACHXI4AcMjlCACHXI4AcMjlCACHXI4AcMjlCACHXI4AcMjlCACHXI4AcMjFPOgTGJa0Oz78jz94DW7em4PVehsYAJRLOZgcq8DJqVE4e3Icrlw8CZVS/qBP9UCFHfQJDEsQAP/99/4P3Lo3D6uNNldKcdsywbZNZVumzmVdXSpkAV&#43;/&#43;is/e9Cne2DyidUAKEJIUFpzrXUmimXeDyKmlA4sywhGyvkIgTBRK&#43;tvfv9DOH9qAqYmqgd9yvsun2gAhFHMtNYmaBiJovh8q&#43;NXYiEbGdeesUxjwbGtzr2ZJbHW6Oh7Dxbhb777AVw4M3mogPCJBkAsJBiccW6wQizkCx0v/FQUx7GU8kPLNN4BgPu&#43;H9VbbS9otDz5YHZZf&#43;/tG/Cb/&#43;WP4df&#43;1c8f9Onvi3yiAeA6FuSyLvhhhN5OMRbiuSCMq1Kps1rDcT&#43;I3stl3Zttz52tN716LuuE5WJOHZ8c1X/zvQ/g5edPf&#43;JJ4icWAP/3jWs0&#43;EEYa8s0FWMASulMLOSkkLIqhJrwg&#43;iiH0RX2x3/3YzrfFQu5maFVO2F5Yb46&#43;&#43;8B8V8Rv/Gb/0vOHFslLyHn/qJVw76svZcjIM&#43;gWFIxwvgm9&#43;/CmuNDmu1favV8Wv1pnel1favRJEYk0rnpVRlIdVYHMvJKBajSilbA4gwjOO1Rlv7QQRaAxNCanQj7z5YhB/6sZ&#43;F17/5tYO&#43;vD2VT6QG&#43;NpfvQGLy3VYWG6werPjNJreiOeFY1LKnAZtaE2vjNballIVhJQjSuuqUnq8afAPlNIzhsGXldZrWuuWH0RBMZ9Vx8Yr&#43;uvfeBO&#43;&#43;LnLpF0&#43;CfKJA8B/&#43;92/hDsPFmCl3mb1Rsdeqbdw9l9qtf2zkZAlrTRqPaY1AHoIjGkeaz2BgBBCTnDOr3DGHhgGn44icUcIeVMrPWNbZrPZ9sX127O60fTgtW&#43;/B1/50ZcO&#43;nKfWj5xAFhea8HKWhNabd/o&#43;GGl44XPd7zgM0EYnRdC5rUGrnu2x78BtB0LOSKlyjPOphhjDc7YShSLuwDwhmWa37cs8xZjbE0DRK2Or/A4f/aXr8MXPvM8VCuFA7zip5NPRCRwrdGGP3/tDfjo1kNYWm1CEES87QX5RtN7od7s/Eyr4/9kEMaXlFI5rXWa/&#43;i99AQSjDH8jwIAyRiLDM7rrmtdL&#43;Qy38tl3deL&#43;cz1cjG3kHHtDudMCKG0aXAYGy3Bv/uXPwf5XOZgbsBTyDOvAb7z5jX4xnc/gMXlBrQ7Pmu2PN5s&#43;47vh&#43;OtTnCl4wefjiJxUimV2Rh8SAedrQ8&#43;faI1S4mxARosCdIOQnC00qUoEseiKH4jDON3Hce6BwB1zllQyGfUGJT0a99&#43;H9796B65js&#43;SPLNeQLPlwcVPfwWu3nxADH1huc5W6x2z1QnynU5wrO0FL3t&#43;&#43;ONhFL&#43;CbB&#43;0tjZPe7bpnW3VhQyAca20I5UuCalqQsixWIhiEMRWEMVKSRVzzoVpcOUFESwtN&#43;Dv/&#43;N/Bn/6R/9zv27DU8szawJ&#43;47f&#43;EPwgBD&#43;IWMcLjUbLc5str&#43;wF4Qk/iK94fvi5IIx&#43;KBbyjFIqn9j67QW1f6IA&#43;j&#43;nN8UYiw2DtyzTeGgaxke2bb6ecew38vnMnVqlsFarlsJCzlWZjKNrI0X4pz//xWfCU3jmTIDWGurNDvzgnVvwvbdvsNV622q0vdJao32i0fIuBGF8ORbipSgSl2IhjyV2/9F1D4MGP/mc3ji6jFqrilI6I7gsS6UqUqoRpdQ7Juc3OGcP/TBqubYl/CDUv/9n34IHs8sURPo4yzMDAK03bHU248DZU&#43;N8cbVhrzbaI0srjef9IPyc54evBGF8Rko1IZUqK6UcrffMzDGttYEA0JqNKx27QshRpdRZzvmbGvQbuSC66Tr2ahjFkdagv/6Nt/bo0MOTjzUAlFLr/08BwFAMg5vVciFz8cyxWqPpPe/54Y92/PDzfhCdk1KVALSjgRlaowLXe31aqA0cKXVVK50LAMYAPATcaBBG&#43;YzrvB/G8WIYiSiMYv0f/&#43;ufAJqEX/kHX9nr89gT&#43;diSwN7BT7kKnqsNADnGWM0w&#43;AXbMj9r2&#43;ZPOLb5&#43;WzGuVDIZ0aKeddxHdswDc4YT4x4wvX7gaCfggLphCACWErrjFKqLCWZBEtK1RFCtZRSkWFwxRnTcSzgZ/7eP4G//NofPPkNGZJ87Ehgr6pP/8/TgS8AQA0AJgHgtNbwQhSLy622f3a13hpbbbRz9UbHWFlrsfmlOswursLc4hosrTSJM7Q7AQRhBFIp0HurFDRjTBqctSzLvOnY1t9kXPubxXzmWrVSWKpWCn4xn5XZjK0t04Rf/9e/sKcHf1r5WGkAvXlkUNujicoDwHEAeAkAPg8APw4AX2AMXjU4v&#43;A6Vq1YyGRqIyVjcqzMjk2MwMljo3ByqgZT41WoVYtQzGfBNA0QUkIsFCi1PQK6p9DrFg76rOc7lvIDSymdVUoXlNZ5/JtzJjnnAWcsToAC8JNf/Yfw2tf/cK9u2VPLxwYAXZXPkruM/6DfXmGMXcSBZ4z9f4yxH2OMvcwYO4vagDHIcc5M0zCo3s9J8//lYg5qIyVK4U5NjsCx8REoFXO0fz&#43;IIYzip9QE3R&#43;uI4JpeqGnoItK6ZrSehQ02IwxHxh0GIMIfU28vp/7xV&#43;Gv/ja7z/tLdsT&#43;diRwDQa5zDG0H96HgB&#43;hDH2wwBwCQDwswwClyVI2TQnDcaAMwDT4GBbFuQyDoyU8zBZqxAYKqUc2LYF71y9CwtLdYhi0a91dnu2vX8wrRl6CYVYS0drXeIMCoyBrUEzrfRHUqm6UlqwQarkgOTAAdAdgC7LT&#43;19TWv9KQD4Yjr45wGgnGqFRwR0kt3gO7JAw&#43;BgWQZpB8syQUpFFcOeF8Bas7OjOdjddVAwiciq1toVUo/6QXQlNQ9CSuXHQt6IY9lGhffbf/gafPbl83Dl0qk9Of6TyoECoHf24YzWSbh2BADwxn0ZAH5Ma30mJYDmk5JWg3PIug4cG6vACxdOwMz8CswtrkLHDyEI4/6Z/BTXs84T6FpiISs6iJ7XGtpK60UhVD2KBXoH4czcis44NiytNKBWLe3J8Z9EDgwA/YQPZz5jbERr/VxK9nDmn00H3xg0&#43;LgPeqFaQHdvB9XKOYOMa8Ox8Qo8d&#43;445Q9WGx0Qok3kcHNSaPvz7j9E/2Xg&#43;VD0ISGHlhCyEkB8iTH2Ga1hCRhErmMtLS7XQ9Pg6hvffZ/K15GkHoQcKAB6CJ&#43;TunhXGGM4&#43;F/oHfyUF9D2VMgBGqSQROZwBuO&#43;0La7qOZNg7ZLtl1P89K7YRhEEC&#43;emYTZhdOwstaCIIjJJCi988BvPf/tvmHr36UgsIWUE0EYvwqM&#43;ZwzbpnGu5ZpzBmGEaLi&#43;50//ubT3cynkAMBQJfx48AyxqyU3H0qVfvdmV/uzvzemY2DH0UxtXvNLqxSGhjt&#43;kilAMcnqjBaLQKq1oQDbJ6uqAVcxyav4KXnT8H84hosr7YoPoCE8HGkR80/rnCldE4IeS4MI4Mz5limwVzHEo5jLTi2GTu2pX/w7k34zMsXdrXjvZB9BwCy7xhVnsFxgHB2owF8njH2RbT5O6l9nNFRJGjQP7gxDW9/eBfuPVgkFY6D&#43;sqVs/Dpy2dJzTu2NdAkIAjyORdOHavBxbPH4PqdWVhabdA57YYL7BIEhlSqCALO8ihifmAEHS9suY7tu3awlnE9ef/hEnh&#43;SHmO/ZR9Nzxf/qlfJHttmgY3DJ7hjJ1LB/9LAIBToLidzceBXmt04IPr0/C3378K33v7Bty4Mwuz86uwUm&#43;D0hqq5TyMlAtkDrbjBImJACKBD&#43;dXCJR&#43;GKUmoxcE/b/vB8jjoEB34cIBtKU1uPjOgHU06EUN0EQvodX24bVvvw/ffu1PHuc27pnsKwBW6y34/ts3wA9jJpWyLdMYsyzjVc75VxhjLwJAZTu2j4PjBxHN&#43;O&#43;8eZ0G//7MErQ6AYShgDAWxPbHqiXSBoVchlzAwZLs3vcjmF1cg5m5FcABkGSaWM9r8O&#43;2/377Y3X/0JryB7ZUOlZKLyill&#43;JY&#43;M2Or5ttDz54/S8ec797I/tqAt54/zbUWx6qOqPV8YthGJ8/dbz28ki5cN62zBIqhu3uLA5Os&#43;XBnekF&#43;OjmA5hdWAMviMj&#43;oyAvaLQ9WG20qVBEabUtvhkFiwwoFrIwVi1CIecmYIn7t&#43;xPGOltPn9soV5FKVQ5hPi8wflLhsFnldaeG8bNjOvIr3/jTfjpL736JPt&#43;Itk3AODA/fV33gPfD1lTSMcLoinG2KuZjP1KNuNMWKZhM84HKm2c/UIoYu237s3Dg7kVav7YlC7Gl9IU2Oll6IPMAH6PA06RwlKewsfIDVL3rX/rLbWDu5NBYWPtKKWOxbH4dBDG8wbnK7Zl&#43;rmso5ZWmno/3cJ9BQAOYLPjG2EYl/wgupjNOK80Wt6FOBZFDdrYiWKj/a83PWL&#43;OMtjCuNufI/QQeKXyzrg2OaOMYHEQwCwbZNIl22Zmg/8Aev7/54FjAyldSmW8pIZiznl2Lcd21zKZd14abUpv/n9D/fkOI8j&#43;7JEzP2ZRZh&#43;uATNls8bTc9dXmtNrdRbLzZb3sUoEiNKawsSn3kjuNP3UlKRu9b2AggjQYSvK12Vns9laEbjoHKeXNp2&#43;4NUO&#43;B2OPsfT6XvxA8e9ZvNHyZFJaompLyotLoopR4No9hcrbfZzNzqLvb/dDJ0AKCqRncNidZqo200ml5lrd6&#43;uLLWvtLqBJNCSCcNmOwoVLCvUxWfqnmdRIVoIJH1owcwOlKEjOvAYGPSsz8NBCpUt1IqtrVgZC9F9/2fzp9RfaFQx8MovuIF4Sk/iPLtTsCnHy7Cr/3m7wzxfDZk6AB479p9mJ5dgpV6i6/V2&#43;5aszPVaPlXmm3vnOeHxVgIrnsqMruauF8j4984yy3TIPu9/j1LYv3o29eqJVryBf9GfpDwgcFDSzGFWIAXhElWsAdUGy/oefVyC90zkJu33dh/73awvm3vJSEhFFJWw1BcCoLo&#43;XbHr63UW9bDhVWkQ2Tuhi1D5wAP51fRdrOOF5itjl9ttb3nOl54RUh7vO0Fth/EDO17qpSTfweAwExJW7mUo5h&#43;q&#43;ODUsn3qMZt26KsX8cLYXGlkdh220T7Tr/FbYxU3eN&#43;KSvoBRQ/wN9ItYWs9UnyudYbIelBshkEW4ll3&#43;9IC0SxONHxwxdN07iF3rJp8BWDczm3uLbb271rGSoAltea8Ht/&#43;i10&#43;1gsZC6M4jN&#43;GCPzPa&#43;0LjZbntFseyyKkhkIxvbuFc7&#43;SjlP1T440xtND5SMKDSMpgF9&#43;umHy/C6dRNu3Z8nMojsPp91CTjZnheaCwTd/FIdZmaXqWRMUkLo8WRvcgYk61rAD6LLpsHv2Jb5UEjZ1gD&#43;zNzKMO0SyVABgDPxwdwyrDU6ZtsLqmEkno9jcTkWYkyDtpptn601OhTgQT/fAmPbAg3D5GTjz5&#43;ehNO3H1L7dxTHIKSm2bzWaFN4&#43;P7DJRpgnP2uY9PgF/MZSgJVSnkCUaWYI01w&#43;/4C3L4/D42WlwaBdh3i3QvhtHBFLE4GYfxSFItrSqo5P4jCO9MLEsnzyana0A4&#43;VAAsLNVpkYbF5YbVbHu1thdcQHUnlcqBAI4EsdHsUAwcbfZO4RXOOM3oU1M1uHT2GA00mgHpR/RbtOVhFFMRaFfNG5wRZ3AcG7KuDdmsA4VshgJA6Coi&#43;O7NLNLx9WMXhmy33U5h40cRUm0qpUpCyjNCyPMdP/xoebVZl1KqerMzVC0wVAA8mF2mquwwiu1W2692vHAqjkU5uWDNcOavNTsUzo2FhMwOcYCu3z5WLcFz56Zo9i6vNCk5hL9VFARCNS43/Ybi/m2fwIA8AE0J8QLLIA8ABx/fH&#43;8ub90qsfP6EdFBvZ4mTi5vy7ZMabDRLfT88PRqvT0qlX5gGkY0v1h/rDN7UhkqAG7dm4c4luhpuFKqihCiIpV2tQauQFEuf2WtReq83QlIXZtpPr9XumYBSVwh78LpE2Nw5dIJKv3u&#43;EEax&#43;9P5GywdxQpGYGDsRi8gCVaArp1AhyM7iH1xjE3eQXbXmW/i/c420EfCOhYRixk0QvCCc55NZtxHA3au3lv7tnVADfuzuLAcj8Is1KpstaQA9BGcsGMbPjSSoPs8NmT4xSTz&#43;czVNzZK72AsCzUAmW4fPEkkbh2x4d7M0upGXnUALB1dxJNAHoOqA16XUsKOumEV8SxIBcxjAQIIUBIlbiLsDkI9biyddtN4GFKKVtIVZZKVmIhM6223/jw5rR6/CPsXobNAVgUSx5GcVZKVdags70ZGlS9y2st&#43;PDmA6raRaJ2wjbTgo7Bd5YzRgz/zIkx&#43;OzLF8DzqEOY0rphtMXXXpeEE3DyAkZHijBRK1PFMHoJSBbRhUStgD9HjyCKJe232fao&#43;GS13qJQNAINgaH09sd6CjG01jkh1EjHC7Jaa448Z5gyVACgbZZKca21CwAllpR0867uwxmLM/jO9AK8Vb5L7l0hnwGratAs7YJgc2kX1RLQ4D13fooygPPLdag3OhDFnYGDgr/DWY7kD0nklUun4PnzxwkEaHZw8NeDSzrJPKIGQFKJ5gU1zfTsEmmambkV0lo4MHh9m4&#43;323xBn93Be6Mhi4QwigXdqygWe5eEGCBDBUBaX4FUzAHGcgDMThdeSL4nkCiaYTfuzFLV7sRYmaJ6ODMHaQGW3g5U3dVKAc6eGKNBRTPSpOCQ3tTJwyhJlGx74fQkVQ3hC00OAqK3hnD9vBObTN4FkkwEwdJqk0jttTsP4cPr0xRrWF5tkRnbWt&#43;6safH&#43;2y9NpIDA4dxlueMuSzpbhyqDA0A6OJ96Zf&#43;Pd5EJqWyNJI/AEtrKv9e3w7/jzYWZ9nVmzPk846NlMC1US2zLYMDPZzAsS2oVopwYnKUBnhxpQkiVjSAuAllCB0bxkdLcPniCfjcpy7Ayy&#43;cpmOU0naxnWy4plZ0TVoJzcbUxAj1&#43;6Mngvt9/9p9IrFoLgabA7a&#43;/42vd8pS0tXaDFgWklrJoUclhqoBcPZIKZlUyqSkj9IDCz5wpiFg0Lf/8MY0RftKxSwUzewWQtgraNNLhSyt/3/yWA3mFuvrbiEOfjZjw&#43;T4CLx06ST88CsX4VMvnIFjEyOk9jflE7aRtBS5W8JGzSXIIfAdNQ1ygY9uPSR&#43;MAgEuw4q6bRiSGlXCGkhU1aK070Z1mojQwWAYTAII8liIU0hpa20MpNm2q0hUhy0lXoLbtydg3MnZ2mgKKtnb539vZwAB&#43;TU8RpV&#43;aKaJuLW8mjAJsYq8JmXzsHnX70EVy6dhIlahfIISfp3S2/CtsLSFnNmJEmnk5OjIF6SaUEKo3WK8NwpnrBNKKN7zVs1Qs/36AloZcVCuBq0JTjneB1DIJvrMjQA4AxBtRzFgoeRMBWaAa2NnolFonv87iCIKAN2/e4sLds&#43;WimQje4O2FZTkHCB8dEyvPTcKYoCkkqOYhrosyfH4DMvnye1j9vgzN0uTdyb1QM2uNGk60kgCNALgbRQpeMHVIbW7gSgBvr7sMkcwPbagSmlDSGkTd3FtsUyjtWTqNp7GRoAkEmPVUus3uywIIiMmFwcYP1RsN4bgX52o&#43;nB3ekFIllTk1UaSLT1vdKrBRAc6BaibX7h4nG4&#43;2CBkjuo5pEc4kDVRoqUH&#43;gWifQK7gfPNQxj8PwIYiGogQS372006T02mo9CLkP7R4I4M7eaVBYHEaj18vLtyPuOWcdkGRoNpsmYkXFtanffTaJqtzI0AOCNTcutWFLrR0qObbcYU6IiNVX9PFxYhQ9vPKAbXC7mSJ0b3OjbvjdVbBAXOH18jJJFyAVs2ySVXynlqVN4EKHWqaZqtQOKI0yn&#43;QXcvlZNSB&#43;6plkyG3zTsY3UHCDwLpyegOt3HlJMg1Lburd6eHPL2YZru1kLbsYYMyzTNAv5DJ8cG0ET&#43;uy5gZRzT3rwN4e7emzhoIUXurX/N&#43;/OwodTNRivlWkAMu7OpM22kjwBunoP5pbpvo&#43;Nlsid5AYbvLhDmkR6MLsE333rBi30iCYE93V8ogqfvnIGXrlyDo5PjmxpNGEpMaTg1VSynPy9mUUyY1IPCt7pPhMwWAtCFwEGZ65jMzz/buXzMGRoAEBb2ekEWkqpDc6UaRqKKZZk/darZbYKfheGEZV9f3B9mmYh3uTx0SSJs52gKSjkXDh9ogYvrp6iEC4OCpE&#43;xtZ7ETfa0YHcz8XlBrx/fZr6FVDrNNsezfbp2WXqNUANUi5lwTJN6LcgPC1FQ&#43;BNjY&#43;QFkITJterlXczcTf3MeLfeK&#43;kGmokeHgAIOLGGN5Anck4Io5FHMVCRpHQUSwYolqmZVsUVsX/p0QMSQ8OxK37czB&#43;tUzqmKqBitmBdrxLsHCWTo1XQV1Jyr1wUJy0Q6hfe&#43;DNRft9694cvPX&#43;HSKey&#43;TTC9oXnsO9B4ukTVCrFPN47A0z1AUTcoRKMZesQlLIgWGs9vQXsB2zhJs1INv4WGsVCynbnUAtp&#43;ntYcnwAMAYfPryGVTpWkolYiHjIIik54cUT/eCiEgTvtDuB0EMQZS8h3FMfvXicpNcrOMTIzSb0Rd27O1MAQPDNCh&#43;YNsTNMAU4x9A4qjPQCpy3a7fniX7vbLaWl8xBAcGfXzkA/VGp6dtrF91M&#43;AGh1zOJY8HNVA3hI3A7hvYTdJfJsbWg6NMJWkSJZptX92dWdTGQNDvjQyPA3AGf/eLn4JkUmuhlEIFIMMo1mgn214AzZZPM73Z8jV19ay12Mz8KtUR0ioeQUhu4a178xTJQ1KHZmA7KoCgo1y/aaxXC2/HG9BnX2u0YXpumSKI3TbzDX6iKTaRZAK3i/SlxzRN0lAZ19nUjtbPdXaS7rbJimM8NhgXaD7xHJ9JDYCovXjmGCTXpgVoCLXWsdJaS6HIviYzn7QAQ0AgE3/9nVvQ1RJICJttn7wC5ATnTk3SjWZs&#43;xAuMXSc5TuVZ6QVwWivV9dadKz&#43;RaN0X2xgp0HEAULQrSeVNh1rV7dNc8akaRqRZZrSMJhGkzfMNYWGBgDLMrutW5TzAQAf3xOvoGv3kzp/mbJxvHlXb86sB2u67eA4SLOLaxThq1bytN1jzaptPsdjhlFM4ELgoe&#43;/JYwLGxpk85JxeuAxWFJxpNn6D3bvuZGfzJkwDSO0LSM2TYMAMFIe3gMp9qM1DFEQAkAH39E8kr2mbE26gUqqgzwvpMxgxw/S5s4kN4/mYWGpTsWbaLvtvnBrL7t/rBNKO42b1KgarReSsL4EnUEzOykp33YS6h5tQVpE97h8jyo174sBMFqCNGIMfM55jIAyt&#43;1w3hsZNgB0CgCfMdYAgCD9e11D67TbB2fi7OIqzC&#43;tbaru6ZZ8oy1sez4tDZNIf2j18dRk93gIgHqzk3QSD3C1WFp34FgWgWC7hhWdajLkCVEsGe1rU&#43;bvEXXhfc6J1jpQSrfwHWBgQGFPZegagDFitR4A1FMtsOWi0AQ0mh0ifytrLeIHvcvHIRlLvIU49Yv1U9lFHCQceGpVp5L0QUUkSYTRccweT2LQMROPAs8NzQqVjW1TEfyI5WU2TRbD4L5tmsq2zWe3JjAdJJXa/zUAaKd8YBNHk1JRZfDSapPCst3IV1erd2v08EUFH095XokGSKp9QmT/AwGQqH/bsig3sFHC0q8BEpfR80MdhDFTcvAKpJs/25aiKsaYb5pGM5d1/XIhq4qF7FNe7c6yHxwA3cAwBcBKCoZ8ty&#43;x65P7fkgDEkTRek9fImkqtrvoU6pVnzRFmhxPgh&#43;GxDWiuLfTeHPmDgeemH230xi20nriL1FMOXvUAGrLeW2N8G2892UbgUnGmGcYvJFx7KA6UlCnj4890XU&#43;rgwdADoZqSgd/AcAsJouBZM8vy&#43;9iSFV3yYqtDduTlzRYORVUPUuDsZTeEU0Y4VcLybdWCNwgBZIt4/IZY3BEHLdK0hqBBh5ECl4GZ6/3gIm2ObvvmMxUNzgvmUaqwZnqxp0YBqGPnty/Mkv9jFkXzRAqvaXAOAmAEwzxsbTZV8N1tvnv16pv/EJMvCM41CcPdcTaYNdEL/1E9FA3gWqfTQ5QRD1lJJvJmz4eXcRKVpJbKVBIERWTj6/adC7lBrmlupkvjaXpu/q3ND/j2zLWMpmnHu5rLtkmUYopNInJof7yJkhF4WukzWZksDrAPB&#43;uvx7lhZ&#43;TjJfSQ9fIUvRNLzxaO9ZuurH2GiJUr1UIGKZ6z76k0iXAFJLWhD1JKdg06AJoShR9IN3b8HM/CqFeZ20j8BJ&#43;w67GcLltSZ1Km0sNLU7oeifYTQc27qdz7lXK6XcQqmQjXNZR0/Uyk90nY8rQwUAzt5UJXY9gfsA8DYAnEsXh7SRbFtmUrV7&#43;sQY3J6ep6AQun5IwvDzi2cmqR1stFKkz568gzNxAdH3r6cxgH4PoAsGajhtdiC8/ZDKwZELoPbp1wCcceIttPxN23/kswj6K6EYoxq5yDSN&#43;azrvF/MZ65VSvm1aqUgR8oFSocPU/ZzlTCREsEbqAW01qe7awJapsHGqiW4cvEkLK826SbiDc04NpWGvXLlLJw/PUHVucQBdmzVSmS74FASdIoSwhlumID&#43;TZHMIbtvCkmlXusBvi4HgI0oIUUzu17KI8jp1q8p9t&#43;0LfOO41gf5LLuTKmYDWojRVWrFikVPkzZTwDoNCI4CwAfAMBzADCBWsAwuIXq/7nzUzRAlWIOFlYaZBYunj1G9X7jo&#43;Ud6wF6pZcjbC5BTwYWyVrbCyjMvJM30a1bkI/pcezWMcHT45xFlmnMZ1z7ajbj3M64djOfdcWJY6ME&#43;GHLfgSC1pMqaOsAoAkAtxhj76fLwpIWsC2Tj1WLYF8&#43;Q0UgOEDd5o9quQCZjL3e9t23zDy99/CNgcdf7/tTSR8CEsDeHED/T7er4O3t7n3UgPdv2x9EZIwJw&#43;B12zZvZlz7g0IuM1fIuUE&#43;6&#43;ozJ8bg868&#43;t8u7vXvZFw3QM2hdLTAHAB&#43;mWqCGHgHnzHFsiyHRKxezxK4pGmca3XWFd2T/Oy8Lt&#43;GDSynJC0AQEGHbtcqGXTL87jlv&#43;UJxxjqWadzPuPY7uax7I59z66VCTk6OVeDsieG6f105iNXCkRC2AOA2ALyZAgB13ShjzDQMY8sSr49i/IM0wuDtkhhAEMXJ7Fc7LPfQE4foJny21u498lq3E8U5DyzLmHNs613Htt5xHethxrHDfC6j0eOZGKs88c53I/sGgD4tEKVc4K0UAPjKa61zg6bXo&#43;w0zmpk89Tn35eP75WE2Ekif9TYuQOVRHPD07qCbkv4kwUft8YFGANpcLZm29bVbMb&#43;getYN5EI4ufZjA2Xzk09yYGeSA7qgREqzQvcSd3C06kGsNJnBq1nCneS3tKtMIp1LutSFW1vr3//D4QcVOWzORiFZocWlHLtBK3UbiYIZFqndYwqKdpU68vHPQod66FfxRgLDIPP2qbxLrp&#43;hXxmMZd1I8sydbmQpfK3/ZJ9BUAPIaToIGMM3cJrAPCDblwgfWaQlVRbDW7h0mkLNw5&#43;Pc0iIrM/MTlKVcBdE7Kp4zd1HdFVi2KR1u9vHbRuo8mpqaTr2LbN9QolqmAKk6eUeEFI4eTu2kRJ78YjVYTinAWmwRdty/zIcaz3XNeeKeQy3miloJHw/sLPfB5&#43;eQ/u9ePKvmuAnuLKXrfw9TQyqNNHxdXSdfX5xu/SLh6pqGgUffPVeptatmfmV6CQc1ltpPiIR7mkefsopkif3pK3T0LP5JKem4IfeeUSVSRT7sAPoO2FVKvYavtUnzC3VKcl62cXVslrGRwE1N3kkuSMe6bJye4X8pnvVIq565VSrl6tFMTxY1UK&#43;&#43;73I&#43;f3HQA8XcUzlS4hvJneKV8p7UmlPiWlnFS0npBm3XQwqu6OF9DNx5t&#43;78ESdRTjjH7xuZPJygPbEjO9QQLDeEChJ1s/v0I2Aycmq3Dp3DE4PlmlaB&#43;agG5SCDVBs&#43;VTG9p337pO50RtYWpQC1c6&#43;Jy3bcucdh37rVzW&#43;Va5mP1BbaQ0W6sWw4laRZ8/NQFf/vxLe3y3Hy0HwgF6QsS6myfQWt&#43;QSsVBEItGq8PrzY7p&#43;dF4LIQdC8m6CRwc/MXlBql9nPloAsZHSwQAShRtydfrTf8X6cOm4rSTd9C5ZTIOrSdICaisS25oVwOpdOFqL4ho&#43;2u3HqZLu2&#43;0fMFmDwFnPrp7d13H&#43;l4hn8HBf7tczD2slvOd2khRTdTKVECbz&#43;3v7IeDfGpYn1cghVTNVtu/gzP7zvSCOf1wyV5eaxltL6gGQWR7QcTRDne8kGYcEj9UuzjgI6U8de5Yj1rwoVvq3asBdA9PT9cWRB5RzGfBRT7BewtDGeWwtWGASLWYH0Y6jARTWg&#43;q9Sebb5jGjGNb33cd&#43;6&#43;yGeedYj67UCnm/GIhK0v0mNsiPHf&#43;&#43;FDv93ZyoA&#43;O7CWFrZYn7z5YbF27PXPn5r1548HssrmwXNeNpnfZC6JaGMWuEJLLZMWRlJHr5NlAaVm20Rcwgr5IYZcEhl0S2LfaVzfwlMsky8wmPQhby7J1mlTywyh9ZE1MBaG9m&#43;DgG5z7pmnMOo71di7rfiufc9/JuvZsxrXDbNZVGdch0P70l/fvCSH98rF5dOy9h0v66s0Hcnp2ubXWaN/q&#43;KH2/Mjv&#43;GHL88MXwyielErltNKW7luEn21tr9ruYOQ9pEvEr3tm3V/xdD0hVMXojye1B4P3gx5IpxOgNmIUVEpj&#43;4gxxlhskM03HrqujYP/t8V85q1yMTefy7phLuOoZAFrBv/iH/2dvbydu5YDB0C31&#43;8//Oc/wjcdCykd22rms&#43;5NLxd6USzWlFLzSusrEItTEvQoaJ3Tmpab4d34flIvqNZre7YZt6ThMs3a9QeCuMEgm3HXHyMz6KFTiQuqyf2jSuWODyLJKaN/H3HOmpyTmzedzdgf5LPuD0qF7PvVSnG2Wsn7pWJOFfMZ&#43;Lf//KvDuqW7kgMHQFd&#43;/d/8Ivyn3/5znEY6m3EE57wllbynlEIv4SHj/HoUxVeEkC8IqU4LKataaXqSOJLEIIjY&#43;rJtvc122/iF/QDBzZFHVEo5Wqms2E09b5Ekn4BewMJyQzfbvlZKC8PgHYPzedPgN0zTuOo69rV8zr1VKmTvV0r51Ymxcjg&#43;WlajlcK&#43;PxtwJ/nYAADlV3/lZ&#43;Hr33iL&#43;gVty5SxEH4YiXmtoWmZxkwUi5tCyBtBFL8cRvElIeRxzlglikWm7QVGEEZMqW1WoEgHmZ4mvumhExtFm0j&#43;0KOYmqgmD57YRgMIoXSz7aml1abwg8g3Db5qWca0bZnvW6bxpmUa1zKuM1fMZ&#43;qFfMYfKefFZK2sz5ycIPfy1RfPDfdG7kI&#43;VgBA&#43;ekvvUL&#43;9Rvv3YaOHyjfj2LOWNN1bB9Ar4WReOj54S0/jF7w/fCy0vqC1vqEF4SVMBKu1qrrk20BAqPmUYtWDUeChzZfphsiKFD1n5qqJesK0HOHtjSXknpBdzWKRUdIuWIYxoN8zr1p29aHjmV&#43;aFnGHcs0V1zHCkqFnCzkXVUtF2BybIQWqxo7wCeFD5KPHQBQzpwYp2jd7/5pAFJq7ToWcoMI3XjPDzw/jJc7XnCv3QmuCilfyGbslznjl7TWk1rTY2edtOrY6D54GE0Bp6VibRxoVsi7sLRqkDqn4E8uQ8vNXTgzqWvVItibH9um0lcMAAFjsOY69r2Rcv6jWrVwtd2xbrqOPZ1x7WXOWdu2TOE6tqqW87SO4ehIAX7pq184sPu5k3wsAYBi9ywM9cf/&#43;3uwWm/r1UZb1psd5Xlh3Gx77XzWXYylnC7mM3fKxdxl2zLPA8CU1lAD0GUAyKX5BU4cjzNWyGcYqvhj4yNsZa0NLcao3m9qYgReuHBcnzs1oUuFrDYMnrb8aZGGrNtJSRtbNE3jbqWUu3ryWO2jlbX29Gq9tWIY3CvkMrFpcp1xbSrmvHzxJHzpR1480Pv4KPnYAqBXfv6nfpiid9958zo8mF3Wi8sNWW&#43;6KggjVMVeqZBdro0Ub2dde5JzNgUAJxAIADCWPojaRSBwzs1CLmOeOl4zXrhwwogiwZZXmwg2fenclLp84aQ8Nj4iXccWjLHuwHsA0ACABQCYZQweIB&#43;plPIPz5wYW262PK&#43;Qc2P0BMrFrB4dKVL18lf//88e9G17LHkmAADpsrAoCIR3PrwL07PLen6pLjte4OeyblQp5xuZjDNtcF5gjBpPRtJXKe1EchljjuvYzrGxivXy86dNx7b40koTcNaeOzkhT58Yi4v5TGwYPOwZ/GZa0l5Pi1rr6OPns0548thoHEaxrlYKuruA9Vd&#43;dP/j&#43;U8jzwwAutIFwvvX7lPVcKPlacsyRLWcl9mME3LOUVUvpqrf6XlZ1O5ncrNczJlnT45z17bYSr1FRG9yrKJGRwrStizJgGZ/nBauBCkYorSyWTLGlOvY&#43;vhkFV90Poax7w9i3xMZ3tIT&#43;ySDWrt7rqu7NH33nWkNTAgBbS9ka/U2BXPQ2CNhq1VLOpuxNedc9/SLKeh/AGCPDF606tmRZ04D9Ev/APQkmPD//flZlsT7TSjk2HpcQCkNxUKGij963L5tKwue9UE/kiNZlyMoH3I5AsAhlyMAHHI5AsAhlyMAHHI5AsAhlyMAHHI5AsAhlyMAHHI5AsAhlyMAHHI5AsAhlyMAHHI5AsAhlyMAHHI5AsAhl/8XAAD//&#43;v6GKcaFOHCAAAAAElFTkSuQmCC"
     data-sizes="auto"
     width="150" alt="Drupal SC Logo"
     loading="lazy" />


</a>

  
  
</figure></p>
<p>This month I gave a talk at SCDUG on encouraging creating testing plans for teams that have been resistant for any number of reasons. This talk is meant to help people argue for the value of testing, and help you create a testing plan that will save more resources that it costs. This was an initial draft of that talk that I&rsquo;ll be giving a revised and improved version of at <a href="https://www.drupalcampatlanta.com/">Drupal Camp Atlanta</a> in September.</p>
<div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
      <iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/sxXVUw4not0?autoplay=0&amp;controls=1&amp;end=0&amp;loop=0&amp;mute=0&amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"></iframe>
    </div>

<p>If you would like to join us please check out our up coming events on Meetup for meeting times, locations, and remote connection information.</p>
<p>We frequently use these presentations to practice new presentations, try out heavily revised versions, and test out new ideas with a friendly audience. So if some of the content of these videos seems a bit rough please understand we are all learning all the time and we are open to constructive feedback. If you want to see a polished version checkout our group members’ talks at camps and cons.</p>
<p>If you are interested in giving a practice talk, leave me a comment here, <a href="https://www.drupal.org/u/acrosman/">contact me through Drupal.org</a>, or find me on Drupal Slack. We’re excited to hear new voices and ideas. We want to support the community, and that means you.</p>
]]></content:encoded> </item> <item>
      <title>SC DUG March 2020</title>
      <link>https://spinningcode.org/2020/03/sc-dug-march-2020/</link>
      <pubDate>
        Fri, 13 Mar 2020 15:03:13 +0000
      </pubDate> <guid
        isPermaLink="false">https://spinningcode.org/?p=1392</guid>  <description>Launching a website can be a nerve-wracking experience, often times with developers working up until the wire trying to finish that one last feature. If only there was a crystal ball that would show you a vision of how your site would fare when the masses were set loose upon it.</description> <content:encoded><![CDATA[<p>This month&rsquo;s SC DUG featured <a href="https://twitter.com/aczietlow">Chris from MindGrub</a> and <a href="https://twitter.com/kesoleil">Kaylan from Pantheon</a> talking about Load Testing.</p>
<p>Launching a website can be a nerve-wracking experience, often times with developers working up until the wire trying to finish that one last feature. If only there was a crystal ball that would show you a vision of how your site would fare when the masses were set loose upon it.</p>
<p>Good news for you, there is! Load testing.</p>
<div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
      <iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/3z2aGB1s-vA?autoplay=0&amp;controls=1&amp;end=0&amp;loop=0&amp;mute=0&amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"></iframe>
    </div>

<p><a href="https://aczietlow.github.io/locustio-slides/#/">View the slides from this talk.</a></p>
<p>We frequently use these presentations to practice new presentations, try out heavily revised versions, and test out new ideas with a friendly audience. If you want to see a polished version checkout our group members’ talks at camps and cons. So if some of the content of these videos seems a bit rough please understand we are all learning all the time and we are open to constructive feedback.</p>
<p>If you would like to join us please <a href="https://www.meetup.com/SC-Drupal-Users-Group/">check out our up coming events</a> on MeetUp for meeting times, locations, and remote connection information.</p>
]]></content:encoded> </item> <item>
      <title>SC DUG February 2020</title>
      <link>https://spinningcode.org/2020/02/sc-dug-february-2020/</link>
      <pubDate>
        Sat, 15 Feb 2020 20:32:40 +0000
      </pubDate> <guid
        isPermaLink="false">https://spinningcode.org/?p=1380</guid>  <description>For SC DUG Feb. 2020 I gave a talk on the importance of self-directed learning for professional development as a developer – or really any other modern career. The presentation runs a hair over 30 minutes, and parts of the discussion are included as well.</description> <content:encoded><![CDATA[<p>This month for SC DUG I gave a talk on the importance of self-directed learning for professional development as a developer &ndash; or really any other modern career. It was an extension and revision of <a href="/2019/12/on-being-self-taught/">my December blog post on the same topic.</a> The presentation runs a hair over 30 minutes, and parts of the discussion are included as well.</p>
<div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
      <iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/ybNI6UeYzlI?autoplay=0&amp;controls=1&amp;end=0&amp;loop=0&amp;mute=0&amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"></iframe>
    </div>

<p>We frequently use these presentations to practice new presentations, try out heavily revised versions, and test out new ideas with a friendly audience. If you want to see a polished version checkout our group members’ talks at camps and cons. So if some of the content of these videos seems a bit rough please understand we are all learning all the time and we are open to constructive feedback.</p>
<p>If you would like to join us please <a href="https://www.meetup.com/SC-Drupal-Users-Group/">check out our up coming events</a> on MeetUp for meeting times, locations, and remote connection information.</p>
]]></content:encoded> </item> <item>
      <title>SC DUG August 2019</title>
      <link>https://spinningcode.org/2019/08/sc-dug-august-2019/</link>
      <pubDate>
        Fri, 16 Aug 2019 11:00:39 +0000
      </pubDate> <guid
        isPermaLink="false">https://spinningcode.org/?p=1153</guid>  <description>Super cheap Drupal 8 hosting challenge from SC DUG.</description> <content:encoded><![CDATA[<p>After a couple months off, SC DUG met this month with a presentation on super cheap Drupal hosting.</p>
<p><a href="http://zietlow.io/">Chris Zietlow</a> from <a href="https://www.mindgrub.com/">Mindgrub</a>, <a href="https://www.drupal.org/u/wjackson">Will Jackson</a> from <a href="http://kanopistudios.com">Kanopi Studios</a>, and I all gave short talks very cheap ways to host Drupal 8.</p>
<div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
      <iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/KsW8Eh4xPcY?autoplay=0&amp;controls=1&amp;end=0&amp;loop=0&amp;mute=0&amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"></iframe>
    </div>

<p>Chris opened by talking about using AWS Micro servers. Will shared a solution using a Raspberry Pi for a fully wireless server. I closed the discussion with a review of using <a href="/2019/08/drupal-tome-docksal-netlify/">Drupal Tome on Netlify</a>.</p>
<p>We all worked from a loose set of rules to help keep us honest and prevent overlapping:</p>
<h2 id="rules-for-cheap-d8-hosting-challenge">Rules for Cheap D8 Hosting Challenge</h2>
<p>The goal is to figure out the cheapest D8 hosting that would actually function for a project, even if it is deeply irresponsible to actually use.</p>
<h3 id="rules">Rules</h3>
<ol>
<li>It has to actually work for D8 (so modern PHP version, working database, etc),</li>
<li>You do not actually have to spend the money, but you do need to know all the steps required to make it work.</li>
<li>It needs to honor the TOS for any networks and services you use (no illegal network taps – legal hidden taps are fair game).</li>
<li>You have to share your idea with the other players so we don&rsquo;t have two people propose the same solution (first-come-first-serve on ideas).</li>
</ol>
<h3 id="reporting">Reporting</h3>
<p>Be prepared to talk for about 5 minutes on how your solution would work.  Your talk needs to include:</p>
<ol>
<li>Estimated Monthly cost for the first year.</li>
<li>Steps required to make it work.</li>
<li>Known weaknesses.</li>
</ol>
<p>If you have a super cheap hosting solution for Drupal 8 we&rsquo;d love to hear about it.</p>
]]></content:encoded> </item> <item>
      <title>Drupal Tome &#43; Docksal &#43; Netlify</title>
      <link>https://spinningcode.org/2019/08/drupal-tome-docksal-netlify/</link>
      <pubDate>
        Tue, 13 Aug 2019 00:00:44 +0000
      </pubDate> <guid
        isPermaLink="false">https://spinningcode.org/?p=1150</guid>  <description>Setting up a static site on Netlify with Drupal 8, Tome, and Docksal.</description> <content:encoded><![CDATA[<p><a href="https://tome.fyi/">Drupal Tome</a> is a static site generator distribution of Drupal 8. It provides mechanisms for taking an entire Drupal site and exporting all the content to HTML for direct service. As part of a recent competition at SCDUG to come up with the cheapest possible Drupal 8 hosting, I decided to do a proof-of-concept level implementation of Drupal 8 with Docksal for local content editing, and <a href="https://www.netlify.com/">Netlify</a> for hosting (total cost was just the domain registration).</p>
<p>The Tome project has directions for setup with Docker, and for setup with Netlify, but they don&rsquo;t quite line up with each other (I followed the docker instructions, then the Netlify set, but had to chart my own course to get the site from the first project linked to the repo in the second), and since I&rsquo;m getting used to using Docksal when I had to fall back and do a bit of it myself I realized it was almost painfully easy to setup.</p>
<p>The first step was to go to the <a href="https://tome.fyi/docs/hosting/netlify/">Tome documentation for Netlify</a> and setup an account, and site from the template. There is a button in those directions to trigger the Netlify setup, I&rsquo;ve added one here as well (but if this one fails, check to see if they updated theirs):</p>
<p><a href="https://app.netlify.com/start/deploy?repository=https://github.com/drupal-tome/netlify-template"><figure>
  <a href="https://www.netlify.com/img/deploy/button.svg" target="_blank" rel="noopener noreferrer">

    
    
    
    
    

    <img class="rcf-image external-image" src="https://www.netlify.com/img/deploy/button.svg"alt="Deploy to Netlify"  loading="lazy" />

    </a>

  
  
</figure></a></p>
<p>Login with Github or similar service, and let it create a repo for your project.</p>
<p>Follow Netlify&rsquo;s directions for setting up DNS so you can have the domain you want, and HTTPS (through Let&rsquo;s Encrypt). It took it a couple hours to get that detail to run right, but it eventually worked. For this project I chose a subdomain of my main blog domain: <a href="https://tome-netlify.spinningcode.org">tome-netlify.spinningcode.org</a></p>
<p>Next go to Github (or whatever service you used) and clone the repository to your local machine. There is a generated README on that project, but the directions aren&rsquo;t 100% correct if you aren&rsquo;t cloning onto a machine with a working PHP environment. This is when I switched over to docksal, and ran the following series of commands:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>fin init
</span></span><span style="display:flex;"><span>fin composer install
</span></span><span style="display:flex;"><span>fin drush tome:install
</span></span><span style="display:flex;"><span>fin drush uli
</span></span></code></pre></div><p>Then log into your local site using the domain from docksal and the link from drush, and add some content.</p>
<p>Next we export the content from Drupal to send over to Netlify for deployment.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>fin drush tome:static
</span></span><span style="display:flex;"><span>git add .
</span></span><span style="display:flex;"><span>git commit -m <span style="color:#e6db74">&#34;Adding sample content&#34;</span>
</span></span><span style="display:flex;"><span>git push
</span></span></code></pre></div><p>&hellip;now we wait while Netlify notices and builds the site…</p>
<p>If you look at the site a few minutes later the new content should be posted.</p>
<p>This is all well and good if I want to use the version of the site generated for the Netlify example, but I wanted to make sure I could do something more interesting. These days Drupal ships with an install profile called Unami that provides a more robust sample site than the more traditional Standard install.</p>
<p>So now let’s try to get Unami onto this site. Go back to the terminal and have Tome reset everything (it&rsquo;ll warn you that you are about to nuke everything):</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>fin drush tome:init
</span></span></code></pre></div><p>&hellip;select Unami when it asks for a profile&hellip;and wait cause this takes a while&hellip;</p>
<p>Now just re-export the content and push it to your repo.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>fin drush tome:static
</span></span><span style="display:flex;"><span>git add .
</span></span><span style="display:flex;"><span>git commit -m <span style="color:#e6db74">&#34;Converting to Unami&#34;</span>
</span></span><span style="display:flex;"><span>git push
</span></span></code></pre></div><p>And wait again, cause this also takes a few minutes&hellip;</p>
<p><figure>
  <a href="/wp-content/uploads/2019/08/Screen-Shot-2019-08-11-at-9.20.10-PM-1024x578.png" target="_blank" rel="noopener noreferrer">

    
    
    
    
    

    
    











<noscript>
  <img class="rcf-image" src="/wp-content/uploads/2019/08/Screen-Shot-2019-08-11-at-9.20.10-PM-1024x578.png" loading="lazy" />
</noscript>

<img class="rcf-image lazyload show-if-js"
     data-srcset="/wp-content/uploads/2019/08/Screen-Shot-2019-08-11-at-9.20.10-PM-1024x578_hu_f952a48c1dfa9ce8.png 680w, /wp-content/uploads/2019/08/Screen-Shot-2019-08-11-at-9.20.10-PM-1024x578_hu_480fdaa9cf2166a8.png 850w, /wp-content/uploads/2019/08/Screen-Shot-2019-08-11-at-9.20.10-PM-1024x578_hu_913bb629bc3c5476.png 1020w, /wp-content/uploads/2019/08/Screen-Shot-2019-08-11-at-9.20.10-PM-1024x578.png 1024w"
     data-src="/wp-content/uploads/2019/08/Screen-Shot-2019-08-11-at-9.20.10-PM-1024x578.png"
     src="data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAABICAIAAACx52pFAAAtF0lEQVR4nOz9&#43;44k2ZEnBpudq7tHREZmVldVd89w5lsM8EnQPwIE6BEk6Hm1L6B9igG0wC7nQrKruy6ZGRHufm5mgtnxiMpmk4QAzWqXpLyzqyojPTzcj91&#43;Zvazk&#43;5//J/&#43;ZwDg64Eg/xlEYy0zEIBxHq0HlAMAARhA/wnY3yKvYP8x9ivBHzlY/2dgJta//9iJ/y0e8njyjMzUDLAzaAy2RkQkz4EG/WD8wNSwroapL4VBWaVaS6vNIDpjiKFSI10lRHQxRmMMA7RaZe10aZ1zwXs5ldn7GEIAYES01l7vxui9cGtNxGaMNQb1w4ioyweugtLLyrey7npCyrn2j/szOUT1jHHWoTG1VaA2eO8srimlXEQC1rv9gzt8wyWZ5UvEwkS1FosGgNdkmq3RuiGERryU0mXAzG5/ODgnyl5LIWZdMhYByKnQGOIwjMPITMag915EKjeEaAww11aJyBijskHVbb4JwHSp0Kb6oiwskr7Mc0pps54/jwOtNd4HNLaUwlSnGLyzl8ts19QFEA7H8PCG8moC7Wzj1lJajeqfc67WNjg7eN&#43;IXa2FSI2H3H//3/3/xQLEsOjmFPqCigtC40P0IQBvFtAlBN0cAdQCyaD8t737akbdAroN6kqLdACBGuWcSy1/VhaAt8cX26UanHyTc8nyIAjG2OFgxztuxZQhIDFTLQV0Qaq6KmeMt5aIK1Flanq4/&#43;1//V9g893wVR83HUYWRbei7HoS3JYftnCgb1B5/JEbv53H1xdEGN0Z/dms//U5oHtUAiLTnWoPZ/0UWSgnz0fVbD/krpB9eQ3CVWu5Ucs5r2nFDx9&#43;hNvZ20Lh730y/uxb&#43;LqWAK9X9hc/xeuVX13vJkb4wyL7czj&#43;OHxA/MVPvwqhn9F1sDXxw6fTyb1589jDI7XGtcm5RhT/9crhH9Hv31tdfPWu7v0RkYh6oO4nWGuNHn/imn9JR8cp6u3p9Qq01kIICODU16vy18qlEgBZbH9EyrcAe1vcKxJVd6/LekNBzrmOi3LOrbXXq3&#43;NJX/hR4d8fQVqrQBgrY0x3tbBGPFZV8fOt3cBdeDySqm/JgrXhd4isAq2q3w/v5/Wv73dRGvtipT&#43;io7b6t1W4JfnuOu5gM4CBgPgEMx1rfsP&#43;RZHrvjntWBuH9aPmwvqn&#43;ecG4ahm4XV469B92&#43;HMcZ7DwDicFR3nXMddvYTbgJA4yxbWbIewa9XwGsCC9vLeIue&#43;HsxG7&#43;e/zV2I1pjTX9/T5bxK&#43;j6qziMNcGE2wr8nv451XSALdeGV&#43;t4O/4oZME/9vLrb/APnNbB61&#43;DIXz15D9f1p9ZwE0Z/xpW5P/l4xdL&#43;hqqwysX9MfO//&#43;O/yLH13V2P3dJfwh8/r7MXp/OwARoeqnwv8Sd/kUerwOgu722fd2&#43;vUaNbWVvUZhf1RRahdbAefn6ixPALb/5v3PaHzzzT/zo9orrJ0ItkJMsaMf1rQE3WXRrZXEBRdO3MzMzoBGtZyJoDccJpv1fkhF0eN1ae41bXmfvtwzr9bvw1XFLkl5L8Xad1&#43;9SARDBOvPLF5jPIgNEEYZkbiyrP&#43;5F3UldDTU5hxpbD851xWdu6DxEBGP/MmTQc9d1XXsC38F7CKHn9qqfLedcSunZUhdYz3I76geAWuu6rqWUfoX&#43;onPOe&#43;&#43;cu6UIrnsebhWWGS4nMQVjoWSRBJMssSpCfzcQsQipgXNoHYQoJpIGrgV9kDf&#43;&#43;R99NWspy&#43;WcUgKWlYrDgIe9NQa1ctNaW9d1WZabAIjIe39LNl&#43;f89rhxBh3u13PRr334zg60VmDGAbeH8E60XFj5U&#43;mrbKPuMlA9R1DFGswRr9U5Z3/r7xm/6ZH77taYE/Et3ZTtXgtunQn022iC6C7GufcLc/vkugn3CpmtzS4n9MFppUDZlnxUqCVa22/wyF5t7xe8yaY7oXEHd2CM4vYhhHH3V9MKObW6rqU80tb177ENka/P9hxMqpzvbZzc/G36svrWks/p1eCb2U0ez26YIhoK91ssOf3sSZDa1yy&#43;KVuBNqGhKsubOegQe8hjn8xAgDtZnFOXGt3A2gdhoDO46si46vTfz/Svn79lxX7bjRdfvgnizIMxJvK90XfjOPWB7ueaKzYgUKjf&#43;vF&#43;K90KH3gdSMF/02f7qsA6Gfq/Idvpf/16pWfn4Bb0/Tf6ub&#43;nx9/Inf8b&#43;S4uSDXw/Tt&#43;EXC8PpNv7jMrdD2i3ob//xf/POL/Yml&#43;f325/Xa/AcM&#43;tWPNy3grqVfq&#43;X9szbK0ut7&#43;UPHVuvFjQKk/I9bZ/eX6RT/8p5f/&#43;jWZL91ba/nvbogun/8x3/sL&#43;LtHITbn/i1fyuX2ZIx3jgRinBRWVzKE8KvDq2D275sXxvw157&#43;NfD01bl&#43;IL4uYl/Tn06s0EZ2aa3URp3UdVt9/bkReACeIQIMxnpngeX8zFytAW/RmEYbL&#43;bnK/i10N5Bn7c2eBuCs85ohtq0T6gYRi6z2boATbmgrFtfhCstTYCL/ikPTttp2g7ppwFUYjRumnaHw8H9&#43;3//v3fdwaskcXsqeTpjsOOm3suv18CPIJdz1jhrvLcx&#43;BAkCej3RPrJtOWTJF/65H1VGYBuTJUO&#43;zRVucIzVLRtuwwM9hQUaqUll8ua1lwbtU2nBAkbb2xAGwDGRkfGNyEcQgCmOednojk42A3gXSOubfvkK10A6EYaU62wBqch3O3j3WEcxkAEp/N6viQAGAc/jj5427Oq2iiXmrNgE2dlKbRcQNSoVvlKpebSKnGpojfWmCm64G1jWHJzYfrV3/&#43;7f/iHf3D/4f/4D4Dah9cOSz&#43;MASsSM9Yab63bOFhUGlWNGUaAsA36NQx&#43;v4/jEAAgZ/3UtvU0uwC0IXqj8IlgqQfyvhayyqbLUpZaV9/JN3YzTZVLbbTmclrSeU256kqq1lqD0did9QPAUNs9wTsf7mM0zOecP3E7jYHvdjYGhW9XQ1SdkttTAZirw/HOHHbx4W48HsdpirXxp8&#43;XL8&#43;zQXw4TsfjOA7eWiOpcmnLWpY1t8ZWBCB3KYrWuJa2pnqe05xKJc61pVydNff7YTf6XOl5LnG6B2O/&#43;/Y79&#43;HDDwAkirZ5UfWkKFe0YnTGGutMz79VAI0AwUna7YbgY7CleKZYiyQdy1LWteTS9cIYi3I3a8mplqZsPDErEUL3UV0E/YO85jHGWqdIWQWwkUhBaZCltiWXOZVUahV3JODYAke0Ga0HsETPDF&#43;MvXPOAsytPRuYx2gvuxDjZsjYLcz0viCrA3HO9rtFdJTreslIl&#43;XsUmmfvsync3LOWNg53FHxBrGRqP&#43;y5PMlp9IQQE4wW2bUKs1rfj6ny1JIFXfJxRrT0pDGsOT6&#43;Zynu3q&#43;XEqtjlqVpzM9CGy8w80ndZURPyeuT26WCNUbxmgPu7DbxRhcCG4YvPe21gYoKXgtlXszsi&#43;i2KUkLspOQcMbyXVzU3pVIkPUrDNO4QHU1hX/FgG7V2Uib9RgmxhXKG0QG2ERBbNlzgBnxI9FokJBXqzlZsdSWe&#43;me2prDbAF260BjIQwdha8N8Eba6DWOl8qGhRFPq85V2CXU07JApdu1l3HT&#43;e0pAqAMdgxeu8sA&#43;dST5d0mlPKbStUtMZEOZcF&#43;bLWZSlurE2piK5TCnsM6NQtURCjThnBaGhUR4wabcQt&#43;OgPh&#43;F4N&#43;4PwzB4UR8nRpxSybmttnRzyZl14UUFbmxgjdjmimm22CUyAGialdAmmPaK2AV98W9QQvmmZBvtGSZjF4Mv8gkU9Iwib1DWjNy6iWiiRh0kBmQ0KMEMNBqorauXg01RGtUiN6grgLk2rbmRkafL82xKscDi4ue1PL2sT&#43;d1TSKqaQw9aNXWXs7rl/NyWTIRK2cZciUEuKxYKq25ptKm7fPBdYRD/BXNqx/e7FUstBPWNYJbTbhjcGP04xh2UxynoP4ae3QOoTqX5duiS7&#43;Rs0XYXf3tlbRHLB9k1W7b1RT4Goau2OnKxVAhfO1o99JKv&#43;fuT0BNAoAQVsDW2cPWekkPbUc4vXmE1HmwyCCRXICNdcCmKcTCVLv&#43;OSfWoNYpt1dKm5ei1TRn9WFzaUkAUmtEBo1eXO4hlzavdV7KkmsHPwjYtacxOyOuuDS4IkN2X5MW7OFXnsca7PT/rp585Tb2/6hjG4VEGo1NV3lBEdY4xQmoStd4C3RNVxyQBbZ1MpFiDqvQjGrbTlUOgbNO4k3dii1XOI34taIukamimYEMQEA8GJMk/nHCLhCr6y94tEeWWyEfrp6tF72cs9MQplGMp1SulbqoGQyLIMA70tIXtsZJMI&#43;gPmtNCH43ydVqI2vNOPohemZRdkEI0NddzOqWPuRaM4jwFEKqWwd0uAHBXsAzwfsYnMA&#43;Ceh0LRTJwsnCG4YqwBbOqeNFre6JFpdcJR41iReyPNb2tKAjv23o44bq1eZYjb&#43;/bhg7IvLODdG3RrhihtraBpiu/Q79MOeKo2LbTBlbA/VdhriIK0NrXdBFkthuTHROxKCPq7zL6z0b45zd7eLjw/5wGK11tXGpYrjqmlh8M7Ww5pQKXJ1wv92eJXjvYvASIRBjdCHYWtXGtmqoTl10z3BNgPpUgPcu9LCP6IxGAKNXdtYO0U1jBOBlLYl6QFQfRJpztM0Tq1snZQTLovbPzrllwV2MFo0zVNUERE4mCGCXFcENRDfRta1GaGL0nkSuztkh&#43;mkMgp&#43;522ljUtirAUQTPlUc58DZXJFazdSMRpGCho2J3o1D8M52wBWc9d2mVY7OmsH7YQhxjNNuvL/fPzzcHe52PgRA05rcxhbuqZac53m5XJZWCzMVBRfe23EUESvUQjUO6t7TKpi2FoP8VIwj51Z6Z61DeU3TrDFdJ4zgyWspwWKXgfHqUopp4sGv7Z7Wc5YrQbs2QwzWraIL1kzThrJ1KEdusecBhcEKRNNUQgK4iLJDeIm0JPoco58m8QBrqtba/X4cghPYWikXwU5s0VyTwX6zxoCTdNdl61aizLThS2uG4KcYdtHr1Ik6ToOa&#43;mmV34ja7nbDw&#43;Px4fF4fDge7g67/RRisLKaZsuFNnomkXa1zufLuszLslwucy3VOYGt3jsQPCoPmnNF1UVrYBjcXY3T4BEg5Xa6CEwSpTQ9qcRaSf1uhxMqgFvfRVIJDTjd76jGotoRly2b5c2Q9acq4bIsqWfqpFM0XSRebtHmLD5Vk4ntOk3gTqu1B3YI3u6meHc3CSCbs3X2sB8QUOwautcS16EDUOYrERjQO1lrsUIDjVqPDNH73RB3Q4jeKSCRrFzTZhasqfDh7rh//&#43;7N&#43;&#43;&#43;&#43;eXzzMO52uvSupwAGzet6SDeZcbfb7Q9pXU&#43;nkzFPLy8vpeYlCa51zgxjJHWe8u/oNFnRjFMhw7wIgmoNmq5Mj6/FtN5U2KbB1HTUFYgKU7mObqnHQc2JjDj/UrVRca3sbBhaQkpKlYk12Jke8phtCHYcfe13o3mUZgNiRqUYBXxyCyGIu4jBldqcRjZrbM4l56oVGBHedTgQvlalEByYMUiCGCW5pz5CJM7He9V&#43;0&#43;2VdJxCYKnDEP394/H77999//27xzcPwyh&#43;X0fdkKsmPNiuRRGtAWjIEkXycRjGOIwhDD6Ep6ennNZGKfZPMppI6J8l15Tampo1AqKuHZrGWzPFqI8S4OW3B0PXOjTomtUIxeq3Wl6n&#43;PueuYAVzwMSg9sVKorAsuSBrTbv3TAGr/mO4m9JDRUdCbQoudbaLG0wv4dHfTxBuVly95xLQ6wzrKuk&#43;JLsKvtCK3EMV2L21&#43;qn02JUJNerHgbNFtzMZszd6/V2&#43;W4a3r59/NXfvv/uu3f393chBANIOYukU66lSLAzKJmg1yMEH&#43;QvJ/FcPLZzPvgwDOM0Tp8&#43;fTydTynVDlKr1rtqpZTz6ZLmJXtvEcMG342kJDqAQb3i4hQXGH0Y1xFGX/EeTGgD2Ggkk2lGZ2&#43;6c&#43;8&#43;oec5DFBKWyCXKg5nGMEH1yGLojQnXvIqAHHEC5dSlpTXtSR1i8H1UQValpSyxLdaWyk1pVpKo2vmJn9p0VFB0FaItb2tKumFKq&#43;amVVPwlueAH0sFI3ZTeP7b7/5u7///rtv3&#43;73kzOG1rSc59Pzy&#43;X5lJaFa7PehCkMuyFIAA/iQH0IwzhOuzhOznvF19Y5H1U29ic/z2dZ9irQg4m9M600dd3otUZpiYP4YauuCTtyUZRub4xnURdGvnF2e6lSXb9oq16ZbJ/iU/x&#43;mwdrjRJIIiJ&#43;3zs0ZhwFijegHks0DTG3qot6lTbPeV5yrSQYLvrdfvDe5Szh14tB23XNWxMQ&#43;/pr5oZf688St71okFZdtDXbEe2tdn7FbggQrB2n4f37b/7&#43;//c33373brebgHg9XU4/fvz42x8&#43;/vhpPp1Nq5O3x&#43;M0vrsLw96XgBkLmxXsxY/Lbr&#43;7k6Q/DuqyYncrYidfvnx&#43;en66XFLJTXCBdSI5Z4jYexOjK7mVXKmRLQhQmsQDkgDGW8KrTh6RtNCjpQiJVL1xr4Nk&#43;mxN8qTbcLX6c7GT1qASGmwGTSNwvq6pSAwwmDKkVMUhBDcMQTyYAgbJt0RjO9630zTcHSZr7YzJYAvqNWsj39g6Tdtu0n41oBCCvzsMQwyt1qRlOdpG5fBr1qLFDwQYx/ju3Ztf/d337799O00jtXZ&#43;Pn381999&#43;PW/fPzdh&#43;eXE7R2jO74MN7H8DDS4BvyUuecckvVFAh5nNL5PD087u7up/0&#43;BHFMZi/RTodP6flp7knoNRtw1L2FAXLsg41VHibXBgUArlCzg3JlV9jWJPyigusYvUBoK9g290T7Wlg2vE3yvaK4K3QVGzKl8rI0gNyDNiKE4Pe7QQA7YqmUEgmMRhuj&#43;JUg8WJbMkVlrdXGRowv&#43;A1f91TgyurYakdj9LtpGEefVtPDyZaZt6/FIrJiBM65x8fj3/zt&#43;3ffvhmnodb2/OX5N//0r//yn/7pp9/&#43;OJ/PVOs&#43;umk/vf/&#43;/vu/ud/fT&#43;hsuaSU5nJKvDQiJB/b5VJSKVnMbX84xEEeahxHYMipnE/L&#43;bKsaV2W3LMtLb2o&#43;9aa3VpqKlWDYFMfY25TRgggtmwNdhpeHMJhv5vG6L0VD5Nql0F/eHFKIg9ReUkzxB9v9TvstUZn1cLk4taJCw1xsD5oaQlsoDgY55v2lVgLX3w6r95ajWANuCH2edgO/EXiYrMoWciVoYbea0eEr8O7Bi332u3XGXGxOGd3&#43;937b795&#43;&#43;6baZqY6OnLy6//8z//p//46w&#43;/&#43;3A&#43;z1zrYNB5e3yY3v3q8fG7ex9CLUyJxCmnypckoBLPaU5r0szxii9vMnjz5k1KZV7Thx9/mpciqE9gXuulztramksuVeJzrT0jM4i5tE25mSXII9jWjGQ8zoVhmPa7IQbFl7noef1B&#43;zR9LcU5JxroPXPv1Wmyto1598JIHMc4TXEag3WiET7Y3SQmK37ZI0JNOc1zSmvJUMx1q4mtYqQeURug2inqgRfFN3pnvDUk1ilP2Z9HVep6G9dkLQ7x7bvH9&#43;/f7g87g/Dycv6Xf/7N//kff/273/ywXuZam9JdcSuI6K1Xwjm1y9JSInHdlfJa11rnU8G57SvD5lvkXuMwaE43vXv3zZpySvnL05ck6ctW/a2NBM6lrHiCO7eWiFKpuKY5iUWJALRyI76f1cRSSos4pcbEYjSazCiSEktXAWTRteAlR9BM2TrxFbIggvobskXwIeA4GJ2wp1rLMi/rUpggBhcF7AsSaZVaFkMwghnEEjsXTf1cr5b2svBWBeysJ61ms6iTJgpbkL/mKLCV2Nzx/u79&#43;zf39wfvbJ7nLz98&#43;O2v//lH0f0LExkL1iI6qEiXZf7002cLhGH8/JRePr3QZbE5t7XOa31a8qmu9lxqaaY1C2SN4BxrMcQhBH&#43;423/37bucM0Nb5gsxeb2NJLpatSfcEQEakDUs1KDUJCagfLpUau&#43;xFa3c84lzSt45UIdzjbyCMahDWRJQlHOKwctCOsFbSqbcwmEVcEnB0xCaNR4ASlrny/l0ThaNs6Pknc7UarSrLPlICH63i9478XtrKaVuqB9RH9XYrcBnekWlB4YenFR4tpd7CSWEeG/3&#43;92792/ePN4P0XPJ68dPp3/9TfrxR15my4SSxaGd0AQsjj/Z9OuXLy&#43;1WDM8fV5Pny&#43;m1ghsK6&#43;5fVnrqbaQmmcemAI0b8A7eXC5MR9iCPf3d6W8ry3/&#43;COv6wrI3ttQnBjEvKoLUSytlqHogK6lXnDzWnrDj6l3Jzb271azv5bmFWls5IlOaCk5e2eDt5JMXTcf0G1ToNVSJJ110etGB1qMAa5grHXggxpd0pKGAeVQ2hAlJSZia01ajZaARW0sXgXQC3nYm3TiO7bYox3kzkVAFDC&#43;343fvH18&#43;&#43;5xtxstcDq9pA8/0E8/juv8ADR45MG0R4RHxAEbwpNtBdafZgrLnL/kcsqC3xEiq6/TNjgCSwLzwrMlZ8E7dCIDO4hm&#43;GGIDw/HyzI/P5&#43;fTzNDuxYeJCpXap1NeOOrS1SjrbbmJCXSlw1K9uR8jDE4Z5C/tgN7uODeju/VGf2Hk4e3fSMUJY6KRmuZ0KPxDA6w5&#43;Ps5botBjeNfoiSNBRfdf8R6yRcOyYqRZDrNEZnbd/MRktPbLYKqLasgDvsF/uwXyk5PXXw3g5DuDvuH9/cHw5750w7n/Onj/XTT2657Li9dWZFmHcmHQ0/IgzazmR4Tu2UcliryQ2rxMO2dU05M6/MCdhi85zx/II/gEYmtM5b5&#43;MoOjCMw/F4nHb79MPH83meo/POrIJiqHSWAr/iEL2aO3Ud4HXg4b2XTHsceqWihzglwFDHQhvawW4KKItn1ZfX2jsKXlMk7cnE1lzKhtgSiVxiaEN0Q/ROqxAh2HEQyBu0D5tSWdeCiOMQrTM5o6Rtgi6h&#43;9Btt6Gv0FdTd&#43;1uAG5Vdyfpj59207QbvXdcyvL8cvn0U728UCuG4c6YXTBxcuvOtwFraEV3PAJjQgy7g8dWU56BySF4A6lBBr4AF&#43;DFYLJNwvPTs3ycsRgGEwdRtyAB&#43;bDfPT4&#43;jL/98eOnp2VNwds117TRRBpsfUbYmB9XGo7r&#43;b01KH7t2tjHrXGC1&#43;&#43;v/2mm1ktruJV9On3LtF7wlYdhrsSSJAsMCKFPQYk/3ygqpYrWO7vfiwWH4DtbZ11yNwKJ0tZkY5YltY7otFDIvajbR8ARqMnnSORuG7vSCT5FL7mSRP80L&#43;dPn5anp3VNp9wW4mO0dw8Tvt&#43;3t8My8AutCxWyGJy7O0x7Gi7D5cckGeudNwdvz4Wc9jQWC7OhBWElrpmovlTjWxghiKrvj5LIj2N88&#43;bh/ds3nz8/nS8vvUDU&#43;8wCZCTR5etmJR3awTYhY1AggRacTI/v2hc1vRV11foby7qjFDYbH0ytRPB7u1K25HOUONJKkbgfQzDGM5dlTQArMMcoridGrxMlEnt7wK&#43;1lVyiZnBtCIhYykW1lPp2RlstSj&#43;r9&#43;lJ6xwbd8g1ZWxE5yy1tp5Oy9OXvMznXD6lVgHeHcfvf/Xm7m/fmIfdaulc1sQNAQPjZILB&#43;AGf54/neU3TYO6n4Ct9AfqcJCFLBgpRq4yFOMPy05czmKS1EWvd7u7OO3c87L//9u3L89OnT9xafcFkN3&#43;xVbc7O8o06p0OsVqt1QJvxSwRg5fsuG9Btr2198U7312ru1or3QhOWyarHTjx9c47hJ6wgHWi4HGMtdQ1ra3BuopzD2sZx&#43;juROTBGda2kDWoZaJWSkUcDvsJAVMqRW5WRzGvpMDbTm0bZePKe3TWjuM4TaM1plzm/PxM51PN&#43;bTWcyXxTo/7h&#43;/fvPn&#43;rT/uyZumwAkbmTVBg8S&#43;nNphN8C67nZuv/MmlbGWjSvqsAGvDV6YXWmpzk&#43;VzsTNuqAd4RinaYzv3z4u83fjAKfTqYrzxa3Xot6/97h7Q7BLwPXSYSPqrMte8u0lbnHOglAF4zMxMpI1rbbSGS1qXtaiQ&#43;istmt1Arqf0JqoHbXdlJFC0HF9gbI1c4uRDaDrhXdZu6gmaE/nNZc6zwKFQ5CYsS5J9/fq9Jlel/2andnrJ0sCOA3H42EcBwNQ57mdniEtKZXn1CrDg4SHGLRjMOwmO0W5CBO0wrmQSuF&#43;v7w/Dnuzv9/FycH6dG6WW1Duxeatua6UiQT5rpmeL4enl5fT&#43;SHlECUS3Ela8BYhEVX3dOlNyq1&#43;g6gFK7bXcT/WOeE&#43;csGaRsGVq4m9Pdv9A0LdQCpzyYWVqdRrE53G6b2VxFjSP/GYymm02iHw46BFNuRWY/BKu2rZWZ7GOETx9XitMHVQFLxbuaw5m7OS/bSo0kPwVqFWR9qJrroiW3Ty3u33u7u7QwwBcub5AvOFa14qFcRpFx8edtNuQHFZGsy0QAjcRN12ezAR1/p4vNS3&#43;yWSs6ZqWzRV0l4Bc1PPTGD67BaAR5icGSQfhdYqM1ljhxjuDvvTaW/tZ&#43;6lN2c2no8xfUssp10jv2me0cam1in7Vy0VWQC1SqVpOtwEx2tnJJeyLmsuhbSWXYKL3lJzVF3vtuvkthzZWa1&#43;Dwa9sh&#43;rtaTlhCEKBIrDEFBbwZqua&#43;lqLbVxbzNJrljqsuaej2exPM0qJX3H2FkFnS6hKiPZ3H4axf9gSameT3WZl1Qzmvs3d7u76btvjvfvH&#43;LxaOLIlepphpbRGzuOZhiMH9G0w5sjXB4vpqTT5bQutGYs5Cpb7TIEwF3GWBEJCvDAvKM21Iq5FME61epthRh9GADESIw1UWsvbmvi64ip8/tp6PrntPKMt&#43;E0vM0JEmvhZ&#43;OndA/MWmla1jWlxLp3Zs22BldLrylB53Rs3HWDJXtuidvgvEVsweEwCtIfgu8jnymXp5f56WXufJCUirVGAMkUdXfLsqa8pHpZ8iXltYj3Y6Jg7WEMu6g9QS3SOoMhhmkSJ0CNlsvly6enT19Oz&#43;dEQ3z3/eO79w8Px/3x/jjdHSQ/mNeaZgSydwezj&#43;AGsAEj&#43;fuHqRRxybXiy&#43;yZ7gHegfGNS&#43;Ox4aEZS7giV6ZSW53X9PS8PJ/SZSmHvRe4YbUOP4gH9X4/DoMWsIfofJCIW2oDsMe9vG6N8oJgixJa5C&#43;5IRumzFRWuHHq7ZWX0EpBfWCjhHerfWESG&#43;nzgluzWEsDWJgXCQk8jkF8WnD7IahTcmgwiSzzl&#43;fLh08vvV5Scu0VISYSRS6Co09z&#43;vhy&#43;XKel1yqsu6jsw&#43;78Zs7Pu4GybSV8jIOwziOxmLK&#43;eOXl3/&#43;8PnTT6dUyi7EMIT9YdzvxxC9Qabl0p6fOCc7TdZ4WX0X2DhxD8PkHr8Jrblc8LQYez4Y/A7tHXAh9g0iGXC4MJxJPHoqZT7P8&#43;myLmvJhcamRE1tddwdHh8OSq9jSfW9&#43;GpStjqDOR6GIYr2u9uGuIJzSuV5tWIjG6moV4M6Ha2TqBzwAUXfOrei4ydDaJvuV8Z8cwrypopmVXiZwQ3egYsRB5Lg11jHnQUdlWXN3W0J3ml04plbi8E3paQ/X5afnk5Pl1nLh2Kti7VE5J2kcgOKN52meLibpmlEMPOSfvr08uOn8&#43;UlMRCc1ufP53cPB3s8WKZ2fqKXL/T8DGhNjH2rQ6V1acHEWAij3R/N4a56PxOttbnGd6RxU8cRrLN7a3eNcmm2T0xW8T&#43;1irNwyF0Abx6P63oeorhJu5HXBb7phIHbT1qTFGx1ne5ChrHht82/oyGQJWWib1kyouUtOduqHD2rU/KEOH2CrXfI1913JbiKrzRkbDMum7DaMeE&#43;U0itHrAE4Ma9ytap8cSUS1HXJy6XtXR1mdPTeT7NEnboukUkEZ8xvSzrMY&#43;H/Rijv7ub7u8P4xgBYJnXp&#43;fTfFm4SrpwOS2fPzydj7tyf6jc6ukLPX&#43;ClNy0AwOMRjQyt87EFHvPtaSSlnyZ02ktc65AGA16zWJDcJPSOCrjPJe1VGsYW9V2dqXaIEqOHMUfjs715mMn&#43;ECDK0PQbmyKHhskx6pMke07jP8D3v07uBuMlxTzyhg1ryanej1Oey5ma3935VFBbl0Bg/hqiw9DiNWYBnYFd4J6ai/fwHKP4OXjvWiERJpS2rxmahysBLNgbantsuTzsuqgA7/aSoRLa5c1z6l0auYwxHEcnHOt0npZ5hcdcicqzDmRe7789OHzNIVltO7yZNPsnfZsAHMhmDNbUoSp3az5Mn/89PzDx5fPJy41WjRKAEdVxRjdYe&#43;nMTJDNPB0EnTQlqUtizyAYCHlfFjrnCuVPz9dWqv7XdhPQQBIZyNrzfJK8RMdZIc4sn2w4W/M&#43;Hc4jXY0Q4DOau0UYX1XH2IGYi2HO9j2j341ztmrAsZs&#43;VEv3vRvG/GaaCkL0bpje4dWQZiiAEi5&#43;yKxAAhb&#43;5EBSqtZodXP5nLVCFKpc8rb&#43;I1uKAAItZTlPKfLLPGDaUGuAj3yv5yf02/aMdo7rgeLuylSoTYne1kQnIJ8g63xuubnp5ff/e7T7z6en2dLfD/4Yb&#43;z01QIW2mD4AgfgxV8YqgBpZzn51N6fm7LI9WDUg&#43;tMkc9GvtyTi&#43;n024Kbx/398cxBqccDybtZaGSa6C7Dw&#43;dqwO3eoNylrDvWdA33dqWVCk0sLWurtzv27ik2fLj6/DVla5whVmaPnUOJGrlH1Iu58u6JpGB7kkhZjFOoXNR6A/tsbslj3XjRBjYuB455fl0rsvK3JKjJQJPZtnzj2O6UNtn&#43;8aYb01oxZTLEuJ52F1CGLz14qpLrqeX5fPnl5&#43;eTs9zaxCdO07h&#43;O5uePe2hUHS&#43;JqchLQlN2IPdrSw8rrMy5cv5fwN5XutkglmiTGM4whoXs7rkrKzGINDUMJoZcJVh934OoKHjICLaT/ACoQhLYYcXneKNtBreOpzqgBBrMY2byzyrWt&#43;dVbOWcmZiXsRzQAa7V04g24S26g7U3c62eUQq8D/y5I/P1/66JcxOA4&#43;Dn6/G1hc5J/Y4lUpcs70LpvzjiWryKfLPOdUHVFEe4/m3uJkV4sF6UK0EAq4WOmuwRRns6YoOcRgidL6lD59vvz4aX4&#43;AcNhP41Ax9Ed76fpu0c&#43;3p9Ker48nV&#43;els8VAw8Pw&#43;PE5ilf1rqcTul0KilRb/xKgPf73TjGPjpX1jUvS2LmJJ62FZjmpbRGrk8mgQFCfDL1H&#43;Hln/jiyLjmLJivIxssUIeuxAjLGESJLWOnRm062venRoO5tVyrTgxYDzYYO4x&#43;N8Zx9Ga0bUdVEkDsrn9J5fm8gUzvbG2Exkh4cNa&#43;qnH8/K&#43;&#43;gTs6pSIrIdUxYyr1ZV2fqSwj84OJ31h/56y3TNC5yrkSZgE27BD8HM&#43;XuqzNr22ZL7/5zZf//E/Pn59KrXdTnKY4MIvP2Q/hMOaDPy&#43;n361Pn&#43;BzcenhEO/cbrg0WKmtqaxpvixFm/e9OOi9203DfjcN0dciZqqEV9ShSa6Vek/MLRLl2SCSlfC6YPPWBG/H6ENwneC/0a9vTsZ2vfPBO2LWp7ntJtqbhrxiXbgwKY2Z5Wsgv&#43;M8cgjV2tU68mjMeckXpcVl5W70lS2lpSTJbKt0HZoyG3vsOqOr3tMqa9B4Z5x3yg6W5HHN&#43;YItjeiPJux9GJwOX7Saqa6UlmYWihU0vF1M&#43;AzGl5eTmc8vv/nXT7/7cFnWaR&#43;P&#43;&#43;mwd773&#43;AZHziycP65Pv50/PeVLcO4hTt5McLlQaVxbWst8WdKadG91MtopGYZ42E/7cUwGorKeulcIzo7BKYkZ3Zpapx1WaypRcXawzjgLgzWDrbWtl5bkoluTVjlr6AXvYGncv/cbAV0HlZSi0xw0C4QMltAZEARe1rnZtOoYiI3KCJ/X8vKyZCVZXne/h41PMKeiszxKCAze2CAJnNN0RR5yN0ieOUZ9Wal5RFxzlS&#43;iLFCJbVJoWTgtpazUEvFKkCBWeZhasJSf1vN62McRWzq9pFLR&#43;ulw2O3HIaBprRkgs9FlvAmj3cHgD273fnjwMz8tpw&#43;n/GXOXBGfzo&#43;XpZV62zxliP7uMN3tx9nQOPQRPnlCZ&#43;wQXQyyZK5XVwQ/bPiCjYHQjBaBxF6SpqPKyNjYRNrPtE0icZOPGZxS9ZSXycQWHHUSJxCLrei6WWXbt41nJI9TTaNlyaU0nTkJVvcdctYE5yWKNELmYN0UI0GYdvvHx/vjYd&#43;IXk6neV5GB4/HcT/FGLx3HtC02pRtWzBLDrkwlYWMNQJ4NCeDBpg4Z8n0TkZrjLnWeeW9h8FCboNxbtrdv30/7p2pFwn1anUecR&#43;nvz1&#43;O9mp1nYIuz375SIg84e5PK8ZG8eL4GXqEzvauIgxHA&#43;7x&#43;PeYhuUbqqVhXajUYod98q&#43;US6mYiAg9cspbcOOnQyzNQUVchD23da7nJUqqyRne/01A6jsNmctaJe4T41V7c8AYgw&#43;RufVfTHD8W73LbnjAyvMlRRvH&#43;39IQzBtUb7KT5k8hH2d8e/&#43;e79d&#43;&#43;&#43;AeAPHz99&#43;fIUsDwe/KR9TafNvFZbSplLmyq0BKfUzs9NEBJDMBit7kqe2OUmoctDqyKMZGFFCgU9w4RmP&#43;3udnfes9iLbX2kxnkXQoghPg4HQBPQ16clr59orpK8IztgZMJX2zLoLxxx&#43;/14PE5ESRbDIlZq7VqwUZfuOsgwWuC126&#43;GERlUnT/uZ3lnuNPCSDHpttlAH4tAwY7IylC3OqBj&#43;uizvY5p6VwuYlGMas00xRCd3EwlGvzbN/f334x&#43;PPgQVS8Y64rpBGUppd7thsZoLqXWcno5HUY/RmepjJb3wR107wDrdDt26L&#43;bo0KlAxhHpmbKLHbkHE7e7C05AtvYI0TLk6VotU5ONOdKhUfiO&#43;sHZl8LcJPExXmz38Xj/bCffAyDpG7OGMeZ5rrYJftanGNjFX1cdzG4bR/knI0hxBiGwYsADBQrKU2p2ww2E2uxGrax2OsE&#43;7YTBep0qw5C33bwQHMdGu1CJMJOYlSZiZXF6EIUUXgRSGeTYKvUk4ieaLTSClEtErGCGQ773f7&#43;YZxGHaXjspzOX/J8Tq3hEOz9LjDAp1P6&#43;OOPZb28uRuBaTTtEPxgjd7yNu&#43;jVSdBF8HA4GzpPX2EscGDgXvmAcBb9OLt0GsphpEy5TWxrXQgCJEpre3yAgEaVoqDO9wPD&#43;/Gw73oBzothmHJqynNpuKATARCw87b/WhiYGWJwXUDDNDxyqI05iBIAWuhXHQ/iSJJjPO21zXhNonS/6FFuD63i1931RCEg7RlvnzFJFqF3kaYWJKsIDmERPJrt0f7w40aG0NauZLvs&#43;AcBkOVLIjOZjd4wV3rpZWk0&#43;VyC4O3x8nnXD6sy6fPGUo67sIhSqDQ31RE9brbvlomVSZvYG8NgUWkyjwZfGPwwfSRCXAeptGGYCphIjoDnWqlUqnCvbG15lYSWtMMEZow7Px05&#43;POh4BogQ2Vhlo&#43;wtaMYfSC4M0Q493eT2Nv&#43;GxIGQ0zLqm&#43;nNIwYPcQG1U59/WH/ysAAP//NUKYl5Z7rzQAAAAASUVORK5CYII="
     data-sizes="auto"
     width="1024"
     loading="lazy" />


</a>

  
  
</figure>The Unami home page on my subdomain hosted at Netlify.</p>
<p>That really was all that was involved for a simple site, you can see <a href="https://github.com/acrosman/drupal-tome-netlify">my repository on Github</a> if you want to see all of what was generated along the way.</p>
<p>The whole process is pretty straight forward, but there are a few things that it helps to understand.</p>
<p>First, Netlify is actually regenerating the markup on their servers with this approach. The Drupal nodes, and other entities, are saved as JSON and then imported during the build. This makes the process reliable, but slow. Unami takes several minutes to deploy since Netlify is installing and configuring Drupal, loading the content, and generating the output. The build command provided in that template is clear enough to follow if you are familiar with composer projects:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>command <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;composer install &amp;&amp; ./vendor/bin/drush tome:install -y &amp;&amp; ./vendor/bin/drush tome:static -l </span>$DEPLOY_PRIME_URL<span style="color:#e6db74">&#34;</span>
</span></span></code></pre></div><p>One upside of this, is that you can use a totally unrelated domain for your local testing and have it adjust correctly to the production domain. When you are using Netlify&rsquo;s branching workflow for managing dev, test, and production it also protects your work that way.</p>
<p>My directions above load a standard docksal container because that&rsquo;s quick and easy, which includes MySQL, but Tome falls back to using a Sqlite database since you can be more confident it is there. Again this is reliable but slow. If I were going to do this on a more complete project I&rsquo;d want a smaller Docksal setup or to switch to using MySQL locally.</p>
<p>A workflow based on this approach might also struggle with concurrent edits or complex configuration of large sites. It would probably make more sense to have the content created on a hidden, but traditional, server and then run through a different workflow. But for someone working on a series small sites that are rarely updated, a totally temporary instance of the site that can be rapidly deployed to a device, have content updated, push out to production, and then deleted locally until needed again.</p>
<p>The final detail to note is that there is no support for forms built into this solution. Netlify has support for that, and Tome has a module that claim to connect to that service but I wasn&rsquo;t able to quickly determine how to get it connected. I am confident there are solves to this problem, but it is something that would take a little additional work.</p>
]]></content:encoded> </item> <item>
      <title>SC DUG May 2019</title>
      <link>https://spinningcode.org/2019/05/sc-dug-may-2019/</link>
      <pubDate>
        Sun, 19 May 2019 19:45:20 +0000
      </pubDate> <guid
        isPermaLink="false">https://spinningcode.org/?p=1125</guid>  <description>Mauricio Orozco&amp;#39;s review of lessons he learned at DrupalCon North America 2019.</description> <content:encoded><![CDATA[<p>For this month&rsquo;s SC DUG, Mauricio Orozco from the <a href="https://cma.sc.gov/">South Carolina Commission for Minority Affairs</a> shared his notes and lessons learned during his first DrupalCon North America.</p>
<div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
      <iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/C0KAXHec3Ls?autoplay=0&amp;controls=1&amp;end=0&amp;loop=0&amp;mute=0&amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"></iframe>
    </div>

<p>We frequently use these presentations to practice new presentations, try out heavily revised versions, and test out new ideas with a friendly audience. If you want to see a polished version checkout our group members’ talks at camps and cons. So if some of the content of these videos seems a bit rough please understand we are all learning all the time and we are open to constructive feedback.</p>
<p>If you would like to join us please <a href="https://www.meetup.com/SC-Drupal-Users-Group/">check out our up coming events</a> on Meetup for meeting times, locations, and connection information.</p>
]]></content:encoded> </item> <item>
      <title>SC DUG February 2019</title>
      <link>https://spinningcode.org/2019/02/sc-dug-february-2019/</link>
      <pubDate>
        Mon, 18 Feb 2019 13:00:12 +0000
      </pubDate> <guid
        isPermaLink="false">https://spinningcode.org/?p=1031</guid>  <description>Will Jackson&amp;#39;s presentation on using Docksal for Drupal development.</description> <content:encoded><![CDATA[<p>For the SC DUG meeting this month <a href="https://www.drupal.org/u/wjackson">Will Jackson</a> from <a href="https://www.kanopistudios.com/">Kanopi Studios</a> gave a talk about using <a href="https://docksal.io/">Docksal</a> for local Drupal development. Will has the joy of working with some of the Docksal developers and has become an advocate for the simplicity and power Docksal provides.</p>
<div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
      <iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/4xCUr7s5eeU?autoplay=0&amp;controls=1&amp;end=0&amp;loop=0&amp;mute=0&amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"></iframe>
    </div>

<p>We frequently use these presentations to practice new presentations, try out heavily revised versions, and test out new ideas with a friendly audience. If you want to see a polished version checkout our group members&rsquo; talks at camps and cons. So if some of the content of these videos seems a bit rough please understand we are all learning all the time and we are open to constructive feedback.</p>
<p>If you would like to join us please <a href="https://www.meetup.com/SC-Drupal-Users-Group/">check out our up coming events</a> on Meetup for meeting times, locations, and connection information.</p>
]]></content:encoded> </item> <item>
      <title>SC DUG November 2018</title>
      <link>https://spinningcode.org/2019/02/scdug-november-2018/</link>
      <pubDate>
        Mon, 04 Feb 2019 13:00:28 +0000
      </pubDate> <guid
        isPermaLink="false">https://spinningcode.org/?p=1008</guid>  <description>Kaylan Wagner&amp;#39;s Presentation on applying gaming lessons that are useful at work.</description> <content:encoded><![CDATA[<p>This fall the <a href="https://www.meetup.com/SC-Drupal-Users-Group/">South Carolina Drupal User&rsquo;s Group</a> started using Zoom are part of all our meetings. Sometimes the technology has worked better than others, but when it works in our favor we are recording the presentations and sharing them when we can.</p>
<p>In November <a href="https://www.drupal.org/u/keso">Kaylan Wagner</a> gave a draft talk on using experiences in the world of online gaming to be a better remote team member.</p>
<div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
      <iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/Jctng6ORAnc?autoplay=0&amp;controls=1&amp;end=0&amp;loop=0&amp;mute=0&amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"></iframe>
    </div>

<p>We frequently use these presentations to practice new presentations and test out new ideas. If you want to see a polished version hunt group members out at camps and cons. So if some of the content of these videos seems a bit rough please understand we are all learning all the time and we are open to constructive feedback.</p>
<p>If you would like to join us please <a href="https://www.meetup.com/SC-Drupal-Users-Group/">check out our up coming events</a> on Meetup for meeting times, locations, and connection information.</p>
]]></content:encoded> </item> <item>
      <title>SC DUG September 2018</title>
      <link>https://spinningcode.org/2019/01/sc-dug-september-2018/</link>
      <pubDate>
        Mon, 28 Jan 2019 13:00:24 +0000
      </pubDate> <guid
        isPermaLink="false">https://spinningcode.org/?p=1001</guid>  <description>Chris Zietlow&amp;#39;s presentation on about using Machine Learning to Improve UX.</description> <content:encoded><![CDATA[<p>This fall the <a href="https://www.meetup.com/SC-Drupal-Users-Group/">South Carolina Drupal User&rsquo;s Group</a> started using Zoom are part of all our meetings. Sometimes the technology has worked better than others, but when it works in our favor we are recording the presentations and sharing them when we can.</p>
<p><a href="http://zietlow.io/">Chris Zietlow</a> presented back in September about using Machine Learning to Improve UX.</p>
<div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
      <iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/x-rQW4XR0GQ?autoplay=0&amp;controls=1&amp;end=0&amp;loop=0&amp;mute=0&amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"></iframe>
    </div>

<p>We frequently use these presentations to practice new presentations and test out new ideas. If you want to see a polished version hunt group members out at camps and cons. So if some of the content of these videos seems a bit rough please understand we are all learning all the time and we are open to constructive feedback.</p>
<p>If you would like to join us please check out our up coming events on Meetup for meeting times, locations, and connection information.</p>
]]></content:encoded> </item> <item>
      <title>Drupal 8 Batch Services</title>
      <link>https://spinningcode.org/2019/01/drupal-8-batch-services/</link>
      <pubDate>
        Sun, 20 Jan 2019 21:04:32 +0000
      </pubDate> <guid
        isPermaLink="false">https://spinningcode.org/?p=992</guid>  <description>Drupal 8 batch jobs were basically untouched from previous versions. So I created a module that handles this problem elegantly.</description> <content:encoded><![CDATA[<p>For this month&rsquo;s <a href="https://www.meetup.com/SC-Drupal-Users-Group/">South Carolina Drupal User Group</a> I gave a talk about creating Batch Services in Drupal 8. As a quick side note we are trying to include video conference access to all our meetings so please feel free to join us even if you cannot come in person.</p>
<div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
      <iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/LGvIvB3wtcU?autoplay=0&amp;controls=1&amp;end=0&amp;loop=0&amp;mute=0&amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"></iframe>
    </div>

<p>Since Drupal 8 was first released I have been frustrated by the fact that Drupal 8 batch jobs were basically untouched from previous versions. There is nothing strictly wrong with that approach, but it has never felt right to me particularly when doing things in a batch job that I might also want to do in another context – that really should be a service and I should write those core jobs first. After several frustrating experiences trying to find a solution I like, I finally <a href="https://www.drupal.org/sandbox/acrosman/3025562">created a module</a> that provides an abstract class that can be used to create a service that handles this problem just more elegantly. The project also includes an example module to provide a sample service.</p>
<p>Some of the text in the slides got cut off by the Zoom video window, so I uploaded them to SlideShare as well:</p>
<iframe src="https://www.slideshare.net/slideshow/embed_code/128582627" width="840" height="670" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe>
## Quick Batch Overview
<p>If you are new to Drupal batches there are <a href="https://www.breaktech.com/blog/d8-custom-batch-processes">lots of articles</a> around that <a href="https://opensenselabs.com/blogs/tech/how-use-batch-api-drupal-8">go into details</a> of <a href="http://tylerfrankenstein.com/code/drupal-8-batch-example">traditional implementations</a>, so this will be a super quick overview.</p>
<p>To define a batch you generate an array in a particular format – typically as part of a form submit process – and pass that array to <a href="https://api.drupal.org/api/drupal/core%21includes%21form.inc/function/batch_set/8.7.x">batch_set()</a>. The array defines some basic messages, a list of operations, a function to call when the batch is finished, and optionally a few other details. The minimal array would be something like:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-php" data-lang="php"><span style="display:flex;"><span>    <span style="color:#75715e">// Setup final batch array.
</span></span></span><span style="display:flex;"><span>    $batch <span style="color:#f92672">=</span> [
</span></span><span style="display:flex;"><span>      <span style="color:#e6db74">&#39;title&#39;</span>    <span style="color:#f92672">=&gt;</span> <span style="color:#e6db74">&#39;Page title&#39;</span>,
</span></span><span style="display:flex;"><span>      <span style="color:#e6db74">&#39;init_message&#39;</span> <span style="color:#f92672">=&gt;</span> <span style="color:#e6db74">&#39;Openning message&#39;</span>,
</span></span><span style="display:flex;"><span>      <span style="color:#e6db74">&#39;operations&#39;</span>  <span style="color:#f92672">=&gt;</span> [],
</span></span><span style="display:flex;"><span>      <span style="color:#e6db74">&#39;finished&#39;</span> <span style="color:#f92672">=&gt;</span> <span style="color:#e6db74">&#39;\some\class\namespace\and\name::finishedBatch&#39;</span>,
</span></span><span style="display:flex;"><span>    ];
</span></span></code></pre></div><p>The interesting part should be in that operations array, which is a list of tasks to be run, but getting all your functions setup and the batch array generated can often be its own project.</p>
<p>Each operation is a function that implements <a href="https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Form%21form.api.php/function/callback_batch_operation/8.7.x">callback_batch_operation()</a>, and the data to feed that function. The callbacks are just functions that have a final parameter that is an array reference typically called <code>$context</code>. The function can either perform all the needed work on the provided parameters, or perform part of that work and update the <code>$context['sandbox']['finished']</code> value to be a number between 0 and 1. Once finished reaches 1 (or isn&rsquo;t set at the end of the function) batch declares that task complete and moves on to the next one in the queue. Once all tasks are complete it calls the function provided as the finished value of the array that defined the batch.</p>
<p>The finish function implements <a href="https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Form%21form.api.php/function/callback_batch_finished/8.7.x">callback_batch_finish()</a> which means it accepts three parameters: <code>$success</code>, <code>$results</code>, and <code>$operations</code>: <code>$success</code> is true when all tasks completed without error; <code>$results</code> is an array of data you can feed into the <code>$context</code> array during processing; <code>$operations</code> is your operations list again.</p>
<p>Those functions are all expected to be static methods on classes or, more commonly, a function defined in a procedural code block imported from a separate file (which can be provided in the batch array).</p>
<h2 id="my-replacement-batch-service">My replacement batch service</h2>
<p>It&rsquo;s those blocks of procedural code and classes of nothing but static methods that bug me so much. Admittedly the batch system is convenient and works well enough to handle major tasks for lots of modules. But in Drupal 8 we have a whole suite of services and <a href="/2017/01/drupal-8-plugins-are-addictive/">plugins</a> that are designed to be run in specific contexts that batch does not provide by default. While we can access the Drupal service container and get the objects we need the batch code always feels clunky and out of place within a well structured module or project. What&rsquo;s more I have often created batches that benefit from having the key tasks be functions of a service not just specific to the batch process.</p>
<p>So after several attempts to force batches and services to play nice together I finally created this module to force a marriage. Even though there are places which required a bit of compromise, but I think I have most of that contained in the abstract class so I don&rsquo;t have to worry about it on a regular basis. That makes my final code with complex logic and processing far cleaner and easier to maintain.</p>
<p>The <a href="https://www.drupal.org/sandbox/acrosman/3025562">Batch Service Interface module</a> provides an interface an an abstract class that implements parts of it: <code>abstract class AbstractBatchService implements BatchServiceInterface</code>. The developer extending that class only needs to define a service that handles generating a list of operations that call local methods of the service and the finish batch function (also as a local method). Nearly everything else is handled by the parent class.</p>
<p>The implementation I provided in the example submodule ends up four simple methods. Even in more complex jobs all the real work could be contained in a method that is isolated from the oddities of batch processing.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-php" data-lang="php"><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">namespace</span> <span style="color:#a6e22e">Drupal\batch_example</span>;
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">use</span> <span style="color:#a6e22e">Drupal\node\Entity\Node</span>;
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">use</span> <span style="color:#a6e22e">Drupal\batch_service_interface\AbstractBatchService</span>;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#e6db74">/**
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74"> * Class ExampleBatchService logs the name of nodes with id provided on form.
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74"> */</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">class</span> <span style="color:#a6e22e">ExampleBatchService</span> <span style="color:#66d9ef">extends</span> <span style="color:#a6e22e">AbstractBatchService</span> {
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>  <span style="color:#e6db74">/**
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">   * Must be set in child classes to be the service name so the service can
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">   * bootstrap itself.
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">   *
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">   * @var string
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">   */</span>
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">protected</span> <span style="color:#66d9ef">static</span> $serviceName <span style="color:#f92672">=</span> <span style="color:#e6db74">&#39;batch_example.example_batch&#39;</span>;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>  <span style="color:#e6db74">/**
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">   * Data from the form as needed.
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">   */</span>
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">public</span> <span style="color:#66d9ef">function</span> <span style="color:#a6e22e">generateBatchJob</span>($data) {
</span></span><span style="display:flex;"><span>    $ops <span style="color:#f92672">=</span> [];
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">for</span> ($i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; $i <span style="color:#f92672">&lt;</span> $data[<span style="color:#e6db74">&#39;message_count&#39;</span>]; $i<span style="color:#f92672">++</span> ) {
</span></span><span style="display:flex;"><span>      $ops[] <span style="color:#f92672">=</span> [
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#39;logMessage&#39;</span> <span style="color:#f92672">=&gt;</span> [<span style="color:#e6db74">&#39;MessageIndex&#39;</span> <span style="color:#f92672">=&gt;</span> $i <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>],
</span></span><span style="display:flex;"><span>      ];
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">return</span> $this<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">prepBatchArray</span>($this<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">t</span>(<span style="color:#e6db74">&#39;Logging Messages&#39;</span>), $this<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">t</span>(<span style="color:#e6db74">&#39;Starting Batch Processing&#39;</span>), $ops);
</span></span><span style="display:flex;"><span>  }
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">public</span> <span style="color:#66d9ef">function</span> <span style="color:#a6e22e">logMessage</span>($data, <span style="color:#f92672">&amp;</span>$context) {
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    $this<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">logger</span><span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">info</span>($this<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">getRandomMessage</span>());
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">if</span> (<span style="color:#f92672">!</span><span style="color:#a6e22e">isset</span>($context[<span style="color:#e6db74">&#39;results&#39;</span>][<span style="color:#e6db74">&#39;message_count&#39;</span>])) {
</span></span><span style="display:flex;"><span>      $context[<span style="color:#e6db74">&#39;results&#39;</span>][<span style="color:#e6db74">&#39;message_count&#39;</span>] <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>    $context[<span style="color:#e6db74">&#39;results&#39;</span>][<span style="color:#e6db74">&#39;message_count&#39;</span>]<span style="color:#f92672">++</span>;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>  }
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">public</span> <span style="color:#66d9ef">function</span> <span style="color:#a6e22e">doFinishBatch</span>($success, $results, $operations) {
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">drupal_set_message</span>($this<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">t</span>(<span style="color:#e6db74">&#39;Logged %count quotes&#39;</span>, [<span style="color:#e6db74">&#39;%count&#39;</span> <span style="color:#f92672">=&gt;</span> $results[<span style="color:#e6db74">&#39;message_count&#39;</span>]]));
</span></span><span style="display:flex;"><span>  }
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">public</span> <span style="color:#66d9ef">function</span> <span style="color:#a6e22e">getRandomMessage</span>() {
</span></span><span style="display:flex;"><span>    $messages <span style="color:#f92672">=</span> [
</span></span><span style="display:flex;"><span>      <span style="color:#75715e">// list of messages to select from
</span></span></span><span style="display:flex;"><span>    ];
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">return</span> $messages[<span style="color:#a6e22e">array_rand</span>($messages)];
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>  }
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p>There is the oddity that you have to tell the service its own name so it can bootstrap itself. If there is a way around that I&rsquo;d love to know it. But really one have one line of code that&rsquo;s a bit strange, everything else is now fairly clear call and response.</p>
<p>One of the nice upsides to this solution is you could write tests for the service that look and feel just like any other services tests. The methods could all be called once, and you are not trying to run tests against a procedural code block or a class that is nothing but static methods.</p>
<p>I would love to hear ideas about ways I could make this solution stronger. So please drop me a comment or send me a patch.</p>
<h2 id="related-core-efforts">Related core efforts</h2>
<p>There is an effort to try to do <a href="https://www.drupal.org/project/drupal/issues/2875151">similar things in core</a>, but they look like they have some distance left to travel. Obviously once that work is complete it is likely to be better than what I have created, but in the meantime my service allows for a new level of abstraction without waiting for core&rsquo;s updates to be complete.</p>
]]></content:encoded> </item> </channel>
</rss>
