<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Greg Brimble</title>
    <description>The latest articles on DEV Community by Greg Brimble (@gregbrimble).</description>
    <link>https://dev.to/gregbrimble</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F11779%2F1ef1d8b7-7a2f-40ba-a2f8-f3a4396ae425.jpg</url>
      <title>DEV Community: Greg Brimble</title>
      <link>https://dev.to/gregbrimble</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/gregbrimble"/>
    <language>en</language>
    <item>
      <title>How We're Building Glenstack</title>
      <dc:creator>Greg Brimble</dc:creator>
      <pubDate>Fri, 21 May 2021 14:25:41 +0000</pubDate>
      <link>https://dev.to/glenstack/how-we-re-building-glenstack-8p4</link>
      <guid>https://dev.to/glenstack/how-we-re-building-glenstack-8p4</guid>
      <description>&lt;p&gt;Glenstack is a production-ready, modern data platform. And as such, we are embracing the latest and greatest technologies as we deliver our application quickly, securely, and with the features our customers demand.&lt;/p&gt;

&lt;h2&gt;
  
  
  Motivations
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Speed
&lt;/h3&gt;

&lt;p&gt;We want Glenstack to be performant for users, regardless of where they are located. To us, this means we must be distributed. We can't have a single server in &lt;code&gt;us-east-1&lt;/code&gt; because every single user would have to wait for a round-trip request to Virginia which is a significant delay for most of the world. Instead, we have multiple points-of-presence (PoPs) around the world which are each capable of serving Glenstack, more often than not, from the same country as the user.&lt;/p&gt;

&lt;p&gt;No distributed provider has more PoPs and faster performance than &lt;a href="https://workers.cloudflare.com/"&gt;Cloudflare Workers&lt;/a&gt;, which lets us be in 200 locations around the world, and within 100 milliseconds of 99% of internet users.&lt;/p&gt;

&lt;p&gt;This serverless architecture lets us compete with (and often outperform) the performance of many traditional database providers, all while also eliminating the single point of failure that a single cluster presents. We are entirely convinced that it is the future of not just application hosting but data handling as well, and that serverless environments will continue to see increased usage throughout the technology industry.&lt;/p&gt;

&lt;h3&gt;
  
  
  Security
&lt;/h3&gt;

&lt;p&gt;We make every effort to ensure that Glenstack is secure. And we like to start with the worst-case scenario, disaster-recovery: what happens if our infrastructure fails.&lt;/p&gt;

&lt;p&gt;As already stated, the Glenstack application is serverless and distributed. So if one PoP is unreachable, your traffic is automatically re-routed to the next available data center. If all 200 PoPs fail, we're in trouble, and this would constitute a truly global, internet-level event. Thankfully however, Cloudflare offer a 100% uptime SLA, and we're able to do the same for Glenstack customers. Please &lt;a href="https://glenstack.com/contact"&gt;contact us&lt;/a&gt; if you are interested in enterprise contracts.&lt;/p&gt;

&lt;p&gt;Data hosted on Glenstack is also guaranteed. We provide (C)onsistent and (P)artition-tolerant storage (of the &lt;a href="https://en.wikipedia.org/wiki/CAP_theorem"&gt;CAP theorem&lt;/a&gt;) in order to support the full set of &lt;a href="https://en.wikipedia.org/wiki/ACID"&gt;ACID&lt;/a&gt; properties for transactions.&lt;/p&gt;

&lt;p&gt;We have multiple layers of redundancy in place to ensure that even if a single data node is unreachable, we are able to failover to another location, with the same data available. We also take routine off-site backups for even more peace-of-mind.&lt;/p&gt;

&lt;p&gt;We're exploring end-to-end (E2E) encryption and would also love to &lt;a href="https://glenstack.com/contact"&gt;hear from you&lt;/a&gt; if you have a compelling use-case. In the meantime however, all data is encrypted in transit, at rest, and when backed up. Again, please &lt;a href="https://glenstack.com/contact"&gt;reach out&lt;/a&gt; if there's a particular certification your business needs.&lt;/p&gt;

&lt;h3&gt;
  
  
  Functionality
&lt;/h3&gt;

&lt;p&gt;Glenstack sees data compliance as one of the most interesting and rapidly evolving challenges for the technology industry. The General Data Protection Regulation (EU GDPR) is frankly old news, but it remains a difficult problem for thousands of organizations inside and outside of the European Union. Complex legislation is continually being drafted by governments around the world, and it's only going to get harder for businesses to stay compliant.&lt;/p&gt;

&lt;p&gt;Fortunately, Glenstack has data compliance built-in. There's no need to set up a specialized EU cluster and manage the overhead of synchronizing migrations. With Glenstack, you simply tag a data instance as belonging to a particular jurisdiction, and we guarantee that we'll never store or process that instance outside of that border. Personally identifiable information (PII) stays close to the individual, which has the added benefit of decreasing their latency!&lt;/p&gt;

&lt;p&gt;With compliance sorted, you can focus on the stuff that matters: your data. Glenstack offers a suite of tools to help make you productive:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;an easy-to-use no-code editor,&lt;/li&gt;
&lt;li&gt;collaborative workflows for both internal and external use,&lt;/li&gt;
&lt;li&gt;version control,&lt;/li&gt;
&lt;li&gt;and most importantly, an incredibly scalable, low latency, automatic GraphQL API.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Read more about our features on &lt;a href="https://glenstack.com/#features"&gt;our landing page&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Specifics of our System Design
&lt;/h2&gt;

&lt;p&gt;For those wanting more detail, this section delves into some specifics about the technologies we're using to build Glenstack. If we don't cover something here, or if you have any other questions, please &lt;a href="https://glenstack.com/contact"&gt;send us a message&lt;/a&gt;, and we'd seriously love to chat to you more.&lt;/p&gt;

&lt;h3&gt;
  
  
  Data
&lt;/h3&gt;

&lt;p&gt;We use a combination of Cloudflare's &lt;a href="https://www.cloudflare.com/en-gb/products/workers-kv/"&gt;Workers KV&lt;/a&gt; and &lt;a href="https://blog.cloudflare.com/introducing-workers-durable-objects/"&gt;Durable Objects&lt;/a&gt;, as well as &lt;a href="https://fauna.com/"&gt;Fauna&lt;/a&gt;, for hosting various Glenstack data. We support the full set of ACID properties and a complete transaction environment enabling you to build pretty much anything on top of Glenstack.&lt;/p&gt;

&lt;h3&gt;
  
  
  Payments
&lt;/h3&gt;

&lt;p&gt;Leaving it to the industry-trusted experts, we use &lt;a href="https://stripe.com/en-gb"&gt;Stripe&lt;/a&gt; to handle payment transactions. They securely hold all sensitive information such as credit card numbers and bank details. In fact, we never even see this information—it goes straight to Stripe.&lt;/p&gt;

&lt;h3&gt;
  
  
  Authorization
&lt;/h3&gt;

&lt;p&gt;With custom needs, we built our own authorization service which issues &lt;a href="https://datatracker.ietf.org/doc/html/rfc7519"&gt;JSON Web Tokens (JWTs)&lt;/a&gt; as &lt;a href="https://datatracker.ietf.org/doc/html/rfc6749"&gt;OAuth2&lt;/a&gt; Access Tokens. We act as both a consumer (for social login) and provider (for providing developers access to our API).&lt;/p&gt;

&lt;h3&gt;
  
  
  API
&lt;/h3&gt;

&lt;p&gt;With support for massive datasets, Glenstack has to be able to efficiently respond to API requests. We use &lt;a href="https://spec.graphql.org/June2018/"&gt;GraphQL&lt;/a&gt; to allow users to specify exactly the data they require, and also navigate the complex relationships that can appear when working with embedded data.&lt;/p&gt;

&lt;h3&gt;
  
  
  Front-end
&lt;/h3&gt;

&lt;p&gt;Finally, the Glenstack front-end is just a simple &lt;a href="https://reactjs.org/"&gt;React&lt;/a&gt; application. We use &lt;a href="https://tailwindcss.com/"&gt;Tailwind CSS&lt;/a&gt; and some &lt;a href="https://tailwindui.com/"&gt;Tailwind UI&lt;/a&gt; components to rapidly build out our UI, and we consume our API like any other developer using Glenstack. This &lt;a href="https://en.wikipedia.org/wiki/Eating_your_own_dog_food"&gt;'dog-fooding'&lt;/a&gt; helps us to better understand what developers need from Glenstack in order to build their apps.&lt;/p&gt;




&lt;p&gt;Glenstack will be launching later this summer, 2021. Please consider &lt;a href="https://glenstack.com/waitlist"&gt;joining our waitlist&lt;/a&gt; or &lt;a href="https://glenstack.com/contact"&gt;getting in touch&lt;/a&gt; if you have any questions. We're so excited for you to see what we've been building, and we hope Glenstack can help you to create, exchange and collaborate on data soon!&lt;/p&gt;

</description>
    </item>
    <item>
      <title>My First Attempt at Open-Source</title>
      <dc:creator>Greg Brimble</dc:creator>
      <pubDate>Fri, 17 Mar 2017 13:16:28 +0000</pubDate>
      <link>https://dev.to/gregbrimble/my-first-attempt-at-open-source</link>
      <guid>https://dev.to/gregbrimble/my-first-attempt-at-open-source</guid>
      <description>

&lt;p&gt;Last night, I made my first contribution to an existing open-source repository: &lt;a href="https://github.com/leforestier/yattag"&gt;yattag&lt;/a&gt;. It's a small Python project (4 project files, 12 pull requests, and 5 contributors), but I have used it in a couple of projects of mine, and quite like the way it works. Basically, it generates HTML on the fly:&lt;/p&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; from yattag import Doc
&amp;gt;&amp;gt;&amp;gt; doc, tag, text = Doc().tagtext()
&amp;gt;&amp;gt;&amp;gt; scripts = ["jquery.js", "customJS.js"]
&amp;gt;&amp;gt;&amp;gt; with tag("html"):
...     with tag("head"):
...         for script in scripts:
...             with tag("script", src=script):
...                 pass
&amp;gt;&amp;gt;&amp;gt; print(doc.getvalue())
&lt;span class="nt"&gt;&amp;lt;html&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"jquery.js"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"customJS.js"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Anyway, there is a method, &lt;code&gt;stag&lt;/code&gt;, which generates an element without an end tag (e.g. &lt;code&gt;doc.stag("br")&lt;/code&gt; will generate &lt;code&gt;&amp;lt;br /&amp;gt;&lt;/code&gt;). However, this doesn't really fit with some of the newer HTML5 stuff: &lt;a href="https://www.w3.org/TR/html5/text-level-semantics.html#the-br-element"&gt;according to W3C&lt;/a&gt;, these types of tags shouldn't have a closing slash (&lt;code&gt;/&lt;/code&gt;) (e.g. &lt;code&gt;&amp;lt;br /&amp;gt;&lt;/code&gt; should be &lt;code&gt;&amp;lt;br&amp;gt;&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;So, &lt;a href="https://github.com/leforestier/yattag/pull/30/commits/df4d3be1b395458efb121cbb0fa87f101397ac94"&gt;&lt;strong&gt;queue my two-line change&lt;/strong&gt; (+1 extra where I spotted a typo)&lt;/a&gt;. I inspected all the other files in the repo to see if they referenced the &lt;code&gt;stag&lt;/code&gt; method (would the &lt;code&gt;README.md&lt;/code&gt; need any examples updated etc.), and I checked the tests file for any checks that would fail (were they comparing the output of &lt;code&gt;doc.stag("test")&lt;/code&gt; to the string &lt;code&gt;&amp;lt;test /&amp;gt;&lt;/code&gt; etc.), &lt;strong&gt;but it all looked good&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Honestly for the time it took me to work out all the &lt;code&gt;git&lt;/code&gt; commands and &lt;a href="https://github.com/leforestier/yattag/pull/30/commits/6a935bcad12cb028d69db885a24008371ea157ec"&gt;not have my editor remove all the whitespace&lt;/a&gt;, &lt;strong&gt;the change really wasn't worth making&lt;/strong&gt;. The old HTML is still read perfectly fine by browsers (and will be, forever). The old style, really isn't going anywhere.&lt;/p&gt;

&lt;p&gt;Anyway, I clicked the button: PR made. Checks spun up. And &lt;strong&gt;2 minutes 35 seconds later, &lt;a href="https://travis-ci.org/leforestier/yattag/builds/211962336"&gt;the build failed&lt;/a&gt;&lt;/strong&gt;. I had missed a part of the test. It took the output and passed it to a XML parser, and then checked the attributes etc. XML is notorious for its requirement of strict adherence to its grammar templates, so when it couldn't parse the non-XML-compliant tag, the test failed.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--xkRs05Fc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/1%2Athn0YoMDLOpeg_kN4FzaQw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xkRs05Fc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/1%2Athn0YoMDLOpeg_kN4FzaQw.png" alt="Build Failure" title="Build Failure"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--hXzf-Di6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/1%2AgHEzjXVTz00U2aOIowo21w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hXzf-Di6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/1%2AgHEzjXVTz00U2aOIowo21w.png" alt="Commit Failure" title="Commit Failure"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;My Failure&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Turns out (upon reading the &lt;code&gt;README.md&lt;/code&gt;…), this project can be used to generate either XML or HTML, so that closing slash really did need to be kept there. Oops.&lt;/p&gt;

&lt;p&gt;So, there we have it: &lt;strong&gt;my first clash with Travis; the first, forever red, cross against my name on the internet; and &lt;em&gt;My First Attempt at Open-Source&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Lessons Learnt
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Before anything else, read the description of the repository you are editing.&lt;/li&gt;
&lt;li&gt;Don't embarrass yourself on the internet, Greg. Run the tests locally first.&lt;/li&gt;
&lt;li&gt;Write more &lt;a href="https://medium.com/@gregbrimble/my-first-attempt-at-open-source-a9799d31c66b"&gt;&lt;del&gt;Medium&lt;/del&gt;&lt;/a&gt; dev.to posts (this was my first, be nice)!&lt;/li&gt;
&lt;/ul&gt;


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